ai-sdk-provider-goose 0.1.0 → 0.1.1

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/dist/index.cjs CHANGED
@@ -83,13 +83,14 @@ var GooseLanguageModel = class {
83
83
  timeout: options.settings?.timeout || 12e4,
84
84
  sessionName: options.settings?.sessionName,
85
85
  resume: options.settings?.resume || false,
86
- logger: options.settings?.logger
86
+ logger: options.settings?.logger,
87
+ env: options.settings?.env
87
88
  };
88
89
  this.logger = this.settings.logger;
89
90
  }
90
91
  async doGenerate(options) {
91
- const prompt = this.convertPromptToText(options.prompt);
92
- const args = this.buildCLIArgs(prompt);
92
+ const { system, prompt } = this.extractPromptParts(options.prompt);
93
+ const args = this.buildCLIArgs(system, prompt);
93
94
  this.logger?.debug("Starting Goose CLI generation", {
94
95
  binPath: this.settings.binPath,
95
96
  args
@@ -98,8 +99,8 @@ var GooseLanguageModel = class {
98
99
  return this.eventsToGenerateResult(events);
99
100
  }
100
101
  async doStream(options) {
101
- const prompt = this.convertPromptToText(options.prompt);
102
- const args = this.buildCLIArgs(prompt);
102
+ const { system, prompt } = this.extractPromptParts(options.prompt);
103
+ const args = this.buildCLIArgs(system, prompt);
103
104
  this.logger?.debug("Starting Goose CLI streaming", {
104
105
  binPath: this.settings.binPath,
105
106
  args
@@ -121,8 +122,12 @@ var GooseLanguageModel = class {
121
122
  stream
122
123
  };
123
124
  }
124
- buildCLIArgs(prompt) {
125
- const args = ["run", "--output-format", "stream-json", "-t", prompt];
125
+ buildCLIArgs(system, prompt) {
126
+ const args = ["run", "--output-format", "stream-json"];
127
+ if (system) {
128
+ args.push("--system", system);
129
+ }
130
+ args.push("-t", prompt);
126
131
  if (this.settings.sessionName) {
127
132
  args.push("--name", this.settings.sessionName);
128
133
  }
@@ -140,7 +145,9 @@ var GooseLanguageModel = class {
140
145
  binPath: this.settings.binPath,
141
146
  args
142
147
  });
143
- const child = (0, import_child_process.spawn)(this.settings.binPath, args);
148
+ const child = (0, import_child_process.spawn)(this.settings.binPath, args, {
149
+ env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
150
+ });
144
151
  const timeout = setTimeout(() => {
145
152
  child.kill();
146
153
  reject(
@@ -213,7 +220,9 @@ var GooseLanguageModel = class {
213
220
  });
214
221
  }
215
222
  async *createStreamFromProcess(args, abortSignal) {
216
- const child = (0, import_child_process.spawn)(this.settings.binPath, args);
223
+ const child = (0, import_child_process.spawn)(this.settings.binPath, args, {
224
+ env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
225
+ });
217
226
  const rl = (0, import_readline.createInterface)({ input: child.stdout });
218
227
  let stderr = "";
219
228
  child.stderr.on("data", (data) => {
@@ -338,33 +347,37 @@ var GooseLanguageModel = class {
338
347
  );
339
348
  }
340
349
  }
341
- convertPromptToText(prompt) {
350
+ extractPromptParts(prompt) {
342
351
  if (Array.isArray(prompt)) {
343
- const messages = [];
352
+ let system;
353
+ const userMessages = [];
344
354
  for (const message of prompt) {
345
355
  if (!message || typeof message !== "object") continue;
346
356
  switch (message.role) {
347
357
  case "system":
348
358
  if (typeof message.content === "string") {
349
- messages.unshift(`System: ${message.content}`);
359
+ system = message.content;
350
360
  }
351
361
  break;
352
362
  case "user":
353
363
  if (typeof message.content === "string") {
354
- messages.push(message.content);
364
+ userMessages.push(message.content);
355
365
  } else if (Array.isArray(message.content)) {
356
366
  for (const part of message.content) {
357
367
  if (part.type === "text") {
358
- messages.push(part.text);
368
+ userMessages.push(part.text);
359
369
  }
360
370
  }
361
371
  }
362
372
  break;
363
373
  }
364
374
  }
365
- return messages.join("\n\n");
375
+ return {
376
+ system,
377
+ prompt: userMessages.join("\n\n")
378
+ };
366
379
  }
367
- return String(prompt);
380
+ return { prompt: String(prompt) };
368
381
  }
369
382
  eventsToGenerateResult(events) {
370
383
  let text = "";
@@ -1 +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"]}
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' | 'env'>> & {\n sessionName?: string;\n resume?: boolean;\n logger?: Logger;\n env?: Record<string, string>;\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 env: options.settings?.env,\n };\n this.logger = this.settings.logger;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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 { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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(system: string | undefined, prompt: string): string[] {\n const args = ['run', '--output-format', 'stream-json'];\n\n if (system) {\n args.push('--system', system);\n }\n\n args.push('-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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 extractPromptParts(\n prompt: LanguageModelV3CallOptions['prompt']\n ): { system?: string; prompt: string } {\n if (Array.isArray(prompt)) {\n let system: string | undefined;\n const userMessages: 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 system = message.content;\n }\n break;\n case 'user':\n if (typeof message.content === 'string') {\n userMessages.push(message.content);\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === 'text') {\n userMessages.push(part.text);\n }\n }\n }\n break;\n }\n }\n\n return {\n system,\n prompt: userMessages.join('\\n\\n'),\n };\n }\n\n return { prompt: 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"]}
package/dist/index.d.cts CHANGED
@@ -36,6 +36,12 @@ interface GooseSettings {
36
36
  * @default false
37
37
  */
38
38
  resume?: boolean;
39
+ /**
40
+ * Environment variables to pass to the Goose CLI process.
41
+ * These will be merged with the current process environment.
42
+ * @example { GOOSE_PROVIDER: 'anthropic' }
43
+ */
44
+ env?: Record<string, string>;
39
45
  }
40
46
  /**
41
47
  * Logger interface for debugging.
@@ -68,7 +74,7 @@ declare class GooseLanguageModel implements LanguageModelV3 {
68
74
  private buildCLIArgs;
69
75
  private spawnGooseProcess;
70
76
  private createStreamFromProcess;
71
- private convertPromptToText;
77
+ private extractPromptParts;
72
78
  private eventsToGenerateResult;
73
79
  }
74
80
 
package/dist/index.d.ts CHANGED
@@ -36,6 +36,12 @@ interface GooseSettings {
36
36
  * @default false
37
37
  */
38
38
  resume?: boolean;
39
+ /**
40
+ * Environment variables to pass to the Goose CLI process.
41
+ * These will be merged with the current process environment.
42
+ * @example { GOOSE_PROVIDER: 'anthropic' }
43
+ */
44
+ env?: Record<string, string>;
39
45
  }
40
46
  /**
41
47
  * Logger interface for debugging.
@@ -68,7 +74,7 @@ declare class GooseLanguageModel implements LanguageModelV3 {
68
74
  private buildCLIArgs;
69
75
  private spawnGooseProcess;
70
76
  private createStreamFromProcess;
71
- private convertPromptToText;
77
+ private extractPromptParts;
72
78
  private eventsToGenerateResult;
73
79
  }
74
80
 
package/dist/index.js CHANGED
@@ -52,13 +52,14 @@ var GooseLanguageModel = class {
52
52
  timeout: options.settings?.timeout || 12e4,
53
53
  sessionName: options.settings?.sessionName,
54
54
  resume: options.settings?.resume || false,
55
- logger: options.settings?.logger
55
+ logger: options.settings?.logger,
56
+ env: options.settings?.env
56
57
  };
57
58
  this.logger = this.settings.logger;
58
59
  }
59
60
  async doGenerate(options) {
60
- const prompt = this.convertPromptToText(options.prompt);
61
- const args = this.buildCLIArgs(prompt);
61
+ const { system, prompt } = this.extractPromptParts(options.prompt);
62
+ const args = this.buildCLIArgs(system, prompt);
62
63
  this.logger?.debug("Starting Goose CLI generation", {
63
64
  binPath: this.settings.binPath,
64
65
  args
@@ -67,8 +68,8 @@ var GooseLanguageModel = class {
67
68
  return this.eventsToGenerateResult(events);
68
69
  }
69
70
  async doStream(options) {
70
- const prompt = this.convertPromptToText(options.prompt);
71
- const args = this.buildCLIArgs(prompt);
71
+ const { system, prompt } = this.extractPromptParts(options.prompt);
72
+ const args = this.buildCLIArgs(system, prompt);
72
73
  this.logger?.debug("Starting Goose CLI streaming", {
73
74
  binPath: this.settings.binPath,
74
75
  args
@@ -90,8 +91,12 @@ var GooseLanguageModel = class {
90
91
  stream
91
92
  };
92
93
  }
93
- buildCLIArgs(prompt) {
94
- const args = ["run", "--output-format", "stream-json", "-t", prompt];
94
+ buildCLIArgs(system, prompt) {
95
+ const args = ["run", "--output-format", "stream-json"];
96
+ if (system) {
97
+ args.push("--system", system);
98
+ }
99
+ args.push("-t", prompt);
95
100
  if (this.settings.sessionName) {
96
101
  args.push("--name", this.settings.sessionName);
97
102
  }
@@ -109,7 +114,9 @@ var GooseLanguageModel = class {
109
114
  binPath: this.settings.binPath,
110
115
  args
111
116
  });
112
- const child = spawn(this.settings.binPath, args);
117
+ const child = spawn(this.settings.binPath, args, {
118
+ env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
119
+ });
113
120
  const timeout = setTimeout(() => {
114
121
  child.kill();
115
122
  reject(
@@ -182,7 +189,9 @@ var GooseLanguageModel = class {
182
189
  });
183
190
  }
184
191
  async *createStreamFromProcess(args, abortSignal) {
185
- const child = spawn(this.settings.binPath, args);
192
+ const child = spawn(this.settings.binPath, args, {
193
+ env: this.settings.env ? { ...process.env, ...this.settings.env } : process.env
194
+ });
186
195
  const rl = createInterface({ input: child.stdout });
187
196
  let stderr = "";
188
197
  child.stderr.on("data", (data) => {
@@ -307,33 +316,37 @@ var GooseLanguageModel = class {
307
316
  );
308
317
  }
309
318
  }
310
- convertPromptToText(prompt) {
319
+ extractPromptParts(prompt) {
311
320
  if (Array.isArray(prompt)) {
312
- const messages = [];
321
+ let system;
322
+ const userMessages = [];
313
323
  for (const message of prompt) {
314
324
  if (!message || typeof message !== "object") continue;
315
325
  switch (message.role) {
316
326
  case "system":
317
327
  if (typeof message.content === "string") {
318
- messages.unshift(`System: ${message.content}`);
328
+ system = message.content;
319
329
  }
320
330
  break;
321
331
  case "user":
322
332
  if (typeof message.content === "string") {
323
- messages.push(message.content);
333
+ userMessages.push(message.content);
324
334
  } else if (Array.isArray(message.content)) {
325
335
  for (const part of message.content) {
326
336
  if (part.type === "text") {
327
- messages.push(part.text);
337
+ userMessages.push(part.text);
328
338
  }
329
339
  }
330
340
  }
331
341
  break;
332
342
  }
333
343
  }
334
- return messages.join("\n\n");
344
+ return {
345
+ system,
346
+ prompt: userMessages.join("\n\n")
347
+ };
335
348
  }
336
- return String(prompt);
349
+ return { prompt: String(prompt) };
337
350
  }
338
351
  eventsToGenerateResult(events) {
339
352
  let text = "";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/goose-provider.ts","../src/goose-language-model.ts","../src/errors.ts"],"sourcesContent":["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":[]}
1
+ {"version":3,"sources":["../src/goose-provider.ts","../src/goose-language-model.ts","../src/errors.ts"],"sourcesContent":["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' | 'env'>> & {\n sessionName?: string;\n resume?: boolean;\n logger?: Logger;\n env?: Record<string, string>;\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 env: options.settings?.env,\n };\n this.logger = this.settings.logger;\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions\n ): Promise<LanguageModelV3GenerateResult> {\n const { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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 { system, prompt } = this.extractPromptParts(options.prompt);\n const args = this.buildCLIArgs(system, 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(system: string | undefined, prompt: string): string[] {\n const args = ['run', '--output-format', 'stream-json'];\n\n if (system) {\n args.push('--system', system);\n }\n\n args.push('-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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 env: this.settings.env\n ? { ...process.env, ...this.settings.env }\n : process.env,\n });\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 extractPromptParts(\n prompt: LanguageModelV3CallOptions['prompt']\n ): { system?: string; prompt: string } {\n if (Array.isArray(prompt)) {\n let system: string | undefined;\n const userMessages: 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 system = message.content;\n }\n break;\n case 'user':\n if (typeof message.content === 'string') {\n userMessages.push(message.content);\n } else if (Array.isArray(message.content)) {\n for (const part of message.content) {\n if (part.type === 'text') {\n userMessages.push(part.text);\n }\n }\n }\n break;\n }\n }\n\n return {\n system,\n prompt: userMessages.join('\\n\\n'),\n };\n }\n\n return { prompt: 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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-sdk-provider-goose",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "AI SDK v5 provider for Goose CLI",
5
5
  "keywords": [
6
6
  "ai-sdk",