noumen 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +63 -8
  2. package/dist/a2a/index.d.ts +6 -4
  3. package/dist/acp/index.d.ts +7 -5
  4. package/dist/{agent-1nFVUP9E.d.ts → agent-DWE4_P5X.d.ts} +169 -485
  5. package/dist/{cache-DsRqxx6v.d.ts → cache-BlBwXXPS.d.ts} +1 -1
  6. package/dist/{chunk-4HW6LN6D.js → chunk-6MMYCGJQ.js} +366 -1227
  7. package/dist/chunk-6MMYCGJQ.js.map +1 -0
  8. package/dist/{chunk-5JN4SPI7.js → chunk-7IQCQI2G.js} +1 -1
  9. package/dist/{chunk-L3L3FG5T.js → chunk-CCM2AXZG.js} +1 -1
  10. package/dist/{chunk-L3L3FG5T.js.map → chunk-CCM2AXZG.js.map} +1 -1
  11. package/dist/{chunk-CS6WNDCF.js → chunk-I3JTUFPK.js} +2 -2
  12. package/dist/chunk-I3JTUFPK.js.map +1 -0
  13. package/dist/chunk-I5SBSOS6.js +40 -0
  14. package/dist/chunk-I5SBSOS6.js.map +1 -0
  15. package/dist/{chunk-HL6JCRZJ.js → chunk-XZN4QZLK.js} +4 -4
  16. package/dist/{chunk-EKOGVTBT.js → chunk-ZXSDKBYB.js} +4 -2
  17. package/dist/chunk-ZXSDKBYB.js.map +1 -0
  18. package/dist/cli/index.js +11 -11
  19. package/dist/client/index.d.ts +1 -1
  20. package/dist/computer-BPdxSo6X.d.ts +88 -0
  21. package/dist/docker.d.ts +129 -0
  22. package/dist/docker.js +401 -0
  23. package/dist/docker.js.map +1 -0
  24. package/dist/e2b.d.ts +157 -0
  25. package/dist/e2b.js +202 -0
  26. package/dist/e2b.js.map +1 -0
  27. package/dist/freestyle.d.ts +174 -0
  28. package/dist/freestyle.js +240 -0
  29. package/dist/freestyle.js.map +1 -0
  30. package/dist/index.d.ts +19 -204
  31. package/dist/index.js +38 -48
  32. package/dist/lsp/index.d.ts +4 -3
  33. package/dist/mcp/index.d.ts +5 -4
  34. package/dist/mcp/index.js +2 -2
  35. package/dist/{provider-factory-KCLIF34X.js → provider-factory-TUHU3DIG.js} +2 -2
  36. package/dist/providers/anthropic.d.ts +3 -3
  37. package/dist/providers/anthropic.js +4 -3
  38. package/dist/providers/anthropic.js.map +1 -1
  39. package/dist/providers/bedrock.d.ts +3 -3
  40. package/dist/providers/bedrock.js +2 -2
  41. package/dist/providers/bedrock.js.map +1 -1
  42. package/dist/providers/gemini.d.ts +2 -2
  43. package/dist/providers/gemini.js +1 -1
  44. package/dist/providers/gemini.js.map +1 -1
  45. package/dist/providers/ollama.d.ts +1 -1
  46. package/dist/providers/ollama.js +2 -2
  47. package/dist/providers/openai.d.ts +2 -2
  48. package/dist/providers/openai.js +2 -2
  49. package/dist/providers/openrouter.d.ts +1 -1
  50. package/dist/providers/openrouter.js +2 -2
  51. package/dist/providers/vertex.d.ts +3 -3
  52. package/dist/providers/vertex.js +4 -3
  53. package/dist/providers/vertex.js.map +1 -1
  54. package/dist/{resolve-4JA2BBDA.js → resolve-6KUZNEYW.js} +2 -2
  55. package/dist/sandbox-9qeMTNrD.d.ts +126 -0
  56. package/dist/server/index.d.ts +6 -4
  57. package/dist/{server-CHMxuWKq.d.ts → server-BzNGKTP6.d.ts} +1 -1
  58. package/dist/sprites.d.ts +136 -0
  59. package/dist/sprites.js +334 -0
  60. package/dist/sprites.js.map +1 -0
  61. package/dist/ssh.d.ts +187 -0
  62. package/dist/ssh.js +392 -0
  63. package/dist/ssh.js.map +1 -0
  64. package/dist/{types-RPKUTu1k.d.ts → types-DhXwOQwD.d.ts} +3 -89
  65. package/dist/{types-LrU4LRmX.d.ts → types-kiGBF35b.d.ts} +40 -2
  66. package/package.json +25 -1
  67. package/dist/chunk-4HW6LN6D.js.map +0 -1
  68. package/dist/chunk-CS6WNDCF.js.map +0 -1
  69. package/dist/chunk-EKOGVTBT.js.map +0 -1
  70. /package/dist/{chunk-5JN4SPI7.js.map → chunk-7IQCQI2G.js.map} +0 -0
  71. /package/dist/{chunk-HL6JCRZJ.js.map → chunk-XZN4QZLK.js.map} +0 -0
  72. /package/dist/{provider-factory-KCLIF34X.js.map → provider-factory-TUHU3DIG.js.map} +0 -0
  73. /package/dist/{resolve-4JA2BBDA.js.map → resolve-6KUZNEYW.js.map} +0 -0
@@ -1,5 +1,5 @@
1
- import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-LrU4LRmX.js';
2
- import { C as CacheControlConfig } from '../cache-DsRqxx6v.js';
1
+ import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-kiGBF35b.js';
2
+ import { C as CacheControlConfig } from '../cache-BlBwXXPS.js';
3
3
 
