offrouter-core 0.5.1 → 0.6.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 (90) hide show
  1. package/dist/audit.d.ts +51 -2
  2. package/dist/audit.d.ts.map +1 -1
  3. package/dist/audit.js +60 -3
  4. package/dist/audit.js.map +1 -1
  5. package/dist/config.d.ts +26 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +160 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/delegation.d.ts +40 -0
  10. package/dist/delegation.d.ts.map +1 -1
  11. package/dist/delegation.js +169 -8
  12. package/dist/delegation.js.map +1 -1
  13. package/dist/index.d.ts +27 -13
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +15 -7
  16. package/dist/index.js.map +1 -1
  17. package/dist/llm-judge.d.ts +41 -0
  18. package/dist/llm-judge.d.ts.map +1 -0
  19. package/dist/llm-judge.js +159 -0
  20. package/dist/llm-judge.js.map +1 -0
  21. package/dist/policy.d.ts +77 -0
  22. package/dist/policy.d.ts.map +1 -1
  23. package/dist/policy.js +81 -0
  24. package/dist/policy.js.map +1 -1
  25. package/dist/provider-health.d.ts +129 -0
  26. package/dist/provider-health.d.ts.map +1 -0
  27. package/dist/provider-health.js +423 -0
  28. package/dist/provider-health.js.map +1 -0
  29. package/dist/providers/catalog-data.d.ts +7 -0
  30. package/dist/providers/catalog-data.d.ts.map +1 -1
  31. package/dist/providers/catalog-data.js +140 -53
  32. package/dist/providers/catalog-data.js.map +1 -1
  33. package/dist/providers/catalog.d.ts +3 -3
  34. package/dist/providers/catalog.d.ts.map +1 -1
  35. package/dist/providers/catalog.js +1 -0
  36. package/dist/providers/catalog.js.map +1 -1
  37. package/dist/proxy/anthropic-mapper.d.ts +585 -0
  38. package/dist/proxy/anthropic-mapper.d.ts.map +1 -0
  39. package/dist/proxy/anthropic-mapper.js +539 -0
  40. package/dist/proxy/anthropic-mapper.js.map +1 -0
  41. package/dist/proxy/anthropic-server.d.ts +24 -0
  42. package/dist/proxy/anthropic-server.d.ts.map +1 -0
  43. package/dist/proxy/anthropic-server.js +606 -0
  44. package/dist/proxy/anthropic-server.js.map +1 -0
  45. package/dist/proxy/classify.d.ts +17 -0
  46. package/dist/proxy/classify.d.ts.map +1 -0
  47. package/dist/proxy/classify.js +65 -0
  48. package/dist/proxy/classify.js.map +1 -0
  49. package/dist/proxy/responses-mapper.d.ts +15 -0
  50. package/dist/proxy/responses-mapper.d.ts.map +1 -1
  51. package/dist/proxy/responses-mapper.js +9 -2
  52. package/dist/proxy/responses-mapper.js.map +1 -1
  53. package/dist/proxy/responses-server.d.ts.map +1 -1
  54. package/dist/proxy/responses-server.js +14 -1
  55. package/dist/proxy/responses-server.js.map +1 -1
  56. package/dist/router.d.ts +36 -2
  57. package/dist/router.d.ts.map +1 -1
  58. package/dist/router.js +158 -23
  59. package/dist/router.js.map +1 -1
  60. package/dist/schemas.d.ts +115 -34
  61. package/dist/schemas.d.ts.map +1 -1
  62. package/dist/schemas.js +35 -0
  63. package/dist/schemas.js.map +1 -1
  64. package/dist/secret-scan.d.ts +40 -0
  65. package/dist/secret-scan.d.ts.map +1 -0
  66. package/dist/secret-scan.js +125 -0
  67. package/dist/secret-scan.js.map +1 -0
  68. package/dist/secrets.d.ts +77 -6
  69. package/dist/secrets.d.ts.map +1 -1
  70. package/dist/secrets.js +356 -32
  71. package/dist/secrets.js.map +1 -1
  72. package/dist/spend.d.ts +122 -0
  73. package/dist/spend.d.ts.map +1 -0
  74. package/dist/spend.js +279 -0
  75. package/dist/spend.js.map +1 -0
  76. package/dist/task-classifier.d.ts +45 -0
  77. package/dist/task-classifier.d.ts.map +1 -0
  78. package/dist/task-classifier.js +153 -0
  79. package/dist/task-classifier.js.map +1 -0
  80. package/dist/types.d.ts +46 -1
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/usage-file.d.ts +2 -6
  83. package/dist/usage-file.d.ts.map +1 -1
  84. package/dist/usage-file.js +64 -6
  85. package/dist/usage-file.js.map +1 -1
  86. package/dist/usage.d.ts +64 -10
  87. package/dist/usage.d.ts.map +1 -1
  88. package/dist/usage.js +79 -5
  89. package/dist/usage.js.map +1 -1
  90. package/package.json +1 -1
