@jini-ai/agent-runtime 0.2.1 → 0.3.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 (163) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-protocol/acp/session.d.ts +206 -1
  3. package/dist/agent-protocol/acp/session.d.ts.map +1 -1
  4. package/dist/agent-protocol/acp/session.js +505 -350
  5. package/dist/agent-protocol/acp/session.js.map +1 -1
  6. package/dist/agent-protocol/core/json-line-stream.d.ts +53 -0
  7. package/dist/agent-protocol/core/json-line-stream.d.ts.map +1 -1
  8. package/dist/agent-protocol/core/json-line-stream.js +307 -255
  9. package/dist/agent-protocol/core/json-line-stream.js.map +1 -1
  10. package/dist/agent-protocol/pi-rpc/events.d.ts +22 -1
  11. package/dist/agent-protocol/pi-rpc/events.d.ts.map +1 -1
  12. package/dist/agent-protocol/pi-rpc/events.js +189 -153
  13. package/dist/agent-protocol/pi-rpc/events.js.map +1 -1
  14. package/dist/agent-protocol/pi-rpc/session.d.ts +39 -0
  15. package/dist/agent-protocol/pi-rpc/session.d.ts.map +1 -1
  16. package/dist/agent-protocol/pi-rpc/session.js +143 -107
  17. package/dist/agent-protocol/pi-rpc/session.js.map +1 -1
  18. package/dist/claude-stream.d.ts +64 -1
  19. package/dist/claude-stream.d.ts.map +1 -1
  20. package/dist/claude-stream.js +568 -441
  21. package/dist/claude-stream.js.map +1 -1
  22. package/dist/defs/aider.d.ts.map +1 -1
  23. package/dist/defs/aider.js +13 -1
  24. package/dist/defs/aider.js.map +1 -1
  25. package/dist/defs/amp.d.ts.map +1 -1
  26. package/dist/defs/amp.js +16 -1
  27. package/dist/defs/amp.js.map +1 -1
  28. package/dist/defs/amr.d.ts +2 -1
  29. package/dist/defs/amr.d.ts.map +1 -1
  30. package/dist/defs/amr.js +12 -1
  31. package/dist/defs/amr.js.map +1 -1
  32. package/dist/defs/antigravity.d.ts +41 -2
  33. package/dist/defs/antigravity.d.ts.map +1 -1
  34. package/dist/defs/antigravity.js +201 -22
  35. package/dist/defs/antigravity.js.map +1 -1
  36. package/dist/defs/claude.d.ts +2 -0
  37. package/dist/defs/claude.d.ts.map +1 -1
  38. package/dist/defs/claude.js +58 -3
  39. package/dist/defs/claude.js.map +1 -1
  40. package/dist/defs/codebuddy.d.ts.map +1 -1
  41. package/dist/defs/codebuddy.js +9 -1
  42. package/dist/defs/codebuddy.js.map +1 -1
  43. package/dist/defs/codex.d.ts +1 -0
  44. package/dist/defs/codex.d.ts.map +1 -1
  45. package/dist/defs/codex.js +34 -0
  46. package/dist/defs/codex.js.map +1 -1
  47. package/dist/defs/copilot.d.ts.map +1 -1
  48. package/dist/defs/copilot.js +15 -1
  49. package/dist/defs/copilot.js.map +1 -1
  50. package/dist/defs/cursor-agent.d.ts.map +1 -1
  51. package/dist/defs/cursor-agent.js +24 -2
  52. package/dist/defs/cursor-agent.js.map +1 -1
  53. package/dist/defs/deepseek.d.ts.map +1 -1
  54. package/dist/defs/deepseek.js +12 -0
  55. package/dist/defs/deepseek.js.map +1 -1
  56. package/dist/defs/devin.d.ts +2 -1
  57. package/dist/defs/devin.d.ts.map +1 -1
  58. package/dist/defs/devin.js +12 -7
  59. package/dist/defs/devin.js.map +1 -1
  60. package/dist/defs/grok-build.d.ts.map +1 -1
  61. package/dist/defs/grok-build.js +10 -0
  62. package/dist/defs/grok-build.js.map +1 -1
  63. package/dist/defs/hermes.d.ts +1 -0
  64. package/dist/defs/hermes.d.ts.map +1 -1
  65. package/dist/defs/hermes.js +3 -0
  66. package/dist/defs/hermes.js.map +1 -1
  67. package/dist/defs/kilo.d.ts +1 -0
  68. package/dist/defs/kilo.d.ts.map +1 -1
  69. package/dist/defs/kilo.js +3 -0
  70. package/dist/defs/kilo.js.map +1 -1
  71. package/dist/defs/kimi.d.ts +1 -0
  72. package/dist/defs/kimi.d.ts.map +1 -1
  73. package/dist/defs/kimi.js +3 -0
  74. package/dist/defs/kimi.js.map +1 -1
  75. package/dist/defs/kiro.d.ts +1 -0
  76. package/dist/defs/kiro.d.ts.map +1 -1
  77. package/dist/defs/kiro.js +3 -0
  78. package/dist/defs/kiro.js.map +1 -1
  79. package/dist/defs/pi.d.ts +1 -1
  80. package/dist/defs/pi.d.ts.map +1 -1
  81. package/dist/defs/pi.js +6 -1
  82. package/dist/defs/pi.js.map +1 -1
  83. package/dist/defs/qoder.d.ts +1 -0
  84. package/dist/defs/qoder.d.ts.map +1 -1
  85. package/dist/defs/qoder.js +15 -0
  86. package/dist/defs/qoder.js.map +1 -1
  87. package/dist/defs/qwen.d.ts.map +1 -1
  88. package/dist/defs/qwen.js +9 -0
  89. package/dist/defs/qwen.js.map +1 -1
  90. package/dist/defs/reasonix.d.ts +1 -0
  91. package/dist/defs/reasonix.d.ts.map +1 -1
  92. package/dist/defs/reasonix.js +3 -0
  93. package/dist/defs/reasonix.js.map +1 -1
  94. package/dist/defs/shared.d.ts +31 -1
  95. package/dist/defs/shared.d.ts.map +1 -1
  96. package/dist/defs/shared.js +35 -0
  97. package/dist/defs/shared.js.map +1 -1
  98. package/dist/defs/trae-cli.d.ts +1 -0
  99. package/dist/defs/trae-cli.d.ts.map +1 -1
  100. package/dist/defs/trae-cli.js +3 -0
  101. package/dist/defs/trae-cli.js.map +1 -1
  102. package/dist/defs/vibe.d.ts +1 -0
  103. package/dist/defs/vibe.d.ts.map +1 -1
  104. package/dist/defs/vibe.js +3 -0
  105. package/dist/defs/vibe.js.map +1 -1
  106. package/dist/detection.d.ts +1 -1
  107. package/dist/detection.d.ts.map +1 -1
  108. package/dist/detection.js +7 -2
  109. package/dist/detection.js.map +1 -1
  110. package/dist/index.d.ts +2 -1
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +2 -1
  113. package/dist/index.js.map +1 -1
  114. package/dist/log-file.d.ts +23 -0
  115. package/dist/log-file.d.ts.map +1 -0
  116. package/dist/log-file.js +56 -0
  117. package/dist/log-file.js.map +1 -0
  118. package/dist/model-registry.d.ts +7 -45
  119. package/dist/model-registry.d.ts.map +1 -1
  120. package/dist/model-registry.js.map +1 -1
  121. package/dist/providers/anthropic-messages.d.ts +198 -6
  122. package/dist/providers/anthropic-messages.d.ts.map +1 -1
  123. package/dist/providers/anthropic-messages.js +317 -140
  124. package/dist/providers/anthropic-messages.js.map +1 -1
  125. package/dist/providers/azure-chat.d.ts +113 -3
  126. package/dist/providers/azure-chat.d.ts.map +1 -1
  127. package/dist/providers/azure-chat.js +114 -21
  128. package/dist/providers/azure-chat.js.map +1 -1
  129. package/dist/providers/connection-guard.d.ts +121 -1
  130. package/dist/providers/connection-guard.d.ts.map +1 -1
  131. package/dist/providers/connection-guard.js +205 -3
  132. package/dist/providers/connection-guard.js.map +1 -1
  133. package/dist/providers/connection-test.d.ts +62 -0
  134. package/dist/providers/connection-test.d.ts.map +1 -0
  135. package/dist/providers/connection-test.js +404 -0
  136. package/dist/providers/connection-test.js.map +1 -0
  137. package/dist/providers/elevenlabs.d.ts.map +1 -1
  138. package/dist/providers/elevenlabs.js +3 -2
  139. package/dist/providers/elevenlabs.js.map +1 -1
  140. package/dist/providers/google-messages.d.ts +208 -7
  141. package/dist/providers/google-messages.d.ts.map +1 -1
  142. package/dist/providers/google-messages.js +331 -105
  143. package/dist/providers/google-messages.js.map +1 -1
  144. package/dist/providers/index.d.ts +1 -0
  145. package/dist/providers/index.d.ts.map +1 -1
  146. package/dist/providers/index.js +1 -0
  147. package/dist/providers/index.js.map +1 -1
  148. package/dist/providers/model-catalog.d.ts.map +1 -1
  149. package/dist/providers/model-catalog.js +21 -0
  150. package/dist/providers/model-catalog.js.map +1 -1
  151. package/dist/providers/ollama-chat.d.ts +190 -1
  152. package/dist/providers/ollama-chat.d.ts.map +1 -1
  153. package/dist/providers/ollama-chat.js +319 -110
  154. package/dist/providers/ollama-chat.js.map +1 -1
  155. package/dist/providers/openai-chat.d.ts +222 -14
  156. package/dist/providers/openai-chat.d.ts.map +1 -1
  157. package/dist/providers/openai-chat.js +377 -128
  158. package/dist/providers/openai-chat.js.map +1 -1
  159. package/dist/providers/sse-decode.d.ts +2 -2
  160. package/dist/providers/sse-decode.js +2 -2
  161. package/dist/types.d.ts +169 -87
  162. package/dist/types.d.ts.map +1 -1
  163. package/package.json +6 -4