4
4
  interface BedrockAnthropicProviderOptions {
5
5
  /** AWS region (default: us-east-1). */
@@ -30,7 +30,7 @@ interface BedrockAnthropicProviderOptions {
30
30
  */
31
31
  declare class BedrockAnthropicProvider implements AIProvider {
32
32
  private client;
33
- private defaultModel;
33
+ readonly defaultModel: string;
34
34
  private cacheConfig;
35
35
  constructor(opts: BedrockAnthropicProviderOptions);
36
36
  chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  streamAnthropicChat
3
- } from "../chunk-EKOGVTBT.js";
3
+ } from "../chunk-ZXSDKBYB.js";
4
4
  import "../chunk-HEQQQGK5.js";
5
- import "../chunk-L3L3FG5T.js";
5
+ import "../chunk-CCM2AXZG.js";
6
6
  import {
7
7
  __require
8
8
  } from "../chunk-DGUM43GV.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/bedrock.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface BedrockAnthropicProviderOptions {\n /** AWS region (default: us-east-1). */\n region?: string;\n /** Explicit AWS credentials. If omitted, the SDK uses the default credential chain. */\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n /** Model ID in Bedrock format (default: us.anthropic.claude-opus-4.6-v1:0). */\n model?: string;\n /** Custom base URL for a Bedrock-compatible endpoint. */\n baseURL?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /**\n * Pre-constructed AnthropicBedrock client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through AWS Bedrock.\n *\n * Requires `@anthropic-ai/bedrock-sdk` as an optional peer dependency.\n * Install it with: `pnpm add @anthropic-ai/bedrock-sdk`\n */\nexport class BedrockAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n private defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: BedrockAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicBedrock: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicBedrock = require(\"@anthropic-ai/bedrock-sdk\").AnthropicBedrock;\n } catch {\n throw new Error(\n \"BedrockAnthropicProvider requires @anthropic-ai/bedrock-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/bedrock-sdk\",\n );\n }\n\n const args: Record<string, unknown> = {\n awsRegion: opts.region ?? \"us-east-1\",\n maxRetries: 0,\n };\n if (opts.baseURL) args.baseURL = opts.baseURL;\n if (opts.credentials) {\n args.awsAccessKey = opts.credentials.accessKeyId;\n args.awsSecretKey = opts.credentials.secretAccessKey;\n if (opts.credentials.sessionToken) {\n args.awsSessionToken = opts.credentials.sessionToken;\n }\n }\n\n this.client = new AnthropicBedrock(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel =\n opts.model ?? \"us.anthropic.claude-opus-4.6-v1:0\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAoCO,IAAM,2BAAN,MAAqD;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAuC;AACjD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,2BAAmB,UAAQ,2BAA2B,EAAE;AAAA,MAC1D,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,YAAM,OAAgC;AAAA,QACpC,WAAW,KAAK,UAAU;AAAA,QAC1B,YAAY;AAAA,MACd;AACA,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AACtC,UAAI,KAAK,aAAa;AACpB,aAAK,eAAe,KAAK,YAAY;AACrC,aAAK,eAAe,KAAK,YAAY;AACrC,YAAI,KAAK,YAAY,cAAc;AACjC,eAAK,kBAAkB,KAAK,YAAY;AAAA,QAC1C;AAAA,MACF;AAEA,WAAK,SAAS,IAAI,iBAAiB,IAAI;AAAA,IACzC;AAEA,SAAK,eACH,KAAK,SAAS;AAChB,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/providers/bedrock.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface BedrockAnthropicProviderOptions {\n /** AWS region (default: us-east-1). */\n region?: string;\n /** Explicit AWS credentials. If omitted, the SDK uses the default credential chain. */\n credentials?: {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n };\n /** Model ID in Bedrock format (default: us.anthropic.claude-opus-4.6-v1:0). */\n model?: string;\n /** Custom base URL for a Bedrock-compatible endpoint. */\n baseURL?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /**\n * Pre-constructed AnthropicBedrock client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through AWS Bedrock.\n *\n * Requires `@anthropic-ai/bedrock-sdk` as an optional peer dependency.\n * Install it with: `pnpm add @anthropic-ai/bedrock-sdk`\n */\nexport class BedrockAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n readonly defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: BedrockAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicBedrock: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicBedrock = require(\"@anthropic-ai/bedrock-sdk\").AnthropicBedrock;\n } catch {\n throw new Error(\n \"BedrockAnthropicProvider requires @anthropic-ai/bedrock-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/bedrock-sdk\",\n );\n }\n\n const args: Record<string, unknown> = {\n awsRegion: opts.region ?? \"us-east-1\",\n maxRetries: 0,\n };\n if (opts.baseURL) args.baseURL = opts.baseURL;\n if (opts.credentials) {\n args.awsAccessKey = opts.credentials.accessKeyId;\n args.awsSecretKey = opts.credentials.secretAccessKey;\n if (opts.credentials.sessionToken) {\n args.awsSessionToken = opts.credentials.sessionToken;\n }\n }\n\n this.client = new AnthropicBedrock(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel =\n opts.model ?? \"us.anthropic.claude-opus-4.6-v1:0\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAoCO,IAAM,2BAAN,MAAqD;AAAA,EAClD;AAAA,EACC;AAAA,EACD;AAAA,EAER,YAAY,MAAuC;AACjD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,2BAAmB,UAAQ,2BAA2B,EAAE;AAAA,MAC1D,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,YAAM,OAAgC;AAAA,QACpC,WAAW,KAAK,UAAU;AAAA,QAC1B,YAAY;AAAA,MACd;AACA,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AACtC,UAAI,KAAK,aAAa;AACpB,aAAK,eAAe,KAAK,YAAY;AACrC,aAAK,eAAe,KAAK,YAAY;AACrC,YAAI,KAAK,YAAY,cAAc;AACjC,eAAK,kBAAkB,KAAK,YAAY;AAAA,QAC1C;AAAA,MACF;AAEA,WAAK,SAAS,IAAI,iBAAiB,IAAI;AAAA,IACzC;AAEA,SAAK,eACH,KAAK,SAAS;AAChB,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
@@ -1,4 +1,4 @@
1
- import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-LrU4LRmX.js';
1
+ import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-kiGBF35b.js';
2
2
 
3
3
  interface GeminiProviderOptions {
4
4
  apiKey: string;
@@ -7,7 +7,7 @@ interface GeminiProviderOptions {
7
7
  }
8
8
  declare class GeminiProvider implements AIProvider {
9
9
  private client;
10
- private defaultModel;
10
+ readonly defaultModel: string;
11
11
  constructor(opts: GeminiProviderOptions);
12
12
  chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
13
13
  private static contentPartsToGemini;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ChatStreamError
3
- } from "../chunk-L3L3FG5T.js";
3
+ } from "../chunk-CCM2AXZG.js";
4
4
  import "../chunk-DGUM43GV.js";
5
5
 
6
6
  // src/providers/gemini.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/gemini.ts"],"sourcesContent":["import { GoogleGenAI } from \"@google/genai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport { ChatStreamError } from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface GeminiProviderOptions {\n apiKey: string;\n model?: string;\n baseURL?: string;\n}\n\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n thought?: boolean;\n inlineData?: { mimeType: string; data: string };\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: {\n name: string;\n response: { result: unknown };\n };\n}\n\nexport class GeminiProvider implements AIProvider {\n private client: GoogleGenAI;\n private defaultModel: string;\n\n constructor(opts: GeminiProviderOptions) {\n const clientOpts: Record<string, unknown> = { apiKey: opts.apiKey };\n if (opts.baseURL) clientOpts.httpOptions = { baseUrl: opts.baseURL };\n this.client = new GoogleGenAI(clientOpts as ConstructorParameters<typeof GoogleGenAI>[0]);\n this.defaultModel = opts.model ?? \"gemini-2.5-flash\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { contents, systemInstruction } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.length\n ? [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters as Record<string, unknown>,\n })),\n },\n ]\n : undefined;\n\n const thinkingEnabled =\n params.thinking?.type === \"enabled\" &&\n (params.thinking as { budgetTokens: number }).budgetTokens > 0;\n const thinkingBudget = thinkingEnabled\n ? (params.thinking as { type: \"enabled\"; budgetTokens: number }).budgetTokens\n : 0;\n\n const config: Record<string, unknown> = {\n systemInstruction: systemInstruction || undefined,\n maxOutputTokens: params.max_tokens,\n temperature: params.temperature,\n tools,\n };\n\n if (thinkingEnabled) {\n config.thinkingConfig = { thinkingBudget: thinkingBudget };\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n config.responseSchema = params.outputFormat.schema;\n config.responseMimeType = \"application/json\";\n } else if (params.outputFormat?.type === \"json_object\") {\n config.responseMimeType = \"application/json\";\n }\n\n if (params.signal) {\n (config as Record<string, unknown>).httpOptions = {\n ...((config as Record<string, unknown>).httpOptions as Record<string, unknown> ?? {}),\n signal: params.signal,\n };\n }\n\n try {\n const stream = await this.client.models.generateContentStream({\n model: params.model ?? this.defaultModel,\n contents,\n config,\n });\n\n let chunkIndex = 0;\n let toolCallIndex = 0;\n let responseHasToolCalls = false;\n let finishReasonSeen = false;\n let lastUsage: ChatStreamChunk[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n const chunkId = `gemini-${chunkIndex++}`;\n const model = params.model ?? this.defaultModel;\n\n const meta = chunk.usageMetadata as\n | { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number; thoughtsTokenCount?: number }\n | undefined;\n if (meta) {\n const prompt = meta.promptTokenCount ?? 0;\n const completion = meta.candidatesTokenCount ?? 0;\n lastUsage = {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: meta.totalTokenCount ?? (prompt + completion),\n thinking_tokens: meta.thoughtsTokenCount || undefined,\n };\n }\n\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) continue;\n\n const parts = candidates[0].content?.parts as GeminiPart[] | undefined;\n\n if (parts) {\n for (const part of parts) {\n if (part.thought && part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { thinking_content: part.text },\n finish_reason: null,\n },\n ],\n };\n continue;\n }\n\n if (part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { content: part.text },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (part.functionCall) {\n const fc = part.functionCall;\n const tcId = `gemini-tc-${toolCallIndex}`;\n const idx = toolCallIndex++;\n responseHasToolCalls = true;\n\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n index: idx,\n id: tcId,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n }\n\n const finishReason = candidates[0].finishReason;\n if (finishReason && finishReason !== \"FINISH_REASON_UNSPECIFIED\") {\n let mapped: string;\n if (finishReason === \"STOP\") {\n mapped = responseHasToolCalls ? \"tool_calls\" : \"stop\";\n } else if (finishReason === \"MAX_TOKENS\") {\n mapped = \"length\";\n } else if (\n finishReason === \"SAFETY\" || finishReason === \"RECITATION\" ||\n finishReason === \"BLOCKLIST\" || finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\" || finishReason === \"MALFORMED_FUNCTION_CALL\"\n ) {\n mapped = \"content_filter\";\n } else {\n mapped = \"stop\";\n }\n\n finishReasonSeen = true;\n yield {\n id: chunkId,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: mapped }],\n usage: lastUsage,\n };\n }\n }\n\n if (!finishReasonSeen && chunkIndex > 0) {\n throw new ChatStreamError(\"Gemini stream ended without finish reason\", {\n cause: new Error(\"incomplete_stream\"),\n });\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; statusCode?: number; code?: number };\n const status = apiErr.status ?? apiErr.statusCode ?? apiErr.code;\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: typeof status === \"number\" ? status : undefined,\n cause: err,\n },\n );\n }\n }\n\n private static contentPartsToGemini(parts: ContentPart[]): GeminiPart[] {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { text: part.text };\n }\n if (part.type === \"image\") {\n return { inlineData: { mimeType: part.media_type, data: part.data } };\n }\n // image_url — Gemini doesn't natively support URL references as inlineData;\n // pass it as text with the URL. Consumers should prefer base64 ImageContent.\n return { text: `[image: ${part.url}]` };\n });\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): { contents: GeminiContent[]; systemInstruction: string | undefined } {\n const contents: GeminiContent[] = [];\n\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n let pendingFunctionResponses: GeminiPart[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n continue;\n }\n\n if (msg.role === \"user\") {\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n pendingFunctionResponses = [];\n }\n if (Array.isArray(msg.content)) {\n const parts = GeminiProvider.contentPartsToGemini(msg.content as ContentPart[]);\n contents.push({ role: \"user\", parts });\n } else {\n contents.push({ role: \"user\", parts: [{ text: msg.content as string }] });\n }\n } else if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n if (msg.thinking_content) {\n parts.push({ text: msg.thinking_content, thought: true });\n }\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // malformed\n }\n parts.push({\n functionCall: { name: tc.function.name, args },\n });\n }\n }\n if (parts.length === 0) {\n parts.push({ text: \"\" });\n }\n contents.push({ role: \"model\", parts });\n } else if (msg.role === \"tool\") {\n const fnName =\n toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;\n const resultValue = Array.isArray(msg.content)\n ? (msg.content as ContentPart[])\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : msg.content;\n pendingFunctionResponses.push({\n functionResponse: {\n name: fnName,\n response: { result: resultValue },\n },\n });\n }\n }\n\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n }\n\n return { contents, systemInstruction: systemPrompt };\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/providers/gemini.ts"],"sourcesContent":["import { GoogleGenAI } from \"@google/genai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport { ChatStreamError } from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\n\nexport interface GeminiProviderOptions {\n apiKey: string;\n model?: string;\n baseURL?: string;\n}\n\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n thought?: boolean;\n inlineData?: { mimeType: string; data: string };\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: {\n name: string;\n response: { result: unknown };\n };\n}\n\nexport class GeminiProvider implements AIProvider {\n private client: GoogleGenAI;\n readonly defaultModel: string;\n\n constructor(opts: GeminiProviderOptions) {\n const clientOpts: Record<string, unknown> = { apiKey: opts.apiKey };\n if (opts.baseURL) clientOpts.httpOptions = { baseUrl: opts.baseURL };\n this.client = new GoogleGenAI(clientOpts as ConstructorParameters<typeof GoogleGenAI>[0]);\n this.defaultModel = opts.model ?? \"gemini-2.5-flash\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { contents, systemInstruction } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.length\n ? [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters as Record<string, unknown>,\n })),\n },\n ]\n : undefined;\n\n const thinkingEnabled =\n params.thinking?.type === \"enabled\" &&\n (params.thinking as { budgetTokens: number }).budgetTokens > 0;\n const thinkingBudget = thinkingEnabled\n ? (params.thinking as { type: \"enabled\"; budgetTokens: number }).budgetTokens\n : 0;\n\n const config: Record<string, unknown> = {\n systemInstruction: systemInstruction || undefined,\n maxOutputTokens: params.max_tokens,\n temperature: params.temperature,\n tools,\n };\n\n if (thinkingEnabled) {\n config.thinkingConfig = { thinkingBudget: thinkingBudget };\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n config.responseSchema = params.outputFormat.schema;\n config.responseMimeType = \"application/json\";\n } else if (params.outputFormat?.type === \"json_object\") {\n config.responseMimeType = \"application/json\";\n }\n\n if (params.signal) {\n (config as Record<string, unknown>).httpOptions = {\n ...((config as Record<string, unknown>).httpOptions as Record<string, unknown> ?? {}),\n signal: params.signal,\n };\n }\n\n try {\n const stream = await this.client.models.generateContentStream({\n model: params.model ?? this.defaultModel,\n contents,\n config,\n });\n\n let chunkIndex = 0;\n let toolCallIndex = 0;\n let responseHasToolCalls = false;\n let finishReasonSeen = false;\n let lastUsage: ChatStreamChunk[\"usage\"] | undefined;\n\n for await (const chunk of stream) {\n const chunkId = `gemini-${chunkIndex++}`;\n const model = params.model ?? this.defaultModel;\n\n const meta = chunk.usageMetadata as\n | { promptTokenCount?: number; candidatesTokenCount?: number; totalTokenCount?: number; thoughtsTokenCount?: number }\n | undefined;\n if (meta) {\n const prompt = meta.promptTokenCount ?? 0;\n const completion = meta.candidatesTokenCount ?? 0;\n lastUsage = {\n prompt_tokens: prompt,\n completion_tokens: completion,\n total_tokens: meta.totalTokenCount ?? (prompt + completion),\n thinking_tokens: meta.thoughtsTokenCount || undefined,\n };\n }\n\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) continue;\n\n const parts = candidates[0].content?.parts as GeminiPart[] | undefined;\n\n if (parts) {\n for (const part of parts) {\n if (part.thought && part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { thinking_content: part.text },\n finish_reason: null,\n },\n ],\n };\n continue;\n }\n\n if (part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { content: part.text },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (part.functionCall) {\n const fc = part.functionCall;\n const tcId = `gemini-tc-${toolCallIndex}`;\n const idx = toolCallIndex++;\n responseHasToolCalls = true;\n\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n index: idx,\n id: tcId,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n }\n\n const finishReason = candidates[0].finishReason;\n if (finishReason && finishReason !== \"FINISH_REASON_UNSPECIFIED\") {\n let mapped: string;\n if (finishReason === \"STOP\") {\n mapped = responseHasToolCalls ? \"tool_calls\" : \"stop\";\n } else if (finishReason === \"MAX_TOKENS\") {\n mapped = \"length\";\n } else if (\n finishReason === \"SAFETY\" || finishReason === \"RECITATION\" ||\n finishReason === \"BLOCKLIST\" || finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\" || finishReason === \"MALFORMED_FUNCTION_CALL\"\n ) {\n mapped = \"content_filter\";\n } else {\n mapped = \"stop\";\n }\n\n finishReasonSeen = true;\n yield {\n id: chunkId,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: mapped }],\n usage: lastUsage,\n };\n }\n }\n\n if (!finishReasonSeen && chunkIndex > 0) {\n throw new ChatStreamError(\"Gemini stream ended without finish reason\", {\n cause: new Error(\"incomplete_stream\"),\n });\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; statusCode?: number; code?: number };\n const status = apiErr.status ?? apiErr.statusCode ?? apiErr.code;\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: typeof status === \"number\" ? status : undefined,\n cause: err,\n },\n );\n }\n }\n\n private static contentPartsToGemini(parts: ContentPart[]): GeminiPart[] {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { text: part.text };\n }\n if (part.type === \"image\") {\n return { inlineData: { mimeType: part.media_type, data: part.data } };\n }\n // image_url — Gemini doesn't natively support URL references as inlineData;\n // pass it as text with the URL. Consumers should prefer base64 ImageContent.\n return { text: `[image: ${part.url}]` };\n });\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): { contents: GeminiContent[]; systemInstruction: string | undefined } {\n const contents: GeminiContent[] = [];\n\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n let pendingFunctionResponses: GeminiPart[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n continue;\n }\n\n if (msg.role === \"user\") {\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n pendingFunctionResponses = [];\n }\n if (Array.isArray(msg.content)) {\n const parts = GeminiProvider.contentPartsToGemini(msg.content as ContentPart[]);\n contents.push({ role: \"user\", parts });\n } else {\n contents.push({ role: \"user\", parts: [{ text: msg.content as string }] });\n }\n } else if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n if (msg.thinking_content) {\n parts.push({ text: msg.thinking_content, thought: true });\n }\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // malformed\n }\n parts.push({\n functionCall: { name: tc.function.name, args },\n });\n }\n }\n if (parts.length === 0) {\n parts.push({ text: \"\" });\n }\n contents.push({ role: \"model\", parts });\n } else if (msg.role === \"tool\") {\n const fnName =\n toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;\n const resultValue = Array.isArray(msg.content)\n ? (msg.content as ContentPart[])\n .filter((p): p is Extract<ContentPart, { type: \"text\" }> => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : msg.content;\n pendingFunctionResponses.push({\n functionResponse: {\n name: fnName,\n response: { result: resultValue },\n },\n });\n }\n }\n\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n }\n\n return { contents, systemInstruction: systemPrompt };\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { OpenAIProvider } from './openai.js';
2
- import '../types-LrU4LRmX.js';
2
+ import '../types-kiGBF35b.js';
3
3
 
4
4
  interface OllamaProviderOptions {
5
5
  /** Ollama server URL. Defaults to http://localhost:11434/v1. */
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  OpenAIProvider
3
- } from "../chunk-CS6WNDCF.js";
4
- import "../chunk-L3L3FG5T.js";
3
+ } from "../chunk-I3JTUFPK.js";
4
+ import "../chunk-CCM2AXZG.js";
5
5
  import "../chunk-DGUM43GV.js";
