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.
- package/README.md +63 -8
- package/dist/a2a/index.d.ts +6 -4
- package/dist/acp/index.d.ts +7 -5
- package/dist/{agent-1nFVUP9E.d.ts → agent-DWE4_P5X.d.ts} +169 -485
- package/dist/{cache-DsRqxx6v.d.ts → cache-BlBwXXPS.d.ts} +1 -1
- package/dist/{chunk-4HW6LN6D.js → chunk-6MMYCGJQ.js} +366 -1227
- package/dist/chunk-6MMYCGJQ.js.map +1 -0
- package/dist/{chunk-5JN4SPI7.js → chunk-7IQCQI2G.js} +1 -1
- package/dist/{chunk-L3L3FG5T.js → chunk-CCM2AXZG.js} +1 -1
- package/dist/{chunk-L3L3FG5T.js.map → chunk-CCM2AXZG.js.map} +1 -1
- package/dist/{chunk-CS6WNDCF.js → chunk-I3JTUFPK.js} +2 -2
- package/dist/chunk-I3JTUFPK.js.map +1 -0
- package/dist/chunk-I5SBSOS6.js +40 -0
- package/dist/chunk-I5SBSOS6.js.map +1 -0
- package/dist/{chunk-HL6JCRZJ.js → chunk-XZN4QZLK.js} +4 -4
- package/dist/{chunk-EKOGVTBT.js → chunk-ZXSDKBYB.js} +4 -2
- package/dist/chunk-ZXSDKBYB.js.map +1 -0
- package/dist/cli/index.js +11 -11
- package/dist/client/index.d.ts +1 -1
- package/dist/computer-BPdxSo6X.d.ts +88 -0
- package/dist/docker.d.ts +129 -0
- package/dist/docker.js +401 -0
- package/dist/docker.js.map +1 -0
- package/dist/e2b.d.ts +157 -0
- package/dist/e2b.js +202 -0
- package/dist/e2b.js.map +1 -0
- package/dist/freestyle.d.ts +174 -0
- package/dist/freestyle.js +240 -0
- package/dist/freestyle.js.map +1 -0
- package/dist/index.d.ts +19 -204
- package/dist/index.js +38 -48
- package/dist/lsp/index.d.ts +4 -3
- package/dist/mcp/index.d.ts +5 -4
- package/dist/mcp/index.js +2 -2
- package/dist/{provider-factory-KCLIF34X.js → provider-factory-TUHU3DIG.js} +2 -2
- package/dist/providers/anthropic.d.ts +3 -3
- package/dist/providers/anthropic.js +4 -3
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts +3 -3
- package/dist/providers/bedrock.js +2 -2
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/gemini.d.ts +2 -2
- package/dist/providers/gemini.js +1 -1
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/ollama.d.ts +1 -1
- package/dist/providers/ollama.js +2 -2
- package/dist/providers/openai.d.ts +2 -2
- package/dist/providers/openai.js +2 -2
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +2 -2
- package/dist/providers/vertex.d.ts +3 -3
- package/dist/providers/vertex.js +4 -3
- package/dist/providers/vertex.js.map +1 -1
- package/dist/{resolve-4JA2BBDA.js → resolve-6KUZNEYW.js} +2 -2
- package/dist/sandbox-9qeMTNrD.d.ts +126 -0
- package/dist/server/index.d.ts +6 -4
- package/dist/{server-CHMxuWKq.d.ts → server-BzNGKTP6.d.ts} +1 -1
- package/dist/sprites.d.ts +136 -0
- package/dist/sprites.js +334 -0
- package/dist/sprites.js.map +1 -0
- package/dist/ssh.d.ts +187 -0
- package/dist/ssh.js +392 -0
- package/dist/ssh.js.map +1 -0
- package/dist/{types-RPKUTu1k.d.ts → types-DhXwOQwD.d.ts} +3 -89
- package/dist/{types-LrU4LRmX.d.ts → types-kiGBF35b.d.ts} +40 -2
- package/package.json +25 -1
- package/dist/chunk-4HW6LN6D.js.map +0 -1
- package/dist/chunk-CS6WNDCF.js.map +0 -1
- package/dist/chunk-EKOGVTBT.js.map +0 -1
- /package/dist/{chunk-5JN4SPI7.js.map → chunk-7IQCQI2G.js.map} +0 -0
- /package/dist/{chunk-HL6JCRZJ.js.map → chunk-XZN4QZLK.js.map} +0 -0
- /package/dist/{provider-factory-KCLIF34X.js.map → provider-factory-TUHU3DIG.js.map} +0 -0
- /package/dist/{resolve-4JA2BBDA.js.map → resolve-6KUZNEYW.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/types.ts"],"sourcesContent":["import type { ChatMessage } from \"../session/types.js\";\nimport type { ThinkingConfig } from \"../thinking/types.js\";\n\nexport interface ToolParameterProperty {\n type: string;\n description?: string;\n enum?: string[];\n default?: unknown;\n minimum?: number;\n maximum?: number;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, ToolParameterProperty>;\n required?: string[];\n };\n };\n}\n\n// Streaming chunk types (OpenAI-compatible)\n\nexport interface ChatStreamDelta {\n role?: \"assistant\";\n content?: string | null;\n thinking_content?: string | null;\n thinking_signature?: string | null;\n /** Opaque data payload for Anthropic redacted_thinking blocks. */\n redacted_thinking_data?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n}\n\nexport interface ChatStreamChoice {\n index: number;\n delta: ChatStreamDelta;\n finish_reason: string | null;\n}\n\nexport interface ChatStreamChunk {\n id: string;\n choices: ChatStreamChoice[];\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cache_read_tokens?: number;\n cache_creation_tokens?: number;\n thinking_tokens?: number;\n };\n}\n\nexport interface ChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cache_read_tokens?: number;\n cache_creation_tokens?: number;\n thinking_tokens?: number;\n}\n\n/**\n * Structured output format. When provided, the model is constrained to\n * produce a response matching the given JSON schema.\n *\n * - `json_schema`: the model must produce JSON conforming to the given schema.\n * - `json_object`: the model must produce valid JSON (no specific schema).\n */\nexport type OutputFormat = JsonSchemaOutputFormat | JsonObjectOutputFormat;\n\nexport interface JsonSchemaOutputFormat {\n type: \"json_schema\";\n /** JSON Schema object describing the expected output shape. */\n schema: Record<string, unknown>;\n /** Optional name for the schema (required by some providers). */\n name?: string;\n /** When true, the provider enforces strict schema adherence. */\n strict?: boolean;\n}\n\nexport interface JsonObjectOutputFormat {\n type: \"json_object\";\n}\n\nexport interface ChatParams {\n model: string;\n messages: ChatMessage[];\n tools?: ToolDefinition[];\n max_tokens?: number;\n system?: string;\n temperature?: number;\n thinking?: ThinkingConfig;\n /** Constrain the model to produce structured output matching this schema. */\n outputFormat?: OutputFormat;\n /**\n * When true, the provider should place the cache breakpoint on the\n * second-to-last message instead of the last. Used by subagent forks\n * to avoid writing fork-only tails into the shared prompt cache.\n */\n skipCacheWrite?: boolean;\n /** Abort signal — providers should forward this to cancel in-flight HTTP requests. */\n signal?: AbortSignal;\n}\n\nexport interface AIProvider {\n chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;\n}\n\n/**\n * Extended error type that providers can throw to convey retry-relevant metadata.\n * Consumers (like the retry engine) can inspect these fields without knowing\n * provider-specific SDK error types.\n */\nexport class ChatStreamError extends Error {\n status?: number;\n retryAfter?: string;\n\n constructor(\n message: string,\n opts?: { status?: number; retryAfter?: string; cause?: unknown },\n ) {\n super(message, { cause: opts?.cause });\n this.name = \"ChatStreamError\";\n this.status = opts?.status;\n this.retryAfter = opts?.retryAfter;\n }\n}\n"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/providers/types.ts"],"sourcesContent":["import type { ChatMessage } from \"../session/types.js\";\nimport type { ThinkingConfig } from \"../thinking/types.js\";\n\nexport interface ToolParameterProperty {\n type: string;\n description?: string;\n enum?: string[];\n default?: unknown;\n minimum?: number;\n maximum?: number;\n}\n\nexport interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, ToolParameterProperty>;\n required?: string[];\n };\n };\n}\n\n// Streaming chunk types (OpenAI-compatible)\n\nexport interface ChatStreamDelta {\n role?: \"assistant\";\n content?: string | null;\n thinking_content?: string | null;\n thinking_signature?: string | null;\n /** Opaque data payload for Anthropic redacted_thinking blocks. */\n redacted_thinking_data?: string | null;\n tool_calls?: Array<{\n index: number;\n id?: string;\n type?: \"function\";\n function?: {\n name?: string;\n arguments?: string;\n };\n }>;\n}\n\nexport interface ChatStreamChoice {\n index: number;\n delta: ChatStreamDelta;\n finish_reason: string | null;\n}\n\nexport interface ChatStreamChunk {\n id: string;\n choices: ChatStreamChoice[];\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cache_read_tokens?: number;\n cache_creation_tokens?: number;\n thinking_tokens?: number;\n };\n}\n\nexport interface ChatCompletionUsage {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n cache_read_tokens?: number;\n cache_creation_tokens?: number;\n thinking_tokens?: number;\n}\n\n/**\n * Structured output format. When provided, the model is constrained to\n * produce a response matching the given JSON schema.\n *\n * - `json_schema`: the model must produce JSON conforming to the given schema.\n * - `json_object`: the model must produce valid JSON (no specific schema).\n */\nexport type OutputFormat = JsonSchemaOutputFormat | JsonObjectOutputFormat;\n\nexport interface JsonSchemaOutputFormat {\n type: \"json_schema\";\n /** JSON Schema object describing the expected output shape. */\n schema: Record<string, unknown>;\n /** Optional name for the schema (required by some providers). */\n name?: string;\n /** When true, the provider enforces strict schema adherence. */\n strict?: boolean;\n}\n\nexport interface JsonObjectOutputFormat {\n type: \"json_object\";\n}\n\nexport interface ChatParams {\n model: string;\n messages: ChatMessage[];\n tools?: ToolDefinition[];\n max_tokens?: number;\n system?: string;\n temperature?: number;\n thinking?: ThinkingConfig;\n /** Constrain the model to produce structured output matching this schema. */\n outputFormat?: OutputFormat;\n /**\n * When true, the provider should place the cache breakpoint on the\n * second-to-last message instead of the last. Used by subagent forks\n * to avoid writing fork-only tails into the shared prompt cache.\n */\n skipCacheWrite?: boolean;\n /** Abort signal — providers should forward this to cancel in-flight HTTP requests. */\n signal?: AbortSignal;\n}\n\nexport interface AIProvider {\n chat(params: ChatParams): AsyncIterable<ChatStreamChunk>;\n /**\n * Optional fallback model name, used when no `model` is provided at the\n * Thread / Agent level. Consumers should pass explicit models when they\n * can, but this lets each provider ship a sensible default without\n * forcing Thread to hardcode provider-specific strings.\n */\n readonly defaultModel?: string;\n}\n\n/**\n * Extended error type that providers can throw to convey retry-relevant metadata.\n * Consumers (like the retry engine) can inspect these fields without knowing\n * provider-specific SDK error types.\n */\nexport class ChatStreamError extends Error {\n status?: number;\n retryAfter?: string;\n\n constructor(\n message: string,\n opts?: { status?: number; retryAfter?: string; cause?: unknown },\n ) {\n super(message, { cause: opts?.cause });\n this.name = \"ChatStreamError\";\n this.status = opts?.status;\n this.retryAfter = opts?.retryAfter;\n }\n}\n"],"mappings":";AAqIO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC;AAAA,EACA;AAAA,EAEA,YACE,SACA,MACA;AACA,UAAM,SAAS,EAAE,OAAO,MAAM,MAAM,CAAC;AACrC,SAAK,OAAO;AACZ,SAAK,SAAS,MAAM;AACpB,SAAK,aAAa,MAAM;AAAA,EAC1B;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ChatStreamError
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CCM2AXZG.js";
|
|
4
4
|
|
|
5
5
|
// src/providers/openai.ts
|
|
6
6
|
import OpenAI from "openai";
|
|
@@ -168,4 +168,4 @@ var OpenAIProvider = class _OpenAIProvider {
|
|
|
168
168
|
export {
|
|
169
169
|
OpenAIProvider
|
|
170
170
|
};
|
|
171
|
-
//# sourceMappingURL=chunk-
|
|
171
|
+
//# sourceMappingURL=chunk-I3JTUFPK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/openai.ts"],"sourcesContent":["import OpenAI from \"openai\";\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 OpenAIProviderOptions {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n defaultHeaders?: Record<string, string | undefined>;\n /** When true, omits `stream_options` that some OpenAI-compatible endpoints don't support. */\n compatMode?: boolean;\n}\n\nconst O_SERIES_PATTERN = /^o[1-9]/;\n\nexport class OpenAIProvider implements AIProvider {\n private client: OpenAI;\n readonly defaultModel: string;\n protected compatMode: boolean;\n\n constructor(opts: OpenAIProviderOptions) {\n this.client = new OpenAI({\n apiKey: opts.apiKey ?? \"not-needed\",\n baseURL: opts.baseURL,\n defaultHeaders: opts.defaultHeaders,\n maxRetries: 0,\n });\n this.defaultModel = opts.model ?? \"gpt-5.4\";\n this.compatMode = opts.compatMode ?? false;\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const messages = this.buildMessages(params.system, params.messages);\n const model = params.model ?? this.defaultModel;\n const isOSeries = O_SERIES_PATTERN.test(model);\n\n const createParams: OpenAI.ChatCompletionCreateParamsStreaming = {\n model,\n messages: messages as unknown as OpenAI.ChatCompletionMessageParam[],\n tools: params.tools?.map((t) => ({\n type: \"function\" as const,\n function: t.function,\n })),\n stream: true,\n ...(this.compatMode ? {} : { stream_options: { include_usage: true } }),\n };\n\n if (isOSeries) {\n (createParams as unknown as Record<string, unknown>).max_completion_tokens = params.max_tokens ?? 16384;\n if (params.thinking?.type === \"enabled\") {\n (createParams as unknown as Record<string, unknown>).reasoning_effort = \"high\";\n }\n } else {\n createParams.max_tokens = params.max_tokens;\n createParams.temperature = params.temperature;\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n (createParams as unknown as Record<string, unknown>).response_format = {\n type: \"json_schema\",\n json_schema: {\n name: params.outputFormat.name ?? \"response\",\n schema: params.outputFormat.schema,\n strict: params.outputFormat.strict ?? false,\n },\n };\n } else if (params.outputFormat?.type === \"json_object\") {\n (createParams as unknown as Record<string, unknown>).response_format = {\n type: \"json_object\",\n };\n }\n\n try {\n const stream = await this.client.chat.completions.create(createParams, {\n ...(params.signal ? { signal: params.signal } : {}),\n });\n\n for await (const chunk of stream) {\n const usage = chunk.usage;\n let mappedUsage: ChatStreamChunk[\"usage\"] | undefined;\n if (usage) {\n const u = usage as unknown as Record<string, unknown>;\n const promptDetails = u.prompt_tokens_details as Record<string, unknown> | undefined;\n const completionDetails = u.completion_tokens_details as Record<string, unknown> | undefined;\n mappedUsage = {\n prompt_tokens: usage.prompt_tokens,\n completion_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n cache_read_tokens: promptDetails?.cached_tokens as number | undefined,\n cache_creation_tokens: promptDetails?.cache_creation_tokens as number | undefined,\n thinking_tokens: completionDetails?.reasoning_tokens as number | undefined,\n };\n }\n\n const choices = chunk.choices ?? [];\n if (choices.length === 0 && mappedUsage) {\n yield { id: chunk.id, model: chunk.model, choices: [], usage: mappedUsage };\n continue;\n }\n\n yield {\n id: chunk.id,\n model: chunk.model,\n choices: choices.map((c) => ({\n index: c.index,\n delta: {\n role: c.delta.role as \"assistant\" | undefined,\n content: c.delta.content,\n thinking_content: (c.delta as Record<string, unknown>).reasoning_content as string | undefined,\n tool_calls: c.delta.tool_calls?.map((tc) => ({\n index: tc.index,\n id: tc.id,\n type: tc.type as \"function\" | undefined,\n function: tc.function\n ? {\n name: tc.function.name,\n arguments: tc.function.arguments,\n }\n : undefined,\n })),\n },\n finish_reason: c.finish_reason,\n })),\n usage: mappedUsage,\n };\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; headers?: Record<string, string> & { get?(k: string): string | null } };\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: apiErr.status,\n retryAfter: apiErr.headers?.get?.(\"retry-after\") ?? apiErr.headers?.[\"retry-after\"] ?? undefined,\n cause: err,\n },\n );\n }\n }\n\n private static contentPartsToOpenAI(\n parts: ContentPart[],\n ): Array<Record<string, unknown>> {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: { url: `data:${part.media_type};base64,${part.data}` },\n };\n }\n // image_url\n return { type: \"image_url\", image_url: { url: part.url } };\n });\n }\n\n private buildMessages(\n system: string | undefined,\n messages: ChatMessage[],\n ): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n if (system) {\n result.push({ role: \"system\", content: system });\n }\n for (const msg of messages) {\n if (msg.role === \"tool\") {\n const content = Array.isArray(msg.content)\n ? OpenAIProvider.contentPartsToOpenAI(msg.content as ContentPart[])\n : msg.content;\n result.push({\n role: \"tool\",\n tool_call_id: msg.tool_call_id,\n content,\n });\n } else if (msg.role === \"assistant\") {\n const entry: Record<string, unknown> = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls) {\n entry.tool_calls = msg.tool_calls;\n }\n result.push(entry);\n } else if (msg.role === \"user\") {\n const content = Array.isArray(msg.content)\n ? OpenAIProvider.contentPartsToOpenAI(msg.content as ContentPart[])\n : msg.content;\n result.push({ role: \"user\", content });\n } else {\n result.push({ role: msg.role, content: msg.content });\n }\n }\n return result;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// src/virtual/proxy.ts
|
|
2
|
+
function uninitError() {
|
|
3
|
+
throw new Error(
|
|
4
|
+
"Sandbox not initialized \u2014 call init() or pass a pre-created resource"
|
|
5
|
+
);
|
|
6
|
+
}
|
|
7
|
+
function createFsProxy() {
|
|
8
|
+
let inner = null;
|
|
9
|
+
const get = () => inner ?? uninitError();
|
|
10
|
+
return {
|
|
11
|
+
setTarget(target) {
|
|
12
|
+
inner = target;
|
|
13
|
+
},
|
|
14
|
+
readFile: (...args) => get().readFile(...args),
|
|
15
|
+
readFileBytes: (...args) => get().readFileBytes?.(...args),
|
|
16
|
+
writeFile: (...args) => get().writeFile(...args),
|
|
17
|
+
appendFile: (...args) => get().appendFile(...args),
|
|
18
|
+
deleteFile: (...args) => get().deleteFile(...args),
|
|
19
|
+
mkdir: (...args) => get().mkdir(...args),
|
|
20
|
+
readdir: (...args) => get().readdir(...args),
|
|
21
|
+
exists: (...args) => get().exists(...args),
|
|
22
|
+
stat: (...args) => get().stat(...args)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createComputerProxy() {
|
|
26
|
+
let inner = null;
|
|
27
|
+
const get = () => inner ?? uninitError();
|
|
28
|
+
return {
|
|
29
|
+
setTarget(target) {
|
|
30
|
+
inner = target;
|
|
31
|
+
},
|
|
32
|
+
executeCommand: (...args) => get().executeCommand(...args)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export {
|
|
37
|
+
createFsProxy,
|
|
38
|
+
createComputerProxy
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=chunk-I5SBSOS6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/virtual/proxy.ts"],"sourcesContent":["import type { VirtualFs } from \"./fs.js\";\nimport type { VirtualComputer } from \"./computer.js\";\n\n/**\n * Thin forwarding wrappers whose inner target is set by a sandbox factory's\n * `init()`. Methods throw until the target is bound.\n *\n * These proxies let remote sandbox factories return a `Sandbox` synchronously\n * while provisioning the real backend lazily inside `init()`. Consumers hold\n * the proxy reference and get transparent forwarding once `setTarget` fires.\n */\n\nexport type FsProxySetter = { setTarget(target: VirtualFs): void };\nexport type ComputerProxySetter = { setTarget(target: VirtualComputer): void };\n\nexport function uninitError(): never {\n throw new Error(\n \"Sandbox not initialized — call init() or pass a pre-created resource\",\n );\n}\n\nexport function createFsProxy(): VirtualFs & FsProxySetter {\n let inner: VirtualFs | null = null;\n const get = (): VirtualFs => inner ?? uninitError();\n return {\n setTarget(target: VirtualFs) { inner = target; },\n readFile: (...args) => get().readFile(...args),\n readFileBytes: (...args) => get().readFileBytes?.(...args) as any,\n writeFile: (...args) => get().writeFile(...args),\n appendFile: (...args) => get().appendFile(...args),\n deleteFile: (...args) => get().deleteFile(...args),\n mkdir: (...args) => get().mkdir(...args),\n readdir: (...args) => get().readdir(...args),\n exists: (...args) => get().exists(...args),\n stat: (...args) => get().stat(...args),\n };\n}\n\nexport function createComputerProxy(): VirtualComputer & ComputerProxySetter {\n let inner: VirtualComputer | null = null;\n const get = (): VirtualComputer => inner ?? uninitError();\n return {\n setTarget(target: VirtualComputer) { inner = target; },\n executeCommand: (...args) => get().executeCommand(...args),\n };\n}\n"],"mappings":";AAeO,SAAS,cAAqB;AACnC,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,gBAA2C;AACzD,MAAI,QAA0B;AAC9B,QAAM,MAAM,MAAiB,SAAS,YAAY;AAClD,SAAO;AAAA,IACL,UAAU,QAAmB;AAAE,cAAQ;AAAA,IAAQ;AAAA,IAC/C,UAAU,IAAI,SAAS,IAAI,EAAE,SAAS,GAAG,IAAI;AAAA,IAC7C,eAAe,IAAI,SAAS,IAAI,EAAE,gBAAgB,GAAG,IAAI;AAAA,IACzD,WAAW,IAAI,SAAS,IAAI,EAAE,UAAU,GAAG,IAAI;AAAA,IAC/C,YAAY,IAAI,SAAS,IAAI,EAAE,WAAW,GAAG,IAAI;AAAA,IACjD,YAAY,IAAI,SAAS,IAAI,EAAE,WAAW,GAAG,IAAI;AAAA,IACjD,OAAO,IAAI,SAAS,IAAI,EAAE,MAAM,GAAG,IAAI;AAAA,IACvC,SAAS,IAAI,SAAS,IAAI,EAAE,QAAQ,GAAG,IAAI;AAAA,IAC3C,QAAQ,IAAI,SAAS,IAAI,EAAE,OAAO,GAAG,IAAI;AAAA,IACzC,MAAM,IAAI,SAAS,IAAI,EAAE,KAAK,GAAG,IAAI;AAAA,EACvC;AACF;AAEO,SAAS,sBAA6D;AAC3E,MAAI,QAAgC;AACpC,QAAM,MAAM,MAAuB,SAAS,YAAY;AACxD,SAAO;AAAA,IACL,UAAU,QAAyB;AAAE,cAAQ;AAAA,IAAQ;AAAA,IACrD,gBAAgB,IAAI,SAAS,IAAI,EAAE,eAAe,GAAG,IAAI;AAAA,EAC3D;AACF;","names":[]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
formatZodValidationError
|
|
3
|
-
} from "./chunk-3SK5GCI6.js";
|
|
4
1
|
import {
|
|
5
2
|
IMAGE_EXTENSIONS,
|
|
6
3
|
compressImageBufferWithTokenLimit,
|
|
7
4
|
createImageMetadataText,
|
|
8
5
|
maybeResizeAndDownsampleImageBuffer
|
|
9
6
|
} from "./chunk-5GEX6ZSB.js";
|
|
7
|
+
import {
|
|
8
|
+
formatZodValidationError
|
|
9
|
+
} from "./chunk-3SK5GCI6.js";
|
|
10
10
|
import {
|
|
11
11
|
contentToString
|
|
12
12
|
} from "./chunk-JACGEMTF.js";
|
|
@@ -3109,4 +3109,4 @@ export {
|
|
|
3109
3109
|
resolveToolFlag,
|
|
3110
3110
|
ToolRegistry
|
|
3111
3111
|
};
|
|
3112
|
-
//# sourceMappingURL=chunk-
|
|
3112
|
+
//# sourceMappingURL=chunk-XZN4QZLK.js.map
|
|
@@ -4,9 +4,10 @@ import {
|
|
|
4
4
|
} from "./chunk-HEQQQGK5.js";
|
|
5
5
|
import {
|
|
6
6
|
ChatStreamError
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CCM2AXZG.js";
|
|
8
8
|
|
|
9
9
|
// src/providers/anthropic-shared.ts
|
|
10
|
+
var DEFAULT_ANTHROPIC_MODEL = "claude-opus-4-7";
|
|
10
11
|
function buildCacheControlBlock(config) {
|
|
11
12
|
const cc = { type: "ephemeral" };
|
|
12
13
|
if (config?.ttl) cc.ttl = config.ttl;
|
|
@@ -467,6 +468,7 @@ async function* streamAnthropicChat(client, params, defaultModel, cacheConfig) {
|
|
|
467
468
|
}
|
|
468
469
|
|
|
469
470
|
export {
|
|
471
|
+
DEFAULT_ANTHROPIC_MODEL,
|
|
470
472
|
streamAnthropicChat
|
|
471
473
|
};
|
|
472
|
-
//# sourceMappingURL=chunk-
|
|
474
|
+
//# sourceMappingURL=chunk-ZXSDKBYB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/anthropic-shared.ts"],"sourcesContent":["/**\n * Shared Anthropic streaming, message conversion, and tool mapping logic.\n *\n * Used by AnthropicProvider, BedrockAnthropicProvider, and VertexAnthropicProvider.\n * Accepts a generic client shape so it works with all three SDKs without\n * importing any of them directly.\n */\n\nimport type { ChatParams, ChatStreamChunk } from \"./types.js\";\nimport { ChatStreamError } from \"./types.js\";\nimport type { ChatMessage, ContentPart } from \"../session/types.js\";\nimport type { CacheControlConfig } from \"./cache.js\";\nimport { getMessageCacheBreakpointIndex } from \"./cache.js\";\nimport { getMaxOutputTokensForModel } from \"../utils/context.js\";\n\n/**\n * Default model for Anthropic-family providers (direct API + Vertex).\n * Bedrock uses its own ARN-shaped ids so it keeps its own default.\n *\n * Note: Anthropic model ids use hyphens throughout (`claude-opus-4-7`,\n * not `claude-opus-4.7`). A dot-separated fallback silently 404s against\n * the real API, which is especially nasty when the string only surfaces\n * via Thread's fallback path.\n */\nexport const DEFAULT_ANTHROPIC_MODEL = \"claude-opus-4-7\";\n\ninterface AnthropicToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\ntype CacheControlBlock = {\n type: \"ephemeral\";\n ttl?: \"1h\";\n scope?: \"global\" | \"org\";\n};\n\nexport interface AnthropicStreamClient {\n messages: {\n stream(\n params: Record<string, unknown>,\n options?: { signal?: AbortSignal },\n ): AsyncIterable<Record<string, unknown>>;\n };\n}\n\nexport function buildCacheControlBlock(\n config: CacheControlConfig | undefined,\n): CacheControlBlock {\n const cc: CacheControlBlock = { type: \"ephemeral\" };\n if (config?.ttl) cc.ttl = config.ttl;\n if (config?.scope) cc.scope = config.scope;\n return cc;\n}\n\nfunction isCachingEnabled(config: CacheControlConfig | undefined): boolean {\n return config?.enabled === true;\n}\n\nexport function contentPartsToAnthropic(\n parts: ContentPart[],\n): Record<string, unknown>[] {\n return parts.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.media_type,\n data: part.data,\n },\n };\n }\n return {\n type: \"image\",\n source: { type: \"url\", url: part.url },\n };\n });\n}\n\nexport function buildAnthropicTools(\n params: ChatParams,\n cacheConfig?: CacheControlConfig,\n): Record<string, unknown>[] | undefined {\n if (!params.tools) return undefined;\n\n const tools = params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n input_schema: t.function.parameters,\n }));\n\n if (isCachingEnabled(cacheConfig) && tools.length > 0) {\n const lastTool = tools[tools.length - 1] as Record<string, unknown>;\n lastTool.cache_control = buildCacheControlBlock(cacheConfig);\n }\n\n return tools;\n}\n\nexport function buildAnthropicSystemBlocks(\n systemPrompt: string | undefined,\n cacheConfig?: CacheControlConfig,\n): unknown {\n if (!systemPrompt) return undefined;\n if (!isCachingEnabled(cacheConfig)) return systemPrompt;\n\n return [\n {\n type: \"text\",\n text: systemPrompt,\n cache_control: buildCacheControlBlock(cacheConfig),\n },\n ];\n}\n\nexport function convertAnthropicMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n cacheConfig?: CacheControlConfig,\n skipCacheWrite?: boolean,\n): {\n system: unknown;\n messages: Record<string, unknown>[];\n} {\n const result: Record<string, unknown>[] = [];\n const caching = isCachingEnabled(cacheConfig);\n const cacheBreakpointIdx = caching\n ? getMessageCacheBreakpointIndex(messages, skipCacheWrite)\n : -1;\n\n for (let mi = 0; mi < messages.length; mi++) {\n const msg = messages[mi];\n const addCache = mi === cacheBreakpointIdx;\n\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"user\") {\n const isMultipart = Array.isArray(msg.content);\n if (addCache && caching) {\n const blocks = isMultipart\n ? contentPartsToAnthropic(msg.content as ContentPart[])\n : [{ type: \"text\", text: msg.content as string }];\n const lastBlock = blocks[blocks.length - 1] as Record<string, unknown>;\n lastBlock.cache_control = buildCacheControlBlock(cacheConfig);\n result.push({ role: \"user\", content: blocks });\n } else if (isMultipart) {\n result.push({\n role: \"user\",\n content: contentPartsToAnthropic(msg.content as ContentPart[]),\n });\n } else {\n result.push({ role: \"user\", content: msg.content as string });\n }\n } else if (msg.role === \"assistant\") {\n const content: Record<string, unknown>[] = [];\n if (msg.thinking_content) {\n const thinkingBlock: Record<string, unknown> = {\n type: \"thinking\",\n thinking: msg.thinking_content,\n };\n if (msg.thinking_signature) {\n thinkingBlock.signature = msg.thinking_signature;\n }\n content.push(thinkingBlock);\n }\n if (msg.redacted_thinking_data) {\n content.push({\n type: \"redacted_thinking\",\n data: msg.redacted_thinking_data,\n });\n }\n if (msg.content && (typeof msg.content !== \"string\" || msg.content.trim() !== \"\")) {\n content.push({ type: \"text\", text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n // malformed JSON from truncated stream — send empty input\n }\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n if (content.length === 0) {\n content.push({ type: \"text\", text: \"\" });\n }\n if (addCache && caching && content.length > 0) {\n for (let i = content.length - 1; i >= 0; i--) {\n const block = content[i] as Record<string, unknown>;\n if (block.type !== \"thinking\" && block.type !== \"redacted_thinking\") {\n block.cache_control = buildCacheControlBlock(cacheConfig);\n break;\n }\n }\n }\n result.push({ role: \"assistant\", content });\n } else if (msg.role === \"tool\") {\n const isMultipart = Array.isArray(msg.content);\n let toolContent: string | Record<string, unknown>[];\n\n if (msg.isError && isMultipart) {\n const textOnly = (msg.content as ContentPart[]).filter(\n (p) => p.type === \"text\",\n );\n toolContent =\n textOnly.length > 0\n ? contentPartsToAnthropic(textOnly)\n : String(msg.content);\n } else {\n toolContent = isMultipart\n ? contentPartsToAnthropic(msg.content as ContentPart[])\n : (msg.content as string);\n }\n\n const toolResultBlock: Record<string, unknown> = {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: toolContent,\n };\n if (msg.isError) {\n toolResultBlock.is_error = true;\n }\n if (addCache && caching) {\n toolResultBlock.cache_control = buildCacheControlBlock(cacheConfig);\n }\n\n const prev = result[result.length - 1];\n if (prev && prev.role === \"user\" && Array.isArray(prev.content)) {\n const blocks = prev.content as Record<string, unknown>[];\n if (blocks.length > 0 && blocks[0].type === \"tool_result\") {\n blocks.push(toolResultBlock);\n continue;\n }\n }\n result.push({ role: \"user\", content: [toolResultBlock] });\n }\n }\n\n return {\n system: buildAnthropicSystemBlocks(systemPrompt, cacheConfig),\n messages: result,\n };\n}\n\nexport function makeChunk(\n id: string,\n model: string,\n delta: Record<string, unknown>,\n): ChatStreamChunk {\n return {\n id,\n model,\n choices: [\n {\n index: 0,\n delta: delta as ChatStreamChunk[\"choices\"][0][\"delta\"],\n finish_reason: null,\n },\n ],\n };\n}\n\n// ---------------------------------------------------------------------------\n// buildAnthropicRequestParams — pure param construction\n// ---------------------------------------------------------------------------\n\nexport interface AnthropicRequestParamsResult {\n streamParams: Record<string, unknown>;\n model: string;\n}\n\nexport function buildAnthropicRequestParams(\n params: ChatParams,\n defaultModel: string,\n cacheConfig?: CacheControlConfig,\n): AnthropicRequestParamsResult {\n const { system, messages: inputMessages } = convertAnthropicMessages(\n params.system,\n params.messages,\n cacheConfig,\n params.skipCacheWrite,\n );\n\n const tools = buildAnthropicTools(params, cacheConfig);\n\n const thinkingEnabled =\n params.thinking?.type === \"enabled\" &&\n (params.thinking as { budgetTokens: number }).budgetTokens > 0;\n const budgetTokens = thinkingEnabled\n ? (params.thinking as { type: \"enabled\"; budgetTokens: number }).budgetTokens\n : 0;\n\n const model = params.model ?? defaultModel;\n\n const modelMaxOutput = getMaxOutputTokensForModel(model);\n const maxOutputTokens = thinkingEnabled\n ? (params.max_tokens ?? modelMaxOutput)\n : (params.max_tokens ?? 8192);\n const clampedBudget = thinkingEnabled\n ? Math.min(budgetTokens, maxOutputTokens - 1)\n : 0;\n\n const streamParams: Record<string, unknown> = {\n model,\n max_tokens: maxOutputTokens,\n system,\n messages: inputMessages,\n tools,\n };\n\n if (!thinkingEnabled && params.temperature !== undefined) {\n streamParams.temperature = params.temperature;\n }\n\n if (thinkingEnabled) {\n streamParams.thinking = {\n type: \"enabled\",\n budget_tokens: clampedBudget,\n };\n }\n\n if (params.outputFormat?.type === \"json_schema\") {\n streamParams.output_config = {\n format: {\n type: \"json_schema\",\n json_schema: {\n name: params.outputFormat.name ?? \"response\",\n schema: params.outputFormat.schema,\n },\n },\n };\n const betas: string[] = (streamParams.betas as string[] | undefined) ?? [];\n if (!betas.includes(\"structured-outputs-2025-12-15\")) {\n betas.push(\"structured-outputs-2025-12-15\");\n }\n streamParams.betas = betas;\n } else if (params.outputFormat?.type === \"json_object\") {\n const hint = \"\\n\\nYou MUST respond with valid JSON only. No markdown, no explanation — just a single JSON object.\";\n if (typeof streamParams.system === \"string\") {\n streamParams.system = streamParams.system + hint;\n } else if (Array.isArray(streamParams.system)) {\n const blocks = streamParams.system as Array<Record<string, unknown>>;\n if (blocks.length > 0) {\n const last = blocks[blocks.length - 1];\n if (last.type === \"text\" && typeof last.text === \"string\") {\n last.text = last.text + hint;\n }\n }\n } else if (!streamParams.system) {\n streamParams.system = hint.trim();\n }\n }\n\n return { streamParams, model };\n}\n\n// ---------------------------------------------------------------------------\n// mapAnthropicStopReason — pure stop_reason -> finish_reason mapping\n// ---------------------------------------------------------------------------\n\nexport function mapAnthropicStopReason(\n stopReason: string | undefined,\n hasToolCalls: boolean,\n): string {\n switch (stopReason) {\n case \"end_turn\": return \"stop\";\n case \"tool_use\": return \"tool_calls\";\n case \"max_tokens\": return \"length\";\n case \"model_context_window_exceeded\": return \"length\";\n case \"stop_sequence\": return \"stop\";\n case \"refusal\": return \"content_filter\";\n default: return hasToolCalls ? \"tool_calls\" : \"stop\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// AnthropicStreamState + processAnthropicStreamEvent — reducer pattern\n// ---------------------------------------------------------------------------\n\nexport interface AnthropicStreamState {\n chunkIndex: number;\n toolIndexMap: Map<string, number>;\n blockIndexToToolId: Map<number, string>;\n blockIndexToType: Map<number, string>;\n nextToolIndex: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n thinkingTokens: number;\n stopReason: string | undefined;\n receivedMessageStop: boolean;\n}\n\nexport function createAnthropicStreamState(): AnthropicStreamState {\n return {\n chunkIndex: 0,\n toolIndexMap: new Map(),\n blockIndexToToolId: new Map(),\n blockIndexToType: new Map(),\n nextToolIndex: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n thinkingTokens: 0,\n stopReason: undefined,\n receivedMessageStop: false,\n };\n}\n\nexport function processAnthropicStreamEvent(\n ev: Record<string, unknown>,\n state: AnthropicStreamState,\n model: string,\n): ChatStreamChunk[] {\n const chunks: ChatStreamChunk[] = [];\n const chunkId = `chatcmpl-${state.chunkIndex++}`;\n\n if (ev.type === \"message_start\") {\n const msg = (ev.message as Record<string, unknown>) ?? {};\n const usage = msg.usage as Record<string, unknown> | undefined;\n if (usage) {\n state.inputTokens = (usage.input_tokens as number) ?? 0;\n state.outputTokens = (usage.output_tokens as number) ?? 0;\n state.cacheReadTokens = (usage.cache_read_input_tokens as number) ?? 0;\n state.cacheCreationTokens = (usage.cache_creation_input_tokens as number) ?? 0;\n if (usage.thinking_tokens) state.thinkingTokens = usage.thinking_tokens as number;\n }\n return chunks;\n }\n\n if (ev.type === \"message_delta\") {\n const delta = ev.delta as Record<string, unknown> | undefined;\n if (delta?.stop_reason) {\n state.stopReason = delta.stop_reason as string;\n }\n const usage = ev.usage as Record<string, unknown> | undefined;\n if (usage?.output_tokens != null && (usage.output_tokens as number) > 0) {\n state.outputTokens = usage.output_tokens as number;\n }\n if (usage?.thinking_tokens != null && (usage.thinking_tokens as number) > 0) {\n state.thinkingTokens = usage.thinking_tokens as number;\n }\n return chunks;\n }\n\n if (ev.type === \"content_block_start\") {\n // Shallow-copy to guard against SDK mutating the original object\n const block = { ...((ev.content_block as Record<string, unknown>) ?? {}) };\n const blockIndex = ev.index as number | undefined;\n if (blockIndex !== undefined) {\n state.blockIndexToType.set(blockIndex, block.type as string);\n }\n\n if (block.type === \"thinking\") {\n chunks.push(makeChunk(chunkId, model, { thinking_content: \"\" }));\n } else if (block.type === \"redacted_thinking\") {\n const redactedData = block.data as string | undefined;\n chunks.push(makeChunk(chunkId, model, { redacted_thinking_data: redactedData ?? \"\" }));\n } else if (block.type === \"text\") {\n chunks.push(makeChunk(chunkId, model, { content: \"\" }));\n } else if (block.type === \"tool_use\") {\n const toolBlock = block as unknown as AnthropicToolUseBlock;\n if (!toolBlock.id || !toolBlock.name) return chunks;\n const idx = state.nextToolIndex++;\n state.toolIndexMap.set(toolBlock.id, idx);\n if (blockIndex !== undefined) {\n state.blockIndexToToolId.set(blockIndex, toolBlock.id);\n }\n chunks.push(makeChunk(chunkId, model, {\n tool_calls: [\n {\n index: idx,\n id: toolBlock.id,\n type: \"function\",\n function: { name: toolBlock.name, arguments: \"\" },\n },\n ],\n }));\n }\n return chunks;\n }\n\n if (ev.type === \"content_block_delta\") {\n if (!ev.delta) return chunks;\n const delta = ev.delta as Record<string, unknown>;\n const deltaType = delta.type;\n const blockIndex = ev.index as number | undefined;\n\n if (deltaType === \"thinking_delta\") {\n chunks.push(makeChunk(chunkId, model, {\n thinking_content: delta.thinking as string,\n }));\n } else if (deltaType === \"text_delta\") {\n chunks.push(makeChunk(chunkId, model, {\n content: delta.text as string,\n }));\n } else if (deltaType === \"signature_delta\") {\n if (blockIndex !== undefined && state.blockIndexToType.get(blockIndex) === \"thinking\") {\n chunks.push(makeChunk(chunkId, model, {\n thinking_signature: delta.signature as string,\n }));\n }\n } else if (deltaType === \"input_json_delta\") {\n const partialJson = (delta.partial_json as string) ?? \"\";\n if (!partialJson) return chunks;\n let toolId: string | undefined;\n if (blockIndex !== undefined) {\n toolId = state.blockIndexToToolId.get(blockIndex);\n }\n if (!toolId) {\n toolId = Array.from(state.toolIndexMap.keys()).pop();\n }\n if (toolId) {\n const idx = state.toolIndexMap.get(toolId)!;\n chunks.push(makeChunk(chunkId, model, {\n tool_calls: [\n {\n index: idx,\n function: { arguments: partialJson },\n },\n ],\n }));\n }\n }\n return chunks;\n }\n\n if (ev.type === \"message_stop\") {\n state.receivedMessageStop = true;\n const finishReason = mapAnthropicStopReason(state.stopReason, state.toolIndexMap.size > 0);\n chunks.push({\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: finishReason,\n },\n ],\n usage: {\n prompt_tokens: state.inputTokens,\n completion_tokens: state.outputTokens,\n total_tokens: state.inputTokens + state.outputTokens,\n cache_read_tokens: state.cacheReadTokens || undefined,\n cache_creation_tokens: state.cacheCreationTokens || undefined,\n thinking_tokens: state.thinkingTokens || undefined,\n },\n });\n return chunks;\n }\n\n return chunks;\n}\n\n/**\n * Stream an Anthropic-compatible chat call and yield OpenAI-shaped ChatStreamChunks.\n * Works with Anthropic, AnthropicBedrock, and AnthropicVertex clients.\n */\nexport async function* streamAnthropicChat(\n client: AnthropicStreamClient,\n params: ChatParams,\n defaultModel: string,\n cacheConfig?: CacheControlConfig,\n): AsyncIterable<ChatStreamChunk> {\n const { streamParams, model } = buildAnthropicRequestParams(params, defaultModel, cacheConfig);\n const requestSignal = params.signal;\n\n let stream: AsyncIterable<Record<string, unknown>>;\n try {\n stream = client.messages.stream(\n streamParams,\n requestSignal ? { signal: requestSignal } : undefined,\n );\n } catch (err: unknown) {\n const apiErr = err as { status?: number; headers?: Record<string, string> & { get?(k: string): string | null } };\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: apiErr.status,\n retryAfter: apiErr.headers?.get?.(\"retry-after\") ?? apiErr.headers?.[\"retry-after\"] ?? undefined,\n cause: err,\n },\n );\n }\n\n const state = createAnthropicStreamState();\n\n try {\n for await (const event of stream) {\n const ev = event as Record<string, unknown>;\n for (const chunk of processAnthropicStreamEvent(ev, state, model)) {\n yield chunk;\n }\n }\n\n if (!state.receivedMessageStop && state.chunkIndex > 0) {\n throw new ChatStreamError(\n \"Stream ended without receiving message_stop event\",\n { cause: new Error(\"incomplete_stream\") },\n );\n } else if (state.chunkIndex === 0) {\n throw new ChatStreamError(\n \"Stream returned no events\",\n { cause: new Error(\"empty_stream\") },\n );\n }\n } catch (err: unknown) {\n if (err instanceof ChatStreamError) throw err;\n const apiErr = err as { status?: number; headers?: Record<string, string> & { get?(k: string): string | null } };\n throw new ChatStreamError(\n err instanceof Error ? err.message : String(err),\n {\n status: apiErr.status,\n retryAfter: apiErr.headers?.get?.(\"retry-after\") ?? apiErr.headers?.[\"retry-after\"] ?? undefined,\n cause: err,\n },\n );\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli/index.js
CHANGED
|
@@ -16,21 +16,21 @@ import {
|
|
|
16
16
|
Agent,
|
|
17
17
|
LocalSandbox,
|
|
18
18
|
UnsandboxedLocal
|
|
19
|
-
} from "../chunk-
|
|
20
|
-
import "../chunk-42PHHZUA.js";
|
|
19
|
+
} from "../chunk-6MMYCGJQ.js";
|
|
21
20
|
import {
|
|
22
21
|
DEFAULT_MODELS,
|
|
23
22
|
SUPPORTED_PROVIDERS,
|
|
24
23
|
detectProvider,
|
|
25
24
|
resolveProvider
|
|
26
|
-
} from "../chunk-
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-3HEYCV26.js";
|
|
30
|
-
import "../chunk-HL6JCRZJ.js";
|
|
31
|
-
import "../chunk-3SK5GCI6.js";
|
|
25
|
+
} from "../chunk-7IQCQI2G.js";
|
|
26
|
+
import "../chunk-42PHHZUA.js";
|
|
27
|
+
import "../chunk-XZN4QZLK.js";
|
|
32
28
|
import "../chunk-5GEX6ZSB.js";
|
|
33
29
|
import "../chunk-4SQA2UCV.js";
|
|
30
|
+
import "../chunk-3SK5GCI6.js";
|
|
31
|
+
import "../chunk-HEQQQGK5.js";
|
|
32
|
+
import "../chunk-CCM2AXZG.js";
|
|
33
|
+
import "../chunk-3HEYCV26.js";
|
|
34
34
|
import "../chunk-JACGEMTF.js";
|
|
35
35
|
import "../chunk-DGUM43GV.js";
|
|
36
36
|
|
|
@@ -532,7 +532,7 @@ async function runAgent(config) {
|
|
|
532
532
|
const { createInterface: createInterface3 } = await import("readline/promises");
|
|
533
533
|
const rl = createInterface3({ input: process.stdin, output: process.stderr, terminal: true });
|
|
534
534
|
try {
|
|
535
|
-
const { SUPPORTED_PROVIDERS: SUPPORTED_PROVIDERS2, isOllamaRunning: isOllamaRunning2, ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-
|
|
535
|
+
const { SUPPORTED_PROVIDERS: SUPPORTED_PROVIDERS2, isOllamaRunning: isOllamaRunning2, ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-TUHU3DIG.js");
|
|
536
536
|
const providerAnswer = await rl.question(
|
|
537
537
|
` Provider (${SUPPORTED_PROVIDERS2.join(", ")}) [${chalk3.bold("ollama")}]: `
|
|
538
538
|
);
|
|
@@ -589,9 +589,9 @@ async function runAgent(config) {
|
|
|
589
589
|
return runAgent(config);
|
|
590
590
|
}
|
|
591
591
|
if (!config.model) {
|
|
592
|
-
const { DEFAULT_MODELS: DEFAULT_MODELS2 } = await import("../provider-factory-
|
|
592
|
+
const { DEFAULT_MODELS: DEFAULT_MODELS2 } = await import("../provider-factory-TUHU3DIG.js");
|
|
593
593
|
if (providerName === "ollama") {
|
|
594
|
-
const { ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-
|
|
594
|
+
const { ollamaBaseURL: ollamaBaseURL2 } = await import("../provider-factory-TUHU3DIG.js");
|
|
595
595
|
const models = await listLocalOllamaModels(ollamaBaseURL2());
|
|
596
596
|
const preferred = DEFAULT_MODELS2[providerName];
|
|
597
597
|
config.model = models.includes(preferred) ? preferred : models[0] ?? preferred;
|
package/dist/client/index.d.ts
CHANGED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
interface FileEntry {
|
|
2
|
+
name: string;
|
|
3
|
+
path: string;
|
|
4
|
+
isDirectory: boolean;
|
|
5
|
+
isFile: boolean;
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
interface FileStat {
|
|
9
|
+
size: number;
|
|
10
|
+
isDirectory: boolean;
|
|
11
|
+
isFile: boolean;
|
|
12
|
+
createdAt?: Date;
|
|
13
|
+
modifiedAt?: Date;
|
|
14
|
+
}
|
|
15
|
+
interface ReadOptions {
|
|
16
|
+
encoding?: BufferEncoding;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum number of bytes to read. When set, only the first `maxBytes`
|
|
19
|
+
* bytes are returned (decoded as a string). Implementations that do not
|
|
20
|
+
* support this option may ignore it and return the full content.
|
|
21
|
+
*/
|
|
22
|
+
maxBytes?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Sandboxed filesystem interface.
|
|
26
|
+
*
|
|
27
|
+
* `VirtualFs` is noumen's primary isolation boundary for file I/O. Every
|
|
28
|
+
* built-in tool that touches the filesystem (ReadFile, WriteFile, EditFile)
|
|
29
|
+
* delegates to this interface — the agent never accesses `node:fs` directly.
|
|
30
|
+
*
|
|
31
|
+
* Swap implementations to control where files live and what the agent can reach:
|
|
32
|
+
* - `LocalFs` — reads/writes on the host filesystem (no isolation, for local dev)
|
|
33
|
+
* - `SpritesFs` — reads/writes inside a remote sprites.dev container (full sandbox)
|
|
34
|
+
* - Custom — implement this interface for Docker volumes, E2B, S3, in-memory, etc.
|
|
35
|
+
*/
|
|
36
|
+
interface VirtualFs {
|
|
37
|
+
readFile(path: string, opts?: ReadOptions): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Read raw bytes from a file. Used for binary content (images, PDFs).
|
|
40
|
+
* Implementations SHOULD cap the read at `maxBytes` to prevent OOM on
|
|
41
|
+
* very large files. When `maxBytes` is omitted, the entire file is read.
|
|
42
|
+
*
|
|
43
|
+
* Returns a Buffer (Node.js) or Uint8Array.
|
|
44
|
+
*/
|
|
45
|
+
readFileBytes?(path: string, maxBytes?: number): Promise<Buffer>;
|
|
46
|
+
writeFile(path: string, content: string): Promise<void>;
|
|
47
|
+
appendFile(path: string, content: string): Promise<void>;
|
|
48
|
+
deleteFile(path: string, opts?: {
|
|
49
|
+
recursive?: boolean;
|
|
50
|
+
}): Promise<void>;
|
|
51
|
+
mkdir(path: string, opts?: {
|
|
52
|
+
recursive?: boolean;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
readdir(path: string, opts?: {
|
|
55
|
+
recursive?: boolean;
|
|
56
|
+
}): Promise<FileEntry[]>;
|
|
57
|
+
exists(path: string): Promise<boolean>;
|
|
58
|
+
stat(path: string): Promise<FileStat>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
interface ExecOptions {
|
|
62
|
+
timeout?: number;
|
|
63
|
+
cwd?: string;
|
|
64
|
+
env?: Record<string, string>;
|
|
65
|
+
signal?: AbortSignal;
|
|
66
|
+
}
|
|
67
|
+
interface CommandResult {
|
|
68
|
+
exitCode: number;
|
|
69
|
+
stdout: string;
|
|
70
|
+
stderr: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Sandboxed shell execution interface.
|
|
74
|
+
*
|
|
75
|
+
* `VirtualComputer` is noumen's primary isolation boundary for command
|
|
76
|
+
* execution. Every built-in tool that runs shell commands (Bash, Glob, Grep)
|
|
77
|
+
* delegates to this interface — the agent never spawns processes directly.
|
|
78
|
+
*
|
|
79
|
+
* Swap implementations to control where and how commands run:
|
|
80
|
+
* - `LocalComputer` — runs on the host machine (no isolation, for local dev)
|
|
81
|
+
* - `SpritesComputer` — runs in a remote sprites.dev container (full sandbox)
|
|
82
|
+
* - Custom — implement this interface for Docker, E2B, Daytona, etc.
|
|
83
|
+
*/
|
|
84
|
+
interface VirtualComputer {
|
|
85
|
+
executeCommand(command: string, opts?: ExecOptions): Promise<CommandResult>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export type { CommandResult as C, ExecOptions as E, FileEntry as F, ReadOptions as R, VirtualComputer as V, VirtualFs as a, FileStat as b };
|
package/dist/docker.d.ts
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { S as Sandbox } from './sandbox-9qeMTNrD.js';
|
|
2
|
+
import { V as VirtualComputer, E as ExecOptions, C as CommandResult, a as VirtualFs, R as ReadOptions, F as FileEntry, b as FileStat } from './computer-BPdxSo6X.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Minimal subset of the dockerode Container interface used by DockerComputer.
|
|
6
|
+
* Avoids a hard import of dockerode at the module level.
|
|
7
|
+
*/
|
|
8
|
+
interface DockerContainer {
|
|
9
|
+
exec(options: Record<string, unknown>): Promise<{
|
|
10
|
+
start(opts?: Record<string, unknown>): Promise<NodeJS.ReadableStream>;
|
|
11
|
+
inspect(): Promise<{
|
|
12
|
+
ExitCode: number;
|
|
13
|
+
}>;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
interface DockerComputerOptions {
|
|
17
|
+
/** A dockerode Container instance for the target container. */
|
|
18
|
+
container: DockerContainer;
|
|
19
|
+
/** Default working directory for commands (default: /). */
|
|
20
|
+
defaultCwd?: string;
|
|
21
|
+
/** Default timeout in ms for commands (default: 30000). */
|
|
22
|
+
defaultTimeout?: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* VirtualComputer backed by command execution inside a Docker container.
|
|
26
|
+
*
|
|
27
|
+
* Requires `dockerode` as an optional peer dependency.
|
|
28
|
+
* The user is responsible for container lifecycle (create, start, stop).
|
|
29
|
+
*/
|
|
30
|
+
declare class DockerComputer implements VirtualComputer {
|
|
31
|
+
private container;
|
|
32
|
+
private defaultCwd;
|
|
33
|
+
private defaultTimeout;
|
|
34
|
+
constructor(opts: DockerComputerOptions);
|
|
35
|
+
executeCommand(command: string, opts?: ExecOptions): Promise<CommandResult>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
interface DockerSandboxOptions {
|
|
39
|
+
/**
|
|
40
|
+
* A pre-existing dockerode Container instance. When provided the sandbox
|
|
41
|
+
* attaches to this container directly — no auto-creation occurs and
|
|
42
|
+
* `dispose()` will **not** stop or remove it.
|
|
43
|
+
*
|
|
44
|
+
* When omitted, a new container is created from `image` on the first
|
|
45
|
+
* `init()` call via a dynamic import of `dockerode`. The auto-created
|
|
46
|
+
* container is stopped and removed when `dispose()` is called.
|
|
47
|
+
*/
|
|
48
|
+
container?: DockerContainer;
|
|
49
|
+
/**
|
|
50
|
+
* Docker image to use for auto-creation (e.g. `"ubuntu:22.04"`).
|
|
51
|
+
* Required when `container` is omitted; ignored when `container` is provided.
|
|
52
|
+
*/
|
|
53
|
+
image?: string;
|
|
54
|
+
/** Command to run in the auto-created container (default: `["sleep", "infinity"]`). */
|
|
55
|
+
cmd?: string[];
|
|
56
|
+
/** Environment variables for the auto-created container. */
|
|
57
|
+
env?: string[];
|
|
58
|
+
/** Extra options passed to dockerode `createContainer`. */
|
|
59
|
+
dockerOptions?: Record<string, unknown>;
|
|
60
|
+
/** Working directory inside the container. */
|
|
61
|
+
cwd?: string;
|
|
62
|
+
/** Default timeout (ms) for shell commands. */
|
|
63
|
+
defaultTimeout?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create a `Sandbox` backed by a Docker container.
|
|
67
|
+
* Requires `dockerode` as an optional peer dependency.
|
|
68
|
+
*
|
|
69
|
+
* **Auto-creation:** When `container` is omitted and `image` is provided,
|
|
70
|
+
* the container is created and started lazily on the first `init()` call.
|
|
71
|
+
* The container ID is available through `sandboxId()` for session
|
|
72
|
+
* persistence. Pass the stored ID back through `init(storedId)` to
|
|
73
|
+
* reattach to an existing container on resume.
|
|
74
|
+
*
|
|
75
|
+
* **Explicit container:** When `container` is provided, `init()` binds
|
|
76
|
+
* it immediately. `dispose()` is a no-op — the caller owns the
|
|
77
|
+
* container's lifecycle.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* // Auto-create from image
|
|
82
|
+
* const sandbox = DockerSandbox({ image: "ubuntu:22.04", cwd: "/workspace" });
|
|
83
|
+
*
|
|
84
|
+
* // Explicit container (lifecycle managed externally)
|
|
85
|
+
* const sandbox = DockerSandbox({ container: myDockerodeContainer });
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
declare function DockerSandbox(opts: DockerSandboxOptions): Sandbox;
|
|
89
|
+
|
|
90
|
+
interface DockerFsOptions {
|
|
91
|
+
/** A dockerode Container instance for the target container. */
|
|
92
|
+
container: DockerContainer;
|
|
93
|
+
/** Working directory for relative path resolution (default: /). */
|
|
94
|
+
workingDir?: string;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* VirtualFs backed by file operations inside a Docker container.
|
|
98
|
+
*
|
|
99
|
+
* Uses `container.exec()` to run filesystem commands (cat, tee, rm, mkdir,
|
|
100
|
+
* stat, etc.) inside the container. File writes use exec + tee to avoid
|
|
101
|
+
* tar archive overhead for text content.
|
|
102
|
+
*
|
|
103
|
+
* Requires `dockerode` as an optional peer dependency.
|
|
104
|
+
* The user is responsible for container lifecycle.
|
|
105
|
+
*/
|
|
106
|
+
declare class DockerFs implements VirtualFs {
|
|
107
|
+
private container;
|
|
108
|
+
private workingDir;
|
|
109
|
+
constructor(opts: DockerFsOptions);
|
|
110
|
+
private resolvePath;
|
|
111
|
+
private exec;
|
|
112
|
+
readFile(path: string, _opts?: ReadOptions): Promise<string>;
|
|
113
|
+
readFileBytes(path: string, maxBytes?: number): Promise<Buffer>;
|
|
114
|
+
writeFile(path: string, content: string): Promise<void>;
|
|
115
|
+
appendFile(path: string, content: string): Promise<void>;
|
|
116
|
+
deleteFile(path: string, opts?: {
|
|
117
|
+
recursive?: boolean;
|
|
118
|
+
}): Promise<void>;
|
|
119
|
+
mkdir(path: string, opts?: {
|
|
120
|
+
recursive?: boolean;
|
|
121
|
+
}): Promise<void>;
|
|
122
|
+
readdir(path: string, _opts?: {
|
|
123
|
+
recursive?: boolean;
|
|
124
|
+
}): Promise<FileEntry[]>;
|
|
125
|
+
exists(path: string): Promise<boolean>;
|
|
126
|
+
stat(path: string): Promise<FileStat>;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export { DockerComputer, type DockerComputerOptions, type DockerContainer, DockerFs, type DockerFsOptions, DockerSandbox, type DockerSandboxOptions };
|