@relayplane/proxy 1.8.35 → 1.8.38

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.
@@ -0,0 +1,528 @@
1
+ "use strict";
2
+ /**
3
+ * ToolRouter — deny-by-default tool authorization with named scope packs.
4
+ *
5
+ * CAP 2: Hierarchical Tool Routing (Phase 2, Session 3)
6
+ *
7
+ * Authorization flow (highest-priority last wins):
8
+ * 1. Default deny all
9
+ * 2. Apply active packs (based on X-Task-Type header)
10
+ * 3. Apply agent-level overrides (based on X-Agent-Id header)
11
+ * 4. Apply explicit deny list (always wins)
12
+ *
13
+ * Lazy schema loading: schemas fetched only when a tool is (a) allowed AND (b) actually called.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.ToolRouter = exports.BUILTIN_PACKS = exports.DEFAULT_TOOL_ROUTER_CONFIG = void 0;
50
+ exports.getToolRouter = getToolRouter;
51
+ exports.resetToolRouter = resetToolRouter;
52
+ exports.extractToolContext = extractToolContext;
53
+ const fs = __importStar(require("node:fs"));
54
+ const path = __importStar(require("node:path"));
55
+ const os = __importStar(require("node:os"));
56
+ exports.DEFAULT_TOOL_ROUTER_CONFIG = {
57
+ enabled: true,
58
+ packsDir: path.join(os.homedir(), '.relayplane', 'config', 'tool-packs'),
59
+ };
60
+ // ── Built-in Packs ────────────────────────────────────────────────────────────
61
+ exports.BUILTIN_PACKS = [
62
+ {
63
+ name: 'code',
64
+ description: 'Coding tools: editor, shell, and file I/O for code-generation agents',
65
+ version: '1.0.0',
66
+ defaultPolicy: 'deny',
67
+ builtIn: true,
68
+ tools: [
69
+ { name: 'str_replace_editor', policy: 'allow' },
70
+ { name: 'bash', policy: 'allow' },
71
+ { name: 'read_file', policy: 'allow' },
72
+ { name: 'write_file', policy: 'allow' },
73
+ { name: 'list_directory', policy: 'allow' },
74
+ ],
75
+ },
76
+ {
77
+ name: 'search',
78
+ description: 'Web retrieval tools with per-session and per-minute rate limits',
79
+ version: '1.0.0',
80
+ defaultPolicy: 'deny',
81
+ builtIn: true,
82
+ tools: [
83
+ {
84
+ name: 'web_search',
85
+ policy: 'allow',
86
+ rateLimit: { maxCallsPerSession: 20, maxCallsPerMinute: 5 },
87
+ },
88
+ {
89
+ name: 'web_fetch',
90
+ policy: 'allow',
91
+ rateLimit: { maxCallsPerSession: 50, maxCallsPerMinute: 10 },
92
+ },
93
+ ],
94
+ },
95
+ {
96
+ name: 'file-ops',
97
+ description: 'File system tools: read/write/list allowed, delete denied',
98
+ version: '1.0.0',
99
+ defaultPolicy: 'deny',
100
+ builtIn: true,
101
+ tools: [
102
+ { name: 'read_file', policy: 'allow' },
103
+ { name: 'write_file', policy: 'allow' },
104
+ { name: 'list_directory', policy: 'allow' },
105
+ { name: 'delete_file', policy: 'deny' },
106
+ ],
107
+ },
108
+ ];
109
+ function getMinuteWindow(ts) {
110
+ const d = new Date(ts);
111
+ const pad = (n) => String(n).padStart(2, '0');
112
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
113
+ }
114
+ // ── ToolRouter class ──────────────────────────────────────────────────────────
115
+ class ToolRouter {
116
+ static _instance = null;
117
+ config;
118
+ /** All packs (built-in + custom) keyed by name */
119
+ packs = new Map();
120
+ /** Lazy schema cache: toolName → schema */
121
+ schemaCache = new Map();
122
+ /** Rate limit state: `${sessionId}:${toolName}` → usage */
123
+ usageState = new Map();
124
+ constructor(config) {
125
+ this.config = { ...exports.DEFAULT_TOOL_ROUTER_CONFIG, ...config };
126
+ this._loadPacks();
127
+ }
128
+ static getInstance(config) {
129
+ if (!ToolRouter._instance) {
130
+ ToolRouter._instance = new ToolRouter(config);
131
+ }
132
+ return ToolRouter._instance;
133
+ }
134
+ static reset() {
135
+ ToolRouter._instance = null;
136
+ }
137
+ // ── Pack management ─────────────────────────────────────────────────────────
138
+ _loadPacks() {
139
+ // Load built-ins first
140
+ for (const pack of exports.BUILTIN_PACKS) {
141
+ this.packs.set(pack.name, pack);
142
+ }
143
+ // Then overlay with user-supplied JSON packs from packsDir
144
+ this._loadPacksFromDir();
145
+ }
146
+ _loadPacksFromDir() {
147
+ const dir = this.config.packsDir;
148
+ if (!dir)
149
+ return;
150
+ try {
151
+ if (!fs.existsSync(dir))
152
+ return;
153
+ const files = fs.readdirSync(dir).filter(f => f.endsWith('.json'));
154
+ for (const file of files) {
155
+ try {
156
+ const raw = fs.readFileSync(path.join(dir, file), 'utf-8');
157
+ const pack = JSON.parse(raw);
158
+ if (pack.name && Array.isArray(pack.tools)) {
159
+ // Never overwrite builtIn flag from disk
160
+ pack.builtIn = false;
161
+ this.packs.set(pack.name, pack);
162
+ }
163
+ }
164
+ catch {
165
+ // Skip malformed pack files
166
+ }
167
+ }
168
+ }
169
+ catch {
170
+ // Skip if dir unreadable
171
+ }
172
+ }
173
+ /** Persist a custom pack to the packs directory */
174
+ _persistPack(pack) {
175
+ const dir = this.config.packsDir;
176
+ if (!dir)
177
+ return;
178
+ // Guard: reject names that could escape the packs directory (path traversal)
179
+ if (!/^[a-z0-9_-]+$/.test(pack.name))
180
+ return;
181
+ try {
182
+ fs.mkdirSync(dir, { recursive: true });
183
+ const filePath = path.join(dir, `${pack.name}.json`);
184
+ fs.writeFileSync(filePath, JSON.stringify(pack, null, 2), 'utf-8');
185
+ }
186
+ catch {
187
+ // Best-effort persistence
188
+ }
189
+ }
190
+ _deletePersisted(name) {
191
+ const dir = this.config.packsDir;
192
+ if (!dir)
193
+ return;
194
+ // Guard: reject names that could escape the packs directory (path traversal)
195
+ if (!/^[a-z0-9_-]+$/.test(name))
196
+ return;
197
+ try {
198
+ const filePath = path.join(dir, `${name}.json`);
199
+ if (fs.existsSync(filePath))
200
+ fs.unlinkSync(filePath);
201
+ }
202
+ catch {
203
+ // Best-effort
204
+ }
205
+ }
206
+ listPacks() {
207
+ return [...this.packs.values()];
208
+ }
209
+ getPack(name) {
210
+ return this.packs.get(name);
211
+ }
212
+ createPack(pack) {
213
+ if (this.packs.has(pack.name)) {
214
+ throw new Error(`Pack "${pack.name}" already exists`);
215
+ }
216
+ const newPack = { ...pack, builtIn: false };
217
+ this.packs.set(newPack.name, newPack);
218
+ this._persistPack(newPack);
219
+ return newPack;
220
+ }
221
+ updatePack(name, updates) {
222
+ const existing = this.packs.get(name);
223
+ if (!existing)
224
+ throw new Error(`Pack "${name}" not found`);
225
+ if (existing.builtIn)
226
+ throw new Error(`Cannot modify built-in pack "${name}"`);
227
+ const updated = { ...existing, ...updates, name, builtIn: false };
228
+ this.packs.set(name, updated);
229
+ this._persistPack(updated);
230
+ return updated;
231
+ }
232
+ deletePack(name) {
233
+ const pack = this.packs.get(name);
234
+ if (!pack)
235
+ throw new Error(`Pack "${name}" not found`);
236
+ if (pack.builtIn)
237
+ throw new Error(`Cannot delete built-in pack "${name}"`);
238
+ this.packs.delete(name);
239
+ this._deletePersisted(name);
240
+ }
241
+ // ── Authorization ────────────────────────────────────────────────────────────
242
+ /**
243
+ * Determine which packs are active for the current request.
244
+ *
245
+ * X-Task-Type header format:
246
+ * - "code" | "search" | "file-ops" → named built-in pack
247
+ * - "custom:{pack-name}" → custom pack
248
+ * - undefined → no packs active (deny all)
249
+ */
250
+ resolveActivePacks(taskType, agentId) {
251
+ const active = [];
252
+ if (taskType) {
253
+ if (taskType.startsWith('custom:')) {
254
+ const customName = taskType.slice(7).trim();
255
+ if (customName && this.packs.has(customName)) {
256
+ active.push(customName);
257
+ }
258
+ }
259
+ else {
260
+ // Map task-type to built-in pack name (they share names)
261
+ if (this.packs.has(taskType)) {
262
+ active.push(taskType);
263
+ }
264
+ }
265
+ }
266
+ // Apply agent-level pack additions/removals
267
+ if (agentId && this.config.agentConfigs) {
268
+ const agentCfg = this.config.agentConfigs[agentId];
269
+ if (agentCfg) {
270
+ for (const p of agentCfg.allowPacks) {
271
+ if (this.packs.has(p) && !active.includes(p))
272
+ active.push(p);
273
+ }
274
+ for (const p of agentCfg.denyPacks) {
275
+ const idx = active.indexOf(p);
276
+ if (idx !== -1)
277
+ active.splice(idx, 1);
278
+ }
279
+ }
280
+ }
281
+ return active;
282
+ }
283
+ /**
284
+ * Check which of the requested tools are allowed given active packs and agent config.
285
+ * Does NOT enforce rate limits (call checkRateLimit separately).
286
+ */
287
+ checkTools(ctx) {
288
+ if (!this.config.enabled) {
289
+ // When router is disabled, allow everything
290
+ return {
291
+ allowed: ctx.requestedTools,
292
+ denied: [],
293
+ deniedHeader: '',
294
+ requireConfirmation: [],
295
+ };
296
+ }
297
+ const allowed = [];
298
+ const denied = [];
299
+ const requireConfirmation = [];
300
+ // Build a fast lookup: toolName → effective policy
301
+ const effectivePolicy = this._resolveEffectivePolicies(ctx.activePacks, ctx.agentId, ctx.denyList);
302
+ for (const tool of ctx.requestedTools) {
303
+ const policy = effectivePolicy.get(tool) ?? 'deny';
304
+ if (policy === 'allow') {
305
+ allowed.push(tool);
306
+ // Check requiresConfirmation
307
+ const entry = this._findToolEntry(tool, ctx.activePacks);
308
+ if (entry?.requiresConfirmation) {
309
+ requireConfirmation.push(tool);
310
+ }
311
+ }
312
+ else {
313
+ denied.push(tool);
314
+ }
315
+ }
316
+ return {
317
+ allowed,
318
+ denied,
319
+ // Sanitize tool names before embedding in an HTTP response header: strip
320
+ // any character outside printable ASCII (0x20–0x7E) to prevent header
321
+ // pollution or injection through malformed tool names in the request body.
322
+ deniedHeader: denied.map(n => n.replace(/[^\x20-\x7E]/g, '')).join(', '),
323
+ requireConfirmation,
324
+ };
325
+ }
326
+ /**
327
+ * Resolve the effective policy for every known tool, given the active packs,
328
+ * agent overrides, and explicit deny list.
329
+ */
330
+ _resolveEffectivePolicies(activePacks, agentId, denyList) {
331
+ const policies = new Map();
332
+ // Step 1: Apply active packs in order
333
+ for (const packName of activePacks) {
334
+ const pack = this.packs.get(packName);
335
+ if (!pack)
336
+ continue;
337
+ for (const entry of pack.tools) {
338
+ const resolved = entry.policy === 'inherit' ? pack.defaultPolicy : entry.policy;
339
+ // Later packs can override earlier ones, but we apply in order
340
+ // (first pack wins for a given tool if there are conflicts)
341
+ if (!policies.has(entry.name)) {
342
+ policies.set(entry.name, resolved);
343
+ }
344
+ }
345
+ }
346
+ // Step 2: Apply agent-level tool overrides
347
+ if (agentId && this.config.agentConfigs) {
348
+ const agentCfg = this.config.agentConfigs[agentId];
349
+ if (agentCfg) {
350
+ for (const [toolName, policy] of Object.entries(agentCfg.toolOverrides)) {
351
+ policies.set(toolName, policy);
352
+ }
353
+ }
354
+ }
355
+ // Step 3: Explicit deny list always wins (highest priority)
356
+ for (const tool of denyList) {
357
+ policies.set(tool, 'deny');
358
+ }
359
+ return policies;
360
+ }
361
+ _findToolEntry(toolName, activePacks) {
362
+ for (const packName of activePacks) {
363
+ const pack = this.packs.get(packName);
364
+ if (!pack)
365
+ continue;
366
+ const entry = pack.tools.find(t => t.name === toolName);
367
+ if (entry)
368
+ return entry;
369
+ }
370
+ return undefined;
371
+ }
372
+ // ── Rate limiting ────────────────────────────────────────────────────────────
373
+ /**
374
+ * Check rate limit for a specific tool call.
375
+ * Updates internal state on success (i.e. calling this IS the "record call" step).
376
+ */
377
+ checkRateLimit(sessionId, toolName, activePacks) {
378
+ const entry = this._findToolEntry(toolName, activePacks);
379
+ if (!entry?.rateLimit) {
380
+ return { allowed: true, sessionCount: 0, minuteCount: 0 };
381
+ }
382
+ const { maxCallsPerSession, maxCallsPerMinute } = entry.rateLimit;
383
+ const key = `${sessionId}:${toolName}`;
384
+ const now = Date.now();
385
+ const currentWindow = getMinuteWindow(now);
386
+ let state = this.usageState.get(key);
387
+ if (!state) {
388
+ state = { sessionCount: 0, minuteWindows: [] };
389
+ this.usageState.set(key, state);
390
+ }
391
+ // Prune old minute windows (keep only the last 2)
392
+ state.minuteWindows = state.minuteWindows.filter(w => w.window === currentWindow);
393
+ const minuteEntry = state.minuteWindows.find(w => w.window === currentWindow);
394
+ const minuteCount = minuteEntry?.count ?? 0;
395
+ if (state.sessionCount >= maxCallsPerSession) {
396
+ return { allowed: false, reason: 'session_limit', sessionCount: state.sessionCount, minuteCount };
397
+ }
398
+ if (minuteCount >= maxCallsPerMinute) {
399
+ return { allowed: false, reason: 'minute_limit', sessionCount: state.sessionCount, minuteCount };
400
+ }
401
+ // Record the call
402
+ state.sessionCount += 1;
403
+ if (minuteEntry) {
404
+ minuteEntry.count += 1;
405
+ }
406
+ else {
407
+ state.minuteWindows.push({ window: currentWindow, count: 1 });
408
+ }
409
+ return { allowed: true, sessionCount: state.sessionCount, minuteCount: minuteCount + 1 };
410
+ }
411
+ /** Reset rate limit state for a session (call on session end) */
412
+ clearSessionRateLimits(sessionId) {
413
+ for (const key of this.usageState.keys()) {
414
+ if (key.startsWith(`${sessionId}:`)) {
415
+ this.usageState.delete(key);
416
+ }
417
+ }
418
+ }
419
+ // ── Lazy schema loading ──────────────────────────────────────────────────────
420
+ /**
421
+ * Get the schema for a tool. Only fetches on first call (lazy).
422
+ * Returns undefined if no schemaRef configured or fetch fails.
423
+ */
424
+ async getToolSchema(toolName, activePacks) {
425
+ if (this.schemaCache.has(toolName)) {
426
+ return this.schemaCache.get(toolName);
427
+ }
428
+ const entry = this._findToolEntry(toolName, activePacks);
429
+ if (!entry?.schemaRef)
430
+ return undefined;
431
+ try {
432
+ let schema;
433
+ if (entry.schemaRef.startsWith('http://') || entry.schemaRef.startsWith('https://')) {
434
+ const res = await fetch(entry.schemaRef, { signal: AbortSignal.timeout(3000) });
435
+ if (res.ok)
436
+ schema = (await res.json());
437
+ }
438
+ else {
439
+ const raw = fs.readFileSync(entry.schemaRef, 'utf-8');
440
+ schema = JSON.parse(raw);
441
+ }
442
+ if (schema) {
443
+ this.schemaCache.set(toolName, schema);
444
+ return schema;
445
+ }
446
+ }
447
+ catch {
448
+ // Schema load failure is non-fatal — tool is still allowed
449
+ }
450
+ return undefined;
451
+ }
452
+ // ── Session denied tools log ─────────────────────────────────────────────────
453
+ /** In-memory log of denied tool calls keyed by sessionId */
454
+ deniedLog = new Map();
455
+ recordDenied(sessionId, toolName, reason) {
456
+ let entries = this.deniedLog.get(sessionId);
457
+ if (!entries) {
458
+ entries = [];
459
+ this.deniedLog.set(sessionId, entries);
460
+ }
461
+ entries.push({ toolName, ts: Date.now(), reason });
462
+ }
463
+ getDeniedForSession(sessionId) {
464
+ return this.deniedLog.get(sessionId) ?? [];
465
+ }
466
+ clearDeniedLog(sessionId) {
467
+ this.deniedLog.delete(sessionId);
468
+ }
469
+ // ── MCP tool handlers ────────────────────────────────────────────────────────
470
+ mcpToolPackList() {
471
+ return this.listPacks();
472
+ }
473
+ mcpToolPackGet(name) {
474
+ return this.getPack(name);
475
+ }
476
+ mcpToolAuthCheck(ctx) {
477
+ return this.checkTools(ctx);
478
+ }
479
+ // ── Config ───────────────────────────────────────────────────────────────────
480
+ getConfig() {
481
+ return { ...this.config };
482
+ }
483
+ updateConfig(updates) {
484
+ this.config = { ...this.config, ...updates };
485
+ if (updates.packsDir !== undefined) {
486
+ this._loadPacksFromDir();
487
+ }
488
+ }
489
+ }
490
+ exports.ToolRouter = ToolRouter;
491
+ // ── Singleton convenience ─────────────────────────────────────────────────────
492
+ let _toolRouter = null;
493
+ function getToolRouter(config) {
494
+ if (!_toolRouter) {
495
+ _toolRouter = new ToolRouter(config);
496
+ }
497
+ return _toolRouter;
498
+ }
499
+ function resetToolRouter() {
500
+ _toolRouter = null;
501
+ ToolRouter.reset();
502
+ }
503
+ // ── Header extraction helpers ─────────────────────────────────────────────────
504
+ /**
505
+ * Extract tool routing context from request headers.
506
+ * Returns activePacks and denyList ready for checkTools().
507
+ */
508
+ function extractToolContext(headers, sessionId, requestedTools, router) {
509
+ const rt = router ?? getToolRouter();
510
+ const rawTaskType = Array.isArray(headers['x-task-type'])
511
+ ? headers['x-task-type'][0]
512
+ : headers['x-task-type'];
513
+ const taskType = rawTaskType?.trim();
514
+ const rawAgentId = Array.isArray(headers['x-agent-id'])
515
+ ? headers['x-agent-id'][0]
516
+ : headers['x-agent-id'];
517
+ const agentId = rawAgentId?.trim();
518
+ const activePacks = rt.resolveActivePacks(taskType, agentId);
519
+ return {
520
+ sessionId,
521
+ agentId,
522
+ taskType,
523
+ activePacks,
524
+ denyList: [],
525
+ requestedTools,
526
+ };
527
+ }
528
+ //# sourceMappingURL=tool-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-router.js","sourceRoot":"","sources":["../src/tool-router.ts"],"names":[],"mappings":"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"}