@integsec/agentic-pentest-proxy 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +2 -0
  2. package/cloudflare/package-lock.json +1553 -0
  3. package/cloudflare/package.json +15 -0
  4. package/cloudflare/src/worker.mjs +126 -0
  5. package/cloudflare/wrangler.jsonc +26 -0
  6. package/dist/bin/integsec-agentic-pentest-bridge.d.ts +3 -0
  7. package/dist/bin/integsec-agentic-pentest-bridge.d.ts.map +1 -0
  8. package/dist/bin/integsec-agentic-pentest-bridge.js +23 -0
  9. package/dist/bin/integsec-agentic-pentest-bridge.js.map +1 -0
  10. package/dist/bin/integsec-agentic-pentest-gateway.d.ts +3 -0
  11. package/dist/bin/integsec-agentic-pentest-gateway.d.ts.map +1 -0
  12. package/dist/bin/integsec-agentic-pentest-gateway.js +42 -0
  13. package/dist/bin/integsec-agentic-pentest-gateway.js.map +1 -0
  14. package/dist/bin/integsec-agentic-pentest-proxy.js +6 -0
  15. package/dist/bin/integsec-agentic-pentest-proxy.js.map +1 -1
  16. package/dist/src/config.js +1 -1
  17. package/dist/src/gateway/admin.html +21 -0
  18. package/dist/src/gateway/admin.js +78 -0
  19. package/dist/src/gateway/auth.d.ts +18 -0
  20. package/dist/src/gateway/auth.d.ts.map +1 -0
  21. package/dist/src/gateway/auth.js +112 -0
  22. package/dist/src/gateway/auth.js.map +1 -0
  23. package/dist/src/gateway/runtime.d.ts +20 -0
  24. package/dist/src/gateway/runtime.d.ts.map +1 -0
  25. package/dist/src/gateway/runtime.js +167 -0
  26. package/dist/src/gateway/runtime.js.map +1 -0
  27. package/dist/src/gateway/server.d.ts +27 -0
  28. package/dist/src/gateway/server.d.ts.map +1 -0
  29. package/dist/src/gateway/server.js +232 -0
  30. package/dist/src/gateway/server.js.map +1 -0
  31. package/dist/src/gateway/state.d.ts +64 -0
  32. package/dist/src/gateway/state.d.ts.map +1 -0
  33. package/dist/src/gateway/state.js +126 -0
  34. package/dist/src/gateway/state.js.map +1 -0
  35. package/dist/src/index.d.ts +1 -1
  36. package/dist/src/index.js +1 -1
  37. package/dist/src/proxy.d.ts +4 -3
  38. package/dist/src/proxy.d.ts.map +1 -1
  39. package/dist/src/proxy.js +22 -9
  40. package/dist/src/proxy.js.map +1 -1
  41. package/dist/src/types.d.ts +2 -0
  42. package/dist/src/types.d.ts.map +1 -1
  43. package/docs/managed-gateway.md +90 -0
  44. package/package.json +11 -3