@@ -38,8 +38,11 @@
38
38
  * module's tool-call loop kept the OpenAI-compatible wire shape for both the
39
39
  * emitted lifecycle event and the continuation request — `tool_use` was
40
40
  * never emitted, and the assistant/tool continuation messages used a
41
- * stringified `arguments` blob with `id`/`type`/`tool_call_id` fields that
42
- * don't exist in Ollama's native tool-call schema. Fixed: `tool_use` now
41
+ * stringified `arguments` blob plus a `type` discriminator that does not
42
+ * exist in Ollama's native tool-call schema. (Narrowed 2026-08-03: this note
43
+ * previously also named `id`/`tool_call_id` as nonexistent, which is wrong —
44
+ * see `OllamaMessageParam.tool_name`'s doc for what `api/types.go` actually
45
+ * declares. `type` is the only genuinely absent field.) Fixed: `tool_use` now
43
46
  * fires for every resolved call as soon as the stream ends (see
44
47
  * `runSingleOllamaRequest`), and `OllamaToolCallParam`/`OllamaMessageParam`
45
48
  * now match Ollama's own documented shape (`arguments` as a native object,
@@ -59,9 +62,48 @@
59
62
  * this repo's established practice elsewhere (e.g. `xai.ts` deliberately
60
63
  * generalizing OD's OAuth-connect *shape* while dropping its OD-specific
