neoctl 0.2.53 → 0.2.55

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 (81) hide show
  1. package/README.md +0 -1
  2. package/dist/agents/agent-activity.js +1 -1
  3. package/dist/agents/agent-activity.js.map +1 -1
  4. package/dist/agents/agent-tool.js +4 -4
  5. package/dist/agents/agent-tool.js.map +1 -1
  6. package/dist/core/context-metrics.js +2 -1
  7. package/dist/core/context-metrics.js.map +1 -1
  8. package/dist/core/query-engine.d.ts +13 -0
  9. package/dist/core/query-engine.js +98 -18
  10. package/dist/core/query-engine.js.map +1 -1
  11. package/dist/core/query.d.ts +1 -0
  12. package/dist/core/query.js +10 -1
  13. package/dist/core/query.js.map +1 -1
  14. package/dist/core/run-agent.js +45 -36
  15. package/dist/core/run-agent.js.map +1 -1
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.js +2 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/model/agent-settings-boundary.d.ts +11 -0
  20. package/dist/model/agent-settings-boundary.js +53 -0
  21. package/dist/model/agent-settings-boundary.js.map +1 -0
  22. package/dist/model/anthropic-adapter.d.ts +24 -0
  23. package/dist/model/anthropic-adapter.js +106 -0
  24. package/dist/model/anthropic-adapter.js.map +1 -0
  25. package/dist/model/anthropic-mapper.d.ts +14 -0
  26. package/dist/model/anthropic-mapper.js +364 -0
  27. package/dist/model/anthropic-mapper.js.map +1 -0
  28. package/dist/model/composition-runtime.d.ts +31 -0
  29. package/dist/model/composition-runtime.js +31 -0
  30. package/dist/model/composition-runtime.js.map +1 -0
  31. package/dist/model/config.d.ts +10 -3
  32. package/dist/model/config.js +26 -10
  33. package/dist/model/config.js.map +1 -1
  34. package/dist/model/context-window.d.ts +16 -1
  35. package/dist/model/context-window.js +171 -5
  36. package/dist/model/context-window.js.map +1 -1
  37. package/dist/model/env.js +0 -1
  38. package/dist/model/env.js.map +1 -1
  39. package/dist/model/model-gateway.d.ts +4 -1
  40. package/dist/model/model-gateway.js +4 -0
  41. package/dist/model/model-gateway.js.map +1 -1
  42. package/dist/model/model-metadata.json +10 -3
  43. package/dist/model/openai-adapter.js +2 -1
  44. package/dist/model/openai-adapter.js.map +1 -1
  45. package/dist/model/provider-factory.js +28 -1
  46. package/dist/model/provider-factory.js.map +1 -1
  47. package/dist/model/settings-files.d.ts +3 -0
  48. package/dist/model/settings-files.js +43 -0
  49. package/dist/model/settings-files.js.map +1 -0
  50. package/dist/model/settings-store.d.ts +85 -0
  51. package/dist/model/settings-store.js +235 -0
  52. package/dist/model/settings-store.js.map +1 -0
  53. package/dist/model/settings-sync.d.ts +31 -0
  54. package/dist/model/settings-sync.js +81 -0
  55. package/dist/model/settings-sync.js.map +1 -0
  56. package/dist/repl/commands.d.ts +1 -1
  57. package/dist/repl/commands.js +3 -2
  58. package/dist/repl/commands.js.map +1 -1
  59. package/dist/repl/index.js +51 -25
  60. package/dist/repl/index.js.map +1 -1
  61. package/dist/session/session-store.d.ts +11 -0
  62. package/dist/session/session-store.js +18 -1
  63. package/dist/session/session-store.js.map +1 -1
  64. package/dist/tasks/task-persistence.js +2 -1
  65. package/dist/tasks/task-persistence.js.map +1 -1
  66. package/dist/tools/builtins/image-generation-tool.js +2 -0
  67. package/dist/tools/builtins/image-generation-tool.js.map +1 -1
  68. package/dist/tools/builtins/search-providers.js +2 -0
  69. package/dist/tools/builtins/search-providers.js.map +1 -1
  70. package/dist/tools/builtins/search-tool.d.ts +2 -0
  71. package/dist/tools/builtins/search-tool.js +2 -2
  72. package/dist/tools/builtins/search-tool.js.map +1 -1
  73. package/dist/types/events.d.ts +1 -0
  74. package/dist/web/index.d.ts +9 -3
  75. package/dist/web/index.js +123 -32
  76. package/dist/web/index.js.map +1 -1
  77. package/dist/web/model-settings-api.d.ts +9 -0
  78. package/dist/web/model-settings-api.js +236 -0
  79. package/dist/web/model-settings-api.js.map +1 -0
  80. package/package.json +2 -2
  81. package/scripts/initialize-model-metadata.mjs +6 -0
