@enderfga/openclaw-claude-code 2.0.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 (38) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +179 -0
  3. package/dist/bin/cli.d.ts +10 -0
  4. package/dist/bin/cli.js +301 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/src/embedded-server.d.ts +19 -0
  7. package/dist/src/embedded-server.js +190 -0
  8. package/dist/src/embedded-server.js.map +1 -0
  9. package/dist/src/hooks/prompt-bypass.d.ts +20 -0
  10. package/dist/src/hooks/prompt-bypass.js +37 -0
  11. package/dist/src/hooks/prompt-bypass.js.map +1 -0
  12. package/dist/src/index.d.ts +47 -0
  13. package/dist/src/index.js +230 -0
  14. package/dist/src/index.js.map +1 -0
  15. package/dist/src/persistent-session.d.ts +100 -0
  16. package/dist/src/persistent-session.js +563 -0
  17. package/dist/src/persistent-session.js.map +1 -0
  18. package/dist/src/proxy/anthropic-adapter.d.ts +136 -0
  19. package/dist/src/proxy/anthropic-adapter.js +394 -0
  20. package/dist/src/proxy/anthropic-adapter.js.map +1 -0
  21. package/dist/src/proxy/handler.d.ts +39 -0
  22. package/dist/src/proxy/handler.js +261 -0
  23. package/dist/src/proxy/handler.js.map +1 -0
  24. package/dist/src/proxy/schema-cleaner.d.ts +11 -0
  25. package/dist/src/proxy/schema-cleaner.js +34 -0
  26. package/dist/src/proxy/schema-cleaner.js.map +1 -0
  27. package/dist/src/proxy/thought-cache.d.ts +19 -0
  28. package/dist/src/proxy/thought-cache.js +53 -0
  29. package/dist/src/proxy/thought-cache.js.map +1 -0
  30. package/dist/src/session-manager.d.ts +79 -0
  31. package/dist/src/session-manager.js +329 -0
  32. package/dist/src/session-manager.js.map +1 -0
  33. package/dist/src/types.d.ts +160 -0
  34. package/dist/src/types.js +20 -0
  35. package/dist/src/types.js.map +1 -0
  36. package/openclaw.plugin.json +76 -0
  37. package/package.json +46 -0
  38. package/skills/SKILL.md +594 -0
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Anthropic ↔ OpenAI Format Adapter
3
+ *
4
+ * Core conversion logic for translating between Anthropic Messages API format
5
+ * and OpenAI Chat Completions format. Replaces the Python server.py (~2300 lines)
6
+ * with pure TypeScript (~600 lines), no litellm dependency.
7
+ *
8
+ * Handles:
9
+ * - Message format conversion (content blocks ↔ role/content strings)
10
+ * - Tool schema conversion (Anthropic tools ↔ OpenAI function tools)
11
+ * - Message normalization (re-interleave merged blocks for OpenAI)
12
+ * - Response conversion (OpenAI response → Anthropic response)
13
+ * - Streaming SSE conversion (OpenAI SSE → Anthropic SSE events)
14
+ */
15
+ export interface AnthropicRequest {
16
+ model: string;
17
+ max_tokens: number;
18
+ messages: AnthropicMessage[];
19
+ system?: string | Array<{
20
+ type: string;
21
+ text: string;
22
+ }>;
23
+ tools?: AnthropicTool[];
24
+ tool_choice?: {
25
+ type: string;
26
+ name?: string;
27
+ };
28
+ stream?: boolean;
29
+ temperature?: number;
30
+ top_p?: number;
31
+ top_k?: number;
32
+ thinking?: {
33
+ type: string;
34
+ budget_tokens?: number;
35
+ };
36
+ }
37
+ export interface AnthropicMessage {
38
+ role: 'user' | 'assistant' | 'system';
39
+ content: string | AnthropicContentBlock[];
40
+ }
41
+ export interface AnthropicContentBlock {
42
+ type: string;
43
+ text?: string;
44
+ id?: string;
45
+ name?: string;
46
+ input?: unknown;
47
+ tool_use_id?: string;
48
+ content?: unknown;
49
+ [key: string]: unknown;
50
+ }
51
+ export interface AnthropicTool {
52
+ name: string;
53
+ description?: string;
54
+ input_schema: Record<string, unknown>;
55
+ }
56
+ export interface AnthropicResponse {
57
+ id: string;
58
+ type: 'message';
59
+ model: string;
60
+ role: 'assistant';
61
+ content: AnthropicContentBlock[];
62
+ stop_reason: string | null;
63
+ stop_sequence: string | null;
64
+ usage: {
65
+ input_tokens: number;
66
+ output_tokens: number;
67
+ cache_creation_input_tokens: number;
68
+ cache_read_input_tokens: number;
69
+ };
70
+ }
71
+ export interface OpenAIRequest {
72
+ model: string;
73
+ messages: OpenAIMessage[];
74
+ max_completion_tokens?: number;
75
+ temperature?: number;
76
+ top_p?: number;
77
+ stream?: boolean;
78
+ tools?: OpenAITool[];
79
+ tool_choice?: string | {
80
+ type: string;
81
+ function: {
82
+ name: string;
83
+ };
84
+ };
85
+ thinking?: {
86
+ type: string;
87
+ budget_tokens?: number;
88
+ };
89
+ }
90
+ export interface OpenAIMessage {
91
+ role: 'system' | 'user' | 'assistant' | 'tool';
92
+ content?: string | null;
93
+ tool_calls?: OpenAIToolCall[];
94
+ tool_call_id?: string;
95
+ }
96
+ export interface OpenAIToolCall {
97
+ id: string;
98
+ type: 'function';
99
+ function: {
100
+ name: string;
101
+ arguments: string;
102
+ };
103
+ extra_content?: Record<string, unknown>;
104
+ }
105
+ export interface OpenAITool {
106
+ type: 'function';
107
+ function: {
108
+ name: string;
109
+ description: string;
110
+ parameters: Record<string, unknown>;
111
+ };
112
+ }
113
+ export interface OpenAIResponse {
114
+ id?: string;
115
+ model?: string;
116
+ choices: Array<{
117
+ message?: {
118
+ content?: string | null;
119
+ tool_calls?: OpenAIToolCall[];
120
+ };
121
+ finish_reason?: string;
122
+ }>;
123
+ usage?: {
124
+ prompt_tokens?: number;
125
+ completion_tokens?: number;
126
+ };
127
+ }
128
+ export declare function isGeminiModel(model: string): boolean;
129
+ export declare function isClaudeModel(model: string): boolean;
130
+ export declare function convertAnthropicToOpenAI(req: AnthropicRequest): OpenAIRequest;
131
+ export declare function convertOpenAIToAnthropic(resp: OpenAIResponse, originalModel: string): AnthropicResponse;
132
+ /**
133
+ * Convert an OpenAI SSE stream to Anthropic SSE format.
134
+ * Yields Anthropic-formatted SSE strings.
135
+ */
136
+ export declare function convertStreamOpenAIToAnthropic(stream: AsyncIterable<string>, originalModel: string): AsyncGenerator<string>;
@@ -0,0 +1,394 @@
1
+ /**
2
+ * Anthropic ↔ OpenAI Format Adapter
3
+ *
4
+ * Core conversion logic for translating between Anthropic Messages API format
5
+ * and OpenAI Chat Completions format. Replaces the Python server.py (~2300 lines)
6
+ * with pure TypeScript (~600 lines), no litellm dependency.
7
+ *
8
+ * Handles:
9
+ * - Message format conversion (content blocks ↔ role/content strings)
10
+ * - Tool schema conversion (Anthropic tools ↔ OpenAI function tools)
11
+ * - Message normalization (re-interleave merged blocks for OpenAI)
12
+ * - Response conversion (OpenAI response → Anthropic response)
13
+ * - Streaming SSE conversion (OpenAI SSE → Anthropic SSE events)
14
+ */
15
+ import { randomUUID } from 'node:crypto';
16
+ const uuidv4 = randomUUID;
17
+ import { cleanGeminiSchema } from './schema-cleaner.js';
18
+ import { cacheThoughtSig } from './thought-cache.js';
19
+ // ─── Model Detection ─────────────────────────────────────────────────────────
20
+ export function isGeminiModel(model) {
21
+ return model.toLowerCase().includes('gemini');
22
+ }
23
+ export function isClaudeModel(model) {
24
+ const l = model.toLowerCase();
25
+ return l.includes('claude') || l.includes('opus') || l.includes('sonnet') || l.includes('haiku');
26
+ }
27
+ // ─── Anthropic → OpenAI Conversion ───────────────────────────────────────────
28
+ export function convertAnthropicToOpenAI(req) {
29
+ const isGemini = isGeminiModel(req.model);
30
+ // 1. System message
31
+ let systemText = '';
32
+ if (typeof req.system === 'string') {
33
+ systemText = req.system;
34
+ }
35
+ else if (Array.isArray(req.system)) {
36
+ systemText = req.system.map(b => b.text || '').join('\n');
37
+ }
38
+ // 2. Convert messages
39
+ const rawMessages = convertMessages(req.messages);
40
+ // 3. Normalize for OpenAI interleaving
41
+ const normalized = normalizeMessagesForOpenAI(rawMessages);
42
+ // 4. Prepend system
43
+ const messages = [];
44
+ if (systemText)
45
+ messages.push({ role: 'system', content: systemText });
46
+ messages.push(...normalized);
47
+ // 5. Max tokens
48
+ let maxTokens = req.max_tokens || 4096;
49
+ if (!isClaudeModel(req.model))
50
+ maxTokens = Math.min(maxTokens, 16384);
51
+ if (isGemini && maxTokens < 8192)
52
+ maxTokens = 8192;
53
+ // 6. Build request
54
+ const openaiReq = {
55
+ model: req.model,
56
+ messages,
57
+ max_completion_tokens: maxTokens,
58
+ temperature: req.temperature ?? 1.0,
59
+ stream: req.stream ?? false,
60
+ };
61
+ if (req.top_p !== undefined)
62
+ openaiReq.top_p = req.top_p;
63
+ // 7. Thinking (Claude only)
64
+ if (req.thinking && isClaudeModel(req.model)) {
65
+ openaiReq.thinking = {
66
+ type: req.thinking.type === 'enabled' ? 'enabled' : 'disabled',
67
+ budget_tokens: req.thinking.budget_tokens || Math.max(maxTokens - 1000, 1024),
68
+ };
69
+ }
70
+ // 8. Tools
71
+ if (req.tools?.length) {
72
+ openaiReq.tools = req.tools.map(tool => {
73
+ let schema = tool.input_schema || {};
74
+ if (isGemini)
75
+ schema = cleanGeminiSchema(schema);
76
+ return {
77
+ type: 'function',
78
+ function: {
79
+ name: tool.name,
80
+ description: tool.description || '',
81
+ parameters: schema,
82
+ },
83
+ };
84
+ });
85
+ }
86
+ // 9. Tool choice
87
+ if (req.tool_choice) {
88
+ const tc = req.tool_choice;
89
+ if (tc.type === 'auto')
90
+ openaiReq.tool_choice = 'auto';
91
+ else if (tc.type === 'any')
92
+ openaiReq.tool_choice = 'auto';
93
+ else if (tc.type === 'tool' && tc.name) {
94
+ openaiReq.tool_choice = { type: 'function', function: { name: tc.name } };
95
+ }
96
+ }
97
+ return openaiReq;
98
+ }
99
+ // ─── Message Conversion ──────────────────────────────────────────────────────
100
+ function convertMessages(messages) {
101
+ const result = [];
102
+ for (const msg of messages) {
103
+ if (msg.role === 'system')
104
+ continue; // handled separately
105
+ if (typeof msg.content === 'string') {
106
+ result.push({ role: msg.role, content: msg.content });
107
+ continue;
108
+ }
109
+ // Content blocks
110
+ const textParts = [];
111
+ const toolCalls = [];
112
+ const toolResults = [];
113
+ for (const block of msg.content) {
114
+ if (block.type === 'text' && block.text) {
115
+ textParts.push(block.text);
116
+ }
117
+ else if (block.type === 'tool_use') {
118
+ toolCalls.push({
119
+ id: block.id || `tool_${uuidv4()}`,
120
+ type: 'function',
121
+ function: {
122
+ name: block.name || '',
123
+ arguments: typeof block.input === 'string' ? block.input : JSON.stringify(block.input || {}),
124
+ },
125
+ });
126
+ }
127
+ else if (block.type === 'tool_result') {
128
+ const content = typeof block.content === 'string'
129
+ ? block.content
130
+ : JSON.stringify(block.content || '');
131
+ toolResults.push({
132
+ role: 'tool',
133
+ tool_call_id: block.tool_use_id || '',
134
+ content,
135
+ });
136
+ }
137
+ }
138
+ if (msg.role === 'assistant') {
139
+ const assistantMsg = {
140
+ role: 'assistant',
141
+ content: textParts.join('\n') || null,
142
+ };
143
+ if (toolCalls.length)
144
+ assistantMsg.tool_calls = toolCalls;
145
+ result.push(assistantMsg);
146
+ }
147
+ else if (msg.role === 'user') {
148
+ // Tool results first, then text
149
+ result.push(...toolResults);
150
+ if (textParts.length) {
151
+ result.push({ role: 'user', content: textParts.join('\n') });
152
+ }
153
+ }
154
+ }
155
+ return result;
156
+ }
157
+ // ─── Message Normalization ───────────────────────────────────────────────────
158
+ /**
159
+ * Re-interleave messages for OpenAI's strict format:
160
+ * - assistant message with tool_calls must be followed by tool messages
161
+ * - No consecutive same-role messages (merge them)
162
+ * - Tool messages must reference a tool_call_id from previous assistant
163
+ */
164
+ function normalizeMessagesForOpenAI(messages) {
165
+ const normalized = [];
166
+ for (const msg of messages) {
167
+ const last = normalized[normalized.length - 1];
168
+ if (msg.role === 'tool') {
169
+ // Tool result — must follow an assistant with tool_calls
170
+ normalized.push(msg);
171
+ }
172
+ else if (msg.role === 'assistant') {
173
+ // Merge consecutive assistant messages
174
+ if (last?.role === 'assistant' && !last.tool_calls && !msg.tool_calls) {
175
+ last.content = [last.content || '', msg.content || ''].filter(Boolean).join('\n') || null;
176
+ }
177
+ else {
178
+ normalized.push({ ...msg });
179
+ }
180
+ }
181
+ else if (msg.role === 'user') {
182
+ // Merge consecutive user messages
183
+ if (last?.role === 'user') {
184
+ last.content = [last.content || '', msg.content || ''].filter(Boolean).join('\n');
185
+ }
186
+ else {
187
+ normalized.push({ ...msg });
188
+ }
189
+ }
190
+ else {
191
+ normalized.push(msg);
192
+ }
193
+ }
194
+ return normalized;
195
+ }
196
+ // ─── OpenAI → Anthropic Response Conversion ──────────────────────────────────
197
+ export function convertOpenAIToAnthropic(resp, originalModel) {
198
+ const choice = resp.choices?.[0];
199
+ const message = choice?.message;
200
+ const content = [];
201
+ // Text content
202
+ if (message?.content) {
203
+ content.push({ type: 'text', text: message.content });
204
+ }
205
+ // Tool calls → tool_use blocks
206
+ if (message?.tool_calls) {
207
+ for (const tc of message.tool_calls) {
208
+ let args = {};
209
+ if (typeof tc.function.arguments === 'string') {
210
+ try {
211
+ args = JSON.parse(tc.function.arguments);
212
+ }
213
+ catch {
214
+ args = { raw: tc.function.arguments };
215
+ }
216
+ }
217
+ else {
218
+ args = tc.function.arguments;
219
+ }
220
+ content.push({
221
+ type: 'tool_use',
222
+ id: tc.id || `tool_${uuidv4()}`,
223
+ name: tc.function.name,
224
+ input: args,
225
+ });
226
+ }
227
+ }
228
+ // Empty content fallback
229
+ if (content.length === 0) {
230
+ content.push({ type: 'text', text: '' });
231
+ }
232
+ // Stop reason mapping
233
+ let stopReason = 'end_turn';
234
+ const finishReason = choice?.finish_reason;
235
+ if (finishReason === 'length')
236
+ stopReason = 'max_tokens';
237
+ else if (finishReason === 'tool_calls')
238
+ stopReason = 'tool_use';
239
+ else if (finishReason === 'stop')
240
+ stopReason = 'end_turn';
241
+ // Fix: force tool_use if response has tool blocks but stop was "end_turn"
242
+ const hasToolUse = content.some(c => c.type === 'tool_use');
243
+ if (stopReason === 'end_turn' && hasToolUse)
244
+ stopReason = 'tool_use';
245
+ return {
246
+ id: resp.id || `msg_${uuidv4()}`,
247
+ type: 'message',
248
+ model: originalModel,
249
+ role: 'assistant',
250
+ content,
251
+ stop_reason: stopReason,
252
+ stop_sequence: null,
253
+ usage: {
254
+ input_tokens: resp.usage?.prompt_tokens || 0,
255
+ output_tokens: resp.usage?.completion_tokens || 0,
256
+ cache_creation_input_tokens: 0,
257
+ cache_read_input_tokens: 0,
258
+ },
259
+ };
260
+ }
261
+ // ─── Streaming SSE Conversion ────────────────────────────────────────────────
262
+ /**
263
+ * Convert an OpenAI SSE stream to Anthropic SSE format.
264
+ * Yields Anthropic-formatted SSE strings.
265
+ */
266
+ export async function* convertStreamOpenAIToAnthropic(stream, originalModel) {
267
+ // Emit message_start
268
+ const msgId = `msg_${uuidv4()}`;
269
+ yield sseEvent('message_start', {
270
+ type: 'message_start',
271
+ message: {
272
+ id: msgId, type: 'message', model: originalModel, role: 'assistant',
273
+ content: [], stop_reason: null, stop_sequence: null,
274
+ usage: { input_tokens: 0, output_tokens: 0 },
275
+ },
276
+ });
277
+ // Emit initial text block
278
+ yield sseEvent('content_block_start', {
279
+ type: 'content_block_start', index: 0,
280
+ content_block: { type: 'text', text: '' },
281
+ });
282
+ let accumulatedText = '';
283
+ let textBlockOpen = true;
284
+ let lastToolIndex = 0; // anthropic index (0 = text, 1+ = tools)
285
+ let currentToolCallId = null;
286
+ let finishReason = null;
287
+ let promptTokens = 0;
288
+ let completionTokens = 0;
289
+ for await (const line of stream) {
290
+ if (!line.startsWith('data: ') || line === 'data: [DONE]')
291
+ continue;
292
+ let chunk;
293
+ try {
294
+ chunk = JSON.parse(line.slice(6));
295
+ }
296
+ catch {
297
+ continue;
298
+ }
299
+ const choices = chunk.choices;
300
+ if (!choices?.length) {
301
+ // Usage chunk (OpenAI sends usage in final chunk)
302
+ const usage = chunk.usage;
303
+ if (usage) {
304
+ promptTokens = usage.prompt_tokens || 0;
305
+ completionTokens = usage.completion_tokens || 0;
306
+ }
307
+ continue;
308
+ }
309
+ const delta = choices[0].delta;
310
+ if (!delta) {
311
+ finishReason = choices[0].finish_reason || finishReason;
312
+ continue;
313
+ }
314
+ finishReason = choices[0].finish_reason || finishReason;
315
+ // Text delta
316
+ const textContent = delta.content;
317
+ if (textContent) {
318
+ accumulatedText += textContent;
319
+ if (textBlockOpen) {
320
+ yield sseEvent('content_block_delta', {
321
+ type: 'content_block_delta', index: 0,
322
+ delta: { type: 'text_delta', text: textContent },
323
+ });
324
+ }
325
+ }
326
+ // Tool calls
327
+ const toolCalls = delta.tool_calls;
328
+ if (toolCalls) {
329
+ for (const tc of toolCalls) {
330
+ const tcId = tc.id;
331
+ const fn = tc.function;
332
+ // New tool call
333
+ if (tcId && tcId !== currentToolCallId) {
334
+ // Close text block if still open
335
+ if (textBlockOpen) {
336
+ yield sseEvent('content_block_stop', { type: 'content_block_stop', index: 0 });
337
+ textBlockOpen = false;
338
+ }
339
+ // Close previous tool block
340
+ if (currentToolCallId) {
341
+ yield sseEvent('content_block_stop', { type: 'content_block_stop', index: lastToolIndex });
342
+ }
343
+ lastToolIndex++;
344
+ currentToolCallId = tcId;
345
+ // Cache thought signature if present (Gemini)
346
+ const extra = tc.extra_content;
347
+ const sig = extra?.google?.thought_signature || tc.thought_signature;
348
+ if (sig && tcId)
349
+ cacheThoughtSig(tcId, sig);
350
+ // Start new tool block
351
+ yield sseEvent('content_block_start', {
352
+ type: 'content_block_start', index: lastToolIndex,
353
+ content_block: { type: 'tool_use', id: tcId, name: fn?.name || '', input: {} },
354
+ });
355
+ }
356
+ // Tool arguments delta
357
+ if (fn?.arguments) {
358
+ yield sseEvent('content_block_delta', {
359
+ type: 'content_block_delta', index: lastToolIndex,
360
+ delta: { type: 'input_json_delta', partial_json: fn.arguments },
361
+ });
362
+ }
363
+ }
364
+ }
365
+ }
366
+ // Close remaining blocks
367
+ if (currentToolCallId) {
368
+ yield sseEvent('content_block_stop', { type: 'content_block_stop', index: lastToolIndex });
369
+ }
370
+ else if (textBlockOpen) {
371
+ yield sseEvent('content_block_stop', { type: 'content_block_stop', index: 0 });
372
+ }
373
+ // Stop reason
374
+ let stopReason = 'end_turn';
375
+ if (finishReason === 'length')
376
+ stopReason = 'max_tokens';
377
+ else if (finishReason === 'tool_calls')
378
+ stopReason = 'tool_use';
379
+ if (stopReason === 'end_turn' && currentToolCallId)
380
+ stopReason = 'tool_use';
381
+ // message_delta (usage + stop)
382
+ yield sseEvent('message_delta', {
383
+ type: 'message_delta',
384
+ delta: { stop_reason: stopReason, stop_sequence: null },
385
+ usage: { output_tokens: completionTokens },
386
+ });
387
+ // message_stop
388
+ yield sseEvent('message_stop', { type: 'message_stop' });
389
+ }
390
+ // ─── SSE Helpers ─────────────────────────────────────────────────────────────
391
+ function sseEvent(event, data) {
392
+ return `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
393
+ }
394
+ //# sourceMappingURL=anthropic-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-adapter.js","sourceRoot":"","sources":["../../../src/proxy/anthropic-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Proxy HTTP Handler — registerHttpRoute handler for OpenClaw Plugin SDK
3
+ *
4
+ * Receives Anthropic-format requests from Claude Code CLI,
5
+ * translates to OpenAI format, forwards to the target provider,
6
+ * and translates the response back to Anthropic format.
7
+ *
8
+ * Supports:
9
+ * - Direct Anthropic API passthrough (zero conversion)
10
+ * - OpenAI/GPT models via format conversion
11
+ * - Gemini models via format conversion + schema cleaning
12
+ * - Gateway passthrough (OpenClaw gateway handles routing)
13
+ * - Streaming and non-streaming modes
14
+ */
15
+ import type { ProxyConfig } from '../types.js';
16
+ export interface ProxyEnv {
17
+ anthropicApiKey?: string;
18
+ openaiApiKey?: string;
19
+ geminiApiKey?: string;
20
+ gatewayUrl?: string;
21
+ gatewayKey?: string;
22
+ }
23
+ interface HttpRequest {
24
+ method: string;
25
+ url: string;
26
+ headers: Record<string, string>;
27
+ body?: unknown;
28
+ json(): Promise<unknown>;
29
+ }
30
+ interface HttpResponse {
31
+ status(code: number): HttpResponse;
32
+ json(data: unknown): void;
33
+ setHeader(key: string, value: string): void;
34
+ write(data: string): void;
35
+ end(): void;
36
+ flushHeaders?(): void;
37
+ }
38
+ export declare function createProxyHandler(config: ProxyConfig | undefined, env: ProxyEnv): (req: HttpRequest, res: HttpResponse) => Promise<boolean>;
39
+ export {};