ai-sdk-provider-goose 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # AI SDK Provider for Goose CLI
2
+
3
+ A clean and simple [AI SDK](https://sdk.vercel.ai) provider for the [Goose CLI](https://github.com/block/goose) with streaming JSON output support.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install ai-sdk-provider-goose
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { goose } from "ai-sdk-provider-goose";
15
+ import { generateText } from "ai";
16
+
17
+ const result = await generateText({
18
+ model: goose("goose"),
19
+ prompt: "What is 2+2?",
20
+ });
21
+
22
+ console.log(result.text);
23
+ ```
24
+
25
+ ## Configuration
26
+
27
+ ```typescript
28
+ const model = goose("goose", {
29
+ binPath: "/path/to/goose", // Default: 'goose'
30
+ timeout: 120000, // Default: 120s
31
+ sessionName: "my-session", // Optional session name
32
+ resume: true, // Resume previous session
33
+ });
34
+ ```
35
+
36
+ ## License
37
+
38
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,462 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ GooseLanguageModel: () => GooseLanguageModel,
24
+ createAPICallError: () => createAPICallError,
25
+ createGoose: () => createGoose,
26
+ createProcessError: () => createProcessError,
27
+ createTimeoutError: () => createTimeoutError,
28
+ goose: () => goose
29
+ });
30
+ module.exports = __toCommonJS(index_exports);
31
+
32
+ // src/goose-provider.ts
33
+ var import_provider2 = require("@ai-sdk/provider");
34
+
35
+ // src/goose-language-model.ts
36
+ var import_child_process = require("child_process");
37
+ var import_readline = require("readline");
38
+ var import_provider_utils = require("@ai-sdk/provider-utils");
39
+
40
+ // src/errors.ts
41
+ var import_provider = require("@ai-sdk/provider");
42
+ function createAPICallError(message, metadata) {
43
+ return new import_provider.APICallError({
44
+ message,
45
+ url: `goose://${metadata?.binPath || "goose"}`,
46
+ requestBodyValues: metadata?.args || [],
47
+ data: metadata,
48
+ isRetryable: false
49
+ });
50
+ }
51
+ function createTimeoutError(timeoutMs, metadata) {
52
+ return new import_provider.APICallError({
53
+ message: `Goose CLI timed out after ${timeoutMs}ms`,
54
+ url: `goose://${metadata?.binPath || "goose"}`,
55
+ requestBodyValues: metadata?.args || [],
56
+ data: metadata,
57
+ isRetryable: true
58
+ });
59
+ }
60
+ function createProcessError(message, exitCode, stderr, metadata) {
61
+ return new import_provider.APICallError({
62
+ message: `Goose CLI error: ${message}`,
63
+ url: `goose://${metadata?.binPath || "goose"}`,
64
+ requestBodyValues: metadata?.args || [],
65
+ data: { ...metadata, exitCode, stderr },
66
+ isRetryable: false
67
+ });
68
+ }
69
+
70
+ // src/goose-language-model.ts
71
+ var GooseLanguageModel = class {
72
+ specificationVersion = "v3";
73
+ provider = "goose";
74
+ modelId;
75
+ supportedUrls = {};
76
+ settings;
77
+ logger;
78
+ constructor(options) {
79
+ this.modelId = options.id;
80
+ this.settings = {
81
+ binPath: options.settings?.binPath || "goose",
82
+ args: options.settings?.args || [],
83
+ timeout: options.settings?.timeout || 12e4,
84
+ sessionName: options.settings?.sessionName,
85
+ resume: options.settings?.resume || false,
86
+ logger: options.settings?.logger
87
+ };
88
+ this.logger = this.settings.logger;
89
+ }
90
+ async doGenerate(options) {
91
+ const prompt = this.convertPromptToText(options.prompt);
92
+ const args = this.buildCLIArgs(prompt);
93
+ this.logger?.debug("Starting Goose CLI generation", {
94
+ binPath: this.settings.binPath,
95
+ args
96
+ });
97
+ const events = await this.spawnGooseProcess(args, options.abortSignal);
98
+ return this.eventsToGenerateResult(events);
99
+ }
100
+ async doStream(options) {
101
+ const prompt = this.convertPromptToText(options.prompt);
102
+ const args = this.buildCLIArgs(prompt);
103
+ this.logger?.debug("Starting Goose CLI streaming", {
104
+ binPath: this.settings.binPath,
105
+ args
106
+ });
107
+ const generator = this.createStreamFromProcess(args, options.abortSignal);
108
+ const stream = new ReadableStream({
109
+ async start(controller) {
110
+ try {
111
+ for await (const part of generator) {
112
+ controller.enqueue(part);
113
+ }
114
+ controller.close();
115
+ } catch (error) {
116
+ controller.error(error);
117
+ }
118
+ }
119
+ });
120
+ return {
121
+ stream
122
+ };
123
+ }
124
+ buildCLIArgs(prompt) {
125
+ const args = ["run", "--output-format", "stream-json", "-t", prompt];
126
+ if (this.settings.sessionName) {
127
+ args.push("--name", this.settings.sessionName);
128
+ }
129
+ if (this.settings.resume) {
130
+ args.push("--resume");
131
+ }
132
+ args.push(...this.settings.args);
133
+ return args;
134
+ }
135
+ async spawnGooseProcess(args, abortSignal) {
136
+ return new Promise((resolve, reject) => {
137
+ const events = [];
138
+ let stderr = "";
139
+ this.logger?.debug("Spawning Goose CLI", {
140
+ binPath: this.settings.binPath,
141
+ args
142
+ });
143
+ const child = (0, import_child_process.spawn)(this.settings.binPath, args);
144
+ const timeout = setTimeout(() => {
145
+ child.kill();
146
+ reject(
147
+ createTimeoutError(this.settings.timeout, {
148
+ binPath: this.settings.binPath,
149
+ args
150
+ })
151
+ );
152
+ }, this.settings.timeout);
153
+ const onAbort = () => {
154
+ clearTimeout(timeout);
155
+ child.kill("SIGTERM");
156
+ reject(
157
+ createAPICallError("Request aborted", {
158
+ binPath: this.settings.binPath,
159
+ args
160
+ })
161
+ );
162
+ };
163
+ if (abortSignal) {
164
+ if (abortSignal.aborted) {
165
+ onAbort();
166
+ return;
167
+ }
168
+ abortSignal.addEventListener("abort", onAbort, { once: true });
169
+ }
170
+ const cleanup = () => {
171
+ clearTimeout(timeout);
172
+ if (abortSignal) {
173
+ abortSignal.removeEventListener("abort", onAbort);
174
+ }
175
+ };
176
+ const rl = (0, import_readline.createInterface)({ input: child.stdout });
177
+ rl.on("line", (line) => {
178
+ try {
179
+ const event = JSON.parse(line);
180
+ events.push(event);
181
+ this.logger?.debug("Received event", event);
182
+ } catch (err) {
183
+ this.logger?.warn("Failed to parse line", { line, err });
184
+ }
185
+ });
186
+ child.stderr.on("data", (data) => {
187
+ stderr += data.toString();
188
+ });
189
+ child.on("error", (error) => {
190
+ cleanup();
191
+ reject(
192
+ createAPICallError(`Failed to spawn Goose CLI: ${error.message}`, {
193
+ binPath: this.settings.binPath,
194
+ args
195
+ })
196
+ );
197
+ });
198
+ child.on("close", (code) => {
199
+ cleanup();
200
+ if (code !== 0 && code !== null) {
201
+ reject(
202
+ createProcessError(
203
+ `Goose CLI exited with code ${code}`,
204
+ code,
205
+ stderr,
206
+ { binPath: this.settings.binPath, args }
207
+ )
208
+ );
209
+ } else {
210
+ resolve(events);
211
+ }
212
+ });
213
+ });
214
+ }
215
+ async *createStreamFromProcess(args, abortSignal) {
216
+ const child = (0, import_child_process.spawn)(this.settings.binPath, args);
217
+ const rl = (0, import_readline.createInterface)({ input: child.stdout });
218
+ let stderr = "";
219
+ child.stderr.on("data", (data) => {
220
+ stderr += data.toString();
221
+ });
222
+ const onAbort = () => {
223
+ child.kill("SIGTERM");
224
+ };
225
+ if (abortSignal) {
226
+ if (abortSignal.aborted) {
227
+ child.kill("SIGTERM");
228
+ throw createAPICallError("Request aborted", {
229
+ binPath: this.settings.binPath,
230
+ args
231
+ });
232
+ }
233
+ abortSignal.addEventListener("abort", onAbort, { once: true });
234
+ }
235
+ let currentTextPartId = null;
236
+ let textStartEmitted = false;
237
+ try {
238
+ for await (const line of rl) {
239
+ try {
240
+ const event = JSON.parse(line);
241
+ this.logger?.debug("Stream event", event);
242
+ if (event.type === "message" && event.message) {
243
+ const msg = event.message;
244
+ if (msg.role === "assistant") {
245
+ for (const content of msg.content) {
246
+ if (content.type === "text" && content.text) {
247
+ if (!textStartEmitted) {
248
+ currentTextPartId = (0, import_provider_utils.generateId)();
249
+ textStartEmitted = true;
250
+ }
251
+ if (currentTextPartId) {
252
+ yield {
253
+ type: "text-delta",
254
+ id: currentTextPartId,
255
+ delta: content.text
256
+ };
257
+ }
258
+ } else if (content.type === "toolRequest") {
259
+ textStartEmitted = false;
260
+ currentTextPartId = null;
261
+ if (content.toolCall?.value) {
262
+ yield {
263
+ type: "tool-call",
264
+ toolCallId: content.id || (0, import_provider_utils.generateId)(),
265
+ toolName: content.toolCall.value.name,
266
+ input: JSON.stringify(content.toolCall.value.arguments)
267
+ };
268
+ }
269
+ }
270
+ }
271
+ } else if (msg.role === "user") {
272
+ for (const content of msg.content) {
273
+ if (content.type === "toolResponse" && content.toolResult) {
274
+ const result = content.toolResult.value;
275
+ const resultText = Array.isArray(result.content) ? result.content.map((c) => c.text || JSON.stringify(c)).join("\n") : JSON.stringify(result.content);
276
+ yield {
277
+ type: "tool-result",
278
+ toolCallId: content.id || (0, import_provider_utils.generateId)(),
279
+ toolName: "unknown",
280
+ result: resultText
281
+ };
282
+ }
283
+ }
284
+ }
285
+ } else if (event.type === "complete") {
286
+ yield {
287
+ type: "finish",
288
+ finishReason: {
289
+ unified: "stop",
290
+ raw: "stop"
291
+ },
292
+ usage: {
293
+ inputTokens: {
294
+ total: 0,
295
+ noCache: void 0,
296
+ cacheRead: void 0,
297
+ cacheWrite: void 0
298
+ },
299
+ outputTokens: {
300
+ total: event.total_tokens || 0,
301
+ text: event.total_tokens || 0,
302
+ reasoning: void 0
303
+ }
304
+ }
305
+ };
306
+ } else if (event.type === "error") {
307
+ throw createAPICallError(event.error || "Unknown error", {
308
+ binPath: this.settings.binPath,
309
+ args
310
+ });
311
+ }
312
+ } catch (err) {
313
+ if (err instanceof Error && "isRetryable" in err) {
314
+ throw err;
315
+ }
316
+ this.logger?.warn("Failed to parse stream line", { line, err });
317
+ }
318
+ }
319
+ } catch (err) {
320
+ child.kill();
321
+ if (abortSignal) {
322
+ abortSignal.removeEventListener("abort", onAbort);
323
+ }
324
+ throw err;
325
+ }
326
+ const exitCode = await new Promise((resolve) => {
327
+ child.on("close", (code) => resolve(code || 0));
328
+ });
329
+ if (abortSignal) {
330
+ abortSignal.removeEventListener("abort", onAbort);
331
+ }
332
+ if (exitCode !== 0) {
333
+ throw createProcessError(
334
+ `Goose CLI exited with code ${exitCode}`,
335
+ exitCode,
336
+ stderr,
337
+ { binPath: this.settings.binPath, args }
338
+ );
339
+ }
340
+ }
341
+ convertPromptToText(prompt) {
342
+ if (Array.isArray(prompt)) {
343
+ const messages = [];
344
+ for (const message of prompt) {
345
+ if (!message || typeof message !== "object") continue;
346
+ switch (message.role) {
347
+ case "system":
348
+ if (typeof message.content === "string") {
349
+ messages.unshift(`System: ${message.content}`);
350
+ }
351
+ break;
352
+ case "user":
353
+ if (typeof message.content === "string") {
354
+ messages.push(message.content);
355
+ } else if (Array.isArray(message.content)) {
356
+ for (const part of message.content) {
357
+ if (part.type === "text") {
358
+ messages.push(part.text);
359
+ }
360
+ }
361
+ }
362
+ break;
363
+ }
364
+ }
365
+ return messages.join("\n\n");
366
+ }
367
+ return String(prompt);
368
+ }
369
+ eventsToGenerateResult(events) {
370
+ let text = "";
371
+ let totalTokens = 0;
372
+ const warnings = [];
373
+ for (const event of events) {
374
+ if (event.type === "message" && event.message) {
375
+ const msg = event.message;
376
+ if (msg.role === "assistant") {
377
+ for (const content of msg.content) {
378
+ if (content.type === "text" && content.text) {
379
+ text += content.text;
380
+ }
381
+ }
382
+ }
383
+ } else if (event.type === "complete") {
384
+ totalTokens = event.total_tokens || 0;
385
+ } else if (event.type === "error") {
386
+ throw createAPICallError(event.error || "Unknown error", {
387
+ binPath: this.settings.binPath
388
+ });
389
+ }
390
+ }
391
+ return {
392
+ content: [{ type: "text", text }],
393
+ finishReason: {
394
+ unified: "stop",
395
+ raw: "stop"
396
+ },
397
+ usage: {
398
+ inputTokens: {
399
+ total: 0,
400
+ noCache: void 0,
401
+ cacheRead: void 0,
402
+ cacheWrite: void 0
403
+ },
404
+ outputTokens: {
405
+ total: totalTokens,
406
+ text: totalTokens,
407
+ reasoning: void 0
408
+ }
409
+ },
410
+ warnings
411
+ };
412
+ }
413
+ };
414
+
415
+ // src/goose-provider.ts
416
+ function createGoose(settings = {}) {
417
+ const createModel = (modelId, modelSettings) => {
418
+ if (modelId !== "goose" && typeof modelId !== "string") {
419
+ throw new import_provider2.NoSuchModelError({
420
+ modelId: String(modelId),
421
+ modelType: "languageModel"
422
+ });
423
+ }
424
+ const mergedSettings = {
425
+ ...settings,
426
+ ...modelSettings
427
+ };
428
+ return new GooseLanguageModel({
429
+ id: modelId,
430
+ settings: mergedSettings
431
+ });
432
+ };
433
+ const provider = Object.assign(createModel, {
434
+ specificationVersion: "v3",
435
+ languageModel: createModel,
436
+ chat: createModel,
437
+ embeddingModel: (modelId) => {
438
+ throw new import_provider2.NoSuchModelError({
439
+ modelId,
440
+ modelType: "embeddingModel"
441
+ });
442
+ },
443
+ imageModel: (modelId) => {
444
+ throw new import_provider2.NoSuchModelError({
445
+ modelId,
446
+ modelType: "imageModel"
447
+ });
448
+ }
449
+ });
450
+ return provider;
451
+ }
452
+ var goose = createGoose();
453
+ // Annotate the CommonJS export names for ESM import in node:
454
+ 0 && (module.exports = {
455
+ GooseLanguageModel,
456
+ createAPICallError,
457
+ createGoose,
458
+ createProcessError,
459
+ createTimeoutError,
460
+ goose
461
+ });
462
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/goose-provider.ts","../src/goose-language-model.ts","../src/errors.ts"],"sourcesContent":["/**\n * AI SDK provider for Goose CLI.\n *\n * @module ai-sdk-provider-goose\n *\n * @example\n * ```typescript\n * import { goose } from 'ai-sdk-provider-goose';\n * import { generateText } from 'ai';\n *\n * // Basic usage\n * const result = await generateText({\n * model: goose('goose'),\n * prompt: 'What is 2+2?',\n * });\n *\n * console.log(result.text);\n *\n * // Session management\n * const model1 = goose('goose', { sessionName: 'my-session' });\n * await generateText({ model: model1, prompt: 'My name is Alice' });\n *\n * const model2 = goose('goose', { sessionName: 'my-session', resume: true });\n * await generateText({ model: model2, prompt: 'What is my name?' });\n * ```\n */\n\n// Provider exports\nexport { createGoose, goose } from './goose-provider.js';\nexport type {\n GooseProvider,\n GooseProviderSettings,\n} from './goose-provider.js';\n\n// Language model exports\nexport { GooseLanguageModel } from './goose-language-model.js';\nexport type {\n GooseModelId,\n GooseLanguageModelOptions,\n} from './goose-language-model.js';\n\n// Type exports\nexport type { GooseSettings, Logger } from './types.js';\n\n// Error utilities\nexport {\n createAPICallError,\n createTimeoutError,\n createProcessError,\n} from './errors.js';\nexport type { GooseErrorMetadata } from './errors.js';\n","import type { LanguageModelV3, ProviderV3 } from '@ai-sdk/provider';\nimport { NoSuchModelError } from '@ai-sdk/provider';\nimport {\n GooseLanguageModel,\n type GooseModelId,\n} from './goose-language-model.js';\nimport type { GooseSettings } from './types.js';\n\n/**\n * Goose provider interface extending AI SDK ProviderV3.\n */\nexport interface GooseProvider extends ProviderV3 {\n /**\n * Create a language model (callable shorthand).\n */\n (modelId: GooseModelId, settings?: GooseSettings): LanguageModelV3;\n\n /**\n * Create a language model.\n */\n languageModel(modelId: GooseModelId, settings?: GooseSettings): LanguageModelV3;\n\n /**\n * Alias for languageModel (follows AI SDK pattern).\n */\n chat(modelId: GooseModelId, settings?: GooseSettings): LanguageModelV3;\n\n /**\n * Embedding models are not supported.\n */\n embeddingModel(modelId: string): never;\n\n /**\n * Image models are not supported.\n */\n imageModel(modelId: string): never;\n}\n\n/**\n * Provider-level settings for Goose.\n */\nexport interface GooseProviderSettings extends GooseSettings {}\n\n/**\n * Creates a Goose provider with the specified settings.\n *\n * @param settings Provider-level settings\n * @returns Goose provider instance\n *\n * @example\n * ```typescript\n * import { createGoose } from 'ai-sdk-provider-goose';\n *\n * const provider = createGoose({\n * binPath: '/path/to/goose',\n * timeout: 60000,\n * });\n *\n * const model = provider('goose');\n * ```\n */\nexport function createGoose(\n settings: GooseProviderSettings = {}\n): GooseProvider {\n const createModel = (\n modelId: GooseModelId,\n modelSettings?: GooseSettings\n ): LanguageModelV3 => {\n if (modelId !== 'goose' && typeof modelId !== 'string') {\n throw new NoSuchModelError({\n modelId: String(modelId),\n modelType: 'languageModel',\n });\n }\n\n const mergedSettings: GooseSettings = {\n ...settings,\n ...modelSettings,\n };\n\n return new GooseLanguageModel({\n id: modelId,\n settings: mergedSettings,\n });\n };\n\n const provider = Object.assign(createModel, {\n specificationVersion: 'v3' as const,\n languageModel: createModel,\n chat: createModel,\n embeddingModel: (modelId: string): never => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'embeddingModel',\n });\n },\n imageModel: (modelId: string): never => {\n throw new NoSuchModelError({\n modelId,\n modelType: 'imageModel',\n });\n },\n });\n\n return provider;\n}\n\n/**\n * Default Goose provider instance.\n *\n * @example\n * ```typescript\n * import { goose } from 'ai-sdk-provider-goose';\n * import { generateText } from 'ai';\n *\n * const result = await generateText({\n * model: goose('goose'),\n * prompt: 'Hello!',\n * });\n * ```\n */\nexport const goose: GooseProvider = createGoose();\n","import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3GenerateResult,\n LanguageModelV3StreamResult,\n LanguageModelV3StreamPart,\n SharedV3Warning,\n} from '@ai-sdk/provider';\nimport { spawn } from 'child_process';\nimport { createInterface } from 'readline';\nimport { generateId } from '@ai-sdk/provider-utils';\nimport type { GooseSettings, GooseStreamEvent, Logger } from './types.js';\nimport {\n createAPICallError,\n createTimeoutError,\n createProcessError,\n} from './errors.js';\n\nexport type GooseModelId = 'goose' | (string & {});\n\nexport interface GooseLanguageModelOptions {\n id: GooseModelId;\n settings?: GooseSettings;\n}\n\n/**\n * Goose CLI language model implementation for AI SDK.\n */\nexport class GooseLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = 'v3' as const;\n readonly provider = 'goose';\n readonly modelId: string;\n readonly supportedUrls = {};\n\n private settings: Required<Omit<GooseSettings, 'sessionName' | 'resume' | 'logger'>> & {\n sessionName?: string;\n resume?: boolean;\n logger?: Logger;\n };\n private logger?: Logger;\n\n constructor(options: GooseLanguageModelOptions) {\n this.modelId = options.id;\n this.settings = {\n binPath: options.settings?.binPath || 'goose',\n args: options.settings?.args || [],\n timeout: options.settings?.timeout || 120000,\n sessionName: options.settings?.sessionName,\n resume: options.settings?.resume || false,\n logger: options.settings?.logger,\n };\n this.logger = this.settings.logger;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const prompt = this.convertPromptToText(options.prompt);\n const args = this.buildCLIArgs(prompt);\n\n this.logger?.debug('Starting Goose CLI generation', {\n binPath: this.settings.binPath,\n args,\n });\n\n const events = await this.spawnGooseProcess(args, options.abortSignal);\n return this.eventsToGenerateResult(events);\n }\n\n async doStream(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3StreamResult> {\n const prompt = this.convertPromptToText(options.prompt);\n const args = this.buildCLIArgs(prompt);\n\n this.logger?.debug('Starting Goose CLI streaming', {\n binPath: this.settings.binPath,\n args,\n });\n\n const generator = this.createStreamFromProcess(args, options.abortSignal);\n\n // Convert async generator to ReadableStream\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n try {\n for await (const part of generator) {\n controller.enqueue(part);\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return {\n stream,\n };\n }\n\n private buildCLIArgs(prompt: string): string[] {\n const args = ['run', '--output-format', 'stream-json', '-t', prompt];\n\n if (this.settings.sessionName) {\n args.push('--name', this.settings.sessionName);\n }\n\n if (this.settings.resume) {\n args.push('--resume');\n }\n\n args.push(...this.settings.args);\n return args;\n }\n\n private async spawnGooseProcess(\n args: string[],\n abortSignal?: AbortSignal\n ): Promise<GooseStreamEvent[]> {\n return new Promise((resolve, reject) => {\n const events: GooseStreamEvent[] = [];\n let stderr = '';\n\n this.logger?.debug('Spawning Goose CLI', {\n binPath: this.settings.binPath,\n args,\n });\n\n const child = spawn(this.settings.binPath, args);\n\n const timeout = setTimeout(() => {\n child.kill();\n reject(\n createTimeoutError(this.settings.timeout, {\n binPath: this.settings.binPath,\n args,\n })\n );\n }, this.settings.timeout);\n\n // Handle abort signal\n const onAbort = () => {\n clearTimeout(timeout);\n child.kill('SIGTERM');\n reject(\n createAPICallError('Request aborted', {\n binPath: this.settings.binPath,\n args,\n })\n );\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n onAbort();\n return;\n }\n abortSignal.addEventListener('abort', onAbort, { once: true });\n }\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (abortSignal) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n };\n\n const rl = createInterface({ input: child.stdout });\n\n rl.on('line', (line) => {\n try {\n const event = JSON.parse(line) as GooseStreamEvent;\n events.push(event);\n this.logger?.debug('Received event', event);\n } catch (err) {\n this.logger?.warn('Failed to parse line', { line, err });\n }\n });\n\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('error', (error) => {\n cleanup();\n reject(\n createAPICallError(`Failed to spawn Goose CLI: ${error.message}`, {\n binPath: this.settings.binPath,\n args,\n })\n );\n });\n\n child.on('close', (code) => {\n cleanup();\n\n if (code !== 0 && code !== null) {\n reject(\n createProcessError(\n `Goose CLI exited with code ${code}`,\n code,\n stderr,\n { binPath: this.settings.binPath, args }\n )\n );\n } else {\n resolve(events);\n }\n });\n });\n }\n\n private async *createStreamFromProcess(\n args: string[],\n abortSignal?: AbortSignal\n ): AsyncGenerator<LanguageModelV3StreamPart> {\n const child = spawn(this.settings.binPath, args);\n const rl = createInterface({ input: child.stdout });\n\n let stderr = '';\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n // Handle abort signal\n const onAbort = () => {\n child.kill('SIGTERM');\n };\n\n if (abortSignal) {\n if (abortSignal.aborted) {\n child.kill('SIGTERM');\n throw createAPICallError('Request aborted', {\n binPath: this.settings.binPath,\n args,\n });\n }\n abortSignal.addEventListener('abort', onAbort, { once: true });\n }\n\n let currentTextPartId: string | null = null;\n let textStartEmitted = false;\n\n try {\n for await (const line of rl) {\n try {\n const event = JSON.parse(line) as GooseStreamEvent;\n this.logger?.debug('Stream event', event);\n\n if (event.type === 'message' && event.message) {\n const msg = event.message;\n\n if (msg.role === 'assistant') {\n for (const content of msg.content) {\n if (content.type === 'text' && content.text) {\n if (!textStartEmitted) {\n currentTextPartId = generateId();\n textStartEmitted = true;\n }\n if (currentTextPartId) {\n yield {\n type: 'text-delta',\n id: currentTextPartId,\n delta: content.text,\n };\n }\n } else if (content.type === 'toolRequest') {\n textStartEmitted = false;\n currentTextPartId = null;\n\n if (content.toolCall?.value) {\n yield {\n type: 'tool-call',\n toolCallId: content.id || generateId(),\n toolName: content.toolCall.value.name,\n input: JSON.stringify(content.toolCall.value.arguments),\n };\n }\n }\n }\n } else if (msg.role === 'user') {\n for (const content of msg.content) {\n if (content.type === 'toolResponse' && content.toolResult) {\n const result = content.toolResult.value;\n const resultText = Array.isArray(result.content)\n ? result.content\n .map((c: any) => c.text || JSON.stringify(c))\n .join('\\n')\n : JSON.stringify(result.content);\n\n yield {\n type: 'tool-result',\n toolCallId: content.id || generateId(),\n toolName: 'unknown',\n result: resultText,\n };\n }\n }\n }\n } else if (event.type === 'complete') {\n yield {\n type: 'finish',\n finishReason: {\n unified: 'stop',\n raw: 'stop',\n },\n usage: {\n inputTokens: {\n total: 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: event.total_tokens || 0,\n text: event.total_tokens || 0,\n reasoning: undefined,\n },\n },\n };\n } else if (event.type === 'error') {\n throw createAPICallError(event.error || 'Unknown error', {\n binPath: this.settings.binPath,\n args,\n });\n }\n } catch (err) {\n if (err instanceof Error && 'isRetryable' in err) {\n throw err;\n }\n this.logger?.warn('Failed to parse stream line', { line, err });\n }\n }\n } catch (err) {\n child.kill();\n if (abortSignal) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n throw err;\n }\n\n const exitCode = await new Promise<number>((resolve) => {\n child.on('close', (code) => resolve(code || 0));\n });\n\n if (abortSignal) {\n abortSignal.removeEventListener('abort', onAbort);\n }\n\n if (exitCode !== 0) {\n throw createProcessError(\n `Goose CLI exited with code ${exitCode}`,\n exitCode,\n stderr,\n { binPath: this.settings.binPath, args }\n );\n }\n }\n\n private convertPromptToText(\n prompt: LanguageModelV3CallOptions['prompt']\n ): string {\n if (Array.isArray(prompt)) {\n const messages: string[] = [];\n\n for (const message of prompt) {\n if (!message || typeof message !== 'object') continue;\n\n switch (message.role) {\n case 'system':\n if (typeof message.content === 'string') {\n messages.unshift(`System: ${message.content}`);\n }\n break;\n case 'user':\n if (typeof message.content === 'string') {\n messages.push(message.content);\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === 'text') {\n messages.push(part.text);\n }\n }\n }\n break;\n }\n }\n\n return messages.join('\\n\\n');\n }\n\n return String(prompt);\n }\n\n private eventsToGenerateResult(\n events: GooseStreamEvent[]\n ): LanguageModelV3GenerateResult {\n let text = '';\n let totalTokens = 0;\n const warnings: SharedV3Warning[] = [];\n\n for (const event of events) {\n if (event.type === 'message' && event.message) {\n const msg = event.message;\n\n if (msg.role === 'assistant') {\n for (const content of msg.content) {\n if (content.type === 'text' && content.text) {\n text += content.text;\n }\n }\n }\n } else if (event.type === 'complete') {\n totalTokens = event.total_tokens || 0;\n } else if (event.type === 'error') {\n throw createAPICallError(event.error || 'Unknown error', {\n binPath: this.settings.binPath,\n });\n }\n }\n\n return {\n content: [{ type: 'text' as const, text }],\n finishReason: {\n unified: 'stop',\n raw: 'stop',\n },\n usage: {\n inputTokens: {\n total: 0,\n noCache: undefined,\n cacheRead: undefined,\n cacheWrite: undefined,\n },\n outputTokens: {\n total: totalTokens,\n text: totalTokens,\n reasoning: undefined,\n },\n },\n warnings,\n };\n }\n}\n","import { APICallError } from '@ai-sdk/provider';\n\n/**\n * Metadata attached to errors from the Goose CLI provider.\n */\nexport interface GooseErrorMetadata {\n binPath?: string;\n args?: string[];\n exitCode?: number;\n stderr?: string;\n}\n\n/**\n * Creates a general API call error.\n */\nexport function createAPICallError(\n message: string,\n metadata?: GooseErrorMetadata\n): APICallError {\n return new APICallError({\n message,\n url: `goose://${metadata?.binPath || 'goose'}`,\n requestBodyValues: metadata?.args || [],\n data: metadata,\n isRetryable: false,\n });\n}\n\n/**\n * Creates a timeout error (retryable).\n */\nexport function createTimeoutError(\n timeoutMs: number,\n metadata?: GooseErrorMetadata\n): APICallError {\n return new APICallError({\n message: `Goose CLI timed out after ${timeoutMs}ms`,\n url: `goose://${metadata?.binPath || 'goose'}`,\n requestBodyValues: metadata?.args || [],\n data: metadata,\n isRetryable: true,\n });\n}\n\n/**\n * Creates a process error for non-zero exit codes.\n */\nexport function createProcessError(\n message: string,\n exitCode: number,\n stderr: string,\n metadata?: GooseErrorMetadata\n): APICallError {\n return new APICallError({\n message: `Goose CLI error: ${message}`,\n url: `goose://${metadata?.binPath || 'goose'}`,\n requestBodyValues: metadata?.args || [],\n data: { ...metadata, exitCode, stderr },\n isRetryable: false,\n });\n}\n"],"mappings":"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","names":["import_provider"]}