ftown 0.20.5 → 0.20.7

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 (81) hide show
  1. package/dist/attention-prompt-protocol.d.ts +2 -2
  2. package/dist/attention-prompt-protocol.js +1 -1
  3. package/dist/centrifugo-client.d.ts +11 -0
  4. package/dist/centrifugo-client.js +76 -1
  5. package/dist/centrifugo-client.js.map +1 -1
  6. package/dist/command-rpc.d.ts +0 -1
  7. package/dist/command-rpc.js +3 -24
  8. package/dist/command-rpc.js.map +1 -1
  9. package/dist/index.js +3 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/security/bridge/account-state.d.ts +0 -4
  12. package/dist/security/bridge/direct.js +0 -2
  13. package/dist/security/bridge/direct.js.map +1 -1
  14. package/dist/security/bridge/execute.js +1 -6
  15. package/dist/security/bridge/execute.js.map +1 -1
  16. package/dist/security/bridge/identity.d.ts +0 -3
  17. package/dist/security/bridge/metadata.d.ts +0 -2
  18. package/dist/security/bridge/metadata.js +1 -1
  19. package/dist/security/bridge/metadata.js.map +1 -1
  20. package/dist/security/bridge/permissions.js +3 -11
  21. package/dist/security/bridge/permissions.js.map +1 -1
  22. package/dist/security/bridge/policy.d.ts +4 -7
  23. package/dist/security/bridge/policy.js +35 -90
  24. package/dist/security/bridge/policy.js.map +1 -1
  25. package/dist/security/bridge/security.d.ts +12 -11
  26. package/dist/security/bridge/security.js +57 -84
  27. package/dist/security/bridge/security.js.map +1 -1
  28. package/dist/security/crypto.js +2 -2
  29. package/dist/security/crypto.js.map +1 -1
  30. package/dist/security/protocol.d.ts +5 -126
  31. package/dist/security/security-nudge.d.ts +31 -0
  32. package/dist/security/security-nudge.js +98 -0
  33. package/dist/security/security-nudge.js.map +1 -0
  34. package/dist/types.d.ts +1 -1
  35. package/dist/update-effects.js +1 -1
  36. package/dist/update-effects.js.map +1 -1
  37. package/package.json +4 -12
  38. package/skills/ftown/SKILL.md +9 -13
  39. package/skills/ftown/references/sessions.md +4 -20
  40. package/dist/mcp/fleet.d.ts +0 -67
  41. package/dist/mcp/fleet.js +0 -298
  42. package/dist/mcp/fleet.js.map +0 -1
  43. package/dist/mcp/http.d.ts +0 -42
  44. package/dist/mcp/http.js +0 -350
  45. package/dist/mcp/http.js.map +0 -1
  46. package/dist/mcp/legacy-relay.d.ts +0 -3
  47. package/dist/mcp/legacy-relay.js +0 -6
  48. package/dist/mcp/legacy-relay.js.map +0 -1
  49. package/dist/mcp/mcp-key-store.d.ts +0 -52
  50. package/dist/mcp/mcp-key-store.js +0 -207
  51. package/dist/mcp/mcp-key-store.js.map +0 -1
  52. package/dist/mcp/oauth-store.d.ts +0 -17
  53. package/dist/mcp/oauth-store.js +0 -58
  54. package/dist/mcp/oauth-store.js.map +0 -1
  55. package/dist/mcp/oauth.d.ts +0 -83
  56. package/dist/mcp/oauth.js +0 -311
  57. package/dist/mcp/oauth.js.map +0 -1
  58. package/dist/mcp/relay-handler.d.ts +0 -2
  59. package/dist/mcp/relay-handler.js +0 -8
  60. package/dist/mcp/relay-handler.js.map +0 -1
  61. package/dist/mcp/relay.d.ts +0 -13
  62. package/dist/mcp/relay.js +0 -95
  63. package/dist/mcp/relay.js.map +0 -1
  64. package/dist/mcp/secure-client.d.ts +0 -23
  65. package/dist/mcp/secure-client.js +0 -124
  66. package/dist/mcp/secure-client.js.map +0 -1
  67. package/dist/mcp/security-events.d.ts +0 -49
  68. package/dist/mcp/security-events.js +0 -211
  69. package/dist/mcp/security-events.js.map +0 -1
  70. package/dist/mcp/server.d.ts +0 -13
  71. package/dist/mcp/server.js +0 -858
  72. package/dist/mcp/server.js.map +0 -1
  73. package/dist/mcp/test-support.d.ts +0 -32
  74. package/dist/mcp/test-support.js +0 -120
  75. package/dist/mcp/test-support.js.map +0 -1
  76. package/dist/mcp-cli.d.ts +0 -2
  77. package/dist/mcp-cli.js +0 -105
  78. package/dist/mcp-cli.js.map +0 -1
  79. package/dist/security/bridge/audit.d.ts +0 -37
  80. package/dist/security/bridge/audit.js +0 -186
  81. package/dist/security/bridge/audit.js.map +0 -1
