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.
- package/claude-mod/hooks/register.js +6 -5
- package/dist/bridge-auth.d.ts +4 -0
- package/dist/bridge-auth.js +2 -2
- package/dist/bridge-auth.js.map +1 -1
- package/dist/centrifugo-client.d.ts +11 -1
- package/dist/centrifugo-client.js +71 -69
- package/dist/centrifugo-client.js.map +1 -1
- package/dist/cli-client.d.ts +6 -0
- package/dist/cli-client.js +43 -18
- package/dist/cli-client.js.map +1 -1
- package/dist/command-rpc.d.ts +5 -2
- package/dist/command-rpc.js +62 -16
- package/dist/command-rpc.js.map +1 -1
- package/dist/direct-transport/loopback-server.d.ts +5 -1
- package/dist/direct-transport/loopback-server.js +19 -6
- package/dist/direct-transport/loopback-server.js.map +1 -1
- package/dist/direct-transport/peer-manager.d.ts +4 -0
- package/dist/direct-transport/peer-manager.js +16 -2
- package/dist/direct-transport/peer-manager.js.map +1 -1
- package/dist/ftown-cli.js +4 -1
- package/dist/ftown-cli.js.map +1 -1
- package/dist/index.js +100 -40
- package/dist/index.js.map +1 -1
- package/dist/local-api-server.d.ts +12 -0
- package/dist/local-api-server.js +182 -41
- package/dist/local-api-server.js.map +1 -1
- package/dist/local-pair-cli.d.ts +2 -3
- package/dist/local-pair-cli.js +12 -53
- package/dist/local-pair-cli.js.map +1 -1
- package/dist/mcp/fleet.d.ts +11 -9
- package/dist/mcp/fleet.js +61 -44
- package/dist/mcp/fleet.js.map +1 -1
- package/dist/mcp/http.d.ts +10 -9
- package/dist/mcp/http.js +133 -8
- package/dist/mcp/http.js.map +1 -1
- package/dist/mcp/legacy-relay.d.ts +2 -2
- package/dist/mcp/legacy-relay.js +4 -43
- package/dist/mcp/legacy-relay.js.map +1 -1
- package/dist/mcp/mcp-key-store.d.ts +52 -0
- package/dist/mcp/mcp-key-store.js +206 -0
- package/dist/mcp/mcp-key-store.js.map +1 -0
- package/dist/mcp/oauth.d.ts +5 -1
- package/dist/mcp/oauth.js +113 -39
- package/dist/mcp/oauth.js.map +1 -1
- package/dist/mcp/relay-handler.d.ts +2 -1
- package/dist/mcp/relay-handler.js +5 -40
- package/dist/mcp/relay-handler.js.map +1 -1
- package/dist/mcp/relay.d.ts +4 -4
- package/dist/mcp/relay.js +35 -85
- package/dist/mcp/relay.js.map +1 -1
- package/dist/mcp/secure-client.d.ts +23 -0
- package/dist/mcp/secure-client.js +124 -0
- package/dist/mcp/secure-client.js.map +1 -0
- package/dist/mcp/security-events.d.ts +65 -0
- package/dist/mcp/security-events.js +210 -0
- package/dist/mcp/security-events.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +2 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/test-support.d.ts +32 -0
- package/dist/mcp/test-support.js +120 -0
- package/dist/mcp/test-support.js.map +1 -0
- package/dist/mcp-cli.js +56 -36
- package/dist/mcp-cli.js.map +1 -1
- package/dist/pairing-client.d.ts +10 -12
- package/dist/pairing-client.js +36 -9
- package/dist/pairing-client.js.map +1 -1
- package/dist/push-notifier.js +3 -1
- package/dist/push-notifier.js.map +1 -1
- package/dist/security/account-crypto.d.ts +33 -0
- package/dist/security/account-crypto.js +649 -0
- package/dist/security/account-crypto.js.map +1 -0
- package/dist/security/account-protocol.d.ts +228 -0
- package/dist/security/account-protocol.js +2 -0
- package/dist/security/account-protocol.js.map +1 -0
- package/dist/security/bridge/account-client.d.ts +7 -0
- package/dist/security/bridge/account-client.js +87 -0
- package/dist/security/bridge/account-client.js.map +1 -0
- package/dist/security/bridge/account-state.d.ts +471 -0
- package/dist/security/bridge/account-state.js +78 -0
- package/dist/security/bridge/account-state.js.map +1 -0
- package/dist/security/bridge/audit.d.ts +37 -0
- package/dist/security/bridge/audit.js +185 -0
- package/dist/security/bridge/audit.js.map +1 -0
- package/dist/security/bridge/direct.d.ts +22 -0
- package/dist/security/bridge/direct.js +72 -0
- package/dist/security/bridge/direct.js.map +1 -0
- package/dist/security/bridge/errors.d.ts +7 -0
- package/dist/security/bridge/errors.js +12 -0
- package/dist/security/bridge/errors.js.map +1 -0
- package/dist/security/bridge/execute.d.ts +3 -0
- package/dist/security/bridge/execute.js +38 -0
- package/dist/security/bridge/execute.js.map +1 -0
- package/dist/security/bridge/identity.d.ts +441 -0
- package/dist/security/bridge/identity.js +64 -0
- package/dist/security/bridge/identity.js.map +1 -0
- package/dist/security/bridge/local-client.d.ts +4 -0
- package/dist/security/bridge/local-client.js +43 -0
- package/dist/security/bridge/local-client.js.map +1 -0
- package/dist/security/bridge/metadata.d.ts +99 -0
- package/dist/security/bridge/metadata.js +23 -0
- package/dist/security/bridge/metadata.js.map +1 -0
- package/dist/security/bridge/native-wake.d.ts +16 -0
- package/dist/security/bridge/native-wake.js +15 -0
- package/dist/security/bridge/native-wake.js.map +1 -0
- package/dist/security/bridge/pending-enrollment.d.ts +12 -0
- package/dist/security/bridge/pending-enrollment.js +113 -0
- package/dist/security/bridge/pending-enrollment.js.map +1 -0
- package/dist/security/bridge/permissions.d.ts +11 -0
- package/dist/security/bridge/permissions.js +97 -0
- package/dist/security/bridge/permissions.js.map +1 -0
- package/dist/security/bridge/policy.d.ts +55 -0
- package/dist/security/bridge/policy.js +415 -0
- package/dist/security/bridge/policy.js.map +1 -0
- package/dist/security/bridge/security.d.ts +61 -0
- package/dist/security/bridge/security.js +388 -0
- package/dist/security/bridge/security.js.map +1 -0
- package/dist/security/bridge/snapshot.d.ts +14 -0
- package/dist/security/bridge/snapshot.js +77 -0
- package/dist/security/bridge/snapshot.js.map +1 -0
- package/dist/security/crypto.d.ts +17 -0
- package/dist/security/crypto.js +280 -0
- package/dist/security/crypto.js.map +1 -0
- package/dist/security/protocol.d.ts +400 -0
- package/dist/security/protocol.js +9 -0
- package/dist/security/protocol.js.map +1 -0
- package/dist/security-cli.d.ts +3 -0
- package/dist/security-cli.js +69 -0
- package/dist/security-cli.js.map +1 -0
- package/dist/solo/solo-server.js +24 -2
- package/dist/solo/solo-server.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/wire-types.d.ts +3 -0
- package/dist/wire-types.js.map +1 -1
- package/hooks/notify.sh +1 -1
- package/muse-plugin/lib/ftown-hook.sh +6 -22
- package/opencode-plugin/ftown.js +33 -5
- package/package.json +4 -2
- package/pi-extension/ftown.js +33 -5
package/dist/mcp/fleet.d.ts
CHANGED
|
@@ -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" | "
|
|
185
|
+
method: "POST" | "GET" | "PATCH" | "DELETE";
|
|
185
186
|
path: string;
|
|
186
187
|
timeoutMs: number;
|
|
187
188
|
body?: unknown;
|
|
188
189
|
}, {
|
|
189
|
-
method: "POST" | "GET" | "
|
|
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<
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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();
|
package/dist/mcp/fleet.js.map
CHANGED
|
@@ -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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"}
|
package/dist/mcp/http.d.ts
CHANGED
|
@@ -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: "
|
|
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",
|
|
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
|
-
|
|
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;
|