@bunny-agent/sdk 0.10.0-beta.3 → 0.10.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { BunnyAgentOptions, SandboxAdapter, ToolRef, McpConfig, RunnerSpec } from '@bunny-agent/manager';
2
- export { DEFAULT_BUNNY_AGENT_DAEMON_URL, IsBunnyAgentDaemonHealthyOptions, McpConfig, McpHttpServerConfig, McpLifecycle, McpServerConfig, McpServerOptions, McpSettings, McpStdioServerConfig, Message, RunnerEnvParams, RunnerType, SandboxAdapter, SandboxHandle, ToolRuntime, TranscriptEntry, buildRunnerEnv, isBunnyAgentDaemonHealthy } from '@bunny-agent/manager';
1
+ import { BunnyAgentOptions, SandboxAdapter, ToolRef, McpConfig, RunControl, RunnerSpec } from '@bunny-agent/manager';
2
+ export { DEFAULT_BUNNY_AGENT_DAEMON_URL, IsBunnyAgentDaemonHealthyOptions, McpConfig, McpHttpServerConfig, McpLifecycle, McpServerConfig, McpServerOptions, McpSettings, McpStdioServerConfig, Message, RunControl, RunnerEnvParams, RunnerType, SandboxAdapter, SandboxHandle, ToolRuntime, TranscriptEntry, buildRunnerEnv, isBunnyAgentDaemonHealthy } from '@bunny-agent/manager';
3
3
  export { LocalMachine, LocalMachineOptions, LocalSandbox, LocalSandboxOptions } from '@bunny-agent/sandbox-local';
4
4
  export { SrtIsolationOptions, SrtSandbox, SrtSandboxOptions } from '@bunny-agent/sandbox-srt';
5
5
  import { LanguageModelV3StreamPart, LanguageModelV3, LanguageModelV3CallOptions, LanguageModelV3GenerateResult, LanguageModelV3StreamResult, ProviderV3, EmbeddingModelV3, ImageModelV3, JSONValue, LanguageModelV3Usage } from '@ai-sdk/provider';
@@ -193,6 +193,20 @@ interface BunnyAgentProviderSettings extends Omit<BunnyAgentOptions, "runner" |
193
193
  * Ignored by runners other than `pi`.
194
194
  */
195
195
  systemEnv?: Record<string, string>;
196
+ /**
197
+ * Opt-in live steering control channel (PUL-355). When set, the host
198
+ * daemon registers the active run under `control.runId` so a caller
199
+ * holding `control.token` can later POST `/api/coding/control` against
200
+ * that same daemon to steer the live session at a safe tool/turn
201
+ * boundary. The token is caller-generated (never issued by the daemon)
202
+ * and must carry at least 32 bytes of entropy before encoding.
203
+ *
204
+ * Only takes effect on the `daemonUrl` HTTP transport, and only the `pi`
205
+ * runner currently wires it through to a real session — other runners'
206
+ * capabilities probe reports `supportedPiSteer: false`. Ignored entirely
207
+ * on the CLI fallback transport (no daemon to host the control channel).
208
+ */
209
+ control?: RunControl;
196
210
  }
