@pentoshi/clai 3.5.1 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/context-manager.js +8 -2
  3. package/dist/agent/context-manager.js.map +1 -1
  4. package/dist/agent/loop-guard.d.ts +2 -0
  5. package/dist/agent/loop-guard.js +39 -2
  6. package/dist/agent/loop-guard.js.map +1 -1
  7. package/dist/agent/plan-tool.d.ts +22 -0
  8. package/dist/agent/plan-tool.js +357 -44
  9. package/dist/agent/plan-tool.js.map +1 -1
  10. package/dist/agent/project-root.d.ts +33 -0
  11. package/dist/agent/project-root.js +158 -0
  12. package/dist/agent/project-root.js.map +1 -0
  13. package/dist/agent/runner.js +1119 -240
  14. package/dist/agent/runner.js.map +1 -1
  15. package/dist/agent/task-evidence.d.ts +103 -0
  16. package/dist/agent/task-evidence.js +413 -0
  17. package/dist/agent/task-evidence.js.map +1 -0
  18. package/dist/agent/tool-call-parser.d.ts +16 -0
  19. package/dist/agent/tool-call-parser.js +86 -28
  20. package/dist/agent/tool-call-parser.js.map +1 -1
  21. package/dist/agent/tool-history.d.ts +27 -0
  22. package/dist/agent/tool-history.js +150 -0
  23. package/dist/agent/tool-history.js.map +1 -0
  24. package/dist/agent/workspace-orient.d.ts +64 -0
  25. package/dist/agent/workspace-orient.js +418 -0
  26. package/dist/agent/workspace-orient.js.map +1 -0
  27. package/dist/app/controllers/session-controller.js +4 -0
  28. package/dist/app/controllers/session-controller.js.map +1 -1
  29. package/dist/commands/doctor.js +3 -0
  30. package/dist/commands/doctor.js.map +1 -1
  31. package/dist/commands/update.js +1 -1
  32. package/dist/llm/adapters/anthropic-tools.d.ts +99 -0
  33. package/dist/llm/adapters/anthropic-tools.js +225 -0
  34. package/dist/llm/adapters/anthropic-tools.js.map +1 -0
  35. package/dist/llm/adapters/gemini-tools.d.ts +54 -0
  36. package/dist/llm/adapters/gemini-tools.js +139 -0
  37. package/dist/llm/adapters/gemini-tools.js.map +1 -0
  38. package/dist/llm/adapters/ollama-tools.d.ts +22 -0
  39. package/dist/llm/adapters/ollama-tools.js +62 -0
  40. package/dist/llm/adapters/ollama-tools.js.map +1 -0
  41. package/dist/llm/adapters/openai-tools.d.ts +39 -0
  42. package/dist/llm/adapters/openai-tools.js +71 -0
  43. package/dist/llm/adapters/openai-tools.js.map +1 -0
  44. package/dist/llm/agentrouter.js +23 -4
  45. package/dist/llm/agentrouter.js.map +1 -1
  46. package/dist/llm/anthropic.js +93 -92
  47. package/dist/llm/anthropic.js.map +1 -1
  48. package/dist/llm/aws-mantle.js +93 -56
  49. package/dist/llm/aws-mantle.js.map +1 -1
  50. package/dist/llm/bynara.js +23 -4
  51. package/dist/llm/bynara.js.map +1 -1
  52. package/dist/llm/capabilities.d.ts +7 -0
  53. package/dist/llm/capabilities.js +74 -0
  54. package/dist/llm/capabilities.js.map +1 -1
  55. package/dist/llm/gemini.js +63 -48
  56. package/dist/llm/gemini.js.map +1 -1
  57. package/dist/llm/groq.js +23 -4
  58. package/dist/llm/groq.js.map +1 -1
  59. package/dist/llm/http.d.ts +22 -17
  60. package/dist/llm/http.js +99 -26
  61. package/dist/llm/http.js.map +1 -1
  62. package/dist/llm/kimchi.js +23 -4
  63. package/dist/llm/kimchi.js.map +1 -1
  64. package/dist/llm/nvidia.js +23 -4
  65. package/dist/llm/nvidia.js.map +1 -1
  66. package/dist/llm/ollama.js +49 -31
  67. package/dist/llm/ollama.js.map +1 -1
  68. package/dist/llm/openai.js +23 -4
  69. package/dist/llm/openai.js.map +1 -1
  70. package/dist/llm/openrouter.js +23 -4
  71. package/dist/llm/openrouter.js.map +1 -1
  72. package/dist/llm/qwen-cloud.js +23 -4
  73. package/dist/llm/qwen-cloud.js.map +1 -1
  74. package/dist/llm/router.js +48 -6
  75. package/dist/llm/router.js.map +1 -1
  76. package/dist/llm/tool-protocol.d.ts +73 -0
  77. package/dist/llm/tool-protocol.js +282 -0
  78. package/dist/llm/tool-protocol.js.map +1 -0
  79. package/dist/modes/ask.js +74 -20
  80. package/dist/modes/ask.js.map +1 -1
  81. package/dist/prompts/index.d.ts +13 -5
  82. package/dist/prompts/index.js +116 -18
  83. package/dist/prompts/index.js.map +1 -1
  84. package/dist/repl.js +7 -0
  85. package/dist/repl.js.map +1 -1
  86. package/dist/store/config.d.ts +7 -0
  87. package/dist/store/config.js +1 -0
  88. package/dist/store/config.js.map +1 -1
  89. package/dist/store/plan.d.ts +2 -0
  90. package/dist/store/plan.js.map +1 -1
  91. package/dist/tools/capabilities.d.ts +2 -0
  92. package/dist/tools/capabilities.js +101 -6
  93. package/dist/tools/capabilities.js.map +1 -1
  94. package/dist/tools/command-intent.d.ts +1 -0
  95. package/dist/tools/command-intent.js +31 -0
  96. package/dist/tools/command-intent.js.map +1 -1
  97. package/dist/tools/definitions.d.ts +20 -0
  98. package/dist/tools/definitions.js +509 -0
  99. package/dist/tools/definitions.js.map +1 -0
  100. package/dist/tools/fs.js +12 -3
  101. package/dist/tools/fs.js.map +1 -1
  102. package/dist/tools/net-ping-sweep.js +69 -16
  103. package/dist/tools/net-ping-sweep.js.map +1 -1
  104. package/dist/tools/nmap-runner.d.ts +8 -7
  105. package/dist/tools/nmap-runner.js +126 -65
  106. package/dist/tools/nmap-runner.js.map +1 -1
  107. package/dist/tools/registry.js +45 -7
  108. package/dist/tools/registry.js.map +1 -1
  109. package/dist/tools/validate.d.ts +11 -0
  110. package/dist/tools/validate.js +53 -0
  111. package/dist/tools/validate.js.map +1 -1
  112. package/dist/tools/web/search.js +48 -4
  113. package/dist/tools/web/search.js.map +1 -1
  114. package/dist/tui-v2/components/transcript/tool-card.js +1 -1
  115. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  116. package/dist/tui-v2/rendering/tool-presenter.d.ts +6 -1
  117. package/dist/tui-v2/rendering/tool-presenter.js +66 -2
  118. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -1
  119. package/dist/types.d.ts +58 -0
  120. package/dist/ui/ansi-box.d.ts +2 -0
  121. package/dist/ui/ansi-box.js +8 -1
  122. package/dist/ui/ansi-box.js.map +1 -1
  123. package/package.json +1 -1
