@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,163 @@
1
+ /**
2
+ * ToolRouter — deny-by-default tool authorization with named scope packs.
3
+ *
4
+ * CAP 2: Hierarchical Tool Routing (Phase 2, Session 3)
5
+ *
6
+ * Authorization flow (highest-priority last wins):
7
+ * 1. Default deny all
8
+ * 2. Apply active packs (based on X-Task-Type header)
9
+ * 3. Apply agent-level overrides (based on X-Agent-Id header)
10
+ * 4. Apply explicit deny list (always wins)
11
+ *
12
+ * Lazy schema loading: schemas fetched only when a tool is (a) allowed AND (b) actually called.
13
+ */
14
+ export interface ToolRateLimit {
15
+ maxCallsPerSession: number;
16
+ maxCallsPerMinute: number;
17
+ }
18
+ export interface ToolEntry {
19
+ name: string;
20
+ /** Optional URL or file path to a JSON schema for this tool */
21
+ schemaRef?: string;
22
+ /** 'inherit' defers to the pack's defaultPolicy */
23
+ policy: 'allow' | 'deny' | 'inherit';
24
+ requiresConfirmation?: boolean;
25
+ rateLimit?: ToolRateLimit;
26
+ }
27
+ export interface ToolPack {
28
+ name: string;
29
+ description: string;
30
+ tools: ToolEntry[];
31
+ /** Policy applied to tools NOT listed in this pack */
32
+ defaultPolicy: 'allow' | 'deny';
33
+ version: string;
34
+ /** True for the three built-in packs — cannot be deleted */
35
+ builtIn?: boolean;
36
+ }
37
+ export interface AgentAuthConfig {
38
+ agentId: string;
39
+ allowPacks: string[];
40
+ denyPacks: string[];
41
+ /** Per-tool overrides: tool name → 'allow' | 'deny' */
42
+ toolOverrides: Record<string, 'allow' | 'deny'>;
43
+ }
44
+ export interface ToolAuthContext {
45
+ sessionId: string;
46
+ agentId?: string;
47
+ taskType?: string;
48
+ activePacks: string[];
49
+ denyList: string[];
50
+ requestedTools: string[];
51
+ }
52
+ export interface ToolAuthResult {
53
+ /** Tools explicitly allowed by the active packs */
54
+ allowed: string[];
55
+ /** Tools denied (not in any active pack, or explicitly denied) */
56
+ denied: string[];
57
+ /** Comma-separated list for the X-Relay-Tools-Denied response header */
58
+ deniedHeader: string;
59
+ /** Tools that require user confirmation before being called */
60
+ requireConfirmation: string[];
61
+ }
62
+ export interface ToolCallRecord {
63
+ toolName: string;
64
+ sessionId: string;
65
+ calledAt: number;
66
+ }
67
+ export interface RateLimitCheckResult {
68
+ allowed: boolean;
69
+ reason?: 'session_limit' | 'minute_limit';
70
+ sessionCount: number;
71
+ minuteCount: number;
72
+ }
73
+ export interface ToolRouterConfig {
74
+ enabled: boolean;
75
+ /** Extra packs directory (user can place JSON pack files here) */
76
+ packsDir?: string;
77
+ /** Agent configs keyed by agentId */
78
+ agentConfigs?: Record<string, AgentAuthConfig>;
79
+ }
80
+ export declare const DEFAULT_TOOL_ROUTER_CONFIG: ToolRouterConfig;
81
+ export declare const BUILTIN_PACKS: ToolPack[];
82
+ export interface ToolSchema {
83
+ name: string;
84
+ description?: string;
85
+ inputSchema?: Record<string, unknown>;
86
+ }
87
+ export declare class ToolRouter {
88
+ private static _instance;
89
+ private config;
90
+ /** All packs (built-in + custom) keyed by name */
91
+ private packs;
92
+ /** Lazy schema cache: toolName → schema */
93
+ private schemaCache;
94
+ /** Rate limit state: `${sessionId}:${toolName}` → usage */
95
+ private usageState;
96
+ constructor(config?: Partial<ToolRouterConfig>);
97
+ static getInstance(config?: Partial<ToolRouterConfig>): ToolRouter;
98
+ static reset(): void;
99
+ private _loadPacks;
100
+ private _loadPacksFromDir;
101
+ /** Persist a custom pack to the packs directory */
102
+ private _persistPack;
103
+ private _deletePersisted;
104
+ listPacks(): ToolPack[];
105
+ getPack(name: string): ToolPack | undefined;
106
+ createPack(pack: Omit<ToolPack, 'builtIn'>): ToolPack;
107
+ updatePack(name: string, updates: Partial<Omit<ToolPack, 'name' | 'builtIn'>>): ToolPack;
108
+ deletePack(name: string): void;
109
+ /**
110
+ * Determine which packs are active for the current request.
111
+ *
112
+ * X-Task-Type header format:
113
+ * - "code" | "search" | "file-ops" → named built-in pack
114
+ * - "custom:{pack-name}" → custom pack
115
+ * - undefined → no packs active (deny all)
116
+ */
117
+ resolveActivePacks(taskType?: string, agentId?: string): string[];
118
+ /**
119
+ * Check which of the requested tools are allowed given active packs and agent config.
120
+ * Does NOT enforce rate limits (call checkRateLimit separately).
121
+ */
122
+ checkTools(ctx: ToolAuthContext): ToolAuthResult;
123
+ /**
124
+ * Resolve the effective policy for every known tool, given the active packs,
125
+ * agent overrides, and explicit deny list.
126
+ */
127
+ private _resolveEffectivePolicies;
128
+ private _findToolEntry;
129
+ /**
130
+ * Check rate limit for a specific tool call.
131
+ * Updates internal state on success (i.e. calling this IS the "record call" step).
132
+ */
133
+ checkRateLimit(sessionId: string, toolName: string, activePacks: string[]): RateLimitCheckResult;
134
+ /** Reset rate limit state for a session (call on session end) */
135
+ clearSessionRateLimits(sessionId: string): void;
136
+ /**
137
+ * Get the schema for a tool. Only fetches on first call (lazy).
138
+ * Returns undefined if no schemaRef configured or fetch fails.
139
+ */
140
+ getToolSchema(toolName: string, activePacks: string[]): Promise<ToolSchema | undefined>;
141
+ /** In-memory log of denied tool calls keyed by sessionId */
142
+ private deniedLog;
143
+ recordDenied(sessionId: string, toolName: string, reason: string): void;
144
+ getDeniedForSession(sessionId: string): {
145
+ toolName: string;
146
+ ts: number;
147
+ reason: string;
148
+ }[];
149
+ clearDeniedLog(sessionId: string): void;
150
+ mcpToolPackList(): ToolPack[];
151
+ mcpToolPackGet(name: string): ToolPack | undefined;
152
+ mcpToolAuthCheck(ctx: ToolAuthContext): ToolAuthResult;
153
+ getConfig(): ToolRouterConfig;
154
+ updateConfig(updates: Partial<ToolRouterConfig>): void;
155
+ }
156
+ export declare function getToolRouter(config?: Partial<ToolRouterConfig>): ToolRouter;
157
+ export declare function resetToolRouter(): void;
158
+ /**
159
+ * Extract tool routing context from request headers.
160
+ * Returns activePacks and denyList ready for checkTools().
161
+ */
162
+ export declare function extractToolContext(headers: Record<string, string | string[] | undefined>, sessionId: string, requestedTools: string[], router?: ToolRouter): ToolAuthContext;
163
+ //# sourceMappingURL=tool-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-router.d.ts","sourceRoot":"","sources":["../src/tool-router.ts"],"names":[],"mappings":"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"}