@cochon123/cli2api 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/dist/adapters/claude.d.ts +27 -0
  4. package/dist/adapters/claude.js +253 -0
  5. package/dist/adapters/claude.js.map +1 -0
  6. package/dist/adapters/codex.d.ts +51 -0
  7. package/dist/adapters/codex.js +491 -0
  8. package/dist/adapters/codex.js.map +1 -0
  9. package/dist/adapters/cursor.d.ts +31 -0
  10. package/dist/adapters/cursor.js +231 -0
  11. package/dist/adapters/cursor.js.map +1 -0
  12. package/dist/adapters/mock.d.ts +2 -0
  13. package/dist/adapters/mock.js +101 -0
  14. package/dist/adapters/mock.js.map +1 -0
  15. package/dist/adapters/opencode.d.ts +27 -0
  16. package/dist/adapters/opencode.js +208 -0
  17. package/dist/adapters/opencode.js.map +1 -0
  18. package/dist/adapters/registry.d.ts +33 -0
  19. package/dist/adapters/registry.js +99 -0
  20. package/dist/adapters/registry.js.map +1 -0
  21. package/dist/adapters/types.d.ts +18 -0
  22. package/dist/adapters/types.js +35 -0
  23. package/dist/adapters/types.js.map +1 -0
  24. package/dist/config.d.ts +126 -0
  25. package/dist/config.js +121 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +253 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/openrouter/catalog.d.ts +28 -0
  31. package/dist/openrouter/catalog.js +162 -0
  32. package/dist/openrouter/catalog.js.map +1 -0
  33. package/dist/protocol/openai.d.ts +48 -0
  34. package/dist/protocol/openai.js +236 -0
  35. package/dist/protocol/openai.js.map +1 -0
  36. package/dist/protocol/responses.d.ts +57 -0
  37. package/dist/protocol/responses.js +142 -0
  38. package/dist/protocol/responses.js.map +1 -0
  39. package/dist/protocol/tools.d.ts +7 -0
  40. package/dist/protocol/tools.js +143 -0
  41. package/dist/protocol/tools.js.map +1 -0
  42. package/dist/server/app.d.ts +25 -0
  43. package/dist/server/app.js +425 -0
  44. package/dist/server/app.js.map +1 -0
  45. package/dist/server/listen.d.ts +18 -0
  46. package/dist/server/listen.js +30 -0
  47. package/dist/server/listen.js.map +1 -0
  48. package/dist/session.d.ts +9 -0
  49. package/dist/session.js +39 -0
  50. package/dist/session.js.map +1 -0
  51. package/dist/types.d.ts +192 -0
  52. package/dist/types.js +3 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/util/process.d.ts +38 -0
  55. package/dist/util/process.js +292 -0
  56. package/dist/util/process.js.map +1 -0
  57. package/package.json +65 -0