@@ -0,0 +1,167 @@
1
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
3
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
4
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
5
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
+ import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
7
+ import { ScopeEnforcementProxy } from "../proxy.js";
8
+ import { loadConfig } from "../config.js";
9
+ import { activeScope, permitsUpstream } from "./state.js";
10
+ const toolError = (message) => ({ content: [{ type: "text", text: message }], isError: true });
11
+ export class GatewayRuntime {
12
+ store;
13
+ hosted;
14
+ requiredAuditSink;
15
+ clients = new Map();
16
+ pending = new Map();
17
+ proxies = new Map();
18
+ proxyScope;
19
+ constructor(store, hosted, requiredAuditSink) {
20
+ this.store = store;
21
+ this.hosted = hosted;
22
+ this.requiredAuditSink = requiredAuditSink;
23
+ }
24
+ async sync() {
25
+ const state = this.store.snapshot();
26
+ for (const [id, cached] of this.clients) {
27
+ const current = state.upstreams.find((item) => item.id === id);
28
+ if (!current || !current.enabled || JSON.stringify(current) !== cached.signature) {
29
+ this.clients.delete(id);
30
+ await cached.client.close().catch(() => undefined);
31
+ }
32
+ }
33
+ this.proxies.clear();
34
+ this.proxyScope = undefined;
35
+ }
36
+ scopeProxy(scope, serverName) {
37
+ if (this.proxyScope?.id !== scope.id || this.proxyScope.updatedAt !== scope.updatedAt) {
38
+ this.proxies.clear();
39
+ this.proxyScope = scope;
40
+ }
41
+ let proxy = this.proxies.get(serverName);
42
+ if (!proxy) {
43
+ proxy = new ScopeEnforcementProxy(scope.manifest, loadConfig(), this.requiredAuditSink);
44
+ proxy.setServerName(serverName);
45
+ this.proxies.set(serverName, proxy);
46
+ }
47
+ return proxy;
48
+ }
49
+ async clientFor(upstream) {
50
+ const signature = JSON.stringify(upstream);
51
+ const cached = this.clients.get(upstream.id);
52
+ if (cached?.signature === signature)
53
+ return cached.client;
54
+ const inFlight = this.pending.get(upstream.id);
55
+ if (inFlight)
56
+ return inFlight;
57
+ const connection = (async () => {
58
+ if (cached)
59
+ await cached.client.close().catch(() => undefined);
60
+ const client = new Client({ name: "agentic-pentest-gateway", version: "0.3.0" });
61
+ const transport = upstream.transport === "stdio"
62
+ ? new StdioClientTransport({ command: upstream.command, args: upstream.args, stderr: "pipe" })
63
+ : upstream.transport === "sse"
64
+ ? new SSEClientTransport(new URL(upstream.url))
65
+ : new StreamableHTTPClientTransport(new URL(upstream.url));
66
+ try {
67
+ await client.connect(transport, { timeout: 10_000 });
68
+ }
69
+ catch (error) {
70
+ await client.close().catch(() => undefined);
71
+ throw error;
72
+ }
73
+ this.clients.set(upstream.id, { client, signature });
74
+ return client;
75
+ })();
76
+ this.pending.set(upstream.id, connection);
77
+ try {
78
+ return await connection;
79
+ }
80
+ finally {
81
+ this.pending.delete(upstream.id);
82
+ }
83
+ }
84
+ available(scope) {
85
+ return this.store.snapshot().upstreams.filter((upstream) => {
86
+ if (this.hosted && upstream.transport === "stdio")
87
+ return false;
88
+ return permitsUpstream(scope, upstream);
89
+ });
90
+ }
91
+ createServer(actor) {
92
+ const server = new Server({ name: "agentic-pentest-gateway", version: "0.3.0" }, { capabilities: { tools: { listChanged: true } } });
93
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
94
+ const scope = activeScope(this.store.snapshot());
95
+ if (!scope)
96
+ return { tools: [] };
97
+ const groups = await Promise.all(this.available(scope).map(async (upstream) => {
98
+ const tools = [];
99
+ try {
100
+ const client = await this.clientFor(upstream);
101
+ let cursor;
102
+ do {
103
+ const page = await client.listTools(cursor ? { cursor } : undefined, { timeout: 10_000 });
104
+ for (const tool of page.tools)
105
+ tools.push({
106
+ name: `${upstream.name}__${tool.name}`,
107
+ description: tool.description,
108
+ inputSchema: tool.inputSchema,
109
+ });
110
+ cursor = page.nextCursor;
111
+ } while (cursor);
112
+ }
113
+ catch (error) {
114
+ console.error(`[gateway] ${upstream.name} tool discovery failed:`, error);
115
+ }
116
+ return tools;
117
+ }));
118
+ return { tools: groups.flat() };
119
+ });
120
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
121
+ const scope = activeScope(this.store.snapshot());
122
+ if (!scope)
123
+ return toolError("No active scope. Ask an administrator to activate one.");
124
+ const upstream = this.available(scope).find((item) => request.params.name.startsWith(`${item.name}__`));
125
+ if (!upstream)
126
+ return toolError("Tool server is disabled or prohibited by the active execution profile.");
127
+ const toolName = request.params.name.slice(upstream.name.length + 2);
128
+ if (!toolName)
129
+ return toolError("Invalid tool name.");
130
+ const proxy = this.scopeProxy(scope, upstream.name);
131
+ const decision = await proxy.handleMessage({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: toolName, arguments: request.params.arguments ?? {} } }, actor);
132
+ if (!decision.forward) {
133
+ const response = decision.response;
134
+ return toolError(response.error?.message ?? "Blocked by the active scope.");
135
+ }
136
+ try {
137
+ const client = await this.clientFor(upstream);
138
+ let cursor;
139
+ let found = false;
140
+ do {
141
+ const page = await client.listTools(cursor ? { cursor } : undefined, { timeout: 10_000 });
142
+ found ||= page.tools.some((tool) => tool.name === toolName);
143
+ cursor = page.nextCursor;
144
+ } while (!found && cursor);
145
+ if (!found)
146
+ return toolError("Tool is no longer advertised by the upstream server.");
147
+ const latest = this.store.snapshot();
148
+ const latestScope = activeScope(latest);
149
+ const latestUpstream = latest.upstreams.find((item) => item.id === upstream.id);
150
+ if (!latestScope || latestScope.id !== scope.id || latestScope.updatedAt !== scope.updatedAt || !latestUpstream || JSON.stringify(latestUpstream) !== JSON.stringify(upstream) || !this.available(latestScope).some((item) => item.id === latestUpstream.id)) {
151
+ return toolError("Scope or tool configuration changed before dispatch.");
152
+ }
153
+ return await client.callTool({ name: toolName, arguments: request.params.arguments ?? {} }, undefined, { timeout: 300_000 });
154
+ }
155
+ catch (error) {
156
+ console.error(`[gateway] ${upstream.name} tool call failed:`, error);
157
+ return toolError("Upstream tool call failed. See gateway logs.");
158
+ }
159
+ });
160
+ return server;
161
+ }
162
+ async close() {
163
+ await Promise.all([...this.clients.values()].map(({ client }) => client.close().catch(() => undefined)));
164
+ this.clients.clear();
165
+ }
166
+ }
167
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/gateway/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type IncomingMessage, type ServerResponse } from "node:http";
2
+ import { GatewayRuntime } from "./runtime.js";
3
+ import { GatewayStore } from "./state.js";
4
+ export interface GatewayOptions {
5
+ host: string;
6
+ port: number;
7
+ statePath: string;
8
+ adminToken: string;
9
+ publicUrl?: string;
10
+ entraTenant?: string;
11
+ entraAudience?: string;
12
+ entraScope?: string;
13
+ authMode?: "entra" | "cloudflare";
14
+ cloudflareTeamDomain?: string;
15
+ cloudflareAccessAud?: string;
16
+ internalToken?: string;
17
+ auditWebhookUrl?: string;
18
+ auditWebhookToken?: string;
19
+ }
20
+ export declare function createGateway(options: GatewayOptions): {
21
+ server: import("http").Server<typeof IncomingMessage, typeof ServerResponse>;
22
+ store: GatewayStore;
23
+ runtime: GatewayRuntime;
24
+ listen: () => Promise<void>;
25
+ close: () => Promise<void>;
26
+ };
27
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAOpF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAA0C,MAAM,YAAY,CAAC;AAOlF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,GAAG,YAAY,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAyBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc;;;;;;EAgIpD"}
@@ -0,0 +1,232 @@
1
+ import { createServer } from "node:http";
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { timingSafeEqual } from "node:crypto";
5
+ import { z } from "zod";
6
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
7
+ import { GatewayAuth } from "./auth.js";
8
+ import { GatewayRuntime } from "./runtime.js";
9
+ import { GatewayStore, activeScope, parseScope, parseUpstream } from "./state.js";
10
+ const MAX_BODY = 1024 * 1024;
11
+ const html = readFileSync(fileURLToPath(new URL("./admin.html", import.meta.url)), "utf8");
12
+ const js = readFileSync(fileURLToPath(new URL("./admin.js", import.meta.url)), "utf8");
13
+ function json(res, code, body) {
14
+ res.writeHead(code, { "Content-Type": "application/json; charset=utf-8", "Cache-Control": "no-store", "X-Content-Type-Options": "nosniff" });
15
+ res.end(JSON.stringify(body));
16
+ }
17
+ async function body(req) {
18
+ const chunks = [];
19
+ let size = 0;
20
+ for await (const chunk of req) {
21
+ size += chunk.length;
22
+ if (size > MAX_BODY)
23
+ throw new Error("Request exceeds 1 MiB");
24
+ chunks.push(chunk);
25
+ }
26
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
27
+ }
28
+ function authorizedAdmin(req, token) {
29
+ const supplied = /^Bearer (.+)$/i.exec(req.headers.authorization ?? "")?.[1] ?? "";
30
+ const a = Buffer.from(supplied);
31
+ const b = Buffer.from(token);
32
+ return a.length === b.length && timingSafeEqual(a, b);
33
+ }
34
+ export function createGateway(options) {
35
+ if (options.adminToken.length < 32)
36
+ throw new Error("GATEWAY_ADMIN_TOKEN must be at least 32 characters");
37
+ if (options.host !== "127.0.0.1" && options.host !== "::1" && !options.publicUrl)
38
+ throw new Error("Non-loopback gateway requires GATEWAY_PUBLIC_URL and Entra configuration");
39
+ if (Boolean(options.auditWebhookUrl) !== Boolean(options.auditWebhookToken))
40
+ throw new Error("AUDIT_WEBHOOK_URL and AUDIT_WEBHOOK_TOKEN must be set together");
41
+ if (options.auditWebhookUrl && (new URL(options.auditWebhookUrl).protocol !== "https:" || options.auditWebhookToken.length < 32))
42
+ throw new Error("Durable audit webhook requires HTTPS and a token of at least 32 characters");
43
+ const store = new GatewayStore(options.statePath);
44
+ const requiredAuditSink = options.auditWebhookUrl ? async (entry) => {
45
+ const response = await fetch(options.auditWebhookUrl, {
46
+ method: "POST", headers: { Authorization: `Bearer ${options.auditWebhookToken}`, "Content-Type": "application/json" },
47
+ body: JSON.stringify(entry), signal: AbortSignal.timeout(10_000), redirect: "error",
48
+ });
49
+ if (!response.ok)
50
+ throw new Error(`Audit webhook returned HTTP ${response.status}`);
51
+ await response.body?.cancel();
52
+ } : undefined;
53
+ const runtime = new GatewayRuntime(store, Boolean(options.publicUrl), requiredAuditSink);
54
+ const auth = new GatewayAuth(options.publicUrl, options.entraTenant, options.authMode === "cloudflare" ? options.cloudflareAccessAud : options.entraAudience, options.entraScope, options.authMode, options.cloudflareTeamDomain);
55
+ const server = createServer(async (req, res) => {
56
+ try {
57
+ const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
58
+ const requestHost = new URL(`http://${req.headers.host ?? "invalid"}`).hostname;
59
+ const publicHost = options.publicUrl ? new URL(options.publicUrl).hostname : undefined;
60
+ if (requestHost !== publicHost && !["127.0.0.1", "localhost", "[::1]"].includes(requestHost)) {
61
+ json(res, 421, { error: "invalid host" });
62
+ return;
63
+ }
64
+ const pathname = url.pathname;
65
+ if (pathname === "/healthz") {
66
+ json(res, 200, { status: "ok" });
67
+ return;
68
+ }
69
+ if (pathname === "/__internal/state" && options.internalToken && authorizedAdmin(req, options.internalToken)) {
70
+ if (req.method === "GET") {
71
+ json(res, 200, store.snapshot());
72
+ return;
73
+ }
74
+ if (req.method === "PUT") {
75
+ const state = store.replace(await body(req));
76
+ await runtime.sync();
77
+ json(res, 200, state);
78
+ return;
79
+ }
80
+ }
81
+ if (pathname === "/.well-known/oauth-protected-resource" || pathname === "/.well-known/oauth-protected-resource/mcp") {
82
+ if (!options.publicUrl || options.authMode === "cloudflare") {
83
+ json(res, 404, { error: "OAuth metadata is served by Cloudflare Access or not configured" });
84
+ return;
85
+ }
86
+ json(res, 200, await auth.protectedResource());
87
+ return;
88
+ }
89
+ if (pathname === "/mcp") {
90
+ const actor = await auth.authorize(req, res);
91
+ if (!actor)
92
+ return;
93
+ if (options.publicUrl && activeScope(store.snapshot())?.profile === "isolated") {
94
+ json(res, 403, { error: "Isolated scopes cannot use the public MCP endpoint" });
95
+ return;
96
+ }
97
+ if (req.method !== "POST") {
98
+ res.writeHead(405, { Allow: "POST" });
99
+ res.end();
100
+ return;
101
+ }
102
+ if (Number(req.headers["content-length"] ?? 0) > MAX_BODY) {
103
+ json(res, 413, { error: "Request exceeds 1 MiB" });
104
+ return;
105
+ }
106
+ const parsed = await body(req);
107
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
108
+ const mcp = runtime.createServer(actor);
109
+ try {
110
+ await mcp.connect(transport);
111
+ await transport.handleRequest(req, res, parsed);
112
+ }
113
+ finally {
114
+ await mcp.close();
115
+ }
116
+ return;
117
+ }
118
+ if (pathname === "/admin" && req.method === "GET") {
119
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8", "Cache-Control": "no-store", "Content-Security-Policy": "default-src 'none'; script-src 'self'; style-src 'unsafe-inline'; connect-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'", "X-Content-Type-Options": "nosniff", "Referrer-Policy": "no-referrer" });
120
+ res.end(html);
121
+ return;
122
+ }
123
+ if (pathname === "/admin.js" && req.method === "GET") {
124
+ res.writeHead(200, { "Content-Type": "text/javascript; charset=utf-8", "Cache-Control": "no-store", "X-Content-Type-Options": "nosniff" });
125
+ res.end(js);
126
+ return;
127
+ }
128
+ if (!pathname.startsWith("/api/")) {
129
+ json(res, 404, { error: "not found" });
130
+ return;
131
+ }
132
+ const origin = req.headers.origin;
133
+ if (origin && origin !== `http://${req.headers.host}` && origin !== options.publicUrl) {
134
+ json(res, 403, { error: "invalid origin" });
135
+ return;
136
+ }
137
+ if (options.publicUrl && options.authMode === "cloudflare" && !await auth.authorize(req, res))
138
+ return;
139
+ if (!authorizedAdmin(req, options.adminToken)) {
140
+ json(res, 401, { error: "admin token required" });
141
+ return;
142
+ }
143
+ if (pathname === "/api/state" && req.method === "GET") {
144
+ json(res, 200, store.snapshot());
145
+ return;
146
+ }
147
+ if (pathname === "/api/upstreams" && req.method === "POST") {
148
+ const upstream = parseUpstream(await body(req));
149
+ if (options.publicUrl && upstream.transport === "stdio") {
150
+ json(res, 400, { error: "Hosted gateway cannot spawn local processes" });
151
+ return;
152
+ }
153
+ store.update((draft) => { draft.upstreams.push(upstream); });
154
+ await runtime.sync();
155
+ json(res, 201, upstream);
156
+ return;
157
+ }
158
+ const upstreamMatch = /^\/api\/upstreams\/([0-9a-f-]{36})$/.exec(pathname);
159
+ if (upstreamMatch && req.method === "PATCH") {
160
+ const input = z.object({ enabled: z.boolean() }).parse(await body(req));
161
+ const updated = store.update((draft) => {
162
+ const item = draft.upstreams.find((value) => value.id === upstreamMatch[1]);
163
+ if (!item)
164
+ throw new Error("Upstream not found");
165
+ item.enabled = input.enabled;
166
+ });
167
+ await runtime.sync();
168
+ json(res, 200, updated);
169
+ return;
170
+ }
171
+ if (upstreamMatch && req.method === "DELETE") {
172
+ const updated = store.update((draft) => { draft.upstreams = draft.upstreams.filter((value) => value.id !== upstreamMatch[1]); });
173
+ await runtime.sync();
174
+ json(res, 200, updated);
175
+ return;
176
+ }
177
+ if (pathname === "/api/scopes" && req.method === "POST") {
178
+ const scope = parseScope(await body(req));
179
+ store.update((draft) => { draft.scopes.push(scope); });
180
+ json(res, 201, scope);
181
+ return;
182
+ }
183
+ const scopeMatch = /^\/api\/scopes\/([0-9a-f-]{36})$/.exec(pathname);
184
+ if (scopeMatch && req.method === "PUT") {
185
+ const scope = parseScope(await body(req), scopeMatch[1]);
186
+ const updated = store.update((draft) => {
187
+ if (draft.activeScopeId === scope.id)
188
+ throw new Error("Active scope cannot be edited; save a new draft");
189
+ const index = draft.scopes.findIndex((item) => item.id === scope.id);
190
+ if (index < 0)
191
+ throw new Error("Scope not found");
192
+ draft.scopes[index] = scope;
193
+ });
194
+ json(res, 200, updated);
195
+ return;
196
+ }
197
+ if (scopeMatch && req.method === "DELETE") {
198
+ const updated = store.update((draft) => {
199
+ if (draft.activeScopeId === scopeMatch[1])
200
+ throw new Error("Active scope cannot be deleted");
201
+ draft.scopes = draft.scopes.filter((item) => item.id !== scopeMatch[1]);
202
+ });
203
+ json(res, 200, updated);
204
+ return;
205
+ }
206
+ const activateMatch = /^\/api\/scopes\/([0-9a-f-]{36})\/activate$/.exec(pathname);
207
+ if (activateMatch && req.method === "POST") {
208
+ const updated = store.update((draft) => {
209
+ const scope = draft.scopes.find((item) => item.id === activateMatch[1]);
210
+ if (!scope)
211
+ throw new Error("Scope not found");
212
+ if (Date.now() < Date.parse(scope.manifest.engagement_window.start) || Date.now() > Date.parse(scope.manifest.engagement_window.end))
213
+ throw new Error("Scope window is not active");
214
+ draft.activeScopeId = scope.id;
215
+ });
216
+ await runtime.sync();
217
+ json(res, 200, updated);
218
+ return;
219
+ }
220
+ json(res, 404, { error: "not found" });
221
+ }
222
+ catch (error) {
223
+ const message = error instanceof Error ? error.message : "Request failed";
224
+ json(res, error instanceof z.ZodError || error instanceof SyntaxError ? 400 : 409, { error: message });
225
+ }
226
+ });
227
+ return { server, store, runtime, listen: () => new Promise((resolve, reject) => {
228
+ server.once("error", reject);
229
+ server.listen(options.port, options.host, () => { server.off("error", reject); resolve(); });
230
+ }), close: async () => { await new Promise((resolve) => server.close(() => resolve())); await runtime.close(); } };
231
+ }
232
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { z } from "zod";
2
+ declare const StateSchema: z.ZodObject<{
3
+ version: z.ZodLiteral<1>;
4
+ upstreams: z.ZodArray<z.ZodObject<{
5
+ id: z.ZodString;
6
+ name: z.ZodString;
7
+ enabled: z.ZodBoolean;
8
+ transport: z.ZodEnum<{
9
+ stdio: "stdio";
10
+ sse: "sse";
11
+ http: "http";
12
+ }>;
13
+ command: z.ZodOptional<z.ZodString>;
14
+ args: z.ZodDefault<z.ZodArray<z.ZodString>>;
15
+ url: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strip>>;
17
+ scopes: z.ZodArray<z.ZodObject<{
18
+ id: z.ZodString;
19
+ manifest: z.ZodObject<{
20
+ engagement_id: z.ZodString;
21
+ client: z.ZodString;
22
+ operator: z.ZodString;
23
+ authorized_targets: z.ZodObject<{
24
+ ip_ranges: z.ZodArray<z.ZodString>;
25
+ domains: z.ZodArray<z.ZodString>;
26
+ urls: z.ZodArray<z.ZodString>;
27
+ cloud_accounts: z.ZodArray<z.ZodString>;
28
+ }, z.core.$strip>;
29
+ excluded_targets: z.ZodArray<z.ZodString>;
30
+ authorized_techniques: z.ZodArray<z.ZodString>;
31
+ excluded_techniques: z.ZodArray<z.ZodString>;
32
+ engagement_window: z.ZodObject<{
33
+ start: z.ZodString;
34
+ end: z.ZodString;
35
+ }, z.core.$strip>;
36
+ }, z.core.$strip>;
37
+ profile: z.ZodEnum<{
38
+ isolated: "isolated";
39
+ restricted: "restricted";
40
+ connected: "connected";
41
+ }>;
42
+ allowedHosts: z.ZodDefault<z.ZodArray<z.ZodString>>;
43
+ updatedAt: z.ZodString;
44
+ }, z.core.$strip>>;
45
+ activeScopeId: z.ZodNullable<z.ZodString>;
46
+ }, z.core.$strip>;
47
+ export type GatewayState = z.infer<typeof StateSchema>;
48
+ export type Upstream = GatewayState["upstreams"][number];
49
+ export type ScopeRecord = GatewayState["scopes"][number];
50
+ export type ExecutionProfile = ScopeRecord["profile"];
51
+ export declare class GatewayStore {
52
+ private readonly file;
53
+ private state;
54
+ constructor(file: string);
55
+ snapshot(): GatewayState;
56
+ update(mutator: (draft: GatewayState) => void): GatewayState;
57
+ replace(input: unknown): GatewayState;
58
+ }
59
+ export declare function parseUpstream(input: unknown): Upstream;
60
+ export declare function parseScope(input: unknown, id?: string): ScopeRecord;
61
+ export declare function activeScope(state: GatewayState): ScopeRecord | undefined;
62
+ export declare function permitsUpstream(scope: ScopeRecord, upstream: Upstream): boolean;
63
+ export {};
64
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/gateway/state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8CxB,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAYf,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACvD,MAAM,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;AAEtD,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,KAAK,CAAe;gBAEC,IAAI,EAAE,MAAM;IAMzC,QAAQ,IAAI,YAAY;IAExB,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,YAAY;IAM5D,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY;CAStC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAEtD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAE,MAAqB,GAAG,WAAW,CAEjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,SAAS,CAExE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAU/E"}