ftown 0.19.52 → 0.19.54

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 (139) hide show
  1. package/claude-mod/hooks/register.js +6 -5
  2. package/dist/bridge-auth.d.ts +4 -0
  3. package/dist/bridge-auth.js +2 -2
  4. package/dist/bridge-auth.js.map +1 -1
  5. package/dist/centrifugo-client.d.ts +11 -1
  6. package/dist/centrifugo-client.js +71 -69
  7. package/dist/centrifugo-client.js.map +1 -1
  8. package/dist/cli-client.d.ts +6 -0
  9. package/dist/cli-client.js +43 -18
  10. package/dist/cli-client.js.map +1 -1
  11. package/dist/command-rpc.d.ts +5 -2
  12. package/dist/command-rpc.js +62 -16
  13. package/dist/command-rpc.js.map +1 -1
  14. package/dist/direct-transport/loopback-server.d.ts +5 -1
  15. package/dist/direct-transport/loopback-server.js +19 -6
  16. package/dist/direct-transport/loopback-server.js.map +1 -1
  17. package/dist/direct-transport/peer-manager.d.ts +4 -0
  18. package/dist/direct-transport/peer-manager.js +16 -2
  19. package/dist/direct-transport/peer-manager.js.map +1 -1
  20. package/dist/ftown-cli.js +4 -1
  21. package/dist/ftown-cli.js.map +1 -1
  22. package/dist/index.js +100 -40
  23. package/dist/index.js.map +1 -1
  24. package/dist/local-api-server.d.ts +12 -0
  25. package/dist/local-api-server.js +182 -41
  26. package/dist/local-api-server.js.map +1 -1
  27. package/dist/local-pair-cli.d.ts +2 -3
  28. package/dist/local-pair-cli.js +12 -53
  29. package/dist/local-pair-cli.js.map +1 -1
  30. package/dist/mcp/fleet.d.ts +11 -9
  31. package/dist/mcp/fleet.js +61 -44
  32. package/dist/mcp/fleet.js.map +1 -1
  33. package/dist/mcp/http.d.ts +10 -9
  34. package/dist/mcp/http.js +133 -8
  35. package/dist/mcp/http.js.map +1 -1
  36. package/dist/mcp/legacy-relay.d.ts +2 -2
  37. package/dist/mcp/legacy-relay.js +4 -43
  38. package/dist/mcp/legacy-relay.js.map +1 -1
  39. package/dist/mcp/mcp-key-store.d.ts +52 -0
  40. package/dist/mcp/mcp-key-store.js +206 -0
  41. package/dist/mcp/mcp-key-store.js.map +1 -0
  42. package/dist/mcp/oauth.d.ts +5 -1
  43. package/dist/mcp/oauth.js +113 -39
  44. package/dist/mcp/oauth.js.map +1 -1
  45. package/dist/mcp/relay-handler.d.ts +2 -1
  46. package/dist/mcp/relay-handler.js +5 -40
  47. package/dist/mcp/relay-handler.js.map +1 -1
  48. package/dist/mcp/relay.d.ts +4 -4
  49. package/dist/mcp/relay.js +35 -85
  50. package/dist/mcp/relay.js.map +1 -1
  51. package/dist/mcp/secure-client.d.ts +23 -0
  52. package/dist/mcp/secure-client.js +124 -0
  53. package/dist/mcp/secure-client.js.map +1 -0
  54. package/dist/mcp/security-events.d.ts +65 -0
  55. package/dist/mcp/security-events.js +210 -0
  56. package/dist/mcp/security-events.js.map +1 -0
  57. package/dist/mcp/server.d.ts +1 -0
  58. package/dist/mcp/server.js +2 -2
  59. package/dist/mcp/server.js.map +1 -1
  60. package/dist/mcp/test-support.d.ts +32 -0
  61. package/dist/mcp/test-support.js +120 -0
  62. package/dist/mcp/test-support.js.map +1 -0
  63. package/dist/mcp-cli.js +56 -36
  64. package/dist/mcp-cli.js.map +1 -1
  65. package/dist/pairing-client.d.ts +10 -12
  66. package/dist/pairing-client.js +36 -9
  67. package/dist/pairing-client.js.map +1 -1
  68. package/dist/push-notifier.js +3 -1
  69. package/dist/push-notifier.js.map +1 -1
  70. package/dist/security/account-crypto.d.ts +33 -0
  71. package/dist/security/account-crypto.js +649 -0
  72. package/dist/security/account-crypto.js.map +1 -0
  73. package/dist/security/account-protocol.d.ts +228 -0
  74. package/dist/security/account-protocol.js +2 -0
  75. package/dist/security/account-protocol.js.map +1 -0
  76. package/dist/security/bridge/account-client.d.ts +7 -0
  77. package/dist/security/bridge/account-client.js +87 -0
  78. package/dist/security/bridge/account-client.js.map +1 -0
  79. package/dist/security/bridge/account-state.d.ts +471 -0
  80. package/dist/security/bridge/account-state.js +78 -0
  81. package/dist/security/bridge/account-state.js.map +1 -0
  82. package/dist/security/bridge/audit.d.ts +37 -0
  83. package/dist/security/bridge/audit.js +185 -0
  84. package/dist/security/bridge/audit.js.map +1 -0
  85. package/dist/security/bridge/direct.d.ts +22 -0
  86. package/dist/security/bridge/direct.js +72 -0
  87. package/dist/security/bridge/direct.js.map +1 -0
  88. package/dist/security/bridge/errors.d.ts +7 -0
  89. package/dist/security/bridge/errors.js +12 -0
  90. package/dist/security/bridge/errors.js.map +1 -0
  91. package/dist/security/bridge/execute.d.ts +3 -0
  92. package/dist/security/bridge/execute.js +38 -0
  93. package/dist/security/bridge/execute.js.map +1 -0
  94. package/dist/security/bridge/identity.d.ts +441 -0
  95. package/dist/security/bridge/identity.js +64 -0
  96. package/dist/security/bridge/identity.js.map +1 -0
  97. package/dist/security/bridge/local-client.d.ts +4 -0
  98. package/dist/security/bridge/local-client.js +43 -0
  99. package/dist/security/bridge/local-client.js.map +1 -0
  100. package/dist/security/bridge/metadata.d.ts +99 -0
  101. package/dist/security/bridge/metadata.js +23 -0
  102. package/dist/security/bridge/metadata.js.map +1 -0
  103. package/dist/security/bridge/native-wake.d.ts +16 -0
  104. package/dist/security/bridge/native-wake.js +15 -0
  105. package/dist/security/bridge/native-wake.js.map +1 -0
  106. package/dist/security/bridge/pending-enrollment.d.ts +12 -0
  107. package/dist/security/bridge/pending-enrollment.js +113 -0
  108. package/dist/security/bridge/pending-enrollment.js.map +1 -0
  109. package/dist/security/bridge/permissions.d.ts +11 -0
  110. package/dist/security/bridge/permissions.js +97 -0
  111. package/dist/security/bridge/permissions.js.map +1 -0
  112. package/dist/security/bridge/policy.d.ts +55 -0
  113. package/dist/security/bridge/policy.js +415 -0
  114. package/dist/security/bridge/policy.js.map +1 -0
  115. package/dist/security/bridge/security.d.ts +61 -0
  116. package/dist/security/bridge/security.js +388 -0
  117. package/dist/security/bridge/security.js.map +1 -0
  118. package/dist/security/bridge/snapshot.d.ts +14 -0
  119. package/dist/security/bridge/snapshot.js +77 -0
  120. package/dist/security/bridge/snapshot.js.map +1 -0
  121. package/dist/security/crypto.d.ts +17 -0
  122. package/dist/security/crypto.js +280 -0
  123. package/dist/security/crypto.js.map +1 -0
  124. package/dist/security/protocol.d.ts +400 -0
  125. package/dist/security/protocol.js +9 -0
  126. package/dist/security/protocol.js.map +1 -0
  127. package/dist/security-cli.d.ts +3 -0
  128. package/dist/security-cli.js +69 -0
  129. package/dist/security-cli.js.map +1 -0
  130. package/dist/solo/solo-server.js +24 -2
  131. package/dist/solo/solo-server.js.map +1 -1
  132. package/dist/types.d.ts +1 -1
  133. package/dist/wire-types.d.ts +3 -0
  134. package/dist/wire-types.js.map +1 -1
  135. package/hooks/notify.sh +1 -1
  136. package/muse-plugin/lib/ftown-hook.sh +6 -22
  137. package/opencode-plugin/ftown.js +33 -5
  138. package/package.json +4 -2
  139. package/pi-extension/ftown.js +33 -5
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { type McpRequestContext } from './secure-client.js';
2
3
  export declare const configSchema: z.ZodEffects<z.ZodObject<{
3
4
  concurrency: z.ZodDefault<z.ZodNumber>;
4
5
  timeoutMs: z.ZodDefault<z.ZodNumber>;
@@ -70,8 +71,8 @@ export declare const configSchema: z.ZodEffects<z.ZodObject<{
70
71
  label?: string | undefined;
71
72
  }>]>, "many">;