@@ -0,0 +1,236 @@
1
+ import { Ajv } from "ajv";
2
+ const schemaCompiler = new Ajv({ strict: false });
3
+ export function messageContentToText(content) {
4
+ if (content == null)
5
+ return "";
6
+ if (typeof content === "string")
7
+ return content;
8
+ return content
9
+ .map((part) => {
10
+ if (part.type === "text" && typeof part.text === "string")
11
+ return part.text;
12
+ if (part.type === "image_url")
13
+ return "[image]";
14
+ return "";
15
+ })
16
+ .filter(Boolean)
17
+ .join("\n");
18
+ }
19
+ /** Flatten OpenAI chat messages into a single prompt for CLI backends. */
20
+ export function messagesToPrompt(messages) {
21
+ const parts = [];
22
+ for (const msg of messages) {
23
+ const text = messageContentToText(msg.content).trim();
24
+ const calls = Array.isArray(msg.tool_calls) && msg.tool_calls.length
25
+ ? JSON.stringify({ tool_calls: msg.tool_calls })
26
+ : "";
27
+ if (!text && !calls)
28
+ continue;
29
+ const role = (msg.role || "user").toUpperCase();
30
+ parts.push(`${role}:\n${text || calls}`);
31
+ }
32
+ parts.push("ASSISTANT:");
33
+ return parts.join("\n\n");
34
+ }
35
+ function trailingMessages(messages) {
36
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
37
+ if (messages[index].role === "assistant")
38
+ return messages.slice(index + 1);
39
+ }
40
+ return messages;
41
+ }
42
+ function toolInstructions(tools, choice) {
43
+ if (!tools.length || choice === "none")
44
+ return "";
45
+ const definitions = tools.map((tool) => tool.function);
46
+ const forced = typeof choice === "object" ? choice.function.name : undefined;
47
+ const requirement = forced
48
+ ? `You must call the function named ${forced}.`
49
+ : choice === "required"
50
+ ? "You must call one or more functions."
51
+ : "Call a function only when it is useful.";
52
+ return [
53
+ "AVAILABLE FUNCTIONS:",
54
+ JSON.stringify(definitions),
55
+ requirement,
56
+ "To call functions, return only valid JSON in this exact shape:",
57
+ '{"tool_calls":[{"name":"function_name","arguments":{}}]}',
58
+ "Do not wrap the JSON in markdown.",
59
+ ].join("\n");
60
+ }
61
+ /** Build the CLI prompt, avoiding replay of old turns when resuming a native session. */
62
+ export function requestToPrompt(req) {
63
+ const messages = req.nativeSessionId ? trailingMessages(req.messages) : req.messages;
64
+ const prompt = messagesToPrompt(messages.length ? messages : req.messages);
65
+ const tools = toolInstructions(req.tools, req.toolChoice);
66
+ return tools ? `${prompt}\n\n${tools}` : prompt;
67
+ }
68
+ /** Extract just the last user message (useful for agent-mode CLIs). */
69
+ export function lastUserMessage(messages) {
70
+ for (let i = messages.length - 1; i >= 0; i--) {
71
+ if (messages[i].role === "user") {
72
+ return messageContentToText(messages[i].content).trim();
73
+ }
74
+ }
75
+ return messagesToPrompt(messages);
76
+ }
77
+ export function parseModelId(model) {
78
+ const slash = model.indexOf("/");
79
+ if (slash <= 0)
80
+ return { modelLocal: model };
81
+ return {
82
+ adapter: model.slice(0, slash),
83
+ modelLocal: model.slice(slash + 1) || model,
84
+ };
85
+ }
86
+ export function normalizeChatRequest(body) {
87
+ const invalid = (message) => {
88
+ throw Object.assign(new Error(message), { status: 400 });
89
+ };
90
+ if (!body || typeof body !== "object") {
91
+ invalid("Request body must be a JSON object");
92
+ }
93
+ if (!body.model || typeof body.model !== "string") {
94
+ invalid("`model` is required");
95
+ }
96
+ if (!Array.isArray(body.messages) || body.messages.length === 0) {
97
+ invalid("`messages` must be a non-empty array");
98
+ }
99
+ const validRoles = new Set(["system", "developer", "user", "assistant", "tool"]);
100
+ for (let index = 0; index < body.messages.length; index += 1) {
101
+ const rawMessage = body.messages[index];
102
+ if (!rawMessage || typeof rawMessage !== "object")
103
+ invalid(`messages[${index}] must be an object`);
104
+ const message = rawMessage;
105
+ if (!validRoles.has(message.role)) {
106
+ invalid(`messages[${index}] must have a supported role`);
107
+ }
108
+ if (message.content !== null && typeof message.content !== "string" && !Array.isArray(message.content)) {
109
+ invalid(`messages[${index}].content must be a string, array, or null`);
110
+ }
111
+ if (Array.isArray(message.content) && message.content.some((part) => !part || typeof part !== "object" || typeof part.type !== "string")) {
112
+ invalid(`messages[${index}].content contains an invalid content part`);
113
+ }
114
+ if (message.role === "tool" && (!message.tool_call_id || typeof message.tool_call_id !== "string")) {
115
+ invalid(`messages[${index}].tool_call_id is required for tool messages`);
116
+ }
117
+ }
118
+ if (body.stream !== undefined && typeof body.stream !== "boolean")
119
+ invalid("`stream` must be a boolean");
120
+ if (body.temperature !== undefined && (!Number.isFinite(body.temperature) || body.temperature < 0 || body.temperature > 2)) {
121
+ invalid("`temperature` must be between 0 and 2");
122
+ }
123
+ if (body.max_tokens !== undefined && (!Number.isInteger(body.max_tokens) || body.max_tokens < 1)) {
124
+ invalid("`max_tokens` must be a positive integer");
125
+ }
126
+ if (body.max_completion_tokens !== undefined && (!Number.isInteger(body.max_completion_tokens) || body.max_completion_tokens < 1)) {
127
+ invalid("`max_completion_tokens` must be a positive integer");
128
+ }
129
+ if (body.include_reasoning !== undefined && typeof body.include_reasoning !== "boolean") {
130
+ invalid("`include_reasoning` must be a boolean");
131
+ }
132
+ if (body.reasoning !== undefined && (!body.reasoning || typeof body.reasoning !== "object" || Array.isArray(body.reasoning))) {
133
+ invalid("`reasoning` must be an object");
134
+ }
135
+ if (body.tools !== undefined && !Array.isArray(body.tools))
136
+ invalid("`tools` must be an array");
137
+ const tools = body.tools ?? [];
138
+ for (let index = 0; index < tools.length; index += 1) {
139
+ const rawTool = tools[index];
140
+ if (!rawTool || typeof rawTool !== "object")
141
+ invalid(`tools[${index}] must be an object`);
142
+ const tool = rawTool;
143
+ if (tool.type !== "function" || !tool.function || typeof tool.function !== "object") {
144
+ invalid(`tools[${index}] must be a function tool`);
145
+ }
146
+ if (typeof tool.function.name !== "string" || !tool.function.name.trim())
147
+ invalid(`tools[${index}].function.name is required`);
148
+ if (tool.function.parameters !== undefined && (!tool.function.parameters || typeof tool.function.parameters !== "object" || Array.isArray(tool.function.parameters))) {
149
+ invalid(`tools[${index}].function.parameters must be a JSON Schema object`);
150
+ }
151
+ if (tool.function.strict !== undefined && typeof tool.function.strict !== "boolean")
152
+ invalid(`tools[${index}].function.strict must be a boolean`);
153
+ if (tool.function.strict) {
154
+ try {
155
+ schemaCompiler.compile(tool.function.parameters ?? { type: "object" });
156
+ }
157
+ catch (error) {
158
+ invalid(`tools[${index}].function.parameters is not a valid JSON Schema: ${error instanceof Error ? error.message : String(error)}`);
159
+ }
160
+ }
161
+ }
162
+ const choice = body.tool_choice;
163
+ if (choice !== undefined && choice !== "none" && choice !== "auto" && choice !== "required") {
164
+ if (!choice || typeof choice !== "object" || choice.type !== "function" || !choice.function || typeof choice.function.name !== "string" || !choice.function.name) {
165
+ invalid("`tool_choice` must be none, auto, required, or a named function choice");
166
+ }
167
+ if (!tools.some((tool) => tool.function.name === choice.function.name)) {
168
+ invalid(`tool_choice references undeclared function: ${choice.function.name}`);
169
+ }
170
+ }
171
+ if ((choice === "required" || (typeof choice === "object" && choice)) && tools.length === 0) {
172
+ invalid("`tool_choice` requires at least one valid function tool");
173
+ }
174
+ const { modelLocal } = parseModelId(body.model);
175
+ return {
176
+ model: body.model,
177
+ modelLocal,
178
+ messages: body.messages,
179
+ stream: Boolean(body.stream),
180
+ temperature: typeof body.temperature === "number" ? body.temperature : undefined,
181
+ maxTokens: typeof body.max_completion_tokens === "number"
182
+ ? body.max_completion_tokens
183
+ : typeof body.max_tokens === "number" ? body.max_tokens : undefined,
184
+ raw: body,
185
+ tools,
186
+ toolChoice: body.tool_choice,
187
+ sessionId: typeof body.session_id === "string" && body.session_id ? body.session_id : undefined,
188
+ };
189
+ }
190
+ export function completionId(prefix = "chatcmpl") {
191
+ const separator = prefix === "chatcmpl" ? "_" : "-";
192
+ return `${prefix}${separator}${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`;
193
+ }
194
+ export function buildCompletionResponse(opts) {
195
+ return {
196
+ id: opts.id,
197
+ object: "chat.completion",
198
+ created: Math.floor(Date.now() / 1000),
199
+ model: opts.model,
200
+ choices: [
201
+ {
202
+ index: 0,
203
+ message: {
204
+ role: "assistant",
205
+ content: opts.toolCalls?.length ? null : opts.content,
206
+ ...(opts.reasoning ? { reasoning: opts.reasoning, reasoning_content: opts.reasoning } : {}),
207
+ ...(opts.toolCalls?.length ? { tool_calls: opts.toolCalls } : {}),
208
+ },
209
+ finish_reason: opts.finishReason ?? "stop",
210
+ ...(opts.openRouter ? { native_finish_reason: opts.finishReason ?? "stop" } : {}),
211
+ },
212
+ ],
213
+ usage: opts.usage,
214
+ };
215
+ }
216
+ export function buildChunk(opts) {
217
+ return {
218
+ id: opts.id,
219
+ object: "chat.completion.chunk",
220
+ created: Math.floor(Date.now() / 1000),
221
+ model: opts.model,
222
+ choices: opts.emptyChoices ? [] : [
223
+ {
224
+ index: 0,
225
+ delta: opts.delta ?? {},
226
+ finish_reason: opts.finishReason ?? null,
227
+ ...(opts.openRouter ? { native_finish_reason: opts.finishReason ?? null } : {}),
228
+ },
229
+ ],
230
+ ...(opts.usage ? { usage: opts.usage } : {}),
231
+ };
232
+ }
233
+ export function sseLine(data) {
234
+ return `data: ${JSON.stringify(data)}\n\n`;
235
+ }
236
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/protocol/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { ChatCompletionRequest, ToolCall } from "../types.js";
2
+ export interface ResponsesRequest {
3
+ model: string;
4
+ input: string | Array<Record<string, unknown>>;
5
+ instructions?: string | null;
6
+ stream?: boolean;
7
+ tools?: Array<{
8
+ type: "function";
9
+ name: string;
10
+ description?: string;
11
+ parameters?: Record<string, unknown>;
12
+ strict?: boolean;
13
+ }>;
14
+ tool_choice?: "none" | "auto" | "required" | {
15
+ type: "function";
16
+ name: string;
17
+ };
18
+ previous_response_id?: string;
19
+ temperature?: number;
20
+ max_output_tokens?: number;
21
+ }
22
+ export declare function responsesToChat(body: ResponsesRequest): ChatCompletionRequest;
23
+ export declare function responseId(): string;
24
+ export interface ResponseObject {
25
+ id: string;
26
+ object: "response";
27
+ created_at: number;
28
+ status: "in_progress" | "completed" | "failed";
29
+ model: string;
30
+ output: Array<Record<string, unknown>>;
31
+ usage?: {
32
+ input_tokens: number;
33
+ output_tokens: number;
34
+ total_tokens: number;
35
+ };
36
+ error: null | {
37
+ message: string;
38
+ code?: string;
39
+ };
40
+ incomplete_details: null;
41
+ }
42
+ export declare function messageOutput(id: string, text: string): Record<string, unknown>;
43
+ export declare function functionOutput(call: ToolCall): Record<string, unknown>;
44
+ export declare function buildResponse(opts: {
45
+ id: string;
46
+ model: string;
47
+ text?: string;
48
+ reasoning?: string;
49
+ toolCalls?: ToolCall[];
50
+ usage?: {
51
+ prompt_tokens: number;
52
+ completion_tokens: number;
53
+ total_tokens: number;
54
+ };
55
+ status?: ResponseObject["status"];
56
+ error?: ResponseObject["error"];
57
+ }): ResponseObject;
@@ -0,0 +1,142 @@
1
+ function contentText(value) {
2
+ if (typeof value === "string")
3
+ return value;
4
+ if (!Array.isArray(value))
5
+ return "";
6
+ return value.map((part) => {
7
+ if (!part || typeof part !== "object")
8
+ return "";
9
+ const item = part;
10
+ return typeof item.text === "string" ? item.text : "";
11
+ }).filter(Boolean).join("\n");
12
+ }
13
+ function inputToMessages(input) {
14
+ if (typeof input === "string")
15
+ return [{ role: "user", content: input }];
16
+ const messages = [];
17
+ for (let index = 0; index < input.length; index += 1) {
18
+ const raw = input[index];
19
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
20
+ throw new Error(`input[${index}] must be an object`);
21
+ if (raw.type === "function_call_output") {
22
+ messages.push({ role: "tool", tool_call_id: String(raw.call_id ?? ""), content: contentText(raw.output) });
23
+ }
24
+ else if (raw.type === "function_call") {
25
+ messages.push({
26
+ role: "assistant",
27
+ content: null,
28
+ tool_calls: [{
29
+ id: String(raw.call_id ?? raw.id ?? ""),
30
+ type: "function",
31
+ function: { name: String(raw.name ?? ""), arguments: String(raw.arguments ?? "{}") },
32
+ }],
33
+ });
34
+ }
35
+ else if (typeof raw.role === "string") {
36
+ messages.push({ role: raw.role, content: contentText(raw.content) });
37
+ }
38
+ }
39
+ return messages;
40
+ }
41
+ export function responsesToChat(body) {
42
+ if (!body || typeof body !== "object")
43
+ throw new Error("Request body must be a JSON object");
44
+ if (!body.model || typeof body.model !== "string")
45
+ throw new Error("`model` is required");
46
+ if (typeof body.input !== "string" && !Array.isArray(body.input))
47
+ throw new Error("`input` is required");
48
+ if (body.stream !== undefined && typeof body.stream !== "boolean")
49
+ throw new Error("`stream` must be a boolean");
50
+ if (body.temperature !== undefined && (!Number.isFinite(body.temperature) || body.temperature < 0 || body.temperature > 2))
51
+ throw new Error("`temperature` must be between 0 and 2");
52
+ if (body.max_output_tokens !== undefined && (!Number.isInteger(body.max_output_tokens) || body.max_output_tokens < 1))
53
+ throw new Error("`max_output_tokens` must be a positive integer");
54
+ if (body.tools !== undefined && !Array.isArray(body.tools))
55
+ throw new Error("`tools` must be an array");
56
+ for (let index = 0; index < (body.tools?.length ?? 0); index += 1) {
57
+ const tool = body.tools[index];
58
+ if (!tool || typeof tool !== "object" || tool.type !== "function" || typeof tool.name !== "string" || !tool.name.trim()) {
59
+ throw new Error(`tools[${index}] must be a named function tool`);
60
+ }
61
+ if (tool.parameters !== undefined && (!tool.parameters || typeof tool.parameters !== "object" || Array.isArray(tool.parameters))) {
62
+ throw new Error(`tools[${index}].parameters must be a JSON Schema object`);
63
+ }
64
+ if (tool.strict !== undefined && typeof tool.strict !== "boolean")
65
+ throw new Error(`tools[${index}].strict must be a boolean`);
66
+ }
67
+ if (body.instructions !== undefined && body.instructions !== null && typeof body.instructions !== "string") {
68
+ throw new Error("`instructions` must be a string or null");
69
+ }
70
+ const messages = inputToMessages(body.input);
71
+ if (body.instructions)
72
+ messages.unshift({ role: "developer", content: body.instructions });
73
+ if (!messages.length)
74
+ throw new Error("`input` must contain at least one supported input item");
75
+ const tools = (body.tools ?? []).map((tool) => ({
76
+ type: "function",
77
+ function: {
78
+ name: tool.name,
79
+ description: tool.description,
80
+ parameters: tool.parameters,
81
+ strict: tool.strict,
82
+ },
83
+ }));
84
+ const rawChoice = body.tool_choice;
85
+ if (rawChoice !== undefined && rawChoice !== "none" && rawChoice !== "auto" && rawChoice !== "required") {
86
+ if (!rawChoice || typeof rawChoice !== "object" || rawChoice.type !== "function" || typeof rawChoice.name !== "string" || !rawChoice.name) {
87
+ throw new Error("`tool_choice` must be none, auto, required, or a named function choice");
88
+ }
89
+ if (!tools.some((tool) => tool.function.name === rawChoice.name))
90
+ throw new Error(`tool_choice references undeclared function: ${rawChoice.name}`);
91
+ }
92
+ if ((rawChoice === "required" || (typeof rawChoice === "object" && rawChoice)) && tools.length === 0)
93
+ throw new Error("`tool_choice` requires at least one valid function tool");
94
+ const choice = typeof rawChoice === "object"
95
+ ? { type: "function", function: { name: rawChoice.name } }
96
+ : rawChoice;
97
+ return {
98
+ model: body.model,
99
+ messages,
100
+ stream: body.stream,
101
+ tools,
102
+ tool_choice: choice,
103
+ session_id: body.previous_response_id,
104
+ temperature: body.temperature,
105
+ max_tokens: body.max_output_tokens,
106
+ };
107
+ }
108
+ export function responseId() {
109
+ return `resp_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`;
110
+ }
111
+ export function messageOutput(id, text) {
112
+ return {
113
+ id, type: "message", role: "assistant", status: "completed",
114
+ content: [{ type: "output_text", text, annotations: [] }],
115
+ };
116
+ }
117
+ export function functionOutput(call) {
118
+ return {
119
+ id: `fc_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`,
120
+ type: "function_call",
121
+ status: "completed",
122
+ call_id: call.id,
123
+ name: call.function.name,
124
+ arguments: call.function.arguments,
125
+ };
126
+ }
127
+ export function buildResponse(opts) {
128
+ const output = [];
129
+ if (opts.reasoning)
130
+ output.push({ id: `rs_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`, type: "reasoning", summary: [{ type: "summary_text", text: opts.reasoning }] });
131
+ for (const call of opts.toolCalls ?? [])
132
+ output.push(functionOutput(call));
133
+ if (!(opts.toolCalls?.length))
134
+ output.push(messageOutput(`msg_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`, opts.text ?? ""));
135
+ return {
136
+ id: opts.id, object: "response", created_at: Math.floor(Date.now() / 1000),
137
+ status: opts.status ?? "completed", model: opts.model, output,
138
+ usage: opts.usage ? { input_tokens: opts.usage.prompt_tokens, output_tokens: opts.usage.completion_tokens, total_tokens: opts.usage.total_tokens } : undefined,
139
+ error: opts.error ?? null, incomplete_details: null,
140
+ };
141
+ }
142
+ //# sourceMappingURL=responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/protocol/responses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ChatEvent, NormalizedChatRequest, ToolCall } from "../types.js";
2
+ export declare function parseToolCalls(text: string, req: NormalizedChatRequest): ToolCall[];
3
+ /**
4
+ * Tool-capable requests buffer assistant content so a JSON call envelope never
5
+ * leaks as normal text. Reasoning and session events remain live.
6
+ */
7
+ export declare function transformToolEvents(events: AsyncIterable<ChatEvent>, req: NormalizedChatRequest): AsyncIterable<ChatEvent>;
@@ -0,0 +1,143 @@
1
+ import { Ajv } from "ajv";
2
+ const ajv = new Ajv({ allErrors: true, strict: false });
3
+ function parseJsonObject(text) {
4
+ const trimmed = text.trim().replace(/^```(?:json)?\s*/i, "").replace(/\s*```$/, "");
5
+ const candidates = [trimmed];
6
+ const first = trimmed.indexOf("{");
7
+ const last = trimmed.lastIndexOf("}");
8
+ if (first >= 0 && last > first)
9
+ candidates.push(trimmed.slice(first, last + 1));
10
+ for (const candidate of candidates) {
11
+ try {
12
+ const value = JSON.parse(candidate);
13
+ if (value && typeof value === "object" && !Array.isArray(value)) {
14
+ return value;
15
+ }
16
+ }
17
+ catch {
18
+ // Try the next extraction.
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ function callFromUnknown(value, req) {
24
+ if (!value || typeof value !== "object")
25
+ return null;
26
+ const raw = value;
27
+ const nested = raw.function && typeof raw.function === "object"
28
+ ? raw.function
29
+ : raw;
30
+ const name = typeof nested.name === "string"
31
+ ? nested.name
32
+ : typeof raw.tool === "string"
33
+ ? raw.tool
34
+ : "";
35
+ const definition = req.tools.find((tool) => tool.function.name === name)?.function;
36
+ if (!name || !definition)
37
+ return null;
38
+ const args = nested.arguments ?? raw.arguments ?? {};
39
+ let argumentsJson;
40
+ if (typeof args === "string") {
41
+ try {
42
+ const parsed = JSON.parse(args);
43
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
44
+ return null;
45
+ argumentsJson = args;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ else {
52
+ if (!args || typeof args !== "object" || Array.isArray(args))
53
+ return null;
54
+ argumentsJson = JSON.stringify(args ?? {});
55
+ }
56
+ if (definition.strict) {
57
+ try {
58
+ const validate = ajv.compile(definition.parameters ?? { type: "object" });
59
+ if (!validate(JSON.parse(argumentsJson)))
60
+ return null;
61
+ }
62
+ catch {
63
+ // Invalid schemas are rejected at the tool-call boundary as well.
64
+ return null;
65
+ }
66
+ }
67
+ return {
68
+ id: typeof raw.id === "string" && raw.id ? raw.id : `call_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`,
69
+ type: "function",
70
+ function: { name, arguments: argumentsJson },
71
+ };
72
+ }
73
+ export function parseToolCalls(text, req) {
74
+ const object = parseJsonObject(text);
75
+ if (!object)
76
+ return [];
77
+ const rawCalls = Array.isArray(object.tool_calls)
78
+ ? object.tool_calls
79
+ : object.tool || object.name
80
+ ? [object]
81
+ : [];
82
+ return rawCalls
83
+ .map((value) => callFromUnknown(value, req))
84
+ .filter((value) => Boolean(value));
85
+ }
86
+ /**
87
+ * Tool-capable requests buffer assistant content so a JSON call envelope never
88
+ * leaks as normal text. Reasoning and session events remain live.
89
+ */
90
+ export async function* transformToolEvents(events, req) {
91
+ if (!req.tools.length || req.toolChoice === "none") {
92
+ yield* events;
93
+ return;
94
+ }
95
+ let content = "";
96
+ let done;
97
+ let nativeCalls = false;
98
+ let invalidNativeCalls = false;
99
+ for await (const event of events) {
100
+ if (event.type === "delta" && (event.channel ?? "content") === "content") {
101
+ content += event.text;
102
+ }
103
+ else if (event.type === "done") {
104
+ done = event;
105
+ }
106
+ else if (event.type === "tool_call") {
107
+ const validated = callFromUnknown(event.call, req);
108
+ if (validated) {
109
+ nativeCalls = true;
110
+ yield { type: "tool_call", call: validated };
111
+ }
112
+ else {
113
+ invalidNativeCalls = true;
114
+ }
115
+ }
116
+ else {
117
+ yield event;
118
+ }
119
+ }
120
+ if (nativeCalls) {
121
+ yield { ...(done ?? { type: "done", finishReason: "tool_calls" }), finishReason: "tool_calls" };
122
+ return;
123
+ }
124
+ if (invalidNativeCalls) {
125
+ yield { type: "error", message: "Adapter returned a tool call that failed function or strict schema validation", code: "invalid_tool_call" };
126
+ return;
127
+ }
128
+ const calls = parseToolCalls(content, req);
129
+ if (calls.length) {
130
+ for (const call of calls)
131
+ yield { type: "tool_call", call };
132
+ yield { type: "done", finishReason: "tool_calls", usage: done?.usage };
133
+ return;
134
+ }
135
+ if (req.toolChoice === "required" || typeof req.toolChoice === "object") {
136
+ yield { type: "error", message: "Model did not return a valid required tool call", code: "tool_call_expected" };
137
+ return;
138
+ }
139
+ if (content)
140
+ yield { type: "delta", text: content, channel: "content" };
141
+ yield done ?? { type: "done", finishReason: "stop" };
142
+ }
143
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/protocol/tools.ts"],"names":[],"mappings":"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"}