6
6
 
7
7
  // src/providers/ollama.ts
@@ -1,4 +1,4 @@
1
- import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-LrU4LRmX.js';
1
+ import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-kiGBF35b.js';
2
2
 
3
3
  interface OpenAIProviderOptions {
4
4
  apiKey?: string;
@@ -10,7 +10,7 @@ interface OpenAIProviderOptions {
10
10
  }
11
11
  declare class OpenAIProvider implements AIProvider {
12
12
  private client;
13
- private defaultModel;
13
+ readonly defaultModel: string;
14
14
  protected compatMode: boolean;
15
15
  constructor(opts: OpenAIProviderOptions);
16
16
  chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  OpenAIProvider
3
- } from "../chunk-CS6WNDCF.js";
4
- import "../chunk-L3L3FG5T.js";
3
+ } from "../chunk-I3JTUFPK.js";
4
+ import "../chunk-CCM2AXZG.js";
5
5
  import "../chunk-DGUM43GV.js";
6
6
  export {
7
7
  OpenAIProvider
@@ -1,5 +1,5 @@
1
1
  import { OpenAIProvider } from './openai.js';
2
- import '../types-LrU4LRmX.js';
2
+ import '../types-kiGBF35b.js';
3
3
 
4
4
  interface OpenRouterProviderOptions {
5
5
  apiKey: string;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  OpenAIProvider
3
- } from "../chunk-CS6WNDCF.js";
4
- import "../chunk-L3L3FG5T.js";
3
+ } from "../chunk-I3JTUFPK.js";
4
+ import "../chunk-CCM2AXZG.js";
5
5
  import "../chunk-DGUM43GV.js";