197
211
  /**
198
212
  * Model identifier: user passes whatever the runner expects (e.g. Claude model id, Pi model id).
package/dist/index.js CHANGED
@@ -1021,7 +1021,8 @@ var BunnyAgentLanguageModel = class _BunnyAgentLanguageModel {
1021
1021
  ...toolRefs && toolRefs.length > 0 ? { toolRefs } : {},
1022
1022
  ...this.options.mcpConfig ? { mcpConfig: this.options.mcpConfig } : {},
1023
1023
  ...this.options.effort ? { effort: this.options.effort } : {},
1024
- ...runner.searchContractVersion !== void 0 ? { searchContractVersion: runner.searchContractVersion } : {}
1024
+ ...runner.searchContractVersion !== void 0 ? { searchContractVersion: runner.searchContractVersion } : {},
1025
+ ...this.options.control ? { control: this.options.control } : {}
1025
1026
  };
1026
1027
  }
1027
1028
  buildStreamResult(bytesStream, messages, signal) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/provider/bunny-agent-language-model.ts","../src/provider/logging.ts","../src/provider/search-contract-ai-sdk.ts","../src/provider/search-contract-discovery.ts","../src/provider/tool-refs.ts","../src/provider/usage.ts","../src/provider/bunny-agent-provider.ts","../src/provider/question-processor.ts"],"sourcesContent":["/**\n * @bunny-agent/sdk\n *\n * BunnyAgent SDK - AI Provider and React hooks for building AI chat interfaces.\n *\n * Main entry point exports the AI provider (backend).\n * React hooks are available via \"@bunny-agent/sdk/react\".\n *\n * @example\n * ```typescript\n * // Backend - Provider\n * import { createBunnyAgent } from \"@bunny-agent/sdk\";\n * const bunnyAgent = createBunnyAgent({ sandbox, env });\n * const model = bunnyAgent(\"sonnet\");\n *\n * // Frontend - React hooks\n * import { useBunnyAgentChat } from \"@bunny-agent/sdk/react\";\n * const { messages, sendMessage } = useBunnyAgentChat({ apiEndpoint: \"/api/ai\" });\n * ```\n */\n\nexport type {\n IsBunnyAgentDaemonHealthyOptions,\n RunnerEnvParams,\n RunnerType,\n} from \"@bunny-agent/manager\";\n// Re-export env helpers\nexport {\n buildRunnerEnv,\n DEFAULT_BUNNY_AGENT_DAEMON_URL,\n isBunnyAgentDaemonHealthy,\n} from \"@bunny-agent/manager\";\nexport type {\n LocalMachineOptions,\n LocalSandboxOptions,\n} from \"@bunny-agent/sandbox-local\";\n// Re-export the local adapters for convenience (LocalSandbox is the\n// deprecated pre-rename alias of LocalMachine)\nexport { LocalMachine, LocalSandbox } from \"@bunny-agent/sandbox-local\";\nexport type {\n SrtIsolationOptions,\n SrtSandboxOptions,\n} from \"@bunny-agent/sandbox-srt\";\nexport { SrtSandbox } from \"@bunny-agent/sandbox-srt\";\nexport type {\n ArtifactProcessor,\n ArtifactResult,\n BunnyAgentLanguageModelOptions,\n BunnyAgentModelId,\n BunnyAgentProvider,\n BunnyAgentProviderSettings,\n CompactionEvent,\n // Re-exports from @ai-sdk/provider\n LanguageModelV3StreamPart,\n Logger,\n McpConfig,\n McpHttpServerConfig,\n McpLifecycle,\n McpServerConfig,\n McpServerOptions,\n McpSettings,\n McpStdioServerConfig,\n Message,\n Question,\n // Re-exports from @bunny-agent/manager\n SandboxAdapter,\n SandboxHandle,\n StreamWriter,\n SubmitAnswerOptions,\n SubmitAnswerParams,\n ToolRuntime,\n TranscriptEntry,\n} from \"./provider\";\n// Provider exports\nexport {\n BunnyAgentLanguageModel,\n bunnyHttpTool,\n bunnySandboxTool,\n createBunnyAgent,\n getBunnyAgentMetadata,\n getBunnyAgentUsage,\n submitAnswer,\n} from \"./provider\";\n\nexport const VERSION = \"0.1.0\";\n","import type {\n JSONValue,\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3Usage,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport {\n type AgentTurnInputV1,\n BunnyAgent,\n type BunnyAgentCodingRunBody,\n type Message,\n type RunnerSpec,\n SandboxExecError,\n type SandboxHandle,\n streamCodingRunFromSandbox,\n type ToolRef,\n} from \"@bunny-agent/manager\";\nimport type { SearchContractCapabilities } from \"../contracts\";\nimport {\n isSafeHttpUrl,\n isSearchContractCapabilities,\n isValidCitationContractMetadata,\n} from \"../contracts\";\nimport { getProviderLogger } from \"./logging\";\nimport { assertSearchContractAiSdkSupport } from \"./search-contract-ai-sdk\";\nimport {\n discoverPiSearchContract,\n waitForSearchDiscovery,\n} from \"./search-contract-discovery\";\nimport { compileToolRefsFromLanguageModelTools } from \"./tool-refs\";\nimport type {\n BunnyAgentModelId,\n BunnyAgentProviderSettings,\n Logger,\n} from \"./types\";\nimport { normalizeBunnyAgentUsage } from \"./usage\";\n\n/**\n * Options for creating a BunnyAgent language model instance.\n */\nexport interface BunnyAgentLanguageModelOptions {\n id: BunnyAgentModelId;\n options: BunnyAgentProviderSettings & { runner: RunnerSpec };\n}\n\n/** Format error so message and cause chain are visible (e.g. includes \"Fatal error: ...\" from runner). */\nfunction formatErrorForLog(error: unknown): string {\n if (error instanceof Error) {\n const parts = [error.message];\n let cause: unknown = error.cause;\n while (cause instanceof Error) {\n parts.push(cause.message);\n cause = cause.cause;\n }\n return parts.join(\" | cause: \");\n }\n return String(error);\n}\n\n/** Bridge async iterable (sandbox exec / curl) to Web ReadableStream for SSE parsing. */\nfunction asyncIterableToReadableStream(\n iterable: AsyncIterable<Uint8Array>,\n): ReadableStream<Uint8Array> {\n const iterator = iterable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n while (true) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n if (value.byteLength > 0) {\n controller.enqueue(value);\n return;\n }\n }\n } catch (error) {\n const isAbort =\n (error instanceof Error && error.name === \"AbortError\") ||\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && /abort/i.test(error.message));\n if (isAbort) {\n controller.close();\n } else {\n controller.error(error);\n }\n }\n },\n async cancel(reason) {\n await iterator.return?.(reason);\n },\n });\n}\n\nfunction mergeToolRefs(\n staticToolRefs: ToolRef[] | undefined,\n callToolRefs: ToolRef[] | undefined,\n): ToolRef[] | undefined {\n const merged = [...(staticToolRefs ?? []), ...(callToolRefs ?? [])];\n return merged.length > 0 ? merged : undefined;\n}\n\nfunction getCurrentTurnStart(messages: Message[]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role !== \"user\") return i + 1;\n }\n return 0;\n}\n\nasync function resolveImageData(\n data: string,\n declaredMediaType: string,\n): Promise<{ data: string; mediaType: string }> {\n if (!declaredMediaType.startsWith(\"image/\")) {\n throw new Error(\n `Unsupported BunnyAgent file media type: ${declaredMediaType}`,\n );\n }\n const dataUrl = /^data:([^;,]+);base64,(.+)$/s.exec(data);\n if (dataUrl) {\n if (!dataUrl[1].startsWith(\"image/\")) {\n throw new Error(\n `Unsupported BunnyAgent data URL media type: ${dataUrl[1]}`,\n );\n }\n return { mediaType: dataUrl[1], data: dataUrl[2] };\n }\n if (/^https?:\\/\\//i.test(data)) {\n const response = await fetch(data, { redirect: \"follow\" });\n if (!response.ok) {\n throw new Error(\n `Unable to fetch BunnyAgent image: HTTP ${response.status}`,\n );\n }\n const contentLength = Number(response.headers.get(\"content-length\") ?? 0);\n if (contentLength > 20 * 1024 * 1024) {\n throw new Error(\"BunnyAgent image exceeds the 20 MiB limit\");\n }\n const mediaType =\n response.headers.get(\"content-type\")?.split(\";\")[0] ?? declaredMediaType;\n if (!mediaType.startsWith(\"image/\")) {\n throw new Error(`Fetched BunnyAgent asset is not an image: ${mediaType}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.byteLength > 20 * 1024 * 1024) {\n throw new Error(\"BunnyAgent image exceeds the 20 MiB limit\");\n }\n return { mediaType, data: Buffer.from(bytes).toString(\"base64\") };\n }\n return { mediaType: declaredMediaType, data };\n}\n\nexport async function compileMessagesToAgentInput(\n messages: Message[],\n includeHistory: boolean,\n): Promise<AgentTurnInputV1> {\n const selected = includeHistory\n ? messages\n : messages.slice(getCurrentTurnStart(messages));\n const text: string[] = [];\n const assets: AgentTurnInputV1[\"input\"] = [];\n let imageNumber = 0;\n\n for (const message of selected) {\n if (includeHistory) {\n const role = message.role[0].toUpperCase() + message.role.slice(1);\n text.push(`${role}: `);\n }\n const parts =\n typeof message.content === \"string\"\n ? [{ type: \"text\" as const, text: message.content }]\n : message.content;\n for (const part of parts) {\n if (part.type === \"text\") {\n text.push(part.text);\n continue;\n }\n imageNumber += 1;\n const label = `[Image #${imageNumber}]`;\n const resolved = await resolveImageData(part.data, part.mimeType);\n if (!text.join(\"\").endsWith(label)) text.push(label);\n assets.push({\n type: \"asset\",\n id: `image-${imageNumber}`,\n label,\n asset: resolved,\n });\n }\n text.push(\"\\n\\n\");\n }\n\n return {\n version: 1,\n input: [...assets, { type: \"text\", text: text.join(\"\").trimEnd() }],\n capabilities: [],\n execution: {\n resolvedBy: \"server\",\n skills: [],\n integrations: [],\n references: [],\n capabilityKeys: [],\n extensionVersions: {},\n },\n };\n}\n\nfunction createEmptyUsage(): LanguageModelV3Usage {\n return {\n inputTokens: {\n total: 0,\n noCache: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n outputTokens: {\n total: 0,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n}\n\nfunction readToolDynamicFlag(parsed: Record<string, unknown>): boolean {\n if (typeof parsed.dynamic === \"boolean\") {\n return parsed.dynamic;\n }\n return parsed.providerExecuted === true;\n}\n\nfunction mergeProviderMetadata(\n previous: SharedV3ProviderMetadata | undefined,\n next: SharedV3ProviderMetadata | undefined,\n): SharedV3ProviderMetadata {\n const merged = { ...previous };\n for (const [provider, fields] of Object.entries(next ?? {})) {\n merged[provider] = { ...merged[provider], ...fields };\n }\n return merged;\n}\n\n/**\n * BunnyAgent Language Model implementation for AI SDK.\n */\nexport class BunnyAgentLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n readonly provider: string;\n readonly modelId: string;\n readonly supportedUrls: Record<string, RegExp[]> = {\n \"image/*\": [/.*/],\n };\n\n readonly settings: BunnyAgentProviderSettings & { runner: RunnerSpec };\n private readonly options: BunnyAgentProviderSettings & { runner: RunnerSpec };\n private readonly logger: Logger;\n private sessionId: string | undefined;\n private toolNameMap: Map<string, string> = new Map();\n private legacyTextPartCounter = 0;\n private receivedFinish = false;\n private activeReasoningPartId: string | undefined;\n private acknowledgedSearchContract: SearchContractCapabilities | undefined;\n /** Defense in depth: the runner already dedupes per emitted source, but a\n * duplicate `source-url` event must never reach the UI as two source parts. */\n private emittedSourceIds: Set<string> = new Set();\n private readonly completedTextIds = new Set<string>();\n private readonly completedToolIds = new Set<string>();\n private readonly textById = new Map<string, string>();\n private readonly textMetadata = new Map<string, SharedV3ProviderMetadata>();\n private readonly toolMetadata = new Map<string, SharedV3ProviderMetadata>();\n private readonly pendingSources = new Map<string, Record<string, unknown>>();\n private readonly citedSources = new Map<\n string,\n { url: string; title: string }\n >();\n private messageMetadata: Record<string, JSONValue> = {};\n private readonly seenMessageMetadata = new Set<string>();\n private readonly seenStreamErrors = new Set<string>();\n\n /** Merge every provider namespace while retaining negotiated request facts. */\n private partMetadata(\n raw: unknown,\n textPartId?: string,\n ): SharedV3ProviderMetadata {\n const metadata = mergeProviderMetadata(\n textPartId === undefined ? undefined : this.textMetadata.get(textPartId),\n raw && typeof raw === \"object\"\n ? (raw as SharedV3ProviderMetadata)\n : undefined,\n );\n const { searchContract: _untrustedAcknowledgement, ...bunnyMetadata } =\n metadata[\"bunny-agent\"] ?? {};\n const result: SharedV3ProviderMetadata = {\n ...metadata,\n \"bunny-agent\": {\n ...this.messageMetadata,\n ...bunnyMetadata,\n ...(this.sessionId ? { sessionId: this.sessionId } : {}),\n ...(textPartId !== undefined ? { textPartId } : {}),\n ...(this.acknowledgedSearchContract\n ? {\n searchContract: this\n .acknowledgedSearchContract as unknown as JSONValue,\n }\n : {}),\n },\n };\n if (textPartId !== undefined) this.textMetadata.set(textPartId, result);\n return result;\n }\n\n private toolPartMetadata(\n parsed: Record<string, unknown>,\n ): SharedV3ProviderMetadata {\n const id = parsed.toolCallId as string;\n const metadata = mergeProviderMetadata(\n this.toolMetadata.get(id),\n this.partMetadata(parsed.providerMetadata),\n );\n this.toolMetadata.set(id, metadata);\n return metadata;\n }\n\n private emitCitedSource(sourceId: string): LanguageModelV3StreamPart[] {\n const source = this.pendingSources.get(sourceId);\n const cited = this.citedSources.get(sourceId);\n if (\n !source ||\n !cited ||\n this.emittedSourceIds.has(sourceId) ||\n typeof source.url !== \"string\" ||\n !isSafeHttpUrl(source.url) ||\n new URL(source.url).href !== new URL(cited.url).href\n )\n return [];\n this.emittedSourceIds.add(sourceId);\n return [\n {\n type: \"source\",\n sourceType: \"url\",\n id: sourceId,\n url: source.url,\n title: cited.title,\n ...(source.providerMetadata\n ? { providerMetadata: this.partMetadata(source.providerMetadata) }\n : {}),\n },\n ];\n }\n\n private logUnparsedStreamLine(candidate: string, error: unknown): void {\n const trimmed = candidate.trim();\n if (!trimmed) return;\n const looksLikeError = /\\b(error|failed|exception|traceback|fatal)\\b/i.test(\n trimmed,\n );\n const snippet = trimmed.slice(0, 500);\n const msg = error instanceof Error ? error.message : String(error);\n if (looksLikeError) {\n this.logger.error(\n `[bunny-agent] Unparsed stream line (likely runner error): ${snippet} | parser: ${msg}`,\n );\n } else {\n // Not obviously an error, but still worth surfacing — a silently\n // dropped line here is exactly how a stream can stall with no\n // \"finish\"/\"error\" part and no visible feedback to the user.\n this.logger.debug(\n `[bunny-agent] Unparsed stream line: ${snippet} | parser: ${msg}`,\n );\n }\n }\n\n constructor(modelOptions: BunnyAgentLanguageModelOptions) {\n this.modelId = modelOptions.id;\n this.settings = modelOptions.options;\n this.options = modelOptions.options;\n this.logger = getProviderLogger(modelOptions.options);\n this.provider = \"bunny-agent\";\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const { stream, request } = await this.doStream(options);\n const reader = stream.getReader();\n\n const content: LanguageModelV3Content[] = [];\n const warnings: SharedV3Warning[] = [];\n let finishReason: LanguageModelV3FinishReason = {\n unified: \"other\",\n raw: undefined,\n };\n let usage: LanguageModelV3Usage = createEmptyUsage();\n let providerMetadata: SharedV3ProviderMetadata | undefined;\n\n const textParts = new Map<\n string,\n { text: string; providerMetadata?: SharedV3ProviderMetadata }\n >();\n const reasoningParts: Map<string, { text: string }> = new Map();\n const toolInputs: Map<string, { toolName: string; input: string }> =\n new Map();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n switch (value.type) {\n case \"text-start\": {\n textParts.set(value.id, {\n text: \"\",\n providerMetadata: value.providerMetadata,\n });\n break;\n }\n case \"text-delta\": {\n const part = textParts.get(value.id);\n if (part) {\n part.text += value.delta;\n part.providerMetadata = mergeProviderMetadata(\n part.providerMetadata,\n value.providerMetadata,\n );\n }\n break;\n }\n case \"text-end\": {\n const part = textParts.get(value.id);\n if (part) {\n content.push({\n type: \"text\",\n text: part.text,\n providerMetadata: mergeProviderMetadata(\n part.providerMetadata,\n value.providerMetadata,\n ),\n });\n textParts.delete(value.id);\n }\n break;\n }\n case \"reasoning-start\": {\n reasoningParts.set(value.id, { text: \"\" });\n break;\n }\n case \"reasoning-delta\": {\n const part = reasoningParts.get(value.id);\n if (part) {\n part.text += value.delta;\n }\n break;\n }\n case \"reasoning-end\": {\n const part = reasoningParts.get(value.id);\n if (part && part.text.length > 0) {\n content.push({\n type: \"reasoning\",\n text: part.text,\n });\n }\n break;\n }\n case \"tool-input-start\": {\n toolInputs.set(value.id, { toolName: value.toolName, input: \"\" });\n break;\n }\n case \"tool-input-delta\": {\n const tool = toolInputs.get(value.id);\n if (tool) {\n tool.input += value.delta;\n }\n break;\n }\n case \"tool-input-end\": {\n break;\n }\n case \"tool-call\": {\n content.push(value);\n break;\n }\n case \"tool-result\": {\n content.push(value);\n break;\n }\n case \"source\": {\n content.push(value);\n break;\n }\n case \"stream-start\": {\n warnings.push(...value.warnings);\n break;\n }\n case \"error\": {\n // `value.error` type comes from AI SDK and can be `{}`-shaped.\n // Convert it to a readable string safely.\n const message =\n value.error instanceof Error\n ? value.error.message\n : typeof value.error === \"string\"\n ? value.error\n : value.error\n ? String(value.error)\n : \"Unknown error\";\n\n // Surface errors as assistant text + mark finishReason=error.\n content.push({ type: \"text\", text: message });\n finishReason = { unified: \"error\", raw: \"error\" };\n break;\n }\n case \"finish\": {\n finishReason = value.finishReason;\n usage = value.usage;\n providerMetadata = value.providerMetadata;\n break;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return {\n content,\n finishReason,\n usage,\n providerMetadata,\n request,\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n // A model may be reused by overlapping AI SDK calls. All mutable parser,\n // negotiation, identity, and artifact state belongs to this invocation.\n let invocationOptions = this.options;\n let discoveredHandle: SandboxHandle | undefined;\n if (this.options.searchContractVersion === \"auto\") {\n if (!this.options.sandbox) {\n throw new Error(\n \"BunnyAgent language model requires a sandbox adapter (set `sandbox` on the provider).\",\n );\n }\n if (options.abortSignal?.aborted) {\n throw new DOMException(\n \"Search capability discovery aborted.\",\n \"AbortError\",\n );\n }\n let version: 1 | undefined;\n if (this.options.runner.runnerType === \"pi\" && this.options.daemonUrl) {\n discoveredHandle = await waitForSearchDiscovery(\n this.options.sandbox.attach(),\n options.abortSignal,\n );\n version = await discoverPiSearchContract(\n discoveredHandle,\n this.options.daemonUrl,\n {\n cwd: this.options.cwd,\n signal: options.abortSignal,\n },\n );\n }\n invocationOptions = {\n ...this.options,\n runner: { ...this.options.runner, searchContractVersion: version },\n };\n }\n const invocation = new BunnyAgentLanguageModel({\n id: this.modelId,\n options: invocationOptions,\n });\n return invocation.doStreamInvocation(options, discoveredHandle);\n }\n\n private async doStreamInvocation(\n options: LanguageModelV3CallOptions,\n discoveredHandle?: SandboxHandle,\n ): Promise<LanguageModelV3StreamResult> {\n if (this.requestedSearchContractVersion === 1) {\n await assertSearchContractAiSdkSupport();\n }\n const { prompt, abortSignal } = options;\n const messages = this.convertPromptToMessages(prompt);\n\n this.logger.debug(\n `[bunny-agent] Starting stream with ${messages.length} messages`,\n );\n\n const sandbox = this.options.sandbox;\n if (!sandbox) {\n throw new Error(\n \"BunnyAgent language model requires a sandbox adapter (set `sandbox` on the provider).\",\n );\n }\n\n const callToolRefs = compileToolRefsFromLanguageModelTools(options.tools);\n const toolRefs = mergeToolRefs(this.options.toolRefs, callToolRefs);\n\n const daemonUrl = this.options.daemonUrl;\n\n if (daemonUrl) {\n const handle = discoveredHandle ?? (await sandbox.attach());\n const sandboxEnv = sandbox.getEnv?.() ?? {};\n const runnerEnv = { ...sandboxEnv, ...this.options.env };\n const body: BunnyAgentCodingRunBody = {\n ...(await this.buildCodingRunBody(\n messages,\n handle.getWorkdir(),\n toolRefs,\n )),\n ...(Object.keys(runnerEnv).length > 0 ? { env: runnerEnv } : {}),\n ...(this.options.systemEnv &&\n Object.keys(this.options.systemEnv).length > 0\n ? { systemEnv: this.options.systemEnv }\n : {}),\n };\n const execOpts = {\n cwd: this.options.cwd ?? handle.getWorkdir(),\n signal: abortSignal,\n // A coding run lasts as long as the agent works and ends via\n // `abortSignal`. On exec-based sandboxes (LocalMachine), the daemon\n // call would otherwise inherit the default command timeout (5 min)\n // and kill every longer run. Sandock streams natively and ignores it.\n timeout: 0,\n };\n const iterable = streamCodingRunFromSandbox(\n handle,\n daemonUrl,\n body,\n execOpts,\n );\n const bytesStream = asyncIterableToReadableStream(iterable);\n return this.buildStreamResult(bytesStream, messages, abortSignal);\n }\n\n const sandboxEnv = sandbox.getEnv?.() ?? {};\n const sandboxWorkdir =\n this.options.cwd ?? sandbox.getWorkdir?.() ?? \"/workspace\";\n\n // CLI fallback path: each `bunny-agent run` invocation is single-request /\n // single-tenant, so the runner's `process.env` IS the expected bash\n // environment. We therefore merge env + systemEnv into one map and let\n // sandbox.exec inject everything. Pi's bash tool inherits this via its\n // default `ctx.env`, so no JSON-payload channel is needed.\n const agent = new BunnyAgent({\n sandbox,\n runner: this.options.runner,\n env: {\n ...sandboxEnv,\n ...this.options.env,\n ...(this.options.systemEnv ?? {}),\n },\n });\n\n try {\n const input = await compileMessagesToAgentInput(\n messages,\n !(this.options.resume ?? this.options.forkFrom),\n );\n const bytesStream = await agent.stream({\n messages,\n input,\n workspace: {\n path: sandboxWorkdir,\n },\n resume: this.options.resume,\n forkFrom: this.options.forkFrom,\n signal: abortSignal,\n ...(toolRefs && toolRefs.length > 0 ? { toolRefs } : {}),\n ...(this.options.mcpConfig\n ? { mcpConfig: this.options.mcpConfig }\n : {}),\n });\n return this.buildStreamResult(bytesStream, messages, abortSignal);\n } catch (error) {\n await agent.destroy().catch(() => {});\n if (error instanceof SandboxExecError) {\n const bytesStream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.error(error);\n },\n });\n return this.buildStreamResult(bytesStream, messages, abortSignal);\n }\n throw error;\n }\n }\n\n /** The `searchContractVersion` explicitly requested for this turn, if any (never a process-global default). */\n private get requestedSearchContractVersion(): 1 | undefined {\n return this.options.runner.searchContractVersion === 1 ? 1 : undefined;\n }\n\n /**\n * When an explicit v1 selection was requested but the stream reached a\n * normal finish without ever delivering a `searchContract` acknowledgement\n * (e.g. an older daemon/CLI peer that silently ignores the field), surface\n * a clear error instead of letting the caller believe v1 behavior is\n * active. Never retried automatically — the caller decides whether to\n * retry without the contract.\n */\n private buildMissingAcknowledgementErrorParts(): LanguageModelV3StreamPart[] {\n return [\n {\n type: \"error\",\n error: new Error(\n \"searchContractVersion: 1 was explicitly requested but the runner/daemon never acknowledged support for it (no searchContract capability message received). The peer may be running an older release that silently ignores this option.\",\n ),\n },\n {\n type: \"finish\",\n finishReason: {\n unified: \"error\",\n raw: \"search-contract-unacknowledged\",\n },\n usage: createEmptyUsage(),\n providerMetadata: this.partMetadata(undefined),\n },\n ];\n }\n\n /** Close the open reasoning part, if any (returns the end part to emit). */\n private closeReasoningPart(): LanguageModelV3StreamPart[] {\n if (this.activeReasoningPartId == null) return [];\n const id = this.activeReasoningPartId;\n this.activeReasoningPartId = undefined;\n return [{ type: \"reasoning-end\", id }];\n }\n\n /** Synthesize a terminal error+finish pair for streams that end (EOF or `[DONE]`) without ever emitting a \"finish\" part, so the UI shows an error instead of silently stalling. */\n private buildUnexpectedEndParts(): LanguageModelV3StreamPart[] {\n if (\n this.requestedSearchContractVersion === 1 &&\n this.acknowledgedSearchContract === undefined\n ) {\n return this.buildMissingAcknowledgementErrorParts();\n }\n return [\n {\n type: \"error\",\n error: new Error(\n \"The agent stream ended unexpectedly before completing.\",\n ),\n },\n {\n type: \"finish\",\n finishReason: { unified: \"error\", raw: \"unexpected-stream-end\" },\n usage: createEmptyUsage(),\n providerMetadata: this.partMetadata(undefined),\n },\n ];\n }\n\n private async buildCodingRunBody(\n messages: Message[],\n cwdFallback: string,\n toolRefs: ToolRef[] | undefined,\n ): Promise<BunnyAgentCodingRunBody> {\n const runner = this.options.runner;\n const cwd = this.options.cwd ?? cwdFallback;\n\n const hasRuntimeHistory = Boolean(\n this.options.resume ?? this.options.forkFrom,\n );\n const input = await compileMessagesToAgentInput(\n messages,\n !hasRuntimeHistory,\n );\n\n return {\n runner: runner.runnerType ?? \"claude\",\n model: this.modelId,\n input,\n cwd,\n resume: this.options.resume,\n forkFrom: this.options.forkFrom,\n systemPrompt: this.options.systemPrompt ?? runner.systemPrompt,\n maxTurns: this.options.maxTurns ?? runner.maxTurns,\n allowedTools: runner.allowedTools ?? this.options.allowedTools,\n skillPaths: runner.skillPaths ?? this.options.skillPaths,\n // Hosted Pi integrations historically execute regular tools immediately.\n // Keep that compatibility unless the host explicitly opts into approvals;\n // the runner CLI still owns its separate non-yolo default.\n yolo:\n this.options.yolo ?? (runner.runnerType === \"pi\" ? true : undefined),\n ...(toolRefs && toolRefs.length > 0 ? { toolRefs } : {}),\n ...(this.options.mcpConfig ? { mcpConfig: this.options.mcpConfig } : {}),\n ...(this.options.effort ? { effort: this.options.effort } : {}),\n ...(runner.searchContractVersion !== undefined\n ? { searchContractVersion: runner.searchContractVersion }\n : {}),\n };\n }\n\n private buildStreamResult(\n bytesStream: ReadableStream<Uint8Array>,\n messages: Message[],\n signal?: AbortSignal,\n ): LanguageModelV3StreamResult {\n const reader = bytesStream.getReader();\n\n return {\n stream: this.createLanguageModelStreamFromSseReader(reader, signal),\n request: {\n body: JSON.stringify({ messages }),\n },\n };\n }\n\n private createLanguageModelStreamFromSseReader(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal?: AbortSignal,\n ): ReadableStream<LanguageModelV3StreamPart> {\n const self = this;\n\n return new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n try {\n let buffer = \"\";\n // One decoder per stream in streaming mode: a multi-byte UTF-8\n // character (CJK, emoji) split across two network chunks must not be\n // decoded half-and-half into U+FFFD replacement characters.\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n buffer += decoder.decode();\n if (buffer.trim()) {\n const parts = self.parseSSEBuffer(buffer);\n for (const part of parts) {\n controller.enqueue(part);\n }\n }\n if (!self.receivedFinish && !signal?.aborted) {\n for (const part of self.buildUnexpectedEndParts()) {\n controller.enqueue(part);\n }\n }\n controller.close();\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n let foundDone = false;\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine || trimmedLine.startsWith(\":\")) continue;\n const candidate = line.startsWith(\"data: \")\n ? line.slice(6)\n : trimmedLine;\n if (candidate === \"[DONE]\") {\n foundDone = true;\n continue;\n }\n\n try {\n const parts = self.parseSSEData(candidate);\n for (const part of parts) {\n controller.enqueue(part);\n\n if (self.sessionId) {\n const sessionId: string = self.sessionId;\n\n if (self.options.artifactProcessors?.length) {\n for (const processor of self.options.artifactProcessors) {\n Promise.resolve()\n .then(() => processor.onChange(part, sessionId))\n .catch((e) => {\n self.logger.error(\n `[bunny-agent] Artifact processor error: ${e}`,\n );\n });\n }\n }\n }\n }\n } catch (e) {\n // daemon /api/coding/run or CLI runner may emit plain text lines.\n self.logUnparsedStreamLine(candidate, e);\n }\n }\n\n if (foundDone) {\n if (!self.receivedFinish && !signal?.aborted) {\n for (const part of self.buildUnexpectedEndParts()) {\n controller.enqueue(part);\n }\n }\n controller.close();\n return;\n }\n }\n } catch (error) {\n const isAbort =\n (error instanceof Error && error.name === \"AbortError\") ||\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error &&\n \"code\" in error &&\n error.code === \"aborted\");\n if (isAbort) {\n self.logger.info(\"[bunny-agent] Stream aborted by user\");\n controller.close();\n } else {\n self.logger.error(\n `[bunny-agent] Stream error: ${formatErrorForLog(error)}`,\n );\n // Process completion is authoritative even after a protocol finish.\n // Surface a trailing execution failure without duplicating finish.\n controller.enqueue({ type: \"error\", error });\n if (!self.receivedFinish) {\n self.receivedFinish = true;\n for (const part of self.closeReasoningPart())\n controller.enqueue(part);\n controller.enqueue({\n type: \"finish\",\n finishReason: { unified: \"error\", raw: \"execution-error\" },\n usage: createEmptyUsage(),\n });\n }\n controller.close();\n }\n }\n },\n\n cancel() {\n reader.cancel();\n },\n });\n }\n\n private parseSSEBuffer(buffer: string): LanguageModelV3StreamPart[] {\n const parts: LanguageModelV3StreamPart[] = [];\n const lines = buffer.split(\"\\n\");\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine || trimmedLine.startsWith(\":\")) continue;\n const candidate = line.startsWith(\"data: \") ? line.slice(6) : trimmedLine;\n if (candidate === \"[DONE]\") continue;\n try {\n const parsedParts = this.parseSSEData(candidate);\n parts.push(...parsedParts);\n } catch (e) {\n this.logUnparsedStreamLine(candidate, e);\n }\n }\n\n return parts;\n }\n\n private parseSSEData(data: string): LanguageModelV3StreamPart[] {\n const parts: LanguageModelV3StreamPart[] = [];\n const parsed = JSON.parse(data) as Record<string, unknown>;\n const parsedType =\n typeof parsed.type === \"string\" ? parsed.type : undefined;\n if (\n this.receivedFinish &&\n parsedType !== \"error\" &&\n !(!parsedType && typeof parsed.error === \"string\")\n )\n return parts;\n\n // daemon NDJSON errors may arrive as: {\"error\":\"...\"} (without type)\n if (!parsedType && typeof parsed.error === \"string\") {\n if (this.seenStreamErrors.has(parsed.error)) return parts;\n this.seenStreamErrors.add(parsed.error);\n return [\n {\n type: \"error\",\n error: new Error(parsed.error),\n },\n ];\n }\n\n switch (parsedType) {\n case \"start\": {\n break;\n }\n\n // Backward-compatible NDJSON chunk from daemon tests/mock runners.\n case \"text\": {\n const text = typeof parsed.text === \"string\" ? parsed.text : \"\";\n if (text.length > 0) {\n const id = `legacy-text-${++this.legacyTextPartCounter}`;\n parts.push(\n {\n type: \"text-start\",\n id,\n providerMetadata: this.partMetadata(parsed.providerMetadata, id),\n },\n { type: \"text-delta\", id, delta: text },\n {\n type: \"text-end\",\n id,\n providerMetadata: this.partMetadata(parsed.providerMetadata, id),\n },\n );\n }\n break;\n }\n\n case \"message-metadata\": {\n const metadata = parsed.messageMetadata as Record<string, unknown>;\n const key = JSON.stringify(metadata);\n if (this.seenMessageMetadata.has(key)) break;\n this.seenMessageMetadata.add(key);\n if (metadata && typeof metadata === \"object\") {\n const { searchContract: _acknowledgement, ...fields } = metadata;\n this.messageMetadata = {\n ...this.messageMetadata,\n ...fields,\n } as Record<string, JSONValue>;\n }\n if (\n metadata?.sessionId &&\n typeof metadata.sessionId === \"string\" &&\n this.sessionId !== metadata.sessionId\n ) {\n this.sessionId = metadata.sessionId;\n this.logger.debug(\n `[bunny-agent] Session ID extracted: ${this.sessionId}`,\n );\n parts.push({\n type: \"raw\",\n rawValue: this.sessionId,\n });\n }\n if (\n this.requestedSearchContractVersion === 1 &&\n isSearchContractCapabilities(metadata?.searchContract) &&\n this.acknowledgedSearchContract === undefined\n ) {\n this.acknowledgedSearchContract = metadata.searchContract;\n this.logger.debug(\n `[bunny-agent] Search contract acknowledged: ${JSON.stringify(this.acknowledgedSearchContract)}`,\n );\n }\n break;\n }\n\n // Context compaction progress. Delivered out-of-band via the\n // `onCompaction` callback: the AI SDK stream protocol has no part type\n // for it, and it must not become assistant content.\n case \"compaction\": {\n const phase = parsed.phase === \"start\" ? \"start\" : \"end\";\n this.options.onCompaction?.({\n phase,\n ...(typeof parsed.success === \"boolean\"\n ? { success: parsed.success }\n : {}),\n ...(typeof parsed.trigger === \"string\"\n ? { trigger: parsed.trigger }\n : {}),\n ...(typeof parsed.preTokens === \"number\"\n ? { preTokens: parsed.preTokens }\n : {}),\n ...(typeof parsed.postTokens === \"number\"\n ? { postTokens: parsed.postTokens }\n : {}),\n ...(typeof parsed.error === \"string\" ? { error: parsed.error } : {}),\n });\n break;\n }\n\n // Runners (claude/codex) emit reasoning as untagged deltas:\n // {type:\"reasoning\", text}. Wrap them in a synthesized\n // reasoning-start/delta/end part stream for the AI SDK.\n case \"reasoning\": {\n const text =\n typeof parsed.text === \"string\"\n ? parsed.text\n : typeof parsed.delta === \"string\"\n ? parsed.delta\n : \"\";\n if (text.length > 0) {\n if (this.activeReasoningPartId == null) {\n this.activeReasoningPartId = `reasoning-${++this.legacyTextPartCounter}`;\n parts.push({\n type: \"reasoning-start\",\n id: this.activeReasoningPartId,\n });\n }\n parts.push({\n type: \"reasoning-delta\",\n id: this.activeReasoningPartId,\n delta: text,\n });\n }\n break;\n }\n\n case \"text-start\": {\n const id = parsed.id as string;\n if (this.textById.has(id) || this.completedTextIds.has(id)) break;\n this.textById.set(id, \"\");\n parts.push(...this.closeReasoningPart());\n parts.push({\n type: \"text-start\",\n id: parsed.id as string,\n providerMetadata: this.partMetadata(parsed.providerMetadata, id),\n });\n break;\n }\n\n case \"text-delta\": {\n const id = parsed.id as string;\n if (this.completedTextIds.has(id)) break;\n this.textById.set(\n id,\n (this.textById.get(id) ?? \"\") + (parsed.delta as string),\n );\n parts.push({\n type: \"text-delta\",\n id: parsed.id as string,\n delta: parsed.delta as string,\n ...(parsed.providerMetadata\n ? {\n providerMetadata: this.partMetadata(\n parsed.providerMetadata,\n id,\n ),\n }\n : {}),\n });\n break;\n }\n\n case \"text-end\": {\n const id = parsed.id as string;\n if (this.completedTextIds.has(id)) break;\n this.completedTextIds.add(id);\n const rawMetadata = parsed.providerMetadata as\n | Record<string, unknown>\n | undefined;\n const bunnyMetadata = rawMetadata?.[\"bunny-agent\"] as\n | Record<string, unknown>\n | undefined;\n const contract = bunnyMetadata?.citation_contract;\n if (\n this.acknowledgedSearchContract &&\n isValidCitationContractMetadata(contract, {\n text: this.textById.get(id) ?? \"\",\n })\n ) {\n for (const binding of contract.bindings) {\n const annotation = contract.annotations[binding.annotation_index];\n this.citedSources.set(binding.source_id, {\n url: annotation.url,\n title: annotation.title,\n });\n parts.push(...this.emitCitedSource(binding.source_id));\n }\n }\n parts.push({\n type: \"text-end\",\n id: parsed.id as string,\n providerMetadata: this.partMetadata(rawMetadata, id),\n });\n break;\n }\n\n // Terminal per-text citation marker bridge: one `source-url` chunk per\n // actually cited source (never per retrieved-but-uncited result).\n case \"source-url\": {\n const sourceId = parsed.sourceId as string;\n if (\n typeof sourceId !== \"string\" ||\n typeof parsed.url !== \"string\" ||\n !isSafeHttpUrl(parsed.url)\n )\n break;\n if (this.requestedSearchContractVersion === 1) {\n if (!this.pendingSources.has(sourceId))\n this.pendingSources.set(sourceId, parsed);\n parts.push(...this.emitCitedSource(sourceId));\n break;\n }\n if (this.emittedSourceIds.has(sourceId)) break;\n this.emittedSourceIds.add(sourceId);\n parts.push({\n type: \"source\",\n sourceType: \"url\",\n id: sourceId,\n url: parsed.url as string,\n ...(typeof parsed.title === \"string\" ? { title: parsed.title } : {}),\n });\n break;\n }\n\n case \"tool-input-start\": {\n parts.push(...this.closeReasoningPart());\n parts.push({\n type: \"tool-input-start\",\n id: parsed.toolCallId as string,\n toolName: parsed.toolName as string,\n dynamic: readToolDynamicFlag(parsed),\n providerExecuted: parsed.providerExecuted as boolean,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n\n case \"tool-input-delta\": {\n parts.push({\n type: \"tool-input-delta\",\n id: parsed.toolCallId as string,\n delta: parsed.inputTextDelta as string,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"tool-input-end\": {\n parts.push({\n type: \"tool-input-end\",\n id: parsed.toolCallId as string,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"tool-input-available\": {\n const toolCallId = parsed.toolCallId as string;\n const toolName = parsed.toolName as string;\n const input = parsed.input as Record<string, unknown>;\n this.toolNameMap.set(toolCallId, toolName);\n parts.push({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: JSON.stringify(input),\n dynamic: readToolDynamicFlag(parsed),\n providerExecuted: parsed.providerExecuted as boolean,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n\n case \"tool-output-available\": {\n if (this.completedToolIds.has(parsed.toolCallId as string)) break;\n this.completedToolIds.add(parsed.toolCallId as string);\n const toolName = this.toolNameMap.get(parsed.toolCallId as string);\n parts.push({\n type: \"tool-result\",\n toolCallId: parsed.toolCallId as string,\n toolName: toolName ?? \"\",\n result: parsed.output as NonNullable<JSONValue>,\n isError: parsed.isError as boolean,\n dynamic: readToolDynamicFlag(parsed),\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"tool-output-error\": {\n if (this.completedToolIds.has(parsed.toolCallId as string)) break;\n this.completedToolIds.add(parsed.toolCallId as string);\n const toolName = this.toolNameMap.get(parsed.toolCallId as string);\n parts.push({\n type: \"tool-result\",\n toolCallId: parsed.toolCallId as string,\n toolName: toolName ?? \"\",\n result: (parsed.errorText as string) ?? \"Tool execution failed\",\n isError: true,\n dynamic: readToolDynamicFlag(parsed),\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"error\": {\n const message =\n (parsed.errorText as string) ||\n (parsed.error as string) ||\n \"Unknown stream error\";\n if (this.seenStreamErrors.has(message)) break;\n this.seenStreamErrors.add(message);\n parts.push({\n type: \"error\",\n error: new Error(message),\n });\n break;\n }\n\n case \"finish\": {\n this.receivedFinish = true;\n parts.push(...this.closeReasoningPart());\n const rawFinishReason = parsed.finishReason;\n let finishReason: LanguageModelV3FinishReason;\n\n if (\n typeof rawFinishReason === \"object\" &&\n rawFinishReason !== null &&\n \"unified\" in rawFinishReason\n ) {\n finishReason = rawFinishReason as LanguageModelV3FinishReason;\n } else {\n finishReason = this.mapFinishReason(rawFinishReason as string);\n }\n\n // An explicit v1 selection that reaches a non-error finish without\n // ever receiving a `searchContract` acknowledgement means the peer\n // silently ignored the option (e.g. an older daemon/CLI release) —\n // surface that honestly instead of letting the caller assume v1\n // behavior was actually active.\n if (\n this.requestedSearchContractVersion === 1 &&\n this.acknowledgedSearchContract === undefined &&\n finishReason.unified !== \"error\"\n ) {\n parts.push(...this.buildMissingAcknowledgementErrorParts());\n break;\n }\n\n const usage =\n normalizeBunnyAgentUsage(\n (parsed.messageMetadata as Record<string, unknown>) ?? undefined,\n ) ?? createEmptyUsage();\n\n parts.push({\n type: \"finish\",\n finishReason,\n usage,\n providerMetadata: this.partMetadata(\n mergeProviderMetadata(\n parsed.providerMetadata as SharedV3ProviderMetadata | undefined,\n {\n \"bunny-agent\": (parsed.messageMetadata ?? {}) as Record<\n string,\n JSONValue\n >,\n },\n ),\n ),\n });\n break;\n }\n }\n\n return parts;\n }\n\n private convertPromptToMessages(prompt: LanguageModelV3Prompt): Message[] {\n const messages: Message[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\": {\n messages.push({\n role: \"system\",\n content: message.content,\n });\n break;\n }\n\n case \"user\": {\n const parts = message.content\n .map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\" as const, text: part.text };\n }\n if (part.type === \"file\") {\n // LanguageModelV3FilePart: data is Uint8Array | string | URL, mediaType is IANA type\n let dataStr = \"\";\n if (part.data instanceof Uint8Array) {\n dataStr = `data:${part.mediaType};base64,${Buffer.from(part.data).toString(\"base64\")}`;\n } else if (part.data instanceof URL) {\n dataStr = part.data.toString();\n } else if (typeof part.data === \"string\") {\n // Already a data URL or base64 string\n dataStr = part.data;\n }\n return {\n type: \"image\" as const,\n mimeType: part.mediaType || \"image/png\",\n data: dataStr,\n };\n }\n return null;\n })\n .filter(\n (\n p,\n ): p is\n | { type: \"text\"; text: string }\n | { type: \"image\"; mimeType: string; data: string } =>\n p !== null,\n );\n\n if (parts.length > 0) {\n // If only text parts, combine them into a string for cleaner payload, else pass array\n const isAllText = parts.every((p) => p.type === \"text\");\n messages.push({\n role: \"user\",\n content: isAllText\n ? parts\n .map((p) => (p as { type: \"text\"; text: string }).text)\n .join(\"\\n\")\n : parts,\n });\n }\n break;\n }\n\n case \"assistant\": {\n const textParts = message.content\n .filter(\n (part): part is { type: \"text\"; text: string } =>\n part.type === \"text\",\n )\n .map((part) => part.text);\n\n if (textParts.length > 0) {\n messages.push({\n role: \"assistant\",\n content: textParts.join(\"\\n\"),\n });\n }\n break;\n }\n\n case \"tool\": {\n break;\n }\n }\n }\n\n return messages;\n }\n\n private mapFinishReason(\n reason: string | undefined,\n ): LanguageModelV3FinishReason {\n switch (reason) {\n case \"stop\":\n return { unified: \"stop\", raw: reason };\n case \"length\":\n return { unified: \"length\", raw: reason };\n case \"tool_calls\":\n case \"tool-calls\":\n return { unified: \"tool-calls\", raw: reason };\n case \"content_filter\":\n case \"content-filter\":\n return { unified: \"content-filter\", raw: reason };\n case \"error\":\n return { unified: \"error\", raw: reason };\n default:\n return { unified: \"other\", raw: reason ?? \"unknown\" };\n }\n }\n}\n","import type { BunnyAgentProviderSettings, Logger } from \"./types\";\n\n/** Shared logger factory for provider and language model. */\nexport function getProviderLogger(\n settings: Partial<BunnyAgentProviderSettings>,\n): Logger {\n if (settings.logger === false) {\n return {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n };\n }\n\n if (settings.logger) {\n return settings.logger;\n }\n\n const isVerbose = settings.verbose ?? false;\n return {\n debug: (msg) => isVerbose && console.debug(msg),\n info: (msg) => isVerbose && console.info(msg),\n warn: (msg) => console.warn(msg),\n error: (msg) => console.error(msg),\n };\n}\n","import { createRequire } from \"node:module\";\n\n/** The verified AI SDK 6 baseline that preserves result provider metadata. */\nexport const SEARCH_CONTRACT_AI_SDK_MINIMUM = \"6.0.264\";\n\nexport function supportsSearchContractUiMetadata(version: string): boolean {\n const match = /^6\\.(\\d+)\\.(\\d+)(?:\\+[\\w.-]+)?$/.exec(version);\n return !!match && (Number(match[1]) > 0 || Number(match[2]) >= 264);\n}\n\n/**\n * Older AI SDK releases silently discard tool-result provider metadata. V1\n * fails before execution on those peers; version-unspecified calls keep their\n * existing peer range and never invoke this check. Resolve lazily from the\n * backend SDK module so builds do not depend on JSON import attributes.\n */\nexport async function assertSearchContractAiSdkSupport(): Promise<void> {\n let version: unknown;\n try {\n // Resolve the actual consumer peer without import attributes, which an\n // ES2022 bundle can remove even when supplied as a dynamic import option.\n const packageInfo = createRequire(import.meta.url)(\"ai/package.json\") as {\n version?: unknown;\n };\n version = packageInfo.version;\n } catch {\n throw new Error(\n \"Cannot verify the AI SDK peer required by searchContractVersion: 1.\",\n );\n }\n if (\n typeof version !== \"string\" ||\n !supportsSearchContractUiMetadata(version)\n ) {\n throw new Error(\n `searchContractVersion: 1 requires ai >=${SEARCH_CONTRACT_AI_SDK_MINIMUM} <7.0.0 to preserve structured tool-result metadata; found ai@${String(version)}.`,\n );\n }\n}\n","import type { ExecOptions, SandboxHandle } from \"@bunny-agent/manager\";\nimport { isSearchContractCapabilities } from \"../contracts\";\n\nconst CACHE_TTL_MS = 30_000;\nconst PROBE_TIMEOUT_MS = 4_000;\nconst MAX_ENDPOINTS_PER_HANDLE = 16;\nconst MAX_RESPONSE_BYTES = 16_384;\n\ninterface Flight {\n controller: AbortController;\n promise: Promise<1 | undefined>;\n waiters: number;\n settled: boolean;\n}\n\ninterface Entry {\n expiresAt: number;\n version?: 1;\n flight?: Flight;\n}\n\n// A handle belongs to one attached sandbox/transport and carries its auth. The\n// additional ID guards adapters that reuse a handle after sandbox replacement.\n// Weak ownership avoids retaining destroyed handles or their authentication.\nconst cache = new WeakMap<SandboxHandle, Map<string, Entry>>();\n\nfunction abortError(): DOMException {\n return new DOMException(\"Search capability discovery aborted.\", \"AbortError\");\n}\n\n/** Wait independently: one canceled caller must not cancel other subscribers. */\nexport function waitForSearchDiscovery<T>(\n promise: Promise<T>,\n signal?: AbortSignal,\n): Promise<T> {\n if (signal?.aborted) return Promise.reject(abortError());\n if (!signal) return promise;\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(abortError());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(resolve, reject).finally(() => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n });\n}\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** Only a successful, recognizable legacy health document proves old support. */\nfunction parseHealth(text: string): 1 | undefined {\n const status = /\\n(\\d{3})$/.exec(text);\n if (!status || status[1] !== \"200\") {\n throw new Error(\n `Search capability discovery failed (HTTP ${status?.[1] ?? \"unknown\"}).`,\n );\n }\n let health: unknown;\n try {\n health = JSON.parse(text.slice(0, status.index));\n } catch {\n throw new Error(\"Invalid daemon health response during search discovery.\");\n }\n const envelope = object(health);\n const data = object(envelope?.data);\n if (envelope?.ok !== true || data?.status !== \"ok\") {\n throw new Error(\"Invalid daemon health response during search discovery.\");\n }\n if (data.capabilities === undefined) return undefined;\n const capabilities = object(data.capabilities);\n if (!capabilities)\n throw new Error(\"Invalid daemon capability advertisement.\");\n if (capabilities.searchContracts === undefined) return undefined;\n const contracts = object(capabilities.searchContracts);\n if (!contracts)\n throw new Error(\"Invalid daemon search capability advertisement.\");\n if (contracts.pi === undefined) return undefined;\n if (!isSearchContractCapabilities(contracts.pi)) {\n throw new Error(\"Invalid Pi search capability advertisement.\");\n }\n return contracts.pi.structured_retrieval &&\n contracts.pi.explicit_source_marker_annotations\n ? 1\n : undefined;\n}\n\nasync function probe(\n handle: SandboxHandle,\n url: string,\n opts: ExecOptions,\n): Promise<1 | undefined> {\n const decoder = new TextDecoder();\n let text = \"\";\n let bytes = 0;\n try {\n // This is the same sandbox-side transport as the existing health probe.\n // Sandock uses its authenticated shell API; no host-side loopback fetch or\n // coding-run POST is used for discovery, and no credentials enter argv.\n for await (const chunk of handle.exec(\n [\n \"curl\",\n \"-sS\",\n \"--connect-timeout\",\n \"2\",\n \"--max-time\",\n \"4\",\n \"--write-out\",\n \"\\n%{http_code}\",\n \"--url\",\n url,\n ],\n opts,\n )) {\n bytes += chunk.byteLength;\n if (bytes > MAX_RESPONSE_BYTES) {\n throw new Error(\"Daemon capability response exceeds its size limit.\");\n }\n text += decoder.decode(chunk, { stream: true });\n }\n } catch {\n if (opts.signal?.aborted) throw opts.signal.reason ?? abortError();\n throw new Error(\"Search capability discovery transport failed.\");\n }\n text += decoder.decode();\n return parseHealth(text.trimEnd());\n}\n\nasync function join(\n flight: Flight,\n signal?: AbortSignal,\n): Promise<1 | undefined> {\n flight.waiters += 1;\n try {\n return await waitForSearchDiscovery(flight.promise, signal);\n } finally {\n flight.waiters -= 1;\n if (flight.waiters === 0 && !flight.settled) {\n flight.controller.abort(abortError());\n }\n }\n}\n\n/**\n * Negotiate only before execution. Cache healthy new/old results, never errors.\n * In-flight operations stay tracked until actual transport settlement even if\n * an adapter ignores abort, preventing duplicate outstanding sandbox commands.\n */\nexport async function discoverPiSearchContract(\n handle: SandboxHandle,\n daemonUrl: string,\n opts: Pick<ExecOptions, \"cwd\" | \"signal\"> = {},\n): Promise<1 | undefined> {\n if (opts.signal?.aborted) throw abortError();\n const parsed = new URL(daemonUrl);\n if (\n ![\"http:\", \"https:\"].includes(parsed.protocol) ||\n parsed.username ||\n parsed.password ||\n parsed.search ||\n parsed.hash\n ) {\n throw new Error(\"Invalid daemon URL for search capability discovery.\");\n }\n parsed.pathname = `${parsed.pathname.replace(/\\/$/, \"\").replace(/\\/healthz$/, \"\")}/healthz`;\n const url = parsed.href;\n const key = JSON.stringify([handle.getSandboxId(), url]);\n let entries = cache.get(handle);\n if (!entries) {\n entries = new Map();\n cache.set(handle, entries);\n }\n const previous = entries.get(key);\n if (previous?.flight) return join(previous.flight, opts.signal);\n if (previous && previous.expiresAt > Date.now()) return previous.version;\n entries.delete(key);\n for (const [entryKey, entry] of entries) {\n if (!entry.flight && entry.expiresAt <= Date.now())\n entries.delete(entryKey);\n }\n if (entries.size >= MAX_ENDPOINTS_PER_HANDLE) {\n const evictable = [...entries].find(([, entry]) => !entry.flight);\n if (!evictable)\n throw new Error(\"Too many pending daemon capability probes.\");\n entries.delete(evictable[0]);\n }\n\n const controller = new AbortController();\n const entry: Entry = { expiresAt: 0 };\n const flight: Flight = {\n controller,\n promise: Promise.resolve(undefined),\n waiters: 0,\n settled: false,\n };\n entry.flight = flight;\n entries.set(key, entry);\n const timer = setTimeout(() => {\n controller.abort(\n new DOMException(\n \"Search capability discovery timed out.\",\n \"TimeoutError\",\n ),\n );\n }, PROBE_TIMEOUT_MS);\n const operation = probe(handle, url, {\n cwd: opts.cwd ?? handle.getWorkdir(),\n timeout: PROBE_TIMEOUT_MS,\n signal: controller.signal,\n });\n // Keep the entry until the real operation settles, not only until our bounded\n // wait ends. Non-cooperating adapters cannot cause duplicate remote probes.\n operation.then(\n (version) => {\n flight.settled = true;\n clearTimeout(timer);\n if (controller.signal.aborted) entries.delete(key);\n else entries.set(key, { version, expiresAt: Date.now() + CACHE_TTL_MS });\n },\n () => {\n flight.settled = true;\n clearTimeout(timer);\n entries.delete(key);\n },\n );\n flight.promise = new Promise<1 | undefined>((resolve, reject) => {\n const onAbort = () => reject(controller.signal.reason ?? abortError());\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n operation.then(resolve, reject).finally(() => {\n controller.signal.removeEventListener(\"abort\", onAbort);\n });\n });\n return join(flight, opts.signal);\n}\n","import type {\n JSONObject,\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n SharedV3ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type { ToolRef } from \"@bunny-agent/manager\";\nimport type { Tool } from \"ai\";\n\nconst BUNNY_PROVIDER_OPTIONS_KEY = \"bunny-agent\";\n\ntype BunnyProviderOptions = {\n runtime?: JSONObject;\n};\n\ntype BunnyToolRuntime = Extract<\n ToolRef[\"runtime\"],\n { type: \"http\" | \"module\" }\n>;\n\ntype BunnyDynamicTool<INPUT> = Tool<INPUT, unknown> & { type: \"dynamic\" };\n\n/**\n * AI SDK helper for tools that the sandbox runner should call by HTTP.\n *\n * This is still used with the standard AI SDK `streamText`:\n * `import { streamText } from \"ai\"`.\n */\nexport function bunnyHttpTool<INPUT, OUTPUT>(\n input: Omit<Tool<INPUT, OUTPUT>, \"execute\" | \"outputSchema\"> & {\n endpoint: {\n url: string;\n headers?: Record<string, string>;\n };\n },\n): BunnyDynamicTool<INPUT> {\n return {\n type: \"dynamic\" as const,\n description: input.description,\n title: input.title,\n providerOptions: withBunnyProviderOptions(input.providerOptions, {\n runtime: {\n type: \"http\",\n url: input.endpoint.url,\n ...(input.endpoint.headers ? { headers: input.endpoint.headers } : {}),\n },\n }),\n inputSchema: input.inputSchema,\n inputExamples: input.inputExamples,\n needsApproval: input.needsApproval,\n strict: input.strict,\n onInputStart: input.onInputStart,\n onInputDelta: input.onInputDelta,\n onInputAvailable: input.onInputAvailable,\n async execute() {\n throw new Error(\n \"bunnyHttpTool is provider-executed by the sandbox runner.\",\n );\n },\n } satisfies BunnyDynamicTool<INPUT>;\n}\n\n/**\n * AI SDK helper for tools implemented by a module already present in the\n * sandbox filesystem.\n */\nexport function bunnySandboxTool<INPUT, OUTPUT>(\n input: Omit<Tool<INPUT, OUTPUT>, \"execute\" | \"outputSchema\"> & {\n module: string;\n exportName?: string;\n },\n): BunnyDynamicTool<INPUT> {\n return {\n type: \"dynamic\" as const,\n description: input.description,\n title: input.title,\n providerOptions: withBunnyProviderOptions(input.providerOptions, {\n runtime: {\n type: \"module\",\n module: input.module,\n ...(input.exportName ? { exportName: input.exportName } : {}),\n },\n }),\n inputSchema: input.inputSchema,\n inputExamples: input.inputExamples,\n needsApproval: input.needsApproval,\n strict: input.strict,\n onInputStart: input.onInputStart,\n onInputDelta: input.onInputDelta,\n onInputAvailable: input.onInputAvailable,\n async execute() {\n throw new Error(\n \"bunnySandboxTool is provider-executed by the sandbox runner.\",\n );\n },\n } satisfies BunnyDynamicTool<INPUT>;\n}\n\nexport function compileToolRefsFromLanguageModelTools(\n tools:\n | Array<LanguageModelV3FunctionTool | LanguageModelV3ProviderTool>\n | undefined,\n): ToolRef[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n const toolRefs: ToolRef[] = [];\n\n for (const tool of tools) {\n if (tool.type !== \"function\") {\n continue;\n }\n\n const runtime = getBunnyRuntime(tool);\n if (!runtime) {\n throw new Error(\n `[bunny-agent] Tool \"${tool.name}\" was passed through AI SDK streamText, ` +\n \"but Bunny cannot access host-side tool({ execute }) callbacks at the provider boundary. \" +\n \"Use bunnyHttpTool(...) for an endpoint tool or bunnySandboxTool(...) for a sandbox-local module.\",\n );\n }\n\n toolRefs.push({\n name: tool.name,\n description: tool.description ?? \"\",\n inputSchema: tool.inputSchema as Record<string, unknown>,\n runtime,\n });\n }\n\n return toolRefs.length > 0 ? toolRefs : undefined;\n}\n\nfunction getBunnyRuntime(\n tool: LanguageModelV3FunctionTool,\n): BunnyToolRuntime | undefined {\n const options = tool.providerOptions?.[BUNNY_PROVIDER_OPTIONS_KEY] as\n | BunnyProviderOptions\n | undefined;\n const runtime = options?.runtime;\n if (!isRecord(runtime) || typeof runtime.type !== \"string\") {\n return undefined;\n }\n if (runtime.type === \"http\" && typeof runtime.url === \"string\") {\n return {\n type: \"http\",\n url: runtime.url,\n ...(isStringRecord(runtime.headers) ? { headers: runtime.headers } : {}),\n };\n }\n if (runtime.type === \"module\" && typeof runtime.module === \"string\") {\n return {\n type: \"module\",\n module: runtime.module,\n ...(typeof runtime.exportName === \"string\"\n ? { exportName: runtime.exportName }\n : {}),\n };\n }\n return undefined;\n}\n\nfunction withBunnyProviderOptions(\n providerOptions: SharedV3ProviderOptions | undefined,\n bunnyOptions: BunnyProviderOptions,\n): SharedV3ProviderOptions {\n return {\n ...(providerOptions ?? {}),\n [BUNNY_PROVIDER_OPTIONS_KEY]: {\n ...((providerOptions?.[BUNNY_PROVIDER_OPTIONS_KEY] as\n | object\n | undefined) ?? {}),\n ...bunnyOptions,\n },\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!isRecord(value)) return false;\n return Object.values(value).every((entry) => typeof entry === \"string\");\n}\n","import type { JSONValue, LanguageModelV3Usage } from \"@ai-sdk/provider\";\n\ntype JsonRecord = Record<string, JSONValue | undefined>;\n\nfunction asRecord(value: unknown): JsonRecord | undefined {\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as JsonRecord;\n}\n\n/**\n * Extract `providerMetadata[\"bunny-agent\"]` from an AI SDK providerMetadata object.\n */\nexport function getBunnyAgentMetadata(\n providerMetadata: unknown,\n): JsonRecord | undefined {\n const providerMeta = asRecord(providerMetadata);\n if (providerMeta == null) return undefined;\n return asRecord(providerMeta[\"bunny-agent\"]);\n}\n\n/**\n * Extract Bunny Agent usage payload from an AI SDK providerMetadata object.\n *\n * This returns the raw usage object emitted by Bunny Agent stream metadata,\n * e.g. `{ input_tokens, output_tokens, cache_read_input_tokens, ... }`.\n */\nexport function getBunnyAgentUsage(\n providerMetadata: unknown,\n): LanguageModelV3Usage | undefined {\n const bunnyMeta = getBunnyAgentMetadata(providerMetadata);\n if (bunnyMeta == null) return undefined;\n return normalizeBunnyAgentUsage(bunnyMeta);\n}\n\n/**\n * Convert Bunny Agent usage metadata to AI SDK standard usage shape.\n *\n * Accepts either:\n * - a metadata object that contains `usage` plus extra fields (model/cost/image/search)\n * - or a direct usage payload in snake_case token fields.\n *\n * `raw` preserves usage fields and includes extra metadata fields when available.\n */\nexport function normalizeBunnyAgentUsage(\n data: unknown,\n): LanguageModelV3Usage | undefined {\n const dataRecord = asRecord(data);\n if (dataRecord == null) return undefined;\n\n const usageSource = asRecord(dataRecord.usage ?? dataRecord);\n if (usageSource == null) return undefined;\n const hasTokenFields =\n \"input_tokens\" in usageSource ||\n \"output_tokens\" in usageSource ||\n \"cache_read_input_tokens\" in usageSource ||\n \"cache_creation_input_tokens\" in usageSource;\n if (!hasTokenFields) return undefined;\n\n const inputTokens =\n typeof usageSource.input_tokens === \"number\" ? usageSource.input_tokens : 0;\n const outputTokens =\n typeof usageSource.output_tokens === \"number\"\n ? usageSource.output_tokens\n : 0;\n const cacheRead =\n typeof usageSource.cache_read_input_tokens === \"number\"\n ? usageSource.cache_read_input_tokens\n : 0;\n const cacheWrite =\n typeof usageSource.cache_creation_input_tokens === \"number\"\n ? usageSource.cache_creation_input_tokens\n : 0;\n const textTokens =\n typeof usageSource.text_tokens === \"number\"\n ? usageSource.text_tokens\n : undefined;\n const reasoningTokens =\n typeof usageSource.reasoning_tokens === \"number\"\n ? usageSource.reasoning_tokens\n : undefined;\n const extraMetadata = Object.fromEntries(\n Object.entries(dataRecord).filter(([key]) => key !== \"usage\"),\n ) as JsonRecord;\n const raw =\n Object.keys(extraMetadata).length > 0\n ? { ...usageSource, ...extraMetadata }\n : usageSource;\n\n return {\n inputTokens: {\n total: inputTokens + cacheRead + cacheWrite,\n noCache: inputTokens,\n cacheRead,\n cacheWrite,\n },\n outputTokens: {\n total: outputTokens,\n text: textTokens,\n reasoning: reasoningTokens,\n },\n raw,\n };\n}\n","import type {\n EmbeddingModelV3,\n ImageModelV3,\n LanguageModelV3,\n ProviderV3,\n} from \"@ai-sdk/provider\";\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport type { RunnerSpec } from \"@bunny-agent/manager\";\nimport { BunnyAgentLanguageModel } from \"./bunny-agent-language-model\";\nimport { getProviderLogger } from \"./logging\";\nimport type { BunnyAgentModelId, BunnyAgentProviderSettings } from \"./types\";\n\nexport type { BunnyAgentProviderSettings } from \"./types\";\n\n/**\n * BunnyAgent provider interface that extends the AI SDK's ProviderV3.\n */\nexport interface BunnyAgentProvider extends ProviderV3 {\n (\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ): LanguageModelV3;\n\n languageModel(\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ): LanguageModelV3;\n\n chat(\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ): LanguageModelV3;\n\n embeddingModel(modelId: string): EmbeddingModelV3;\n textEmbeddingModel(modelId: string): EmbeddingModelV3;\n imageModel(modelId: string): ImageModelV3;\n}\n\n/**\n * Creates a BunnyAgent provider instance with the specified configuration.\n *\n * @example\n * ```typescript\n * import { createBunnyAgent } from '@bunny-agent/sdk';\n * import { E2BSandbox } from '@bunny-agent/sandbox-e2b';\n * import { generateText } from 'ai';\n *\n * const bunnyAgent = createBunnyAgent({\n * sandbox: new E2BSandbox({ apiKey: process.env.E2B_API_KEY! }),\n * env: {\n * ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY!,\n * },\n * });\n *\n * const { text } = await generateText({\n * model: bunnyAgent('sonnet'),\n * prompt: 'Create a hello world program',\n * });\n * ```\n */\nexport function createBunnyAgent(\n defaultOptions: BunnyAgentProviderSettings,\n): BunnyAgentProvider {\n const logger = getProviderLogger(defaultOptions);\n\n if (!defaultOptions.sandbox) {\n throw new Error(\n \"Provide a `sandbox` adapter (e.g. E2BSandbox, LocalMachine). \" +\n \"Optional `daemonUrl` uses in-sandbox HTTP to bunny-agent-daemon (no automatic `/healthz` probe unless searchContractVersion is `auto`). Use `isBunnyAgentDaemonHealthy` from `@bunny-agent/sdk` if you want to probe and omit `daemonUrl` for CLI fallback. Omit `daemonUrl` to always use CLI.\",\n );\n }\n\n const createModel = (\n modelId: BunnyAgentModelId,\n options: Partial<BunnyAgentProviderSettings> = {},\n ): LanguageModelV3 => {\n const mergedSkillPaths =\n options.skillPaths !== undefined\n ? options.skillPaths\n : defaultOptions.skillPaths;\n\n const mergedAllowedTools =\n options.allowedTools !== undefined\n ? options.allowedTools\n : defaultOptions.allowedTools;\n const searchContractVersion =\n options.searchContractVersion ?? defaultOptions.searchContractVersion;\n\n const runner: RunnerSpec = {\n model: modelId,\n runnerType: options.runnerType ?? defaultOptions.runnerType,\n outputFormat: \"stream\",\n maxTurns: options.maxTurns ?? defaultOptions.maxTurns,\n ...((options.yolo ?? defaultOptions.yolo) !== undefined\n ? { yolo: options.yolo ?? defaultOptions.yolo }\n : {}),\n ...((options.systemPrompt ?? defaultOptions.systemPrompt)\n ? { systemPrompt: options.systemPrompt ?? defaultOptions.systemPrompt }\n : {}),\n ...(mergedSkillPaths && mergedSkillPaths.length > 0\n ? { skillPaths: mergedSkillPaths }\n : {}),\n ...(mergedAllowedTools !== undefined\n ? { allowedTools: mergedAllowedTools }\n : {}),\n ...((options.effort ?? defaultOptions.effort)\n ? {\n effort: options.effort ?? defaultOptions.effort,\n }\n : {}),\n ...(searchContractVersion === 1\n ? { searchContractVersion: 1 as const }\n : {}),\n };\n\n const mergedOptions = {\n ...defaultOptions,\n ...options,\n searchContractVersion,\n runner,\n env: {\n ...defaultOptions.env,\n ...options.env,\n },\n systemEnv:\n defaultOptions.systemEnv || options.systemEnv\n ? {\n ...(defaultOptions.systemEnv ?? {}),\n ...(options.systemEnv ?? {}),\n }\n : undefined,\n artifactProcessors: [\n ...(defaultOptions.artifactProcessors ?? []),\n ...(options.artifactProcessors ?? []),\n ],\n toolRefs:\n options.toolRefs !== undefined\n ? options.toolRefs\n : defaultOptions.toolRefs,\n } as BunnyAgentProviderSettings & { runner: RunnerSpec };\n\n logger.debug(\n `[bunny-agent] Creating model: ${modelId}${runner.runnerType ? ` (runnerType: ${runner.runnerType})` : \"\"}${runner.skillPaths?.length ? ` skillPaths=${runner.skillPaths.length}` : \"\"}`,\n );\n\n return new BunnyAgentLanguageModel({\n id: modelId,\n options: mergedOptions,\n });\n };\n\n const provider = function (\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ) {\n if (new.target) {\n throw new Error(\n \"The BunnyAgent model function cannot be called with the new keyword.\",\n );\n }\n\n return createModel(modelId, options);\n };\n\n provider.languageModel = createModel;\n provider.chat = createModel;\n provider.specificationVersion = \"v3\" as const;\n\n provider.embeddingModel = (modelId: string): EmbeddingModelV3 => {\n throw new NoSuchModelError({\n modelId,\n modelType: \"embeddingModel\",\n });\n };\n\n provider.textEmbeddingModel = (modelId: string): EmbeddingModelV3 => {\n throw new NoSuchModelError({\n modelId,\n modelType: \"embeddingModel\",\n });\n };\n\n provider.imageModel = (modelId: string): ImageModelV3 => {\n throw new NoSuchModelError({\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider as BunnyAgentProvider;\n}\n","import { approvalFileName, type SandboxAdapter } from \"@bunny-agent/manager\";\nimport type { SubmitAnswerParams } from \"./types\";\n\n/**\n * Options for submitAnswer\n */\nexport interface SubmitAnswerOptions {\n /**\n * Optional base path prefix for approval files\n * @default \".bunny-agent/approvals\"\n */\n basePath?: string;\n}\n\n/**\n * Submit user's answer for an AskUserQuestion tool call.\n * Writes the answer file to `.bunny-agent/approvals/{toolCallId}.json` in the sandbox workdir.\n *\n * @example\n * ```typescript\n * import { submitAnswer } from \"@bunny-agent/sdk\";\n *\n * await submitAnswer(sandbox, {\n * toolCallId: \"tool-456\",\n * questions: [...],\n * answers: { \"Question 1\": \"Answer 1\" },\n * });\n * ```\n */\nexport async function submitAnswer(\n sandbox: SandboxAdapter,\n params: SubmitAnswerParams,\n options?: SubmitAnswerOptions,\n): Promise<void> {\n const { toolCallId, questions, answers } = params;\n const basePath = options?.basePath ?? \".bunny-agent/approvals\";\n\n const allAnswered = questions.every(\n (q) => answers[q.question] !== undefined && answers[q.question] !== \"\",\n );\n\n const answerData = {\n questions,\n answers,\n status: allAnswered ? \"completed\" : \"pending\",\n timestamp: new Date().toISOString(),\n };\n\n const filename = approvalFileName(toolCallId);\n const handle = sandbox.getHandle() ?? (await sandbox.attach());\n // Absolute path so remote sandboxes (Sandock) write to the same path the runner reads (/workspace/.bunny-agent/approvals).\n const workdir = handle.getWorkdir();\n const targetDir = workdir\n ? `${workdir.replace(/\\/$/, \"\")}/${basePath}`\n : basePath;\n\n await handle.upload(\n [{ path: filename, content: JSON.stringify(answerData, null, 2) }],\n targetDir,\n );\n\n console.log(\n `[submitAnswer] Answer submitted: ${targetDir}/${filename} (status: ${answerData.status}, workdir: ${workdir ?? \"(none)\"})`,\n );\n}\n"],"mappings":"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","names":["entry","sandboxEnv"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/provider/bunny-agent-language-model.ts","../src/provider/logging.ts","../src/provider/search-contract-ai-sdk.ts","../src/provider/search-contract-discovery.ts","../src/provider/tool-refs.ts","../src/provider/usage.ts","../src/provider/bunny-agent-provider.ts","../src/provider/question-processor.ts"],"sourcesContent":["/**\n * @bunny-agent/sdk\n *\n * BunnyAgent SDK - AI Provider and React hooks for building AI chat interfaces.\n *\n * Main entry point exports the AI provider (backend).\n * React hooks are available via \"@bunny-agent/sdk/react\".\n *\n * @example\n * ```typescript\n * // Backend - Provider\n * import { createBunnyAgent } from \"@bunny-agent/sdk\";\n * const bunnyAgent = createBunnyAgent({ sandbox, env });\n * const model = bunnyAgent(\"sonnet\");\n *\n * // Frontend - React hooks\n * import { useBunnyAgentChat } from \"@bunny-agent/sdk/react\";\n * const { messages, sendMessage } = useBunnyAgentChat({ apiEndpoint: \"/api/ai\" });\n * ```\n */\n\nexport type {\n IsBunnyAgentDaemonHealthyOptions,\n RunnerEnvParams,\n RunnerType,\n} from \"@bunny-agent/manager\";\n// Re-export env helpers\nexport {\n buildRunnerEnv,\n DEFAULT_BUNNY_AGENT_DAEMON_URL,\n isBunnyAgentDaemonHealthy,\n} from \"@bunny-agent/manager\";\nexport type {\n LocalMachineOptions,\n LocalSandboxOptions,\n} from \"@bunny-agent/sandbox-local\";\n// Re-export the local adapters for convenience (LocalSandbox is the\n// deprecated pre-rename alias of LocalMachine)\nexport { LocalMachine, LocalSandbox } from \"@bunny-agent/sandbox-local\";\nexport type {\n SrtIsolationOptions,\n SrtSandboxOptions,\n} from \"@bunny-agent/sandbox-srt\";\nexport { SrtSandbox } from \"@bunny-agent/sandbox-srt\";\nexport type {\n ArtifactProcessor,\n ArtifactResult,\n BunnyAgentLanguageModelOptions,\n BunnyAgentModelId,\n BunnyAgentProvider,\n BunnyAgentProviderSettings,\n CompactionEvent,\n // Re-exports from @ai-sdk/provider\n LanguageModelV3StreamPart,\n Logger,\n McpConfig,\n McpHttpServerConfig,\n McpLifecycle,\n McpServerConfig,\n McpServerOptions,\n McpSettings,\n McpStdioServerConfig,\n Message,\n Question,\n RunControl,\n // Re-exports from @bunny-agent/manager\n SandboxAdapter,\n SandboxHandle,\n StreamWriter,\n SubmitAnswerOptions,\n SubmitAnswerParams,\n ToolRuntime,\n TranscriptEntry,\n} from \"./provider\";\n// Provider exports\nexport {\n BunnyAgentLanguageModel,\n bunnyHttpTool,\n bunnySandboxTool,\n createBunnyAgent,\n getBunnyAgentMetadata,\n getBunnyAgentUsage,\n submitAnswer,\n} from \"./provider\";\n\nexport const VERSION = \"0.1.0\";\n","import type {\n JSONValue,\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3GenerateResult,\n LanguageModelV3Prompt,\n LanguageModelV3StreamPart,\n LanguageModelV3StreamResult,\n LanguageModelV3Usage,\n SharedV3ProviderMetadata,\n SharedV3Warning,\n} from \"@ai-sdk/provider\";\nimport {\n type AgentTurnInputV1,\n BunnyAgent,\n type BunnyAgentCodingRunBody,\n type Message,\n type RunnerSpec,\n SandboxExecError,\n type SandboxHandle,\n streamCodingRunFromSandbox,\n type ToolRef,\n} from \"@bunny-agent/manager\";\nimport type { SearchContractCapabilities } from \"../contracts\";\nimport {\n isSafeHttpUrl,\n isSearchContractCapabilities,\n isValidCitationContractMetadata,\n} from \"../contracts\";\nimport { getProviderLogger } from \"./logging\";\nimport { assertSearchContractAiSdkSupport } from \"./search-contract-ai-sdk\";\nimport {\n discoverPiSearchContract,\n waitForSearchDiscovery,\n} from \"./search-contract-discovery\";\nimport { compileToolRefsFromLanguageModelTools } from \"./tool-refs\";\nimport type {\n BunnyAgentModelId,\n BunnyAgentProviderSettings,\n Logger,\n} from \"./types\";\nimport { normalizeBunnyAgentUsage } from \"./usage\";\n\n/**\n * Options for creating a BunnyAgent language model instance.\n */\nexport interface BunnyAgentLanguageModelOptions {\n id: BunnyAgentModelId;\n options: BunnyAgentProviderSettings & { runner: RunnerSpec };\n}\n\n/** Format error so message and cause chain are visible (e.g. includes \"Fatal error: ...\" from runner). */\nfunction formatErrorForLog(error: unknown): string {\n if (error instanceof Error) {\n const parts = [error.message];\n let cause: unknown = error.cause;\n while (cause instanceof Error) {\n parts.push(cause.message);\n cause = cause.cause;\n }\n return parts.join(\" | cause: \");\n }\n return String(error);\n}\n\n/** Bridge async iterable (sandbox exec / curl) to Web ReadableStream for SSE parsing. */\nfunction asyncIterableToReadableStream(\n iterable: AsyncIterable<Uint8Array>,\n): ReadableStream<Uint8Array> {\n const iterator = iterable[Symbol.asyncIterator]();\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n while (true) {\n const { done, value } = await iterator.next();\n if (done) {\n controller.close();\n return;\n }\n if (value.byteLength > 0) {\n controller.enqueue(value);\n return;\n }\n }\n } catch (error) {\n const isAbort =\n (error instanceof Error && error.name === \"AbortError\") ||\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error && /abort/i.test(error.message));\n if (isAbort) {\n controller.close();\n } else {\n controller.error(error);\n }\n }\n },\n async cancel(reason) {\n await iterator.return?.(reason);\n },\n });\n}\n\nfunction mergeToolRefs(\n staticToolRefs: ToolRef[] | undefined,\n callToolRefs: ToolRef[] | undefined,\n): ToolRef[] | undefined {\n const merged = [...(staticToolRefs ?? []), ...(callToolRefs ?? [])];\n return merged.length > 0 ? merged : undefined;\n}\n\nfunction getCurrentTurnStart(messages: Message[]): number {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role !== \"user\") return i + 1;\n }\n return 0;\n}\n\nasync function resolveImageData(\n data: string,\n declaredMediaType: string,\n): Promise<{ data: string; mediaType: string }> {\n if (!declaredMediaType.startsWith(\"image/\")) {\n throw new Error(\n `Unsupported BunnyAgent file media type: ${declaredMediaType}`,\n );\n }\n const dataUrl = /^data:([^;,]+);base64,(.+)$/s.exec(data);\n if (dataUrl) {\n if (!dataUrl[1].startsWith(\"image/\")) {\n throw new Error(\n `Unsupported BunnyAgent data URL media type: ${dataUrl[1]}`,\n );\n }\n return { mediaType: dataUrl[1], data: dataUrl[2] };\n }\n if (/^https?:\\/\\//i.test(data)) {\n const response = await fetch(data, { redirect: \"follow\" });\n if (!response.ok) {\n throw new Error(\n `Unable to fetch BunnyAgent image: HTTP ${response.status}`,\n );\n }\n const contentLength = Number(response.headers.get(\"content-length\") ?? 0);\n if (contentLength > 20 * 1024 * 1024) {\n throw new Error(\"BunnyAgent image exceeds the 20 MiB limit\");\n }\n const mediaType =\n response.headers.get(\"content-type\")?.split(\";\")[0] ?? declaredMediaType;\n if (!mediaType.startsWith(\"image/\")) {\n throw new Error(`Fetched BunnyAgent asset is not an image: ${mediaType}`);\n }\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (bytes.byteLength > 20 * 1024 * 1024) {\n throw new Error(\"BunnyAgent image exceeds the 20 MiB limit\");\n }\n return { mediaType, data: Buffer.from(bytes).toString(\"base64\") };\n }\n return { mediaType: declaredMediaType, data };\n}\n\nexport async function compileMessagesToAgentInput(\n messages: Message[],\n includeHistory: boolean,\n): Promise<AgentTurnInputV1> {\n const selected = includeHistory\n ? messages\n : messages.slice(getCurrentTurnStart(messages));\n const text: string[] = [];\n const assets: AgentTurnInputV1[\"input\"] = [];\n let imageNumber = 0;\n\n for (const message of selected) {\n if (includeHistory) {\n const role = message.role[0].toUpperCase() + message.role.slice(1);\n text.push(`${role}: `);\n }\n const parts =\n typeof message.content === \"string\"\n ? [{ type: \"text\" as const, text: message.content }]\n : message.content;\n for (const part of parts) {\n if (part.type === \"text\") {\n text.push(part.text);\n continue;\n }\n imageNumber += 1;\n const label = `[Image #${imageNumber}]`;\n const resolved = await resolveImageData(part.data, part.mimeType);\n if (!text.join(\"\").endsWith(label)) text.push(label);\n assets.push({\n type: \"asset\",\n id: `image-${imageNumber}`,\n label,\n asset: resolved,\n });\n }\n text.push(\"\\n\\n\");\n }\n\n return {\n version: 1,\n input: [...assets, { type: \"text\", text: text.join(\"\").trimEnd() }],\n capabilities: [],\n execution: {\n resolvedBy: \"server\",\n skills: [],\n integrations: [],\n references: [],\n capabilityKeys: [],\n extensionVersions: {},\n },\n };\n}\n\nfunction createEmptyUsage(): LanguageModelV3Usage {\n return {\n inputTokens: {\n total: 0,\n noCache: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n outputTokens: {\n total: 0,\n text: undefined,\n reasoning: undefined,\n },\n raw: undefined,\n };\n}\n\nfunction readToolDynamicFlag(parsed: Record<string, unknown>): boolean {\n if (typeof parsed.dynamic === \"boolean\") {\n return parsed.dynamic;\n }\n return parsed.providerExecuted === true;\n}\n\nfunction mergeProviderMetadata(\n previous: SharedV3ProviderMetadata | undefined,\n next: SharedV3ProviderMetadata | undefined,\n): SharedV3ProviderMetadata {\n const merged = { ...previous };\n for (const [provider, fields] of Object.entries(next ?? {})) {\n merged[provider] = { ...merged[provider], ...fields };\n }\n return merged;\n}\n\n/**\n * BunnyAgent Language Model implementation for AI SDK.\n */\nexport class BunnyAgentLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\" as const;\n readonly provider: string;\n readonly modelId: string;\n readonly supportedUrls: Record<string, RegExp[]> = {\n \"image/*\": [/.*/],\n };\n\n readonly settings: BunnyAgentProviderSettings & { runner: RunnerSpec };\n private readonly options: BunnyAgentProviderSettings & { runner: RunnerSpec };\n private readonly logger: Logger;\n private sessionId: string | undefined;\n private toolNameMap: Map<string, string> = new Map();\n private legacyTextPartCounter = 0;\n private receivedFinish = false;\n private activeReasoningPartId: string | undefined;\n private acknowledgedSearchContract: SearchContractCapabilities | undefined;\n /** Defense in depth: the runner already dedupes per emitted source, but a\n * duplicate `source-url` event must never reach the UI as two source parts. */\n private emittedSourceIds: Set<string> = new Set();\n private readonly completedTextIds = new Set<string>();\n private readonly completedToolIds = new Set<string>();\n private readonly textById = new Map<string, string>();\n private readonly textMetadata = new Map<string, SharedV3ProviderMetadata>();\n private readonly toolMetadata = new Map<string, SharedV3ProviderMetadata>();\n private readonly pendingSources = new Map<string, Record<string, unknown>>();\n private readonly citedSources = new Map<\n string,\n { url: string; title: string }\n >();\n private messageMetadata: Record<string, JSONValue> = {};\n private readonly seenMessageMetadata = new Set<string>();\n private readonly seenStreamErrors = new Set<string>();\n\n /** Merge every provider namespace while retaining negotiated request facts. */\n private partMetadata(\n raw: unknown,\n textPartId?: string,\n ): SharedV3ProviderMetadata {\n const metadata = mergeProviderMetadata(\n textPartId === undefined ? undefined : this.textMetadata.get(textPartId),\n raw && typeof raw === \"object\"\n ? (raw as SharedV3ProviderMetadata)\n : undefined,\n );\n const { searchContract: _untrustedAcknowledgement, ...bunnyMetadata } =\n metadata[\"bunny-agent\"] ?? {};\n const result: SharedV3ProviderMetadata = {\n ...metadata,\n \"bunny-agent\": {\n ...this.messageMetadata,\n ...bunnyMetadata,\n ...(this.sessionId ? { sessionId: this.sessionId } : {}),\n ...(textPartId !== undefined ? { textPartId } : {}),\n ...(this.acknowledgedSearchContract\n ? {\n searchContract: this\n .acknowledgedSearchContract as unknown as JSONValue,\n }\n : {}),\n },\n };\n if (textPartId !== undefined) this.textMetadata.set(textPartId, result);\n return result;\n }\n\n private toolPartMetadata(\n parsed: Record<string, unknown>,\n ): SharedV3ProviderMetadata {\n const id = parsed.toolCallId as string;\n const metadata = mergeProviderMetadata(\n this.toolMetadata.get(id),\n this.partMetadata(parsed.providerMetadata),\n );\n this.toolMetadata.set(id, metadata);\n return metadata;\n }\n\n private emitCitedSource(sourceId: string): LanguageModelV3StreamPart[] {\n const source = this.pendingSources.get(sourceId);\n const cited = this.citedSources.get(sourceId);\n if (\n !source ||\n !cited ||\n this.emittedSourceIds.has(sourceId) ||\n typeof source.url !== \"string\" ||\n !isSafeHttpUrl(source.url) ||\n new URL(source.url).href !== new URL(cited.url).href\n )\n return [];\n this.emittedSourceIds.add(sourceId);\n return [\n {\n type: \"source\",\n sourceType: \"url\",\n id: sourceId,\n url: source.url,\n title: cited.title,\n ...(source.providerMetadata\n ? { providerMetadata: this.partMetadata(source.providerMetadata) }\n : {}),\n },\n ];\n }\n\n private logUnparsedStreamLine(candidate: string, error: unknown): void {\n const trimmed = candidate.trim();\n if (!trimmed) return;\n const looksLikeError = /\\b(error|failed|exception|traceback|fatal)\\b/i.test(\n trimmed,\n );\n const snippet = trimmed.slice(0, 500);\n const msg = error instanceof Error ? error.message : String(error);\n if (looksLikeError) {\n this.logger.error(\n `[bunny-agent] Unparsed stream line (likely runner error): ${snippet} | parser: ${msg}`,\n );\n } else {\n // Not obviously an error, but still worth surfacing — a silently\n // dropped line here is exactly how a stream can stall with no\n // \"finish\"/\"error\" part and no visible feedback to the user.\n this.logger.debug(\n `[bunny-agent] Unparsed stream line: ${snippet} | parser: ${msg}`,\n );\n }\n }\n\n constructor(modelOptions: BunnyAgentLanguageModelOptions) {\n this.modelId = modelOptions.id;\n this.settings = modelOptions.options;\n this.options = modelOptions.options;\n this.logger = getProviderLogger(modelOptions.options);\n this.provider = \"bunny-agent\";\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3GenerateResult> {\n const { stream, request } = await this.doStream(options);\n const reader = stream.getReader();\n\n const content: LanguageModelV3Content[] = [];\n const warnings: SharedV3Warning[] = [];\n let finishReason: LanguageModelV3FinishReason = {\n unified: \"other\",\n raw: undefined,\n };\n let usage: LanguageModelV3Usage = createEmptyUsage();\n let providerMetadata: SharedV3ProviderMetadata | undefined;\n\n const textParts = new Map<\n string,\n { text: string; providerMetadata?: SharedV3ProviderMetadata }\n >();\n const reasoningParts: Map<string, { text: string }> = new Map();\n const toolInputs: Map<string, { toolName: string; input: string }> =\n new Map();\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n switch (value.type) {\n case \"text-start\": {\n textParts.set(value.id, {\n text: \"\",\n providerMetadata: value.providerMetadata,\n });\n break;\n }\n case \"text-delta\": {\n const part = textParts.get(value.id);\n if (part) {\n part.text += value.delta;\n part.providerMetadata = mergeProviderMetadata(\n part.providerMetadata,\n value.providerMetadata,\n );\n }\n break;\n }\n case \"text-end\": {\n const part = textParts.get(value.id);\n if (part) {\n content.push({\n type: \"text\",\n text: part.text,\n providerMetadata: mergeProviderMetadata(\n part.providerMetadata,\n value.providerMetadata,\n ),\n });\n textParts.delete(value.id);\n }\n break;\n }\n case \"reasoning-start\": {\n reasoningParts.set(value.id, { text: \"\" });\n break;\n }\n case \"reasoning-delta\": {\n const part = reasoningParts.get(value.id);\n if (part) {\n part.text += value.delta;\n }\n break;\n }\n case \"reasoning-end\": {\n const part = reasoningParts.get(value.id);\n if (part && part.text.length > 0) {\n content.push({\n type: \"reasoning\",\n text: part.text,\n });\n }\n break;\n }\n case \"tool-input-start\": {\n toolInputs.set(value.id, { toolName: value.toolName, input: \"\" });\n break;\n }\n case \"tool-input-delta\": {\n const tool = toolInputs.get(value.id);\n if (tool) {\n tool.input += value.delta;\n }\n break;\n }\n case \"tool-input-end\": {\n break;\n }\n case \"tool-call\": {\n content.push(value);\n break;\n }\n case \"tool-result\": {\n content.push(value);\n break;\n }\n case \"source\": {\n content.push(value);\n break;\n }\n case \"stream-start\": {\n warnings.push(...value.warnings);\n break;\n }\n case \"error\": {\n // `value.error` type comes from AI SDK and can be `{}`-shaped.\n // Convert it to a readable string safely.\n const message =\n value.error instanceof Error\n ? value.error.message\n : typeof value.error === \"string\"\n ? value.error\n : value.error\n ? String(value.error)\n : \"Unknown error\";\n\n // Surface errors as assistant text + mark finishReason=error.\n content.push({ type: \"text\", text: message });\n finishReason = { unified: \"error\", raw: \"error\" };\n break;\n }\n case \"finish\": {\n finishReason = value.finishReason;\n usage = value.usage;\n providerMetadata = value.providerMetadata;\n break;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n return {\n content,\n finishReason,\n usage,\n providerMetadata,\n request,\n warnings,\n };\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<LanguageModelV3StreamResult> {\n // A model may be reused by overlapping AI SDK calls. All mutable parser,\n // negotiation, identity, and artifact state belongs to this invocation.\n let invocationOptions = this.options;\n let discoveredHandle: SandboxHandle | undefined;\n if (this.options.searchContractVersion === \"auto\") {\n if (!this.options.sandbox) {\n throw new Error(\n \"BunnyAgent language model requires a sandbox adapter (set `sandbox` on the provider).\",\n );\n }\n if (options.abortSignal?.aborted) {\n throw new DOMException(\n \"Search capability discovery aborted.\",\n \"AbortError\",\n );\n }\n let version: 1 | undefined;\n if (this.options.runner.runnerType === \"pi\" && this.options.daemonUrl) {\n discoveredHandle = await waitForSearchDiscovery(\n this.options.sandbox.attach(),\n options.abortSignal,\n );\n version = await discoverPiSearchContract(\n discoveredHandle,\n this.options.daemonUrl,\n {\n cwd: this.options.cwd,\n signal: options.abortSignal,\n },\n );\n }\n invocationOptions = {\n ...this.options,\n runner: { ...this.options.runner, searchContractVersion: version },\n };\n }\n const invocation = new BunnyAgentLanguageModel({\n id: this.modelId,\n options: invocationOptions,\n });\n return invocation.doStreamInvocation(options, discoveredHandle);\n }\n\n private async doStreamInvocation(\n options: LanguageModelV3CallOptions,\n discoveredHandle?: SandboxHandle,\n ): Promise<LanguageModelV3StreamResult> {\n if (this.requestedSearchContractVersion === 1) {\n await assertSearchContractAiSdkSupport();\n }\n const { prompt, abortSignal } = options;\n const messages = this.convertPromptToMessages(prompt);\n\n this.logger.debug(\n `[bunny-agent] Starting stream with ${messages.length} messages`,\n );\n\n const sandbox = this.options.sandbox;\n if (!sandbox) {\n throw new Error(\n \"BunnyAgent language model requires a sandbox adapter (set `sandbox` on the provider).\",\n );\n }\n\n const callToolRefs = compileToolRefsFromLanguageModelTools(options.tools);\n const toolRefs = mergeToolRefs(this.options.toolRefs, callToolRefs);\n\n const daemonUrl = this.options.daemonUrl;\n\n if (daemonUrl) {\n const handle = discoveredHandle ?? (await sandbox.attach());\n const sandboxEnv = sandbox.getEnv?.() ?? {};\n const runnerEnv = { ...sandboxEnv, ...this.options.env };\n const body: BunnyAgentCodingRunBody = {\n ...(await this.buildCodingRunBody(\n messages,\n handle.getWorkdir(),\n toolRefs,\n )),\n ...(Object.keys(runnerEnv).length > 0 ? { env: runnerEnv } : {}),\n ...(this.options.systemEnv &&\n Object.keys(this.options.systemEnv).length > 0\n ? { systemEnv: this.options.systemEnv }\n : {}),\n };\n const execOpts = {\n cwd: this.options.cwd ?? handle.getWorkdir(),\n signal: abortSignal,\n // A coding run lasts as long as the agent works and ends via\n // `abortSignal`. On exec-based sandboxes (LocalMachine), the daemon\n // call would otherwise inherit the default command timeout (5 min)\n // and kill every longer run. Sandock streams natively and ignores it.\n timeout: 0,\n };\n const iterable = streamCodingRunFromSandbox(\n handle,\n daemonUrl,\n body,\n execOpts,\n );\n const bytesStream = asyncIterableToReadableStream(iterable);\n return this.buildStreamResult(bytesStream, messages, abortSignal);\n }\n\n const sandboxEnv = sandbox.getEnv?.() ?? {};\n const sandboxWorkdir =\n this.options.cwd ?? sandbox.getWorkdir?.() ?? \"/workspace\";\n\n // CLI fallback path: each `bunny-agent run` invocation is single-request /\n // single-tenant, so the runner's `process.env` IS the expected bash\n // environment. We therefore merge env + systemEnv into one map and let\n // sandbox.exec inject everything. Pi's bash tool inherits this via its\n // default `ctx.env`, so no JSON-payload channel is needed.\n const agent = new BunnyAgent({\n sandbox,\n runner: this.options.runner,\n env: {\n ...sandboxEnv,\n ...this.options.env,\n ...(this.options.systemEnv ?? {}),\n },\n });\n\n try {\n const input = await compileMessagesToAgentInput(\n messages,\n !(this.options.resume ?? this.options.forkFrom),\n );\n const bytesStream = await agent.stream({\n messages,\n input,\n workspace: {\n path: sandboxWorkdir,\n },\n resume: this.options.resume,\n forkFrom: this.options.forkFrom,\n signal: abortSignal,\n ...(toolRefs && toolRefs.length > 0 ? { toolRefs } : {}),\n ...(this.options.mcpConfig\n ? { mcpConfig: this.options.mcpConfig }\n : {}),\n });\n return this.buildStreamResult(bytesStream, messages, abortSignal);\n } catch (error) {\n await agent.destroy().catch(() => {});\n if (error instanceof SandboxExecError) {\n const bytesStream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.error(error);\n },\n });\n return this.buildStreamResult(bytesStream, messages, abortSignal);\n }\n throw error;\n }\n }\n\n /** The `searchContractVersion` explicitly requested for this turn, if any (never a process-global default). */\n private get requestedSearchContractVersion(): 1 | undefined {\n return this.options.runner.searchContractVersion === 1 ? 1 : undefined;\n }\n\n /**\n * When an explicit v1 selection was requested but the stream reached a\n * normal finish without ever delivering a `searchContract` acknowledgement\n * (e.g. an older daemon/CLI peer that silently ignores the field), surface\n * a clear error instead of letting the caller believe v1 behavior is\n * active. Never retried automatically — the caller decides whether to\n * retry without the contract.\n */\n private buildMissingAcknowledgementErrorParts(): LanguageModelV3StreamPart[] {\n return [\n {\n type: \"error\",\n error: new Error(\n \"searchContractVersion: 1 was explicitly requested but the runner/daemon never acknowledged support for it (no searchContract capability message received). The peer may be running an older release that silently ignores this option.\",\n ),\n },\n {\n type: \"finish\",\n finishReason: {\n unified: \"error\",\n raw: \"search-contract-unacknowledged\",\n },\n usage: createEmptyUsage(),\n providerMetadata: this.partMetadata(undefined),\n },\n ];\n }\n\n /** Close the open reasoning part, if any (returns the end part to emit). */\n private closeReasoningPart(): LanguageModelV3StreamPart[] {\n if (this.activeReasoningPartId == null) return [];\n const id = this.activeReasoningPartId;\n this.activeReasoningPartId = undefined;\n return [{ type: \"reasoning-end\", id }];\n }\n\n /** Synthesize a terminal error+finish pair for streams that end (EOF or `[DONE]`) without ever emitting a \"finish\" part, so the UI shows an error instead of silently stalling. */\n private buildUnexpectedEndParts(): LanguageModelV3StreamPart[] {\n if (\n this.requestedSearchContractVersion === 1 &&\n this.acknowledgedSearchContract === undefined\n ) {\n return this.buildMissingAcknowledgementErrorParts();\n }\n return [\n {\n type: \"error\",\n error: new Error(\n \"The agent stream ended unexpectedly before completing.\",\n ),\n },\n {\n type: \"finish\",\n finishReason: { unified: \"error\", raw: \"unexpected-stream-end\" },\n usage: createEmptyUsage(),\n providerMetadata: this.partMetadata(undefined),\n },\n ];\n }\n\n private async buildCodingRunBody(\n messages: Message[],\n cwdFallback: string,\n toolRefs: ToolRef[] | undefined,\n ): Promise<BunnyAgentCodingRunBody> {\n const runner = this.options.runner;\n const cwd = this.options.cwd ?? cwdFallback;\n\n const hasRuntimeHistory = Boolean(\n this.options.resume ?? this.options.forkFrom,\n );\n const input = await compileMessagesToAgentInput(\n messages,\n !hasRuntimeHistory,\n );\n\n return {\n runner: runner.runnerType ?? \"claude\",\n model: this.modelId,\n input,\n cwd,\n resume: this.options.resume,\n forkFrom: this.options.forkFrom,\n systemPrompt: this.options.systemPrompt ?? runner.systemPrompt,\n maxTurns: this.options.maxTurns ?? runner.maxTurns,\n allowedTools: runner.allowedTools ?? this.options.allowedTools,\n skillPaths: runner.skillPaths ?? this.options.skillPaths,\n // Hosted Pi integrations historically execute regular tools immediately.\n // Keep that compatibility unless the host explicitly opts into approvals;\n // the runner CLI still owns its separate non-yolo default.\n yolo:\n this.options.yolo ?? (runner.runnerType === \"pi\" ? true : undefined),\n ...(toolRefs && toolRefs.length > 0 ? { toolRefs } : {}),\n ...(this.options.mcpConfig ? { mcpConfig: this.options.mcpConfig } : {}),\n ...(this.options.effort ? { effort: this.options.effort } : {}),\n ...(runner.searchContractVersion !== undefined\n ? { searchContractVersion: runner.searchContractVersion }\n : {}),\n ...(this.options.control ? { control: this.options.control } : {}),\n };\n }\n\n private buildStreamResult(\n bytesStream: ReadableStream<Uint8Array>,\n messages: Message[],\n signal?: AbortSignal,\n ): LanguageModelV3StreamResult {\n const reader = bytesStream.getReader();\n\n return {\n stream: this.createLanguageModelStreamFromSseReader(reader, signal),\n request: {\n body: JSON.stringify({ messages }),\n },\n };\n }\n\n private createLanguageModelStreamFromSseReader(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal?: AbortSignal,\n ): ReadableStream<LanguageModelV3StreamPart> {\n const self = this;\n\n return new ReadableStream<LanguageModelV3StreamPart>({\n async start(controller) {\n try {\n let buffer = \"\";\n // One decoder per stream in streaming mode: a multi-byte UTF-8\n // character (CJK, emoji) split across two network chunks must not be\n // decoded half-and-half into U+FFFD replacement characters.\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n\n if (done) {\n buffer += decoder.decode();\n if (buffer.trim()) {\n const parts = self.parseSSEBuffer(buffer);\n for (const part of parts) {\n controller.enqueue(part);\n }\n }\n if (!self.receivedFinish && !signal?.aborted) {\n for (const part of self.buildUnexpectedEndParts()) {\n controller.enqueue(part);\n }\n }\n controller.close();\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n let foundDone = false;\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine || trimmedLine.startsWith(\":\")) continue;\n const candidate = line.startsWith(\"data: \")\n ? line.slice(6)\n : trimmedLine;\n if (candidate === \"[DONE]\") {\n foundDone = true;\n continue;\n }\n\n try {\n const parts = self.parseSSEData(candidate);\n for (const part of parts) {\n controller.enqueue(part);\n\n if (self.sessionId) {\n const sessionId: string = self.sessionId;\n\n if (self.options.artifactProcessors?.length) {\n for (const processor of self.options.artifactProcessors) {\n Promise.resolve()\n .then(() => processor.onChange(part, sessionId))\n .catch((e) => {\n self.logger.error(\n `[bunny-agent] Artifact processor error: ${e}`,\n );\n });\n }\n }\n }\n }\n } catch (e) {\n // daemon /api/coding/run or CLI runner may emit plain text lines.\n self.logUnparsedStreamLine(candidate, e);\n }\n }\n\n if (foundDone) {\n if (!self.receivedFinish && !signal?.aborted) {\n for (const part of self.buildUnexpectedEndParts()) {\n controller.enqueue(part);\n }\n }\n controller.close();\n return;\n }\n }\n } catch (error) {\n const isAbort =\n (error instanceof Error && error.name === \"AbortError\") ||\n (typeof DOMException !== \"undefined\" &&\n error instanceof DOMException &&\n error.name === \"AbortError\") ||\n (error instanceof Error &&\n \"code\" in error &&\n error.code === \"aborted\");\n if (isAbort) {\n self.logger.info(\"[bunny-agent] Stream aborted by user\");\n controller.close();\n } else {\n self.logger.error(\n `[bunny-agent] Stream error: ${formatErrorForLog(error)}`,\n );\n // Process completion is authoritative even after a protocol finish.\n // Surface a trailing execution failure without duplicating finish.\n controller.enqueue({ type: \"error\", error });\n if (!self.receivedFinish) {\n self.receivedFinish = true;\n for (const part of self.closeReasoningPart())\n controller.enqueue(part);\n controller.enqueue({\n type: \"finish\",\n finishReason: { unified: \"error\", raw: \"execution-error\" },\n usage: createEmptyUsage(),\n });\n }\n controller.close();\n }\n }\n },\n\n cancel() {\n reader.cancel();\n },\n });\n }\n\n private parseSSEBuffer(buffer: string): LanguageModelV3StreamPart[] {\n const parts: LanguageModelV3StreamPart[] = [];\n const lines = buffer.split(\"\\n\");\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (!trimmedLine || trimmedLine.startsWith(\":\")) continue;\n const candidate = line.startsWith(\"data: \") ? line.slice(6) : trimmedLine;\n if (candidate === \"[DONE]\") continue;\n try {\n const parsedParts = this.parseSSEData(candidate);\n parts.push(...parsedParts);\n } catch (e) {\n this.logUnparsedStreamLine(candidate, e);\n }\n }\n\n return parts;\n }\n\n private parseSSEData(data: string): LanguageModelV3StreamPart[] {\n const parts: LanguageModelV3StreamPart[] = [];\n const parsed = JSON.parse(data) as Record<string, unknown>;\n const parsedType =\n typeof parsed.type === \"string\" ? parsed.type : undefined;\n if (\n this.receivedFinish &&\n parsedType !== \"error\" &&\n !(!parsedType && typeof parsed.error === \"string\")\n )\n return parts;\n\n // daemon NDJSON errors may arrive as: {\"error\":\"...\"} (without type)\n if (!parsedType && typeof parsed.error === \"string\") {\n if (this.seenStreamErrors.has(parsed.error)) return parts;\n this.seenStreamErrors.add(parsed.error);\n return [\n {\n type: \"error\",\n error: new Error(parsed.error),\n },\n ];\n }\n\n switch (parsedType) {\n case \"start\": {\n break;\n }\n\n // Backward-compatible NDJSON chunk from daemon tests/mock runners.\n case \"text\": {\n const text = typeof parsed.text === \"string\" ? parsed.text : \"\";\n if (text.length > 0) {\n const id = `legacy-text-${++this.legacyTextPartCounter}`;\n parts.push(\n {\n type: \"text-start\",\n id,\n providerMetadata: this.partMetadata(parsed.providerMetadata, id),\n },\n { type: \"text-delta\", id, delta: text },\n {\n type: \"text-end\",\n id,\n providerMetadata: this.partMetadata(parsed.providerMetadata, id),\n },\n );\n }\n break;\n }\n\n case \"message-metadata\": {\n const metadata = parsed.messageMetadata as Record<string, unknown>;\n const key = JSON.stringify(metadata);\n if (this.seenMessageMetadata.has(key)) break;\n this.seenMessageMetadata.add(key);\n if (metadata && typeof metadata === \"object\") {\n const { searchContract: _acknowledgement, ...fields } = metadata;\n this.messageMetadata = {\n ...this.messageMetadata,\n ...fields,\n } as Record<string, JSONValue>;\n }\n if (\n metadata?.sessionId &&\n typeof metadata.sessionId === \"string\" &&\n this.sessionId !== metadata.sessionId\n ) {\n this.sessionId = metadata.sessionId;\n this.logger.debug(\n `[bunny-agent] Session ID extracted: ${this.sessionId}`,\n );\n parts.push({\n type: \"raw\",\n rawValue: this.sessionId,\n });\n }\n if (\n this.requestedSearchContractVersion === 1 &&\n isSearchContractCapabilities(metadata?.searchContract) &&\n this.acknowledgedSearchContract === undefined\n ) {\n this.acknowledgedSearchContract = metadata.searchContract;\n this.logger.debug(\n `[bunny-agent] Search contract acknowledged: ${JSON.stringify(this.acknowledgedSearchContract)}`,\n );\n }\n break;\n }\n\n // Context compaction progress. Delivered out-of-band via the\n // `onCompaction` callback: the AI SDK stream protocol has no part type\n // for it, and it must not become assistant content.\n case \"compaction\": {\n const phase = parsed.phase === \"start\" ? \"start\" : \"end\";\n this.options.onCompaction?.({\n phase,\n ...(typeof parsed.success === \"boolean\"\n ? { success: parsed.success }\n : {}),\n ...(typeof parsed.trigger === \"string\"\n ? { trigger: parsed.trigger }\n : {}),\n ...(typeof parsed.preTokens === \"number\"\n ? { preTokens: parsed.preTokens }\n : {}),\n ...(typeof parsed.postTokens === \"number\"\n ? { postTokens: parsed.postTokens }\n : {}),\n ...(typeof parsed.error === \"string\" ? { error: parsed.error } : {}),\n });\n break;\n }\n\n // Runners (claude/codex) emit reasoning as untagged deltas:\n // {type:\"reasoning\", text}. Wrap them in a synthesized\n // reasoning-start/delta/end part stream for the AI SDK.\n case \"reasoning\": {\n const text =\n typeof parsed.text === \"string\"\n ? parsed.text\n : typeof parsed.delta === \"string\"\n ? parsed.delta\n : \"\";\n if (text.length > 0) {\n if (this.activeReasoningPartId == null) {\n this.activeReasoningPartId = `reasoning-${++this.legacyTextPartCounter}`;\n parts.push({\n type: \"reasoning-start\",\n id: this.activeReasoningPartId,\n });\n }\n parts.push({\n type: \"reasoning-delta\",\n id: this.activeReasoningPartId,\n delta: text,\n });\n }\n break;\n }\n\n case \"text-start\": {\n const id = parsed.id as string;\n if (this.textById.has(id) || this.completedTextIds.has(id)) break;\n this.textById.set(id, \"\");\n parts.push(...this.closeReasoningPart());\n parts.push({\n type: \"text-start\",\n id: parsed.id as string,\n providerMetadata: this.partMetadata(parsed.providerMetadata, id),\n });\n break;\n }\n\n case \"text-delta\": {\n const id = parsed.id as string;\n if (this.completedTextIds.has(id)) break;\n this.textById.set(\n id,\n (this.textById.get(id) ?? \"\") + (parsed.delta as string),\n );\n parts.push({\n type: \"text-delta\",\n id: parsed.id as string,\n delta: parsed.delta as string,\n ...(parsed.providerMetadata\n ? {\n providerMetadata: this.partMetadata(\n parsed.providerMetadata,\n id,\n ),\n }\n : {}),\n });\n break;\n }\n\n case \"text-end\": {\n const id = parsed.id as string;\n if (this.completedTextIds.has(id)) break;\n this.completedTextIds.add(id);\n const rawMetadata = parsed.providerMetadata as\n | Record<string, unknown>\n | undefined;\n const bunnyMetadata = rawMetadata?.[\"bunny-agent\"] as\n | Record<string, unknown>\n | undefined;\n const contract = bunnyMetadata?.citation_contract;\n if (\n this.acknowledgedSearchContract &&\n isValidCitationContractMetadata(contract, {\n text: this.textById.get(id) ?? \"\",\n })\n ) {\n for (const binding of contract.bindings) {\n const annotation = contract.annotations[binding.annotation_index];\n this.citedSources.set(binding.source_id, {\n url: annotation.url,\n title: annotation.title,\n });\n parts.push(...this.emitCitedSource(binding.source_id));\n }\n }\n parts.push({\n type: \"text-end\",\n id: parsed.id as string,\n providerMetadata: this.partMetadata(rawMetadata, id),\n });\n break;\n }\n\n // Terminal per-text citation marker bridge: one `source-url` chunk per\n // actually cited source (never per retrieved-but-uncited result).\n case \"source-url\": {\n const sourceId = parsed.sourceId as string;\n if (\n typeof sourceId !== \"string\" ||\n typeof parsed.url !== \"string\" ||\n !isSafeHttpUrl(parsed.url)\n )\n break;\n if (this.requestedSearchContractVersion === 1) {\n if (!this.pendingSources.has(sourceId))\n this.pendingSources.set(sourceId, parsed);\n parts.push(...this.emitCitedSource(sourceId));\n break;\n }\n if (this.emittedSourceIds.has(sourceId)) break;\n this.emittedSourceIds.add(sourceId);\n parts.push({\n type: \"source\",\n sourceType: \"url\",\n id: sourceId,\n url: parsed.url as string,\n ...(typeof parsed.title === \"string\" ? { title: parsed.title } : {}),\n });\n break;\n }\n\n case \"tool-input-start\": {\n parts.push(...this.closeReasoningPart());\n parts.push({\n type: \"tool-input-start\",\n id: parsed.toolCallId as string,\n toolName: parsed.toolName as string,\n dynamic: readToolDynamicFlag(parsed),\n providerExecuted: parsed.providerExecuted as boolean,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n\n case \"tool-input-delta\": {\n parts.push({\n type: \"tool-input-delta\",\n id: parsed.toolCallId as string,\n delta: parsed.inputTextDelta as string,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"tool-input-end\": {\n parts.push({\n type: \"tool-input-end\",\n id: parsed.toolCallId as string,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"tool-input-available\": {\n const toolCallId = parsed.toolCallId as string;\n const toolName = parsed.toolName as string;\n const input = parsed.input as Record<string, unknown>;\n this.toolNameMap.set(toolCallId, toolName);\n parts.push({\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: JSON.stringify(input),\n dynamic: readToolDynamicFlag(parsed),\n providerExecuted: parsed.providerExecuted as boolean,\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n\n case \"tool-output-available\": {\n if (this.completedToolIds.has(parsed.toolCallId as string)) break;\n this.completedToolIds.add(parsed.toolCallId as string);\n const toolName = this.toolNameMap.get(parsed.toolCallId as string);\n parts.push({\n type: \"tool-result\",\n toolCallId: parsed.toolCallId as string,\n toolName: toolName ?? \"\",\n result: parsed.output as NonNullable<JSONValue>,\n isError: parsed.isError as boolean,\n dynamic: readToolDynamicFlag(parsed),\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"tool-output-error\": {\n if (this.completedToolIds.has(parsed.toolCallId as string)) break;\n this.completedToolIds.add(parsed.toolCallId as string);\n const toolName = this.toolNameMap.get(parsed.toolCallId as string);\n parts.push({\n type: \"tool-result\",\n toolCallId: parsed.toolCallId as string,\n toolName: toolName ?? \"\",\n result: (parsed.errorText as string) ?? \"Tool execution failed\",\n isError: true,\n dynamic: readToolDynamicFlag(parsed),\n providerMetadata: this.toolPartMetadata(parsed),\n });\n break;\n }\n case \"error\": {\n const message =\n (parsed.errorText as string) ||\n (parsed.error as string) ||\n \"Unknown stream error\";\n if (this.seenStreamErrors.has(message)) break;\n this.seenStreamErrors.add(message);\n parts.push({\n type: \"error\",\n error: new Error(message),\n });\n break;\n }\n\n case \"finish\": {\n this.receivedFinish = true;\n parts.push(...this.closeReasoningPart());\n const rawFinishReason = parsed.finishReason;\n let finishReason: LanguageModelV3FinishReason;\n\n if (\n typeof rawFinishReason === \"object\" &&\n rawFinishReason !== null &&\n \"unified\" in rawFinishReason\n ) {\n finishReason = rawFinishReason as LanguageModelV3FinishReason;\n } else {\n finishReason = this.mapFinishReason(rawFinishReason as string);\n }\n\n // An explicit v1 selection that reaches a non-error finish without\n // ever receiving a `searchContract` acknowledgement means the peer\n // silently ignored the option (e.g. an older daemon/CLI release) —\n // surface that honestly instead of letting the caller assume v1\n // behavior was actually active.\n if (\n this.requestedSearchContractVersion === 1 &&\n this.acknowledgedSearchContract === undefined &&\n finishReason.unified !== \"error\"\n ) {\n parts.push(...this.buildMissingAcknowledgementErrorParts());\n break;\n }\n\n const usage =\n normalizeBunnyAgentUsage(\n (parsed.messageMetadata as Record<string, unknown>) ?? undefined,\n ) ?? createEmptyUsage();\n\n parts.push({\n type: \"finish\",\n finishReason,\n usage,\n providerMetadata: this.partMetadata(\n mergeProviderMetadata(\n parsed.providerMetadata as SharedV3ProviderMetadata | undefined,\n {\n \"bunny-agent\": (parsed.messageMetadata ?? {}) as Record<\n string,\n JSONValue\n >,\n },\n ),\n ),\n });\n break;\n }\n }\n\n return parts;\n }\n\n private convertPromptToMessages(prompt: LanguageModelV3Prompt): Message[] {\n const messages: Message[] = [];\n\n for (const message of prompt) {\n switch (message.role) {\n case \"system\": {\n messages.push({\n role: \"system\",\n content: message.content,\n });\n break;\n }\n\n case \"user\": {\n const parts = message.content\n .map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\" as const, text: part.text };\n }\n if (part.type === \"file\") {\n // LanguageModelV3FilePart: data is Uint8Array | string | URL, mediaType is IANA type\n let dataStr = \"\";\n if (part.data instanceof Uint8Array) {\n dataStr = `data:${part.mediaType};base64,${Buffer.from(part.data).toString(\"base64\")}`;\n } else if (part.data instanceof URL) {\n dataStr = part.data.toString();\n } else if (typeof part.data === \"string\") {\n // Already a data URL or base64 string\n dataStr = part.data;\n }\n return {\n type: \"image\" as const,\n mimeType: part.mediaType || \"image/png\",\n data: dataStr,\n };\n }\n return null;\n })\n .filter(\n (\n p,\n ): p is\n | { type: \"text\"; text: string }\n | { type: \"image\"; mimeType: string; data: string } =>\n p !== null,\n );\n\n if (parts.length > 0) {\n // If only text parts, combine them into a string for cleaner payload, else pass array\n const isAllText = parts.every((p) => p.type === \"text\");\n messages.push({\n role: \"user\",\n content: isAllText\n ? parts\n .map((p) => (p as { type: \"text\"; text: string }).text)\n .join(\"\\n\")\n : parts,\n });\n }\n break;\n }\n\n case \"assistant\": {\n const textParts = message.content\n .filter(\n (part): part is { type: \"text\"; text: string } =>\n part.type === \"text\",\n )\n .map((part) => part.text);\n\n if (textParts.length > 0) {\n messages.push({\n role: \"assistant\",\n content: textParts.join(\"\\n\"),\n });\n }\n break;\n }\n\n case \"tool\": {\n break;\n }\n }\n }\n\n return messages;\n }\n\n private mapFinishReason(\n reason: string | undefined,\n ): LanguageModelV3FinishReason {\n switch (reason) {\n case \"stop\":\n return { unified: \"stop\", raw: reason };\n case \"length\":\n return { unified: \"length\", raw: reason };\n case \"tool_calls\":\n case \"tool-calls\":\n return { unified: \"tool-calls\", raw: reason };\n case \"content_filter\":\n case \"content-filter\":\n return { unified: \"content-filter\", raw: reason };\n case \"error\":\n return { unified: \"error\", raw: reason };\n default:\n return { unified: \"other\", raw: reason ?? \"unknown\" };\n }\n }\n}\n","import type { BunnyAgentProviderSettings, Logger } from \"./types\";\n\n/** Shared logger factory for provider and language model. */\nexport function getProviderLogger(\n settings: Partial<BunnyAgentProviderSettings>,\n): Logger {\n if (settings.logger === false) {\n return {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n };\n }\n\n if (settings.logger) {\n return settings.logger;\n }\n\n const isVerbose = settings.verbose ?? false;\n return {\n debug: (msg) => isVerbose && console.debug(msg),\n info: (msg) => isVerbose && console.info(msg),\n warn: (msg) => console.warn(msg),\n error: (msg) => console.error(msg),\n };\n}\n","import { createRequire } from \"node:module\";\n\n/** The verified AI SDK 6 baseline that preserves result provider metadata. */\nexport const SEARCH_CONTRACT_AI_SDK_MINIMUM = \"6.0.264\";\n\nexport function supportsSearchContractUiMetadata(version: string): boolean {\n const match = /^6\\.(\\d+)\\.(\\d+)(?:\\+[\\w.-]+)?$/.exec(version);\n return !!match && (Number(match[1]) > 0 || Number(match[2]) >= 264);\n}\n\n/**\n * Older AI SDK releases silently discard tool-result provider metadata. V1\n * fails before execution on those peers; version-unspecified calls keep their\n * existing peer range and never invoke this check. Resolve lazily from the\n * backend SDK module so builds do not depend on JSON import attributes.\n */\nexport async function assertSearchContractAiSdkSupport(): Promise<void> {\n let version: unknown;\n try {\n // Resolve the actual consumer peer without import attributes, which an\n // ES2022 bundle can remove even when supplied as a dynamic import option.\n const packageInfo = createRequire(import.meta.url)(\"ai/package.json\") as {\n version?: unknown;\n };\n version = packageInfo.version;\n } catch {\n throw new Error(\n \"Cannot verify the AI SDK peer required by searchContractVersion: 1.\",\n );\n }\n if (\n typeof version !== \"string\" ||\n !supportsSearchContractUiMetadata(version)\n ) {\n throw new Error(\n `searchContractVersion: 1 requires ai >=${SEARCH_CONTRACT_AI_SDK_MINIMUM} <7.0.0 to preserve structured tool-result metadata; found ai@${String(version)}.`,\n );\n }\n}\n","import type { ExecOptions, SandboxHandle } from \"@bunny-agent/manager\";\nimport { isSearchContractCapabilities } from \"../contracts\";\n\nconst CACHE_TTL_MS = 30_000;\nconst PROBE_TIMEOUT_MS = 4_000;\nconst MAX_ENDPOINTS_PER_HANDLE = 16;\nconst MAX_RESPONSE_BYTES = 16_384;\n\ninterface Flight {\n controller: AbortController;\n promise: Promise<1 | undefined>;\n waiters: number;\n settled: boolean;\n}\n\ninterface Entry {\n expiresAt: number;\n version?: 1;\n flight?: Flight;\n}\n\n// A handle belongs to one attached sandbox/transport and carries its auth. The\n// additional ID guards adapters that reuse a handle after sandbox replacement.\n// Weak ownership avoids retaining destroyed handles or their authentication.\nconst cache = new WeakMap<SandboxHandle, Map<string, Entry>>();\n\nfunction abortError(): DOMException {\n return new DOMException(\"Search capability discovery aborted.\", \"AbortError\");\n}\n\n/** Wait independently: one canceled caller must not cancel other subscribers. */\nexport function waitForSearchDiscovery<T>(\n promise: Promise<T>,\n signal?: AbortSignal,\n): Promise<T> {\n if (signal?.aborted) return Promise.reject(abortError());\n if (!signal) return promise;\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(abortError());\n signal.addEventListener(\"abort\", onAbort, { once: true });\n promise.then(resolve, reject).finally(() => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n });\n}\n\nfunction object(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** Only a successful, recognizable legacy health document proves old support. */\nfunction parseHealth(text: string): 1 | undefined {\n const status = /\\n(\\d{3})$/.exec(text);\n if (!status || status[1] !== \"200\") {\n throw new Error(\n `Search capability discovery failed (HTTP ${status?.[1] ?? \"unknown\"}).`,\n );\n }\n let health: unknown;\n try {\n health = JSON.parse(text.slice(0, status.index));\n } catch {\n throw new Error(\"Invalid daemon health response during search discovery.\");\n }\n const envelope = object(health);\n const data = object(envelope?.data);\n if (envelope?.ok !== true || data?.status !== \"ok\") {\n throw new Error(\"Invalid daemon health response during search discovery.\");\n }\n if (data.capabilities === undefined) return undefined;\n const capabilities = object(data.capabilities);\n if (!capabilities)\n throw new Error(\"Invalid daemon capability advertisement.\");\n if (capabilities.searchContracts === undefined) return undefined;\n const contracts = object(capabilities.searchContracts);\n if (!contracts)\n throw new Error(\"Invalid daemon search capability advertisement.\");\n if (contracts.pi === undefined) return undefined;\n if (!isSearchContractCapabilities(contracts.pi)) {\n throw new Error(\"Invalid Pi search capability advertisement.\");\n }\n return contracts.pi.structured_retrieval &&\n contracts.pi.explicit_source_marker_annotations\n ? 1\n : undefined;\n}\n\nasync function probe(\n handle: SandboxHandle,\n url: string,\n opts: ExecOptions,\n): Promise<1 | undefined> {\n const decoder = new TextDecoder();\n let text = \"\";\n let bytes = 0;\n try {\n // This is the same sandbox-side transport as the existing health probe.\n // Sandock uses its authenticated shell API; no host-side loopback fetch or\n // coding-run POST is used for discovery, and no credentials enter argv.\n for await (const chunk of handle.exec(\n [\n \"curl\",\n \"-sS\",\n \"--connect-timeout\",\n \"2\",\n \"--max-time\",\n \"4\",\n \"--write-out\",\n \"\\n%{http_code}\",\n \"--url\",\n url,\n ],\n opts,\n )) {\n bytes += chunk.byteLength;\n if (bytes > MAX_RESPONSE_BYTES) {\n throw new Error(\"Daemon capability response exceeds its size limit.\");\n }\n text += decoder.decode(chunk, { stream: true });\n }\n } catch {\n if (opts.signal?.aborted) throw opts.signal.reason ?? abortError();\n throw new Error(\"Search capability discovery transport failed.\");\n }\n text += decoder.decode();\n return parseHealth(text.trimEnd());\n}\n\nasync function join(\n flight: Flight,\n signal?: AbortSignal,\n): Promise<1 | undefined> {\n flight.waiters += 1;\n try {\n return await waitForSearchDiscovery(flight.promise, signal);\n } finally {\n flight.waiters -= 1;\n if (flight.waiters === 0 && !flight.settled) {\n flight.controller.abort(abortError());\n }\n }\n}\n\n/**\n * Negotiate only before execution. Cache healthy new/old results, never errors.\n * In-flight operations stay tracked until actual transport settlement even if\n * an adapter ignores abort, preventing duplicate outstanding sandbox commands.\n */\nexport async function discoverPiSearchContract(\n handle: SandboxHandle,\n daemonUrl: string,\n opts: Pick<ExecOptions, \"cwd\" | \"signal\"> = {},\n): Promise<1 | undefined> {\n if (opts.signal?.aborted) throw abortError();\n const parsed = new URL(daemonUrl);\n if (\n ![\"http:\", \"https:\"].includes(parsed.protocol) ||\n parsed.username ||\n parsed.password ||\n parsed.search ||\n parsed.hash\n ) {\n throw new Error(\"Invalid daemon URL for search capability discovery.\");\n }\n parsed.pathname = `${parsed.pathname.replace(/\\/$/, \"\").replace(/\\/healthz$/, \"\")}/healthz`;\n const url = parsed.href;\n const key = JSON.stringify([handle.getSandboxId(), url]);\n let entries = cache.get(handle);\n if (!entries) {\n entries = new Map();\n cache.set(handle, entries);\n }\n const previous = entries.get(key);\n if (previous?.flight) return join(previous.flight, opts.signal);\n if (previous && previous.expiresAt > Date.now()) return previous.version;\n entries.delete(key);\n for (const [entryKey, entry] of entries) {\n if (!entry.flight && entry.expiresAt <= Date.now())\n entries.delete(entryKey);\n }\n if (entries.size >= MAX_ENDPOINTS_PER_HANDLE) {\n const evictable = [...entries].find(([, entry]) => !entry.flight);\n if (!evictable)\n throw new Error(\"Too many pending daemon capability probes.\");\n entries.delete(evictable[0]);\n }\n\n const controller = new AbortController();\n const entry: Entry = { expiresAt: 0 };\n const flight: Flight = {\n controller,\n promise: Promise.resolve(undefined),\n waiters: 0,\n settled: false,\n };\n entry.flight = flight;\n entries.set(key, entry);\n const timer = setTimeout(() => {\n controller.abort(\n new DOMException(\n \"Search capability discovery timed out.\",\n \"TimeoutError\",\n ),\n );\n }, PROBE_TIMEOUT_MS);\n const operation = probe(handle, url, {\n cwd: opts.cwd ?? handle.getWorkdir(),\n timeout: PROBE_TIMEOUT_MS,\n signal: controller.signal,\n });\n // Keep the entry until the real operation settles, not only until our bounded\n // wait ends. Non-cooperating adapters cannot cause duplicate remote probes.\n operation.then(\n (version) => {\n flight.settled = true;\n clearTimeout(timer);\n if (controller.signal.aborted) entries.delete(key);\n else entries.set(key, { version, expiresAt: Date.now() + CACHE_TTL_MS });\n },\n () => {\n flight.settled = true;\n clearTimeout(timer);\n entries.delete(key);\n },\n );\n flight.promise = new Promise<1 | undefined>((resolve, reject) => {\n const onAbort = () => reject(controller.signal.reason ?? abortError());\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n operation.then(resolve, reject).finally(() => {\n controller.signal.removeEventListener(\"abort\", onAbort);\n });\n });\n return join(flight, opts.signal);\n}\n","import type {\n JSONObject,\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n SharedV3ProviderOptions,\n} from \"@ai-sdk/provider\";\nimport type { ToolRef } from \"@bunny-agent/manager\";\nimport type { Tool } from \"ai\";\n\nconst BUNNY_PROVIDER_OPTIONS_KEY = \"bunny-agent\";\n\ntype BunnyProviderOptions = {\n runtime?: JSONObject;\n};\n\ntype BunnyToolRuntime = Extract<\n ToolRef[\"runtime\"],\n { type: \"http\" | \"module\" }\n>;\n\ntype BunnyDynamicTool<INPUT> = Tool<INPUT, unknown> & { type: \"dynamic\" };\n\n/**\n * AI SDK helper for tools that the sandbox runner should call by HTTP.\n *\n * This is still used with the standard AI SDK `streamText`:\n * `import { streamText } from \"ai\"`.\n */\nexport function bunnyHttpTool<INPUT, OUTPUT>(\n input: Omit<Tool<INPUT, OUTPUT>, \"execute\" | \"outputSchema\"> & {\n endpoint: {\n url: string;\n headers?: Record<string, string>;\n };\n },\n): BunnyDynamicTool<INPUT> {\n return {\n type: \"dynamic\" as const,\n description: input.description,\n title: input.title,\n providerOptions: withBunnyProviderOptions(input.providerOptions, {\n runtime: {\n type: \"http\",\n url: input.endpoint.url,\n ...(input.endpoint.headers ? { headers: input.endpoint.headers } : {}),\n },\n }),\n inputSchema: input.inputSchema,\n inputExamples: input.inputExamples,\n needsApproval: input.needsApproval,\n strict: input.strict,\n onInputStart: input.onInputStart,\n onInputDelta: input.onInputDelta,\n onInputAvailable: input.onInputAvailable,\n async execute() {\n throw new Error(\n \"bunnyHttpTool is provider-executed by the sandbox runner.\",\n );\n },\n } satisfies BunnyDynamicTool<INPUT>;\n}\n\n/**\n * AI SDK helper for tools implemented by a module already present in the\n * sandbox filesystem.\n */\nexport function bunnySandboxTool<INPUT, OUTPUT>(\n input: Omit<Tool<INPUT, OUTPUT>, \"execute\" | \"outputSchema\"> & {\n module: string;\n exportName?: string;\n },\n): BunnyDynamicTool<INPUT> {\n return {\n type: \"dynamic\" as const,\n description: input.description,\n title: input.title,\n providerOptions: withBunnyProviderOptions(input.providerOptions, {\n runtime: {\n type: \"module\",\n module: input.module,\n ...(input.exportName ? { exportName: input.exportName } : {}),\n },\n }),\n inputSchema: input.inputSchema,\n inputExamples: input.inputExamples,\n needsApproval: input.needsApproval,\n strict: input.strict,\n onInputStart: input.onInputStart,\n onInputDelta: input.onInputDelta,\n onInputAvailable: input.onInputAvailable,\n async execute() {\n throw new Error(\n \"bunnySandboxTool is provider-executed by the sandbox runner.\",\n );\n },\n } satisfies BunnyDynamicTool<INPUT>;\n}\n\nexport function compileToolRefsFromLanguageModelTools(\n tools:\n | Array<LanguageModelV3FunctionTool | LanguageModelV3ProviderTool>\n | undefined,\n): ToolRef[] | undefined {\n if (!tools || tools.length === 0) return undefined;\n\n const toolRefs: ToolRef[] = [];\n\n for (const tool of tools) {\n if (tool.type !== \"function\") {\n continue;\n }\n\n const runtime = getBunnyRuntime(tool);\n if (!runtime) {\n throw new Error(\n `[bunny-agent] Tool \"${tool.name}\" was passed through AI SDK streamText, ` +\n \"but Bunny cannot access host-side tool({ execute }) callbacks at the provider boundary. \" +\n \"Use bunnyHttpTool(...) for an endpoint tool or bunnySandboxTool(...) for a sandbox-local module.\",\n );\n }\n\n toolRefs.push({\n name: tool.name,\n description: tool.description ?? \"\",\n inputSchema: tool.inputSchema as Record<string, unknown>,\n runtime,\n });\n }\n\n return toolRefs.length > 0 ? toolRefs : undefined;\n}\n\nfunction getBunnyRuntime(\n tool: LanguageModelV3FunctionTool,\n): BunnyToolRuntime | undefined {\n const options = tool.providerOptions?.[BUNNY_PROVIDER_OPTIONS_KEY] as\n | BunnyProviderOptions\n | undefined;\n const runtime = options?.runtime;\n if (!isRecord(runtime) || typeof runtime.type !== \"string\") {\n return undefined;\n }\n if (runtime.type === \"http\" && typeof runtime.url === \"string\") {\n return {\n type: \"http\",\n url: runtime.url,\n ...(isStringRecord(runtime.headers) ? { headers: runtime.headers } : {}),\n };\n }\n if (runtime.type === \"module\" && typeof runtime.module === \"string\") {\n return {\n type: \"module\",\n module: runtime.module,\n ...(typeof runtime.exportName === \"string\"\n ? { exportName: runtime.exportName }\n : {}),\n };\n }\n return undefined;\n}\n\nfunction withBunnyProviderOptions(\n providerOptions: SharedV3ProviderOptions | undefined,\n bunnyOptions: BunnyProviderOptions,\n): SharedV3ProviderOptions {\n return {\n ...(providerOptions ?? {}),\n [BUNNY_PROVIDER_OPTIONS_KEY]: {\n ...((providerOptions?.[BUNNY_PROVIDER_OPTIONS_KEY] as\n | object\n | undefined) ?? {}),\n ...bunnyOptions,\n },\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!isRecord(value)) return false;\n return Object.values(value).every((entry) => typeof entry === \"string\");\n}\n","import type { JSONValue, LanguageModelV3Usage } from \"@ai-sdk/provider\";\n\ntype JsonRecord = Record<string, JSONValue | undefined>;\n\nfunction asRecord(value: unknown): JsonRecord | undefined {\n if (value == null || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return value as JsonRecord;\n}\n\n/**\n * Extract `providerMetadata[\"bunny-agent\"]` from an AI SDK providerMetadata object.\n */\nexport function getBunnyAgentMetadata(\n providerMetadata: unknown,\n): JsonRecord | undefined {\n const providerMeta = asRecord(providerMetadata);\n if (providerMeta == null) return undefined;\n return asRecord(providerMeta[\"bunny-agent\"]);\n}\n\n/**\n * Extract Bunny Agent usage payload from an AI SDK providerMetadata object.\n *\n * This returns the raw usage object emitted by Bunny Agent stream metadata,\n * e.g. `{ input_tokens, output_tokens, cache_read_input_tokens, ... }`.\n */\nexport function getBunnyAgentUsage(\n providerMetadata: unknown,\n): LanguageModelV3Usage | undefined {\n const bunnyMeta = getBunnyAgentMetadata(providerMetadata);\n if (bunnyMeta == null) return undefined;\n return normalizeBunnyAgentUsage(bunnyMeta);\n}\n\n/**\n * Convert Bunny Agent usage metadata to AI SDK standard usage shape.\n *\n * Accepts either:\n * - a metadata object that contains `usage` plus extra fields (model/cost/image/search)\n * - or a direct usage payload in snake_case token fields.\n *\n * `raw` preserves usage fields and includes extra metadata fields when available.\n */\nexport function normalizeBunnyAgentUsage(\n data: unknown,\n): LanguageModelV3Usage | undefined {\n const dataRecord = asRecord(data);\n if (dataRecord == null) return undefined;\n\n const usageSource = asRecord(dataRecord.usage ?? dataRecord);\n if (usageSource == null) return undefined;\n const hasTokenFields =\n \"input_tokens\" in usageSource ||\n \"output_tokens\" in usageSource ||\n \"cache_read_input_tokens\" in usageSource ||\n \"cache_creation_input_tokens\" in usageSource;\n if (!hasTokenFields) return undefined;\n\n const inputTokens =\n typeof usageSource.input_tokens === \"number\" ? usageSource.input_tokens : 0;\n const outputTokens =\n typeof usageSource.output_tokens === \"number\"\n ? usageSource.output_tokens\n : 0;\n const cacheRead =\n typeof usageSource.cache_read_input_tokens === \"number\"\n ? usageSource.cache_read_input_tokens\n : 0;\n const cacheWrite =\n typeof usageSource.cache_creation_input_tokens === \"number\"\n ? usageSource.cache_creation_input_tokens\n : 0;\n const textTokens =\n typeof usageSource.text_tokens === \"number\"\n ? usageSource.text_tokens\n : undefined;\n const reasoningTokens =\n typeof usageSource.reasoning_tokens === \"number\"\n ? usageSource.reasoning_tokens\n : undefined;\n const extraMetadata = Object.fromEntries(\n Object.entries(dataRecord).filter(([key]) => key !== \"usage\"),\n ) as JsonRecord;\n const raw =\n Object.keys(extraMetadata).length > 0\n ? { ...usageSource, ...extraMetadata }\n : usageSource;\n\n return {\n inputTokens: {\n total: inputTokens + cacheRead + cacheWrite,\n noCache: inputTokens,\n cacheRead,\n cacheWrite,\n },\n outputTokens: {\n total: outputTokens,\n text: textTokens,\n reasoning: reasoningTokens,\n },\n raw,\n };\n}\n","import type {\n EmbeddingModelV3,\n ImageModelV3,\n LanguageModelV3,\n ProviderV3,\n} from \"@ai-sdk/provider\";\nimport { NoSuchModelError } from \"@ai-sdk/provider\";\nimport type { RunnerSpec } from \"@bunny-agent/manager\";\nimport { BunnyAgentLanguageModel } from \"./bunny-agent-language-model\";\nimport { getProviderLogger } from \"./logging\";\nimport type { BunnyAgentModelId, BunnyAgentProviderSettings } from \"./types\";\n\nexport type { BunnyAgentProviderSettings } from \"./types\";\n\n/**\n * BunnyAgent provider interface that extends the AI SDK's ProviderV3.\n */\nexport interface BunnyAgentProvider extends ProviderV3 {\n (\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ): LanguageModelV3;\n\n languageModel(\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ): LanguageModelV3;\n\n chat(\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ): LanguageModelV3;\n\n embeddingModel(modelId: string): EmbeddingModelV3;\n textEmbeddingModel(modelId: string): EmbeddingModelV3;\n imageModel(modelId: string): ImageModelV3;\n}\n\n/**\n * Creates a BunnyAgent provider instance with the specified configuration.\n *\n * @example\n * ```typescript\n * import { createBunnyAgent } from '@bunny-agent/sdk';\n * import { E2BSandbox } from '@bunny-agent/sandbox-e2b';\n * import { generateText } from 'ai';\n *\n * const bunnyAgent = createBunnyAgent({\n * sandbox: new E2BSandbox({ apiKey: process.env.E2B_API_KEY! }),\n * env: {\n * ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY!,\n * },\n * });\n *\n * const { text } = await generateText({\n * model: bunnyAgent('sonnet'),\n * prompt: 'Create a hello world program',\n * });\n * ```\n */\nexport function createBunnyAgent(\n defaultOptions: BunnyAgentProviderSettings,\n): BunnyAgentProvider {\n const logger = getProviderLogger(defaultOptions);\n\n if (!defaultOptions.sandbox) {\n throw new Error(\n \"Provide a `sandbox` adapter (e.g. E2BSandbox, LocalMachine). \" +\n \"Optional `daemonUrl` uses in-sandbox HTTP to bunny-agent-daemon (no automatic `/healthz` probe unless searchContractVersion is `auto`). Use `isBunnyAgentDaemonHealthy` from `@bunny-agent/sdk` if you want to probe and omit `daemonUrl` for CLI fallback. Omit `daemonUrl` to always use CLI.\",\n );\n }\n\n const createModel = (\n modelId: BunnyAgentModelId,\n options: Partial<BunnyAgentProviderSettings> = {},\n ): LanguageModelV3 => {\n const mergedSkillPaths =\n options.skillPaths !== undefined\n ? options.skillPaths\n : defaultOptions.skillPaths;\n\n const mergedAllowedTools =\n options.allowedTools !== undefined\n ? options.allowedTools\n : defaultOptions.allowedTools;\n const searchContractVersion =\n options.searchContractVersion ?? defaultOptions.searchContractVersion;\n\n const runner: RunnerSpec = {\n model: modelId,\n runnerType: options.runnerType ?? defaultOptions.runnerType,\n outputFormat: \"stream\",\n maxTurns: options.maxTurns ?? defaultOptions.maxTurns,\n ...((options.yolo ?? defaultOptions.yolo) !== undefined\n ? { yolo: options.yolo ?? defaultOptions.yolo }\n : {}),\n ...((options.systemPrompt ?? defaultOptions.systemPrompt)\n ? { systemPrompt: options.systemPrompt ?? defaultOptions.systemPrompt }\n : {}),\n ...(mergedSkillPaths && mergedSkillPaths.length > 0\n ? { skillPaths: mergedSkillPaths }\n : {}),\n ...(mergedAllowedTools !== undefined\n ? { allowedTools: mergedAllowedTools }\n : {}),\n ...((options.effort ?? defaultOptions.effort)\n ? {\n effort: options.effort ?? defaultOptions.effort,\n }\n : {}),\n ...(searchContractVersion === 1\n ? { searchContractVersion: 1 as const }\n : {}),\n };\n\n const mergedOptions = {\n ...defaultOptions,\n ...options,\n searchContractVersion,\n runner,\n env: {\n ...defaultOptions.env,\n ...options.env,\n },\n systemEnv:\n defaultOptions.systemEnv || options.systemEnv\n ? {\n ...(defaultOptions.systemEnv ?? {}),\n ...(options.systemEnv ?? {}),\n }\n : undefined,\n artifactProcessors: [\n ...(defaultOptions.artifactProcessors ?? []),\n ...(options.artifactProcessors ?? []),\n ],\n toolRefs:\n options.toolRefs !== undefined\n ? options.toolRefs\n : defaultOptions.toolRefs,\n } as BunnyAgentProviderSettings & { runner: RunnerSpec };\n\n logger.debug(\n `[bunny-agent] Creating model: ${modelId}${runner.runnerType ? ` (runnerType: ${runner.runnerType})` : \"\"}${runner.skillPaths?.length ? ` skillPaths=${runner.skillPaths.length}` : \"\"}`,\n );\n\n return new BunnyAgentLanguageModel({\n id: modelId,\n options: mergedOptions,\n });\n };\n\n const provider = function (\n modelId: BunnyAgentModelId,\n options?: Partial<BunnyAgentProviderSettings>,\n ) {\n if (new.target) {\n throw new Error(\n \"The BunnyAgent model function cannot be called with the new keyword.\",\n );\n }\n\n return createModel(modelId, options);\n };\n\n provider.languageModel = createModel;\n provider.chat = createModel;\n provider.specificationVersion = \"v3\" as const;\n\n provider.embeddingModel = (modelId: string): EmbeddingModelV3 => {\n throw new NoSuchModelError({\n modelId,\n modelType: \"embeddingModel\",\n });\n };\n\n provider.textEmbeddingModel = (modelId: string): EmbeddingModelV3 => {\n throw new NoSuchModelError({\n modelId,\n modelType: \"embeddingModel\",\n });\n };\n\n provider.imageModel = (modelId: string): ImageModelV3 => {\n throw new NoSuchModelError({\n modelId,\n modelType: \"imageModel\",\n });\n };\n\n return provider as BunnyAgentProvider;\n}\n","import { approvalFileName, type SandboxAdapter } from \"@bunny-agent/manager\";\nimport type { SubmitAnswerParams } from \"./types\";\n\n/**\n * Options for submitAnswer\n */\nexport interface SubmitAnswerOptions {\n /**\n * Optional base path prefix for approval files\n * @default \".bunny-agent/approvals\"\n */\n basePath?: string;\n}\n\n/**\n * Submit user's answer for an AskUserQuestion tool call.\n * Writes the answer file to `.bunny-agent/approvals/{toolCallId}.json` in the sandbox workdir.\n *\n * @example\n * ```typescript\n * import { submitAnswer } from \"@bunny-agent/sdk\";\n *\n * await submitAnswer(sandbox, {\n * toolCallId: \"tool-456\",\n * questions: [...],\n * answers: { \"Question 1\": \"Answer 1\" },\n * });\n * ```\n */\nexport async function submitAnswer(\n sandbox: SandboxAdapter,\n params: SubmitAnswerParams,\n options?: SubmitAnswerOptions,\n): Promise<void> {\n const { toolCallId, questions, answers } = params;\n const basePath = options?.basePath ?? \".bunny-agent/approvals\";\n\n const allAnswered = questions.every(\n (q) => answers[q.question] !== undefined && answers[q.question] !== \"\",\n );\n\n const answerData = {\n questions,\n answers,\n status: allAnswered ? \"completed\" : \"pending\",\n timestamp: new Date().toISOString(),\n };\n\n const filename = approvalFileName(toolCallId);\n const handle = sandbox.getHandle() ?? (await sandbox.attach());\n // Absolute path so remote sandboxes (Sandock) write to the same path the runner reads (/workspace/.bunny-agent/approvals).\n const workdir = handle.getWorkdir();\n const targetDir = workdir\n ? `${workdir.replace(/\\/$/, \"\")}/${basePath}`\n : basePath;\n\n await handle.upload(\n [{ path: filename, content: JSON.stringify(answerData, null, 2) }],\n targetDir,\n );\n\n console.log(\n `[submitAnswer] Answer submitted: ${targetDir}/${filename} (status: ${answerData.status}, workdir: ${workdir ?? \"(none)\"})`,\n );\n}\n"],"mappings":";;;;;;;AA2BA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAOP,SAAS,cAAc,oBAAoB;AAK3C,SAAS,kBAAkB;;;AC7B3B;AAAA,EAEE;AAAA,EAIA;AAAA,EAEA;AAAA,OAEK;;;ACrBA,SAAS,kBACd,UACQ;AACR,MAAI,SAAS,WAAW,OAAO;AAC7B,WAAO;AAAA,MACL,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,OAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,SAAS,QAAQ;AACnB,WAAO,SAAS;AAAA,EAClB;AAEA,QAAM,YAAY,SAAS,WAAW;AACtC,SAAO;AAAA,IACL,OAAO,CAAC,QAAQ,aAAa,QAAQ,MAAM,GAAG;AAAA,IAC9C,MAAM,CAAC,QAAQ,aAAa,QAAQ,KAAK,GAAG;AAAA,IAC5C,MAAM,CAAC,QAAQ,QAAQ,KAAK,GAAG;AAAA,IAC/B,OAAO,CAAC,QAAQ,QAAQ,MAAM,GAAG;AAAA,EACnC;AACF;;;AC1BA,SAAS,qBAAqB;AAGvB,IAAM,iCAAiC;AAEvC,SAAS,iCAAiC,SAA0B;AACzE,QAAM,QAAQ,kCAAkC,KAAK,OAAO;AAC5D,SAAO,CAAC,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,MAAM,CAAC,CAAC,KAAK;AACjE;AAQA,eAAsB,mCAAkD;AACtE,MAAI;AACJ,MAAI;AAGF,UAAM,cAAc,cAAc,YAAY,GAAG,EAAE,iBAAiB;AAGpE,cAAU,YAAY;AAAA,EACxB,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MACE,OAAO,YAAY,YACnB,CAAC,iCAAiC,OAAO,GACzC;AACA,UAAM,IAAI;AAAA,MACR,0CAA0C,8BAA8B,iEAAiE,OAAO,OAAO,CAAC;AAAA,IAC1J;AAAA,EACF;AACF;;;ACnCA,IAAM,eAAe;AACrB,IAAM,mBAAmB;AACzB,IAAM,2BAA2B;AACjC,IAAM,qBAAqB;AAkB3B,IAAM,QAAQ,oBAAI,QAA2C;AAE7D,SAAS,aAA2B;AAClC,SAAO,IAAI,aAAa,wCAAwC,YAAY;AAC9E;AAGO,SAAS,uBACd,SACA,QACY;AACZ,MAAI,QAAQ,QAAS,QAAO,QAAQ,OAAO,WAAW,CAAC;AACvD,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,IAAI,QAAW,CAAC,SAAS,WAAW;AACzC,UAAM,UAAU,MAAM,OAAO,WAAW,CAAC;AACzC,WAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACxD,YAAQ,KAAK,SAAS,MAAM,EAAE,QAAQ,MAAM;AAC1C,aAAO,oBAAoB,SAAS,OAAO;AAAA,IAC7C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,OAAO,OAAqD;AACnE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,QACD;AACN;AAGA,SAAS,YAAY,MAA6B;AAChD,QAAM,SAAS,aAAa,KAAK,IAAI;AACrC,MAAI,CAAC,UAAU,OAAO,CAAC,MAAM,OAAO;AAClC,UAAM,IAAI;AAAA,MACR,4CAA4C,SAAS,CAAC,KAAK,SAAS;AAAA,IACtE;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,KAAK,MAAM,GAAG,OAAO,KAAK,CAAC;AAAA,EACjD,QAAQ;AACN,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,QAAM,WAAW,OAAO,MAAM;AAC9B,QAAM,OAAO,OAAO,UAAU,IAAI;AAClC,MAAI,UAAU,OAAO,QAAQ,MAAM,WAAW,MAAM;AAClD,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AACA,MAAI,KAAK,iBAAiB,OAAW,QAAO;AAC5C,QAAM,eAAe,OAAO,KAAK,YAAY;AAC7C,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,0CAA0C;AAC5D,MAAI,aAAa,oBAAoB,OAAW,QAAO;AACvD,QAAM,YAAY,OAAO,aAAa,eAAe;AACrD,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,iDAAiD;AACnE,MAAI,UAAU,OAAO,OAAW,QAAO;AACvC,MAAI,CAAC,6BAA6B,UAAU,EAAE,GAAG;AAC/C,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,SAAO,UAAU,GAAG,wBAClB,UAAU,GAAG,qCACX,IACA;AACN;AAEA,eAAe,MACb,QACA,KACA,MACwB;AACxB,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,MAAI;AAIF,qBAAiB,SAAS,OAAO;AAAA,MAC/B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,IACF,GAAG;AACD,eAAS,MAAM;AACf,UAAI,QAAQ,oBAAoB;AAC9B,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AACA,cAAQ,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,IAChD;AAAA,EACF,QAAQ;AACN,QAAI,KAAK,QAAQ,QAAS,OAAM,KAAK,OAAO,UAAU,WAAW;AACjE,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AACA,UAAQ,QAAQ,OAAO;AACvB,SAAO,YAAY,KAAK,QAAQ,CAAC;AACnC;AAEA,eAAe,KACb,QACA,QACwB;AACxB,SAAO,WAAW;AAClB,MAAI;AACF,WAAO,MAAM,uBAAuB,OAAO,SAAS,MAAM;AAAA,EAC5D,UAAE;AACA,WAAO,WAAW;AAClB,QAAI,OAAO,YAAY,KAAK,CAAC,OAAO,SAAS;AAC3C,aAAO,WAAW,MAAM,WAAW,CAAC;AAAA,IACtC;AAAA,EACF;AACF;AAOA,eAAsB,yBACpB,QACA,WACA,OAA4C,CAAC,GACrB;AACxB,MAAI,KAAK,QAAQ,QAAS,OAAM,WAAW;AAC3C,QAAM,SAAS,IAAI,IAAI,SAAS;AAChC,MACE,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,OAAO,QAAQ,KAC7C,OAAO,YACP,OAAO,YACP,OAAO,UACP,OAAO,MACP;AACA,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO,WAAW,GAAG,OAAO,SAAS,QAAQ,OAAO,EAAE,EAAE,QAAQ,cAAc,EAAE,CAAC;AACjF,QAAM,MAAM,OAAO;AACnB,QAAM,MAAM,KAAK,UAAU,CAAC,OAAO,aAAa,GAAG,GAAG,CAAC;AACvD,MAAI,UAAU,MAAM,IAAI,MAAM;AAC9B,MAAI,CAAC,SAAS;AACZ,cAAU,oBAAI,IAAI;AAClB,UAAM,IAAI,QAAQ,OAAO;AAAA,EAC3B;AACA,QAAM,WAAW,QAAQ,IAAI,GAAG;AAChC,MAAI,UAAU,OAAQ,QAAO,KAAK,SAAS,QAAQ,KAAK,MAAM;AAC9D,MAAI,YAAY,SAAS,YAAY,KAAK,IAAI,EAAG,QAAO,SAAS;AACjE,UAAQ,OAAO,GAAG;AAClB,aAAW,CAAC,UAAUA,MAAK,KAAK,SAAS;AACvC,QAAI,CAACA,OAAM,UAAUA,OAAM,aAAa,KAAK,IAAI;AAC/C,cAAQ,OAAO,QAAQ;AAAA,EAC3B;AACA,MAAI,QAAQ,QAAQ,0BAA0B;AAC5C,UAAM,YAAY,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,EAAEA,MAAK,MAAM,CAACA,OAAM,MAAM;AAChE,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,4CAA4C;AAC9D,YAAQ,OAAO,UAAU,CAAC,CAAC;AAAA,EAC7B;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAe,EAAE,WAAW,EAAE;AACpC,QAAM,SAAiB;AAAA,IACrB;AAAA,IACA,SAAS,QAAQ,QAAQ,MAAS;AAAA,IAClC,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACA,QAAM,SAAS;AACf,UAAQ,IAAI,KAAK,KAAK;AACtB,QAAM,QAAQ,WAAW,MAAM;AAC7B,eAAW;AAAA,MACT,IAAI;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,gBAAgB;AACnB,QAAM,YAAY,MAAM,QAAQ,KAAK;AAAA,IACnC,KAAK,KAAK,OAAO,OAAO,WAAW;AAAA,IACnC,SAAS;AAAA,IACT,QAAQ,WAAW;AAAA,EACrB,CAAC;AAGD,YAAU;AAAA,IACR,CAAC,YAAY;AACX,aAAO,UAAU;AACjB,mBAAa,KAAK;AAClB,UAAI,WAAW,OAAO,QAAS,SAAQ,OAAO,GAAG;AAAA,UAC5C,SAAQ,IAAI,KAAK,EAAE,SAAS,WAAW,KAAK,IAAI,IAAI,aAAa,CAAC;AAAA,IACzE;AAAA,IACA,MAAM;AACJ,aAAO,UAAU;AACjB,mBAAa,KAAK;AAClB,cAAQ,OAAO,GAAG;AAAA,IACpB;AAAA,EACF;AACA,SAAO,UAAU,IAAI,QAAuB,CAAC,SAAS,WAAW;AAC/D,UAAM,UAAU,MAAM,OAAO,WAAW,OAAO,UAAU,WAAW,CAAC;AACrE,eAAW,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACnE,cAAU,KAAK,SAAS,MAAM,EAAE,QAAQ,MAAM;AAC5C,iBAAW,OAAO,oBAAoB,SAAS,OAAO;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACD,SAAO,KAAK,QAAQ,KAAK,MAAM;AACjC;;;AClOA,IAAM,6BAA6B;AAmB5B,SAAS,cACd,OAMyB;AACzB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,IACb,iBAAiB,yBAAyB,MAAM,iBAAiB;AAAA,MAC/D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,KAAK,MAAM,SAAS;AAAA,QACpB,GAAI,MAAM,SAAS,UAAU,EAAE,SAAS,MAAM,SAAS,QAAQ,IAAI,CAAC;AAAA,MACtE;AAAA,IACF,CAAC;AAAA,IACD,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,eAAe,MAAM;AAAA,IACrB,QAAQ,MAAM;AAAA,IACd,cAAc,MAAM;AAAA,IACpB,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB,MAAM,UAAU;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,iBACd,OAIyB;AACzB,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM;AAAA,IACb,iBAAiB,yBAAyB,MAAM,iBAAiB;AAAA,MAC/D,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,MAAM;AAAA,QACd,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,MAC7D;AAAA,IACF,CAAC;AAAA,IACD,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,eAAe,MAAM;AAAA,IACrB,QAAQ,MAAM;AAAA,IACd,cAAc,MAAM;AAAA,IACpB,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB,MAAM,UAAU;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sCACd,OAGuB;AACvB,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AAEzC,QAAM,WAAsB,CAAC;AAE7B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,YAAY;AAC5B;AAAA,IACF;AAEA,UAAM,UAAU,gBAAgB,IAAI;AACpC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR,uBAAuB,KAAK,IAAI;AAAA,MAGlC;AAAA,IACF;AAEA,aAAS,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,aAAa,KAAK,eAAe;AAAA,MACjC,aAAa,KAAK;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;AAEA,SAAS,gBACP,MAC8B;AAC9B,QAAM,UAAU,KAAK,kBAAkB,0BAA0B;AAGjE,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,SAAS,UAAU;AAC1D,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,SAAS,UAAU,OAAO,QAAQ,QAAQ,UAAU;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,QAAQ;AAAA,MACb,GAAI,eAAe,QAAQ,OAAO,IAAI,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,YAAY,OAAO,QAAQ,WAAW,UAAU;AACnE,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,QAAQ;AAAA,MAChB,GAAI,OAAO,QAAQ,eAAe,WAC9B,EAAE,YAAY,QAAQ,WAAW,IACjC,CAAC;AAAA,IACP;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBACP,iBACA,cACyB;AACzB,SAAO;AAAA,IACL,GAAI,mBAAmB,CAAC;AAAA,IACxB,CAAC,0BAA0B,GAAG;AAAA,MAC5B,GAAK,kBAAkB,0BAA0B,KAE/B,CAAC;AAAA,MACnB,GAAG;AAAA,IACL;AAAA,EACF;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,eAAe,OAAiD;AACvE,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,SAAO,OAAO,OAAO,KAAK,EAAE,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ;AACxE;;;ACnLA,SAAS,SAAS,OAAwC;AACxD,MAAI,SAAS,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AACtE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,sBACd,kBACwB;AACxB,QAAM,eAAe,SAAS,gBAAgB;AAC9C,MAAI,gBAAgB,KAAM,QAAO;AACjC,SAAO,SAAS,aAAa,aAAa,CAAC;AAC7C;AAQO,SAAS,mBACd,kBACkC;AAClC,QAAM,YAAY,sBAAsB,gBAAgB;AACxD,MAAI,aAAa,KAAM,QAAO;AAC9B,SAAO,yBAAyB,SAAS;AAC3C;AAWO,SAAS,yBACd,MACkC;AAClC,QAAM,aAAa,SAAS,IAAI;AAChC,MAAI,cAAc,KAAM,QAAO;AAE/B,QAAM,cAAc,SAAS,WAAW,SAAS,UAAU;AAC3D,MAAI,eAAe,KAAM,QAAO;AAChC,QAAM,iBACJ,kBAAkB,eAClB,mBAAmB,eACnB,6BAA6B,eAC7B,iCAAiC;AACnC,MAAI,CAAC,eAAgB,QAAO;AAE5B,QAAM,cACJ,OAAO,YAAY,iBAAiB,WAAW,YAAY,eAAe;AAC5E,QAAM,eACJ,OAAO,YAAY,kBAAkB,WACjC,YAAY,gBACZ;AACN,QAAM,YACJ,OAAO,YAAY,4BAA4B,WAC3C,YAAY,0BACZ;AACN,QAAM,aACJ,OAAO,YAAY,gCAAgC,WAC/C,YAAY,8BACZ;AACN,QAAM,aACJ,OAAO,YAAY,gBAAgB,WAC/B,YAAY,cACZ;AACN,QAAM,kBACJ,OAAO,YAAY,qBAAqB,WACpC,YAAY,mBACZ;AACN,QAAM,gBAAgB,OAAO;AAAA,IAC3B,OAAO,QAAQ,UAAU,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,OAAO;AAAA,EAC9D;AACA,QAAM,MACJ,OAAO,KAAK,aAAa,EAAE,SAAS,IAChC,EAAE,GAAG,aAAa,GAAG,cAAc,IACnC;AAEN,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO,cAAc,YAAY;AAAA,MACjC,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA;AAAA,EACF;AACF;;;ALlDA,SAAS,kBAAkB,OAAwB;AACjD,MAAI,iBAAiB,OAAO;AAC1B,UAAM,QAAQ,CAAC,MAAM,OAAO;AAC5B,QAAI,QAAiB,MAAM;AAC3B,WAAO,iBAAiB,OAAO;AAC7B,YAAM,KAAK,MAAM,OAAO;AACxB,cAAQ,MAAM;AAAA,IAChB;AACA,WAAO,MAAM,KAAK,YAAY;AAAA,EAChC;AACA,SAAO,OAAO,KAAK;AACrB;AAGA,SAAS,8BACP,UAC4B;AAC5B,QAAM,WAAW,SAAS,OAAO,aAAa,EAAE;AAChD,SAAO,IAAI,eAA2B;AAAA,IACpC,MAAM,KAAK,YAAY;AACrB,UAAI;AACF,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,SAAS,KAAK;AAC5C,cAAI,MAAM;AACR,uBAAW,MAAM;AACjB;AAAA,UACF;AACA,cAAI,MAAM,aAAa,GAAG;AACxB,uBAAW,QAAQ,KAAK;AACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,cAAM,UACH,iBAAiB,SAAS,MAAM,SAAS,gBACzC,OAAO,iBAAiB,eACvB,iBAAiB,gBACjB,MAAM,SAAS,gBAChB,iBAAiB,SAAS,SAAS,KAAK,MAAM,OAAO;AACxD,YAAI,SAAS;AACX,qBAAW,MAAM;AAAA,QACnB,OAAO;AACL,qBAAW,MAAM,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,OAAO,QAAQ;AACnB,YAAM,SAAS,SAAS,MAAM;AAAA,IAChC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cACP,gBACA,cACuB;AACvB,QAAM,SAAS,CAAC,GAAI,kBAAkB,CAAC,GAAI,GAAI,gBAAgB,CAAC,CAAE;AAClE,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,oBAAoB,UAA6B;AACxD,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,QAAI,SAAS,CAAC,EAAE,SAAS,OAAQ,QAAO,IAAI;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,eAAe,iBACb,MACA,mBAC8C;AAC9C,MAAI,CAAC,kBAAkB,WAAW,QAAQ,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,2CAA2C,iBAAiB;AAAA,IAC9D;AAAA,EACF;AACA,QAAM,UAAU,+BAA+B,KAAK,IAAI;AACxD,MAAI,SAAS;AACX,QAAI,CAAC,QAAQ,CAAC,EAAE,WAAW,QAAQ,GAAG;AACpC,YAAM,IAAI;AAAA,QACR,+CAA+C,QAAQ,CAAC,CAAC;AAAA,MAC3D;AAAA,IACF;AACA,WAAO,EAAE,WAAW,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE;AAAA,EACnD;AACA,MAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,UAAM,WAAW,MAAM,MAAM,MAAM,EAAE,UAAU,SAAS,CAAC;AACzD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,0CAA0C,SAAS,MAAM;AAAA,MAC3D;AAAA,IACF;AACA,UAAM,gBAAgB,OAAO,SAAS,QAAQ,IAAI,gBAAgB,KAAK,CAAC;AACxE,QAAI,gBAAgB,KAAK,OAAO,MAAM;AACpC,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,UAAM,YACJ,SAAS,QAAQ,IAAI,cAAc,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AACzD,QAAI,CAAC,UAAU,WAAW,QAAQ,GAAG;AACnC,YAAM,IAAI,MAAM,6CAA6C,SAAS,EAAE;AAAA,IAC1E;AACA,UAAM,QAAQ,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AACzD,QAAI,MAAM,aAAa,KAAK,OAAO,MAAM;AACvC,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,WAAO,EAAE,WAAW,MAAM,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAE;AAAA,EAClE;AACA,SAAO,EAAE,WAAW,mBAAmB,KAAK;AAC9C;AAEA,eAAsB,4BACpB,UACA,gBAC2B;AAC3B,QAAM,WAAW,iBACb,WACA,SAAS,MAAM,oBAAoB,QAAQ,CAAC;AAChD,QAAM,OAAiB,CAAC;AACxB,QAAM,SAAoC,CAAC;AAC3C,MAAI,cAAc;AAElB,aAAW,WAAW,UAAU;AAC9B,QAAI,gBAAgB;AAClB,YAAM,OAAO,QAAQ,KAAK,CAAC,EAAE,YAAY,IAAI,QAAQ,KAAK,MAAM,CAAC;AACjE,WAAK,KAAK,GAAG,IAAI,IAAI;AAAA,IACvB;AACA,UAAM,QACJ,OAAO,QAAQ,YAAY,WACvB,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,QAAQ,CAAC,IACjD,QAAQ;AACd,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,QAAQ;AACxB,aAAK,KAAK,KAAK,IAAI;AACnB;AAAA,MACF;AACA,qBAAe;AACf,YAAM,QAAQ,WAAW,WAAW;AACpC,YAAM,WAAW,MAAM,iBAAiB,KAAK,MAAM,KAAK,QAAQ;AAChE,UAAI,CAAC,KAAK,KAAK,EAAE,EAAE,SAAS,KAAK,EAAG,MAAK,KAAK,KAAK;AACnD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,SAAS,WAAW;AAAA,QACxB;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,SAAK,KAAK,MAAM;AAAA,EAClB;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,CAAC,GAAG,QAAQ,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC;AAAA,IAClE,cAAc,CAAC;AAAA,IACf,WAAW;AAAA,MACT,YAAY;AAAA,MACZ,QAAQ,CAAC;AAAA,MACT,cAAc,CAAC;AAAA,MACf,YAAY,CAAC;AAAA,MACb,gBAAgB,CAAC;AAAA,MACjB,mBAAmB,CAAC;AAAA,IACtB;AAAA,EACF;AACF;AAEA,SAAS,mBAAyC;AAChD,SAAO;AAAA,IACL,aAAa;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAEA,SAAS,oBAAoB,QAA0C;AACrE,MAAI,OAAO,OAAO,YAAY,WAAW;AACvC,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,qBAAqB;AACrC;AAEA,SAAS,sBACP,UACA,MAC0B;AAC1B,QAAM,SAAS,EAAE,GAAG,SAAS;AAC7B,aAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC,GAAG;AAC3D,WAAO,QAAQ,IAAI,EAAE,GAAG,OAAO,QAAQ,GAAG,GAAG,OAAO;AAAA,EACtD;AACA,SAAO;AACT;AAKO,IAAM,0BAAN,MAAM,yBAAmD;AAAA,EACrD,uBAAuB;AAAA,EACvB;AAAA,EACA;AAAA,EACA,gBAA0C;AAAA,IACjD,WAAW,CAAC,IAAI;AAAA,EAClB;AAAA,EAES;AAAA,EACQ;AAAA,EACA;AAAA,EACT;AAAA,EACA,cAAmC,oBAAI,IAAI;AAAA,EAC3C,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA;AAAA;AAAA,EAGA,mBAAgC,oBAAI,IAAI;AAAA,EAC/B,mBAAmB,oBAAI,IAAY;AAAA,EACnC,mBAAmB,oBAAI,IAAY;AAAA,EACnC,WAAW,oBAAI,IAAoB;AAAA,EACnC,eAAe,oBAAI,IAAsC;AAAA,EACzD,eAAe,oBAAI,IAAsC;AAAA,EACzD,iBAAiB,oBAAI,IAAqC;AAAA,EAC1D,eAAe,oBAAI,IAGlC;AAAA,EACM,kBAA6C,CAAC;AAAA,EACrC,sBAAsB,oBAAI,IAAY;AAAA,EACtC,mBAAmB,oBAAI,IAAY;AAAA;AAAA,EAG5C,aACN,KACA,YAC0B;AAC1B,UAAM,WAAW;AAAA,MACf,eAAe,SAAY,SAAY,KAAK,aAAa,IAAI,UAAU;AAAA,MACvE,OAAO,OAAO,QAAQ,WACjB,MACD;AAAA,IACN;AACA,UAAM,EAAE,gBAAgB,2BAA2B,GAAG,cAAc,IAClE,SAAS,aAAa,KAAK,CAAC;AAC9B,UAAM,SAAmC;AAAA,MACvC,GAAG;AAAA,MACH,eAAe;AAAA,QACb,GAAG,KAAK;AAAA,QACR,GAAG;AAAA,QACH,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,QACtD,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;AAAA,QACjD,GAAI,KAAK,6BACL;AAAA,UACE,gBAAgB,KACb;AAAA,QACL,IACA,CAAC;AAAA,MACP;AAAA,IACF;AACA,QAAI,eAAe,OAAW,MAAK,aAAa,IAAI,YAAY,MAAM;AACtE,WAAO;AAAA,EACT;AAAA,EAEQ,iBACN,QAC0B;AAC1B,UAAM,KAAK,OAAO;AAClB,UAAM,WAAW;AAAA,MACf,KAAK,aAAa,IAAI,EAAE;AAAA,MACxB,KAAK,aAAa,OAAO,gBAAgB;AAAA,IAC3C;AACA,SAAK,aAAa,IAAI,IAAI,QAAQ;AAClC,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,UAA+C;AACrE,UAAM,SAAS,KAAK,eAAe,IAAI,QAAQ;AAC/C,UAAM,QAAQ,KAAK,aAAa,IAAI,QAAQ;AAC5C,QACE,CAAC,UACD,CAAC,SACD,KAAK,iBAAiB,IAAI,QAAQ,KAClC,OAAO,OAAO,QAAQ,YACtB,CAAC,cAAc,OAAO,GAAG,KACzB,IAAI,IAAI,OAAO,GAAG,EAAE,SAAS,IAAI,IAAI,MAAM,GAAG,EAAE;AAEhD,aAAO,CAAC;AACV,SAAK,iBAAiB,IAAI,QAAQ;AAClC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,IAAI;AAAA,QACJ,KAAK,OAAO;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,GAAI,OAAO,mBACP,EAAE,kBAAkB,KAAK,aAAa,OAAO,gBAAgB,EAAE,IAC/D,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBAAsB,WAAmB,OAAsB;AACrE,UAAM,UAAU,UAAU,KAAK;AAC/B,QAAI,CAAC,QAAS;AACd,UAAM,iBAAiB,gDAAgD;AAAA,MACrE;AAAA,IACF;AACA,UAAM,UAAU,QAAQ,MAAM,GAAG,GAAG;AACpC,UAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,QAAI,gBAAgB;AAClB,WAAK,OAAO;AAAA,QACV,6DAA6D,OAAO,cAAc,GAAG;AAAA,MACvF;AAAA,IACF,OAAO;AAIL,WAAK,OAAO;AAAA,QACV,uCAAuC,OAAO,cAAc,GAAG;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,cAA8C;AACxD,SAAK,UAAU,aAAa;AAC5B,SAAK,WAAW,aAAa;AAC7B,SAAK,UAAU,aAAa;AAC5B,SAAK,SAAS,kBAAkB,aAAa,OAAO;AACpD,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,WACJ,SACwC;AACxC,UAAM,EAAE,QAAQ,QAAQ,IAAI,MAAM,KAAK,SAAS,OAAO;AACvD,UAAM,SAAS,OAAO,UAAU;AAEhC,UAAM,UAAoC,CAAC;AAC3C,UAAM,WAA8B,CAAC;AACrC,QAAI,eAA4C;AAAA,MAC9C,SAAS;AAAA,MACT,KAAK;AAAA,IACP;AACA,QAAI,QAA8B,iBAAiB;AACnD,QAAI;AAEJ,UAAM,YAAY,oBAAI,IAGpB;AACF,UAAM,iBAAgD,oBAAI,IAAI;AAC9D,UAAM,aACJ,oBAAI,IAAI;AAEV,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,gBAAQ,MAAM,MAAM;AAAA,UAClB,KAAK,cAAc;AACjB,sBAAU,IAAI,MAAM,IAAI;AAAA,cACtB,MAAM;AAAA,cACN,kBAAkB,MAAM;AAAA,YAC1B,CAAC;AACD;AAAA,UACF;AAAA,UACA,KAAK,cAAc;AACjB,kBAAM,OAAO,UAAU,IAAI,MAAM,EAAE;AACnC,gBAAI,MAAM;AACR,mBAAK,QAAQ,MAAM;AACnB,mBAAK,mBAAmB;AAAA,gBACtB,KAAK;AAAA,gBACL,MAAM;AAAA,cACR;AAAA,YACF;AACA;AAAA,UACF;AAAA,UACA,KAAK,YAAY;AACf,kBAAM,OAAO,UAAU,IAAI,MAAM,EAAE;AACnC,gBAAI,MAAM;AACR,sBAAQ,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,MAAM,KAAK;AAAA,gBACX,kBAAkB;AAAA,kBAChB,KAAK;AAAA,kBACL,MAAM;AAAA,gBACR;AAAA,cACF,CAAC;AACD,wBAAU,OAAO,MAAM,EAAE;AAAA,YAC3B;AACA;AAAA,UACF;AAAA,UACA,KAAK,mBAAmB;AACtB,2BAAe,IAAI,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC;AACzC;AAAA,UACF;AAAA,UACA,KAAK,mBAAmB;AACtB,kBAAM,OAAO,eAAe,IAAI,MAAM,EAAE;AACxC,gBAAI,MAAM;AACR,mBAAK,QAAQ,MAAM;AAAA,YACrB;AACA;AAAA,UACF;AAAA,UACA,KAAK,iBAAiB;AACpB,kBAAM,OAAO,eAAe,IAAI,MAAM,EAAE;AACxC,gBAAI,QAAQ,KAAK,KAAK,SAAS,GAAG;AAChC,sBAAQ,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,MAAM,KAAK;AAAA,cACb,CAAC;AAAA,YACH;AACA;AAAA,UACF;AAAA,UACA,KAAK,oBAAoB;AACvB,uBAAW,IAAI,MAAM,IAAI,EAAE,UAAU,MAAM,UAAU,OAAO,GAAG,CAAC;AAChE;AAAA,UACF;AAAA,UACA,KAAK,oBAAoB;AACvB,kBAAM,OAAO,WAAW,IAAI,MAAM,EAAE;AACpC,gBAAI,MAAM;AACR,mBAAK,SAAS,MAAM;AAAA,YACtB;AACA;AAAA,UACF;AAAA,UACA,KAAK,kBAAkB;AACrB;AAAA,UACF;AAAA,UACA,KAAK,aAAa;AAChB,oBAAQ,KAAK,KAAK;AAClB;AAAA,UACF;AAAA,UACA,KAAK,eAAe;AAClB,oBAAQ,KAAK,KAAK;AAClB;AAAA,UACF;AAAA,UACA,KAAK,UAAU;AACb,oBAAQ,KAAK,KAAK;AAClB;AAAA,UACF;AAAA,UACA,KAAK,gBAAgB;AACnB,qBAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B;AAAA,UACF;AAAA,UACA,KAAK,SAAS;AAGZ,kBAAM,UACJ,MAAM,iBAAiB,QACnB,MAAM,MAAM,UACZ,OAAO,MAAM,UAAU,WACrB,MAAM,QACN,MAAM,QACJ,OAAO,MAAM,KAAK,IAClB;AAGV,oBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAC5C,2BAAe,EAAE,SAAS,SAAS,KAAK,QAAQ;AAChD;AAAA,UACF;AAAA,UACA,KAAK,UAAU;AACb,2BAAe,MAAM;AACrB,oBAAQ,MAAM;AACd,+BAAmB,MAAM;AACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,aAAO,YAAY;AAAA,IACrB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SACJ,SACsC;AAGtC,QAAI,oBAAoB,KAAK;AAC7B,QAAI;AACJ,QAAI,KAAK,QAAQ,0BAA0B,QAAQ;AACjD,UAAI,CAAC,KAAK,QAAQ,SAAS;AACzB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,UAAI,QAAQ,aAAa,SAAS;AAChC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI;AACJ,UAAI,KAAK,QAAQ,OAAO,eAAe,QAAQ,KAAK,QAAQ,WAAW;AACrE,2BAAmB,MAAM;AAAA,UACvB,KAAK,QAAQ,QAAQ,OAAO;AAAA,UAC5B,QAAQ;AAAA,QACV;AACA,kBAAU,MAAM;AAAA,UACd;AAAA,UACA,KAAK,QAAQ;AAAA,UACb;AAAA,YACE,KAAK,KAAK,QAAQ;AAAA,YAClB,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AACA,0BAAoB;AAAA,QAClB,GAAG,KAAK;AAAA,QACR,QAAQ,EAAE,GAAG,KAAK,QAAQ,QAAQ,uBAAuB,QAAQ;AAAA,MACnE;AAAA,IACF;AACA,UAAM,aAAa,IAAI,yBAAwB;AAAA,MAC7C,IAAI,KAAK;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,WAAO,WAAW,mBAAmB,SAAS,gBAAgB;AAAA,EAChE;AAAA,EAEA,MAAc,mBACZ,SACA,kBACsC;AACtC,QAAI,KAAK,mCAAmC,GAAG;AAC7C,YAAM,iCAAiC;AAAA,IACzC;AACA,UAAM,EAAE,QAAQ,YAAY,IAAI;AAChC,UAAM,WAAW,KAAK,wBAAwB,MAAM;AAEpD,SAAK,OAAO;AAAA,MACV,sCAAsC,SAAS,MAAM;AAAA,IACvD;AAEA,UAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,sCAAsC,QAAQ,KAAK;AACxE,UAAM,WAAW,cAAc,KAAK,QAAQ,UAAU,YAAY;AAElE,UAAM,YAAY,KAAK,QAAQ;AAE/B,QAAI,WAAW;AACb,YAAM,SAAS,oBAAqB,MAAM,QAAQ,OAAO;AACzD,YAAMC,cAAa,QAAQ,SAAS,KAAK,CAAC;AAC1C,YAAM,YAAY,EAAE,GAAGA,aAAY,GAAG,KAAK,QAAQ,IAAI;AACvD,YAAM,OAAgC;AAAA,QACpC,GAAI,MAAM,KAAK;AAAA,UACb;AAAA,UACA,OAAO,WAAW;AAAA,UAClB;AAAA,QACF;AAAA,QACA,GAAI,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,EAAE,KAAK,UAAU,IAAI,CAAC;AAAA,QAC9D,GAAI,KAAK,QAAQ,aACjB,OAAO,KAAK,KAAK,QAAQ,SAAS,EAAE,SAAS,IACzC,EAAE,WAAW,KAAK,QAAQ,UAAU,IACpC,CAAC;AAAA,MACP;AACA,YAAM,WAAW;AAAA,QACf,KAAK,KAAK,QAAQ,OAAO,OAAO,WAAW;AAAA,QAC3C,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,QAKR,SAAS;AAAA,MACX;AACA,YAAM,WAAW;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,cAAc,8BAA8B,QAAQ;AAC1D,aAAO,KAAK,kBAAkB,aAAa,UAAU,WAAW;AAAA,IAClE;AAEA,UAAM,aAAa,QAAQ,SAAS,KAAK,CAAC;AAC1C,UAAM,iBACJ,KAAK,QAAQ,OAAO,QAAQ,aAAa,KAAK;AAOhD,UAAM,QAAQ,IAAI,WAAW;AAAA,MAC3B;AAAA,MACA,QAAQ,KAAK,QAAQ;AAAA,MACrB,KAAK;AAAA,QACH,GAAG;AAAA,QACH,GAAG,KAAK,QAAQ;AAAA,QAChB,GAAI,KAAK,QAAQ,aAAa,CAAC;AAAA,MACjC;AAAA,IACF,CAAC;AAED,QAAI;AACF,YAAM,QAAQ,MAAM;AAAA,QAClB;AAAA,QACA,EAAE,KAAK,QAAQ,UAAU,KAAK,QAAQ;AAAA,MACxC;AACA,YAAM,cAAc,MAAM,MAAM,OAAO;AAAA,QACrC;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACT,MAAM;AAAA,QACR;AAAA,QACA,QAAQ,KAAK,QAAQ;AAAA,QACrB,UAAU,KAAK,QAAQ;AAAA,QACvB,QAAQ;AAAA,QACR,GAAI,YAAY,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,QACtD,GAAI,KAAK,QAAQ,YACb,EAAE,WAAW,KAAK,QAAQ,UAAU,IACpC,CAAC;AAAA,MACP,CAAC;AACD,aAAO,KAAK,kBAAkB,aAAa,UAAU,WAAW;AAAA,IAClE,SAAS,OAAO;AACd,YAAM,MAAM,QAAQ,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACpC,UAAI,iBAAiB,kBAAkB;AACrC,cAAM,cAAc,IAAI,eAA2B;AAAA,UACjD,MAAM,YAAY;AAChB,uBAAW,MAAM,KAAK;AAAA,UACxB;AAAA,QACF,CAAC;AACD,eAAO,KAAK,kBAAkB,aAAa,UAAU,WAAW;AAAA,MAClE;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,IAAY,iCAAgD;AAC1D,WAAO,KAAK,QAAQ,OAAO,0BAA0B,IAAI,IAAI;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,wCAAqE;AAC3E,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,cAAc;AAAA,UACZ,SAAS;AAAA,UACT,KAAK;AAAA,QACP;AAAA,QACA,OAAO,iBAAiB;AAAA,QACxB,kBAAkB,KAAK,aAAa,MAAS;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,qBAAkD;AACxD,QAAI,KAAK,yBAAyB,KAAM,QAAO,CAAC;AAChD,UAAM,KAAK,KAAK;AAChB,SAAK,wBAAwB;AAC7B,WAAO,CAAC,EAAE,MAAM,iBAAiB,GAAG,CAAC;AAAA,EACvC;AAAA;AAAA,EAGQ,0BAAuD;AAC7D,QACE,KAAK,mCAAmC,KACxC,KAAK,+BAA+B,QACpC;AACA,aAAO,KAAK,sCAAsC;AAAA,IACpD;AACA,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO,IAAI;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,cAAc,EAAE,SAAS,SAAS,KAAK,wBAAwB;AAAA,QAC/D,OAAO,iBAAiB;AAAA,QACxB,kBAAkB,KAAK,aAAa,MAAS;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,UACA,aACA,UACkC;AAClC,UAAM,SAAS,KAAK,QAAQ;AAC5B,UAAM,MAAM,KAAK,QAAQ,OAAO;AAEhC,UAAM,oBAAoB;AAAA,MACxB,KAAK,QAAQ,UAAU,KAAK,QAAQ;AAAA,IACtC;AACA,UAAM,QAAQ,MAAM;AAAA,MAClB;AAAA,MACA,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,QAAQ,OAAO,cAAc;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,QAAQ;AAAA,MACrB,UAAU,KAAK,QAAQ;AAAA,MACvB,cAAc,KAAK,QAAQ,gBAAgB,OAAO;AAAA,MAClD,UAAU,KAAK,QAAQ,YAAY,OAAO;AAAA,MAC1C,cAAc,OAAO,gBAAgB,KAAK,QAAQ;AAAA,MAClD,YAAY,OAAO,cAAc,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA,MAI9C,MACE,KAAK,QAAQ,SAAS,OAAO,eAAe,OAAO,OAAO;AAAA,MAC5D,GAAI,YAAY,SAAS,SAAS,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,MACtD,GAAI,KAAK,QAAQ,YAAY,EAAE,WAAW,KAAK,QAAQ,UAAU,IAAI,CAAC;AAAA,MACtE,GAAI,KAAK,QAAQ,SAAS,EAAE,QAAQ,KAAK,QAAQ,OAAO,IAAI,CAAC;AAAA,MAC7D,GAAI,OAAO,0BAA0B,SACjC,EAAE,uBAAuB,OAAO,sBAAsB,IACtD,CAAC;AAAA,MACL,GAAI,KAAK,QAAQ,UAAU,EAAE,SAAS,KAAK,QAAQ,QAAQ,IAAI,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,kBACN,aACA,UACA,QAC6B;AAC7B,UAAM,SAAS,YAAY,UAAU;AAErC,WAAO;AAAA,MACL,QAAQ,KAAK,uCAAuC,QAAQ,MAAM;AAAA,MAClE,SAAS;AAAA,QACP,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,uCACN,QACA,QAC2C;AAC3C,UAAM,OAAO;AAEb,WAAO,IAAI,eAA0C;AAAA,MACnD,MAAM,MAAM,YAAY;AACtB,YAAI;AACF,cAAI,SAAS;AAIb,gBAAM,UAAU,IAAI,YAAY;AAEhC,iBAAO,MAAM;AACX,kBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAE1C,gBAAI,MAAM;AACR,wBAAU,QAAQ,OAAO;AACzB,kBAAI,OAAO,KAAK,GAAG;AACjB,sBAAM,QAAQ,KAAK,eAAe,MAAM;AACxC,2BAAW,QAAQ,OAAO;AACxB,6BAAW,QAAQ,IAAI;AAAA,gBACzB;AAAA,cACF;AACA,kBAAI,CAAC,KAAK,kBAAkB,CAAC,QAAQ,SAAS;AAC5C,2BAAW,QAAQ,KAAK,wBAAwB,GAAG;AACjD,6BAAW,QAAQ,IAAI;AAAA,gBACzB;AAAA,cACF;AACA,yBAAW,MAAM;AACjB;AAAA,YACF;AAEA,sBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,kBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,qBAAS,MAAM,IAAI,KAAK;AAExB,gBAAI,YAAY;AAChB,uBAAW,QAAQ,OAAO;AACxB,oBAAM,cAAc,KAAK,KAAK;AAC9B,kBAAI,CAAC,eAAe,YAAY,WAAW,GAAG,EAAG;AACjD,oBAAM,YAAY,KAAK,WAAW,QAAQ,IACtC,KAAK,MAAM,CAAC,IACZ;AACJ,kBAAI,cAAc,UAAU;AAC1B,4BAAY;AACZ;AAAA,cACF;AAEA,kBAAI;AACF,sBAAM,QAAQ,KAAK,aAAa,SAAS;AACzC,2BAAW,QAAQ,OAAO;AACxB,6BAAW,QAAQ,IAAI;AAEvB,sBAAI,KAAK,WAAW;AAClB,0BAAM,YAAoB,KAAK;AAE/B,wBAAI,KAAK,QAAQ,oBAAoB,QAAQ;AAC3C,iCAAW,aAAa,KAAK,QAAQ,oBAAoB;AACvD,gCAAQ,QAAQ,EACb,KAAK,MAAM,UAAU,SAAS,MAAM,SAAS,CAAC,EAC9C,MAAM,CAAC,MAAM;AACZ,+BAAK,OAAO;AAAA,4BACV,2CAA2C,CAAC;AAAA,0BAC9C;AAAA,wBACF,CAAC;AAAA,sBACL;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF,SAAS,GAAG;AAEV,qBAAK,sBAAsB,WAAW,CAAC;AAAA,cACzC;AAAA,YACF;AAEA,gBAAI,WAAW;AACb,kBAAI,CAAC,KAAK,kBAAkB,CAAC,QAAQ,SAAS;AAC5C,2BAAW,QAAQ,KAAK,wBAAwB,GAAG;AACjD,6BAAW,QAAQ,IAAI;AAAA,gBACzB;AAAA,cACF;AACA,yBAAW,MAAM;AACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,UACH,iBAAiB,SAAS,MAAM,SAAS,gBACzC,OAAO,iBAAiB,eACvB,iBAAiB,gBACjB,MAAM,SAAS,gBAChB,iBAAiB,SAChB,UAAU,SACV,MAAM,SAAS;AACnB,cAAI,SAAS;AACX,iBAAK,OAAO,KAAK,sCAAsC;AACvD,uBAAW,MAAM;AAAA,UACnB,OAAO;AACL,iBAAK,OAAO;AAAA,cACV,+BAA+B,kBAAkB,KAAK,CAAC;AAAA,YACzD;AAGA,uBAAW,QAAQ,EAAE,MAAM,SAAS,MAAM,CAAC;AAC3C,gBAAI,CAAC,KAAK,gBAAgB;AACxB,mBAAK,iBAAiB;AACtB,yBAAW,QAAQ,KAAK,mBAAmB;AACzC,2BAAW,QAAQ,IAAI;AACzB,yBAAW,QAAQ;AAAA,gBACjB,MAAM;AAAA,gBACN,cAAc,EAAE,SAAS,SAAS,KAAK,kBAAkB;AAAA,gBACzD,OAAO,iBAAiB;AAAA,cAC1B,CAAC;AAAA,YACH;AACA,uBAAW,MAAM;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAS;AACP,eAAO,OAAO;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,eAAe,QAA6C;AAClE,UAAM,QAAqC,CAAC;AAC5C,UAAM,QAAQ,OAAO,MAAM,IAAI;AAE/B,eAAW,QAAQ,OAAO;AACxB,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,CAAC,eAAe,YAAY,WAAW,GAAG,EAAG;AACjD,YAAM,YAAY,KAAK,WAAW,QAAQ,IAAI,KAAK,MAAM,CAAC,IAAI;AAC9D,UAAI,cAAc,SAAU;AAC5B,UAAI;AACF,cAAM,cAAc,KAAK,aAAa,SAAS;AAC/C,cAAM,KAAK,GAAG,WAAW;AAAA,MAC3B,SAAS,GAAG;AACV,aAAK,sBAAsB,WAAW,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,MAA2C;AAC9D,UAAM,QAAqC,CAAC;AAC5C,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAM,aACJ,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAClD,QACE,KAAK,kBACL,eAAe,WACf,EAAE,CAAC,cAAc,OAAO,OAAO,UAAU;AAEzC,aAAO;AAGT,QAAI,CAAC,cAAc,OAAO,OAAO,UAAU,UAAU;AACnD,UAAI,KAAK,iBAAiB,IAAI,OAAO,KAAK,EAAG,QAAO;AACpD,WAAK,iBAAiB,IAAI,OAAO,KAAK;AACtC,aAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,YAAY;AAAA,MAClB,KAAK,SAAS;AACZ;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,QAAQ;AACX,cAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,YAAI,KAAK,SAAS,GAAG;AACnB,gBAAM,KAAK,eAAe,EAAE,KAAK,qBAAqB;AACtD,gBAAM;AAAA,YACJ;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA,kBAAkB,KAAK,aAAa,OAAO,kBAAkB,EAAE;AAAA,YACjE;AAAA,YACA,EAAE,MAAM,cAAc,IAAI,OAAO,KAAK;AAAA,YACtC;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA,kBAAkB,KAAK,aAAa,OAAO,kBAAkB,EAAE;AAAA,YACjE;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,WAAW,OAAO;AACxB,cAAM,MAAM,KAAK,UAAU,QAAQ;AACnC,YAAI,KAAK,oBAAoB,IAAI,GAAG,EAAG;AACvC,aAAK,oBAAoB,IAAI,GAAG;AAChC,YAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,gBAAM,EAAE,gBAAgB,kBAAkB,GAAG,OAAO,IAAI;AACxD,eAAK,kBAAkB;AAAA,YACrB,GAAG,KAAK;AAAA,YACR,GAAG;AAAA,UACL;AAAA,QACF;AACA,YACE,UAAU,aACV,OAAO,SAAS,cAAc,YAC9B,KAAK,cAAc,SAAS,WAC5B;AACA,eAAK,YAAY,SAAS;AAC1B,eAAK,OAAO;AAAA,YACV,uCAAuC,KAAK,SAAS;AAAA,UACvD;AACA,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,UAAU,KAAK;AAAA,UACjB,CAAC;AAAA,QACH;AACA,YACE,KAAK,mCAAmC,KACxC,6BAA6B,UAAU,cAAc,KACrD,KAAK,+BAA+B,QACpC;AACA,eAAK,6BAA6B,SAAS;AAC3C,eAAK,OAAO;AAAA,YACV,+CAA+C,KAAK,UAAU,KAAK,0BAA0B,CAAC;AAAA,UAChG;AAAA,QACF;AACA;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,KAAK,cAAc;AACjB,cAAM,QAAQ,OAAO,UAAU,UAAU,UAAU;AACnD,aAAK,QAAQ,eAAe;AAAA,UAC1B;AAAA,UACA,GAAI,OAAO,OAAO,YAAY,YAC1B,EAAE,SAAS,OAAO,QAAQ,IAC1B,CAAC;AAAA,UACL,GAAI,OAAO,OAAO,YAAY,WAC1B,EAAE,SAAS,OAAO,QAAQ,IAC1B,CAAC;AAAA,UACL,GAAI,OAAO,OAAO,cAAc,WAC5B,EAAE,WAAW,OAAO,UAAU,IAC9B,CAAC;AAAA,UACL,GAAI,OAAO,OAAO,eAAe,WAC7B,EAAE,YAAY,OAAO,WAAW,IAChC,CAAC;AAAA,UACL,GAAI,OAAO,OAAO,UAAU,WAAW,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,QACpE,CAAC;AACD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,KAAK,aAAa;AAChB,cAAM,OACJ,OAAO,OAAO,SAAS,WACnB,OAAO,OACP,OAAO,OAAO,UAAU,WACtB,OAAO,QACP;AACR,YAAI,KAAK,SAAS,GAAG;AACnB,cAAI,KAAK,yBAAyB,MAAM;AACtC,iBAAK,wBAAwB,aAAa,EAAE,KAAK,qBAAqB;AACtE,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,IAAI,KAAK;AAAA,YACX,CAAC;AAAA,UACH;AACA,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,IAAI,KAAK;AAAA,YACT,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AACA;AAAA,MACF;AAAA,MAEA,KAAK,cAAc;AACjB,cAAM,KAAK,OAAO;AAClB,YAAI,KAAK,SAAS,IAAI,EAAE,KAAK,KAAK,iBAAiB,IAAI,EAAE,EAAG;AAC5D,aAAK,SAAS,IAAI,IAAI,EAAE;AACxB,cAAM,KAAK,GAAG,KAAK,mBAAmB,CAAC;AACvC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,kBAAkB,KAAK,aAAa,OAAO,kBAAkB,EAAE;AAAA,QACjE,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,cAAc;AACjB,cAAM,KAAK,OAAO;AAClB,YAAI,KAAK,iBAAiB,IAAI,EAAE,EAAG;AACnC,aAAK,SAAS;AAAA,UACZ;AAAA,WACC,KAAK,SAAS,IAAI,EAAE,KAAK,MAAO,OAAO;AAAA,QAC1C;AACA,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,GAAI,OAAO,mBACP;AAAA,YACE,kBAAkB,KAAK;AAAA,cACrB,OAAO;AAAA,cACP;AAAA,YACF;AAAA,UACF,IACA,CAAC;AAAA,QACP,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,YAAY;AACf,cAAM,KAAK,OAAO;AAClB,YAAI,KAAK,iBAAiB,IAAI,EAAE,EAAG;AACnC,aAAK,iBAAiB,IAAI,EAAE;AAC5B,cAAM,cAAc,OAAO;AAG3B,cAAM,gBAAgB,cAAc,aAAa;AAGjD,cAAM,WAAW,eAAe;AAChC,YACE,KAAK,8BACL,gCAAgC,UAAU;AAAA,UACxC,MAAM,KAAK,SAAS,IAAI,EAAE,KAAK;AAAA,QACjC,CAAC,GACD;AACA,qBAAW,WAAW,SAAS,UAAU;AACvC,kBAAM,aAAa,SAAS,YAAY,QAAQ,gBAAgB;AAChE,iBAAK,aAAa,IAAI,QAAQ,WAAW;AAAA,cACvC,KAAK,WAAW;AAAA,cAChB,OAAO,WAAW;AAAA,YACpB,CAAC;AACD,kBAAM,KAAK,GAAG,KAAK,gBAAgB,QAAQ,SAAS,CAAC;AAAA,UACvD;AAAA,QACF;AACA,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,kBAAkB,KAAK,aAAa,aAAa,EAAE;AAAA,QACrD,CAAC;AACD;AAAA,MACF;AAAA;AAAA;AAAA,MAIA,KAAK,cAAc;AACjB,cAAM,WAAW,OAAO;AACxB,YACE,OAAO,aAAa,YACpB,OAAO,OAAO,QAAQ,YACtB,CAAC,cAAc,OAAO,GAAG;AAEzB;AACF,YAAI,KAAK,mCAAmC,GAAG;AAC7C,cAAI,CAAC,KAAK,eAAe,IAAI,QAAQ;AACnC,iBAAK,eAAe,IAAI,UAAU,MAAM;AAC1C,gBAAM,KAAK,GAAG,KAAK,gBAAgB,QAAQ,CAAC;AAC5C;AAAA,QACF;AACA,YAAI,KAAK,iBAAiB,IAAI,QAAQ,EAAG;AACzC,aAAK,iBAAiB,IAAI,QAAQ;AAClC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,IAAI;AAAA,UACJ,KAAK,OAAO;AAAA,UACZ,GAAI,OAAO,OAAO,UAAU,WAAW,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,QACpE,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,KAAK,GAAG,KAAK,mBAAmB,CAAC;AACvC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,UAAU,OAAO;AAAA,UACjB,SAAS,oBAAoB,MAAM;AAAA,UACnC,kBAAkB,OAAO;AAAA,UACzB,kBAAkB,KAAK,iBAAiB,MAAM;AAAA,QAChD,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,kBAAkB,KAAK,iBAAiB,MAAM;AAAA,QAChD,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI,OAAO;AAAA,UACX,kBAAkB,KAAK,iBAAiB,MAAM;AAAA,QAChD,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,wBAAwB;AAC3B,cAAM,aAAa,OAAO;AAC1B,cAAM,WAAW,OAAO;AACxB,cAAM,QAAQ,OAAO;AACrB,aAAK,YAAY,IAAI,YAAY,QAAQ;AACzC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,OAAO,KAAK,UAAU,KAAK;AAAA,UAC3B,SAAS,oBAAoB,MAAM;AAAA,UACnC,kBAAkB,OAAO;AAAA,UACzB,kBAAkB,KAAK,iBAAiB,MAAM;AAAA,QAChD,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,yBAAyB;AAC5B,YAAI,KAAK,iBAAiB,IAAI,OAAO,UAAoB,EAAG;AAC5D,aAAK,iBAAiB,IAAI,OAAO,UAAoB;AACrD,cAAM,WAAW,KAAK,YAAY,IAAI,OAAO,UAAoB;AACjE,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,YAAY,OAAO;AAAA,UACnB,UAAU,YAAY;AAAA,UACtB,QAAQ,OAAO;AAAA,UACf,SAAS,OAAO;AAAA,UAChB,SAAS,oBAAoB,MAAM;AAAA,UACnC,kBAAkB,KAAK,iBAAiB,MAAM;AAAA,QAChD,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,qBAAqB;AACxB,YAAI,KAAK,iBAAiB,IAAI,OAAO,UAAoB,EAAG;AAC5D,aAAK,iBAAiB,IAAI,OAAO,UAAoB;AACrD,cAAM,WAAW,KAAK,YAAY,IAAI,OAAO,UAAoB;AACjE,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,YAAY,OAAO;AAAA,UACnB,UAAU,YAAY;AAAA,UACtB,QAAS,OAAO,aAAwB;AAAA,UACxC,SAAS;AAAA,UACT,SAAS,oBAAoB,MAAM;AAAA,UACnC,kBAAkB,KAAK,iBAAiB,MAAM;AAAA,QAChD,CAAC;AACD;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,UACH,OAAO,aACP,OAAO,SACR;AACF,YAAI,KAAK,iBAAiB,IAAI,OAAO,EAAG;AACxC,aAAK,iBAAiB,IAAI,OAAO;AACjC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,OAAO,IAAI,MAAM,OAAO;AAAA,QAC1B,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,UAAU;AACb,aAAK,iBAAiB;AACtB,cAAM,KAAK,GAAG,KAAK,mBAAmB,CAAC;AACvC,cAAM,kBAAkB,OAAO;AAC/B,YAAI;AAEJ,YACE,OAAO,oBAAoB,YAC3B,oBAAoB,QACpB,aAAa,iBACb;AACA,yBAAe;AAAA,QACjB,OAAO;AACL,yBAAe,KAAK,gBAAgB,eAAyB;AAAA,QAC/D;AAOA,YACE,KAAK,mCAAmC,KACxC,KAAK,+BAA+B,UACpC,aAAa,YAAY,SACzB;AACA,gBAAM,KAAK,GAAG,KAAK,sCAAsC,CAAC;AAC1D;AAAA,QACF;AAEA,cAAM,QACJ;AAAA,UACG,OAAO,mBAA+C;AAAA,QACzD,KAAK,iBAAiB;AAExB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,kBAAkB,KAAK;AAAA,YACrB;AAAA,cACE,OAAO;AAAA,cACP;AAAA,gBACE,eAAgB,OAAO,mBAAmB,CAAC;AAAA,cAI7C;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,QAA0C;AACxE,UAAM,WAAsB,CAAC;AAE7B,eAAW,WAAW,QAAQ;AAC5B,cAAQ,QAAQ,MAAM;AAAA,QACpB,KAAK,UAAU;AACb,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,QAAQ;AAAA,UACnB,CAAC;AACD;AAAA,QACF;AAAA,QAEA,KAAK,QAAQ;AACX,gBAAM,QAAQ,QAAQ,QACnB,IAAI,CAAC,SAAS;AACb,gBAAI,KAAK,SAAS,QAAQ;AACxB,qBAAO,EAAE,MAAM,QAAiB,MAAM,KAAK,KAAK;AAAA,YAClD;AACA,gBAAI,KAAK,SAAS,QAAQ;AAExB,kBAAI,UAAU;AACd,kBAAI,KAAK,gBAAgB,YAAY;AACnC,0BAAU,QAAQ,KAAK,SAAS,WAAW,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,QAAQ,CAAC;AAAA,cACtF,WAAW,KAAK,gBAAgB,KAAK;AACnC,0BAAU,KAAK,KAAK,SAAS;AAAA,cAC/B,WAAW,OAAO,KAAK,SAAS,UAAU;AAExC,0BAAU,KAAK;AAAA,cACjB;AACA,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,UAAU,KAAK,aAAa;AAAA,gBAC5B,MAAM;AAAA,cACR;AAAA,YACF;AACA,mBAAO;AAAA,UACT,CAAC,EACA;AAAA,YACC,CACE,MAIA,MAAM;AAAA,UACV;AAEF,cAAI,MAAM,SAAS,GAAG;AAEpB,kBAAM,YAAY,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM;AACtD,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,SAAS,YACL,MACG,IAAI,CAAC,MAAO,EAAqC,IAAI,EACrD,KAAK,IAAI,IACZ;AAAA,YACN,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAAA,QAEA,KAAK,aAAa;AAChB,gBAAM,YAAY,QAAQ,QACvB;AAAA,YACC,CAAC,SACC,KAAK,SAAS;AAAA,UAClB,EACC,IAAI,CAAC,SAAS,KAAK,IAAI;AAE1B,cAAI,UAAU,SAAS,GAAG;AACxB,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,SAAS,UAAU,KAAK,IAAI;AAAA,YAC9B,CAAC;AAAA,UACH;AACA;AAAA,QACF;AAAA,QAEA,KAAK,QAAQ;AACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBACN,QAC6B;AAC7B,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,EAAE,SAAS,QAAQ,KAAK,OAAO;AAAA,MACxC,KAAK;AACH,eAAO,EAAE,SAAS,UAAU,KAAK,OAAO;AAAA,MAC1C,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,SAAS,cAAc,KAAK,OAAO;AAAA,MAC9C,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,SAAS,kBAAkB,KAAK,OAAO;AAAA,MAClD,KAAK;AACH,eAAO,EAAE,SAAS,SAAS,KAAK,OAAO;AAAA,MACzC;AACE,eAAO,EAAE,SAAS,SAAS,KAAK,UAAU,UAAU;AAAA,IACxD;AAAA,EACF;AACF;;;AMx7CA,SAAS,wBAAwB;AAsD1B,SAAS,iBACd,gBACoB;AACpB,QAAM,SAAS,kBAAkB,cAAc;AAE/C,MAAI,CAAC,eAAe,SAAS;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,cAAc,CAClB,SACA,UAA+C,CAAC,MAC5B;AACpB,UAAM,mBACJ,QAAQ,eAAe,SACnB,QAAQ,aACR,eAAe;AAErB,UAAM,qBACJ,QAAQ,iBAAiB,SACrB,QAAQ,eACR,eAAe;AACrB,UAAM,wBACJ,QAAQ,yBAAyB,eAAe;AAElD,UAAM,SAAqB;AAAA,MACzB,OAAO;AAAA,MACP,YAAY,QAAQ,cAAc,eAAe;AAAA,MACjD,cAAc;AAAA,MACd,UAAU,QAAQ,YAAY,eAAe;AAAA,MAC7C,IAAK,QAAQ,QAAQ,eAAe,UAAU,SAC1C,EAAE,MAAM,QAAQ,QAAQ,eAAe,KAAK,IAC5C,CAAC;AAAA,MACL,GAAK,QAAQ,gBAAgB,eAAe,eACxC,EAAE,cAAc,QAAQ,gBAAgB,eAAe,aAAa,IACpE,CAAC;AAAA,MACL,GAAI,oBAAoB,iBAAiB,SAAS,IAC9C,EAAE,YAAY,iBAAiB,IAC/B,CAAC;AAAA,MACL,GAAI,uBAAuB,SACvB,EAAE,cAAc,mBAAmB,IACnC,CAAC;AAAA,MACL,GAAK,QAAQ,UAAU,eAAe,SAClC;AAAA,QACE,QAAQ,QAAQ,UAAU,eAAe;AAAA,MAC3C,IACA,CAAC;AAAA,MACL,GAAI,0BAA0B,IAC1B,EAAE,uBAAuB,EAAW,IACpC,CAAC;AAAA,IACP;AAEA,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,KAAK;AAAA,QACH,GAAG,eAAe;AAAA,QAClB,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,WACE,eAAe,aAAa,QAAQ,YAChC;AAAA,QACE,GAAI,eAAe,aAAa,CAAC;AAAA,QACjC,GAAI,QAAQ,aAAa,CAAC;AAAA,MAC5B,IACA;AAAA,MACN,oBAAoB;AAAA,QAClB,GAAI,eAAe,sBAAsB,CAAC;AAAA,QAC1C,GAAI,QAAQ,sBAAsB,CAAC;AAAA,MACrC;AAAA,MACA,UACE,QAAQ,aAAa,SACjB,QAAQ,WACR,eAAe;AAAA,IACvB;AAEA,WAAO;AAAA,MACL,iCAAiC,OAAO,GAAG,OAAO,aAAa,iBAAiB,OAAO,UAAU,MAAM,EAAE,GAAG,OAAO,YAAY,SAAS,eAAe,OAAO,WAAW,MAAM,KAAK,EAAE;AAAA,IACxL;AAEA,WAAO,IAAI,wBAAwB;AAAA,MACjC,IAAI;AAAA,MACJ,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,SACf,SACA,SACA;AACA,QAAI,YAAY;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,YAAY,SAAS,OAAO;AAAA,EACrC;AAEA,WAAS,gBAAgB;AACzB,WAAS,OAAO;AAChB,WAAS,uBAAuB;AAEhC,WAAS,iBAAiB,CAAC,YAAsC;AAC/D,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,WAAS,qBAAqB,CAAC,YAAsC;AACnE,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,WAAS,aAAa,CAAC,YAAkC;AACvD,UAAM,IAAI,iBAAiB;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC9LA,SAAS,wBAA6C;AA6BtD,eAAsB,aACpB,SACA,QACA,SACe;AACf,QAAM,EAAE,YAAY,WAAW,QAAQ,IAAI;AAC3C,QAAM,WAAW,SAAS,YAAY;AAEtC,QAAM,cAAc,UAAU;AAAA,IAC5B,CAAC,MAAM,QAAQ,EAAE,QAAQ,MAAM,UAAa,QAAQ,EAAE,QAAQ,MAAM;AAAA,EACtE;AAEA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA,QAAQ,cAAc,cAAc;AAAA,IACpC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,QAAM,WAAW,iBAAiB,UAAU;AAC5C,QAAM,SAAS,QAAQ,UAAU,KAAM,MAAM,QAAQ,OAAO;AAE5D,QAAM,UAAU,OAAO,WAAW;AAClC,QAAM,YAAY,UACd,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,IAAI,QAAQ,KACzC;AAEJ,QAAM,OAAO;AAAA,IACX,CAAC,EAAE,MAAM,UAAU,SAAS,KAAK,UAAU,YAAY,MAAM,CAAC,EAAE,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,oCAAoC,SAAS,IAAI,QAAQ,aAAa,WAAW,MAAM,cAAc,WAAW,QAAQ;AAAA,EAC1H;AACF;;;ARqBO,IAAM,UAAU;","names":["entry","sandboxEnv"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bunny-agent/sdk",
3
- "version": "0.10.0-beta.3",
3
+ "version": "0.10.0-beta.5",
4
4
  "description": "BunnyAgent SDK - AI Provider and React hooks for building AI agents",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -56,9 +56,9 @@
56
56
  "dependencies": {
57
57
  "@ai-sdk/provider": "^3.0.8",
58
58
  "@ai-sdk/react": "^3.0.267",
59
- "@bunny-agent/manager": "0.10.0-beta.3",
60
- "@bunny-agent/sandbox-srt": "0.10.0-beta.3",
61
- "@bunny-agent/sandbox-local": "0.10.0-beta.3"
59
+ "@bunny-agent/manager": "0.10.0-beta.5",
60
+ "@bunny-agent/sandbox-srt": "0.10.0-beta.5",
61
+ "@bunny-agent/sandbox-local": "0.10.0-beta.5"
62
62
  },
63
63
  "devDependencies": {
64
64
  "ai": "6.0.264",