@galaxy-stack/ai-coder-core 0.3.0-alpha.1 → 0.3.0-alpha.8

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 (122) hide show
  1. package/CHANGELOG.d/2026-09-19-research-rejection-evidence.md +15 -0
  2. package/CHANGELOG.d/2026-09-21-evidence-missing-remediation.md +15 -0
  3. package/CHANGELOG.d/2026-09-21-observation-nudge-context.md +12 -0
  4. package/CHANGELOG.d/2026-09-22-model-retry-budget.md +18 -0
  5. package/CHANGELOG.d/2026-09-22-no-progress-recovery-turn.md +19 -0
  6. package/CHANGELOG.d/2026-09-23-agent-platform.md +5 -0
  7. package/CHANGELOG.d/2026-09-23-conservative-output-reserve.md +16 -0
  8. package/CHANGELOG.d/2026-09-24-approval-workspace-review.md +7 -0
  9. package/CHANGELOG.d/2026-09-24-incremental-ollama.md +5 -0
  10. package/CHANGELOG.md +71 -1
  11. package/README.md +78 -4
  12. package/dist/adapters/node/config/manual-provider-config.d.ts +19 -0
  13. package/dist/adapters/node/config/manual-provider-config.d.ts.map +1 -0
  14. package/dist/adapters/node/config/manual-provider-config.js +91 -0
  15. package/dist/adapters/node/config/manual-provider-config.js.map +1 -0
  16. package/dist/adapters/node/host/command-containment.d.ts +45 -0
  17. package/dist/adapters/node/host/command-containment.d.ts.map +1 -0
  18. package/dist/adapters/node/host/command-containment.js +580 -0
  19. package/dist/adapters/node/host/command-containment.js.map +1 -0
  20. package/dist/adapters/node/host/content-hash.d.ts +2 -0
  21. package/dist/adapters/node/host/content-hash.d.ts.map +1 -0
  22. package/dist/adapters/node/host/content-hash.js +5 -0
  23. package/dist/adapters/node/host/content-hash.js.map +1 -0
  24. package/dist/adapters/node/host/file-run-store.d.ts +29 -0
  25. package/dist/adapters/node/host/file-run-store.d.ts.map +1 -0
  26. package/dist/adapters/node/host/file-run-store.js +94 -0
  27. package/dist/adapters/node/host/file-run-store.js.map +1 -0
  28. package/dist/adapters/node/host/host-environment.d.ts +9 -0
  29. package/dist/adapters/node/host/host-environment.d.ts.map +1 -0
  30. package/dist/adapters/node/host/host-environment.js +29 -0
  31. package/dist/adapters/node/host/host-environment.js.map +1 -0
  32. package/dist/adapters/node/host/node-command-port.d.ts +21 -0
  33. package/dist/adapters/node/host/node-command-port.d.ts.map +1 -0
  34. package/dist/adapters/node/host/node-command-port.js +281 -0
  35. package/dist/adapters/node/host/node-command-port.js.map +1 -0
  36. package/dist/adapters/node/host/node-workspace-evidence-verifier.d.ts +22 -0
  37. package/dist/adapters/node/host/node-workspace-evidence-verifier.d.ts.map +1 -0
  38. package/dist/adapters/node/host/node-workspace-evidence-verifier.js +384 -0
  39. package/dist/adapters/node/host/node-workspace-evidence-verifier.js.map +1 -0
  40. package/dist/adapters/node/host/node-workspace-port.d.ts +87 -0
  41. package/dist/adapters/node/host/node-workspace-port.d.ts.map +1 -0
  42. package/dist/adapters/node/host/node-workspace-port.js +860 -0
  43. package/dist/adapters/node/host/node-workspace-port.js.map +1 -0
  44. package/dist/adapters/node/host/node-workspace-snapshot.d.ts +61 -0
  45. package/dist/adapters/node/host/node-workspace-snapshot.d.ts.map +1 -0
  46. package/dist/adapters/node/host/node-workspace-snapshot.js +281 -0
  47. package/dist/adapters/node/host/node-workspace-snapshot.js.map +1 -0
  48. package/dist/adapters/node/host/path-scope.d.ts +17 -0
  49. package/dist/adapters/node/host/path-scope.d.ts.map +1 -0
  50. package/dist/adapters/node/host/path-scope.js +89 -0
  51. package/dist/adapters/node/host/path-scope.js.map +1 -0
  52. package/dist/adapters/node/host/project-tools.d.ts +42 -0
  53. package/dist/adapters/node/host/project-tools.d.ts.map +1 -0
  54. package/dist/adapters/node/host/project-tools.js +362 -0
  55. package/dist/adapters/node/host/project-tools.js.map +1 -0
  56. package/dist/adapters/node/mcp/mcp-client.d.ts +206 -0
  57. package/dist/adapters/node/mcp/mcp-client.d.ts.map +1 -0
  58. package/dist/adapters/node/mcp/mcp-client.js +128 -0
  59. package/dist/adapters/node/mcp/mcp-client.js.map +1 -0
  60. package/dist/adapters/node/mcp/oauth-provider.d.ts +39 -0
  61. package/dist/adapters/node/mcp/oauth-provider.d.ts.map +1 -0
  62. package/dist/adapters/node/mcp/oauth-provider.js +168 -0
  63. package/dist/adapters/node/mcp/oauth-provider.js.map +1 -0
  64. package/dist/adapters/node/memory/sqlite-memory.d.ts +22 -0
  65. package/dist/adapters/node/memory/sqlite-memory.d.ts.map +1 -0
  66. package/dist/adapters/node/memory/sqlite-memory.js +83 -0
  67. package/dist/adapters/node/memory/sqlite-memory.js.map +1 -0
  68. package/dist/adapters/node/provider/ollama-chat-stream.d.ts +17 -0
  69. package/dist/adapters/node/provider/ollama-chat-stream.d.ts.map +1 -0
  70. package/dist/adapters/node/provider/ollama-chat-stream.js +176 -0
  71. package/dist/adapters/node/provider/ollama-chat-stream.js.map +1 -0
  72. package/dist/adapters/node/provider/ollama-coding-model.d.ts +89 -0
  73. package/dist/adapters/node/provider/ollama-coding-model.d.ts.map +1 -0
  74. package/dist/adapters/node/provider/ollama-coding-model.js +464 -0
  75. package/dist/adapters/node/provider/ollama-coding-model.js.map +1 -0
  76. package/dist/adapters/node/provider/ollama-research-port.d.ts +32 -0
  77. package/dist/adapters/node/provider/ollama-research-port.d.ts.map +1 -0
  78. package/dist/adapters/node/provider/ollama-research-port.js +346 -0
  79. package/dist/adapters/node/provider/ollama-research-port.js.map +1 -0
  80. package/dist/adapters/node/skills/directory-skills.d.ts +12 -0
  81. package/dist/adapters/node/skills/directory-skills.d.ts.map +1 -0
  82. package/dist/adapters/node/skills/directory-skills.js +90 -0
  83. package/dist/adapters/node/skills/directory-skills.js.map +1 -0
  84. package/dist/adapters/node/tools/tool-executor.d.ts +91 -0
  85. package/dist/adapters/node/tools/tool-executor.d.ts.map +1 -0
  86. package/dist/adapters/node/tools/tool-executor.js +948 -0
  87. package/dist/adapters/node/tools/tool-executor.js.map +1 -0
  88. package/dist/adapters/node/tools/workspace-review.d.ts +13 -0
  89. package/dist/adapters/node/tools/workspace-review.d.ts.map +1 -0
  90. package/dist/adapters/node/tools/workspace-review.js +81 -0
  91. package/dist/adapters/node/tools/workspace-review.js.map +1 -0
  92. package/dist/agent/index.d.ts +79 -0
  93. package/dist/agent/index.d.ts.map +1 -0
  94. package/dist/agent/index.js +97 -0
  95. package/dist/agent/index.js.map +1 -0
  96. package/dist/approval/approval-policy.d.ts.map +1 -1
  97. package/dist/approval/approval-policy.js +4 -1
  98. package/dist/approval/approval-policy.js.map +1 -1
  99. package/dist/context/checkpoint.d.ts +2 -0
  100. package/dist/context/checkpoint.d.ts.map +1 -1
  101. package/dist/context/checkpoint.js +5 -2
  102. package/dist/context/checkpoint.js.map +1 -1
  103. package/dist/context/context-manager.d.ts.map +1 -1
  104. package/dist/context/context-manager.js +21 -8
  105. package/dist/context/context-manager.js.map +1 -1
  106. package/dist/context/context-profile.d.ts +1 -1
  107. package/dist/context/context-profile.js +2 -2
  108. package/dist/prompt/prompt-assembler.d.ts +1 -0
  109. package/dist/prompt/prompt-assembler.d.ts.map +1 -1
  110. package/dist/prompt/prompt-assembler.js +16 -2
  111. package/dist/prompt/prompt-assembler.js.map +1 -1
  112. package/dist/runtime/run-controller.d.ts.map +1 -1
  113. package/dist/runtime/run-controller.js +131 -24
  114. package/dist/runtime/run-controller.js.map +1 -1
  115. package/dist/runtime/runtime-types.d.ts +20 -0
  116. package/dist/runtime/runtime-types.d.ts.map +1 -1
  117. package/dist/tools/tool-registry.js +1 -1
  118. package/dist/tools/tool-registry.js.map +1 -1
  119. package/docs/AGENT_PLATFORM.md +91 -0
  120. package/docs/GALAXY_AGENT_PLATFORM_PLAN.md +353 -0
  121. package/docs/GALAXY_AGENT_PLATFORM_TODO.md +176 -0
  122. package/package.json +19 -5