72
73
  }, "strict", z.ZodTypeAny, {
73
- concurrency: number;
74
74
  timeoutMs: number;
75
+ concurrency: number;
75
76
  machines: ({
76
77
  id: string;
77
78
  userId: string;
@@ -119,11 +120,11 @@ export declare const configSchema: z.ZodEffects<z.ZodObject<{
119
120
  tokenEnv: string;
120
121
  label?: string | undefined;
121
122
  })[];
122
- concurrency?: number | undefined;
123
123
  timeoutMs?: number | undefined;
124
+ concurrency?: number | undefined;
124
125
  }>, {
125
- concurrency: number;
126
126
  timeoutMs: number;
127
+ concurrency: number;
127
128
  machines: ({
128
129
  id: string;
129
130
  userId: string;
@@ -171,8 +172,8 @@ export declare const configSchema: z.ZodEffects<z.ZodObject<{
171
172
  tokenEnv: string;
172
173
  label?: string | undefined;
173
174
  })[];
174
- concurrency?: number | undefined;
175
175
  timeoutMs?: number | undefined;
176
+ concurrency?: number | undefined;
176
177
  }>;
177
178
  export type FleetConfig = z.infer<typeof configSchema>;
178
179
  export declare const requestSchema: z.ZodObject<{
@@ -181,12 +182,12 @@ export declare const requestSchema: z.ZodObject<{
181
182
  body: z.ZodOptional<z.ZodUnknown>;
182
183
  timeoutMs: z.ZodNumber;
183
184
  }, "strict", z.ZodTypeAny, {
184
- method: "POST" | "GET" | "DELETE" | "PATCH";
185
+ method: "POST" | "GET" | "PATCH" | "DELETE";
185
186
  path: string;
186
187
  timeoutMs: number;
187
188
  body?: unknown;
188
189
  }, {
189
- method: "POST" | "GET" | "DELETE" | "PATCH";
190
+ method: "POST" | "GET" | "PATCH" | "DELETE";
190
191
  path: string;
191
192
  timeoutMs: number;
192
193
  body?: unknown;
@@ -205,7 +206,7 @@ export declare function errorResult(error: unknown): {
205
206
  outcomeUnknown: boolean;
206
207
  };
207
208
  export declare function httpRequest(origin: string, token: string, request: BridgeRequest, signal?: AbortSignal): Promise<any>;
208
- export declare function localRequest(request: BridgeRequest, bridgeFile?: string, signal?: AbortSignal): Promise<any>;
209
+ export declare function localRequest(request: BridgeRequest, bridgeFile?: string, signal?: AbortSignal, context?: McpRequestContext, machineId?: string): Promise<unknown>;
209
210
  export declare function loadConfig(path?: string): Promise<FleetConfig>;
210
211
  export declare function mapLimit<T, R>(items: T[], concurrency: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
211
212
  export declare class Fleet {
@@ -213,6 +214,7 @@ export declare class Fleet {
213
214
  private relay?;
214
215
  private active;
215
216
  private waiters;
216
- constructor(config: FleetConfig, relay?: ((userId: string, machineId: string, request: BridgeRequest, signal?: AbortSignal) => Promise<unknown>) | undefined);
217
- request(machineId: string, method: BridgeRequest["method"], path: string, body?: unknown, signal?: AbortSignal, timeoutMs?: number): Promise<any>;
217
+ constructor(config: FleetConfig, relay?: ((userId: string, machineId: string, request: BridgeRequest, signal?: AbortSignal, context?: McpRequestContext) => Promise<unknown>) | undefined);
218
+ scoped(context: McpRequestContext): Pick<Fleet, 'config' | 'request'>;
219
+ request(machineId: string, method: BridgeRequest["method"], path: string, body?: unknown, signal?: AbortSignal, timeoutMs?: number, context?: McpRequestContext): Promise<any>;
218
220
  }
package/dist/mcp/fleet.js CHANGED
@@ -1,8 +1,9 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
- import { execFile } from "node:child_process";
5
4
  import { z } from "zod";
5
+ import { parseSecureEnvelope, MAX_ENVELOPE_BYTES, SecurityError } from '../security/crypto.js';
6
+ import { SecureMcpClient } from './secure-client.js';
6
7
  const machineBase = {
7
8
  id: z.string().regex(/^[a-zA-Z0-9_-]+$/),
8
9
  label: z.string().optional(),
@@ -91,6 +92,8 @@ export class FleetError extends Error {
91
92
  }
92
93
  }
93
94
  export function errorResult(error) {
95
+ if (error instanceof SecurityError)
96
+ return { code: error.code, message: error.message, outcomeUnknown: error.code === 'outcome_unknown' };
94
97
  if (error instanceof FleetError)
95
98
  return {
96
99
  code: error.code,
@@ -157,20 +160,63 @@ export async function httpRequest(origin, token, request, signal) {
157
160
  : "connection_error", "Bridge request failed; check machine connectivity and credentials", request.method !== "GET");
158
161
  }
159
162
  }
160
- export async function localRequest(request, bridgeFile = join(homedir(), ".ftown", "bridge.json"), signal) {
163
+ export async function localRequest(request, bridgeFile = join(homedir(), ".ftown", "bridge.json"), signal, context, machineId) {
164
+ if (!context || !machineId)
165
+ throw new FleetError('upgrade_required', 'Legacy MCP proxy requests require an approved encrypted endpoint');
161
166
  let credentials;
162
167
  try {
163
168
  credentials = z
164
169
  .object({
165
170
  port: z.number().int().min(1).max(65535),
166
- token: z.string().min(1),
167
171
  })
168
172
  .parse(JSON.parse(await readFile(bridgeFile, "utf8")));
169
173
  }
170
174
  catch {
171
175
  throw new FleetError("configuration_error", "Cannot read bridge credentials; start ftown-bridge on this machine");
172
176
  }
173
- return httpRequest(`http://127.0.0.1:${credentials.port}`, credentials.token, requestSchema.parse(request), signal);
177
+ return secureHttpRequest(`http://127.0.0.1:${credentials.port}`, context, machineId, requestSchema.parse(request), signal);
178
+ }
179
+ async function secureHttpRequest(origin, context, machineId, request, signal) {
180
+ const client = new SecureMcpClient(context, machineId, `local-http:${machineId}`, async (packet, deadline, mutating, abort) => {
181
+ let sent = false;
182
+ try {
183
+ if (abort?.aborted || Date.now() >= deadline)
184
+ throw new FleetError('cancelled', 'Encrypted request cancelled before dispatch');
185
+ sent = true;
186
+ const timeout = AbortSignal.timeout(Math.max(1, deadline - Date.now()));
187
+ const response = await fetch(new URL('/api/security/envelope', origin), { method: 'POST', redirect: 'error', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(packet), signal: abort ? AbortSignal.any([abort, timeout]) : timeout });
188
+ if (!response.ok)
189
+ throw new FleetError([404, 426].includes(response.status) ? 'upgrade_required' : 'bridge_error', 'Bridge encrypted endpoint is unavailable', mutating && response.status >= 500, response.status);
190
+ const reader = response.body?.getReader();
191
+ if (!reader)
192
+ throw new FleetError('bridge_error', 'Bridge encrypted response is missing', mutating);
193
+ let size = 0;
194
+ const chunks = [];
195
+ try {
196
+ while (true) {
197
+ const chunk = await reader.read();
198
+ if (chunk.done)
199
+ break;
200
+ size += chunk.value.byteLength;
201
+ if (size > MAX_ENVELOPE_BYTES) {
202
+ await reader.cancel();
203
+ throw new FleetError('response_too_large', 'Encrypted bridge response is too large', mutating);
204
+ }
205
+ chunks.push(chunk.value);
206
+ }
207
+ }
208
+ finally {
209
+ reader.releaseLock();
210
+ }
211
+ return parseSecureEnvelope(JSON.parse(Buffer.concat(chunks).toString('utf8')));
212
+ }
213
+ catch (error) {
214
+ if (error instanceof FleetError)
215
+ throw error;
216
+ throw new FleetError(abort?.aborted ? 'cancelled' : 'connection_error', 'Encrypted bridge request failed', sent && mutating);
217
+ }
218
+ });
219
+ return client.request(request, signal);
174
220
  }
175
221
  export async function loadConfig(path) {
176
222
  return configSchema.parse(path
@@ -197,11 +243,16 @@ export class Fleet {
197
243
  this.config = config;
198
244
  this.relay = relay;
199
245
  }
200
- async request(machineId, method, path, body, signal, timeoutMs = this.config.timeoutMs) {
246
+ scoped(context) {
247
+ return { config: this.config, request: (machineId, method, path, body, signal, timeout) => this.request(machineId, method, path, body, signal, timeout, context) };
248
+ }
249
+ async request(machineId, method, path, body, signal, timeoutMs = this.config.timeoutMs, context) {
201
250
  const machine = this.config.machines.find((m) => m.id === machineId);
202
251
  if (!machine)
203
252
  throw new FleetError("unknown_machine", `Unknown machine: ${machineId}`);
204
253
  const request = requestSchema.parse({ method, path, body, timeoutMs });
254
+ if (!context)
255
+ throw new FleetError('approval_required', 'An encrypted MCP grant is required');
205
256
  if (this.active >= this.config.concurrency)
206
257
  await new Promise((resolve, reject) => {
207
258
  const acquire = () => { signal?.removeEventListener("abort", cancel); resolve(); };
@@ -220,54 +271,20 @@ export class Fleet {
220
271
  else
221
272
  this.active++;
222
273
  try {
274
+ await context.revalidate?.();
223
275
  if (signal?.aborted)
224
276
  throw new FleetError("cancelled", "Request cancelled before dispatch");
225
277
  if (machine.transport === "relay") {
226
278
  if (!this.relay)
227
279
  throw new FleetError("configuration_error", "Relay transport is not configured");
228
- return await this.relay(machine.userId, machine.id, request, signal);
280
+ return await this.relay(machine.userId, machine.id, request, signal, context);
229
281
  }
230
282
  if (machine.transport === "local")
231
- return await localRequest(request, machine.bridgeFile, signal);
283
+ return await localRequest(request, machine.bridgeFile, signal, context, machine.id);
232
284
  if (machine.transport === "http") {
233
- const token = process.env[machine.tokenEnv];
234
- if (!token)
235
- throw new FleetError("configuration_error", "Configured token environment variable is missing");
236
- return await httpRequest(machine.url, token, request, signal);
285
+ return await secureHttpRequest(machine.url, context, machine.id, request, signal);
237
286
  }
238
- // Only a trusted configured executable enters the remote shell. All tool arguments travel over stdin.
239
- const command = `'${machine.executable.replaceAll("'", "'\\''")}' --proxy`;
240
- return await new Promise((resolve, reject) => {
241
- const child = execFile("ssh", [
242
- "-T",
243
- "-o",
244
- "BatchMode=yes",
245
- "-o",
246
- "StrictHostKeyChecking=yes",
247
- "-o",
248
- "ConnectTimeout=10",
249
- "--",
250
- machine.host,
251
- command,
252
- ], { timeout: timeoutMs + 1000, maxBuffer: maxBytes, signal }, (error, stdout) => {
253
- if (error) {
254
- reject(new FleetError("ssh_error", "SSH proxy failed; verify SSH access and remote ftown-mcp installation", method !== "GET"));
255
- return;
256
- }
257
- try {
258
- const result = JSON.parse(stdout);
259
- if (result.error)
260
- reject(new FleetError(result.error.code, result.error.message, result.error.outcomeUnknown, result.error.status));
261
- else
262
- resolve(result.data);
263
- }
264
- catch {
265
- reject(new FleetError("protocol_error", "Invalid SSH proxy response", method !== "GET"));
266
- }
267
- });
268
- child.stdin?.on("error", () => { });
269
- child.stdin?.end(JSON.stringify(request));
270
- });
287
+ throw new FleetError('upgrade_required', 'Legacy SSH MCP adapters do not negotiate encrypted endpoint framing');
271
288
  }
272
289
  finally {
273
290
  const next = this.waiters.shift();
@@ -1 +1 @@
1
- {"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../src/mcp/fleet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../src/mcp/fleet.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import type { FleetRelay } from "./relay.js";
3
3
  import { FtownOAuthProvider } from "./oauth.js";
4
+ import { SecurityEventStore } from './security-events.js';
4
5
  export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
5
6
  publicUrl: z.ZodEffects<z.ZodString, string, string>;
6
7
  loginUrl: z.ZodEffects<z.ZodString, string, string>;
@@ -76,8 +77,8 @@ export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
76
77
  label?: string | undefined;
77
78
  }>]>, "many">;
78
79
  }, "strict", z.ZodTypeAny, {
79
- concurrency: number;
80
80
  timeoutMs: number;
81
+ concurrency: number;
81
82
  machines: ({
82
83
  id: string;
83
84
  userId: string;
@@ -125,11 +126,11 @@ export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
125
126
  tokenEnv: string;
126
127
  label?: string | undefined;
127
128
  })[];
128
- concurrency?: number | undefined;
129
129
  timeoutMs?: number | undefined;
130
+ concurrency?: number | undefined;
130
131
  }>, {
131
- concurrency: number;
132
132
  timeoutMs: number;
133
+ concurrency: number;
133
134
  machines: ({
134
135
  id: string;
135
136
  userId: string;
@@ -177,8 +178,8 @@ export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
177
178
  tokenEnv: string;
178
179
  label?: string | undefined;
179
180
  })[];
180
- concurrency?: number | undefined;
181
181
  timeoutMs?: number | undefined;
182
+ concurrency?: number | undefined;
182
183
  }>;
183
184
  access: z.ZodArray<z.ZodObject<{
184
185
  subject: z.ZodString;
@@ -199,8 +200,8 @@ export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
199
200
  loginUrl: string;
200
201
  allowedOrigins: string[];
201
202
  fleet: {
202
- concurrency: number;
203
203
  timeoutMs: number;
204
+ concurrency: number;
204
205
  machines: ({
205
206
  id: string;
206
207
  userId: string;
@@ -256,8 +257,8 @@ export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
256
257
  tokenEnv: string;
257
258
  label?: string | undefined;
258
259
  })[];
259
- concurrency?: number | undefined;
260
260
  timeoutMs?: number | undefined;
261
+ concurrency?: number | undefined;
261
262
  };
262
263
  allowedOrigins?: string[] | undefined;
263
264
  }>, {
@@ -269,8 +270,8 @@ export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
269
270
  loginUrl: string;
270
271
  allowedOrigins: string[];
271
272
  fleet: {
272
- concurrency: number;
273
273
  timeoutMs: number;
274
+ concurrency: number;
274
275
  machines: ({
275
276
  id: string;
276
277
  userId: string;
@@ -326,10 +327,10 @@ export declare const gatewayConfigSchema: z.ZodEffects<z.ZodObject<{
326
327
  tokenEnv: string;
327
328
  label?: string | undefined;
328
329
  })[];
329
- concurrency?: number | undefined;
330
330
  timeoutMs?: number | undefined;
331
+ concurrency?: number | undefined;
331
332
  };
332
333
  allowedOrigins?: string[] | undefined;
333
334
  }>;
334
335
  export type GatewayConfig = z.infer<typeof gatewayConfigSchema>;
335
- export declare function createGateway(config: GatewayConfig, provider: FtownOAuthProvider, relay?: FleetRelay): import("express-serve-static-core").Express;
336
+ export declare function createGateway(config: GatewayConfig, provider: FtownOAuthProvider, relay?: FleetRelay, audit?: Pick<SecurityEventStore, 'admit' | 'finish'>): import("express-serve-static-core").Express;
package/dist/mcp/http.js CHANGED
@@ -7,6 +7,10 @@ import { z } from "zod";
7
7
  import { configSchema, Fleet, FleetError } from "./fleet.js";
8
8
  import { createMcpServer } from "./server.js";
9
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';
10
14
  const httpsOrigin = z
11
15
  .string()
12
16
  .url()
@@ -40,11 +44,43 @@ export const gatewayConfigSchema = z
40
44
  message: "Access references an unknown machine",
41
45
  });
42
46
  });
43
- export function createGateway(config, provider, relay) {
47
+ export function createGateway(config, provider, relay, audit) {
44
48
  const app = express();
45
49
  const rootFleet = new Fleet(config.fleet, relay
46
- ? (user, id, request, signal) => relay.request(user, id, request, signal)
50
+ ? (user, id, request, signal, context) => relay.request(user, id, request, signal, context)
47
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
+ };
48
84
  app.disable("x-powered-by");
49
85
  // Fly's edge is the sole HTTP ingress; forwarded headers are not used for authorization.
50
86
  app.set("trust proxy", 1);
@@ -107,7 +143,7 @@ export function createGateway(config, provider, relay) {
107
143
  limit: 60,
108
144
  standardHeaders: true,
109
145
  legacyHeaders: false,
110
- }), express.json({ limit: "16kb" }));
146
+ }), express.json({ limit: "512kb" }));
111
147
  app.post("/consent/:action", async (req, res) => {
112
148
  try {
113
149
  if (typeof req.body?.assertion !== "string") {
@@ -152,14 +188,39 @@ export function createGateway(config, provider, relay) {
152
188
  requiredScopes: ["mcp:read"],
153
189
  resourceMetadataUrl: new URL("/.well-known/oauth-protected-resource/mcp", config.publicUrl).href,
154
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
+ });
155
201
  app.use("/mcp", rateLimit({
156
202
  windowMs: 60000,
157
203
  limit: 600,
158
204
  keyGenerator: (req) => String(req.auth?.extra?.subject),
159
205
  standardHeaders: true,
160
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
+ },
161
211
  }));
162
- app.post("/mcp", express.json({ limit: "1mb" }), async (req, res) => {
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
+ }
163
224
  const allowed = req.auth.extra.machines;
164
225
  const fleet = {
165
226
  config: {
@@ -169,7 +230,12 @@ export function createGateway(config, provider, relay) {
169
230
  request: (id, ...args) => {
170
231
  if (!allowed.includes(id))
171
232
  return Promise.reject(new FleetError("forbidden", "Machine is not authorized for this grant"));
172
- return rootFleet.request(id, ...args);
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);
173
239
  },
174
240
  };
175
241
  const server = createMcpServer(fleet, {
@@ -187,6 +253,29 @@ export function createGateway(config, provider, relay) {
187
253
  if (machines.some((machine) => !authorized.includes(machine)))
188
254
  throw new FleetError("forbidden", "Machine access was revoked during this request");
189
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
+ },
190
279
  });
191
280
  // Stateless transport: every request is authenticated and reconstructs its own scoped tool surface.
192
281
  const transport = new StreamableHTTPServerTransport({
@@ -195,29 +284,65 @@ export function createGateway(config, provider, relay) {
195
284
  // No GET stream/session map or unsolicited server notifications are advertised.
196
285
  enableJsonResponse: !(req.body?.method === "tools/call" && req.body?.params?.name === "attention_wait"),
197
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
+ };
198
304
  res.on("close", () => {
199
305
  void server.close();
200
306
  });
201
307
  try {
202
308
  await server.connect(transport);
203
- await transport.handleRequest(req, res, req.body);
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 });
204
314
  }
205
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(() => { });
206
318
  if (!res.headersSent)
207
319
  res.status(500).json({ error: "MCP request failed" });
208
320
  }
209
321
  });
210
- app.all("/mcp", (_req, res) => {
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(() => { });
211
326
  res.setHeader("Allow", "POST, OPTIONS");
212
327
  res.status(405).end();
213
328
  });
214
- app.use((error, _req, res, _next) => {
329
+ app.use(async (error, _req, res, _next) => {
215
330
  const status = typeof error === "object" &&
216
331
  error !== null &&
217
332
  "status" in error &&
218
333
  error.status === 413
219
334
  ? 413
220
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
+ }
221
346
  res.status(status).json({ error: "Invalid request" });
222
347
  });
223
348
  return app;