6
6
 
7
7
  // src/providers/openrouter.ts
@@ -1,5 +1,5 @@
1
- import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-LrU4LRmX.js';
2
- import { C as CacheControlConfig } from '../cache-DsRqxx6v.js';
1
+ import { A as AIProvider, C as ChatParams, a as ChatStreamChunk } from '../types-kiGBF35b.js';
2
+ import { C as CacheControlConfig } from '../cache-BlBwXXPS.js';
3
3
 
4
4
  interface VertexAnthropicProviderOptions {
5
5
  /** GCP project ID. If omitted, inferred from application default credentials. */
@@ -33,7 +33,7 @@ interface VertexAnthropicProviderOptions {
33
33
  */
34
34
  declare class VertexAnthropicProvider implements AIProvider {
35
35
  private client;
36
- private defaultModel;
36
+ readonly defaultModel: string;
37
37
  private cacheConfig;
38
38
  constructor(opts: VertexAnthropicProviderOptions);
39
39
  chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;
@@ -1,8 +1,9 @@
1
1
  import {
2
+ DEFAULT_ANTHROPIC_MODEL,
2
3
  streamAnthropicChat
3
- } from "../chunk-EKOGVTBT.js";
4
+ } from "../chunk-ZXSDKBYB.js";
4
5
  import "../chunk-HEQQQGK5.js";
5
- import "../chunk-L3L3FG5T.js";
6
+ import "../chunk-CCM2AXZG.js";
6
7
  import {
7
8
  __require
8
9
  } from "../chunk-DGUM43GV.js";
@@ -49,7 +50,7 @@ var VertexAnthropicProvider = class {
49
50
  if (opts.baseURL) args.baseURL = opts.baseURL;
50
51
  this.client = new AnthropicVertex(args);
51
52
  }
52
- this.defaultModel = opts.model ?? "claude-opus-4.6";
53
+ this.defaultModel = opts.model ?? DEFAULT_ANTHROPIC_MODEL;
53
54
  this.cacheConfig = opts.cacheControl;
54
55
  }
55
56
  async *chat(params) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/vertex.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { streamAnthropicChat, type AnthropicStreamClient } from \"./anthropic-shared.js\";\n\nexport interface VertexAnthropicProviderOptions {\n /** GCP project ID. If omitted, inferred from application default credentials. */\n projectId?: string;\n /** GCP region (default: us-east5). */\n region?: string;\n /**\n * A `GoogleAuth` instance or any object with a compatible `getClient()` method.\n * If omitted, the provider creates one using application default credentials.\n * Requires `google-auth-library` as a peer dependency.\n */\n googleAuth?: unknown;\n /** Model ID in Vertex format (default: claude-opus-4.6). */\n model?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /** Custom base URL for the Vertex API endpoint. */\n baseURL?: string;\n /**\n * Pre-constructed AnthropicVertex client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through Google Cloud Vertex AI.\n *\n * Requires `@anthropic-ai/vertex-sdk` as an optional peer dependency.\n * If `googleAuth` is not provided, also requires `google-auth-library`.\n * Install with: `pnpm add @anthropic-ai/vertex-sdk google-auth-library`\n */\nexport class VertexAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n private defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: VertexAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicVertex: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicVertex = require(\"@anthropic-ai/vertex-sdk\").AnthropicVertex;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires @anthropic-ai/vertex-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/vertex-sdk\",\n );\n }\n\n let googleAuth = opts.googleAuth;\n if (!googleAuth) {\n let GoogleAuth: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n GoogleAuth = require(\"google-auth-library\").GoogleAuth;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires google-auth-library when googleAuth is not provided. \" +\n \"Install it with: pnpm add google-auth-library\",\n );\n }\n const authArgs: Record<string, unknown> = {\n scopes: [\"https://www.googleapis.com/auth/cloud-platform\"],\n };\n if (opts.projectId) authArgs.projectId = opts.projectId;\n googleAuth = new GoogleAuth(authArgs);\n }\n\n const args: Record<string, unknown> = {\n region: opts.region ?? \"us-east5\",\n googleAuth,\n maxRetries: 0,\n };\n if (opts.projectId) args.projectId = opts.projectId;\n if (opts.baseURL) args.baseURL = opts.baseURL;\n\n this.client = new AnthropicVertex(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel = opts.model ?? \"claude-opus-4.6\";\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;;AAuCO,IAAM,0BAAN,MAAoD;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAsC;AAChD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,0BAAkB,UAAQ,0BAA0B,EAAE;AAAA,MACxD,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,UAAI,aAAa,KAAK;AACtB,UAAI,CAAC,YAAY;AACf,YAAI;AACJ,YAAI;AAEF,uBAAa,UAAQ,qBAAqB,EAAE;AAAA,QAC9C,QAAQ;AACN,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AACA,cAAM,WAAoC;AAAA,UACxC,QAAQ,CAAC,gDAAgD;AAAA,QAC3D;AACA,YAAI,KAAK,UAAW,UAAS,YAAY,KAAK;AAC9C,qBAAa,IAAI,WAAW,QAAQ;AAAA,MACtC;AAEA,YAAM,OAAgC;AAAA,QACpC,QAAQ,KAAK,UAAU;AAAA,QACvB;AAAA,QACA,YAAY;AAAA,MACd;AACA,UAAI,KAAK,UAAW,MAAK,YAAY,KAAK;AAC1C,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AAEtC,WAAK,SAAS,IAAI,gBAAgB,IAAI;AAAA,IACxC;AAEA,SAAK,eAAe,KAAK,SAAS;AAClC,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/providers/vertex.ts"],"sourcesContent":["import type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport {\n streamAnthropicChat,\n type AnthropicStreamClient,\n DEFAULT_ANTHROPIC_MODEL,\n} from \"./anthropic-shared.js\";\n\nexport interface VertexAnthropicProviderOptions {\n /** GCP project ID. If omitted, inferred from application default credentials. */\n projectId?: string;\n /** GCP region (default: us-east5). */\n region?: string;\n /**\n * A `GoogleAuth` instance or any object with a compatible `getClient()` method.\n * If omitted, the provider creates one using application default credentials.\n * Requires `google-auth-library` as a peer dependency.\n */\n googleAuth?: unknown;\n /** Model ID in Vertex format (default: claude-opus-4.6). */\n model?: string;\n /** Cache control config (same as AnthropicProvider). */\n cacheControl?: CacheControlConfig;\n /** Custom base URL for the Vertex API endpoint. */\n baseURL?: string;\n /**\n * Pre-constructed AnthropicVertex client. When provided, all other\n * connection options are ignored. Useful for testing or advanced setups.\n */\n client?: unknown;\n}\n\n/**\n * Anthropic provider routed through Google Cloud Vertex AI.\n *\n * Requires `@anthropic-ai/vertex-sdk` as an optional peer dependency.\n * If `googleAuth` is not provided, also requires `google-auth-library`.\n * Install with: `pnpm add @anthropic-ai/vertex-sdk google-auth-library`\n */\nexport class VertexAnthropicProvider implements AIProvider {\n private client: AnthropicStreamClient;\n readonly defaultModel: string;\n private cacheConfig: CacheControlConfig | undefined;\n\n constructor(opts: VertexAnthropicProviderOptions) {\n if (opts.client) {\n this.client = opts.client as AnthropicStreamClient;\n } else {\n let AnthropicVertex: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n AnthropicVertex = require(\"@anthropic-ai/vertex-sdk\").AnthropicVertex;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires @anthropic-ai/vertex-sdk. \" +\n \"Install it with: pnpm add @anthropic-ai/vertex-sdk\",\n );\n }\n\n let googleAuth = opts.googleAuth;\n if (!googleAuth) {\n let GoogleAuth: new (args: Record<string, unknown>) => unknown;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n GoogleAuth = require(\"google-auth-library\").GoogleAuth;\n } catch {\n throw new Error(\n \"VertexAnthropicProvider requires google-auth-library when googleAuth is not provided. \" +\n \"Install it with: pnpm add google-auth-library\",\n );\n }\n const authArgs: Record<string, unknown> = {\n scopes: [\"https://www.googleapis.com/auth/cloud-platform\"],\n };\n if (opts.projectId) authArgs.projectId = opts.projectId;\n googleAuth = new GoogleAuth(authArgs);\n }\n\n const args: Record<string, unknown> = {\n region: opts.region ?? \"us-east5\",\n googleAuth,\n maxRetries: 0,\n };\n if (opts.projectId) args.projectId = opts.projectId;\n if (opts.baseURL) args.baseURL = opts.baseURL;\n\n this.client = new AnthropicVertex(args) as unknown as AnthropicStreamClient;\n }\n\n this.defaultModel = opts.model ?? DEFAULT_ANTHROPIC_MODEL;\n this.cacheConfig = opts.cacheControl;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n yield* streamAnthropicChat(\n this.client,\n params,\n this.defaultModel,\n this.cacheConfig,\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AA2CO,IAAM,0BAAN,MAAoD;AAAA,EACjD;AAAA,EACC;AAAA,EACD;AAAA,EAER,YAAY,MAAsC;AAChD,QAAI,KAAK,QAAQ;AACf,WAAK,SAAS,KAAK;AAAA,IACrB,OAAO;AACL,UAAI;AACJ,UAAI;AAEF,0BAAkB,UAAQ,0BAA0B,EAAE;AAAA,MACxD,QAAQ;AACN,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,UAAI,aAAa,KAAK;AACtB,UAAI,CAAC,YAAY;AACf,YAAI;AACJ,YAAI;AAEF,uBAAa,UAAQ,qBAAqB,EAAE;AAAA,QAC9C,QAAQ;AACN,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AACA,cAAM,WAAoC;AAAA,UACxC,QAAQ,CAAC,gDAAgD;AAAA,QAC3D;AACA,YAAI,KAAK,UAAW,UAAS,YAAY,KAAK;AAC9C,qBAAa,IAAI,WAAW,QAAQ;AAAA,MACtC;AAEA,YAAM,OAAgC;AAAA,QACpC,QAAQ,KAAK,UAAU;AAAA,QACvB;AAAA,QACA,YAAY;AAAA,MACd;AACA,UAAI,KAAK,UAAW,MAAK,YAAY,KAAK;AAC1C,UAAI,KAAK,QAAS,MAAK,UAAU,KAAK;AAEtC,WAAK,SAAS,IAAI,gBAAgB,IAAI;AAAA,IACxC;AAEA,SAAK,eAAe,KAAK,SAAS;AAClC,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA,EACF;AACF;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  SUPPORTED_PROVIDERS,
4
4
  detectProvider,
5
5
  resolveProvider
6
- } from "./chunk-5JN4SPI7.js";
6
+ } from "./chunk-7IQCQI2G.js";
7
7
  import "./chunk-DGUM43GV.js";
