@opencode-ai/cli-linux-arm64
Advanced tools
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write((yield* ServiceConfig.get(Option.getOrUndefined(input.key))) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";42BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "2B0B3A459E6BA6D664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "DF90C063B3CED6DA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/tool-stream.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { LLMError, LLMEvent, type ProviderMetadata, type ToolCall, type ToolInputError } from \"../../schema\"\nimport { eventError, parseToolInput, type ToolAccumulator } from \"../shared\"\n\ntype StreamKey = string | number\n\n/**\n * One pending streamed tool call. Providers emit the tool identity and JSON\n * argument text across separate chunks; `input` is the raw JSON string collected\n * so far, not the parsed object.\n */\nexport interface PendingTool extends ToolAccumulator {\n readonly providerExecuted?: boolean\n readonly providerMetadata?: ProviderMetadata\n}\n\n/**\n * Sparse parser state keyed by the provider's stream-local tool identifier.\n *\n * This key is not the final tool-call id (`call_...`). It is the id/index the\n * provider uses while streaming a partial call: OpenAI Chat / Anthropic /\n * Bedrock use numeric content indexes, while OpenAI Responses uses string\n * `item_id`s. The generic keeps each protocol internally consistent.\n */\nexport type State<K extends StreamKey> = Partial<Record<K, PendingTool>>\n\n/**\n * Result of adding argument text to one pending tool call. It returns both the\n * next `tools` state and the updated `tool` because parsers often need the\n * current id/name immediately. `events` contains lifecycle and delta events\n * produced by the append; metadata-only deltas update identity without output.\n */\nexport interface AppendOutcome<K extends StreamKey> {\n readonly tools: State<K>\n readonly tool: PendingTool\n readonly events: ReadonlyArray<LLMEvent>\n}\n\n/** Create empty accumulator state for one provider stream. */\nexport const empty = <K extends StreamKey>(): State<K> => ({})\n\nconst withTool = <K extends StreamKey>(tools: State<K>, key: K, tool: PendingTool): State<K> => {\n return { ...tools, [key]: tool }\n}\n\nconst withoutTool = <K extends StreamKey>(tools: State<K>, key: K): State<K> => {\n const next = { ...tools }\n delete next[key]\n return next\n}\n\nconst inputStart = (tool: PendingTool) =>\n LLMEvent.toolInputStart({\n id: tool.id,\n name: tool.name,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n })\n\nconst inputDelta = (tool: PendingTool, text: string) =>\n LLMEvent.toolInputDelta({\n id: tool.id,\n name: tool.name,\n text,\n })\n\nconst toolCall = (route: string, tool: PendingTool, inputOverride?: string) => {\n const raw = inputOverride ?? tool.input\n return parseToolInput(route, tool.name, raw).pipe(\n Effect.map((input): ToolCall | ToolInputError =>\n LLMEvent.toolCall({\n id: tool.id,\n name: tool.name,\n input,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n }),\n ),\n Effect.catch((error) =>\n tool.providerExecuted\n ? Effect.fail(error)\n : Effect.succeed(\n LLMEvent.toolInputError({\n id: tool.id,\n name: tool.name,\n raw,\n }),\n ),\n ),\n )\n}\n\nconst finishEvents = (tool: PendingTool, event: ToolCall | ToolInputError): ReadonlyArray<LLMEvent> =>\n event.type === \"tool-input-error\"\n ? [event]\n : [LLMEvent.toolInputEnd({ id: tool.id, name: tool.name, providerMetadata: tool.providerMetadata }), event]\n\n/** Store the updated tool and produce the optional public delta event. */\nconst appendTool = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: PendingTool,\n text: string,\n): AppendOutcome<K> => {\n const events: LLMEvent[] = []\n if (!tools[key]) events.push(inputStart(tool))\n if (text.length > 0) events.push(inputDelta(tool, text))\n return {\n tools: withTool(tools, key, tool),\n tool,\n events,\n }\n}\n\nexport const isError = <K extends StreamKey>(result: AppendOutcome<K> | LLMError): result is LLMError =>\n result instanceof LLMError\n\n/**\n * Register a tool call whose start event arrived before any argument deltas.\n * Used by Anthropic `content_block_start`, Bedrock `contentBlockStart`, and\n * OpenAI Responses `response.output_item.added`.\n */\nexport const start = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: Omit<PendingTool, \"input\"> & { readonly input?: string },\n) => withTool(tools, key, { ...tool, input: tool.input ?? \"\" })\n\n/**\n * Append a streamed argument delta, starting the tool if this provider encodes\n * identity on the first delta instead of a separate start event. OpenAI Chat has\n * this shape: `tool_calls[].index` is the stream key, and `id` / `name` may only\n * appear on the first delta for that index.\n */\nexport const appendOrStart = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n delta: { readonly id?: string; readonly name?: string; readonly text: string },\n missingToolMessage: string,\n): AppendOutcome<K> | LLMError => {\n const current = tools[key]\n const id = current?.id ?? delta.id\n const name = current?.name ?? delta.name\n if (!id || !name) return eventError(route, missingToolMessage)\n\n const tool = {\n id,\n name,\n input: `${current?.input ?? \"\"}${delta.text}`,\n providerExecuted: current?.providerExecuted,\n providerMetadata: current?.providerMetadata,\n }\n if (current && delta.text.length === 0 && current.id === id && current.name === name)\n return { tools, tool: current, events: [] }\n return appendTool(tools, key, tool, delta.text)\n}\n\n/**\n * Append argument text to a tool that must already have been started. This keeps\n * protocols honest when their stream grammar promises a start event before any\n * argument delta.\n */\nexport const appendExisting = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n text: string,\n missingToolMessage: string,\n): AppendOutcome<K> | LLMError => {\n const current = tools[key]\n if (!current) return eventError(route, missingToolMessage)\n if (text.length === 0) return { tools, tool: current, events: [] }\n return appendTool(tools, key, { ...current, input: `${current.input}${text}` }, text)\n}\n\n/**\n * Finalize one pending tool call: parse the accumulated raw JSON, remove it\n * from state, and return either a call or a non-executable local input error.\n * Missing keys are a no-op because some providers emit stop events for\n * non-tool content blocks.\n */\nexport const finish = <K extends StreamKey>(route: string, tools: State<K>, key: K) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool)),\n }\n })\n\n/**\n * Finalize one pending tool call with an authoritative final input string.\n * OpenAI Responses can send accumulated deltas and then repeat the completed\n * arguments on `response.output_item.done`; the final value wins.\n */\nexport const finishWithInput = <K extends StreamKey>(route: string, tools: State<K>, key: K, input: string) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool, input)),\n }\n })\n\n/**\n * Finalize every pending tool call at once. OpenAI Chat has this shape: it does\n * not emit per-tool stop events, so all accumulated calls finish independently\n * when the choice receives a terminal `finish_reason`.\n */\nexport const finishAll = <K extends StreamKey>(route: string, tools: State<K>) =>\n Effect.gen(function* () {\n const pending = Object.values<PendingTool | undefined>(tools).filter(\n (tool): tool is PendingTool => tool !== undefined,\n )\n return {\n tools: empty<K>(),\n events: yield* Effect.forEach(pending, (tool) =>\n toolCall(route, tool).pipe(Effect.map((event) => finishEvents(tool, event))),\n ).pipe(Effect.map((events) => events.flat())),\n }\n })\n\nexport * as ToolStream from \"./tool-stream\"\n" | ||
| ], | ||
| "mappings": ";6UAuCO,SAAM,OAAQ,KAAsC,CAAC,GAEtD,EAAW,CAAsB,EAAiB,EAAQ,IAAgC,CAC9F,MAAO,IAAK,GAAQ,GAAM,CAAK,GAG3B,EAAc,CAAsB,EAAiB,IAAqB,CAC9E,IAAM,EAAO,IAAK,CAAM,EAExB,OADA,OAAO,EAAK,GACL,GAGH,EAAa,CAAC,IAClB,EAAS,eAAe,CACtB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,iBAAkB,EAAK,iBAAmB,GAAO,OACjD,iBAAkB,EAAK,gBACzB,CAAC,EAEG,EAAa,CAAC,EAAmB,IACrC,EAAS,eAAe,CACtB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,MACF,CAAC,EAEG,EAAW,CAAC,EAAe,EAAmB,IAA2B,CAC7E,IAAM,EAAM,GAAiB,EAAK,MAClC,OAAO,EAAe,EAAO,EAAK,KAAM,CAAG,EAAE,KAC3C,EAAO,IAAI,CAAC,IACV,EAAS,SAAS,CAChB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,QACA,iBAAkB,EAAK,iBAAmB,GAAO,OACjD,iBAAkB,EAAK,gBACzB,CAAC,CACH,EACA,EAAO,MAAM,CAAC,IACZ,EAAK,iBACD,EAAO,KAAK,CAAK,EACjB,EAAO,QACL,EAAS,eAAe,CACtB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,KACF,CAAC,CACH,CACN,CACF,GAGI,EAAe,CAAC,EAAmB,IACvC,EAAM,OAAS,mBACX,CAAC,CAAK,EACN,CAAC,EAAS,aAAa,CAAE,GAAI,EAAK,GAAI,KAAM,EAAK,KAAM,iBAAkB,EAAK,gBAAiB,CAAC,EAAG,CAAK,EAGxG,EAAa,CACjB,EACA,EACA,EACA,IACqB,CACrB,IAAM,EAAqB,CAAC,EAC5B,GAAI,CAAC,EAAM,GAAM,EAAO,KAAK,EAAW,CAAI,CAAC,EAC7C,GAAI,EAAK,OAAS,EAAG,EAAO,KAAK,EAAW,EAAM,CAAI,CAAC,EACvD,MAAO,CACL,MAAO,EAAS,EAAO,EAAK,CAAI,EAChC,OACA,QACF,GAGW,EAAU,CAAsB,IAC3C,aAAkB,EAOP,EAAQ,CACnB,EACA,EACA,IACG,EAAS,EAAO,EAAK,IAAK,EAAM,MAAO,EAAK,OAAS,EAAG,CAAC,EAQjD,EAAgB,CAC3B,EACA,EACA,EACA,EACA,IACgC,CAChC,IAAM,EAAU,EAAM,GAChB,EAAK,GAAS,IAAM,EAAM,GAC1B,EAAO,GAAS,MAAQ,EAAM,KACpC,GAAI,CAAC,GAAM,CAAC,EAAM,OAAO,EAAW,EAAO,CAAkB,EAE7D,IAAM,EAAO,CACX,KACA,OACA,MAAO,GAAG,GAAS,OAAS,KAAK,EAAM,OACvC,iBAAkB,GAAS,iBAC3B,iBAAkB,GAAS,gBAC7B,EACA,GAAI,GAAW,EAAM,KAAK,SAAW,GAAK,EAAQ,KAAO,GAAM,EAAQ,OAAS,EAC9E,MAAO,CAAE,QAAO,KAAM,EAAS,OAAQ,CAAC,CAAE,EAC5C,OAAO,EAAW,EAAO,EAAK,EAAM,EAAM,IAAI,GAQnC,EAAiB,CAC5B,EACA,EACA,EACA,EACA,IACgC,CAChC,IAAM,EAAU,EAAM,GACtB,GAAI,CAAC,EAAS,OAAO,EAAW,EAAO,CAAkB,EACzD,GAAI,EAAK,SAAW,EAAG,MAAO,CAAE,QAAO,KAAM,EAAS,OAAQ,CAAC,CAAE,EACjE,OAAO,EAAW,EAAO,EAAK,IAAK,EAAS,MAAO,GAAG,EAAQ,QAAQ,GAAO,EAAG,CAAI,GASzE,EAAS,CAAsB,EAAe,EAAiB,IAC1E,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAO,EAAM,GACnB,GAAI,CAAC,EAAM,MAAO,CAAE,OAAM,EAC1B,MAAO,CACL,MAAO,EAAY,EAAO,CAAG,EAC7B,OAAQ,EAAa,EAAM,MAAO,EAAS,EAAO,CAAI,CAAC,CACzD,EACD,EAOU,EAAkB,CAAsB,EAAe,EAAiB,EAAQ,IAC3F,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAO,EAAM,GACnB,GAAI,CAAC,EAAM,MAAO,CAAE,OAAM,EAC1B,MAAO,CACL,MAAO,EAAY,EAAO,CAAG,EAC7B,OAAQ,EAAa,EAAM,MAAO,EAAS,EAAO,EAAM,CAAK,CAAC,CAChE,EACD,EAOU,EAAY,CAAsB,EAAe,IAC5D,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAU,OAAO,OAAgC,CAAK,EAAE,OAC5D,CAAC,IAA8B,IAAS,MAC1C,EACA,MAAO,CACL,MAAO,EAAS,EAChB,OAAQ,MAAO,EAAO,QAAQ,EAAS,CAAC,IACtC,EAAS,EAAO,CAAI,EAAE,KAAK,EAAO,IAAI,CAAC,IAAU,EAAa,EAAM,CAAK,CAAC,CAAC,CAC7E,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,KAAK,CAAC,CAAC,CAC9C,EACD", | ||
| "debugId": "D8E09DABB81C90FA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openrouter.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route, type RouteDefaultsInput } from \"../route/client\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport { Protocol } from \"../route/protocol\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport { ProviderID, type ModelID, type ProviderOptions } from \"../schema\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport { isRecord } from \"../protocols/shared\"\n\nexport const profile = OpenAICompatibleProfiles.profiles.openrouter\nexport const id = ProviderID.make(profile.provider)\nconst ADAPTER = \"openrouter\"\n\nexport interface OpenRouterOptions {\n readonly [key: string]: unknown\n readonly usage?: boolean | Record<string, unknown>\n readonly reasoning?: Record<string, unknown>\n readonly promptCacheKey?: string\n}\n\nexport type OpenRouterProviderOptionsInput = ProviderOptions & {\n readonly openrouter?: OpenRouterOptions\n}\n\nexport type ModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: OpenRouterProviderOptionsInput\n }\n\nconst OpenRouterBody = Schema.StructWithRest(Schema.Struct(OpenAIChat.bodyFields), [\n Schema.Record(Schema.String, Schema.Any),\n])\nexport type OpenRouterBody = Schema.Schema.Type<typeof OpenRouterBody>\n\nexport const protocol = Protocol.make({\n id: \"openrouter-chat\",\n body: {\n schema: OpenRouterBody,\n from: (request) =>\n OpenAIChat.protocol.body.from(request).pipe(\n Effect.map(\n (body) =>\n ({\n ...body,\n ...bodyOptions(request.providerOptions?.openrouter),\n }) as OpenRouterBody,\n ),\n ),\n },\n stream: OpenAIChat.protocol.stream,\n})\n\nconst bodyOptions = (input: unknown) => {\n const openrouter = isRecord(input) ? input : {}\n return {\n ...(openrouter.usage === true\n ? { usage: { include: true } }\n : isRecord(openrouter.usage)\n ? { usage: openrouter.usage }\n : {}),\n ...(isRecord(openrouter.reasoning) ? { reasoning: openrouter.reasoning } : {}),\n ...(typeof openrouter.promptCacheKey === \"string\" ? { prompt_cache_key: openrouter.promptCacheKey } : {}),\n }\n}\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: profile.provider,\n protocol,\n endpoint: Endpoint.path(\"/chat/completions\", { baseURL: profile.baseURL }),\n framing: Framing.sse,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: ModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return route.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? profile.baseURL },\n auth: AuthOptions.bearer(input, \"OPENROUTER_API_KEY\"),\n })\n}\n\nexport const configure = (input: ModelOptions = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model = provider.model\n" | ||
| ], | ||
| "mappings": ";shBAWO,SAAM,OAAmC,OAAS,gBAC5C,OAAK,OAAW,UAAK,OAAQ,aAAQ,OAC5C,OAAU,aAmBV,EAAiB,EAAO,eAAe,EAAO,OAAkB,CAAU,EAAG,CACjF,EAAO,OAAO,EAAO,OAAQ,EAAO,GAAG,CACzC,CAAC,EAGY,EAAW,EAAS,KAAK,CACpC,GAAI,kBACJ,KAAM,CACJ,OAAQ,EACR,KAAM,CAAC,IACM,EAAS,KAAK,KAAK,CAAO,EAAE,KACrC,EAAO,IACL,CAAC,KACE,IACI,KACA,EAAY,EAAQ,iBAAiB,UAAU,CACpD,EACJ,CACF,CACJ,EACA,OAAmB,EAAS,MAC9B,CAAC,EAEK,EAAc,CAAC,IAAmB,CACtC,IAAM,EAAa,EAAS,CAAK,EAAI,EAAQ,CAAC,EAC9C,MAAO,IACD,EAAW,QAAU,GACrB,CAAE,MAAO,CAAE,QAAS,EAAK,CAAE,EAC3B,EAAS,EAAW,KAAK,EACvB,CAAE,MAAO,EAAW,KAAM,EAC1B,CAAC,KACH,EAAS,EAAW,SAAS,EAAI,CAAE,UAAW,EAAW,SAAU,EAAI,CAAC,KACxE,OAAO,EAAW,iBAAmB,SAAW,CAAE,iBAAkB,EAAW,cAAe,EAAI,CAAC,CACzG,GAGW,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,SAAU,EAAQ,SAClB,WACA,SAAU,EAAS,KAAK,oBAAqB,CAAE,QAAS,EAAQ,OAAQ,CAAC,EACzE,QAAS,EAAQ,GACnB,CAAC,EAEY,EAAS,CAAC,CAAK,EAEtB,EAAkB,CAAC,IAAwB,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CAAE,QAAS,GAAW,EAAQ,OAAQ,EAChD,KAAM,EAAY,OAAO,EAAO,oBAAoB,CACtD,CAAC,GAGU,EAAY,CAAC,EAAsB,CAAC,IAAM,CACrD,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,CAAQ,CAAC,EACjE,WACF,GAGW,EAAW,EAAU,EACrB,EAAQ,EAAS", | ||
| "debugId": "14EF1035E3D3620264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/frontend/actions.ts", "../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/semantics.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "import { tmpdir } from \"node:os\"\nimport { extname, join, resolve } from \"node:path\"\nimport type { CliRenderer, Renderable } from \"@opentui/core\"\nimport {\n createMockKeys,\n createMockMouse,\n KeyCodes,\n type KeyInput,\n type MockInput,\n type MockMouse,\n} from \"@opentui/core/testing\"\nimport { Config, Effect, FileSystem, Schema } from \"effect\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationSemantics } from \"./semantics\"\n\nexport type Action = SimulationProtocol.Frontend.Action\nexport type Element = SimulationProtocol.Frontend.Element\n\nexport interface Harness {\n readonly renderer: CliRenderer\n readonly mockInput: MockInput\n readonly mockMouse: MockMouse\n readonly resize: (cols: number, rows: number) => void\n readonly renderOnce: () => Promise<void>\n readonly screen: () => string\n}\n\ntype RenderBuffer = {\n readonly width: number\n readonly height: number\n getRealCharBytes(includeAnsi?: boolean): Uint8Array\n}\n\nconst decoder = new TextDecoder()\n\nfunction isKeyCode(key: string): key is keyof typeof KeyCodes {\n return Object.hasOwn(KeyCodes, key)\n}\n\nfunction keyInput(key: string): KeyInput {\n const named = key.toUpperCase()\n return isKeyCode(named) ? named : key\n}\n\nfunction children(renderable: Renderable) {\n return renderable.getChildren().filter((child): child is Renderable => \"num\" in child)\n}\n\nfunction all(renderable: Renderable): Renderable[] {\n return [renderable, ...children(renderable).flatMap(all)]\n}\n\nfunction mouseListeners(renderable: Renderable) {\n const general = Reflect.get(renderable, \"_mouseListener\")\n const specific = Reflect.get(renderable, \"_mouseListeners\")\n return Boolean(general) || (specific && typeof specific === \"object\" && Object.keys(specific).length > 0)\n}\n\nfunction hit(renderer: CliRenderer, renderable: Renderable) {\n if (renderable.width <= 0 || renderable.height <= 0) return false\n const x = Math.floor(renderable.screenX + renderable.width / 2)\n const y = Math.floor(renderable.screenY + renderable.height / 2)\n const target = renderer.hitTest(x, y)\n return all(renderable).some((item) => item.num === target)\n}\n\n/**\n * Builds the harness the simulation server drives.\n *\n * When the renderer is the headless simulation renderer, its TestRendererSetup\n * provides the supported testing APIs. For the visible terminal renderer the\n * harness falls back to `requestRender` + `idle` and reading the private\n * `currentRenderBuffer`.\n */\nexport function createHarness(renderer: CliRenderer): Harness {\n const setup = SimulationRenderer.setupFor(renderer)\n return {\n renderer,\n mockInput: setup?.mockInput ?? createMockKeys(renderer),\n mockMouse: setup?.mockMouse ?? createMockMouse(renderer),\n resize: setup?.resize ?? ((cols, rows) => renderer.resize(cols, rows)),\n renderOnce:\n setup?.renderOnce ??\n (async () => {\n renderer.requestRender()\n await renderer.idle()\n }),\n // captureCharFrame follows the test renderer's output sink. Recording\n // redirects that sink to the timeline, so read the live render buffer\n // instead; it is also the source used by screenshots.\n screen: () => decoder.decode((Reflect.get(renderer, \"currentRenderBuffer\") as RenderBuffer).getRealCharBytes()),\n }\n}\n\nexport function elements(renderer: CliRenderer): Element[] {\n return all(renderer.root)\n .filter((renderable) => renderable.visible && !renderable.isDestroyed)\n .map((renderable) => {\n const clickable = mouseListeners(renderable) && hit(renderer, renderable)\n return {\n id: renderable.id,\n num: renderable.num,\n x: renderable.screenX,\n y: renderable.screenY,\n width: renderable.width,\n height: renderable.height,\n focusable: renderable.focusable,\n focused: renderable.focused,\n clickable,\n editor: renderer.currentFocusedEditor === renderable,\n } satisfies Element\n })\n .filter((element) => element.focusable || element.clickable || element.editor)\n}\n\nexport function state(harness: Harness) {\n return {\n focused: {\n renderable: harness.renderer.currentFocusedRenderable?.num,\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function snapshot(harness: Harness): SimulationProtocol.Frontend.SemanticSnapshot {\n const ids = new Set<string>()\n const visit = (renderable: Renderable, parent?: string): SimulationProtocol.Frontend.SemanticNode[] => {\n if (!renderable.visible || renderable.isDestroyed) return []\n const definition = SimulationSemantics.read(renderable)?.()\n if (definition && ids.has(renderable.id)) throw new Error(`duplicate semantic UI id: ${renderable.id}`)\n if (definition) ids.add(renderable.id)\n const node = definition\n ? [{ id: renderable.id, ...definition, ...(parent === undefined ? {} : { parent }), element: renderable.num }]\n : []\n const ancestor = definition ? renderable.id : parent\n return [...node, ...children(renderable).flatMap((child) => visit(child, ancestor))]\n }\n return Schema.decodeUnknownSync(SimulationProtocol.Frontend.SemanticSnapshot)({\n format: \"opencode-ui-snapshot-v1\",\n nodes: visit(harness.renderer.root),\n })\n}\n\nexport function matches(harness: Pick<Harness, \"screen\">, text: string) {\n return harness.screen().includes(text)\n}\n\nexport const capture = Effect.fn(\"SimulationActions.capture\")(function* (harness: Harness) {\n yield* Effect.tryPromise(() => harness.renderOnce())\n const buffer = harness.renderer.currentRenderBuffer\n return {\n cols: buffer.width,\n rows: buffer.height,\n cursor: [0, 0] as const,\n lines: buffer.getSpanLines().map((line) => ({\n spans: line.spans.map((span) => ({\n text: span.text,\n fg: span.fg.toInts(),\n bg: span.bg.toInts(),\n attributes: span.attributes,\n width: span.width,\n })),\n })),\n } satisfies SimulationProtocol.Frontend.CapturedFrame\n})\n\nexport const screenshot = Effect.fn(\"SimulationActions.screenshot\")(function* (harness: Harness, name?: string) {\n const filename = name ?? `screenshot-${crypto.randomUUID()}`\n if (!filename || filename.includes(\"/\") || filename.includes(\"\\\\\") || extname(filename))\n return yield* Effect.fail(new Error(\"screenshot name must not contain a path or extension\"))\n yield* Effect.tryPromise(() => harness.renderOnce())\n const { SimulationPng } = yield* Effect.promise(() => import(\"./png\"))\n const image = SimulationPng.screenshot(harness.renderer)\n const directory = resolve(\n yield* Config.string(\"OPENCODE_DRIVE_MEDIA_DIR\").pipe(\n Config.withDefault(join(tmpdir(), \"opencode-drive\", \"output\")),\n ),\n )\n const fs = yield* FileSystem.FileSystem\n yield* fs.makeDirectory(directory, { recursive: true })\n const path = join(directory, `${filename}.png`)\n yield* fs.writeFile(path, image.data)\n return path\n})\n\nexport const execute = Effect.fn(\"SimulationActions.execute\")(function* (harness: Harness, action: Action) {\n switch (action.type) {\n case \"ui.type\":\n yield* Effect.tryPromise(() => harness.mockInput.typeText(action.text))\n break\n case \"ui.press\":\n harness.mockInput.pressKey(keyInput(action.key), action.modifiers)\n break\n case \"ui.enter\":\n harness.mockInput.pressEnter()\n break\n case \"ui.arrow\":\n harness.mockInput.pressArrow(action.direction)\n break\n case \"ui.focus\":\n all(harness.renderer.root)\n .find((item) => item.num === action.target)\n ?.focus()\n break\n case \"ui.click\": {\n const target = all(harness.renderer.root).find((item) => item.num === action.target)\n if (!target || !target.visible || target.isDestroyed)\n return yield* Effect.fail(new Error(`click target is stale or unavailable: ${action.target}`))\n if (action.semantic) {\n const current = snapshot(harness).nodes.find((node) => node.element === action.target)\n if (\n current?.id !== action.semantic.id ||\n current.instance !== action.semantic.instance ||\n current.element !== action.semantic.element\n )\n return yield* Effect.fail(new Error(`semantic click target is stale or unavailable: ${action.semantic.id}`))\n }\n if (\n !Number.isFinite(action.x) ||\n action.x < 0 ||\n action.x >= target.width ||\n !Number.isFinite(action.y) ||\n action.y < 0 ||\n action.y >= target.height\n )\n return yield* Effect.fail(new Error(\"click position must be within the target element\"))\n yield* Effect.tryPromise(() => harness.mockMouse.click(target.screenX + action.x, target.screenY + action.y))\n break\n }\n case \"ui.resize\":\n if (\n !Number.isSafeInteger(action.cols) ||\n action.cols <= 0 ||\n !Number.isSafeInteger(action.rows) ||\n action.rows <= 0\n ) {\n return yield* Effect.fail(new Error(\"resize cols and rows must be positive integers\"))\n }\n harness.resize(action.cols, action.rows)\n SimulationRenderer.recordResize(harness.renderer, action.cols, action.rows)\n break\n }\n yield* Effect.tryPromise(() => harness.renderOnce())\n return state(harness)\n})\n\nexport * as SimulationActions from \"./actions\"\n", | ||
| "import { createWriteStream, type WriteStream } from \"node:fs\"\nimport { mkdir } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { Writable } from \"node:stream\"\nimport { finished } from \"node:stream/promises\"\nimport { Schema } from \"effect\"\n\nexport const Header = Schema.Struct({\n type: Schema.Literal(\"header\"),\n version: Schema.Literal(1),\n cols: Schema.Number,\n rows: Schema.Number,\n encoding: Schema.Literal(\"base64\"),\n})\nexport interface Header extends Schema.Schema.Type<typeof Header> {}\n\nexport const Output = Schema.Struct({\n type: Schema.Literal(\"output\"),\n at_ms: Schema.Number,\n data: Schema.String,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n\nexport const Resize = Schema.Struct({\n type: Schema.Literal(\"resize\"),\n at_ms: Schema.Number,\n cols: Schema.Number,\n rows: Schema.Number,\n})\nexport interface Resize extends Schema.Schema.Type<typeof Resize> {}\n\nexport const Event = Schema.Union([Header, Output, Resize])\nexport type Event = Schema.Schema.Type<typeof Event>\n\nexport class Timeline extends Writable {\n readonly isTTY = true\n readonly path: string\n readonly columns: number\n readonly rows: number\n private readonly output: WriteStream\n private readonly started = performance.now()\n private readonly timestamps: number[] = []\n private done?: Promise<string>\n\n private constructor(path: string, cols: number, rows: number, output: WriteStream) {\n super()\n this.path = path\n this.columns = cols\n this.rows = rows\n this.output = output\n // finish() reports stream failures; keep Writable from also throwing them process-wide.\n this.on(\"error\", () => {})\n output.on(\"error\", (error) => this.destroy(error))\n }\n\n static async create(path: string, cols: number, rows: number) {\n await mkdir(dirname(path), { recursive: true })\n const output = createWriteStream(path)\n const timeline = new Timeline(path, cols, rows, output)\n await new Promise<void>((resolve, reject) => {\n output.write(\n `${JSON.stringify({ type: \"header\", version: 1, cols, rows, encoding: \"base64\" } satisfies Header)}\\n`,\n (error) => (error ? reject(error) : resolve()),\n )\n })\n return timeline\n }\n\n getColorDepth() {\n return 24\n }\n\n override write(chunk: unknown, callback?: (error?: Error | null) => void): boolean\n override write(chunk: unknown, encoding: BufferEncoding, callback?: (error?: Error | null) => void): boolean\n override write(\n chunk: unknown,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ) {\n if (!this.writableEnded) {\n this.timestamps.push(this.elapsed())\n if (typeof encoding === \"function\") return super.write(chunk, encoding)\n if (encoding === undefined) return super.write(chunk, callback)\n return super.write(chunk, encoding, callback)\n }\n const done = typeof encoding === \"function\" ? encoding : callback\n queueMicrotask(() => done?.(null))\n return true\n }\n\n override _write(chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void) {\n this.writeOutput(chunk, this.timestamps.shift() ?? this.elapsed(), callback)\n }\n\n override _final(callback: (error?: Error | null) => void) {\n this.writeOutput(Buffer.alloc(0), this.elapsed(), (error) => {\n if (error) return callback(error)\n this.output.end(callback)\n })\n }\n\n finish() {\n if (this.done) return this.done\n this.end()\n this.done = finished(this).then(() => this.path)\n return this.done\n }\n\n resize(cols: number, rows: number) {\n if (this.writableEnded) return\n const event = { type: \"resize\", at_ms: this.elapsed(), cols, rows } satisfies Resize\n this.output.write(`${JSON.stringify(event)}\\n`)\n }\n\n private elapsed() {\n return Math.max(0, Math.round(performance.now() - this.started))\n }\n\n private writeOutput(data: Buffer, at_ms: number, callback: (error?: Error | null) => void) {\n const event = {\n type: \"output\",\n at_ms,\n data: data.toString(\"base64\"),\n } satisfies Output\n this.output.write(`${JSON.stringify(event)}\\n`, callback)\n }\n}\n\nexport * as SimulationRecording from \"./recording\"\n", | ||
| "import type { CliRenderer, CliRendererConfig } from \"@opentui/core\"\nimport { createTestRenderer, type TestRendererSetup } from \"@opentui/core/testing\"\nimport { Effect } from \"effect\"\nimport { Timeline } from \"../recording\"\n\nconst setups = new WeakMap<CliRenderer, TestRendererSetup>()\nconst recordings = new WeakMap<CliRenderer, Timeline>()\n\n/**\n * Creates a headless renderer with optional recording: a real CliRenderer\n * backed by an in-memory screen buffer. The TestRendererSetup is kept\n * module-side so the harness can use supported testing APIs without app\n * code carrying it around.\n */\nexport interface Viewport {\n readonly cols: number\n readonly rows: number\n}\n\nexport const create = Effect.fn(\"SimulationRenderer.create\")(function* (\n options: CliRendererConfig,\n path?: string,\n viewport?: Viewport,\n) {\n const cols = viewport?.cols ?? 100\n const rows = viewport?.rows ?? 40\n const recording = path\n ? yield* Effect.acquireRelease(\n Effect.tryPromise(() => Timeline.create(path, cols, rows)),\n (recording) =>\n Effect.tryPromise(() => recording.finish()).pipe(\n Effect.catch((error) =>\n Effect.sync(() => process.stderr.write(`Failed to finish UI recording: ${error}\\n`)),\n ),\n ),\n )\n : undefined\n const setup = yield* Effect.acquireRelease(\n Effect.tryPromise(() =>\n createTestRenderer({\n ...options,\n width: cols,\n height: rows,\n ...(recording\n ? {\n stdout: recording as unknown as NodeJS.WriteStream,\n bufferedOutput: \"stdout\" as const,\n }\n : {}),\n }),\n ),\n (setup) =>\n Effect.sync(() => {\n if (!setup.renderer.isDestroyed) setup.renderer.destroy()\n }),\n )\n setups.set(setup.renderer, setup)\n if (recording) recordings.set(setup.renderer, recording)\n return setup.renderer\n})\n\nexport function recordResize(renderer: CliRenderer, cols: number, rows: number) {\n recordings.get(renderer)?.resize(cols, rows)\n}\n\nexport function setupFor(renderer: CliRenderer): TestRendererSetup | undefined {\n return setups.get(renderer)\n}\n\nexport function finish(renderer: CliRenderer) {\n const recording = recordings.get(renderer)\n if (!recording) return Effect.fail(new Error(\"UI recording is not available\"))\n return Effect.tryPromise(() => recording.finish())\n}\n\nexport * as SimulationRenderer from \"./renderer\"\n", | ||
| "import type { Renderable } from \"@opentui/core\"\nimport type { SimulationProtocol } from \"../protocol\"\n\n// Semantic renderables set an explicit stable OpenTUI id so ui.state and\n// ui.snapshot expose the same identity. Hierarchy and element handles come\n// from the live render tree.\nexport type Definition = Omit<SimulationProtocol.Frontend.SemanticNode, \"id\" | \"element\" | \"parent\">\n\nconst key = Symbol.for(\"opencode.simulation.semantics\")\n\nconst bind = (definition: () => Definition) => (renderable: Renderable) => {\n Object.defineProperty(renderable, key, { value: definition, configurable: true })\n}\n\nexport const read = (renderable: Renderable) => {\n const definition: unknown = Reflect.get(renderable, key)\n return typeof definition === \"function\" ? (definition as () => Definition) : undefined\n}\n\nexport const SimulationSemantics = { bind, read }\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationActions, type Harness } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\n\nfunction handle(harness: Harness, request: SimulationProtocol.Frontend.Request) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.screenshot\":\n return SimulationActions.screenshot(harness, request.params?.name)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.snapshot\":\n return Effect.sync(() => SimulationActions.snapshot(harness))\n case \"ui.matches\":\n return Effect.sync(() => SimulationActions.matches(harness, request.params.text))\n case \"ui.recording.finish\":\n return SimulationRenderer.finish(harness.renderer)\n case \"ui.type\":\n return SimulationActions.execute(harness, { type: \"ui.type\", text: request.params.text })\n case \"ui.enter\":\n return SimulationActions.execute(harness, { type: \"ui.enter\" })\n case \"ui.press\":\n return SimulationActions.execute(harness, {\n type: \"ui.press\",\n key: request.params.key,\n modifiers: request.params.modifiers,\n })\n case \"ui.arrow\":\n return SimulationActions.execute(harness, { type: \"ui.arrow\", direction: request.params.direction })\n case \"ui.focus\":\n return SimulationActions.execute(harness, { type: \"ui.focus\", target: request.params.target })\n case \"ui.click\":\n return SimulationActions.execute(harness, {\n type: \"ui.click\",\n target: request.params.target,\n x: request.params.x,\n y: request.params.y,\n semantic: request.params.semantic,\n })\n case \"ui.resize\":\n return SimulationActions.execute(harness, {\n type: \"ui.resize\",\n cols: request.params.cols,\n rows: request.params.rows,\n })\n }\n}\n\nexport const start = Effect.fn(\"SimulationServer.start\")(function* (harness: Harness, endpoint: string) {\n return yield* SimulationControlServer.start({\n endpoint,\n label: \"opencode drive ui websocket\",\n data: () => ({ drive: true as const }),\n decode: SimulationProtocol.Frontend.decodeRequestEffect,\n handle: (_socket, request) => handle(harness, request),\n })\n})\n\nexport * as SimulationServer from \"./server\"\n", | ||
| "import { createCliRenderer, type CliRendererConfig } from \"@opentui/core\"\nimport { Config, Effect } from \"effect\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationActions } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationServer } from \"./server\"\n\n/** Drive-mode renderer and control-server acquisition. */\nexport const create = Effect.fn(\"Drive.create\")(function* (options: CliRendererConfig) {\n const headless = (yield* Config.string(\"OPENCODE_DRIVE_RENDERER\").pipe(Config.withDefault(\"visible\"))) === \"headless\"\n const manifest = yield* DriveManifest.resolve()\n const renderer = headless\n ? yield* SimulationRenderer.create(options, manifest.recording?.timeline, manifest.viewport)\n : yield* Effect.acquireRelease(\n Effect.tryPromise(() => createCliRenderer(options)),\n (renderer) =>\n Effect.sync(() => {\n if (!renderer.isDestroyed) renderer.destroy()\n }),\n )\n if (!headless && manifest.viewport) renderer.resize(manifest.viewport.cols, manifest.viewport.rows)\n const server = yield* SimulationServer.start(SimulationActions.createHarness(renderer), manifest.endpoints.ui)\n yield* Effect.sync(() => process.stderr.write(`opencode drive ui websocket: ${server.url}\\n`))\n return renderer\n})\n\nexport * as Drive from \"./simulation\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "CC64734843CBF5CE64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzE,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,oBAAsB,CAAG,EAC9C,OAEF,QAAQ,OAAO,MAAM,EAAQ,IAAI,CAAC,IAAW,EAAO,EAAE,EAAE,KAAK,CAAG,EAAI,CAAG,EACxE,CACH", | ||
| "debugId": "9FA00D09A102DFA664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/lifecycle.ts", "../ai/src/protocols/utils/gemini-tool-schema.ts", "../ai/src/protocols/utils/tool-schema.ts"], | ||
| "sourcesContent": [ | ||
| "import { LLMEvent, type FinishReason, type ProviderMetadata, type Usage } from \"../../schema\"\n\nexport interface State {\n readonly stepStarted: boolean\n readonly text: ReadonlySet<string>\n readonly reasoning: ReadonlySet<string>\n}\n\nexport const initial = (): State => ({ stepStarted: false, text: new Set(), reasoning: new Set() })\n\nexport const stepStart = (state: State, events: LLMEvent[]): State => {\n if (state.stepStarted) return state\n events.push(LLMEvent.stepStart({ index: 0 }))\n return { ...state, stepStarted: true }\n}\n\nexport const textDelta = (state: State, events: LLMEvent[], id: string, text: string): State => {\n const stepped = stepStart(state, events)\n if (stepped.text.has(id)) {\n events.push(LLMEvent.textDelta({ id, text }))\n return stepped\n }\n events.push(LLMEvent.textStart({ id }), LLMEvent.textDelta({ id, text }))\n return { ...stepped, text: new Set([...stepped.text, id]) }\n}\n\nexport const reasoningStart = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningStart({ id, providerMetadata }))\n return { ...stepped, reasoning: new Set([...stepped.reasoning, id]) }\n}\n\nexport const reasoningDelta = (\n state: State,\n events: LLMEvent[],\n id: string,\n text: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n const started = reasoningStart(state, events, id, providerMetadata)\n events.push(LLMEvent.reasoningDelta({ id, text }))\n return started\n}\n\nexport const reasoningEnd = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (!state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningEnd({ id, providerMetadata }))\n const reasoning = new Set(stepped.reasoning)\n reasoning.delete(id)\n return { ...stepped, reasoning }\n}\n\nexport const textEnd = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (!state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textEnd({ id, providerMetadata }))\n const text = new Set(stepped.text)\n text.delete(id)\n return { ...stepped, text }\n}\n\nconst closeOpenBlocks = (state: State, events: LLMEvent[]): State => {\n for (const id of state.reasoning) events.push(LLMEvent.reasoningEnd({ id }))\n for (const id of state.text) events.push(LLMEvent.textEnd({ id }))\n return { ...state, text: new Set(), reasoning: new Set() }\n}\n\nexport const finish = (\n state: State,\n events: LLMEvent[],\n input: {\n readonly reason: FinishReason\n readonly usage?: Usage\n readonly providerMetadata?: ProviderMetadata\n },\n): State => {\n const stepped = closeOpenBlocks(stepStart(state, events), events)\n events.push(\n LLMEvent.stepFinish({\n index: 0,\n reason: input.reason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n }),\n LLMEvent.finish(input),\n )\n return { ...stepped, stepStarted: false }\n}\n\nexport * as Lifecycle from \"./lifecycle\"\n", | ||
| "import { isRecord } from \"../../utils/record\"\n\n// Gemini accepts a JSON Schema-like dialect for tool parameters, but rejects a\n// handful of common JSON Schema shapes. Keep this projection isolated so the\n// Gemini protocol file still reads like the other protocol modules.\nconst SCHEMA_INTENT_KEYS = [\n \"type\",\n \"properties\",\n \"items\",\n \"prefixItems\",\n \"enum\",\n \"const\",\n \"$ref\",\n \"additionalProperties\",\n \"patternProperties\",\n \"required\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n]\n\nconst hasCombiner = (schema: unknown) =>\n isRecord(schema) && (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf) || Array.isArray(schema.allOf))\n\nconst hasSchemaIntent = (schema: unknown) =>\n isRecord(schema) && (hasCombiner(schema) || SCHEMA_INTENT_KEYS.some((key) => key in schema))\n\nconst sanitizeNode = (schema: unknown): unknown => {\n if (!isRecord(schema)) return Array.isArray(schema) ? schema.map(sanitizeNode) : schema\n\n const result: Record<string, unknown> = Object.fromEntries(\n Object.entries(schema).map(([key, value]) => [\n key,\n key === \"enum\" && Array.isArray(value) ? value.map(String) : sanitizeNode(value),\n ]),\n )\n\n if (Array.isArray(result.enum) && (result.type === \"integer\" || result.type === \"number\")) result.type = \"string\"\n\n const properties = result.properties\n if (result.type === \"object\" && isRecord(properties) && Array.isArray(result.required)) {\n result.required = result.required.filter((field) => typeof field === \"string\" && field in properties)\n }\n\n if (result.type === \"array\" && !hasCombiner(result)) {\n result.items = result.items ?? {}\n if (isRecord(result.items) && !hasSchemaIntent(result.items)) result.items = { ...result.items, type: \"string\" }\n }\n\n if (typeof result.type === \"string\" && result.type !== \"object\" && !hasCombiner(result)) {\n delete result.properties\n delete result.required\n }\n\n return result\n}\n\nconst emptyObjectSchema = (schema: Record<string, unknown>) =>\n schema.type === \"object\" &&\n (!isRecord(schema.properties) || Object.keys(schema.properties).length === 0) &&\n !schema.additionalProperties\n\nconst projectNode = (schema: unknown): Record<string, unknown> | undefined => {\n if (!isRecord(schema)) return undefined\n if (emptyObjectSchema(schema)) return undefined\n return Object.fromEntries(\n [\n [\"description\", schema.description],\n [\"required\", schema.required],\n [\"format\", schema.format],\n [\"type\", Array.isArray(schema.type) ? schema.type.filter((type) => type !== \"null\")[0] : schema.type],\n [\"nullable\", Array.isArray(schema.type) && schema.type.includes(\"null\") ? true : undefined],\n [\"enum\", schema.const !== undefined ? [schema.const] : schema.enum],\n [\n \"properties\",\n isRecord(schema.properties)\n ? Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => [key, projectNode(value)]))\n : undefined,\n ],\n [\n \"items\",\n Array.isArray(schema.items)\n ? schema.items.map(projectNode)\n : schema.items === undefined\n ? undefined\n : projectNode(schema.items),\n ],\n [\"allOf\", Array.isArray(schema.allOf) ? schema.allOf.map(projectNode) : undefined],\n [\"anyOf\", Array.isArray(schema.anyOf) ? schema.anyOf.map(projectNode) : undefined],\n [\"oneOf\", Array.isArray(schema.oneOf) ? schema.oneOf.map(projectNode) : undefined],\n [\"minLength\", schema.minLength],\n ].filter((entry) => entry[1] !== undefined),\n )\n}\n\nexport const convert = (schema: unknown) => projectNode(sanitizeNode(schema))\n\nexport * as GeminiToolSchema from \"./gemini-tool-schema\"\n", | ||
| "import type { JsonSchema, ModelToolSchemaCompatibility } from \"../../schema\"\nimport { isRecord } from \"../../utils/record\"\nimport { GeminiToolSchema } from \"./gemini-tool-schema\"\n\nconst removeNullSchemas = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(removeNullSchemas)\n if (!isRecord(value)) return value\n const fields = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"anyOf\")\n .map(([key, field]) => [key, removeNullSchemas(field)]),\n )\n if (!Array.isArray(value.anyOf)) return fields\n const variants = value.anyOf.filter((variant) => !isRecord(variant) || variant.type !== \"null\").map(removeNullSchemas)\n if (variants.length === 1 && isRecord(variants[0])) return { ...fields, ...variants[0] }\n return { ...fields, anyOf: variants }\n}\n\nconst tupleItemsSchema = (items: ReadonlyArray<unknown>) => {\n const projected = items.map(moonshotNode)\n if (projected.length === 0) return {}\n if (projected.length === 1) return projected[0]\n return { anyOf: projected }\n}\n\nconst moonshotNode = (schema: unknown): unknown => {\n if (Array.isArray(schema)) return schema.map(moonshotNode)\n if (!isRecord(schema)) return schema\n if (typeof schema.$ref === \"string\") return { $ref: schema.$ref }\n return Object.fromEntries(\n Object.entries(schema).flatMap(([key, value]) => {\n if (key === \"items\" && Array.isArray(value)) return [[key, tupleItemsSchema(value)]]\n if (key === \"prefixItems\") {\n if (\"items\" in schema) return []\n return [[\"items\", tupleItemsSchema(Array.isArray(value) ? value : [])]]\n }\n if (key === \"unevaluatedItems\") return []\n return [[key, moonshotNode(value)]]\n }),\n )\n}\n\nconst moonshot = (schema: JsonSchema): JsonSchema => {\n const projected = moonshotNode(schema)\n return isRecord(projected) ? projected : {}\n}\n\nconst openAI = (schema: JsonSchema): JsonSchema => {\n const variants = Array.isArray(schema.anyOf) ? schema.anyOf.filter(isRecord) : []\n const flattened =\n variants.length === 0\n ? { ...schema, type: \"object\" }\n : {\n ...Object.fromEntries(Object.entries(schema).filter(([key]) => key !== \"anyOf\")),\n type: \"object\",\n properties: variants.reduce(\n (properties, variant) => ({ ...(isRecord(variant.properties) ? variant.properties : {}), ...properties }),\n {},\n ),\n additionalProperties: false,\n }\n const normalized = removeNullSchemas(flattened)\n return isRecord(normalized) ? normalized : { type: \"object\" }\n}\n\nconst gemini = (schema: JsonSchema): JsonSchema => GeminiToolSchema.convert(schema) ?? {}\n\nconst modelCompatibility = (\n schema: JsonSchema,\n compatibility: ModelToolSchemaCompatibility | undefined,\n): JsonSchema => {\n if (compatibility === undefined) return schema\n switch (compatibility) {\n case \"gemini\":\n return gemini(schema)\n case \"moonshot\":\n return moonshot(schema)\n }\n}\n\nexport const ToolSchemaProjection = {\n gemini,\n modelCompatibility,\n moonshot,\n openAI,\n} as const\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0A757C0381CDFB8964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "D23F9068723AC17864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/bedrock-event-stream.ts", "../ai/src/protocols/utils/bedrock-auth.ts", "../ai/src/protocols/utils/bedrock-cache.ts", "../ai/src/protocols/utils/bedrock-media.ts", "../ai/src/protocols/bedrock-converse.ts", "../ai/src/providers/amazon-bedrock.ts"], | ||
| "sourcesContent": [ | ||
| "import { EventStreamCodec } from \"@smithy/eventstream-codec\"\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\"\nimport { Effect, Stream } from \"effect\"\nimport { Framing } from \"../route/framing\"\nimport { ProviderShared } from \"./shared\"\n\n// Bedrock streams responses using the AWS event stream binary protocol — each\n// frame is `[length:4][headers-length:4][prelude-crc:4][headers][payload][crc:4]`.\n// We use `@smithy/eventstream-codec` to validate framing and CRCs, then\n// reconstruct the JSON wrapping by `:event-type` so the chunk schema can match.\nconst eventCodec = new EventStreamCodec(toUtf8, fromUtf8)\nconst utf8 = new TextDecoder()\n\n// Cursor-tracking buffer state. Bytes accumulate in `buffer`; `offset` is the\n// read position. Reading by `subarray` is zero-copy. We only allocate a fresh\n// buffer when a new network chunk arrives and we need to append.\ninterface FrameBufferState {\n readonly buffer: Uint8Array\n readonly offset: number\n}\n\nconst initialFrameBuffer: FrameBufferState = { buffer: new Uint8Array(0), offset: 0 }\n\nconst appendChunk = (state: FrameBufferState, chunk: Uint8Array): FrameBufferState => {\n const remaining = state.buffer.length - state.offset\n // Compact: drop the consumed prefix and append the new chunk in one alloc.\n // This bounds buffer growth to at most one network chunk past the live\n // window, regardless of stream length.\n const next = new Uint8Array(remaining + chunk.length)\n next.set(state.buffer.subarray(state.offset), 0)\n next.set(chunk, remaining)\n return { buffer: next, offset: 0 }\n}\n\nconst consumeFrames = (route: string) => (state: FrameBufferState, chunk: Uint8Array) =>\n Effect.gen(function* () {\n let cursor = appendChunk(state, chunk)\n const out: object[] = []\n while (cursor.buffer.length - cursor.offset >= 4) {\n const view = cursor.buffer.subarray(cursor.offset)\n const totalLength = new DataView(view.buffer, view.byteOffset, view.byteLength).getUint32(0, false)\n if (view.length < totalLength) break\n\n const decoded = yield* Effect.try({\n try: () => eventCodec.decode(view.subarray(0, totalLength)),\n catch: (error) =>\n ProviderShared.eventError(\n route,\n `Failed to decode Bedrock Converse event-stream frame: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n })\n cursor = { buffer: cursor.buffer, offset: cursor.offset + totalLength }\n\n if (decoded.headers[\":message-type\"]?.value !== \"event\") continue\n const eventType = decoded.headers[\":event-type\"]?.value\n if (typeof eventType !== \"string\") continue\n const payload = utf8.decode(decoded.body)\n if (!payload) continue\n // The AWS event stream pads short payloads with a `p` field. Drop it\n // before handing the object to the chunk schema. JSON decode goes\n // through the shared Schema-driven codec to satisfy the package rule\n // against ad-hoc `JSON.parse` calls.\n const parsed = (yield* ProviderShared.parseJson(\n route,\n payload,\n \"Failed to parse Bedrock Converse event-stream payload\",\n )) as Record<string, unknown>\n delete parsed.p\n out.push({ [eventType]: parsed })\n }\n return [cursor, out] as const\n })\n\n/**\n * AWS event-stream framing for Bedrock Converse. Each frame is decoded by\n * `@smithy/eventstream-codec` (length + header + payload + CRC) and rewrapped\n * under its `:event-type` header so the chunk schema can match the JSON\n * payload directly.\n */\nexport const framing = (route: string): Framing.Definition<object> => ({\n id: \"aws-event-stream\",\n frame: (bytes) => bytes.pipe(Stream.mapAccumEffect(() => initialFrameBuffer, consumeFrames(route))),\n})\n\nexport * as BedrockEventStream from \"./bedrock-event-stream\"\n", | ||
| "import { AwsV4Signer } from \"aws4fetch\"\nimport { Effect } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Auth, type AuthInput } from \"../../route/auth\"\nimport { ProviderShared } from \"../shared\"\n\n/**\n * AWS credentials for SigV4 signing. Bedrock also supports Bearer API key auth,\n * which provider facades configure as route auth instead of SigV4. STS-vended\n * credentials should be refreshed by the consumer (rebuild the model) before\n * they expire; the route does not refresh.\n */\nexport interface Credentials {\n readonly region: string\n readonly accessKeyId: string\n readonly secretAccessKey: string\n readonly sessionToken?: string\n}\n\nconst signRequest = (input: {\n readonly url: string\n readonly body: string\n readonly headers: Headers.Headers\n readonly credentials: Credentials\n}) =>\n Effect.tryPromise({\n try: async () => {\n const signed = await new AwsV4Signer({\n url: input.url,\n method: \"POST\",\n headers: Object.entries(input.headers),\n body: input.body,\n region: input.credentials.region,\n accessKeyId: input.credentials.accessKeyId,\n secretAccessKey: input.credentials.secretAccessKey,\n sessionToken: input.credentials.sessionToken,\n service: \"bedrock\",\n }).sign()\n return Object.fromEntries(signed.headers.entries())\n },\n catch: (error) =>\n ProviderShared.invalidRequest(\n `Bedrock Converse SigV4 signing failed: ${error instanceof Error ? error.message : String(error)}`,\n ),\n })\n\n/** Sign the exact JSON bytes with SigV4 using credentials configured on the route. */\nexport const sigV4 = (credentials: Credentials | undefined) =>\n Auth.custom((input: AuthInput) => {\n return Effect.gen(function* () {\n if (!credentials) {\n return yield* ProviderShared.invalidRequest(\n \"Bedrock Converse requires either route bearer auth or AWS credentials configured on the route\",\n )\n }\n const headersForSigning = Headers.set(input.headers, \"content-type\", \"application/json\")\n const signed = yield* signRequest({\n url: input.url,\n body: input.body,\n headers: headersForSigning,\n credentials,\n })\n return Headers.setAll(headersForSigning, signed)\n })\n })\n\n/** Bedrock route auth defaults to SigV4 and expects credentials from route configuration. */\nexport const auth = sigV4(undefined)\n\nexport * as BedrockAuth from \"./bedrock-auth\"\n", | ||
| "import { Schema } from \"effect\"\nimport type { CacheHint } from \"../../schema\"\nimport { newBreakpoints, ttlBucket, type Breakpoints } from \"./cache\"\n\n// Bedrock cache markers are positional: emit a `cachePoint` block immediately\n// after the content the caller wants treated as a cacheable prefix. Bedrock\n// accepts optional `ttl: \"5m\" | \"1h\"` on cachePoint, mirroring Anthropic.\nexport const CachePointBlock = Schema.Struct({\n cachePoint: Schema.Struct({\n type: Schema.tag(\"default\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n }),\n})\nexport type CachePointBlock = Schema.Schema.Type<typeof CachePointBlock>\n\n// Bedrock-Claude enforces the same 4-breakpoint cap as the Anthropic Messages\n// API. Callers pass a shared counter through every `block()` call site so the\n// budget is respected across `system`, `messages`, and `tools`.\nexport const BEDROCK_BREAKPOINT_CAP = 4\n\nexport type { Breakpoints } from \"./cache\"\nexport const breakpoints = () => newBreakpoints(BEDROCK_BREAKPOINT_CAP)\n\nconst DEFAULT_5M: CachePointBlock = { cachePoint: { type: \"default\" } }\nconst DEFAULT_1H: CachePointBlock = { cachePoint: { type: \"default\", ttl: \"1h\" } }\n\nexport const block = (breakpoints: Breakpoints, cache: CacheHint | undefined): CachePointBlock | undefined => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return ttlBucket(cache.ttlSeconds) === \"1h\" ? DEFAULT_1H : DEFAULT_5M\n}\n\nexport * as BedrockCache from \"./bedrock-cache\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport type { MediaPart } from \"../../schema\"\nimport { ProviderShared } from \"../shared\"\n\n// Bedrock Converse accepts image `format` as the file extension and\n// `source.bytes` as base64 in the JSON wire format.\nexport const ImageFormat = Schema.Literals([\"png\", \"jpeg\", \"gif\", \"webp\"])\nexport type ImageFormat = Schema.Schema.Type<typeof ImageFormat>\n\nexport const ImageBlock = Schema.Struct({\n image: Schema.Struct({\n format: ImageFormat,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type ImageBlock = Schema.Schema.Type<typeof ImageBlock>\n\n// Bedrock document blocks require a user-facing name so the model can refer to\n// the uploaded document.\nexport const DocumentFormat = Schema.Literals([\"pdf\", \"csv\", \"doc\", \"docx\", \"xls\", \"xlsx\", \"html\", \"txt\", \"md\"])\nexport type DocumentFormat = Schema.Schema.Type<typeof DocumentFormat>\n\nexport const DocumentBlock = Schema.Struct({\n document: Schema.Struct({\n format: DocumentFormat,\n name: Schema.String,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type DocumentBlock = Schema.Schema.Type<typeof DocumentBlock>\n\nconst IMAGE_FORMATS = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpeg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n} as const satisfies Record<string, ImageFormat>\n\nconst DOCUMENT_FORMATS = {\n \"application/pdf\": \"pdf\",\n \"text/csv\": \"csv\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"text/html\": \"html\",\n \"text/plain\": \"txt\",\n \"text/markdown\": \"md\",\n} as const satisfies Record<string, DocumentFormat>\n\nconst documentBlock = (part: MediaPart, format: DocumentFormat, bytes: string): DocumentBlock => ({\n document: {\n format,\n name: part.filename ?? `document.${format}`,\n source: { bytes },\n },\n})\n\n// Route by MIME. Known image/document formats lower into a typed block; anything\n// else fails with a clear error instead of silently degrading to a malformed\n// document block. Image MIME types not in `IMAGE_FORMATS` (e.g. `image/svg+xml`)\n// get an image-specific error so the caller knows it's a format-support issue,\n// not a kind-detection issue.\nexport const lower = Effect.fn(\"BedrockMedia.lower\")(function* (part: MediaPart) {\n const mime = part.mediaType.toLowerCase()\n const imageFormat = IMAGE_FORMATS[mime as keyof typeof IMAGE_FORMATS]\n if (imageFormat) {\n const media = yield* ProviderShared.validateMedia(\n \"Bedrock Converse\",\n part,\n new Set<string>(Object.keys(IMAGE_FORMATS)),\n )\n return { image: { format: imageFormat, source: { bytes: media.base64 } } } satisfies ImageBlock\n }\n if (mime.startsWith(\"image/\"))\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support image media type ${part.mediaType}`)\n const documentFormat = DOCUMENT_FORMATS[mime as keyof typeof DOCUMENT_FORMATS]\n if (documentFormat) {\n const media = yield* ProviderShared.validateMedia(\n \"Bedrock Converse\",\n part,\n new Set<string>(Object.keys(DOCUMENT_FORMATS)),\n )\n return documentBlock(part, documentFormat, media.base64)\n }\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support media type ${part.mediaType}`)\n})\n\nexport * as BedrockMedia from \"./bedrock-media\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMError,\n LLMEvent,\n Usage,\n type CacheHint,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type ModelToolSchemaCompatibility,\n type ProviderMetadata,\n type ReasoningPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolResultPart,\n} from \"../schema\"\nimport { BedrockEventStream } from \"./bedrock-event-stream\"\nimport { classifyProviderFailure } from \"../provider-error\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared\"\nimport { BedrockAuth } from \"./utils/bedrock-auth\"\nimport { BedrockCache } from \"./utils/bedrock-cache\"\nimport { BedrockMedia } from \"./utils/bedrock-media\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\nimport { ToolStream } from \"./utils/tool-stream\"\n\nconst ADAPTER = \"bedrock-converse\"\n\nexport type { Credentials as BedrockCredentials } from \"./utils/bedrock-auth\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst BedrockTextBlock = Schema.Struct({\n text: Schema.String,\n})\ntype BedrockTextBlock = Schema.Schema.Type<typeof BedrockTextBlock>\n\nconst BedrockToolUseBlock = Schema.Struct({\n toolUse: Schema.Struct({\n toolUseId: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n }),\n})\ntype BedrockToolUseBlock = Schema.Schema.Type<typeof BedrockToolUseBlock>\n\nconst BedrockToolResultContentItem = Schema.Union([\n Schema.Struct({ text: Schema.String }),\n Schema.Struct({ json: Schema.Unknown }),\n BedrockMedia.ImageBlock,\n])\n\nconst BedrockToolResultBlock = Schema.Struct({\n toolResult: Schema.Struct({\n toolUseId: Schema.String,\n content: Schema.Array(BedrockToolResultContentItem),\n status: Schema.optional(Schema.Literals([\"success\", \"error\"])),\n }),\n})\ntype BedrockToolResultBlock = Schema.Schema.Type<typeof BedrockToolResultBlock>\n\nconst BedrockReasoningBlock = Schema.Struct({\n reasoningContent: Schema.Struct({\n reasoningText: Schema.optional(\n Schema.Struct({\n text: Schema.String,\n signature: Schema.optional(Schema.String),\n }),\n ),\n }),\n})\n\nconst BedrockUserBlock = Schema.Union([\n BedrockTextBlock,\n BedrockMedia.ImageBlock,\n BedrockMedia.DocumentBlock,\n BedrockToolResultBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockUserBlock = Schema.Schema.Type<typeof BedrockUserBlock>\n\nconst BedrockAssistantBlock = Schema.Union([\n BedrockTextBlock,\n BedrockReasoningBlock,\n BedrockToolUseBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockAssistantBlock = Schema.Schema.Type<typeof BedrockAssistantBlock>\n\nconst BedrockMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(BedrockUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(BedrockAssistantBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype BedrockMessage = Schema.Schema.Type<typeof BedrockMessage>\n\nconst BedrockSystemBlock = Schema.Union([BedrockTextBlock, BedrockCache.CachePointBlock])\ntype BedrockSystemBlock = Schema.Schema.Type<typeof BedrockSystemBlock>\n\nconst BedrockToolSpec = Schema.Struct({\n toolSpec: Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n inputSchema: Schema.Struct({\n json: JsonObject,\n }),\n }),\n})\ntype BedrockToolSpec = Schema.Schema.Type<typeof BedrockToolSpec>\n\nconst BedrockTool = Schema.Union([BedrockToolSpec, BedrockCache.CachePointBlock])\ntype BedrockTool = Schema.Schema.Type<typeof BedrockTool>\n\nconst BedrockToolChoice = Schema.Union([\n Schema.Struct({ auto: Schema.Struct({}) }),\n Schema.Struct({ any: Schema.Struct({}) }),\n Schema.Struct({ tool: Schema.Struct({ name: Schema.String }) }),\n])\n\nconst BedrockBodyFields = {\n modelId: Schema.String,\n messages: Schema.Array(BedrockMessage),\n system: optionalArray(BedrockSystemBlock),\n inferenceConfig: Schema.optional(\n Schema.Struct({\n maxTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n }),\n ),\n toolConfig: Schema.optional(\n Schema.Struct({\n tools: Schema.Array(BedrockTool),\n toolChoice: Schema.optional(BedrockToolChoice),\n }),\n ),\n additionalModelRequestFields: Schema.optional(JsonObject),\n}\nconst BedrockConverseBody = Schema.Struct(BedrockBodyFields)\nexport type BedrockConverseBody = Schema.Schema.Type<typeof BedrockConverseBody>\n\nconst BedrockUsageSchema = Schema.Struct({\n inputTokens: Schema.optional(Schema.Number),\n outputTokens: Schema.optional(Schema.Number),\n totalTokens: Schema.optional(Schema.Number),\n cacheReadInputTokens: Schema.optional(Schema.Number),\n cacheWriteInputTokens: Schema.optional(Schema.Number),\n})\ntype BedrockUsageSchema = Schema.Schema.Type<typeof BedrockUsageSchema>\n\n// Streaming event shape — the AWS event stream wraps each JSON payload by its\n// `:event-type` header (e.g. `messageStart`, `contentBlockDelta`). We\n// reconstruct that wrapping in `decodeFrames` below so the event schema can\n// stay a plain discriminated record.\nconst BedrockEvent = Schema.Struct({\n messageStart: Schema.optional(Schema.Struct({ role: Schema.String })),\n contentBlockStart: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n start: Schema.optional(\n Schema.Struct({\n toolUse: Schema.optional(Schema.Struct({ toolUseId: Schema.String, name: Schema.String })),\n }),\n ),\n }),\n ),\n contentBlockDelta: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n delta: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n toolUse: Schema.optional(Schema.Struct({ input: Schema.String })),\n reasoningContent: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n }),\n ),\n }),\n ),\n }),\n ),\n contentBlockStop: Schema.optional(Schema.Struct({ contentBlockIndex: Schema.Number })),\n messageStop: Schema.optional(\n Schema.Struct({\n stopReason: Schema.String,\n additionalModelResponseFields: Schema.optional(Schema.Unknown),\n }),\n ),\n metadata: Schema.optional(\n Schema.Struct({\n usage: Schema.optional(BedrockUsageSchema),\n metrics: Schema.optional(Schema.Unknown),\n }),\n ),\n internalServerException: Schema.optional(Schema.Struct({ message: Schema.String })),\n modelStreamErrorException: Schema.optional(Schema.Struct({ message: Schema.String })),\n validationException: Schema.optional(Schema.Struct({ message: Schema.String })),\n throttlingException: Schema.optional(Schema.Struct({ message: Schema.String })),\n serviceUnavailableException: Schema.optional(Schema.Struct({ message: Schema.String })),\n})\ntype BedrockEvent = Schema.Schema.Type<typeof BedrockEvent>\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerToolSpec = (tool: ToolDefinition, inputSchema: JsonSchema): BedrockToolSpec => ({\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: inputSchema },\n },\n})\n\nconst lowerTools = (\n compatibility: ModelToolSchemaCompatibility | undefined,\n breakpoints: BedrockCache.Breakpoints,\n tools: ReadonlyArray<ToolDefinition>,\n): BedrockTool[] => {\n const result: BedrockTool[] = []\n for (const tool of tools) {\n result.push(lowerToolSpec(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, compatibility)))\n const cachePoint = BedrockCache.block(breakpoints, tool.cache)\n if (cachePoint) result.push(cachePoint)\n }\n return result\n}\n\nconst textWithCache = (\n breakpoints: BedrockCache.Breakpoints,\n text: string,\n cache: CacheHint | undefined,\n): Array<BedrockTextBlock | BedrockCache.CachePointBlock> => {\n const cachePoint = BedrockCache.block(breakpoints, cache)\n return cachePoint ? [{ text }, cachePoint] : [{ text }]\n}\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Bedrock Converse\", toolChoice, {\n auto: () => ({ auto: {} }) as const,\n none: () => undefined,\n required: () => ({ any: {} }) as const,\n tool: (name) => ({ tool: { name } }) as const,\n })\n\nconst bedrockMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ bedrock: metadata })\n\nconst reasoningSignature = (part: ReasoningPart) => {\n const bedrock = part.providerMetadata?.bedrock\n return (\n part.encrypted ??\n (ProviderShared.isRecord(bedrock) && typeof bedrock.signature === \"string\" ? bedrock.signature : undefined)\n )\n}\n\nconst lowerToolCall = (part: ToolCallPart): BedrockToolUseBlock => ({\n toolUse: {\n toolUseId: part.id,\n name: part.name,\n input: part.input,\n },\n})\n\nconst lowerToolResultContent = Effect.fn(\"BedrockConverse.lowerToolResultContent\")(function* (part: ToolResultPart) {\n if (part.result.type === \"text\" || part.result.type === \"error\")\n return [{ text: ProviderShared.toolResultText(part) }]\n if (part.result.type === \"json\") return [{ json: part.result.value }]\n\n const content: Array<Schema.Schema.Type<typeof BedrockToolResultContentItem>> = []\n for (const item of part.result.value) {\n if (item.type === \"text\") {\n content.push({ text: item.text })\n continue\n }\n const media = yield* BedrockMedia.lower({\n type: \"media\",\n mediaType: item.mime,\n data: item.uri,\n filename: item.name,\n })\n if (!(\"image\" in media))\n return yield* ProviderShared.invalidRequest(\"Bedrock Converse only supports image media in tool results\")\n content.push(media)\n }\n return content\n})\n\nconst lowerToolResult = Effect.fn(\"BedrockConverse.lowerToolResult\")(function* (part: ToolResultPart) {\n return {\n toolResult: {\n toolUseId: part.id,\n content: yield* lowerToolResultContent(part),\n status: part.result.type === \"error\" ? \"error\" : \"success\",\n },\n } satisfies BedrockToolResultBlock\n})\n\nconst lowerMessages = Effect.fn(\"BedrockConverse.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: BedrockCache.Breakpoints,\n) {\n const messages: BedrockMessage[] = []\n\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Bedrock Converse\", message)\n const content = textWithCache(breakpoints, part.text, part.cache)\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"user\") {\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"user\", [\"text\", \"media\"])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* BedrockMedia.lower(part))\n continue\n }\n }\n messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: BedrockAssistantBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"assistant\", [\n \"text\",\n \"reasoning\",\n \"tool-call\",\n ])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"reasoning\") {\n content.push({\n reasoningContent: {\n reasoningText: { text: part.text, signature: reasoningSignature(part) },\n },\n })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(lowerToolCall(part))\n continue\n }\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"tool\", [\"tool-result\"])\n content.push(yield* lowerToolResult(part))\n const cachePoint = BedrockCache.block(breakpoints, part.cache)\n if (cachePoint) content.push(cachePoint)\n }\n messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\n// System prompts share the cache-point convention: emit the text block, then\n// optionally a positional `cachePoint` marker.\nconst lowerSystem = (\n breakpoints: BedrockCache.Breakpoints,\n system: ReadonlyArray<LLMRequest[\"system\"][number]>,\n): BedrockSystemBlock[] => system.flatMap((part) => textWithCache(breakpoints, part.text, part.cache))\n\nconst fromRequest = Effect.fn(\"BedrockConverse.fromRequest\")(function* (request: LLMRequest) {\n const toolChoice = request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined\n const generation = request.generation\n // Bedrock-Claude shares Anthropic's 4-breakpoint cap. Spend the budget in\n // tools → system → messages order to favour the highest-impact prefixes.\n const breakpoints = BedrockCache.breakpoints()\n const toolConfig =\n request.tools.length > 0 && request.toolChoice?.type !== \"none\"\n ? { tools: lowerTools(request.model.compatibility?.toolSchema, breakpoints, request.tools), toolChoice }\n : undefined\n const system = request.system.length === 0 ? undefined : lowerSystem(breakpoints, request.system)\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Bedrock Converse: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${BedrockCache.BEDROCK_BREAKPOINT_CAP} per request.`,\n )\n }\n return {\n modelId: request.model.id,\n messages,\n system,\n inferenceConfig:\n generation?.maxTokens === undefined &&\n generation?.temperature === undefined &&\n generation?.topP === undefined &&\n (generation?.stop === undefined || generation.stop.length === 0)\n ? undefined\n : {\n maxTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n stopSequences: generation?.stop,\n },\n toolConfig,\n // Converse's base inferenceConfig has no topK; Anthropic/Nova accept it\n // as a model-specific field, so it goes through additionalModelRequestFields.\n additionalModelRequestFields: generation?.topK === undefined ? undefined : { top_k: generation.topK },\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\") return \"stop\"\n if (reason === \"max_tokens\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"content_filtered\" || reason === \"guardrail_intervened\") return \"content-filter\"\n return \"unknown\"\n}\n\n// AWS Bedrock Converse reports `inputTokens` (inclusive total) with\n// `cacheReadInputTokens` and `cacheWriteInputTokens` as subsets. Pass\n// the total through and derive the non-cached breakdown. Bedrock does\n// not break reasoning out of `outputTokens` for any current model.\nconst mapUsage = (usage: BedrockUsageSchema | undefined): Usage | undefined => {\n if (!usage) return undefined\n const cacheTotal = (usage.cacheReadInputTokens ?? 0) + (usage.cacheWriteInputTokens ?? 0)\n const nonCached = ProviderShared.subtractTokens(usage.inputTokens, cacheTotal)\n return new Usage({\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: usage.cacheReadInputTokens,\n cacheWriteInputTokens: usage.cacheWriteInputTokens,\n totalTokens: ProviderShared.totalTokens(usage.inputTokens, usage.outputTokens, usage.totalTokens),\n providerMetadata: { bedrock: usage },\n })\n}\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n // Bedrock splits the finish into `messageStop` (carries `stopReason`) and\n // `metadata` (carries usage). Hold the terminal event in state so `onHalt`\n // can emit exactly one finish after both chunks have had a chance to arrive.\n readonly pendingFinish: { readonly reason: FinishReason; readonly usage?: Usage } | undefined\n readonly hasToolCalls: boolean\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignatures: Readonly<Record<number, string>>\n}\n\nconst step = (state: ParserState, event: BedrockEvent) =>\n Effect.gen(function* () {\n if (event.contentBlockStart?.start?.toolUse) {\n const index = event.contentBlockStart.contentBlockIndex\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, index, {\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n ],\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.text) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.textDelta(\n state.lifecycle,\n events,\n `text-${event.contentBlockDelta.contentBlockIndex}`,\n event.contentBlockDelta.delta.text,\n ),\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.reasoningContent) {\n const index = event.contentBlockDelta.contentBlockIndex\n const reasoning = event.contentBlockDelta.delta.reasoningContent\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: reasoning.text\n ? Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${index}`, reasoning.text)\n : state.lifecycle,\n reasoningSignatures: reasoning.signature\n ? { ...state.reasoningSignatures, [index]: reasoning.signature }\n : state.reasoningSignatures,\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.toolUse) {\n const index = event.contentBlockDelta.contentBlockIndex\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n index,\n event.contentBlockDelta.delta.toolUse.input,\n \"Bedrock Converse tool delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] as const\n }\n\n if (event.contentBlockStop) {\n const index = event.contentBlockStop.contentBlockIndex\n const result = yield* ToolStream.finish(ADAPTER, state.tools, index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${index}`),\n events,\n `reasoning-${index}`,\n state.reasoningSignatures[index]\n ? bedrockMetadata({ signature: state.reasoningSignatures[index] })\n : undefined,\n )\n events.push(...resultEvents)\n return [\n {\n ...state,\n hasToolCalls:\n resultEvents.some((event) => LLMEvent.is.toolCall(event) || LLMEvent.is.toolInputError(event)) ||\n state.hasToolCalls,\n lifecycle,\n tools: result.tools,\n reasoningSignatures: Object.fromEntries(\n Object.entries(state.reasoningSignatures).filter(([key]) => key !== String(index)),\n ),\n },\n events,\n ] as const\n }\n\n if (event.messageStop) {\n return [\n {\n ...state,\n pendingFinish: { reason: mapFinishReason(event.messageStop.stopReason), usage: state.pendingFinish?.usage },\n },\n [],\n ] as const\n }\n\n if (event.metadata) {\n const usage = mapUsage(event.metadata.usage)\n return [{ ...state, pendingFinish: { reason: state.pendingFinish?.reason ?? \"stop\", usage } }, []] as const\n }\n\n const exception = (\n [\n [\"internalServerException\", event.internalServerException],\n [\"modelStreamErrorException\", event.modelStreamErrorException],\n [\"serviceUnavailableException\", event.serviceUnavailableException],\n [\"throttlingException\", event.throttlingException],\n [\"validationException\", event.validationException],\n ] as const\n ).find((entry) => entry[1] !== undefined)\n if (exception) {\n return yield* new LLMError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({\n message: exception[1]?.message ?? \"Bedrock Converse stream error\",\n code: exception[0],\n }),\n })\n }\n\n return [state, []] as const\n })\n\nconst framing = BedrockEventStream.framing(ADAPTER)\n\nconst onHalt = (state: ParserState): ReadonlyArray<LLMEvent> =>\n state.pendingFinish\n ? (() => {\n const events: LLMEvent[] = []\n Lifecycle.finish(state.lifecycle, events, {\n reason:\n state.pendingFinish.reason === \"stop\" && state.hasToolCalls ? \"tool-calls\" : state.pendingFinish.reason,\n usage: state.pendingFinish.usage,\n })\n return events\n })()\n : []\n\n// =============================================================================\n// Protocol And Bedrock Route\n// =============================================================================\n/**\n * The Bedrock Converse protocol — request body construction, body schema, and\n * the streaming-event state machine.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: BedrockConverseBody,\n from: fromRequest,\n },\n stream: {\n event: BedrockEvent,\n initial: () => ({\n tools: ToolStream.empty<number>(),\n pendingFinish: undefined,\n hasToolCalls: false,\n lifecycle: Lifecycle.initial(),\n reasoningSignatures: {},\n }),\n step,\n onHalt,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"bedrock\",\n providerMetadataKey: \"bedrock\",\n protocol,\n // Bedrock's URL embeds the region in the route endpoint host and the\n // validated modelId in the path. We read the validated body so the URL\n // matches the body that gets signed.\n endpoint: Endpoint.path<BedrockConverseBody>(\n ({ body }) => `/model/${encodeURIComponent(body.modelId)}/converse-stream`,\n ),\n auth: BedrockAuth.auth,\n framing,\n})\n\nexport const sigV4Auth = BedrockAuth.sigV4\n\nexport * as BedrockConverse from \"./bedrock-converse\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as BedrockConverse from \"../protocols/bedrock-converse\"\nimport type { BedrockCredentials } from \"../protocols/bedrock-converse\"\n\nexport const id = ProviderID.make(\"amazon-bedrock\")\n\nexport type Config = RouteDefaultsInput & {\n readonly apiKey?: string\n readonly headers?: Record<string, string>\n readonly credentials?: BedrockCredentials\n /** AWS region. Defaults to `us-east-1` when neither this nor `credentials.region` is set. */\n readonly region?: string\n /** Override the computed `https://bedrock-runtime.<region>.amazonaws.com` URL. */\n readonly baseURL?: string\n}\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly auth?: \"bearer\" | \"sigv4\"\n readonly baseURL?: string\n readonly credentials?: BedrockCredentials\n readonly region?: string\n readonly topP?: number\n}\nexport const routes = [BedrockConverse.route]\n\nconst bedrockBaseURL = (region: string) => `https://bedrock-runtime.${region}.amazonaws.com`\n\nconst configuredRoute = (input: Config) => {\n const { apiKey, credentials, region, baseURL, ...rest } = input\n const resolvedRegion = region ?? credentials?.region ?? \"us-east-1\"\n return BedrockConverse.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? bedrockBaseURL(resolvedRegion) },\n auth: apiKey === undefined ? BedrockConverse.sigV4Auth(credentials) : Auth.bearer(apiKey),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.auth === \"bearer\" && settings.apiKey === undefined)\n throw new Error(\"Amazon Bedrock bearer auth requires apiKey\")\n if (settings.auth === \"sigv4\" && settings.apiKey !== undefined)\n throw new Error(\"Amazon Bedrock SigV4 auth does not accept apiKey\")\n return configure({\n apiKey: settings.auth === \"sigv4\" ? undefined : settings.apiKey,\n baseURL: settings.baseURL,\n credentials: settings.credentials,\n generation: settings.topP === undefined ? undefined : { topP: settings.topP },\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n region: settings.region,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E48145E7836170B164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";o2BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH", | ||
| "debugId": "551B74A27E285C3964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-images.ts", "../ai/src/providers/openai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport {\n ImageModel,\n GeneratedImage,\n ImageResponse,\n type ImageRequest,\n type ImageModelDefaults,\n type ImageRoute,\n} from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport { InvalidProviderOutputReason, LLMError, Usage, mergeHttpOptions, mergeJsonRecords } from \"../schema\"\nimport { ProviderShared } from \"./shared\"\nimport { OpenAIImage } from \"./utils/openai-image\"\n\nconst ADAPTER = \"openai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/images/generations\"\n\nexport interface OpenAIImageOptions {\n readonly quality?: \"auto\" | \"low\" | \"medium\" | \"high\"\n readonly background?: \"auto\" | \"opaque\" | \"transparent\"\n readonly moderation?: \"auto\" | \"low\"\n readonly outputFormat?: \"png\" | \"jpeg\" | \"webp\"\n readonly outputCompression?: number\n}\n\nconst OpenAIImageBody = Schema.Struct({\n model: Schema.String,\n prompt: Schema.String,\n n: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))),\n size: Schema.optional(Schema.String),\n quality: Schema.optional(Schema.Literals([\"auto\", \"low\", \"medium\", \"high\"])),\n background: Schema.optional(Schema.Literals([\"auto\", \"opaque\", \"transparent\"])),\n moderation: Schema.optional(Schema.Literals([\"auto\", \"low\"])),\n output_format: Schema.optional(Schema.Literals([\"png\", \"jpeg\", \"webp\"])),\n output_compression: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 100 }))),\n})\nexport type OpenAIImageBody = Schema.Schema.Type<typeof OpenAIImageBody>\n\nconst OpenAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: Schema.optional(Schema.String),\n url: Schema.optional(Schema.String),\n revised_prompt: Schema.optional(Schema.String),\n }),\n ),\n output_format: Schema.optional(Schema.String),\n usage: Schema.optional(\n Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n total_tokens: Schema.optional(Schema.Number),\n input_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n output_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n }),\n ),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly defaults?: ImageModelDefaults\n}\n\nconst providerOptions = (request: ImageRequest): OpenAIImageOptions => ({\n ...request.model.defaults?.providerOptions?.openai,\n ...request.providerOptions?.openai,\n})\n\nconst body = (request: ImageRequest): OpenAIImageBody => {\n const options = providerOptions(request)\n return {\n model: request.model.id,\n prompt: request.prompt,\n n: request.count,\n size: request.size === undefined ? undefined : `${request.size.width}x${request.size.height}`,\n quality: options.quality,\n background: options.background,\n moderation: options.moderation,\n output_format: options.outputFormat,\n output_compression: options.outputCompression,\n }\n}\n\nconst invalidOutput = (message: string) =>\n new LLMError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nconst PROTOCOL_BODY_FIELDS = new Set([\n \"model\",\n \"prompt\",\n \"n\",\n \"size\",\n \"quality\",\n \"background\",\n \"moderation\",\n \"output_format\",\n \"output_compression\",\n])\n\nconst bodyWithOverlay = Effect.fn(\"OpenAIImages.bodyWithOverlay\")(function* (\n imageBody: OpenAIImageBody,\n overlay: Record<string, unknown> | undefined,\n) {\n if (!overlay) return imageBody\n const reserved = Object.keys(overlay).filter((key) => PROTOCOL_BODY_FIELDS.has(key))\n if (reserved.length > 0)\n return yield* ProviderShared.invalidRequest(\n `http.body cannot overlay protocol-owned field(s): ${reserved.join(\", \")}`,\n )\n return mergeJsonRecords(imageBody, overlay) ?? imageBody\n})\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute = {\n id: ADAPTER,\n generate: Effect.fn(\"OpenAIImages.generate\")(function* (request: ImageRequest, execute) {\n if (request.aspectRatio !== undefined)\n return yield* ProviderShared.invalidRequest(\"OpenAI Images does not support the common aspectRatio option\")\n if (request.seed !== undefined)\n return yield* ProviderShared.invalidRequest(\"OpenAI Images does not support the common seed option\")\n\n const requestBody = yield* ProviderShared.validateWith(Schema.decodeUnknownEffect(OpenAIImageBody))(body(request))\n const http = mergeHttpOptions(request.model.defaults?.http, request.http)\n const overlaidBody = yield* bodyWithOverlay(requestBody, http?.body)\n const text = ProviderShared.encodeJson(overlaidBody)\n const url = applyQuery(`${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${PATH}`, http?.query)\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the OpenAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(OpenAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"OpenAI Images returned an invalid response\")),\n )\n const format = decoded.output_format ?? providerOptions(request).outputFormat ?? \"png\"\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`OpenAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: `image/${format}`,\n data,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType: `image/${format}`,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`OpenAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"OpenAI Images returned no images\")\n return new ImageResponse({\n images,\n usage:\n decoded.usage === undefined\n ? undefined\n : new Usage({\n inputTokens: decoded.usage.input_tokens,\n outputTokens: decoded.usage.output_tokens,\n totalTokens: decoded.usage.total_tokens,\n providerMetadata: { openai: decoded.usage },\n }),\n providerMetadata: { openai: { outputFormat: format } },\n })\n }),\n }\n return ImageModel.make({ id: input.id, provider: \"openai\", route, defaults: input.defaults })\n}\n\nexport const OpenAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { Route, RouteDefaultsInput } from \"../route/client\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { HttpOptions, ProviderID, ToolDefinition, mergeHttpOptions, type ModelID } from \"../schema\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options\"\nimport { OpenAIImages, type OpenAIImageOptions } from \"../protocols/openai-images\"\n\nexport type { OpenAIOptionsInput, OpenAIResponseIncludable } from \"./openai-options\"\nexport type { OpenAIImageOptions } from \"../protocols/openai-images\"\n\nexport const id = ProviderID.make(\"openai\")\n\nexport const routes = [OpenAIResponses.route, OpenAIResponses.webSocketRoute, OpenAIChat.route]\n\n// This provider facade wraps the lower-level Responses and Chat model factories\n// with OpenAI-specific conveniences: typed options, API-key sugar, env fallback,\n// and default option normalization.\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly queryParams?: Record<string, string>\n readonly providerOptions?: OpenAIProviderOptionsInput\n readonly image?: ImageConfig\n }\n\nexport interface ImageConfig {\n readonly providerOptions?: OpenAIImageOptions\n}\n\nexport interface ImageGenerationOptions {\n readonly action?: \"auto\" | \"generate\" | \"edit\"\n readonly background?: \"auto\" | \"opaque\" | \"transparent\"\n readonly inputFidelity?: \"low\" | \"high\"\n readonly outputCompression?: number\n readonly outputFormat?: \"png\" | \"jpeg\" | \"webp\"\n readonly partialImages?: number\n readonly quality?: \"auto\" | \"low\" | \"medium\" | \"high\"\n readonly size?: string\n}\n\nexport const imageGeneration = (options: ImageGenerationOptions = {}) =>\n ToolDefinition.make({\n name: \"image_generation\",\n description: \"Generate or edit an image using OpenAI's hosted image generation tool.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n native: {\n openai: {\n type: \"image_generation\",\n action: options.action,\n background: options.background,\n input_fidelity: options.inputFidelity,\n output_compression: options.outputCompression,\n output_format: options.outputFormat,\n partial_images: options.partialImages,\n quality: options.quality,\n size: options.size,\n },\n },\n })\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly organization?: string\n readonly project?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly transport?: \"http\" | \"websocket\"\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"OPENAI_API_KEY\")\n\nconst defaults = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL: _baseURL, queryParams: _queryParams, image: _image, ...rest } = input\n return rest\n}\n\nconst configuredRoute = <Body, Prepared>(route: Route<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: { baseURL: input.baseURL, query: input.queryParams },\n })\n\nexport const configure = (input: Config = {}) => {\n const responsesRoute = configuredRoute(OpenAIResponses.route, input)\n const responsesWebSocketRoute = configuredRoute(OpenAIResponses.webSocketRoute, input)\n const chatRoute = configuredRoute(OpenAIChat.route, input)\n const modelDefaults = defaults(input)\n const responses = (id: string | ModelID) =>\n responsesRoute.with(withOpenAIOptions(id, modelDefaults, { textVerbosity: true })).model({ id })\n const responsesWebSocket = (id: string | ModelID) =>\n responsesWebSocketRoute.with(withOpenAIOptions(id, modelDefaults, { textVerbosity: true })).model({ id })\n const chat = (id: string | ModelID) => chatRoute.with(withOpenAIOptions(id, modelDefaults)).model({ id })\n const image = (modelID: string | ModelID) =>\n OpenAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n defaults: {\n providerOptions:\n input.image?.providerOptions === undefined ? undefined : { openai: { ...input.image.providerOptions } },\n http: mergeHttpOptions(\n input.http === undefined ? undefined : HttpOptions.make(input.http),\n input.queryParams === undefined ? undefined : new HttpOptions({ query: input.queryParams }),\n ),\n },\n })\n\n return {\n id,\n model: responses,\n responses,\n responsesWebSocket,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\n\nconst config = (settings: Settings): Config => {\n const headers = {\n ...(settings.organization === undefined ? {} : { \"OpenAI-Organization\": settings.organization }),\n ...(settings.project === undefined ? {} : { \"OpenAI-Project\": settings.project }),\n ...settings.headers,\n }\n return {\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: Object.keys(headers).length === 0 ? undefined : headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n const configured = configure(config(settings))\n if (settings.transport === undefined || settings.transport === \"http\") return configured.responses(modelID)\n if (settings.transport === \"websocket\") return configured.responsesWebSocket(modelID)\n throw new Error(`Unsupported OpenAI Responses transport: ${String(settings.transport)}`)\n}\n\nexport const chatModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).chat(modelID)\nexport const responses = provider.responses\nexport const responsesWebSocket = provider.responsesWebSocket\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "CA36003241B49D1D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/restart.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "FA8EC57862A8CA3764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "12EF59F6AC3D6A0E64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? Global.Path.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n" | ||
| ], | ||
| "mappings": ";2xBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC", | ||
| "debugId": "FA6D85F8E5CAAD8D64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderOptions, ReasoningEffort, TextVerbosity } from \"../schema\"\nimport { mergeProviderOptions } from \"../schema\"\nimport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options\"\n\nexport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options\"\n\nexport interface OpenAIOptionsInput {\n readonly [key: string]: unknown\n readonly store?: boolean\n readonly promptCacheKey?: string\n readonly reasoningEffort?: ReasoningEffort\n readonly reasoningSummary?: \"auto\"\n // OpenAI Responses `include` wire field. Mirrors the official SDK's\n // `ResponseIncludable[]` union exactly so AI SDK callers and direct\n // native-SDK callers share one shape and no translation is required.\n readonly include?: ReadonlyArray<OpenAIResponseIncludable>\n readonly textVerbosity?: TextVerbosity\n readonly serviceTier?: OpenAIServiceTier\n}\n\nexport type OpenAIProviderOptionsInput = ProviderOptions & {\n readonly openai?: OpenAIOptionsInput\n}\n\nconst definedEntries = (input: Record<string, unknown>) =>\n Object.entries(input).filter((entry) => entry[1] !== undefined)\n\nconst openAIProviderOptions = (options: OpenAIOptionsInput | undefined): ProviderOptions | undefined => {\n const openai = Object.fromEntries(\n definedEntries({\n store: options?.store,\n promptCacheKey: options?.promptCacheKey,\n reasoningEffort: options?.reasoningEffort,\n reasoningSummary: options?.reasoningSummary,\n include: options?.include,\n textVerbosity: options?.textVerbosity,\n serviceTier: options?.serviceTier,\n }),\n )\n if (Object.keys(openai).length === 0) return undefined\n return { openai }\n}\n\nexport const gpt5DefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined => {\n const id = modelID.toLowerCase()\n if (!id.includes(\"gpt-5\") || id.includes(\"gpt-5-chat\") || id.includes(\"gpt-5-pro\")) return undefined\n return openAIProviderOptions({\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n // GPT-5 reasoning models are configured stateless (`store: false`) by\n // `openAIDefaultOptions` below, so the only way a follow-up turn can\n // carry reasoning state is via the encrypted reasoning include. Without\n // this, callers using the default model facade get reasoning summaries\n // they cannot replay statelessly.\n include: [\"reasoning.encrypted_content\"],\n textVerbosity:\n options.textVerbosity === true && id.includes(\"gpt-5.\") && !id.includes(\"codex\") && !id.includes(\"-chat\")\n ? \"low\"\n : undefined,\n })\n}\n\nexport const openAIDefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined =>\n mergeProviderOptions(openAIProviderOptions({ store: false }), gpt5DefaultOptions(modelID, options))\n\nexport const withOpenAIOptions = <Options extends { readonly providerOptions?: OpenAIProviderOptionsInput }>(\n modelID: string,\n options: Options,\n defaults: { readonly textVerbosity?: boolean } = {},\n): Omit<Options, \"providerOptions\"> & { readonly providerOptions?: ProviderOptions } => {\n return {\n ...options,\n providerOptions: mergeProviderOptions(openAIDefaultOptions(modelID, defaults), options.providerOptions),\n }\n}\n\nexport * as OpenAIProviderOptions from \"./openai-options\"\n" | ||
| ], | ||
| "mappings": ";oDAwBA,IAAM,EAAiB,CAAC,IACtB,OAAO,QAAQ,CAAK,EAAE,OAAO,CAAC,IAAU,EAAM,KAAO,MAAS,EAE1D,EAAwB,CAAC,IAAyE,CACtG,IAAM,EAAS,OAAO,YACpB,EAAe,CACb,MAAO,GAAS,MAChB,eAAgB,GAAS,eACzB,gBAAiB,GAAS,gBAC1B,iBAAkB,GAAS,iBAC3B,QAAS,GAAS,QAClB,cAAe,GAAS,cACxB,YAAa,GAAS,WACxB,CAAC,CACH,EACA,GAAI,OAAO,KAAK,CAAM,EAAE,SAAW,EAAG,OACtC,MAAO,CAAE,QAAO,GAGL,EAAqB,CAChC,EACA,EAAgD,CAAC,IACjB,CAChC,IAAM,EAAK,EAAQ,YAAY,EAC/B,GAAI,CAAC,EAAG,SAAS,OAAO,GAAK,EAAG,SAAS,YAAY,GAAK,EAAG,SAAS,WAAW,EAAG,OACpF,OAAO,EAAsB,CAC3B,gBAAiB,SACjB,iBAAkB,OAMlB,QAAS,CAAC,6BAA6B,EACvC,cACE,EAAQ,gBAAkB,IAAQ,EAAG,SAAS,QAAQ,GAAK,CAAC,EAAG,SAAS,OAAO,GAAK,CAAC,EAAG,SAAS,OAAO,EACpG,MACA,MACR,CAAC,GAGU,EAAuB,CAClC,EACA,EAAgD,CAAC,IAEjD,EAAqB,EAAsB,CAAE,MAAO,EAAM,CAAC,EAAG,EAAmB,EAAS,CAAO,CAAC,EAEvF,EAAoB,CAC/B,EACA,EACA,EAAiD,CAAC,IACoC,CACtF,MAAO,IACF,EACH,gBAAiB,EAAqB,EAAqB,EAAS,CAAQ,EAAG,EAAQ,eAAe,CACxG", | ||
| "debugId": "819BEB8FA62A55A664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/plugin/sdk.ts", "../plugin/src/v2/effect/tool.ts", "../plugin/src/v2/effect/plugin.ts", "../schema/src/session.ts", "../schema/src/command.ts", "../schema/src/reference.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SdkPlugins from \"./sdk\"\n\nimport type { Plugin } from \"@opencode-ai/plugin/v2/effect/plugin\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { makeGlobalNode } from \"../effect/app-node\"\nimport { EventV2 } from \"../event\"\nimport type { PluginV2 } from \"../plugin\"\n\nexport const Updated = EventV2.ephemeral({ type: \"sdk.plugin.updated\", schema: {} })\n\n/**\n * Holds the plugins an embedder (the `@opencode-ai/sdk-next` host) contributes,\n * so `PluginSupervisor` can add them on every Location boot through the ordinary\n * generation path that `PluginSupervisor` uses for plugins discovered from\n * config. Registration publishes an unlocated update so every booted Location\n * reloads its plugin generation from the shared store.\n *\n * Each host-global layer owns one private store. Location graphs reuse that\n * layer through Effect's memoization, so separate hosts remain isolated while\n * every Location in one host sees the same registrations.\n */\nexport interface Interface {\n readonly register: (plugin: Plugin) => Effect.Effect<void>\n readonly all: () => readonly PluginV2.Versioned[]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/SdkPlugins\") {}\n\nexport const layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const events = yield* EventV2.Service\n const plugins = new Map<string, PluginV2.Versioned>()\n let revision = 0\n return Service.of({\n register: (plugin) =>\n Effect.sync(() => {\n plugins.set(plugin.id, { ...plugin, version: String(++revision) })\n }).pipe(Effect.andThen(events.publish(Updated, {})), Effect.asVoid),\n all: () => [...plugins.values()],\n })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer, deps: [EventV2.node] })\n", | ||
| "export * as Tool from \"./tool.js\"\n\nimport { Agent } from \"@opencode-ai/schema/agent\"\nimport type { LLM } from \"@opencode-ai/schema/llm\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from \"@standard-schema/spec\"\nimport { Effect, JsonSchema, Schema } from \"effect\"\nimport type { Hooks, Transform } from \"./registration.js\"\n\nexport interface Context {\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly progress: (update: Progress) => Effect.Effect<void>\n}\n\nexport interface Progress {\n readonly structured: Readonly<Record<string, unknown>>\n readonly content?: ReadonlyArray<Content>\n}\n\nexport type StandardSchemaType<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output> &\n StandardJSONSchemaV1<Input, Output>\nexport type SchemaType<A> = Schema.Codec<A, any> | StandardSchemaType<any, A>\ntype IsAny<A> = 0 extends 1 & A ? true : false\nexport type InputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\nexport type OutputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<infer A, any>\n ? A\n : never\nexport type EncodedValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<any, infer A>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\n\ntype ToolDefinition = {\n readonly name: string\n readonly description: string\n readonly inputSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n}\n\ntype ToolCall = {\n readonly input: unknown\n readonly [key: string]: unknown\n}\n\ntype ToolResultValue =\n | { readonly type: \"json\"; readonly value: unknown }\n | { readonly type: \"text\"; readonly value: unknown }\n | { readonly type: \"error\"; readonly value: unknown }\n | { readonly type: \"content\"; readonly value: ReadonlyArray<LLM.ToolContent> }\n\ntype ToolOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<LLM.ToolContent>\n}\n\nexport class Failure extends Schema.TaggedErrorClass<Failure>()(\"LLM.ToolFailure\", {\n message: Schema.String,\n error: Schema.optional(Schema.Defect()),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport class RegistrationError extends Schema.TaggedErrorClass<RegistrationError>()(\"Tool.RegistrationError\", {\n name: Schema.String,\n message: Schema.String,\n}) {}\n\nexport type Content =\n | { readonly type: \"text\"; readonly text: string }\n | { readonly type: \"file\"; readonly data: string; readonly mime: string; readonly name?: string }\n\nexport type Definition<\n Input extends SchemaType<any>,\n Structured extends SchemaType<any>,\n Output extends SchemaType<any> = any,\n> = {\n readonly description: string\n readonly input: Input\n readonly output: Output\n readonly structured?: Structured\n readonly permission?: string\n readonly toStructuredOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => OutputValue<Structured>\n readonly execute: (input: InputValue<Input>, context: Context) => Effect.Effect<OutputValue<Output>, Failure>\n readonly toModelOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => ReadonlyArray<Content>\n}\n\nexport type DynamicOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<Content>\n}\n\n/**\n * Config for a tool whose input shape is a raw JSON Schema not known at compile\n * time (MCP servers, plugin manifests). Input is passed through as `unknown`;\n * `execute` returns the already-projected structured value and model content.\n */\nexport type DynamicDefinition = {\n readonly description: string\n readonly jsonSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n readonly permission?: string\n readonly execute: (input: unknown, context: Context) => Effect.Effect<DynamicOutput, Failure>\n}\n\nexport type AnyTool = Definition<any, any> | DynamicDefinition\n\nexport function make<\n Input extends SchemaType<any>,\n Output extends SchemaType<any>,\n Structured extends SchemaType<any> = Output,\n>(config: Definition<Input, Structured, Output>): Definition<Input, Structured, Output>\nexport function make(config: DynamicDefinition): DynamicDefinition\nexport function make(config: AnyTool): AnyTool\nexport function make(config: AnyTool): AnyTool {\n return config\n}\n\nfunction toModelContent(part: Content) {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text }\n return { type: \"file\" as const, uri: `data:${part.mime};base64,${part.data}`, mime: part.mime, name: part.name }\n}\n\nexport const validateName = (name: string) =>\n /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(name)\n ? Effect.void\n : Effect.fail(new RegistrationError({ name, message: `Invalid tool name: ${name}` }))\n\nexport const registrationEntries = (tools: Readonly<Record<string, AnyTool>>, namespace?: string) =>\n Object.entries(tools).map(([name, tool]) => {\n const normalized = name.replace(/[^a-zA-Z0-9_-]/g, \"_\")\n return {\n key: namespace === undefined ? normalized : `${namespace.replaceAll(\".\", \"_\")}_${normalized}`,\n name: normalized,\n namespace,\n tool,\n }\n })\n\nexport const validateNamespace = (namespace: string) =>\n namespace.split(\".\").every((segment) => /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(segment))\n ? Effect.void\n : Effect.fail(\n new RegistrationError({ name: namespace, message: `Invalid tool namespace: ${JSON.stringify(namespace)}` }),\n )\n\nexport const withPermission = <T extends AnyTool>(\n tool: T,\n permission: string,\n): Omit<T, \"permission\"> & {\n readonly permission: string\n} => ({ ...tool, permission })\n\nexport const permission = (tool: AnyTool, name: string) => tool.permission ?? name\n\nexport const definition = (name: string, tool: AnyTool): ToolDefinition =>\n \"jsonSchema\" in tool\n ? {\n name,\n description: tool.description,\n inputSchema: tool.jsonSchema,\n outputSchema: tool.outputSchema,\n }\n : {\n name,\n description: tool.description,\n inputSchema: inputJsonSchema(tool.input),\n outputSchema: outputJsonSchema(tool.structured ?? tool.output),\n }\n\nexport const settle = (tool: AnyTool, call: ToolCall, context: Context): Effect.Effect<ToolOutput, Failure> =>\n Effect.gen(function* () {\n if (\"jsonSchema\" in tool) {\n const output = yield* tool.execute(call.input, context)\n return { structured: output.structured, content: output.content.map(toModelContent) }\n }\n\n const input = yield* decodeInput(tool.input, call.input)\n const value = yield* tool.execute(input, context)\n const output = yield* encodeOutput(tool.output, value)\n const structured =\n tool.structured && tool.toStructuredOutput\n ? yield* encodeOutput(tool.structured, tool.toStructuredOutput({ input, output }))\n : output\n return {\n structured,\n content:\n tool.toModelOutput?.({ input, output }).map(toModelContent) ??\n (typeof output === \"string\" ? [{ type: \"text\" as const, text: output }] : []),\n }\n })\n\nfunction decodeInput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError((error) => new Failure({ message: `Invalid tool input: ${error.message}` })),\n )\n return validateStandard(schema, value, \"Invalid tool input\")\n}\n\nfunction encodeOutput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.encodeEffect(schema)(value).pipe(\n Effect.mapError(\n (error) => new Failure({ message: `Tool returned an invalid value for its output schema: ${error.message}` }),\n ),\n )\n return validateStandard(schema, value, \"Tool returned an invalid value for its output schema\")\n}\n\nfunction validateStandard(schema: StandardSchemaType, value: unknown, prefix: string): Effect.Effect<unknown, Failure> {\n return Effect.gen(function* () {\n const pending = yield* Effect.try({\n try: () => schema[\"~standard\"].validate(value),\n catch: (error) => standardFailure(prefix, error),\n })\n const result =\n pending instanceof Promise\n ? yield* Effect.tryPromise({ try: () => pending, catch: (error) => standardFailure(prefix, error) })\n : pending\n if (result.issues)\n return yield* Effect.fail(\n new Failure({ message: `${prefix}: ${result.issues.map((issue) => issue.message).join(\", \")}` }),\n )\n return result.value\n })\n}\n\nfunction standardFailure(prefix: string, error: unknown) {\n return new Failure({ message: `${prefix}: ${error instanceof Error ? error.message : String(error)}` })\n}\n\nfunction inputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.input({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction outputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.output({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction toJsonSchema(schema: Schema.Top): JsonSchema.JsonSchema {\n const document = Schema.toJsonSchemaDocument(schema)\n if (Object.keys(document.definitions).length === 0) return document.schema\n return { ...document.schema, $defs: document.definitions }\n}\n\nexport interface ToolExecuteBeforeEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n input: unknown\n}\n\nexport interface ToolExecuteAfterEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly input: unknown\n result: ToolResultValue\n output?: ToolOutput\n outputPaths?: ReadonlyArray<string>\n}\n\nexport interface RegisterOptions {\n readonly namespace?: string\n /** Defaults to true. False exposes the tool directly to the provider. */\n readonly codemode?: boolean\n}\n\nexport interface ToolDraft {\n add(name: string, tool: AnyTool, options?: RegisterOptions): void\n}\n\nexport interface ToolHooks {\n readonly \"execute.before\": ToolExecuteBeforeEvent\n readonly \"execute.after\": ToolExecuteAfterEvent\n}\n\nexport interface ToolDomain {\n readonly transform: Transform<ToolDraft>\n readonly hook: Hooks<ToolHooks>\n}\n", | ||
| "import type { PluginApi } from \"@opencode-ai/client/effect/api\"\nimport type { Effect, Scope } from \"effect\"\nimport type { PluginOptions } from \"../options.js\"\nimport type { AgentDomain } from \"./agent.js\"\nimport type { AISDKDomain } from \"./aisdk.js\"\nimport type { CatalogDomain } from \"./catalog.js\"\nimport type { CommandDomain } from \"./command.js\"\nimport type { EventDomain } from \"./event.js\"\nimport type { IntegrationDomain } from \"./integration.js\"\nimport type { ReferenceDomain } from \"./reference.js\"\nimport type { SessionDomain } from \"./session.js\"\nimport type { SkillDomain } from \"./skill.js\"\nimport type { ToolDomain } from \"./tool.js\"\n\nexport interface Context {\n readonly options: PluginOptions\n readonly agent: AgentDomain\n readonly aisdk: AISDKDomain\n readonly catalog: CatalogDomain\n readonly command: CommandDomain\n readonly event: EventDomain\n readonly integration: IntegrationDomain\n readonly plugin: PluginApi<unknown>\n readonly reference: ReferenceDomain\n readonly session: SessionDomain\n readonly skill: SkillDomain\n readonly tool: ToolDomain\n}\n\nexport interface Plugin<R = Scope.Scope> {\n readonly id: string\n readonly effect: (context: Context) => Effect.Effect<void, never, R>\n}\n\nexport function define<R = Scope.Scope>(plugin: Plugin<R>) {\n return plugin\n}\n", | ||
| "export * as Session from \"./session.js\"\n\nimport { Schema } from \"effect\"\nimport { Agent } from \"./agent.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionEvent } from \"./session-event.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Money } from \"./money.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { Revert } from \"./session-revert.js\"\n\nexport const ID = SessionID\nexport type ID = SessionID\n\nexport const Event = SessionEvent\n\nexport { Revert }\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n parentID: ID.pipe(optional),\n fork: Schema.Struct({\n sessionID: ID,\n /** Messages before this exclusive boundary are copied into the fork. */\n messageID: SessionMessage.ID.pipe(optional),\n }).pipe(optional),\n projectID: Project.ID,\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n updated: DateTimeUtcFromMillis,\n archived: DateTimeUtcFromMillis.pipe(optional),\n }),\n title: Schema.String,\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n revert: Revert.pipe(optional),\n}).annotate({ identifier: \"Session.Info\" })\n\nexport const ListAnchor = Schema.Struct({\n id: ID,\n time: Schema.Finite,\n direction: Schema.Literals([\"previous\", \"next\"]),\n}).annotate({ identifier: \"Session.ListAnchor\" })\nexport interface ListAnchor extends Schema.Schema.Type<typeof ListAnchor> {}\n", | ||
| "export * as Command from \"./command.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Agent } from \"./agent.js\"\n\nconst Updated = ephemeral({ type: \"command.updated\", schema: {} })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n name: Schema.String,\n template: Schema.String,\n description: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n subtask: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Command.Info\" })\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Reference from \"./reference.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"reference.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface LocalSource extends Schema.Schema.Type<typeof LocalSource> {}\nexport const LocalSource = Schema.Struct({\n type: Schema.Literal(\"local\"),\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.LocalSource\" })\n\nexport interface GitSource extends Schema.Schema.Type<typeof GitSource> {}\nexport const GitSource = Schema.Struct({\n type: Schema.Literal(\"git\"),\n repository: Schema.String,\n branch: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.GitSource\" })\n\nexport const Source = Schema.Union([LocalSource, GitSource])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Reference.Source\" })\nexport type Source = typeof Source.Type\n\nexport const Info = Schema.Struct({\n name: Schema.String,\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n source: Source,\n}).annotate({ identifier: \"Reference.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "A56DEA607909CE8A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Duration, Effect, Fiber, Layer, Schema, Stream } from \"effect\"\nimport type { PlatformError } from \"effect/PlatformError\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { CrossSpawnSpawner } from \"./cross-spawn-spawner\"\nimport { makeGlobalNode } from \"./effect/app-node\"\n\nexport class AppProcessError extends Schema.TaggedErrorClass<AppProcessError>()(\"AppProcessError\", {\n command: Schema.String,\n exitCode: Schema.optional(Schema.Number),\n stderr: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {\n override get message() {\n const detail =\n this.stderr?.trim() || (this.cause instanceof Error ? this.cause.message : this.cause && String(this.cause))\n const status = this.exitCode === undefined ? \"\" : ` (exit ${this.exitCode})`\n return `Command failed${status}: ${this.command}${detail ? `: ${detail}` : \"\"}`\n }\n}\n\nexport interface RunOptions {\n readonly combineOutput?: boolean\n readonly maxOutputBytes?: number\n readonly maxErrorBytes?: number\n readonly signal?: AbortSignal\n readonly timeout?: Duration.Input\n readonly stdin?: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>\n}\n\nexport interface RunStreamOptions {\n readonly signal?: AbortSignal\n readonly includeStderr?: boolean\n readonly okExitCodes?: ReadonlyArray<number>\n readonly maxErrorBytes?: number\n}\n\nexport interface RunResult {\n readonly command: string\n readonly exitCode: number\n readonly output?: Buffer\n readonly stdout: Buffer\n readonly stderr: Buffer\n readonly outputTruncated?: boolean\n readonly stdoutTruncated: boolean\n readonly stderrTruncated: boolean\n}\n\nexport type Interface = ChildProcessSpawner[\"Service\"] & {\n readonly run: (command: ChildProcess.Command, options?: RunOptions) => Effect.Effect<RunResult, AppProcessError>\n readonly runStream: (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ) => Stream.Stream<string, AppProcessError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/AppProcess\") {}\n\nexport const requireSuccess = (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n result.exitCode === 0\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nexport const requireExitIn =\n (codes: ReadonlyArray<number>) =>\n (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n codes.includes(result.exitCode)\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nconst describeCommand = (command: ChildProcess.Command): string => {\n if (command._tag === \"StandardCommand\") {\n return command.args.length ? `${command.command} ${command.args.join(\" \")}` : command.command\n }\n return `${describeCommand(command.left)} | ${describeCommand(command.right)}`\n}\n\nconst wrapError = (description: string, cause: unknown): AppProcessError =>\n cause instanceof AppProcessError ? cause : new AppProcessError({ command: description, cause })\n\nexport const abortError = (signal: AbortSignal): Error => {\n const reason = signal.reason\n if (reason instanceof Error) return reason\n const err = new Error(\"Aborted\")\n err.name = \"AbortError\"\n return err\n}\n\nexport const waitForAbort = (signal: AbortSignal) =>\n Effect.callback<never, Error>((resume) => {\n if (signal.aborted) {\n resume(Effect.fail(abortError(signal)))\n return\n }\n const onabort = () => resume(Effect.fail(abortError(signal)))\n signal.addEventListener(\"abort\", onabort, { once: true })\n return Effect.sync(() => signal.removeEventListener(\"abort\", onabort))\n })\n\nconst normalizeStdin = (\n input: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>,\n): Stream.Stream<Uint8Array, PlatformError> =>\n typeof input === \"string\"\n ? Stream.make(new TextEncoder().encode(input))\n : input instanceof Uint8Array\n ? Stream.make(input)\n : input\n\nexport const collectStream = (stream: Stream.Stream<Uint8Array, PlatformError>, maxOutputBytes: number | undefined) =>\n Stream.runFold(\n stream,\n () => ({ chunks: [] as Uint8Array[], bytes: 0, truncated: false }),\n (acc, chunk) => {\n if (maxOutputBytes === undefined) {\n acc.chunks.push(chunk)\n acc.bytes += chunk.length\n return acc\n }\n const remaining = maxOutputBytes - acc.bytes\n if (remaining > 0) acc.chunks.push(remaining >= chunk.length ? chunk : chunk.slice(0, remaining))\n acc.bytes += chunk.length\n acc.truncated = acc.truncated || acc.bytes > maxOutputBytes\n return acc\n },\n ).pipe(Effect.map((x) => ({ buffer: Buffer.concat(x.chunks), truncated: x.truncated })))\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n\n const runCommand = (command: ChildProcess.Command, options?: RunOptions) => {\n const description = describeCommand(command)\n const collect = Effect.scoped(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n if (options?.combineOutput) {\n const [output, exitCode] = yield* Effect.all(\n [collectStream(handle.all, options.maxOutputBytes), handle.exitCode],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n output: output.buffer,\n stdout: Buffer.alloc(0),\n stderr: Buffer.alloc(0),\n outputTruncated: output.truncated,\n stdoutTruncated: false,\n stderrTruncated: false,\n } satisfies RunResult\n }\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, options?.maxOutputBytes),\n collectStream(handle.stderr, options?.maxErrorBytes),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n stdout: stdout.buffer,\n stderr: stderr.buffer,\n stdoutTruncated: stdout.truncated,\n stderrTruncated: stderr.truncated,\n } satisfies RunResult\n }),\n )\n const timed = options?.timeout\n ? Effect.timeoutOrElse(collect, {\n duration: options.timeout,\n orElse: () => Effect.fail(new AppProcessError({ command: description, cause: new Error(\"Timed out\") })),\n })\n : collect\n const aborted = options?.signal\n ? timed.pipe(\n Effect.raceFirst(\n waitForAbort(options.signal).pipe(Effect.mapError((cause) => wrapError(description, cause))),\n ),\n )\n : timed\n return aborted.pipe(Effect.catch((cause) => Effect.fail(wrapError(description, cause))))\n }\n\n const run = Effect.fn(\"AppProcess.run\")(function* (command: ChildProcess.Command, options?: RunOptions) {\n if (options?.stdin === undefined) return yield* runCommand(command, options)\n if (command._tag !== \"StandardCommand\") {\n return yield* new AppProcessError({\n command: describeCommand(command),\n cause: new Error(\"stdin option only supports StandardCommand; received PipedCommand\"),\n })\n }\n const next = ChildProcess.make(command.command, command.args, {\n ...command.options,\n stdin: normalizeStdin(options.stdin),\n })\n return yield* runCommand(next, options)\n })\n\n const runStream = (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ): Stream.Stream<string, AppProcessError> => {\n const description = describeCommand(command)\n const okExitCodes = options?.okExitCodes\n const built: Stream.Stream<string, AppProcessError | PlatformError> = Stream.unwrap(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n const stderrFiber = yield* Effect.forkScoped(\n collectStream(handle.stderr, options?.maxErrorBytes).pipe(Effect.map((x) => x.buffer.toString(\"utf8\"))),\n )\n const source = options?.includeStderr === true ? handle.all : handle.stdout\n const lines = source.pipe(\n Stream.decodeText,\n Stream.splitLines,\n Stream.filter((line) => line.length > 0),\n )\n const tail = Stream.unwrap(\n Effect.gen(function* () {\n const code = yield* handle.exitCode\n if (okExitCodes && okExitCodes.length > 0 && !okExitCodes.includes(code)) {\n const stderr = yield* Fiber.join(stderrFiber)\n return Stream.fail(new AppProcessError({ command: description, exitCode: code, stderr }))\n }\n return Stream.empty\n }),\n )\n return Stream.concat(lines, tail) as Stream.Stream<string, AppProcessError | PlatformError>\n }),\n )\n const mapped = built.pipe(\n Stream.catch((cause): Stream.Stream<string, AppProcessError> => Stream.fail(wrapError(description, cause))),\n )\n if (!options?.signal) return mapped\n const signal = options.signal\n return mapped.pipe(\n Stream.interruptWhen(waitForAbort(signal).pipe(Effect.mapError((cause) => wrapError(description, cause)))),\n )\n }\n\n return Service.of({ ...spawner, run, runStream })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer: layer, deps: [CrossSpawnSpawner.node] })\n\nexport * as AppProcess from \"./process\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "626C5A390CEC905164756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/start.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,WAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "AD567623DCDCB62C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"], | ||
| "sourcesContent": [ | ||
| "// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n", | ||
| "import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";i4BAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,OAAK,yBAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "92AEAA819F9D70A664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/agents.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "EE66DDA3E02833BF64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/route/auth-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { Config, Redacted } from \"effect\"\nimport { Auth } from \"./auth\"\n\nexport type ApiKeyMode = \"optional\" | \"required\"\n\nexport type AuthOverride = {\n readonly auth: Auth.Definition\n readonly apiKey?: never\n}\n\nexport type OptionalApiKeyAuth = {\n readonly apiKey?: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type RequiredApiKeyAuth = {\n readonly apiKey: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type ProviderAuthOption<Mode extends ApiKeyMode> =\n | AuthOverride\n | (Mode extends \"optional\" ? OptionalApiKeyAuth : RequiredApiKeyAuth)\n\nexport type ModelOptions<Base, Mode extends ApiKeyMode> = Omit<Base, \"apiKey\" | \"auth\"> & ProviderAuthOption<Mode>\n\nexport type ModelArgs<Base, Mode extends ApiKeyMode> = Mode extends \"optional\"\n ? readonly [options?: ModelOptions<Base, Mode>]\n : readonly [options: ModelOptions<Base, Mode>]\n\nexport type ModelFactory<Base, Mode extends ApiKeyMode, Model> = (id: string, ...args: ModelArgs<Base, Mode>) => Model\n\n/**\n * Require at least one of the keys in `T`. Use for option shapes where any\n * subset of fields is acceptable but at least one must be present (e.g. Azure\n * accepts `resourceName` or `baseURL`).\n */\nexport type AtLeastOne<T> = {\n [K in keyof T]: Required<Pick<T, K>> & Partial<Omit<T, K>>\n}[keyof T]\n\n/**\n * Standard bearer-auth resolution for providers: honor an explicit `auth`\n * override, otherwise resolve `apiKey` (option > config var) and apply it as\n * a bearer token.\n */\nexport const bearer = (\n options: ProviderAuthOption<\"optional\">,\n envVar: string | ReadonlyArray<string>,\n): Auth.Definition => {\n if (\"auth\" in options && options.auth) return options.auth\n return (Array.isArray(envVar) ? envVar : [envVar])\n .reduce(\n (auth, name) => auth.orElse(Auth.config(name)),\n Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\"),\n )\n .bearer()\n}\n\nexport * as AuthOptions from \"./auth-options\"\n" | ||
| ], | ||
| "mappings": ";kJA8CO,SAAM,EAAS,CACpB,EACA,IACoB,CACpB,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAQ,MAAM,QAAQ,CAAM,EAAI,EAAS,CAAC,CAAM,GAC7C,OACC,CAAC,EAAM,IAAS,EAAK,OAAO,EAAK,OAAO,CAAI,CAAC,EAC7C,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,CAC1E,EACC,OAAO", | ||
| "debugId": "23399E331C5CFB9E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/stop.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,CACH", | ||
| "debugId": "5D5938320845FF7164756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/gemini.ts", "../ai/src/providers/google.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolContent,\n} from \"../schema\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared\"\nimport { GeminiToolSchema } from \"./utils/gemini-tool-schema\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\n\nconst ADAPTER = \"gemini\"\nconst MEDIA_MIMES = new Set<string>(ProviderShared.MEDIA_MIMES)\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst GeminiTextPart = Schema.Struct({\n text: Schema.String,\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiInlineDataPart = Schema.Struct({\n inlineData: Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n})\n\nconst GeminiFunctionCallPart = Schema.Struct({\n functionCall: Schema.Struct({\n name: Schema.String,\n args: Schema.Unknown,\n }),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiFunctionResponsePart = Schema.Struct({\n functionResponse: Schema.Struct({\n name: Schema.String,\n response: Schema.Unknown,\n }),\n})\n\nconst GeminiContentPart = Schema.Union([\n GeminiTextPart,\n GeminiInlineDataPart,\n GeminiFunctionCallPart,\n GeminiFunctionResponsePart,\n])\n\nconst GeminiContent = Schema.Struct({\n role: Schema.Literals([\"user\", \"model\"]),\n parts: Schema.Array(GeminiContentPart),\n})\ntype GeminiContent = Schema.Schema.Type<typeof GeminiContent>\n\nconst GeminiSystemInstruction = Schema.Struct({\n parts: Schema.Array(Schema.Struct({ text: Schema.String })),\n})\n\nconst GeminiFunctionDeclaration = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: Schema.optional(JsonObject),\n})\n\nconst GeminiTool = Schema.Struct({\n functionDeclarations: Schema.Array(GeminiFunctionDeclaration),\n})\n\nconst GeminiToolConfig = Schema.Struct({\n functionCallingConfig: Schema.Struct({\n mode: Schema.Literals([\"AUTO\", \"NONE\", \"ANY\"]),\n allowedFunctionNames: optionalArray(Schema.String),\n }),\n})\n\nconst GeminiThinkingConfig = Schema.Struct({\n thinkingBudget: Schema.optional(Schema.Number),\n includeThoughts: Schema.optional(Schema.Boolean),\n})\n\nconst GeminiGenerationConfig = Schema.Struct({\n maxOutputTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n topK: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n thinkingConfig: Schema.optional(GeminiThinkingConfig),\n})\n\nconst GeminiBodyFields = {\n contents: Schema.Array(GeminiContent),\n systemInstruction: Schema.optional(GeminiSystemInstruction),\n tools: optionalArray(GeminiTool),\n toolConfig: Schema.optional(GeminiToolConfig),\n generationConfig: Schema.optional(GeminiGenerationConfig),\n}\nconst GeminiBody = Schema.Struct(GeminiBodyFields)\nexport type GeminiBody = Schema.Schema.Type<typeof GeminiBody>\n\nconst GeminiUsage = Schema.Struct({\n cachedContentTokenCount: Schema.optional(Schema.Number),\n thoughtsTokenCount: Schema.optional(Schema.Number),\n promptTokenCount: Schema.optional(Schema.Number),\n candidatesTokenCount: Schema.optional(Schema.Number),\n totalTokenCount: Schema.optional(Schema.Number),\n})\ntype GeminiUsage = Schema.Schema.Type<typeof GeminiUsage>\n\nconst GeminiCandidate = Schema.Struct({\n content: Schema.optional(GeminiContent),\n finishReason: Schema.optional(Schema.String),\n})\n\nconst GeminiEvent = Schema.Struct({\n candidates: optionalArray(GeminiCandidate),\n usageMetadata: Schema.optional(GeminiUsage),\n})\ntype GeminiEvent = Schema.Schema.Type<typeof GeminiEvent>\n\ninterface ParserState {\n readonly finishReason?: string\n readonly hasToolCalls: boolean\n readonly nextToolCallId: number\n readonly usage?: Usage\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignature?: string\n}\n\n// =============================================================================\n// Tool Schema Conversion\n// =============================================================================\n// Tool-schema conversion has two distinct concerns:\n//\n// 1. Sanitize — fix common authoring mistakes Gemini rejects: integer/number\n// enums (must be strings), `required` entries that don't match a property,\n// untyped arrays (`items` must be present), and `properties`/`required`\n// keys on non-object scalars. Mirrors OpenCode's historical Gemini rules.\n//\n// 2. Project — lossy mapping from JSON Schema to Gemini's schema dialect:\n// drop empty objects, derive `nullable: true` from `type: [..., \"null\"]`,\n// coerce `const` to `[const]` enum, recurse properties/items, propagate\n// only an allowlisted set of keys (description, required, format, type,\n// properties, items, allOf, anyOf, oneOf, minLength). Anything outside the\n// allowlist (e.g. `additionalProperties`, `$ref`) is silently dropped.\n//\n// Sanitize runs first, then project. The implementation lives in\n// `utils/gemini-tool-schema` so this protocol keeps the same shape as the other\n// provider protocols.\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema) => ({\n name: tool.name,\n description: tool.description,\n parameters: GeminiToolSchema.convert(inputSchema),\n})\n\nconst lowerToolConfig = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Gemini\", toolChoice, {\n auto: () => ({ functionCallingConfig: { mode: \"AUTO\" as const } }),\n none: () => ({ functionCallingConfig: { mode: \"NONE\" as const } }),\n required: () => ({ functionCallingConfig: { mode: \"ANY\" as const } }),\n tool: (name) => ({ functionCallingConfig: { mode: \"ANY\" as const, allowedFunctionNames: [name] } }),\n })\n\nconst lowerUserPart = Effect.fn(\"Gemini.lowerUserPart\")(function* (part: TextPart | MediaPart) {\n if (part.type === \"text\") return { text: part.text }\n const media = yield* ProviderShared.validateMedia(\"Gemini\", part, MEDIA_MIMES)\n return { inlineData: { mimeType: media.mime, data: media.base64 } }\n})\n\nconst googleMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ google: metadata })\n\nconst thoughtSignature = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.thoughtSignature === \"string\"\n ? google.thoughtSignature\n : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart) => ({\n functionCall: { name: part.name, args: part.input },\n thoughtSignature: thoughtSignature(part.providerMetadata),\n})\n\nconst lowerMessages = Effect.fn(\"Gemini.lowerMessages\")(function* (request: LLMRequest) {\n const contents: GeminiContent[] = []\n\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Gemini\", message)\n const previous = contents.at(-1)\n if (previous?.role === \"user\")\n contents[contents.length - 1] = { role: \"user\", parts: [...previous.parts, { text: part.text }] }\n else contents.push({ role: \"user\", parts: [{ text: part.text }] })\n continue\n }\n\n if (message.role === \"user\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"user\", [\"text\", \"media\"])\n parts.push(yield* lowerUserPart(part))\n }\n contents.push({ role: \"user\", parts })\n continue\n }\n\n if (message.role === \"assistant\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n parts.push({ text: part.text })\n continue\n }\n if (part.type === \"reasoning\") {\n parts.push({ text: part.text, thought: true, thoughtSignature: thoughtSignature(part.providerMetadata) })\n continue\n }\n if (part.type === \"tool-call\") {\n parts.push(lowerToolCall(part))\n continue\n }\n }\n contents.push({ role: \"model\", parts })\n continue\n }\n\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n parts.push({\n functionResponse: {\n name: part.name,\n response: {\n name: part.name,\n content: ProviderShared.toolResultText(part),\n },\n },\n })\n continue\n }\n const content: ReadonlyArray<ToolContent> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n parts.push({\n functionResponse: {\n name: part.name,\n response: {\n name: part.name,\n content: text.join(\"\\n\"),\n },\n },\n })\n for (const item of content) {\n if (item.type === \"text\") continue\n const media = yield* ProviderShared.validateToolFile(\"Gemini\", item, MEDIA_MIMES)\n parts.push({ inlineData: { mimeType: media.mime, data: media.base64 } })\n }\n }\n contents.push({ role: \"user\", parts })\n }\n\n return contents\n})\n\nconst geminiOptions = (request: LLMRequest) => request.providerOptions?.gemini\n\nconst thinkingConfig = (request: LLMRequest) => {\n const value = geminiOptions(request)?.thinkingConfig\n if (!ProviderShared.isRecord(value)) return undefined\n const result = {\n thinkingBudget: typeof value.thinkingBudget === \"number\" ? value.thinkingBudget : undefined,\n includeThoughts: typeof value.includeThoughts === \"boolean\" ? value.includeThoughts : undefined,\n }\n return Object.values(result).some((item) => item !== undefined) ? result : undefined\n}\n\nconst fromRequest = Effect.fn(\"Gemini.fromRequest\")(function* (request: LLMRequest) {\n const toolsEnabled = request.tools.length > 0 && request.toolChoice?.type !== \"none\"\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const generationConfig = {\n maxOutputTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n topK: generation?.topK,\n stopSequences: generation?.stop,\n thinkingConfig: thinkingConfig(request),\n }\n\n return {\n contents: yield* lowerMessages(request),\n systemInstruction:\n request.system.length === 0 ? undefined : { parts: [{ text: ProviderShared.joinText(request.system) }] },\n tools: toolsEnabled\n ? [\n {\n functionDeclarations: request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n },\n ]\n : undefined,\n toolConfig: toolsEnabled && request.toolChoice ? yield* lowerToolConfig(request.toolChoice) : undefined,\n generationConfig: Object.values(generationConfig).some((value) => value !== undefined)\n ? generationConfig\n : undefined,\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Gemini reports `promptTokenCount` (inclusive total) with a\n// `cachedContentTokenCount` subset. `candidatesTokenCount` is *exclusive*\n// of `thoughtsTokenCount` — visible-only, not a total — so we sum the two\n// to produce the inclusive `outputTokens` the rest of the contract expects.\nconst mapUsage = (usage: GeminiUsage | undefined) => {\n if (!usage) return undefined\n const cached = usage.cachedContentTokenCount\n const nonCached = ProviderShared.subtractTokens(usage.promptTokenCount, cached)\n // `candidatesTokenCount` is visible-only; sum with thoughts to produce the\n // inclusive `outputTokens` the contract expects. Only compute the total\n // when the visible component is reported — otherwise we'd fabricate an\n // inclusive number from a partial breakdown.\n const outputTokens =\n usage.candidatesTokenCount !== undefined ? usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0) : undefined\n return new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n })\n}\n\nconst mapFinishReason = (finishReason: string | undefined, hasToolCalls: boolean): FinishReason => {\n if (finishReason === \"STOP\") return hasToolCalls ? \"tool-calls\" : \"stop\"\n if (finishReason === \"MAX_TOKENS\") return \"length\"\n if (\n finishReason === \"IMAGE_SAFETY\" ||\n finishReason === \"RECITATION\" ||\n finishReason === \"SAFETY\" ||\n finishReason === \"BLOCKLIST\" ||\n finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\"\n )\n return \"content-filter\"\n if (finishReason === \"MALFORMED_FUNCTION_CALL\") return \"error\"\n return \"unknown\"\n}\n\nconst finish = (state: ParserState): ReadonlyArray<LLMEvent> =>\n state.finishReason || state.usage\n ? (() => {\n const events: LLMEvent[] = []\n const lifecycle = state.reasoningSignature\n ? Lifecycle.reasoningEnd(\n state.lifecycle,\n events,\n \"reasoning-0\",\n googleMetadata({ thoughtSignature: state.reasoningSignature }),\n )\n : state.lifecycle\n Lifecycle.finish(lifecycle, events, {\n reason: mapFinishReason(state.finishReason, state.hasToolCalls),\n usage: state.usage,\n })\n return events\n })()\n : []\n\nconst step = (state: ParserState, event: GeminiEvent) => {\n const nextState = {\n ...state,\n usage: event.usageMetadata ? (mapUsage(event.usageMetadata) ?? state.usage) : state.usage,\n }\n const candidate = event.candidates?.[0]\n if (!candidate?.content)\n return Effect.succeed([\n { ...nextState, finishReason: candidate?.finishReason ?? nextState.finishReason },\n [],\n ] as const)\n\n const events: LLMEvent[] = []\n let hasToolCalls = nextState.hasToolCalls\n let lifecycle = nextState.lifecycle\n let nextToolCallId = nextState.nextToolCallId\n let reasoningSignature = nextState.reasoningSignature\n\n for (const part of candidate.content.parts) {\n if (\"thoughtSignature\" in part && part.thoughtSignature && \"thought\" in part && part.thought)\n reasoningSignature = part.thoughtSignature\n if (\"text\" in part && part.text.length > 0) {\n if (part.thought) {\n lifecycle = Lifecycle.reasoningDelta(\n lifecycle,\n events,\n \"reasoning-0\",\n part.text,\n part.thoughtSignature ? googleMetadata({ thoughtSignature: part.thoughtSignature }) : undefined,\n )\n continue\n }\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", part.text)\n continue\n }\n\n if (\"functionCall\" in part) {\n const input = part.functionCall.args\n const id = `tool_${nextToolCallId++}`\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(\n LLMEvent.toolCall({\n id,\n name: part.functionCall.name,\n input,\n providerMetadata: part.thoughtSignature\n ? googleMetadata({ thoughtSignature: part.thoughtSignature })\n : undefined,\n }),\n )\n hasToolCalls = true\n }\n }\n\n return Effect.succeed([\n {\n ...nextState,\n hasToolCalls,\n lifecycle,\n nextToolCallId,\n reasoningSignature,\n finishReason: candidate.finishReason ?? nextState.finishReason,\n },\n events,\n ] as const)\n}\n\n// =============================================================================\n// Protocol And Gemini Route\n// =============================================================================\n/**\n * The Gemini protocol — request body construction, body schema, and the\n * streaming-event state machine. Used by Google AI Studio Gemini and (once\n * registered) Vertex Gemini.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: GeminiBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(GeminiEvent),\n initial: () => ({ hasToolCalls: false, nextToolCallId: 0, lifecycle: Lifecycle.initial() }),\n step,\n onHalt: finish,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"google\",\n providerMetadataKey: \"google\",\n protocol,\n // Gemini's path embeds the model id and pins SSE framing at the URL level.\n endpoint: Endpoint.path(({ request }) => `/models/${request.model.id}:streamGenerateContent?alt=sse`, {\n baseURL: DEFAULT_BASE_URL,\n }),\n auth: Auth.none,\n framing: Framing.sse,\n})\n\nexport * as Gemini from \"./gemini\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID, type ProviderOptions } from \"../schema\"\nimport * as Gemini from \"../protocols/gemini\"\n\nexport const id = ProviderID.make(\"google\")\n\nexport const routes = [Gemini.route]\n\nexport type Config = RouteDefaultsInput & ProviderAuthOption<\"optional\"> & { readonly baseURL?: string }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: ProviderOptions\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"GOOGLE_GENERATIVE_AI_API_KEY\"))\n .pipe(Auth.header(\"x-goog-api-key\"))\n}\n\nconst configuredRoute = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return Gemini.route.with({ ...rest, endpoint: { baseURL }, auth: auth(input) })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C8E1B08CE6B6397664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts", "src/util/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function defaultPort(channel = InstallationChannel) {\n if (channel === \"latest\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n return {\n file,\n version: InstallationVersion,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n", | ||
| "import path from \"node:path\"\n\nexport function selfCommand() {\n const runtime = path.basename(process.execPath, path.extname(process.execPath)).toLowerCase()\n if (runtime !== \"bun\" && runtime !== \"node\" && runtime !== \"nodejs\") return [process.execPath]\n if (!process.argv[1]) throw new Error(\"Failed to resolve CLI entrypoint\")\n if (runtime === \"node\" || runtime === \"nodejs\") return [process.execPath, ...nodeFlags(), process.argv[1]]\n return [process.execPath, process.argv[1]]\n}\n\nfunction nodeFlags() {\n return process.execArgv.flatMap((arg, index, args) => {\n if (index > 0 && args[index - 1] === \"--conditions\") return []\n if (arg === \"--conditions\") return args[index + 1] ? [arg, args[index + 1]] : []\n if (arg.startsWith(\"--conditions=\")) return [arg]\n if (\n arg === \"--experimental-ffi\" ||\n arg === \"--use-system-ca\" ||\n arg === \"--enable-source-maps\" ||\n arg === \"--no-addons\"\n )\n return [arg]\n if (arg === \"--no-warnings\" || arg.startsWith(\"--disable-warning=\")) return [arg]\n return []\n })\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E754D4C3DC5C8CD264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "954D0B48E5B5B12A64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/openai-options.ts", "../ai/src/protocols/openai-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\nimport type { LLMRequest, TextVerbosity as TextVerbosityValue } from \"../../schema\"\nimport { ReasoningEfforts, TextVerbosity } from \"../../schema\"\n\nexport const OpenAIReasoningEfforts = ReasoningEfforts\nexport type OpenAIReasoningEffort = string\n\n// Mirrors OpenAI's `ResponseIncludable` union from the official SDK. Keep this\n// in lockstep with `openai-node/src/resources/responses/responses.ts`.\nexport const OpenAIResponseIncludables = [\n \"file_search_call.results\",\n \"web_search_call.results\",\n \"web_search_call.action.sources\",\n \"message.input_image.image_url\",\n \"computer_call_output.output.image_url\",\n \"code_interpreter_call.outputs\",\n \"reasoning.encrypted_content\",\n \"message.output_text.logprobs\",\n] as const\nexport type OpenAIResponseIncludable = (typeof OpenAIResponseIncludables)[number]\nexport const OpenAIServiceTiers = [\"auto\", \"default\", \"flex\", \"priority\"] as const\nexport type OpenAIServiceTier = (typeof OpenAIServiceTiers)[number]\n\nconst TEXT_VERBOSITY = new Set<string>([\"low\", \"medium\", \"high\"])\nconst INCLUDABLES = new Set<string>(OpenAIResponseIncludables)\nconst SERVICE_TIERS = new Set<string>(OpenAIServiceTiers)\n\nexport const OpenAIReasoningEffort = Schema.String\nexport const OpenAITextVerbosity = TextVerbosity\nexport const OpenAIResponseIncludable = Schema.Literals(OpenAIResponseIncludables)\nexport const OpenAIServiceTier = Schema.Literals(OpenAIServiceTiers)\n\nexport const isReasoningEffort = (effort: unknown): effort is OpenAIReasoningEffort => typeof effort === \"string\"\n\nconst isTextVerbosity = (value: unknown): value is TextVerbosityValue =>\n typeof value === \"string\" && TEXT_VERBOSITY.has(value)\n\nconst options = (request: LLMRequest) => request.providerOptions?.openai\n\nexport const store = (request: LLMRequest): boolean | undefined => {\n const value = options(request)?.store\n return typeof value === \"boolean\" ? value : undefined\n}\n\nexport const reasoningEffort = (request: LLMRequest): string | undefined => {\n const value = options(request)?.reasoningEffort\n return typeof value === \"string\" ? value : undefined\n}\n\nexport const reasoningSummary = (request: LLMRequest): \"auto\" | undefined =>\n options(request)?.reasoningSummary === \"auto\" ? \"auto\" : undefined\n\n// Resolve the OpenAI Responses `include` field. Filters out unknown\n// includable values defensively so a typo in upstream config drops the\n// invalid entry instead of poisoning the wire body. An empty array (either\n// passed directly or produced by filtering) is treated as \"no include\" and\n// returns undefined so the request body omits the field entirely.\nexport const include = (request: LLMRequest): ReadonlyArray<OpenAIResponseIncludable> | undefined => {\n const value = options(request)?.include\n if (!Array.isArray(value)) return undefined\n const filtered = value.filter((entry): entry is OpenAIResponseIncludable => INCLUDABLES.has(entry))\n return filtered.length > 0 ? filtered : undefined\n}\n\nexport const promptCacheKey = (request: LLMRequest) => {\n const value = options(request)?.promptCacheKey\n return typeof value === \"string\" ? value : undefined\n}\n\nexport const textVerbosity = (request: LLMRequest) => {\n const value = options(request)?.textVerbosity\n return isTextVerbosity(value) ? value : undefined\n}\n\nexport const serviceTier = (request: LLMRequest) => {\n const value = options(request)?.serviceTier\n return typeof value === \"string\" && SERVICE_TIERS.has(value) ? (value as OpenAIServiceTier) : undefined\n}\n\nexport const instructions = (request: LLMRequest) => {\n const value = options(request)?.instructions\n return typeof value === \"string\" ? value : undefined\n}\n\nexport * as OpenAIOptions from \"./openai-options\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { HttpTransport } from \"../route/transport\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ReasoningPart,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolContent,\n} from \"../schema\"\nimport { isRecord, JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared\"\nimport { OpenAIOptions } from \"./utils/openai-options\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\nimport { ToolStream } from \"./utils/tool-stream\"\n\nconst ADAPTER = \"openai-chat\"\nconst IMAGE_MIMES = new Set<string>(ProviderShared.IMAGE_MIMES)\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/chat/completions\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\n// The body schema is the provider-native JSON body. `fromRequest` below builds\n// this shape from the common `LLMRequest`, then `Route.make` validates and\n// JSON-encodes it before transport.\nconst OpenAIChatFunction = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: JsonObject,\n})\n\nconst OpenAIChatTool = Schema.Struct({\n type: Schema.tag(\"function\"),\n function: OpenAIChatFunction,\n})\ntype OpenAIChatTool = Schema.Schema.Type<typeof OpenAIChatTool>\n\nconst OpenAIChatAssistantToolCall = Schema.Struct({\n id: Schema.String,\n type: Schema.tag(\"function\"),\n function: Schema.Struct({\n name: Schema.String,\n arguments: Schema.String,\n }),\n})\ntype OpenAIChatAssistantToolCall = Schema.Schema.Type<typeof OpenAIChatAssistantToolCall>\n\nconst OpenAIChatUserContent = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"text\"), text: Schema.String }),\n Schema.Struct({\n type: Schema.Literal(\"image_url\"),\n image_url: Schema.Struct({ url: Schema.String }),\n }),\n])\n\nconst OpenAIChatMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"system\"), content: Schema.String }),\n Schema.Struct({\n role: Schema.Literal(\"user\"),\n content: Schema.Union([Schema.String, Schema.Array(OpenAIChatUserContent)]),\n }),\n Schema.Struct({\n role: Schema.Literal(\"assistant\"),\n content: Schema.NullOr(Schema.String),\n tool_calls: optionalArray(OpenAIChatAssistantToolCall),\n reasoning_content: Schema.optional(Schema.String),\n reasoning: Schema.optional(Schema.String),\n reasoning_text: Schema.optional(Schema.String),\n }),\n Schema.Struct({ role: Schema.Literal(\"tool\"), tool_call_id: Schema.String, content: Schema.String }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype OpenAIChatMessage = Schema.Schema.Type<typeof OpenAIChatMessage>\n\nconst OpenAIChatToolChoice = Schema.Union([\n Schema.Literals([\"auto\", \"none\", \"required\"]),\n Schema.Struct({\n type: Schema.tag(\"function\"),\n function: Schema.Struct({ name: Schema.String }),\n }),\n])\n\nexport const bodyFields = {\n model: Schema.String,\n messages: Schema.Array(OpenAIChatMessage),\n tools: optionalArray(OpenAIChatTool),\n tool_choice: Schema.optional(OpenAIChatToolChoice),\n stream: Schema.Literal(true),\n stream_options: Schema.optional(Schema.Struct({ include_usage: Schema.Boolean })),\n store: Schema.optional(Schema.Boolean),\n reasoning_effort: Schema.optional(OpenAIOptions.OpenAIReasoningEffort),\n max_tokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n frequency_penalty: Schema.optional(Schema.Number),\n presence_penalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stop: optionalArray(Schema.String),\n}\nconst OpenAIChatBody = Schema.Struct(bodyFields)\nexport type OpenAIChatBody = Schema.Schema.Type<typeof OpenAIChatBody>\n\n// =============================================================================\n// Streaming Event Schema\n// =============================================================================\n// The event schema is one decoded SSE `data:` payload. `Framing.sse` splits the\n// byte stream into strings, then `Protocol.jsonEvent` decodes each string into\n// this provider-native event shape.\nconst OpenAIChatUsage = Schema.Struct({\n prompt_tokens: Schema.optional(Schema.Number),\n completion_tokens: Schema.optional(Schema.Number),\n total_tokens: Schema.optional(Schema.Number),\n prompt_tokens_details: optionalNull(\n Schema.Struct({\n cached_tokens: Schema.optional(Schema.Number),\n }),\n ),\n completion_tokens_details: optionalNull(\n Schema.Struct({\n reasoning_tokens: Schema.optional(Schema.Number),\n }),\n ),\n})\n\nconst OpenAIChatToolCallDeltaFunction = Schema.Struct({\n name: optionalNull(Schema.String),\n arguments: optionalNull(Schema.String),\n})\n\nconst OpenAIChatToolCallDelta = Schema.Struct({\n index: Schema.Number,\n id: optionalNull(Schema.String),\n function: optionalNull(OpenAIChatToolCallDeltaFunction),\n})\ntype OpenAIChatToolCallDelta = Schema.Schema.Type<typeof OpenAIChatToolCallDelta>\n\nconst OpenAIChatDelta = Schema.Struct({\n content: optionalNull(Schema.String),\n reasoning_content: optionalNull(Schema.String),\n reasoning: optionalNull(Schema.String),\n reasoning_text: optionalNull(Schema.String),\n tool_calls: optionalNull(Schema.Array(OpenAIChatToolCallDelta)),\n})\n\nconst OpenAIChatChoice = Schema.Struct({\n delta: optionalNull(OpenAIChatDelta),\n finish_reason: optionalNull(Schema.String),\n})\n\nexport const OpenAIChatEvent = Schema.Struct({\n choices: Schema.Array(OpenAIChatChoice),\n usage: optionalNull(OpenAIChatUsage),\n})\nexport type OpenAIChatEvent = Schema.Schema.Type<typeof OpenAIChatEvent>\ntype OpenAIChatRequestMessage = LLMRequest[\"messages\"][number]\n\ninterface PendingToolDelta {\n readonly id?: string\n readonly name?: string\n readonly input: string\n}\n\nexport interface ParserState {\n readonly tools: ToolStream.State<number>\n readonly pendingTools: Partial<Record<number, PendingToolDelta>>\n readonly toolCallEvents: ReadonlyArray<LLMEvent>\n readonly usage?: Usage\n readonly finishReason?: FinishReason\n readonly lifecycle: Lifecycle.State\n readonly reasoningField?: \"reasoning\" | \"reasoning_content\" | \"reasoning_text\"\n}\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Lowering is the only place that knows how common LLM messages map onto the\n// OpenAI Chat wire format. Keep provider quirks here instead of leaking native\n// fields into `LLMRequest`.\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema): OpenAIChatTool => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: ToolSchemaProjection.openAI(inputSchema),\n },\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"OpenAI Chat\", toolChoice, {\n auto: () => \"auto\" as const,\n none: () => \"none\" as const,\n required: () => \"required\" as const,\n tool: (name) => ({ type: \"function\" as const, function: { name } }),\n })\n\nconst lowerToolCall = (part: ToolCallPart): OpenAIChatAssistantToolCall => ({\n id: part.id,\n type: \"function\",\n function: {\n name: part.name,\n arguments: ProviderShared.encodeJson(part.input),\n },\n})\n\nconst lowerMedia = Effect.fn(\"OpenAIChat.lowerMedia\")(function* (part: MediaPart) {\n const media = yield* ProviderShared.validateMedia(\"OpenAI Chat\", part, IMAGE_MIMES)\n return { type: \"image_url\" as const, image_url: { url: media.dataUrl } }\n})\n\nconst openAICompatibleReasoningContent = (native: unknown) =>\n isRecord(native) && typeof native.reasoning_content === \"string\" ? native.reasoning_content : undefined\n\nconst reasoningField = (part: ReasoningPart) => {\n const field = part.providerMetadata?.openai?.reasoningField\n if (field === \"reasoning\" || field === \"reasoning_content\" || field === \"reasoning_text\") return field\n return \"reasoning_content\"\n}\n\nconst lowerUserMessage = Effect.fn(\"OpenAIChat.lowerUserMessage\")(function* (message: OpenAIChatRequestMessage) {\n const content: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerMedia(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"user\", [\"text\", \"media\"])\n }\n if (content.every((part) => part.type === \"text\"))\n return { role: \"user\" as const, content: content.map((part) => part.text).join(\"\") }\n return { role: \"user\" as const, content }\n})\n\nconst lowerAssistantMessage = Effect.fn(\"OpenAIChat.lowerAssistantMessage\")(function* (\n message: OpenAIChatRequestMessage,\n) {\n const content: TextPart[] = []\n const reasoning: ReasoningPart[] = []\n const toolCalls: OpenAIChatAssistantToolCall[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n content.push(part)\n continue\n }\n if (part.type === \"reasoning\") {\n reasoning.push(part)\n continue\n }\n if (part.type === \"tool-call\") {\n toolCalls.push(lowerToolCall(part))\n continue\n }\n }\n const text = reasoning.map((part) => part.text).join(\"\")\n const field = reasoning[0] ? reasoningField(reasoning[0]) : \"reasoning_content\"\n return {\n role: \"assistant\" as const,\n content: content.length === 0 ? null : ProviderShared.joinText(content),\n tool_calls: toolCalls.length === 0 ? undefined : toolCalls,\n reasoning_content:\n reasoning.length === 0\n ? openAICompatibleReasoningContent(message.native?.openaiCompatible)\n : field === \"reasoning_content\"\n ? text\n : undefined,\n reasoning: reasoning.length > 0 && field === \"reasoning\" ? text : undefined,\n reasoning_text: reasoning.length > 0 && field === \"reasoning_text\" ? text : undefined,\n }\n})\n\nconst lowerToolMessages = Effect.fn(\"OpenAIChat.lowerToolMessages\")(function* (message: OpenAIChatRequestMessage) {\n const messages: OpenAIChatMessage[] = []\n const images: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n messages.push({ role: \"tool\", tool_call_id: part.id, content: ProviderShared.toolResultText(part) })\n continue\n }\n const content: ReadonlyArray<ToolContent> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n messages.push({ role: \"tool\", tool_call_id: part.id, content: text.join(\"\\n\") })\n const files = content.filter((item) => item.type === \"file\")\n images.push(\n ...(yield* Effect.forEach(files, (item) =>\n lowerMedia({ type: \"media\", mediaType: item.mime, data: item.uri, filename: item.name }),\n )),\n )\n }\n return { messages, images }\n})\n\nconst lowerMessage = Effect.fn(\"OpenAIChat.lowerMessage\")(function* (message: OpenAIChatRequestMessage) {\n if (message.role === \"user\") return [yield* lowerUserMessage(message)]\n if (message.role === \"assistant\") return [yield* lowerAssistantMessage(message)]\n return (yield* lowerToolMessages(message)).messages\n})\n\nconst lowerMessages = Effect.fn(\"OpenAIChat.lowerMessages\")(function* (request: LLMRequest) {\n const system: OpenAIChatMessage[] =\n request.system.length === 0 ? [] : [{ role: \"system\", content: ProviderShared.joinText(request.system) }]\n const messages = [...system]\n const pendingImages: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n const flushImages = () => {\n if (pendingImages.length === 0) return\n messages.push({ role: \"user\", content: pendingImages.splice(0) })\n }\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"OpenAI Chat\", message)\n if (pendingImages.length > 0) {\n messages.push({ role: \"user\", content: [...pendingImages.splice(0), { type: \"text\", text: part.text }] })\n continue\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\" && typeof previous.content === \"string\")\n messages[messages.length - 1] = { role: \"user\", content: `${previous.content}\\n${part.text}` }\n else if (previous?.role === \"user\" && Array.isArray(previous.content))\n messages[messages.length - 1] = {\n role: \"user\",\n content: [...previous.content, { type: \"text\", text: part.text }],\n }\n else messages.push({ role: \"user\", content: part.text })\n continue\n }\n if (message.role === \"tool\") {\n const lowered = yield* lowerToolMessages(message)\n messages.push(...lowered.messages)\n pendingImages.push(...lowered.images)\n continue\n }\n flushImages()\n messages.push(...(yield* lowerMessage(message)))\n }\n flushImages()\n return messages\n})\n\nconst lowerOptions = Effect.fn(\"OpenAIChat.lowerOptions\")(function* (request: LLMRequest) {\n const store = OpenAIOptions.store(request)\n const reasoningEffort = OpenAIOptions.reasoningEffort(request)\n return {\n ...(store !== undefined ? { store } : {}),\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n }\n})\n\nconst fromRequest = Effect.fn(\"OpenAIChat.fromRequest\")(function* (request: LLMRequest) {\n // `fromRequest` returns the provider body only. Endpoint, auth, framing,\n // validation, and HTTP execution are composed by `Route.make`.\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n return {\n model: request.model.id,\n messages: yield* lowerMessages(request),\n tools:\n request.tools.length === 0\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n tool_choice: request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined,\n stream: true as const,\n stream_options: { include_usage: true },\n max_tokens: generation?.maxTokens,\n temperature: generation?.temperature,\n top_p: generation?.topP,\n frequency_penalty: generation?.frequencyPenalty,\n presence_penalty: generation?.presencePenalty,\n seed: generation?.seed,\n stop: generation?.stop,\n ...(yield* lowerOptions(request)),\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Streaming parsers are small state machines: every event returns a new state\n// plus the common `LLMEvent`s produced by that event. Tool calls are accumulated\n// because OpenAI streams JSON arguments across multiple deltas.\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"stop\") return \"stop\"\n if (reason === \"length\") return \"length\"\n if (reason === \"content_filter\") return \"content-filter\"\n if (reason === \"function_call\" || reason === \"tool_calls\") return \"tool-calls\"\n return \"unknown\"\n}\n\n// OpenAI Chat reports `prompt_tokens` (inclusive total) with a\n// `cached_tokens` subset, and `completion_tokens` (inclusive total) with\n// a `reasoning_tokens` subset. We pass the inclusive totals through and\n// derive the non-cached breakdown so the `LLM.Usage` contract is\n// satisfied on both sides.\nconst mapUsage = (usage: OpenAIChatEvent[\"usage\"]): Usage | undefined => {\n if (!usage) return undefined\n const cached = usage.prompt_tokens_details?.cached_tokens\n const reasoning = usage.completion_tokens_details?.reasoning_tokens\n const nonCached = ProviderShared.subtractTokens(usage.prompt_tokens, cached)\n return new Usage({\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n reasoningTokens: reasoning,\n totalTokens: ProviderShared.totalTokens(usage.prompt_tokens, usage.completion_tokens, usage.total_tokens),\n providerMetadata: { openai: usage },\n })\n}\n\nconst reasoningDelta = (delta: Schema.Schema.Type<typeof OpenAIChatDelta> | null | undefined) => {\n if (delta?.reasoning_content) return { field: \"reasoning_content\", text: delta.reasoning_content } as const\n if (delta?.reasoning) return { field: \"reasoning\", text: delta.reasoning } as const\n if (delta?.reasoning_text) return { field: \"reasoning_text\", text: delta.reasoning_text } as const\n}\n\nconst step = (state: ParserState, event: OpenAIChatEvent) =>\n Effect.gen(function* () {\n const events: LLMEvent[] = []\n const usage = mapUsage(event.usage) ?? state.usage\n const choice = event.choices[0]\n const finishReason = choice?.finish_reason ? mapFinishReason(choice.finish_reason) : state.finishReason\n const delta = choice?.delta\n const toolDeltas = delta?.tool_calls ?? []\n let tools = state.tools\n let pendingTools = state.pendingTools\n\n let lifecycle = state.lifecycle\n\n const reasoning = reasoningDelta(delta)\n const reasoningField = state.reasoningField ?? reasoning?.field\n if (reasoning)\n lifecycle = Lifecycle.reasoningDelta(lifecycle, events, \"reasoning-0\", reasoning.text, {\n openai: { reasoningField: reasoningField ?? reasoning.field },\n })\n\n if (delta?.content) {\n lifecycle = Lifecycle.reasoningEnd(lifecycle, events, \"reasoning-0\")\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.content)\n }\n\n if (toolDeltas.length) lifecycle = Lifecycle.reasoningEnd(lifecycle, events, \"reasoning-0\")\n\n for (const tool of toolDeltas) {\n const current = tools[tool.index]\n const pending = pendingTools[tool.index]\n const id = current?.id ?? pending?.id ?? (tool.id || undefined)\n const name = current?.name ?? pending?.name ?? (tool.function?.name || undefined)\n const text = `${pending?.input ?? \"\"}${tool.function?.arguments ?? \"\"}`\n if (!current && (!id || !name)) {\n pendingTools = { ...pendingTools, [tool.index]: { id: id || undefined, name: name || undefined, input: text } }\n continue\n }\n if (pending) {\n pendingTools = { ...pendingTools }\n delete pendingTools[tool.index]\n }\n const result = ToolStream.appendOrStart(\n ADAPTER,\n tools,\n tool.index,\n { id: id || undefined, name: name || undefined, text },\n \"OpenAI Chat tool call delta is missing id or name\",\n )\n if (ToolStream.isError(result)) return yield* result\n tools = result.tools\n if (result.events.length) lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(...result.events)\n }\n\n if (finishReason !== undefined && state.finishReason === undefined && Object.keys(pendingTools).length > 0)\n return yield* ProviderShared.eventError(ADAPTER, \"OpenAI Chat tool call delta is missing id or name\")\n\n // Finalize accumulated tool inputs eagerly when finish_reason arrives so\n // valid calls and malformed local calls settle independently.\n const finished =\n finishReason !== undefined && state.finishReason === undefined && Object.keys(tools).length > 0\n ? yield* ToolStream.finishAll(ADAPTER, tools)\n : undefined\n\n return [\n {\n tools: finished?.tools ?? tools,\n pendingTools,\n toolCallEvents: finished?.events ?? state.toolCallEvents,\n usage,\n finishReason,\n lifecycle,\n reasoningField,\n },\n events,\n ] as const\n })\n\nconst finishEvents = (state: ParserState): ReadonlyArray<LLMEvent> => {\n const events: LLMEvent[] = []\n const hasToolCalls = state.toolCallEvents.length > 0\n const reason = state.finishReason === \"stop\" && hasToolCalls ? \"tool-calls\" : state.finishReason\n const lifecycle = state.toolCallEvents.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...state.toolCallEvents)\n if (reason) Lifecycle.finish(lifecycle, events, { reason, usage: state.usage })\n return events\n}\n\n// =============================================================================\n// Protocol And OpenAI Route\n// =============================================================================\n/**\n * The OpenAI Chat protocol — request body construction, body schema, and the\n * streaming-event state machine. Reused by every route that speaks OpenAI Chat\n * over HTTP+SSE: native OpenAI, DeepSeek, TogetherAI, Cerebras, Baseten,\n * Fireworks, DeepInfra, and (once added) Azure OpenAI Chat.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: OpenAIChatBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(OpenAIChatEvent),\n initial: () => ({\n tools: ToolStream.empty<number>(),\n pendingTools: {},\n toolCallEvents: [],\n lifecycle: Lifecycle.initial(),\n reasoningField: undefined,\n }),\n step,\n onHalt: finishEvents,\n },\n})\n\nexport const httpTransport = HttpTransport.sseJson.with<OpenAIChatBody>()\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"openai\",\n providerMetadataKey: \"openai\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n transport: httpTransport,\n})\n\nexport * as OpenAIChat from \"./openai-chat\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "840B22F42CDF2E5C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/status.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "C2DAED3B09D4DC8964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";o2BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,EAChD,CACH", | ||
| "debugId": "12347842F8C14FBB64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,OAAO,CAC9C,QAAQ,OAAO,MAAM,gBAAkB,EAAM,CAAG,EAChD,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC1F,MAAO,EAAQ,IAAM,EAAO,YAAY,UAAU,IAAI,CAAE,IAAK,EAAM,IAAK,UAAS,CAAC,CAAC,EACnF,IAAM,EAAgB,EAAM,IAAI,QAAQ,OAAQ,EAAE,EAC5C,EAAU,MAAO,EAAQ,IAC7B,EAAO,YAAY,QAAQ,QAAQ,CAAE,gBAAe,SAAU,QAAS,UAAS,CAAC,CACnF,EACA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,UAAW,EAAQ,KAAK,UAAW,UAAS,CAAC,CAClG,EAAE,KAAK,EAAO,MAAM,CACtB,EAEA,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAe,EAAQ,KAAK,SAAS,EACxE,GAAI,EAAO,SAAW,SAAU,OAAO,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EACnF,GAAI,EAAO,SAAW,UAAW,OAAO,MAAO,EAAO,KAAS,MAAM,wBAAwB,CAAC,EAC9F,QAAQ,OAAO,MAAM,YAAc,CAAG,EACvC,CACH,EAEM,EAAO,CACX,EACA,EACA,EACA,EAAQ,KAER,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CAAC,EAC/G,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,IAAM,EAAS,EAAS,KAAK,SAAS,KAAK,EAC3C,GAAI,CAAC,GAAS,EAAQ,QAAQ,OAAO,MAAM,EAAS,EAAM,CAAG,EAE7D,OADA,MAAO,EAAO,MAAM,GAAG,EAChB,MAAO,EAAK,EAAQ,EAAe,EAAW,GAAS,CAAC,CAAC,CAAM,EACvE,EAEH,SAAS,CAAU,CAAC,EAAwB,CAC1C,OAAO,EAAO,WAAW,CAAE,IAAK,EAAM,MAAO,CAAC,IAAU,CAAM,CAAC", | ||
| "debugId": "589492F6965D34DC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/image-client.ts", "../ai/src/image.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, Layer } from \"effect\"\nimport { RequestExecutor } from \"./route/executor\"\nimport type { ImageRequest, ImageResponse } from \"./image\"\nimport type { LLMError } from \"./schema\"\n\nexport type Execute = RequestExecutor.Interface[\"execute\"]\n\nexport interface Interface {\n readonly generate: (request: ImageRequest) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/ImageClient\") {}\n\nexport const generate = (request: ImageRequest): Effect.Effect<ImageResponse, LLMError> =>\n Effect.gen(function* () {\n const client = yield* Service\n return yield* client.generate(request)\n }) as Effect.Effect<ImageResponse, LLMError>\n\nexport const layer: Layer.Layer<Service, never, RequestExecutor.Service> = Layer.effect(\n Service,\n Effect.gen(function* () {\n const executor = yield* RequestExecutor.Service\n return Service.of({\n generate: (request) => request.model.route.generate(request, executor.execute),\n })\n }),\n)\n\nexport const ImageClient = {\n Service,\n layer,\n generate,\n} as const\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { HttpOptions, InvalidRequestReason, LLMError, ModelID, ProviderID, ProviderMetadata, Usage } from \"./schema\"\nimport { ImageClient, type Execute as ImageExecute } from \"./image-client\"\n\nexport interface ImageRoute {\n readonly id: string\n readonly generate: (request: ImageRequest, execute: ImageExecute) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport class ImageModel {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute\n readonly defaults?: ImageModelDefaults\n\n constructor(input: ImageModel.Input) {\n this.id = input.id\n this.provider = input.provider\n this.route = input.route\n this.defaults = input.defaults\n }\n\n static make(input: ImageModel.MakeInput) {\n return new ImageModel({\n id: ModelID.make(input.id),\n provider: ProviderID.make(input.provider),\n route: input.route,\n defaults: input.defaults,\n })\n }\n}\n\nexport namespace ImageModel {\n export interface Input {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute\n readonly defaults?: ImageModelDefaults\n }\n\n export interface MakeInput extends Omit<Input, \"id\" | \"provider\"> {\n readonly id: string | ModelID\n readonly provider: string | ProviderID\n }\n}\n\nexport interface ImageModelDefaults {\n readonly providerOptions?: Record<string, Record<string, unknown>>\n readonly http?: HttpOptions\n}\n\nexport const ImageModelSchema = Schema.declare((value): value is ImageModel => value instanceof ImageModel, {\n expected: \"Image.Model\",\n})\n\nexport const ImageSize = Schema.Struct({\n width: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n height: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n}).annotate({ identifier: \"Image.Size\" })\nexport type ImageSize = Schema.Schema.Type<typeof ImageSize>\n\nexport class ImageRequest extends Schema.Class<ImageRequest>(\"Image.Request\")({\n model: ImageModelSchema,\n prompt: Schema.String,\n count: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))),\n size: Schema.optional(ImageSize),\n aspectRatio: Schema.optional(Schema.String),\n seed: Schema.optional(Schema.Number),\n providerOptions: Schema.optional(Schema.Record(Schema.String, Schema.Record(Schema.String, Schema.Unknown))),\n http: Schema.optional(HttpOptions),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport type ImageRequestInput = Omit<ConstructorParameters<typeof ImageRequest>[0], \"http\"> & {\n readonly http?: HttpOptions.Input\n}\n\nexport class GeneratedImage extends Schema.Class<GeneratedImage>(\"Image.Generated\")({\n mediaType: Schema.String,\n data: Schema.Union([Schema.String, Schema.Uint8Array]),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {}\n\nexport class ImageResponse extends Schema.Class<ImageResponse>(\"Image.Response\")({\n images: Schema.Array(GeneratedImage),\n usage: Schema.optional(Usage),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {\n get image() {\n return this.images[0]\n }\n}\n\nexport const request = (input: ImageRequest | ImageRequestInput) => {\n if (input instanceof ImageRequest) return input\n return new ImageRequest({\n ...input,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n}\n\nexport const generate = (input: ImageRequest | ImageRequestInput) =>\n Effect.try({\n try: () => request(input),\n catch: (error) =>\n new LLMError({\n module: \"Image\",\n method: \"generate\",\n reason: new InvalidRequestReason({ message: error instanceof Error ? error.message : String(error) }),\n }),\n }).pipe(Effect.flatMap(ImageClient.generate))\n\nexport const Image = {\n request,\n generate,\n} as const\n" | ||
| ], | ||
| "mappings": ";0MAWO,WAAM,eAAgB,EAAQ,QAA4B,EAAE,uBAAuB,CAAE,CAAC,CAQtF,IAAM,EAA8D,EAAM,OAC/E,EACA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAgB,QACxC,OAAO,EAAQ,GAAG,CAChB,SAAU,CAAC,IAAY,EAAQ,MAAM,MAAM,SAAS,EAAS,EAAS,OAAO,CAC/E,CAAC,EACF,CACH,EClBO,MAAM,CAAW,CACb,GACA,SACA,MACA,SAET,WAAW,CAAC,EAAyB,CACnC,KAAK,GAAK,EAAM,GAChB,KAAK,SAAW,EAAM,SACtB,KAAK,MAAQ,EAAM,MACnB,KAAK,SAAW,EAAM,eAGjB,KAAI,CAAC,EAA6B,CACvC,OAAO,IAAI,EAAW,CACpB,GAAI,EAAQ,KAAK,EAAM,EAAE,EACzB,SAAU,EAAW,KAAK,EAAM,QAAQ,EACxC,MAAO,EAAM,MACb,SAAU,EAAM,QAClB,CAAC,EAEL,CAqBO,IAAM,EAAmB,EAAO,QAAQ,CAAC,IAA+B,aAAiB,EAAY,CAC1G,SAAU,aACZ,CAAC,EAEY,EAAY,EAAO,OAAO,CACrC,MAAO,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,EACxD,OAAQ,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,CAC3D,CAAC,EAAE,SAAS,CAAE,WAAY,YAAa,CAAC,EAGjC,MAAM,UAAqB,EAAO,MAAoB,eAAe,EAAE,CAC5E,MAAO,EACP,OAAQ,EAAO,OACf,MAAO,EAAO,SAAS,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,CAAC,EACzE,KAAM,EAAO,SAAS,CAAS,EAC/B,YAAa,EAAO,SAAS,EAAO,MAAM,EAC1C,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,gBAAiB,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CAAC,EAC3G,KAAM,EAAO,SAAS,CAAW,EACjC,SAAU,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CACxE,CAAC,CAAE,CAAC,CAMG,MAAM,UAAuB,EAAO,MAAsB,iBAAiB,EAAE,CAClF,UAAW,EAAO,OAClB,KAAM,EAAO,MAAM,CAAC,EAAO,OAAQ,EAAO,UAAU,CAAC,EACrD,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,CAAC,CAEG,MAAM,UAAsB,EAAO,MAAqB,gBAAgB,EAAE,CAC/E,OAAQ,EAAO,MAAM,CAAc,EACnC,MAAO,EAAO,SAAS,CAAK,EAC5B,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,IACG,MAAK,EAAG,CACV,OAAO,KAAK,OAAO,GAEvB", | ||
| "debugId": "B5C9F17CF053109564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/standalone.ts", "src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Deferred, Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport { selfCommand } from \"../util/process\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const [executable, ...args] = options.command ?? [...selfCommand(), \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const readyLine = yield* Deferred.make<string, Error>()\n // Keep draining stdout after readiness so later server writes cannot hit EPIPE.\n yield* proc.stdout.pipe(\n Stream.decodeText(),\n Stream.splitLines,\n Stream.runForEach((line) => Deferred.succeed(readyLine, line)),\n Effect.ensuring(Deferred.fail(readyLine, new Error(\"Standalone server exited before reporting readiness\"))),\n Effect.forkScoped,\n )\n const output = yield* Deferred.await(readyLine)\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Endpoint & { readonly pid: number }\n },\n Effect.provide(LayerNode.compile(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n", | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F26947B2DAD7477C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,OAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH", | ||
| "debugId": "2B88D24466C7AC9964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]))),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n if (\n serviceOptions !== undefined &&\n port !== undefined &&\n (yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })) !== undefined\n )\n return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start({\n hostname,\n port: Option.fromNullishOr(port),\n password,\n instanceID,\n service:\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* register(address, password, instanceID, serviceOptions.file, shutdown)\n }),\n },\n }).pipe(\n Effect.provide(Logger.layer([], { mergeWithExisting: false })),\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n shutdown: Effect.Effect<void>,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n" | ||
| ], | ||
| "mappings": ";omCAQA,2BAAS,qBAAa,oBACtB,yBAgBO,SAAM,OAAM,OAAO,gBAAW,cAAU,MAAC,OAAkB,MAChE,YAAO,WAAO,OAAc,MAAO,OAAE,UACnC,OAAO,aAAQ,OAAQ,UAAK,OAC5B,OAAO,QAAQ,EAAU,QAAQ,EAAU,MAAM,CAAC,EAAO,KAAM,EAAW,IAAI,CAAC,CAAC,CAAC,EACjF,EAAO,QAAQ,EAAa,KAAK,CACnC,EACD,EAEK,EAAgB,EAAO,WAAW,SAAU,CAAC,EAAkB,CACnE,GAAI,EAAQ,OAAS,UAAW,MAAO,EAAO,KAAK,IAAM,QAAQ,MAAM,EAAO,KAAK,IAAI,CAAC,EACxF,OAAO,MAAO,EAAO,OACnB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAiB,EAAQ,OAAS,UAAY,MAAO,EAAc,QAAQ,EAAI,OAC/E,EAAS,EAAQ,OAAS,UAAY,MAAO,EAAc,KAAK,EAAI,CAAC,EACrE,EAAW,EAAQ,UAAY,EAAO,UAAY,YAClD,EAAO,EAAQ,MAAQ,EAAO,OAAS,EAAQ,OAAS,UAAY,EAAc,YAAY,EAAI,QACxG,GACE,IAAmB,QACnB,IAAS,SACR,MAAO,EAAQ,UAAU,IAAK,EAAgB,IAAK,EAAW,EAAU,CAAI,CAAE,CAAC,KAAO,OAEvF,OACF,IAAQ,SAAU,MAAO,EAAO,QAAQ,IAAa,wCAA8B,EAC7E,EAAsB,MAAO,EAAI,SAEvC,GAAI,EAAQ,OAAS,QACnB,OAAO,QAAQ,IAAI,kBACnB,OAAO,QAAQ,IAAI,yBAErB,IAAM,EACJ,EAAQ,OAAS,UACb,EAAO,UAAY,EAAY,EAAE,EAAE,SAAS,WAAW,EACvD,EACE,EAAS,MAAM,CAAmB,EAClC,EAAY,EAAE,EAAE,SAAS,WAAW,EAC5C,GAAI,CAAC,EAAU,OAAO,MAAO,EAAO,KAAS,MAAM,yBAAyB,CAAC,EAC7E,IAAM,EAAa,EAAW,EACxB,EAAS,MAAO,EAAM,CAC1B,WACA,KAAM,EAAO,cAAc,CAAI,EAC/B,WACA,aACA,QACE,IAAmB,OACf,OACA,CACE,SAAU,CAAC,EAAS,IAClB,EAAO,IAAI,SAAU,EAAG,CACtB,GAAI,CAAC,EAAO,SAAU,MAAO,EAAc,SAAS,CAAQ,EAC5D,OAAO,MAAO,EAAS,EAAS,EAAU,EAAY,EAAe,KAAM,CAAQ,EACpF,CACL,CACR,CAAC,EAAE,KACD,EAAO,QAAQ,EAAO,MAAM,CAAC,EAAG,CAAE,kBAAmB,EAAM,CAAC,CAAC,EAC7D,EAAO,MAAM,CAAC,IAAU,CACtB,GAAI,IAAmB,QAAa,IAAS,QAAa,CAAC,EAAa,CAAK,EAAG,OAAO,EAAO,KAAK,CAAK,EACxG,OAAO,EAAmB,EAAgB,EAAU,CAAI,EAAE,KACxD,EAAO,QAAQ,CAAC,IACd,EACI,EAAO,KACP,EAAO,KACD,MACF,wBAAwB,QAAW,wIAEnC,CAAE,MAAO,CAAM,CACjB,CACF,CACN,CACF,EACD,CACH,EACA,GAAI,IAAW,OAAW,OAC1B,IAAM,EAAM,EAAW,cAAc,EAAO,OAAO,EAEnD,GADA,QAAQ,IAAI,EAAQ,OAAS,QAAU,KAAK,UAAU,CAAE,KAAI,CAAC,EAAI,uBAAuB,GAAK,EACzF,EAAQ,OAAS,WAAa,CAAC,EAAqB,QAAQ,IAAI,mBAAmB,GAAU,EAGjG,OADA,OADgB,MAAO,EAAQ,SAChB,MAAM,EAAE,KAAK,EAAO,SAAS,EAAS,OAAO,YAAY,CAAC,EAAG,EAAO,UAAU,EACtF,MAAO,EAAQ,OAAS,UAC3B,EAAO,SACP,EAAQ,OAAS,QACf,EAAkB,EAClB,EAAO,MACd,EAAE,KAAK,EAAO,aAAa,CAAE,KAAM,QAAS,CAAC,CAAC,CACjD,EACD,EAEK,EAAW,EAAO,eAAe,EAAQ,IAAI,EAC7C,EAAa,EAAO,aAAa,CAAQ,EACzC,EAAa,EAAO,oBAAoB,CAAQ,EAEhD,EAAW,EAAO,WAAW,SAAU,CAC3C,EACA,EACA,EACA,EACA,EACA,CACA,IAAM,EAAK,MAAO,EAAW,WACvB,EAAO,EAAO,IAAM,EAAK,OAC/B,MAAO,EAAG,cAAc,EAAK,QAAQ,CAAI,EAAG,CAAE,UAAW,EAAK,CAAC,EAC/D,IAAM,EAAO,CACX,KACA,QAAS,EACT,IAAK,EAAW,cAAc,CAAO,EACrC,IAAK,QAAQ,IACb,UACF,EACM,EAAU,MAAO,EAAW,CAAI,EAChC,EAAU,EAAG,eAAe,CAAI,EAAE,KACtC,EAAO,QAAQ,CAAU,EACzB,EAAO,cAAc,IAAG,CAAG,OAAS,CACtC,EACM,EAAO,CAAC,IACZ,GAAO,KAAO,EAAK,IACnB,EAAM,UAAY,EAAK,SACvB,EAAM,MAAQ,EAAK,KACnB,EAAM,MAAQ,EAAK,KACnB,EAAM,WAAa,EAAK,SAS1B,OARA,MAAO,EAAG,gBAAgB,EAAM,EAAS,CAAE,KAAM,GAAM,CAAC,EAAE,KAAK,EAAO,QAAQ,EAAG,OAAO,EAAM,CAAI,CAAC,CAAC,EACpG,MAAO,EAAQ,KACb,EAAO,aAAa,CAAI,EACxB,EAAO,OAAO,EAAS,OAAO,WAAW,CAAC,EAC1C,EAAO,OACP,EAAO,QAAQ,CAAQ,EACvB,EAAO,UACT,EACO,EAAQ,KACb,EAAO,QAAQ,CAAC,IAAW,EAAK,CAAK,EAAI,EAAG,OAAO,CAAI,EAAI,EAAO,IAAK,EACvE,EAAO,MACT,EACD,EAEK,EAAqB,EAAO,WAAW,SAAU,CAAC,EAA0B,EAAkB,EAAc,CAChH,IAAM,EAAQ,MAAO,EAAQ,UAAU,IAAK,EAAS,IAAK,EAAW,EAAU,CAAI,CAAE,CAAC,EAAE,KACtF,EAAO,aAAa,CAAC,IAAU,IAAU,MAAS,EAClD,EAAO,MAAM,EAAS,OAAO,YAAY,CAAC,EAC1C,EAAO,cAAc,YAAY,CACnC,EACA,OAAO,EAAO,OAAO,CAAK,EAC3B,EAED,SAAS,CAAU,CAAC,EAAkB,EAAc,CAClD,MAAO,UAAU,EAAS,SAAS,GAAG,EAAI,IAAI,KAAc,KAAY,IAG1E,SAAS,CAAY,CAAC,EAAyB,CAC7C,GAAI,OAAO,IAAU,UAAY,IAAU,KAAM,MAAO,GACxD,GAAI,SAAU,GAAS,EAAM,OAAS,aAAc,MAAO,GAC3D,MAAO,UAAW,GAAS,EAAa,EAAM,KAAK,EAGrD,SAAS,CAAiB,EAAG,CAC3B,OAAO,EAAO,SAAe,CAAC,IAAW,CACvC,IAAM,EAAQ,IAAM,EAAO,EAAO,IAAI,EAItC,GAHA,QAAQ,MAAM,KAAK,MAAO,CAAK,EAC/B,QAAQ,MAAM,KAAK,QAAS,CAAK,EACjC,QAAQ,MAAM,OAAO,EACjB,QAAQ,MAAM,eAAiB,QAAQ,MAAM,UAAW,EAAM,EAClE,OAAO,EAAO,KAAK,IAAM,CACvB,QAAQ,MAAM,IAAI,MAAO,CAAK,EAC9B,QAAQ,MAAM,IAAI,QAAS,CAAK,EAChC,QAAQ,MAAM,MAAM,EACrB,EACF,ECvLH,IAAe,KAAQ,QACrB,EAAS,SAAS,MAClB,EAAO,WAAW,SAAU,CAAC,EAAO,CAClC,GAAI,EAAM,SAAW,EAAM,MAAO,OAAO,MAAO,EAAO,KAAS,MAAM,0CAA0C,CAAC,EACjH,OAAO,MAAO,EAAc,IAAI,CAC9B,KAAM,EAAM,QAAU,UAAY,EAAM,MAAQ,QAAU,UAC1D,SAAU,EAAO,eAAe,EAAM,QAAQ,EAC9C,KAAM,EAAO,eAAe,EAAM,IAAI,CACxC,CAAC,EACF,CACH", | ||
| "debugId": "5B8384E95259DB6D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/api.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nconst methods = new Set([\"delete\", \"get\", \"head\", \"options\", \"patch\", \"post\", \"put\"])\n\ntype Operation = {\n operationId?: string\n}\n\ntype OpenApi = {\n paths?: Record<string, Record<string, Operation>>\n}\n\nexport default Runtime.handler(\n Commands.commands.api,\n Effect.fn(\"cli.api\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n mismatch: \"ignore\",\n })\n const endpoint = server.endpoint\n const params = Option.getOrElse(input.param, () => ({}))\n const request = yield* resolveRequest(endpoint, input.request, params)\n const headers = new Headers(Service.headers(endpoint))\n for (const header of input.header) {\n const index = header.indexOf(\":\")\n if (index < 1) return yield* Effect.fail(new Error(`Invalid header, expected name:value: ${header}`))\n headers.set(header.slice(0, index).trim(), header.slice(index + 1).trim())\n }\n const body = Option.getOrUndefined(input.data)\n if (body !== undefined && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\")\n\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(request.path, endpoint.url), {\n method: request.method,\n headers,\n body,\n }),\n )\n const output = yield* Effect.promise(() => response.text())\n if (output) process.stdout.write(output + (output.endsWith(EOL) ? \"\" : EOL))\n }),\n)\n\nexport function resolveOperation(spec: OpenApi, operationID: string, params: Record<string, string>) {\n for (const [path, operations] of Object.entries(spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(operations)) {\n if (!methods.has(method) || operation.operationId !== operationID) continue\n return { method: method.toUpperCase(), path: interpolate(path, params) }\n }\n }\n throw new Error(`Operation not found: ${operationID}`)\n}\n\nexport function rawRequest(input: readonly string[]) {\n if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith(\"/\")) return\n return { method: input[0].toUpperCase(), path: input[1] }\n}\n\nfunction resolveRequest(endpoint: Endpoint, input: readonly string[], params: Record<string, string>) {\n const raw = rawRequest(input)\n if (raw) return Effect.succeed(raw)\n if (input.length !== 1) return Effect.fail(new Error(\"Expected an operation name or an HTTP method and path\"))\n return Effect.tryPromise(async () => {\n const response = await fetch(new URL(\"/openapi.json\", endpoint.url), { headers: Service.headers(endpoint) })\n if (!response.ok) throw new Error(`Failed to load OpenAPI document: HTTP ${response.status}`)\n return resolveOperation((await response.json()) as OpenApi, input[0], params)\n })\n}\n\nfunction interpolate(path: string, params: Record<string, string>) {\n const used = new Set<string>()\n const pathname = path.replaceAll(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n used.add(name)\n return encodeURIComponent(value)\n })\n const query = new URLSearchParams(Object.entries(params).filter(([name]) => !used.has(name))).toString()\n return query ? `${pathname}?${query}` : pathname\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "31B96FF3E4B8ACB964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/azure.ts"], | ||
| "sourcesContent": [ | ||
| "import { Auth } from \"../route/auth\"\nimport { type AtLeastOne, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options\"\n\nexport const id = ProviderID.make(\"azure\")\nconst routeAuth = Auth.remove(\"authorization\")\n\n// Azure needs the customer's resource URL; supply either `resourceName`\n// (helper builds the URL) or `baseURL` directly.\ntype AzureURL = AtLeastOne<{ readonly resourceName: string; readonly baseURL: string }>\n\nexport type ModelOptions = AzureURL &\n RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly apiVersion?: string\n readonly queryParams?: Record<string, string>\n readonly useCompletionUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\nexport type Config = ModelOptions\n\nexport type Settings = ProviderPackage.Settings &\n AzureURL & {\n readonly apiKey?: string\n readonly apiVersion?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nconst resourceBaseURL = (resourceName: string) => `https://${resourceName.trim()}.openai.azure.com/openai/v1`\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"azure-openai-responses\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"azure-openai-chat\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst defaults = (input: Config) => {\n const {\n apiKey: _,\n apiVersion: _apiVersion,\n resourceName: _resourceName,\n useCompletionUrls: _useCompletionUrls,\n baseURL: _baseURL,\n queryParams: _queryParams,\n ...rest\n } = input\n if (\"auth\" in rest) {\n const { auth: _, ...withoutAuth } = rest\n return withoutAuth\n }\n return rest\n}\n\nconst auth = (input: Config) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.remove(\"authorization\").andThen(\n Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"AZURE_OPENAI_API_KEY\"))\n .pipe(Auth.header(\"api-key\")),\n )\n}\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: {\n // AtLeastOne guarantees at least one is set; baseURL wins if both are.\n baseURL: input.baseURL ?? resourceBaseURL(input.resourceName!),\n query: {\n ...(input.apiVersion ? { \"api-version\": input.apiVersion } : {}),\n ...input.queryParams,\n },\n },\n })\n\nexport const configure = (input: Config) => {\n const configuredResponsesRoute = configuredRoute(responsesRoute, input)\n const configuredChatRoute = configuredRoute(chatRoute, input)\n const modelDefaults = defaults(input)\n\n const responses = (modelID: string | ModelID) =>\n configuredResponsesRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n const chat = (modelID: string | ModelID) =>\n configuredChatRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n return {\n id,\n model: (modelID: string | ModelID) => (input.useCompletionUrls === true ? chat(modelID) : responses(modelID)),\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nconst config = (settings: Settings): Config => {\n const common = {\n apiKey: settings.apiKey,\n apiVersion: settings.apiVersion,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n if (settings.baseURL !== undefined) return { ...common, baseURL: settings.baseURL }\n if (settings.resourceName !== undefined) return { ...common, resourceName: settings.resourceName }\n throw new Error(\"Azure requires resourceName or baseURL\")\n}\n\nexport const responsesModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).responses(modelID)\nexport const chatModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).chat(modelID)\nexport const model = responsesModel\n" | ||
| ], | ||
| "mappings": ";yMASO,SAAM,OAAK,OAAW,KAAK,OAAO,EACnC,EAAY,EAAK,OAAO,eAAe,EAwBvC,EAAkB,CAAC,IAAyB,WAAW,EAAa,KAAK,+BAEzE,EAAiC,EAAM,KAAK,CAChD,GAAI,yBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEK,EAAuB,EAAM,KAAK,CACtC,GAAI,oBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEY,EAAS,CAAC,EAAgB,CAAS,EAE1C,EAAW,CAAC,IAAkB,CAClC,IACE,OAAQ,EACR,WAAY,EACZ,aAAc,EACd,kBAAmB,EACnB,QAAS,EACT,YAAa,KACV,GACD,EACJ,GAAI,SAAU,EAAM,CAClB,IAAQ,KAAM,KAAM,GAAgB,EACpC,OAAO,EAET,OAAO,GAGH,EAAO,CAAC,IAAkB,CAC9B,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,OAAO,eAAe,EAAE,QAClC,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EACjE,OAAO,EAAK,OAAO,sBAAsB,CAAC,EAC1C,KAAK,EAAK,OAAO,SAAS,CAAC,CAChC,GAGI,EAAkB,CAAiB,EAAiC,IACxE,EAAM,KAAK,CACT,KAAM,EAAK,CAAK,EAChB,SAAU,CAER,QAAS,EAAM,SAAW,EAAgB,EAAM,YAAa,EAC7D,MAAO,IACD,EAAM,WAAa,CAAE,cAAe,EAAM,UAAW,EAAI,CAAC,KAC3D,EAAM,WACX,CACF,CACF,CAAC,EAEU,EAAY,CAAC,IAAkB,CAC1C,IAAM,EAA2B,EAAgB,EAAgB,CAAK,EAChE,EAAsB,EAAgB,EAAW,CAAK,EACtD,EAAgB,EAAS,CAAK,EAE9B,EAAY,CAAC,IACjB,EAAyB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE1F,EAAO,CAAC,IACZ,EAAoB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE3F,MAAO,CACL,KACA,MAAO,CAAC,IAA+B,EAAM,oBAAsB,GAAO,EAAK,CAAO,EAAI,EAAU,CAAO,EAC3G,YACA,OACA,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEM,EAAS,CAAC,IAA+B,CAC7C,IAAM,EAAS,CACb,OAAQ,EAAS,OACjB,WAAY,EAAS,WACrB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,gBAAiB,EAAS,gBAC1B,YAAa,EAAS,cAAgB,OAAY,OAAY,IAAK,EAAS,WAAY,CAC1F,EACA,GAAI,EAAS,UAAY,OAAW,MAAO,IAAK,EAAQ,QAAS,EAAS,OAAQ,EAClF,GAAI,EAAS,eAAiB,OAAW,MAAO,IAAK,EAAQ,aAAc,EAAS,YAAa,EACjG,MAAU,MAAM,wCAAwC,GAG7C,EAAgE,CAAC,EAAS,IACrF,EAAU,EAAO,CAAQ,CAAC,EAAE,UAAU,CAAO,EAClC,EAA2D,CAAC,EAAS,IAChF,EAAU,EAAO,CAAQ,CAAC,EAAE,KAAK,CAAO,EAC7B,EAAQ", | ||
| "debugId": "466A3EE9411FF4E964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "2BCC94951762EED264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "E83E7FEDA85AE99B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/anthropic-compatible.ts", "../ai/src/providers/anthropic.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { ProviderID, type ModelID } from \"../schema\"\n\nexport const id = ProviderID.make(\"anthropic-compatible\")\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL: string\n readonly provider?: string\n }\n\nexport const routes = [AnthropicMessages.route]\n\nconst auth = (input: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\").pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config) => {\n if (!input.baseURL) throw new Error(\"Anthropic-compatible providers require a baseURL\")\n const provider = input.provider ?? \"anthropic-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = AnthropicMessages.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: auth(input),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic-compatible apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n}\n\nexport * as AnthropicCompatible from \"./anthropic-compatible\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { AnthropicCompatible } from \"./anthropic-compatible\"\n\nexport const id = ProviderID.make(\"anthropic\")\n\nexport const routes = [AnthropicMessages.route]\n\nexport type Config = RouteDefaultsInput & ProviderAuthOption<\"optional\"> & { readonly baseURL?: string }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL?: string\n }\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"ANTHROPIC_API_KEY\"))\n .pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config = {}) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n const compatible = AnthropicCompatible.configure({\n ...rest,\n auth: auth(input),\n baseURL: baseURL ?? AnthropicMessages.DEFAULT_BASE_URL,\n provider: id,\n })\n return {\n id,\n model: (modelID: string | ModelID) => compatible.model(modelID),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";qhBAOO,SAAM,OAAK,OAAW,UAAK,2BAAsB,OAiB3C,OAAS,MAAC,OAAkB,UAAK,EAExC,EAAO,CAAC,IAA0C,CACtD,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EAAE,KAAK,EAAK,OAAO,WAAW,CAAC,GAG/F,EAAY,CAAC,IAAkB,CAC1C,GAAI,CAAC,EAAM,QAAS,MAAU,MAAM,kDAAkD,EACtF,IAAM,EAAW,EAAM,UAAY,wBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAAQ,EAAkB,MAAM,KAAK,IACtC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAK,CAAK,CAClB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,CAAQ,CAAC,EACjE,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,+DAA+D,EACjF,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,GCvDX,IAAM,EAAK,EAAW,KAAK,WAAW,EAEhC,EAAS,CAAC,EAAkB,KAAK,EAYxC,EAAO,CAAC,IAA4C,CACxD,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAO,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,EAC5E,OAAO,EAAK,OAAO,mBAAmB,CAAC,EACvC,KAAK,EAAK,OAAO,WAAW,CAAC,GAGrB,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EAC/C,EAAa,EAAoB,UAAU,IAC5C,EACH,KAAM,EAAK,CAAK,EAChB,QAAS,GAAW,EAAkB,iBACtC,SAAU,CACZ,CAAC,EACD,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAW,MAAM,CAAO,EAC9D,WACF,GAGW,EAAW,EAAU,EACrB,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,oDAAoD,EACtE,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,MACnB,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "921AD181817D91B164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "C7447D167BAAF80264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({ server: serverURL, standalone: input.standalone })\n const config = yield* Config.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n tuiConfig: resolved,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ogCAOA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EAC5F,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,KACZ,UAAW,CACb,CAAC,CACH,EACD,CACH", | ||
| "debugId": "E7D7103A627E1D9364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { waitForCatalogReady } from \"../services/catalog\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n prepare: async (next) => {\n const selected =\n next.model ??\n (await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data))\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n if (model) {\n await waitForCatalogReady({\n sdk: client,\n directory: next.location.directory,\n workspace: next.location.workspaceID,\n model: { providerID: model.providerID, modelID: model.id },\n })\n const available = await client.model.list({\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.id))\n throw new RunTargetError(`Model unavailable: ${model.providerID}/${model.id}`, next.session?.id)\n }\n return {\n model,\n agent: input.agent\n ? await validateAgent(client, next.location.directory, next.location.workspaceID, input.agent)\n : next.agent,\n }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, workspace: string | undefined, name?: string) {\n if (!name) return\n const agents = await client.agent\n .list({ location: { directory, workspace } })\n .then((result) => result.data)\n .catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction errorMessage(error: unknown) {\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\")\n return error.message\n return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LLMToolContent,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n structured: Record<string, JsonValue>\n content: LLMToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.callID), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) {\n current.structured = event.data.structured\n current.content = event.data.content\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n error: event.data.error,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (toolOutputText(current.tool, current.content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n result: event.data.result,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (\n input.compatibility === \"v1\" &&\n event.data.error.message === \"Provider stream ended without a terminal finish event\"\n ) {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, callID: string) {\n return `${messageID}\\u0000${callID}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n structured: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D061029C4E51E05864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-compatible-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { Route, type RouteRoutedModelInput } from \"../route/client\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport * as OpenAIChat from \"./openai-chat\"\n\nconst ADAPTER = \"openai-compatible-chat\"\n\nexport type OpenAICompatibleChatModelInput = RouteRoutedModelInput\n\n/**\n * Route for non-OpenAI providers that expose an OpenAI Chat-compatible\n * `/chat/completions` endpoint. Reuses `OpenAIChat.protocol` end-to-end and\n * overrides only the route id so providers can be resolved per-family without\n * colliding with native OpenAI. Provider helpers configure the route endpoint\n * before model selection.\n */\nexport const route = Route.make({\n id: ADAPTER,\n providerMetadataKey: \"openai\",\n protocol: OpenAIChat.protocol,\n endpoint: Endpoint.path(\"/chat/completions\"),\n framing: Framing.sse,\n})\n\nexport * as OpenAICompatibleChat from \"./openai-compatible-chat\"\n" | ||
| ], | ||
| "mappings": ";mHAKA,SAAM,EAAU,yBAWH,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,oBAAqB,SACrB,SAAqB,EACrB,SAAU,EAAS,KAAK,mBAAmB,EAC3C,QAAS,EAAQ,GACnB,CAAC", | ||
| "debugId": "55D6846C07C7DC4964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/migrate.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n" | ||
| ], | ||
| "mappings": ";ivBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "41F38B6708FEE98C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/installation/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare global {\n const OPENCODE_VERSION: string\n const OPENCODE_CHANNEL: string\n}\n\nexport const InstallationVersion = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nexport const InstallationChannel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\nexport const InstallationLocal = InstallationChannel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAKO,IAAM,EAA6D,mBAC7D,EAA6D,OAC7D,EAAoB", | ||
| "debugId": "29F4F69EC9D4868564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-compatible.ts"], | ||
| "sourcesContent": [ | ||
| "import { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { profiles, type OpenAICompatibleProfile } from \"./openai-compatible-profile\"\n\nexport const id = ProviderID.make(\"openai-compatible\")\n\ntype GenericModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL: string\n readonly provider?: string\n}\n\nexport type FamilyModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport const routes = [OpenAICompatibleChat.route]\n\nexport const configure = (input: GenericModelOptions) => {\n const provider = input.provider ?? \"openai-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = OpenAICompatibleChat.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: AuthOptions.bearer(input, []),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID, provider: ProviderID.make(provider) }),\n configure,\n }\n}\n\nconst define = (profile: OpenAICompatibleProfile) => {\n const configureProfile = (input: FamilyModelOptions = {}) => {\n const facade = configure({\n ...input,\n baseURL: input.baseURL ?? profile.baseURL,\n provider: profile.provider,\n })\n return {\n id: ProviderID.make(profile.provider),\n model: facade.model,\n configure: configureProfile,\n }\n }\n return configureProfile()\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n\nexport const baseten = define(profiles.baseten)\nexport const cerebras = define(profiles.cerebras)\nexport const deepinfra = define(profiles.deepinfra)\nexport const deepseek = define(profiles.deepseek)\nexport const fireworks = define(profiles.fireworks)\nexport const groq = define(profiles.groq)\nexport const togetherai = define(profiles.togetherai)\n" | ||
| ], | ||
| "mappings": ";mfAOO,SAAM,OAAK,OAAW,UAAK,wBAAmB,OAmBxC,OAAS,MAAsB,MAAK,OAEpC,OAAY,MAAC,IAA+B,CACvD,IAAM,EAAW,EAAM,UAAY,qBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAA6B,EAAM,KAAK,IACzC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAY,OAAO,EAAO,CAAC,CAAC,CACpC,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,EAAS,SAAU,EAAW,KAAK,CAAQ,CAAE,CAAC,EACtG,WACF,GAGI,EAAS,CAAC,IAAqC,CACnD,IAAM,EAAmB,CAAC,EAA4B,CAAC,IAAM,CAC3D,IAAM,EAAS,EAAU,IACpB,EACH,QAAS,EAAM,SAAW,EAAQ,QAClC,SAAU,EAAQ,QACpB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,EAAQ,QAAQ,EACpC,MAAO,EAAO,MACd,UAAW,CACb,GAEF,OAAO,EAAiB,GAGb,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAC5E,EAAU,CACR,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,EAEL,EAAU,EAAO,EAAS,OAAO,EACjC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAO,EAAO,EAAS,IAAI,EAC3B,EAAa,EAAO,EAAS,UAAU", | ||
| "debugId": "4B3FF2D186F43AED64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/xai.ts"], | ||
| "sourcesContent": [ | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\n\nexport const id = ProviderID.make(\"xai\")\n\nexport type ModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport const routes = [OpenAIResponses.route, OpenAICompatibleChat.route]\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"XAI_API_KEY\")\n\nconst configuredResponsesRoute = (input: ModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return OpenAIResponses.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nconst configuredChatRoute = (input: ModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return OpenAICompatibleChat.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nexport const configure = (input: ModelOptions = {}) => {\n const responsesRoute = configuredResponsesRoute(input)\n const chatRoute = configuredChatRoute(input)\n const responses = (modelID: string | ModelID) => responsesRoute.model({ id: modelID })\n const chat = (modelID: string | ModelID) => chatRoute.model({ id: modelID })\n return {\n id,\n model: responses,\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model = provider.model\nexport const responses = provider.responses\nexport const chat = provider.chat\n" | ||
| ], | ||
| "mappings": ";kiBAOO,SAAM,OAAK,OAAW,UAAK,UAAK,OAO1B,OAAS,MAAiB,OAA4B,MAAK,OAElE,OAAO,MAAC,IAA4C,EAAY,OAAO,EAAS,aAAa,EAE7F,EAA2B,CAAC,IAAwB,CACxD,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAAuB,EAAM,KAAK,IAC7B,EACH,SAAU,EACV,SAAU,CAAE,QAAS,GAAoC,EAAS,IAAI,OAAQ,EAC9E,KAAM,EAAK,CAAK,CAClB,CAAC,GAGG,EAAsB,CAAC,IAAwB,CACnD,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAA4B,EAAM,KAAK,IAClC,EACH,SAAU,EACV,SAAU,CAAE,QAAS,GAAoC,EAAS,IAAI,OAAQ,EAC9E,KAAM,EAAK,CAAK,CAClB,CAAC,GAGU,EAAY,CAAC,EAAsB,CAAC,IAAM,CACrD,IAAM,EAAiB,EAAyB,CAAK,EAC/C,EAAY,EAAoB,CAAK,EACrC,EAAY,CAAC,IAA8B,EAAe,MAAM,CAAE,GAAI,CAAQ,CAAC,EAErF,MAAO,CACL,KACA,MAAO,EACP,YACA,KALW,CAAC,IAA8B,EAAU,MAAM,CAAE,GAAI,CAAQ,CAAC,EAMzE,WACF,GAGW,EAAW,EAAU,EACrB,EAAQ,EAAS,MACjB,EAAY,EAAS,UACrB,EAAO,EAAS", | ||
| "debugId": "3D8F521F37A4DA7464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/anthropic-messages.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMError,\n LLMEvent,\n Usage,\n type CacheHint,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type ToolCallPart,\n type ToolDefinition,\n type ToolContent,\n type ToolResultPart,\n} from \"../schema\"\nimport { JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared\"\nimport { classifyProviderFailure } from \"../provider-error\"\nimport * as Cache from \"./utils/cache\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\nimport { ToolStream } from \"./utils/tool-stream\"\n\nconst ADAPTER = \"anthropic-messages\"\nexport const DEFAULT_BASE_URL = \"https://api.anthropic.com/v1\"\nexport const PATH = \"/messages\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst AnthropicCacheControl = Schema.Struct({\n type: Schema.tag(\"ephemeral\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n})\n\nconst AnthropicTextBlock = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTextBlock = Schema.Schema.Type<typeof AnthropicTextBlock>\n\nconst AnthropicImageBlock = Schema.Struct({\n type: Schema.tag(\"image\"),\n source: Schema.Struct({\n type: Schema.tag(\"base64\"),\n media_type: Schema.String,\n data: Schema.String,\n }),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicImageBlock = Schema.Schema.Type<typeof AnthropicImageBlock>\n\nconst AnthropicThinkingBlock = Schema.Struct({\n type: Schema.tag(\"thinking\"),\n thinking: Schema.String,\n signature: Schema.optional(Schema.String),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicToolUseBlock = Schema.Struct({\n type: Schema.tag(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicToolUseBlock = Schema.Schema.Type<typeof AnthropicToolUseBlock>\n\nconst AnthropicServerToolUseBlock = Schema.Struct({\n type: Schema.tag(\"server_tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolUseBlock = Schema.Schema.Type<typeof AnthropicServerToolUseBlock>\n\n// Server tool result blocks: web_search_tool_result, code_execution_tool_result,\n// and web_fetch_tool_result. The provider executes the tool and inlines the\n// structured result into the assistant turn — there is no client tool_result\n// round-trip. We round-trip the structured `content` payload as opaque JSON so\n// the next request can echo it back when continuing the conversation.\nconst AnthropicServerToolResultType = Schema.Literals([\n \"web_search_tool_result\",\n \"code_execution_tool_result\",\n \"web_fetch_tool_result\",\n])\ntype AnthropicServerToolResultType = Schema.Schema.Type<typeof AnthropicServerToolResultType>\n\nconst AnthropicServerToolResultBlock = Schema.Struct({\n type: AnthropicServerToolResultType,\n tool_use_id: Schema.String,\n content: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolResultBlock = Schema.Schema.Type<typeof AnthropicServerToolResultBlock>\n\n// Anthropic accepts either a plain string or an ordered array of text/image\n// blocks inside `tool_result.content`. The array form is required when a tool\n// returns image bytes (screenshot, image search, etc.) so they can be passed\n// to the model as proper image inputs instead of being JSON-stringified into\n// the prompt — which silently inflates context by megabytes and can push the\n// conversation over the model's token limit.\nconst AnthropicToolResultContent = Schema.Union([AnthropicTextBlock, AnthropicImageBlock])\n\nconst AnthropicToolResultBlock = Schema.Struct({\n type: Schema.tag(\"tool_result\"),\n tool_use_id: Schema.String,\n content: Schema.Union([Schema.String, Schema.Array(AnthropicToolResultContent)]),\n is_error: Schema.optional(Schema.Boolean),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicUserBlock = Schema.Union([AnthropicTextBlock, AnthropicImageBlock, AnthropicToolResultBlock])\ntype AnthropicUserBlock = Schema.Schema.Type<typeof AnthropicUserBlock>\nconst AnthropicAssistantBlock = Schema.Union([\n AnthropicTextBlock,\n AnthropicThinkingBlock,\n AnthropicToolUseBlock,\n AnthropicServerToolUseBlock,\n AnthropicServerToolResultBlock,\n])\ntype AnthropicAssistantBlock = Schema.Schema.Type<typeof AnthropicAssistantBlock>\ntype AnthropicToolResultBlock = Schema.Schema.Type<typeof AnthropicToolResultBlock>\n\nconst AnthropicMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(AnthropicUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(AnthropicAssistantBlock) }),\n Schema.Struct({ role: Schema.Literal(\"system\"), content: Schema.Array(AnthropicTextBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype AnthropicMessage = Schema.Schema.Type<typeof AnthropicMessage>\n\nconst AnthropicTool = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n input_schema: JsonObject,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTool = Schema.Schema.Type<typeof AnthropicTool>\n\nconst AnthropicToolChoice = Schema.Union([\n Schema.Struct({ type: Schema.Literals([\"auto\", \"any\"]) }),\n Schema.Struct({ type: Schema.tag(\"tool\"), name: Schema.String }),\n])\n\nconst AnthropicThinking = Schema.Union([\n Schema.Struct({\n type: Schema.tag(\"enabled\"),\n budget_tokens: Schema.Number,\n }),\n Schema.Struct({\n type: Schema.tag(\"adaptive\"),\n display: Schema.optional(Schema.Literals([\"summarized\", \"omitted\"])),\n }),\n Schema.Struct({\n type: Schema.tag(\"disabled\"),\n }),\n])\n\nconst AnthropicOutputConfig = Schema.Struct({\n effort: Schema.optional(Schema.String),\n})\n\nconst AnthropicBodyFields = {\n model: Schema.String,\n system: optionalArray(AnthropicTextBlock),\n messages: Schema.Array(AnthropicMessage),\n tools: optionalArray(AnthropicTool),\n tool_choice: Schema.optional(AnthropicToolChoice),\n stream: Schema.Literal(true),\n max_tokens: Schema.Number,\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n top_k: Schema.optional(Schema.Number),\n stop_sequences: optionalArray(Schema.String),\n thinking: Schema.optional(AnthropicThinking),\n output_config: Schema.optional(AnthropicOutputConfig),\n}\nexport const AnthropicMessagesBody = Schema.Struct(AnthropicBodyFields)\nexport type AnthropicMessagesBody = Schema.Schema.Type<typeof AnthropicMessagesBody>\n\nconst AnthropicUsage = Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n cache_creation_input_tokens: optionalNull(Schema.Number),\n cache_read_input_tokens: optionalNull(Schema.Number),\n})\ntype AnthropicUsage = Schema.Schema.Type<typeof AnthropicUsage>\n\nconst AnthropicStreamBlock = Schema.Struct({\n type: Schema.String,\n id: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Unknown),\n // *_tool_result blocks arrive whole as content_block_start (no streaming\n // delta) with the structured payload in `content` and the originating\n // server_tool_use id in `tool_use_id`.\n tool_use_id: Schema.optional(Schema.String),\n content: Schema.optional(Schema.Unknown),\n})\n\nconst AnthropicStreamDelta = Schema.Struct({\n type: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n partial_json: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n stop_reason: optionalNull(Schema.String),\n stop_sequence: optionalNull(Schema.String),\n})\n\nconst AnthropicEvent = Schema.Struct({\n type: Schema.String,\n index: Schema.optional(Schema.Number),\n message: Schema.optional(Schema.Struct({ usage: Schema.optional(AnthropicUsage) })),\n content_block: Schema.optional(AnthropicStreamBlock),\n delta: Schema.optional(AnthropicStreamDelta),\n usage: Schema.optional(AnthropicUsage),\n // `type` and `message` are both required per Anthropic's spec, but\n // OpenAI-compatible proxies and gateway translations occasionally drop one\n // or the other; mark them optional so a partial payload still parses and\n // the parser can fall back to whichever field is populated.\n error: Schema.optional(\n Schema.Struct({ type: Schema.optional(Schema.String), message: Schema.optional(Schema.String) }),\n ),\n})\ntype AnthropicEvent = Schema.Schema.Type<typeof AnthropicEvent>\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n readonly usage?: Usage\n readonly lifecycle: Lifecycle.State\n}\n\nconst invalid = ProviderShared.invalidRequest\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Anthropic accepts at most 4 explicit cache_control breakpoints per request,\n// across `tools`, `system`, and `messages`. Beyond the cap the API returns a\n// 400 — so the lowering layer counts emitted markers and silently drops any\n// that exceed it.\nconst ANTHROPIC_BREAKPOINT_CAP = 4\n\nconst EPHEMERAL_5M = { type: \"ephemeral\" as const }\nconst EPHEMERAL_1H = { type: \"ephemeral\" as const, ttl: \"1h\" as const }\n\nconst cacheControl = (breakpoints: Cache.Breakpoints, cache: CacheHint | undefined) => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return Cache.ttlBucket(cache.ttlSeconds) === \"1h\" ? EPHEMERAL_1H : EPHEMERAL_5M\n}\n\nconst anthropicMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ anthropic: metadata })\n\nconst signatureFromMetadata = (metadata: ProviderMetadata | undefined): string | undefined => {\n const anthropic = metadata?.anthropic\n if (!ProviderShared.isRecord(anthropic)) return undefined\n return typeof anthropic.signature === \"string\" ? anthropic.signature : undefined\n}\n\nconst lowerTool = (breakpoints: Cache.Breakpoints, tool: ToolDefinition, inputSchema: JsonSchema): AnthropicTool => ({\n name: tool.name,\n description: tool.description,\n input_schema: inputSchema,\n cache_control: cacheControl(breakpoints, tool.cache),\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Anthropic Messages\", toolChoice, {\n auto: () => ({ type: \"auto\" as const }),\n none: () => undefined,\n required: () => ({ type: \"any\" as const }),\n tool: (name) => ({ type: \"tool\" as const, name }),\n })\n\nconst lowerToolCall = (part: ToolCallPart): AnthropicToolUseBlock => ({\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n})\n\nconst lowerServerToolCall = (part: ToolCallPart): AnthropicServerToolUseBlock => ({\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n})\n\n// Server tool result blocks are typed by name. Anthropic ships three today;\n// extend this list when new server tools land. The block content is the\n// structured payload returned by the provider, which we round-trip as-is.\nconst serverToolResultType = (name: string): AnthropicServerToolResultType | undefined => {\n if (name === \"web_search\") return \"web_search_tool_result\"\n if (name === \"code_execution\") return \"code_execution_tool_result\"\n if (name === \"web_fetch\") return \"web_fetch_tool_result\"\n return undefined\n}\n\nconst lowerServerToolResult = Effect.fn(\"AnthropicMessages.lowerServerToolResult\")(function* (part: ToolResultPart) {\n const wireType = serverToolResultType(part.name)\n if (!wireType)\n return yield* invalid(`Anthropic Messages does not know how to round-trip server tool result for ${part.name}`)\n return { type: wireType, tool_use_id: part.id, content: part.result.value } satisfies AnthropicServerToolResultBlock\n})\n\nconst lowerImage = Effect.fn(\"AnthropicMessages.lowerImage\")(function* (part: MediaPart) {\n const media = yield* ProviderShared.validateMedia(\n \"Anthropic Messages\",\n part,\n new Set<string>(ProviderShared.IMAGE_MIMES),\n )\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: media.mime,\n data: media.base64,\n },\n } satisfies AnthropicImageBlock\n})\n\n// Tool results may carry structured text/images. Keep media as provider-native\n// content instead of JSON-stringifying base64 into a prompt string.\nconst lowerToolResultContentItem = Effect.fn(\"AnthropicMessages.lowerToolResultContentItem\")(function* (\n item: ToolContent,\n) {\n if (item.type === \"text\") return { type: \"text\" as const, text: item.text } satisfies AnthropicTextBlock\n const media = yield* ProviderShared.validateToolFile(\n \"Anthropic Messages\",\n item,\n new Set<string>(ProviderShared.IMAGE_MIMES),\n )\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: media.mime,\n data: media.base64,\n },\n } satisfies AnthropicImageBlock\n})\n\nconst lowerToolResultContent = Effect.fn(\"AnthropicMessages.lowerToolResultContent\")(function* (part: ToolResultPart) {\n // Text / json / error results stay as a string for backward compatibility\n // with existing cassettes and provider expectations.\n if (part.result.type !== \"content\") return ProviderShared.toolResultText(part)\n // Preserve the narrowed array element type when compiled through a consumer package.\n const content: ReadonlyArray<ToolContent> = part.result.value\n return yield* Effect.forEach(content, lowerToolResultContentItem)\n})\n\n// Mid-conversation system messages are a native Claude API feature only for\n// Opus 4.8. Other Anthropic models intentionally use the same visible wrapped-\n// user fallback as non-Anthropic routes rather than sending a role they reject.\nconst supportsNativeSystemUpdates = (request: LLMRequest) => String(request.model.id) === \"claude-opus-4-8\"\n\nconst endsInServerToolUse = (message: LLMRequest[\"messages\"][number]) => {\n const last = message.content.at(-1)\n return message.role === \"assistant\" && last?.type === \"tool-call\" && last.providerExecuted === true\n}\n\nconst canUseNativeSystemUpdate = (messages: LLMRequest[\"messages\"], index: number) => {\n const previous = messages[index - 1]\n const next = messages[index + 1]\n return (\n previous !== undefined &&\n previous.role !== \"system\" &&\n (previous.role === \"user\" || previous.role === \"tool\" || endsInServerToolUse(previous)) &&\n next?.role !== \"system\" &&\n (next === undefined || next.role === \"assistant\")\n )\n}\n\nconst splitsLocalToolResults = (messages: LLMRequest[\"messages\"], index: number) => {\n const pending = new Set<string>()\n for (const message of messages.slice(0, index)) {\n for (const part of message.content) {\n if (message.role === \"assistant\" && part.type === \"tool-call\" && part.providerExecuted !== true)\n pending.add(part.id)\n if (message.role === \"tool\" && part.type === \"tool-result\") pending.delete(part.id)\n }\n }\n return pending.size > 0\n}\n\nconst lowerNativeSystemUpdate = Effect.fn(\"AnthropicMessages.lowerNativeSystemUpdate\")(function* (\n message: LLMRequest[\"messages\"][number],\n breakpoints: Cache.Breakpoints,\n) {\n const content = yield* ProviderShared.systemUpdateText(\"Anthropic Messages\", message)\n return {\n role: \"system\" as const,\n content: content.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n })),\n }\n})\n\nconst lowerMessages = Effect.fn(\"AnthropicMessages.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: Cache.Breakpoints,\n) {\n const messages: AnthropicMessage[] = []\n\n for (const [index, message] of request.messages.entries()) {\n if (message.role === \"system\") {\n if (splitsLocalToolResults(request.messages, index))\n return yield* invalid(\"Anthropic Messages system updates cannot split a local tool call from its tool result\")\n if (supportsNativeSystemUpdates(request) && canUseNativeSystemUpdate(request.messages, index)) {\n messages.push(yield* lowerNativeSystemUpdate(message, breakpoints))\n continue\n }\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Anthropic Messages\", message)\n const block = { type: \"text\" as const, text: part.text, cache_control: cacheControl(breakpoints, part.cache) }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, block] }\n else messages.push({ role: \"user\", content: [block] })\n continue\n }\n\n if (message.role === \"user\") {\n const content: AnthropicUserBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerImage(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"user\", [\"text\", \"media\"])\n }\n messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: AnthropicAssistantBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"reasoning\") {\n content.push({\n type: \"thinking\",\n thinking: part.text,\n signature: part.encrypted ?? signatureFromMetadata(part.providerMetadata),\n })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(part.providerExecuted ? lowerServerToolCall(part) : lowerToolCall(part))\n continue\n }\n if (part.type === \"tool-result\" && part.providerExecuted) {\n content.push(yield* lowerServerToolResult(part))\n continue\n }\n return yield* invalid(\n `Anthropic Messages assistant messages only support text, reasoning, and tool-call content for now`,\n )\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: AnthropicToolResultBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"tool\", [\"tool-result\"])\n content.push({\n type: \"tool_result\",\n tool_use_id: part.id,\n content: yield* lowerToolResultContent(part),\n is_error: part.result.type === \"error\" ? true : undefined,\n cache_control: cacheControl(breakpoints, part.cache),\n })\n }\n messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\nconst anthropicOptions = (request: LLMRequest) => request.providerOptions?.anthropic\n\nconst lowerThinking = Effect.fn(\"AnthropicMessages.lowerThinking\")(function* (request: LLMRequest) {\n const thinking = anthropicOptions(request)?.thinking\n if (!ProviderShared.isRecord(thinking)) return undefined\n if (thinking.type === \"adaptive\") {\n const display =\n thinking.display === \"summarized\"\n ? (\"summarized\" as const)\n : thinking.display === \"omitted\"\n ? (\"omitted\" as const)\n : undefined\n return { type: \"adaptive\" as const, ...(display === undefined ? {} : { display }) }\n }\n if (thinking.type === \"disabled\") return { type: \"disabled\" as const }\n if (thinking.type !== \"enabled\") return undefined\n const budget =\n typeof thinking.budgetTokens === \"number\"\n ? thinking.budgetTokens\n : typeof thinking.budget_tokens === \"number\"\n ? thinking.budget_tokens\n : undefined\n if (budget === undefined) return yield* invalid(\"Anthropic thinking provider option requires budgetTokens\")\n return { type: \"enabled\" as const, budget_tokens: budget }\n})\n\nconst outputConfig = (request: LLMRequest) => {\n const effort = anthropicOptions(request)?.effort\n return typeof effort === \"string\" ? { effort } : undefined\n}\n\nconst fromRequest = Effect.fn(\"AnthropicMessages.fromRequest\")(function* (request: LLMRequest) {\n const toolChoice = request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const outputLimit = request.model.defaults?.limits?.output ?? request.model.route.defaults.limits?.output ?? 4096\n // Allocate the 4-breakpoint budget in invalidation order: tools → system →\n // messages. Tools live highest in the cache hierarchy, so when callers\n // over-mark we keep their tool hints and shed the message-tail ones first.\n const breakpoints = Cache.newBreakpoints(ANTHROPIC_BREAKPOINT_CAP)\n const tools =\n request.tools.length === 0 || request.toolChoice?.type === \"none\"\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(\n breakpoints,\n tool,\n ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility),\n ),\n )\n const system =\n request.system.length === 0\n ? undefined\n : request.system.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n }))\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Anthropic Messages: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${ANTHROPIC_BREAKPOINT_CAP} per request.`,\n )\n }\n return {\n model: request.model.id,\n system,\n messages,\n tools,\n tool_choice: toolChoice,\n stream: true as const,\n max_tokens: generation?.maxTokens ?? outputLimit,\n temperature: generation?.temperature,\n top_p: generation?.topP,\n top_k: generation?.topK,\n stop_sequences: generation?.stop,\n thinking: yield* lowerThinking(request),\n output_config: outputConfig(request),\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\" || reason === \"pause_turn\") return \"stop\"\n if (reason === \"max_tokens\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"refusal\") return \"content-filter\"\n return \"unknown\"\n}\n\n// Anthropic reports the non-overlapping breakdown natively — its\n// `input_tokens` is the *non-cached* count per the Messages API docs, with\n// cache reads and writes as separate fields. We sum them to derive the\n// inclusive `inputTokens` the rest of the contract expects. Extended\n// thinking tokens are *not* broken out by Anthropic — they're billed as\n// part of `output_tokens`, so `reasoningTokens` stays `undefined` and\n// `outputTokens` carries the combined total.\nconst mapUsage = (usage: AnthropicUsage | undefined): Usage | undefined => {\n if (!usage) return undefined\n const nonCached = usage.input_tokens\n const cacheRead = usage.cache_read_input_tokens ?? undefined\n const cacheWrite = usage.cache_creation_input_tokens ?? undefined\n const inputTokens = ProviderShared.sumTokens(nonCached, cacheRead, cacheWrite)\n return new Usage({\n inputTokens,\n outputTokens: usage.output_tokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cacheRead,\n cacheWriteInputTokens: cacheWrite,\n totalTokens: ProviderShared.totalTokens(inputTokens, usage.output_tokens, undefined),\n providerMetadata: { anthropic: usage },\n })\n}\n\n// Anthropic emits usage on `message_start` and again on `message_delta` — the\n// final delta carries the authoritative totals. Right-biased merge: each\n// field prefers `right` when defined, falls back to `left`. `inputTokens` is\n// recomputed from the merged breakdown so the inclusive total stays\n// consistent with `nonCached + cacheRead + cacheWrite`.\nconst mergeUsage = (left: Usage | undefined, right: Usage | undefined) => {\n if (!left) return right\n if (!right) return left\n const nonCachedInputTokens = right.nonCachedInputTokens ?? left.nonCachedInputTokens\n const cacheReadInputTokens = right.cacheReadInputTokens ?? left.cacheReadInputTokens\n const cacheWriteInputTokens = right.cacheWriteInputTokens ?? left.cacheWriteInputTokens\n const inputTokens = ProviderShared.sumTokens(nonCachedInputTokens, cacheReadInputTokens, cacheWriteInputTokens)\n const outputTokens = right.outputTokens ?? left.outputTokens\n return new Usage({\n inputTokens,\n outputTokens,\n nonCachedInputTokens,\n cacheReadInputTokens,\n cacheWriteInputTokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, outputTokens, undefined),\n providerMetadata: {\n anthropic: {\n ...left.providerMetadata?.[\"anthropic\"],\n ...right.providerMetadata?.[\"anthropic\"],\n },\n },\n })\n}\n\n// Server tool result blocks come whole in `content_block_start` (no streaming\n// delta sequence). We convert the payload to a `tool-result` event with\n// `providerExecuted: true`. The runtime appends it to the assistant message\n// for round-trip; downstream consumers can inspect `result.value` for the\n// structured payload.\nconst SERVER_TOOL_RESULT_NAMES: Record<AnthropicServerToolResultType, string> = {\n web_search_tool_result: \"web_search\",\n code_execution_tool_result: \"code_execution\",\n web_fetch_tool_result: \"web_fetch\",\n}\n\nconst isServerToolResultType = (type: string): type is AnthropicServerToolResultType => type in SERVER_TOOL_RESULT_NAMES\n\nconst serverToolResultEvent = (block: NonNullable<AnthropicEvent[\"content_block\"]>): LLMEvent | undefined => {\n if (!block.type || !isServerToolResultType(block.type)) return undefined\n const errorPayload =\n typeof block.content === \"object\" && block.content !== null && \"type\" in block.content\n ? String((block.content as Record<string, unknown>).type)\n : \"\"\n const isError = errorPayload.endsWith(\"_tool_result_error\")\n return LLMEvent.toolResult({\n id: block.tool_use_id ?? \"\",\n name: SERVER_TOOL_RESULT_NAMES[block.type],\n result: isError ? { type: \"error\", value: block.content } : { type: \"json\", value: block.content },\n providerExecuted: true,\n providerMetadata: anthropicMetadata({ blockType: block.type }),\n })\n}\n\ntype StepResult = readonly [ParserState, ReadonlyArray<LLMEvent>]\n\nconst NO_EVENTS: StepResult[\"1\"] = []\n\nconst onMessageStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mapUsage(event.message?.usage)\n return [usage ? { ...state, usage: mergeUsage(state.usage, usage) } : state, NO_EVENTS]\n}\n\nconst onContentBlockStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const block = event.content_block\n if (!block) return [state, NO_EVENTS]\n\n if ((block.type === \"tool_use\" || block.type === \"server_tool_use\") && event.index !== undefined) {\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, event.index, {\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n providerExecuted: block.type === \"server_tool_use\",\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n providerExecuted: block.type === \"server_tool_use\" ? true : undefined,\n }),\n ],\n ]\n }\n\n if (block.type === \"text\" && block.text) {\n const events: LLMEvent[] = []\n return [\n { ...state, lifecycle: Lifecycle.textDelta(state.lifecycle, events, `text-${event.index ?? 0}`, block.text) },\n events,\n ]\n }\n\n if (block.type === \"thinking\" && block.thinking) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${event.index ?? 0}`, block.thinking),\n },\n events,\n ]\n }\n\n const result = serverToolResultEvent(block)\n if (!result) return [state, NO_EVENTS]\n const events: LLMEvent[] = []\n return [{ ...state, lifecycle: Lifecycle.stepStart(state.lifecycle, events) }, [...events, result]]\n}\n\nconst onContentBlockDelta = Effect.fn(\"AnthropicMessages.onContentBlockDelta\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n const delta = event.delta\n\n if (delta?.type === \"text_delta\" && delta.text) {\n const events: LLMEvent[] = []\n return [\n { ...state, lifecycle: Lifecycle.textDelta(state.lifecycle, events, `text-${event.index ?? 0}`, delta.text) },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"thinking_delta\" && delta.thinking) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${event.index ?? 0}`, delta.thinking),\n },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"signature_delta\" && delta.signature) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningEnd(\n state.lifecycle,\n events,\n `reasoning-${event.index ?? 0}`,\n anthropicMetadata({ signature: delta.signature }),\n ),\n },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"input_json_delta\" && event.index !== undefined) {\n if (!delta.partial_json) return [state, NO_EVENTS] satisfies StepResult\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n event.index,\n delta.partial_json,\n \"Anthropic Messages tool argument delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] satisfies StepResult\n }\n\n return [state, NO_EVENTS] satisfies StepResult\n})\n\nconst onContentBlockStop = Effect.fn(\"AnthropicMessages.onContentBlockStop\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n if (event.index === undefined) return [state, NO_EVENTS] satisfies StepResult\n const result = yield* ToolStream.finish(ADAPTER, state.tools, event.index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${event.index}`),\n events,\n `reasoning-${event.index}`,\n )\n events.push(...resultEvents)\n return [{ ...state, lifecycle, tools: result.tools }, events] satisfies StepResult\n})\n\nconst onMessageDelta = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mergeUsage(state.usage, mapUsage(event.usage))\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.finish(state.lifecycle, events, {\n reason: mapFinishReason(event.delta?.stop_reason),\n usage,\n providerMetadata: event.delta?.stop_sequence\n ? anthropicMetadata({ stopSequence: event.delta.stop_sequence })\n : undefined,\n })\n return [{ ...state, lifecycle, usage }, events]\n}\n\n// Prefix `error.type` so overloads, rate limits, and quota errors are visible\n// even when the provider message is generic or empty.\nconst providerErrorMessage = (event: AnthropicEvent): string => {\n const type = event.error?.type\n const message = event.error?.message\n if (type && message) return `${type}: ${message}`\n return message || type || \"Anthropic Messages stream error\"\n}\n\nconst onError = (event: AnthropicEvent) =>\n new LLMError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({ message: providerErrorMessage(event), code: event.error?.type }),\n })\n\nconst step = (state: ParserState, event: AnthropicEvent) => {\n if (event.type === \"message_start\") return Effect.succeed(onMessageStart(state, event))\n if (event.type === \"content_block_start\") return Effect.succeed(onContentBlockStart(state, event))\n if (event.type === \"content_block_delta\") return onContentBlockDelta(state, event)\n if (event.type === \"content_block_stop\") return onContentBlockStop(state, event)\n if (event.type === \"message_delta\") return Effect.succeed(onMessageDelta(state, event))\n if (event.type === \"error\") return onError(event)\n return Effect.succeed<StepResult>([state, NO_EVENTS])\n}\n\n// =============================================================================\n// Protocol And Anthropic Route\n// =============================================================================\n/**\n * The Anthropic Messages protocol — request body construction, body schema,\n * and the streaming-event state machine. Used by native Anthropic Cloud and\n * (once registered) Vertex Anthropic / Bedrock-hosted Anthropic passthrough.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: AnthropicMessagesBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(AnthropicEvent),\n initial: () => ({ tools: ToolStream.empty<number>(), lifecycle: Lifecycle.initial() }),\n step,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"anthropic\",\n providerMetadataKey: \"anthropic\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n framing: Framing.sse,\n headers: () => ({ \"anthropic-version\": \"2023-06-01\" }),\n})\n\nexport * as AnthropicMessages from \"./anthropic-messages\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "6373C3B53F70A55D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+9BAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAgB,OAC3E,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH", | ||
| "debugId": "E0067C4DDA2F6F8B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "91CD5C44201FCA4264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "81F99A2EFE309D3064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E0474FCDFADBEF1364756E2164756E21", | ||
| "names": [] | ||
| } |
+1
-1
| { | ||
| "name": "@opencode-ai/cli-linux-arm64", | ||
| "version": "0.0.0-next-15840", | ||
| "version": "0.0.0-next-15847", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "repository": { |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/frontend/actions.ts", "../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/semantics.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "import { tmpdir } from \"node:os\"\nimport { extname, join, resolve } from \"node:path\"\nimport type { CliRenderer, Renderable } from \"@opentui/core\"\nimport {\n createMockKeys,\n createMockMouse,\n KeyCodes,\n type KeyInput,\n type MockInput,\n type MockMouse,\n} from \"@opentui/core/testing\"\nimport { Config, Effect, FileSystem, Schema } from \"effect\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationSemantics } from \"./semantics\"\n\nexport type Action = SimulationProtocol.Frontend.Action\nexport type Element = SimulationProtocol.Frontend.Element\n\nexport interface Harness {\n readonly renderer: CliRenderer\n readonly mockInput: MockInput\n readonly mockMouse: MockMouse\n readonly resize: (cols: number, rows: number) => void\n readonly renderOnce: () => Promise<void>\n readonly screen: () => string\n}\n\ntype RenderBuffer = {\n readonly width: number\n readonly height: number\n getRealCharBytes(includeAnsi?: boolean): Uint8Array\n}\n\nconst decoder = new TextDecoder()\n\nfunction isKeyCode(key: string): key is keyof typeof KeyCodes {\n return Object.hasOwn(KeyCodes, key)\n}\n\nfunction keyInput(key: string): KeyInput {\n const named = key.toUpperCase()\n return isKeyCode(named) ? named : key\n}\n\nfunction children(renderable: Renderable) {\n return renderable.getChildren().filter((child): child is Renderable => \"num\" in child)\n}\n\nfunction all(renderable: Renderable): Renderable[] {\n return [renderable, ...children(renderable).flatMap(all)]\n}\n\nfunction mouseListeners(renderable: Renderable) {\n const general = Reflect.get(renderable, \"_mouseListener\")\n const specific = Reflect.get(renderable, \"_mouseListeners\")\n return Boolean(general) || (specific && typeof specific === \"object\" && Object.keys(specific).length > 0)\n}\n\nfunction hit(renderer: CliRenderer, renderable: Renderable) {\n if (renderable.width <= 0 || renderable.height <= 0) return false\n const x = Math.floor(renderable.screenX + renderable.width / 2)\n const y = Math.floor(renderable.screenY + renderable.height / 2)\n const target = renderer.hitTest(x, y)\n return all(renderable).some((item) => item.num === target)\n}\n\n/**\n * Builds the harness the simulation server drives.\n *\n * When the renderer is the headless simulation renderer, its TestRendererSetup\n * provides the supported testing APIs. For the visible terminal renderer the\n * harness falls back to `requestRender` + `idle` and reading the private\n * `currentRenderBuffer`.\n */\nexport function createHarness(renderer: CliRenderer): Harness {\n const setup = SimulationRenderer.setupFor(renderer)\n return {\n renderer,\n mockInput: setup?.mockInput ?? createMockKeys(renderer),\n mockMouse: setup?.mockMouse ?? createMockMouse(renderer),\n resize: setup?.resize ?? ((cols, rows) => renderer.resize(cols, rows)),\n renderOnce:\n setup?.renderOnce ??\n (async () => {\n renderer.requestRender()\n await renderer.idle()\n }),\n // captureCharFrame follows the test renderer's output sink. Recording\n // redirects that sink to the timeline, so read the live render buffer\n // instead; it is also the source used by screenshots.\n screen: () => decoder.decode((Reflect.get(renderer, \"currentRenderBuffer\") as RenderBuffer).getRealCharBytes()),\n }\n}\n\nexport function elements(renderer: CliRenderer): Element[] {\n return all(renderer.root)\n .filter((renderable) => renderable.visible && !renderable.isDestroyed)\n .map((renderable) => {\n const clickable = mouseListeners(renderable) && hit(renderer, renderable)\n return {\n id: renderable.id,\n num: renderable.num,\n x: renderable.screenX,\n y: renderable.screenY,\n width: renderable.width,\n height: renderable.height,\n focusable: renderable.focusable,\n focused: renderable.focused,\n clickable,\n editor: renderer.currentFocusedEditor === renderable,\n } satisfies Element\n })\n .filter((element) => element.focusable || element.clickable || element.editor)\n}\n\nexport function state(harness: Harness) {\n return {\n focused: {\n renderable: harness.renderer.currentFocusedRenderable?.num,\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function snapshot(harness: Harness): SimulationProtocol.Frontend.SemanticSnapshot {\n const ids = new Set<string>()\n const visit = (renderable: Renderable, parent?: string): SimulationProtocol.Frontend.SemanticNode[] => {\n if (!renderable.visible || renderable.isDestroyed) return []\n const definition = SimulationSemantics.read(renderable)?.()\n if (definition && ids.has(renderable.id)) throw new Error(`duplicate semantic UI id: ${renderable.id}`)\n if (definition) ids.add(renderable.id)\n const node = definition\n ? [{ id: renderable.id, ...definition, ...(parent === undefined ? {} : { parent }), element: renderable.num }]\n : []\n const ancestor = definition ? renderable.id : parent\n return [...node, ...children(renderable).flatMap((child) => visit(child, ancestor))]\n }\n return Schema.decodeUnknownSync(SimulationProtocol.Frontend.SemanticSnapshot)({\n format: \"opencode-ui-snapshot-v1\",\n nodes: visit(harness.renderer.root),\n })\n}\n\nexport function matches(harness: Pick<Harness, \"screen\">, text: string) {\n return harness.screen().includes(text)\n}\n\nexport const capture = Effect.fn(\"SimulationActions.capture\")(function* (harness: Harness) {\n yield* Effect.tryPromise(() => harness.renderOnce())\n const buffer = harness.renderer.currentRenderBuffer\n return {\n cols: buffer.width,\n rows: buffer.height,\n cursor: [0, 0] as const,\n lines: buffer.getSpanLines().map((line) => ({\n spans: line.spans.map((span) => ({\n text: span.text,\n fg: span.fg.toInts(),\n bg: span.bg.toInts(),\n attributes: span.attributes,\n width: span.width,\n })),\n })),\n } satisfies SimulationProtocol.Frontend.CapturedFrame\n})\n\nexport const screenshot = Effect.fn(\"SimulationActions.screenshot\")(function* (harness: Harness, name?: string) {\n const filename = name ?? `screenshot-${crypto.randomUUID()}`\n if (!filename || filename.includes(\"/\") || filename.includes(\"\\\\\") || extname(filename))\n return yield* Effect.fail(new Error(\"screenshot name must not contain a path or extension\"))\n yield* Effect.tryPromise(() => harness.renderOnce())\n const { SimulationPng } = yield* Effect.promise(() => import(\"./png\"))\n const image = SimulationPng.screenshot(harness.renderer)\n const directory = resolve(\n yield* Config.string(\"OPENCODE_DRIVE_MEDIA_DIR\").pipe(\n Config.withDefault(join(tmpdir(), \"opencode-drive\", \"output\")),\n ),\n )\n const fs = yield* FileSystem.FileSystem\n yield* fs.makeDirectory(directory, { recursive: true })\n const path = join(directory, `${filename}.png`)\n yield* fs.writeFile(path, image.data)\n return path\n})\n\nexport const execute = Effect.fn(\"SimulationActions.execute\")(function* (harness: Harness, action: Action) {\n switch (action.type) {\n case \"ui.type\":\n yield* Effect.tryPromise(() => harness.mockInput.typeText(action.text))\n break\n case \"ui.press\":\n harness.mockInput.pressKey(keyInput(action.key), action.modifiers)\n break\n case \"ui.enter\":\n harness.mockInput.pressEnter()\n break\n case \"ui.arrow\":\n harness.mockInput.pressArrow(action.direction)\n break\n case \"ui.focus\":\n all(harness.renderer.root)\n .find((item) => item.num === action.target)\n ?.focus()\n break\n case \"ui.click\": {\n const target = all(harness.renderer.root).find((item) => item.num === action.target)\n if (!target || !target.visible || target.isDestroyed)\n return yield* Effect.fail(new Error(`click target is stale or unavailable: ${action.target}`))\n if (action.semantic) {\n const current = snapshot(harness).nodes.find((node) => node.element === action.target)\n if (\n current?.id !== action.semantic.id ||\n current.instance !== action.semantic.instance ||\n current.element !== action.semantic.element\n )\n return yield* Effect.fail(new Error(`semantic click target is stale or unavailable: ${action.semantic.id}`))\n }\n if (\n !Number.isFinite(action.x) ||\n action.x < 0 ||\n action.x >= target.width ||\n !Number.isFinite(action.y) ||\n action.y < 0 ||\n action.y >= target.height\n )\n return yield* Effect.fail(new Error(\"click position must be within the target element\"))\n yield* Effect.tryPromise(() => harness.mockMouse.click(target.screenX + action.x, target.screenY + action.y))\n break\n }\n case \"ui.resize\":\n if (\n !Number.isSafeInteger(action.cols) ||\n action.cols <= 0 ||\n !Number.isSafeInteger(action.rows) ||\n action.rows <= 0\n ) {\n return yield* Effect.fail(new Error(\"resize cols and rows must be positive integers\"))\n }\n harness.resize(action.cols, action.rows)\n SimulationRenderer.recordResize(harness.renderer, action.cols, action.rows)\n break\n }\n yield* Effect.tryPromise(() => harness.renderOnce())\n return state(harness)\n})\n\nexport * as SimulationActions from \"./actions\"\n", | ||
| "import { createWriteStream, type WriteStream } from \"node:fs\"\nimport { mkdir } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { Writable } from \"node:stream\"\nimport { finished } from \"node:stream/promises\"\nimport { Schema } from \"effect\"\n\nexport const Header = Schema.Struct({\n type: Schema.Literal(\"header\"),\n version: Schema.Literal(1),\n cols: Schema.Number,\n rows: Schema.Number,\n encoding: Schema.Literal(\"base64\"),\n})\nexport interface Header extends Schema.Schema.Type<typeof Header> {}\n\nexport const Output = Schema.Struct({\n type: Schema.Literal(\"output\"),\n at_ms: Schema.Number,\n data: Schema.String,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n\nexport const Resize = Schema.Struct({\n type: Schema.Literal(\"resize\"),\n at_ms: Schema.Number,\n cols: Schema.Number,\n rows: Schema.Number,\n})\nexport interface Resize extends Schema.Schema.Type<typeof Resize> {}\n\nexport const Event = Schema.Union([Header, Output, Resize])\nexport type Event = Schema.Schema.Type<typeof Event>\n\nexport class Timeline extends Writable {\n readonly isTTY = true\n readonly path: string\n readonly columns: number\n readonly rows: number\n private readonly output: WriteStream\n private readonly started = performance.now()\n private readonly timestamps: number[] = []\n private done?: Promise<string>\n\n private constructor(path: string, cols: number, rows: number, output: WriteStream) {\n super()\n this.path = path\n this.columns = cols\n this.rows = rows\n this.output = output\n // finish() reports stream failures; keep Writable from also throwing them process-wide.\n this.on(\"error\", () => {})\n output.on(\"error\", (error) => this.destroy(error))\n }\n\n static async create(path: string, cols: number, rows: number) {\n await mkdir(dirname(path), { recursive: true })\n const output = createWriteStream(path)\n const timeline = new Timeline(path, cols, rows, output)\n await new Promise<void>((resolve, reject) => {\n output.write(\n `${JSON.stringify({ type: \"header\", version: 1, cols, rows, encoding: \"base64\" } satisfies Header)}\\n`,\n (error) => (error ? reject(error) : resolve()),\n )\n })\n return timeline\n }\n\n getColorDepth() {\n return 24\n }\n\n override write(chunk: unknown, callback?: (error?: Error | null) => void): boolean\n override write(chunk: unknown, encoding: BufferEncoding, callback?: (error?: Error | null) => void): boolean\n override write(\n chunk: unknown,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ) {\n if (!this.writableEnded) {\n this.timestamps.push(this.elapsed())\n if (typeof encoding === \"function\") return super.write(chunk, encoding)\n if (encoding === undefined) return super.write(chunk, callback)\n return super.write(chunk, encoding, callback)\n }\n const done = typeof encoding === \"function\" ? encoding : callback\n queueMicrotask(() => done?.(null))\n return true\n }\n\n override _write(chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void) {\n this.writeOutput(chunk, this.timestamps.shift() ?? this.elapsed(), callback)\n }\n\n override _final(callback: (error?: Error | null) => void) {\n this.writeOutput(Buffer.alloc(0), this.elapsed(), (error) => {\n if (error) return callback(error)\n this.output.end(callback)\n })\n }\n\n finish() {\n if (this.done) return this.done\n this.end()\n this.done = finished(this).then(() => this.path)\n return this.done\n }\n\n resize(cols: number, rows: number) {\n if (this.writableEnded) return\n const event = { type: \"resize\", at_ms: this.elapsed(), cols, rows } satisfies Resize\n this.output.write(`${JSON.stringify(event)}\\n`)\n }\n\n private elapsed() {\n return Math.max(0, Math.round(performance.now() - this.started))\n }\n\n private writeOutput(data: Buffer, at_ms: number, callback: (error?: Error | null) => void) {\n const event = {\n type: \"output\",\n at_ms,\n data: data.toString(\"base64\"),\n } satisfies Output\n this.output.write(`${JSON.stringify(event)}\\n`, callback)\n }\n}\n\nexport * as SimulationRecording from \"./recording\"\n", | ||
| "import type { CliRenderer, CliRendererConfig } from \"@opentui/core\"\nimport { createTestRenderer, type TestRendererSetup } from \"@opentui/core/testing\"\nimport { Effect } from \"effect\"\nimport { Timeline } from \"../recording\"\n\nconst setups = new WeakMap<CliRenderer, TestRendererSetup>()\nconst recordings = new WeakMap<CliRenderer, Timeline>()\n\n/**\n * Creates a headless renderer with optional recording: a real CliRenderer\n * backed by an in-memory screen buffer. The TestRendererSetup is kept\n * module-side so the harness can use supported testing APIs without app\n * code carrying it around.\n */\nexport interface Viewport {\n readonly cols: number\n readonly rows: number\n}\n\nexport const create = Effect.fn(\"SimulationRenderer.create\")(function* (\n options: CliRendererConfig,\n path?: string,\n viewport?: Viewport,\n) {\n const cols = viewport?.cols ?? 100\n const rows = viewport?.rows ?? 40\n const recording = path\n ? yield* Effect.acquireRelease(\n Effect.tryPromise(() => Timeline.create(path, cols, rows)),\n (recording) =>\n Effect.tryPromise(() => recording.finish()).pipe(\n Effect.catch((error) =>\n Effect.sync(() => process.stderr.write(`Failed to finish UI recording: ${error}\\n`)),\n ),\n ),\n )\n : undefined\n const setup = yield* Effect.acquireRelease(\n Effect.tryPromise(() =>\n createTestRenderer({\n ...options,\n width: cols,\n height: rows,\n ...(recording\n ? {\n stdout: recording as unknown as NodeJS.WriteStream,\n bufferedOutput: \"stdout\" as const,\n }\n : {}),\n }),\n ),\n (setup) =>\n Effect.sync(() => {\n if (!setup.renderer.isDestroyed) setup.renderer.destroy()\n }),\n )\n setups.set(setup.renderer, setup)\n if (recording) recordings.set(setup.renderer, recording)\n return setup.renderer\n})\n\nexport function recordResize(renderer: CliRenderer, cols: number, rows: number) {\n recordings.get(renderer)?.resize(cols, rows)\n}\n\nexport function setupFor(renderer: CliRenderer): TestRendererSetup | undefined {\n return setups.get(renderer)\n}\n\nexport function finish(renderer: CliRenderer) {\n const recording = recordings.get(renderer)\n if (!recording) return Effect.fail(new Error(\"UI recording is not available\"))\n return Effect.tryPromise(() => recording.finish())\n}\n\nexport * as SimulationRenderer from \"./renderer\"\n", | ||
| "import type { Renderable } from \"@opentui/core\"\nimport type { SimulationProtocol } from \"../protocol\"\n\n// Semantic renderables set an explicit stable OpenTUI id so ui.state and\n// ui.snapshot expose the same identity. Hierarchy and element handles come\n// from the live render tree.\nexport type Definition = Omit<SimulationProtocol.Frontend.SemanticNode, \"id\" | \"element\" | \"parent\">\n\nconst key = Symbol.for(\"opencode.simulation.semantics\")\n\nconst bind = (definition: () => Definition) => (renderable: Renderable) => {\n Object.defineProperty(renderable, key, { value: definition, configurable: true })\n}\n\nexport const read = (renderable: Renderable) => {\n const definition: unknown = Reflect.get(renderable, key)\n return typeof definition === \"function\" ? (definition as () => Definition) : undefined\n}\n\nexport const SimulationSemantics = { bind, read }\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationActions, type Harness } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\n\nfunction handle(harness: Harness, request: SimulationProtocol.Frontend.Request) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.screenshot\":\n return SimulationActions.screenshot(harness, request.params?.name)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.snapshot\":\n return Effect.sync(() => SimulationActions.snapshot(harness))\n case \"ui.matches\":\n return Effect.sync(() => SimulationActions.matches(harness, request.params.text))\n case \"ui.recording.finish\":\n return SimulationRenderer.finish(harness.renderer)\n case \"ui.type\":\n return SimulationActions.execute(harness, { type: \"ui.type\", text: request.params.text })\n case \"ui.enter\":\n return SimulationActions.execute(harness, { type: \"ui.enter\" })\n case \"ui.press\":\n return SimulationActions.execute(harness, {\n type: \"ui.press\",\n key: request.params.key,\n modifiers: request.params.modifiers,\n })\n case \"ui.arrow\":\n return SimulationActions.execute(harness, { type: \"ui.arrow\", direction: request.params.direction })\n case \"ui.focus\":\n return SimulationActions.execute(harness, { type: \"ui.focus\", target: request.params.target })\n case \"ui.click\":\n return SimulationActions.execute(harness, {\n type: \"ui.click\",\n target: request.params.target,\n x: request.params.x,\n y: request.params.y,\n semantic: request.params.semantic,\n })\n case \"ui.resize\":\n return SimulationActions.execute(harness, {\n type: \"ui.resize\",\n cols: request.params.cols,\n rows: request.params.rows,\n })\n }\n}\n\nexport const start = Effect.fn(\"SimulationServer.start\")(function* (harness: Harness, endpoint: string) {\n return yield* SimulationControlServer.start({\n endpoint,\n label: \"opencode drive ui websocket\",\n data: () => ({ drive: true as const }),\n decode: SimulationProtocol.Frontend.decodeRequestEffect,\n handle: (_socket, request) => handle(harness, request),\n })\n})\n\nexport * as SimulationServer from \"./server\"\n", | ||
| "import { createCliRenderer, type CliRendererConfig } from \"@opentui/core\"\nimport { Config, Effect } from \"effect\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationActions } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationServer } from \"./server\"\n\n/** Drive-mode renderer and control-server acquisition. */\nexport const create = Effect.fn(\"Drive.create\")(function* (options: CliRendererConfig) {\n const headless = (yield* Config.string(\"OPENCODE_DRIVE_RENDERER\").pipe(Config.withDefault(\"visible\"))) === \"headless\"\n const manifest = yield* DriveManifest.resolve()\n const renderer = headless\n ? yield* SimulationRenderer.create(options, manifest.recording?.timeline, manifest.viewport)\n : yield* Effect.acquireRelease(\n Effect.tryPromise(() => createCliRenderer(options)),\n (renderer) =>\n Effect.sync(() => {\n if (!renderer.isDestroyed) renderer.destroy()\n }),\n )\n if (!headless && manifest.viewport) renderer.resize(manifest.viewport.cols, manifest.viewport.rows)\n const server = yield* SimulationServer.start(SimulationActions.createHarness(renderer), manifest.endpoints.ui)\n yield* Effect.sync(() => process.stderr.write(`opencode drive ui websocket: ${server.url}\\n`))\n return renderer\n})\n\nexport * as Drive from \"./simulation\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "CC64734843CBF5CE64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,OAAO,CAC9C,QAAQ,OAAO,MAAM,gBAAkB,EAAM,CAAG,EAChD,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC1F,MAAO,EAAQ,IAAM,EAAO,YAAY,UAAU,IAAI,CAAE,IAAK,EAAM,IAAK,UAAS,CAAC,CAAC,EACnF,IAAM,EAAgB,EAAM,IAAI,QAAQ,OAAQ,EAAE,EAC5C,EAAU,MAAO,EAAQ,IAC7B,EAAO,YAAY,QAAQ,QAAQ,CAAE,gBAAe,SAAU,QAAS,UAAS,CAAC,CACnF,EACA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,UAAW,EAAQ,KAAK,UAAW,UAAS,CAAC,CAClG,EAAE,KAAK,EAAO,MAAM,CACtB,EAEA,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAe,EAAQ,KAAK,SAAS,EACxE,GAAI,EAAO,SAAW,SAAU,OAAO,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EACnF,GAAI,EAAO,SAAW,UAAW,OAAO,MAAO,EAAO,KAAS,MAAM,wBAAwB,CAAC,EAC9F,QAAQ,OAAO,MAAM,YAAc,CAAG,EACvC,CACH,EAEM,EAAO,CACX,EACA,EACA,EACA,EAAQ,KAER,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CAAC,EAC/G,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,IAAM,EAAS,EAAS,KAAK,SAAS,KAAK,EAC3C,GAAI,CAAC,GAAS,EAAQ,QAAQ,OAAO,MAAM,EAAS,EAAM,CAAG,EAE7D,OADA,MAAO,EAAO,MAAM,GAAG,EAChB,MAAO,EAAK,EAAQ,EAAe,EAAW,GAAS,CAAC,CAAC,CAAM,EACvE,EAEH,SAAS,CAAU,CAAC,EAAwB,CAC1C,OAAO,EAAO,WAAW,CAAE,IAAK,EAAM,MAAO,CAAC,IAAU,CAAM,CAAC", | ||
| "debugId": "589492F6965D34DC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzE,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,oBAAsB,CAAG,EAC9C,OAEF,QAAQ,OAAO,MAAM,EAAQ,IAAI,CAAC,IAAW,EAAO,EAAE,EAAE,KAAK,CAAG,EAAI,CAAG,EACxE,CACH", | ||
| "debugId": "9FA00D09A102DFA664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/anthropic-messages.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMError,\n LLMEvent,\n Usage,\n type CacheHint,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type ToolCallPart,\n type ToolDefinition,\n type ToolContent,\n type ToolResultPart,\n} from \"../schema\"\nimport { JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared\"\nimport { classifyProviderFailure } from \"../provider-error\"\nimport * as Cache from \"./utils/cache\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\nimport { ToolStream } from \"./utils/tool-stream\"\n\nconst ADAPTER = \"anthropic-messages\"\nexport const DEFAULT_BASE_URL = \"https://api.anthropic.com/v1\"\nexport const PATH = \"/messages\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst AnthropicCacheControl = Schema.Struct({\n type: Schema.tag(\"ephemeral\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n})\n\nconst AnthropicTextBlock = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTextBlock = Schema.Schema.Type<typeof AnthropicTextBlock>\n\nconst AnthropicImageBlock = Schema.Struct({\n type: Schema.tag(\"image\"),\n source: Schema.Struct({\n type: Schema.tag(\"base64\"),\n media_type: Schema.String,\n data: Schema.String,\n }),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicImageBlock = Schema.Schema.Type<typeof AnthropicImageBlock>\n\nconst AnthropicThinkingBlock = Schema.Struct({\n type: Schema.tag(\"thinking\"),\n thinking: Schema.String,\n signature: Schema.optional(Schema.String),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicToolUseBlock = Schema.Struct({\n type: Schema.tag(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicToolUseBlock = Schema.Schema.Type<typeof AnthropicToolUseBlock>\n\nconst AnthropicServerToolUseBlock = Schema.Struct({\n type: Schema.tag(\"server_tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolUseBlock = Schema.Schema.Type<typeof AnthropicServerToolUseBlock>\n\n// Server tool result blocks: web_search_tool_result, code_execution_tool_result,\n// and web_fetch_tool_result. The provider executes the tool and inlines the\n// structured result into the assistant turn — there is no client tool_result\n// round-trip. We round-trip the structured `content` payload as opaque JSON so\n// the next request can echo it back when continuing the conversation.\nconst AnthropicServerToolResultType = Schema.Literals([\n \"web_search_tool_result\",\n \"code_execution_tool_result\",\n \"web_fetch_tool_result\",\n])\ntype AnthropicServerToolResultType = Schema.Schema.Type<typeof AnthropicServerToolResultType>\n\nconst AnthropicServerToolResultBlock = Schema.Struct({\n type: AnthropicServerToolResultType,\n tool_use_id: Schema.String,\n content: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolResultBlock = Schema.Schema.Type<typeof AnthropicServerToolResultBlock>\n\n// Anthropic accepts either a plain string or an ordered array of text/image\n// blocks inside `tool_result.content`. The array form is required when a tool\n// returns image bytes (screenshot, image search, etc.) so they can be passed\n// to the model as proper image inputs instead of being JSON-stringified into\n// the prompt — which silently inflates context by megabytes and can push the\n// conversation over the model's token limit.\nconst AnthropicToolResultContent = Schema.Union([AnthropicTextBlock, AnthropicImageBlock])\n\nconst AnthropicToolResultBlock = Schema.Struct({\n type: Schema.tag(\"tool_result\"),\n tool_use_id: Schema.String,\n content: Schema.Union([Schema.String, Schema.Array(AnthropicToolResultContent)]),\n is_error: Schema.optional(Schema.Boolean),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicUserBlock = Schema.Union([AnthropicTextBlock, AnthropicImageBlock, AnthropicToolResultBlock])\ntype AnthropicUserBlock = Schema.Schema.Type<typeof AnthropicUserBlock>\nconst AnthropicAssistantBlock = Schema.Union([\n AnthropicTextBlock,\n AnthropicThinkingBlock,\n AnthropicToolUseBlock,\n AnthropicServerToolUseBlock,\n AnthropicServerToolResultBlock,\n])\ntype AnthropicAssistantBlock = Schema.Schema.Type<typeof AnthropicAssistantBlock>\ntype AnthropicToolResultBlock = Schema.Schema.Type<typeof AnthropicToolResultBlock>\n\nconst AnthropicMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(AnthropicUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(AnthropicAssistantBlock) }),\n Schema.Struct({ role: Schema.Literal(\"system\"), content: Schema.Array(AnthropicTextBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype AnthropicMessage = Schema.Schema.Type<typeof AnthropicMessage>\n\nconst AnthropicTool = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n input_schema: JsonObject,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTool = Schema.Schema.Type<typeof AnthropicTool>\n\nconst AnthropicToolChoice = Schema.Union([\n Schema.Struct({ type: Schema.Literals([\"auto\", \"any\"]) }),\n Schema.Struct({ type: Schema.tag(\"tool\"), name: Schema.String }),\n])\n\nconst AnthropicThinking = Schema.Union([\n Schema.Struct({\n type: Schema.tag(\"enabled\"),\n budget_tokens: Schema.Number,\n }),\n Schema.Struct({\n type: Schema.tag(\"adaptive\"),\n display: Schema.optional(Schema.Literals([\"summarized\", \"omitted\"])),\n }),\n Schema.Struct({\n type: Schema.tag(\"disabled\"),\n }),\n])\n\nconst AnthropicOutputConfig = Schema.Struct({\n effort: Schema.optional(Schema.String),\n})\n\nconst AnthropicBodyFields = {\n model: Schema.String,\n system: optionalArray(AnthropicTextBlock),\n messages: Schema.Array(AnthropicMessage),\n tools: optionalArray(AnthropicTool),\n tool_choice: Schema.optional(AnthropicToolChoice),\n stream: Schema.Literal(true),\n max_tokens: Schema.Number,\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n top_k: Schema.optional(Schema.Number),\n stop_sequences: optionalArray(Schema.String),\n thinking: Schema.optional(AnthropicThinking),\n output_config: Schema.optional(AnthropicOutputConfig),\n}\nexport const AnthropicMessagesBody = Schema.Struct(AnthropicBodyFields)\nexport type AnthropicMessagesBody = Schema.Schema.Type<typeof AnthropicMessagesBody>\n\nconst AnthropicUsage = Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n cache_creation_input_tokens: optionalNull(Schema.Number),\n cache_read_input_tokens: optionalNull(Schema.Number),\n})\ntype AnthropicUsage = Schema.Schema.Type<typeof AnthropicUsage>\n\nconst AnthropicStreamBlock = Schema.Struct({\n type: Schema.String,\n id: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Unknown),\n // *_tool_result blocks arrive whole as content_block_start (no streaming\n // delta) with the structured payload in `content` and the originating\n // server_tool_use id in `tool_use_id`.\n tool_use_id: Schema.optional(Schema.String),\n content: Schema.optional(Schema.Unknown),\n})\n\nconst AnthropicStreamDelta = Schema.Struct({\n type: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n partial_json: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n stop_reason: optionalNull(Schema.String),\n stop_sequence: optionalNull(Schema.String),\n})\n\nconst AnthropicEvent = Schema.Struct({\n type: Schema.String,\n index: Schema.optional(Schema.Number),\n message: Schema.optional(Schema.Struct({ usage: Schema.optional(AnthropicUsage) })),\n content_block: Schema.optional(AnthropicStreamBlock),\n delta: Schema.optional(AnthropicStreamDelta),\n usage: Schema.optional(AnthropicUsage),\n // `type` and `message` are both required per Anthropic's spec, but\n // OpenAI-compatible proxies and gateway translations occasionally drop one\n // or the other; mark them optional so a partial payload still parses and\n // the parser can fall back to whichever field is populated.\n error: Schema.optional(\n Schema.Struct({ type: Schema.optional(Schema.String), message: Schema.optional(Schema.String) }),\n ),\n})\ntype AnthropicEvent = Schema.Schema.Type<typeof AnthropicEvent>\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n readonly usage?: Usage\n readonly lifecycle: Lifecycle.State\n}\n\nconst invalid = ProviderShared.invalidRequest\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Anthropic accepts at most 4 explicit cache_control breakpoints per request,\n// across `tools`, `system`, and `messages`. Beyond the cap the API returns a\n// 400 — so the lowering layer counts emitted markers and silently drops any\n// that exceed it.\nconst ANTHROPIC_BREAKPOINT_CAP = 4\n\nconst EPHEMERAL_5M = { type: \"ephemeral\" as const }\nconst EPHEMERAL_1H = { type: \"ephemeral\" as const, ttl: \"1h\" as const }\n\nconst cacheControl = (breakpoints: Cache.Breakpoints, cache: CacheHint | undefined) => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return Cache.ttlBucket(cache.ttlSeconds) === \"1h\" ? EPHEMERAL_1H : EPHEMERAL_5M\n}\n\nconst anthropicMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ anthropic: metadata })\n\nconst signatureFromMetadata = (metadata: ProviderMetadata | undefined): string | undefined => {\n const anthropic = metadata?.anthropic\n if (!ProviderShared.isRecord(anthropic)) return undefined\n return typeof anthropic.signature === \"string\" ? anthropic.signature : undefined\n}\n\nconst lowerTool = (breakpoints: Cache.Breakpoints, tool: ToolDefinition, inputSchema: JsonSchema): AnthropicTool => ({\n name: tool.name,\n description: tool.description,\n input_schema: inputSchema,\n cache_control: cacheControl(breakpoints, tool.cache),\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Anthropic Messages\", toolChoice, {\n auto: () => ({ type: \"auto\" as const }),\n none: () => undefined,\n required: () => ({ type: \"any\" as const }),\n tool: (name) => ({ type: \"tool\" as const, name }),\n })\n\nconst lowerToolCall = (part: ToolCallPart): AnthropicToolUseBlock => ({\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n})\n\nconst lowerServerToolCall = (part: ToolCallPart): AnthropicServerToolUseBlock => ({\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n})\n\n// Server tool result blocks are typed by name. Anthropic ships three today;\n// extend this list when new server tools land. The block content is the\n// structured payload returned by the provider, which we round-trip as-is.\nconst serverToolResultType = (name: string): AnthropicServerToolResultType | undefined => {\n if (name === \"web_search\") return \"web_search_tool_result\"\n if (name === \"code_execution\") return \"code_execution_tool_result\"\n if (name === \"web_fetch\") return \"web_fetch_tool_result\"\n return undefined\n}\n\nconst lowerServerToolResult = Effect.fn(\"AnthropicMessages.lowerServerToolResult\")(function* (part: ToolResultPart) {\n const wireType = serverToolResultType(part.name)\n if (!wireType)\n return yield* invalid(`Anthropic Messages does not know how to round-trip server tool result for ${part.name}`)\n return { type: wireType, tool_use_id: part.id, content: part.result.value } satisfies AnthropicServerToolResultBlock\n})\n\nconst lowerImage = Effect.fn(\"AnthropicMessages.lowerImage\")(function* (part: MediaPart) {\n const media = yield* ProviderShared.validateMedia(\n \"Anthropic Messages\",\n part,\n new Set<string>(ProviderShared.IMAGE_MIMES),\n )\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: media.mime,\n data: media.base64,\n },\n } satisfies AnthropicImageBlock\n})\n\n// Tool results may carry structured text/images. Keep media as provider-native\n// content instead of JSON-stringifying base64 into a prompt string.\nconst lowerToolResultContentItem = Effect.fn(\"AnthropicMessages.lowerToolResultContentItem\")(function* (\n item: ToolContent,\n) {\n if (item.type === \"text\") return { type: \"text\" as const, text: item.text } satisfies AnthropicTextBlock\n const media = yield* ProviderShared.validateToolFile(\n \"Anthropic Messages\",\n item,\n new Set<string>(ProviderShared.IMAGE_MIMES),\n )\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: media.mime,\n data: media.base64,\n },\n } satisfies AnthropicImageBlock\n})\n\nconst lowerToolResultContent = Effect.fn(\"AnthropicMessages.lowerToolResultContent\")(function* (part: ToolResultPart) {\n // Text / json / error results stay as a string for backward compatibility\n // with existing cassettes and provider expectations.\n if (part.result.type !== \"content\") return ProviderShared.toolResultText(part)\n // Preserve the narrowed array element type when compiled through a consumer package.\n const content: ReadonlyArray<ToolContent> = part.result.value\n return yield* Effect.forEach(content, lowerToolResultContentItem)\n})\n\n// Mid-conversation system messages are a native Claude API feature only for\n// Opus 4.8. Other Anthropic models intentionally use the same visible wrapped-\n// user fallback as non-Anthropic routes rather than sending a role they reject.\nconst supportsNativeSystemUpdates = (request: LLMRequest) => String(request.model.id) === \"claude-opus-4-8\"\n\nconst endsInServerToolUse = (message: LLMRequest[\"messages\"][number]) => {\n const last = message.content.at(-1)\n return message.role === \"assistant\" && last?.type === \"tool-call\" && last.providerExecuted === true\n}\n\nconst canUseNativeSystemUpdate = (messages: LLMRequest[\"messages\"], index: number) => {\n const previous = messages[index - 1]\n const next = messages[index + 1]\n return (\n previous !== undefined &&\n previous.role !== \"system\" &&\n (previous.role === \"user\" || previous.role === \"tool\" || endsInServerToolUse(previous)) &&\n next?.role !== \"system\" &&\n (next === undefined || next.role === \"assistant\")\n )\n}\n\nconst splitsLocalToolResults = (messages: LLMRequest[\"messages\"], index: number) => {\n const pending = new Set<string>()\n for (const message of messages.slice(0, index)) {\n for (const part of message.content) {\n if (message.role === \"assistant\" && part.type === \"tool-call\" && part.providerExecuted !== true)\n pending.add(part.id)\n if (message.role === \"tool\" && part.type === \"tool-result\") pending.delete(part.id)\n }\n }\n return pending.size > 0\n}\n\nconst lowerNativeSystemUpdate = Effect.fn(\"AnthropicMessages.lowerNativeSystemUpdate\")(function* (\n message: LLMRequest[\"messages\"][number],\n breakpoints: Cache.Breakpoints,\n) {\n const content = yield* ProviderShared.systemUpdateText(\"Anthropic Messages\", message)\n return {\n role: \"system\" as const,\n content: content.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n })),\n }\n})\n\nconst lowerMessages = Effect.fn(\"AnthropicMessages.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: Cache.Breakpoints,\n) {\n const messages: AnthropicMessage[] = []\n\n for (const [index, message] of request.messages.entries()) {\n if (message.role === \"system\") {\n if (splitsLocalToolResults(request.messages, index))\n return yield* invalid(\"Anthropic Messages system updates cannot split a local tool call from its tool result\")\n if (supportsNativeSystemUpdates(request) && canUseNativeSystemUpdate(request.messages, index)) {\n messages.push(yield* lowerNativeSystemUpdate(message, breakpoints))\n continue\n }\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Anthropic Messages\", message)\n const block = { type: \"text\" as const, text: part.text, cache_control: cacheControl(breakpoints, part.cache) }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, block] }\n else messages.push({ role: \"user\", content: [block] })\n continue\n }\n\n if (message.role === \"user\") {\n const content: AnthropicUserBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerImage(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"user\", [\"text\", \"media\"])\n }\n messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: AnthropicAssistantBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"reasoning\") {\n content.push({\n type: \"thinking\",\n thinking: part.text,\n signature: part.encrypted ?? signatureFromMetadata(part.providerMetadata),\n })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(part.providerExecuted ? lowerServerToolCall(part) : lowerToolCall(part))\n continue\n }\n if (part.type === \"tool-result\" && part.providerExecuted) {\n content.push(yield* lowerServerToolResult(part))\n continue\n }\n return yield* invalid(\n `Anthropic Messages assistant messages only support text, reasoning, and tool-call content for now`,\n )\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: AnthropicToolResultBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"tool\", [\"tool-result\"])\n content.push({\n type: \"tool_result\",\n tool_use_id: part.id,\n content: yield* lowerToolResultContent(part),\n is_error: part.result.type === \"error\" ? true : undefined,\n cache_control: cacheControl(breakpoints, part.cache),\n })\n }\n messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\nconst anthropicOptions = (request: LLMRequest) => request.providerOptions?.anthropic\n\nconst lowerThinking = Effect.fn(\"AnthropicMessages.lowerThinking\")(function* (request: LLMRequest) {\n const thinking = anthropicOptions(request)?.thinking\n if (!ProviderShared.isRecord(thinking)) return undefined\n if (thinking.type === \"adaptive\") {\n const display =\n thinking.display === \"summarized\"\n ? (\"summarized\" as const)\n : thinking.display === \"omitted\"\n ? (\"omitted\" as const)\n : undefined\n return { type: \"adaptive\" as const, ...(display === undefined ? {} : { display }) }\n }\n if (thinking.type === \"disabled\") return { type: \"disabled\" as const }\n if (thinking.type !== \"enabled\") return undefined\n const budget =\n typeof thinking.budgetTokens === \"number\"\n ? thinking.budgetTokens\n : typeof thinking.budget_tokens === \"number\"\n ? thinking.budget_tokens\n : undefined\n if (budget === undefined) return yield* invalid(\"Anthropic thinking provider option requires budgetTokens\")\n return { type: \"enabled\" as const, budget_tokens: budget }\n})\n\nconst outputConfig = (request: LLMRequest) => {\n const effort = anthropicOptions(request)?.effort\n return typeof effort === \"string\" ? { effort } : undefined\n}\n\nconst fromRequest = Effect.fn(\"AnthropicMessages.fromRequest\")(function* (request: LLMRequest) {\n const toolChoice = request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const outputLimit = request.model.defaults?.limits?.output ?? request.model.route.defaults.limits?.output ?? 4096\n // Allocate the 4-breakpoint budget in invalidation order: tools → system →\n // messages. Tools live highest in the cache hierarchy, so when callers\n // over-mark we keep their tool hints and shed the message-tail ones first.\n const breakpoints = Cache.newBreakpoints(ANTHROPIC_BREAKPOINT_CAP)\n const tools =\n request.tools.length === 0 || request.toolChoice?.type === \"none\"\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(\n breakpoints,\n tool,\n ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility),\n ),\n )\n const system =\n request.system.length === 0\n ? undefined\n : request.system.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n }))\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Anthropic Messages: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${ANTHROPIC_BREAKPOINT_CAP} per request.`,\n )\n }\n return {\n model: request.model.id,\n system,\n messages,\n tools,\n tool_choice: toolChoice,\n stream: true as const,\n max_tokens: generation?.maxTokens ?? outputLimit,\n temperature: generation?.temperature,\n top_p: generation?.topP,\n top_k: generation?.topK,\n stop_sequences: generation?.stop,\n thinking: yield* lowerThinking(request),\n output_config: outputConfig(request),\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\" || reason === \"pause_turn\") return \"stop\"\n if (reason === \"max_tokens\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"refusal\") return \"content-filter\"\n return \"unknown\"\n}\n\n// Anthropic reports the non-overlapping breakdown natively — its\n// `input_tokens` is the *non-cached* count per the Messages API docs, with\n// cache reads and writes as separate fields. We sum them to derive the\n// inclusive `inputTokens` the rest of the contract expects. Extended\n// thinking tokens are *not* broken out by Anthropic — they're billed as\n// part of `output_tokens`, so `reasoningTokens` stays `undefined` and\n// `outputTokens` carries the combined total.\nconst mapUsage = (usage: AnthropicUsage | undefined): Usage | undefined => {\n if (!usage) return undefined\n const nonCached = usage.input_tokens\n const cacheRead = usage.cache_read_input_tokens ?? undefined\n const cacheWrite = usage.cache_creation_input_tokens ?? undefined\n const inputTokens = ProviderShared.sumTokens(nonCached, cacheRead, cacheWrite)\n return new Usage({\n inputTokens,\n outputTokens: usage.output_tokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cacheRead,\n cacheWriteInputTokens: cacheWrite,\n totalTokens: ProviderShared.totalTokens(inputTokens, usage.output_tokens, undefined),\n providerMetadata: { anthropic: usage },\n })\n}\n\n// Anthropic emits usage on `message_start` and again on `message_delta` — the\n// final delta carries the authoritative totals. Right-biased merge: each\n// field prefers `right` when defined, falls back to `left`. `inputTokens` is\n// recomputed from the merged breakdown so the inclusive total stays\n// consistent with `nonCached + cacheRead + cacheWrite`.\nconst mergeUsage = (left: Usage | undefined, right: Usage | undefined) => {\n if (!left) return right\n if (!right) return left\n const nonCachedInputTokens = right.nonCachedInputTokens ?? left.nonCachedInputTokens\n const cacheReadInputTokens = right.cacheReadInputTokens ?? left.cacheReadInputTokens\n const cacheWriteInputTokens = right.cacheWriteInputTokens ?? left.cacheWriteInputTokens\n const inputTokens = ProviderShared.sumTokens(nonCachedInputTokens, cacheReadInputTokens, cacheWriteInputTokens)\n const outputTokens = right.outputTokens ?? left.outputTokens\n return new Usage({\n inputTokens,\n outputTokens,\n nonCachedInputTokens,\n cacheReadInputTokens,\n cacheWriteInputTokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, outputTokens, undefined),\n providerMetadata: {\n anthropic: {\n ...left.providerMetadata?.[\"anthropic\"],\n ...right.providerMetadata?.[\"anthropic\"],\n },\n },\n })\n}\n\n// Server tool result blocks come whole in `content_block_start` (no streaming\n// delta sequence). We convert the payload to a `tool-result` event with\n// `providerExecuted: true`. The runtime appends it to the assistant message\n// for round-trip; downstream consumers can inspect `result.value` for the\n// structured payload.\nconst SERVER_TOOL_RESULT_NAMES: Record<AnthropicServerToolResultType, string> = {\n web_search_tool_result: \"web_search\",\n code_execution_tool_result: \"code_execution\",\n web_fetch_tool_result: \"web_fetch\",\n}\n\nconst isServerToolResultType = (type: string): type is AnthropicServerToolResultType => type in SERVER_TOOL_RESULT_NAMES\n\nconst serverToolResultEvent = (block: NonNullable<AnthropicEvent[\"content_block\"]>): LLMEvent | undefined => {\n if (!block.type || !isServerToolResultType(block.type)) return undefined\n const errorPayload =\n typeof block.content === \"object\" && block.content !== null && \"type\" in block.content\n ? String((block.content as Record<string, unknown>).type)\n : \"\"\n const isError = errorPayload.endsWith(\"_tool_result_error\")\n return LLMEvent.toolResult({\n id: block.tool_use_id ?? \"\",\n name: SERVER_TOOL_RESULT_NAMES[block.type],\n result: isError ? { type: \"error\", value: block.content } : { type: \"json\", value: block.content },\n providerExecuted: true,\n providerMetadata: anthropicMetadata({ blockType: block.type }),\n })\n}\n\ntype StepResult = readonly [ParserState, ReadonlyArray<LLMEvent>]\n\nconst NO_EVENTS: StepResult[\"1\"] = []\n\nconst onMessageStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mapUsage(event.message?.usage)\n return [usage ? { ...state, usage: mergeUsage(state.usage, usage) } : state, NO_EVENTS]\n}\n\nconst onContentBlockStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const block = event.content_block\n if (!block) return [state, NO_EVENTS]\n\n if ((block.type === \"tool_use\" || block.type === \"server_tool_use\") && event.index !== undefined) {\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, event.index, {\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n providerExecuted: block.type === \"server_tool_use\",\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n providerExecuted: block.type === \"server_tool_use\" ? true : undefined,\n }),\n ],\n ]\n }\n\n if (block.type === \"text\" && block.text) {\n const events: LLMEvent[] = []\n return [\n { ...state, lifecycle: Lifecycle.textDelta(state.lifecycle, events, `text-${event.index ?? 0}`, block.text) },\n events,\n ]\n }\n\n if (block.type === \"thinking\" && block.thinking) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${event.index ?? 0}`, block.thinking),\n },\n events,\n ]\n }\n\n const result = serverToolResultEvent(block)\n if (!result) return [state, NO_EVENTS]\n const events: LLMEvent[] = []\n return [{ ...state, lifecycle: Lifecycle.stepStart(state.lifecycle, events) }, [...events, result]]\n}\n\nconst onContentBlockDelta = Effect.fn(\"AnthropicMessages.onContentBlockDelta\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n const delta = event.delta\n\n if (delta?.type === \"text_delta\" && delta.text) {\n const events: LLMEvent[] = []\n return [\n { ...state, lifecycle: Lifecycle.textDelta(state.lifecycle, events, `text-${event.index ?? 0}`, delta.text) },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"thinking_delta\" && delta.thinking) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${event.index ?? 0}`, delta.thinking),\n },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"signature_delta\" && delta.signature) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningEnd(\n state.lifecycle,\n events,\n `reasoning-${event.index ?? 0}`,\n anthropicMetadata({ signature: delta.signature }),\n ),\n },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"input_json_delta\" && event.index !== undefined) {\n if (!delta.partial_json) return [state, NO_EVENTS] satisfies StepResult\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n event.index,\n delta.partial_json,\n \"Anthropic Messages tool argument delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] satisfies StepResult\n }\n\n return [state, NO_EVENTS] satisfies StepResult\n})\n\nconst onContentBlockStop = Effect.fn(\"AnthropicMessages.onContentBlockStop\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n if (event.index === undefined) return [state, NO_EVENTS] satisfies StepResult\n const result = yield* ToolStream.finish(ADAPTER, state.tools, event.index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${event.index}`),\n events,\n `reasoning-${event.index}`,\n )\n events.push(...resultEvents)\n return [{ ...state, lifecycle, tools: result.tools }, events] satisfies StepResult\n})\n\nconst onMessageDelta = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mergeUsage(state.usage, mapUsage(event.usage))\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.finish(state.lifecycle, events, {\n reason: mapFinishReason(event.delta?.stop_reason),\n usage,\n providerMetadata: event.delta?.stop_sequence\n ? anthropicMetadata({ stopSequence: event.delta.stop_sequence })\n : undefined,\n })\n return [{ ...state, lifecycle, usage }, events]\n}\n\n// Prefix `error.type` so overloads, rate limits, and quota errors are visible\n// even when the provider message is generic or empty.\nconst providerErrorMessage = (event: AnthropicEvent): string => {\n const type = event.error?.type\n const message = event.error?.message\n if (type && message) return `${type}: ${message}`\n return message || type || \"Anthropic Messages stream error\"\n}\n\nconst onError = (event: AnthropicEvent) =>\n new LLMError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({ message: providerErrorMessage(event), code: event.error?.type }),\n })\n\nconst step = (state: ParserState, event: AnthropicEvent) => {\n if (event.type === \"message_start\") return Effect.succeed(onMessageStart(state, event))\n if (event.type === \"content_block_start\") return Effect.succeed(onContentBlockStart(state, event))\n if (event.type === \"content_block_delta\") return onContentBlockDelta(state, event)\n if (event.type === \"content_block_stop\") return onContentBlockStop(state, event)\n if (event.type === \"message_delta\") return Effect.succeed(onMessageDelta(state, event))\n if (event.type === \"error\") return onError(event)\n return Effect.succeed<StepResult>([state, NO_EVENTS])\n}\n\n// =============================================================================\n// Protocol And Anthropic Route\n// =============================================================================\n/**\n * The Anthropic Messages protocol — request body construction, body schema,\n * and the streaming-event state machine. Used by native Anthropic Cloud and\n * (once registered) Vertex Anthropic / Bedrock-hosted Anthropic passthrough.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: AnthropicMessagesBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(AnthropicEvent),\n initial: () => ({ tools: ToolStream.empty<number>(), lifecycle: Lifecycle.initial() }),\n step,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"anthropic\",\n providerMetadataKey: \"anthropic\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n framing: Framing.sse,\n headers: () => ({ \"anthropic-version\": \"2023-06-01\" }),\n})\n\nexport * as AnthropicMessages from \"./anthropic-messages\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "6373C3B53F70A55D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? Global.Path.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n" | ||
| ], | ||
| "mappings": ";2xBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC", | ||
| "debugId": "FA6D85F8E5CAAD8D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/lifecycle.ts", "../ai/src/protocols/utils/gemini-tool-schema.ts", "../ai/src/protocols/utils/tool-schema.ts"], | ||
| "sourcesContent": [ | ||
| "import { LLMEvent, type FinishReason, type ProviderMetadata, type Usage } from \"../../schema\"\n\nexport interface State {\n readonly stepStarted: boolean\n readonly text: ReadonlySet<string>\n readonly reasoning: ReadonlySet<string>\n}\n\nexport const initial = (): State => ({ stepStarted: false, text: new Set(), reasoning: new Set() })\n\nexport const stepStart = (state: State, events: LLMEvent[]): State => {\n if (state.stepStarted) return state\n events.push(LLMEvent.stepStart({ index: 0 }))\n return { ...state, stepStarted: true }\n}\n\nexport const textDelta = (state: State, events: LLMEvent[], id: string, text: string): State => {\n const stepped = stepStart(state, events)\n if (stepped.text.has(id)) {\n events.push(LLMEvent.textDelta({ id, text }))\n return stepped\n }\n events.push(LLMEvent.textStart({ id }), LLMEvent.textDelta({ id, text }))\n return { ...stepped, text: new Set([...stepped.text, id]) }\n}\n\nexport const reasoningStart = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningStart({ id, providerMetadata }))\n return { ...stepped, reasoning: new Set([...stepped.reasoning, id]) }\n}\n\nexport const reasoningDelta = (\n state: State,\n events: LLMEvent[],\n id: string,\n text: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n const started = reasoningStart(state, events, id, providerMetadata)\n events.push(LLMEvent.reasoningDelta({ id, text }))\n return started\n}\n\nexport const reasoningEnd = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (!state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningEnd({ id, providerMetadata }))\n const reasoning = new Set(stepped.reasoning)\n reasoning.delete(id)\n return { ...stepped, reasoning }\n}\n\nexport const textEnd = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (!state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textEnd({ id, providerMetadata }))\n const text = new Set(stepped.text)\n text.delete(id)\n return { ...stepped, text }\n}\n\nconst closeOpenBlocks = (state: State, events: LLMEvent[]): State => {\n for (const id of state.reasoning) events.push(LLMEvent.reasoningEnd({ id }))\n for (const id of state.text) events.push(LLMEvent.textEnd({ id }))\n return { ...state, text: new Set(), reasoning: new Set() }\n}\n\nexport const finish = (\n state: State,\n events: LLMEvent[],\n input: {\n readonly reason: FinishReason\n readonly usage?: Usage\n readonly providerMetadata?: ProviderMetadata\n },\n): State => {\n const stepped = closeOpenBlocks(stepStart(state, events), events)\n events.push(\n LLMEvent.stepFinish({\n index: 0,\n reason: input.reason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n }),\n LLMEvent.finish(input),\n )\n return { ...stepped, stepStarted: false }\n}\n\nexport * as Lifecycle from \"./lifecycle\"\n", | ||
| "import { isRecord } from \"../../utils/record\"\n\n// Gemini accepts a JSON Schema-like dialect for tool parameters, but rejects a\n// handful of common JSON Schema shapes. Keep this projection isolated so the\n// Gemini protocol file still reads like the other protocol modules.\nconst SCHEMA_INTENT_KEYS = [\n \"type\",\n \"properties\",\n \"items\",\n \"prefixItems\",\n \"enum\",\n \"const\",\n \"$ref\",\n \"additionalProperties\",\n \"patternProperties\",\n \"required\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n]\n\nconst hasCombiner = (schema: unknown) =>\n isRecord(schema) && (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf) || Array.isArray(schema.allOf))\n\nconst hasSchemaIntent = (schema: unknown) =>\n isRecord(schema) && (hasCombiner(schema) || SCHEMA_INTENT_KEYS.some((key) => key in schema))\n\nconst sanitizeNode = (schema: unknown): unknown => {\n if (!isRecord(schema)) return Array.isArray(schema) ? schema.map(sanitizeNode) : schema\n\n const result: Record<string, unknown> = Object.fromEntries(\n Object.entries(schema).map(([key, value]) => [\n key,\n key === \"enum\" && Array.isArray(value) ? value.map(String) : sanitizeNode(value),\n ]),\n )\n\n if (Array.isArray(result.enum) && (result.type === \"integer\" || result.type === \"number\")) result.type = \"string\"\n\n const properties = result.properties\n if (result.type === \"object\" && isRecord(properties) && Array.isArray(result.required)) {\n result.required = result.required.filter((field) => typeof field === \"string\" && field in properties)\n }\n\n if (result.type === \"array\" && !hasCombiner(result)) {\n result.items = result.items ?? {}\n if (isRecord(result.items) && !hasSchemaIntent(result.items)) result.items = { ...result.items, type: \"string\" }\n }\n\n if (typeof result.type === \"string\" && result.type !== \"object\" && !hasCombiner(result)) {\n delete result.properties\n delete result.required\n }\n\n return result\n}\n\nconst emptyObjectSchema = (schema: Record<string, unknown>) =>\n schema.type === \"object\" &&\n (!isRecord(schema.properties) || Object.keys(schema.properties).length === 0) &&\n !schema.additionalProperties\n\nconst projectNode = (schema: unknown): Record<string, unknown> | undefined => {\n if (!isRecord(schema)) return undefined\n if (emptyObjectSchema(schema)) return undefined\n return Object.fromEntries(\n [\n [\"description\", schema.description],\n [\"required\", schema.required],\n [\"format\", schema.format],\n [\"type\", Array.isArray(schema.type) ? schema.type.filter((type) => type !== \"null\")[0] : schema.type],\n [\"nullable\", Array.isArray(schema.type) && schema.type.includes(\"null\") ? true : undefined],\n [\"enum\", schema.const !== undefined ? [schema.const] : schema.enum],\n [\n \"properties\",\n isRecord(schema.properties)\n ? Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => [key, projectNode(value)]))\n : undefined,\n ],\n [\n \"items\",\n Array.isArray(schema.items)\n ? schema.items.map(projectNode)\n : schema.items === undefined\n ? undefined\n : projectNode(schema.items),\n ],\n [\"allOf\", Array.isArray(schema.allOf) ? schema.allOf.map(projectNode) : undefined],\n [\"anyOf\", Array.isArray(schema.anyOf) ? schema.anyOf.map(projectNode) : undefined],\n [\"oneOf\", Array.isArray(schema.oneOf) ? schema.oneOf.map(projectNode) : undefined],\n [\"minLength\", schema.minLength],\n ].filter((entry) => entry[1] !== undefined),\n )\n}\n\nexport const convert = (schema: unknown) => projectNode(sanitizeNode(schema))\n\nexport * as GeminiToolSchema from \"./gemini-tool-schema\"\n", | ||
| "import type { JsonSchema, ModelToolSchemaCompatibility } from \"../../schema\"\nimport { isRecord } from \"../../utils/record\"\nimport { GeminiToolSchema } from \"./gemini-tool-schema\"\n\nconst removeNullSchemas = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(removeNullSchemas)\n if (!isRecord(value)) return value\n const fields = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"anyOf\")\n .map(([key, field]) => [key, removeNullSchemas(field)]),\n )\n if (!Array.isArray(value.anyOf)) return fields\n const variants = value.anyOf.filter((variant) => !isRecord(variant) || variant.type !== \"null\").map(removeNullSchemas)\n if (variants.length === 1 && isRecord(variants[0])) return { ...fields, ...variants[0] }\n return { ...fields, anyOf: variants }\n}\n\nconst tupleItemsSchema = (items: ReadonlyArray<unknown>) => {\n const projected = items.map(moonshotNode)\n if (projected.length === 0) return {}\n if (projected.length === 1) return projected[0]\n return { anyOf: projected }\n}\n\nconst moonshotNode = (schema: unknown): unknown => {\n if (Array.isArray(schema)) return schema.map(moonshotNode)\n if (!isRecord(schema)) return schema\n if (typeof schema.$ref === \"string\") return { $ref: schema.$ref }\n return Object.fromEntries(\n Object.entries(schema).flatMap(([key, value]) => {\n if (key === \"items\" && Array.isArray(value)) return [[key, tupleItemsSchema(value)]]\n if (key === \"prefixItems\") {\n if (\"items\" in schema) return []\n return [[\"items\", tupleItemsSchema(Array.isArray(value) ? value : [])]]\n }\n if (key === \"unevaluatedItems\") return []\n return [[key, moonshotNode(value)]]\n }),\n )\n}\n\nconst moonshot = (schema: JsonSchema): JsonSchema => {\n const projected = moonshotNode(schema)\n return isRecord(projected) ? projected : {}\n}\n\nconst openAI = (schema: JsonSchema): JsonSchema => {\n const variants = Array.isArray(schema.anyOf) ? schema.anyOf.filter(isRecord) : []\n const flattened =\n variants.length === 0\n ? { ...schema, type: \"object\" }\n : {\n ...Object.fromEntries(Object.entries(schema).filter(([key]) => key !== \"anyOf\")),\n type: \"object\",\n properties: variants.reduce(\n (properties, variant) => ({ ...(isRecord(variant.properties) ? variant.properties : {}), ...properties }),\n {},\n ),\n additionalProperties: false,\n }\n const normalized = removeNullSchemas(flattened)\n return isRecord(normalized) ? normalized : { type: \"object\" }\n}\n\nconst gemini = (schema: JsonSchema): JsonSchema => GeminiToolSchema.convert(schema) ?? {}\n\nconst modelCompatibility = (\n schema: JsonSchema,\n compatibility: ModelToolSchemaCompatibility | undefined,\n): JsonSchema => {\n if (compatibility === undefined) return schema\n switch (compatibility) {\n case \"gemini\":\n return gemini(schema)\n case \"moonshot\":\n return moonshot(schema)\n }\n}\n\nexport const ToolSchemaProjection = {\n gemini,\n modelCompatibility,\n moonshot,\n openAI,\n} as const\n" | ||
| ], | ||
| "mappings": ";iRAQO,SAAM,EAAU,KAAc,CAAE,YAAa,GAAO,KAAM,IAAI,IAAO,UAAW,IAAI,GAAM,GAEpF,EAAY,CAAC,EAAc,IAA8B,CACpE,GAAI,EAAM,YAAa,OAAO,EAE9B,OADA,EAAO,KAAK,EAAS,UAAU,CAAE,MAAO,CAAE,CAAC,CAAC,EACrC,IAAK,EAAO,YAAa,EAAK,GAG1B,EAAY,CAAC,EAAc,EAAoB,EAAY,IAAwB,CAC9F,IAAM,EAAU,EAAU,EAAO,CAAM,EACvC,GAAI,EAAQ,KAAK,IAAI,CAAE,EAErB,OADA,EAAO,KAAK,EAAS,UAAU,CAAE,KAAI,MAAK,CAAC,CAAC,EACrC,EAGT,OADA,EAAO,KAAK,EAAS,UAAU,CAAE,IAAG,CAAC,EAAG,EAAS,UAAU,CAAE,KAAI,MAAK,CAAC,CAAC,EACjE,IAAK,EAAS,KAAM,IAAI,IAAI,CAAC,GAAG,EAAQ,KAAM,CAAE,CAAC,CAAE,GAG/C,EAAiB,CAC5B,EACA,EACA,EACA,IACU,CACV,GAAI,EAAM,UAAU,IAAI,CAAE,EAAG,OAAO,EACpC,IAAM,EAAU,EAAU,EAAO,CAAM,EAEvC,OADA,EAAO,KAAK,EAAS,eAAe,CAAE,KAAI,kBAAiB,CAAC,CAAC,EACtD,IAAK,EAAS,UAAW,IAAI,IAAI,CAAC,GAAG,EAAQ,UAAW,CAAE,CAAC,CAAE,GAGzD,EAAiB,CAC5B,EACA,EACA,EACA,EACA,IACU,CACV,IAAM,EAAU,EAAe,EAAO,EAAQ,EAAI,CAAgB,EAElE,OADA,EAAO,KAAK,EAAS,eAAe,CAAE,KAAI,MAAK,CAAC,CAAC,EAC1C,GAGI,EAAe,CAC1B,EACA,EACA,EACA,IACU,CACV,GAAI,CAAC,EAAM,UAAU,IAAI,CAAE,EAAG,OAAO,EACrC,IAAM,EAAU,EAAU,EAAO,CAAM,EACvC,EAAO,KAAK,EAAS,aAAa,CAAE,KAAI,kBAAiB,CAAC,CAAC,EAC3D,IAAM,EAAY,IAAI,IAAI,EAAQ,SAAS,EAE3C,OADA,EAAU,OAAO,CAAE,EACZ,IAAK,EAAS,WAAU,GAGpB,EAAU,CAAC,EAAc,EAAoB,EAAY,IAA+C,CACnH,GAAI,CAAC,EAAM,KAAK,IAAI,CAAE,EAAG,OAAO,EAChC,IAAM,EAAU,EAAU,EAAO,CAAM,EACvC,EAAO,KAAK,EAAS,QAAQ,CAAE,KAAI,kBAAiB,CAAC,CAAC,EACtD,IAAM,EAAO,IAAI,IAAI,EAAQ,IAAI,EAEjC,OADA,EAAK,OAAO,CAAE,EACP,IAAK,EAAS,MAAK,GAGtB,EAAkB,CAAC,EAAc,IAA8B,CACnE,QAAW,KAAM,EAAM,UAAW,EAAO,KAAK,EAAS,aAAa,CAAE,IAAG,CAAC,CAAC,EAC3E,QAAW,KAAM,EAAM,KAAM,EAAO,KAAK,EAAS,QAAQ,CAAE,IAAG,CAAC,CAAC,EACjE,MAAO,IAAK,EAAO,KAAM,IAAI,IAAO,UAAW,IAAI,GAAM,GAG9C,EAAS,CACpB,EACA,EACA,IAKU,CACV,IAAM,EAAU,EAAgB,EAAU,EAAO,CAAM,EAAG,CAAM,EAUhE,OATA,EAAO,KACL,EAAS,WAAW,CAClB,MAAO,EACP,OAAQ,EAAM,OACd,MAAO,EAAM,MACb,iBAAkB,EAAM,gBAC1B,CAAC,EACD,EAAS,OAAO,CAAK,CACvB,EACO,IAAK,EAAS,YAAa,EAAM,wDC7F1C,IAAM,EAAqB,CACzB,OACA,aACA,QACA,cACA,OACA,QACA,OACA,uBACA,oBACA,WACA,MACA,KACA,OACA,MACF,EAEM,EAAc,CAAC,IACnB,EAAS,CAAM,IAAM,MAAM,QAAQ,EAAO,KAAK,GAAK,MAAM,QAAQ,EAAO,KAAK,GAAK,MAAM,QAAQ,EAAO,KAAK,GAEzG,EAAkB,CAAC,IACvB,EAAS,CAAM,IAAM,EAAY,CAAM,GAAK,EAAmB,KAAK,CAAC,KAAQ,KAAO,EAAM,GAEtF,EAAe,CAAC,IAA6B,CACjD,GAAI,CAAC,EAAS,CAAM,EAAG,OAAO,MAAM,QAAQ,CAAM,EAAI,EAAO,IAAI,CAAY,EAAI,EAEjF,IAAM,EAAkC,OAAO,YAC7C,OAAO,QAAQ,CAAM,EAAE,IAAI,EAAE,EAAK,KAAW,CAC3C,EACA,IAAQ,QAAU,MAAM,QAAQ,CAAK,EAAI,EAAM,IAAI,MAAM,EAAI,EAAa,CAAK,CACjF,CAAC,CACH,EAEA,GAAI,MAAM,QAAQ,EAAO,IAAI,IAAM,EAAO,OAAS,WAAa,EAAO,OAAS,UAAW,EAAO,KAAO,SAEzG,IAAM,EAAa,EAAO,WAC1B,GAAI,EAAO,OAAS,UAAY,EAAS,CAAU,GAAK,MAAM,QAAQ,EAAO,QAAQ,EACnF,EAAO,SAAW,EAAO,SAAS,OAAO,CAAC,IAAU,OAAO,IAAU,WAAY,KAAS,EAAU,EAGtG,GAAI,EAAO,OAAS,SAAW,CAAC,EAAY,CAAM,GAEhD,GADA,EAAO,MAAQ,EAAO,OAAS,CAAC,EAC5B,EAAS,EAAO,KAAK,GAAK,CAAC,EAAgB,EAAO,KAAK,EAAG,EAAO,MAAQ,IAAK,EAAO,MAAO,KAAM,QAAS,EAGjH,GAAI,OAAO,EAAO,OAAS,UAAY,EAAO,OAAS,UAAY,CAAC,EAAY,CAAM,EACpF,OAAO,EAAO,WACd,OAAO,EAAO,SAGhB,OAAO,GAGH,EAAoB,CAAC,IACzB,EAAO,OAAS,WACf,CAAC,EAAS,EAAO,UAAU,GAAK,OAAO,KAAK,EAAO,UAAU,EAAE,SAAW,IAC3E,CAAC,EAAO,qBAEJ,EAAc,CAAC,IAAyD,CAC5E,GAAI,CAAC,EAAS,CAAM,EAAG,OACvB,GAAI,EAAkB,CAAM,EAAG,OAC/B,OAAO,OAAO,YACZ,CACE,CAAC,cAAe,EAAO,WAAW,EAClC,CAAC,WAAY,EAAO,QAAQ,EAC5B,CAAC,SAAU,EAAO,MAAM,EACxB,CAAC,OAAQ,MAAM,QAAQ,EAAO,IAAI,EAAI,EAAO,KAAK,OAAO,CAAC,IAAS,IAAS,MAAM,EAAE,GAAK,EAAO,IAAI,EACpG,CAAC,WAAY,MAAM,QAAQ,EAAO,IAAI,GAAK,EAAO,KAAK,SAAS,MAAM,EAAI,GAAO,MAAS,EAC1F,CAAC,OAAQ,EAAO,QAAU,OAAY,CAAC,EAAO,KAAK,EAAI,EAAO,IAAI,EAClE,CACE,aACA,EAAS,EAAO,UAAU,EACtB,OAAO,YAAY,OAAO,QAAQ,EAAO,UAAU,EAAE,IAAI,EAAE,EAAK,KAAW,CAAC,EAAK,EAAY,CAAK,CAAC,CAAC,CAAC,EACrG,MACN,EACA,CACE,QACA,MAAM,QAAQ,EAAO,KAAK,EACtB,EAAO,MAAM,IAAI,CAAW,EAC5B,EAAO,QAAU,OACf,OACA,EAAY,EAAO,KAAK,CAChC,EACA,CAAC,QAAS,MAAM,QAAQ,EAAO,KAAK,EAAI,EAAO,MAAM,IAAI,CAAW,EAAI,MAAS,EACjF,CAAC,QAAS,MAAM,QAAQ,EAAO,KAAK,EAAI,EAAO,MAAM,IAAI,CAAW,EAAI,MAAS,EACjF,CAAC,QAAS,MAAM,QAAQ,EAAO,KAAK,EAAI,EAAO,MAAM,IAAI,CAAW,EAAI,MAAS,EACjF,CAAC,YAAa,EAAO,SAAS,CAChC,EAAE,OAAO,CAAC,IAAU,EAAM,KAAO,MAAS,CAC5C,GAGW,EAAU,CAAC,IAAoB,EAAY,EAAa,CAAM,CAAC,EC5F5E,IAAM,EAAoB,CAAC,IAA4B,CACrD,GAAI,MAAM,QAAQ,CAAK,EAAG,OAAO,EAAM,IAAI,CAAiB,EAC5D,GAAI,CAAC,EAAS,CAAK,EAAG,OAAO,EAC7B,IAAM,EAAS,OAAO,YACpB,OAAO,QAAQ,CAAK,EACjB,OAAO,EAAE,KAAS,IAAQ,OAAO,EACjC,IAAI,EAAE,EAAK,KAAW,CAAC,EAAK,EAAkB,CAAK,CAAC,CAAC,CAC1D,EACA,GAAI,CAAC,MAAM,QAAQ,EAAM,KAAK,EAAG,OAAO,EACxC,IAAM,EAAW,EAAM,MAAM,OAAO,CAAC,IAAY,CAAC,EAAS,CAAO,GAAK,EAAQ,OAAS,MAAM,EAAE,IAAI,CAAiB,EACrH,GAAI,EAAS,SAAW,GAAK,EAAS,EAAS,EAAE,EAAG,MAAO,IAAK,KAAW,EAAS,EAAG,EACvF,MAAO,IAAK,EAAQ,MAAO,CAAS,GAGhC,EAAmB,CAAC,IAAkC,CAC1D,IAAM,EAAY,EAAM,IAAI,CAAY,EACxC,GAAI,EAAU,SAAW,EAAG,MAAO,CAAC,EACpC,GAAI,EAAU,SAAW,EAAG,OAAO,EAAU,GAC7C,MAAO,CAAE,MAAO,CAAU,GAGtB,EAAe,CAAC,IAA6B,CACjD,GAAI,MAAM,QAAQ,CAAM,EAAG,OAAO,EAAO,IAAI,CAAY,EACzD,GAAI,CAAC,EAAS,CAAM,EAAG,OAAO,EAC9B,GAAI,OAAO,EAAO,OAAS,SAAU,MAAO,CAAE,KAAM,EAAO,IAAK,EAChE,OAAO,OAAO,YACZ,OAAO,QAAQ,CAAM,EAAE,QAAQ,EAAE,EAAK,KAAW,CAC/C,GAAI,IAAQ,SAAW,MAAM,QAAQ,CAAK,EAAG,MAAO,CAAC,CAAC,EAAK,EAAiB,CAAK,CAAC,CAAC,EACnF,GAAI,IAAQ,cAAe,CACzB,GAAI,UAAW,EAAQ,MAAO,CAAC,EAC/B,MAAO,CAAC,CAAC,QAAS,EAAiB,MAAM,QAAQ,CAAK,EAAI,EAAQ,CAAC,CAAC,CAAC,CAAC,EAExE,GAAI,IAAQ,mBAAoB,MAAO,CAAC,EACxC,MAAO,CAAC,CAAC,EAAK,EAAa,CAAK,CAAC,CAAC,EACnC,CACH,GAGI,EAAW,CAAC,IAAmC,CACnD,IAAM,EAAY,EAAa,CAAM,EACrC,OAAO,EAAS,CAAS,EAAI,EAAY,CAAC,GAGtC,EAAS,CAAC,IAAmC,CACjD,IAAM,EAAW,MAAM,QAAQ,EAAO,KAAK,EAAI,EAAO,MAAM,OAAO,CAAQ,EAAI,CAAC,EAC1E,EACJ,EAAS,SAAW,EAChB,IAAK,EAAQ,KAAM,QAAS,EAC5B,IACK,OAAO,YAAY,OAAO,QAAQ,CAAM,EAAE,OAAO,EAAE,KAAS,IAAQ,OAAO,CAAC,EAC/E,KAAM,SACN,WAAY,EAAS,OACnB,CAAC,EAAY,KAAa,IAAM,EAAS,EAAQ,UAAU,EAAI,EAAQ,WAAa,CAAC,KAAO,CAAW,GACvG,CAAC,CACH,EACA,qBAAsB,EACxB,EACA,EAAa,EAAkB,CAAS,EAC9C,OAAO,EAAS,CAAU,EAAI,EAAa,CAAE,KAAM,QAAS,GAGxD,EAAS,CAAC,IAAmC,EAAiB,QAAQ,CAAM,GAAK,CAAC,EAElF,EAAqB,CACzB,EACA,IACe,CACf,GAAI,IAAkB,OAAW,OAAO,EACxC,OAAQ,OACD,SACH,OAAO,EAAO,CAAM,MACjB,WACH,OAAO,EAAS,CAAM,IAIf,EAAuB,CAClC,SACA,qBACA,WACA,QACF", | ||
| "debugId": "0A757C0381CDFB8964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "91CD5C44201FCA4264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/start.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,WAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "AD567623DCDCB62C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";o2BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,EAChD,CACH", | ||
| "debugId": "12347842F8C14FBB64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/anthropic-compatible.ts", "../ai/src/providers/anthropic.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { ProviderID, type ModelID } from \"../schema\"\n\nexport const id = ProviderID.make(\"anthropic-compatible\")\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL: string\n readonly provider?: string\n }\n\nexport const routes = [AnthropicMessages.route]\n\nconst auth = (input: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\").pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config) => {\n if (!input.baseURL) throw new Error(\"Anthropic-compatible providers require a baseURL\")\n const provider = input.provider ?? \"anthropic-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = AnthropicMessages.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: auth(input),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic-compatible apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n}\n\nexport * as AnthropicCompatible from \"./anthropic-compatible\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { AnthropicCompatible } from \"./anthropic-compatible\"\n\nexport const id = ProviderID.make(\"anthropic\")\n\nexport const routes = [AnthropicMessages.route]\n\nexport type Config = RouteDefaultsInput & ProviderAuthOption<\"optional\"> & { readonly baseURL?: string }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL?: string\n }\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"ANTHROPIC_API_KEY\"))\n .pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config = {}) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n const compatible = AnthropicCompatible.configure({\n ...rest,\n auth: auth(input),\n baseURL: baseURL ?? AnthropicMessages.DEFAULT_BASE_URL,\n provider: id,\n })\n return {\n id,\n model: (modelID: string | ModelID) => compatible.model(modelID),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";qhBAOO,SAAM,OAAK,OAAW,UAAK,2BAAsB,OAiB3C,OAAS,MAAC,OAAkB,UAAK,EAExC,EAAO,CAAC,IAA0C,CACtD,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EAAE,KAAK,EAAK,OAAO,WAAW,CAAC,GAG/F,EAAY,CAAC,IAAkB,CAC1C,GAAI,CAAC,EAAM,QAAS,MAAU,MAAM,kDAAkD,EACtF,IAAM,EAAW,EAAM,UAAY,wBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAAQ,EAAkB,MAAM,KAAK,IACtC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAK,CAAK,CAClB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,CAAQ,CAAC,EACjE,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,+DAA+D,EACjF,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,GCvDX,IAAM,EAAK,EAAW,KAAK,WAAW,EAEhC,EAAS,CAAC,EAAkB,KAAK,EAYxC,EAAO,CAAC,IAA4C,CACxD,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAO,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,EAC5E,OAAO,EAAK,OAAO,mBAAmB,CAAC,EACvC,KAAK,EAAK,OAAO,WAAW,CAAC,GAGrB,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EAC/C,EAAa,EAAoB,UAAU,IAC5C,EACH,KAAM,EAAK,CAAK,EAChB,QAAS,GAAW,EAAkB,iBACtC,SAAU,CACZ,CAAC,EACD,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAW,MAAM,CAAO,EAC9D,WACF,GAGW,EAAW,EAAU,EACrB,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,oDAAoD,EACtE,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,MACnB,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "921AD181817D91B164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"], | ||
| "sourcesContent": [ | ||
| "// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n", | ||
| "import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";i4BAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,OAAK,yBAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "92AEAA819F9D70A664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({ server: serverURL, standalone: input.standalone })\n const config = yield* Config.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n tuiConfig: resolved,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ogCAOA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EAC5F,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,KACZ,UAAW,CACb,CAAC,CACH,EACD,CACH", | ||
| "debugId": "E7D7103A627E1D9364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-images.ts", "../ai/src/providers/openai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport {\n ImageModel,\n GeneratedImage,\n ImageResponse,\n type ImageRequest,\n type ImageModelDefaults,\n type ImageRoute,\n} from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport { InvalidProviderOutputReason, LLMError, Usage, mergeHttpOptions, mergeJsonRecords } from \"../schema\"\nimport { ProviderShared } from \"./shared\"\nimport { OpenAIImage } from \"./utils/openai-image\"\n\nconst ADAPTER = \"openai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/images/generations\"\n\nexport interface OpenAIImageOptions {\n readonly quality?: \"auto\" | \"low\" | \"medium\" | \"high\"\n readonly background?: \"auto\" | \"opaque\" | \"transparent\"\n readonly moderation?: \"auto\" | \"low\"\n readonly outputFormat?: \"png\" | \"jpeg\" | \"webp\"\n readonly outputCompression?: number\n}\n\nconst OpenAIImageBody = Schema.Struct({\n model: Schema.String,\n prompt: Schema.String,\n n: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))),\n size: Schema.optional(Schema.String),\n quality: Schema.optional(Schema.Literals([\"auto\", \"low\", \"medium\", \"high\"])),\n background: Schema.optional(Schema.Literals([\"auto\", \"opaque\", \"transparent\"])),\n moderation: Schema.optional(Schema.Literals([\"auto\", \"low\"])),\n output_format: Schema.optional(Schema.Literals([\"png\", \"jpeg\", \"webp\"])),\n output_compression: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 100 }))),\n})\nexport type OpenAIImageBody = Schema.Schema.Type<typeof OpenAIImageBody>\n\nconst OpenAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: Schema.optional(Schema.String),\n url: Schema.optional(Schema.String),\n revised_prompt: Schema.optional(Schema.String),\n }),\n ),\n output_format: Schema.optional(Schema.String),\n usage: Schema.optional(\n Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n total_tokens: Schema.optional(Schema.Number),\n input_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n output_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n }),\n ),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly defaults?: ImageModelDefaults\n}\n\nconst providerOptions = (request: ImageRequest): OpenAIImageOptions => ({\n ...request.model.defaults?.providerOptions?.openai,\n ...request.providerOptions?.openai,\n})\n\nconst body = (request: ImageRequest): OpenAIImageBody => {\n const options = providerOptions(request)\n return {\n model: request.model.id,\n prompt: request.prompt,\n n: request.count,\n size: request.size === undefined ? undefined : `${request.size.width}x${request.size.height}`,\n quality: options.quality,\n background: options.background,\n moderation: options.moderation,\n output_format: options.outputFormat,\n output_compression: options.outputCompression,\n }\n}\n\nconst invalidOutput = (message: string) =>\n new LLMError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nconst PROTOCOL_BODY_FIELDS = new Set([\n \"model\",\n \"prompt\",\n \"n\",\n \"size\",\n \"quality\",\n \"background\",\n \"moderation\",\n \"output_format\",\n \"output_compression\",\n])\n\nconst bodyWithOverlay = Effect.fn(\"OpenAIImages.bodyWithOverlay\")(function* (\n imageBody: OpenAIImageBody,\n overlay: Record<string, unknown> | undefined,\n) {\n if (!overlay) return imageBody\n const reserved = Object.keys(overlay).filter((key) => PROTOCOL_BODY_FIELDS.has(key))\n if (reserved.length > 0)\n return yield* ProviderShared.invalidRequest(\n `http.body cannot overlay protocol-owned field(s): ${reserved.join(\", \")}`,\n )\n return mergeJsonRecords(imageBody, overlay) ?? imageBody\n})\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute = {\n id: ADAPTER,\n generate: Effect.fn(\"OpenAIImages.generate\")(function* (request: ImageRequest, execute) {\n if (request.aspectRatio !== undefined)\n return yield* ProviderShared.invalidRequest(\"OpenAI Images does not support the common aspectRatio option\")\n if (request.seed !== undefined)\n return yield* ProviderShared.invalidRequest(\"OpenAI Images does not support the common seed option\")\n\n const requestBody = yield* ProviderShared.validateWith(Schema.decodeUnknownEffect(OpenAIImageBody))(body(request))\n const http = mergeHttpOptions(request.model.defaults?.http, request.http)\n const overlaidBody = yield* bodyWithOverlay(requestBody, http?.body)\n const text = ProviderShared.encodeJson(overlaidBody)\n const url = applyQuery(`${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${PATH}`, http?.query)\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the OpenAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(OpenAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"OpenAI Images returned an invalid response\")),\n )\n const format = decoded.output_format ?? providerOptions(request).outputFormat ?? \"png\"\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`OpenAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: `image/${format}`,\n data,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType: `image/${format}`,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`OpenAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"OpenAI Images returned no images\")\n return new ImageResponse({\n images,\n usage:\n decoded.usage === undefined\n ? undefined\n : new Usage({\n inputTokens: decoded.usage.input_tokens,\n outputTokens: decoded.usage.output_tokens,\n totalTokens: decoded.usage.total_tokens,\n providerMetadata: { openai: decoded.usage },\n }),\n providerMetadata: { openai: { outputFormat: format } },\n })\n }),\n }\n return ImageModel.make({ id: input.id, provider: \"openai\", route, defaults: input.defaults })\n}\n\nexport const OpenAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { Route, RouteDefaultsInput } from \"../route/client\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { HttpOptions, ProviderID, ToolDefinition, mergeHttpOptions, type ModelID } from \"../schema\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options\"\nimport { OpenAIImages, type OpenAIImageOptions } from \"../protocols/openai-images\"\n\nexport type { OpenAIOptionsInput, OpenAIResponseIncludable } from \"./openai-options\"\nexport type { OpenAIImageOptions } from \"../protocols/openai-images\"\n\nexport const id = ProviderID.make(\"openai\")\n\nexport const routes = [OpenAIResponses.route, OpenAIResponses.webSocketRoute, OpenAIChat.route]\n\n// This provider facade wraps the lower-level Responses and Chat model factories\n// with OpenAI-specific conveniences: typed options, API-key sugar, env fallback,\n// and default option normalization.\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly queryParams?: Record<string, string>\n readonly providerOptions?: OpenAIProviderOptionsInput\n readonly image?: ImageConfig\n }\n\nexport interface ImageConfig {\n readonly providerOptions?: OpenAIImageOptions\n}\n\nexport interface ImageGenerationOptions {\n readonly action?: \"auto\" | \"generate\" | \"edit\"\n readonly background?: \"auto\" | \"opaque\" | \"transparent\"\n readonly inputFidelity?: \"low\" | \"high\"\n readonly outputCompression?: number\n readonly outputFormat?: \"png\" | \"jpeg\" | \"webp\"\n readonly partialImages?: number\n readonly quality?: \"auto\" | \"low\" | \"medium\" | \"high\"\n readonly size?: string\n}\n\nexport const imageGeneration = (options: ImageGenerationOptions = {}) =>\n ToolDefinition.make({\n name: \"image_generation\",\n description: \"Generate or edit an image using OpenAI's hosted image generation tool.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n native: {\n openai: {\n type: \"image_generation\",\n action: options.action,\n background: options.background,\n input_fidelity: options.inputFidelity,\n output_compression: options.outputCompression,\n output_format: options.outputFormat,\n partial_images: options.partialImages,\n quality: options.quality,\n size: options.size,\n },\n },\n })\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly organization?: string\n readonly project?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly transport?: \"http\" | \"websocket\"\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"OPENAI_API_KEY\")\n\nconst defaults = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL: _baseURL, queryParams: _queryParams, image: _image, ...rest } = input\n return rest\n}\n\nconst configuredRoute = <Body, Prepared>(route: Route<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: { baseURL: input.baseURL, query: input.queryParams },\n })\n\nexport const configure = (input: Config = {}) => {\n const responsesRoute = configuredRoute(OpenAIResponses.route, input)\n const responsesWebSocketRoute = configuredRoute(OpenAIResponses.webSocketRoute, input)\n const chatRoute = configuredRoute(OpenAIChat.route, input)\n const modelDefaults = defaults(input)\n const responses = (id: string | ModelID) =>\n responsesRoute.with(withOpenAIOptions(id, modelDefaults, { textVerbosity: true })).model({ id })\n const responsesWebSocket = (id: string | ModelID) =>\n responsesWebSocketRoute.with(withOpenAIOptions(id, modelDefaults, { textVerbosity: true })).model({ id })\n const chat = (id: string | ModelID) => chatRoute.with(withOpenAIOptions(id, modelDefaults)).model({ id })\n const image = (modelID: string | ModelID) =>\n OpenAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n defaults: {\n providerOptions:\n input.image?.providerOptions === undefined ? undefined : { openai: { ...input.image.providerOptions } },\n http: mergeHttpOptions(\n input.http === undefined ? undefined : HttpOptions.make(input.http),\n input.queryParams === undefined ? undefined : new HttpOptions({ query: input.queryParams }),\n ),\n },\n })\n\n return {\n id,\n model: responses,\n responses,\n responsesWebSocket,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\n\nconst config = (settings: Settings): Config => {\n const headers = {\n ...(settings.organization === undefined ? {} : { \"OpenAI-Organization\": settings.organization }),\n ...(settings.project === undefined ? {} : { \"OpenAI-Project\": settings.project }),\n ...settings.headers,\n }\n return {\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: Object.keys(headers).length === 0 ? undefined : headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n const configured = configure(config(settings))\n if (settings.transport === undefined || settings.transport === \"http\") return configured.responses(modelID)\n if (settings.transport === \"websocket\") return configured.responsesWebSocket(modelID)\n throw new Error(`Unsupported OpenAI Responses transport: ${String(settings.transport)}`)\n}\n\nexport const chatModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).chat(modelID)\nexport const responses = provider.responses\nexport const responsesWebSocket = provider.responsesWebSocket\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "CA36003241B49D1D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/agents.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "EE66DDA3E02833BF64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-compatible.ts"], | ||
| "sourcesContent": [ | ||
| "import { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { profiles, type OpenAICompatibleProfile } from \"./openai-compatible-profile\"\n\nexport const id = ProviderID.make(\"openai-compatible\")\n\ntype GenericModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL: string\n readonly provider?: string\n}\n\nexport type FamilyModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport const routes = [OpenAICompatibleChat.route]\n\nexport const configure = (input: GenericModelOptions) => {\n const provider = input.provider ?? \"openai-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = OpenAICompatibleChat.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: AuthOptions.bearer(input, []),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID, provider: ProviderID.make(provider) }),\n configure,\n }\n}\n\nconst define = (profile: OpenAICompatibleProfile) => {\n const configureProfile = (input: FamilyModelOptions = {}) => {\n const facade = configure({\n ...input,\n baseURL: input.baseURL ?? profile.baseURL,\n provider: profile.provider,\n })\n return {\n id: ProviderID.make(profile.provider),\n model: facade.model,\n configure: configureProfile,\n }\n }\n return configureProfile()\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n\nexport const baseten = define(profiles.baseten)\nexport const cerebras = define(profiles.cerebras)\nexport const deepinfra = define(profiles.deepinfra)\nexport const deepseek = define(profiles.deepseek)\nexport const fireworks = define(profiles.fireworks)\nexport const groq = define(profiles.groq)\nexport const togetherai = define(profiles.togetherai)\n" | ||
| ], | ||
| "mappings": ";mfAOO,SAAM,OAAK,OAAW,UAAK,wBAAmB,OAmBxC,OAAS,MAAsB,MAAK,OAEpC,OAAY,MAAC,IAA+B,CACvD,IAAM,EAAW,EAAM,UAAY,qBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAA6B,EAAM,KAAK,IACzC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAY,OAAO,EAAO,CAAC,CAAC,CACpC,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,EAAS,SAAU,EAAW,KAAK,CAAQ,CAAE,CAAC,EACtG,WACF,GAGI,EAAS,CAAC,IAAqC,CACnD,IAAM,EAAmB,CAAC,EAA4B,CAAC,IAAM,CAC3D,IAAM,EAAS,EAAU,IACpB,EACH,QAAS,EAAM,SAAW,EAAQ,QAClC,SAAU,EAAQ,QACpB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,EAAQ,QAAQ,EACpC,MAAO,EAAO,MACd,UAAW,CACb,GAEF,OAAO,EAAiB,GAGb,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAC5E,EAAU,CACR,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,EAEL,EAAU,EAAO,EAAS,OAAO,EACjC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAO,EAAO,EAAS,IAAI,EAC3B,EAAa,EAAO,EAAS,UAAU", | ||
| "debugId": "4B3FF2D186F43AED64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/status.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "C2DAED3B09D4DC8964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/image-client.ts", "../ai/src/image.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, Layer } from \"effect\"\nimport { RequestExecutor } from \"./route/executor\"\nimport type { ImageRequest, ImageResponse } from \"./image\"\nimport type { LLMError } from \"./schema\"\n\nexport type Execute = RequestExecutor.Interface[\"execute\"]\n\nexport interface Interface {\n readonly generate: (request: ImageRequest) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/ImageClient\") {}\n\nexport const generate = (request: ImageRequest): Effect.Effect<ImageResponse, LLMError> =>\n Effect.gen(function* () {\n const client = yield* Service\n return yield* client.generate(request)\n }) as Effect.Effect<ImageResponse, LLMError>\n\nexport const layer: Layer.Layer<Service, never, RequestExecutor.Service> = Layer.effect(\n Service,\n Effect.gen(function* () {\n const executor = yield* RequestExecutor.Service\n return Service.of({\n generate: (request) => request.model.route.generate(request, executor.execute),\n })\n }),\n)\n\nexport const ImageClient = {\n Service,\n layer,\n generate,\n} as const\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { HttpOptions, InvalidRequestReason, LLMError, ModelID, ProviderID, ProviderMetadata, Usage } from \"./schema\"\nimport { ImageClient, type Execute as ImageExecute } from \"./image-client\"\n\nexport interface ImageRoute {\n readonly id: string\n readonly generate: (request: ImageRequest, execute: ImageExecute) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport class ImageModel {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute\n readonly defaults?: ImageModelDefaults\n\n constructor(input: ImageModel.Input) {\n this.id = input.id\n this.provider = input.provider\n this.route = input.route\n this.defaults = input.defaults\n }\n\n static make(input: ImageModel.MakeInput) {\n return new ImageModel({\n id: ModelID.make(input.id),\n provider: ProviderID.make(input.provider),\n route: input.route,\n defaults: input.defaults,\n })\n }\n}\n\nexport namespace ImageModel {\n export interface Input {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute\n readonly defaults?: ImageModelDefaults\n }\n\n export interface MakeInput extends Omit<Input, \"id\" | \"provider\"> {\n readonly id: string | ModelID\n readonly provider: string | ProviderID\n }\n}\n\nexport interface ImageModelDefaults {\n readonly providerOptions?: Record<string, Record<string, unknown>>\n readonly http?: HttpOptions\n}\n\nexport const ImageModelSchema = Schema.declare((value): value is ImageModel => value instanceof ImageModel, {\n expected: \"Image.Model\",\n})\n\nexport const ImageSize = Schema.Struct({\n width: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n height: Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)),\n}).annotate({ identifier: \"Image.Size\" })\nexport type ImageSize = Schema.Schema.Type<typeof ImageSize>\n\nexport class ImageRequest extends Schema.Class<ImageRequest>(\"Image.Request\")({\n model: ImageModelSchema,\n prompt: Schema.String,\n count: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))),\n size: Schema.optional(ImageSize),\n aspectRatio: Schema.optional(Schema.String),\n seed: Schema.optional(Schema.Number),\n providerOptions: Schema.optional(Schema.Record(Schema.String, Schema.Record(Schema.String, Schema.Unknown))),\n http: Schema.optional(HttpOptions),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport type ImageRequestInput = Omit<ConstructorParameters<typeof ImageRequest>[0], \"http\"> & {\n readonly http?: HttpOptions.Input\n}\n\nexport class GeneratedImage extends Schema.Class<GeneratedImage>(\"Image.Generated\")({\n mediaType: Schema.String,\n data: Schema.Union([Schema.String, Schema.Uint8Array]),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {}\n\nexport class ImageResponse extends Schema.Class<ImageResponse>(\"Image.Response\")({\n images: Schema.Array(GeneratedImage),\n usage: Schema.optional(Usage),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {\n get image() {\n return this.images[0]\n }\n}\n\nexport const request = (input: ImageRequest | ImageRequestInput) => {\n if (input instanceof ImageRequest) return input\n return new ImageRequest({\n ...input,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n}\n\nexport const generate = (input: ImageRequest | ImageRequestInput) =>\n Effect.try({\n try: () => request(input),\n catch: (error) =>\n new LLMError({\n module: \"Image\",\n method: \"generate\",\n reason: new InvalidRequestReason({ message: error instanceof Error ? error.message : String(error) }),\n }),\n }).pipe(Effect.flatMap(ImageClient.generate))\n\nexport const Image = {\n request,\n generate,\n} as const\n" | ||
| ], | ||
| "mappings": ";0MAWO,WAAM,eAAgB,EAAQ,QAA4B,EAAE,uBAAuB,CAAE,CAAC,CAQtF,IAAM,EAA8D,EAAM,OAC/E,EACA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAgB,QACxC,OAAO,EAAQ,GAAG,CAChB,SAAU,CAAC,IAAY,EAAQ,MAAM,MAAM,SAAS,EAAS,EAAS,OAAO,CAC/E,CAAC,EACF,CACH,EClBO,MAAM,CAAW,CACb,GACA,SACA,MACA,SAET,WAAW,CAAC,EAAyB,CACnC,KAAK,GAAK,EAAM,GAChB,KAAK,SAAW,EAAM,SACtB,KAAK,MAAQ,EAAM,MACnB,KAAK,SAAW,EAAM,eAGjB,KAAI,CAAC,EAA6B,CACvC,OAAO,IAAI,EAAW,CACpB,GAAI,EAAQ,KAAK,EAAM,EAAE,EACzB,SAAU,EAAW,KAAK,EAAM,QAAQ,EACxC,MAAO,EAAM,MACb,SAAU,EAAM,QAClB,CAAC,EAEL,CAqBO,IAAM,EAAmB,EAAO,QAAQ,CAAC,IAA+B,aAAiB,EAAY,CAC1G,SAAU,aACZ,CAAC,EAEY,EAAY,EAAO,OAAO,CACrC,MAAO,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,EACxD,OAAQ,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,CAC3D,CAAC,EAAE,SAAS,CAAE,WAAY,YAAa,CAAC,EAGjC,MAAM,UAAqB,EAAO,MAAoB,eAAe,EAAE,CAC5E,MAAO,EACP,OAAQ,EAAO,OACf,MAAO,EAAO,SAAS,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,CAAC,EACzE,KAAM,EAAO,SAAS,CAAS,EAC/B,YAAa,EAAO,SAAS,EAAO,MAAM,EAC1C,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,gBAAiB,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CAAC,EAC3G,KAAM,EAAO,SAAS,CAAW,EACjC,SAAU,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CACxE,CAAC,CAAE,CAAC,CAMG,MAAM,UAAuB,EAAO,MAAsB,iBAAiB,EAAE,CAClF,UAAW,EAAO,OAClB,KAAM,EAAO,MAAM,CAAC,EAAO,OAAQ,EAAO,UAAU,CAAC,EACrD,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,CAAC,CAEG,MAAM,UAAsB,EAAO,MAAqB,gBAAgB,EAAE,CAC/E,OAAQ,EAAO,MAAM,CAAc,EACnC,MAAO,EAAO,SAAS,CAAK,EAC5B,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,IACG,MAAK,EAAG,CACV,OAAO,KAAK,OAAO,GAEvB", | ||
| "debugId": "B5C9F17CF053109564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { waitForCatalogReady } from \"../services/catalog\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n prepare: async (next) => {\n const selected =\n next.model ??\n (await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data))\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n if (model) {\n await waitForCatalogReady({\n sdk: client,\n directory: next.location.directory,\n workspace: next.location.workspaceID,\n model: { providerID: model.providerID, modelID: model.id },\n })\n const available = await client.model.list({\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.id))\n throw new RunTargetError(`Model unavailable: ${model.providerID}/${model.id}`, next.session?.id)\n }\n return {\n model,\n agent: input.agent\n ? await validateAgent(client, next.location.directory, next.location.workspaceID, input.agent)\n : next.agent,\n }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, workspace: string | undefined, name?: string) {\n if (!name) return\n const agents = await client.agent\n .list({ location: { directory, workspace } })\n .then((result) => result.data)\n .catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction errorMessage(error: unknown) {\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\")\n return error.message\n return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LLMToolContent,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n structured: Record<string, JsonValue>\n content: LLMToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.callID), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) {\n current.structured = event.data.structured\n current.content = event.data.content\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n error: event.data.error,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (toolOutputText(current.tool, current.content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n result: event.data.result,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (\n input.compatibility === \"v1\" &&\n event.data.error.message === \"Provider stream ended without a terminal finish event\"\n ) {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, callID: string) {\n return `${messageID}\\u0000${callID}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n structured: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": ";s7BAGA,oBAAS,0BACT,yBCKA,mBAAS,gBACT,wBAAS,uGCVT,mBAAS,iBAEF,SAAM,OAAQ,MACnB,cAAU,gBACV,iBAAa,eACb,uBAAmB,uBACnB,sBAAkB,sBACpB,OAEO,cAAS,MAAO,IAAI,EAAmB,CAC5C,QAAQ,OAAO,MAAM,EAAQ,KAAK,GAAG,EAAI,EAAG,EAG9C,IAAI,EAAQ,GAEL,SAAS,EAAK,EAAG,CACtB,GAAI,EAAO,OACX,EAAQ,EAAM,WAAW,EACzB,EAAQ,GAGH,SAAS,EAAK,CAAC,EAAiB,CACrC,GAAI,EAAQ,WAAW,SAAS,EAAG,EAAU,EAAQ,MAAM,CAAgB,EAC3E,EAAQ,EAAM,iBAAmB,UAAY,EAAM,YAAc,CAAO,ED2C1E,IAAM,EAAyB,SAE/B,eAAsB,CAAuB,CAAC,EAAc,CAC1D,IAAM,EAAa,IAAI,gBACjB,EAAS,EAAM,OAAO,MAAM,UAAU,CAAE,OAAQ,EAAW,MAAO,CAAC,EAAE,OAAO,eAAe,EAEjG,IADkB,MAAM,EAAO,KAAK,GACtB,KAAM,MAAU,MAAM,mDAAmD,EAEvF,IAAM,EAAY,EAAe,GAAG,OAAO,EACrC,EAAS,IAAI,IACb,EAAQ,IAAI,IACd,EAAY,GACZ,EAAW,GACX,EAAe,GACf,EAAqB,GACrB,EAAgB,GAChB,EAAc,GACd,EAAkB,GAClB,EACA,EAEE,EAAO,CAAC,EAAc,EAAmB,IAAkC,CAC/E,GAAI,EAAM,SAAW,OAAQ,MAAO,GAEpC,OADA,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAE,OAAM,YAAW,UAAW,EAAM,aAAc,CAAK,CAAC,EAAI,CAAG,EAC5F,IAGH,GAAY,CAAC,EAAgD,IAAsB,CACvF,GAAI,EAAK,OAAQ,EAAW,CAAE,MAAK,CAAC,EAAG,OACvC,IAAM,EAAO,EAAK,KAAK,KAAK,EAC5B,GAAI,CAAC,EAAM,OACX,GAAI,CAAC,QAAQ,OAAO,MAAO,CACzB,QAAQ,OAAO,MAAM,EAAO,CAAG,EAC/B,OAEF,EAAG,MAAM,EACT,EAAG,QAAQ,CAAI,EACf,EAAG,MAAM,GAGL,EAAY,IAAM,CACtB,GAAI,CAAC,EAAa,OAClB,IAAM,EAAQ,EAEd,GADA,EAAc,OACV,CAAC,EAAK,aAAc,EAAM,UAAW,CAAE,KAAM,EAAM,IAAK,CAAC,GAAK,EAAM,SAAW,OACjF,EAAG,MAAM,EACT,EAAG,QAAQ,EAAM,KAAK,EACtB,EAAG,MAAM,GAIP,EAAkB,MAAO,IAA8E,CAC3G,GAAI,CAAC,EAAM,KACT,EAAqB,GACrB,EAAG,QACD,EAAG,MAAM,kBAAoB,IAC7B,EAAG,MAAM,YACP,yBAAyB,EAAQ,WAAW,EAAQ,UAAU,KAAK,IAAI,oBAC3E,EASF,GAPA,MAAM,EAAM,OAAO,WAChB,MAAM,CACL,UAAW,EAAM,UACjB,UAAW,EAAQ,GACnB,MAAO,EAAM,KAAO,OAAS,QAC/B,CAAC,EACA,MAAM,IAAM,EAAE,EACb,CAAC,EAAM,KACT,MAAM,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,GAIjF,EAAa,MAAO,IAAmD,CAC3E,GAAI,CACF,MAAM,EAAM,OAAO,KAAK,OACtB,CAAE,UAAW,EAAQ,UAAW,OAAQ,EAAQ,EAAG,EACnD,GAAG,GAAmB,EAAQ,YAAc,EAAyB,EAAM,SAAW,MAAS,CACjG,EACA,MAAO,EAAO,CACd,GAAI,CAAC,GAAmB,CAAK,EAAG,MAAM,EAExC,EAAgB,IAGZ,GAAU,SAAY,CAC1B,MAAO,CAAC,EAAW,OAAO,QAAS,CACjC,IAAM,EAAO,MAAM,EAAO,KAAK,EAAE,MAAM,CAAC,IAAU,CAChD,GAAI,CAAC,EAAc,MAAM,EACzB,MAAO,CAAE,KAAM,GAAe,MAAO,MAAU,EAChD,EACD,GAAI,EAAK,KAAM,CACb,GAAI,EAAc,OAClB,MAAU,MAAM,mDAAmD,EAErE,IAAM,EAAQ,EAAK,MAEnB,GAAI,EAAM,OAAS,uBAAyB,GAAa,EAAM,KAAK,YAAc,EAAM,UAAW,CACjG,MAAM,EAAgB,EAAM,IAAI,EAChC,SAEF,GACE,EAAM,OAAS,gBACf,IACC,EAAM,KAAK,KAAK,YAAc,EAAM,WAClC,CAAC,EAAM,UACN,EAAM,KAAK,KAAK,YAAc,GAC9B,EAAa,EAAM,SAAU,EAAM,QAAQ,GAC/C,CACA,MAAM,EAAW,EAAM,KAAK,IAAI,EAChC,SAEF,GAAI,EAAE,cAAe,EAAM,OAAS,EAAM,KAAK,YAAc,EAAM,UAAW,SAC9E,IAAM,EAAO,EAAS,YAAa,EAAQ,EAAM,QAAU,MAAS,EAEpE,GAAI,EAAM,OAAS,0BACjB,GAAI,EAAM,KAAK,UAAY,EAAW,CACpC,EAAW,GACX,UAGJ,GACE,EAAM,OAAS,iCACf,EAAM,KAAK,SAAW,SACrB,GAAe,GAAsB,GAEtC,OAEF,GAAI,CAAC,EAAU,SAEf,GAAI,EAAM,OAAS,uBAAwB,CACzC,IAAM,EAAO,CACX,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,aACN,SAAU,EAAM,KAAK,QACvB,EACA,GAAI,EAAM,gBAAkB,KAAM,CAChC,EAAc,CACZ,UAAW,EACX,OACA,MAAO,KAAK,EAAM,KAAK,cAAU,EAAM,KAAK,MAAM,IACpD,EACA,SAEF,GAAI,CAAC,EAAK,aAAc,EAAM,CAAE,MAAK,CAAC,GAAK,EAAM,SAAW,OAC1D,EAAG,MAAM,EACT,EAAG,QAAQ,KAAK,EAAM,KAAK,cAAU,EAAM,KAAK,MAAM,IAAI,EAC1D,EAAG,MAAM,EAEX,SAGF,GAAI,EAAM,OAAS,uBAAwB,CACzC,EAAU,EACV,EAAO,IAAI,OAAQ,CAAE,GAAI,EAAO,EAAM,EAAE,EAAG,UAAW,CAAK,CAAC,EAC5D,SAEF,GAAI,EAAM,OAAS,qBAAsB,CACvC,IAAM,EAAU,EAAO,IAAI,MAAM,EACjC,EAAO,OAAO,MAAM,EACpB,IAAM,EAAO,CACX,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,KAAM,EAAM,KAAK,KACjB,KAAM,CAAE,MAAO,GAAS,WAAa,EAAM,IAAK,CAAK,CACvD,EACA,GAAU,EAAM,CAAI,EACpB,SAGF,GAAI,EAAM,OAAS,4BAA6B,CAC9C,EAAU,EACV,EAAO,IAAI,YAAa,CAAE,GAAI,EAAO,EAAM,EAAE,EAAG,UAAW,CAAK,CAAC,EACjE,SAEF,GAAI,EAAM,OAAS,2BAA6B,EAAM,SAAU,CAC9D,IAAM,EAAU,EAAO,IAAI,WAAW,EACtC,EAAO,OAAO,WAAW,EACzB,IAAM,EAAO,CACX,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,YACN,KAAM,EAAM,KAAK,KACjB,SAAU,EAAM,KAAK,MACrB,KAAM,CAAE,MAAO,GAAS,WAAa,EAAM,IAAK,CAAK,CACvD,EACA,GAAI,EAAK,YAAa,EAAM,CAAE,MAAK,CAAC,EAAG,SACvC,IAAM,EAAO,EAAK,KAAK,KAAK,EAC5B,GAAI,CAAC,EAAM,SACX,IAAM,EAAO,aAAa,IAC1B,GAAI,CAAC,QAAQ,OAAO,MAAO,CACzB,QAAQ,OAAO,MAAM,EAAO,CAAG,EAC/B,SAEF,EAAG,MAAM,EACT,EAAG,QAAQ,GAAG,EAAG,MAAM,kBAAoB,WAAgB,EAAG,MAAM,aAAa,EACjF,EAAG,MAAM,EACT,SAGF,GAAI,EAAM,OAAS,6BAA8B,CAC/C,EAAU,EACV,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,MAAM,EAAG,CACnE,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EACX,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,EAAM,KAAK,KACjB,MAAO,CAAC,EACR,WAAY,CAAC,EACb,QAAS,CAAC,CACZ,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,2BAA4B,CAC7C,IAAM,EAAU,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,MAAM,CAAC,EACnF,GAAI,EAAS,EAAQ,IAAM,EAAM,KAAK,KACtC,SAEF,GAAI,EAAM,OAAS,2BAA4B,CAC7C,IAAM,EAAU,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,MAAM,CAAC,EACnF,GAAI,EAAS,EAAQ,KAAO,EAAQ,KAAO,IAAM,EAAM,KAAK,MAC5D,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,EAAU,EACV,IAAM,EAAM,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,MAAM,EAC9D,EAAU,EAAM,IAAI,CAAG,EAC7B,EAAM,IAAI,EAAK,CACb,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,GAAS,WAAa,EACjC,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,GAAS,MAAQ,OACvB,MAAO,EAAM,KAAK,MAClB,IAAK,GAAS,IACd,SAAU,CAAE,SAAU,EAAM,KAAK,SAAU,MAAO,EAAM,KAAK,KAAM,EACnE,cAAe,EAAM,KAAK,MAC1B,WAAY,CAAC,EACb,QAAS,CAAC,CACZ,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,wBAAyB,CAC1C,IAAM,EAAU,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,MAAM,CAAC,EACnF,GAAI,EACF,EAAQ,WAAa,EAAM,KAAK,WAChC,EAAQ,QAAU,EAAM,KAAK,QAE/B,SAEF,GAAI,EAAM,OAAS,uBAAwB,CACzC,IAAM,EAAM,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,MAAM,EAC9D,EAAU,EAAM,IAAI,CAAG,GAAK,EAAa,CAAK,EAC9C,EAAoC,CACxC,KAAM,OACN,GAAI,EAAM,KAAK,OACf,KAAM,EAAQ,KACd,SAAU,EAAM,KAAK,SACrB,cAAe,EAAQ,cACvB,oBAAqB,EAAM,KAAK,YAChC,MAAO,CACL,OAAQ,YACR,MAAO,EAAQ,MACf,WAAY,EAAM,KAAK,WACvB,QAAS,EAAM,KAAK,QACpB,OAAQ,EAAM,KAAK,MACrB,EACA,KAAM,CAAE,QAAS,EAAQ,UAAW,IAAK,EAAQ,UAAW,UAAW,CAAK,CAC9E,EACM,EAAqB,CACzB,GAAI,EAAQ,GACZ,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,OAAQ,EAAM,KAAK,OACnB,KAAM,EAAQ,KACd,MAAO,CACL,OAAQ,YACR,MAAO,EAAQ,MACf,OAAQ,EAAe,EAAQ,KAAM,EAAM,KAAK,OAAO,EACvD,MAAO,EAAQ,KACf,SAAU,CACR,WAAY,EAAM,KAAK,WACvB,QAAS,EAAM,KAAK,QACpB,OAAQ,EAAM,KAAK,OACnB,aAAc,EAAQ,SACtB,eAAgB,CAAE,SAAU,EAAM,KAAK,SAAU,MAAO,EAAM,KAAK,WAAY,EAC/E,SAAU,EAAQ,GACpB,EACA,KAAM,CAAE,MAAO,EAAQ,UAAW,IAAK,CAAK,CAC9C,CACF,EAEA,GADA,EAAM,OAAO,CAAG,EACZ,CAAC,EAAK,WAAY,EAAM,CAAE,MAAK,CAAC,EAAG,MAAM,EAAM,WAAW,CAAI,EAClE,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,IAAM,EAAM,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,MAAM,EAC9D,EAAU,EAAM,IAAI,CAAG,GAAK,EAAa,CAAK,EAC9C,EAAQ,EAAM,KAAK,MAAM,QACzB,EAAoC,CACxC,KAAM,OACN,GAAI,EAAM,KAAK,OACf,KAAM,EAAQ,KACd,SAAU,EAAM,KAAK,SACrB,cAAe,EAAQ,cACvB,oBAAqB,EAAM,KAAK,YAChC,MAAO,CACL,OAAQ,QACR,MAAO,EAAQ,MACf,WAAY,EAAQ,WACpB,QAAS,EAAQ,QACjB,MAAO,EAAM,KAAK,MAClB,OAAQ,EAAM,KAAK,MACrB,EACA,KAAM,CAAE,QAAS,EAAQ,UAAW,IAAK,EAAQ,UAAW,UAAW,CAAK,CAC9E,EACM,EAAqB,CACzB,GAAI,EAAQ,GACZ,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,OAAQ,EAAM,KAAK,OACnB,KAAM,EAAQ,KACd,MAAO,CACL,OAAQ,QACR,MAAO,EAAQ,MACf,QACA,SAAU,CACR,OAAQ,EAAM,KAAK,OACnB,aAAc,EAAQ,SACtB,eAAgB,CAAE,SAAU,EAAM,KAAK,SAAU,MAAO,EAAM,KAAK,WAAY,EAC/E,SAAU,EAAQ,GACpB,EACA,KAAM,CAAE,MAAO,EAAQ,UAAW,IAAK,CAAK,CAC9C,CACF,EAEA,GADA,EAAM,OAAO,CAAG,EACZ,EAAM,gBAAkB,OAAS,GAAsB,GAAgB,SAC3E,GAAI,CAAC,EAAK,WAAY,EAAM,CAAE,MAAK,CAAC,EAAG,CACrC,GAAI,EAAe,EAAQ,KAAM,EAAQ,OAAO,EAAE,KAAK,EACrD,MAAM,EAAM,WAAW,IAClB,EACH,MAAO,CACL,OAAQ,YACR,MAAO,EAAQ,MACf,WAAY,EAAQ,WACpB,QAAS,EAAQ,QACjB,OAAQ,EAAM,KAAK,MACrB,CACF,CAAC,EACH,MAAM,EAAM,gBAAgB,CAAI,EAChC,EAAG,MAAM,CAAK,EAEhB,SAGF,GAAI,EAAM,OAAS,qBAAsB,CACvC,EAAU,EACV,IAAM,EAAO,CACX,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,cACN,OAAQ,EAAM,KAAK,OACnB,SAAU,EAAM,KAAK,SACrB,KAAM,EAAM,KAAK,KACjB,OAAQ,EAAM,KAAK,MACrB,EACA,EAAK,cAAe,EAAM,CAAE,MAAK,CAAC,EAClC,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,GACE,EAAM,gBAAkB,MACxB,EAAM,KAAK,MAAM,UAAY,wDAC7B,CACA,EAAc,OACd,EAAkB,GAClB,SAEF,GAAI,GAAe,GAAsB,EAAe,SAIxD,GAHA,EAAU,EACV,EAAe,GACf,QAAQ,SAAW,EACf,CAAC,EAAK,QAAS,EAAM,CAAE,MAAO,EAAM,KAAK,KAAM,CAAC,EAAG,EAAG,MAAM,EAAM,KAAK,MAAM,OAAO,EACxF,SAEF,GAAI,EAAM,OAAS,2BAA4B,CAC7C,GAAI,EAAM,gBAAkB,OAAS,GAAmB,GAAsB,GAAgB,OAE9F,GADA,EAAU,EACN,CAAC,GAAgB,CAAC,GAGpB,GAFA,EAAe,GACf,QAAQ,SAAW,EACf,CAAC,EAAK,QAAS,EAAM,CAAE,MAAO,EAAM,KAAK,KAAM,CAAC,EAAG,EAAG,MAAM,EAAM,KAAK,MAAM,OAAO,EAE1F,OAEF,GAAI,EAAM,OAAS,gCAAiC,CAClD,GAAI,EAAM,gBAAkB,OAAS,GAAsB,GAAgB,OAC3E,GAAI,EAAM,KAAK,SAAW,QAAU,EAAa,QAAQ,SAAW,IACpE,GAAI,EAAM,KAAK,SAAW,QAAU,CAAC,EAAc,CACjD,EAAe,GACf,QAAQ,SAAW,EACnB,IAAM,EAAQ,CAAE,KAAM,UAAoB,QAAS,wBAAwB,EAAM,KAAK,QAAS,EAC/F,GAAI,CAAC,EAAK,QAAS,EAAM,CAAE,OAAM,CAAC,EAAG,EAAG,MAAM,EAAM,OAAO,EAE7D,OAEF,GAAI,EAAM,OAAS,8BAA+B,SAIhD,EAAY,IAAM,CACtB,GAAI,EAAa,QAAQ,KAAK,GAAG,EACjC,EAAc,GACd,QAAQ,SAAW,IACnB,GAAW,MAAM,EACZ,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,GAEpF,QAAQ,GAAG,SAAU,CAAS,EAE9B,IAAI,EACJ,GAAI,CACF,GAAI,EAAM,MACR,MAAM,EAAM,OAAO,QAAQ,YAAY,CAAE,UAAW,EAAM,UAAW,MAAO,EAAM,KAAM,CAAC,EAE3F,IAAM,EAAW,EAAM,MACnB,CAAE,WAAY,EAAM,MAAM,WAAY,GAAI,EAAM,MAAM,QAAS,QAAS,EAAM,OAAQ,EACtF,EAAM,QACJ,MAAM,EAAM,OAAO,QAChB,IAAI,CAAE,UAAW,EAAM,SAAU,CAAC,EAClC,KAAK,CAAC,IAAW,EAAO,KAAK,EAC7B,KAAK,MAAO,IAAU,CACrB,GAAI,EAAO,MAAO,IAAK,EAAO,QAAS,EAAM,OAAQ,EAErD,IAAM,GADS,MAAM,EAAM,OAAO,MAAM,QAAQ,GACxB,KACxB,OAAO,EAAW,CAAE,WAAY,EAAS,WAAY,GAAI,EAAS,GAAI,QAAS,EAAM,OAAQ,EAAI,OAClG,EACH,OACN,GAAI,EAAM,SAAW,CAAC,EAAU,MAAU,MAAM,kDAAkD,EAClG,GAAI,EACF,MAAM,EAAM,OAAO,QAAQ,YAAY,CAAE,UAAW,EAAM,UAAW,MAAO,CAAS,CAAC,EAGxF,IAAM,EAAW,MAAM,QAAQ,IAAI,EAAM,MAAM,IAAI,EAAW,CAAC,EAC/D,GAAI,EAAa,OACjB,EAAY,GACZ,EAAY,GAAQ,EACpB,EAAY,IAAI,gBAChB,IAAM,EAAW,MAAM,EAAM,OAAO,QACjC,OACC,CACE,UAAW,EAAM,UACjB,GAAI,EACJ,KAAM,CAAC,EAAM,QAAS,GAAG,EAAS,QAAQ,CAAC,IAAU,EAAK,KAAO,CAAC,EAAK,IAAI,EAAI,CAAC,CAAE,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM,EAChG,MAAO,EAAS,QAAQ,CAAC,IAAU,EAAK,WAAa,CAAC,EAAK,UAAU,EAAI,CAAC,CAAE,EAC5E,SAAU,OACZ,EACA,CAAE,OAAQ,EAAU,MAAO,CAC7B,EACC,MAAM,MAAO,IAAU,CACtB,GAAI,EACF,MAAM,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,EAIrF,GAFA,EAAW,MAAM,EACjB,MAAM,GAAW,MAAM,IAAM,EAAE,EAC3B,GAAe,EAAc,OACjC,MAAM,EACP,EAEH,GADA,EAAY,OACR,CAAC,EAAU,OACf,GAAI,EAAa,MAAM,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,EAEpG,IAAO,EAAa,EAAO,GAAW,MAAM,QAAQ,IAAI,CACtD,EAAM,OAAO,WAAW,KAAK,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAClF,EAAM,OAAO,KAAK,KAAK,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAC5E,EAAM,SACF,QAAQ,QAAQ,MAAS,EACzB,EAAM,OAAO,KAAK,QACf,KAAK,CACJ,SAAU,CAAE,UAAW,EAAM,SAAS,UAAW,UAAW,EAAM,SAAS,WAAY,CACzF,CAAC,EACA,MAAM,IAAG,CAAG,OAAS,CAC9B,CAAC,EACD,MAAM,QAAQ,IAAI,CAChB,IAAI,GAAe,CAAC,GAAG,IAAI,CAAe,EAC1C,IAAI,GAAS,CAAC,GAAG,IAAI,CAAU,EAC/B,GAAI,GAAW,EAAa,EAAQ,SAAU,EAAM,QAAQ,EACxD,EAAQ,KAAK,OAAO,CAAC,IAAS,EAAK,YAAc,CAAsB,EAAE,IAAI,CAAU,EACvF,CAAC,CACP,CAAC,EACD,MAAM,SACN,CACA,QAAQ,IAAI,SAAU,CAAS,EAC/B,EAAW,MAAM,EACjB,MAAM,EAAO,SAAS,MAAS,EAAE,MAAM,IAAM,EAAE,GAInD,SAAS,CAAY,CAAC,EAA+B,EAAoB,CACvE,MAAO,CAAC,CAAC,GAAQ,EAAK,YAAc,EAAM,WAAa,EAAK,cAAgB,EAAM,YAGpF,SAAS,EAAkB,CAAC,EAA+E,CACzG,GAAI,CAAC,EAAU,MAAO,CAAC,EACvB,MAAO,CACL,CACE,QAAS,CACP,uBAAwB,mBAAmB,EAAS,SAAS,KACzD,EAAS,YAAc,CAAE,uBAAwB,EAAS,WAAY,EAAI,CAAC,CACjF,CACF,CACF,EAGF,SAAS,EAAkB,CAAC,EAAgB,CAC1C,MAAO,CAAC,CAAC,GAAS,OAAO,IAAU,UAAY,QAAQ,IAAI,EAAO,MAAM,IAAM,0BAGhF,SAAS,CAAM,CAAC,EAAiB,CAC/B,MAAO,OAAO,EAAQ,QAAQ,QAAS,EAAE,IAG3C,SAAS,CAAO,CAAC,EAAmB,EAAgB,CAClD,MAAO,GAAG,QAAkB,IAG9B,SAAS,CAAY,CAAC,EAIR,CACZ,MAAO,CACL,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EAAS,EAAM,OAAO,EACjC,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,OACN,MAAO,CAAC,EACR,WAAY,CAAC,EACb,QAAS,CAAC,CACZ,EAGF,SAAS,CAAQ,CAAC,EAAgB,CAChC,GAAI,OAAO,IAAU,SAAU,OAAO,EACtC,GAAI,OAAO,IAAU,SAAU,OAAO,IAAI,KAAK,CAAK,EAAE,QAAQ,EAC9D,OAAO,KAAK,IAAI,EAGlB,eAAe,EAAW,CAAC,EAAY,CACrC,GAAI,EAAK,OAAS,aAIhB,MAAO,CAAE,WAAY,CAAE,IAHX,EAAK,IAAI,WAAW,OAAO,EACnC,EAAK,IACL,QAAQ,EAAK,gBAAgB,MAAM,EAAS,IAAI,IAAI,EAAK,GAAG,CAAC,GAAG,SAAS,QAAQ,IACzD,KAAM,EAAK,QAAS,CAAE,EAEpD,IAAM,EAAU,EAAK,IAAI,WAAW,OAAO,EACvC,OAAO,KAAK,EAAK,IAAI,MAAM,EAAK,IAAI,QAAQ,GAAG,EAAI,CAAC,EAAG,QAAQ,EAAE,SAAS,MAAM,EAChF,MAAM,EAAS,IAAI,IAAI,EAAK,GAAG,EAAG,MAAM,EAC5C,MAAO,CAAE,KAAM,eAAe,EAAK;AAAA,EAAe;AAAA,QAAmB,EDpkBvE,MAAM,UAAuB,KAAM,CAGtB,UAFX,WAAW,CACT,EACS,EACT,CACA,MAAM,CAAO,EAFJ,iBAIb,CAEA,IAAM,GAAwB,SAEvB,SAAS,EAAiB,CAAC,EAAwB,CACxD,OAAO,GAA6B,EAAO,CAAC,CAAC,EAIxC,SAAS,EAA4B,CAAC,EAAwB,EAA2B,CAC9F,OAAO,GAAI,EAAO,CAAO,EAAE,MAAM,CAAC,IAAU,EAAe,EAAO,GAAa,CAAK,CAAC,CAAC,EAGxF,eAAe,EAAG,CAAC,EAAwB,EAA2B,CACpE,GAAI,EAAM,MAAQ,CAAC,EAAM,UAAY,CAAC,EAAM,QAAS,EAAK,yCAAyC,EACnG,IAAM,EAAO,EAAQ,MAAQ,QAAQ,IAAI,KAAO,QAAQ,IAAI,EACtD,EAAQ,GAAe,CAAI,EAC3B,EAAY,EAAQ,mBAAqB,OAAa,EAAQ,WAAa,EAC3E,EAAU,GAAW,GAAc,EAAM,OAAO,EAAG,QAAQ,MAAM,MAAQ,OAAY,MAAM,GAAU,CAAC,EAC5G,GAAI,CAAC,GAAS,KAAK,EAAG,EAAK,4BAA4B,EACvD,IAAM,EAAQ,MAAM,QAAQ,IAAI,EAAM,KAAK,IAAI,CAAC,IAAS,GAAY,EAAM,EAAM,CAAO,CAAC,CAAC,EAE1F,OAAO,GAAQ,EADE,CAAE,YAAW,UAAS,OAAM,EACb,EAAM,OAAO,SAAU,CAAO,EAGhE,eAAe,EAAO,CAAC,EAAwB,EAAoB,EAAoB,EAA2B,CAChH,IAAM,EAAS,GAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,GAAc,EAAM,KAAK,EACpC,EAAS,MAAM,GAAqB,CACxC,SACA,SAAU,EAAS,UAAY,CAAE,UAAW,EAAS,SAAU,EAAI,OACnE,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,KAAM,EAAM,KACZ,MAAO,EACH,CAAE,WAAY,EAAS,MAAM,WAAY,GAAI,EAAS,MAAM,QAAS,QAAS,EAAS,OAAQ,EAC/F,OACJ,MAAO,EAAM,MACb,QAAS,MAAO,IAAS,CACvB,IAAM,EACJ,EAAK,OACJ,MAAM,EAAO,MACX,QAAQ,CAAE,SAAU,CAAE,UAAW,EAAK,SAAS,UAAW,UAAW,EAAK,SAAS,WAAY,CAAE,CAAC,EAClG,KAAK,CAAC,IAAW,EAAO,IAAI,EAC3B,EAAQ,EACV,CACE,WAAY,EAAS,WACrB,GAAI,EAAS,GACb,QAAS,EAAQ,UAAY,YAAa,EAAW,EAAS,QAAU,OAC1E,EACA,OACJ,IAAK,EAAQ,SAAW,GAAU,UAAY,CAAC,EAC7C,MAAM,IAAI,EAAe,mDAAoD,EAAK,SAAS,EAAE,EAC/F,GAAI,GAUF,GATA,MAAM,GAAoB,CACxB,IAAK,EACL,UAAW,EAAK,SAAS,UACzB,UAAW,EAAK,SAAS,YACzB,MAAO,CAAE,WAAY,EAAM,WAAY,QAAS,EAAM,EAAG,CAC3D,CAAC,EAIG,EAHc,MAAM,EAAO,MAAM,KAAK,CACxC,SAAU,CAAE,UAAW,EAAK,SAAS,UAAW,UAAW,EAAK,SAAS,WAAY,CACvF,CAAC,GACc,KAAK,KAAK,CAAC,IAAS,EAAK,aAAe,EAAM,YAAc,EAAK,KAAO,EAAM,EAAE,EAC7F,MAAM,IAAI,EAAe,sBAAsB,EAAM,cAAc,EAAM,KAAM,EAAK,SAAS,EAAE,EAEnG,MAAO,CACL,QACA,MAAO,EAAM,MACT,MAAM,GAAc,EAAQ,EAAK,SAAS,UAAW,EAAK,SAAS,YAAa,EAAM,KAAK,EAC3F,EAAK,KACX,EAEJ,CAAC,EAAE,MAAM,CAAC,IAAU,CAClB,GAAI,EAAE,aAAiB,GAAiB,MAAM,EAC9C,EAAe,EAAO,EAAM,QAAS,EAAM,SAAS,EACpD,OACD,EACD,GAAI,CAAC,EAAQ,OACb,IAAM,EAAQ,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC3F,EAAU,EAAO,OAAO,QAC9B,GAAI,CAAC,EAAO,QAAU,EAAM,QAAU,OACpC,MAAM,EAAO,QAAQ,OAAO,CAC1B,UAAW,EAAO,QAAQ,GAC1B,MAAO,EAAM,OAAS,EAAS,QAAQ,MAAM,EAAG,EAAE,GAAK,EAAS,QAAQ,OAAS,GAAK,MAAQ,GAChG,CAAC,EAGH,MAAM,EAAwB,CAC5B,SACA,UAAW,EAAO,QAAQ,GAC1B,SAAU,EAAO,SACjB,QAAS,EAAS,QAClB,MAAO,EAAS,MAChB,MAAO,EAAO,MACd,QACA,UACA,SAAU,EAAM,UAAY,GAC5B,OAAQ,EAAM,OACd,KAAM,EAAM,MAAQ,GACpB,SAAU,EAAQ,UAAY,GAC9B,cAAe,EAAQ,cACvB,WAAY,CAAC,IAAS,GAAW,EAAM,EAAO,SAAS,SAAS,EAChE,gBAAiB,CAAC,IAAS,GAAgB,EAAM,EAAO,SAAS,SAAS,CAC5E,CAAC,EAAE,MAAM,CAAC,IAAU,EAAe,EAAO,GAAa,CAAK,EAAG,EAAO,QAAQ,EAAE,CAAC,EAG5E,SAAS,EAAU,CAAC,EAA6B,EAA2B,CACjF,GAAI,CAAC,EAAS,OAAO,GAAS,OAC9B,GAAI,CAAC,EAAO,OAAO,EACnB,OAAO,EAAU;AAAA,EAAO,EAG1B,SAAS,EAAa,CAAC,EAAmB,CAExC,OADc,EAAQ,IAAI,CAAC,IAAU,EAAK,SAAS,GAAG,EAAI,IAAI,EAAK,QAAQ,KAAM,MAAK,KAAO,CAAK,EAAE,KAAK,GAAG,GAC5F,OAGlB,SAAS,EAAc,CAAC,EAAc,CACpC,GAAI,CAEF,OADA,QAAQ,MAAM,CAAI,EACX,QAAQ,IAAI,EACnB,KAAM,CACN,EAAK,iCAAiC,GAAM,GAIzC,SAAS,EAAa,CAAC,EAAgB,CAC5C,IAAM,EAAM,GAAwB,CAAK,EACzC,GAAI,CAAC,EAAK,OACV,MAAO,CACL,MAAO,CAAE,WAAY,EAAI,WAAY,QAAS,EAAI,EAAG,EACrD,QAAS,EAAI,OACf,EAGF,eAAe,EAAa,CAAC,EAAwB,EAAmB,EAA+B,EAAe,CACpH,GAAI,CAAC,EAAM,OACX,IAAM,EAAS,MAAM,EAAO,MACzB,KAAK,CAAE,SAAU,CAAE,YAAW,WAAU,CAAE,CAAC,EAC3C,KAAK,CAAC,IAAW,EAAO,IAAI,EAC5B,MAAM,IAAG,CAAG,OAAS,EACxB,GAAI,CAAC,EAAQ,CACX,EAAQ,sDAAsD,EAC9D,OAEF,IAAM,EAAQ,EAAO,KAAK,CAAC,IAAS,EAAK,KAAO,CAAI,EACpD,GAAI,CAAC,EAAO,CACV,EAAQ,UAAU,6CAAgD,EAClE,OAEF,GAAI,EAAM,OAAS,WAAY,CAC7B,EAAQ,UAAU,sEAAyE,EAC3F,OAEF,OAAO,EAGT,eAAe,EAAW,CAAC,EAAe,EAAmB,EAA8C,CACzG,IAAM,EAAO,EAAK,QAAQ,EAAW,CAAK,EACpC,EAAS,MAAM,GAAK,EAAM,GAAG,EAAE,MAAM,IAAM,EAAK,mBAAmB,GAAO,CAAC,EACjF,GAAI,CACF,IAAM,EAAO,MAAM,EAAO,KAAK,EAC/B,GAAI,EAAQ,gBAAkB,MAAQ,EAAQ,UAAY,EAAK,YAAY,EACzE,EAAK,8DAA8D,GAAO,EAC5E,GAAI,CAAC,EAAK,OAAO,GAAK,EAAK,KAAO,GAChC,EAAK,wEAAwE,GAAO,EACtF,IAAM,EAAU,OAAO,MAAM,OAAO,EAAK,IAAI,CAAC,EAC1C,EAAS,EACb,MAAO,EAAS,EAAQ,OAAQ,CAC9B,IAAM,EAAO,MAAM,EAAO,KAAK,EAAS,EAAQ,EAAQ,OAAS,EAAQ,CAAM,EAC/E,GAAI,EAAK,YAAc,EAAG,MAC1B,GAAU,EAAK,UAEjB,IAAM,EAAQ,EAAQ,SAAS,EAAG,CAAM,EAClC,EAAW,EAAO,SAAS,CAAI,EAC/B,EAAO,EAAM,SAAS,MAAM,EAC5B,EACJ,EAAS,WAAW,QAAQ,GAAK,IAAa,kBAC1C,EACA,CAAC,GAAgB,CAAK,GAAK,OAAO,KAAK,EAAM,MAAM,EAAE,OAAO,CAAK,EAC/D,aACA,EACR,MAAO,CACL,IAAK,QAAQ,YAAe,EAAM,SAAS,QAAQ,IACnD,SAAU,EAAK,SAAS,CAAI,EAC5B,MACF,SACA,CACA,MAAM,EAAO,MAAM,GAIvB,SAAS,EAAe,CAAC,EAAmB,CAC1C,GAAI,EAAM,SAAW,EAAG,MAAO,GAC/B,GAAI,EAAM,SAAS,CAAC,EAAG,MAAO,GAC9B,OAAO,EAAM,OAAO,CAAC,EAAO,IAAS,EAAQ,OAAO,EAAO,GAAM,EAAO,IAAM,EAAO,EAAG,EAAG,CAAC,EAAI,EAAM,OAAS,IAGjH,eAAe,EAAU,CAAC,EAAmC,EAAmB,CAC9E,IAAM,EAAO,EAAe,EAAM,CAAS,EAC3C,GAAI,EAAK,OAAS,QAAS,CAGzB,GAFA,EAAG,MAAM,EACT,EAAG,QAAQ,EAAG,MAAM,YAAc,EAAK,KAAM,EAAG,MAAM,YAAc,EAAK,KAAK,EAC1E,EAAK,MAAM,KAAK,EAAG,EAAG,QAAQ,EAAK,IAAI,EAC3C,EAAG,MAAM,EACT,OAEF,EAAG,QACD,EAAG,MAAM,YAAc,EAAK,KAC5B,EAAG,MAAM,YAAc,EAAK,MAC5B,EAAK,YAAc,EAAG,MAAM,SAAW,EAAK,YAAc,EAAG,MAAM,YAAc,EACnF,EAGF,eAAe,EAAe,CAAC,EAAmC,EAAmB,CACnF,IAAM,EAAO,EAAe,EAAM,CAAS,EAC3C,EAAG,QAAQ,EAAG,MAAM,YAAc,SAAI,EAAG,MAAM,YAAc,GAAG,EAAK,cAAc,EAGrF,SAAS,CAAO,CAAC,EAAiB,CAChC,EAAG,QAAQ,EAAG,MAAM,kBAAoB,IAAK,EAAG,MAAM,YAAa,CAAO,EAG5E,SAAS,EAAY,CAAC,EAAgB,CACpC,GAAI,aAAiB,MAAO,OAAO,EAAM,QACzC,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,YAAa,GAAS,OAAO,EAAM,UAAY,SAChG,OAAO,EAAM,QACf,OAAO,OAAO,CAAK,EAId,SAAS,CAAc,CAAC,EAAwC,EAAiB,EAAoB,CAE1G,GADA,QAAQ,SAAW,EACf,EAAM,SAAW,OAAQ,CAC3B,QAAQ,OAAO,MACb,KAAK,UAAU,CACb,KAAM,QACN,UAAW,KAAK,IAAI,EACpB,UAAW,GAAa,GACxB,MAAO,CAAE,KAAM,UAAW,SAAQ,CACpC,CAAC,EAAI;AAAA,CACP,EACA,OAEF,EAAG,MAAM,CAAO,EAGlB,SAAS,CAAI,CAAC,EAAwB,CACpC,MAAU,MAAM,CAAO", | ||
| "debugId": "D061029C4E51E05864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "2BCC94951762EED264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderOptions, ReasoningEffort, TextVerbosity } from \"../schema\"\nimport { mergeProviderOptions } from \"../schema\"\nimport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options\"\n\nexport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options\"\n\nexport interface OpenAIOptionsInput {\n readonly [key: string]: unknown\n readonly store?: boolean\n readonly promptCacheKey?: string\n readonly reasoningEffort?: ReasoningEffort\n readonly reasoningSummary?: \"auto\"\n // OpenAI Responses `include` wire field. Mirrors the official SDK's\n // `ResponseIncludable[]` union exactly so AI SDK callers and direct\n // native-SDK callers share one shape and no translation is required.\n readonly include?: ReadonlyArray<OpenAIResponseIncludable>\n readonly textVerbosity?: TextVerbosity\n readonly serviceTier?: OpenAIServiceTier\n}\n\nexport type OpenAIProviderOptionsInput = ProviderOptions & {\n readonly openai?: OpenAIOptionsInput\n}\n\nconst definedEntries = (input: Record<string, unknown>) =>\n Object.entries(input).filter((entry) => entry[1] !== undefined)\n\nconst openAIProviderOptions = (options: OpenAIOptionsInput | undefined): ProviderOptions | undefined => {\n const openai = Object.fromEntries(\n definedEntries({\n store: options?.store,\n promptCacheKey: options?.promptCacheKey,\n reasoningEffort: options?.reasoningEffort,\n reasoningSummary: options?.reasoningSummary,\n include: options?.include,\n textVerbosity: options?.textVerbosity,\n serviceTier: options?.serviceTier,\n }),\n )\n if (Object.keys(openai).length === 0) return undefined\n return { openai }\n}\n\nexport const gpt5DefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined => {\n const id = modelID.toLowerCase()\n if (!id.includes(\"gpt-5\") || id.includes(\"gpt-5-chat\") || id.includes(\"gpt-5-pro\")) return undefined\n return openAIProviderOptions({\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n // GPT-5 reasoning models are configured stateless (`store: false`) by\n // `openAIDefaultOptions` below, so the only way a follow-up turn can\n // carry reasoning state is via the encrypted reasoning include. Without\n // this, callers using the default model facade get reasoning summaries\n // they cannot replay statelessly.\n include: [\"reasoning.encrypted_content\"],\n textVerbosity:\n options.textVerbosity === true && id.includes(\"gpt-5.\") && !id.includes(\"codex\") && !id.includes(\"-chat\")\n ? \"low\"\n : undefined,\n })\n}\n\nexport const openAIDefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined =>\n mergeProviderOptions(openAIProviderOptions({ store: false }), gpt5DefaultOptions(modelID, options))\n\nexport const withOpenAIOptions = <Options extends { readonly providerOptions?: OpenAIProviderOptionsInput }>(\n modelID: string,\n options: Options,\n defaults: { readonly textVerbosity?: boolean } = {},\n): Omit<Options, \"providerOptions\"> & { readonly providerOptions?: ProviderOptions } => {\n return {\n ...options,\n providerOptions: mergeProviderOptions(openAIDefaultOptions(modelID, defaults), options.providerOptions),\n }\n}\n\nexport * as OpenAIProviderOptions from \"./openai-options\"\n" | ||
| ], | ||
| "mappings": ";oDAwBA,IAAM,EAAiB,CAAC,IACtB,OAAO,QAAQ,CAAK,EAAE,OAAO,CAAC,IAAU,EAAM,KAAO,MAAS,EAE1D,EAAwB,CAAC,IAAyE,CACtG,IAAM,EAAS,OAAO,YACpB,EAAe,CACb,MAAO,GAAS,MAChB,eAAgB,GAAS,eACzB,gBAAiB,GAAS,gBAC1B,iBAAkB,GAAS,iBAC3B,QAAS,GAAS,QAClB,cAAe,GAAS,cACxB,YAAa,GAAS,WACxB,CAAC,CACH,EACA,GAAI,OAAO,KAAK,CAAM,EAAE,SAAW,EAAG,OACtC,MAAO,CAAE,QAAO,GAGL,EAAqB,CAChC,EACA,EAAgD,CAAC,IACjB,CAChC,IAAM,EAAK,EAAQ,YAAY,EAC/B,GAAI,CAAC,EAAG,SAAS,OAAO,GAAK,EAAG,SAAS,YAAY,GAAK,EAAG,SAAS,WAAW,EAAG,OACpF,OAAO,EAAsB,CAC3B,gBAAiB,SACjB,iBAAkB,OAMlB,QAAS,CAAC,6BAA6B,EACvC,cACE,EAAQ,gBAAkB,IAAQ,EAAG,SAAS,QAAQ,GAAK,CAAC,EAAG,SAAS,OAAO,GAAK,CAAC,EAAG,SAAS,OAAO,EACpG,MACA,MACR,CAAC,GAGU,EAAuB,CAClC,EACA,EAAgD,CAAC,IAEjD,EAAqB,EAAsB,CAAE,MAAO,EAAM,CAAC,EAAG,EAAmB,EAAS,CAAO,CAAC,EAEvF,EAAoB,CAC/B,EACA,EACA,EAAiD,CAAC,IACoC,CACtF,MAAO,IACF,EACH,gBAAiB,EAAqB,EAAqB,EAAS,CAAQ,EAAG,EAAQ,eAAe,CACxG", | ||
| "debugId": "819BEB8FA62A55A664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "954D0B48E5B5B12A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "C7447D167BAAF80264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts", "src/util/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function defaultPort(channel = InstallationChannel) {\n if (channel === \"latest\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n return {\n file,\n version: InstallationVersion,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n", | ||
| "import path from \"node:path\"\n\nexport function selfCommand() {\n const runtime = path.basename(process.execPath, path.extname(process.execPath)).toLowerCase()\n if (runtime !== \"bun\" && runtime !== \"node\" && runtime !== \"nodejs\") return [process.execPath]\n if (!process.argv[1]) throw new Error(\"Failed to resolve CLI entrypoint\")\n if (runtime === \"node\" || runtime === \"nodejs\") return [process.execPath, ...nodeFlags(), process.argv[1]]\n return [process.execPath, process.argv[1]]\n}\n\nfunction nodeFlags() {\n return process.execArgv.flatMap((arg, index, args) => {\n if (index > 0 && args[index - 1] === \"--conditions\") return []\n if (arg === \"--conditions\") return args[index + 1] ? [arg, args[index + 1]] : []\n if (arg.startsWith(\"--conditions=\")) return [arg]\n if (\n arg === \"--experimental-ffi\" ||\n arg === \"--use-system-ca\" ||\n arg === \"--enable-source-maps\" ||\n arg === \"--no-addons\"\n )\n return [arg]\n if (arg === \"--no-warnings\" || arg.startsWith(\"--disable-warning=\")) return [arg]\n return []\n })\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E754D4C3DC5C8CD264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "DF90C063B3CED6DA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/api.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nconst methods = new Set([\"delete\", \"get\", \"head\", \"options\", \"patch\", \"post\", \"put\"])\n\ntype Operation = {\n operationId?: string\n}\n\ntype OpenApi = {\n paths?: Record<string, Record<string, Operation>>\n}\n\nexport default Runtime.handler(\n Commands.commands.api,\n Effect.fn(\"cli.api\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n mismatch: \"ignore\",\n })\n const endpoint = server.endpoint\n const params = Option.getOrElse(input.param, () => ({}))\n const request = yield* resolveRequest(endpoint, input.request, params)\n const headers = new Headers(Service.headers(endpoint))\n for (const header of input.header) {\n const index = header.indexOf(\":\")\n if (index < 1) return yield* Effect.fail(new Error(`Invalid header, expected name:value: ${header}`))\n headers.set(header.slice(0, index).trim(), header.slice(index + 1).trim())\n }\n const body = Option.getOrUndefined(input.data)\n if (body !== undefined && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\")\n\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(request.path, endpoint.url), {\n method: request.method,\n headers,\n body,\n }),\n )\n const output = yield* Effect.promise(() => response.text())\n if (output) process.stdout.write(output + (output.endsWith(EOL) ? \"\" : EOL))\n }),\n)\n\nexport function resolveOperation(spec: OpenApi, operationID: string, params: Record<string, string>) {\n for (const [path, operations] of Object.entries(spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(operations)) {\n if (!methods.has(method) || operation.operationId !== operationID) continue\n return { method: method.toUpperCase(), path: interpolate(path, params) }\n }\n }\n throw new Error(`Operation not found: ${operationID}`)\n}\n\nexport function rawRequest(input: readonly string[]) {\n if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith(\"/\")) return\n return { method: input[0].toUpperCase(), path: input[1] }\n}\n\nfunction resolveRequest(endpoint: Endpoint, input: readonly string[], params: Record<string, string>) {\n const raw = rawRequest(input)\n if (raw) return Effect.succeed(raw)\n if (input.length !== 1) return Effect.fail(new Error(\"Expected an operation name or an HTTP method and path\"))\n return Effect.tryPromise(async () => {\n const response = await fetch(new URL(\"/openapi.json\", endpoint.url), { headers: Service.headers(endpoint) })\n if (!response.ok) throw new Error(`Failed to load OpenAPI document: HTTP ${response.status}`)\n return resolveOperation((await response.json()) as OpenApi, input[0], params)\n })\n}\n\nfunction interpolate(path: string, params: Record<string, string>) {\n const used = new Set<string>()\n const pathname = path.replaceAll(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n used.add(name)\n return encodeURIComponent(value)\n })\n const query = new URLSearchParams(Object.entries(params).filter(([name]) => !used.has(name))).toString()\n return query ? `${pathname}?${query}` : pathname\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "31B96FF3E4B8ACB964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/stop.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,CACH", | ||
| "debugId": "5D5938320845FF7164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "81F99A2EFE309D3064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-compatible-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { Route, type RouteRoutedModelInput } from \"../route/client\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport * as OpenAIChat from \"./openai-chat\"\n\nconst ADAPTER = \"openai-compatible-chat\"\n\nexport type OpenAICompatibleChatModelInput = RouteRoutedModelInput\n\n/**\n * Route for non-OpenAI providers that expose an OpenAI Chat-compatible\n * `/chat/completions` endpoint. Reuses `OpenAIChat.protocol` end-to-end and\n * overrides only the route id so providers can be resolved per-family without\n * colliding with native OpenAI. Provider helpers configure the route endpoint\n * before model selection.\n */\nexport const route = Route.make({\n id: ADAPTER,\n providerMetadataKey: \"openai\",\n protocol: OpenAIChat.protocol,\n endpoint: Endpoint.path(\"/chat/completions\"),\n framing: Framing.sse,\n})\n\nexport * as OpenAICompatibleChat from \"./openai-compatible-chat\"\n" | ||
| ], | ||
| "mappings": ";mHAKA,SAAM,EAAU,yBAWH,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,oBAAqB,SACrB,SAAqB,EACrB,SAAU,EAAS,KAAK,mBAAmB,EAC3C,QAAS,EAAQ,GACnB,CAAC", | ||
| "debugId": "55D6846C07C7DC4964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/plugin/sdk.ts", "../plugin/src/v2/effect/tool.ts", "../plugin/src/v2/effect/plugin.ts", "../schema/src/session.ts", "../schema/src/command.ts", "../schema/src/reference.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SdkPlugins from \"./sdk\"\n\nimport type { Plugin } from \"@opencode-ai/plugin/v2/effect/plugin\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { makeGlobalNode } from \"../effect/app-node\"\nimport { EventV2 } from \"../event\"\nimport type { PluginV2 } from \"../plugin\"\n\nexport const Updated = EventV2.ephemeral({ type: \"sdk.plugin.updated\", schema: {} })\n\n/**\n * Holds the plugins an embedder (the `@opencode-ai/sdk-next` host) contributes,\n * so `PluginSupervisor` can add them on every Location boot through the ordinary\n * generation path that `PluginSupervisor` uses for plugins discovered from\n * config. Registration publishes an unlocated update so every booted Location\n * reloads its plugin generation from the shared store.\n *\n * Each host-global layer owns one private store. Location graphs reuse that\n * layer through Effect's memoization, so separate hosts remain isolated while\n * every Location in one host sees the same registrations.\n */\nexport interface Interface {\n readonly register: (plugin: Plugin) => Effect.Effect<void>\n readonly all: () => readonly PluginV2.Versioned[]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/SdkPlugins\") {}\n\nexport const layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const events = yield* EventV2.Service\n const plugins = new Map<string, PluginV2.Versioned>()\n let revision = 0\n return Service.of({\n register: (plugin) =>\n Effect.sync(() => {\n plugins.set(plugin.id, { ...plugin, version: String(++revision) })\n }).pipe(Effect.andThen(events.publish(Updated, {})), Effect.asVoid),\n all: () => [...plugins.values()],\n })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer, deps: [EventV2.node] })\n", | ||
| "export * as Tool from \"./tool.js\"\n\nimport { Agent } from \"@opencode-ai/schema/agent\"\nimport type { LLM } from \"@opencode-ai/schema/llm\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from \"@standard-schema/spec\"\nimport { Effect, JsonSchema, Schema } from \"effect\"\nimport type { Hooks, Transform } from \"./registration.js\"\n\nexport interface Context {\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly progress: (update: Progress) => Effect.Effect<void>\n}\n\nexport interface Progress {\n readonly structured: Readonly<Record<string, unknown>>\n readonly content?: ReadonlyArray<Content>\n}\n\nexport type StandardSchemaType<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output> &\n StandardJSONSchemaV1<Input, Output>\nexport type SchemaType<A> = Schema.Codec<A, any> | StandardSchemaType<any, A>\ntype IsAny<A> = 0 extends 1 & A ? true : false\nexport type InputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\nexport type OutputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<infer A, any>\n ? A\n : never\nexport type EncodedValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<any, infer A>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\n\ntype ToolDefinition = {\n readonly name: string\n readonly description: string\n readonly inputSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n}\n\ntype ToolCall = {\n readonly input: unknown\n readonly [key: string]: unknown\n}\n\ntype ToolResultValue =\n | { readonly type: \"json\"; readonly value: unknown }\n | { readonly type: \"text\"; readonly value: unknown }\n | { readonly type: \"error\"; readonly value: unknown }\n | { readonly type: \"content\"; readonly value: ReadonlyArray<LLM.ToolContent> }\n\ntype ToolOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<LLM.ToolContent>\n}\n\nexport class Failure extends Schema.TaggedErrorClass<Failure>()(\"LLM.ToolFailure\", {\n message: Schema.String,\n error: Schema.optional(Schema.Defect()),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport class RegistrationError extends Schema.TaggedErrorClass<RegistrationError>()(\"Tool.RegistrationError\", {\n name: Schema.String,\n message: Schema.String,\n}) {}\n\nexport type Content =\n | { readonly type: \"text\"; readonly text: string }\n | { readonly type: \"file\"; readonly data: string; readonly mime: string; readonly name?: string }\n\nexport type Definition<\n Input extends SchemaType<any>,\n Structured extends SchemaType<any>,\n Output extends SchemaType<any> = any,\n> = {\n readonly description: string\n readonly input: Input\n readonly output: Output\n readonly structured?: Structured\n readonly permission?: string\n readonly toStructuredOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => OutputValue<Structured>\n readonly execute: (input: InputValue<Input>, context: Context) => Effect.Effect<OutputValue<Output>, Failure>\n readonly toModelOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => ReadonlyArray<Content>\n}\n\nexport type DynamicOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<Content>\n}\n\n/**\n * Config for a tool whose input shape is a raw JSON Schema not known at compile\n * time (MCP servers, plugin manifests). Input is passed through as `unknown`;\n * `execute` returns the already-projected structured value and model content.\n */\nexport type DynamicDefinition = {\n readonly description: string\n readonly jsonSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n readonly permission?: string\n readonly execute: (input: unknown, context: Context) => Effect.Effect<DynamicOutput, Failure>\n}\n\nexport type AnyTool = Definition<any, any> | DynamicDefinition\n\nexport function make<\n Input extends SchemaType<any>,\n Output extends SchemaType<any>,\n Structured extends SchemaType<any> = Output,\n>(config: Definition<Input, Structured, Output>): Definition<Input, Structured, Output>\nexport function make(config: DynamicDefinition): DynamicDefinition\nexport function make(config: AnyTool): AnyTool\nexport function make(config: AnyTool): AnyTool {\n return config\n}\n\nfunction toModelContent(part: Content) {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text }\n return { type: \"file\" as const, uri: `data:${part.mime};base64,${part.data}`, mime: part.mime, name: part.name }\n}\n\nexport const validateName = (name: string) =>\n /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(name)\n ? Effect.void\n : Effect.fail(new RegistrationError({ name, message: `Invalid tool name: ${name}` }))\n\nexport const registrationEntries = (tools: Readonly<Record<string, AnyTool>>, namespace?: string) =>\n Object.entries(tools).map(([name, tool]) => {\n const normalized = name.replace(/[^a-zA-Z0-9_-]/g, \"_\")\n return {\n key: namespace === undefined ? normalized : `${namespace.replaceAll(\".\", \"_\")}_${normalized}`,\n name: normalized,\n namespace,\n tool,\n }\n })\n\nexport const validateNamespace = (namespace: string) =>\n namespace.split(\".\").every((segment) => /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(segment))\n ? Effect.void\n : Effect.fail(\n new RegistrationError({ name: namespace, message: `Invalid tool namespace: ${JSON.stringify(namespace)}` }),\n )\n\nexport const withPermission = <T extends AnyTool>(\n tool: T,\n permission: string,\n): Omit<T, \"permission\"> & {\n readonly permission: string\n} => ({ ...tool, permission })\n\nexport const permission = (tool: AnyTool, name: string) => tool.permission ?? name\n\nexport const definition = (name: string, tool: AnyTool): ToolDefinition =>\n \"jsonSchema\" in tool\n ? {\n name,\n description: tool.description,\n inputSchema: tool.jsonSchema,\n outputSchema: tool.outputSchema,\n }\n : {\n name,\n description: tool.description,\n inputSchema: inputJsonSchema(tool.input),\n outputSchema: outputJsonSchema(tool.structured ?? tool.output),\n }\n\nexport const settle = (tool: AnyTool, call: ToolCall, context: Context): Effect.Effect<ToolOutput, Failure> =>\n Effect.gen(function* () {\n if (\"jsonSchema\" in tool) {\n const output = yield* tool.execute(call.input, context)\n return { structured: output.structured, content: output.content.map(toModelContent) }\n }\n\n const input = yield* decodeInput(tool.input, call.input)\n const value = yield* tool.execute(input, context)\n const output = yield* encodeOutput(tool.output, value)\n const structured =\n tool.structured && tool.toStructuredOutput\n ? yield* encodeOutput(tool.structured, tool.toStructuredOutput({ input, output }))\n : output\n return {\n structured,\n content:\n tool.toModelOutput?.({ input, output }).map(toModelContent) ??\n (typeof output === \"string\" ? [{ type: \"text\" as const, text: output }] : []),\n }\n })\n\nfunction decodeInput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError((error) => new Failure({ message: `Invalid tool input: ${error.message}` })),\n )\n return validateStandard(schema, value, \"Invalid tool input\")\n}\n\nfunction encodeOutput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.encodeEffect(schema)(value).pipe(\n Effect.mapError(\n (error) => new Failure({ message: `Tool returned an invalid value for its output schema: ${error.message}` }),\n ),\n )\n return validateStandard(schema, value, \"Tool returned an invalid value for its output schema\")\n}\n\nfunction validateStandard(schema: StandardSchemaType, value: unknown, prefix: string): Effect.Effect<unknown, Failure> {\n return Effect.gen(function* () {\n const pending = yield* Effect.try({\n try: () => schema[\"~standard\"].validate(value),\n catch: (error) => standardFailure(prefix, error),\n })\n const result =\n pending instanceof Promise\n ? yield* Effect.tryPromise({ try: () => pending, catch: (error) => standardFailure(prefix, error) })\n : pending\n if (result.issues)\n return yield* Effect.fail(\n new Failure({ message: `${prefix}: ${result.issues.map((issue) => issue.message).join(\", \")}` }),\n )\n return result.value\n })\n}\n\nfunction standardFailure(prefix: string, error: unknown) {\n return new Failure({ message: `${prefix}: ${error instanceof Error ? error.message : String(error)}` })\n}\n\nfunction inputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.input({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction outputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.output({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction toJsonSchema(schema: Schema.Top): JsonSchema.JsonSchema {\n const document = Schema.toJsonSchemaDocument(schema)\n if (Object.keys(document.definitions).length === 0) return document.schema\n return { ...document.schema, $defs: document.definitions }\n}\n\nexport interface ToolExecuteBeforeEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n input: unknown\n}\n\nexport interface ToolExecuteAfterEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly input: unknown\n result: ToolResultValue\n output?: ToolOutput\n outputPaths?: ReadonlyArray<string>\n}\n\nexport interface RegisterOptions {\n readonly namespace?: string\n /** Defaults to true. False exposes the tool directly to the provider. */\n readonly codemode?: boolean\n}\n\nexport interface ToolDraft {\n add(name: string, tool: AnyTool, options?: RegisterOptions): void\n}\n\nexport interface ToolHooks {\n readonly \"execute.before\": ToolExecuteBeforeEvent\n readonly \"execute.after\": ToolExecuteAfterEvent\n}\n\nexport interface ToolDomain {\n readonly transform: Transform<ToolDraft>\n readonly hook: Hooks<ToolHooks>\n}\n", | ||
| "import type { PluginApi } from \"@opencode-ai/client/effect/api\"\nimport type { Effect, Scope } from \"effect\"\nimport type { PluginOptions } from \"../options.js\"\nimport type { AgentDomain } from \"./agent.js\"\nimport type { AISDKDomain } from \"./aisdk.js\"\nimport type { CatalogDomain } from \"./catalog.js\"\nimport type { CommandDomain } from \"./command.js\"\nimport type { EventDomain } from \"./event.js\"\nimport type { IntegrationDomain } from \"./integration.js\"\nimport type { ReferenceDomain } from \"./reference.js\"\nimport type { SessionDomain } from \"./session.js\"\nimport type { SkillDomain } from \"./skill.js\"\nimport type { ToolDomain } from \"./tool.js\"\n\nexport interface Context {\n readonly options: PluginOptions\n readonly agent: AgentDomain\n readonly aisdk: AISDKDomain\n readonly catalog: CatalogDomain\n readonly command: CommandDomain\n readonly event: EventDomain\n readonly integration: IntegrationDomain\n readonly plugin: PluginApi<unknown>\n readonly reference: ReferenceDomain\n readonly session: SessionDomain\n readonly skill: SkillDomain\n readonly tool: ToolDomain\n}\n\nexport interface Plugin<R = Scope.Scope> {\n readonly id: string\n readonly effect: (context: Context) => Effect.Effect<void, never, R>\n}\n\nexport function define<R = Scope.Scope>(plugin: Plugin<R>) {\n return plugin\n}\n", | ||
| "export * as Session from \"./session.js\"\n\nimport { Schema } from \"effect\"\nimport { Agent } from \"./agent.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionEvent } from \"./session-event.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Money } from \"./money.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { Revert } from \"./session-revert.js\"\n\nexport const ID = SessionID\nexport type ID = SessionID\n\nexport const Event = SessionEvent\n\nexport { Revert }\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n parentID: ID.pipe(optional),\n fork: Schema.Struct({\n sessionID: ID,\n /** Messages before this exclusive boundary are copied into the fork. */\n messageID: SessionMessage.ID.pipe(optional),\n }).pipe(optional),\n projectID: Project.ID,\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n updated: DateTimeUtcFromMillis,\n archived: DateTimeUtcFromMillis.pipe(optional),\n }),\n title: Schema.String,\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n revert: Revert.pipe(optional),\n}).annotate({ identifier: \"Session.Info\" })\n\nexport const ListAnchor = Schema.Struct({\n id: ID,\n time: Schema.Finite,\n direction: Schema.Literals([\"previous\", \"next\"]),\n}).annotate({ identifier: \"Session.ListAnchor\" })\nexport interface ListAnchor extends Schema.Schema.Type<typeof ListAnchor> {}\n", | ||
| "export * as Command from \"./command.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Agent } from \"./agent.js\"\n\nconst Updated = ephemeral({ type: \"command.updated\", schema: {} })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n name: Schema.String,\n template: Schema.String,\n description: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n subtask: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Command.Info\" })\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Reference from \"./reference.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"reference.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface LocalSource extends Schema.Schema.Type<typeof LocalSource> {}\nexport const LocalSource = Schema.Struct({\n type: Schema.Literal(\"local\"),\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.LocalSource\" })\n\nexport interface GitSource extends Schema.Schema.Type<typeof GitSource> {}\nexport const GitSource = Schema.Struct({\n type: Schema.Literal(\"git\"),\n repository: Schema.String,\n branch: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.GitSource\" })\n\nexport const Source = Schema.Union([LocalSource, GitSource])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Reference.Source\" })\nexport type Source = typeof Source.Type\n\nexport const Info = Schema.Struct({\n name: Schema.String,\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n source: Source,\n}).annotate({ identifier: \"Reference.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "A56DEA607909CE8A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";o2BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH", | ||
| "debugId": "551B74A27E285C3964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openrouter.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route, type RouteDefaultsInput } from \"../route/client\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport { Protocol } from \"../route/protocol\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport { ProviderID, type ModelID, type ProviderOptions } from \"../schema\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport { isRecord } from \"../protocols/shared\"\n\nexport const profile = OpenAICompatibleProfiles.profiles.openrouter\nexport const id = ProviderID.make(profile.provider)\nconst ADAPTER = \"openrouter\"\n\nexport interface OpenRouterOptions {\n readonly [key: string]: unknown\n readonly usage?: boolean | Record<string, unknown>\n readonly reasoning?: Record<string, unknown>\n readonly promptCacheKey?: string\n}\n\nexport type OpenRouterProviderOptionsInput = ProviderOptions & {\n readonly openrouter?: OpenRouterOptions\n}\n\nexport type ModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: OpenRouterProviderOptionsInput\n }\n\nconst OpenRouterBody = Schema.StructWithRest(Schema.Struct(OpenAIChat.bodyFields), [\n Schema.Record(Schema.String, Schema.Any),\n])\nexport type OpenRouterBody = Schema.Schema.Type<typeof OpenRouterBody>\n\nexport const protocol = Protocol.make({\n id: \"openrouter-chat\",\n body: {\n schema: OpenRouterBody,\n from: (request) =>\n OpenAIChat.protocol.body.from(request).pipe(\n Effect.map(\n (body) =>\n ({\n ...body,\n ...bodyOptions(request.providerOptions?.openrouter),\n }) as OpenRouterBody,\n ),\n ),\n },\n stream: OpenAIChat.protocol.stream,\n})\n\nconst bodyOptions = (input: unknown) => {\n const openrouter = isRecord(input) ? input : {}\n return {\n ...(openrouter.usage === true\n ? { usage: { include: true } }\n : isRecord(openrouter.usage)\n ? { usage: openrouter.usage }\n : {}),\n ...(isRecord(openrouter.reasoning) ? { reasoning: openrouter.reasoning } : {}),\n ...(typeof openrouter.promptCacheKey === \"string\" ? { prompt_cache_key: openrouter.promptCacheKey } : {}),\n }\n}\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: profile.provider,\n protocol,\n endpoint: Endpoint.path(\"/chat/completions\", { baseURL: profile.baseURL }),\n framing: Framing.sse,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: ModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return route.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? profile.baseURL },\n auth: AuthOptions.bearer(input, \"OPENROUTER_API_KEY\"),\n })\n}\n\nexport const configure = (input: ModelOptions = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model = provider.model\n" | ||
| ], | ||
| "mappings": ";shBAWO,SAAM,OAAmC,OAAS,gBAC5C,OAAK,OAAW,UAAK,OAAQ,aAAQ,OAC5C,OAAU,aAmBV,EAAiB,EAAO,eAAe,EAAO,OAAkB,CAAU,EAAG,CACjF,EAAO,OAAO,EAAO,OAAQ,EAAO,GAAG,CACzC,CAAC,EAGY,EAAW,EAAS,KAAK,CACpC,GAAI,kBACJ,KAAM,CACJ,OAAQ,EACR,KAAM,CAAC,IACM,EAAS,KAAK,KAAK,CAAO,EAAE,KACrC,EAAO,IACL,CAAC,KACE,IACI,KACA,EAAY,EAAQ,iBAAiB,UAAU,CACpD,EACJ,CACF,CACJ,EACA,OAAmB,EAAS,MAC9B,CAAC,EAEK,EAAc,CAAC,IAAmB,CACtC,IAAM,EAAa,EAAS,CAAK,EAAI,EAAQ,CAAC,EAC9C,MAAO,IACD,EAAW,QAAU,GACrB,CAAE,MAAO,CAAE,QAAS,EAAK,CAAE,EAC3B,EAAS,EAAW,KAAK,EACvB,CAAE,MAAO,EAAW,KAAM,EAC1B,CAAC,KACH,EAAS,EAAW,SAAS,EAAI,CAAE,UAAW,EAAW,SAAU,EAAI,CAAC,KACxE,OAAO,EAAW,iBAAmB,SAAW,CAAE,iBAAkB,EAAW,cAAe,EAAI,CAAC,CACzG,GAGW,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,SAAU,EAAQ,SAClB,WACA,SAAU,EAAS,KAAK,oBAAqB,CAAE,QAAS,EAAQ,OAAQ,CAAC,EACzE,QAAS,EAAQ,GACnB,CAAC,EAEY,EAAS,CAAC,CAAK,EAEtB,EAAkB,CAAC,IAAwB,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CAAE,QAAS,GAAW,EAAQ,OAAQ,EAChD,KAAM,EAAY,OAAO,EAAO,oBAAoB,CACtD,CAAC,GAGU,EAAY,CAAC,EAAsB,CAAC,IAAM,CACrD,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,CAAQ,CAAC,EACjE,WACF,GAGW,EAAW,EAAU,EACrB,EAAQ,EAAS", | ||
| "debugId": "14EF1035E3D3620264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write((yield* ServiceConfig.get(Option.getOrUndefined(input.key))) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";42BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "2B0B3A459E6BA6D664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "E83E7FEDA85AE99B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/restart.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "FA8EC57862A8CA3764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/xai.ts"], | ||
| "sourcesContent": [ | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\n\nexport const id = ProviderID.make(\"xai\")\n\nexport type ModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport const routes = [OpenAIResponses.route, OpenAICompatibleChat.route]\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"XAI_API_KEY\")\n\nconst configuredResponsesRoute = (input: ModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return OpenAIResponses.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nconst configuredChatRoute = (input: ModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return OpenAICompatibleChat.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nexport const configure = (input: ModelOptions = {}) => {\n const responsesRoute = configuredResponsesRoute(input)\n const chatRoute = configuredChatRoute(input)\n const responses = (modelID: string | ModelID) => responsesRoute.model({ id: modelID })\n const chat = (modelID: string | ModelID) => chatRoute.model({ id: modelID })\n return {\n id,\n model: responses,\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model = provider.model\nexport const responses = provider.responses\nexport const chat = provider.chat\n" | ||
| ], | ||
| "mappings": ";kiBAOO,SAAM,OAAK,OAAW,UAAK,UAAK,OAO1B,OAAS,MAAiB,OAA4B,MAAK,OAElE,OAAO,MAAC,IAA4C,EAAY,OAAO,EAAS,aAAa,EAE7F,EAA2B,CAAC,IAAwB,CACxD,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAAuB,EAAM,KAAK,IAC7B,EACH,SAAU,EACV,SAAU,CAAE,QAAS,GAAoC,EAAS,IAAI,OAAQ,EAC9E,KAAM,EAAK,CAAK,CAClB,CAAC,GAGG,EAAsB,CAAC,IAAwB,CACnD,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAA4B,EAAM,KAAK,IAClC,EACH,SAAU,EACV,SAAU,CAAE,QAAS,GAAoC,EAAS,IAAI,OAAQ,EAC9E,KAAM,EAAK,CAAK,CAClB,CAAC,GAGU,EAAY,CAAC,EAAsB,CAAC,IAAM,CACrD,IAAM,EAAiB,EAAyB,CAAK,EAC/C,EAAY,EAAoB,CAAK,EACrC,EAAY,CAAC,IAA8B,EAAe,MAAM,CAAE,GAAI,CAAQ,CAAC,EAErF,MAAO,CACL,KACA,MAAO,EACP,YACA,KALW,CAAC,IAA8B,EAAU,MAAM,CAAE,GAAI,CAAQ,CAAC,EAMzE,WACF,GAGW,EAAW,EAAU,EACrB,EAAQ,EAAS,MACjB,EAAY,EAAS,UACrB,EAAO,EAAS", | ||
| "debugId": "3D8F521F37A4DA7464756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/services/standalone.ts", "src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Deferred, Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport { selfCommand } from \"../util/process\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const [executable, ...args] = options.command ?? [...selfCommand(), \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const readyLine = yield* Deferred.make<string, Error>()\n // Keep draining stdout after readiness so later server writes cannot hit EPIPE.\n yield* proc.stdout.pipe(\n Stream.decodeText(),\n Stream.splitLines,\n Stream.runForEach((line) => Deferred.succeed(readyLine, line)),\n Effect.ensuring(Deferred.fail(readyLine, new Error(\"Standalone server exited before reporting readiness\"))),\n Effect.forkScoped,\n )\n const output = yield* Deferred.await(readyLine)\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Endpoint & { readonly pid: number }\n },\n Effect.provide(LayerNode.compile(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n", | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F26947B2DAD7477C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E0474FCDFADBEF1364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/installation/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare global {\n const OPENCODE_VERSION: string\n const OPENCODE_CHANNEL: string\n}\n\nexport const InstallationVersion = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nexport const InstallationChannel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\nexport const InstallationLocal = InstallationChannel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAKO,IAAM,EAA6D,mBAC7D,EAA6D,OAC7D,EAAoB", | ||
| "debugId": "07D0DFE3DC7FC1E464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "D23F9068723AC17864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/migrate.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n" | ||
| ], | ||
| "mappings": ";ivBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "41F38B6708FEE98C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/route/auth-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { Config, Redacted } from \"effect\"\nimport { Auth } from \"./auth\"\n\nexport type ApiKeyMode = \"optional\" | \"required\"\n\nexport type AuthOverride = {\n readonly auth: Auth.Definition\n readonly apiKey?: never\n}\n\nexport type OptionalApiKeyAuth = {\n readonly apiKey?: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type RequiredApiKeyAuth = {\n readonly apiKey: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type ProviderAuthOption<Mode extends ApiKeyMode> =\n | AuthOverride\n | (Mode extends \"optional\" ? OptionalApiKeyAuth : RequiredApiKeyAuth)\n\nexport type ModelOptions<Base, Mode extends ApiKeyMode> = Omit<Base, \"apiKey\" | \"auth\"> & ProviderAuthOption<Mode>\n\nexport type ModelArgs<Base, Mode extends ApiKeyMode> = Mode extends \"optional\"\n ? readonly [options?: ModelOptions<Base, Mode>]\n : readonly [options: ModelOptions<Base, Mode>]\n\nexport type ModelFactory<Base, Mode extends ApiKeyMode, Model> = (id: string, ...args: ModelArgs<Base, Mode>) => Model\n\n/**\n * Require at least one of the keys in `T`. Use for option shapes where any\n * subset of fields is acceptable but at least one must be present (e.g. Azure\n * accepts `resourceName` or `baseURL`).\n */\nexport type AtLeastOne<T> = {\n [K in keyof T]: Required<Pick<T, K>> & Partial<Omit<T, K>>\n}[keyof T]\n\n/**\n * Standard bearer-auth resolution for providers: honor an explicit `auth`\n * override, otherwise resolve `apiKey` (option > config var) and apply it as\n * a bearer token.\n */\nexport const bearer = (\n options: ProviderAuthOption<\"optional\">,\n envVar: string | ReadonlyArray<string>,\n): Auth.Definition => {\n if (\"auth\" in options && options.auth) return options.auth\n return (Array.isArray(envVar) ? envVar : [envVar])\n .reduce(\n (auth, name) => auth.orElse(Auth.config(name)),\n Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\"),\n )\n .bearer()\n}\n\nexport * as AuthOptions from \"./auth-options\"\n" | ||
| ], | ||
| "mappings": ";kJA8CO,SAAM,EAAS,CACpB,EACA,IACoB,CACpB,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAQ,MAAM,QAAQ,CAAM,EAAI,EAAS,CAAC,CAAM,GAC7C,OACC,CAAC,EAAM,IAAS,EAAK,OAAO,EAAK,OAAO,CAAI,CAAC,EAC7C,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,CAC1E,EACC,OAAO", | ||
| "debugId": "23399E331C5CFB9E64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]))),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n if (\n serviceOptions !== undefined &&\n port !== undefined &&\n (yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })) !== undefined\n )\n return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start({\n hostname,\n port: Option.fromNullishOr(port),\n password,\n instanceID,\n service:\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* register(address, password, instanceID, serviceOptions.file, shutdown)\n }),\n },\n }).pipe(\n Effect.provide(Logger.layer([], { mergeWithExisting: false })),\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n shutdown: Effect.Effect<void>,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "5B8384E95259DB6D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/openai-options.ts", "../ai/src/protocols/openai-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\nimport type { LLMRequest, TextVerbosity as TextVerbosityValue } from \"../../schema\"\nimport { ReasoningEfforts, TextVerbosity } from \"../../schema\"\n\nexport const OpenAIReasoningEfforts = ReasoningEfforts\nexport type OpenAIReasoningEffort = string\n\n// Mirrors OpenAI's `ResponseIncludable` union from the official SDK. Keep this\n// in lockstep with `openai-node/src/resources/responses/responses.ts`.\nexport const OpenAIResponseIncludables = [\n \"file_search_call.results\",\n \"web_search_call.results\",\n \"web_search_call.action.sources\",\n \"message.input_image.image_url\",\n \"computer_call_output.output.image_url\",\n \"code_interpreter_call.outputs\",\n \"reasoning.encrypted_content\",\n \"message.output_text.logprobs\",\n] as const\nexport type OpenAIResponseIncludable = (typeof OpenAIResponseIncludables)[number]\nexport const OpenAIServiceTiers = [\"auto\", \"default\", \"flex\", \"priority\"] as const\nexport type OpenAIServiceTier = (typeof OpenAIServiceTiers)[number]\n\nconst TEXT_VERBOSITY = new Set<string>([\"low\", \"medium\", \"high\"])\nconst INCLUDABLES = new Set<string>(OpenAIResponseIncludables)\nconst SERVICE_TIERS = new Set<string>(OpenAIServiceTiers)\n\nexport const OpenAIReasoningEffort = Schema.String\nexport const OpenAITextVerbosity = TextVerbosity\nexport const OpenAIResponseIncludable = Schema.Literals(OpenAIResponseIncludables)\nexport const OpenAIServiceTier = Schema.Literals(OpenAIServiceTiers)\n\nexport const isReasoningEffort = (effort: unknown): effort is OpenAIReasoningEffort => typeof effort === \"string\"\n\nconst isTextVerbosity = (value: unknown): value is TextVerbosityValue =>\n typeof value === \"string\" && TEXT_VERBOSITY.has(value)\n\nconst options = (request: LLMRequest) => request.providerOptions?.openai\n\nexport const store = (request: LLMRequest): boolean | undefined => {\n const value = options(request)?.store\n return typeof value === \"boolean\" ? value : undefined\n}\n\nexport const reasoningEffort = (request: LLMRequest): string | undefined => {\n const value = options(request)?.reasoningEffort\n return typeof value === \"string\" ? value : undefined\n}\n\nexport const reasoningSummary = (request: LLMRequest): \"auto\" | undefined =>\n options(request)?.reasoningSummary === \"auto\" ? \"auto\" : undefined\n\n// Resolve the OpenAI Responses `include` field. Filters out unknown\n// includable values defensively so a typo in upstream config drops the\n// invalid entry instead of poisoning the wire body. An empty array (either\n// passed directly or produced by filtering) is treated as \"no include\" and\n// returns undefined so the request body omits the field entirely.\nexport const include = (request: LLMRequest): ReadonlyArray<OpenAIResponseIncludable> | undefined => {\n const value = options(request)?.include\n if (!Array.isArray(value)) return undefined\n const filtered = value.filter((entry): entry is OpenAIResponseIncludable => INCLUDABLES.has(entry))\n return filtered.length > 0 ? filtered : undefined\n}\n\nexport const promptCacheKey = (request: LLMRequest) => {\n const value = options(request)?.promptCacheKey\n return typeof value === \"string\" ? value : undefined\n}\n\nexport const textVerbosity = (request: LLMRequest) => {\n const value = options(request)?.textVerbosity\n return isTextVerbosity(value) ? value : undefined\n}\n\nexport const serviceTier = (request: LLMRequest) => {\n const value = options(request)?.serviceTier\n return typeof value === \"string\" && SERVICE_TIERS.has(value) ? (value as OpenAIServiceTier) : undefined\n}\n\nexport const instructions = (request: LLMRequest) => {\n const value = options(request)?.instructions\n return typeof value === \"string\" ? value : undefined\n}\n\nexport * as OpenAIOptions from \"./openai-options\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { HttpTransport } from \"../route/transport\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ReasoningPart,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolContent,\n} from \"../schema\"\nimport { isRecord, JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared\"\nimport { OpenAIOptions } from \"./utils/openai-options\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\nimport { ToolStream } from \"./utils/tool-stream\"\n\nconst ADAPTER = \"openai-chat\"\nconst IMAGE_MIMES = new Set<string>(ProviderShared.IMAGE_MIMES)\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/chat/completions\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\n// The body schema is the provider-native JSON body. `fromRequest` below builds\n// this shape from the common `LLMRequest`, then `Route.make` validates and\n// JSON-encodes it before transport.\nconst OpenAIChatFunction = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: JsonObject,\n})\n\nconst OpenAIChatTool = Schema.Struct({\n type: Schema.tag(\"function\"),\n function: OpenAIChatFunction,\n})\ntype OpenAIChatTool = Schema.Schema.Type<typeof OpenAIChatTool>\n\nconst OpenAIChatAssistantToolCall = Schema.Struct({\n id: Schema.String,\n type: Schema.tag(\"function\"),\n function: Schema.Struct({\n name: Schema.String,\n arguments: Schema.String,\n }),\n})\ntype OpenAIChatAssistantToolCall = Schema.Schema.Type<typeof OpenAIChatAssistantToolCall>\n\nconst OpenAIChatUserContent = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"text\"), text: Schema.String }),\n Schema.Struct({\n type: Schema.Literal(\"image_url\"),\n image_url: Schema.Struct({ url: Schema.String }),\n }),\n])\n\nconst OpenAIChatMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"system\"), content: Schema.String }),\n Schema.Struct({\n role: Schema.Literal(\"user\"),\n content: Schema.Union([Schema.String, Schema.Array(OpenAIChatUserContent)]),\n }),\n Schema.Struct({\n role: Schema.Literal(\"assistant\"),\n content: Schema.NullOr(Schema.String),\n tool_calls: optionalArray(OpenAIChatAssistantToolCall),\n reasoning_content: Schema.optional(Schema.String),\n reasoning: Schema.optional(Schema.String),\n reasoning_text: Schema.optional(Schema.String),\n }),\n Schema.Struct({ role: Schema.Literal(\"tool\"), tool_call_id: Schema.String, content: Schema.String }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype OpenAIChatMessage = Schema.Schema.Type<typeof OpenAIChatMessage>\n\nconst OpenAIChatToolChoice = Schema.Union([\n Schema.Literals([\"auto\", \"none\", \"required\"]),\n Schema.Struct({\n type: Schema.tag(\"function\"),\n function: Schema.Struct({ name: Schema.String }),\n }),\n])\n\nexport const bodyFields = {\n model: Schema.String,\n messages: Schema.Array(OpenAIChatMessage),\n tools: optionalArray(OpenAIChatTool),\n tool_choice: Schema.optional(OpenAIChatToolChoice),\n stream: Schema.Literal(true),\n stream_options: Schema.optional(Schema.Struct({ include_usage: Schema.Boolean })),\n store: Schema.optional(Schema.Boolean),\n reasoning_effort: Schema.optional(OpenAIOptions.OpenAIReasoningEffort),\n max_tokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n frequency_penalty: Schema.optional(Schema.Number),\n presence_penalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stop: optionalArray(Schema.String),\n}\nconst OpenAIChatBody = Schema.Struct(bodyFields)\nexport type OpenAIChatBody = Schema.Schema.Type<typeof OpenAIChatBody>\n\n// =============================================================================\n// Streaming Event Schema\n// =============================================================================\n// The event schema is one decoded SSE `data:` payload. `Framing.sse` splits the\n// byte stream into strings, then `Protocol.jsonEvent` decodes each string into\n// this provider-native event shape.\nconst OpenAIChatUsage = Schema.Struct({\n prompt_tokens: Schema.optional(Schema.Number),\n completion_tokens: Schema.optional(Schema.Number),\n total_tokens: Schema.optional(Schema.Number),\n prompt_tokens_details: optionalNull(\n Schema.Struct({\n cached_tokens: Schema.optional(Schema.Number),\n }),\n ),\n completion_tokens_details: optionalNull(\n Schema.Struct({\n reasoning_tokens: Schema.optional(Schema.Number),\n }),\n ),\n})\n\nconst OpenAIChatToolCallDeltaFunction = Schema.Struct({\n name: optionalNull(Schema.String),\n arguments: optionalNull(Schema.String),\n})\n\nconst OpenAIChatToolCallDelta = Schema.Struct({\n index: Schema.Number,\n id: optionalNull(Schema.String),\n function: optionalNull(OpenAIChatToolCallDeltaFunction),\n})\ntype OpenAIChatToolCallDelta = Schema.Schema.Type<typeof OpenAIChatToolCallDelta>\n\nconst OpenAIChatDelta = Schema.Struct({\n content: optionalNull(Schema.String),\n reasoning_content: optionalNull(Schema.String),\n reasoning: optionalNull(Schema.String),\n reasoning_text: optionalNull(Schema.String),\n tool_calls: optionalNull(Schema.Array(OpenAIChatToolCallDelta)),\n})\n\nconst OpenAIChatChoice = Schema.Struct({\n delta: optionalNull(OpenAIChatDelta),\n finish_reason: optionalNull(Schema.String),\n})\n\nexport const OpenAIChatEvent = Schema.Struct({\n choices: Schema.Array(OpenAIChatChoice),\n usage: optionalNull(OpenAIChatUsage),\n})\nexport type OpenAIChatEvent = Schema.Schema.Type<typeof OpenAIChatEvent>\ntype OpenAIChatRequestMessage = LLMRequest[\"messages\"][number]\n\nexport interface ParserState {\n readonly tools: ToolStream.State<number>\n readonly toolCallEvents: ReadonlyArray<LLMEvent>\n readonly usage?: Usage\n readonly finishReason?: FinishReason\n readonly lifecycle: Lifecycle.State\n readonly reasoningField?: \"reasoning\" | \"reasoning_content\" | \"reasoning_text\"\n}\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Lowering is the only place that knows how common LLM messages map onto the\n// OpenAI Chat wire format. Keep provider quirks here instead of leaking native\n// fields into `LLMRequest`.\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema): OpenAIChatTool => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: ToolSchemaProjection.openAI(inputSchema),\n },\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"OpenAI Chat\", toolChoice, {\n auto: () => \"auto\" as const,\n none: () => \"none\" as const,\n required: () => \"required\" as const,\n tool: (name) => ({ type: \"function\" as const, function: { name } }),\n })\n\nconst lowerToolCall = (part: ToolCallPart): OpenAIChatAssistantToolCall => ({\n id: part.id,\n type: \"function\",\n function: {\n name: part.name,\n arguments: ProviderShared.encodeJson(part.input),\n },\n})\n\nconst lowerMedia = Effect.fn(\"OpenAIChat.lowerMedia\")(function* (part: MediaPart) {\n const media = yield* ProviderShared.validateMedia(\"OpenAI Chat\", part, IMAGE_MIMES)\n return { type: \"image_url\" as const, image_url: { url: media.dataUrl } }\n})\n\nconst openAICompatibleReasoningContent = (native: unknown) =>\n isRecord(native) && typeof native.reasoning_content === \"string\" ? native.reasoning_content : undefined\n\nconst reasoningField = (part: ReasoningPart) => {\n const field = part.providerMetadata?.openai?.reasoningField\n if (field === \"reasoning\" || field === \"reasoning_content\" || field === \"reasoning_text\") return field\n return \"reasoning_content\"\n}\n\nconst lowerUserMessage = Effect.fn(\"OpenAIChat.lowerUserMessage\")(function* (message: OpenAIChatRequestMessage) {\n const content: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerMedia(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"user\", [\"text\", \"media\"])\n }\n if (content.every((part) => part.type === \"text\"))\n return { role: \"user\" as const, content: content.map((part) => part.text).join(\"\") }\n return { role: \"user\" as const, content }\n})\n\nconst lowerAssistantMessage = Effect.fn(\"OpenAIChat.lowerAssistantMessage\")(function* (\n message: OpenAIChatRequestMessage,\n) {\n const content: TextPart[] = []\n const reasoning: ReasoningPart[] = []\n const toolCalls: OpenAIChatAssistantToolCall[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n content.push(part)\n continue\n }\n if (part.type === \"reasoning\") {\n reasoning.push(part)\n continue\n }\n if (part.type === \"tool-call\") {\n toolCalls.push(lowerToolCall(part))\n continue\n }\n }\n const text = reasoning.map((part) => part.text).join(\"\")\n const field = reasoning[0] ? reasoningField(reasoning[0]) : \"reasoning_content\"\n return {\n role: \"assistant\" as const,\n content: content.length === 0 ? null : ProviderShared.joinText(content),\n tool_calls: toolCalls.length === 0 ? undefined : toolCalls,\n reasoning_content:\n reasoning.length === 0\n ? openAICompatibleReasoningContent(message.native?.openaiCompatible)\n : field === \"reasoning_content\"\n ? text\n : undefined,\n reasoning: reasoning.length > 0 && field === \"reasoning\" ? text : undefined,\n reasoning_text: reasoning.length > 0 && field === \"reasoning_text\" ? text : undefined,\n }\n})\n\nconst lowerToolMessages = Effect.fn(\"OpenAIChat.lowerToolMessages\")(function* (message: OpenAIChatRequestMessage) {\n const messages: OpenAIChatMessage[] = []\n const images: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n messages.push({ role: \"tool\", tool_call_id: part.id, content: ProviderShared.toolResultText(part) })\n continue\n }\n const content: ReadonlyArray<ToolContent> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n messages.push({ role: \"tool\", tool_call_id: part.id, content: text.join(\"\\n\") })\n const files = content.filter((item) => item.type === \"file\")\n images.push(\n ...(yield* Effect.forEach(files, (item) =>\n lowerMedia({ type: \"media\", mediaType: item.mime, data: item.uri, filename: item.name }),\n )),\n )\n }\n return { messages, images }\n})\n\nconst lowerMessage = Effect.fn(\"OpenAIChat.lowerMessage\")(function* (message: OpenAIChatRequestMessage) {\n if (message.role === \"user\") return [yield* lowerUserMessage(message)]\n if (message.role === \"assistant\") return [yield* lowerAssistantMessage(message)]\n return (yield* lowerToolMessages(message)).messages\n})\n\nconst lowerMessages = Effect.fn(\"OpenAIChat.lowerMessages\")(function* (request: LLMRequest) {\n const system: OpenAIChatMessage[] =\n request.system.length === 0 ? [] : [{ role: \"system\", content: ProviderShared.joinText(request.system) }]\n const messages = [...system]\n const pendingImages: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n const flushImages = () => {\n if (pendingImages.length === 0) return\n messages.push({ role: \"user\", content: pendingImages.splice(0) })\n }\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"OpenAI Chat\", message)\n if (pendingImages.length > 0) {\n messages.push({ role: \"user\", content: [...pendingImages.splice(0), { type: \"text\", text: part.text }] })\n continue\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\" && typeof previous.content === \"string\")\n messages[messages.length - 1] = { role: \"user\", content: `${previous.content}\\n${part.text}` }\n else if (previous?.role === \"user\" && Array.isArray(previous.content))\n messages[messages.length - 1] = {\n role: \"user\",\n content: [...previous.content, { type: \"text\", text: part.text }],\n }\n else messages.push({ role: \"user\", content: part.text })\n continue\n }\n if (message.role === \"tool\") {\n const lowered = yield* lowerToolMessages(message)\n messages.push(...lowered.messages)\n pendingImages.push(...lowered.images)\n continue\n }\n flushImages()\n messages.push(...(yield* lowerMessage(message)))\n }\n flushImages()\n return messages\n})\n\nconst lowerOptions = Effect.fn(\"OpenAIChat.lowerOptions\")(function* (request: LLMRequest) {\n const store = OpenAIOptions.store(request)\n const reasoningEffort = OpenAIOptions.reasoningEffort(request)\n return {\n ...(store !== undefined ? { store } : {}),\n ...(reasoningEffort ? { reasoning_effort: reasoningEffort } : {}),\n }\n})\n\nconst fromRequest = Effect.fn(\"OpenAIChat.fromRequest\")(function* (request: LLMRequest) {\n // `fromRequest` returns the provider body only. Endpoint, auth, framing,\n // validation, and HTTP execution are composed by `Route.make`.\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n return {\n model: request.model.id,\n messages: yield* lowerMessages(request),\n tools:\n request.tools.length === 0\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n tool_choice: request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined,\n stream: true as const,\n stream_options: { include_usage: true },\n max_tokens: generation?.maxTokens,\n temperature: generation?.temperature,\n top_p: generation?.topP,\n frequency_penalty: generation?.frequencyPenalty,\n presence_penalty: generation?.presencePenalty,\n seed: generation?.seed,\n stop: generation?.stop,\n ...(yield* lowerOptions(request)),\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Streaming parsers are small state machines: every event returns a new state\n// plus the common `LLMEvent`s produced by that event. Tool calls are accumulated\n// because OpenAI streams JSON arguments across multiple deltas.\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"stop\") return \"stop\"\n if (reason === \"length\") return \"length\"\n if (reason === \"content_filter\") return \"content-filter\"\n if (reason === \"function_call\" || reason === \"tool_calls\") return \"tool-calls\"\n return \"unknown\"\n}\n\n// OpenAI Chat reports `prompt_tokens` (inclusive total) with a\n// `cached_tokens` subset, and `completion_tokens` (inclusive total) with\n// a `reasoning_tokens` subset. We pass the inclusive totals through and\n// derive the non-cached breakdown so the `LLM.Usage` contract is\n// satisfied on both sides.\nconst mapUsage = (usage: OpenAIChatEvent[\"usage\"]): Usage | undefined => {\n if (!usage) return undefined\n const cached = usage.prompt_tokens_details?.cached_tokens\n const reasoning = usage.completion_tokens_details?.reasoning_tokens\n const nonCached = ProviderShared.subtractTokens(usage.prompt_tokens, cached)\n return new Usage({\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n reasoningTokens: reasoning,\n totalTokens: ProviderShared.totalTokens(usage.prompt_tokens, usage.completion_tokens, usage.total_tokens),\n providerMetadata: { openai: usage },\n })\n}\n\nconst reasoningDelta = (delta: Schema.Schema.Type<typeof OpenAIChatDelta> | null | undefined) => {\n if (delta?.reasoning_content) return { field: \"reasoning_content\", text: delta.reasoning_content } as const\n if (delta?.reasoning) return { field: \"reasoning\", text: delta.reasoning } as const\n if (delta?.reasoning_text) return { field: \"reasoning_text\", text: delta.reasoning_text } as const\n}\n\nconst step = (state: ParserState, event: OpenAIChatEvent) =>\n Effect.gen(function* () {\n const events: LLMEvent[] = []\n const usage = mapUsage(event.usage) ?? state.usage\n const choice = event.choices[0]\n const finishReason = choice?.finish_reason ? mapFinishReason(choice.finish_reason) : state.finishReason\n const delta = choice?.delta\n const toolDeltas = delta?.tool_calls ?? []\n let tools = state.tools\n\n let lifecycle = state.lifecycle\n\n const reasoning = reasoningDelta(delta)\n const reasoningField = state.reasoningField ?? reasoning?.field\n if (reasoning)\n lifecycle = Lifecycle.reasoningDelta(lifecycle, events, \"reasoning-0\", reasoning.text, {\n openai: { reasoningField: reasoningField ?? reasoning.field },\n })\n\n if (delta?.content) {\n lifecycle = Lifecycle.reasoningEnd(lifecycle, events, \"reasoning-0\")\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.content)\n }\n\n if (toolDeltas.length) lifecycle = Lifecycle.reasoningEnd(lifecycle, events, \"reasoning-0\")\n\n for (const tool of toolDeltas) {\n const result = ToolStream.appendOrStart(\n ADAPTER,\n tools,\n tool.index,\n { id: tool.id ?? undefined, name: tool.function?.name ?? undefined, text: tool.function?.arguments ?? \"\" },\n \"OpenAI Chat tool call delta is missing id or name\",\n )\n if (ToolStream.isError(result)) return yield* result\n tools = result.tools\n if (result.events.length) lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(...result.events)\n }\n\n // Finalize accumulated tool inputs eagerly when finish_reason arrives so\n // valid calls and malformed local calls settle independently.\n const finished =\n finishReason !== undefined && state.finishReason === undefined && Object.keys(tools).length > 0\n ? yield* ToolStream.finishAll(ADAPTER, tools)\n : undefined\n\n return [\n {\n tools: finished?.tools ?? tools,\n toolCallEvents: finished?.events ?? state.toolCallEvents,\n usage,\n finishReason,\n lifecycle,\n reasoningField,\n },\n events,\n ] as const\n })\n\nconst finishEvents = (state: ParserState): ReadonlyArray<LLMEvent> => {\n const events: LLMEvent[] = []\n const hasToolCalls = state.toolCallEvents.length > 0\n const reason = state.finishReason === \"stop\" && hasToolCalls ? \"tool-calls\" : state.finishReason\n const lifecycle = state.toolCallEvents.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...state.toolCallEvents)\n if (reason) Lifecycle.finish(lifecycle, events, { reason, usage: state.usage })\n return events\n}\n\n// =============================================================================\n// Protocol And OpenAI Route\n// =============================================================================\n/**\n * The OpenAI Chat protocol — request body construction, body schema, and the\n * streaming-event state machine. Reused by every route that speaks OpenAI Chat\n * over HTTP+SSE: native OpenAI, DeepSeek, TogetherAI, Cerebras, Baseten,\n * Fireworks, DeepInfra, and (once added) Azure OpenAI Chat.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: OpenAIChatBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(OpenAIChatEvent),\n initial: () => ({\n tools: ToolStream.empty<number>(),\n toolCallEvents: [],\n lifecycle: Lifecycle.initial(),\n reasoningField: undefined,\n }),\n step,\n onHalt: finishEvents,\n },\n})\n\nexport const httpTransport = HttpTransport.sseJson.with<OpenAIChatBody>()\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"openai\",\n providerMetadataKey: \"openai\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n transport: httpTransport,\n})\n\nexport * as OpenAIChat from \"./openai-chat\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "8897E6C3EE9DC00D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/bedrock-event-stream.ts", "../ai/src/protocols/utils/bedrock-auth.ts", "../ai/src/protocols/utils/bedrock-cache.ts", "../ai/src/protocols/utils/bedrock-media.ts", "../ai/src/protocols/bedrock-converse.ts", "../ai/src/providers/amazon-bedrock.ts"], | ||
| "sourcesContent": [ | ||
| "import { EventStreamCodec } from \"@smithy/eventstream-codec\"\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\"\nimport { Effect, Stream } from \"effect\"\nimport { Framing } from \"../route/framing\"\nimport { ProviderShared } from \"./shared\"\n\n// Bedrock streams responses using the AWS event stream binary protocol — each\n// frame is `[length:4][headers-length:4][prelude-crc:4][headers][payload][crc:4]`.\n// We use `@smithy/eventstream-codec` to validate framing and CRCs, then\n// reconstruct the JSON wrapping by `:event-type` so the chunk schema can match.\nconst eventCodec = new EventStreamCodec(toUtf8, fromUtf8)\nconst utf8 = new TextDecoder()\n\n// Cursor-tracking buffer state. Bytes accumulate in `buffer`; `offset` is the\n// read position. Reading by `subarray` is zero-copy. We only allocate a fresh\n// buffer when a new network chunk arrives and we need to append.\ninterface FrameBufferState {\n readonly buffer: Uint8Array\n readonly offset: number\n}\n\nconst initialFrameBuffer: FrameBufferState = { buffer: new Uint8Array(0), offset: 0 }\n\nconst appendChunk = (state: FrameBufferState, chunk: Uint8Array): FrameBufferState => {\n const remaining = state.buffer.length - state.offset\n // Compact: drop the consumed prefix and append the new chunk in one alloc.\n // This bounds buffer growth to at most one network chunk past the live\n // window, regardless of stream length.\n const next = new Uint8Array(remaining + chunk.length)\n next.set(state.buffer.subarray(state.offset), 0)\n next.set(chunk, remaining)\n return { buffer: next, offset: 0 }\n}\n\nconst consumeFrames = (route: string) => (state: FrameBufferState, chunk: Uint8Array) =>\n Effect.gen(function* () {\n let cursor = appendChunk(state, chunk)\n const out: object[] = []\n while (cursor.buffer.length - cursor.offset >= 4) {\n const view = cursor.buffer.subarray(cursor.offset)\n const totalLength = new DataView(view.buffer, view.byteOffset, view.byteLength).getUint32(0, false)\n if (view.length < totalLength) break\n\n const decoded = yield* Effect.try({\n try: () => eventCodec.decode(view.subarray(0, totalLength)),\n catch: (error) =>\n ProviderShared.eventError(\n route,\n `Failed to decode Bedrock Converse event-stream frame: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n })\n cursor = { buffer: cursor.buffer, offset: cursor.offset + totalLength }\n\n if (decoded.headers[\":message-type\"]?.value !== \"event\") continue\n const eventType = decoded.headers[\":event-type\"]?.value\n if (typeof eventType !== \"string\") continue\n const payload = utf8.decode(decoded.body)\n if (!payload) continue\n // The AWS event stream pads short payloads with a `p` field. Drop it\n // before handing the object to the chunk schema. JSON decode goes\n // through the shared Schema-driven codec to satisfy the package rule\n // against ad-hoc `JSON.parse` calls.\n const parsed = (yield* ProviderShared.parseJson(\n route,\n payload,\n \"Failed to parse Bedrock Converse event-stream payload\",\n )) as Record<string, unknown>\n delete parsed.p\n out.push({ [eventType]: parsed })\n }\n return [cursor, out] as const\n })\n\n/**\n * AWS event-stream framing for Bedrock Converse. Each frame is decoded by\n * `@smithy/eventstream-codec` (length + header + payload + CRC) and rewrapped\n * under its `:event-type` header so the chunk schema can match the JSON\n * payload directly.\n */\nexport const framing = (route: string): Framing.Definition<object> => ({\n id: \"aws-event-stream\",\n frame: (bytes) => bytes.pipe(Stream.mapAccumEffect(() => initialFrameBuffer, consumeFrames(route))),\n})\n\nexport * as BedrockEventStream from \"./bedrock-event-stream\"\n", | ||
| "import { AwsV4Signer } from \"aws4fetch\"\nimport { Effect } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Auth, type AuthInput } from \"../../route/auth\"\nimport { ProviderShared } from \"../shared\"\n\n/**\n * AWS credentials for SigV4 signing. Bedrock also supports Bearer API key auth,\n * which provider facades configure as route auth instead of SigV4. STS-vended\n * credentials should be refreshed by the consumer (rebuild the model) before\n * they expire; the route does not refresh.\n */\nexport interface Credentials {\n readonly region: string\n readonly accessKeyId: string\n readonly secretAccessKey: string\n readonly sessionToken?: string\n}\n\nconst signRequest = (input: {\n readonly url: string\n readonly body: string\n readonly headers: Headers.Headers\n readonly credentials: Credentials\n}) =>\n Effect.tryPromise({\n try: async () => {\n const signed = await new AwsV4Signer({\n url: input.url,\n method: \"POST\",\n headers: Object.entries(input.headers),\n body: input.body,\n region: input.credentials.region,\n accessKeyId: input.credentials.accessKeyId,\n secretAccessKey: input.credentials.secretAccessKey,\n sessionToken: input.credentials.sessionToken,\n service: \"bedrock\",\n }).sign()\n return Object.fromEntries(signed.headers.entries())\n },\n catch: (error) =>\n ProviderShared.invalidRequest(\n `Bedrock Converse SigV4 signing failed: ${error instanceof Error ? error.message : String(error)}`,\n ),\n })\n\n/** Sign the exact JSON bytes with SigV4 using credentials configured on the route. */\nexport const sigV4 = (credentials: Credentials | undefined) =>\n Auth.custom((input: AuthInput) => {\n return Effect.gen(function* () {\n if (!credentials) {\n return yield* ProviderShared.invalidRequest(\n \"Bedrock Converse requires either route bearer auth or AWS credentials configured on the route\",\n )\n }\n const headersForSigning = Headers.set(input.headers, \"content-type\", \"application/json\")\n const signed = yield* signRequest({\n url: input.url,\n body: input.body,\n headers: headersForSigning,\n credentials,\n })\n return Headers.setAll(headersForSigning, signed)\n })\n })\n\n/** Bedrock route auth defaults to SigV4 and expects credentials from route configuration. */\nexport const auth = sigV4(undefined)\n\nexport * as BedrockAuth from \"./bedrock-auth\"\n", | ||
| "import { Schema } from \"effect\"\nimport type { CacheHint } from \"../../schema\"\nimport { newBreakpoints, ttlBucket, type Breakpoints } from \"./cache\"\n\n// Bedrock cache markers are positional: emit a `cachePoint` block immediately\n// after the content the caller wants treated as a cacheable prefix. Bedrock\n// accepts optional `ttl: \"5m\" | \"1h\"` on cachePoint, mirroring Anthropic.\nexport const CachePointBlock = Schema.Struct({\n cachePoint: Schema.Struct({\n type: Schema.tag(\"default\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n }),\n})\nexport type CachePointBlock = Schema.Schema.Type<typeof CachePointBlock>\n\n// Bedrock-Claude enforces the same 4-breakpoint cap as the Anthropic Messages\n// API. Callers pass a shared counter through every `block()` call site so the\n// budget is respected across `system`, `messages`, and `tools`.\nexport const BEDROCK_BREAKPOINT_CAP = 4\n\nexport type { Breakpoints } from \"./cache\"\nexport const breakpoints = () => newBreakpoints(BEDROCK_BREAKPOINT_CAP)\n\nconst DEFAULT_5M: CachePointBlock = { cachePoint: { type: \"default\" } }\nconst DEFAULT_1H: CachePointBlock = { cachePoint: { type: \"default\", ttl: \"1h\" } }\n\nexport const block = (breakpoints: Breakpoints, cache: CacheHint | undefined): CachePointBlock | undefined => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return ttlBucket(cache.ttlSeconds) === \"1h\" ? DEFAULT_1H : DEFAULT_5M\n}\n\nexport * as BedrockCache from \"./bedrock-cache\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport type { MediaPart } from \"../../schema\"\nimport { ProviderShared } from \"../shared\"\n\n// Bedrock Converse accepts image `format` as the file extension and\n// `source.bytes` as base64 in the JSON wire format.\nexport const ImageFormat = Schema.Literals([\"png\", \"jpeg\", \"gif\", \"webp\"])\nexport type ImageFormat = Schema.Schema.Type<typeof ImageFormat>\n\nexport const ImageBlock = Schema.Struct({\n image: Schema.Struct({\n format: ImageFormat,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type ImageBlock = Schema.Schema.Type<typeof ImageBlock>\n\n// Bedrock document blocks require a user-facing name so the model can refer to\n// the uploaded document.\nexport const DocumentFormat = Schema.Literals([\"pdf\", \"csv\", \"doc\", \"docx\", \"xls\", \"xlsx\", \"html\", \"txt\", \"md\"])\nexport type DocumentFormat = Schema.Schema.Type<typeof DocumentFormat>\n\nexport const DocumentBlock = Schema.Struct({\n document: Schema.Struct({\n format: DocumentFormat,\n name: Schema.String,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type DocumentBlock = Schema.Schema.Type<typeof DocumentBlock>\n\nconst IMAGE_FORMATS = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpeg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n} as const satisfies Record<string, ImageFormat>\n\nconst DOCUMENT_FORMATS = {\n \"application/pdf\": \"pdf\",\n \"text/csv\": \"csv\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"text/html\": \"html\",\n \"text/plain\": \"txt\",\n \"text/markdown\": \"md\",\n} as const satisfies Record<string, DocumentFormat>\n\nconst documentBlock = (part: MediaPart, format: DocumentFormat, bytes: string): DocumentBlock => ({\n document: {\n format,\n name: part.filename ?? `document.${format}`,\n source: { bytes },\n },\n})\n\n// Route by MIME. Known image/document formats lower into a typed block; anything\n// else fails with a clear error instead of silently degrading to a malformed\n// document block. Image MIME types not in `IMAGE_FORMATS` (e.g. `image/svg+xml`)\n// get an image-specific error so the caller knows it's a format-support issue,\n// not a kind-detection issue.\nexport const lower = Effect.fn(\"BedrockMedia.lower\")(function* (part: MediaPart) {\n const mime = part.mediaType.toLowerCase()\n const imageFormat = IMAGE_FORMATS[mime as keyof typeof IMAGE_FORMATS]\n if (imageFormat) {\n const media = yield* ProviderShared.validateMedia(\n \"Bedrock Converse\",\n part,\n new Set<string>(Object.keys(IMAGE_FORMATS)),\n )\n return { image: { format: imageFormat, source: { bytes: media.base64 } } } satisfies ImageBlock\n }\n if (mime.startsWith(\"image/\"))\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support image media type ${part.mediaType}`)\n const documentFormat = DOCUMENT_FORMATS[mime as keyof typeof DOCUMENT_FORMATS]\n if (documentFormat) {\n const media = yield* ProviderShared.validateMedia(\n \"Bedrock Converse\",\n part,\n new Set<string>(Object.keys(DOCUMENT_FORMATS)),\n )\n return documentBlock(part, documentFormat, media.base64)\n }\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support media type ${part.mediaType}`)\n})\n\nexport * as BedrockMedia from \"./bedrock-media\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMError,\n LLMEvent,\n Usage,\n type CacheHint,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type ModelToolSchemaCompatibility,\n type ProviderMetadata,\n type ReasoningPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolResultPart,\n} from \"../schema\"\nimport { BedrockEventStream } from \"./bedrock-event-stream\"\nimport { classifyProviderFailure } from \"../provider-error\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared\"\nimport { BedrockAuth } from \"./utils/bedrock-auth\"\nimport { BedrockCache } from \"./utils/bedrock-cache\"\nimport { BedrockMedia } from \"./utils/bedrock-media\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\nimport { ToolStream } from \"./utils/tool-stream\"\n\nconst ADAPTER = \"bedrock-converse\"\n\nexport type { Credentials as BedrockCredentials } from \"./utils/bedrock-auth\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst BedrockTextBlock = Schema.Struct({\n text: Schema.String,\n})\ntype BedrockTextBlock = Schema.Schema.Type<typeof BedrockTextBlock>\n\nconst BedrockToolUseBlock = Schema.Struct({\n toolUse: Schema.Struct({\n toolUseId: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n }),\n})\ntype BedrockToolUseBlock = Schema.Schema.Type<typeof BedrockToolUseBlock>\n\nconst BedrockToolResultContentItem = Schema.Union([\n Schema.Struct({ text: Schema.String }),\n Schema.Struct({ json: Schema.Unknown }),\n BedrockMedia.ImageBlock,\n])\n\nconst BedrockToolResultBlock = Schema.Struct({\n toolResult: Schema.Struct({\n toolUseId: Schema.String,\n content: Schema.Array(BedrockToolResultContentItem),\n status: Schema.optional(Schema.Literals([\"success\", \"error\"])),\n }),\n})\ntype BedrockToolResultBlock = Schema.Schema.Type<typeof BedrockToolResultBlock>\n\nconst BedrockReasoningBlock = Schema.Struct({\n reasoningContent: Schema.Struct({\n reasoningText: Schema.optional(\n Schema.Struct({\n text: Schema.String,\n signature: Schema.optional(Schema.String),\n }),\n ),\n }),\n})\n\nconst BedrockUserBlock = Schema.Union([\n BedrockTextBlock,\n BedrockMedia.ImageBlock,\n BedrockMedia.DocumentBlock,\n BedrockToolResultBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockUserBlock = Schema.Schema.Type<typeof BedrockUserBlock>\n\nconst BedrockAssistantBlock = Schema.Union([\n BedrockTextBlock,\n BedrockReasoningBlock,\n BedrockToolUseBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockAssistantBlock = Schema.Schema.Type<typeof BedrockAssistantBlock>\n\nconst BedrockMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(BedrockUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(BedrockAssistantBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype BedrockMessage = Schema.Schema.Type<typeof BedrockMessage>\n\nconst BedrockSystemBlock = Schema.Union([BedrockTextBlock, BedrockCache.CachePointBlock])\ntype BedrockSystemBlock = Schema.Schema.Type<typeof BedrockSystemBlock>\n\nconst BedrockToolSpec = Schema.Struct({\n toolSpec: Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n inputSchema: Schema.Struct({\n json: JsonObject,\n }),\n }),\n})\ntype BedrockToolSpec = Schema.Schema.Type<typeof BedrockToolSpec>\n\nconst BedrockTool = Schema.Union([BedrockToolSpec, BedrockCache.CachePointBlock])\ntype BedrockTool = Schema.Schema.Type<typeof BedrockTool>\n\nconst BedrockToolChoice = Schema.Union([\n Schema.Struct({ auto: Schema.Struct({}) }),\n Schema.Struct({ any: Schema.Struct({}) }),\n Schema.Struct({ tool: Schema.Struct({ name: Schema.String }) }),\n])\n\nconst BedrockBodyFields = {\n modelId: Schema.String,\n messages: Schema.Array(BedrockMessage),\n system: optionalArray(BedrockSystemBlock),\n inferenceConfig: Schema.optional(\n Schema.Struct({\n maxTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n }),\n ),\n toolConfig: Schema.optional(\n Schema.Struct({\n tools: Schema.Array(BedrockTool),\n toolChoice: Schema.optional(BedrockToolChoice),\n }),\n ),\n additionalModelRequestFields: Schema.optional(JsonObject),\n}\nconst BedrockConverseBody = Schema.Struct(BedrockBodyFields)\nexport type BedrockConverseBody = Schema.Schema.Type<typeof BedrockConverseBody>\n\nconst BedrockUsageSchema = Schema.Struct({\n inputTokens: Schema.optional(Schema.Number),\n outputTokens: Schema.optional(Schema.Number),\n totalTokens: Schema.optional(Schema.Number),\n cacheReadInputTokens: Schema.optional(Schema.Number),\n cacheWriteInputTokens: Schema.optional(Schema.Number),\n})\ntype BedrockUsageSchema = Schema.Schema.Type<typeof BedrockUsageSchema>\n\n// Streaming event shape — the AWS event stream wraps each JSON payload by its\n// `:event-type` header (e.g. `messageStart`, `contentBlockDelta`). We\n// reconstruct that wrapping in `decodeFrames` below so the event schema can\n// stay a plain discriminated record.\nconst BedrockEvent = Schema.Struct({\n messageStart: Schema.optional(Schema.Struct({ role: Schema.String })),\n contentBlockStart: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n start: Schema.optional(\n Schema.Struct({\n toolUse: Schema.optional(Schema.Struct({ toolUseId: Schema.String, name: Schema.String })),\n }),\n ),\n }),\n ),\n contentBlockDelta: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n delta: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n toolUse: Schema.optional(Schema.Struct({ input: Schema.String })),\n reasoningContent: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n }),\n ),\n }),\n ),\n }),\n ),\n contentBlockStop: Schema.optional(Schema.Struct({ contentBlockIndex: Schema.Number })),\n messageStop: Schema.optional(\n Schema.Struct({\n stopReason: Schema.String,\n additionalModelResponseFields: Schema.optional(Schema.Unknown),\n }),\n ),\n metadata: Schema.optional(\n Schema.Struct({\n usage: Schema.optional(BedrockUsageSchema),\n metrics: Schema.optional(Schema.Unknown),\n }),\n ),\n internalServerException: Schema.optional(Schema.Struct({ message: Schema.String })),\n modelStreamErrorException: Schema.optional(Schema.Struct({ message: Schema.String })),\n validationException: Schema.optional(Schema.Struct({ message: Schema.String })),\n throttlingException: Schema.optional(Schema.Struct({ message: Schema.String })),\n serviceUnavailableException: Schema.optional(Schema.Struct({ message: Schema.String })),\n})\ntype BedrockEvent = Schema.Schema.Type<typeof BedrockEvent>\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerToolSpec = (tool: ToolDefinition, inputSchema: JsonSchema): BedrockToolSpec => ({\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: inputSchema },\n },\n})\n\nconst lowerTools = (\n compatibility: ModelToolSchemaCompatibility | undefined,\n breakpoints: BedrockCache.Breakpoints,\n tools: ReadonlyArray<ToolDefinition>,\n): BedrockTool[] => {\n const result: BedrockTool[] = []\n for (const tool of tools) {\n result.push(lowerToolSpec(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, compatibility)))\n const cachePoint = BedrockCache.block(breakpoints, tool.cache)\n if (cachePoint) result.push(cachePoint)\n }\n return result\n}\n\nconst textWithCache = (\n breakpoints: BedrockCache.Breakpoints,\n text: string,\n cache: CacheHint | undefined,\n): Array<BedrockTextBlock | BedrockCache.CachePointBlock> => {\n const cachePoint = BedrockCache.block(breakpoints, cache)\n return cachePoint ? [{ text }, cachePoint] : [{ text }]\n}\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Bedrock Converse\", toolChoice, {\n auto: () => ({ auto: {} }) as const,\n none: () => undefined,\n required: () => ({ any: {} }) as const,\n tool: (name) => ({ tool: { name } }) as const,\n })\n\nconst bedrockMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ bedrock: metadata })\n\nconst reasoningSignature = (part: ReasoningPart) => {\n const bedrock = part.providerMetadata?.bedrock\n return (\n part.encrypted ??\n (ProviderShared.isRecord(bedrock) && typeof bedrock.signature === \"string\" ? bedrock.signature : undefined)\n )\n}\n\nconst lowerToolCall = (part: ToolCallPart): BedrockToolUseBlock => ({\n toolUse: {\n toolUseId: part.id,\n name: part.name,\n input: part.input,\n },\n})\n\nconst lowerToolResultContent = Effect.fn(\"BedrockConverse.lowerToolResultContent\")(function* (part: ToolResultPart) {\n if (part.result.type === \"text\" || part.result.type === \"error\")\n return [{ text: ProviderShared.toolResultText(part) }]\n if (part.result.type === \"json\") return [{ json: part.result.value }]\n\n const content: Array<Schema.Schema.Type<typeof BedrockToolResultContentItem>> = []\n for (const item of part.result.value) {\n if (item.type === \"text\") {\n content.push({ text: item.text })\n continue\n }\n const media = yield* BedrockMedia.lower({\n type: \"media\",\n mediaType: item.mime,\n data: item.uri,\n filename: item.name,\n })\n if (!(\"image\" in media))\n return yield* ProviderShared.invalidRequest(\"Bedrock Converse only supports image media in tool results\")\n content.push(media)\n }\n return content\n})\n\nconst lowerToolResult = Effect.fn(\"BedrockConverse.lowerToolResult\")(function* (part: ToolResultPart) {\n return {\n toolResult: {\n toolUseId: part.id,\n content: yield* lowerToolResultContent(part),\n status: part.result.type === \"error\" ? \"error\" : \"success\",\n },\n } satisfies BedrockToolResultBlock\n})\n\nconst lowerMessages = Effect.fn(\"BedrockConverse.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: BedrockCache.Breakpoints,\n) {\n const messages: BedrockMessage[] = []\n\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Bedrock Converse\", message)\n const content = textWithCache(breakpoints, part.text, part.cache)\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"user\") {\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"user\", [\"text\", \"media\"])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* BedrockMedia.lower(part))\n continue\n }\n }\n messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: BedrockAssistantBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"assistant\", [\n \"text\",\n \"reasoning\",\n \"tool-call\",\n ])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"reasoning\") {\n content.push({\n reasoningContent: {\n reasoningText: { text: part.text, signature: reasoningSignature(part) },\n },\n })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(lowerToolCall(part))\n continue\n }\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"tool\", [\"tool-result\"])\n content.push(yield* lowerToolResult(part))\n const cachePoint = BedrockCache.block(breakpoints, part.cache)\n if (cachePoint) content.push(cachePoint)\n }\n messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\n// System prompts share the cache-point convention: emit the text block, then\n// optionally a positional `cachePoint` marker.\nconst lowerSystem = (\n breakpoints: BedrockCache.Breakpoints,\n system: ReadonlyArray<LLMRequest[\"system\"][number]>,\n): BedrockSystemBlock[] => system.flatMap((part) => textWithCache(breakpoints, part.text, part.cache))\n\nconst fromRequest = Effect.fn(\"BedrockConverse.fromRequest\")(function* (request: LLMRequest) {\n const toolChoice = request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined\n const generation = request.generation\n // Bedrock-Claude shares Anthropic's 4-breakpoint cap. Spend the budget in\n // tools → system → messages order to favour the highest-impact prefixes.\n const breakpoints = BedrockCache.breakpoints()\n const toolConfig =\n request.tools.length > 0 && request.toolChoice?.type !== \"none\"\n ? { tools: lowerTools(request.model.compatibility?.toolSchema, breakpoints, request.tools), toolChoice }\n : undefined\n const system = request.system.length === 0 ? undefined : lowerSystem(breakpoints, request.system)\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Bedrock Converse: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${BedrockCache.BEDROCK_BREAKPOINT_CAP} per request.`,\n )\n }\n return {\n modelId: request.model.id,\n messages,\n system,\n inferenceConfig:\n generation?.maxTokens === undefined &&\n generation?.temperature === undefined &&\n generation?.topP === undefined &&\n (generation?.stop === undefined || generation.stop.length === 0)\n ? undefined\n : {\n maxTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n stopSequences: generation?.stop,\n },\n toolConfig,\n // Converse's base inferenceConfig has no topK; Anthropic/Nova accept it\n // as a model-specific field, so it goes through additionalModelRequestFields.\n additionalModelRequestFields: generation?.topK === undefined ? undefined : { top_k: generation.topK },\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\") return \"stop\"\n if (reason === \"max_tokens\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"content_filtered\" || reason === \"guardrail_intervened\") return \"content-filter\"\n return \"unknown\"\n}\n\n// AWS Bedrock Converse reports `inputTokens` (inclusive total) with\n// `cacheReadInputTokens` and `cacheWriteInputTokens` as subsets. Pass\n// the total through and derive the non-cached breakdown. Bedrock does\n// not break reasoning out of `outputTokens` for any current model.\nconst mapUsage = (usage: BedrockUsageSchema | undefined): Usage | undefined => {\n if (!usage) return undefined\n const cacheTotal = (usage.cacheReadInputTokens ?? 0) + (usage.cacheWriteInputTokens ?? 0)\n const nonCached = ProviderShared.subtractTokens(usage.inputTokens, cacheTotal)\n return new Usage({\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: usage.cacheReadInputTokens,\n cacheWriteInputTokens: usage.cacheWriteInputTokens,\n totalTokens: ProviderShared.totalTokens(usage.inputTokens, usage.outputTokens, usage.totalTokens),\n providerMetadata: { bedrock: usage },\n })\n}\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n // Bedrock splits the finish into `messageStop` (carries `stopReason`) and\n // `metadata` (carries usage). Hold the terminal event in state so `onHalt`\n // can emit exactly one finish after both chunks have had a chance to arrive.\n readonly pendingFinish: { readonly reason: FinishReason; readonly usage?: Usage } | undefined\n readonly hasToolCalls: boolean\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignatures: Readonly<Record<number, string>>\n}\n\nconst step = (state: ParserState, event: BedrockEvent) =>\n Effect.gen(function* () {\n if (event.contentBlockStart?.start?.toolUse) {\n const index = event.contentBlockStart.contentBlockIndex\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, index, {\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n ],\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.text) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.textDelta(\n state.lifecycle,\n events,\n `text-${event.contentBlockDelta.contentBlockIndex}`,\n event.contentBlockDelta.delta.text,\n ),\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.reasoningContent) {\n const index = event.contentBlockDelta.contentBlockIndex\n const reasoning = event.contentBlockDelta.delta.reasoningContent\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: reasoning.text\n ? Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${index}`, reasoning.text)\n : state.lifecycle,\n reasoningSignatures: reasoning.signature\n ? { ...state.reasoningSignatures, [index]: reasoning.signature }\n : state.reasoningSignatures,\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.toolUse) {\n const index = event.contentBlockDelta.contentBlockIndex\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n index,\n event.contentBlockDelta.delta.toolUse.input,\n \"Bedrock Converse tool delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] as const\n }\n\n if (event.contentBlockStop) {\n const index = event.contentBlockStop.contentBlockIndex\n const result = yield* ToolStream.finish(ADAPTER, state.tools, index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${index}`),\n events,\n `reasoning-${index}`,\n state.reasoningSignatures[index]\n ? bedrockMetadata({ signature: state.reasoningSignatures[index] })\n : undefined,\n )\n events.push(...resultEvents)\n return [\n {\n ...state,\n hasToolCalls:\n resultEvents.some((event) => LLMEvent.is.toolCall(event) || LLMEvent.is.toolInputError(event)) ||\n state.hasToolCalls,\n lifecycle,\n tools: result.tools,\n reasoningSignatures: Object.fromEntries(\n Object.entries(state.reasoningSignatures).filter(([key]) => key !== String(index)),\n ),\n },\n events,\n ] as const\n }\n\n if (event.messageStop) {\n return [\n {\n ...state,\n pendingFinish: { reason: mapFinishReason(event.messageStop.stopReason), usage: state.pendingFinish?.usage },\n },\n [],\n ] as const\n }\n\n if (event.metadata) {\n const usage = mapUsage(event.metadata.usage)\n return [{ ...state, pendingFinish: { reason: state.pendingFinish?.reason ?? \"stop\", usage } }, []] as const\n }\n\n const exception = (\n [\n [\"internalServerException\", event.internalServerException],\n [\"modelStreamErrorException\", event.modelStreamErrorException],\n [\"serviceUnavailableException\", event.serviceUnavailableException],\n [\"throttlingException\", event.throttlingException],\n [\"validationException\", event.validationException],\n ] as const\n ).find((entry) => entry[1] !== undefined)\n if (exception) {\n return yield* new LLMError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({\n message: exception[1]?.message ?? \"Bedrock Converse stream error\",\n code: exception[0],\n }),\n })\n }\n\n return [state, []] as const\n })\n\nconst framing = BedrockEventStream.framing(ADAPTER)\n\nconst onHalt = (state: ParserState): ReadonlyArray<LLMEvent> =>\n state.pendingFinish\n ? (() => {\n const events: LLMEvent[] = []\n Lifecycle.finish(state.lifecycle, events, {\n reason:\n state.pendingFinish.reason === \"stop\" && state.hasToolCalls ? \"tool-calls\" : state.pendingFinish.reason,\n usage: state.pendingFinish.usage,\n })\n return events\n })()\n : []\n\n// =============================================================================\n// Protocol And Bedrock Route\n// =============================================================================\n/**\n * The Bedrock Converse protocol — request body construction, body schema, and\n * the streaming-event state machine.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: BedrockConverseBody,\n from: fromRequest,\n },\n stream: {\n event: BedrockEvent,\n initial: () => ({\n tools: ToolStream.empty<number>(),\n pendingFinish: undefined,\n hasToolCalls: false,\n lifecycle: Lifecycle.initial(),\n reasoningSignatures: {},\n }),\n step,\n onHalt,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"bedrock\",\n providerMetadataKey: \"bedrock\",\n protocol,\n // Bedrock's URL embeds the region in the route endpoint host and the\n // validated modelId in the path. We read the validated body so the URL\n // matches the body that gets signed.\n endpoint: Endpoint.path<BedrockConverseBody>(\n ({ body }) => `/model/${encodeURIComponent(body.modelId)}/converse-stream`,\n ),\n auth: BedrockAuth.auth,\n framing,\n})\n\nexport const sigV4Auth = BedrockAuth.sigV4\n\nexport * as BedrockConverse from \"./bedrock-converse\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as BedrockConverse from \"../protocols/bedrock-converse\"\nimport type { BedrockCredentials } from \"../protocols/bedrock-converse\"\n\nexport const id = ProviderID.make(\"amazon-bedrock\")\n\nexport type Config = RouteDefaultsInput & {\n readonly apiKey?: string\n readonly headers?: Record<string, string>\n readonly credentials?: BedrockCredentials\n /** AWS region. Defaults to `us-east-1` when neither this nor `credentials.region` is set. */\n readonly region?: string\n /** Override the computed `https://bedrock-runtime.<region>.amazonaws.com` URL. */\n readonly baseURL?: string\n}\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly auth?: \"bearer\" | \"sigv4\"\n readonly baseURL?: string\n readonly credentials?: BedrockCredentials\n readonly region?: string\n readonly topP?: number\n}\nexport const routes = [BedrockConverse.route]\n\nconst bedrockBaseURL = (region: string) => `https://bedrock-runtime.${region}.amazonaws.com`\n\nconst configuredRoute = (input: Config) => {\n const { apiKey, credentials, region, baseURL, ...rest } = input\n const resolvedRegion = region ?? credentials?.region ?? \"us-east-1\"\n return BedrockConverse.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? bedrockBaseURL(resolvedRegion) },\n auth: apiKey === undefined ? BedrockConverse.sigV4Auth(credentials) : Auth.bearer(apiKey),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.auth === \"bearer\" && settings.apiKey === undefined)\n throw new Error(\"Amazon Bedrock bearer auth requires apiKey\")\n if (settings.auth === \"sigv4\" && settings.apiKey !== undefined)\n throw new Error(\"Amazon Bedrock SigV4 auth does not accept apiKey\")\n return configure({\n apiKey: settings.auth === \"sigv4\" ? undefined : settings.apiKey,\n baseURL: settings.baseURL,\n credentials: settings.credentials,\n generation: settings.topP === undefined ? undefined : { topP: settings.topP },\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n region: settings.region,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E48145E7836170B164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/azure.ts"], | ||
| "sourcesContent": [ | ||
| "import { Auth } from \"../route/auth\"\nimport { type AtLeastOne, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options\"\n\nexport const id = ProviderID.make(\"azure\")\nconst routeAuth = Auth.remove(\"authorization\")\n\n// Azure needs the customer's resource URL; supply either `resourceName`\n// (helper builds the URL) or `baseURL` directly.\ntype AzureURL = AtLeastOne<{ readonly resourceName: string; readonly baseURL: string }>\n\nexport type ModelOptions = AzureURL &\n RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly apiVersion?: string\n readonly queryParams?: Record<string, string>\n readonly useCompletionUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\nexport type Config = ModelOptions\n\nexport type Settings = ProviderPackage.Settings &\n AzureURL & {\n readonly apiKey?: string\n readonly apiVersion?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nconst resourceBaseURL = (resourceName: string) => `https://${resourceName.trim()}.openai.azure.com/openai/v1`\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"azure-openai-responses\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"azure-openai-chat\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst defaults = (input: Config) => {\n const {\n apiKey: _,\n apiVersion: _apiVersion,\n resourceName: _resourceName,\n useCompletionUrls: _useCompletionUrls,\n baseURL: _baseURL,\n queryParams: _queryParams,\n ...rest\n } = input\n if (\"auth\" in rest) {\n const { auth: _, ...withoutAuth } = rest\n return withoutAuth\n }\n return rest\n}\n\nconst auth = (input: Config) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.remove(\"authorization\").andThen(\n Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"AZURE_OPENAI_API_KEY\"))\n .pipe(Auth.header(\"api-key\")),\n )\n}\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: {\n // AtLeastOne guarantees at least one is set; baseURL wins if both are.\n baseURL: input.baseURL ?? resourceBaseURL(input.resourceName!),\n query: {\n ...(input.apiVersion ? { \"api-version\": input.apiVersion } : {}),\n ...input.queryParams,\n },\n },\n })\n\nexport const configure = (input: Config) => {\n const configuredResponsesRoute = configuredRoute(responsesRoute, input)\n const configuredChatRoute = configuredRoute(chatRoute, input)\n const modelDefaults = defaults(input)\n\n const responses = (modelID: string | ModelID) =>\n configuredResponsesRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n const chat = (modelID: string | ModelID) =>\n configuredChatRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n return {\n id,\n model: (modelID: string | ModelID) => (input.useCompletionUrls === true ? chat(modelID) : responses(modelID)),\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nconst config = (settings: Settings): Config => {\n const common = {\n apiKey: settings.apiKey,\n apiVersion: settings.apiVersion,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n if (settings.baseURL !== undefined) return { ...common, baseURL: settings.baseURL }\n if (settings.resourceName !== undefined) return { ...common, resourceName: settings.resourceName }\n throw new Error(\"Azure requires resourceName or baseURL\")\n}\n\nexport const responsesModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).responses(modelID)\nexport const chatModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).chat(modelID)\nexport const model = responsesModel\n" | ||
| ], | ||
| "mappings": ";yMASO,SAAM,OAAK,OAAW,KAAK,OAAO,EACnC,EAAY,EAAK,OAAO,eAAe,EAwBvC,EAAkB,CAAC,IAAyB,WAAW,EAAa,KAAK,+BAEzE,EAAiC,EAAM,KAAK,CAChD,GAAI,yBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEK,EAAuB,EAAM,KAAK,CACtC,GAAI,oBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEY,EAAS,CAAC,EAAgB,CAAS,EAE1C,EAAW,CAAC,IAAkB,CAClC,IACE,OAAQ,EACR,WAAY,EACZ,aAAc,EACd,kBAAmB,EACnB,QAAS,EACT,YAAa,KACV,GACD,EACJ,GAAI,SAAU,EAAM,CAClB,IAAQ,KAAM,KAAM,GAAgB,EACpC,OAAO,EAET,OAAO,GAGH,EAAO,CAAC,IAAkB,CAC9B,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,OAAO,eAAe,EAAE,QAClC,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EACjE,OAAO,EAAK,OAAO,sBAAsB,CAAC,EAC1C,KAAK,EAAK,OAAO,SAAS,CAAC,CAChC,GAGI,EAAkB,CAAiB,EAAiC,IACxE,EAAM,KAAK,CACT,KAAM,EAAK,CAAK,EAChB,SAAU,CAER,QAAS,EAAM,SAAW,EAAgB,EAAM,YAAa,EAC7D,MAAO,IACD,EAAM,WAAa,CAAE,cAAe,EAAM,UAAW,EAAI,CAAC,KAC3D,EAAM,WACX,CACF,CACF,CAAC,EAEU,EAAY,CAAC,IAAkB,CAC1C,IAAM,EAA2B,EAAgB,EAAgB,CAAK,EAChE,EAAsB,EAAgB,EAAW,CAAK,EACtD,EAAgB,EAAS,CAAK,EAE9B,EAAY,CAAC,IACjB,EAAyB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE1F,EAAO,CAAC,IACZ,EAAoB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE3F,MAAO,CACL,KACA,MAAO,CAAC,IAA+B,EAAM,oBAAsB,GAAO,EAAK,CAAO,EAAI,EAAU,CAAO,EAC3G,YACA,OACA,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEM,EAAS,CAAC,IAA+B,CAC7C,IAAM,EAAS,CACb,OAAQ,EAAS,OACjB,WAAY,EAAS,WACrB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,gBAAiB,EAAS,gBAC1B,YAAa,EAAS,cAAgB,OAAY,OAAY,IAAK,EAAS,WAAY,CAC1F,EACA,GAAI,EAAS,UAAY,OAAW,MAAO,IAAK,EAAQ,QAAS,EAAS,OAAQ,EAClF,GAAI,EAAS,eAAiB,OAAW,MAAO,IAAK,EAAQ,aAAc,EAAS,YAAa,EACjG,MAAU,MAAM,wCAAwC,GAG7C,EAAgE,CAAC,EAAS,IACrF,EAAU,EAAO,CAAQ,CAAC,EAAE,UAAU,CAAO,EAClC,EAA2D,CAAC,EAAS,IAChF,EAAU,EAAO,CAAQ,CAAC,EAAE,KAAK,CAAO,EAC7B,EAAQ", | ||
| "debugId": "466A3EE9411FF4E964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "12EF59F6AC3D6A0E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,OAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH", | ||
| "debugId": "2B88D24466C7AC9964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/gemini.ts", "../ai/src/providers/google.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport { Endpoint } from \"../route/endpoint\"\nimport { Framing } from \"../route/framing\"\nimport { Protocol } from \"../route/protocol\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolContent,\n} from \"../schema\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared\"\nimport { GeminiToolSchema } from \"./utils/gemini-tool-schema\"\nimport { Lifecycle } from \"./utils/lifecycle\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema\"\n\nconst ADAPTER = \"gemini\"\nconst MEDIA_MIMES = new Set<string>(ProviderShared.MEDIA_MIMES)\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst GeminiTextPart = Schema.Struct({\n text: Schema.String,\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiInlineDataPart = Schema.Struct({\n inlineData: Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n})\n\nconst GeminiFunctionCallPart = Schema.Struct({\n functionCall: Schema.Struct({\n name: Schema.String,\n args: Schema.Unknown,\n }),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiFunctionResponsePart = Schema.Struct({\n functionResponse: Schema.Struct({\n name: Schema.String,\n response: Schema.Unknown,\n }),\n})\n\nconst GeminiContentPart = Schema.Union([\n GeminiTextPart,\n GeminiInlineDataPart,\n GeminiFunctionCallPart,\n GeminiFunctionResponsePart,\n])\n\nconst GeminiContent = Schema.Struct({\n role: Schema.Literals([\"user\", \"model\"]),\n parts: Schema.Array(GeminiContentPart),\n})\ntype GeminiContent = Schema.Schema.Type<typeof GeminiContent>\n\nconst GeminiSystemInstruction = Schema.Struct({\n parts: Schema.Array(Schema.Struct({ text: Schema.String })),\n})\n\nconst GeminiFunctionDeclaration = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: Schema.optional(JsonObject),\n})\n\nconst GeminiTool = Schema.Struct({\n functionDeclarations: Schema.Array(GeminiFunctionDeclaration),\n})\n\nconst GeminiToolConfig = Schema.Struct({\n functionCallingConfig: Schema.Struct({\n mode: Schema.Literals([\"AUTO\", \"NONE\", \"ANY\"]),\n allowedFunctionNames: optionalArray(Schema.String),\n }),\n})\n\nconst GeminiThinkingConfig = Schema.Struct({\n thinkingBudget: Schema.optional(Schema.Number),\n includeThoughts: Schema.optional(Schema.Boolean),\n})\n\nconst GeminiGenerationConfig = Schema.Struct({\n maxOutputTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n topK: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n thinkingConfig: Schema.optional(GeminiThinkingConfig),\n})\n\nconst GeminiBodyFields = {\n contents: Schema.Array(GeminiContent),\n systemInstruction: Schema.optional(GeminiSystemInstruction),\n tools: optionalArray(GeminiTool),\n toolConfig: Schema.optional(GeminiToolConfig),\n generationConfig: Schema.optional(GeminiGenerationConfig),\n}\nconst GeminiBody = Schema.Struct(GeminiBodyFields)\nexport type GeminiBody = Schema.Schema.Type<typeof GeminiBody>\n\nconst GeminiUsage = Schema.Struct({\n cachedContentTokenCount: Schema.optional(Schema.Number),\n thoughtsTokenCount: Schema.optional(Schema.Number),\n promptTokenCount: Schema.optional(Schema.Number),\n candidatesTokenCount: Schema.optional(Schema.Number),\n totalTokenCount: Schema.optional(Schema.Number),\n})\ntype GeminiUsage = Schema.Schema.Type<typeof GeminiUsage>\n\nconst GeminiCandidate = Schema.Struct({\n content: Schema.optional(GeminiContent),\n finishReason: Schema.optional(Schema.String),\n})\n\nconst GeminiEvent = Schema.Struct({\n candidates: optionalArray(GeminiCandidate),\n usageMetadata: Schema.optional(GeminiUsage),\n})\ntype GeminiEvent = Schema.Schema.Type<typeof GeminiEvent>\n\ninterface ParserState {\n readonly finishReason?: string\n readonly hasToolCalls: boolean\n readonly nextToolCallId: number\n readonly usage?: Usage\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignature?: string\n}\n\n// =============================================================================\n// Tool Schema Conversion\n// =============================================================================\n// Tool-schema conversion has two distinct concerns:\n//\n// 1. Sanitize — fix common authoring mistakes Gemini rejects: integer/number\n// enums (must be strings), `required` entries that don't match a property,\n// untyped arrays (`items` must be present), and `properties`/`required`\n// keys on non-object scalars. Mirrors OpenCode's historical Gemini rules.\n//\n// 2. Project — lossy mapping from JSON Schema to Gemini's schema dialect:\n// drop empty objects, derive `nullable: true` from `type: [..., \"null\"]`,\n// coerce `const` to `[const]` enum, recurse properties/items, propagate\n// only an allowlisted set of keys (description, required, format, type,\n// properties, items, allOf, anyOf, oneOf, minLength). Anything outside the\n// allowlist (e.g. `additionalProperties`, `$ref`) is silently dropped.\n//\n// Sanitize runs first, then project. The implementation lives in\n// `utils/gemini-tool-schema` so this protocol keeps the same shape as the other\n// provider protocols.\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema) => ({\n name: tool.name,\n description: tool.description,\n parameters: GeminiToolSchema.convert(inputSchema),\n})\n\nconst lowerToolConfig = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Gemini\", toolChoice, {\n auto: () => ({ functionCallingConfig: { mode: \"AUTO\" as const } }),\n none: () => ({ functionCallingConfig: { mode: \"NONE\" as const } }),\n required: () => ({ functionCallingConfig: { mode: \"ANY\" as const } }),\n tool: (name) => ({ functionCallingConfig: { mode: \"ANY\" as const, allowedFunctionNames: [name] } }),\n })\n\nconst lowerUserPart = Effect.fn(\"Gemini.lowerUserPart\")(function* (part: TextPart | MediaPart) {\n if (part.type === \"text\") return { text: part.text }\n const media = yield* ProviderShared.validateMedia(\"Gemini\", part, MEDIA_MIMES)\n return { inlineData: { mimeType: media.mime, data: media.base64 } }\n})\n\nconst googleMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ google: metadata })\n\nconst thoughtSignature = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.thoughtSignature === \"string\"\n ? google.thoughtSignature\n : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart) => ({\n functionCall: { name: part.name, args: part.input },\n thoughtSignature: thoughtSignature(part.providerMetadata),\n})\n\nconst lowerMessages = Effect.fn(\"Gemini.lowerMessages\")(function* (request: LLMRequest) {\n const contents: GeminiContent[] = []\n\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Gemini\", message)\n const previous = contents.at(-1)\n if (previous?.role === \"user\")\n contents[contents.length - 1] = { role: \"user\", parts: [...previous.parts, { text: part.text }] }\n else contents.push({ role: \"user\", parts: [{ text: part.text }] })\n continue\n }\n\n if (message.role === \"user\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"user\", [\"text\", \"media\"])\n parts.push(yield* lowerUserPart(part))\n }\n contents.push({ role: \"user\", parts })\n continue\n }\n\n if (message.role === \"assistant\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n parts.push({ text: part.text })\n continue\n }\n if (part.type === \"reasoning\") {\n parts.push({ text: part.text, thought: true, thoughtSignature: thoughtSignature(part.providerMetadata) })\n continue\n }\n if (part.type === \"tool-call\") {\n parts.push(lowerToolCall(part))\n continue\n }\n }\n contents.push({ role: \"model\", parts })\n continue\n }\n\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n parts.push({\n functionResponse: {\n name: part.name,\n response: {\n name: part.name,\n content: ProviderShared.toolResultText(part),\n },\n },\n })\n continue\n }\n const content: ReadonlyArray<ToolContent> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n parts.push({\n functionResponse: {\n name: part.name,\n response: {\n name: part.name,\n content: text.join(\"\\n\"),\n },\n },\n })\n for (const item of content) {\n if (item.type === \"text\") continue\n const media = yield* ProviderShared.validateToolFile(\"Gemini\", item, MEDIA_MIMES)\n parts.push({ inlineData: { mimeType: media.mime, data: media.base64 } })\n }\n }\n contents.push({ role: \"user\", parts })\n }\n\n return contents\n})\n\nconst geminiOptions = (request: LLMRequest) => request.providerOptions?.gemini\n\nconst thinkingConfig = (request: LLMRequest) => {\n const value = geminiOptions(request)?.thinkingConfig\n if (!ProviderShared.isRecord(value)) return undefined\n const result = {\n thinkingBudget: typeof value.thinkingBudget === \"number\" ? value.thinkingBudget : undefined,\n includeThoughts: typeof value.includeThoughts === \"boolean\" ? value.includeThoughts : undefined,\n }\n return Object.values(result).some((item) => item !== undefined) ? result : undefined\n}\n\nconst fromRequest = Effect.fn(\"Gemini.fromRequest\")(function* (request: LLMRequest) {\n const toolsEnabled = request.tools.length > 0 && request.toolChoice?.type !== \"none\"\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const generationConfig = {\n maxOutputTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n topK: generation?.topK,\n stopSequences: generation?.stop,\n thinkingConfig: thinkingConfig(request),\n }\n\n return {\n contents: yield* lowerMessages(request),\n systemInstruction:\n request.system.length === 0 ? undefined : { parts: [{ text: ProviderShared.joinText(request.system) }] },\n tools: toolsEnabled\n ? [\n {\n functionDeclarations: request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n },\n ]\n : undefined,\n toolConfig: toolsEnabled && request.toolChoice ? yield* lowerToolConfig(request.toolChoice) : undefined,\n generationConfig: Object.values(generationConfig).some((value) => value !== undefined)\n ? generationConfig\n : undefined,\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Gemini reports `promptTokenCount` (inclusive total) with a\n// `cachedContentTokenCount` subset. `candidatesTokenCount` is *exclusive*\n// of `thoughtsTokenCount` — visible-only, not a total — so we sum the two\n// to produce the inclusive `outputTokens` the rest of the contract expects.\nconst mapUsage = (usage: GeminiUsage | undefined) => {\n if (!usage) return undefined\n const cached = usage.cachedContentTokenCount\n const nonCached = ProviderShared.subtractTokens(usage.promptTokenCount, cached)\n // `candidatesTokenCount` is visible-only; sum with thoughts to produce the\n // inclusive `outputTokens` the contract expects. Only compute the total\n // when the visible component is reported — otherwise we'd fabricate an\n // inclusive number from a partial breakdown.\n const outputTokens =\n usage.candidatesTokenCount !== undefined ? usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0) : undefined\n return new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n })\n}\n\nconst mapFinishReason = (finishReason: string | undefined, hasToolCalls: boolean): FinishReason => {\n if (finishReason === \"STOP\") return hasToolCalls ? \"tool-calls\" : \"stop\"\n if (finishReason === \"MAX_TOKENS\") return \"length\"\n if (\n finishReason === \"IMAGE_SAFETY\" ||\n finishReason === \"RECITATION\" ||\n finishReason === \"SAFETY\" ||\n finishReason === \"BLOCKLIST\" ||\n finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\"\n )\n return \"content-filter\"\n if (finishReason === \"MALFORMED_FUNCTION_CALL\") return \"error\"\n return \"unknown\"\n}\n\nconst finish = (state: ParserState): ReadonlyArray<LLMEvent> =>\n state.finishReason || state.usage\n ? (() => {\n const events: LLMEvent[] = []\n const lifecycle = state.reasoningSignature\n ? Lifecycle.reasoningEnd(\n state.lifecycle,\n events,\n \"reasoning-0\",\n googleMetadata({ thoughtSignature: state.reasoningSignature }),\n )\n : state.lifecycle\n Lifecycle.finish(lifecycle, events, {\n reason: mapFinishReason(state.finishReason, state.hasToolCalls),\n usage: state.usage,\n })\n return events\n })()\n : []\n\nconst step = (state: ParserState, event: GeminiEvent) => {\n const nextState = {\n ...state,\n usage: event.usageMetadata ? (mapUsage(event.usageMetadata) ?? state.usage) : state.usage,\n }\n const candidate = event.candidates?.[0]\n if (!candidate?.content)\n return Effect.succeed([\n { ...nextState, finishReason: candidate?.finishReason ?? nextState.finishReason },\n [],\n ] as const)\n\n const events: LLMEvent[] = []\n let hasToolCalls = nextState.hasToolCalls\n let lifecycle = nextState.lifecycle\n let nextToolCallId = nextState.nextToolCallId\n let reasoningSignature = nextState.reasoningSignature\n\n for (const part of candidate.content.parts) {\n if (\"thoughtSignature\" in part && part.thoughtSignature && \"thought\" in part && part.thought)\n reasoningSignature = part.thoughtSignature\n if (\"text\" in part && part.text.length > 0) {\n if (part.thought) {\n lifecycle = Lifecycle.reasoningDelta(\n lifecycle,\n events,\n \"reasoning-0\",\n part.text,\n part.thoughtSignature ? googleMetadata({ thoughtSignature: part.thoughtSignature }) : undefined,\n )\n continue\n }\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", part.text)\n continue\n }\n\n if (\"functionCall\" in part) {\n const input = part.functionCall.args\n const id = `tool_${nextToolCallId++}`\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(\n LLMEvent.toolCall({\n id,\n name: part.functionCall.name,\n input,\n providerMetadata: part.thoughtSignature\n ? googleMetadata({ thoughtSignature: part.thoughtSignature })\n : undefined,\n }),\n )\n hasToolCalls = true\n }\n }\n\n return Effect.succeed([\n {\n ...nextState,\n hasToolCalls,\n lifecycle,\n nextToolCallId,\n reasoningSignature,\n finishReason: candidate.finishReason ?? nextState.finishReason,\n },\n events,\n ] as const)\n}\n\n// =============================================================================\n// Protocol And Gemini Route\n// =============================================================================\n/**\n * The Gemini protocol — request body construction, body schema, and the\n * streaming-event state machine. Used by Google AI Studio Gemini and (once\n * registered) Vertex Gemini.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: GeminiBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(GeminiEvent),\n initial: () => ({ hasToolCalls: false, nextToolCallId: 0, lifecycle: Lifecycle.initial() }),\n step,\n onHalt: finish,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"google\",\n providerMetadataKey: \"google\",\n protocol,\n // Gemini's path embeds the model id and pins SSE framing at the URL level.\n endpoint: Endpoint.path(({ request }) => `/models/${request.model.id}:streamGenerateContent?alt=sse`, {\n baseURL: DEFAULT_BASE_URL,\n }),\n auth: Auth.none,\n framing: Framing.sse,\n})\n\nexport * as Gemini from \"./gemini\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID, type ProviderOptions } from \"../schema\"\nimport * as Gemini from \"../protocols/gemini\"\n\nexport const id = ProviderID.make(\"google\")\n\nexport const routes = [Gemini.route]\n\nexport type Config = RouteDefaultsInput & ProviderAuthOption<\"optional\"> & { readonly baseURL?: string }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: ProviderOptions\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"GOOGLE_GENERATIVE_AI_API_KEY\"))\n .pipe(Auth.header(\"x-goog-api-key\"))\n}\n\nconst configuredRoute = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return Gemini.route.with({ ...rest, endpoint: { baseURL }, auth: auth(input) })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C8E1B08CE6B6397664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/tool-stream.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { LLMError, LLMEvent, type ProviderMetadata, type ToolCall, type ToolInputError } from \"../../schema\"\nimport { eventError, parseToolInput, type ToolAccumulator } from \"../shared\"\n\ntype StreamKey = string | number\n\n/**\n * One pending streamed tool call. Providers emit the tool identity and JSON\n * argument text across separate chunks; `input` is the raw JSON string collected\n * so far, not the parsed object.\n */\nexport interface PendingTool extends ToolAccumulator {\n readonly providerExecuted?: boolean\n readonly providerMetadata?: ProviderMetadata\n}\n\n/**\n * Sparse parser state keyed by the provider's stream-local tool identifier.\n *\n * This key is not the final tool-call id (`call_...`). It is the id/index the\n * provider uses while streaming a partial call: OpenAI Chat / Anthropic /\n * Bedrock use numeric content indexes, while OpenAI Responses uses string\n * `item_id`s. The generic keeps each protocol internally consistent.\n */\nexport type State<K extends StreamKey> = Partial<Record<K, PendingTool>>\n\n/**\n * Result of adding argument text to one pending tool call. It returns both the\n * next `tools` state and the updated `tool` because parsers often need the\n * current id/name immediately. `events` contains lifecycle and delta events\n * produced by the append; metadata-only deltas update identity without output.\n */\nexport interface AppendOutcome<K extends StreamKey> {\n readonly tools: State<K>\n readonly tool: PendingTool\n readonly events: ReadonlyArray<LLMEvent>\n}\n\n/** Create empty accumulator state for one provider stream. */\nexport const empty = <K extends StreamKey>(): State<K> => ({})\n\nconst withTool = <K extends StreamKey>(tools: State<K>, key: K, tool: PendingTool): State<K> => {\n return { ...tools, [key]: tool }\n}\n\nconst withoutTool = <K extends StreamKey>(tools: State<K>, key: K): State<K> => {\n const next = { ...tools }\n delete next[key]\n return next\n}\n\nconst inputStart = (tool: PendingTool) =>\n LLMEvent.toolInputStart({\n id: tool.id,\n name: tool.name,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n })\n\nconst inputDelta = (tool: PendingTool, text: string) =>\n LLMEvent.toolInputDelta({\n id: tool.id,\n name: tool.name,\n text,\n })\n\nconst toolCall = (route: string, tool: PendingTool, inputOverride?: string) => {\n const raw = inputOverride ?? tool.input\n return parseToolInput(route, tool.name, raw).pipe(\n Effect.map((input): ToolCall | ToolInputError =>\n LLMEvent.toolCall({\n id: tool.id,\n name: tool.name,\n input,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n }),\n ),\n Effect.catch((error) =>\n tool.providerExecuted\n ? Effect.fail(error)\n : Effect.succeed(\n LLMEvent.toolInputError({\n id: tool.id,\n name: tool.name,\n raw,\n }),\n ),\n ),\n )\n}\n\nconst finishEvents = (tool: PendingTool, event: ToolCall | ToolInputError): ReadonlyArray<LLMEvent> =>\n event.type === \"tool-input-error\"\n ? [event]\n : [LLMEvent.toolInputEnd({ id: tool.id, name: tool.name, providerMetadata: tool.providerMetadata }), event]\n\n/** Store the updated tool and produce the optional public delta event. */\nconst appendTool = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: PendingTool,\n text: string,\n): AppendOutcome<K> => {\n const events: LLMEvent[] = []\n if (!tools[key]) events.push(inputStart(tool))\n if (text.length > 0) events.push(inputDelta(tool, text))\n return {\n tools: withTool(tools, key, tool),\n tool,\n events,\n }\n}\n\nexport const isError = <K extends StreamKey>(result: AppendOutcome<K> | LLMError): result is LLMError =>\n result instanceof LLMError\n\n/**\n * Register a tool call whose start event arrived before any argument deltas.\n * Used by Anthropic `content_block_start`, Bedrock `contentBlockStart`, and\n * OpenAI Responses `response.output_item.added`.\n */\nexport const start = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: Omit<PendingTool, \"input\"> & { readonly input?: string },\n) => withTool(tools, key, { ...tool, input: tool.input ?? \"\" })\n\n/**\n * Append a streamed argument delta, starting the tool if this provider encodes\n * identity on the first delta instead of a separate start event. OpenAI Chat has\n * this shape: `tool_calls[].index` is the stream key, and `id` / `name` may only\n * appear on the first delta for that index.\n */\nexport const appendOrStart = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n delta: { readonly id?: string; readonly name?: string; readonly text: string },\n missingToolMessage: string,\n): AppendOutcome<K> | LLMError => {\n const current = tools[key]\n const id = delta.id ?? current?.id\n const name = delta.name ?? current?.name\n if (!id || !name) return eventError(route, missingToolMessage)\n\n const tool = {\n id,\n name,\n input: `${current?.input ?? \"\"}${delta.text}`,\n providerExecuted: current?.providerExecuted,\n providerMetadata: current?.providerMetadata,\n }\n if (current && delta.text.length === 0 && current.id === id && current.name === name)\n return { tools, tool: current, events: [] }\n return appendTool(tools, key, tool, delta.text)\n}\n\n/**\n * Append argument text to a tool that must already have been started. This keeps\n * protocols honest when their stream grammar promises a start event before any\n * argument delta.\n */\nexport const appendExisting = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n text: string,\n missingToolMessage: string,\n): AppendOutcome<K> | LLMError => {\n const current = tools[key]\n if (!current) return eventError(route, missingToolMessage)\n if (text.length === 0) return { tools, tool: current, events: [] }\n return appendTool(tools, key, { ...current, input: `${current.input}${text}` }, text)\n}\n\n/**\n * Finalize one pending tool call: parse the accumulated raw JSON, remove it\n * from state, and return either a call or a non-executable local input error.\n * Missing keys are a no-op because some providers emit stop events for\n * non-tool content blocks.\n */\nexport const finish = <K extends StreamKey>(route: string, tools: State<K>, key: K) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool)),\n }\n })\n\n/**\n * Finalize one pending tool call with an authoritative final input string.\n * OpenAI Responses can send accumulated deltas and then repeat the completed\n * arguments on `response.output_item.done`; the final value wins.\n */\nexport const finishWithInput = <K extends StreamKey>(route: string, tools: State<K>, key: K, input: string) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool, input)),\n }\n })\n\n/**\n * Finalize every pending tool call at once. OpenAI Chat has this shape: it does\n * not emit per-tool stop events, so all accumulated calls finish independently\n * when the choice receives a terminal `finish_reason`.\n */\nexport const finishAll = <K extends StreamKey>(route: string, tools: State<K>) =>\n Effect.gen(function* () {\n const pending = Object.values<PendingTool | undefined>(tools).filter(\n (tool): tool is PendingTool => tool !== undefined,\n )\n return {\n tools: empty<K>(),\n events: yield* Effect.forEach(pending, (tool) =>\n toolCall(route, tool).pipe(Effect.map((event) => finishEvents(tool, event))),\n ).pipe(Effect.map((events) => events.flat())),\n }\n })\n\nexport * as ToolStream from \"./tool-stream\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "A57A1C1E512305A164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Duration, Effect, Fiber, Layer, Schema, Stream } from \"effect\"\nimport type { PlatformError } from \"effect/PlatformError\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { CrossSpawnSpawner } from \"./cross-spawn-spawner\"\nimport { makeGlobalNode } from \"./effect/app-node\"\n\nexport class AppProcessError extends Schema.TaggedErrorClass<AppProcessError>()(\"AppProcessError\", {\n command: Schema.String,\n exitCode: Schema.optional(Schema.Number),\n stderr: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {\n override get message() {\n const detail =\n this.stderr?.trim() || (this.cause instanceof Error ? this.cause.message : this.cause && String(this.cause))\n const status = this.exitCode === undefined ? \"\" : ` (exit ${this.exitCode})`\n return `Command failed${status}: ${this.command}${detail ? `: ${detail}` : \"\"}`\n }\n}\n\nexport interface RunOptions {\n readonly combineOutput?: boolean\n readonly maxOutputBytes?: number\n readonly maxErrorBytes?: number\n readonly signal?: AbortSignal\n readonly timeout?: Duration.Input\n readonly stdin?: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>\n}\n\nexport interface RunStreamOptions {\n readonly signal?: AbortSignal\n readonly includeStderr?: boolean\n readonly okExitCodes?: ReadonlyArray<number>\n readonly maxErrorBytes?: number\n}\n\nexport interface RunResult {\n readonly command: string\n readonly exitCode: number\n readonly output?: Buffer\n readonly stdout: Buffer\n readonly stderr: Buffer\n readonly outputTruncated?: boolean\n readonly stdoutTruncated: boolean\n readonly stderrTruncated: boolean\n}\n\nexport type Interface = ChildProcessSpawner[\"Service\"] & {\n readonly run: (command: ChildProcess.Command, options?: RunOptions) => Effect.Effect<RunResult, AppProcessError>\n readonly runStream: (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ) => Stream.Stream<string, AppProcessError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/AppProcess\") {}\n\nexport const requireSuccess = (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n result.exitCode === 0\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nexport const requireExitIn =\n (codes: ReadonlyArray<number>) =>\n (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n codes.includes(result.exitCode)\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nconst describeCommand = (command: ChildProcess.Command): string => {\n if (command._tag === \"StandardCommand\") {\n return command.args.length ? `${command.command} ${command.args.join(\" \")}` : command.command\n }\n return `${describeCommand(command.left)} | ${describeCommand(command.right)}`\n}\n\nconst wrapError = (description: string, cause: unknown): AppProcessError =>\n cause instanceof AppProcessError ? cause : new AppProcessError({ command: description, cause })\n\nexport const abortError = (signal: AbortSignal): Error => {\n const reason = signal.reason\n if (reason instanceof Error) return reason\n const err = new Error(\"Aborted\")\n err.name = \"AbortError\"\n return err\n}\n\nexport const waitForAbort = (signal: AbortSignal) =>\n Effect.callback<never, Error>((resume) => {\n if (signal.aborted) {\n resume(Effect.fail(abortError(signal)))\n return\n }\n const onabort = () => resume(Effect.fail(abortError(signal)))\n signal.addEventListener(\"abort\", onabort, { once: true })\n return Effect.sync(() => signal.removeEventListener(\"abort\", onabort))\n })\n\nconst normalizeStdin = (\n input: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>,\n): Stream.Stream<Uint8Array, PlatformError> =>\n typeof input === \"string\"\n ? Stream.make(new TextEncoder().encode(input))\n : input instanceof Uint8Array\n ? Stream.make(input)\n : input\n\nexport const collectStream = (stream: Stream.Stream<Uint8Array, PlatformError>, maxOutputBytes: number | undefined) =>\n Stream.runFold(\n stream,\n () => ({ chunks: [] as Uint8Array[], bytes: 0, truncated: false }),\n (acc, chunk) => {\n if (maxOutputBytes === undefined) {\n acc.chunks.push(chunk)\n acc.bytes += chunk.length\n return acc\n }\n const remaining = maxOutputBytes - acc.bytes\n if (remaining > 0) acc.chunks.push(remaining >= chunk.length ? chunk : chunk.slice(0, remaining))\n acc.bytes += chunk.length\n acc.truncated = acc.truncated || acc.bytes > maxOutputBytes\n return acc\n },\n ).pipe(Effect.map((x) => ({ buffer: Buffer.concat(x.chunks), truncated: x.truncated })))\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n\n const runCommand = (command: ChildProcess.Command, options?: RunOptions) => {\n const description = describeCommand(command)\n const collect = Effect.scoped(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n if (options?.combineOutput) {\n const [output, exitCode] = yield* Effect.all(\n [collectStream(handle.all, options.maxOutputBytes), handle.exitCode],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n output: output.buffer,\n stdout: Buffer.alloc(0),\n stderr: Buffer.alloc(0),\n outputTruncated: output.truncated,\n stdoutTruncated: false,\n stderrTruncated: false,\n } satisfies RunResult\n }\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, options?.maxOutputBytes),\n collectStream(handle.stderr, options?.maxErrorBytes),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n stdout: stdout.buffer,\n stderr: stderr.buffer,\n stdoutTruncated: stdout.truncated,\n stderrTruncated: stderr.truncated,\n } satisfies RunResult\n }),\n )\n const timed = options?.timeout\n ? Effect.timeoutOrElse(collect, {\n duration: options.timeout,\n orElse: () => Effect.fail(new AppProcessError({ command: description, cause: new Error(\"Timed out\") })),\n })\n : collect\n const aborted = options?.signal\n ? timed.pipe(\n Effect.raceFirst(\n waitForAbort(options.signal).pipe(Effect.mapError((cause) => wrapError(description, cause))),\n ),\n )\n : timed\n return aborted.pipe(Effect.catch((cause) => Effect.fail(wrapError(description, cause))))\n }\n\n const run = Effect.fn(\"AppProcess.run\")(function* (command: ChildProcess.Command, options?: RunOptions) {\n if (options?.stdin === undefined) return yield* runCommand(command, options)\n if (command._tag !== \"StandardCommand\") {\n return yield* new AppProcessError({\n command: describeCommand(command),\n cause: new Error(\"stdin option only supports StandardCommand; received PipedCommand\"),\n })\n }\n const next = ChildProcess.make(command.command, command.args, {\n ...command.options,\n stdin: normalizeStdin(options.stdin),\n })\n return yield* runCommand(next, options)\n })\n\n const runStream = (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ): Stream.Stream<string, AppProcessError> => {\n const description = describeCommand(command)\n const okExitCodes = options?.okExitCodes\n const built: Stream.Stream<string, AppProcessError | PlatformError> = Stream.unwrap(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n const stderrFiber = yield* Effect.forkScoped(\n collectStream(handle.stderr, options?.maxErrorBytes).pipe(Effect.map((x) => x.buffer.toString(\"utf8\"))),\n )\n const source = options?.includeStderr === true ? handle.all : handle.stdout\n const lines = source.pipe(\n Stream.decodeText,\n Stream.splitLines,\n Stream.filter((line) => line.length > 0),\n )\n const tail = Stream.unwrap(\n Effect.gen(function* () {\n const code = yield* handle.exitCode\n if (okExitCodes && okExitCodes.length > 0 && !okExitCodes.includes(code)) {\n const stderr = yield* Fiber.join(stderrFiber)\n return Stream.fail(new AppProcessError({ command: description, exitCode: code, stderr }))\n }\n return Stream.empty\n }),\n )\n return Stream.concat(lines, tail) as Stream.Stream<string, AppProcessError | PlatformError>\n }),\n )\n const mapped = built.pipe(\n Stream.catch((cause): Stream.Stream<string, AppProcessError> => Stream.fail(wrapError(description, cause))),\n )\n if (!options?.signal) return mapped\n const signal = options.signal\n return mapped.pipe(\n Stream.interruptWhen(waitForAbort(signal).pipe(Effect.mapError((cause) => wrapError(description, cause)))),\n )\n }\n\n return Service.of({ ...spawner, run, runStream })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer: layer, deps: [CrossSpawnSpawner.node] })\n\nexport * as AppProcess from \"./process\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "626C5A390CEC905164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+9BAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAgB,OAC3E,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH", | ||
| "debugId": "E0067C4DDA2F6F8B64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is not supported yet
258340841
0