@@ -0,0 +1,464 @@
1
+ import { CodingProviderError, portFailure, portSuccess, } from "../../../ports/index.js";
2
+ import { createOllamaChatNormalizer } from "./ollama-chat-stream.js";
3
+ import { randomUUID } from 'node:crypto';
4
+ const MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
5
+ const TRANSPORT_RETRY_DELAYS_MS = Object.freeze([500, 1_000]);
6
+ const RETRYABLE_TRANSPORT_CAUSES = new Set([
7
+ "ECONNREFUSED",
8
+ "ECONNRESET",
9
+ "ENOTFOUND",
10
+ "ETIMEDOUT",
11
+ "EAI_AGAIN",
12
+ ]);
13
+ function isObject(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+ function apiEndpoint(baseUrl, route) {
17
+ const root = baseUrl.replace(/\/+$/, "");
18
+ return `${root.endsWith("/api") ? root : `${root}/api`}/${route}`;
19
+ }
20
+ function estimatedTokens(value) {
21
+ return Math.max(1, Math.ceil(Buffer.byteLength(JSON.stringify(value), "utf8") / 4));
22
+ }
23
+ function ollamaCompatibleJsonSchema(value) {
24
+ if (Array.isArray(value))
25
+ return Object.freeze(value.map(ollamaCompatibleJsonSchema));
26
+ if (!isObject(value))
27
+ return value;
28
+ if (Object.hasOwn(value, "oneOf") && Object.hasOwn(value, "anyOf")) {
29
+ throw new Error("Ollama schema adaptation cannot safely combine oneOf and anyOf at the same node.");
30
+ }
31
+ const adapted = {};
32
+ for (const [key, item] of Object.entries(value)) {
33
+ if (key === "const" || key === "oneOf")
34
+ continue;
35
+ adapted[key] = ollamaCompatibleJsonSchema(item);
36
+ }
37
+ if (Object.hasOwn(value, "const")) {
38
+ adapted.enum = Object.freeze([ollamaCompatibleJsonSchema(value.const)]);
39
+ }
40
+ if (Object.hasOwn(value, "oneOf")) {
41
+ if (!Array.isArray(value.oneOf) || value.oneOf.length === 0) {
42
+ throw new Error("Ollama schema adaptation requires oneOf to contain at least one branch.");
43
+ }
44
+ adapted.anyOf = Object.freeze(value.oneOf.map(ollamaCompatibleJsonSchema));
45
+ }
46
+ return Object.freeze(adapted);
47
+ }
48
+ function ollamaToolDefinitions(tools) {
49
+ return Object.freeze(tools.map((tool) => Object.freeze({
50
+ type: tool.type,
51
+ function: Object.freeze({
52
+ ...tool.function,
53
+ parameters: ollamaCompatibleJsonSchema(tool.function.parameters),
54
+ }),
55
+ })));
56
+ }
57
+ function modelMessages(messages, preserveThinking) {
58
+ return Object.freeze(messages.map((message) => {
59
+ if (message.role === "tool") {
60
+ return Object.freeze({ role: "tool", tool_name: message.toolName, content: message.content });
61
+ }
62
+ if (message.role === "assistant") {
63
+ return Object.freeze({
64
+ role: "assistant",
65
+ content: message.content,
66
+ ...(preserveThinking && message.thinking ? { thinking: message.thinking } : {}),
67
+ ...(message.toolCalls?.length ? {
68
+ tool_calls: Object.freeze(message.toolCalls.map((call, index) => Object.freeze({
69
+ type: "function",
70
+ function: Object.freeze({ index, name: call.name, arguments: call.arguments }),
71
+ }))),
72
+ } : {}),
73
+ });
74
+ }
75
+ return Object.freeze({ role: message.role, content: message.content });
76
+ }));
77
+ }
78
+ function contextWindowFromShow(show) {
79
+ const info = show.model_info;
80
+ if (!isObject(info))
81
+ return undefined;
82
+ const values = Object.entries(info)
83
+ .filter(([key, value]) => key.endsWith(".context_length") && Number.isSafeInteger(value) && Number(value) > 0)
84
+ .map(([, value]) => Number(value));
85
+ return values.length === 0 ? undefined : Math.max(...values);
86
+ }
87
+ function errorCodeForStatus(status) {
88
+ if (status === 401 || status === 403)
89
+ return "PERMISSION_DENIED";
90
+ if (status === 404)
91
+ return "CAPABILITY_MISMATCH";
92
+ if (status === 408 || status === 504)
93
+ return "DEADLINE_EXCEEDED";
94
+ if (status === 429 || status >= 500)
95
+ return "UNAVAILABLE";
96
+ return "PROVIDER_ERROR";
97
+ }
98
+ function providerCodeForStatus(status) {
99
+ if (status === 401 || status === 403)
100
+ return "AUTHENTICATION";
101
+ if (status === 404)
102
+ return "CAPABILITY_MISMATCH";
103
+ if (status === 408 || status === 504)
104
+ return "TIMEOUT";
105
+ if (status === 429)
106
+ return "RATE_LIMITED";
107
+ return "PROVIDER_ERROR";
108
+ }
109
+ function safeErrorText(raw, apiKey) {
110
+ let value = raw.slice(0, 512).replace(/Bearer\s+[^\s"']+/gi, "Bearer [REDACTED]");
111
+ if (apiKey)
112
+ value = value.replaceAll(apiKey, "[REDACTED]");
113
+ try {
114
+ const parsed = JSON.parse(value);
115
+ if (isObject(parsed) && typeof parsed.error === "string")
116
+ value = parsed.error.slice(0, 300);
117
+ }
118
+ catch {
119
+ // Preserve the bounded plain-text provider error.
120
+ }
121
+ return value.trim() || "Ollama request failed without an error message.";
122
+ }
123
+ function transportCauseCode(error) {
124
+ let current = error;
125
+ for (let depth = 0; depth < 3; depth += 1) {
126
+ if (!isObject(current) || !isObject(current.cause) || typeof current.cause.code !== "string")
127
+ return undefined;
128
+ const code = current.cause.code.trim().toUpperCase();
129
+ if (/^[A-Z][A-Z0-9_]{1,39}$/.test(code))
130
+ return code;
131
+ current = current.cause;
132
+ }
133
+ return undefined;
134
+ }
135
+ function sanitizedStreamChunks(chunks, apiKey) {
136
+ return Object.freeze(chunks.map((chunk) => {
137
+ if (!isObject(chunk) || typeof chunk.error !== "string")
138
+ return chunk;
139
+ return Object.freeze({ ...chunk, error: safeErrorText(JSON.stringify({ error: chunk.error }), apiKey) });
140
+ }));
141
+ }
142
+ async function* readResponseBody(response, signal) {
143
+ if (response.body === null)
144
+ throw new Error("Ollama response has no body.");
145
+ const reader = response.body.getReader();
146
+ let bytes = 0;
147
+ let ended = false;
148
+ const abort = () => { void reader.cancel(signal.reason).catch(() => undefined); };
149
+ signal.addEventListener("abort", abort, { once: true });
150
+ if (signal.aborted)
151
+ abort();
152
+ try {
153
+ while (true) {
154
+ const part = await reader.read();
155
+ signal.throwIfAborted();
156
+ if (part.done) {
157
+ ended = true;
158
+ break;
159
+ }
160
+ bytes += part.value.byteLength;
161
+ if (bytes > MAX_RESPONSE_BYTES)
162
+ throw new Error("Ollama response exceeded 8 MiB.");
163
+ yield part.value;
164
+ }
165
+ }
166
+ finally {
167
+ signal.removeEventListener("abort", abort);
168
+ if (!ended)
169
+ await reader.cancel().catch(() => undefined);
170
+ reader.releaseLock();
171
+ }
172
+ }
173
+ async function boundedResponseText(response, signal) {
174
+ const decoder = new TextDecoder("utf-8", { fatal: true });
175
+ let text = "";
176
+ for await (const part of readResponseBody(response, signal))
177
+ text += decoder.decode(part, { stream: true });
178
+ return text + decoder.decode();
179
+ }
180
+ async function* readNdjson(response, signal, onBytes) {
181
+ const decoder = new TextDecoder("utf-8", { fatal: true });
182
+ let buffered = "";
183
+ for await (const part of readResponseBody(response, signal)) {
184
+ onBytes(part.byteLength);
185
+ buffered += decoder.decode(part, { stream: true });
186
+ let start = 0;
187
+ let newline;
188
+ while ((newline = buffered.indexOf("\n", start)) >= 0) {
189
+ const line = buffered.slice(start, newline).trim();
190
+ start = newline + 1;
191
+ if (line)
192
+ yield JSON.parse(line);
193
+ }
194
+ buffered = buffered.slice(start);
195
+ }
196
+ buffered += decoder.decode();
197
+ if (buffered.trim())
198
+ yield JSON.parse(buffered);
199
+ }
200
+ export class OllamaCodingModel {
201
+ options;
202
+ identity;
203
+ fetchImpl;
204
+ requestTimeoutMs;
205
+ capabilityCache = null;
206
+ chatRequests = 0;
207
+ normalizedEvents = 0;
208
+ responseBytes = 0;
209
+ responseChunks = 0;
210
+ // Ollama may omit tool IDs. A process-local counter alone collides with
211
+ // checkpointed IDs when the same run resumes in a fresh adapter instance.
212
+ correlationScope = randomUUID();
213
+ constructor(options) {
214
+ this.options = options;
215
+ this.fetchImpl = options.fetch ?? globalThis.fetch;
216
+ this.requestTimeoutMs = options.requestTimeoutMs ?? 180_000;
217
+ if (!Number.isSafeInteger(this.requestTimeoutMs) || this.requestTimeoutMs < 1) {
218
+ throw new Error("Ollama requestTimeoutMs must be a positive integer.");
219
+ }
220
+ this.identity = Object.freeze({
221
+ baseUrl: options.baseUrl,
222
+ model: options.model,
223
+ provider: "ollama",
224
+ runtimeVersion: "ollama-api-chat-v1",
225
+ });
226
+ }
227
+ get diagnostics() {
228
+ return Object.freeze({
229
+ chatRequests: this.chatRequests,
230
+ normalizedEvents: this.normalizedEvents,
231
+ responseBytes: this.responseBytes,
232
+ responseChunks: this.responseChunks,
233
+ });
234
+ }
235
+ headers() {
236
+ return Object.freeze({
237
+ "Content-Type": "application/json",
238
+ ...(this.options.apiKey ? { Authorization: `Bearer ${this.options.apiKey}` } : {}),
239
+ });
240
+ }
241
+ async request(url, body, context) {
242
+ if (context.signal.aborted)
243
+ throw new CodingProviderError("CANCELED", "Ollama request was canceled.");
244
+ const remaining = context.deadline - Date.now();
245
+ if (remaining <= 0)
246
+ throw new CodingProviderError("TIMEOUT", "Ollama request deadline elapsed.", true);
247
+ for (let attempt = 0;; attempt += 1) {
248
+ const controller = new AbortController();
249
+ const abortWith = (error) => {
250
+ if (!controller.signal.aborted)
251
+ controller.abort(error);
252
+ };
253
+ const cancel = () => abortWith(new CodingProviderError("CANCELED", "Ollama request was canceled."));
254
+ context.signal.addEventListener("abort", cancel, { once: true });
255
+ const timer = setTimeout(() => abortWith(new CodingProviderError("TIMEOUT", "Ollama request timed out.", true)), Math.min(context.deadline - Date.now(), this.requestTimeoutMs));
256
+ const dispose = () => {
257
+ clearTimeout(timer);
258
+ context.signal.removeEventListener("abort", cancel);
259
+ };
260
+ try {
261
+ const response = await this.fetchImpl(url, {
262
+ method: "POST",
263
+ headers: this.headers(),
264
+ body: JSON.stringify(body),
265
+ signal: controller.signal,
266
+ });
267
+ return Object.freeze({ dispose, response, signal: controller.signal });
268
+ }
269
+ catch (error) {
270
+ dispose();
271
+ const reason = controller.signal.reason;
272
+ if (reason instanceof CodingProviderError)
273
+ throw reason;
274
+ const message = safeErrorText(error instanceof Error ? error.message : String(error), this.options.apiKey);
275
+ const causeCode = transportCauseCode(error);
276
+ const delayMs = TRANSPORT_RETRY_DELAYS_MS[attempt];
277
+ if (causeCode !== undefined && RETRYABLE_TRANSPORT_CAUSES.has(causeCode) && delayMs !== undefined) {
278
+ if (context.signal.aborted)
279
+ throw new CodingProviderError("CANCELED", "Ollama request was canceled.");
280
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
281
+ if (context.signal.aborted)
282
+ throw new CodingProviderError("CANCELED", "Ollama request was canceled.");
283
+ continue;
284
+ }
285
+ throw new CodingProviderError("PROVIDER_ERROR", `Ollama transport failed${causeCode === undefined ? "" : ` [cause=${causeCode}]`}: ${message}`, true);
286
+ }
287
+ }
288
+ }
289
+ async capabilities(context) {
290
+ if (this.capabilityCache !== null)
291
+ return portSuccess(this.capabilityCache);
292
+ let lease = null;
293
+ try {
294
+ lease = await this.request(apiEndpoint(this.options.baseUrl, "show"), Object.freeze({
295
+ model: this.options.model,
296
+ verbose: false,
297
+ }), context);
298
+ const { response } = lease;
299
+ const raw = await boundedResponseText(response, lease.signal);
300
+ if (!response.ok) {
301
+ const code = errorCodeForStatus(response.status);
302
+ return portFailure({
303
+ code,
304
+ message: `Ollama model probe failed (${response.status}): ${safeErrorText(raw, this.options.apiKey)}`,
305
+ retryable: code === "UNAVAILABLE" || code === "DEADLINE_EXCEEDED",
306
+ });
307
+ }
308
+ const show = JSON.parse(raw);
309
+ if (!isObject(show))
310
+ throw new Error("Ollama /api/show response must be an object.");
311
+ const names = new Set(Array.isArray(show.capabilities)
312
+ ? show.capabilities.filter((value) => typeof value === "string")
313
+ : []);
314
+ const toolCalling = names.has("tools") || names.has("tool") ? "supported" : "unknown";
315
+ const isKimiK27Code = /(^|\/)kimi-k2\.7-code(?::|$)/i.test(this.options.model);
316
+ const thinking = names.has("thinking")
317
+ ? isKimiK27Code ? "required" : "optional"
318
+ : "unknown";
319
+ const cloudModel = /:cloud$/i.test(this.options.model);
320
+ const contextWindow = contextWindowFromShow(show);
321
+ this.capabilityCache = Object.freeze({
322
+ identity: this.identity,
323
+ evidence: Object.freeze([Object.freeze({
324
+ observedAt: new Date().toISOString(),
325
+ source: "provider_api",
326
+ verified: true,
327
+ })]),
328
+ ...(contextWindow === undefined ? {} : { contextWindow }),
329
+ input: Object.freeze({
330
+ text: "supported",
331
+ image: names.has("vision") ? "supported" : "unknown",
332
+ audio: "unknown",
333
+ video: "unknown",
334
+ }),
335
+ output: Object.freeze({ text: "supported", image: "unknown" }),
336
+ parallelToolCalling: toolCalling === "supported" ? "supported" : "unknown",
337
+ preserveThinking: thinking === "optional" || thinking === "required" ? "supported" : "unknown",
338
+ streaming: "supported",
339
+ // Ollama Cloud does not currently support structured outputs. A local
340
+ // model advertising the standard API can still use the format field.
341
+ structuredOutput: cloudModel ? "unknown" : "supported",
342
+ thinking,
343
+ tokenCounting: "unsupported",
344
+ toolCalling,
345
+ });
346
+ return portSuccess(this.capabilityCache);
347
+ }
348
+ catch (error) {
349
+ const provider = error instanceof CodingProviderError ? error : null;
350
+ const code = provider?.code === "CANCELED"
351
+ ? "CANCELED"
352
+ : provider?.code === "TIMEOUT"
353
+ ? "DEADLINE_EXCEEDED"
354
+ : "PROVIDER_ERROR";
355
+ return portFailure({
356
+ code,
357
+ message: error instanceof Error ? error.message : String(error),
358
+ retryable: provider?.retryable ?? false,
359
+ });
360
+ }
361
+ finally {
362
+ lease?.dispose();
363
+ }
364
+ }
365
+ async countTokens(input, context) {
366
+ if (context.signal.aborted)
367
+ return portFailure({ code: "CANCELED", message: "Ollama token estimate was canceled.", retryable: false });
368
+ const count = Object.freeze({ exact: false, source: "estimate", tokens: estimatedTokens(input) });
369
+ return portSuccess(count);
370
+ }
371
+ async *streamRound(request, context) {
372
+ this.chatRequests += 1;
373
+ const roundId = `ollama:${this.correlationScope}:${this.chatRequests}`;
374
+ let lease;
375
+ try {
376
+ lease = await this.request(apiEndpoint(this.options.baseUrl, "chat"), Object.freeze({
377
+ model: this.options.model,
378
+ messages: modelMessages(request.messages, request.preserveThinking),
379
+ // Ollama documents `tools` as optional. Omitting the field entirely on
380
+ // a core-enforced tool-free finalization turn prevents model templates
381
+ // from treating an empty array as an active tool-calling mode.
382
+ ...(request.tools.length === 0 ? {} : { tools: ollamaToolDefinitions(request.tools) }),
383
+ stream: true,
384
+ think: this.options.thinking ?? request.think,
385
+ options: Object.freeze({
386
+ ...(request.maxOutputTokens === undefined ? {} : { num_predict: request.maxOutputTokens }),
387
+ ...(request.temperature === undefined ? {} : { temperature: request.temperature }),
388
+ }),
389
+ }), context);
390
+ }
391
+ catch (error) {
392
+ yield Object.freeze({ type: "started" });
393
+ yield Object.freeze({
394
+ type: "error",
395
+ error: error instanceof CodingProviderError
396
+ ? error
397
+ : new CodingProviderError("PROVIDER_ERROR", error instanceof Error ? error.message : String(error), true),
398
+ });
399
+ return;
400
+ }
401
+ const { response } = lease;
402
+ try {
403
+ if (!response.ok) {
404
+ try {
405
+ const raw = await boundedResponseText(response, lease.signal);
406
+ const code = providerCodeForStatus(response.status);
407
+ yield Object.freeze({ type: "started" });
408
+ yield Object.freeze({
409
+ type: "error",
410
+ error: new CodingProviderError(code, `Ollama chat failed (${response.status}): ${safeErrorText(raw, this.options.apiKey)}`, response.status === 408 || response.status === 429 || response.status >= 500),
411
+ });
412
+ }
413
+ catch (error) {
414
+ yield Object.freeze({ type: "started" });
415
+ yield Object.freeze({
416
+ type: "error",
417
+ error: error instanceof CodingProviderError
418
+ ? error
419
+ : new CodingProviderError("MALFORMED_STREAM", `Unable to read Ollama error response: ${error instanceof Error ? error.message : String(error)}`),
420
+ });
421
+ }
422
+ return;
423
+ }
424
+ const normalizer = createOllamaChatNormalizer({
425
+ identity: this.identity,
426
+ ...(request.maxOutputTokens === undefined ? {} : { requestedMaxOutputTokens: request.maxOutputTokens }),
427
+ roundId,
428
+ });
429
+ this.normalizedEvents += normalizer.initial.length;
430
+ yield* normalizer.initial;
431
+ try {
432
+ for await (const chunk of readNdjson(response, lease.signal, bytes => { this.responseBytes += bytes; })) {
433
+ this.responseChunks++;
434
+ const events = normalizer.push(sanitizedStreamChunks([chunk], this.options.apiKey)[0]);
435
+ this.normalizedEvents += events.length;
436
+ yield* events;
437
+ if (normalizer.failed)
438
+ return;
439
+ }
440
+ const final = normalizer.finish();
441
+ this.normalizedEvents += final.length;
442
+ yield* final;
443
+ }
444
+ catch (error) {
445
+ yield Object.freeze({
446
+ type: "error",
447
+ error: error instanceof CodingProviderError
448
+ ? error
449
+ : new CodingProviderError("MALFORMED_STREAM", `Unable to decode Ollama NDJSON: ${error instanceof Error ? error.message : String(error)}`,
450
+ // Invalid JSON structure is deterministic provider misbehavior;
451
+ // a truncated body or decode failure is transport-level noise.
452
+ !(error instanceof SyntaxError)),
453
+ });
454
+ }
455
+ }
456
+ finally {
457
+ lease.dispose();
458
+ // Also release the response when the consumer stops just after `started`.
459
+ if (response.body && !response.body.locked)
460
+ await response.body.cancel().catch(() => undefined);
461
+ }
462
+ }
463
+ }
464
+ //# sourceMappingURL=ollama-coding-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-coding-model.js","sourceRoot":"","sources":["../../../../src/adapters/node/provider/ollama-coding-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type ResearchPort, type ToolExecutionContext } from "../../../ports/index.js";
2
+ export type OllamaResearchFetch = (input: string | URL, init?: RequestInit) => Promise<Response>;
3
+ export interface OllamaResearchPortOptions {
4
+ readonly apiKey?: string;
5
+ readonly fetch?: OllamaResearchFetch;
6
+ readonly timeoutMs?: number;
7
+ }
8
+ export declare const OLLAMA_RESEARCH_LIMITS: Readonly<{
9
+ defaultFetchBytes: 12000;
10
+ defaultSearchResults: 3;
11
+ maxFetchBytes: 65536;
12
+ maxQueryBytes: 2048;
13
+ maxResponseBytes: 1048576;
14
+ maxSearchResults: 10;
15
+ maxSnippetBytes: 2048;
16
+ maxTitleBytes: 512;
17
+ maxUrlBytes: 4096;
18
+ timeoutMs: 30000;
19
+ }>;
20
+ /** Cloud research only: no local URL is fetched, and external content never becomes trusted instructions. */
21
+ export declare class OllamaResearchPort implements ResearchPort {
22
+ private readonly apiKey;
23
+ private readonly fetchImpl;
24
+ private readonly timeoutMs;
25
+ constructor(options?: OllamaResearchPortOptions);
26
+ private hasCredential;
27
+ private redact;
28
+ private request;
29
+ search(input: Parameters<ResearchPort["search"]>[0], context: ToolExecutionContext): ReturnType<ResearchPort["search"]>;
30
+ extract(input: Parameters<ResearchPort["extract"]>[0], context: ToolExecutionContext): ReturnType<ResearchPort["extract"]>;
31
+ }
32
+ //# sourceMappingURL=ollama-research-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-research-port.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/provider/ollama-research-port.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,YAAY,EAEjB,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjG,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;EAWjC,CAAC;AA8HH,6GAA6G;AAC7G,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,GAAE,yBAA8B;IASnD,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,MAAM;YAUA,OAAO;IAyEf,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IA4CvH,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;CA+BjI"}