@opendatalabs/personal-server-ts-server 1.16.0 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +12 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +54 -2
- package/dist/app.js.map +1 -1
- package/dist/bootstrap.d.ts +6 -0
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +65 -21
- package/dist/bootstrap.js.map +1 -1
- package/dist/enclave-main.d.ts +11 -0
- package/dist/enclave-main.d.ts.map +1 -0
- package/dist/enclave-main.js +188 -0
- package/dist/enclave-main.js.map +1 -0
- package/dist/index.js +11 -23
- package/dist/index.js.map +1 -1
- package/dist/jobs/access-reporter.d.ts +36 -0
- package/dist/jobs/access-reporter.d.ts.map +1 -0
- package/dist/jobs/access-reporter.js +272 -0
- package/dist/jobs/access-reporter.js.map +1 -0
- package/dist/jobs/raw-envelope-stream.d.ts +3 -0
- package/dist/jobs/raw-envelope-stream.d.ts.map +1 -0
- package/dist/jobs/raw-envelope-stream.js +371 -0
- package/dist/jobs/raw-envelope-stream.js.map +1 -0
- package/dist/jobs/types.d.ts +17 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +3 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/jobs/worker.d.ts +43 -0
- package/dist/jobs/worker.d.ts.map +1 -0
- package/dist/jobs/worker.js +491 -0
- package/dist/jobs/worker.js.map +1 -0
- package/dist/listen.d.ts +11 -0
- package/dist/listen.d.ts.map +1 -0
- package/dist/listen.js +23 -0
- package/dist/listen.js.map +1 -0
- package/dist/mcp/durable-state.d.ts +75 -0
- package/dist/mcp/durable-state.d.ts.map +1 -0
- package/dist/mcp/durable-state.js +418 -0
- package/dist/mcp/durable-state.js.map +1 -0
- package/dist/mcp/grants.d.ts +12 -0
- package/dist/mcp/grants.d.ts.map +1 -0
- package/dist/mcp/grants.js +33 -0
- package/dist/mcp/grants.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +4 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tee-ingress.d.ts +29 -0
- package/dist/mcp/tee-ingress.d.ts.map +1 -0
- package/dist/mcp/tee-ingress.js +203 -0
- package/dist/mcp/tee-ingress.js.map +1 -0
- package/dist/middleware/local-listener.d.ts +33 -0
- package/dist/middleware/local-listener.d.ts.map +1 -0
- package/dist/middleware/local-listener.js +103 -0
- package/dist/middleware/local-listener.js.map +1 -0
- package/dist/package.json +67 -0
- package/dist/routes/enclave-fleet.d.ts +14 -0
- package/dist/routes/enclave-fleet.d.ts.map +1 -0
- package/dist/routes/enclave-fleet.js +43 -0
- package/dist/routes/enclave-fleet.js.map +1 -0
- package/dist/routes/enclave-jobs.d.ts +9 -0
- package/dist/routes/enclave-jobs.d.ts.map +1 -0
- package/dist/routes/enclave-jobs.js +106 -0
- package/dist/routes/enclave-jobs.js.map +1 -0
- package/dist/routes/enclave-mcp.d.ts +9 -0
- package/dist/routes/enclave-mcp.d.ts.map +1 -0
- package/dist/routes/enclave-mcp.js +46 -0
- package/dist/routes/enclave-mcp.js.map +1 -0
- package/dist/routes/mcp.d.ts +5 -2
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +49 -17
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/ui.d.ts +7 -0
- package/dist/routes/ui.d.ts.map +1 -1
- package/dist/routes/ui.js +32 -3
- package/dist/routes/ui.js.map +1 -1
- package/dist/scripts/bundle-verification.d.ts +2 -0
- package/dist/scripts/bundle-verification.d.ts.map +1 -0
- package/dist/scripts/bundle-verification.js +32 -0
- package/dist/scripts/bundle-verification.js.map +1 -0
- package/dist/scripts/verify-bundle.d.ts +2 -0
- package/dist/scripts/verify-bundle.d.ts.map +1 -0
- package/dist/scripts/verify-bundle.js +44 -0
- package/dist/scripts/verify-bundle.js.map +1 -0
- package/dist/storage/hierarchy.d.ts +4 -0
- package/dist/storage/hierarchy.d.ts.map +1 -1
- package/dist/storage/hierarchy.js +10 -0
- package/dist/storage/hierarchy.js.map +1 -1
- package/dist/storage/node-data-storage.d.ts.map +1 -1
- package/dist/storage/node-data-storage.js +7 -1
- package/dist/storage/node-data-storage.js.map +1 -1
- package/dist/ui/index.html +13 -0
- package/dist/ui/ps-lite-debug.js +3205 -5575
- package/package.json +15 -7
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHash, randomBytes, } from "node:crypto";
|
|
2
|
+
import { mkdir, open, readFile, rename, rm } from "node:fs/promises";
|
|
3
|
+
import { dirname } from "node:path";
|
|
4
|
+
import { isMcpTokenExpired, matchesMcpRefreshHash, } from "@opendatalabs/personal-server-ts-core/mcp";
|
|
5
|
+
import { userPsId } from "@opendatalabs/vana-sdk/protocol/identity";
|
|
6
|
+
const AAD = Buffer.from("vana.mcp.tee-state.v1");
|
|
7
|
+
/** Whether a missing or unreadable sealed state file is a genuine first boot
|
|
8
|
+
* (`Optional`, today's default) or a lost durable volume (`Required`, set
|
|
9
|
+
* from the signed `MCP_STATE_REQUIRED=1`). */
|
|
10
|
+
export var McpStateRequirement;
|
|
11
|
+
(function (McpStateRequirement) {
|
|
12
|
+
McpStateRequirement["Optional"] = "optional";
|
|
13
|
+
McpStateRequirement["Required"] = "required";
|
|
14
|
+
})(McpStateRequirement || (McpStateRequirement = {}));
|
|
15
|
+
/** Stable code for a required sealed MCP state file that was missing or
|
|
16
|
+
* could not be decrypted at boot. Distinguishes a lost durable volume from
|
|
17
|
+
* an ordinary first boot; callers must never fall back to fresh state. */
|
|
18
|
+
export const MCP_STATE_REQUIRED_MISSING_CODE = "MCP_STATE_REQUIRED_MISSING";
|
|
19
|
+
export class McpStateRequiredError extends Error {
|
|
20
|
+
constructor(cause) {
|
|
21
|
+
super("MCP durable state file is required (MCP_STATE_REQUIRED=1) but missing or unreadable", { cause });
|
|
22
|
+
this.name = "McpStateRequiredError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Single-CVM, single-writer store. Only ciphertext is written to its durable
|
|
27
|
+
* volume; the caller obtains its 32-byte key from the TEE key agent. This is
|
|
28
|
+
* deliberately not a multi-process or fleet database.
|
|
29
|
+
*/
|
|
30
|
+
export async function openMcpDurableState(options) {
|
|
31
|
+
const requirement = options.requirement ?? McpStateRequirement.Optional;
|
|
32
|
+
if (options.key.length !== 32)
|
|
33
|
+
throw new Error("MCP state key must be 32 bytes");
|
|
34
|
+
const key = Buffer.from(options.key);
|
|
35
|
+
let state = {
|
|
36
|
+
connections: {},
|
|
37
|
+
authorizations: {},
|
|
38
|
+
owners: {},
|
|
39
|
+
identities: {},
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
const envelope = JSON.parse(await readFile(options.path, "utf8"));
|
|
43
|
+
if (envelope.v !== 1)
|
|
44
|
+
throw new Error("Unsupported MCP state version");
|
|
45
|
+
const decipher = createDecipheriv("aes-256-gcm", key, Buffer.from(envelope.iv, "base64"));
|
|
46
|
+
decipher.setAAD(AAD);
|
|
47
|
+
decipher.setAuthTag(Buffer.from(envelope.tag, "base64"));
|
|
48
|
+
const plaintext = Buffer.concat([
|
|
49
|
+
decipher.update(Buffer.from(envelope.ciphertext, "base64")),
|
|
50
|
+
decipher.final(),
|
|
51
|
+
]);
|
|
52
|
+
try {
|
|
53
|
+
state = JSON.parse(plaintext.toString("utf8"));
|
|
54
|
+
state.identities ??= {};
|
|
55
|
+
if (!state.connections || !state.authorizations || !state.owners) {
|
|
56
|
+
throw new Error("Invalid MCP state");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
plaintext.fill(0);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
// A missing file is a genuine first boot only when the caller has not
|
|
65
|
+
// demanded continuity; otherwise it, and any undecryptable file, means
|
|
66
|
+
// the durable volume was lost and must never be papered over.
|
|
67
|
+
if (requirement === McpStateRequirement.Required)
|
|
68
|
+
throw new McpStateRequiredError(error);
|
|
69
|
+
if (error.code !== "ENOENT")
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
let writes = Promise.resolve();
|
|
73
|
+
let operations = Promise.resolve();
|
|
74
|
+
const assertActive = () => {
|
|
75
|
+
if (state.writer?.fenced)
|
|
76
|
+
throw new Error("MCP writer fenced for migration");
|
|
77
|
+
};
|
|
78
|
+
const mutate = (change) => {
|
|
79
|
+
const result = writes.then(async () => {
|
|
80
|
+
assertActive();
|
|
81
|
+
const draft = structuredClone(state);
|
|
82
|
+
const value = change(draft);
|
|
83
|
+
await persist(options.path, key, draft);
|
|
84
|
+
state = draft;
|
|
85
|
+
return structuredClone(value);
|
|
86
|
+
});
|
|
87
|
+
writes = result.catch(() => undefined);
|
|
88
|
+
return result;
|
|
89
|
+
};
|
|
90
|
+
const read = async (select) => {
|
|
91
|
+
await writes;
|
|
92
|
+
assertActive();
|
|
93
|
+
return structuredClone(select(state));
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
// Read-only membership reconciliation remains possible after writer fencing;
|
|
97
|
+
// it never exposes connection keys or permits an OAuth mutation.
|
|
98
|
+
approvedOwnerBindings: async () => {
|
|
99
|
+
await writes;
|
|
100
|
+
return structuredClone(rollbackOwners(state).bindings);
|
|
101
|
+
},
|
|
102
|
+
prepareRollback(migrationId, resolve) {
|
|
103
|
+
const operation = operations.then(() => {
|
|
104
|
+
const prepared = writes.then(async () => {
|
|
105
|
+
assertActive();
|
|
106
|
+
if (!migrationId ||
|
|
107
|
+
state.writer?.importedId !== migrationId ||
|
|
108
|
+
!state.writer.importedDigest)
|
|
109
|
+
throw new Error("Rollback requires the exact imported migration");
|
|
110
|
+
// A failed refresh must not leave an earlier receipt usable at boot.
|
|
111
|
+
const pending = structuredClone(state);
|
|
112
|
+
delete pending.writer.rollback;
|
|
113
|
+
delete pending.writer.rollbackActivated;
|
|
114
|
+
await persist(options.path, key, pending);
|
|
115
|
+
state = pending;
|
|
116
|
+
const required = rollbackOwners(state);
|
|
117
|
+
const draft = structuredClone(state);
|
|
118
|
+
const identities = {};
|
|
119
|
+
// Resolve one owner at a time on the small source TEE, without writing
|
|
120
|
+
// a partial cache or exposing owner bindings to the operator.
|
|
121
|
+
for (const binding of required.bindings) {
|
|
122
|
+
const resolved = await resolve(binding);
|
|
123
|
+
const id = userPsId(binding.chainId, binding.owner);
|
|
124
|
+
if (resolved.identity.userPsId !== id ||
|
|
125
|
+
!Number.isSafeInteger(resolved.identity.epoch) ||
|
|
126
|
+
resolved.identity.epoch < 1 ||
|
|
127
|
+
!Number.isSafeInteger(resolved.generation) ||
|
|
128
|
+
resolved.generation < 0)
|
|
129
|
+
throw new Error("Rollback identity does not match its owner");
|
|
130
|
+
draft.identities[id] = structuredClone(resolved.identity);
|
|
131
|
+
identities[id] = {
|
|
132
|
+
digest: rollbackDigest(resolved.identity),
|
|
133
|
+
generation: resolved.generation,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const receipt = {
|
|
137
|
+
migrationId,
|
|
138
|
+
digest: rollbackDigest({
|
|
139
|
+
migrationId,
|
|
140
|
+
importedDigest: state.writer.importedDigest,
|
|
141
|
+
ownersDigest: required.digest,
|
|
142
|
+
identities,
|
|
143
|
+
}),
|
|
144
|
+
owners: required.bindings.length,
|
|
145
|
+
connections: required.connections,
|
|
146
|
+
};
|
|
147
|
+
draft.writer.rollback = {
|
|
148
|
+
importedDigest: state.writer.importedDigest,
|
|
149
|
+
ownersDigest: required.digest,
|
|
150
|
+
identities,
|
|
151
|
+
receipt,
|
|
152
|
+
};
|
|
153
|
+
await persist(options.path, key, draft);
|
|
154
|
+
state = draft;
|
|
155
|
+
return structuredClone(receipt);
|
|
156
|
+
});
|
|
157
|
+
writes = prepared.catch(() => undefined);
|
|
158
|
+
return prepared;
|
|
159
|
+
});
|
|
160
|
+
operations = operation.catch(() => undefined);
|
|
161
|
+
return operation;
|
|
162
|
+
},
|
|
163
|
+
getRollbackPreparation: () => read((current) => {
|
|
164
|
+
const prepared = current.writer?.rollback;
|
|
165
|
+
const required = rollbackOwners(current);
|
|
166
|
+
if (!prepared ||
|
|
167
|
+
prepared.receipt.migrationId !== current.writer?.importedId ||
|
|
168
|
+
prepared.importedDigest !== current.writer.importedDigest ||
|
|
169
|
+
prepared.ownersDigest !== required.digest ||
|
|
170
|
+
Object.keys(prepared.identities).length !== required.bindings.length)
|
|
171
|
+
throw new Error("Rollback identities are not prepared for this imported state");
|
|
172
|
+
const owners = required.bindings.map((binding) => {
|
|
173
|
+
const id = userPsId(binding.chainId, binding.owner);
|
|
174
|
+
const identity = current.identities[id];
|
|
175
|
+
if (!identity ||
|
|
176
|
+
prepared.identities[id]?.digest !== rollbackDigest(identity))
|
|
177
|
+
throw new Error("Rollback identity changed after preparation");
|
|
178
|
+
return {
|
|
179
|
+
binding,
|
|
180
|
+
identity,
|
|
181
|
+
generation: prepared.identities[id].generation,
|
|
182
|
+
};
|
|
183
|
+
});
|
|
184
|
+
return { receipt: prepared.receipt, owners };
|
|
185
|
+
}),
|
|
186
|
+
activateRollback: (receipt) => mutate((draft) => {
|
|
187
|
+
const prepared = draft.writer?.rollback;
|
|
188
|
+
if (!prepared ||
|
|
189
|
+
receipt.migrationId !== draft.writer?.importedId ||
|
|
190
|
+
receipt.digest !== prepared.receipt.digest ||
|
|
191
|
+
prepared.importedDigest !== draft.writer.importedDigest ||
|
|
192
|
+
prepared.ownersDigest !== rollbackOwners(draft).digest ||
|
|
193
|
+
Object.entries(prepared.identities).some(([id, value]) => value.digest !== rollbackDigest(draft.identities[id])))
|
|
194
|
+
throw new Error("Rollback preparation changed before activation");
|
|
195
|
+
draft.writer.rollbackActivated = {
|
|
196
|
+
migrationId: receipt.migrationId,
|
|
197
|
+
importedDigest: prepared.importedDigest,
|
|
198
|
+
receiptDigest: receipt.digest,
|
|
199
|
+
};
|
|
200
|
+
}),
|
|
201
|
+
migrationStatus: async () => {
|
|
202
|
+
await writes;
|
|
203
|
+
return {
|
|
204
|
+
fenced: state.writer?.fenced ?? false,
|
|
205
|
+
...(state.writer?.rollbackActivated
|
|
206
|
+
? {
|
|
207
|
+
rollbackActivated: state.writer.rollbackActivated.migrationId ===
|
|
208
|
+
state.writer.importedId &&
|
|
209
|
+
state.writer.rollbackActivated.importedDigest ===
|
|
210
|
+
state.writer.importedDigest &&
|
|
211
|
+
state.writer.rollbackActivated.receiptDigest ===
|
|
212
|
+
state.writer.rollback?.receipt.digest,
|
|
213
|
+
}
|
|
214
|
+
: {}),
|
|
215
|
+
...(state.writer?.importedId
|
|
216
|
+
? { importedId: state.writer.importedId }
|
|
217
|
+
: {}),
|
|
218
|
+
};
|
|
219
|
+
},
|
|
220
|
+
fenceAndExport(migrationId, target) {
|
|
221
|
+
if (!migrationId || !target)
|
|
222
|
+
return Promise.reject(new Error("Migration identity required"));
|
|
223
|
+
const result = operations.then(async () => {
|
|
224
|
+
const exported = writes.then(async () => {
|
|
225
|
+
if (state.writer?.fenced &&
|
|
226
|
+
(state.writer.migrationId !== migrationId ||
|
|
227
|
+
state.writer.target !== target))
|
|
228
|
+
throw new Error("MCP writer already fenced for another migration");
|
|
229
|
+
const draft = structuredClone(state);
|
|
230
|
+
draft.writer = { ...draft.writer, fenced: true, migrationId, target };
|
|
231
|
+
await persist(options.path, key, draft);
|
|
232
|
+
state = draft;
|
|
233
|
+
return Buffer.from(JSON.stringify({ v: 1, migrationId, state: draft }));
|
|
234
|
+
});
|
|
235
|
+
writes = exported.catch(() => undefined);
|
|
236
|
+
return exported;
|
|
237
|
+
});
|
|
238
|
+
operations = result.catch(() => undefined);
|
|
239
|
+
return result;
|
|
240
|
+
},
|
|
241
|
+
importSnapshot(snapshot, migrationId) {
|
|
242
|
+
const result = operations.then(async () => {
|
|
243
|
+
const imported = writes.then(async () => {
|
|
244
|
+
const digest = createHash("sha256").update(snapshot).digest("hex");
|
|
245
|
+
if (state.writer?.importedId === migrationId &&
|
|
246
|
+
state.writer.importedDigest === digest &&
|
|
247
|
+
!state.writer.fenced)
|
|
248
|
+
return {
|
|
249
|
+
connections: Object.keys(state.connections).length,
|
|
250
|
+
digest,
|
|
251
|
+
};
|
|
252
|
+
if (!state.writer?.fenced &&
|
|
253
|
+
(Object.keys(state.connections).length ||
|
|
254
|
+
Object.keys(state.authorizations).length))
|
|
255
|
+
throw new Error("Cannot replace active MCP writer");
|
|
256
|
+
const incoming = JSON.parse(Buffer.from(snapshot).toString("utf8"));
|
|
257
|
+
if (incoming.v !== 1 ||
|
|
258
|
+
incoming.migrationId !== migrationId ||
|
|
259
|
+
!incoming.state?.writer?.fenced ||
|
|
260
|
+
incoming.state.writer.migrationId !== migrationId ||
|
|
261
|
+
!incoming.state.connections ||
|
|
262
|
+
!incoming.state.authorizations ||
|
|
263
|
+
!incoming.state.owners ||
|
|
264
|
+
!incoming.state.identities)
|
|
265
|
+
throw new Error("Invalid fenced MCP snapshot");
|
|
266
|
+
const draft = incoming.state;
|
|
267
|
+
draft.writer = {
|
|
268
|
+
fenced: false,
|
|
269
|
+
importedId: migrationId,
|
|
270
|
+
importedDigest: digest,
|
|
271
|
+
};
|
|
272
|
+
await persist(options.path, key, draft);
|
|
273
|
+
state = draft;
|
|
274
|
+
return { connections: Object.keys(draft.connections).length, digest };
|
|
275
|
+
});
|
|
276
|
+
writes = imported.catch(() => undefined);
|
|
277
|
+
return imported;
|
|
278
|
+
});
|
|
279
|
+
operations = result.catch(() => undefined);
|
|
280
|
+
return result;
|
|
281
|
+
},
|
|
282
|
+
connections: {
|
|
283
|
+
create: (record) => mutate((draft) => {
|
|
284
|
+
if (draft.connections[record.id])
|
|
285
|
+
throw new Error("MCP connection already exists");
|
|
286
|
+
draft.connections[record.id] = structuredClone(record);
|
|
287
|
+
}),
|
|
288
|
+
list: () => read((current) => Object.values(current.connections)),
|
|
289
|
+
getById: (id) => read((current) => current.connections[id] ?? null),
|
|
290
|
+
getByTokenHash: (hash) => read((current) => Object.values(current.connections).find((record) => record.tokenHash === hash &&
|
|
291
|
+
record.status === "approved" &&
|
|
292
|
+
!isMcpTokenExpired(record)) ?? null),
|
|
293
|
+
getByRefreshTokenHash: (hash) => read((current) => Object.values(current.connections).find((record) => matchesMcpRefreshHash(record, hash)) ?? null),
|
|
294
|
+
update: (id, patch) => mutate((draft) => {
|
|
295
|
+
const record = draft.connections[id];
|
|
296
|
+
if (!record)
|
|
297
|
+
return null;
|
|
298
|
+
return (draft.connections[id] = { ...record, ...patch });
|
|
299
|
+
}),
|
|
300
|
+
},
|
|
301
|
+
authorizations: {
|
|
302
|
+
create: (record) => mutate((draft) => {
|
|
303
|
+
if (draft.authorizations[record.id])
|
|
304
|
+
throw new Error("MCP authorization already exists");
|
|
305
|
+
draft.authorizations[record.id] = structuredClone(record);
|
|
306
|
+
}),
|
|
307
|
+
getById: (id) => read((current) => current.authorizations[id] ?? null),
|
|
308
|
+
getByCodeHash: (hash) => read((current) => Object.values(current.authorizations).find((record) => record.authorizationCodeHash === hash) ?? null),
|
|
309
|
+
update: (id, patch) => mutate((draft) => {
|
|
310
|
+
const record = draft.authorizations[id];
|
|
311
|
+
if (!record)
|
|
312
|
+
return null;
|
|
313
|
+
return (draft.authorizations[id] = { ...record, ...patch });
|
|
314
|
+
}),
|
|
315
|
+
delete: (id) => mutate((draft) => {
|
|
316
|
+
delete draft.authorizations[id];
|
|
317
|
+
}),
|
|
318
|
+
},
|
|
319
|
+
bindOwner: (connectionId, binding) => mutate((draft) => {
|
|
320
|
+
if (!draft.connections[connectionId])
|
|
321
|
+
throw new Error("Unknown MCP connection");
|
|
322
|
+
const prior = draft.owners[connectionId];
|
|
323
|
+
if (prior &&
|
|
324
|
+
(prior.owner.toLowerCase() !== binding.owner.toLowerCase() ||
|
|
325
|
+
prior.chainId !== binding.chainId)) {
|
|
326
|
+
throw new Error("MCP connection owner cannot change");
|
|
327
|
+
}
|
|
328
|
+
draft.owners[connectionId] = structuredClone(binding);
|
|
329
|
+
}),
|
|
330
|
+
getOwner: (id) => read((current) => current.owners[id] ?? null),
|
|
331
|
+
rememberIdentity: (identity) => mutate((draft) => {
|
|
332
|
+
const previous = draft.identities[identity.userPsId];
|
|
333
|
+
if (!previous || identity.epoch >= previous.epoch) {
|
|
334
|
+
draft.identities[identity.userPsId] = structuredClone(identity);
|
|
335
|
+
}
|
|
336
|
+
}),
|
|
337
|
+
getIdentity: (id) => read((current) => current.identities[id] ?? null),
|
|
338
|
+
exclusive(operation) {
|
|
339
|
+
const result = operations.then(operation);
|
|
340
|
+
operations = result.catch(() => undefined);
|
|
341
|
+
return result;
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
function rollbackDigest(value) {
|
|
346
|
+
const canonical = JSON.stringify(value, (_key, item) => {
|
|
347
|
+
if (item && typeof item === "object" && !Array.isArray(item))
|
|
348
|
+
return Object.fromEntries(Object.entries(item).sort(([a], [b]) => a.localeCompare(b)));
|
|
349
|
+
return item;
|
|
350
|
+
});
|
|
351
|
+
return createHash("sha256").update(canonical).digest("hex");
|
|
352
|
+
}
|
|
353
|
+
function rollbackOwners(state) {
|
|
354
|
+
const connections = Object.values(state.connections)
|
|
355
|
+
.filter((connection) => connection.status === "approved")
|
|
356
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
357
|
+
const bindings = new Map();
|
|
358
|
+
const entries = connections.map((connection) => {
|
|
359
|
+
const binding = state.owners[connection.id];
|
|
360
|
+
if (!binding)
|
|
361
|
+
throw new Error("Approved rollback connection has no owner");
|
|
362
|
+
const id = userPsId(binding.chainId, binding.owner);
|
|
363
|
+
bindings.set(id, binding);
|
|
364
|
+
return {
|
|
365
|
+
connectionId: connection.id,
|
|
366
|
+
owner: binding.owner.toLowerCase(),
|
|
367
|
+
chainId: binding.chainId,
|
|
368
|
+
};
|
|
369
|
+
});
|
|
370
|
+
return {
|
|
371
|
+
bindings: [...bindings.values()],
|
|
372
|
+
digest: rollbackDigest(entries),
|
|
373
|
+
connections: connections.length,
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
async function persist(path, key, state) {
|
|
377
|
+
const iv = randomBytes(12);
|
|
378
|
+
const cipher = createCipheriv("aes-256-gcm", key, iv);
|
|
379
|
+
cipher.setAAD(AAD);
|
|
380
|
+
const plaintext = Buffer.from(JSON.stringify(state));
|
|
381
|
+
let ciphertext;
|
|
382
|
+
try {
|
|
383
|
+
ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
plaintext.fill(0);
|
|
387
|
+
}
|
|
388
|
+
const serialized = JSON.stringify({
|
|
389
|
+
v: 1,
|
|
390
|
+
iv: iv.toString("base64"),
|
|
391
|
+
tag: cipher.getAuthTag().toString("base64"),
|
|
392
|
+
ciphertext: ciphertext.toString("base64"),
|
|
393
|
+
});
|
|
394
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
395
|
+
const temporary = `${path}.${randomBytes(8).toString("hex")}.tmp`;
|
|
396
|
+
try {
|
|
397
|
+
const file = await open(temporary, "wx", 0o600);
|
|
398
|
+
try {
|
|
399
|
+
await file.writeFile(serialized, "utf8");
|
|
400
|
+
await file.sync();
|
|
401
|
+
}
|
|
402
|
+
finally {
|
|
403
|
+
await file.close();
|
|
404
|
+
}
|
|
405
|
+
await rename(temporary, path);
|
|
406
|
+
const directory = await open(dirname(path), "r");
|
|
407
|
+
try {
|
|
408
|
+
await directory.sync();
|
|
409
|
+
}
|
|
410
|
+
finally {
|
|
411
|
+
await directory.close();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
finally {
|
|
415
|
+
await rm(temporary, { force: true });
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=durable-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-state.js","sourceRoot":"","sources":["../../src/mcp/durable-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GatewayClient, DataPortabilityGatewayConfig } from "@opendatalabs/vana-sdk/node";
|
|
2
|
+
import type { McpConnectionGrant, McpConnectionRecord } from "@opendatalabs/personal-server-ts-core/mcp";
|
|
3
|
+
import type { McpOwnerBinding } from "./durable-state.js";
|
|
4
|
+
export declare function verifyTeeMcpGrants(options: {
|
|
5
|
+
connection: McpConnectionRecord;
|
|
6
|
+
binding: McpOwnerBinding;
|
|
7
|
+
grants: McpConnectionGrant[];
|
|
8
|
+
gateway: Pick<GatewayClient, "getGrant" | "getBuilder">;
|
|
9
|
+
gatewayConfig: DataPortabilityGatewayConfig;
|
|
10
|
+
chainId: number;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=grants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grants.d.ts","sourceRoot":"","sources":["../../src/mcp/grants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,4BAA4B,EAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,UAAU,EAAE,mBAAmB,CAAC;IAChC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,YAAY,CAAC,CAAC;IACxD,aAAa,EAAE,4BAA4B,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { verifySignedArtifacts } from "@opendatalabs/personal-server-ts-core/policy";
|
|
2
|
+
export async function verifyTeeMcpGrants(options) {
|
|
3
|
+
if (options.binding.chainId !== options.chainId)
|
|
4
|
+
throw new Error("MCP chain mismatch");
|
|
5
|
+
const builder = await options.gateway.getBuilder(options.connection.granteeAddress);
|
|
6
|
+
if (!builder ||
|
|
7
|
+
builder.granteeAddress.toLowerCase() !==
|
|
8
|
+
options.connection.granteeAddress.toLowerCase() ||
|
|
9
|
+
builder.publicKey.toLowerCase() !==
|
|
10
|
+
options.connection.granteePublicKey.toLowerCase())
|
|
11
|
+
throw new Error("MCP grantee mismatch");
|
|
12
|
+
for (const requested of options.grants) {
|
|
13
|
+
const grant = await options.gateway.getGrant(requested.grantId);
|
|
14
|
+
if (!grant || grant.id.toLowerCase() !== requested.grantId.toLowerCase())
|
|
15
|
+
throw new Error("MCP grant missing");
|
|
16
|
+
await verifySignedArtifacts({
|
|
17
|
+
grant,
|
|
18
|
+
builder,
|
|
19
|
+
gatewayConfig: options.gatewayConfig,
|
|
20
|
+
ownerAddress: options.binding.owner,
|
|
21
|
+
});
|
|
22
|
+
if (requested.scopes.some((scope) => !grant.scopes.includes(scope)))
|
|
23
|
+
throw new Error("MCP scope mismatch");
|
|
24
|
+
if (grant.expiresAt && grant.expiresAt !== "0") {
|
|
25
|
+
const expiry = /^\d+$/.test(grant.expiresAt)
|
|
26
|
+
? Number(grant.expiresAt) * 1000
|
|
27
|
+
: Date.parse(grant.expiresAt);
|
|
28
|
+
if (!Number.isFinite(expiry) || expiry <= Date.now())
|
|
29
|
+
throw new Error("MCP grant expired");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=grants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grants.js","sourceRoot":"","sources":["../../src/mcp/grants.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAOrF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAOxC;IACC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;QAC7C,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,UAAU,CAC9C,OAAO,CAAC,UAAU,CAAC,cAAc,CAClC,CAAC;IACF,IACE,CAAC,OAAO;QACR,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE;YAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,WAAW,EAAE;QACjD,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;YAC7B,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,WAAW,EAAE;QAEnD,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE;YACtE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACvC,MAAM,qBAAqB,CAAC;YAC1B,KAAK;YACL,OAAO;YACP,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK;SACpC,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,GAAG,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBAC1C,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,IAAI;gBAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE;gBAClD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createTeeMcpIngress, McpOwnerAccessRevokedError, OWNER_ACCESS_REVOKED_CODE, type TeeMcpIngressDeps, } from "./tee-ingress.js";
|
|
2
|
+
export { openMcpDurableState, McpStateRequirement, McpStateRequiredError, MCP_STATE_REQUIRED_MISSING_CODE, type McpDurableState, type McpOwnerBinding, type McpWakeupIdentity, type McpRollbackIdentity, type McpRollbackReceipt, } from "./durable-state.js";
|
|
3
|
+
export { verifyTeeMcpGrants } from "./grants.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,EACzB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,+BAA+B,EAC/B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createTeeMcpIngress, McpOwnerAccessRevokedError, OWNER_ACCESS_REVOKED_CODE, } from "./tee-ingress.js";
|
|
2
|
+
export { openMcpDurableState, McpStateRequirement, McpStateRequiredError, MCP_STATE_REQUIRED_MISSING_CODE, } from "./durable-state.js";
|
|
3
|
+
export { verifyTeeMcpGrants } from "./grants.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,yBAAyB,GAE1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,+BAA+B,GAMhC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import type { GatewayClient } from "@opendatalabs/vana-sdk/node";
|
|
3
|
+
import { type McpConnectionGrant, type McpConnectionRecord } from "@opendatalabs/personal-server-ts-core/mcp";
|
|
4
|
+
import type { McpDurableState, McpOwnerBinding } from "./durable-state.js";
|
|
5
|
+
/** Stable, non-retryable code for a caller whose owner withdrew enclave access
|
|
6
|
+
* (server deregistered, identity epoch bumped, delegation revoked). Retrying
|
|
7
|
+
* cannot help; the owner has to approve this enclave again. */
|
|
8
|
+
export declare const OWNER_ACCESS_REVOKED_CODE = "OWNER_ACCESS_REVOKED";
|
|
9
|
+
/** Thrown by `dispatch`/`ownerReady` providers when the live protocol identity
|
|
10
|
+
* shows the owner no longer authorizes this enclave. */
|
|
11
|
+
export declare class McpOwnerAccessRevokedError extends Error {
|
|
12
|
+
constructor();
|
|
13
|
+
}
|
|
14
|
+
export interface TeeMcpIngressDeps {
|
|
15
|
+
state: McpDurableState;
|
|
16
|
+
origin: string;
|
|
17
|
+
approvalUrl: string;
|
|
18
|
+
allowedRedirectUris: string[];
|
|
19
|
+
gateway: GatewayClient;
|
|
20
|
+
registerGrantee(connection: McpConnectionRecord, redirectUri: string): Promise<void>;
|
|
21
|
+
verifyGrants(connection: McpConnectionRecord, binding: McpOwnerBinding, grants: McpConnectionGrant[]): Promise<void>;
|
|
22
|
+
dispatch(request: Request, connection: McpConnectionRecord, binding: McpOwnerBinding): Promise<Response>;
|
|
23
|
+
ownerReady?(binding: McpOwnerBinding): Promise<boolean>;
|
|
24
|
+
/** Runs only after signed grants are verified, before durable approval. */
|
|
25
|
+
beforeOwnerApproval?(binding: McpOwnerBinding): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/** Public ingress: HTTPS terminates in the same CVM as this process. */
|
|
28
|
+
export declare function createTeeMcpIngress(deps: TeeMcpIngressDeps): Hono;
|
|
29
|
+
//# sourceMappingURL=tee-ingress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tee-ingress.d.ts","sourceRoot":"","sources":["../../src/mcp/tee-ingress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,2CAA2C,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE3E;;+DAE+D;AAC/D,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAIhE;wDACwD;AACxD,qBAAa,0BAA2B,SAAQ,KAAK;;CAKpD;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,CACb,UAAU,EAAE,mBAAmB,EAC/B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,CACV,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,kBAAkB,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,QAAQ,CACN,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,mBAAmB,EAC/B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrB,UAAU,CAAC,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxD,2EAA2E;IAC3E,mBAAmB,CAAC,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAgNjE"}
|