8
8
  export {
9
9
  DEFAULT_MODELS,
@@ -11,4 +11,4 @@ export {
11
11
  detectProvider,
12
12
  resolveProvider
13
13
  };
14
- //# sourceMappingURL=resolve-4JA2BBDA.js.map
14
+ //# sourceMappingURL=resolve-6KUZNEYW.js.map
@@ -0,0 +1,126 @@
1
+ import { V as VirtualComputer, E as ExecOptions, C as CommandResult, a as VirtualFs } from './computer-BPdxSo6X.js';
2
+
3
+ /**
4
+ * Filesystem and network restriction config passed to `@anthropic-ai/sandbox-runtime`.
5
+ */
6
+ interface SandboxConfig {
7
+ filesystem?: {
8
+ /** Paths the agent may write to (default: `[cwd]`). Write is denied everywhere else. */
9
+ allowWrite?: string[];
10
+ /** Paths to explicitly deny writes within allowed regions. */
11
+ denyWrite?: string[];
12
+ /** Paths to deny reading. By default everything is readable. */
13
+ denyRead?: string[];
14
+ /** Paths to re-allow reading within denyRead regions. Takes precedence over denyRead. */
15
+ allowRead?: string[];
16
+ };
17
+ network?: {
18
+ /** Domains the agent may reach via HTTP/HTTPS/SOCKS. */
19
+ allowedDomains?: string[];
20
+ /** Domains to explicitly block. */
21
+ deniedDomains?: string[];
22
+ };
23
+ }
24
+ interface SandboxedLocalComputerOptions {
25
+ defaultCwd?: string;
26
+ defaultTimeout?: number;
27
+ sandbox?: SandboxConfig;
28
+ }
29
+ /**
30
+ * `VirtualComputer` that wraps every command with OS-level sandboxing via
31
+ * `@anthropic-ai/sandbox-runtime`. Uses macOS Seatbelt (`sandbox-exec`) or
32
+ * Linux bubblewrap (`bwrap`) under the hood.
33
+ */
34
+ declare class SandboxedLocalComputer implements VirtualComputer {
35
+ private defaultCwd;
36
+ private defaultTimeout;
37
+ private sandboxConfig;
38
+ private initPromise;
39
+ private initialized;
40
+ constructor(opts?: SandboxedLocalComputerOptions);
41
+ private buildRuntimeConfig;
42
+ private ensureInitialized;
43
+ executeCommand(command: string, opts?: ExecOptions): Promise<CommandResult>;
44
+ /**
45
+ * Tear down the sandbox runtime. Call when the agent is done.
46
+ */
47
+ dispose(): Promise<void>;
48
+ }
49
+
50
+ /**
51
+ * Bundled sandbox: a `VirtualFs` and `VirtualComputer` paired together.
52
+ *
53
+ * Use one of the built-in factories (`LocalSandbox`, `UnsandboxedLocal`)
54
+ * or import a remote backend from its subpath
55
+ * (`noumen/docker`, `noumen/e2b`, `noumen/freestyle`, `noumen/ssh`,
56
+ * `noumen/sprites`). You can also supply any object that satisfies this
57
+ * shape for custom sandboxes (in-memory, custom cloud backends, etc.).
58
+ */
59
+ interface Sandbox {
60
+ fs: VirtualFs;
61
+ computer: VirtualComputer;
62
+ /** Optional cleanup — called by Agent.close() to tear down OS-level sandbox state. */
63
+ dispose?(): Promise<void>;
64
+ /**
65
+ * Lazily provision the underlying sandbox resource. Idempotent — repeated
66
+ * calls return the same single-flight promise.
67
+ *
68
+ * When `sandboxId` is provided the sandbox reconnects to an existing
69
+ * resource instead of creating a new one. This is used during session
70
+ * resume: the stored sandbox identifier is read from session metadata
71
+ * and passed here so the agent reattaches to its previous container.
72
+ *
73
+ * When omitted a fresh resource is provisioned (for factories that
74
+ * support auto-creation) or the call is a no-op (for factories that
75
+ * were given a pre-created resource up front).
76
+ */
77
+ init?(sandboxId?: string): Promise<void>;
78
+ /**
79
+ * Return the opaque identifier for this sandbox instance so it can be
80
+ * persisted in session metadata and used to reconnect later via `init()`.
81
+ * Returns `undefined` before `init()` has resolved or for sandboxes
82
+ * that don't support reconnection.
83
+ */
84
+ sandboxId?(): string | undefined;
85
+ }
86
+ interface UnsandboxedLocalOptions {
87
+ /** Working directory for both file resolution and command execution. */
88
+ cwd?: string;
89
+ /** Default timeout (ms) for shell commands. */
90
+ defaultTimeout?: number;
91
+ }
92
+ /**
93
+ * Create a `Sandbox` backed by the host filesystem and shell with **no
94
+ * OS-level isolation**. The agent can access anything the host process can.
95
+ *
96
+ * Use this for development or fully-trusted environments where sandboxing
97
+ * overhead is unwanted. For production use, prefer `LocalSandbox()` (which
98
+ * wraps commands with `@anthropic-ai/sandbox-runtime`).
99
+ */
100
+ declare function UnsandboxedLocal(opts?: UnsandboxedLocalOptions): Sandbox;
101
+ interface LocalSandboxOptions {
102
+ /** Working directory for both file resolution and command execution. */
103
+ cwd?: string;
104
+ /** Default timeout (ms) for shell commands. */
105
+ defaultTimeout?: number;
106
+ /**
107
+ * Sandbox restrictions. Defaults: writes allowed only in `cwd`,
108
+ * reads allowed everywhere, network unrestricted.
109
+ */
110
+ sandbox?: SandboxConfig;
111
+ }
112
+ /**
113
+ * Create a `Sandbox` with OS-level isolation via `@anthropic-ai/sandbox-runtime`.
114
+ *
115
+ * - **macOS**: Seatbelt (`sandbox-exec`) profiles restrict filesystem and network.
116
+ * - **Linux**: bubblewrap (`bwrap`) + socat for namespace-based isolation.
117
+ *
118
+ * Filesystem operations (`VirtualFs`) use the host `node:fs` — the sandbox
119
+ * boundary is enforced on shell commands (`VirtualComputer`), which is where
120
+ * the agent executes arbitrary code.
121
+ *
122
+ * Requires `@anthropic-ai/sandbox-runtime` as a peer dependency.
123
+ */
124
+ declare function LocalSandbox(opts?: LocalSandboxOptions): Sandbox;
125
+
126
+ export { LocalSandbox as L, type Sandbox as S, UnsandboxedLocal as U, type LocalSandboxOptions as a, type SandboxConfig as b, SandboxedLocalComputer as c, type SandboxedLocalComputerOptions as d, type UnsandboxedLocalOptions as e };
@@ -1,9 +1,11 @@
1
1
  import { ServerResponse, IncomingMessage } from 'node:http';
2
- import { A as Agent } from '../agent-1nFVUP9E.js';
3
- import { S as StreamEvent } from '../types-LrU4LRmX.js';
2
+ import { A as Agent } from '../agent-DWE4_P5X.js';
3
+ import { S as StreamEvent } from '../types-kiGBF35b.js';
4
4
  import { P as PermissionResponse } from '../types-CD0rUKKT.js';
5
- import '../types-RPKUTu1k.js';
6
- import '../cache-DsRqxx6v.js';
5
+ import '../sandbox-9qeMTNrD.js';
6
+ import '../computer-BPdxSo6X.js';
7
+ import '../types-DhXwOQwD.js';
8
+ import '../cache-BlBwXXPS.js';
7
9
  import '../types-2kTLUCnD.js';
8
10
  import '@modelcontextprotocol/sdk/client/index.js';
9
11
  import '@modelcontextprotocol/sdk/client/auth.js';
@@ -1,4 +1,4 @@
1
- import { T as Tool, g as ToolResult, h as ToolContext } from './types-RPKUTu1k.js';
1
+ import { T as Tool, g as ToolResult, h as ToolContext } from './types-DhXwOQwD.js';
2
2
  import { T as TokenStorage, M as McpServerConfig } from './types-2kTLUCnD.js';
3
3
 
4
4
  /**
@@ -0,0 +1,136 @@
1
+ import { S as Sandbox } from './sandbox-9qeMTNrD.js';
2
+ import { a as VirtualFs, R as ReadOptions, F as FileEntry, b as FileStat, V as VirtualComputer, E as ExecOptions, C as CommandResult } from './computer-BPdxSo6X.js';
3
+
4
+ interface SpritesSandboxOptions {
5
+ /** sprites.dev API token. */
6
+ token: string;
7
+ /**
8
+ * Name of an existing sprite container. When provided the sandbox
9
+ * attaches to this sprite directly — no auto-creation occurs and
10
+ * `dispose()` will **not** delete it (lifecycle is yours to manage).
11
+ *
12
+ * When omitted a new sprite is provisioned on the first `init()` call
13
+ * (via `POST /v1/sprites`). The auto-created sprite is deleted when
14
+ * `dispose()` is called, and its name is available via `sandboxId()`
15
+ * for session persistence.
16
+ */
17
+ spriteName?: string;
18
+ /** Base URL for sprites API (default: https://api.sprites.dev). */
19
+ baseURL?: string;
20
+ /** Working directory inside the sprite (default: /home/sprite). */
21
+ workingDir?: string;
22
+ /**
23
+ * Optional prefix for auto-generated sprite names (default: "noumen-").
24
+ * Only used when `spriteName` is omitted.
25
+ */
26
+ namePrefix?: string;
27
+ }
28
+ /**
29
+ * Create a `Sandbox` backed by a remote sprites.dev container.
30
+ * Full isolation — the agent has no access to the host machine.
31
+ *
32
+ * **Auto-creation:** When `spriteName` is omitted the sandbox is created
33
+ * lazily on the first `init()` call via the Sprites REST API. The sprite
34
+ * name is available through `sandboxId()` so callers can persist it in
35
+ * session metadata for reconnection on resume. Pass the stored name back
36
+ * through `init(storedId)` to reattach instead of creating a new sprite.
37
+ *
38
+ * **Explicit ID:** When `spriteName` is provided the sandbox attaches to
39
+ * that sprite immediately on `init()`. `dispose()` is a no-op in this
40
+ * case — the caller owns the sprite's lifecycle.
41
+ *
42
+ * @example
43
+ * ```ts
44
+ * // Auto-create — sprite provisioned on first init()
45
+ * const sandbox = SpritesSandbox({ token: process.env.SPRITES_TOKEN! });
46
+ *
47
+ * // Explicit — attach to pre-existing sprite, no auto-lifecycle
48
+ * const sandbox = SpritesSandbox({
49
+ * token: process.env.SPRITES_TOKEN!,
50
+ * spriteName: "my-sprite",
51
+ * });
52
+ * ```
53
+ */
54
+ declare function SpritesSandbox(opts: SpritesSandboxOptions): Sandbox;
55
+
56
+ interface SpritesFsOptions {
57
+ /** sprites.dev API token */
58
+ token: string;
59
+ /** Name of the sprite container */
60
+ spriteName: string;
61
+ /** Base URL for sprites API (default: https://api.sprites.dev) */
62
+ baseURL?: string;
63
+ /** Working directory inside the sprite (default: /home/sprite) */
64
+ workingDir?: string;
65
+ }
66
+ /**
67
+ * Sandboxed VirtualFs backed by a remote sprites.dev container. All file
68
+ * operations are executed over the sprites.dev HTTP API — the agent has no
69
+ * access to the host filesystem. This is the recommended VirtualFs for
70
+ * production deployments and untrusted agents. See `LocalFs` for an
71
+ * unsandboxed local alternative.
72
+ */
73
+ declare class SpritesFs implements VirtualFs {
74
+ private token;
75
+ private spriteName;
76
+ private baseURL;
77
+ private workingDir;
78
+ constructor(opts: SpritesFsOptions);
79
+ private fsUrl;
80
+ private resolvePath;
81
+ private headers;
82
+ readFile(filePath: string, _opts?: ReadOptions): Promise<string>;
83
+ readFileBytes(filePath: string, maxBytes?: number): Promise<Buffer>;
84
+ writeFile(filePath: string, content: string): Promise<void>;
85
+ /**
86
+ * @warning Not atomic. Concurrent appends may lose data due to
87
+ * read-then-write TOCTOU. The Sprites API does not expose an append primitive.
88
+ */
89
+ appendFile(filePath: string, content: string): Promise<void>;
90
+ deleteFile(filePath: string, opts?: {
91
+ recursive?: boolean;
92
+ }): Promise<void>;
93
+ mkdir(dirPath: string, opts?: {
94
+ recursive?: boolean;
95
+ }): Promise<void>;
96
+ readdir(dirPath: string, _opts?: {
97
+ recursive?: boolean;
98
+ }): Promise<FileEntry[]>;
99
+ exists(filePath: string): Promise<boolean>;
100
+ stat(filePath: string): Promise<FileStat>;
101
+ }
102
+
103
+ interface SpritesComputerOptions {
104
+ /** sprites.dev API token */
105
+ token: string;
106
+ /** Name of the sprite container */
107
+ spriteName: string;
108
+ /** Base URL for sprites API (default: https://api.sprites.dev) */
109
+ baseURL?: string;
110
+ /** Working directory inside the sprite (default: /home/sprite) */
111
+ workingDir?: string;
112
+ }
113
+ /**
114
+ * Sandboxed VirtualComputer that executes commands inside a remote
115
+ * sprites.dev container. All shell execution is fully isolated — the agent
116
+ * has no access to the host machine's processes, filesystem, or network.
117
+ *
118
+ * This is the recommended VirtualComputer for production deployments and
119
+ * untrusted agents. See `LocalComputer` for an unsandboxed local alternative.
120
+ *
121
+ * Uses the non-interactive exec REST endpoint (POST command, receive
122
+ * stdout/stderr/exit_code). The WebSocket exec endpoint can be used for
123
+ * streaming/TTY use cases, but REST is sufficient for tool calls.
124
+ */
125
+ declare class SpritesComputer implements VirtualComputer {
126
+ private token;
127
+ private spriteName;
128
+ private baseURL;
129
+ private workingDir;
130
+ constructor(opts: SpritesComputerOptions);
131
+ private headers;
132
+ executeCommand(command: string, opts?: ExecOptions): Promise<CommandResult>;
133
+ private shellEscape;
134
+ }
135
+
136
+ export { SpritesComputer, type SpritesComputerOptions, SpritesFs, type SpritesFsOptions, SpritesSandbox, type SpritesSandboxOptions };