@@ -0,0 +1,99 @@
1
+ import type { ChatMessage, NativeToolCall, ToolDefinition } from "../../types.js";
2
+ import { type ToolChoice } from "../tool-protocol.js";
3
+ import "../../tools/definitions.js";
4
+ export declare function toAnthropicTools(defs: ToolDefinition[]): Array<{
5
+ name: string;
6
+ description: string;
7
+ input_schema: ToolDefinition["parameters"];
8
+ }>;
9
+ type AnthropicContentBlock = {
10
+ type: "text";
11
+ text: string;
12
+ } | {
13
+ type: "image";
14
+ source: {
15
+ type: "base64";
16
+ media_type: string;
17
+ data: string;
18
+ };
19
+ } | {
20
+ type: "tool_use";
21
+ id: string;
22
+ name: string;
23
+ input: Record<string, unknown>;
24
+ } | {
25
+ type: "tool_result";
26
+ tool_use_id: string;
27
+ content: string;
28
+ is_error?: boolean;
29
+ };
30
+ /**
31
+ * Convert dialect-neutral history to Anthropic Messages API messages.
32
+ * System is filtered out; consecutive tool results collapse into one user turn.
33
+ */
34
+ export declare function toAnthropicToolMessages(messages: ChatMessage[]): Array<{
35
+ role: "user" | "assistant";
36
+ content: string | AnthropicContentBlock[];
37
+ }>;
38
+ export declare function anthropicToolBodyFields(options: {
39
+ tools?: ToolDefinition[] | undefined;
40
+ toolChoice?: ToolChoice | undefined;
41
+ }): Record<string, unknown>;
42
+ export declare function parseAnthropicToolUseBlocks(content: Array<{
43
+ type: string;
44
+ text?: string;
45
+ thinking?: string;
46
+ id?: string;
47
+ name?: string;
48
+ input?: unknown;
49
+ }> | undefined): {
50
+ text: string;
51
+ thinkingText: string;
52
+ toolCalls: NativeToolCall[];
53
+ };
54
+ export interface AnthropicToolStreamState {
55
+ text: string;
56
+ thinking: string;
57
+ /** block index → partial tool_use */
58
+ blocks: Map<number, {
59
+ kind: "text" | "thinking" | "tool_use";
60
+ id?: string;
61
+ name?: string;
62
+ json: string;
63
+ text: string;
64
+ }>;
65
+ }
66
+ export declare function createAnthropicToolStreamState(): AnthropicToolStreamState;
67
+ export declare function handleAnthropicStreamEvent(state: AnthropicToolStreamState, event: {
68
+ type?: string;
69
+ index?: number;
70
+ content_block?: {
71
+ type?: string;
72
+ id?: string;
73
+ name?: string;
74
+ text?: string;
75
+ thinking?: string;
76
+ };
77
+ delta?: {
78
+ type?: string;
79
+ text?: string;
80
+ thinking?: string;
81
+ partial_json?: string;
82
+ };
83
+ }): {
84
+ textDelta?: string;
85
+ thinkingDelta?: string;
86
+ toolCallDelta?: {
87
+ index: number;
88
+ id?: string;
89
+ name?: string;
90
+ argumentsBytes?: number;
91
+ nameBecameKnown?: boolean;
92
+ };
93
+ };
94
+ export declare function finalizeAnthropicToolStream(state: AnthropicToolStreamState): {
95
+ text: string;
96
+ thinkingText: string;
97
+ toolCalls: NativeToolCall[];
98
+ };
99
+ export {};
@@ -0,0 +1,225 @@
1
+ import { fromWireName, mapToolChoiceToAnthropic, parseToolArguments, syntheticToolCallId, toWireName, MAX_TOOL_ARG_BYTES, } from "../tool-protocol.js";
2
+ // Side-effect: register wire name map before fromWireName use.
3
+ import "../../tools/definitions.js";
4
+ export function toAnthropicTools(defs) {
5
+ return defs.map((d) => ({
6
+ name: d.wireName,
7
+ description: d.description,
8
+ input_schema: d.parameters,
9
+ }));
10
+ }
11
+ /**
12
+ * Convert dialect-neutral history to Anthropic Messages API messages.
13
+ * System is filtered out; consecutive tool results collapse into one user turn.
14
+ */
15
+ export function toAnthropicToolMessages(messages) {
16
+ const out = [];
17
+ let i = 0;
18
+ const nonSystem = messages.filter((m) => m.role !== "system");
19
+ while (i < nonSystem.length) {
20
+ const message = nonSystem[i];
21
+ if (message.role === "tool") {
22
+ const blocks = [];
23
+ while (i < nonSystem.length && nonSystem[i].role === "tool") {
24
+ const tr = nonSystem[i];
25
+ blocks.push({
26
+ type: "tool_result",
27
+ tool_use_id: tr.toolCallId ?? "",
28
+ content: tr.content,
29
+ // Prefer explicit ok flag; fall back to "ok=false" in content prefix.
30
+ is_error: tr.ok === false ||
31
+ (tr.ok !== true && /\bok=false\b/i.test(tr.content)),
32
+ });
33
+ i += 1;
34
+ }
35
+ out.push({ role: "user", content: blocks });
36
+ continue;
37
+ }
38
+ if (message.role === "assistant" && message.toolCalls?.length) {
39
+ const blocks = [];
40
+ if (message.content.trim()) {
41
+ blocks.push({ type: "text", text: message.content });
42
+ }
43
+ for (const tc of message.toolCalls) {
44
+ blocks.push({
45
+ type: "tool_use",
46
+ id: tc.id,
47
+ name: toWireName(tc.name),
48
+ input: tc.args ?? {},
49
+ });
50
+ }
51
+ out.push({ role: "assistant", content: blocks });
52
+ i += 1;
53
+ continue;
54
+ }
55
+ if (message.role === "user" && message.images?.length) {
56
+ const blocks = [];
57
+ if (message.content) {
58
+ blocks.push({ type: "text", text: message.content });
59
+ }
60
+ for (const img of message.images) {
61
+ blocks.push({
62
+ type: "image",
63
+ source: {
64
+ type: "base64",
65
+ media_type: img.mediaType,
66
+ data: img.dataBase64,
67
+ },
68
+ });
69
+ }
70
+ out.push({ role: "user", content: blocks });
71
+ i += 1;
72
+ continue;
73
+ }
74
+ const role = message.role === "assistant" ? "assistant" : "user";
75
+ out.push({ role, content: message.content });
76
+ i += 1;
77
+ }
78
+ return out;
79
+ }
80
+ export function anthropicToolBodyFields(options) {
81
+ if (!options.tools?.length)
82
+ return {};
83
+ return {
84
+ tools: toAnthropicTools(options.tools),
85
+ tool_choice: mapToolChoiceToAnthropic(options.toolChoice),
86
+ };
87
+ }
88
+ export function parseAnthropicToolUseBlocks(content) {
89
+ let text = "";
90
+ let thinkingText = "";
91
+ const toolCalls = [];
92
+ if (!content)
93
+ return { text, thinkingText, toolCalls };
94
+ for (const part of content) {
95
+ if (part.type === "text" && part.text)
96
+ text += part.text;
97
+ if (part.type === "thinking" && part.thinking) {
98
+ thinkingText += part.thinking;
99
+ }
100
+ if (part.type === "tool_use") {
101
+ const wire = part.name ?? "";
102
+ const input = part.input;
103
+ const args = input && typeof input === "object" && !Array.isArray(input)
104
+ ? input
105
+ : parseToolArguments(typeof input === "string" ? input : JSON.stringify(input ?? {}));
106
+ toolCalls.push({
107
+ id: part.id ?? syntheticToolCallId(toolCalls.length),
108
+ name: fromWireName(wire) ?? wire,
109
+ args,
110
+ });
111
+ }
112
+ }
113
+ return {
114
+ text: text.trim(),
115
+ thinkingText: thinkingText.trim(),
116
+ toolCalls,
117
+ };
118
+ }
119
+ export function createAnthropicToolStreamState() {
120
+ return { text: "", thinking: "", blocks: new Map() };
121
+ }
122
+ export function handleAnthropicStreamEvent(state, event) {
123
+ const result = {};
124
+ if (event.type === "content_block_start" && event.content_block) {
125
+ const index = event.index ?? 0;
126
+ const cb = event.content_block;
127
+ if (cb.type === "tool_use") {
128
+ const block = {
129
+ kind: "tool_use",
130
+ json: "",
131
+ text: "",
132
+ };
133
+ if (cb.id !== undefined)
134
+ block.id = cb.id;
135
+ if (cb.name !== undefined)
136
+ block.name = cb.name;
137
+ state.blocks.set(index, block);
138
+ if (cb.name) {
139
+ result.toolCallDelta = {
140
+ index,
141
+ ...(cb.id !== undefined ? { id: cb.id } : {}),
142
+ name: fromWireName(cb.name) ?? cb.name,
143
+ argumentsBytes: 0,
144
+ nameBecameKnown: true,
145
+ };
146
+ }
147
+ }
148
+ else if (cb.type === "text") {
149
+ state.blocks.set(index, {
150
+ kind: "text",
151
+ json: "",
152
+ text: "",
153
+ });
154
+ }
155
+ else if (cb.type === "thinking") {
156
+ state.blocks.set(index, {
157
+ kind: "thinking",
158
+ json: "",
159
+ text: "",
160
+ });
161
+ }
162
+ }
163
+ if (event.type === "content_block_delta" && event.delta) {
164
+ const index = event.index ?? 0;
165
+ let block = state.blocks.get(index);
166
+ if (!block) {
167
+ block = { kind: "text", json: "", text: "" };
168
+ state.blocks.set(index, block);
169
+ }
170
+ if (event.delta.type === "text_delta" && event.delta.text) {
171
+ block.text += event.delta.text;
172
+ state.text += event.delta.text;
173
+ result.textDelta = event.delta.text;
174
+ }
175
+ if (event.delta.type === "thinking_delta" && event.delta.thinking) {
176
+ block.text += event.delta.thinking;
177
+ state.thinking += event.delta.thinking;
178
+ result.thinkingDelta = event.delta.thinking;
179
+ }
180
+ if (event.delta.type === "input_json_delta" &&
181
+ typeof event.delta.partial_json === "string") {
182
+ block.json += event.delta.partial_json;
183
+ if (block.json.length > MAX_TOOL_ARG_BYTES) {
184
+ throw new Error(`Tool call arguments exceeded ${MAX_TOOL_ARG_BYTES} bytes — split the file or reduce content size.`);
185
+ }
186
+ // Periodic large-arg progress for early UI cards.
187
+ if (block.kind === "tool_use" &&
188
+ block.json.length > 0 &&
189
+ block.json.length % 4096 < event.delta.partial_json.length) {
190
+ result.toolCallDelta = {
191
+ index,
192
+ ...(block.id !== undefined ? { id: block.id } : {}),
193
+ ...(block.name
194
+ ? { name: fromWireName(block.name) ?? block.name }
195
+ : {}),
196
+ argumentsBytes: block.json.length,
197
+ };
198
+ }
199
+ }
200
+ }
201
+ return result;
202
+ }
203
+ export function finalizeAnthropicToolStream(state) {
204
+ const toolCalls = [];
205
+ const indices = [...state.blocks.keys()].sort((a, b) => a - b);
206
+ for (const index of indices) {
207
+ const block = state.blocks.get(index);
208
+ if (block.kind !== "tool_use")
209
+ continue;
210
+ const wire = block.name ?? "";
211
+ const args = parseToolArguments(block.json);
212
+ toolCalls.push({
213
+ id: block.id ?? syntheticToolCallId(index),
214
+ name: fromWireName(wire) ?? wire,
215
+ args,
216
+ ...(block.json ? { rawArguments: block.json } : {}),
217
+ });
218
+ }
219
+ return {
220
+ text: state.text.trim(),
221
+ thinkingText: state.thinking.trim(),
222
+ toolCalls,
223
+ };
224
+ }
225
+ //# sourceMappingURL=anthropic-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-tools.js","sourceRoot":"","sources":["../../../src/llm/adapters/anthropic-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { ChatMessage, NativeToolCall, ToolDefinition } from "../../types.js";
2
+ import { type ToolChoice } from "../tool-protocol.js";
3
+ import "../../tools/definitions.js";
4
+ export declare function toGeminiFunctionDeclarations(defs: ToolDefinition[]): Array<{
5
+ name: string;
6
+ description: string;
7
+ parameters: Record<string, unknown>;
8
+ }>;
9
+ export declare function geminiToolBodyFields(options: {
10
+ tools?: ToolDefinition[] | undefined;
11
+ toolChoice?: ToolChoice | undefined;
12
+ }): Record<string, unknown>;
13
+ type GeminiPart = {
14
+ text: string;
15
+ thought?: boolean;
16
+ } | {
17
+ inlineData: {
18
+ mimeType: string;
19
+ data: string;
20
+ };
21
+ } | {
22
+ functionCall: {
23
+ name: string;
24
+ args?: Record<string, unknown>;
25
+ id?: string;
26
+ };
27
+ } | {
28
+ functionResponse: {
29
+ name: string;
30
+ response: Record<string, unknown>;
31
+ id?: string;
32
+ };
33
+ };
34
+ /**
35
+ * Convert dialect-neutral history to Gemini contents with functionCall /
36
+ * functionResponse parts. System messages are skipped (use systemInstruction).
37
+ */
38
+ export declare function toGeminiToolContents(messages: ChatMessage[]): Array<{
39
+ role: "user" | "model";
40
+ parts: GeminiPart[];
41
+ }>;
42
+ export declare function parseGeminiFunctionCalls(parts: Array<{
43
+ text?: string;
44
+ thought?: boolean;
45
+ functionCall?: {
46
+ name?: string;
47
+ args?: Record<string, unknown>;
48
+ id?: string;
49
+ };
50
+ }> | undefined): {
51
+ text: string;
52
+ toolCalls: NativeToolCall[];
53
+ };
54
+ export {};
@@ -0,0 +1,139 @@
1
+ import { fromWireName, mapToolChoiceToGemini, parseToolArguments, syntheticToolCallId, toWireName, } from "../tool-protocol.js";
2
+ // Side-effect: register wire name map before fromWireName use.
3
+ import "../../tools/definitions.js";
4
+ export function toGeminiFunctionDeclarations(defs) {
5
+ return defs.map((d) => {
6
+ // Gemini is picky about some JSON Schema keywords; strip additionalProperties.
7
+ const parameters = {
8
+ type: "object",
9
+ properties: d.parameters.properties,
10
+ ...(d.parameters.required?.length
11
+ ? { required: d.parameters.required }
12
+ : {}),
13
+ };
14
+ return {
15
+ name: d.wireName,
16
+ description: d.description,
17
+ parameters,
18
+ };
19
+ });
20
+ }
21
+ export function geminiToolBodyFields(options) {
22
+ if (!options.tools?.length)
23
+ return {};
24
+ const fc = mapToolChoiceToGemini(options.toolChoice);
25
+ return {
26
+ tools: [
27
+ {
28
+ functionDeclarations: toGeminiFunctionDeclarations(options.tools),
29
+ },
30
+ ],
31
+ toolConfig: {
32
+ functionCallingConfig: {
33
+ mode: fc.mode,
34
+ ...(fc.allowedFunctionNames
35
+ ? { allowedFunctionNames: fc.allowedFunctionNames }
36
+ : {}),
37
+ },
38
+ },
39
+ };
40
+ }
41
+ /**
42
+ * Convert dialect-neutral history to Gemini contents with functionCall /
43
+ * functionResponse parts. System messages are skipped (use systemInstruction).
44
+ */
45
+ export function toGeminiToolContents(messages) {
46
+ const contents = [];
47
+ let i = 0;
48
+ const nonSystem = messages.filter((m) => m.role !== "system");
49
+ while (i < nonSystem.length) {
50
+ const message = nonSystem[i];
51
+ if (message.role === "tool") {
52
+ const parts = [];
53
+ while (i < nonSystem.length && nonSystem[i].role === "tool") {
54
+ const tr = nonSystem[i];
55
+ const wire = tr.name ? toWireName(tr.name) : "unknown";
56
+ parts.push({
57
+ functionResponse: {
58
+ name: wire,
59
+ response: { result: tr.content },
60
+ ...(tr.toolCallId ? { id: tr.toolCallId } : {}),
61
+ },
62
+ });
63
+ i += 1;
64
+ }
65
+ contents.push({ role: "user", parts });
66
+ continue;
67
+ }
68
+ if (message.role === "assistant" && message.toolCalls?.length) {
69
+ const parts = [];
70
+ if (message.content.trim()) {
71
+ parts.push({ text: message.content });
72
+ }
73
+ for (const tc of message.toolCalls) {
74
+ parts.push({
75
+ functionCall: {
76
+ name: toWireName(tc.name),
77
+ args: tc.args ?? {},
78
+ ...(tc.id ? { id: tc.id } : {}),
79
+ },
80
+ });
81
+ }
82
+ contents.push({ role: "model", parts });
83
+ i += 1;
84
+ continue;
85
+ }
86
+ const role = message.role === "assistant" ? "model" : "user";
87
+ const parts = [];
88
+ if (message.content.trim())
89
+ parts.push({ text: message.content });
90
+ if (role === "user" && message.images) {
91
+ for (const img of message.images) {
92
+ parts.push({
93
+ inlineData: { mimeType: img.mediaType, data: img.dataBase64 },
94
+ });
95
+ }
96
+ }
97
+ if (parts.length === 0) {
98
+ i += 1;
99
+ continue;
100
+ }
101
+ const previous = contents.at(-1);
102
+ if (previous?.role === role) {
103
+ previous.parts.push(...parts);
104
+ }
105
+ else {
106
+ contents.push({ role, parts });
107
+ }
108
+ i += 1;
109
+ }
110
+ return contents;
111
+ }
112
+ export function parseGeminiFunctionCalls(parts) {
113
+ let text = "";
114
+ const toolCalls = [];
115
+ if (!parts)
116
+ return { text, toolCalls };
117
+ for (const part of parts) {
118
+ // Always parse functionCall even when the part is also tagged as thought.
119
+ if (part.functionCall?.name) {
120
+ const wire = part.functionCall.name;
121
+ const args = part.functionCall.args
122
+ ? parseToolArguments(part.functionCall.args)
123
+ : {};
124
+ toolCalls.push({
125
+ id: part.functionCall.id ?? syntheticToolCallId(toolCalls.length),
126
+ name: fromWireName(wire) ?? wire,
127
+ args,
128
+ });
129
+ }
130
+ // Skip thought text from user-visible content.
131
+ if (part.thought)
132
+ continue;
133
+ if (typeof part.text === "string" && part.text) {
134
+ text += part.text;
135
+ }
136
+ }
137
+ return { text: text.trim(), toolCalls };
138
+ }
139
+ //# sourceMappingURL=gemini-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-tools.js","sourceRoot":"","sources":["../../../src/llm/adapters/gemini-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ChatMessage, NativeToolCall, ToolDefinition } from "../../types.js";
2
+ import "../../tools/definitions.js";
3
+ export declare function toOllamaTools(defs: ToolDefinition[]): {
4
+ type: "function";
5
+ function: {
6
+ name: string;
7
+ description: string;
8
+ parameters: ToolDefinition["parameters"];
9
+ };
10
+ }[];
11
+ /**
12
+ * Prefer OpenAI-style tool roles. If a host rejects them, the runner falls
13
+ * back via sticky text-only.
14
+ */
15
+ export declare function toOllamaToolMessages(messages: ChatMessage[]): Array<Record<string, unknown>>;
16
+ export declare function parseOllamaToolCalls(toolCalls: Array<{
17
+ id?: string;
18
+ function?: {
19
+ name?: string;
20
+ arguments?: string | Record<string, unknown>;
21
+ };
22
+ }> | undefined): NativeToolCall[];
@@ -0,0 +1,62 @@
1
+ import { fromWireName, parseToolArguments, syntheticToolCallId, toWireName, } from "../tool-protocol.js";
2
+ // Side-effect: register wire name map before fromWireName use.
3
+ import "../../tools/definitions.js";
4
+ import { toOpenAiTools } from "./openai-tools.js";
5
+ export function toOllamaTools(defs) {
6
+ return toOpenAiTools(defs);
7
+ }
8
+ /**
9
+ * Prefer OpenAI-style tool roles. If a host rejects them, the runner falls
10
+ * back via sticky text-only.
11
+ */
12
+ export function toOllamaToolMessages(messages) {
13
+ return messages.map((message) => {
14
+ if (message.role === "tool") {
15
+ return {
16
+ role: "tool",
17
+ content: message.content,
18
+ ...(message.toolCallId ? { tool_call_id: message.toolCallId } : {}),
19
+ ...(message.name ? { name: toWireName(message.name) } : {}),
20
+ };
21
+ }
22
+ if (message.role === "assistant" && message.toolCalls?.length) {
23
+ return {
24
+ role: "assistant",
25
+ content: message.content ?? "",
26
+ tool_calls: message.toolCalls.map((tc) => ({
27
+ id: tc.id,
28
+ type: "function",
29
+ function: {
30
+ name: toWireName(tc.name),
31
+ // OpenAI-compat hosts (and many Ollama proxies) expect a JSON string.
32
+ arguments: JSON.stringify(tc.args ?? {}),
33
+ },
34
+ })),
35
+ };
36
+ }
37
+ if (message.role === "user" && message.images?.length) {
38
+ return {
39
+ role: "user",
40
+ content: message.content,
41
+ images: message.images.map((img) => img.dataBase64),
42
+ };
43
+ }
44
+ return { role: message.role, content: message.content };
45
+ });
46
+ }
47
+ export function parseOllamaToolCalls(toolCalls) {
48
+ if (!toolCalls?.length)
49
+ return [];
50
+ return toolCalls.map((tc, i) => {
51
+ const wire = tc.function?.name ?? "";
52
+ const raw = tc.function?.arguments;
53
+ const rawArguments = typeof raw === "string" ? raw : raw ? JSON.stringify(raw) : undefined;
54
+ return {
55
+ id: tc.id ?? syntheticToolCallId(i),
56
+ name: fromWireName(wire) ?? wire,
57
+ args: parseToolArguments(raw),
58
+ ...(rawArguments ? { rawArguments } : {}),
59
+ };
60
+ });
61
+ }
62
+ //# sourceMappingURL=ollama-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-tools.js","sourceRoot":"","sources":["../../../src/llm/adapters/ollama-tools.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,GACX,MAAM,qBAAqB,CAAC;AAC7B,+DAA+D;AAC/D,OAAO,4BAA4B,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,UAAU,aAAa,CAAC,IAAsB;IAClD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAuB;IAEvB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5D,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YAC9D,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;gBAC9B,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACzC,EAAE,EAAE,EAAE,CAAC,EAAE;oBACT,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE;wBACR,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC;wBACzB,sEAAsE;wBACtE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;qBACzC;iBACF,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACtD,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC;aACpD,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,SAQa;IAEb,IAAI,CAAC,SAAS,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;QACnC,MAAM,YAAY,GAChB,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,OAAO;YACL,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,mBAAmB,CAAC,CAAC,CAAC;YACnC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI;YAChC,IAAI,EAAE,kBAAkB,CAAC,GAAG,CAAC;YAC7B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { ChatMessage, NativeToolCall, ToolDefinition } from "../../types.js";
2
+ import { type ToolChoice } from "../tool-protocol.js";
3
+ import "../../tools/definitions.js";
4
+ export declare function toOpenAiTools(defs: ToolDefinition[]): Array<{
5
+ type: "function";
6
+ function: {
7
+ name: string;
8
+ description: string;
9
+ parameters: ToolDefinition["parameters"];
10
+ };
11
+ }>;
12
+ export type OpenAiWireMessage = {
13
+ role: "system" | "user" | "assistant";
14
+ content: string | unknown[] | null;
15
+ tool_calls?: Array<{
16
+ id: string;
17
+ type: "function";
18
+ function: {
19
+ name: string;
20
+ arguments: string;
21
+ };
22
+ }>;
23
+ } | {
24
+ role: "tool";
25
+ tool_call_id: string;
26
+ content: string;
27
+ name?: string;
28
+ };
29
+ /**
30
+ * Map dialect-neutral ChatMessage[] to OpenAI Chat Completions wire format,
31
+ * preserving tool roles and assistant tool_calls.
32
+ */
33
+ export declare function toOpenAiToolMessages(messages: ChatMessage[], mapUserContent: (message: ChatMessage) => string | unknown[]): OpenAiWireMessage[];
34
+ export declare function openAiToolBodyFields(options: {
35
+ tools?: ToolDefinition[] | undefined;
36
+ toolChoice?: ToolChoice | undefined;
37
+ parallelToolCalls?: boolean | undefined;
38
+ }): Record<string, unknown>;
39
+ export declare function nativeToolCallsFromOpenAi(toolCalls: NativeToolCall[] | undefined): NativeToolCall[] | undefined;