package/dist/mcp/http.js DELETED
@@ -1,350 +0,0 @@
1
- import express from "express";
2
- import { rateLimit } from "express-rate-limit";
3
- import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
- import { mcpAuthRouter, createOAuthMetadata, } from "@modelcontextprotocol/sdk/server/auth/router.js";
5
- import { requireBearerAuth } from "@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js";
6
- import { z } from "zod";
7
- import { configSchema, Fleet, FleetError } from "./fleet.js";
8
- import { createMcpServer } from "./server.js";
9
- import { MCP_SCOPES } from "./oauth.js";
10
- import { randomUUID } from 'node:crypto';
11
- import { AsyncLocalStorage } from 'node:async_hooks';
12
- import { errorResult } from './fleet.js';
13
- import { READ_MCP_TOOLS, safeTool, safeFailureCode, securityOutcome, finishSecurityEvent } from './security-events.js';
14
- const httpsOrigin = z
15
- .string()
16
- .url()
17
- .refine((s) => {
18
- const u = new URL(s);
19
- return u.protocol === "https:" && u.origin === s;
20
- }, "An HTTPS origin without a trailing slash is required");
21
- export const gatewayConfigSchema = z
22
- .object({
23
- publicUrl: httpsOrigin,
24
- loginUrl: httpsOrigin,
25
- allowedOrigins: z.array(httpsOrigin).default([]),
26
- fleet: configSchema,
27
- access: z
28
- .array(z
29
- .object({
30
- subject: z.string().min(1),
31
- machines: z.array(z.string()).min(1),
32
- })
33
- .strict())
34
- .min(1),
35
- })
36
- .strict()
37
- .superRefine((c, ctx) => {
38
- if (new Set(c.access.map((a) => a.subject)).size !== c.access.length)
39
- ctx.addIssue({ code: "custom", message: "Duplicate account subject" });
40
- for (const a of c.access)
41
- if (a.machines.some((id) => !c.fleet.machines.some((m) => m.id === id)))
42
- ctx.addIssue({
43
- code: "custom",
44
- message: "Access references an unknown machine",
45
- });
46
- });
47
- export function createGateway(config, provider, relay, audit) {
48
- const app = express();
49
- const rootFleet = new Fleet(config.fleet, relay
50
- ? (user, id, request, signal, context) => relay.request(user, id, request, signal, context)
51
- : undefined);
52
- const actions = new AsyncLocalStorage();
53
- const states = new WeakMap();
54
- const finish = (state, outcome) => finishSecurityEvent(audit, state, outcome);
55
- const admission = async (req, res) => {
56
- if (!audit || !provider.keys)
57
- throw new FleetError('security_setup_required', 'Encrypted MCP storage and security audit must be configured');
58
- const subject = String(req.auth.extra.subject);
59
- const tool = req.body?.method === 'tools/call' ? safeTool(req.body?.params?.name)
60
- : req.body?.method === 'initialize' ? 'initialize' : req.body?.method === 'tools/list' ? 'tools_list'
61
- : req.body?.method === 'resources/list' ? 'resources_list' : req.body?.method === 'resources/read' ? 'resources_read'
62
- : req.body?.id === undefined ? 'protocol_notification' : 'protocol_request';
63
- const target = req.body?.params?.arguments;
64
- const allowed = req.auth.extra.machines;
65
- const actionId = randomUUID();
66
- const action = { actionId, parentActionId: null, clientId: req.auth.clientId, grantId: String(req.auth.extra.grantId), tool, operation: null };
67
- const event = {
68
- version: 1, id: actionId, actionId, parentActionId: null, ownerId: subject, source: 'gateway',
69
- bridgeId: typeof target?.machine === 'string' && allowed.includes(target.machine) ? target.machine : null,
70
- clientId: action.clientId, grantId: action.grantId, endpointId: String(req.auth.extra.endpointId), tool, operation: null,
71
- sessionId: typeof target?.sessionId === 'string' && /^[A-Za-z0-9_-]{1,200}$/.test(target.sessionId) ? target.sessionId : null,
72
- startedAt: new Date().toISOString(), finishedAt: null, status: 'started', errorCode: null,
73
- mutating: req.body?.method === 'tools/call' && !READ_MCP_TOOLS.has(tool),
74
- };
75
- await audit.admit(event);
76
- const state = { event, action, finished: false, dispatched: false };
77
- states.set(req, state);
78
- res.once('close', () => {
79
- if (!state.finished)
80
- void finish(state, { status: state.dispatched ? 'unknown' : 'rejected', errorCode: state.dispatched ? 'outcome_unknown' : res.statusCode >= 400 ? 'invalid_request' : 'cancelled' }).catch(() => { });
81
- });
82
- return state;
83
- };
84
- app.disable("x-powered-by");
85
- // Fly's edge is the sole HTTP ingress; forwarded headers are not used for authorization.
86
- app.set("trust proxy", 1);
87
- app.get("/healthz", (_req, res) => {
88
- res.json({ ok: true });
89
- });
90
- app.use((req, res, next) => {
91
- res.setHeader("Cache-Control", "no-store");
92
- res.setHeader("X-Content-Type-Options", "nosniff");
93
- res.setHeader("Referrer-Policy", "no-referrer");
94
- res.setHeader("Strict-Transport-Security", "max-age=31536000");
95
- if (req.headers.host !== new URL(config.publicUrl).host) {
96
- res.status(421).end();
97
- return;
98
- }
99
- if (req.headers["x-forwarded-proto"] &&
100
- req.headers["x-forwarded-proto"] !== "https") {
101
- res.status(400).end();
102
- return;
103
- }
104
- next();
105
- });
106
- // Keep issuer spelling identical across discovery and authorization responses.
107
- app.get("/.well-known/oauth-authorization-server", (_req, res) => {
108
- res.setHeader("Access-Control-Allow-Origin", "*");
109
- res.json({
110
- ...createOAuthMetadata({
111
- provider,
112
- issuerUrl: new URL(config.publicUrl),
113
- scopesSupported: MCP_SCOPES,
114
- }),
115
- issuer: config.publicUrl,
116
- token_endpoint_auth_methods_supported: ["none"],
117
- revocation_endpoint_auth_methods_supported: ["none"],
118
- authorization_response_iss_parameter_supported: true,
119
- });
120
- });
121
- app.get([
122
- "/.well-known/oauth-protected-resource/mcp",
123
- "/.well-known/oauth-protected-resource",
124
- ], (_req, res) => {
125
- res.setHeader("Access-Control-Allow-Origin", "*");
126
- res.json({
127
- resource: provider.resource,
128
- authorization_servers: [config.publicUrl],
129
- scopes_supported: MCP_SCOPES,
130
- bearer_methods_supported: ["header"],
131
- resource_name: "ftown agent fleet",
132
- });
133
- });
134
- app.use(mcpAuthRouter({
135
- provider,
136
- issuerUrl: new URL(config.publicUrl),
137
- resourceServerUrl: new URL(provider.resource),
138
- scopesSupported: MCP_SCOPES,
139
- resourceName: "ftown agent fleet",
140
- }));
141
- app.use("/consent", rateLimit({
142
- windowMs: 60000,
143
- limit: 60,
144
- standardHeaders: true,
145
- legacyHeaders: false,
146
- }), express.json({ limit: "512kb" }));
147
- app.post("/consent/:action", async (req, res) => {
148
- try {
149
- if (typeof req.body?.assertion !== "string") {
150
- res.status(400).json({ error: "invalid_request" });
151
- return;
152
- }
153
- if (req.params.action === "details")
154
- res.json(await provider.consentDetails(req.body.assertion));
155
- else if (req.params.action === "approve" || req.params.action === "deny")
156
- res.json({
157
- redirect: await provider.approve(req.body.assertion, req.params.action === "deny"),
158
- });
159
- else
160
- res.status(404).end();
161
- }
162
- catch {
163
- res.status(400).json({ error: "Invalid or expired consent request" });
164
- }
165
- });
166
- app.use("/mcp", (req, res, next) => {
167
- const origin = req.headers.origin;
168
- if (origin &&
169
- ![config.loginUrl, ...config.allowedOrigins].includes(origin)) {
170
- res.status(403).json({ error: "Origin not allowed" });
171
- return;
172
- }
173
- if (origin) {
174
- res.setHeader("Access-Control-Allow-Origin", origin);
175
- res.setHeader("Vary", "Origin");
176
- }
177
- res.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, MCP-Protocol-Version, MCP-Session-Id, Last-Event-ID");
178
- res.setHeader("Access-Control-Expose-Headers", "WWW-Authenticate, MCP-Session-Id, MCP-Protocol-Version");
179
- res.setHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, OPTIONS");
180
- if (req.method === "OPTIONS") {
181
- res.status(204).end();
182
- return;
183
- }
184
- next();
185
- });
186
- app.use("/mcp", requireBearerAuth({
187
- verifier: provider,
188
- requiredScopes: ["mcp:read"],
189
- resourceMetadataUrl: new URL("/.well-known/oauth-protected-resource/mcp", config.publicUrl).href,
190
- }));
191
- app.use('/mcp', express.json({ limit: '1mb' }));
192
- app.use('/mcp', async (req, res, next) => {
193
- try {
194
- await admission(req, res);
195
- next();
196
- }
197
- catch {
198
- res.status(503).json({ error: 'Security audit or encrypted endpoint is unavailable' });
199
- }
200
- });
201
- app.use("/mcp", rateLimit({
202
- windowMs: 60000,
203
- limit: 600,
204
- keyGenerator: (req) => String(req.auth?.extra?.subject),
205
- standardHeaders: true,
206
- legacyHeaders: false,
207
- handler: (req, res) => {
208
- const state = states.get(req);
209
- void (state ? finish(state, { status: 'rejected', errorCode: 'capacity_exceeded' }) : Promise.resolve()).catch(() => { }).finally(() => res.status(429).json({ error: 'MCP request limit exceeded' }));
210
- },
211
- }));
212
- app.post("/mcp", async (req, res) => {
213
- const state = states.get(req);
214
- let identity;
215
- try {
216
- identity = await provider.keys.loadGrantIdentity(state.event.ownerId, state.action.grantId);
217
- await provider.keys.markActive(identity.ownerId, identity.requestId);
218
- }
219
- catch {
220
- await finish(state, { status: 'rejected', errorCode: 'approval_required' });
221
- res.status(403).json({ error: 'Renew encrypted bridge consent' });
222
- return;
223
- }
224
- const allowed = req.auth.extra.machines;
225
- const fleet = {
226
- config: {
227
- ...config.fleet,
228
- machines: config.fleet.machines.filter((m) => allowed.includes(m.id)),
229
- },
230
- request: (id, ...args) => {
231
- if (!allowed.includes(id))
232
- return Promise.reject(new FleetError("forbidden", "Machine is not authorized for this grant"));
233
- state.dispatched = true;
234
- return rootFleet.scoped({ grant: identity, action: actions.getStore() ?? state.action, revalidate: async () => {
235
- const current = await provider.verifyAccessToken(req.auth.token);
236
- if (!(current.extra?.machines).includes(id) || (state.event.mutating && !current.scopes.includes('mcp:control')))
237
- throw new FleetError('forbidden', 'MCP access changed before dispatch');
238
- } }).request(id, ...args);
239
- },
240
- };
241
- const server = createMcpServer(fleet, {
242
- readOnly: !req.auth.scopes.includes("mcp:control"),
243
- caller: { subject: String(req.auth.extra.subject), clientId: req.auth.clientId, scopes: [...req.auth.scopes] },
244
- revalidate: async (machines) => {
245
- let current;
246
- try {
247
- current = await provider.verifyAccessToken(req.auth.token);
248
- }
249
- catch {
250
- throw new FleetError("forbidden", "Access expired or was revoked during this request");
251
- }
252
- const authorized = current.extra?.machines;
253
- if (machines.some((machine) => !authorized.includes(machine)))
254
- throw new FleetError("forbidden", "Machine access was revoked during this request");
255
- },
256
- runChild: async (name, args, run) => {
257
- const actionId = randomUUID();
258
- const child = {
259
- ...state.event, id: actionId, actionId, parentActionId: state.event.actionId, tool: safeTool(name), operation: safeTool(name),
260
- bridgeId: typeof args.machine === 'string' && allowed.includes(args.machine) ? args.machine : null,
261
- sessionId: typeof args.sessionId === 'string' && /^[A-Za-z0-9_-]{1,200}$/.test(args.sessionId) ? args.sessionId : null,
262
- startedAt: new Date().toISOString(), mutating: !READ_MCP_TOOLS.has(name),
263
- };
264
- await audit.admit(child);
265
- const action = { ...state.action, actionId, parentActionId: state.event.actionId, tool: child.tool, operation: child.operation };
266
- let outcome;
267
- try {
268
- const result = await actions.run(action, run);
269
- outcome = securityOutcome(result);
270
- await audit.finish(child, outcome);
271
- return result;
272
- }
273
- catch (error) {
274
- const failure = errorResult(error);
275
- await audit.finish(child, { status: failure.outcomeUnknown ? 'unknown' : ['forbidden', 'permission_denied'].includes(failure.code) ? 'rejected' : 'failed', errorCode: safeFailureCode(failure.code) });
276
- throw error;
277
- }
278
- },
279
- });
280
- // Stateless transport: every request is authenticated and reconstructs its own scoped tool surface.
281
- const transport = new StreamableHTTPServerTransport({
282
- sessionIdGenerator: undefined,
283
- // Only a bounded attention_wait call opens a request-scoped SSE stream.
284
- // No GET stream/session map or unsolicited server notifications are advertised.
285
- enableJsonResponse: !(req.body?.method === "tools/call" && req.body?.params?.name === "attention_wait"),
286
- });
287
- const send = transport.send.bind(transport);
288
- transport.send = async (message, options) => {
289
- if ('id' in message && message.id === req.body?.id && ('result' in message || 'error' in message)) {
290
- let outcome = 'error' in message ? { status: 'rejected', errorCode: message.error.code === -32602 ? 'invalid_arguments' : message.error.code === -32601 ? 'unknown_tool' : 'invalid_request' } : securityOutcome(message.result);
291
- if (state.event.mutating && !req.auth.scopes.includes('mcp:control'))
292
- outcome = { status: 'rejected', errorCode: 'permission_denied' };
293
- try {
294
- await finish(state, outcome);
295
- }
296
- catch {
297
- await finish(state, { status: 'unknown', errorCode: 'outcome_unknown' }).catch(() => { });
298
- await send({ jsonrpc: '2.0', id: message.id, error: { code: -32603, message: 'Operation outcome is unknown because final audit storage failed', data: { code: 'outcome_unknown', outcomeUnknown: true } } }, options);
299
- return;
300
- }
301
- }
302
- await send(message, options);
303
- };
304
- res.on("close", () => {
305
- void server.close();
306
- });
307
- try {
308
- await server.connect(transport);
309
- await actions.run(state.action, () => transport.handleRequest(req, res, req.body));
310
- if (!state.finished && res.statusCode >= 400)
311
- await finish(state, { status: 'rejected', errorCode: 'invalid_request' });
312
- else if (!state.finished && req.body?.id === undefined)
313
- await finish(state, { status: 'succeeded', errorCode: null });
314
- }
315
- catch {
316
- if (!state.finished)
317
- await finish(state, { status: state.dispatched && state.event.mutating ? 'unknown' : 'failed', errorCode: state.dispatched && state.event.mutating ? 'outcome_unknown' : 'internal_error' }).catch(() => { });
318
- if (!res.headersSent)
319
- res.status(500).json({ error: "MCP request failed" });
320
- }
321
- });
322
- app.all("/mcp", async (_req, res) => {
323
- const state = states.get(_req);
324
- if (state)
325
- await finish(state, { status: 'rejected', errorCode: 'invalid_request' }).catch(() => { });
326
- res.setHeader("Allow", "POST, OPTIONS");
327
- res.status(405).end();
328
- });
329
- app.use(async (error, _req, res, _next) => {
330
- const status = typeof error === "object" &&
331
- error !== null &&
332
- "status" in error &&
333
- error.status === 413
334
- ? 413
335
- : 400;
336
- if (_req.auth) {
337
- try {
338
- const state = states.get(_req) ?? await admission(_req, res);
339
- await finish(state, { status: 'rejected', errorCode: 'invalid_request' });
340
- }
341
- catch {
342
- res.status(503).json({ error: 'Security audit storage is unavailable' });
343
- return;
344
- }
345
- }
346
- res.status(status).json({ error: "Invalid request" });
347
- });
348
- return app;
349
- }
350
- //# sourceMappingURL=http.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { type BridgeRequest } from "./fleet.js";
2
- /** Kept only to fail explicitly for callers of the removed plaintext helper. */
3
- export declare function legacyRelayCommand(_machineId: string, _request: BridgeRequest, _deadline: number): never;
@@ -1,6 +0,0 @@
1
- import { FleetError } from "./fleet.js";
2
- /** Kept only to fail explicitly for callers of the removed plaintext helper. */
3
- export function legacyRelayCommand(_machineId, _request, _deadline) {
4
- throw new FleetError("upgrade_required", "Plaintext legacy MCP execution is no longer supported; approve an encrypted endpoint");
5
- }
6
- //# sourceMappingURL=legacy-relay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacy-relay.js","sourceRoot":"","sources":["../../src/mcp/legacy-relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,YAAY,CAAC;AAE5D,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,QAAuB,EAAE,SAAiB;IAC/F,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,sFAAsF,CAAC,CAAC;AACnI,CAAC"}
@@ -1,52 +0,0 @@
1
- import type { Pool } from 'pg';
2
- import { importEndpoint } from '../security/crypto.js';
3
- import type { ApprovedBridge, McpConsentSecurity, McpKeyEncryptionConfig } from '../security/protocol.js';
4
- export interface McpGrantIdentity {
5
- ownerId: string;
6
- requestId: string;
7
- grantId: string;
8
- identity: Awaited<ReturnType<typeof importEndpoint>>;
9
- bridges: ApprovedBridge[];
10
- permissions: ('read' | 'control')[];
11
- pendingExpiresAt: string;
12
- activeExpiresAt: string;
13
- state: 'pending' | 'approved' | 'active' | 'revoked';
14
- }
15
- export interface McpIdentityStore {
16
- ensurePendingIdentity(requestId: string, ownerId: string, permissions: ('read' | 'control')[]): Promise<McpConsentSecurity>;
17
- loadByRequest(ownerId: string, requestId: string): Promise<McpGrantIdentity>;
18
- loadGrantIdentity(ownerId: string, grantId: string): Promise<McpGrantIdentity>;
19
- approve(ownerId: string, requestId: string, bridges: ApprovedBridge[]): Promise<McpGrantIdentity>;
20
- markActive(ownerId: string, requestId: string): Promise<void>;
21
- revoke(ownerId: string, requestId: string): Promise<void>;
22
- }
23
- /** All columns used as context are authenticated, including lookup and expiry metadata. */
24
- export interface EncryptedMcpIdentity {
25
- version: 1;
26
- ownerId: string;
27
- requestId: string;
28
- grantId: string;
29
- endpointId: string;
30
- expiresAt: string;
31
- keyId: string;
32
- nonce: string;
33
- ciphertext: string;
34
- }
35
- export declare function encryptMcpIdentity(identity: McpGrantIdentity, privateKey: JsonWebKey, config: McpKeyEncryptionConfig): Promise<EncryptedMcpIdentity>;
36
- export declare function decryptMcpIdentity(row: EncryptedMcpIdentity, config: McpKeyEncryptionConfig): Promise<McpGrantIdentity>;
37
- /** Uses the gateway's existing pool; no second connection-string/secret source. */
38
- export declare class McpKeyStore implements McpIdentityStore {
39
- readonly pool: Pool;
40
- private readonly now;
41
- private readonly config;
42
- constructor(pool: Pool, config: McpKeyEncryptionConfig, now?: () => number);
43
- checkSchema(): Promise<void>;
44
- ensurePendingIdentity(requestId: string, ownerId: string, permissions: ('read' | 'control')[]): Promise<McpConsentSecurity>;
45
- loadByRequest(ownerId: string, requestId: string): Promise<McpGrantIdentity>;
46
- loadGrantIdentity(ownerId: string, grantId: string): Promise<McpGrantIdentity>;
47
- /** Caller must verify exact bridge Auth receipts before supplying these pins. */
48
- approve(ownerId: string, requestId: string, bridges: ApprovedBridge[]): Promise<McpGrantIdentity>;
49
- markActive(ownerId: string, requestId: string): Promise<void>;
50
- revoke(ownerId: string, requestId: string): Promise<void>;
51
- private update;
52
- }