@absolutejs/absolute 0.19.0-beta.245 → 0.19.0-beta.247

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.
@@ -260,7 +260,10 @@
260
260
  "Bash(xargs -r kill -9)",
261
261
  "mcp__playwright__browser_type",
262
262
  "Bash(ollama list:*)",
263
- "WebFetch(domain:platform.openai.com)"
263
+ "WebFetch(domain:platform.openai.com)",
264
+ "Bash(bunx absolute:*)",
265
+ "mcp__playwright__browser_file_upload",
266
+ "WebFetch(domain:docs.anthropic.com)"
264
267
  ]
265
268
  }
266
269
  }
package/dist/ai/index.js CHANGED
@@ -102,6 +102,8 @@ var isValidAIClientMessage = (data) => {
102
102
  switch (data.type) {
103
103
  case "chunk":
104
104
  return "content" in data && typeof data.content === "string" && "messageId" in data && "conversationId" in data;
105
+ case "thinking":
106
+ return "content" in data && typeof data.content === "string" && "messageId" in data && "conversationId" in data;
105
107
  case "tool_status":
106
108
  return "name" in data && "status" in data && "messageId" in data && "conversationId" in data;
107
109
  case "complete":
@@ -201,9 +203,32 @@ var mapToolDefinitions = (tools) => tools.map((tool) => ({
201
203
  },
202
204
  type: "function"
203
205
  }));
206
+ var mapOpenAIContent = (msg) => {
207
+ if (typeof msg.content === "string") {
208
+ return msg.content;
209
+ }
210
+ const hasImages = msg.content.some((block) => block.type === "image");
211
+ if (!hasImages) {
212
+ return null;
213
+ }
214
+ const blocks = [];
215
+ for (const block of msg.content) {
216
+ if (block.type === "image") {
217
+ blocks.push({
218
+ image_url: {
219
+ url: `data:${block.source.media_type};base64,${block.source.data}`
220
+ },
221
+ type: "image_url"
222
+ });
223
+ } else if (block.type === "text") {
224
+ blocks.push({ text: block.content, type: "text" });
225
+ }
226
+ }
227
+ return blocks;
228
+ };
204
229
  var buildRequestBody = (params) => {
205
230
  const messages = convertToolResultMessages(params.messages.map((msg) => ({
206
- content: typeof msg.content === "string" ? msg.content : null,
231
+ content: mapOpenAIContent(msg),
207
232
  role: msg.role
208
233
  })), params);
209
234
  const body = {
@@ -706,11 +731,16 @@ var processToolTurn = async (socket, options, state, messageId, conversationId,
706
731
  role: "user"
707
732
  });
708
733
  const toolDefs = options.tools ? buildToolDefinitions(options.tools) : undefined;
734
+ const thinkingConfig = options.thinking ? {
735
+ budget_tokens: typeof options.thinking === "object" ? options.thinking.budgetTokens : 1e4,
736
+ type: "enabled"
737
+ } : undefined;
709
738
  const stream = options.provider.stream({
710
739
  messages: state.currentMessages,
711
740
  model: options.model,
712
741
  signal,
713
742
  systemPrompt: options.systemPrompt,
743
+ thinking: thinkingConfig,
714
744
  tools: toolDefs
715
745
  });
716
746
  return consumeToolStream(stream, state, options, socket, messageId, conversationId, signal);
@@ -797,11 +827,16 @@ var processStreamToolUseChunk = async (chunk, socket, options, messages, message
797
827
  };
798
828
  var processStream = async (socket, options, messages, messageId, conversationId, signal, startTime) => {
799
829
  const toolDefs = options.tools ? buildToolDefinitions(options.tools) : undefined;
830
+ const thinkingConfig = options.thinking ? {
831
+ budget_tokens: typeof options.thinking === "object" ? options.thinking.budgetTokens : 1e4,
832
+ type: "enabled"
833
+ } : undefined;
800
834
  const stream = options.provider.stream({
801
835
  messages,
802
836
  model: options.model,
803
837
  signal,
804
838
  systemPrompt: options.systemPrompt,
839
+ thinking: thinkingConfig,
805
840
  tools: toolDefs
806
841
  });
807
842
  const result = await consumeStream(stream, options, socket, messages, messageId, conversationId, signal, startTime);
@@ -812,6 +847,14 @@ var processStream = async (socket, options, messages, messageId, conversationId,
812
847
  };
813
848
  var consumeStreamChunk = async (chunk, options, socket, messages, messageId, conversationId, signal, fullResponse, startTime) => {
814
849
  switch (chunk.type) {
850
+ case "thinking":
851
+ await sendMessage(socket, {
852
+ content: chunk.content,
853
+ conversationId,
854
+ messageId,
855
+ type: "thinking"
856
+ });
857
+ return "";
815
858
  case "text":
816
859
  return processStreamTextChunk(chunk, options, socket, messageId, conversationId);
817
860
  case "tool_use":
@@ -891,7 +934,7 @@ var aiChat = (config) => {
891
934
  ws.send(JSON.stringify({ conversationId: newConvId, type: "branched" }));
892
935
  }
893
936
  };
894
- const handleUserMessage = async (ws, rawContent, rawConversationId) => {
937
+ const handleUserMessage = async (ws, rawContent, rawConversationId, attachments) => {
895
938
  const conversationId = rawConversationId ?? crypto.randomUUID();
896
939
  const messageId = crypto.randomUUID();
897
940
  const parsed = parseProvider(rawContent);
@@ -900,6 +943,7 @@ var aiChat = (config) => {
900
943
  const history = conversations.getHistory(conversationId);
901
944
  const controller = conversations.getAbortController(conversationId);
902
945
  conversations.appendMessage(conversationId, {
946
+ attachments,
903
947
  content,
904
948
  conversationId,
905
949
  id: messageId,
@@ -920,11 +964,27 @@ var aiChat = (config) => {
920
964
  };
921
965
  const model = resolveModel();
922
966
  const resolvedTools = typeof config.tools === "function" ? config.tools(providerName, model) : config.tools;
967
+ const userMessage = attachments && attachments.length > 0 ? {
968
+ content: [
969
+ ...attachments.map((att) => ({
970
+ source: {
971
+ data: att.data,
972
+ media_type: att.media_type,
973
+ type: "base64"
974
+ },
975
+ type: "image"
976
+ })),
977
+ { content, type: "text" }
978
+ ],
979
+ role: "user"
980
+ } : { content, role: "user" };
981
+ const resolvedThinking = typeof config.thinking === "function" ? config.thinking(providerName, model) : config.thinking;
923
982
  await streamAI(ws, conversationId, messageId, {
924
983
  maxTurns: config.maxTurns,
925
- messages: [...history, { content, role: "user" }],
984
+ messages: [...history, userMessage],
926
985
  model,
927
986
  provider: config.provider(providerName),
987
+ thinking: resolvedThinking,
928
988
  signal: controller.signal,
929
989
  systemPrompt: config.systemPrompt,
930
990
  tools: resolvedTools,
@@ -955,7 +1015,7 @@ var aiChat = (config) => {
955
1015
  return;
956
1016
  }
957
1017
  if (msg.type === "message") {
958
- await handleUserMessage(ws, msg.content, msg.conversationId);
1018
+ await handleUserMessage(ws, msg.content, msg.conversationId, msg.attachments);
959
1019
  }
960
1020
  }
961
1021
  }).get(`${path}/conversations`, () => conversations.list()).get(`${path}/conversations/:id`, ({ params }) => {
@@ -990,5 +1050,5 @@ export {
990
1050
  aiChat
991
1051
  };
992
1052
 
993
- //# debugId=9014285FCC27A5E164756E2164756E21
1053
+ //# debugId=0917CFAC1D8BB99A64756E2164756E21
994
1054
  //# sourceMappingURL=index.js.map
@@ -2,15 +2,15 @@
2
2
  "version": 3,
3
3
  "sources": ["../types/typeGuards.ts", "../src/ai/providers/openai.ts", "../src/ai/providers/openaiCompatible.ts", "../src/plugins/aiChat.ts", "../src/ai/protocol.ts", "../src/ai/conversationManager.ts", "../src/ai/streamAI.ts"],
4
4
  "sourcesContent": [
5
- "import type { AIClientMessage, AIServerMessage } from './ai';\nimport type { HMRClientMessage } from './messages';\n\n/* Type guard for AI client messages */\nexport const isValidAIClientMessage = (\n\tdata: unknown\n): data is AIClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'message':\n\t\t\treturn 'content' in data && typeof data.content === 'string';\n\t\tcase 'cancel':\n\t\t\treturn (\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tcase 'branch':\n\t\t\treturn (\n\t\t\t\t'messageId' in data &&\n\t\t\t\ttypeof data.messageId === 'string' &&\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for AI server messages */\nexport const isValidAIServerMessage = (\n\tdata: unknown\n): data is AIServerMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'chunk':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'tool_status':\n\t\t\treturn (\n\t\t\t\t'name' in data &&\n\t\t\t\t'status' in data &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'complete':\n\t\t\treturn 'messageId' in data && 'conversationId' in data;\n\t\tcase 'error':\n\t\t\treturn 'message' in data && typeof data.message === 'string';\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for HMR client messages */\nexport const isValidHMRClientMessage = (\n\tdata: unknown\n): data is HMRClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'ping':\n\t\t\treturn true;\n\t\tcase 'ready':\n\t\t\treturn true;\n\t\tcase 'request-rebuild':\n\t\t\treturn true;\n\t\tcase 'hydration-error':\n\t\t\treturn true;\n\t\tcase 'hmr-timing':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n",
6
- "import type {\n\tAIProviderConfig,\n\tAIProviderContentBlock,\n\tAIProviderMessage,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition,\n\tAIUsage\n} from '../../../types/ai';\n\ntype OpenAIConfig = {\n\tapiKey: string;\n\tbaseUrl?: string;\n};\n\ntype OpenAIMessage = {\n\tcontent: string | null;\n\trole: 'user' | 'assistant' | 'system' | 'tool';\n\ttool_call_id?: string;\n\ttool_calls?: Array<{\n\t\tfunction: { arguments: string; name: string };\n\t\tid: string;\n\t\ttype: 'function';\n\t}>;\n};\n\ntype PendingToolCall = {\n\targuments: string;\n\tid: string;\n\tname: string;\n};\n\ntype UsageRef = {\n\tcurrent: AIUsage | undefined;\n};\n\ntype StreamState = {\n\tbuffer: string;\n\tpendingToolCalls: Map<number, PendingToolCall>;\n\tusageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = 'https://api.openai.com';\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = '[DONE]';\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isRecordArray = (\n\tvalue: unknown\n): value is Array<Record<string, unknown>> =>\n\tArray.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst isToolResultBlock = (\n\tblock: AIProviderContentBlock\n): block is AIProviderContentBlock & {\n\tcontent: string;\n\ttool_use_id: string;\n\ttype: 'tool_result';\n} => block.type === 'tool_result';\n\nconst hasArrayContent = (\n\tmsg: AIProviderMessage\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n\ttypeof msg.content !== 'string' && Array.isArray(msg.content);\n\nconst buildToolMessages = (\n\tblocks: AIProviderContentBlock[]\n) => {\n\tconst toolUseBlocks = blocks.filter((block) => block.type === 'tool_use');\n\tconst toolResultBlocks = blocks.filter((block) => block.type === 'tool_result');\n\tconst messages: OpenAIMessage[] = [];\n\n\tif (toolUseBlocks.length > 0) {\n\t\tmessages.push({\n\t\t\tcontent: null,\n\t\t\trole: 'assistant',\n\t\t\ttool_calls: toolUseBlocks.map((block) => ({\n\t\t\t\tfunction: {\n\t\t\t\t\targuments: typeof block.input === 'string'\n\t\t\t\t\t\t? block.input\n\t\t\t\t\t\t: JSON.stringify(block.input),\n\t\t\t\t\tname: block.name\n\t\t\t\t},\n\t\t\t\tid: block.id,\n\t\t\t\ttype: 'function' as const\n\t\t\t}))\n\t\t});\n\t}\n\n\tfor (const result of toolResultBlocks) {\n\t\tmessages.push({\n\t\t\tcontent: typeof result.content === 'string' ? result.content : '',\n\t\t\trole: 'tool',\n\t\t\ttool_call_id: result.tool_use_id\n\t\t});\n\t}\n\n\treturn messages;\n};\n\nconst processMessageAtIndex = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage,\n\tidx: number\n) => {\n\tif (!hasArrayContent(msg)) {\n\t\treturn;\n\t}\n\n\tconst hasToolBlocks = msg.content.some(\n\t\t(block) => block.type === 'tool_use' || block.type === 'tool_result'\n\t);\n\n\tif (!hasToolBlocks) {\n\t\treturn;\n\t}\n\n\tconst toolMessages = buildToolMessages(msg.content);\n\tresult.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage | undefined,\n\tidx: number\n) => {\n\tif (!msg) {\n\t\treturn;\n\t}\n\n\tprocessMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n\tmessages: OpenAIMessage[],\n\tparams: AIProviderStreamParams\n) => {\n\tconst result = [...messages];\n\n\tfor (let idx = 0; idx < params.messages.length; idx++) {\n\t\tconvertSingleMessage(result, params.messages[idx], idx);\n\t}\n\n\treturn result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n\ttools.map((tool) => ({\n\t\tfunction: {\n\t\t\tdescription: tool.description,\n\t\t\tname: tool.name,\n\t\t\tparameters: tool.input_schema\n\t\t},\n\t\ttype: 'function'\n\t}));\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst messages = convertToolResultMessages(\n\t\tparams.messages.map((msg) => ({\n\t\t\tcontent: typeof msg.content === 'string' ? msg.content : null,\n\t\t\trole: msg.role\n\t\t})),\n\t\tparams\n\t);\n\n\tconst body: Record<string, unknown> = {\n\t\tmessages,\n\t\tmodel: params.model,\n\t\tstream: true,\n\t\tstream_options: { include_usage: true }\n\t};\n\n\tif (params.tools && params.tools.length > 0) {\n\t\tbody.tools = mapToolDefinitions(params.tools);\n\t}\n\n\treturn body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n\ttry {\n\t\treturn JSON.parse(rawArguments);\n\t} catch {\n\t\treturn rawArguments;\n\t}\n};\n\nconst flushPendingToolCalls = function* (\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tfor (const [, tool] of pendingToolCalls) {\n\t\tconst input = parseToolInput(tool.arguments);\n\t\tyield {\n\t\t\tid: tool.id,\n\t\t\tinput,\n\t\t\tname: tool.name,\n\t\t\ttype: 'tool_use' as const\n\t\t};\n\t}\n\n\tpendingToolCalls.clear();\n};\n\nconst extractUsage = (parsedUsage: Record<string, number>) => ({\n\tinputTokens: parsedUsage.prompt_tokens ?? 0,\n\toutputTokens: parsedUsage.completion_tokens ?? 0\n});\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n\tconst raw = typeof toolCall.index === 'number' ? toolCall.index : NOT_FOUND;\n\n\treturn raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tindex: number,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tif (pendingToolCalls.has(index)) {\n\t\treturn;\n\t}\n\n\tconst toolId = typeof toolCall.id === 'string' ? toolCall.id : '';\n\tconst toolName = func && typeof func.name === 'string' ? func.name : '';\n\n\tpendingToolCalls.set(index, {\n\t\targuments: '',\n\t\tid: toolId,\n\t\tname: toolName\n\t});\n};\n\nconst updatePendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tpending: PendingToolCall\n) => {\n\tif (typeof toolCall.id === 'string') {\n\t\tpending.id = toolCall.id;\n\t}\n\n\tif (func && typeof func.name === 'string') {\n\t\tpending.name = func.name;\n\t}\n\n\tif (func && typeof func.arguments === 'string') {\n\t\tpending.arguments += func.arguments;\n\t}\n};\n\nconst processToolCallDelta = (\n\ttoolCall: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tconst index = resolveToolCallIndex(toolCall);\n\tif (index === undefined) {\n\t\treturn;\n\t}\n\n\tconst func = isRecord(toolCall.function) ? toolCall.function : null;\n\tinitPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n\tconst pending = pendingToolCalls.get(index);\n\tif (!pending) {\n\t\treturn;\n\t}\n\n\tupdatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n\ttoolCalls: Array<Record<string, unknown>>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tfor (const toolCall of toolCalls) {\n\t\tprocessToolCallDelta(toolCall, pendingToolCalls);\n\t}\n};\n\nconst processDelta = function* (\n\tdelta: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tif (typeof delta.content === 'string') {\n\t\tyield { content: delta.content, type: 'text' as const };\n\t}\n\n\tif (isRecordArray(delta.tool_calls)) {\n\t\tprocessToolCallDeltas(delta.tool_calls, pendingToolCalls);\n\t}\n};\n\nconst processChoice = function* (\n\tchoice: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tconst delta = isRecord(choice.delta) ? choice.delta : null;\n\tif (delta) {\n\t\tyield* processDelta(delta, pendingToolCalls);\n\t}\n\n\tif (choice.finish_reason === 'tool_calls') {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t}\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n\tif (!isRecord(parsed.usage)) {\n\t\treturn undefined;\n\t}\n\n\tconst { usage } = parsed;\n\tconst promptTokens =\n\t\ttypeof usage.prompt_tokens === 'number' ? usage.prompt_tokens : 0;\n\tconst completionTokens =\n\t\ttypeof usage.completion_tokens === 'number'\n\t\t\t? usage.completion_tokens\n\t\t\t: 0;\n\n\treturn extractUsage({\n\t\tcompletion_tokens: completionTokens,\n\t\tprompt_tokens: promptTokens\n\t});\n};\n\nconst processSSELine = function* (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tcurrentUsage: AIUsage | undefined\n) {\n\tconst trimmed = line.trim();\n\tif (!trimmed || !trimmed.startsWith('data: ')) {\n\t\treturn;\n\t}\n\n\tconst data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n\tif (data === DONE_SENTINEL) {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t\tyield { type: 'done' as const, usage: currentUsage };\n\n\t\treturn;\n\t}\n\n\tlet parsed: Record<string, unknown>;\n\ttry {\n\t\tparsed = JSON.parse(data);\n\t} catch {\n\t\treturn;\n\t}\n\n\tconst usageUpdate = narrowUsageRecord(parsed);\n\tif (usageUpdate) {\n\t\tyield { type: 'usage_update' as const, usage: usageUpdate };\n\t}\n\n\tconst { choices } = parsed;\n\tif (!isRecordArray(choices)) {\n\t\treturn;\n\t}\n\n\tconst [firstChoice] = choices;\n\tif (!firstChoice) {\n\t\treturn;\n\t}\n\n\tyield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n\ttype: string;\n\tusage?: AIUsage;\n}): chunk is { type: 'usage_update'; usage: AIUsage } =>\n\tchunk.type === 'usage_update';\n\nconst collectYieldableChunks = (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) => {\n\tconst allChunks = Array.from(\n\t\tprocessSSELine(line, pendingToolCalls, usageRef.current)\n\t);\n\tconst usageChunks = allChunks.filter(isUsageUpdate);\n\tconst lastUsage = usageChunks.at(NOT_FOUND);\n\n\tif (lastUsage) {\n\t\tusageRef.current = lastUsage.usage;\n\t}\n\n\treturn allChunks.filter((chunk) => !isUsageUpdate(chunk));\n};\n\nconst processSSELines = function* (\n\tlines: string[],\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) {\n\tfor (const line of lines) {\n\t\tyield* collectYieldableChunks(line, pendingToolCalls, usageRef);\n\t}\n};\n\nconst processStreamValue = (\n\tvalue: Uint8Array,\n\tdecoder: TextDecoder,\n\tstate: StreamState\n) => {\n\tstate.buffer += decoder.decode(value, { stream: true });\n\tconst lines = state.buffer.split('\\n');\n\tstate.buffer = lines.pop() ?? '';\n\n\treturn lines;\n};\n\nconst drainReader = async function* (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: StreamState,\n\tsignal?: AbortSignal\n) {\n\t/* eslint-disable no-await-in-loop */\n\tfor (\n\t\tlet result = await reader.read();\n\t\t!result.done && !signal?.aborted;\n\t\tresult = await reader.read()\n\t) {\n\t\t/* eslint-enable no-await-in-loop */\n\t\tconst lines = processStreamValue(result.value, decoder, state);\n\t\tyield* processSSELines(lines, state.pendingToolCalls, state.usageRef);\n\t}\n};\n\nconst parseSSEStream = async function* (\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tconst state: StreamState = {\n\t\tbuffer: '',\n\t\tpendingToolCalls: new Map<number, PendingToolCall>(),\n\t\tusageRef: { current: undefined }\n\t};\n\n\ttry {\n\t\tyield* drainReader(reader, decoder, state, signal);\n\t\tyield { type: 'done' as const, usage: state.usageRef.current };\n\t} finally {\n\t\treader.releaseLock();\n\t}\n};\n\nconst fetchOpenAIStream = async function* (\n\tbaseUrl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\tsignal?: AbortSignal\n) {\n\tconst response = await fetch(`${baseUrl}/v1/chat/completions`, {\n\t\tbody: JSON.stringify(body),\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tmethod: 'POST',\n\t\tsignal\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('OpenAI API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, signal);\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) => {\n\t\t\tconst body = buildRequestBody(params);\n\n\t\t\treturn fetchOpenAIStream(\n\t\t\t\tbaseUrl,\n\t\t\t\tconfig.apiKey,\n\t\t\t\tbody,\n\t\t\t\tparams.signal\n\t\t\t);\n\t\t}\n\t};\n};\n",
5
+ "import type { AIClientMessage, AIServerMessage } from './ai';\nimport type { HMRClientMessage } from './messages';\n\n/* Type guard for AI client messages */\nexport const isValidAIClientMessage = (\n\tdata: unknown\n): data is AIClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'message':\n\t\t\treturn 'content' in data && typeof data.content === 'string';\n\t\tcase 'cancel':\n\t\t\treturn (\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tcase 'branch':\n\t\t\treturn (\n\t\t\t\t'messageId' in data &&\n\t\t\t\ttypeof data.messageId === 'string' &&\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'conversationId' in data &&\n\t\t\t\ttypeof data.conversationId === 'string'\n\t\t\t);\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for AI server messages */\nexport const isValidAIServerMessage = (\n\tdata: unknown\n): data is AIServerMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'chunk':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'thinking':\n\t\t\treturn (\n\t\t\t\t'content' in data &&\n\t\t\t\ttypeof data.content === 'string' &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'tool_status':\n\t\t\treturn (\n\t\t\t\t'name' in data &&\n\t\t\t\t'status' in data &&\n\t\t\t\t'messageId' in data &&\n\t\t\t\t'conversationId' in data\n\t\t\t);\n\t\tcase 'complete':\n\t\t\treturn 'messageId' in data && 'conversationId' in data;\n\t\tcase 'error':\n\t\t\treturn 'message' in data && typeof data.message === 'string';\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n\n/* Type guard for HMR client messages */\nexport const isValidHMRClientMessage = (\n\tdata: unknown\n): data is HMRClientMessage => {\n\tif (!data || typeof data !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (!('type' in data) || typeof data.type !== 'string') {\n\t\treturn false;\n\t}\n\n\tswitch (data.type) {\n\t\tcase 'ping':\n\t\t\treturn true;\n\t\tcase 'ready':\n\t\t\treturn true;\n\t\tcase 'request-rebuild':\n\t\t\treturn true;\n\t\tcase 'hydration-error':\n\t\t\treturn true;\n\t\tcase 'hmr-timing':\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t}\n};\n",
6
+ "import type {\n\tAIProviderConfig,\n\tAIProviderContentBlock,\n\tAIProviderMessage,\n\tAIProviderStreamParams,\n\tAIProviderToolDefinition,\n\tAIUsage\n} from '../../../types/ai';\n\ntype OpenAIConfig = {\n\tapiKey: string;\n\tbaseUrl?: string;\n};\n\ntype OpenAIMessage = {\n\tcontent: string | Array<Record<string, unknown>> | null;\n\trole: 'user' | 'assistant' | 'system' | 'tool';\n\ttool_call_id?: string;\n\ttool_calls?: Array<{\n\t\tfunction: { arguments: string; name: string };\n\t\tid: string;\n\t\ttype: 'function';\n\t}>;\n};\n\ntype PendingToolCall = {\n\targuments: string;\n\tid: string;\n\tname: string;\n};\n\ntype UsageRef = {\n\tcurrent: AIUsage | undefined;\n};\n\ntype StreamState = {\n\tbuffer: string;\n\tpendingToolCalls: Map<number, PendingToolCall>;\n\tusageRef: UsageRef;\n};\n\nconst DEFAULT_BASE_URL = 'https://api.openai.com';\nconst SSE_DATA_PREFIX_LENGTH = 6;\nconst DONE_SENTINEL = '[DONE]';\nconst NOT_FOUND = -1;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n\ttypeof value === 'object' && value !== null;\n\nconst isRecordArray = (\n\tvalue: unknown\n): value is Array<Record<string, unknown>> =>\n\tArray.isArray(value) && value.length > 0 && isRecord(value[0]);\n\nconst isToolResultBlock = (\n\tblock: AIProviderContentBlock\n): block is AIProviderContentBlock & {\n\tcontent: string;\n\ttool_use_id: string;\n\ttype: 'tool_result';\n} => block.type === 'tool_result';\n\nconst hasArrayContent = (\n\tmsg: AIProviderMessage\n): msg is AIProviderMessage & { content: AIProviderContentBlock[] } =>\n\ttypeof msg.content !== 'string' && Array.isArray(msg.content);\n\nconst buildToolMessages = (\n\tblocks: AIProviderContentBlock[]\n) => {\n\tconst toolUseBlocks = blocks.filter((block) => block.type === 'tool_use');\n\tconst toolResultBlocks = blocks.filter((block) => block.type === 'tool_result');\n\tconst messages: OpenAIMessage[] = [];\n\n\tif (toolUseBlocks.length > 0) {\n\t\tmessages.push({\n\t\t\tcontent: null,\n\t\t\trole: 'assistant',\n\t\t\ttool_calls: toolUseBlocks.map((block) => ({\n\t\t\t\tfunction: {\n\t\t\t\t\targuments: typeof block.input === 'string'\n\t\t\t\t\t\t? block.input\n\t\t\t\t\t\t: JSON.stringify(block.input),\n\t\t\t\t\tname: block.name\n\t\t\t\t},\n\t\t\t\tid: block.id,\n\t\t\t\ttype: 'function' as const\n\t\t\t}))\n\t\t});\n\t}\n\n\tfor (const result of toolResultBlocks) {\n\t\tmessages.push({\n\t\t\tcontent: typeof result.content === 'string' ? result.content : '',\n\t\t\trole: 'tool',\n\t\t\ttool_call_id: result.tool_use_id\n\t\t});\n\t}\n\n\treturn messages;\n};\n\nconst processMessageAtIndex = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage,\n\tidx: number\n) => {\n\tif (!hasArrayContent(msg)) {\n\t\treturn;\n\t}\n\n\tconst hasToolBlocks = msg.content.some(\n\t\t(block) => block.type === 'tool_use' || block.type === 'tool_result'\n\t);\n\n\tif (!hasToolBlocks) {\n\t\treturn;\n\t}\n\n\tconst toolMessages = buildToolMessages(msg.content);\n\tresult.splice(idx, 1, ...toolMessages);\n};\n\nconst convertSingleMessage = (\n\tresult: OpenAIMessage[],\n\tmsg: AIProviderMessage | undefined,\n\tidx: number\n) => {\n\tif (!msg) {\n\t\treturn;\n\t}\n\n\tprocessMessageAtIndex(result, msg, idx);\n};\n\nconst convertToolResultMessages = (\n\tmessages: OpenAIMessage[],\n\tparams: AIProviderStreamParams\n) => {\n\tconst result = [...messages];\n\n\tfor (let idx = 0; idx < params.messages.length; idx++) {\n\t\tconvertSingleMessage(result, params.messages[idx], idx);\n\t}\n\n\treturn result;\n};\n\nconst mapToolDefinitions = (tools: AIProviderToolDefinition[]) =>\n\ttools.map((tool) => ({\n\t\tfunction: {\n\t\t\tdescription: tool.description,\n\t\t\tname: tool.name,\n\t\t\tparameters: tool.input_schema\n\t\t},\n\t\ttype: 'function'\n\t}));\n\nconst mapOpenAIContent = (\n\tmsg: AIProviderStreamParams['messages'][number]\n): string | Array<Record<string, unknown>> | null => {\n\tif (typeof msg.content === 'string') {\n\t\treturn msg.content;\n\t}\n\n\tconst hasImages = msg.content.some((block) => block.type === 'image');\n\n\tif (!hasImages) {\n\t\treturn null;\n\t}\n\n\tconst blocks: Array<Record<string, unknown>> = [];\n\n\tfor (const block of msg.content) {\n\t\tif (block.type === 'image') {\n\t\t\tblocks.push({\n\t\t\t\timage_url: {\n\t\t\t\t\turl: `data:${block.source.media_type};base64,${block.source.data}`\n\t\t\t\t},\n\t\t\t\ttype: 'image_url'\n\t\t\t});\n\t\t} else if (block.type === 'text') {\n\t\t\tblocks.push({ text: block.content, type: 'text' });\n\t\t}\n\t}\n\n\treturn blocks;\n};\n\nconst buildRequestBody = (params: AIProviderStreamParams) => {\n\tconst messages = convertToolResultMessages(\n\t\tparams.messages.map((msg) => ({\n\t\t\tcontent: mapOpenAIContent(msg),\n\t\t\trole: msg.role\n\t\t})),\n\t\tparams\n\t);\n\n\tconst body: Record<string, unknown> = {\n\t\tmessages,\n\t\tmodel: params.model,\n\t\tstream: true,\n\t\tstream_options: { include_usage: true }\n\t};\n\n\tif (params.tools && params.tools.length > 0) {\n\t\tbody.tools = mapToolDefinitions(params.tools);\n\t}\n\n\treturn body;\n};\n\nconst parseToolInput = (rawArguments: string) => {\n\ttry {\n\t\treturn JSON.parse(rawArguments);\n\t} catch {\n\t\treturn rawArguments;\n\t}\n};\n\nconst flushPendingToolCalls = function* (\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tfor (const [, tool] of pendingToolCalls) {\n\t\tconst input = parseToolInput(tool.arguments);\n\t\tyield {\n\t\t\tid: tool.id,\n\t\t\tinput,\n\t\t\tname: tool.name,\n\t\t\ttype: 'tool_use' as const\n\t\t};\n\t}\n\n\tpendingToolCalls.clear();\n};\n\nconst extractUsage = (parsedUsage: Record<string, number>) => ({\n\tinputTokens: parsedUsage.prompt_tokens ?? 0,\n\toutputTokens: parsedUsage.completion_tokens ?? 0\n});\n\nconst resolveToolCallIndex = (toolCall: Record<string, unknown>) => {\n\tconst raw = typeof toolCall.index === 'number' ? toolCall.index : NOT_FOUND;\n\n\treturn raw < 0 ? undefined : raw;\n};\n\nconst initPendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tindex: number,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tif (pendingToolCalls.has(index)) {\n\t\treturn;\n\t}\n\n\tconst toolId = typeof toolCall.id === 'string' ? toolCall.id : '';\n\tconst toolName = func && typeof func.name === 'string' ? func.name : '';\n\n\tpendingToolCalls.set(index, {\n\t\targuments: '',\n\t\tid: toolId,\n\t\tname: toolName\n\t});\n};\n\nconst updatePendingToolCall = (\n\ttoolCall: Record<string, unknown>,\n\tfunc: Record<string, unknown> | null,\n\tpending: PendingToolCall\n) => {\n\tif (typeof toolCall.id === 'string') {\n\t\tpending.id = toolCall.id;\n\t}\n\n\tif (func && typeof func.name === 'string') {\n\t\tpending.name = func.name;\n\t}\n\n\tif (func && typeof func.arguments === 'string') {\n\t\tpending.arguments += func.arguments;\n\t}\n};\n\nconst processToolCallDelta = (\n\ttoolCall: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tconst index = resolveToolCallIndex(toolCall);\n\tif (index === undefined) {\n\t\treturn;\n\t}\n\n\tconst func = isRecord(toolCall.function) ? toolCall.function : null;\n\tinitPendingToolCall(toolCall, func, index, pendingToolCalls);\n\n\tconst pending = pendingToolCalls.get(index);\n\tif (!pending) {\n\t\treturn;\n\t}\n\n\tupdatePendingToolCall(toolCall, func, pending);\n};\n\nconst processToolCallDeltas = (\n\ttoolCalls: Array<Record<string, unknown>>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) => {\n\tfor (const toolCall of toolCalls) {\n\t\tprocessToolCallDelta(toolCall, pendingToolCalls);\n\t}\n};\n\nconst processDelta = function* (\n\tdelta: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tif (typeof delta.content === 'string') {\n\t\tyield { content: delta.content, type: 'text' as const };\n\t}\n\n\tif (isRecordArray(delta.tool_calls)) {\n\t\tprocessToolCallDeltas(delta.tool_calls, pendingToolCalls);\n\t}\n};\n\nconst processChoice = function* (\n\tchoice: Record<string, unknown>,\n\tpendingToolCalls: Map<number, PendingToolCall>\n) {\n\tconst delta = isRecord(choice.delta) ? choice.delta : null;\n\tif (delta) {\n\t\tyield* processDelta(delta, pendingToolCalls);\n\t}\n\n\tif (choice.finish_reason === 'tool_calls') {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t}\n};\n\nconst narrowUsageRecord = (parsed: Record<string, unknown>) => {\n\tif (!isRecord(parsed.usage)) {\n\t\treturn undefined;\n\t}\n\n\tconst { usage } = parsed;\n\tconst promptTokens =\n\t\ttypeof usage.prompt_tokens === 'number' ? usage.prompt_tokens : 0;\n\tconst completionTokens =\n\t\ttypeof usage.completion_tokens === 'number'\n\t\t\t? usage.completion_tokens\n\t\t\t: 0;\n\n\treturn extractUsage({\n\t\tcompletion_tokens: completionTokens,\n\t\tprompt_tokens: promptTokens\n\t});\n};\n\nconst processSSELine = function* (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tcurrentUsage: AIUsage | undefined\n) {\n\tconst trimmed = line.trim();\n\tif (!trimmed || !trimmed.startsWith('data: ')) {\n\t\treturn;\n\t}\n\n\tconst data = trimmed.slice(SSE_DATA_PREFIX_LENGTH);\n\tif (data === DONE_SENTINEL) {\n\t\tyield* flushPendingToolCalls(pendingToolCalls);\n\t\tyield { type: 'done' as const, usage: currentUsage };\n\n\t\treturn;\n\t}\n\n\tlet parsed: Record<string, unknown>;\n\ttry {\n\t\tparsed = JSON.parse(data);\n\t} catch {\n\t\treturn;\n\t}\n\n\tconst usageUpdate = narrowUsageRecord(parsed);\n\tif (usageUpdate) {\n\t\tyield { type: 'usage_update' as const, usage: usageUpdate };\n\t}\n\n\tconst { choices } = parsed;\n\tif (!isRecordArray(choices)) {\n\t\treturn;\n\t}\n\n\tconst [firstChoice] = choices;\n\tif (!firstChoice) {\n\t\treturn;\n\t}\n\n\tyield* processChoice(firstChoice, pendingToolCalls);\n};\n\nconst isUsageUpdate = (chunk: {\n\ttype: string;\n\tusage?: AIUsage;\n}): chunk is { type: 'usage_update'; usage: AIUsage } =>\n\tchunk.type === 'usage_update';\n\nconst collectYieldableChunks = (\n\tline: string,\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) => {\n\tconst allChunks = Array.from(\n\t\tprocessSSELine(line, pendingToolCalls, usageRef.current)\n\t);\n\tconst usageChunks = allChunks.filter(isUsageUpdate);\n\tconst lastUsage = usageChunks.at(NOT_FOUND);\n\n\tif (lastUsage) {\n\t\tusageRef.current = lastUsage.usage;\n\t}\n\n\treturn allChunks.filter((chunk) => !isUsageUpdate(chunk));\n};\n\nconst processSSELines = function* (\n\tlines: string[],\n\tpendingToolCalls: Map<number, PendingToolCall>,\n\tusageRef: UsageRef\n) {\n\tfor (const line of lines) {\n\t\tyield* collectYieldableChunks(line, pendingToolCalls, usageRef);\n\t}\n};\n\nconst processStreamValue = (\n\tvalue: Uint8Array,\n\tdecoder: TextDecoder,\n\tstate: StreamState\n) => {\n\tstate.buffer += decoder.decode(value, { stream: true });\n\tconst lines = state.buffer.split('\\n');\n\tstate.buffer = lines.pop() ?? '';\n\n\treturn lines;\n};\n\nconst drainReader = async function* (\n\treader: ReadableStreamDefaultReader<Uint8Array>,\n\tdecoder: TextDecoder,\n\tstate: StreamState,\n\tsignal?: AbortSignal\n) {\n\t/* eslint-disable no-await-in-loop */\n\tfor (\n\t\tlet result = await reader.read();\n\t\t!result.done && !signal?.aborted;\n\t\tresult = await reader.read()\n\t) {\n\t\t/* eslint-enable no-await-in-loop */\n\t\tconst lines = processStreamValue(result.value, decoder, state);\n\t\tyield* processSSELines(lines, state.pendingToolCalls, state.usageRef);\n\t}\n};\n\nconst parseSSEStream = async function* (\n\tbody: ReadableStream<Uint8Array>,\n\tsignal?: AbortSignal\n) {\n\tconst reader = body.getReader();\n\tconst decoder = new TextDecoder();\n\tconst state: StreamState = {\n\t\tbuffer: '',\n\t\tpendingToolCalls: new Map<number, PendingToolCall>(),\n\t\tusageRef: { current: undefined }\n\t};\n\n\ttry {\n\t\tyield* drainReader(reader, decoder, state, signal);\n\t\tyield { type: 'done' as const, usage: state.usageRef.current };\n\t} finally {\n\t\treader.releaseLock();\n\t}\n};\n\nconst fetchOpenAIStream = async function* (\n\tbaseUrl: string,\n\tapiKey: string,\n\tbody: Record<string, unknown>,\n\tsignal?: AbortSignal\n) {\n\tconst response = await fetch(`${baseUrl}/v1/chat/completions`, {\n\t\tbody: JSON.stringify(body),\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t'Content-Type': 'application/json'\n\t\t},\n\t\tmethod: 'POST',\n\t\tsignal\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorText = await response.text();\n\t\tthrow new Error(`OpenAI API error ${response.status}: ${errorText}`);\n\t}\n\n\tif (!response.body) {\n\t\tthrow new Error('OpenAI API returned no response body');\n\t}\n\n\tyield* parseSSEStream(response.body, signal);\n};\n\nexport const openai = (config: OpenAIConfig): AIProviderConfig => {\n\tconst baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n\treturn {\n\t\tstream: (params: AIProviderStreamParams) => {\n\t\t\tconst body = buildRequestBody(params);\n\n\t\t\treturn fetchOpenAIStream(\n\t\t\t\tbaseUrl,\n\t\t\t\tconfig.apiKey,\n\t\t\t\tbody,\n\t\t\t\tparams.signal\n\t\t\t);\n\t\t}\n\t};\n};\n",
7
7
  "import type { AIProviderConfig } from '../../../types/ai';\nimport { openai } from './openai';\n\n/**\n * Creates a provider for any OpenAI-compatible API.\n * Many providers (Google, xAI, DeepSeek, Mistral, etc.)\n * expose OpenAI-compatible chat completion endpoints.\n */\nexport const openaiCompatible = (config: {\n\tapiKey: string;\n\tbaseUrl: string;\n}): AIProviderConfig => openai({ apiKey: config.apiKey, baseUrl: config.baseUrl });\n\nexport const google = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://generativelanguage.googleapis.com/v1beta/openai'\n\t});\n\nexport const xai = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.x.ai'\n\t});\n\nexport const deepseek = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.deepseek.com'\n\t});\n\nexport const mistralai = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.mistral.ai'\n\t});\n\nexport const alibaba = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://dashscope-intl.aliyuncs.com/compatible-mode'\n\t});\n\nexport const meta = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.llama.com/compat/v1'\n\t});\n\nexport const moonshot = (config: { apiKey: string }) =>\n\topenaiCompatible({\n\t\tapiKey: config.apiKey,\n\t\tbaseUrl: 'https://api.moonshot.ai'\n\t});\n",
8
- "import { Elysia } from 'elysia';\nimport type { AIChatPluginConfig } from '../../types/ai';\nimport { createConversationManager } from '../ai/conversationManager';\nimport { parseAIMessage } from '../ai/protocol';\nimport { streamAI } from '../ai/streamAI';\n\nconst DEFAULT_PATH = '/chat';\nconst MAX_PREFIX_LEN = 12;\n\nconst defaultParseProvider = (content: string) => {\n\tconst colonIdx = content.indexOf(':');\n\tconst hasPrefix = colonIdx > 0 && colonIdx < MAX_PREFIX_LEN;\n\n\treturn {\n\t\tcontent: hasPrefix ? content.slice(colonIdx + 1) : content,\n\t\tproviderName: hasPrefix ? content.slice(0, colonIdx) : 'anthropic'\n\t};\n};\n\nexport const aiChat = (config: AIChatPluginConfig) => {\n\tconst path = config.path ?? DEFAULT_PATH;\n\tconst conversations = createConversationManager();\n\tconst parseProvider = config.parseProvider ?? defaultParseProvider;\n\n\tconst handleCancel = (conversationId: string) => {\n\t\tconversations.abort(conversationId);\n\t};\n\n\tconst handleBranch = (\n\t\tws: { send: (data: string) => void },\n\t\tmessageId: string,\n\t\tconversationId: string\n\t) => {\n\t\tconst newConvId = conversations.branch(messageId, conversationId);\n\n\t\tif (newConvId) {\n\t\t\tws.send(\n\t\t\t\tJSON.stringify({ conversationId: newConvId, type: 'branched' })\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleUserMessage = async (\n\t\tws: { readyState: number; send: (data: string) => void },\n\t\trawContent: string,\n\t\trawConversationId?: string\n\t) => {\n\t\tconst conversationId = rawConversationId ?? crypto.randomUUID();\n\t\tconst messageId = crypto.randomUUID();\n\t\tconst parsed: { content: string; model?: string; providerName: string } =\n\t\t\tparseProvider(rawContent);\n\t\tconst { content, providerName } = parsed;\n\n\t\tconversations.getOrCreate(conversationId);\n\t\tconst history = conversations.getHistory(conversationId);\n\t\tconst controller = conversations.getAbortController(conversationId);\n\n\t\tconversations.appendMessage(conversationId, {\n\t\t\tcontent,\n\t\t\tconversationId,\n\t\t\tid: messageId,\n\t\t\trole: 'user',\n\t\t\ttimestamp: Date.now()\n\t\t});\n\n\t\tconst resolveModel = () => {\n\t\t\tif (parsed.model) {\n\t\t\t\treturn parsed.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'string') {\n\t\t\t\treturn config.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'function') {\n\t\t\t\treturn config.model(providerName);\n\t\t\t}\n\n\t\t\treturn providerName;\n\t\t};\n\n\t\tconst model = resolveModel();\n\n\t\tconst resolvedTools = typeof config.tools === 'function'\n\t\t\t? config.tools(providerName, model)\n\t\t\t: config.tools;\n\n\t\tawait streamAI(ws, conversationId, messageId, {\n\t\t\tmaxTurns: config.maxTurns,\n\t\t\tmessages: [...history, { content, role: 'user' }],\n\t\t\tmodel,\n\t\t\tprovider: config.provider(providerName),\n\t\t\tsignal: controller.signal,\n\t\t\tsystemPrompt: config.systemPrompt,\n\t\t\ttools: resolvedTools,\n\t\t\tonComplete: (fullResponse, usage) => {\n\t\t\t\tconversations.appendMessage(conversationId, {\n\t\t\t\t\tcontent: fullResponse,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\ttimestamp: Date.now()\n\t\t\t\t});\n\t\t\t\tconfig.onComplete?.(conversationId, fullResponse, usage);\n\t\t\t}\n\t\t});\n\t};\n\n\treturn new Elysia()\n\t\t.ws(path, {\n\t\t\tmessage: async (ws, raw) => {\n\t\t\t\tconst msg = parseAIMessage(raw);\n\n\t\t\t\tif (!msg) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'cancel' && msg.conversationId) {\n\t\t\t\t\thandleCancel(msg.conversationId);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'branch') {\n\t\t\t\t\thandleBranch(ws, msg.messageId, msg.conversationId);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'message') {\n\t\t\t\t\tawait handleUserMessage(\n\t\t\t\t\t\tws,\n\t\t\t\t\t\tmsg.content,\n\t\t\t\t\t\tmsg.conversationId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t.get(`${path}/conversations`, () => conversations.list())\n\t\t.get(`${path}/conversations/:id`, ({ params }) => {\n\t\t\tconst conv = conversations.get(params.id);\n\n\t\t\tif (!conv) {\n\t\t\t\treturn new Response('Not found', { status: 404 });\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: conv.id,\n\t\t\t\tmessages: conv.messages,\n\t\t\t\ttitle: conv.title ?? 'Untitled'\n\t\t\t};\n\t\t})\n\t\t.delete(`${path}/conversations/:id`, ({ params }) => {\n\t\t\tconversations.remove(params.id);\n\n\t\t\treturn { ok: true };\n\t\t});\n};\n",
8
+ "import { Elysia } from 'elysia';\nimport type { AIChatPluginConfig } from '../../types/ai';\nimport { createConversationManager } from '../ai/conversationManager';\nimport { parseAIMessage } from '../ai/protocol';\nimport { streamAI } from '../ai/streamAI';\n\nconst DEFAULT_PATH = '/chat';\nconst MAX_PREFIX_LEN = 12;\n\nconst defaultParseProvider = (content: string) => {\n\tconst colonIdx = content.indexOf(':');\n\tconst hasPrefix = colonIdx > 0 && colonIdx < MAX_PREFIX_LEN;\n\n\treturn {\n\t\tcontent: hasPrefix ? content.slice(colonIdx + 1) : content,\n\t\tproviderName: hasPrefix ? content.slice(0, colonIdx) : 'anthropic'\n\t};\n};\n\nexport const aiChat = (config: AIChatPluginConfig) => {\n\tconst path = config.path ?? DEFAULT_PATH;\n\tconst conversations = createConversationManager();\n\tconst parseProvider = config.parseProvider ?? defaultParseProvider;\n\n\tconst handleCancel = (conversationId: string) => {\n\t\tconversations.abort(conversationId);\n\t};\n\n\tconst handleBranch = (\n\t\tws: { send: (data: string) => void },\n\t\tmessageId: string,\n\t\tconversationId: string\n\t) => {\n\t\tconst newConvId = conversations.branch(messageId, conversationId);\n\n\t\tif (newConvId) {\n\t\t\tws.send(\n\t\t\t\tJSON.stringify({ conversationId: newConvId, type: 'branched' })\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleUserMessage = async (\n\t\tws: { readyState: number; send: (data: string) => void },\n\t\trawContent: string,\n\t\trawConversationId?: string,\n\t\tattachments?: Array<{\n\t\t\tdata: string;\n\t\t\tmedia_type: 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp';\n\t\t}>\n\t) => {\n\t\tconst conversationId = rawConversationId ?? crypto.randomUUID();\n\t\tconst messageId = crypto.randomUUID();\n\t\tconst parsed: { content: string; model?: string; providerName: string } =\n\t\t\tparseProvider(rawContent);\n\t\tconst { content, providerName } = parsed;\n\n\t\tconversations.getOrCreate(conversationId);\n\t\tconst history = conversations.getHistory(conversationId);\n\t\tconst controller = conversations.getAbortController(conversationId);\n\n\t\tconversations.appendMessage(conversationId, {\n\t\t\tattachments,\n\t\t\tcontent,\n\t\t\tconversationId,\n\t\t\tid: messageId,\n\t\t\trole: 'user',\n\t\t\ttimestamp: Date.now()\n\t\t});\n\n\t\tconst resolveModel = () => {\n\t\t\tif (parsed.model) {\n\t\t\t\treturn parsed.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'string') {\n\t\t\t\treturn config.model;\n\t\t\t}\n\n\t\t\tif (typeof config.model === 'function') {\n\t\t\t\treturn config.model(providerName);\n\t\t\t}\n\n\t\t\treturn providerName;\n\t\t};\n\n\t\tconst model = resolveModel();\n\n\t\tconst resolvedTools = typeof config.tools === 'function'\n\t\t\t? config.tools(providerName, model)\n\t\t\t: config.tools;\n\n\t\tconst userMessage = attachments && attachments.length > 0\n\t\t\t? {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t...attachments.map((att) => ({\n\t\t\t\t\t\t\tsource: {\n\t\t\t\t\t\t\t\tdata: att.data,\n\t\t\t\t\t\t\t\tmedia_type: att.media_type,\n\t\t\t\t\t\t\t\ttype: 'base64' as const\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttype: 'image' as const\n\t\t\t\t\t\t})),\n\t\t\t\t\t\t{ content, type: 'text' as const }\n\t\t\t\t\t],\n\t\t\t\t\trole: 'user' as const\n\t\t\t\t}\n\t\t\t: { content, role: 'user' as const };\n\n\t\tconst resolvedThinking = typeof config.thinking === 'function'\n\t\t\t? config.thinking(providerName, model)\n\t\t\t: config.thinking;\n\n\t\tawait streamAI(ws, conversationId, messageId, {\n\t\t\tmaxTurns: config.maxTurns,\n\t\t\tmessages: [...history, userMessage],\n\t\t\tmodel,\n\t\t\tprovider: config.provider(providerName),\n\t\t\tthinking: resolvedThinking,\n\t\t\tsignal: controller.signal,\n\t\t\tsystemPrompt: config.systemPrompt,\n\t\t\ttools: resolvedTools,\n\t\t\tonComplete: (fullResponse, usage) => {\n\t\t\t\tconversations.appendMessage(conversationId, {\n\t\t\t\t\tcontent: fullResponse,\n\t\t\t\t\tconversationId,\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\trole: 'assistant',\n\t\t\t\t\ttimestamp: Date.now()\n\t\t\t\t});\n\t\t\t\tconfig.onComplete?.(conversationId, fullResponse, usage);\n\t\t\t}\n\t\t});\n\t};\n\n\treturn new Elysia()\n\t\t.ws(path, {\n\t\t\tmessage: async (ws, raw) => {\n\t\t\t\tconst msg = parseAIMessage(raw);\n\n\t\t\t\tif (!msg) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'cancel' && msg.conversationId) {\n\t\t\t\t\thandleCancel(msg.conversationId);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'branch') {\n\t\t\t\t\thandleBranch(ws, msg.messageId, msg.conversationId);\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (msg.type === 'message') {\n\t\t\t\t\tawait handleUserMessage(\n\t\t\t\t\t\tws,\n\t\t\t\t\t\tmsg.content,\n\t\t\t\t\t\tmsg.conversationId,\n\t\t\t\t\t\tmsg.attachments\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\t.get(`${path}/conversations`, () => conversations.list())\n\t\t.get(`${path}/conversations/:id`, ({ params }) => {\n\t\t\tconst conv = conversations.get(params.id);\n\n\t\t\tif (!conv) {\n\t\t\t\treturn new Response('Not found', { status: 404 });\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: conv.id,\n\t\t\t\tmessages: conv.messages,\n\t\t\t\ttitle: conv.title ?? 'Untitled'\n\t\t\t};\n\t\t})\n\t\t.delete(`${path}/conversations/:id`, ({ params }) => {\n\t\t\tconversations.remove(params.id);\n\n\t\t\treturn { ok: true };\n\t\t});\n};\n",
9
9
  "import type { AIServerMessage } from '../../types/ai';\nimport { isValidAIClientMessage } from '../../types/typeGuards';\n\nexport const generateId = () => crypto.randomUUID();\n\nexport const parseAIMessage = (raw: unknown) => {\n\tif (raw === null || raw === undefined) {\n\t\treturn null;\n\t}\n\n\tlet text: string;\n\n\tif (typeof raw === 'string') {\n\t\ttext = raw;\n\t} else if (raw instanceof ArrayBuffer) {\n\t\ttext = new TextDecoder().decode(raw);\n\t} else if (ArrayBuffer.isView(raw)) {\n\t\ttext = new TextDecoder().decode(raw);\n\t} else if (typeof raw === 'object') {\n\t\tif (isValidAIClientMessage(raw)) {\n\t\t\treturn raw;\n\t\t}\n\n\t\treturn null;\n\t} else {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(text);\n\n\t\tif (isValidAIClientMessage(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n};\n\nexport const serializeAIMessage = (msg: AIServerMessage) => JSON.stringify(msg);\n",
10
10
  "import type {\n\tAIConversation,\n\tAIConversationSummary,\n\tAIMessage,\n\tAIProviderMessage\n} from '../../types/ai';\nimport { generateId } from './protocol';\n\nconst NOT_FOUND = -1;\n\nexport const createConversationManager = () => {\n\tconst conversations = new Map<string, AIConversation>();\n\n\tconst getOrCreate = (conversationId?: string) => {\n\t\tconst id = conversationId ?? generateId();\n\t\tlet conversation = conversations.get(id);\n\n\t\tif (!conversation) {\n\t\t\tconversation = { createdAt: Date.now(), id, messages: [] };\n\t\t\tconversations.set(id, conversation);\n\t\t}\n\n\t\treturn conversation;\n\t};\n\n\tconst appendMessage = (conversationId: string, message: AIMessage) => {\n\t\tconst conversation = getOrCreate(conversationId);\n\t\tconversation.messages.push(message);\n\t\tconversation.lastMessageAt = Date.now();\n\n\t\tif (!conversation.title && message.role === 'user') {\n\t\t\tconversation.title = message.content.slice(0, 80);\n\t\t}\n\t};\n\n\tconst branch = (fromMessageId: string, sourceConversationId: string) => {\n\t\tconst source = conversations.get(sourceConversationId);\n\n\t\tif (!source) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst cutoffIndex = source.messages.findIndex(\n\t\t\t(msg) => msg.id === fromMessageId\n\t\t);\n\n\t\tif (cutoffIndex === NOT_FOUND) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst newId = generateId();\n\t\tconst branchedMessages = source.messages\n\t\t\t.slice(0, cutoffIndex + 1)\n\t\t\t.map((msg) => ({ ...msg, conversationId: newId }));\n\n\t\tconst newConversation: AIConversation = {\n\t\t\tcreatedAt: Date.now(),\n\t\t\tid: newId,\n\t\t\tmessages: branchedMessages\n\t\t};\n\t\tconversations.set(newId, newConversation);\n\n\t\treturn newId;\n\t};\n\n\tconst emptyHistory: AIProviderMessage[] = [];\n\n\tconst getHistory = (conversationId: string) => {\n\t\tconst conversation = conversations.get(conversationId);\n\n\t\tif (!conversation) {\n\t\t\treturn emptyHistory;\n\t\t}\n\n\t\tconst history: AIProviderMessage[] = conversation.messages.map(\n\t\t\t(msg) => ({\n\t\t\t\tcontent: msg.content,\n\t\t\t\trole: msg.role\n\t\t\t})\n\t\t);\n\n\t\treturn history;\n\t};\n\n\tconst getAbortController = (conversationId: string) => {\n\t\tconst conversation = getOrCreate(conversationId);\n\t\tconst controller = new AbortController();\n\t\tconversation.activeStreamAbort = controller;\n\n\t\treturn controller;\n\t};\n\n\tconst abort = (conversationId: string) => {\n\t\tconst conversation = conversations.get(conversationId);\n\n\t\tif (conversation?.activeStreamAbort) {\n\t\t\tconversation.activeStreamAbort.abort();\n\t\t\tconversation.activeStreamAbort = undefined;\n\t\t}\n\t};\n\n\tconst get = (conversationId: string) => conversations.get(conversationId);\n\n\tconst remove = (conversationId: string) =>\n\t\tconversations.delete(conversationId);\n\n\tconst list = (): AIConversationSummary[] =>\n\t\tArray.from(conversations.values())\n\t\t\t.map((conv) => ({\n\t\t\t\tcreatedAt: conv.createdAt,\n\t\t\t\tid: conv.id,\n\t\t\t\tlastMessageAt: conv.lastMessageAt,\n\t\t\t\tmessageCount: conv.messages.length,\n\t\t\t\ttitle: conv.title ?? 'Untitled'\n\t\t\t}))\n\t\t\t.sort(\n\t\t\t\t(first, second) =>\n\t\t\t\t\t(second.lastMessageAt ?? second.createdAt) -\n\t\t\t\t\t(first.lastMessageAt ?? first.createdAt)\n\t\t\t);\n\n\tconst getMessages = (conversationId: string) => {\n\t\tconst conversation = conversations.get(conversationId);\n\n\t\tif (!conversation) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn conversation.messages;\n\t};\n\n\treturn {\n\t\tabort,\n\t\tappendMessage,\n\t\tbranch,\n\t\tget,\n\t\tgetAbortController,\n\t\tgetHistory,\n\t\tgetMessages,\n\t\tgetOrCreate,\n\t\tlist,\n\t\tremove\n\t};\n};\n",
11
- "import type {\n\tAIChunk,\n\tAIProviderMessage,\n\tAIServerMessage,\n\tAITextChunk,\n\tAIToolMap,\n\tAIUsage,\n\tAIWebSocket,\n\tStreamAIOptions\n} from '../../types/ai';\nimport { serializeAIMessage } from './protocol';\n\nconst WS_OPEN = 1;\nconst BACKPRESSURE_THRESHOLD = 1_048_576;\nconst BACKPRESSURE_DELAY = 10;\nconst DEFAULT_MAX_TURNS = 10;\nconst INITIAL_TURN = 0;\n\nconst delay = (milliseconds: number) =>\n\t// eslint-disable-next-line promise/avoid-new\n\tnew Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n\nconst checkBackpressure = async (socket: AIWebSocket) => {\n\tif (!('raw' in socket)) {\n\t\treturn;\n\t}\n\n\tconst { raw } = socket;\n\n\tif (\n\t\traw &&\n\t\ttypeof raw === 'object' &&\n\t\t'bufferedAmount' in raw &&\n\t\ttypeof raw.bufferedAmount === 'number' &&\n\t\traw.bufferedAmount > BACKPRESSURE_THRESHOLD\n\t) {\n\t\tawait delay(BACKPRESSURE_DELAY);\n\t}\n};\n\nconst sendMessage = async (socket: AIWebSocket, msg: AIServerMessage) => {\n\tif (socket.readyState !== WS_OPEN) {\n\t\treturn false;\n\t}\n\n\tawait checkBackpressure(socket);\n\n\tsocket.send(serializeAIMessage(msg));\n\n\treturn true;\n};\n\nconst buildToolDefinitions = (tools: AIToolMap) =>\n\tObject.entries(tools).map(([name, def]) => ({\n\t\tdescription: def.description,\n\t\tinput_schema: def.input,\n\t\tname\n\t}));\n\nconst extractTextContent = (\n\tchunk: AITextChunk,\n\tonChunk?: (chunk: AITextChunk) => AITextChunk | void\n) => {\n\tif (!onChunk) {\n\t\treturn chunk.content;\n\t}\n\n\tconst transformed = onChunk(chunk);\n\n\tif (\n\t\ttransformed &&\n\t\ttypeof transformed === 'object' &&\n\t\t'content' in transformed\n\t) {\n\t\treturn transformed.content;\n\t}\n\n\treturn chunk.content;\n};\n\nconst sendToolRunning = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tinput: toolInput,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tstatus: 'running',\n\t\ttype: 'tool_status'\n\t});\n\nconst sendToolComplete = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\tresult: string,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tresult,\n\t\tstatus: 'complete',\n\t\ttype: 'tool_status'\n\t});\n\nconst executeTool = async (\n\toptions: StreamAIOptions,\n\ttoolName: string,\n\ttoolInput: unknown\n) => {\n\tconst toolDef = options.tools?.[toolName];\n\n\tif (!toolDef) {\n\t\treturn `Error: unknown tool \"${toolName}\"`;\n\t}\n\n\ttry {\n\t\treturn await toolDef.handler(toolInput);\n\t} catch (err) {\n\t\treturn `Error: ${err instanceof Error ? err.message : String(err)}`;\n\t}\n};\n\nconst buildToolUseBlock = (\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown\n) => [\n\t{\n\t\tid: toolUseId,\n\t\tinput: toolInput,\n\t\tname: toolName,\n\t\ttype: 'tool_use' as const\n\t}\n];\n\nconst buildToolResultBlock = (toolUseId: string, result: string) => [\n\t{\n\t\tcontent: result,\n\t\ttool_use_id: toolUseId,\n\t\ttype: 'tool_result' as const\n\t}\n];\n\nconst serializeToolCall = (name: string, input: unknown) =>\n\t`${name}:${JSON.stringify(input)}`;\n\ntype ToolLoopState = {\n\tcurrentFullResponse: string;\n\tcurrentMessages: AIProviderMessage[];\n\tcurrentToolInput: unknown;\n\tcurrentToolName: string;\n\tcurrentToolUseId: string;\n\tcurrentTurn: number;\n\tcurrentUsage: AIUsage | undefined;\n\tpreviousToolCallKey: string;\n};\n\ntype ToolLoopResult = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst handleToolChunkText = (\n\tchunk: AITextChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\tstate.currentFullResponse += textContent;\n\tsendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n};\n\nconst handleToolChunkToolUse = (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tstate: ToolLoopState\n) => {\n\tstate.currentToolUseId = chunk.id;\n\tstate.currentToolName = chunk.name;\n\tstate.currentToolInput = chunk.input;\n};\n\nconst processToolChunk = (\n\tchunk: AIChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tlet hitAnotherTool = false;\n\n\tswitch (chunk.type) {\n\t\tcase 'text':\n\t\t\thandleToolChunkText(\n\t\t\t\tchunk,\n\t\t\t\tstate,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase 'tool_use':\n\t\t\thandleToolChunkToolUse(chunk, state);\n\t\t\thitAnotherTool = true;\n\t\t\tbreak;\n\n\t\tcase 'done':\n\t\t\tstate.currentUsage = chunk.usage;\n\t\t\tbreak;\n\t}\n\n\treturn hitAnotherTool;\n};\n\nconst processToolTurn = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tstate: ToolLoopState,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tawait sendToolRunning(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\tconst result = await executeTool(\n\t\toptions,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput\n\t);\n\n\tawait sendToolComplete(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tresult,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\toptions.onToolUse?.(state.currentToolName, state.currentToolInput, result);\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolUseBlock(\n\t\t\tstate.currentToolUseId,\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t),\n\t\trole: 'assistant'\n\t});\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolResultBlock(state.currentToolUseId, result),\n\t\trole: 'user'\n\t});\n\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages: state.currentMessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\ttools: toolDefs\n\t});\n\n\treturn consumeToolStream(\n\t\tstream,\n\t\tstate,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal\n\t);\n};\n\nconst consumeToolStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst isToolHit = processToolChunk(\n\t\t\tchunk,\n\t\t\tstate,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId\n\t\t);\n\n\t\tif (isToolHit) return true;\n\t}\n\n\treturn false;\n};\n\nconst shouldContinueToolLoop = (\n\tstate: ToolLoopState,\n\tmaxTurns: number,\n\tsignal: AbortSignal\n) => state.currentTurn < maxTurns && !signal.aborted;\n\nconst executeToolLoop = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tturn: number\n): Promise<ToolLoopResult> => {\n\tconst maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;\n\n\tconst state: ToolLoopState = {\n\t\tcurrentFullResponse: fullResponse,\n\t\tcurrentMessages: [...messages],\n\t\tcurrentToolInput: toolInput,\n\t\tcurrentToolName: toolName,\n\t\tcurrentToolUseId: toolUseId,\n\t\tcurrentTurn: turn,\n\t\tcurrentUsage: undefined,\n\t\tpreviousToolCallKey: ''\n\t};\n\n\twhile (shouldContinueToolLoop(state, maxTurns, signal)) {\n\t\tconst currentKey = serializeToolCall(\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t);\n\n\t\tif (currentKey === state.previousToolCallKey) {\n\t\t\tbreak;\n\t\t}\n\n\t\tstate.previousToolCallKey = currentKey;\n\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst hitAnotherTool = await processToolTurn(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tstate,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal\n\t\t);\n\n\t\tif (!hitAnotherTool) {\n\t\t\treturn {\n\t\t\t\tfullResponse: state.currentFullResponse,\n\t\t\t\tusage: state.currentUsage\n\t\t\t};\n\t\t}\n\n\t\tstate.currentTurn++;\n\t}\n\n\treturn {\n\t\tfullResponse: state.currentFullResponse,\n\t\tusage: state.currentUsage\n\t};\n};\n\nconst sendComplete = async (\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tusage?: AIUsage,\n\tdurationMs?: number,\n\tmodel?: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tdurationMs,\n\t\tmessageId,\n\t\tmodel,\n\t\ttype: 'complete',\n\t\tusage\n\t});\n\nconst sendError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\tmessageId,\n\t\ttype: 'error'\n\t});\n\nconst handleTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\n\tawait sendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n\n\treturn textContent;\n};\n\nconst handleToolUseChunk = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tchunkId: string,\n\tchunkName: string,\n\tchunkInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tconst toolResult = await executeToolLoop(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunkId,\n\t\tchunkName,\n\t\tchunkInput,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tINITIAL_TURN\n\t);\n\n\tawait sendComplete(\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\ttoolResult.usage,\n\t\tDate.now() - startTime,\n\t\toptions.model\n\t);\n\toptions.onComplete?.(toolResult.fullResponse, toolResult.usage);\n\n\treturn toolResult;\n};\n\nconst processStreamTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = await handleTextChunk(\n\t\tchunk,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\treturn textContent;\n};\n\nconst processStreamToolUseChunk = async (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tawait handleToolUseChunk(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunk.id,\n\t\tchunk.name,\n\t\tchunk.input,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tstartTime\n\t);\n};\n\nconst processStream = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\ttools: toolDefs\n\t});\n\n\tconst result = await consumeStream(\n\t\tstream,\n\t\toptions,\n\t\tsocket,\n\t\tmessages,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tstartTime\n\t);\n\n\tif (!result.earlyReturn) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tresult.usage,\n\t\t\tDate.now() - startTime,\n\t\t\toptions.model\n\t\t);\n\t\toptions.onComplete?.(result.fullResponse, result.usage);\n\t}\n};\n\ntype ConsumeStreamResult = {\n\tearlyReturn: boolean;\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst consumeStreamChunk = async (\n\tchunk: AIChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tswitch (chunk.type) {\n\t\tcase 'text':\n\t\t\treturn processStreamTextChunk(\n\t\t\t\tchunk,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\n\t\tcase 'tool_use':\n\t\t\tawait processStreamToolUseChunk(\n\t\t\t\tchunk,\n\t\t\t\tsocket,\n\t\t\t\toptions,\n\t\t\t\tmessages,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId,\n\t\t\t\tsignal,\n\t\t\t\tfullResponse,\n\t\t\t\tstartTime\n\t\t\t);\n\n\t\t\treturn { earlyReturn: true, fullResponse, usage: undefined };\n\n\t\tcase 'done':\n\t\t\treturn { earlyReturn: false, fullResponse, usage: chunk.usage };\n\t}\n\n\treturn '';\n};\n\ntype ConsumeStreamState = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst applyStreamChunkResult = (\n\tresult: ConsumeStreamResult | string,\n\tstate: ConsumeStreamState\n) => {\n\tif (typeof result === 'string') {\n\t\tstate.fullResponse += result;\n\n\t\treturn undefined;\n\t}\n\n\tif (result.earlyReturn) return result;\n\n\tstate.usage = result.usage;\n\n\treturn undefined;\n};\n\nconst consumeStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst state: ConsumeStreamState = { fullResponse: '', usage: undefined };\n\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst result = await consumeStreamChunk(\n\t\t\tchunk,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstate.fullResponse,\n\t\t\tstartTime\n\t\t);\n\t\tconst earlyExit = applyStreamChunkResult(result, state);\n\n\t\tif (earlyExit) return earlyExit;\n\t}\n\n\tconst finalResult: ConsumeStreamResult = {\n\t\tearlyReturn: false,\n\t\tfullResponse: state.fullResponse,\n\t\tusage: state.usage\n\t};\n\n\treturn finalResult;\n};\n\nexport const streamAI = async (\n\tsocket: AIWebSocket,\n\tconversationId: string,\n\tmessageId: string,\n\toptions: StreamAIOptions\n) => {\n\tconst signal = options.signal ?? new AbortController().signal;\n\tconst startTime = Date.now();\n\n\tconst messages: AIProviderMessage[] = options.messages\n\t\t? [...options.messages]\n\t\t: [];\n\n\ttry {\n\t\tawait processStream(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t} catch (err) {\n\t\tawait handleStreamError(\n\t\t\tsocket,\n\t\t\terr,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t}\n};\n\nconst handleStreamError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tif (signal.aborted) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tundefined,\n\t\t\tDate.now() - startTime\n\t\t);\n\n\t\treturn;\n\t}\n\n\tawait sendError(socket, err, messageId, conversationId);\n};\n"
11
+ "import type {\n\tAIChunk,\n\tAIProviderMessage,\n\tAIServerMessage,\n\tAITextChunk,\n\tAIToolMap,\n\tAIUsage,\n\tAIWebSocket,\n\tStreamAIOptions\n} from '../../types/ai';\nimport { serializeAIMessage } from './protocol';\n\nconst WS_OPEN = 1;\nconst BACKPRESSURE_THRESHOLD = 1_048_576;\nconst BACKPRESSURE_DELAY = 10;\nconst DEFAULT_MAX_TURNS = 10;\nconst INITIAL_TURN = 0;\n\nconst delay = (milliseconds: number) =>\n\t// eslint-disable-next-line promise/avoid-new\n\tnew Promise<void>((resolve) => setTimeout(resolve, milliseconds));\n\nconst checkBackpressure = async (socket: AIWebSocket) => {\n\tif (!('raw' in socket)) {\n\t\treturn;\n\t}\n\n\tconst { raw } = socket;\n\n\tif (\n\t\traw &&\n\t\ttypeof raw === 'object' &&\n\t\t'bufferedAmount' in raw &&\n\t\ttypeof raw.bufferedAmount === 'number' &&\n\t\traw.bufferedAmount > BACKPRESSURE_THRESHOLD\n\t) {\n\t\tawait delay(BACKPRESSURE_DELAY);\n\t}\n};\n\nconst sendMessage = async (socket: AIWebSocket, msg: AIServerMessage) => {\n\tif (socket.readyState !== WS_OPEN) {\n\t\treturn false;\n\t}\n\n\tawait checkBackpressure(socket);\n\n\tsocket.send(serializeAIMessage(msg));\n\n\treturn true;\n};\n\nconst buildToolDefinitions = (tools: AIToolMap) =>\n\tObject.entries(tools).map(([name, def]) => ({\n\t\tdescription: def.description,\n\t\tinput_schema: def.input,\n\t\tname\n\t}));\n\nconst extractTextContent = (\n\tchunk: AITextChunk,\n\tonChunk?: (chunk: AITextChunk) => AITextChunk | void\n) => {\n\tif (!onChunk) {\n\t\treturn chunk.content;\n\t}\n\n\tconst transformed = onChunk(chunk);\n\n\tif (\n\t\ttransformed &&\n\t\ttypeof transformed === 'object' &&\n\t\t'content' in transformed\n\t) {\n\t\treturn transformed.content;\n\t}\n\n\treturn chunk.content;\n};\n\nconst sendToolRunning = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tinput: toolInput,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tstatus: 'running',\n\t\ttype: 'tool_status'\n\t});\n\nconst sendToolComplete = async (\n\tsocket: AIWebSocket,\n\ttoolName: string,\n\tresult: string,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessageId,\n\t\tname: toolName,\n\t\tresult,\n\t\tstatus: 'complete',\n\t\ttype: 'tool_status'\n\t});\n\nconst executeTool = async (\n\toptions: StreamAIOptions,\n\ttoolName: string,\n\ttoolInput: unknown\n) => {\n\tconst toolDef = options.tools?.[toolName];\n\n\tif (!toolDef) {\n\t\treturn `Error: unknown tool \"${toolName}\"`;\n\t}\n\n\ttry {\n\t\treturn await toolDef.handler(toolInput);\n\t} catch (err) {\n\t\treturn `Error: ${err instanceof Error ? err.message : String(err)}`;\n\t}\n};\n\nconst buildToolUseBlock = (\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown\n) => [\n\t{\n\t\tid: toolUseId,\n\t\tinput: toolInput,\n\t\tname: toolName,\n\t\ttype: 'tool_use' as const\n\t}\n];\n\nconst buildToolResultBlock = (toolUseId: string, result: string) => [\n\t{\n\t\tcontent: result,\n\t\ttool_use_id: toolUseId,\n\t\ttype: 'tool_result' as const\n\t}\n];\n\nconst serializeToolCall = (name: string, input: unknown) =>\n\t`${name}:${JSON.stringify(input)}`;\n\ntype ToolLoopState = {\n\tcurrentFullResponse: string;\n\tcurrentMessages: AIProviderMessage[];\n\tcurrentToolInput: unknown;\n\tcurrentToolName: string;\n\tcurrentToolUseId: string;\n\tcurrentTurn: number;\n\tcurrentUsage: AIUsage | undefined;\n\tpreviousToolCallKey: string;\n};\n\ntype ToolLoopResult = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst handleToolChunkText = (\n\tchunk: AITextChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\tstate.currentFullResponse += textContent;\n\tsendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n};\n\nconst handleToolChunkToolUse = (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tstate: ToolLoopState\n) => {\n\tstate.currentToolUseId = chunk.id;\n\tstate.currentToolName = chunk.name;\n\tstate.currentToolInput = chunk.input;\n};\n\nconst processToolChunk = (\n\tchunk: AIChunk,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tlet hitAnotherTool = false;\n\n\tswitch (chunk.type) {\n\t\tcase 'text':\n\t\t\thandleToolChunkText(\n\t\t\t\tchunk,\n\t\t\t\tstate,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\t\t\tbreak;\n\n\t\tcase 'tool_use':\n\t\t\thandleToolChunkToolUse(chunk, state);\n\t\t\thitAnotherTool = true;\n\t\t\tbreak;\n\n\t\tcase 'done':\n\t\t\tstate.currentUsage = chunk.usage;\n\t\t\tbreak;\n\t}\n\n\treturn hitAnotherTool;\n};\n\nconst processToolTurn = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tstate: ToolLoopState,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tawait sendToolRunning(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\tconst result = await executeTool(\n\t\toptions,\n\t\tstate.currentToolName,\n\t\tstate.currentToolInput\n\t);\n\n\tawait sendToolComplete(\n\t\tsocket,\n\t\tstate.currentToolName,\n\t\tresult,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\toptions.onToolUse?.(state.currentToolName, state.currentToolInput, result);\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolUseBlock(\n\t\t\tstate.currentToolUseId,\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t),\n\t\trole: 'assistant'\n\t});\n\n\tstate.currentMessages.push({\n\t\tcontent: buildToolResultBlock(state.currentToolUseId, result),\n\t\trole: 'user'\n\t});\n\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst thinkingConfig = options.thinking\n\t\t? {\n\t\t\t\tbudget_tokens: typeof options.thinking === 'object'\n\t\t\t\t\t? options.thinking.budgetTokens\n\t\t\t\t\t: 10000,\n\t\t\t\ttype: 'enabled'\n\t\t\t}\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages: state.currentMessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\tthinking: thinkingConfig,\n\t\ttools: toolDefs\n\t});\n\n\treturn consumeToolStream(\n\t\tstream,\n\t\tstate,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal\n\t);\n};\n\nconst consumeToolStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\tstate: ToolLoopState,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal\n) => {\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst isToolHit = processToolChunk(\n\t\t\tchunk,\n\t\t\tstate,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId\n\t\t);\n\n\t\tif (isToolHit) return true;\n\t}\n\n\treturn false;\n};\n\nconst shouldContinueToolLoop = (\n\tstate: ToolLoopState,\n\tmaxTurns: number,\n\tsignal: AbortSignal\n) => state.currentTurn < maxTurns && !signal.aborted;\n\nconst executeToolLoop = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\ttoolUseId: string,\n\ttoolName: string,\n\ttoolInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tturn: number\n): Promise<ToolLoopResult> => {\n\tconst maxTurns = options.maxTurns ?? DEFAULT_MAX_TURNS;\n\n\tconst state: ToolLoopState = {\n\t\tcurrentFullResponse: fullResponse,\n\t\tcurrentMessages: [...messages],\n\t\tcurrentToolInput: toolInput,\n\t\tcurrentToolName: toolName,\n\t\tcurrentToolUseId: toolUseId,\n\t\tcurrentTurn: turn,\n\t\tcurrentUsage: undefined,\n\t\tpreviousToolCallKey: ''\n\t};\n\n\twhile (shouldContinueToolLoop(state, maxTurns, signal)) {\n\t\tconst currentKey = serializeToolCall(\n\t\t\tstate.currentToolName,\n\t\t\tstate.currentToolInput\n\t\t);\n\n\t\tif (currentKey === state.previousToolCallKey) {\n\t\t\tbreak;\n\t\t}\n\n\t\tstate.previousToolCallKey = currentKey;\n\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst hitAnotherTool = await processToolTurn(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tstate,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal\n\t\t);\n\n\t\tif (!hitAnotherTool) {\n\t\t\treturn {\n\t\t\t\tfullResponse: state.currentFullResponse,\n\t\t\t\tusage: state.currentUsage\n\t\t\t};\n\t\t}\n\n\t\tstate.currentTurn++;\n\t}\n\n\treturn {\n\t\tfullResponse: state.currentFullResponse,\n\t\tusage: state.currentUsage\n\t};\n};\n\nconst sendComplete = async (\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string,\n\tusage?: AIUsage,\n\tdurationMs?: number,\n\tmodel?: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tdurationMs,\n\t\tmessageId,\n\t\tmodel,\n\t\ttype: 'complete',\n\t\tusage\n\t});\n\nconst sendError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string\n) =>\n\tsendMessage(socket, {\n\t\tconversationId,\n\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\tmessageId,\n\t\ttype: 'error'\n\t});\n\nconst handleTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = extractTextContent(chunk, options.onChunk);\n\n\tawait sendMessage(socket, {\n\t\tcontent: textContent,\n\t\tconversationId,\n\t\tmessageId,\n\t\ttype: 'chunk'\n\t});\n\n\treturn textContent;\n};\n\nconst handleToolUseChunk = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tchunkId: string,\n\tchunkName: string,\n\tchunkInput: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tconst toolResult = await executeToolLoop(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunkId,\n\t\tchunkName,\n\t\tchunkInput,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tINITIAL_TURN\n\t);\n\n\tawait sendComplete(\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId,\n\t\ttoolResult.usage,\n\t\tDate.now() - startTime,\n\t\toptions.model\n\t);\n\toptions.onComplete?.(toolResult.fullResponse, toolResult.usage);\n\n\treturn toolResult;\n};\n\nconst processStreamTextChunk = async (\n\tchunk: AITextChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessageId: string,\n\tconversationId: string\n) => {\n\tconst textContent = await handleTextChunk(\n\t\tchunk,\n\t\toptions,\n\t\tsocket,\n\t\tmessageId,\n\t\tconversationId\n\t);\n\n\treturn textContent;\n};\n\nconst processStreamToolUseChunk = async (\n\tchunk: AIChunk & { type: 'tool_use' },\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tawait handleToolUseChunk(\n\t\tsocket,\n\t\toptions,\n\t\tmessages,\n\t\tchunk.id,\n\t\tchunk.name,\n\t\tchunk.input,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tfullResponse,\n\t\tstartTime\n\t);\n};\n\nconst processStream = async (\n\tsocket: AIWebSocket,\n\toptions: StreamAIOptions,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst toolDefs = options.tools\n\t\t? buildToolDefinitions(options.tools)\n\t\t: undefined;\n\n\tconst thinkingConfig = options.thinking\n\t\t? {\n\t\t\t\tbudget_tokens: typeof options.thinking === 'object'\n\t\t\t\t\t? options.thinking.budgetTokens\n\t\t\t\t\t: 10000,\n\t\t\t\ttype: 'enabled'\n\t\t\t}\n\t\t: undefined;\n\n\tconst stream = options.provider.stream({\n\t\tmessages,\n\t\tmodel: options.model,\n\t\tsignal,\n\t\tsystemPrompt: options.systemPrompt,\n\t\tthinking: thinkingConfig,\n\t\ttools: toolDefs\n\t});\n\n\tconst result = await consumeStream(\n\t\tstream,\n\t\toptions,\n\t\tsocket,\n\t\tmessages,\n\t\tmessageId,\n\t\tconversationId,\n\t\tsignal,\n\t\tstartTime\n\t);\n\n\tif (!result.earlyReturn) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tresult.usage,\n\t\t\tDate.now() - startTime,\n\t\t\toptions.model\n\t\t);\n\t\toptions.onComplete?.(result.fullResponse, result.usage);\n\t}\n};\n\ntype ConsumeStreamResult = {\n\tearlyReturn: boolean;\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst consumeStreamChunk = async (\n\tchunk: AIChunk,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tfullResponse: string,\n\tstartTime: number\n) => {\n\tswitch (chunk.type) {\n\t\tcase 'thinking':\n\t\t\tawait sendMessage(socket, {\n\t\t\t\tcontent: chunk.content,\n\t\t\t\tconversationId,\n\t\t\t\tmessageId,\n\t\t\t\ttype: 'thinking'\n\t\t\t});\n\n\t\t\treturn '';\n\n\t\tcase 'text':\n\t\t\treturn processStreamTextChunk(\n\t\t\t\tchunk,\n\t\t\t\toptions,\n\t\t\t\tsocket,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId\n\t\t\t);\n\n\t\tcase 'tool_use':\n\t\t\tawait processStreamToolUseChunk(\n\t\t\t\tchunk,\n\t\t\t\tsocket,\n\t\t\t\toptions,\n\t\t\t\tmessages,\n\t\t\t\tmessageId,\n\t\t\t\tconversationId,\n\t\t\t\tsignal,\n\t\t\t\tfullResponse,\n\t\t\t\tstartTime\n\t\t\t);\n\n\t\t\treturn { earlyReturn: true, fullResponse, usage: undefined };\n\n\t\tcase 'done':\n\t\t\treturn { earlyReturn: false, fullResponse, usage: chunk.usage };\n\t}\n\n\treturn '';\n};\n\ntype ConsumeStreamState = {\n\tfullResponse: string;\n\tusage: AIUsage | undefined;\n};\n\nconst applyStreamChunkResult = (\n\tresult: ConsumeStreamResult | string,\n\tstate: ConsumeStreamState\n) => {\n\tif (typeof result === 'string') {\n\t\tstate.fullResponse += result;\n\n\t\treturn undefined;\n\t}\n\n\tif (result.earlyReturn) return result;\n\n\tstate.usage = result.usage;\n\n\treturn undefined;\n};\n\nconst consumeStream = async (\n\tstream: AsyncIterable<AIChunk>,\n\toptions: StreamAIOptions,\n\tsocket: AIWebSocket,\n\tmessages: AIProviderMessage[],\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tconst state: ConsumeStreamState = { fullResponse: '', usage: undefined };\n\n\tfor await (const chunk of stream) {\n\t\tif (signal.aborted) break;\n\n\t\tconst result = await consumeStreamChunk(\n\t\t\tchunk,\n\t\t\toptions,\n\t\t\tsocket,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstate.fullResponse,\n\t\t\tstartTime\n\t\t);\n\t\tconst earlyExit = applyStreamChunkResult(result, state);\n\n\t\tif (earlyExit) return earlyExit;\n\t}\n\n\tconst finalResult: ConsumeStreamResult = {\n\t\tearlyReturn: false,\n\t\tfullResponse: state.fullResponse,\n\t\tusage: state.usage\n\t};\n\n\treturn finalResult;\n};\n\nexport const streamAI = async (\n\tsocket: AIWebSocket,\n\tconversationId: string,\n\tmessageId: string,\n\toptions: StreamAIOptions\n) => {\n\tconst signal = options.signal ?? new AbortController().signal;\n\tconst startTime = Date.now();\n\n\tconst messages: AIProviderMessage[] = options.messages\n\t\t? [...options.messages]\n\t\t: [];\n\n\ttry {\n\t\tawait processStream(\n\t\t\tsocket,\n\t\t\toptions,\n\t\t\tmessages,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t} catch (err) {\n\t\tawait handleStreamError(\n\t\t\tsocket,\n\t\t\terr,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tsignal,\n\t\t\tstartTime\n\t\t);\n\t}\n};\n\nconst handleStreamError = async (\n\tsocket: AIWebSocket,\n\terr: unknown,\n\tmessageId: string,\n\tconversationId: string,\n\tsignal: AbortSignal,\n\tstartTime: number\n) => {\n\tif (signal.aborted) {\n\t\tawait sendComplete(\n\t\t\tsocket,\n\t\t\tmessageId,\n\t\t\tconversationId,\n\t\t\tundefined,\n\t\t\tDate.now() - startTime\n\t\t);\n\n\t\treturn;\n\t}\n\n\tawait sendError(socket, err, messageId, conversationId);\n};\n"
12
12
  ],
13
- "mappings": "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",
14
- "debugId": "9014285FCC27A5E164756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "0917CFAC1D8BB99A64756E2164756E21",
15
15
  "names": []
16
16
  }
@@ -83,6 +83,12 @@ var DATA_PREFIX_LENGTH = 6;
83
83
  var EMPTY_CHUNKS = [];
84
84
  var isRecord = (val) => typeof val === "object" && val !== null;
85
85
  var mapContentBlock = (block) => {
86
+ if (block.type === "image") {
87
+ return {
88
+ source: block.source,
89
+ type: "image"
90
+ };
91
+ }
86
92
  if (block.type === "tool_result") {
87
93
  return {
88
94
  content: block.content,
@@ -123,6 +129,10 @@ var buildRequestBody = (params) => {
123
129
  if (params.tools && params.tools.length > 0) {
124
130
  body.tools = params.tools.map(mapToolDefinition);
125
131
  }
132
+ if (params.thinking) {
133
+ body.thinking = params.thinking;
134
+ body.max_tokens = Math.max(MAX_TOKENS, params.thinking.budget_tokens + MAX_TOKENS);
135
+ }
126
136
  return body;
127
137
  };
128
138
  var classifyLine = (line) => {
@@ -203,6 +213,12 @@ var handleContentBlockDelta = (parsed, state) => {
203
213
  if (!delta) {
204
214
  return;
205
215
  }
216
+ if (delta.type === "thinking_delta") {
217
+ return {
218
+ content: getString(delta, "thinking"),
219
+ type: "thinking"
220
+ };
221
+ }
206
222
  if (delta.type === "text_delta") {
207
223
  return {
208
224
  content: getString(delta, "text"),
@@ -392,5 +408,5 @@ export {
392
408
  anthropic
393
409
  };
394
410
 
395
- //# debugId=52B30E27186BE50564756E2164756E21
411
+ //# debugId=11F4224A486C49B264756E2164756E21
396
412
  //# sourceMappingURL=anthropic.js.map