61
64
  * SuperGrok billing gate).
65
+ *
66
+ * **Image ("vision") support**, added for the same vision self-check use
67
+ * case as `anthropic-messages.ts` (see that module's doc). Ollama's real
68
+ * wire shape is genuinely unlike every other provider this repo's adapters
69
+ * touch: `Message.Images` (`github.com/ollama/ollama/blob/main/api/
70
+ * types.go`) is `[]ImageData` where `ImageData` is a raw Go `[]byte` —
71
+ * `encoding/json` marshals a byte slice as a **bare base64 string**, so
72
+ * there is no `data:` URI prefix and no `media_type` field at all (unlike
73
+ * Anthropic/OpenAI's wrapped-source shapes). Confirmed directly against that
74
+ * struct, not assumed from the "list of images" prose in `docs/api.md`.
75
+ *
76
+ * **Design decision: native `tool`-role images, not a synthetic follow-up
77
+ * turn.** A prior pass on this same task (see `ADS-memory/reports/refactors/
78
+ * 2026-08-03-image-send-capability.md`) found OpenAI/Azure/Google's `tool`-
79
+ * role message is documented text-only, so those three need a synthetic
80
+ * `user`-role follow-up turn to carry an image at all. Ollama does not need
81
+ * that workaround — verified, not assumed, against two independent pieces of
82
+ * real server-side evidence: (1) `api/types.go`'s `Message` struct puts
83
+ * `Images` at the same level as `Role`/`Content`/`ToolName`, with no
84
+ * role-conditional field; (2) `server/prompt.go`'s `imageTaggedMessages`
85
+ * function, which actually builds the model prompt, iterates every message
86
+ * regardless of `Role` and reads `msg.Images` unconditionally — there is no
87
+ * `if msg.Role == "user"` gate anywhere near that read. A `tool`-role
88
+ * message's `images` field therefore reaches the model exactly like a
89
+ * `user`-role message's would. This makes Ollama's tool-result channel
90
+ * behave like Anthropic's (native), not like OpenAI/Azure/Google's
91
+ * (workaround required) — a third shape the prior pass's provider table
92
+ * did not anticipate, because Ollama was outside its original four-protocol
93
+ * scope.
94
+ *
95
+ * **`OllamaToolResult.isError` added alongside `images`, not purely a vision
96
+ * change.** Before this pass, every `tool_result` event and continuation
97
+ * message hardcoded `isError: false` regardless of what `executeTool`
98
+ * returned — `OllamaToolResult` had no `isError` field for a host to even
99
+ * set. That is a pre-existing gap independent of images, but this pass's own
100
+ * `guardToolResult` (see below) needs to signal a rejected/malformed image
101
+ * as an error the model can see, which is impossible without it. Wired
102
+ * through as `result.isError ?? false`, so every existing caller that never
103
+ * set `isError` keeps its exact prior behavior.
62
104
  */
63
105
  import { createRoleMarkerGuard } from '../role-marker-guard.js';
64
- import { defaultDnsLookup, redactSecrets, validateBaseUrlResolved } from './connection-guard.js';
106
+ import { defaultDnsLookup, pinnedFetch, redactSecrets, validateBaseUrlResolved } from './connection-guard.js';
65
107
  import { createTurnEndGuard } from './turn-end-guard.js';
66
108
  const DEFAULT_OLLAMA_BASE_URL = 'https://ollama.com';
67
109
  const DEFAULT_MAX_TOOL_TURNS = 8;
@@ -106,65 +148,175 @@ function extractOllamaErrorDetail(rawText) {
106
148
  return rawText.slice(0, 500);
107
149
  }
108
150
  /**
109
- * Reads a `fetch` response body as newline-delimited JSON, yielding one
110
- * parsed line at a time. Buffers partial lines across chunk boundaries — an
111
- * NDJSON line is not guaranteed to arrive in a single chunk. A trailing,
112
- * unterminated final line (no closing newline) is still yielded once the
113
- * stream ends, matching `sse-decode.ts#decodeSseStream`'s equivalent
114
- * tolerance for the SSE case.
151
+ * Validates one image string from a host-returned `OllamaToolResult.images` array. Returns the
152
+ * violation reason, or `null` when the string is legal to send.
153
+ *
154
+ * Deliberately narrower than `anthropic-messages.ts#invalidToolResultContentBlockReason`: no
155
+ * `media_type` allow-list (Ollama's wire shape has no such field to validate — see module doc), and
156
+ * no byte-size cap. The size guard was considered and rejected, not skipped reflexively: Anthropic's
157
+ * 10 MB figure came from a real, documented direct-API limit; no equivalent published figure exists
158
+ * for Ollama. A local install's real ceiling is whatever the host machine's memory allows (not a
159
+ * fixed vendor number this module could verify), and `OllamaTurnOptions.baseUrl`'s own documented
160
+ * default target — Ollama Cloud — is a remote, metered service too, but its docs likewise publish no
161
+ * per-image size limit as of this pass. Inventing a number in either case would be exactly the kind
162
+ * of memory-guess this repo's "verify against real docs" convention forbids (see module doc).
163
+ *
164
+ * What IS checked: the shape mistake an existing host is actually likely to make. A caller that
165
+ * already built an Anthropic/OpenAI-shaped payload elsewhere in the same codebase has a `data:`
166
+ * URI-prefixed or object-wrapped image sitting right there — pasting that into Ollama's `images`
167
+ * array (a bare base64 string, no wrapper) is a real, easy, silent mistake, not a hypothetical one.
168
+ *
169
+ * @complexity O(1) — a string-prefix check and a length check, no base64 decoding.
170
+ * @overallScore 100
115
171
  */
116
- async function* decodeNdjsonStream(body) {
117
- const decoder = new TextDecoder();
118
- let buffer = '';
119
- for await (const chunk of body) {
120
- buffer += typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });
121
- let newlineIndex;
122
- while ((newlineIndex = buffer.indexOf('\n')) >= 0) {
123
- const line = buffer.slice(0, newlineIndex).trim();
124
- buffer = buffer.slice(newlineIndex + 1);
125
- if (!line)
126
- continue;
127
- try {
128
- yield JSON.parse(line);
129
- }
130
- catch {
131
- continue; // tolerate a malformed/empty keep-alive line
132
- }
133
- }
172
+ function invalidOllamaImageReason(image) {
173
+ if (image.length === 0)
174
+ return 'image must be a non-empty base64 string';
175
+ if (image.startsWith('data:')) {
176
+ return "image must be a bare base64 string with no `data:` URI prefix (Ollama's wire format has no media_type field — see module doc)";
134
177
  }
135
- const trailing = buffer.trim();
136
- if (trailing) {
137
- try {
138
- yield JSON.parse(trailing);
178
+ return null;
179
+ }
180
+ /**
181
+ * Runtime guard applied to every `OllamaToolExecutor` result before it is wired onto the outbound
182
+ * continuation message or reported via `onEvent` — same rationale and posture as
183
+ * `anthropic-messages.ts#guardToolResult` (host-owned executor, TS types don't constrain a buggy
184
+ * host at runtime; substitutes a legible `is_error` tool_result rather than forwarding a malformed
185
+ * image the server would reject with a less legible error).
186
+ *
187
+ * @complexity O(n) in the number of images; O(1) per image.
188
+ * @overallScore 100
189
+ */
190
+ function guardToolResult(result) {
191
+ if (!result.images || result.images.length === 0)
192
+ return result;
193
+ for (const image of result.images) {
194
+ const reason = invalidOllamaImageReason(image);
195
+ if (reason) {
196
+ return { content: `[rejected tool result] ${reason}`, isError: true };
139
197
  }
140
- catch {
141
- // final partial line was never completed — nothing usable to yield
198
+ }
199
+ return result;
200
+ }
201
+ /** Parses one `function.arguments` value: Ollama's native tool-call payload documents it as a native JSON object, but a strict/older server can still send a stringified blob — this tolerates either, falling back to the raw string on malformed JSON. */
202
+ export function parseOllamaToolCallArguments(args) {
203
+ if (typeof args !== 'string')
204
+ return args;
205
+ try {
206
+ return JSON.parse(args);
207
+ }
208
+ catch {
209
+ return args;
210
+ }
211
+ }
212
+ /** Resolves one raw `message.tool_calls[]` entry into an `OllamaToolCall`, or `null` when the entry is missing its `function`/`name` (malformed, so skipped rather than surfaced). `index` seeds the synthetic id fallback — see `OllamaToolCallParam`'s doc for why a call id is generated locally rather than trusted off the wire. */
213
+ export function resolveOllamaToolCall(rawCall, index) {
214
+ if (!isRecord(rawCall) || !isRecord(rawCall.function))
215
+ return null;
216
+ const name = typeof rawCall.function.name === 'string' ? rawCall.function.name : '';
217
+ if (!name)
218
+ return null;
219
+ const input = parseOllamaToolCallArguments(rawCall.function.arguments);
220
+ const id = typeof rawCall.id === 'string' && rawCall.id ? rawCall.id : `ollama-tool-${index}`;
221
+ return { id, name, input };
222
+ }
223
+ /** Resolves every entry in `message.tool_calls` into `state.toolCalls`, then marks `finishReason: 'tool_calls'` once at least one resolved — mirrors the original inline loop's behavior of setting `finishReason` after the whole batch rather than per-call. */
224
+ export function handleOllamaToolCallsField(state, message) {
225
+ if (!Array.isArray(message.tool_calls))
226
+ return;
227
+ for (const rawCall of message.tool_calls) {
228
+ const call = resolveOllamaToolCall(rawCall, state.toolCalls.length);
229
+ if (call)
230
+ state.toolCalls.push(call);
231
+ }
232
+ if (state.toolCalls.length > 0)
233
+ state.finishReason = 'tool_calls';
234
+ }
235
+ /**
236
+ * Feeds one `message.content` delta through the role-marker guard and emits the safe portion.
237
+ * Returns `'break'` once the guard flags contamination, otherwise `'continue'` — same contract as
238
+ * `anthropic-messages.ts#handleAnthropicTextDelta`/`openai-chat.ts#handleOpenAiTextContentDelta`.
239
+ */
240
+ export function handleOllamaTextContent(state, content, onEvent) {
241
+ const safe = state.guard.feedText(content);
242
+ if (safe.length > 0) {
243
+ state.fullText += safe;
244
+ onEvent({ type: 'text_delta', delta: safe });
245
+ }
246
+ if (!state.guard.contaminated)
247
+ return 'continue';
248
+ const warn = state.guard.warningEvent();
249
+ if (warn)
250
+ onEvent(warn);
251
+ return 'break';
252
+ }
253
+ /**
254
+ * Reduces one already-parsed NDJSON line into `state`, reporting whether the caller's line loop
255
+ * should stop and, if so, why. `'break'` calls `emitEnd('contaminated')` itself (mirroring the
256
+ * `content`-delta contamination path being the only in-loop `emitEnd` call site in every sibling
257
+ * provider); `'done'` reports the terminal `done: true` line with no `emitEnd` call of its own —
258
+ * the caller (`runSingleOllamaRequest`) still owns the normal-completion `emitEnd`, exactly like
259
+ * every sibling turn-runner's `emitEnd` contract.
260
+ */
261
+ export function processOllamaLine(state, line, onEvent, emitEnd) {
262
+ const message = isRecord(line.message) ? line.message : null;
263
+ if (message && typeof message.content === 'string' && message.content.length > 0) {
264
+ if (handleOllamaTextContent(state, message.content, onEvent) === 'break') {
265
+ state.finishReason = 'contaminated';
266
+ emitEnd('contaminated');
267
+ return 'break';
142
268
  }
143
269
  }
270
+ if (message)
271
+ handleOllamaToolCallsField(state, message);
272
+ if (line.done === true) {
273
+ if (state.finishReason !== 'contaminated' && state.finishReason !== 'tool_calls')
274
+ state.finishReason = 'stop';
275
+ return 'done';
276
+ }
277
+ return 'continue';
144
278
  }
145
- /** Runs exactly one Ollama `/api/chat` NDJSON streaming request and reduces it into a single outcome. Mirrors `anthropic-messages.ts#runSingleAnthropicRequest`'s `emitEnd` contract — see that function's doc. */
146
- async function runSingleOllamaRequest(options, messages, emitEnd) {
279
+ /** Emitted for every resolved call as soon as the stream ends, independent of whether the caller actually supplied an `executeTool` — see AUD-R4-002 fix note in the module doc. */
280
+ function emitPendingOllamaToolUseEvents(toolCalls, onEvent) {
281
+ for (const call of toolCalls) {
282
+ onEvent({ type: 'tool_use', id: call.id, name: call.name, input: call.input });
283
+ }
284
+ }
285
+ /**
286
+ * Validates `options.baseUrl` and opens the streaming POST, returning the response's readable body
287
+ * once every pre-stream failure mode (SSRF-guard rejection, network error, non-2xx status, missing
288
+ * body) has been ruled out. Calls `emitEnd('error')` and returns `null` itself on any of those —
289
+ * the caller only has to check for `null` — same split as
290
+ * `anthropic-messages.ts#openAnthropicResponseStream`.
291
+ */
292
+ async function openOllamaResponseStream(options, messages, emitEnd) {
147
293
  const { onEvent } = options;
148
- const baseUrlCheck = await validateBaseUrlResolved(options.baseUrl ?? DEFAULT_OLLAMA_BASE_URL, defaultDnsLookup);
294
+ const baseUrlCheck = await validateBaseUrlResolved(options.baseUrl ?? DEFAULT_OLLAMA_BASE_URL, options.dnsLookup ?? defaultDnsLookup);
149
295
  if (baseUrlCheck.error) {
150
296
  onEvent({ type: 'error', message: baseUrlCheck.error });
151
297
  emitEnd('error');
152
- return { finishReason: null, toolCalls: [], text: '' };
298
+ return null;
153
299
  }
154
300
  let response;
155
301
  try {
156
- response = (await fetch(ollamaRequestUrl(options.baseUrl), {
302
+ response = await (options.fetchImpl ?? pinnedFetch)(ollamaRequestUrl(options.baseUrl), {
157
303
  method: 'POST',
158
304
  headers: ollamaHeaders(options),
159
305
  body: JSON.stringify(ollamaRequestBody(options, messages)),
306
+ // Unlike the other three providers, this call never set `redirect: 'error'` even before
307
+ // this pinning change — the reviewer's redirect-rebinding finding was only reported (and
308
+ // fixed) for `openai-chat.ts`. `pinnedFetch` closes it here regardless, the same way it
309
+ // does everywhere else (`node:http`'s `request` never auto-follows); the flag is added for
310
+ // self-documentation, matching the other three call sites.
311
+ redirect: 'error',
160
312
  ...(options.signal ? { signal: options.signal } : {}),
161
- }));
313
+ }, baseUrlCheck.pinnedAddress);
162
314
  }
163
315
  catch (error) {
164
316
  const message = error instanceof Error ? error.message : String(error);
165
317
  onEvent({ type: 'error', message: redactSecrets(message, [options.apiKey]) });
166
318
  emitEnd('error');
167
- return { finishReason: null, toolCalls: [], text: '' };
319
+ return null;
168
320
  }
169
321
  if (!response.ok) {
170
322
  const rawText = await response.text();
@@ -174,72 +326,138 @@ async function runSingleOllamaRequest(options, messages, emitEnd) {
174
326
  code: String(response.status),
175
327
  });
176
328
  emitEnd('error');
177
- return { finishReason: null, toolCalls: [], text: '' };
329
+ return null;
178
330
  }
179
331
  if (!response.body) {
180
332
  onEvent({ type: 'error', message: 'Ollama response had no body' });
181
333
  emitEnd('error');
334
+ return null;
335
+ }
336
+ return response.body;
337
+ }
338
+ /** Parses one NDJSON line, returning `undefined` for a malformed/empty line — JSON has no `undefined` literal, so a successful parse is never confused with a failed one. Extracted so the generator below never nests a `try`/`catch` inside its loops (see that function's doc). */
339
+ export function parseNdjsonLine(line) {
340
+ try {
341
+ return JSON.parse(line);
342
+ }
343
+ catch {
344
+ return undefined;
345
+ }
346
+ }
347
+ /** Splits already-accumulated buffer content into complete newline-terminated lines (newline stripped) plus the remaining partial-line `remainder`. Pure — no I/O — so this buffering/splitting logic is exercised as plain value-in/value-out assertions instead of through the full streaming generator. */
348
+ export function splitNdjsonLines(buffer) {
349
+ const lines = [];
350
+ let rest = buffer;
351
+ let newlineIndex;
352
+ while ((newlineIndex = rest.indexOf('\n')) >= 0) {
353
+ lines.push(rest.slice(0, newlineIndex));
354
+ rest = rest.slice(newlineIndex + 1);
355
+ }
356
+ return { lines, remainder: rest };
357
+ }
358
+ /** Trims and parses each complete line in `rawLines`, yielding only the ones that parsed to something other than `undefined` — a plain (non-async) generator so `decodeNdjsonStream` below can delegate to it with `yield*` instead of nesting a `for`/`if`/`if` inside its own `for await` loop. */
359
+ export function* parseNdjsonLines(rawLines) {
360
+ for (const rawLine of rawLines) {
361
+ const line = rawLine.trim();
362
+ if (!line)
363
+ continue; // tolerate a malformed/empty keep-alive line
364
+ const parsed = parseNdjsonLine(line);
365
+ if (parsed !== undefined)
366
+ yield parsed;
367
+ }
368
+ }
369
+ /**
370
+ * Reads a `fetch` response body as newline-delimited JSON, yielding one
371
+ * parsed line at a time. Buffers partial lines across chunk boundaries — an
372
+ * NDJSON line is not guaranteed to arrive in a single chunk. A trailing,
373
+ * unterminated final line (no closing newline) is still yielded once the
374
+ * stream ends, matching `sse-decode.ts#decodeSseStream`'s equivalent
375
+ * tolerance for the SSE case.
376
+ */
377
+ async function* decodeNdjsonStream(body) {
378
+ const decoder = new TextDecoder();
379
+ let buffer = '';
380
+ for await (const chunk of body) {
381
+ buffer += typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });
382
+ const { lines, remainder } = splitNdjsonLines(buffer);
383
+ buffer = remainder;
384
+ yield* parseNdjsonLines(lines);
385
+ }
386
+ const trailing = buffer.trim();
387
+ if (!trailing)
388
+ return;
389
+ const parsed = parseNdjsonLine(trailing);
390
+ if (parsed !== undefined)
391
+ yield parsed; // else: final partial line was never completed — nothing usable to yield
392
+ }
393
+ /** Runs exactly one Ollama `/api/chat` NDJSON streaming request and reduces it into a single outcome. Mirrors `anthropic-messages.ts#runSingleAnthropicRequest`'s `emitEnd` contract — see that function's doc. */
394
+ async function runSingleOllamaRequest(options, messages, emitEnd) {
395
+ const { onEvent } = options;
396
+ const body = await openOllamaResponseStream(options, messages, emitEnd);
397
+ if (!body) {
182
398
  return { finishReason: null, toolCalls: [], text: '' };
183
399
  }
184
400
  onEvent({ type: 'status', label: 'requesting' });
185
- const guard = createRoleMarkerGuard('ollama-turn');
186
- let fullText = '';
187
- const toolCalls = [];
188
- let finishReason = null;
189
- for await (const line of decodeNdjsonStream(response.body)) {
401
+ const state = {
402
+ guard: createRoleMarkerGuard('ollama-turn'),
403
+ toolCalls: [],
404
+ fullText: '',
405
+ finishReason: null,
406
+ };
407
+ for await (const line of decodeNdjsonStream(body)) {
190
408
  if (!isRecord(line))
191
409
  continue;
192
- const message = isRecord(line.message) ? line.message : null;
193
- if (message && typeof message.content === 'string' && message.content.length > 0) {
194
- const safe = guard.feedText(message.content);
195
- if (safe.length > 0) {
196
- fullText += safe;
197
- onEvent({ type: 'text_delta', delta: safe });
198
- }
199
- if (guard.contaminated) {
200
- const warn = guard.warningEvent();
201
- if (warn)
202
- onEvent(warn);
203
- finishReason = 'contaminated';
204
- emitEnd('contaminated');
205
- break;
206
- }
207
- }
208
- if (message && Array.isArray(message.tool_calls)) {
209
- for (const rawCall of message.tool_calls) {
210
- if (!isRecord(rawCall) || !isRecord(rawCall.function))
211
- continue;
212
- const name = typeof rawCall.function.name === 'string' ? rawCall.function.name : '';
213
- if (!name)
214
- continue;
215
- const args = rawCall.function.arguments;
216
- const input = typeof args === 'string' ? (() => { try {
217
- return JSON.parse(args);
218
- }
219
- catch {
220
- return args;
221
- } })() : args;
222
- const id = typeof rawCall.id === 'string' && rawCall.id ? rawCall.id : `ollama-tool-${toolCalls.length}`;
223
- toolCalls.push({ id, name, input });
224
- }
225
- if (toolCalls.length > 0)
226
- finishReason = 'tool_calls';
227
- }
228
- if (line.done === true) {
229
- if (finishReason !== 'contaminated' && finishReason !== 'tool_calls')
230
- finishReason = 'stop';
410
+ const result = processOllamaLine(state, line, onEvent, emitEnd);
411
+ if (result === 'break' || result === 'done')
231
412
  break;
232
- }
233
413
  }
234
- // Emitted for every resolved call as soon as the stream ends, independent of whether the
235
- // caller actually supplied an `executeTool` — matches `openai-chat.ts#runOpenAiCompatibleRequest`'s
236
- // identical unconditional-on-resolution emission (see AUD-R4-002 fix note in the module doc).
237
- if (finishReason === 'tool_calls') {
238
- for (const call of toolCalls) {
239
- onEvent({ type: 'tool_use', id: call.id, name: call.name, input: call.input });
240
- }
414
+ if (state.finishReason === 'tool_calls') {
415
+ emitPendingOllamaToolUseEvents(state.toolCalls, onEvent);
416
+ }
417
+ return { finishReason: state.finishReason, toolCalls: state.toolCalls, text: state.fullText };
418
+ }
419
+ /**
420
+ * Decides why the tool loop should stop after one request, or returns `null` when it should
421
+ * instead proceed to execute the pending tool calls — mirrors
422
+ * `anthropic-messages.ts#anthropicLoopExitReason`'s pure decision/effect split.
423
+ */
424
+ export function ollamaLoopExitReason(outcome, toolTurns, maxToolTurns) {
425
+ if (outcome.finishReason !== 'tool_calls' || outcome.toolCalls.length === 0)
426
+ return 'stop';
427
+ if (toolTurns >= maxToolTurns)
428
+ return 'max_tool_turns';
429
+ return null;
430
+ }
431
+ /** Builds the assistant continuation's `tool_calls` field — Ollama's native shape has no `id`/`type` on the wire (see `OllamaToolCallParam`'s doc). */
432
+ export function buildOllamaAssistantToolCalls(toolCalls) {
433
+ return toolCalls.map((call) => ({ function: { name: call.name, arguments: call.input } }));
434
+ }
435
+ /**
436
+ * Runs every pending tool call in order, applying `guardToolResult` and reducing the results into
437
+ * the `tool`-role continuation messages Ollama's native `tool_name`-association scheme expects —
438
+ * see module doc's "Design decision: native `tool`-role images" section for why no separate
439
+ * follow-up message is needed here, unlike `openai-chat.ts`/`azure-chat.ts`.
440
+ */
441
+ export async function executeOllamaToolCalls(executeTool, calls, onEvent) {
442
+ const toolResultMessages = [];
443
+ for (const call of calls) {
444
+ const rawResult = await executeTool(call);
445
+ const result = guardToolResult(rawResult);
446
+ onEvent({
447
+ type: 'tool_result',
448
+ toolUseId: call.id,
449
+ content: result.content,
450
+ ...(result.images ? { images: result.images } : {}),
451
+ isError: result.isError ?? false,
452
+ });
453
+ toolResultMessages.push({
454
+ role: 'tool',
455
+ content: result.content,
456
+ tool_name: call.name,
457
+ ...(result.images ? { images: result.images } : {}),
458
+ });
241
459
  }
242
- return { finishReason, toolCalls, text: fullText };
460
+ return toolResultMessages;
243
461
  }
244
462
  /**
245
463
  * Runs a full Ollama native `/api/chat` turn, including the tool-execution
@@ -249,6 +467,7 @@ async function runSingleOllamaRequest(options, messages, emitEnd) {
249
467
  */
250
468
  export async function runOllamaToolTurn(options) {
251
469
  const maxToolTurns = options.maxToolTurns ?? DEFAULT_MAX_TOOL_TURNS;
470
+ const executeTool = options.executeTool;
252
471
  const endGuard = createTurnEndGuard(options.onEvent, (reason) => ({ type: 'end', reason }));
253
472
  const emitEnd = endGuard.emitEnd;
254
473
  let messages = options.messages.slice();
@@ -259,28 +478,18 @@ export async function runOllamaToolTurn(options) {
259
478
  lastFinishReason = outcome.finishReason;
260
479
  if (endGuard.hasEnded())
261
480
  break;
262
- if (outcome.finishReason !== 'tool_calls' || outcome.toolCalls.length === 0) {
263
- emitEnd('stop');
481
+ const exitReason = ollamaLoopExitReason(outcome, toolTurns, maxToolTurns);
482
+ if (exitReason) {
483
+ emitEnd(exitReason);
264
484
  break;
265
485
  }
266
- if (!options.executeTool) {
486
+ if (!executeTool) {
267
487
  emitEnd('stop');
268
488
  break;
269
489
  }
270
- if (toolTurns >= maxToolTurns) {
271
- emitEnd('max_tool_turns');
272
- break;
273
- }
274
490
  toolTurns += 1;
275
- const assistantToolCalls = outcome.toolCalls.map((call) => ({
276
- function: { name: call.name, arguments: call.input },
277
- }));
278
- const toolResultMessages = [];
279
- for (const call of outcome.toolCalls) {
280
- const result = await options.executeTool(call);
281
- options.onEvent({ type: 'tool_result', toolUseId: call.id, content: result.content, isError: false });
282
- toolResultMessages.push({ role: 'tool', content: result.content, tool_name: call.name });
283
- }
491
+ const assistantToolCalls = buildOllamaAssistantToolCalls(outcome.toolCalls);
492
+ const toolResultMessages = await executeOllamaToolCalls(executeTool, outcome.toolCalls, options.onEvent);
284
493
  messages = [
285
494
  ...messages,
286
495
  { role: 'assistant', content: outcome.text || null, tool_calls: assistantToolCalls },
@@ -1 +1 @@
1
- {"version":3,"file":"ollama-chat.js","sourceRoot":"","sources":["../../src/providers/ollama-chat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama-chat.js","sourceRoot":"","sources":["../../src/providers/ollama-chat.ts"],"names":[],"mappings":"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"}