@@ -0,0 +1,606 @@
1
+ /**
2
+ * Local Anthropic Messages-compatible proxy server.
3
+ *
4
+ * Exposes:
5
+ * POST /v1/messages — non-stream + stream (Anthropic SSE)
6
+ * POST /v1/messages/count_tokens — heuristic estimate (x-offrouter-estimated)
7
+ *
8
+ * Unknown paths return a loud JSON 404 naming the path. Full policy pipeline
9
+ * applies (work-profile deny, spend caps, approval gate). Pre-first-byte
10
+ * failover walks candidates on 429/5xx/timeout; mid-stream failures surface an
11
+ * Anthropic-format error event (no silent truncation).
12
+ *
13
+ * Loopback-only by default. Optional shared token via x-api-key or
14
+ * Authorization; the client key is NEVER forwarded upstream.
15
+ */
16
+ import { createHash, timingSafeEqual } from "node:crypto";
17
+ import { createServer, } from "node:http";
18
+ import { randomBytes } from "node:crypto";
19
+ import { DelegationRuntime, } from "../delegation.js";
20
+ import { routeRequest } from "../router.js";
21
+ import { anthropicErrorPayload, anthropicSseEvent, anthropicStreamErrorEvent, AnthropicSseBuilder, buildAnthropicDelegationRequest, buildAnthropicRouteRequest, estimateAnthropicRequestTokens, extractAnthropicMessagesInput, InvalidAnthropicProxyRequestError, isRetryableProviderFailure, policyDecisionToHttpStatus, providerErrorCodeToHttpStatus, selectCandidatesForAnthropicModel, } from "./anthropic-mapper.js";
22
+ import { classifyProxyPrompt } from "./classify.js";
23
+ const DEFAULT_PORT = 8787;
24
+ const DEFAULT_HOST = "127.0.0.1";
25
+ const DEFAULT_HARNESS = { kind: "other", profile: "proxy" };
26
+ const SSE_HEADERS = {
27
+ "content-type": "text/event-stream; charset=utf-8",
28
+ "cache-control": "no-cache",
29
+ connection: "keep-alive",
30
+ "x-accel-buffering": "no",
31
+ };
32
+ /**
33
+ * Start the Anthropic Messages proxy and resolve once listening.
34
+ */
35
+ export function startAnthropicProxy(context, options = {}) {
36
+ const host = options.host ?? DEFAULT_HOST;
37
+ const port = options.port ?? DEFAULT_PORT;
38
+ const token = options.token;
39
+ const harness = options.harness ?? DEFAULT_HARNESS;
40
+ const workspace = options.workspace ?? {
41
+ cwd: process.cwd(),
42
+ trusted: true,
43
+ };
44
+ const now = options.now ?? (() => new Date());
45
+ const warn = options.warn ?? ((message) => console.warn(message));
46
+ if (token === undefined) {
47
+ warn("OffRouter proxy: OFFROUTER_PROXY_TOKEN unset; running in dev mode on loopback only.");
48
+ }
49
+ const server = createServer((req, res) => {
50
+ void handleRequest(req, res, context, {
51
+ token,
52
+ harness,
53
+ workspace,
54
+ now,
55
+ }).catch((err) => {
56
+ sendAnthropicError(res, 500, errorMessage(err));
57
+ });
58
+ });
59
+ return new Promise((resolve, reject) => {
60
+ const onError = (err) => {
61
+ server.removeListener("error", onError);
62
+ reject(err);
63
+ };
64
+ server.once("error", onError);
65
+ server.listen(port, host, () => {
66
+ server.removeListener("error", onError);
67
+ const address = server.address();
68
+ const actualPort = typeof address === "object" && address ? address.port : port;
69
+ resolve({
70
+ port: actualPort,
71
+ host,
72
+ close: () => new Promise((closeResolve, closeReject) => {
73
+ server.close((err) => (err ? closeReject(err) : closeResolve()));
74
+ }),
75
+ });
76
+ });
77
+ });
78
+ }
79
+ function pathKind(url) {
80
+ const path = (url.split("?")[0] ?? "").replace(/\/+$/, "") || "/";
81
+ if (path === "/v1/messages")
82
+ return "messages";
83
+ if (path === "/v1/messages/count_tokens")
84
+ return "count_tokens";
85
+ return null;
86
+ }
87
+ async function handleRequest(req, res, context, deps) {
88
+ const rawUrl = req.url ?? "";
89
+ const path = rawUrl.split("?")[0] ?? rawUrl;
90
+ if (req.method !== "POST") {
91
+ sendAnthropicError(res, 404, `Not found: ${req.method ?? "UNKNOWN"} ${path}`);
92
+ return;
93
+ }
94
+ const kind = pathKind(rawUrl);
95
+ if (!kind) {
96
+ sendAnthropicError(res, 404, `Not found: ${path}`);
97
+ return;
98
+ }
99
+ if (!authorize(req, deps.token)) {
100
+ sendAnthropicError(res, 401, "Missing or invalid API key.");
101
+ return;
102
+ }
103
+ let body;
104
+ try {
105
+ body = await readBody(req);
106
+ }
107
+ catch {
108
+ sendAnthropicError(res, 400, "Invalid request body.");
109
+ return;
110
+ }
111
+ if (kind === "count_tokens") {
112
+ handleCountTokens(res, body);
113
+ return;
114
+ }
115
+ let parsed;
116
+ try {
117
+ parsed = extractAnthropicMessagesInput(body);
118
+ }
119
+ catch (err) {
120
+ if (err instanceof InvalidAnthropicProxyRequestError) {
121
+ sendAnthropicError(res, 400, "Invalid request body.");
122
+ return;
123
+ }
124
+ sendAnthropicError(res, 400, "Invalid request body.");
125
+ return;
126
+ }
127
+ await handleMessages(req, res, context, deps, parsed);
128
+ }
129
+ function handleCountTokens(res, body) {
130
+ let parsed;
131
+ try {
132
+ // Accept messages without requiring max_tokens.
133
+ const loose = body && typeof body === "object" ? { ...body } : body;
134
+ if (loose &&
135
+ typeof loose === "object" &&
136
+ !("max_tokens" in loose)) {
137
+ loose.max_tokens = 1;
138
+ }
139
+ parsed = extractAnthropicMessagesInput(loose);
140
+ }
141
+ catch {
142
+ sendAnthropicError(res, 400, "Invalid request body.");
143
+ return;
144
+ }
145
+ const estimate = estimateAnthropicRequestTokens(parsed);
146
+ const payload = JSON.stringify(estimate);
147
+ res.writeHead(200, {
148
+ "content-type": "application/json; charset=utf-8",
149
+ "content-length": Buffer.byteLength(payload).toString(),
150
+ "x-offrouter-estimated": "true",
151
+ });
152
+ res.end(payload);
153
+ }
154
+ async function handleMessages(req, res, context, deps, parsed) {
155
+ const selected = selectCandidatesForAnthropicModel(parsed.model, context.candidates);
156
+ const route = buildAnthropicRouteRequest({
157
+ prompt: parsed.prompt,
158
+ harness: deps.harness,
159
+ workspace: deps.workspace,
160
+ requiresImages: parsed.hasImages || undefined,
161
+ requiresTools: parsed.hasTools || undefined,
162
+ });
163
+ // Images: structured 400 when no candidate advertises supportsImages.
164
+ if (parsed.hasImages) {
165
+ const anySupports = selected.candidates.some((c) => c.supportsImages);
166
+ if (!anySupports) {
167
+ sendAnthropicError(res, 400, "Image content requires a candidate with supportsImages; none of the routed candidates support images.");
168
+ return;
169
+ }
170
+ }
171
+ // Classification feeds family rules and the within-tier family bump at the
172
+ // gate. LLM-judge problems fall back to the heuristic silently — they must
173
+ // never block or fail the proxied request. Rules match on family only here;
174
+ // proxies expose no role surface.
175
+ const { classification } = await classifyProxyPrompt(parsed.prompt, {
176
+ policy: context.policy,
177
+ candidates: selected.candidates,
178
+ adapters: context.adapters,
179
+ });
180
+ // Gate once with the filtered candidate set so policy sees the same pool.
181
+ const decision = routeRequest(route, selected.candidates, context.policy, {
182
+ healthTracker: context.healthTracker,
183
+ classification,
184
+ rules: context.rules,
185
+ });
186
+ if (decision.blocked || !decision.route) {
187
+ const status = policyDecisionToHttpStatus(decision);
188
+ const message = decision.explanation || decision.reason || "routing blocked by policy";
189
+ sendAnthropicError(res, status, message);
190
+ return;
191
+ }
192
+ // Belt-and-suspenders: if the winner somehow lacks image support, 400.
193
+ if (parsed.hasImages) {
194
+ const winner = selected.candidates.find((c) => c.providerId === decision.route.provider &&
195
+ c.modelId === decision.route.model);
196
+ if (winner && winner.supportsImages !== true) {
197
+ sendAnthropicError(res, 400, `Image content requires a candidate with supportsImages; selected ${decision.route.provider}:${decision.route.model} does not support images.`);
198
+ return;
199
+ }
200
+ }
201
+ const wantStream = parsed.stream === true;
202
+ const ordered = orderCandidatesForFailover(selected.candidates, decision, context);
203
+ let settled = false;
204
+ const onClose = () => {
205
+ if (!settled && !res.writableEnded) {
206
+ // Best-effort cancel of any active task; failover tasks use distinct ids.
207
+ }
208
+ };
209
+ res.on("close", onClose);
210
+ req.on("close", onClose);
211
+ try {
212
+ await invokeWithFailover({
213
+ context,
214
+ res,
215
+ deps,
216
+ parsed,
217
+ route,
218
+ ordered,
219
+ wantStream,
220
+ markSettled: () => {
221
+ settled = true;
222
+ },
223
+ });
224
+ }
225
+ catch (err) {
226
+ if (!res.headersSent) {
227
+ sendAnthropicError(res, 500, errorMessage(err));
228
+ return;
229
+ }
230
+ safeEnd(res);
231
+ }
232
+ finally {
233
+ settled = true;
234
+ res.off("close", onClose);
235
+ req.off("close", onClose);
236
+ }
237
+ }
238
+ /**
239
+ * Rank candidates for pre-first-byte failover: primary first from decision,
240
+ * then remaining same-filter candidates in router order via health/policy.
241
+ */
242
+ function orderCandidatesForFailover(pool, decision, context) {
243
+ if (!decision.route)
244
+ return [...pool];
245
+ // Re-run routeRequest is already done; rebuild ordered list from fallbackChain
246
+ // when present, else primary + rest.
247
+ const chain = decision.fallbackChain ?? [];
248
+ const ordered = [];
249
+ const seen = new Set();
250
+ const push = (providerId, modelId) => {
251
+ const key = `${providerId}:${modelId}`;
252
+ if (seen.has(key))
253
+ return;
254
+ const c = pool.find((x) => x.providerId === providerId && x.modelId === modelId);
255
+ if (c) {
256
+ seen.add(key);
257
+ ordered.push(c);
258
+ }
259
+ };
260
+ push(decision.route.provider, decision.route.model);
261
+ for (const entry of chain) {
262
+ push(entry.provider, entry.model);
263
+ }
264
+ for (const c of pool) {
265
+ push(c.providerId, c.modelId);
266
+ }
267
+ // Drop candidates the runtime has no adapter for.
268
+ return ordered.filter((c) => context.adapters[c.providerId] !== undefined);
269
+ }
270
+ async function invokeWithFailover(args) {
271
+ const { context, res, parsed, route, ordered, wantStream, markSettled } = args;
272
+ if (ordered.length === 0) {
273
+ sendAnthropicError(res, 503, "No provider adapter available for routing.");
274
+ markSettled();
275
+ return;
276
+ }
277
+ let lastError;
278
+ for (let i = 0; i < ordered.length; i++) {
279
+ const candidate = ordered[i];
280
+ const isLast = i === ordered.length - 1;
281
+ // Per-attempt runtime scoped to this single candidate so routeRequest
282
+ // cannot pick a different one; health outcomes still go to shared tracker.
283
+ const attemptRuntime = new DelegationRuntime({
284
+ adapters: context.adapters,
285
+ candidates: [candidate],
286
+ policy: context.policy,
287
+ healthTracker: context.healthTracker,
288
+ usageStore: context.usageStore,
289
+ });
290
+ const delegation = buildAnthropicDelegationRequest({
291
+ prompt: parsed.prompt,
292
+ route: {
293
+ ...route,
294
+ requestId: `${route.requestId}_try${i}_${randomBytes(4).toString("hex")}`,
295
+ },
296
+ maxOutputTokens: parsed.maxTokens,
297
+ temperature: parsed.temperature,
298
+ model: candidate.modelId,
299
+ providerId: candidate.providerId,
300
+ taskId: `task_anthropic_${randomBytes(8).toString("hex")}`,
301
+ });
302
+ const outcome = await attemptCandidate({
303
+ runtime: attemptRuntime,
304
+ delegation,
305
+ res,
306
+ parsed,
307
+ candidate,
308
+ wantStream,
309
+ // Can only failover before any byte was flushed.
310
+ allowFailover: !res.headersSent && !isLast,
311
+ });
312
+ if (outcome.kind === "ok") {
313
+ markSettled();
314
+ return;
315
+ }
316
+ if (outcome.kind === "mid_stream_error") {
317
+ // Error event already written; do not failover.
318
+ markSettled();
319
+ return;
320
+ }
321
+ // Pre-first-byte failure.
322
+ lastError = outcome.error;
323
+ const retryable = isRetryableProviderFailure(outcome.error.code);
324
+ if (!retryable || isLast || res.headersSent) {
325
+ sendAnthropicError(res, outcome.error.status, outcome.error.message);
326
+ markSettled();
327
+ return;
328
+ }
329
+ // else: continue to next candidate; health already recorded by runtime.
330
+ }
331
+ if (lastError) {
332
+ sendAnthropicError(res, lastError.status, lastError.message);
333
+ }
334
+ else {
335
+ sendAnthropicError(res, 500, "No candidate succeeded.");
336
+ }
337
+ markSettled();
338
+ }
339
+ async function attemptCandidate(args) {
340
+ const { runtime, delegation, res, parsed, candidate, wantStream } = args;
341
+ const builder = new AnthropicSseBuilder(candidate.modelId || parsed.model || "");
342
+ let headersSent = false;
343
+ let sawText = false;
344
+ const writeSse = (event, payload) => {
345
+ safeWrite(res, anthropicSseEvent(event, payload));
346
+ };
347
+ const ensureStreamHeaders = () => {
348
+ if (headersSent)
349
+ return;
350
+ headersSent = true;
351
+ res.writeHead(200, SSE_HEADERS);
352
+ // Optional ping first so clients see activity immediately.
353
+ writeSse("ping", builder.pingEvent());
354
+ writeSse("message_start", builder.messageStartEvent());
355
+ };
356
+ const openTextBlockIfNeeded = () => {
357
+ if (builder.isTextBlockOpen)
358
+ return;
359
+ writeSse("content_block_start", builder.contentBlockStartEvent());
360
+ };
361
+ const finalizeStream = (aborted = false) => {
362
+ if (res.writableEnded || res.destroyed)
363
+ return;
364
+ if (!aborted) {
365
+ if (builder.isTextBlockOpen || sawText) {
366
+ if (!builder.isTextBlockOpen)
367
+ openTextBlockIfNeeded();
368
+ writeSse("content_block_stop", builder.contentBlockStopEvent());
369
+ }
370
+ writeSse("message_delta", builder.messageDeltaEvent());
371
+ writeSse("message_stop", builder.messageStopEvent());
372
+ }
373
+ safeEnd(res);
374
+ };
375
+ try {
376
+ const stream = runtime.stream(delegation);
377
+ // Do not return from inside the for-await on terminal events: DelegationRuntime
378
+ // records usage/health AFTER yielding done/error, so the consumer must call
379
+ // next() again (by continuing the loop) before abandoning the generator.
380
+ let outcome;
381
+ for await (const event of stream) {
382
+ if (outcome !== undefined) {
383
+ // Drain remaining generator work (post-yield hooks).
384
+ continue;
385
+ }
386
+ const mapped = handleDelegationEvent(event, builder);
387
+ if (mapped === "start") {
388
+ if (event.type === "start" && event.model) {
389
+ builder.setModel(event.model);
390
+ }
391
+ continue;
392
+ }
393
+ if (mapped === "text") {
394
+ if (!wantStream) {
395
+ // Accumulate only.
396
+ continue;
397
+ }
398
+ ensureStreamHeaders();
399
+ openTextBlockIfNeeded();
400
+ if (event.type === "text-delta") {
401
+ sawText = true;
402
+ writeSse("content_block_delta", builder.contentBlockDeltaEvent(event.text));
403
+ }
404
+ continue;
405
+ }
406
+ if (mapped === "usage") {
407
+ continue;
408
+ }
409
+ if (mapped === "done") {
410
+ if (wantStream) {
411
+ ensureStreamHeaders();
412
+ // Empty completions still get a valid envelope.
413
+ if (!builder.isTextBlockOpen && builder.fullText.length === 0) {
414
+ // No content blocks is legal; still emit message_delta/stop.
415
+ }
416
+ finalizeStream(false);
417
+ }
418
+ else {
419
+ sendNonStreamJson(res, builder);
420
+ }
421
+ outcome = { kind: "ok" };
422
+ continue;
423
+ }
424
+ if (mapped === "error") {
425
+ const message = event.type === "error" ? event.message : "provider error";
426
+ const code = event.type === "error" ? event.code : undefined;
427
+ const status = code !== undefined
428
+ ? providerErrorCodeToHttpStatus(code)
429
+ : 500;
430
+ if (!headersSent) {
431
+ outcome = {
432
+ kind: "pre_stream_error",
433
+ error: { message, code, status },
434
+ };
435
+ continue;
436
+ }
437
+ // Mid-stream: surface Anthropic error event, no silent truncation.
438
+ writeSse("error", anthropicStreamErrorEvent(message, status));
439
+ safeEnd(res);
440
+ outcome = { kind: "mid_stream_error" };
441
+ continue;
442
+ }
443
+ if (mapped === "cancelled") {
444
+ if (!headersSent) {
445
+ outcome = {
446
+ kind: "pre_stream_error",
447
+ error: {
448
+ message: "request cancelled",
449
+ code: "cancelled",
450
+ status: 499,
451
+ },
452
+ };
453
+ continue;
454
+ }
455
+ writeSse("error", anthropicStreamErrorEvent("request cancelled", 499));
456
+ safeEnd(res);
457
+ outcome = { kind: "mid_stream_error" };
458
+ continue;
459
+ }
460
+ }
461
+ if (outcome)
462
+ return outcome;
463
+ // Stream ended without explicit done.
464
+ if (wantStream) {
465
+ if (!headersSent) {
466
+ // No events at all — treat as empty success after opening.
467
+ ensureStreamHeaders();
468
+ }
469
+ finalizeStream(false);
470
+ }
471
+ else {
472
+ sendNonStreamJson(res, builder);
473
+ }
474
+ return { kind: "ok" };
475
+ }
476
+ catch (err) {
477
+ // DelegationPolicyError or unexpected throw before/during stream.
478
+ const message = errorMessage(err);
479
+ if (!headersSent) {
480
+ return {
481
+ kind: "pre_stream_error",
482
+ error: { message, code: "policy_blocked", status: 403 },
483
+ };
484
+ }
485
+ writeSse("error", anthropicStreamErrorEvent(message, 500));
486
+ safeEnd(res);
487
+ return { kind: "mid_stream_error" };
488
+ }
489
+ }
490
+ function handleDelegationEvent(event, builder) {
491
+ switch (event.type) {
492
+ case "start":
493
+ if (event.model)
494
+ builder.setModel(event.model);
495
+ return "start";
496
+ case "text-delta":
497
+ builder.addText(event.text);
498
+ return "text";
499
+ case "usage":
500
+ builder.setUsage({
501
+ inputTokens: event.inputTokens,
502
+ outputTokens: event.outputTokens,
503
+ totalTokens: event.totalTokens,
504
+ });
505
+ return "usage";
506
+ case "done": {
507
+ // Map finish reasons loosely.
508
+ const fr = event.finishReason;
509
+ if (fr === "max_tokens" || fr === "length") {
510
+ builder.setStopReason("max_tokens");
511
+ }
512
+ else if (fr === "tool_use") {
513
+ builder.setStopReason("tool_use");
514
+ }
515
+ else {
516
+ builder.setStopReason("end_turn");
517
+ }
518
+ return "done";
519
+ }
520
+ case "error":
521
+ return "error";
522
+ case "cancelled":
523
+ return "cancelled";
524
+ default:
525
+ return "other";
526
+ }
527
+ }
528
+ function sendNonStreamJson(res, builder) {
529
+ if (res.writableEnded || res.destroyed)
530
+ return;
531
+ const body = JSON.stringify(builder.messageObject());
532
+ res.writeHead(200, {
533
+ "content-type": "application/json; charset=utf-8",
534
+ "content-length": Buffer.byteLength(body).toString(),
535
+ });
536
+ res.end(body);
537
+ }
538
+ function authorize(req, token) {
539
+ if (token === undefined)
540
+ return true; // dev loopback mode
541
+ const candidates = [];
542
+ const xApiKey = req.headers["x-api-key"];
543
+ if (typeof xApiKey === "string")
544
+ candidates.push(xApiKey);
545
+ else if (Array.isArray(xApiKey) && typeof xApiKey[0] === "string") {
546
+ candidates.push(xApiKey[0]);
547
+ }
548
+ const auth = req.headers["authorization"];
549
+ if (typeof auth === "string") {
550
+ const trimmed = auth.trim();
551
+ if (trimmed.toLowerCase().startsWith("bearer ")) {
552
+ candidates.push(trimmed.slice(7).trim());
553
+ }
554
+ else {
555
+ candidates.push(trimmed);
556
+ }
557
+ }
558
+ return candidates.some((value) => safeEqual(value, token));
559
+ }
560
+ function safeEqual(a, b) {
561
+ const da = createHash("sha256").update(a, "utf8").digest();
562
+ const db = createHash("sha256").update(b, "utf8").digest();
563
+ return timingSafeEqual(da, db);
564
+ }
565
+ async function readBody(req) {
566
+ const chunks = [];
567
+ for await (const chunk of req) {
568
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
569
+ }
570
+ const text = Buffer.concat(chunks).toString("utf8").trim();
571
+ if (text.length === 0)
572
+ return {};
573
+ try {
574
+ return JSON.parse(text);
575
+ }
576
+ catch {
577
+ throw new Error("request body is not valid JSON");
578
+ }
579
+ }
580
+ function sendAnthropicError(res, status, message) {
581
+ if (res.headersSent) {
582
+ safeEnd(res);
583
+ return;
584
+ }
585
+ const payload = anthropicErrorPayload(status, message);
586
+ const body = JSON.stringify(payload);
587
+ res.writeHead(status, {
588
+ "content-type": "application/json; charset=utf-8",
589
+ "content-length": Buffer.byteLength(body).toString(),
590
+ });
591
+ res.end(body);
592
+ }
593
+ function safeWrite(res, chunk) {
594
+ if (res.writableEnded || res.destroyed)
595
+ return;
596
+ res.write(chunk);
597
+ }
598
+ function safeEnd(res) {
599
+ if (res.writableEnded || res.destroyed)
600
+ return;
601
+ res.end();
602
+ }
603
+ function errorMessage(err) {
604
+ return err instanceof Error ? err.message : String(err);
605
+ }
606
+ //# sourceMappingURL=anthropic-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-server.js","sourceRoot":"","sources":["../../src/proxy/anthropic-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { PolicyConfig } from "../policy.js";
2
+ import type { ProviderAdapter } from "../providers/adapter.js";
3
+ import { type JudgeResult } from "../llm-judge.js";
4
+ import type { ProviderCandidate } from "../types.js";
5
+ export interface ProxyClassificationDeps {
6
+ policy: PolicyConfig;
7
+ /** Candidate pool the gating routeRequest sees; the judge picks among these. */
8
+ candidates: ProviderCandidate[];
9
+ adapters: Record<string, ProviderAdapter>;
10
+ }
11
+ /**
12
+ * Classify a proxied request from its parsed prompt text. Uses the same input
13
+ * shape as the delegation path (full prompt as preview + explicit length);
14
+ * only family/confidence/signals ever leave this boundary — never prompt text.
15
+ */
16
+ export declare function classifyProxyPrompt(prompt: string, deps: ProxyClassificationDeps): Promise<JudgeResult>;
17
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/proxy/classify.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,YAAY,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,WAAW,CAAC,CAgBtB"}