offrouter-core 0.5.1 → 0.7.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 +37 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +171 -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,539 @@
1
+ /**
2
+ * Anthropic Messages <-> OffRouter translation for the local Anthropic proxy.
3
+ *
4
+ * Inbound: parse Messages API bodies (system, multi-turn, tools, images) into
5
+ * route + delegation inputs without leaking the client's API key (or full
6
+ * prompt) along the routing path.
7
+ *
8
+ * Outbound: turn OffRouter provider/delegation events into the Anthropic
9
+ * Messages SSE sequence (message_start … message_stop, plus ping) and map
10
+ * policy/provider errors to Anthropic-format JSON error bodies.
11
+ *
12
+ * Model-id mapping lives in one exported table: exact claude-* match first,
13
+ * then opus/fable/sonnet → frontier-coder and haiku → fast-coder.
14
+ */
15
+ import { createHash, randomBytes } from "node:crypto";
16
+ import { DelegationRuntime, } from "../delegation.js";
17
+ import { buildDelegationRequest, buildRouteRequest, policyDecisionToHttpStatus, promptDigest, promptPreview, providerErrorCodeToHttpStatus, } from "./responses-mapper.js";
18
+ import { z } from "zod";
19
+ /** Max chars kept for the routing-only prompt preview. */
20
+ export const ANTHROPIC_PROMPT_PREVIEW_CHARS = 120;
21
+ // ---------------------------------------------------------------------------
22
+ // Model-id mapping table (single source of truth)
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Maps inbound Claude model id patterns onto OffRouter logical families.
26
+ * Exact candidate `modelId` match always wins before family fallback.
27
+ * Order matters for first-match on the regex column.
28
+ */
29
+ export const ANTHROPIC_MODEL_FAMILY_MAP = [
30
+ {
31
+ pattern: /opus|fable/i,
32
+ family: "frontier-coder",
33
+ note: "opus/fable → frontier-coder",
34
+ },
35
+ {
36
+ pattern: /haiku/i,
37
+ family: "fast-coder",
38
+ note: "haiku → fast-coder",
39
+ },
40
+ {
41
+ pattern: /sonnet/i,
42
+ family: "frontier-coder",
43
+ note: "sonnet → frontier-coder",
44
+ },
45
+ {
46
+ // Any remaining claude-* id defaults to frontier-coder.
47
+ pattern: /^claude/i,
48
+ family: "frontier-coder",
49
+ note: "claude-* default → frontier-coder",
50
+ },
51
+ ];
52
+ /** Resolve the logical family for an inbound Anthropic model id. */
53
+ export function mapAnthropicModelToFamily(modelId) {
54
+ if (!modelId)
55
+ return undefined;
56
+ for (const entry of ANTHROPIC_MODEL_FAMILY_MAP) {
57
+ if (entry.pattern.test(modelId))
58
+ return entry.family;
59
+ }
60
+ return undefined;
61
+ }
62
+ /**
63
+ * Select the candidate pool for an inbound Anthropic `model` id.
64
+ * Prefer exact `modelId` matches (subscription first via normal ranking);
65
+ * otherwise filter to the mapped family. Returns the original list when no
66
+ * filter applies so routing can still surface needsConfiguration.
67
+ */
68
+ export function selectCandidatesForAnthropicModel(modelId, candidates) {
69
+ const family = mapAnthropicModelToFamily(modelId);
70
+ if (modelId) {
71
+ const exact = candidates.filter((c) => c.modelId === modelId);
72
+ if (exact.length > 0) {
73
+ // Exact matches lead, but same-family candidates stay in the pool so
74
+ // failover can cross models (and tiers) instead of surfacing an
75
+ // upstream limit error when every exact match is exhausted.
76
+ const sameFamily = family
77
+ ? candidates.filter((c) => c.family === family && c.modelId !== modelId)
78
+ : [];
79
+ return {
80
+ candidates: [...exact, ...sameFamily],
81
+ match: "exact",
82
+ family,
83
+ };
84
+ }
85
+ }
86
+ if (family) {
87
+ const byFamily = candidates.filter((c) => c.family === family);
88
+ if (byFamily.length > 0) {
89
+ return { candidates: [...byFamily], match: "family", family };
90
+ }
91
+ }
92
+ return { candidates: [...candidates], match: "all", family };
93
+ }
94
+ // ---------------------------------------------------------------------------
95
+ // Inbound schema
96
+ // ---------------------------------------------------------------------------
97
+ export class InvalidAnthropicProxyRequestError extends Error {
98
+ issues;
99
+ constructor(issues) {
100
+ super("Invalid request body.");
101
+ this.name = "InvalidAnthropicProxyRequestError";
102
+ this.issues = issues;
103
+ }
104
+ }
105
+ const ImageSourceSchema = z.object({
106
+ type: z.string(),
107
+ media_type: z.string().optional(),
108
+ data: z.string().optional(),
109
+ url: z.string().optional(),
110
+ });
111
+ // Flat content-block schema: tool_result nested content is accepted as
112
+ // unknown and re-normalized in extractAnthropicMessagesInput. Avoids a
113
+ // circular z.lazy inference problem under strict TypeScript.
114
+ const ContentBlockSchema = z.object({
115
+ type: z.string(),
116
+ text: z.string().optional(),
117
+ source: ImageSourceSchema.optional(),
118
+ id: z.string().optional(),
119
+ name: z.string().optional(),
120
+ input: z.unknown().optional(),
121
+ tool_use_id: z.string().optional(),
122
+ content: z.unknown().optional(),
123
+ is_error: z.boolean().optional(),
124
+ });
125
+ const MessageSchema = z.object({
126
+ role: z.enum(["user", "assistant"]),
127
+ content: z.union([z.string(), z.array(ContentBlockSchema)]),
128
+ });
129
+ const ToolSchema = z.object({
130
+ name: z.string(),
131
+ description: z.string().optional(),
132
+ input_schema: z.unknown().optional(),
133
+ });
134
+ /**
135
+ * Anthropic Messages request body. Unknown top-level keys are stripped for
136
+ * forward-compat with Claude Code; structurally invalid values still 400.
137
+ */
138
+ export const AnthropicMessagesRequestSchema = z.object({
139
+ model: z.string().optional(),
140
+ messages: z.array(MessageSchema).min(1),
141
+ system: z
142
+ .union([
143
+ z.string(),
144
+ z.array(z.object({
145
+ type: z.string().optional(),
146
+ text: z.string().optional(),
147
+ })),
148
+ ])
149
+ .optional(),
150
+ max_tokens: z.number().int().positive(),
151
+ stream: z.boolean().optional(),
152
+ temperature: z.number().optional(),
153
+ stop_sequences: z.array(z.string()).optional(),
154
+ top_p: z.number().optional(),
155
+ top_k: z.number().int().optional(),
156
+ tools: z.array(ToolSchema).optional(),
157
+ tool_choice: z.unknown().optional(),
158
+ metadata: z.unknown().optional(),
159
+ });
160
+ function normalizeContent(content) {
161
+ if (typeof content === "string") {
162
+ return content.length > 0 ? [{ type: "text", text: content }] : [];
163
+ }
164
+ return content.map((block) => {
165
+ const out = { type: block.type };
166
+ if (block.text !== undefined)
167
+ out.text = block.text;
168
+ if (block.source !== undefined)
169
+ out.source = block.source;
170
+ if (block.id !== undefined)
171
+ out.id = block.id;
172
+ if (block.name !== undefined)
173
+ out.name = block.name;
174
+ if (block.input !== undefined)
175
+ out.input = block.input;
176
+ if (block.tool_use_id !== undefined)
177
+ out.tool_use_id = block.tool_use_id;
178
+ if (block.content !== undefined) {
179
+ if (typeof block.content === "string") {
180
+ out.content = block.content;
181
+ }
182
+ else if (Array.isArray(block.content)) {
183
+ out.content = normalizeContent(block.content);
184
+ }
185
+ }
186
+ if (block.is_error !== undefined)
187
+ out.is_error = block.is_error;
188
+ return out;
189
+ });
190
+ }
191
+ function systemToString(system) {
192
+ if (system === undefined)
193
+ return undefined;
194
+ if (typeof system === "string")
195
+ return system;
196
+ const parts = system
197
+ .map((block) => (typeof block.text === "string" ? block.text : ""))
198
+ .filter((t) => t.length > 0);
199
+ return parts.length > 0 ? parts.join("\n") : undefined;
200
+ }
201
+ function blockToPromptText(block) {
202
+ switch (block.type) {
203
+ case "text":
204
+ return block.text ?? "";
205
+ case "tool_use":
206
+ return `[tool_use name=${block.name ?? ""} id=${block.id ?? ""} input=${JSON.stringify(block.input ?? {})}]`;
207
+ case "tool_result": {
208
+ const inner = typeof block.content === "string"
209
+ ? block.content
210
+ : Array.isArray(block.content)
211
+ ? block.content.map(blockToPromptText).join("")
212
+ : "";
213
+ return `[tool_result id=${block.tool_use_id ?? ""}${block.is_error ? " error" : ""}]${inner}`;
214
+ }
215
+ case "image":
216
+ return "[image]";
217
+ default:
218
+ if (typeof block.text === "string")
219
+ return block.text;
220
+ return "";
221
+ }
222
+ }
223
+ function contentHasImages(blocks) {
224
+ return blocks.some((b) => b.type === "image");
225
+ }
226
+ /**
227
+ * Parse and validate an Anthropic Messages request body.
228
+ * Throws {@link InvalidAnthropicProxyRequestError} on schema violations.
229
+ */
230
+ export function extractAnthropicMessagesInput(body) {
231
+ const result = AnthropicMessagesRequestSchema.safeParse(body);
232
+ if (!result.success) {
233
+ throw new InvalidAnthropicProxyRequestError(result.error.issues);
234
+ }
235
+ const data = result.data;
236
+ const system = systemToString(data.system);
237
+ const messages = data.messages.map((m) => ({
238
+ role: m.role,
239
+ content: normalizeContent(m.content),
240
+ }));
241
+ const hasImages = messages.some((m) => contentHasImages(m.content));
242
+ const hasTools = (data.tools?.length ?? 0) > 0;
243
+ const parts = [];
244
+ if (system)
245
+ parts.push(system);
246
+ for (const message of messages) {
247
+ const text = message.content.map(blockToPromptText).join("");
248
+ if (text.length > 0) {
249
+ parts.push(`${message.role}: ${text}`);
250
+ }
251
+ }
252
+ if (hasTools && data.tools) {
253
+ parts.push(`tools: ${data.tools.map((t) => t.name).filter(Boolean).join(",")}`);
254
+ }
255
+ return {
256
+ prompt: parts.join("\n\n").trim(),
257
+ model: data.model,
258
+ maxTokens: data.max_tokens,
259
+ temperature: data.temperature,
260
+ stream: data.stream,
261
+ stopSequences: data.stop_sequences,
262
+ system,
263
+ messages,
264
+ tools: data.tools,
265
+ hasImages,
266
+ hasTools,
267
+ };
268
+ }
269
+ /** Count-tokens body accepts the same shape, but max_tokens is optional. */
270
+ export const AnthropicCountTokensRequestSchema = AnthropicMessagesRequestSchema.extend({
271
+ max_tokens: z.number().int().positive().optional(),
272
+ }).partial({ max_tokens: true }).extend({
273
+ messages: z.array(MessageSchema).min(1),
274
+ });
275
+ /**
276
+ * Heuristic token estimate used by /v1/messages/count_tokens.
277
+ * Mirrors the Anthropic adapter's ~4 chars/token estimate.
278
+ */
279
+ export function estimateAnthropicTokens(text) {
280
+ if (text.length === 0)
281
+ return 0;
282
+ return Math.max(1, Math.ceil(text.length / 4));
283
+ }
284
+ export function estimateAnthropicRequestTokens(parsed) {
285
+ // Prefer the already-flattened prompt (includes system + turns + tools).
286
+ const input_tokens = estimateAnthropicTokens(parsed.prompt);
287
+ return { input_tokens };
288
+ }
289
+ // ---------------------------------------------------------------------------
290
+ // Provider-facing message projection
291
+ // ---------------------------------------------------------------------------
292
+ /**
293
+ * Project Anthropic messages into the ProviderInvokeMessage shape.
294
+ * Structured tool/image blocks are serialized; images go through only after
295
+ * the server has confirmed the candidate supports them.
296
+ */
297
+ export function toProviderMessages(parsed) {
298
+ const out = [];
299
+ if (parsed.system) {
300
+ out.push({ role: "system", content: parsed.system });
301
+ }
302
+ for (const message of parsed.messages) {
303
+ // tool_result blocks ride as role=user content in Anthropic; keep text.
304
+ // Assistant tool_use is serialized into the content string.
305
+ const text = message.content.map(blockToPromptText).join("");
306
+ out.push({
307
+ role: message.role,
308
+ content: text,
309
+ });
310
+ }
311
+ return out;
312
+ }
313
+ // ---------------------------------------------------------------------------
314
+ // Route + delegation builders (reuse responses helpers)
315
+ // ---------------------------------------------------------------------------
316
+ export function buildAnthropicRouteRequest(input) {
317
+ const base = buildRouteRequest(input);
318
+ return {
319
+ ...base,
320
+ task: {
321
+ ...base.task,
322
+ requiresImages: input.requiresImages,
323
+ requiresTools: input.requiresTools,
324
+ },
325
+ };
326
+ }
327
+ export function buildAnthropicDelegationRequest(input) {
328
+ const base = buildDelegationRequest(input);
329
+ return {
330
+ ...base,
331
+ model: input.model,
332
+ providerId: input.providerId,
333
+ maxOutputTokens: input.maxOutputTokens,
334
+ };
335
+ }
336
+ function newPrefixId(prefix) {
337
+ return `${prefix}_${randomBytes(12).toString("hex")}`;
338
+ }
339
+ /**
340
+ * Stateful builder for the Anthropic Messages SSE event sequence:
341
+ * message_start → content_block_start → content_block_delta* →
342
+ * content_block_stop → message_delta → message_stop (+ optional ping).
343
+ */
344
+ export class AnthropicSseBuilder {
345
+ messageId;
346
+ model;
347
+ text = "";
348
+ inputTokens = 0;
349
+ outputTokens = 0;
350
+ stopReason = "end_turn";
351
+ stopSequence = null;
352
+ textBlockIndex = 0;
353
+ textBlockOpened = false;
354
+ constructor(model) {
355
+ this.model = model;
356
+ this.messageId = newPrefixId("msg");
357
+ }
358
+ setModel(model) {
359
+ this.model = model;
360
+ }
361
+ addText(delta) {
362
+ this.text += delta;
363
+ }
364
+ setUsage(usage) {
365
+ if (usage.inputTokens !== undefined)
366
+ this.inputTokens = usage.inputTokens;
367
+ if (usage.outputTokens !== undefined) {
368
+ this.outputTokens = usage.outputTokens;
369
+ }
370
+ else if (usage.totalTokens !== undefined &&
371
+ usage.inputTokens !== undefined) {
372
+ this.outputTokens = Math.max(0, usage.totalTokens - usage.inputTokens);
373
+ }
374
+ }
375
+ setStopReason(reason, stopSequence) {
376
+ this.stopReason = reason;
377
+ if (stopSequence !== undefined)
378
+ this.stopSequence = stopSequence;
379
+ }
380
+ get fullText() {
381
+ return this.text;
382
+ }
383
+ /** Emit a keep-alive ping event (Claude clients tolerate these). */
384
+ pingEvent() {
385
+ return { type: "ping" };
386
+ }
387
+ messageStartEvent() {
388
+ return {
389
+ type: "message_start",
390
+ message: {
391
+ id: this.messageId,
392
+ type: "message",
393
+ role: "assistant",
394
+ content: [],
395
+ model: this.model,
396
+ stop_reason: null,
397
+ stop_sequence: null,
398
+ usage: { input_tokens: this.inputTokens, output_tokens: 0 },
399
+ },
400
+ };
401
+ }
402
+ contentBlockStartEvent(index = this.textBlockIndex) {
403
+ this.textBlockOpened = true;
404
+ return {
405
+ type: "content_block_start",
406
+ index,
407
+ content_block: { type: "text", text: "" },
408
+ };
409
+ }
410
+ contentBlockDeltaEvent(delta, index = this.textBlockIndex) {
411
+ return {
412
+ type: "content_block_delta",
413
+ index,
414
+ delta: { type: "text_delta", text: delta },
415
+ };
416
+ }
417
+ contentBlockStopEvent(index = this.textBlockIndex) {
418
+ return { type: "content_block_stop", index };
419
+ }
420
+ messageDeltaEvent() {
421
+ return {
422
+ type: "message_delta",
423
+ delta: {
424
+ stop_reason: this.stopReason,
425
+ stop_sequence: this.stopSequence,
426
+ },
427
+ usage: { output_tokens: this.outputTokens },
428
+ };
429
+ }
430
+ messageStopEvent() {
431
+ return { type: "message_stop" };
432
+ }
433
+ /** Final non-streaming Messages object. */
434
+ messageObject() {
435
+ return {
436
+ id: this.messageId,
437
+ type: "message",
438
+ role: "assistant",
439
+ content: this.text.length > 0 ? [{ type: "text", text: this.text }] : [],
440
+ model: this.model,
441
+ stop_reason: this.stopReason ?? "end_turn",
442
+ stop_sequence: this.stopSequence,
443
+ usage: {
444
+ input_tokens: this.inputTokens,
445
+ output_tokens: this.outputTokens,
446
+ },
447
+ };
448
+ }
449
+ get isTextBlockOpen() {
450
+ return this.textBlockOpened;
451
+ }
452
+ }
453
+ /** Wrap payload as Anthropic SSE (`event:` + `data:`). */
454
+ export function anthropicSseEvent(event, payload) {
455
+ return `event: ${event}\ndata: ${JSON.stringify(payload)}\n\n`;
456
+ }
457
+ export function anthropicErrorTypeForStatus(status) {
458
+ switch (status) {
459
+ case 400:
460
+ return "invalid_request_error";
461
+ case 401:
462
+ return "authentication_error";
463
+ case 403:
464
+ return "permission_error";
465
+ case 404:
466
+ return "not_found_error";
467
+ case 413:
468
+ return "request_too_large";
469
+ case 429:
470
+ return "rate_limit_error";
471
+ case 529:
472
+ return "overloaded_error";
473
+ default:
474
+ return status >= 500 ? "api_error" : "invalid_request_error";
475
+ }
476
+ }
477
+ export function anthropicErrorPayload(status, message) {
478
+ return {
479
+ type: "error",
480
+ error: {
481
+ type: anthropicErrorTypeForStatus(status),
482
+ message,
483
+ },
484
+ };
485
+ }
486
+ /** Mid-stream Anthropic error event payload. */
487
+ export function anthropicStreamErrorEvent(message, status = 500) {
488
+ return {
489
+ type: "error",
490
+ error: {
491
+ type: anthropicErrorTypeForStatus(status),
492
+ message,
493
+ },
494
+ };
495
+ }
496
+ export { policyDecisionToHttpStatus, providerErrorCodeToHttpStatus, promptDigest, promptPreview, };
497
+ export function isRetryableProviderFailure(code) {
498
+ if (!code)
499
+ return false;
500
+ return (code === "rate_limited" ||
501
+ code === "quota_exhausted" ||
502
+ code === "timeout" ||
503
+ code === "overload" ||
504
+ code === "network" ||
505
+ code === "stream_interrupted");
506
+ }
507
+ export function authTierOf(decision) {
508
+ return decision.route?.authTier;
509
+ }
510
+ export function createAnthropicProxyContext(options) {
511
+ const policy = {
512
+ ...options.policy,
513
+ currentSpendByProviderUsd: options.currentSpendByProviderUsd ??
514
+ options.policy.currentSpendByProviderUsd,
515
+ };
516
+ const runtime = new DelegationRuntime({
517
+ adapters: options.adapters,
518
+ candidates: options.candidates,
519
+ policy,
520
+ healthTracker: options.healthTracker,
521
+ usageStore: options.usageStore,
522
+ routingRules: options.rules,
523
+ ...options.delegation,
524
+ });
525
+ return {
526
+ policy,
527
+ candidates: [...options.candidates],
528
+ adapters: { ...options.adapters },
529
+ runtime,
530
+ healthTracker: options.healthTracker,
531
+ usageStore: options.usageStore,
532
+ rules: options.rules ? [...options.rules] : undefined,
533
+ };
534
+ }
535
+ /** Stable sha256 of a value (used only for tests / diagnostics). */
536
+ export function sha256Hex(text) {
537
+ return createHash("sha256").update(text, "utf8").digest("hex");
538
+ }
539
+ //# sourceMappingURL=anthropic-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-mapper.js","sourceRoot":"","sources":["../../src/proxy/anthropic-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { HarnessRef, WorkspaceRef } from "../types.js";
2
+ import { type AnthropicProxyContext } from "./anthropic-mapper.js";
3
+ export interface AnthropicProxyOptions {
4
+ /** TCP port; default 8787, 0 = ephemeral. */
5
+ port?: number;
6
+ /** Bind host; default 127.0.0.1 (loopback only). */
7
+ host?: string;
8
+ /** Shared proxy token; checked via x-api-key or Authorization. */
9
+ token?: string;
10
+ harness?: HarnessRef;
11
+ workspace?: WorkspaceRef;
12
+ now?: () => Date;
13
+ warn?: (message: string) => void;
14
+ }
15
+ export interface AnthropicProxyHandle {
16
+ readonly port: number;
17
+ readonly host: string;
18
+ close(): Promise<void>;
19
+ }
20
+ /**
21
+ * Start the Anthropic Messages proxy and resolve once listening.
22
+ */
23
+ export declare function startAnthropicProxy(context: AnthropicProxyContext, options?: AnthropicProxyOptions): Promise<AnthropicProxyHandle>;
24
+ //# sourceMappingURL=anthropic-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-server.d.ts","sourceRoot":"","sources":["../../src/proxy/anthropic-server.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,UAAU,EAIV,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAcL,KAAK,qBAAqB,EAE3B,MAAM,uBAAuB,CAAC;AAa/B,MAAM,WAAW,qBAAqB;IACpC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAkD/B"}