@@ -0,0 +1,364 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createTextMessage } from "../types/messages.js";
3
+ import { splitSystemPromptPrefix } from "../context/prompts.js";
4
+ import { resolveImageBlockDataSync } from "../core/image-storage.js";
5
+ import { validateImageInput } from "../core/image-input.js";
6
+ import { ModelAPIError } from "./errors.js";
7
+ import { decodeSSE } from "./sse-decoder.js";
8
+ import { findModelMetadata } from "./context-window.js";
9
+ export function anthropicInvalid(message) {
10
+ throw new ModelAPIError({ provider: "anthropic", category: "invalid_request", message, retryable: false });
11
+ }
12
+ function protocolError(message) {
13
+ throw new ModelAPIError({ provider: "anthropic", category: "provider_bug", message, retryable: false });
14
+ }
15
+ function record(value) { return !!value && typeof value === "object" && !Array.isArray(value); }
16
+ function visibleFingerprint(blocks) {
17
+ return createHash("sha256").update(JSON.stringify(blocks.filter(b => b.type !== "thinking"))).digest("hex");
18
+ }
19
+ export function buildAnthropicRequest(request, options) {
20
+ const model = request.model ?? options.model;
21
+ const metadata = findModelMetadata(model);
22
+ const maxTokens = request.maxOutputTokens ?? options.defaultMaxOutputTokens ?? metadata?.maxOutputTokens ?? 64000;
23
+ if (!Number.isSafeInteger(maxTokens) || maxTokens <= 0)
24
+ anthropicInvalid("Claude max_tokens must be a positive integer");
25
+ if (metadata?.provider === "anthropic" && metadata.maxOutputTokens && maxTokens > metadata.maxOutputTokens)
26
+ anthropicInvalid(`max_tokens exceeds the configured limit for ${model}: ${metadata.maxOutputTokens}`);
27
+ const split = splitSystemPromptPrefix(request.instructions ?? request.systemPrompt ?? "");
28
+ const system = [split.stablePrefix, split.dynamicSuffix].filter(Boolean).map(text => ({ type: "text", text }));
29
+ const turns = [];
30
+ const uses = new Set(), results = new Set();
31
+ for (const m of request.messages)
32
+ for (const b of m.blocks) {
33
+ if (b.type === "tool_use")
34
+ uses.add(b.id);
35
+ if (b.type === "tool_result")
36
+ results.add(b.toolUseId);
37
+ }
38
+ const paired = new Set([...uses].filter(id => results.has(id)));
39
+ for (const message of request.messages) {
40
+ if (message.role === "progress" || message.role === "tombstone" || message.metadata?.displayOnly || message.metadata?.systemInit)
41
+ continue;
42
+ if (message.role === "system") {
43
+ for (const b of message.blocks)
44
+ if (b.type === "text" && b.text.trim())
45
+ system.push({ type: "text", text: b.text });
46
+ continue;
47
+ }
48
+ const role = message.role === "assistant" ? "assistant" : "user";
49
+ let content = [];
50
+ // Preserve the provider's signed/opaque blocks through neo's local thinking
51
+ // filtering and session persistence. Never replay another provider/model's
52
+ // signatures or resurrect content changed by compaction.
53
+ const replay = message.metadata?.anthropicReplay;
54
+ if (role === "assistant" && record(replay) && replay.model === model && replay.fingerprint === visibleFingerprint(message.blocks) && Array.isArray(replay.content)) {
55
+ content = replay.content.filter(b => b.type !== "tool_use" || paired.has(String(b.id))).map(b => ({ ...b }));
56
+ }
57
+ else {
58
+ for (const b of message.blocks) {
59
+ if (b.type === "text" && b.text.trim())
60
+ content.push({ type: "text", text: b.text });
61
+ else if (b.type === "image" && role === "user") {
62
+ const data = resolveImageBlockDataSync(b);
63
+ if (!data)
64
+ anthropicInvalid("Claude image data is missing");
65
+ const image = validateImageInput(data);
66
+ content.push({ type: "image", source: { type: "base64", media_type: image.mimeType, data: image.data } });
67
+ }
68
+ else if (b.type === "tool_use" && role === "assistant" && paired.has(b.id)) {
69
+ if (!record(b.input))
70
+ anthropicInvalid(`Tool input for ${b.name} must be a JSON object`);
71
+ content.push({ type: "tool_use", id: b.id, name: b.name, input: b.input });
72
+ }
73
+ else if (b.type === "tool_result" && paired.has(b.toolUseId)) {
74
+ content.push({ type: "tool_result", tool_use_id: b.toolUseId, is_error: !b.ok, content: typeof b.output === "string" ? b.output : JSON.stringify(b.output) ?? "null" });
75
+ }
76
+ }
77
+ }
78
+ if (!content.length)
79
+ continue;
80
+ const last = turns[turns.length - 1];
81
+ if (last?.role === role)
82
+ last.content.push(...content);
83
+ else
84
+ turns.push({ role, content });
85
+ }
86
+ // Multiple parallel tool results and injected runtime context share a user
87
+ // turn. Anthropic requires all tool_result blocks before ordinary user text.
88
+ for (const turn of turns)
89
+ if (turn.role === "user")
90
+ turn.content = [...turn.content.filter(b => b.type === "tool_result"), ...turn.content.filter(b => b.type !== "tool_result")];
91
+ let pending = new Set();
92
+ for (const turn of turns) {
93
+ if (turn.role === "user") {
94
+ const ids = turn.content.filter(b => b.type === "tool_result").map(b => String(b.tool_use_id));
95
+ if (ids.length !== new Set(ids).size || ids.some(id => !pending.has(id)) || [...pending].some(id => !ids.includes(id)))
96
+ anthropicInvalid("Claude tool results must immediately follow and match all assistant tool calls");
97
+ pending.clear();
98
+ }
99
+ else {
100
+ pending = new Set(turn.content.filter(b => b.type === "tool_use").map(b => String(b.id)));
101
+ }
102
+ }
103
+ if (pending.size)
104
+ anthropicInvalid("Claude tool calls are missing their following results");
105
+ if (!turns.length || turns[0].role !== "user")
106
+ anthropicInvalid("Claude messages must start with a non-empty user turn");
107
+ if (turns[turns.length - 1].role === "assistant")
108
+ anthropicInvalid("Claude assistant prefill is not supported; append a user turn");
109
+ const body = { model, max_tokens: maxTokens, messages: turns, stream: request.stream !== false };
110
+ if (system.length)
111
+ body.system = system;
112
+ const tools = request.tools.map(t => ({ name: t.name, description: t.description, input_schema: t.inputSchema }));
113
+ if (tools.length) {
114
+ body.tools = tools;
115
+ const choice = request.toolChoice;
116
+ if (typeof choice === "object") {
117
+ if (!tools.some(t => t.name === choice.name))
118
+ anthropicInvalid(`Unknown Claude tool choice: ${choice.name}`);
119
+ body.tool_choice = { type: "tool", name: choice.name };
120
+ }
121
+ else
122
+ body.tool_choice = { type: choice === "required" ? "any" : choice ?? "auto" };
123
+ }
124
+ else if (request.toolChoice === "required" || typeof request.toolChoice === "object")
125
+ anthropicInvalid("Claude tool choice requires tools");
126
+ configureThinking(body, request, options, model, maxTokens);
127
+ if (request.textFormat?.type === "json_schema") {
128
+ if (!request.textFormat.schema)
129
+ anthropicInvalid("Claude JSON schema output requires a schema");
130
+ body.output_config = { ...(body.output_config ?? {}), format: { type: "json_schema", schema: request.textFormat.schema } };
131
+ }
132
+ else if (request.textFormat?.type === "json_object")
133
+ anthropicInvalid("Claude requires json_schema rather than OpenAI json_object output");
134
+ if (request.serviceTier && request.serviceTier !== "auto" && request.serviceTier !== "default")
135
+ anthropicInvalid(`Claude does not map OpenAI service tier '${request.serviceTier}'`);
136
+ if (request.serviceTier === "auto")
137
+ body.service_tier = "auto";
138
+ if (request.serviceTier === "default")
139
+ body.service_tier = "standard_only";
140
+ if (request.metadata?.user_id)
141
+ body.metadata = { user_id: request.metadata.user_id };
142
+ // Deliberately no OpenAI-only fields, previous_response_id, or arbitrary
143
+ // providerOptions spreading. Claude history is sent explicitly each time.
144
+ return body;
145
+ }
146
+ function configureThinking(body, request, options, model, maxTokens) {
147
+ const reasoning = request.reasoning === undefined ? options.defaultReasoning : request.reasoning;
148
+ if (reasoning?.summary)
149
+ anthropicInvalid("OpenAI reasoning.summary is not a Claude parameter");
150
+ const effort = reasoning?.effort;
151
+ const metadata = findModelMetadata(model);
152
+ if (effort && metadata?.provider === "anthropic" && metadata.reasoningEfforts && !metadata.reasoningEfforts.includes(effort))
153
+ anthropicInvalid(`Claude model ${model} does not support effort '${effort}'`);
154
+ const adaptive = /claude-(?:opus-4-[678]|sonnet-4-6|(?:opus|sonnet|haiku|fable|mythos)-5|mythos-preview)/i.test(model);
155
+ const alwaysOn = /claude-(?:opus-5-5|sonnet-5-5|fable-5|mythos-5|mythos-preview)/i.test(model);
156
+ const disabled = reasoning === null || effort === "none";
157
+ if (disabled) {
158
+ if (alwaysOn)
159
+ anthropicInvalid(`Thinking cannot be disabled on ${model}`);
160
+ body.thinking = { type: "disabled" };
161
+ }
162
+ else if (effort) {
163
+ if (effort === "minimal" && !metadata?.reasoningEfforts?.includes(effort))
164
+ anthropicInvalid("Claude has no 'minimal' effort; select low, medium, or high");
165
+ if (adaptive) {
166
+ body.thinking = { type: "adaptive" };
167
+ body.output_config = { effort };
168
+ }
169
+ else {
170
+ if (!["low", "medium", "high"].includes(effort))
171
+ anthropicInvalid("Legacy Claude thinking supports low/medium/high budget mapping only");
172
+ const budget = options.thinkingBudgetTokens ?? Math.min(({ low: 1024, medium: 2048, high: 4096 }[effort]), maxTokens - 1);
173
+ if (!Number.isSafeInteger(budget) || budget < 1024 || budget >= maxTokens)
174
+ anthropicInvalid("Claude thinking budget must be >=1024 and less than max_tokens; raise MODEL_MAX_OUTPUT_TOKENS or set ANTHROPIC_THINKING_BUDGET_TOKENS");
175
+ body.thinking = { type: "enabled", budget_tokens: budget };
176
+ }
177
+ }
178
+ const choice = body.tool_choice;
179
+ const thinkingEnabled = !!body.thinking && body.thinking.type !== "disabled";
180
+ const defaultThinking = /claude-(?:(?:opus|sonnet|haiku|fable|mythos)-5|mythos-preview)/i.test(model) && !disabled;
181
+ if ((thinkingEnabled || defaultThinking) && (choice?.type === "any" || choice?.type === "tool"))
182
+ anthropicInvalid("Claude thinking requires auto or none tool choice");
183
+ }
184
+ export function anthropicUsage(raw) {
185
+ const number = (key) => typeof raw[key] === "number" ? raw[key] : 0;
186
+ const inputTokens = number("input_tokens") + number("cache_creation_input_tokens") + number("cache_read_input_tokens");
187
+ const outputTokens = number("output_tokens");
188
+ const details = record(raw.output_tokens_details) ? raw.output_tokens_details : undefined;
189
+ return { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens, cachedTokens: number("cache_read_input_tokens"), ...(typeof details?.thinking_tokens === "number" ? { reasoningTokens: details.thinking_tokens } : {}), raw };
190
+ }
191
+ function assistantMessage(content, model, id) {
192
+ const blocks = [];
193
+ for (const b of content) {
194
+ if (b.type === "text" && typeof b.text === "string")
195
+ blocks.push({ type: "text", text: b.text });
196
+ else if (b.type === "thinking")
197
+ blocks.push({ type: "thinking", text: String(b.thinking ?? ""), signature: typeof b.signature === "string" ? b.signature : undefined });
198
+ else if (b.type === "tool_use") {
199
+ if (typeof b.id !== "string" || typeof b.name !== "string" || !record(b.input))
200
+ protocolError("Invalid Claude tool_use block");
201
+ blocks.push({ type: "tool_use", id: b.id, name: b.name, input: b.input });
202
+ }
203
+ }
204
+ const message = { ...createTextMessage("assistant", ""), blocks, providerMessageId: id };
205
+ return { ...message, metadata: { anthropicReplay: { model, content, fingerprint: visibleFingerprint(blocks) } } };
206
+ }
207
+ export function* normalizeAnthropicObject(body, model) {
208
+ if (body.type === "error")
209
+ throw anthropicStreamError(body);
210
+ if (body.type !== "message" || !Array.isArray(body.content))
211
+ protocolError("Expected an Anthropic Message response");
212
+ if (typeof body.stop_reason !== "string" || !body.stop_reason)
213
+ protocolError("Incomplete Claude Message response: missing stop_reason");
214
+ if (!body.content.every(record))
215
+ protocolError("Invalid Claude Message content block");
216
+ const truncated = body.stop_reason === "max_tokens" || body.stop_reason === "model_context_window_exceeded";
217
+ // Match streaming safety: no tool from an incomplete response may execute.
218
+ const content = body.content.filter(b => !truncated || b.type === "text" || b.type === "thinking");
219
+ const id = typeof body.id === "string" ? body.id : undefined;
220
+ if (id)
221
+ yield { type: "response_started", responseId: id };
222
+ yield { type: "assistant_message", message: assistantMessage(content, model, id) };
223
+ yield completionEvent(body.stop_reason, anthropicUsage(record(body.usage) ? body.usage : {}));
224
+ }
225
+ export async function* normalizeAnthropicStream(stream, model, idleTimeoutMs = 120000) {
226
+ const blocks = new Map();
227
+ const partialJson = new Map();
228
+ const invalidToolInputs = new Set();
229
+ const openBlocks = new Set();
230
+ let id, started = false, stopped = false, reason;
231
+ let usage = {};
232
+ for await (const sse of decodeSSE(stream, idleTimeoutMs)) {
233
+ if (!record(sse.data))
234
+ protocolError("Invalid JSON in Claude SSE event");
235
+ const event = sse.data;
236
+ const type = event.type ?? sse.event;
237
+ if (type === "error")
238
+ throw anthropicStreamError(event);
239
+ yield { type: "provider_event", event };
240
+ if (type === "message_start") {
241
+ if (started || !record(event.message))
242
+ protocolError("Invalid Claude message_start");
243
+ started = true;
244
+ const message = event.message;
245
+ id = typeof message.id === "string" ? message.id : undefined;
246
+ if (record(message.usage))
247
+ usage = { ...message.usage };
248
+ if (id)
249
+ yield { type: "response_started", responseId: id };
250
+ if (record(message.usage)) {
251
+ const input = anthropicUsage(usage);
252
+ yield { type: "usage", provisional: true, usage: { inputTokens: input.inputTokens, cachedTokens: input.cachedTokens } };
253
+ }
254
+ }
255
+ else if (type === "content_block_start") {
256
+ const index = event.index;
257
+ if (!started || !Number.isInteger(index) || blocks.has(index) || !record(event.content_block))
258
+ protocolError("Invalid Claude content_block_start");
259
+ const block = { ...event.content_block };
260
+ blocks.set(index, block);
261
+ openBlocks.add(index);
262
+ if (block.type === "tool_use") {
263
+ partialJson.set(index, "");
264
+ yield { type: "tool_call_started", callId: String(block.id), name: String(block.name) };
265
+ }
266
+ }
267
+ else if (type === "content_block_delta") {
268
+ const index = event.index, block = blocks.get(index);
269
+ if (!block || !openBlocks.has(index) || !record(event.delta))
270
+ protocolError("Claude delta has no open content block");
271
+ const b = block, delta = event.delta;
272
+ if (delta.type === "text_delta") {
273
+ const text = String(delta.text ?? "");
274
+ b.text = String(b.text ?? "") + text;
275
+ yield { type: "assistant_delta", text };
276
+ }
277
+ else if (delta.type === "thinking_delta") {
278
+ const text = String(delta.thinking ?? "");
279
+ b.thinking = String(b.thinking ?? "") + text;
280
+ yield { type: "thinking_delta", text };
281
+ }
282
+ else if (delta.type === "signature_delta")
283
+ b.signature = String(b.signature ?? "") + String(delta.signature ?? "");
284
+ else if (delta.type === "input_json_delta") {
285
+ const text = String(delta.partial_json ?? "");
286
+ partialJson.set(index, (partialJson.get(index) ?? "") + text);
287
+ yield { type: "tool_call_delta", callId: String(b.id), name: String(b.name), argumentsDelta: text };
288
+ }
289
+ else if (delta.type === "citations_delta") {
290
+ b.citations = [...(Array.isArray(b.citations) ? b.citations : []), delta.citation];
291
+ }
292
+ }
293
+ else if (type === "content_block_stop") {
294
+ const index = event.index, block = blocks.get(index);
295
+ if (!block || !openBlocks.delete(index))
296
+ protocolError("Claude stopped an unopened content block");
297
+ if (block.type === "tool_use") {
298
+ const json = partialJson.get(index);
299
+ // A max_tokens response can end inside tool JSON. Wait for stop_reason
300
+ // before classifying it; never publish these arguments for execution.
301
+ if (json) {
302
+ try {
303
+ block.input = JSON.parse(json);
304
+ }
305
+ catch {
306
+ invalidToolInputs.add(index);
307
+ }
308
+ }
309
+ if (!record(block.input))
310
+ invalidToolInputs.add(index);
311
+ }
312
+ if (block.type === "text")
313
+ yield { type: "assistant_text_done" };
314
+ }
315
+ else if (type === "message_delta") {
316
+ if (record(event.delta) && typeof event.delta.stop_reason === "string")
317
+ reason = event.delta.stop_reason;
318
+ if (record(event.usage))
319
+ usage = { ...usage, ...event.usage };
320
+ }
321
+ else if (type === "message_stop") {
322
+ if (!started || !reason)
323
+ protocolError("Incomplete Claude message at message_stop");
324
+ if (reason === "max_tokens" || reason === "model_context_window_exceeded") {
325
+ // Some compatible servers omit block_stop on truncation. Preserve usage
326
+ // and the real stop reason, but discard the entire executable tool batch.
327
+ const visible = [...blocks.entries()].sort(([a], [b]) => a - b).map(([, b]) => b).filter(b => b.type === "text" || b.type === "thinking");
328
+ if (visible.length)
329
+ yield { type: "assistant_message", message: assistantMessage(visible, model, id) };
330
+ yield completionEvent(reason, anthropicUsage(usage));
331
+ stopped = true;
332
+ break;
333
+ }
334
+ if (openBlocks.size)
335
+ protocolError("Incomplete Claude message at message_stop");
336
+ if (invalidToolInputs.size)
337
+ protocolError("Claude returned incomplete or malformed tool JSON");
338
+ stopped = true;
339
+ const content = [...blocks.entries()].sort(([a], [b]) => a - b).map(([, b]) => b);
340
+ // Emit completed tool calls only after the whole message validates. A
341
+ // truncated stream must never execute a partially received command.
342
+ yield { type: "assistant_message", message: assistantMessage(content, model, id) };
343
+ yield completionEvent(reason, anthropicUsage(usage));
344
+ break;
345
+ }
346
+ }
347
+ if (!stopped)
348
+ protocolError("Claude stream closed before message_stop");
349
+ }
350
+ function completionEvent(reason, usage) {
351
+ return reason === "max_tokens" || reason === "model_context_window_exceeded"
352
+ ? { type: "response_incomplete", reason, usage }
353
+ : { type: "response_completed", stopReason: reason, usage };
354
+ }
355
+ function anthropicStreamError(event) {
356
+ const error = record(event.error) ? event.error : event;
357
+ const type = String(error.type ?? "api_error"), message = String(error.message ?? "Claude stream error");
358
+ const category = /prompt is too long|context.*(?:length|limit)/i.test(message) ? "context_length"
359
+ : type === "overloaded_error" ? "overloaded" : type === "rate_limit_error" ? "rate_limit"
360
+ : type === "authentication_error" ? "auth_unavailable" : type === "permission_error" ? "permission_denied"
361
+ : type === "invalid_request_error" ? "invalid_request" : "server_error";
362
+ return new ModelAPIError({ provider: "anthropic", category, code: type, message, raw: event });
363
+ }
364
+ //# sourceMappingURL=anthropic-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-mapper.js","sourceRoot":"","sources":["../../src/model/anthropic-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAmC,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAWxD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7G,CAAC;AACD,SAAS,aAAa,CAAC,OAAe;IACpC,MAAM,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1G,CAAC;AACD,SAAS,MAAM,CAAC,KAAc,IAAoB,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzH,SAAS,kBAAkB,CAAC,MAA+B;IACzD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAqB,EAAE,OAA+B;IAC1F,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC7C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,sBAAsB,IAAI,QAAQ,EAAE,eAAe,IAAI,KAAK,CAAC;IAClH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;QAAE,gBAAgB,CAAC,8CAA8C,CAAC,CAAC;IACzH,IAAI,QAAQ,EAAE,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,eAAe,IAAI,SAAS,GAAG,QAAQ,CAAC,eAAe;QAAE,gBAAgB,CAAC,+CAA+C,KAAK,KAAK,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;IAClN,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAY,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxH,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,EAAE,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ;QAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC3D,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,UAAU;YAAE,SAAS;QAC3I,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM;gBAAE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACpH,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;QACjE,IAAI,OAAO,GAAY,EAAE,CAAC;QAC1B,4EAA4E;QAC5E,2EAA2E;QAC3E,yDAAyD;QACzD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC;QACjD,IAAI,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,WAAW,KAAK,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACnK,OAAO,GAAI,MAAM,CAAC,OAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5H,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;qBAChF,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC/C,MAAM,IAAI,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC;oBAC1C,IAAI,CAAC,IAAI;wBAAE,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;oBAC5D,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBACvC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC5G,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC7E,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;wBAAE,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC;oBACzF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBAC7E,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;gBAC1K,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,SAAS;QAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI;YAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;;YAClD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC;IAClL,IAAI,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/F,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAAE,gBAAgB,CAAC,gFAAgF,CAAC,CAAC;YAC3N,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,IAAI;QAAE,gBAAgB,CAAC,uDAAuD,CAAC,CAAC;IAC5F,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM;QAAE,gBAAgB,CAAC,uDAAuD,CAAC,CAAC;IAC1H,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,KAAK,WAAW;QAAE,gBAAgB,CAAC,+DAA+D,CAAC,CAAC;IACrI,MAAM,IAAI,GAAU,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;IACxG,IAAI,MAAM,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAClH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;QAClC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC;gBAAE,gBAAgB,CAAC,+BAA+B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7G,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACzD,CAAC;;YAAM,IAAI,CAAC,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;IACvF,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ;QAAE,gBAAgB,CAAC,mCAAmC,CAAC,CAAC;IAC9I,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;QAC/C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM;YAAE,gBAAgB,CAAC,6CAA6C,CAAC,CAAC;QAChG,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,aAAsB,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;IACtI,CAAC;SAAM,IAAI,OAAO,CAAC,UAAU,EAAE,IAAI,KAAK,aAAa;QAAE,gBAAgB,CAAC,mEAAmE,CAAC,CAAC;IAC7I,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,gBAAgB,CAAC,4CAA4C,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;IACrL,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM;QAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;IAC/D,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;QAAE,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;IAC3E,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO;QAAE,IAAI,CAAC,QAAQ,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrF,yEAAyE;IACzE,0EAA0E;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAW,EAAE,OAAqB,EAAE,OAA+B,EAAE,KAAa,EAAE,SAAiB;IAC9H,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACjG,IAAI,SAAS,EAAE,OAAO;QAAE,gBAAgB,CAAC,oDAAoD,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC;IACjC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,MAAM,IAAI,QAAQ,EAAE,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,gBAAgB,CAAC,gBAAgB,KAAK,6BAA6B,MAAM,GAAG,CAAC,CAAC;IAC5M,MAAM,QAAQ,GAAG,yFAAyF,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvH,MAAM,QAAQ,GAAG,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,SAAS,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ;YAAE,gBAAgB,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACvC,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC;YAAE,gBAAgB,CAAC,6DAA6D,CAAC,CAAC;QAC3J,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,gBAAgB,CAAC,qEAAqE,CAAC,CAAC;YACzI,MAAM,MAAM,GAAG,OAAO,CAAC,oBAAoB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,MAAmC,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;YACvJ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAO,GAAG,IAAI,IAAI,MAAO,IAAI,SAAS;gBAAE,gBAAgB,CAAC,uIAAuI,CAAC,CAAC;YACvO,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAgC,CAAC;IACrD,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAK,IAAI,CAAC,QAAkB,CAAC,IAAI,KAAK,UAAU,CAAC;IACxF,MAAM,eAAe,GAAG,iEAAiE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;IACnH,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,KAAK,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC;QAAE,gBAAgB,CAAC,mDAAmD,CAAC,CAAC;AACzK,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAU;IACvC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,6BAA6B,CAAC,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;IACvH,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,GAAG,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,yBAAyB,CAAC,EAAE,GAAG,CAAC,OAAO,OAAO,EAAE,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;AAC7O,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB,EAAE,KAAa,EAAE,EAAW;IACpE,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC5F,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;aACnK,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,+BAA+B,CAAC,CAAC;YAC/H,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAY,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,GAAG,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IACzF,OAAO,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;AACpH,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,wBAAwB,CAAC,IAAW,EAAE,KAAa;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,aAAa,CAAC,wCAAwC,CAAC,CAAC;IACrH,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,aAAa,CAAC,yDAAyD,CAAC,CAAC;IACxI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,aAAa,CAAC,sCAAsC,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,IAAI,IAAI,CAAC,WAAW,KAAK,+BAA+B,CAAC;IAC5G,2EAA2E;IAC3E,MAAM,OAAO,GAAI,IAAI,CAAC,OAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAChH,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,EAAE;QAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;IACnF,MAAM,eAAe,CAAC,IAAI,CAAC,WAAqB,EAAE,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1G,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,wBAAwB,CAAC,MAAkC,EAAE,KAAa,EAAE,aAAa,GAAG,MAAM;IACvH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,EAAsB,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,MAA0B,CAAC;IACzF,IAAI,KAAK,GAAU,EAAE,CAAC;IACtB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,aAAa,CAAC,kCAAkC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,GAAG,CAAC,IAAa,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC;QACrC,IAAI,IAAI,KAAK,OAAO;YAAE,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QACxC,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,aAAa,CAAC,8BAA8B,CAAC,CAAC;YACrF,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgB,CAAC;YACvC,EAAE,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YACxD,IAAI,EAAE;gBAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;YAC3D,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;gBACpC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC;YAC1H,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,CAAC;YACpC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;gBAAE,aAAa,CAAC,oCAAoC,CAAC,CAAC;YACnJ,MAAM,KAAK,GAAG,EAAE,GAAI,KAAK,CAAC,aAAuB,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC9B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3B,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1F,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,wCAAwC,CAAC,CAAC;YACtH,MAAM,CAAC,GAAG,KAAM,EAAE,KAAK,GAAG,KAAK,CAAC,KAAc,CAAC;YAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;gBAC5E,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;YAC1C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;gBACxF,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;YACzC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;gBAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;iBAChH,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBAC9C,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9D,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;YACtG,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC5C,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,0CAA0C,CAAC,CAAC;YACnG,IAAI,KAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACpC,uEAAuE;gBACvE,sEAAsE;gBACtE,IAAI,IAAI,EAAE,CAAC;oBAAC,IAAI,CAAC;wBAAC,KAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC;wBAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAAC,CAAC;gBAAC,CAAC;gBAC9F,IAAI,CAAC,MAAM,CAAC,KAAM,CAAC,KAAK,CAAC;oBAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1D,CAAC;YACD,IAAI,KAAM,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;QACpE,CAAC;aAAM,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,KAAK,QAAQ;gBAAE,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;YACzG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAChE,CAAC;aAAM,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;gBAAE,aAAa,CAAC,2CAA2C,CAAC,CAAC;YACpF,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,+BAA+B,EAAE,CAAC;gBAC1E,wEAAwE;gBACxE,0EAA0E;gBAC1E,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;gBAC1I,IAAI,OAAO,CAAC,MAAM;oBAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;gBACvG,MAAM,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrD,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;YACD,IAAI,UAAU,CAAC,IAAI;gBAAE,aAAa,CAAC,2CAA2C,CAAC,CAAC;YAChF,IAAI,iBAAiB,CAAC,IAAI;gBAAE,aAAa,CAAC,mDAAmD,CAAC,CAAC;YAC/F,OAAO,GAAG,IAAI,CAAC;YACf,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAClF,sEAAsE;YACtE,oEAAoE;YACpE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;YACnF,MAAM,eAAe,CAAC,MAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;YACtD,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,aAAa,CAAC,0CAA0C,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,KAAiB;IACxD,OAAO,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,+BAA+B;QAC1E,CAAC,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,KAAK,EAAE;QAChD,CAAC,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAY;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,+CAA+C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAC/F,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,YAAY;YACzF,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,mBAAmB;gBAC1G,CAAC,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1E,OAAO,IAAI,aAAa,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AACjG,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { type ApiConnection, type Composition } from "./settings-store.js";
2
+ import type { ToolRegistry } from "../tools/registry.js";
3
+ export declare function compositionProviders(c: Composition, connections: ApiConnection[]): {
4
+ openai: import("../tools/builtins/search-providers.js").SearchProvider | undefined;
5
+ exa: import("../tools/builtins/search-providers.js").SearchProvider | undefined;
6
+ image: {
7
+ description: string;
8
+ name: string;
9
+ aliases?: readonly string[];
10
+ searchHint?: string;
11
+ inputSchema: import("../index.js").JsonSchema;
12
+ outputSchema?: import("../index.js").JsonSchema;
13
+ metadata: import("../index.js").ToolMetadata;
14
+ validate?(input: unknown, context: import("../index.js").ToolUseContext): import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput;
15
+ validateInput?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): import("../index.js").ValidationResult<import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput> | Promise<import("../index.js").ValidationResult<import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput>>;
16
+ isConcurrencySafe?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): boolean;
17
+ isEnabled?(context?: import("../index.js").ToolUseContext): boolean;
18
+ isReadOnly?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): boolean;
19
+ isDestructive?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): boolean;
20
+ interruptBehavior?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): "cancel" | "block";
21
+ backfillObservableInput?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): unknown;
22
+ execute?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext): Promise<import("../index.js").ToolResult>;
23
+ call?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput, context: import("../index.js").ToolUseContext, options: import("../index.js").ToolCallOptions<import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput>): Promise<import("../index.js").ToolResult>;
24
+ mapResult?(result: import("../index.js").ToolResult, request: import("../index.js").ToolUseRequest): unknown;
25
+ renderToolUseMessage?(input: import("../tools/builtins/image-generation-tool.js").ImageGenerationToolInput): import("../index.js").Message | undefined;
26
+ renderToolResultMessage?(result: import("../index.js").ToolResult, request?: import("../index.js").ToolUseRequest): import("../index.js").Message | undefined;
27
+ renderToolProgressMessage?(progress: import("../index.js").ToolProgressEvent): import("../index.js").Message | undefined;
28
+ } | undefined;
29
+ search: import("../index.js").Tool<import("../tools/builtins/search-tool.js").WebSearchToolInput> | undefined;
30
+ };
31
+ export declare function registerCompositionTools(tools: ToolRegistry, c: Composition, connections: ApiConnection[]): void;
@@ -0,0 +1,31 @@
1
+ import { createSearchTool } from "../tools/builtins/search-tool.js";
2
+ import { createOpenAISearchProvider, createExaSearchProvider } from "../tools/builtins/search-providers.js";
3
+ import { createOpenAIImageGenerationTool } from "../tools/builtins/image-generation-tool.js";
4
+ import { connectionProtocols, optionalInteger } from "./settings-store.js";
5
+ export function compositionProviders(c, connections) {
6
+ const connection = (id) => { const a = connections.find(a => a.id === id); if (!a || !connectionProtocols(a).includes("openai"))
7
+ throw new Error("需要 OpenAI 兼容连接。"); return a; };
8
+ const openai = c.search.api ? (() => { const a = connection(c.search.api); return createOpenAISearchProvider({ apiKey: a.key, baseUrl: a.baseUrl, model: c.search.model, maxOutputTokens: optionalInteger(c.search.tokens, "搜索 Token"), searchContextSize: c.search.context || undefined, timeoutMs: optionalInteger(c.search.timeout, "搜索超时"), toolType: c.search.toolType }); })() : undefined;
9
+ const exa = c.search.exa ? createExaSearchProvider({ mcpUrl: c.search.exaUrl, toolName: c.search.exaTool, timeoutMs: optionalInteger(c.search.exaTimeout, "Exa 超时") }) : undefined;
10
+ const image = c.image.api ? (() => { const a = connection(c.image.api); const tool = createOpenAIImageGenerationTool({ apiKey: a.key, baseUrl: a.baseUrl, model: c.image.model, timeoutMs: optionalInteger(c.image.timeout, "图片超时") ?? 360000 }); return { ...tool, description: String(tool.description).replace("Available only when MODEL_PROVIDER=openai.", "Uses the separately configured OpenAI-compatible Images connection.") }; })() : undefined;
11
+ const search = openai || exa ? createSearchTool({
12
+ description: openai ? "Search the web. OpenAI Responses is the default. " + (exa ? "Use provider=exa only when OpenAI is unavailable, results are incomplete, or the user explicitly requests Exa." : "Exa is disabled; do not request it.") : "Search the web using Exa MCP. OpenAI search is disabled. Use provider=exa or omit provider.",
13
+ resolveProvider(name) { const selected = name?.trim().toLowerCase() || (openai ? "openai" : "exa"); const p = selected === "exa" ? exa : ["openai", "gpt"].includes(selected) ? openai : undefined; if (!p)
14
+ throw new Error(`Search provider ${selected} is not configured.`); return p; },
15
+ }) : undefined;
16
+ return { openai, exa, image, search };
17
+ }
18
+ export function registerCompositionTools(tools, c, connections) {
19
+ const providers = compositionProviders(c, connections);
20
+ for (const name of ["image_create", "web_search"]) {
21
+ const enabled = tools.isEnabled(name);
22
+ tools.unregister(name);
23
+ const tool = name === "image_create" ? providers.image : providers.search;
24
+ if (tool) {
25
+ tools.register(tool);
26
+ if (enabled === false)
27
+ tools.setEnabled(name, false);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=composition-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composition-runtime.js","sourceRoot":"","sources":["../../src/model/composition-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { ReasoningConfig } from "./model-gateway.js";
2
- export type ModelProviderName = "openai";
1
+ import { type ReasoningConfig } from "./model-gateway.js";
2
+ export type ModelProviderName = "openai" | "anthropic";
3
3
  export type ReasoningSummary = NonNullable<ReasoningConfig["summary"]>;
4
4
  export interface BaseModelProviderConfig {
5
5
  provider: ModelProviderName;
@@ -19,6 +19,13 @@ export interface OpenAIProviderConfig extends BaseModelProviderConfig {
19
19
  endpoint?: OpenAIEndpointPreference;
20
20
  };
21
21
  }
22
- export type ModelProviderConfig = OpenAIProviderConfig;
22
+ export interface AnthropicProviderConfig extends BaseModelProviderConfig {
23
+ provider: "anthropic";
24
+ anthropic?: {
25
+ apiVersion?: string;
26
+ thinkingBudgetTokens?: number;
27
+ };
28
+ }
29
+ export type ModelProviderConfig = OpenAIProviderConfig | AnthropicProviderConfig;
23
30
  export declare function readModelProviderConfig(env?: NodeJS.ProcessEnv): ModelProviderConfig | undefined;
24
31
  export declare function parseReasoning(effortValue: string | undefined, summaryValue?: string | undefined): ReasoningConfig | null | undefined;
@@ -1,7 +1,8 @@
1
+ import { isReasoningEffort } from "./model-gateway.js";
1
2
  const DEFAULT_OPENAI_MODEL = "gpt-5.6";
2
3
  export function readModelProviderConfig(env = process.env) {
3
4
  const provider = parseProvider(env.MODEL_PROVIDER ?? "openai");
4
- return readOpenAIProviderConfig(env);
5
+ return provider === "anthropic" ? readAnthropicProviderConfig(env) : readOpenAIProviderConfig(env);
5
6
  }
6
7
  export function parseReasoning(effortValue, summaryValue) {
7
8
  if (effortValue?.trim() === "off")
@@ -19,7 +20,7 @@ function readOpenAIProviderConfig(env) {
19
20
  const apiKey = firstNonEmpty(env.OPENAI_API_KEY);
20
21
  if (!apiKey)
21
22
  return undefined;
22
- const endpoint = parseOpenAIEndpoint(firstNonEmpty(env.OPENAI_ENDPOINT));
23
+ // The application uses Responses only; ignore legacy OPENAI_ENDPOINT values.
23
24
  return {
24
25
  provider: "openai",
25
26
  apiKey,
@@ -30,11 +31,31 @@ function readOpenAIProviderConfig(env) {
30
31
  maxRetries: parseNumber(firstNonEmpty(env.MODEL_MAX_RETRIES)),
31
32
  defaultMaxOutputTokens: parseNumber(firstNonEmpty(env.MODEL_MAX_OUTPUT_TOKENS)),
32
33
  defaultReasoning: parseReasoning(firstNonEmpty(env.MODEL_REASONING_EFFORT), firstNonEmpty(env.MODEL_REASONING_SUMMARY)),
33
- openai: endpoint ? { endpoint } : undefined,
34
+ openai: { endpoint: "responses" },
35
+ };
36
+ }
37
+ function readAnthropicProviderConfig(env) {
38
+ const apiKey = firstNonEmpty(env.ANTHROPIC_API_KEY);
39
+ if (!apiKey)
40
+ return undefined;
41
+ return {
42
+ provider: "anthropic", apiKey,
43
+ baseUrl: firstNonEmpty(env.ANTHROPIC_BASE_URL),
44
+ model: firstNonEmpty(env.ANTHROPIC_MODEL) ?? "claude-sonnet-4-6",
45
+ timeoutMs: parseNumber(firstNonEmpty(env.MODEL_TIMEOUT_MS)),
46
+ streamIdleTimeoutMs: parseNumber(firstNonEmpty(env.MODEL_STREAM_IDLE_TIMEOUT_MS)),
47
+ maxRetries: parseNumber(firstNonEmpty(env.MODEL_MAX_RETRIES)),
48
+ defaultMaxOutputTokens: parseNumber(firstNonEmpty(env.MODEL_MAX_OUTPUT_TOKENS)),
49
+ // OpenAI summary settings can remain configured when switching providers.
50
+ defaultReasoning: parseReasoning(firstNonEmpty(env.MODEL_REASONING_EFFORT)),
51
+ anthropic: {
52
+ apiVersion: firstNonEmpty(env.ANTHROPIC_API_VERSION),
53
+ thinkingBudgetTokens: parseNumber(firstNonEmpty(env.ANTHROPIC_THINKING_BUDGET_TOKENS)),
54
+ },
34
55
  };
35
56
  }
36
57
  function parseReasoningEffort(value) {
37
- if (value === "none" || value === "minimal" || value === "low" || value === "medium" || value === "high" || value === "xhigh" || value === "max")
58
+ if (isReasoningEffort(value))
38
59
  return value;
39
60
  return undefined;
40
61
  }
@@ -44,15 +65,10 @@ function parseReasoningSummary(value) {
44
65
  return undefined;
45
66
  }
46
67
  function parseProvider(value) {
47
- if (value === "openai")
68
+ if (value === "openai" || value === "anthropic")
48
69
  return value;
49
70
  throw new Error(`Unsupported MODEL_PROVIDER: ${value}`);
50
71
  }
51
- function parseOpenAIEndpoint(value) {
52
- if (value === "responses" || value === "chat" || value === "auto")
53
- return value;
54
- return undefined;
55
- }
56
72
  function parseNumber(value) {
57
73
  if (!value)
58
74
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/model/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/model/config.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import type { ReasoningEffort } from "./model-gateway.js";
1
+ import { type ReasoningEffort } from "./model-gateway.js";
2
2
  export interface ModelMetadata {
3
3
  id: string;
4
4
  provider: string;
5
+ protocols?: Array<"openai" | "anthropic">;
5
6
  modelIds: string[];
6
7
  contextWindowTokens?: number;
7
8
  maxOutputTokens?: number;
@@ -13,6 +14,10 @@ export interface ModelMetadata {
13
14
  notes?: string;
14
15
  }
15
16
  export interface ModelCatalog {
17
+ revision?: string;
18
+ /** User removals survive bundled-data upgrades and reinstalls. */
19
+ excludedModelIds?: string[];
20
+ removedModelIds?: string[];
16
21
  updatedAt?: string;
17
22
  notes?: string[];
18
23
  sources?: Record<string, string>;
@@ -26,7 +31,17 @@ export interface ContextWindowInfo {
26
31
  }
27
32
  export declare function resolveContextWindowTokens(model: string | undefined, env?: NodeJS.ProcessEnv): ContextWindowInfo;
28
33
  export declare function findModelMetadata(model: string, catalog?: ModelCatalog): ModelMetadata | undefined;
34
+ export declare function modelProtocols(model: ModelMetadata): Array<"openai" | "anthropic">;
29
35
  export declare function supportsImageInput(model: string | undefined, catalog?: ModelCatalog): boolean | undefined;
30
36
  export declare function reasoningEffortsForModel(model: string | undefined, catalog?: ModelCatalog): ReasoningEffort[] | undefined;
31
37
  export declare function supportsReasoningEffort(model: string | undefined, effort: ReasoningEffort, catalog?: ModelCatalog): boolean | undefined;
32
38
  export declare function loadModelCatalog(): ModelCatalog;
39
+ export declare function validateModelCatalog(catalog: ModelCatalog): void;
40
+ export declare class ModelMetadataConflict extends Error {
41
+ readonly status = 409;
42
+ }
43
+ export declare function modelMetadataIds(entry: ModelMetadata): string[];
44
+ /** Unknown custom models remain supported; explicitly removed IDs cannot bypass validation. */
45
+ export declare function assertModelNotRemoved(model: string, catalog?: ModelCatalog): void;
46
+ export declare function saveModelMetadata(entry: ModelMetadata, original?: ModelMetadata, revision?: string): ModelCatalog;
47
+ export declare function deleteModelMetadata(original: ModelMetadata, revision?: string, beforeCommit?: () => void): ModelCatalog;