@opencode-ai/cli-linux-arm64
Advanced tools
| { | ||
| "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": ";66BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,EAC/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": "8036730A7197E0FA64756E2164756E21", | ||
| "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((body) => {\n const sourceAssistants = request.messages.filter((message) => message.role === \"assistant\")\n let assistantIndex = 0\n const messages = body.messages.map((message) => {\n if (message.role !== \"assistant\") return message\n const source = sourceAssistants[assistantIndex++]\n const reasoning = source?.content\n .filter((part) => part.type === \"reasoning\")\n .map((part) => part.text)\n .join(\"\")\n const reasoningDetails = Array.isArray(message.reasoning_details) ? message.reasoning_details : undefined\n return {\n ...message,\n reasoning_content: undefined,\n reasoning_text: undefined,\n reasoning: reasoning && reasoningDetails && reasoningDetails.length > 0 ? reasoning : undefined,\n reasoning_details: reasoningDetails,\n }\n })\n return {\n ...body,\n messages,\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": ";wjBAWO,SAAM,OAAmC,OAAS,gBAC5C,OAAK,OAAW,UAAK,OAAQ,aAAQ,OAC5C,OAAU,kBAmBV,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,IAAI,CAAC,IAAS,CACnB,IAAM,EAAmB,EAAQ,SAAS,OAAO,CAAC,IAAY,EAAQ,OAAS,WAAW,EACtF,EAAiB,EACf,EAAW,EAAK,SAAS,IAAI,CAAC,IAAY,CAC9C,GAAI,EAAQ,OAAS,YAAa,OAAO,EAEzC,IAAM,EADS,EAAiB,MACN,QACvB,OAAO,CAAC,IAAS,EAAK,OAAS,WAAW,EAC1C,IAAI,CAAC,IAAS,EAAK,IAAI,EACvB,KAAK,EAAE,EACJ,EAAmB,MAAM,QAAQ,EAAQ,iBAAiB,EAAI,EAAQ,kBAAoB,OAChG,MAAO,IACF,EACH,kBAAmB,OACnB,eAAgB,OAChB,UAAW,GAAa,GAAoB,EAAiB,OAAS,EAAI,EAAY,OACtF,kBAAmB,CACrB,EACD,EACD,MAAO,IACF,EACH,cACG,EAAY,EAAQ,iBAAiB,UAAU,CACpD,EACD,CACH,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": "CA44D002C2E6109C64756E2164756E21", | ||
| "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": ";66BAAA,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,CAC5C,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": "A605F4AF0F04164664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "B22977C5D69FA8F964756E2164756E21", | ||
| "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": ";ujBAOO,SAAM,OAAK,OAAW,UAAK,2BAAsB,OAiB3C,OAAS,MAAC,OAAkB,UAAK,OAExC,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": "E0FCE86E12FEFD2464756E2164756E21", | ||
| "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": ";qhBAOO,SAAM,OAAK,OAAW,UAAK,wBAAmB,OAmBxC,OAAS,MAAsB,MAAK,OAEpC,OAAY,MAAC,SAA+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": "CB1B39BE4F85243964756E2164756E21", | ||
| "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": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,CACH", | ||
| "debugId": "8C3F2FBBFCF6226164756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/xai-images.ts", "../ai/src/providers/xai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport { GeneratedImage, ImageModel, ImageResponse, type ImageRequestFor, type ImageRoute } from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport {\n InvalidProviderOutputReason,\n LLMError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema\"\nimport { ProviderShared, optionalNull } from \"./shared\"\nimport { ImageInputs } from \"./utils/image-input\"\n\nconst ADAPTER = \"xai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.x.ai/v1\"\nexport const PATH = \"/images/generations\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type XAIImageString<Known extends string> = Known | (string & {})\n\nexport type XAIImageOptions = {\n readonly n?: number\n readonly aspectRatio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly aspect_ratio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly resolution?: XAIImageString<\"1k\" | \"2k\">\n readonly responseFormat?: XAIImageString<\"url\" | \"b64_json\">\n readonly response_format?: XAIImageString<\"url\" | \"b64_json\">\n} & Record<string, unknown>\n\ntype XAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\n\nconst XAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: optionalNull(Schema.String),\n url: optionalNull(Schema.String),\n revised_prompt: optionalNull(Schema.String),\n mime_type: optionalNull(Schema.String),\n }),\n ),\n usage: Schema.optional(Schema.Unknown),\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 http?: HttpOptions\n}\n\nconst nativeOptions = (options: XAIImageOptions | undefined) => {\n if (!options) return undefined\n const { aspectRatio, responseFormat, ...native } = options\n return {\n aspect_ratio: aspectRatio,\n response_format: responseFormat,\n ...native,\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\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<XAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"XAIImages.generate\")(function* (request: ImageRequestFor<XAIImageOptions>, execute) {\n const http = mergeHttpOptions(request.model.http, request.http)\n const imageReferences = (request.images ?? []).map((image) => {\n if (image.type === \"bytes\") return { url: ImageInputs.dataUrl(image), type: \"image_url\" as const }\n if (image.type === \"url\") return { url: image.url, type: \"image_url\" as const }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (imageReferences.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"xAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n image: imageReferences.length === 1 ? imageReferences[0] : undefined,\n images: imageReferences.length > 1 ? imageReferences : undefined,\n },\n nativeOptions(request.options),\n http?.body,\n ) as XAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${imageReferences.length === 0 ? PATH : EDIT_PATH}`,\n http?.query,\n )\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 xAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(XAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"xAI Images returned an invalid response\")),\n )\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n const mediaType = item.mime_type ?? \"application/octet-stream\"\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`xAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType,\n data,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`xAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"xAI Images returned no images\")\n const usage = ProviderShared.isRecord(decoded.usage) ? decoded.usage : undefined\n return new ImageResponse({\n images,\n usage: usage === undefined ? undefined : new Usage({ providerMetadata: { xai: usage } }),\n providerMetadata: usage === undefined ? undefined : { xai: { usage } },\n })\n }),\n }\n return ImageModel.make<XAIImageOptions>({ id: input.id, provider: \"xai\", route, http: input.http })\n}\n\nexport const XAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { HttpOptions, 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\"\nimport { XAIImages } from \"../protocols/xai-images\"\n\nexport const id = ProviderID.make(\"xai\")\n\nexport type ModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport type { XAIImageOptions } from \"../protocols/xai-images\"\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 const image = (modelID: string | ModelID) =>\n XAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL,\n headers: input.headers,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n return {\n id,\n model: responses,\n responses,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model = provider.model\nexport const responses = provider.responses\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "BEE5FD66BF44806864756E2164756E21", | ||
| "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": ";66BAAA,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,CAC1C,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": "F19BD5B958368ADF64756E2164756E21", | ||
| "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 { ImageOptions, ImageRequest, ImageRequestFor, ImageResponse } from \"./image\"\nimport type { LLMError } from \"./schema\"\n\nexport type Execute = RequestExecutor.Interface[\"execute\"]\n\nexport interface Interface {\n readonly generate: <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n ) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/ImageClient\") {}\n\nexport const generate = <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n): 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, Service, type Execute as ImageExecute } from \"./image-client\"\n\nexport interface ImageRoute<Options extends ImageOptions = ImageOptions> {\n readonly id: string\n readonly generate: (\n request: ImageRequestFor<Options>,\n execute: ImageExecute,\n ) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport type ImageOptions = Record<string, unknown>\n\nexport class ImageModel<Options extends ImageOptions = ImageOptions> {\n declare protected readonly _Options: (options: Options) => Options\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n\n constructor(input: ImageModel.Input<Options>) {\n this.id = input.id\n this.provider = input.provider\n this.route = input.route\n this.http = input.http\n }\n\n static make<Options extends ImageOptions = ImageOptions>(input: ImageModel.MakeInput<Options>) {\n return new ImageModel<Options>({\n id: ModelID.make(input.id),\n provider: ProviderID.make(input.provider),\n route: input.route,\n http: input.http,\n })\n }\n}\n\nexport namespace ImageModel {\n export interface Input<Options extends ImageOptions = ImageOptions> {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n }\n\n export interface MakeInput<Options extends ImageOptions = ImageOptions>\n extends Omit<Input<Options>, \"id\" | \"provider\"> {\n readonly id: string | ModelID\n readonly provider: string | ProviderID\n }\n}\n\nexport const ImageModelSchema = Schema.declare((value): value is ImageModel => value instanceof ImageModel, {\n expected: \"Image.Model\",\n})\n\nconst ImageBytesInput = Schema.Struct({\n type: Schema.Literal(\"bytes\"),\n data: Schema.Uint8Array,\n mediaType: Schema.String,\n})\nconst ImageUrlInput = Schema.Struct({\n type: Schema.Literal(\"url\"),\n url: Schema.String,\n})\nconst ImageFileIDInput = Schema.Struct({\n type: Schema.Literal(\"file-id\"),\n id: Schema.String,\n})\nconst ImageFileURIInput = Schema.Struct({\n type: Schema.Literal(\"file-uri\"),\n uri: Schema.String,\n mediaType: Schema.String,\n})\n\nexport const ImageInputSchema = Schema.Union([\n ImageBytesInput,\n ImageUrlInput,\n ImageFileIDInput,\n ImageFileURIInput,\n]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type ImageInput = Schema.Schema.Type<typeof ImageInputSchema>\n\nexport const ImageInput = {\n bytes: (data: Uint8Array, mediaType: string): ImageInput => ({ type: \"bytes\", data, mediaType }),\n url: (url: string): ImageInput => ({ type: \"url\", url }),\n file: (id: string): ImageInput => ({ type: \"file-id\", id }),\n fileUri: (uri: string, mediaType: string): ImageInput => ({ type: \"file-uri\", uri, mediaType }),\n} as const\n\nexport class ImageRequest extends Schema.Class<ImageRequest>(\"Image.Request\")({\n model: ImageModelSchema,\n prompt: Schema.String,\n images: Schema.optional(Schema.Array(ImageInputSchema)),\n options: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n http: Schema.optional(HttpOptions),\n}) {\n declare protected readonly _ImageRequest: void\n}\n\nexport type ImageRequestFor<Options extends ImageOptions = ImageOptions> = Omit<ImageRequest, \"model\" | \"options\"> & {\n readonly model: ImageModel<Options>\n readonly options?: Options\n}\n\nexport type ImageModelOptions<Model> = Model extends ImageModel<infer Options> ? Options : never\n\nexport type ImageRequestInput<Model extends object = ImageModel> = Omit<\n ConstructorParameters<typeof ImageRequest>[0],\n \"model\" | \"options\" | \"http\"\n> & {\n readonly model: Model\n readonly options?: NoInfer<ImageModelOptions<Model>>\n readonly http?: HttpOptions.Input\n} & (Model extends ImageModel<ImageModelOptions<Model>> ? unknown : never)\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 function request<const Model extends object>(\n input: ImageRequestInput<Model>,\n): ImageRequestFor<ImageModelOptions<Model>>\nexport function request(input: ImageRequest): ImageRequest\nexport function request(input: ImageRequest | ImageRequestInput) {\n if (input instanceof ImageRequest) return input\n return new ImageRequest({\n ...input,\n model: input.model as unknown as ImageModel,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n}\n\nexport function generate<const Model extends object>(\n input: ImageRequestInput<Model>,\n): Effect.Effect<ImageResponse, LLMError, Service>\nexport function generate(input: ImageRequest): Effect.Effect<ImageResponse, LLMError, Service>\nexport function generate(input: ImageRequest | ImageRequestInput) {\n return Effect.try({\n try: () => (input instanceof ImageRequest ? input : 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((request) => ImageClient.generate(request as unknown as ImageRequestFor<ImageOptions>)))\n}\n\nexport const Image = {\n request,\n generate,\n} as const\n" | ||
| ], | ||
| "mappings": ";0MAaO,WAAM,eAAgB,EAAQ,QAA4B,EAAE,uBAAuB,CAAE,CAAC,CAUtF,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,ECjBO,MAAM,CAAwD,CAE1D,GACA,SACA,MACA,KAET,WAAW,CAAC,EAAkC,CAC5C,KAAK,GAAK,EAAM,GAChB,KAAK,SAAW,EAAM,SACtB,KAAK,MAAQ,EAAM,MACnB,KAAK,KAAO,EAAM,WAGb,KAAiD,CAAC,EAAsC,CAC7F,OAAO,IAAI,EAAoB,CAC7B,GAAI,EAAQ,KAAK,EAAM,EAAE,EACzB,SAAU,EAAW,KAAK,EAAM,QAAQ,EACxC,MAAO,EAAM,MACb,KAAM,EAAM,IACd,CAAC,EAEL,CAiBO,IAAM,EAAmB,EAAO,QAAQ,CAAC,IAA+B,aAAiB,EAAY,CAC1G,SAAU,aACZ,CAAC,EAEK,EAAkB,EAAO,OAAO,CACpC,KAAM,EAAO,QAAQ,OAAO,EAC5B,KAAM,EAAO,WACb,UAAW,EAAO,MACpB,CAAC,EACK,EAAgB,EAAO,OAAO,CAClC,KAAM,EAAO,QAAQ,KAAK,EAC1B,IAAK,EAAO,MACd,CAAC,EACK,EAAmB,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,SAAS,EAC9B,GAAI,EAAO,MACb,CAAC,EACK,EAAoB,EAAO,OAAO,CACtC,KAAM,EAAO,QAAQ,UAAU,EAC/B,IAAK,EAAO,OACZ,UAAW,EAAO,MACpB,CAAC,EAEY,EAAmB,EAAO,MAAM,CAC3C,EACA,EACA,EACA,CACF,CAAC,EAAE,KAAK,EAAO,cAAc,MAAM,CAAC,EAU7B,MAAM,UAAqB,EAAO,MAAoB,eAAe,EAAE,CAC5E,MAAO,EACP,OAAQ,EAAO,OACf,OAAQ,EAAO,SAAS,EAAO,MAAM,CAAgB,CAAC,EACtD,QAAS,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EACrE,KAAM,EAAO,SAAS,CAAW,CACnC,CAAC,CAAE,CAEH,CAkBO,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": "7EB40FB69048C63064756E2164756E21", | ||
| "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, HttpClientResponse } from \"effect/unstable/http\"\nimport {\n ImageModel,\n GeneratedImage,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport {\n InvalidProviderOutputReason,\n LLMError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema\"\nimport { ProviderShared } from \"./shared\"\nimport { ImageInputs } from \"./utils/image-input\"\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\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type OpenAIImageString<Known extends string> = Known | (string & {})\n\nexport type OpenAIImageOptions = {\n readonly mask?: ImageInput\n readonly n?: number\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly moderation?: OpenAIImageString<\"auto\" | \"low\">\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly outputCompression?: number\n} & Record<string, unknown>\n\nexport type OpenAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\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 http?: HttpOptions\n}\n\nconst nativeOptions = (options: OpenAIImageOptions | undefined) => {\n if (!options) return undefined\n const { mask: _, outputFormat, outputCompression, ...native } = options\n return {\n output_format: outputFormat,\n output_compression: outputCompression,\n ...native,\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\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<OpenAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"OpenAIImages.generate\")(function* (request: ImageRequestFor<OpenAIImageOptions>, execute) {\n const mask = request.options?.mask\n if (mask !== undefined && (request.images?.length ?? 0) === 0)\n return yield* ImageInputs.invalid(ADAPTER, \"An OpenAI image mask requires at least one input image\")\n const http = mergeHttpOptions(request.model.http, request.http)\n const sourceImages = request.images ?? []\n const multipartImages = yield* Effect.forEach(sourceImages, (image) => {\n if (image.type === \"bytes\") return Effect.succeed({ data: image.data, mediaType: image.mediaType })\n if (image.type === \"url\") return ImageInputs.decodeDataUrl(image.url, ADAPTER)\n return Effect.succeed(undefined)\n })\n const multipartMask =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { data: mask.data, mediaType: mask.mediaType }\n : mask.type === \"url\"\n ? yield* ImageInputs.decodeDataUrl(mask.url, ADAPTER)\n : undefined\n const useMultipart =\n sourceImages.length > 0 &&\n multipartImages.every((image) => image !== undefined) &&\n (mask === undefined || multipartMask !== undefined)\n const path = sourceImages.length === 0 ? PATH : EDIT_PATH\n const url = applyQuery(`${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${path}`, http?.query)\n\n if (useMultipart) {\n const form = new FormData()\n form.append(\"model\", request.model.id)\n form.append(\"prompt\", request.prompt)\n Object.entries(mergeJsonRecords(nativeOptions(request.options), http?.body) ?? {}).forEach(([key, value]) => {\n if ([\"model\", \"prompt\", \"image\", \"image[]\", \"images\", \"mask\"].includes(key)) return\n form.append(key, typeof value === \"string\" ? value : ProviderShared.encodeJson(value))\n })\n multipartImages.forEach((image, index) => {\n if (image === undefined) return\n form.append(\"image[]\", imageBlob(image.data, image.mediaType), `image-${index}`)\n })\n if (multipartMask !== undefined)\n form.append(\"mask\", imageBlob(multipartMask.data, multipartMask.mediaType), \"mask\")\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: \"[multipart/form-data]\",\n headers: Headers.remove(Headers.fromInput({ ...input.headers, ...http?.headers }), \"content-type\"),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(HttpClientRequest.setHeaders(headers), HttpClientRequest.bodyFormData(form)),\n )\n return yield* parseResponse(response, request.options, http?.body)\n }\n\n const references = sourceImages.map((image) => {\n if (image.type === \"bytes\") return { image_url: ImageInputs.dataUrl(image) }\n if (image.type === \"url\") return { image_url: image.url }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (references.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const maskReference =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { image_url: ImageInputs.dataUrl(mask) }\n : mask.type === \"url\"\n ? { image_url: mask.url }\n : mask.type === \"file-id\"\n ? { file_id: mask.id }\n : undefined\n if (mask !== undefined && maskReference === undefined)\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts masks as URLs, data URLs, bytes, or file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n images: references.length === 0 ? undefined : references,\n mask: maskReference,\n },\n nativeOptions(request.options),\n http?.body,\n ) as OpenAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\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 return yield* parseResponse(response, request.options, http?.body)\n }),\n }\n return ImageModel.make<OpenAIImageOptions>({ id: input.id, provider: \"openai\", route, http: input.http })\n}\n\nconst parseResponse = Effect.fn(\"OpenAIImages.parseResponse\")(function* (\n response: HttpClientResponse.HttpClientResponse,\n options: OpenAIImageOptions | undefined,\n overlay: Record<string, unknown> | undefined,\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 requestBody = mergeJsonRecords(nativeOptions(options), overlay)\n const format =\n decoded.output_format ?? (typeof requestBody?.output_format === \"string\" ? requestBody.output_format : \"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\nconst imageBlob = (data: Uint8Array, mediaType: string) => {\n const buffer = new ArrayBuffer(data.byteLength)\n new Uint8Array(buffer).set(data)\n return new Blob([buffer], { type: mediaType })\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 OpenAIImageString } 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 }\n\nexport interface ImageGenerationOptions {\n readonly action?: OpenAIImageString<\"auto\" | \"generate\" | \"edit\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly inputFidelity?: OpenAIImageString<\"low\" | \"high\">\n readonly outputCompression?: number\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly partialImages?: number\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\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, ...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 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 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": "2782C69AAA6A04AA64756E2164756E21", | ||
| "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": ";+0BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,EACnD,CACH", | ||
| "debugId": "708CBF61CC3A534864756E2164756E21", | ||
| "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 config: {\n update: (update) => runServicePromise(config.update(update)),\n },\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,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,CACF,CAAC,CACH,EACD,CACH", | ||
| "debugId": "2052B4722717971764756E2164756E21", | ||
| "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": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "B0232AD7946D45B064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/prompt.ts", "../schema/src/shell.ts", "../schema/src/session-error.ts", "../schema/src/session-id.ts", "../schema/src/permission.ts", "../schema/src/agent.ts", "../schema/src/skill.ts", "../schema/src/snapshot.ts", "../schema/src/token-usage.ts", "../schema/src/session-message.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { statics } from \"./schema.js\"\n\nexport interface PromptMention extends Schema.Schema.Type<typeof PromptMention> {}\nexport const PromptMention = Schema.Struct({\n start: Schema.Finite,\n end: Schema.Finite,\n text: Schema.String,\n}).annotate({ identifier: \"Prompt.Mention\" })\n\nexport const FileSource = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"inline\") }),\n Schema.Struct({ type: Schema.Literal(\"uri\"), uri: Schema.String }),\n])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Prompt.FileSource\" })\nexport type FileSource = typeof FileSource.Type\n\nexport const Base64 = Schema.String.check(\n Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/),\n).annotate({ identifier: \"Prompt.Base64\" })\nexport type Base64 = typeof Base64.Type\n\nexport interface FileAttachment extends Schema.Schema.Type<typeof FileAttachment> {}\nexport const FileAttachment = Schema.Struct({\n data: Base64,\n mime: Schema.String,\n source: FileSource,\n name: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mention: PromptMention.pipe(optional),\n})\n .annotate({ identifier: \"Prompt.FileAttachment\" })\n .pipe(\n statics((schema) => ({\n create: (input: FileAttachment) =>\n schema.make({\n data: input.data,\n mime: input.mime,\n source: input.source,\n name: input.name,\n description: input.description,\n mention: input.mention,\n }),\n })),\n )\n\nexport interface AgentAttachment extends Schema.Schema.Type<typeof AgentAttachment> {}\nexport const AgentAttachment = Schema.Struct({\n name: Schema.String,\n mention: PromptMention.pipe(optional),\n}).annotate({ identifier: \"Prompt.AgentAttachment\" })\n\nexport interface Prompt extends Schema.Schema.Type<typeof Prompt> {}\nexport const Prompt = Schema.Struct({\n text: Schema.String,\n files: Schema.Array(FileAttachment).pipe(optional),\n agents: Schema.Array(AgentAttachment).pipe(optional),\n})\n .annotate({ identifier: \"Prompt\" })\n .pipe(\n statics((schema) => ({\n equivalence: Schema.toEquivalence(schema),\n fromUserMessage: (input: Pick<Prompt, \"text\" | \"files\" | \"agents\">) =>\n schema.make({\n text: input.text,\n ...(input.files === undefined ? {} : { files: input.files }),\n ...(input.agents === undefined ? {} : { agents: input.agents }),\n }),\n })),\n )\n", | ||
| "export * as Shell from \"./shell.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\n\nconst IDSchema = Schema.String.check(Schema.isStartsWith(\"sh_\")).pipe(Schema.brand(\"Shell.ID\"))\n\nexport const ID = IDSchema.pipe(\n statics((schema: typeof IDSchema) => {\n const create = () => schema.make(\"sh_\" + ascending())\n return {\n create,\n ascending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type ID = typeof ID.Type\n\nexport const Status = Schema.Literals([\"running\", \"exited\", \"timeout\", \"killed\"])\nexport type Status = typeof Status.Type\n\nexport const Time = Schema.Struct({\n started: Schema.Finite,\n completed: optional(Schema.Finite),\n})\nexport interface Time extends Schema.Schema.Type<typeof Time> {}\n\n// Opaque caller-supplied tags echoed back on Info and events. The Shell service never interprets\n// these; callers (e.g. ShellTool stores the originating session ID) use them to filter or correlate.\nexport const Metadata = Schema.Record(Schema.String, Schema.Unknown)\nexport type Metadata = typeof Metadata.Type\n\nexport const Info = Schema.Struct({\n id: ID,\n status: Status,\n command: Schema.String,\n cwd: Schema.String,\n shell: Schema.String,\n // Absolute path of the file capturing combined stdout/stderr. Page through it via `output`.\n file: Schema.String,\n pid: optional(NonNegativeInt),\n exit: optional(Schema.Finite),\n // Always present; defaults to an empty object when the creator supplies no metadata.\n metadata: Metadata,\n time: Time,\n}).annotate({ identifier: \"Shell.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nconst Created = ephemeral({ type: \"shell.created\", schema: { info: Info } })\nconst Exited = ephemeral({ type: \"shell.exited\", schema: { id: ID, exit: optional(Schema.Finite), status: Status } })\nconst Deleted = ephemeral({ type: \"shell.deleted\", schema: { id: ID } })\nexport const Event = { Created, Exited, Deleted, Definitions: inventory(Created, Exited, Deleted) }\n\nexport const CreateInput = Schema.Struct({\n command: Schema.String,\n cwd: optional(Schema.String),\n timeout: NonNegativeInt,\n metadata: optional(Metadata),\n})\nexport interface CreateInput extends Schema.Schema.Type<typeof CreateInput> {}\n\nexport const OutputInput = Schema.Struct({\n cursor: optional(NonNegativeInt),\n limit: optional(NonNegativeInt),\n})\nexport interface OutputInput extends Schema.Schema.Type<typeof OutputInput> {}\n\nexport const Output = Schema.Struct({\n output: Schema.String,\n // Absolute cursor after this page. Equals `size` once fully caught up.\n cursor: NonNegativeInt,\n // Total bytes captured so far. A consumer has more to page while `cursor < size`.\n size: NonNegativeInt,\n truncated: Schema.Boolean,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n", | ||
| "export * as SessionError from \"./session-error.js\"\n\nimport { Schema } from \"effect\"\n\nexport interface Error extends Schema.Schema.Type<typeof Error> {}\nexport const Error = Schema.Struct({\n type: Schema.String,\n message: Schema.String,\n}).annotate({ identifier: \"Session.StructuredError\" })\n", | ||
| "import { Schema } from \"effect\"\nimport { descending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const SessionID = Schema.String.check(Schema.isStartsWith(\"ses\")).pipe(\n Schema.brand(\"SessionID\"),\n statics((schema) => {\n const create = () => schema.make(\"ses_\" + descending())\n return {\n create,\n descending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type SessionID = typeof SessionID.Type\n", | ||
| "export * as Permission from \"./permission.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"per\")).pipe(\n Schema.brand(\"PermissionV2.ID\"),\n statics((schema) => ({ create: (id?: string) => schema.make(id ?? \"per_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Source = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"tool\"),\n messageID: Schema.String,\n callID: Schema.String,\n }),\n]).annotate({ identifier: \"PermissionV2.Source\" })\nexport type Source = typeof Source.Type\n\nconst RequestFields = {\n sessionID: SessionID,\n action: Schema.String,\n resources: Schema.Array(Schema.String),\n save: Schema.Array(Schema.String).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n source: Source.pipe(optional),\n}\n\nexport const Request = Schema.Struct({\n id: ID,\n ...RequestFields,\n}).annotate({ identifier: \"PermissionV2.Request\" })\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\n\nexport const Reply = Schema.Literals([\"once\", \"always\", \"reject\"]).annotate({ identifier: \"PermissionV2.Reply\" })\nexport type Reply = typeof Reply.Type\n\nconst Asked = ephemeral({ type: \"permission.v2.asked\", schema: Request.fields })\nconst Replied = ephemeral({\n type: \"permission.v2.replied\",\n schema: {\n sessionID: SessionID,\n requestID: ID,\n reply: Reply,\n },\n})\nexport const Event = { Asked, Replied, Definitions: inventory(Asked, Replied) }\n\nexport const Effect = Schema.Literals([\"allow\", \"deny\", \"ask\"]).annotate({ identifier: \"PermissionV2.Effect\" })\nexport type Effect = typeof Effect.Type\n\nexport interface Rule extends Schema.Schema.Type<typeof Rule> {}\nexport const Rule = Schema.Struct({\n action: Schema.String,\n resource: Schema.String,\n effect: Effect,\n}).annotate({ identifier: \"PermissionV2.Rule\" })\n\nexport const Ruleset = Schema.Array(Rule).annotate({ identifier: \"PermissionV2.Ruleset\" })\nexport type Ruleset = typeof Ruleset.Type\n", | ||
| "export * as Agent from \"./agent.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Permission } from \"./permission.js\"\nimport { Provider } from \"./provider.js\"\nimport { PositiveInt, statics } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"agent.updated\", schema: {} })\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Agent.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Agent.Name\"))\nexport type Name = typeof Name.Type\n\nexport const Color = Schema.Union([\n Schema.String.check(Schema.isPattern(/^#[0-9a-fA-F]{6}$/)),\n Schema.Literals([\"primary\", \"secondary\", \"accent\", \"success\", \"warning\", \"error\", \"info\"]),\n]).annotate({ identifier: \"Agent.Color\" })\nexport type Color = typeof Color.Type\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n model: Model.Ref.pipe(optional),\n request: Provider.Request,\n system: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mode: Schema.Literals([\"subagent\", \"primary\", \"all\"]),\n hidden: Schema.Boolean,\n color: Color.pipe(optional),\n steps: PositiveInt.pipe(optional),\n permissions: Permission.Ruleset,\n})\n .annotate({ identifier: \"Agent.Info\" })\n .pipe(\n statics(() => ({\n empty: (id: ID) =>\n ({\n id,\n name: Name.make(id),\n request: { settings: {}, headers: {}, body: {} },\n mode: \"all\",\n hidden: false,\n permissions: [\n { action: \"*\", resource: \"*\", effect: \"allow\" },\n { action: \"external_directory\", resource: \"*\", effect: \"ask\" },\n ],\n }) satisfies Info,\n })),\n )\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Skill from \"./skill.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { AbsolutePath } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Skill.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Skill.Name\"))\nexport type Name = typeof Name.Type\n\nexport interface DirectorySource extends Schema.Schema.Type<typeof DirectorySource> {}\nexport const DirectorySource = Schema.Struct({\n type: Schema.tag(\"directory\"),\n path: AbsolutePath,\n}).annotate({ identifier: \"Skill.DirectorySource\" })\n\nexport interface UrlSource extends Schema.Schema.Type<typeof UrlSource> {}\nexport const UrlSource = Schema.Struct({\n type: Schema.tag(\"url\"),\n url: Schema.String,\n}).annotate({ identifier: \"Skill.UrlSource\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n description: Schema.String.pipe(optional),\n slash: Schema.Boolean.pipe(optional),\n autoinvoke: Schema.Boolean.pipe(optional),\n location: AbsolutePath,\n content: Schema.String,\n}).annotate({ identifier: \"Skill.Info\" })\n\nconst Updated = ephemeral({ type: \"skill.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface EmbeddedSource extends Schema.Schema.Type<typeof EmbeddedSource> {}\nexport const EmbeddedSource = Schema.Struct({\n type: Schema.tag(\"embedded\"),\n skill: Schema.suspend(() => Info),\n}).annotate({ identifier: \"Skill.EmbeddedSource\" })\n\nexport type Source = DirectorySource | UrlSource | EmbeddedSource\nexport const Source = Object.assign(\n Schema.Union([DirectorySource, UrlSource, EmbeddedSource]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Skill.Source\" }),\n ),\n {\n equals: (a: Source, b: Source) => {\n if (a.type !== b.type) return false\n if (a.type === \"directory\" && b.type === \"directory\") return a.path === b.path\n if (a.type === \"url\" && b.type === \"url\") return a.url === b.url\n if (a.type === \"embedded\" && b.type === \"embedded\") return a.skill.id === b.skill.id\n return false\n },\n key: (source: Source) =>\n source.type === \"directory\"\n ? `directory:${source.path}`\n : source.type === \"url\"\n ? `url:${source.url}`\n : `embedded:${source.skill.id}`,\n },\n)\n", | ||
| "export * as Snapshot from \"./snapshot.js\"\n\nimport { Schema } from \"effect\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Snapshot.ID\"))\nexport type ID = typeof ID.Type\n", | ||
| "export * as TokenUsage from \"./token-usage.js\"\n\nimport { Schema } from \"effect\"\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n input: Schema.Finite,\n output: Schema.Finite,\n reasoning: Schema.Finite,\n cache: Schema.Struct({\n read: Schema.Finite,\n write: Schema.Finite,\n }),\n}).annotate({ identifier: \"TokenUsage.Info\" })\n", | ||
| "export * as SessionMessage from \"./session-message.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ToolContent } from \"./llm.js\"\nimport { Model } from \"./model.js\"\nimport { Prompt } from \"./prompt.js\"\nimport { DateTimeUtcFromMillis, PositiveInt, RelativePath, statics } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Event } from \"./event.js\"\nimport { Shell as ShellSchema } from \"./shell.js\"\nimport { FinishReason } from \"./llm.js\"\nimport { SessionError } from \"./session-error.js\"\nimport { Agent } from \"./agent.js\"\nimport { Skill as SkillSchema } from \"./skill.js\"\nimport { Money } from \"./money.js\"\nimport { Snapshot } from \"./snapshot.js\"\nimport { TokenUsage } from \"./token-usage.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"msg_\")).pipe(\n Schema.brand(\"Session.Message.ID\"),\n statics((schema) => ({\n create: () => schema.make(\"msg_\" + ascending()),\n fromEvent: (eventID: Event.ID) => schema.make(eventID.replace(/^evt_/, \"msg_\")),\n })),\n)\nexport type ID = typeof ID.Type\n\nconst Base = {\n id: ID,\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n time: Schema.Struct({ created: DateTimeUtcFromMillis }),\n}\n\nexport const ProviderState = Schema.Record(Schema.String, Schema.Unknown).annotate({\n identifier: \"Session.Message.ProviderState\",\n})\nexport type ProviderState = typeof ProviderState.Type\n\nexport interface AgentSelected extends Schema.Schema.Type<typeof AgentSelected> {}\nexport const AgentSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"agent-switched\"),\n agent: Agent.ID,\n}).annotate({ identifier: \"Session.Message.AgentSelected\" })\n\nexport interface ModelSelected extends Schema.Schema.Type<typeof ModelSelected> {}\nexport const ModelSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"model-switched\"),\n model: Model.Ref,\n previous: Model.Ref.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ModelSelected\" })\n\nexport interface User extends Schema.Schema.Type<typeof User> {}\nexport const User = Schema.Struct({\n ...Base,\n text: Prompt.fields.text,\n files: Prompt.fields.files,\n agents: Prompt.fields.agents,\n type: Schema.tag(\"user\"),\n}).annotate({ identifier: \"Session.Message.User\" })\n\nexport interface Synthetic extends Schema.Schema.Type<typeof Synthetic> {}\nexport const Synthetic = Schema.Struct({\n ...Base,\n text: Schema.String,\n description: Schema.String.pipe(optional),\n type: Schema.tag(\"synthetic\"),\n}).annotate({ identifier: \"Session.Message.Synthetic\" })\n\nexport interface System extends Schema.Schema.Type<typeof System> {}\nexport const System = Schema.Struct({\n ...Base,\n type: Schema.tag(\"system\"),\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.System\" })\n\nexport interface Skill extends Schema.Schema.Type<typeof Skill> {}\nexport const Skill = Schema.Struct({\n ...Base,\n type: Schema.tag(\"skill\"),\n skill: SkillSchema.ID,\n name: SkillSchema.Name,\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.Skill\" })\n\nexport interface Shell extends Schema.Schema.Type<typeof Shell> {}\nexport const Shell = Schema.Struct({\n ...Base,\n type: Schema.tag(\"shell\"),\n shellID: ShellSchema.ID,\n command: Schema.String,\n status: ShellSchema.Status,\n exit: Schema.Number.pipe(optional),\n output: ShellSchema.Output.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Shell\" })\n\nexport interface ToolStateStreaming extends Schema.Schema.Type<typeof ToolStateStreaming> {}\nexport const ToolStateStreaming = Schema.Struct({\n status: Schema.tag(\"streaming\"),\n input: Schema.String,\n}).annotate({ identifier: \"Session.Message.ToolState.Streaming\" })\n\nexport interface ToolStateRunning extends Schema.Schema.Type<typeof ToolStateRunning> {}\nexport const ToolStateRunning = Schema.Struct({\n status: Schema.tag(\"running\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n structured: Schema.Record(Schema.String, Schema.Unknown),\n content: ToolContent.pipe(Schema.Array),\n}).annotate({ identifier: \"Session.Message.ToolState.Running\" })\n\nexport interface ToolStateCompleted extends Schema.Schema.Type<typeof ToolStateCompleted> {}\nexport const ToolStateCompleted = Schema.Struct({\n status: Schema.tag(\"completed\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n content: ToolContent.pipe(Schema.Array),\n structured: Schema.Record(Schema.String, Schema.Unknown),\n result: Schema.Unknown.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Completed\" })\n\nexport interface ToolStateError extends Schema.Schema.Type<typeof ToolStateError> {}\nexport const ToolStateError = Schema.Struct({\n status: Schema.tag(\"error\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n content: ToolContent.pipe(Schema.Array),\n structured: Schema.Record(Schema.String, Schema.Unknown),\n error: SessionError.Error,\n result: Schema.Unknown.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Error\" })\n\nexport const ToolState = Schema.Union([ToolStateStreaming, ToolStateRunning, ToolStateCompleted, ToolStateError]).pipe(\n Schema.toTaggedUnion(\"status\"),\n)\nexport type ToolState = ToolStateStreaming | ToolStateRunning | ToolStateCompleted | ToolStateError\n\nexport interface AssistantTool extends Schema.Schema.Type<typeof AssistantTool> {}\nexport const AssistantTool = Schema.Struct({\n type: Schema.tag(\"tool\"),\n id: Schema.String,\n name: Schema.String,\n executed: Schema.Boolean.pipe(optional),\n providerState: ProviderState.pipe(optional),\n providerResultState: ProviderState.pipe(optional),\n state: ToolState,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n ran: DateTimeUtcFromMillis.pipe(optional),\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant.Tool\" })\n\nexport interface AssistantText extends Schema.Schema.Type<typeof AssistantText> {}\nexport const AssistantText = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.Assistant.Text\" })\n\nexport interface AssistantReasoning extends Schema.Schema.Type<typeof AssistantReasoning> {}\nexport const AssistantReasoning = Schema.Struct({\n type: Schema.tag(\"reasoning\"),\n text: Schema.String,\n state: ProviderState.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }).pipe(optional),\n}).annotate({ identifier: \"Session.Message.Assistant.Reasoning\" })\n\nexport const AssistantContent = Schema.Union([AssistantText, AssistantReasoning, AssistantTool]).pipe(\n Schema.toTaggedUnion(\"type\"),\n)\nexport type AssistantContent = AssistantText | AssistantReasoning | AssistantTool\n\nexport interface AssistantRetry extends Schema.Schema.Type<typeof AssistantRetry> {}\nexport const AssistantRetry = Schema.Struct({\n attempt: PositiveInt,\n at: DateTimeUtcFromMillis,\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Assistant.Retry\" })\n\nexport interface Assistant extends Schema.Schema.Type<typeof Assistant> {}\nexport const Assistant = Schema.Struct({\n ...Base,\n type: Schema.tag(\"assistant\"),\n agent: Agent.ID,\n model: Model.Ref,\n content: AssistantContent.pipe(Schema.Array),\n snapshot: Schema.Struct({\n start: Snapshot.ID.pipe(optional),\n end: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n }).pipe(optional),\n finish: FinishReason.pipe(optional),\n cost: Money.USD.pipe(optional),\n tokens: TokenUsage.Info.pipe(optional),\n error: SessionError.Error.pipe(optional),\n retry: AssistantRetry.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant\" })\n\nconst CompactionBase = { type: Schema.tag(\"compaction\"), ...Base }\n\nexport interface CompactionRunning extends Schema.Schema.Type<typeof CompactionRunning> {}\nexport const CompactionRunning = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"running\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Running\" })\n\nexport interface CompactionCompleted extends Schema.Schema.Type<typeof CompactionCompleted> {}\nexport const CompactionCompleted = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"completed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Completed\" })\n\nexport interface CompactionFailed extends Schema.Schema.Type<typeof CompactionFailed> {}\nexport const CompactionFailed = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"failed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Compaction.Failed\" })\n\nexport const Compaction = Schema.Union([CompactionRunning, CompactionCompleted, CompactionFailed]).pipe(\n Schema.toTaggedUnion(\"status\"),\n Schema.annotate({ identifier: \"Session.Message.Compaction\" }),\n)\nexport type Compaction = CompactionRunning | CompactionCompleted | CompactionFailed\n\nexport const Info = Schema.Union([\n AgentSelected,\n ModelSelected,\n User,\n Synthetic,\n System,\n Skill,\n Shell,\n Assistant,\n Compaction,\n])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Session.Message.Info\" })\nexport type Info = AgentSelected | ModelSelected | User | Synthetic | System | Skill | Shell | Assistant | Compaction\nexport type Type = Info[\"type\"]\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "26D2714F964DFB8864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/services/catalog.ts", "src/util/io.ts", "src/session-target.ts"], | ||
| "sourcesContent": [ | ||
| "import { ClientError, type OpenCodeClient } from \"@opencode-ai/client/promise\"\n\n// Location plugins initialize asynchronously, so explicit model selection must\n// wait for that exact model before prompt admission. The execution path owns\n// the authoritative error if readiness times out.\nexport async function waitForCatalogReady(input: {\n sdk: OpenCodeClient\n directory: string\n workspace?: string\n model: { providerID: string; modelID: string }\n timeoutMs?: number\n signal?: AbortSignal\n}) {\n const deadline = Date.now() + (input.timeoutMs ?? 5_000)\n while (Date.now() < deadline && !input.signal?.aborted) {\n const models = await input.sdk.model\n .list(\n { location: { directory: input.directory, workspace: input.workspace } },\n { signal: input.signal },\n )\n .then((result) => result.data)\n .catch((error) => {\n if (input.signal && error instanceof ClientError && error.reason === \"Transport\") throw error\n return undefined\n })\n if (models?.some((model) => model.providerID === input.model.providerID && model.id === input.model.modelID)) return\n await wait(25, input.signal)\n }\n}\n\nfunction wait(delay: number, signal?: AbortSignal) {\n if (!signal) return new Promise<void>((resolve) => setTimeout(resolve, delay))\n if (signal.aborted) return Promise.resolve()\n return new Promise<void>((resolve) => {\n const timer = setTimeout(done, delay)\n signal.addEventListener(\"abort\", done, { once: true })\n function done() {\n clearTimeout(timer)\n signal?.removeEventListener(\"abort\", done)\n resolve()\n }\n })\n}\n", | ||
| "import { text } from \"node:stream/consumers\"\n\nexport function readStdin() {\n return text(process.stdin)\n}\n", | ||
| "import type { LocationGetOutput, ModelRef, OpenCodeClient, SessionInfo } from \"@opencode-ai/client/promise\"\nimport { Model } from \"@opencode-ai/schema/model\"\n\nconst SESSION_PAGE_LIMIT = 50\n\nexport type SessionTarget = {\n session: SessionInfo\n location: LocationGetOutput\n model: ModelRef | undefined\n agent: string | undefined\n resume: boolean\n}\n\nexport type SessionTargetPreparation = (input: {\n client: OpenCodeClient\n location: LocationGetOutput\n session: SessionInfo | undefined\n model: ModelRef | undefined\n agent: string | undefined\n signal?: AbortSignal\n}) => Promise<{ model: ModelRef | undefined; agent: string | undefined }>\n\nexport class SessionTargetMutationError extends Error {\n override readonly name = \"SessionTargetMutationError\"\n\n constructor(cause: unknown) {\n super(cause instanceof Error ? cause.message : \"Session target mutation failed\", { cause })\n }\n}\n\nexport async function resolveSessionTarget(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: ModelRef\n agent?: string\n prepare: SessionTargetPreparation\n signal?: AbortSignal\n}): Promise<SessionTarget> {\n const selection = await selectSession(input)\n const selected = selection.session\n const location =\n selection.location ??\n (await resolveLocation(\n input.client,\n selected ? { directory: selected.location.directory, workspace: selected.location.workspaceID } : input.location,\n input.signal,\n ))\n const prepared = await input.prepare({\n client: input.client,\n location,\n session: selected,\n model: input.model ?? selected?.model,\n agent: input.agent ?? selected?.agent,\n signal: input.signal,\n })\n const session =\n selected ??\n (await input.client.session\n .create(\n {\n agent: prepared.agent,\n model: prepared.model,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n },\n ...requestOptions(input.signal),\n )\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n }))\n return {\n session,\n location,\n model: prepared.model,\n agent: prepared.agent,\n resume: selected !== undefined,\n }\n}\n\nexport function parseSessionTargetModel(value?: string): ModelRef | undefined {\n if (!value) return\n const model = Model.Ref.parse(value)\n return { providerID: model.providerID, id: model.id, variant: model.variant }\n}\n\nasync function selectSession(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n signal?: AbortSignal\n}) {\n const explicit = input.session\n ? await input.client.session.get({ sessionID: input.session }, ...requestOptions(input.signal)).catch((error) => {\n if (error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"SessionNotFoundError\")\n return undefined\n throw error\n })\n : undefined\n if (input.session && !explicit) throw new Error(\"Session not found\")\n if (explicit)\n return {\n session: input.fork\n ? await input.client.session\n .fork({ sessionID: explicit.id }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : explicit,\n }\n if (!input.continue) return { session: undefined }\n\n const location = await resolveLocation(input.client, input.location, input.signal)\n const selected = await latestSession(input.client, location, undefined, input.signal)\n if (!selected) return { session: undefined, location }\n return {\n session: input.fork\n ? await input.client.session.fork({ sessionID: selected.id }, ...requestOptions(input.signal)).catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : selected,\n }\n}\n\nasync function latestSession(\n client: OpenCodeClient,\n location: LocationGetOutput,\n cursor?: string,\n signal?: AbortSignal,\n): Promise<SessionInfo | undefined> {\n const page = await client.session.list(\n {\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n limit: SESSION_PAGE_LIMIT,\n order: \"desc\",\n ...(cursor ? { cursor } : {}),\n },\n ...requestOptions(signal),\n )\n const selected = page.data.find(\n (session) =>\n session.location.directory === location.directory && session.location.workspaceID === location.workspaceID,\n )\n if (selected) return selected\n if (!page.cursor.next || page.data.length === 0) return\n return latestSession(client, location, page.cursor.next, signal)\n}\n\nfunction resolveLocation(\n client: OpenCodeClient,\n location?: { directory?: string; workspace?: string },\n signal?: AbortSignal,\n) {\n if (!location && !signal) return client.location.get()\n if (!location) return client.location.get(undefined, { signal })\n return client.location.get({ location }, ...requestOptions(signal))\n}\n\nfunction requestOptions(signal?: AbortSignal): [] | [{ signal: AbortSignal }] {\n return signal ? [{ signal }] : []\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "1651A23FFC7E921064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/gemini.ts", "../ai/src/protocols/google-images.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 { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport {\n GeneratedImage,\n ImageModel,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport {\n InvalidProviderOutputReason,\n LLMError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n type ProviderMetadata,\n} from \"../schema\"\nimport { ProviderShared } from \"./shared\"\nimport { ImageInputs } from \"./utils/image-input\"\n\nconst ADAPTER = \"google-images\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\nexport type GoogleImageString<Known extends string> = Known | (string & {})\n\nexport type GoogleImageOptions = {\n readonly aspectRatio?: GoogleImageString<\n \"1:1\" | \"2:3\" | \"3:2\" | \"3:4\" | \"4:3\" | \"4:5\" | \"5:4\" | \"9:16\" | \"16:9\" | \"21:9\"\n >\n readonly imageSize?: GoogleImageString<\"1K\" | \"2K\" | \"4K\">\n readonly seed?: number\n readonly thinkingLevel?: GoogleImageString<\"MINIMAL\" | \"LOW\" | \"MEDIUM\" | \"HIGH\">\n readonly includeThoughts?: boolean\n} & Record<string, unknown>\n\nexport type GoogleImageBody = Record<string, unknown> & {\n readonly contents: ReadonlyArray<{\n readonly role: \"user\"\n readonly parts: ReadonlyArray<Record<string, unknown>>\n }>\n readonly generationConfig: Record<string, unknown>\n}\n\nconst GoogleUsage = Schema.StructWithRest(\n 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 promptTokensDetails: Schema.optional(Schema.Unknown),\n candidatesTokensDetails: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst GoogleImageResponse = Schema.Struct({\n candidates: Schema.optional(\n Schema.Array(\n Schema.Struct({\n index: Schema.optional(Schema.Number),\n content: Schema.optional(\n Schema.Struct({\n parts: Schema.Array(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n inlineData: Schema.optional(\n Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n ),\n }),\n ),\n }),\n ),\n finishReason: Schema.optional(Schema.String),\n finishMessage: Schema.optional(Schema.String),\n safetyRatings: Schema.optional(Schema.Unknown),\n citationMetadata: Schema.optional(Schema.Unknown),\n groundingMetadata: Schema.optional(Schema.Unknown),\n }),\n ),\n ),\n usageMetadata: Schema.optional(GoogleUsage),\n modelVersion: Schema.optional(Schema.String),\n responseId: Schema.optional(Schema.String),\n promptFeedback: Schema.optional(Schema.Unknown),\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 http?: HttpOptions\n}\n\nconst nativeOptions = (options: GoogleImageOptions | undefined) => {\n const { aspectRatio, imageSize, seed, thinkingLevel, includeThoughts, ...native } = options ?? {}\n const image = {\n aspectRatio,\n imageSize,\n }\n const thinkingConfig = {\n thinkingLevel,\n includeThoughts,\n }\n return (\n mergeJsonRecords(\n {\n responseModalities: [\"IMAGE\"],\n imageConfig: Object.values(image).some((value) => value !== undefined) ? image : undefined,\n seed,\n thinkingConfig: Object.values(thinkingConfig).some((value) => value !== undefined) ? thinkingConfig : undefined,\n },\n native,\n ) ?? { responseModalities: [\"IMAGE\"] }\n )\n}\n\nconst invalidOutput = (message: string, providerMetadata?: ProviderMetadata) =>\n new LLMError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER, providerMetadata }),\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\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<GoogleImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"GoogleImages.generate\")(function* (request: ImageRequestFor<GoogleImageOptions>, execute) {\n const imageParts = yield* Effect.forEach(request.images ?? [], googleImagePart)\n const http = mergeHttpOptions(request.model.http, request.http)\n const requestBody = mergeJsonRecords(\n {\n contents: [{ role: \"user\", parts: [{ text: request.prompt }, ...imageParts] }],\n generationConfig: nativeOptions(request.options),\n },\n http?.body,\n ) as GoogleImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}/models/${request.model.id}:generateContent`,\n http?.query,\n )\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 Google Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(GoogleImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"Google Images returned an invalid response\")),\n )\n const candidates = decoded.candidates ?? []\n const candidateMetadata = candidates.map((candidate, candidateIndex) => ({\n index: candidate.index ?? candidateIndex,\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n groundingMetadata: candidate.groundingMetadata,\n parts: (candidate.content?.parts ?? []).map((part) =>\n part.inlineData === undefined\n ? {\n type: \"text\",\n text: part.text,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n }\n : {\n type: \"inlineData\",\n mediaType: part.inlineData.mimeType,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n },\n ),\n }))\n const encoded = candidates.flatMap((candidate, candidateIndex) =>\n (candidate.content?.parts ?? []).flatMap((part, partIndex) =>\n part.inlineData === undefined || part.thought === true\n ? []\n : [{ candidate, candidateIndex, partIndex, inlineData: part.inlineData }],\n ),\n )\n const images = yield* Effect.forEach(encoded, (item) =>\n Effect.fromResult(Encoding.decodeBase64(item.inlineData.data)).pipe(\n Effect.mapError(() =>\n invalidOutput(\n `Google Images candidate ${item.candidateIndex} part ${item.partIndex} contains invalid base64 data`,\n ),\n ),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: item.inlineData.mimeType,\n data,\n providerMetadata: {\n google: {\n candidateIndex: item.candidate.index ?? item.candidateIndex,\n partIndex: item.partIndex,\n finishReason: item.candidate.finishReason,\n safetyRatings: item.candidate.safetyRatings,\n citationMetadata: item.candidate.citationMetadata,\n groundingMetadata: item.candidate.groundingMetadata,\n thoughtSignature: item.candidate.content?.parts[item.partIndex]?.thoughtSignature,\n },\n },\n }),\n ),\n ),\n )\n if (images.length === 0) {\n const finishReasons = candidates.flatMap((candidate) =>\n candidate.finishReason === undefined ? [] : [candidate.finishReason],\n )\n return yield* invalidOutput(\n `Google Images returned no final images${\n finishReasons.length === 0 ? \"\" : ` (finish reasons: ${finishReasons.join(\", \")})`\n }; inspect reason.providerMetadata.google for prompt feedback and candidate details`,\n {\n google: {\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n )\n }\n const usage = decoded.usageMetadata\n const outputTokens =\n usage?.candidatesTokenCount === undefined\n ? undefined\n : usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0)\n return new ImageResponse({\n images,\n usage:\n usage === undefined\n ? undefined\n : new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: ProviderShared.subtractTokens(\n usage.promptTokenCount,\n usage.cachedContentTokenCount,\n ),\n cacheReadInputTokens: usage.cachedContentTokenCount,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n }),\n providerMetadata: {\n google: {\n modelVersion: decoded.modelVersion,\n responseId: decoded.responseId,\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n })\n }),\n }\n return ImageModel.make<GoogleImageOptions>({ id: input.id, provider: \"google\", route, http: input.http })\n}\n\nconst googleImagePart = (image: ImageInput): Effect.Effect<Record<string, unknown>, LLMError> => {\n if (image.type === \"bytes\")\n return Effect.succeed({ inlineData: { mimeType: image.mediaType, data: Encoding.encodeBase64(image.data) } })\n if (image.type === \"file-uri\") return Effect.succeed({ fileData: { mimeType: image.mediaType, fileUri: image.uri } })\n if (image.type === \"url\")\n return ImageInputs.decodeDataUrl(image.url, ADAPTER).pipe(\n Effect.flatMap((decoded) => {\n if (decoded === undefined)\n return Effect.fail(\n ImageInputs.invalid(\n ADAPTER,\n \"Google generateContent does not fetch public image URLs; use bytes, a data URL, or a Gemini file URI\",\n ),\n )\n return Effect.succeed({\n inlineData: { mimeType: decoded.mediaType, data: Encoding.encodeBase64(decoded.data) },\n })\n }),\n )\n return Effect.fail(\n ImageInputs.invalid(ADAPTER, \"Google generateContent requires Gemini file URIs rather than provider file IDs\"),\n )\n}\n\nexport const GoogleImages = {\n model,\n} as const\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 { HttpOptions, ProviderID, mergeHttpOptions, type ModelID, type ProviderOptions } from \"../schema\"\nimport { Gemini } from \"../protocols/gemini\"\nimport { GoogleImages } from \"../protocols/google-images\"\n\nexport type { GoogleImageOptions } from \"../protocols/google-images\"\n\nexport const id = ProviderID.make(\"google\")\n\nexport const routes = [Gemini.route]\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\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 const image = (modelID: string | ModelID) =>\n GoogleImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n http: mergeHttpOptions(input.http === undefined ? undefined : HttpOptions.make(input.http)),\n })\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n image,\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\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D871D8E85A5F0B6064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "8C2E101EFA5FCAC064756E2164756E21", | ||
| "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": "741EAB9563D6410A64756E2164756E21", | ||
| "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": "10280EA5ACB8F12E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,EAAO,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": "38039D5DBB286AAA64756E2164756E21", | ||
| "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": "F00983A5F194B1CF64756E2164756E21", | ||
| "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": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "A9D1C2CA39DA6D3C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": "756178589AFEE7D264756E2164756E21", | ||
| "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/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": "724547B77B93B9C464756E2164756E21", | ||
| "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/util/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 SessionMessageInfo,\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 const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\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 prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = 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 writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\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 prePromotionError = undefined\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 && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n continue\n }\n if (!promoted) continue\n if (finalizing) 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\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\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 renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\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 renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\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 renderedTools.add(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 renderedTools.add(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 projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n id: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n callID: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({ ...item, state: { ...item.state, status: \"completed\" } })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return projected.found\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 if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n controller.abort()\n const found = await reconcile()\n if (!found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void 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 contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\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": "F5124D2EDA0B872464756E2164756E21", | ||
| "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": "3CB01C2851098DD564756E2164756E21", | ||
| "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": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "9ACC856DE1AF0E2064756E2164756E21", | ||
| "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/util/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": "CA9156F00EA13B0864756E2164756E21", | ||
| "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 \"@opencode-ai/util/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 { App } from \"../app.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 app: App\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": "50658BD40F21A87064756E2164756E21", | ||
| "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": ";2oBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "3DACFEDC893EC11A64756E2164756E21", | ||
| "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/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/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(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\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 {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"beta\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n observability: {\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(\n process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER,\n ),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n instanceID,\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: OPENCODE_VERSION,\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 truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\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": "69F71F63E2E7BD8264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "41B6B139F6D8B33664756E2164756E21", | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,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,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": "C438659FAA988AEB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "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": "9470F49987143BCE64756E2164756E21", | ||
| "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": "785133A9050484F264756E2164756E21", | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,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,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": "2A70DC944264601764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/runtime.queue.ts"], | ||
| "sourcesContent": [ | ||
| "// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and local\n// operations drain one at a time. Ordinary prompts submitted during an active\n// ordinary turn are admitted immediately to the server's durable queue.\n//\n// The queue also handles /exit, /quit, and /new commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"../util/locale\"\nimport { isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt, delivery: \"steer\" | \"queue\") => void\n onAdmissionError?: (prompt: RunPrompt, error: unknown) => void | Promise<void>\n onNewSession?: () => void | Promise<void>\n admit: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n settle: () => Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal, admitted: () => void) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n active?: RunPrompt\n admission?: Promise<void>\n ctrl?: AbortController\n closed: boolean\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn are admitted as\n// durable queued work instead of remaining editable process-local state.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = Promise.withResolvers<{ type: \"closed\" }>()\n const done = Promise.withResolvers<void>()\n const state: State = {\n queue: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n let admissions = Promise.resolve()\n let admissionVersion = 0\n const admissionController = new AbortController()\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n state.ctrl?.abort()\n admissionController.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()\n if (!prompt) {\n continue\n }\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n },\n )\n await input.onNewSession()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n { type: \"turn.send\" },\n {\n phase: \"running\",\n status: \"sending prompt\",\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n const admission = Promise.withResolvers<void>()\n const version = admissionVersion\n state.ctrl = ctrl\n state.admission = admission.promise\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent, \"steer\")\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal, admission.resolve).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n ctrl.abort()\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n if (sent.mode !== \"shell\" && admissionVersion !== version) {\n do {\n const current = admissionVersion\n await admissions\n if (state.closed) break\n await input.settle()\n if (current === admissionVersion) break\n } while (!state.closed)\n }\n } finally {\n admission.resolve()\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n if (state.admission === admission.promise) state.admission = undefined\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n { type: \"turn.idle\" },\n {\n phase: \"idle\",\n status: \"\",\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n prompt.mode !== \"shell\" &&\n prompt.command?.source !== \"skill\" &&\n !isNewCommand(prompt.text)\n ) {\n const sent = { ...prompt, messageID: SessionMessage.ID.create() }\n const admission = state.admission\n admissionVersion += 1\n input.onSend?.(sent, \"queue\")\n admissions = admissions\n .then(() => admission)\n .then(() => input.admit(sent, admissionController.signal))\n .catch((error) => (state.closed ? undefined : input.onAdmissionError?.(sent, error)))\n return\n }\n\n state.queue.push(prompt)\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n close()\n await draining?.catch(() => {})\n await admissions\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "2E3AF2B4E3E2FAB064756E2164756E21", | ||
| "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": "7B19C79549B809C664756E2164756E21", | ||
| "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": ";00BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "3D18391EA78871E664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/identifier.ts", "../schema/src/project-id.ts", "../schema/src/workspace-id.ts", "../schema/src/location.ts", "../schema/src/event.ts", "../schema/src/money.ts", "../schema/src/integration-id.ts", "../schema/src/credential.ts", "../schema/src/connection.ts", "../schema/src/integration.ts", "../schema/src/provider.ts", "../schema/src/model.ts"], | ||
| "sourcesContent": [ | ||
| "const length = 26\nconst chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nlet lastTimestamp = 0\nlet counter = 0\n\nexport function ascending() {\n return create(false)\n}\n\nexport function descending() {\n return create(true)\n}\n\nexport function create(descending: boolean, timestamp = Date.now()) {\n if (timestamp !== lastTimestamp) {\n lastTimestamp = timestamp\n counter = 0\n }\n counter++\n\n const current = BigInt(timestamp) * 0x1000n + BigInt(counter)\n const value = descending ? ~current : current\n const time = Array.from({ length: 6 }, (_, index) =>\n Number((value >> BigInt(40 - 8 * index)) & 0xffn)\n .toString(16)\n .padStart(2, \"0\"),\n ).join(\"\")\n const bytes = crypto.getRandomValues(new Uint8Array(length - 12))\n return time + Array.from(bytes, (byte) => chars[byte % 62]).join(\"\")\n}\n", | ||
| "import { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const ProjectID = Schema.String.pipe(\n Schema.brand(\"Project.ID\"),\n statics((schema) => ({ global: schema.make(\"global\") })),\n)\nexport type ProjectID = typeof ProjectID.Type\n", | ||
| "import { Schema } from \"effect\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const WorkspaceID = Schema.String.check(Schema.isStartsWith(\"wrk\")).pipe(\n Schema.brand(\"WorkspaceV2.ID\"),\n statics((schema) => {\n const create = () => schema.make(\"wrk_\" + ascending())\n return {\n ascending: (id?: string) => {\n if (!id) return create()\n if (!id.startsWith(\"wrk\")) throw new Error(`ID ${id} does not start with wrk`)\n return schema.make(id)\n },\n create,\n }\n }),\n)\nexport type WorkspaceID = typeof WorkspaceID.Type\n", | ||
| "export * as Location from \"./location.js\"\n\nimport { Schema } from \"effect\"\nimport { AbsolutePath, optional } from \"./schema.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n}).annotate({ identifier: \"Location.Ref\" })\n\nexport class Info extends Schema.Class<Info>(\"Location.Info\")({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n project: Schema.Struct({\n id: ProjectID,\n directory: AbsolutePath,\n }),\n}) {}\n\nexport function response<S extends Schema.Top>(data: S) {\n return Schema.Struct({ location: Info, data })\n}\n", | ||
| "export * as Event from \"./event.js\"\n\nimport { Schema, SchemaTransformation } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Location } from \"./location.js\"\nimport { DateTimeUtcFromMillis, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"evt_\")).pipe(\n Schema.brand(\"Event.ID\"),\n statics((schema) => ({ create: () => schema.make(\"evt_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\n/**\n * Position in one aggregate's durable log. Values originate from the durable\n * event envelope and synced markers;\n * `after` cursors accept only values that came from those sources.\n */\nexport const Seq = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(Schema.brand(\"Event.Seq\"))\nexport type Seq = typeof Seq.Type\n\n/** Durable schema version of one event type, from the event definition that committed it. */\nexport const Version = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).pipe(Schema.brand(\"Event.Version\"))\nexport type Version = typeof Version.Type\n\nconst DurableEnvelope = Schema.Struct({ aggregateID: Schema.String, seq: Seq, version: Version })\nexport type DurableEnvelope = typeof DurableEnvelope.Type\n\nexport type DurableDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"durable\"\n readonly durable: {\n readonly version: number\n readonly aggregate: string\n }\n readonly data: DataSchema\n}\n\nexport type EphemeralDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"ephemeral\"\n readonly durable?: never\n readonly data: DataSchema\n}\n\nexport type Definition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = DurableDefinition<Type, DataSchema> | EphemeralDefinition<Type, DataSchema>\n\nexport type Data<D extends Definition> = Schema.Schema.Type<D[\"data\"]>\n\ntype PayloadBase<D extends Definition> = {\n readonly id: ID\n readonly type: D[\"type\"]\n readonly created: typeof DateTimeUtcFromMillis.Type\n readonly data: Data<D>\n readonly location?: Location.Ref\n readonly metadata?: Record<string, unknown>\n}\n\nexport type Payload<D extends Definition = Definition> = D extends DurableDefinition\n ? PayloadBase<D> & { readonly durable: DurableEnvelope }\n : PayloadBase<D> & { readonly durable?: never }\n\ntype Input<Type extends string, Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>> = {\n readonly type: Type\n readonly identifier?: string\n readonly durable?: {\n readonly version: number\n readonly aggregate: string\n }\n readonly schema: Fields\n}\n\nexport function durable<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Input<Type, Fields> & { readonly durable: NonNullable<Input<Type, Fields>[\"durable\"]> }) {\n const data = Schema.Struct(input.schema)\n const durable = Schema.Struct({\n aggregateID: DurableEnvelope.fields.aggregateID,\n seq: DurableEnvelope.fields.seq,\n version: Schema.Literal(input.durable.version).pipe(\n Schema.decodeTo(\n Schema.toType(Version),\n SchemaTransformation.transform({\n decode: () => Version.make(input.durable.version),\n encode: () => input.durable.version,\n }),\n ),\n ),\n })\n return Schema.Struct({\n id: ID,\n created: DateTimeUtcFromMillis,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n durable,\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"durable\" as const,\n durable: input.durable,\n data,\n })),\n ) satisfies DurableDefinition<Type, typeof data>\n}\n\nexport function ephemeral<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Omit<Input<Type, Fields>, \"durable\">) {\n const data = Schema.Struct(input.schema)\n return Schema.Struct({\n id: ID,\n created: DateTimeUtcFromMillis,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"ephemeral\" as const,\n durable: undefined,\n data,\n })),\n ) satisfies EphemeralDefinition<Type, typeof data>\n}\n\nexport function inventory<const Definitions extends ReadonlyArray<Definition>>(...definitions: Definitions) {\n return Object.freeze(definitions)\n}\n\nexport function latest(definitions: ReadonlyArray<Definition>) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n const existing = result.get(definition.type)\n if (!existing) {\n result.set(definition.type, definition)\n return result\n }\n if (definition.durable && existing.durable && definition.durable.version !== existing.durable.version) {\n if (definition.durable.version > existing.durable.version) result.set(definition.type, definition)\n return result\n }\n if (definition !== existing) throw new Error(`Duplicate latest event definition for ${definition.type}`)\n return result\n }, new Map<string, Definition>()),\n )\n}\n\nexport function versionedType(type: string, version: number) {\n return `${type}.${version}`\n}\n\nexport function durableMap<const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n if (definition.durability !== \"durable\") return result\n const key = versionedType(definition.type, definition.durable.version)\n if (result.has(key)) throw new Error(`Duplicate durable event definition for ${key}`)\n result.set(key, definition)\n return result\n }, new Map<string, DurableDefinition>()),\n )\n}\n\nfunction readonlyMap<Key, Value>(map: Map<Key, Value>): ReadonlyMap<Key, Value> {\n const result: ReadonlyMap<Key, Value> = Object.freeze({\n get size() {\n return map.size\n },\n entries: () => map.entries(),\n forEach: (callback: (value: Value, key: Key, map: ReadonlyMap<Key, Value>) => void, thisArg?: unknown) =>\n map.forEach((value, key) => callback.call(thisArg, value, key, result)),\n get: (key: Key) => map.get(key),\n has: (key: Key) => map.has(key),\n keys: () => map.keys(),\n values: () => map.values(),\n [Symbol.iterator]: () => map[Symbol.iterator](),\n })\n return result\n}\n", | ||
| "export * as Money from \"./money.js\"\n\nimport { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const USD = Schema.Finite.pipe(\n Schema.brand(\"Money.USD\"),\n Schema.annotate({ identifier: \"Money.USD\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USD = typeof USD.Type\n\nexport const USDPerMillionTokens = Schema.Finite.pipe(\n Schema.brand(\"Money.USDPerMillionTokens\"),\n Schema.annotate({ identifier: \"Money.USDPerMillionTokens\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USDPerMillionTokens = typeof USDPerMillionTokens.Type\n", | ||
| "import { Schema } from \"effect\"\n\nexport const IntegrationID = Schema.String.pipe(Schema.brand(\"Integration.ID\"))\nexport type IntegrationID = typeof IntegrationID.Type\n\nexport const IntegrationMethodID = Schema.String.pipe(Schema.brand(\"Integration.MethodID\"))\nexport type IntegrationMethodID = typeof IntegrationMethodID.Type\n", | ||
| "export * as Credential from \"./credential.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { IntegrationMethodID } from \"./integration-id.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"Credential.ID\"),\n statics((schema) => ({ create: () => schema.make(\"cred_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport interface OAuth extends Schema.Schema.Type<typeof OAuth> {}\nexport const OAuth = Schema.Struct({\n type: Schema.Literal(\"oauth\"),\n methodID: IntegrationMethodID,\n refresh: Schema.String,\n access: Schema.String,\n expires: NonNegativeInt,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n}).annotate({ identifier: \"Credential.OAuth\" })\n\nexport interface Key extends Schema.Schema.Type<typeof Key> {}\nexport const Key = Schema.Struct({\n type: Schema.Literal(\"key\"),\n key: Schema.String,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n}).annotate({ identifier: \"Credential.Key\" })\n\nexport const Value = Schema.Union([OAuth, Key])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Credential.Value\" })\nexport type Value = Schema.Schema.Type<typeof Value>\n", | ||
| "export * as Connection from \"./connection.js\"\n\nimport { Schema } from \"effect\"\nimport { Credential } from \"./credential.js\"\n\nexport interface CredentialInfo extends Schema.Schema.Type<typeof CredentialInfo> {}\nexport const CredentialInfo = Schema.Struct({\n type: Schema.Literal(\"credential\"),\n id: Credential.ID,\n label: Schema.String,\n}).annotate({ identifier: \"Connection.CredentialInfo\" })\n\nexport interface EnvInfo extends Schema.Schema.Type<typeof EnvInfo> {}\nexport const EnvInfo = Schema.Struct({\n type: Schema.Literal(\"env\"),\n name: Schema.String,\n}).annotate({ identifier: \"Connection.EnvInfo\" })\n\nexport const Info = Schema.Union([CredentialInfo, EnvInfo])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Connection.Info\" })\nexport type Info = typeof Info.Type\n", | ||
| "export * as Integration from \"./integration.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { Connection } from \"./connection.js\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\nimport { IntegrationID, IntegrationMethodID } from \"./integration-id.js\"\n\nexport const ID = IntegrationID\nexport type ID = typeof ID.Type\n\nexport const MethodID = IntegrationMethodID\nexport type MethodID = typeof MethodID.Type\n\nexport interface When extends Schema.Schema.Type<typeof When> {}\nexport const When = Schema.Struct({\n key: Schema.String,\n op: Schema.Literals([\"eq\", \"neq\"]),\n value: Schema.String,\n}).annotate({ identifier: \"Integration.When\" })\n\nexport interface TextPrompt extends Schema.Schema.Type<typeof TextPrompt> {}\nexport const TextPrompt = Schema.Struct({\n type: Schema.Literal(\"text\"),\n key: Schema.String,\n message: Schema.String,\n placeholder: optional(Schema.String),\n when: optional(When),\n}).annotate({ identifier: \"Integration.TextPrompt\" })\n\nexport interface SelectPrompt extends Schema.Schema.Type<typeof SelectPrompt> {}\nexport const SelectPrompt = Schema.Struct({\n type: Schema.Literal(\"select\"),\n key: Schema.String,\n message: Schema.String,\n options: Schema.Array(\n Schema.Struct({\n label: Schema.String,\n value: Schema.String,\n hint: optional(Schema.String),\n }),\n ),\n when: optional(When),\n}).annotate({ identifier: \"Integration.SelectPrompt\" })\n\nexport const Prompt = Schema.Union([TextPrompt, SelectPrompt]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type Prompt = typeof Prompt.Type\n\nexport interface OAuthMethod extends Schema.Schema.Type<typeof OAuthMethod> {}\nexport const OAuthMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"oauth\"),\n label: Schema.String,\n prompts: optional(Schema.Array(Prompt)),\n}).annotate({ identifier: \"Integration.OAuthMethod\" })\n\nexport interface CommandMethod extends Schema.Schema.Type<typeof CommandMethod> {}\nexport const CommandMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"command\"),\n label: Schema.String,\n command: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.CommandMethod\" })\n\nexport interface KeyMethod extends Schema.Schema.Type<typeof KeyMethod> {}\nexport const KeyMethod = Schema.Struct({\n type: Schema.Literal(\"key\"),\n label: optional(Schema.String),\n}).annotate({ identifier: \"Integration.KeyMethod\" })\n\nexport interface EnvMethod extends Schema.Schema.Type<typeof EnvMethod> {}\nexport const EnvMethod = Schema.Struct({\n type: Schema.Literal(\"env\"),\n names: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.EnvMethod\" })\n\nexport const Method = Schema.Union([OAuthMethod, CommandMethod, KeyMethod, EnvMethod])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Integration.Method\" })\nexport type Method = typeof Method.Type\n\nexport const Inputs = Schema.Record(Schema.String, Schema.String).annotate({ identifier: \"Integration.Inputs\" })\nexport type Inputs = typeof Inputs.Type\n\nconst Updated = ephemeral({\n type: \"integration.updated\",\n schema: {},\n})\nconst ConnectionUpdated = ephemeral({\n type: \"integration.connection.updated\",\n schema: { integrationID: ID },\n})\nexport const Event = { Updated, ConnectionUpdated, Definitions: inventory(Updated, ConnectionUpdated) }\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n id: ID,\n name: Schema.String,\n}).annotate({ identifier: \"Integration.Ref\" })\n\nexport const Info = Schema.Struct({\n id: ID,\n name: Schema.String,\n methods: Schema.Array(Method),\n connections: Schema.Array(Connection.Info),\n}).annotate({ identifier: \"Integration.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const AttemptID = Schema.String.pipe(\n Schema.brand(\"Integration.AttemptID\"),\n statics((schema) => ({ create: () => schema.make(\"con_\" + ascending()) })),\n)\nexport type AttemptID = typeof AttemptID.Type\n\nconst AttemptTime = Schema.Struct({\n created: Schema.Number,\n expires: Schema.Number,\n})\n\nexport class Attempt extends Schema.Class<Attempt>(\"Integration.Attempt\")({\n attemptID: AttemptID,\n url: Schema.String,\n instructions: Schema.String,\n mode: Schema.Literals([\"auto\", \"code\"]),\n time: AttemptTime,\n}) {}\n\nexport const AttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.AttemptStatus\" })\nexport type AttemptStatus = typeof AttemptStatus.Type\n\nexport interface CommandAttempt extends Schema.Schema.Type<typeof CommandAttempt> {}\nexport const CommandAttempt = Schema.Struct({\n attemptID: AttemptID,\n time: AttemptTime,\n}).annotate({ identifier: \"Integration.CommandAttempt\" })\n\nexport const CommandAttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), message: optional(Schema.String), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.CommandAttemptStatus\" })\nexport type CommandAttemptStatus = typeof CommandAttemptStatus.Type\n", | ||
| "export * as Provider from \"./provider.js\"\n\nimport { Effect, Schema } from \"effect\"\nimport { Integration } from \"./integration.js\"\nimport { optional, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"ProviderV2.ID\"),\n statics((schema) => ({\n opencode: schema.make(\"opencode\"),\n anthropic: schema.make(\"anthropic\"),\n openai: schema.make(\"openai\"),\n google: schema.make(\"google\"),\n googleVertex: schema.make(\"google-vertex\"),\n githubCopilot: schema.make(\"github-copilot\"),\n amazonBedrock: schema.make(\"amazon-bedrock\"),\n azure: schema.make(\"azure\"),\n openrouter: schema.make(\"openrouter\"),\n mistral: schema.make(\"mistral\"),\n gitlab: schema.make(\"gitlab\"),\n })),\n)\nexport type ID = typeof ID.Type\n\nexport const Package = Schema.String\nexport type Package = typeof Package.Type\n\nexport const Overlays = {\n settings: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n headers: Schema.Record(Schema.String, Schema.String).pipe(optional),\n body: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n}\n\nexport const Settings = Schema.Record(Schema.String, Schema.Json).annotate({ identifier: \"Provider.Settings\" })\nexport type Settings = typeof Settings.Type\n\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\nexport const Request = Schema.Struct({\n settings: Settings.pipe(Schema.withConstructorDefault(Effect.succeed({}))),\n headers: Schema.Record(Schema.String, Schema.String),\n body: Schema.Record(Schema.String, Schema.Json),\n}).annotate({ identifier: \"Provider.Request\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n integrationID: Integration.ID.pipe(optional),\n name: Schema.String,\n disabled: Schema.Boolean.pipe(optional),\n package: Package,\n ...Overlays,\n})\n .annotate({ identifier: \"ProviderV2.Info\" })\n .pipe(\n statics(() => ({\n empty: (id: ID): Info => ({ id, name: id, package: \"\" }),\n })),\n )\n", | ||
| "export * as Model from \"./model.js\"\n\nimport { Schema } from \"effect\"\nimport { optional, statics } from \"./schema.js\"\nimport { Provider } from \"./provider.js\"\nimport { Money } from \"./money.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Model.ID\"))\nexport type ID = typeof ID.Type\n\nexport const VariantID = Schema.String.pipe(Schema.brand(\"Model.VariantID\"))\nexport type VariantID = typeof VariantID.Type\n\nexport const Ref = Schema.Struct({\n id: ID,\n providerID: Provider.ID,\n variant: VariantID.pipe(optional),\n})\n .annotate({ identifier: \"Model.Ref\" })\n .pipe(\n statics((schema) => ({\n parse: (input: string) => {\n const providerEnd = input.indexOf(\"/\")\n if (providerEnd <= 0) throw new Error(`Invalid model reference: ${input}`)\n const providerID = input.slice(0, providerEnd)\n const variantStart = input.indexOf(\"#\", providerEnd + 1)\n const id = input.slice(providerEnd + 1, variantStart === -1 ? undefined : variantStart)\n const variant = variantStart === -1 ? undefined : input.slice(variantStart + 1)\n if (!id || providerID.includes(\"#\") || (variant !== undefined && (!variant || variant.includes(\"#\"))))\n throw new Error(`Invalid model reference: ${input}`)\n return schema.make({\n providerID: Provider.ID.make(providerID),\n id: ID.make(id),\n ...(variant ? { variant: VariantID.make(variant) } : {}),\n })\n },\n })),\n )\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\n\nexport const Family = Schema.String.pipe(Schema.brand(\"Model.Family\"))\nexport type Family = typeof Family.Type\n\nexport type ReasoningField = \"reasoning\" | \"reasoning_content\" | \"reasoning_text\" | (string & {})\nexport const ReasoningField: Schema.Codec<ReasoningField> = Schema.Union([\n Schema.Literals([\"reasoning\", \"reasoning_content\", \"reasoning_text\"]),\n Schema.String,\n]).annotate({ identifier: \"Model.ReasoningField\" })\n\nexport interface Compatibility extends Schema.Schema.Type<typeof Compatibility> {}\nexport const Compatibility = Schema.Struct({\n reasoningField: ReasoningField.pipe(optional),\n}).annotate({ identifier: \"Model.Compatibility\" })\n\nexport interface Capabilities extends Schema.Schema.Type<typeof Capabilities> {}\nexport const Capabilities = Schema.Struct({\n tools: Schema.Boolean,\n input: Schema.Array(Schema.String),\n output: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Model.Capabilities\" })\n\nexport interface Cost extends Schema.Schema.Type<typeof Cost> {}\nexport const Cost = Schema.Struct({\n tier: Schema.Struct({\n type: Schema.tag(\"context\"),\n size: Schema.Int,\n }).pipe(optional),\n input: Money.USDPerMillionTokens,\n output: Money.USDPerMillionTokens,\n cache: Schema.Struct({\n read: Money.USDPerMillionTokens,\n write: Money.USDPerMillionTokens,\n }),\n}).annotate({ identifier: \"Model.Cost\" })\n\nexport interface Variant extends Schema.Schema.Type<typeof Variant> {}\nexport const Variant = Schema.Struct({\n id: VariantID,\n ...Provider.Overlays,\n}).annotate({ identifier: \"Model.Variant\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n modelID: ID,\n providerID: Provider.ID,\n family: Family.pipe(optional),\n name: Schema.String,\n compatibility: Compatibility.pipe(optional),\n package: Provider.Package.pipe(optional),\n ...Provider.Overlays,\n capabilities: Capabilities,\n variants: Schema.Array(Variant),\n time: Schema.Struct({\n released: Schema.Finite,\n }),\n cost: Schema.Array(Cost),\n status: Schema.Literals([\"alpha\", \"beta\", \"deprecated\", \"active\"]),\n enabled: Schema.Boolean,\n limit: Schema.Struct({\n context: Schema.Int,\n input: Schema.Int.pipe(optional),\n output: Schema.Int,\n }),\n})\n .annotate({ identifier: \"Model.Info\" })\n .pipe(\n statics(() => ({\n empty: (providerID: Provider.ID, id: ID) =>\n ({\n id,\n modelID: id,\n providerID,\n name: id,\n capabilities: { tools: false, input: [], output: [] },\n variants: [],\n time: { released: 0 },\n cost: [],\n status: \"active\",\n enabled: true,\n limit: { context: 0, output: 0 },\n }) satisfies Info,\n })),\n )\n" | ||
| ], | ||
| "mappings": ";oaAEA,SAAI,OAAgB,EAChB,EAAU,EAEP,SAAS,CAAS,EAAG,CAC1B,OAAO,EAAO,EAAK,EAGd,SAAS,EAAU,EAAG,CAC3B,OAAO,EAAO,EAAI,EAGb,SAAS,CAAM,CAAC,EAAqB,EAAY,KAAK,IAAI,EAAG,CAClE,GAAI,IAAc,EAChB,EAAgB,EAChB,EAAU,EAEZ,IAEA,IAAM,EAAU,OAAO,CAAS,EAAI,QAAU,OAAO,CAAO,EACtD,EAAQ,EAAa,CAAC,EAAU,EAChC,EAAO,MAAM,KAAK,CAAE,OAAQ,CAAE,EAAG,CAAC,EAAG,KACzC,OAAQ,GAAS,OAAO,GAAK,EAAI,EAAK,EAAK,KAAK,EAC7C,SAAS,EAAE,EACX,SAAS,EAAG,GAAG,CACpB,EAAE,KAAK,EAAE,EACH,EAAQ,OAAO,gBAAgB,IAAI,WAAW,EAAW,CAAC,EAChE,OAAO,EAAO,MAAM,KAAK,EAAO,CAAC,IA3BrB,iEA2BoC,EAAO,GAAG,EAAE,KAAK,EAAE,uECzB9D,IAAM,EAAY,EAAO,OAAO,KACrC,EAAO,MAAM,YAAY,EACzB,EAAQ,CAAC,KAAY,CAAE,OAAQ,EAAO,KAAK,QAAQ,CAAE,EAAE,CACzD,ECFO,IAAM,EAAc,EAAO,OAAO,MAAM,EAAO,aAAa,KAAK,CAAC,EAAE,KACzE,EAAO,MAAM,gBAAgB,EAC7B,EAAQ,CAAC,IAAW,CAClB,IAAM,EAAS,IAAM,EAAO,KAAK,OAAS,EAAU,CAAC,EACrD,MAAO,CACL,UAAW,CAAC,IAAgB,CAC1B,GAAI,CAAC,EAAI,OAAO,EAAO,EACvB,GAAI,CAAC,EAAG,WAAW,KAAK,EAAG,MAAU,MAAM,MAAM,2BAA4B,EAC7E,OAAO,EAAO,KAAK,CAAE,GAEvB,QACF,EACD,CACH,ECTO,IAAM,GAAM,EAAO,OAAO,CAC/B,UAAW,EACX,YAAa,EAAS,CAAW,CACnC,CAAC,EAAE,SAAS,CAAE,WAAY,cAAe,CAAC,EAEnC,MAAM,UAAa,EAAO,MAAY,eAAe,EAAE,CAC5D,UAAW,EACX,YAAa,EAAS,CAAW,EACjC,QAAS,EAAO,OAAO,CACrB,GAAI,EACJ,UAAW,CACb,CAAC,CACH,CAAC,CAAE,CAAC,CAEG,SAAS,EAA8B,CAAC,EAAS,CACtD,OAAO,EAAO,OAAO,CAAE,SAAU,EAAM,MAAK,CAAC,ECfxC,IAAM,EAAK,EAAO,OAAO,MAAM,EAAO,aAAa,MAAM,CAAC,EAAE,KACjE,EAAO,MAAM,UAAU,EACvB,EAAQ,CAAC,KAAY,CAAE,OAAQ,IAAM,EAAO,KAAK,OAAS,EAAU,CAAC,CAAE,EAAE,CAC3E,EAQa,EAAM,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAO,MAAM,WAAW,CAAC,EAIvF,EAAU,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAO,MAAM,eAAe,CAAC,EAGtG,EAAkB,EAAO,OAAO,CAAE,YAAa,EAAO,OAAQ,IAAK,EAAK,QAAS,CAAQ,CAAC,EAwDzF,SAAS,EAGf,CAAC,EAAgG,CAChG,IAAM,EAAO,EAAO,OAAO,EAAM,MAAM,EACjC,EAAU,EAAO,OAAO,CAC5B,YAAa,EAAgB,OAAO,YACpC,IAAK,EAAgB,OAAO,IAC5B,QAAS,EAAO,QAAQ,EAAM,QAAQ,OAAO,EAAE,KAC7C,EAAO,SACL,EAAO,OAAO,CAAO,EACrB,EAAqB,UAAU,CAC7B,OAAQ,IAAM,EAAQ,KAAK,EAAM,QAAQ,OAAO,EAChD,OAAQ,IAAM,EAAM,QAAQ,OAC9B,CAAC,CACH,CACF,CACF,CAAC,EACD,OAAO,EAAO,OAAO,CACnB,GAAI,EACJ,QAAS,EACT,SAAU,EAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EAC/D,KAAM,EAAO,QAAQ,EAAM,IAAI,EAC/B,UACA,SAAU,EAAS,EAAS,GAAG,EAC/B,MACF,CAAC,EACE,SAAS,CAAE,WAAY,EAAM,YAAc,EAAM,IAAK,CAAC,EACvD,KACC,EAAQ,KAAO,CACb,KAAM,EAAM,KACZ,WAAY,UACZ,QAAS,EAAM,QACf,MACF,EAAE,CACJ,EAGG,SAAS,CAGf,CAAC,EAA6C,CAC7C,IAAM,EAAO,EAAO,OAAO,EAAM,MAAM,EACvC,OAAO,EAAO,OAAO,CACnB,GAAI,EACJ,QAAS,EACT,SAAU,EAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EAC/D,KAAM,EAAO,QAAQ,EAAM,IAAI,EAC/B,SAAU,EAAS,EAAS,GAAG,EAC/B,MACF,CAAC,EACE,SAAS,CAAE,WAAY,EAAM,YAAc,EAAM,IAAK,CAAC,EACvD,KACC,EAAQ,KAAO,CACb,KAAM,EAAM,KACZ,WAAY,YACZ,QAAS,OACT,MACF,EAAE,CACJ,EAGG,SAAS,CAA8D,IAAI,EAA0B,CAC1G,OAAO,OAAO,OAAO,CAAW,EAG3B,SAAS,EAAM,CAAC,EAAwC,CAC7D,OAAO,EACL,EAAY,OAAO,CAAC,EAAQ,IAAe,CACzC,IAAM,EAAW,EAAO,IAAI,EAAW,IAAI,EAC3C,GAAI,CAAC,EAEH,OADA,EAAO,IAAI,EAAW,KAAM,CAAU,EAC/B,EAET,GAAI,EAAW,SAAW,EAAS,SAAW,EAAW,QAAQ,UAAY,EAAS,QAAQ,QAAS,CACrG,GAAI,EAAW,QAAQ,QAAU,EAAS,QAAQ,QAAS,EAAO,IAAI,EAAW,KAAM,CAAU,EACjG,OAAO,EAET,GAAI,IAAe,EAAU,MAAU,MAAM,yCAAyC,EAAW,MAAM,EACvG,OAAO,GACN,IAAI,GAAyB,CAClC,EAGK,SAAS,CAAa,CAAC,EAAc,EAAiB,CAC3D,MAAO,GAAG,KAAQ,IAGb,SAAS,EAA+D,CAAC,EAA0B,CACxG,OAAO,EACL,EAAY,OAAO,CAAC,EAAQ,IAAe,CACzC,GAAI,EAAW,aAAe,UAAW,OAAO,EAChD,IAAM,EAAM,EAAc,EAAW,KAAM,EAAW,QAAQ,OAAO,EACrE,GAAI,EAAO,IAAI,CAAG,EAAG,MAAU,MAAM,0CAA0C,GAAK,EAEpF,OADA,EAAO,IAAI,EAAK,CAAU,EACnB,GACN,IAAI,GAAgC,CACzC,EAGF,SAAS,CAAuB,CAAC,EAA+C,CAC9E,IAAM,EAAkC,OAAO,OAAO,IAChD,KAAI,EAAG,CACT,OAAO,EAAI,MAEb,QAAS,IAAM,EAAI,QAAQ,EAC3B,QAAS,CAAC,EAA0E,IAClF,EAAI,QAAQ,CAAC,EAAO,IAAQ,EAAS,KAAK,EAAS,EAAO,EAAK,CAAM,CAAC,EACxE,IAAK,CAAC,IAAa,EAAI,IAAI,CAAG,EAC9B,IAAK,CAAC,IAAa,EAAI,IAAI,CAAG,EAC9B,KAAM,IAAM,EAAI,KAAK,EACrB,OAAQ,IAAM,EAAI,OAAO,GACxB,OAAO,UAAW,IAAM,EAAI,OAAO,UAAU,CAChD,CAAC,EACD,OAAO,oEC/LF,IAAM,GAAM,EAAO,OAAO,KAC/B,EAAO,MAAM,WAAW,EACxB,EAAO,SAAS,CAAE,WAAY,WAAY,CAAC,EAC3C,EAAQ,CAAC,KAAY,CAAE,KAAM,EAAO,KAAK,CAAC,CAAE,EAAE,CAChD,EAGa,GAAsB,EAAO,OAAO,KAC/C,EAAO,MAAM,2BAA2B,EACxC,EAAO,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAC3D,EAAQ,CAAC,KAAY,CAAE,KAAM,EAAO,KAAK,CAAC,CAAE,EAAE,CAChD,+yBCdO,IAAM,EAAgB,EAAO,OAAO,KAAK,EAAO,MAAM,gBAAgB,CAAC,EAGjE,EAAsB,EAAO,OAAO,KAAK,EAAO,MAAM,sBAAsB,CAAC,ECGnF,IAAM,GAAK,EAAO,OAAO,KAC9B,EAAO,MAAM,eAAe,EAC5B,EAAQ,CAAC,KAAY,CAAE,OAAQ,IAAM,EAAO,KAAK,QAAU,EAAU,CAAC,CAAE,EAAE,CAC5E,EAIa,EAAQ,EAAO,OAAO,CACjC,KAAM,EAAO,QAAQ,OAAO,EAC5B,SAAU,EACV,QAAS,EAAO,OAChB,OAAQ,EAAO,OACf,QAAS,EACT,SAAU,EAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CACjE,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAM,EAAO,OAAO,CAC/B,KAAM,EAAO,QAAQ,KAAK,EAC1B,IAAK,EAAO,OACZ,SAAU,EAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CACjE,CAAC,EAAE,SAAS,CAAE,WAAY,gBAAiB,CAAC,EAE/B,GAAQ,EAAO,MAAM,CAAC,EAAO,CAAG,CAAC,EAC3C,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,kBAAmB,CAAC,EC3BvC,IAAM,EAAiB,EAAO,OAAO,CAC1C,KAAM,EAAO,QAAQ,YAAY,EACjC,GAAI,EAAW,GACf,MAAO,EAAO,MAChB,CAAC,EAAE,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAG1C,EAAU,EAAO,OAAO,CACnC,KAAM,EAAO,QAAQ,KAAK,EAC1B,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAEnC,GAAO,EAAO,MAAM,CAAC,EAAgB,CAAO,CAAC,EACvD,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,iBAAkB,CAAC,ECVtC,IAAM,EAAK,EAGL,EAAW,EAIX,EAAO,EAAO,OAAO,CAChC,IAAK,EAAO,OACZ,GAAI,EAAO,SAAS,CAAC,KAAM,KAAK,CAAC,EACjC,MAAO,EAAO,MAChB,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAa,EAAO,OAAO,CACtC,KAAM,EAAO,QAAQ,MAAM,EAC3B,IAAK,EAAO,OACZ,QAAS,EAAO,OAChB,YAAa,EAAS,EAAO,MAAM,EACnC,KAAM,EAAS,CAAI,CACrB,CAAC,EAAE,SAAS,CAAE,WAAY,wBAAyB,CAAC,EAGvC,GAAe,EAAO,OAAO,CACxC,KAAM,EAAO,QAAQ,QAAQ,EAC7B,IAAK,EAAO,OACZ,QAAS,EAAO,OAChB,QAAS,EAAO,MACd,EAAO,OAAO,CACZ,MAAO,EAAO,OACd,MAAO,EAAO,OACd,KAAM,EAAS,EAAO,MAAM,CAC9B,CAAC,CACH,EACA,KAAM,EAAS,CAAI,CACrB,CAAC,EAAE,SAAS,CAAE,WAAY,0BAA2B,CAAC,EAEzC,GAAS,EAAO,MAAM,CAAC,EAAY,EAAY,CAAC,EAAE,KAAK,EAAO,cAAc,MAAM,CAAC,EAInF,GAAc,EAAO,OAAO,CACvC,GAAI,EACJ,KAAM,EAAO,QAAQ,OAAO,EAC5B,MAAO,EAAO,OACd,QAAS,EAAS,EAAO,MAAM,EAAM,CAAC,CACxC,CAAC,EAAE,SAAS,CAAE,WAAY,yBAA0B,CAAC,EAGxC,GAAgB,EAAO,OAAO,CACzC,GAAI,EACJ,KAAM,EAAO,QAAQ,SAAS,EAC9B,MAAO,EAAO,OACd,QAAS,EAAO,MAAM,EAAO,MAAM,CACrC,CAAC,EAAE,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAG1C,GAAY,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,KAAK,EAC1B,MAAO,EAAS,EAAO,MAAM,CAC/B,CAAC,EAAE,SAAS,CAAE,WAAY,uBAAwB,CAAC,EAGtC,GAAY,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,KAAK,EAC1B,MAAO,EAAO,MAAM,EAAO,MAAM,CACnC,CAAC,EAAE,SAAS,CAAE,WAAY,uBAAwB,CAAC,EAEtC,GAAS,EAAO,MAAM,CAAC,GAAa,GAAe,GAAW,EAAS,CAAC,EAClF,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,GAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,MAAM,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGzG,EAAU,EAAU,CACxB,KAAM,sBACN,OAAQ,CAAC,CACX,CAAC,EACK,EAAoB,EAAU,CAClC,KAAM,iCACN,OAAQ,CAAE,cAAe,CAAG,CAC9B,CAAC,EACY,GAAQ,CAAE,UAAS,oBAAmB,YAAa,EAAU,EAAS,CAAiB,CAAE,EAGzF,GAAM,EAAO,OAAO,CAC/B,GAAI,EACJ,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,iBAAkB,CAAC,EAEhC,GAAO,EAAO,OAAO,CAChC,GAAI,EACJ,KAAM,EAAO,OACb,QAAS,EAAO,MAAM,EAAM,EAC5B,YAAa,EAAO,MAAM,EAAW,IAAI,CAC3C,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAY,EAAO,OAAO,KACrC,EAAO,MAAM,uBAAuB,EACpC,EAAQ,CAAC,KAAY,CAAE,OAAQ,IAAM,EAAO,KAAK,OAAS,EAAU,CAAC,CAAE,EAAE,CAC3E,EAGM,EAAc,EAAO,OAAO,CAChC,QAAS,EAAO,OAChB,QAAS,EAAO,MAClB,CAAC,EAEM,MAAM,WAAgB,EAAO,MAAe,qBAAqB,EAAE,CACxE,UAAW,EACX,IAAK,EAAO,OACZ,aAAc,EAAO,OACrB,KAAM,EAAO,SAAS,CAAC,OAAQ,MAAM,CAAC,EACtC,KAAM,CACR,CAAC,CAAE,CAAC,CAEG,IAAM,GAAgB,EAAO,MAAM,CACxC,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,SAAS,EAAG,KAAM,CAAY,CAAC,EACtE,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,UAAU,EAAG,KAAM,CAAY,CAAC,EACvE,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,QAAQ,EAAG,QAAS,EAAO,OAAQ,KAAM,CAAY,CAAC,EAC7F,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,SAAS,EAAG,KAAM,CAAY,CAAC,CACxE,CAAC,EACE,KAAK,EAAO,cAAc,QAAQ,CAAC,EACnC,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAI1C,GAAiB,EAAO,OAAO,CAC1C,UAAW,EACX,KAAM,CACR,CAAC,EAAE,SAAS,CAAE,WAAY,4BAA6B,CAAC,EAE3C,GAAuB,EAAO,MAAM,CAC/C,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,SAAS,EAAG,QAAS,EAAS,EAAO,MAAM,EAAG,KAAM,CAAY,CAAC,EACxG,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,UAAU,EAAG,KAAM,CAAY,CAAC,EACvE,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,QAAQ,EAAG,QAAS,EAAO,OAAQ,KAAM,CAAY,CAAC,EAC7F,EAAO,OAAO,CAAE,OAAQ,EAAO,QAAQ,SAAS,EAAG,KAAM,CAAY,CAAC,CACxE,CAAC,EACE,KAAK,EAAO,cAAc,QAAQ,CAAC,EACnC,SAAS,CAAE,WAAY,kCAAmC,CAAC,EClJvD,IAAM,GAAK,EAAO,OAAO,KAC9B,EAAO,MAAM,eAAe,EAC5B,EAAQ,CAAC,KAAY,CACnB,SAAU,EAAO,KAAK,UAAU,EAChC,UAAW,EAAO,KAAK,WAAW,EAClC,OAAQ,EAAO,KAAK,QAAQ,EAC5B,OAAQ,EAAO,KAAK,QAAQ,EAC5B,aAAc,EAAO,KAAK,eAAe,EACzC,cAAe,EAAO,KAAK,gBAAgB,EAC3C,cAAe,EAAO,KAAK,gBAAgB,EAC3C,MAAO,EAAO,KAAK,OAAO,EAC1B,WAAY,EAAO,KAAK,YAAY,EACpC,QAAS,EAAO,KAAK,SAAS,EAC9B,OAAQ,EAAO,KAAK,QAAQ,CAC9B,EAAE,CACJ,EAGa,GAAU,EAAO,OAGjB,GAAW,CACtB,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAAE,KAAK,CAAQ,EACjE,QAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,MAAM,EAAE,KAAK,CAAQ,EAClE,KAAM,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAAE,KAAK,CAAQ,CAC/D,EAEa,GAAW,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAAE,SAAS,CAAE,WAAY,mBAAoB,CAAC,EAIjG,GAAU,EAAO,OAAO,CACnC,SAAU,GAAS,KAAK,EAAO,uBAAuB,GAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,EACzE,QAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,MAAM,EACnD,KAAM,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,CAChD,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,GAAO,EAAO,OAAO,CAChC,GAAI,GACJ,cAAe,EAAY,GAAG,KAAK,CAAQ,EAC3C,KAAM,EAAO,OACb,SAAU,EAAO,QAAQ,KAAK,CAAQ,EACtC,QAAS,MACN,EACL,CAAC,EACE,SAAS,CAAE,WAAY,iBAAkB,CAAC,EAC1C,KACC,EAAQ,KAAO,CACb,MAAO,CAAC,KAAkB,CAAE,KAAI,KAAM,EAAI,QAAS,EAAG,EACxD,EAAE,CACJ,EClDK,IAAM,EAAK,EAAO,OAAO,KAAK,EAAO,MAAM,UAAU,CAAC,EAGhD,EAAY,EAAO,OAAO,KAAK,EAAO,MAAM,iBAAiB,CAAC,EAG9D,GAAM,EAAO,OAAO,CAC/B,GAAI,EACJ,WAAY,EAAS,GACrB,QAAS,EAAU,KAAK,CAAQ,CAClC,CAAC,EACE,SAAS,CAAE,WAAY,WAAY,CAAC,EACpC,KACC,EAAQ,CAAC,KAAY,CACnB,MAAO,CAAC,IAAkB,CACxB,IAAM,EAAc,EAAM,QAAQ,GAAG,EACrC,GAAI,GAAe,EAAG,MAAU,MAAM,4BAA4B,GAAO,EACzE,IAAM,EAAa,EAAM,MAAM,EAAG,CAAW,EACvC,EAAe,EAAM,QAAQ,IAAK,EAAc,CAAC,EACjD,EAAK,EAAM,MAAM,EAAc,EAAG,IAAiB,GAAK,OAAY,CAAY,EAChF,EAAU,IAAiB,GAAK,OAAY,EAAM,MAAM,EAAe,CAAC,EAC9E,GAAI,CAAC,GAAM,EAAW,SAAS,GAAG,GAAM,IAAY,SAAc,CAAC,GAAW,EAAQ,SAAS,GAAG,GAChG,MAAU,MAAM,4BAA4B,GAAO,EACrD,OAAO,EAAO,KAAK,CACjB,WAAY,EAAS,GAAG,KAAK,CAAU,EACvC,GAAI,EAAG,KAAK,CAAE,KACV,EAAU,CAAE,QAAS,EAAU,KAAK,CAAO,CAAE,EAAI,CAAC,CACxD,CAAC,EAEL,EAAE,CACJ,EAGW,GAAS,EAAO,OAAO,KAAK,EAAO,MAAM,cAAc,CAAC,EAIxD,GAA+C,EAAO,MAAM,CACvE,EAAO,SAAS,CAAC,YAAa,oBAAqB,gBAAgB,CAAC,EACpE,EAAO,MACT,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC,EAGrC,GAAgB,EAAO,OAAO,CACzC,eAAgB,GAAe,KAAK,CAAQ,CAC9C,CAAC,EAAE,SAAS,CAAE,WAAY,qBAAsB,CAAC,EAGpC,GAAe,EAAO,OAAO,CACxC,MAAO,EAAO,QACd,MAAO,EAAO,MAAM,EAAO,MAAM,EACjC,OAAQ,EAAO,MAAM,EAAO,MAAM,CACpC,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,GAAO,EAAO,OAAO,CAChC,KAAM,EAAO,OAAO,CAClB,KAAM,EAAO,IAAI,SAAS,EAC1B,KAAM,EAAO,GACf,CAAC,EAAE,KAAK,CAAQ,EAChB,MAAO,EAAM,oBACb,OAAQ,EAAM,oBACd,MAAO,EAAO,OAAO,CACnB,KAAM,EAAM,oBACZ,MAAO,EAAM,mBACf,CAAC,CACH,CAAC,EAAE,SAAS,CAAE,WAAY,YAAa,CAAC,EAG3B,GAAU,EAAO,OAAO,CACnC,GAAI,KACD,EAAS,QACd,CAAC,EAAE,SAAS,CAAE,WAAY,eAAgB,CAAC,EAG9B,GAAO,EAAO,OAAO,CAChC,GAAI,EACJ,QAAS,EACT,WAAY,EAAS,GACrB,OAAQ,GAAO,KAAK,CAAQ,EAC5B,KAAM,EAAO,OACb,cAAe,GAAc,KAAK,CAAQ,EAC1C,QAAS,EAAS,QAAQ,KAAK,CAAQ,KACpC,EAAS,SACZ,aAAc,GACd,SAAU,EAAO,MAAM,EAAO,EAC9B,KAAM,EAAO,OAAO,CAClB,SAAU,EAAO,MACnB,CAAC,EACD,KAAM,EAAO,MAAM,EAAI,EACvB,OAAQ,EAAO,SAAS,CAAC,QAAS,OAAQ,aAAc,QAAQ,CAAC,EACjE,QAAS,EAAO,QAChB,MAAO,EAAO,OAAO,CACnB,QAAS,EAAO,IAChB,MAAO,EAAO,IAAI,KAAK,CAAQ,EAC/B,OAAQ,EAAO,GACjB,CAAC,CACH,CAAC,EACE,SAAS,CAAE,WAAY,YAAa,CAAC,EACrC,KACC,EAAQ,KAAO,CACb,MAAO,CAAC,EAAyB,KAC9B,CACC,KACA,QAAS,EACT,aACA,KAAM,EACN,aAAc,CAAE,MAAO,GAAO,MAAO,CAAC,EAAG,OAAQ,CAAC,CAAE,EACpD,SAAU,CAAC,EACX,KAAM,CAAE,SAAU,CAAE,EACpB,KAAM,CAAC,EACP,OAAQ,SACR,QAAS,GACT,MAAO,CAAE,QAAS,EAAG,OAAQ,CAAE,CACjC,EACJ,EAAE,CACJ", | ||
| "debugId": "A63B5FA9C3FE9D6164756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "F2BD269CDA912CB964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "9AAADDC3C35BECB364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "7A113230590D497C64756E2164756E21", | ||
| "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": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,KAAK,EAChD,CACH", | ||
| "debugId": "DB92895116DCBFB864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/image-input.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding } from \"effect\"\nimport type { ImageInput } from \"../../image\"\nimport { InvalidRequestReason, LLMError } from \"../../schema\"\n\nconst invalid = (module: string, message: string) =>\n new LLMError({\n module,\n method: \"generate\",\n reason: new InvalidRequestReason({ message }),\n })\n\nexport const dataUrl = (input: Extract<ImageInput, { readonly type: \"bytes\" }>) =>\n `data:${input.mediaType};base64,${Encoding.encodeBase64(input.data)}`\n\nexport const decodeDataUrl = (\n url: string,\n module: string,\n): Effect.Effect<{ readonly mediaType: string; readonly data: Uint8Array } | undefined, LLMError> => {\n if (!url.startsWith(\"data:\")) return Effect.succeed(undefined)\n const match = /^data:([^;,]+);base64,(.*)$/s.exec(url)\n if (!match) return Effect.fail(invalid(module, \"Image data URLs must contain a MIME type and base64 data\"))\n return Effect.fromResult(Encoding.decodeBase64(match[2])).pipe(\n Effect.mapError(() => invalid(module, \"Image data URL contains invalid base64 data\")),\n Effect.map((data) => ({ mediaType: match[1], data })),\n )\n}\n\nexport const invalidImageInput = invalid\n\nexport const ImageInputs = {\n dataUrl,\n decodeDataUrl,\n invalid: invalidImageInput,\n} as const\n" | ||
| ], | ||
| "mappings": ";mHAIA,SAAM,EAAU,CAAC,EAAgB,IAC/B,IAAI,EAAS,CACX,SACA,OAAQ,WACR,OAAQ,IAAI,EAAqB,CAAE,SAAQ,CAAC,CAC9C,CAAC,EAEU,EAAU,CAAC,IACtB,QAAQ,EAAM,oBAAoB,EAAS,aAAa,EAAM,IAAI,IAEvD,EAAgB,CAC3B,EACA,IACmG,CACnG,GAAI,CAAC,EAAI,WAAW,OAAO,EAAG,OAAO,EAAO,QAAQ,MAAS,EAC7D,IAAM,EAAQ,+BAA+B,KAAK,CAAG,EACrD,GAAI,CAAC,EAAO,OAAO,EAAO,KAAK,EAAQ,EAAQ,0DAA0D,CAAC,EAC1G,OAAO,EAAO,WAAW,EAAS,aAAa,EAAM,EAAE,CAAC,EAAE,KACxD,EAAO,SAAS,IAAM,EAAQ,EAAQ,6CAA6C,CAAC,EACpF,EAAO,IAAI,CAAC,KAAU,CAAE,UAAW,EAAM,GAAI,MAAK,EAAE,CACtD,GAGW,EAAoB,EAEpB,EAAc,CACzB,UACA,gBACA,QAAS,CACX", | ||
| "debugId": "119647D36351F86D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini.ts", "src/mini-host.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { waitForCatalogReady } from \"./services/catalog\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => {\n if (input.model)\n await waitForCatalogReady({\n sdk: input.client,\n directory: input.location.directory,\n workspace: input.location.workspaceID,\n model: { providerID: input.model.providerID, modelID: input.model.id },\n signal: input.signal,\n })\n return {\n model: input.model,\n agent: requestedAgent\n ? await validateAgent(\n input.client,\n input.location.directory,\n input.location.workspaceID,\n requestedAgent,\n input.signal,\n )\n : input.agent,\n }\n }\n}\n\nasync function validateAgent(\n sdk: OpenCodeClient,\n directory: string,\n workspace: string | undefined,\n name?: string,\n signal?: AbortSignal,\n) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline && !signal?.aborted) {\n agents = await sdk.agent.list({ location: { directory, workspace } }, { signal }).catch((error) => {\n if (signal && error instanceof ClientError && error.reason === \"Transport\") throw error\n return undefined\n })\n const agent = agents?.data.find((item) => item.id === name)\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 if (agent) return name\n await setTimeout(25, undefined, { signal }).catch(() => {})\n }\n if (signal?.aborted) return\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths?: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths ?? {\n home: Global.Path.home,\n state: Global.Path.state,\n log: Global.Path.log,\n }\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": ";6iBAGA,0BAAS,6BCAT,uBACA,wBAAS,yBACT,yBACA,0BAAS,iBAEF,SAAM,OAA0B,+DASvC,cAAS,CAAW,CAAC,EAA4C,CAC/D,IAAM,EAAa,EAAgC,EAAK,KAAK,EAAW,YAAY,CAAC,EACrF,MAAO,MACC,eAAc,CAAC,EAAO,CAC1B,GAAI,CAAC,EAAO,OACZ,OAAO,EAAW,eAAe,CAAK,QAElC,YAAW,CAAC,EAAO,EAAS,CAChC,GAAI,CAAC,EAAO,OACZ,MAAM,EAAW,YAAY,EAAO,CAAO,EAAE,MAAM,IAAG,CAAG,OAAS,EAEtE,EAGF,SAAS,CAAM,CAAC,EAA2D,CACzE,MAAO,CACL,SAAS,CAAC,EAAU,CAClB,IAAI,EAAa,GAEjB,OADA,QAAQ,GAAG,EAAM,CAAQ,EAClB,IAAM,CACX,GAAI,CAAC,EAAY,OACjB,EAAa,GACb,QAAQ,IAAI,EAAM,CAAQ,GAGhC,EAGF,SAAS,CAAW,CAClB,EACA,EACkC,CAClC,GAAI,CAAC,QAAQ,IAAI,sBAAuB,OACxC,IAAM,EAAQ,IAAI,KAAK,EACpB,YAAY,EACZ,QAAQ,QAAS,EAAE,EACnB,QAAQ,UAAW,GAAG,EACnB,EAAS,EAAK,KAAK,EAAS,SAAU,GAAG,KAAS,EAAY,WAAW,EACzE,EAAO,CAAC,IACZ,KAAK,UAAU,EAAM,CAAC,EAAM,IAAW,OAAO,IAAU,SAAW,OAAO,CAAK,EAAI,EAAQ,CAAC,EAC9F,EAAG,UAAU,EAAK,QAAQ,CAAM,EAAG,CAAE,UAAW,EAAK,CAAC,EACtD,EAAG,cACD,EAAK,KAAK,EAAS,SAAU,aAAa,EAC1C,EAAK,CACH,KAAM,IAAI,KAAK,EAAE,YAAY,KAC1B,EACH,KAAM,CACR,CAAC,EAAI;AAAA,CACP,EACA,IAAM,EAAQ,CACZ,KAAK,CAAC,EAAc,EAAgB,CAClC,EAAG,eACD,EACA,EAAK,CACH,KAAM,IAAI,KAAK,EAAE,YAAY,EAC7B,IAAK,EAAY,IACjB,OACA,MACF,CAAC,EAAI;AAAA,CACP,EAEJ,EAMA,OALA,EAAM,MAAM,cAAe,CACzB,KAAM,EAAY,KAClB,IAAK,EAAY,IACjB,KAAM,CACR,CAAC,EACM,EAGT,SAAS,CAAiB,CAAC,EAAmC,CAC5D,OAAO,IAAI,EAAW,EAAG,SAAS,EAAQ,GAAG,CAAC,EAGzC,SAAS,CAAuB,CACrC,EAA2B,QAAQ,MACnC,EAA8C,EAC9C,EAA4B,QACV,CAClB,GAAI,EAAM,MAAO,MAAO,CAAE,QAAO,OAAO,EAAG,EAAG,EAC9C,IAAM,EAAS,IAAa,QAAU,SAAW,WACjD,GAAI,CACF,IAAM,EAAS,EAAK,CAAM,EACtB,EAAU,GACd,MAAO,CACL,MAAO,EACP,OAAO,EAAG,CACR,GAAI,EAAS,OACb,EAAU,GACV,EAAO,QAAQ,EAEnB,EACA,MAAO,EAAO,CACd,MAAU,MAAM,EAAyB,CAAE,MAAO,CAAM,CAAC,GAK7D,eAAsB,CAAwB,CAC5C,EACA,EAAkC,EAClC,CACA,IAAM,EAAW,EAAQ,EACzB,GAAI,CACF,OAAO,MAAM,EAAI,CAAQ,SACzB,CACA,EAAS,QAAQ,GAKd,SAAS,CAAc,CAAC,EAIlB,CACX,IAAM,EAAQ,EAAM,OAAS,CAC3B,KAAM,EAAO,KAAK,KAClB,MAAO,EAAO,KAAK,MACnB,IAAK,EAAO,KAAK,GACnB,EACM,EAAc,CAClB,IAAK,QAAQ,IACb,IAAK,EAAM,UACX,KAAM,QAAQ,KAAK,MAAM,CAAC,CAC5B,EACA,MAAO,CACL,SAAU,CAAE,MAAO,EAAM,SAAS,KAAM,EACxC,SAAU,QACV,OAAQ,CACN,KAAK,CAAC,EAAO,CACX,QAAQ,OAAO,MAAM,CAAK,EAE9B,EACA,MAAO,CACL,SAAU,CAAC,IAAQ,EAAS,IAAI,IAAI,CAAG,EAAG,MAAM,CAClD,EACA,OAAQ,MACA,KAAI,CAAC,EAAS,CAClB,IAAQ,cAAe,KAAa,0CACpC,OAAO,EAAW,CAAO,EAE7B,EACA,MAAO,CAAE,KAAM,EAAM,IAAK,EAC1B,QAAS,CACP,OAAQ,EAAO,QAAQ,EACvB,QAAS,EAAO,SAAS,CAC3B,EACA,QAAS,CACP,WAAY,CAAC,IAAK,MAAM,EAAE,SAAS,QAAQ,IAAI,oBAAoB,YAAY,GAAK,EAAE,EACtF,IAAK,IAAM,YAAY,IAAI,CAC7B,EACA,YAAa,CACX,MAAO,EAAY,EAAM,IAAK,CAAW,CAC3C,EACA,YAAa,EAAY,EAAM,KAAK,CACtC,EDhJF,MAAM,UAAuB,KAAM,CAAC,CAEpC,eAAsB,EAAO,CAAC,EAAyB,CACrD,GAAI,CACF,EAAS,CAAK,EACd,IAAM,EAAS,MAAM,EAAsB,MAAO,IAAa,CAC7D,IAAM,EAAe,EAAW,QAAQ,MAAM,MAAQ,OAAY,MAAM,EAAU,EAAG,EAAM,MAAM,EAC3F,EAAsB,yCACtB,EAAY,EAAe,EAC3B,EAAa,EAAqB,EAAM,MAAM,EAC9C,EAAM,EAAW,IACjB,EAAY,EAAW,EAAM,KAAK,EAClC,EAAQ,EAAY,CAAE,WAAY,EAAU,WAAY,QAAS,EAAU,EAAG,EAAI,OAClF,EAAU,EAAc,EAAM,KAAK,EACnC,EAAgB,MAAO,EAAyB,IAAwB,CAC5E,IAAM,EAAW,MAAM,EAAkB,CACvC,IAAK,EACL,UAAW,EAAW,UACtB,SACA,QAAS,CAAC,IACR,EAAqB,CACnB,SACA,SAAU,CAAE,WAAU,EACtB,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,KAAM,EAAM,KACZ,MAAO,EACP,MAAO,EAAM,MACb,UACA,QACF,CAAC,EAAE,MAAM,CAAC,IAAU,CAClB,GAAI,aAAiB,OAAS,EAAM,UAAY,oBAC9C,MAAM,IAAI,EAAe,EAAM,OAAO,EACxC,MAAM,EACP,CACL,CAAC,EACK,EAAS,EAAS,MACxB,MAAO,CACL,IAAK,EAAS,IACd,UAAW,EAAO,QAAQ,GAC1B,aAAc,EAAO,QAAQ,MAC7B,SAAU,EAAO,SACjB,MAAO,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC1F,QAAS,EAAO,OAAO,QACvB,MAAO,EAAO,MACd,OAAQ,EAAO,MACjB,GAEI,EAAS,CACb,EACA,EAMA,IAEA,EAAqB,CACnB,SACA,SAAU,CAAE,UAAW,EAAK,SAAS,UAAW,UAAW,EAAK,SAAS,WAAY,EACrF,MAAO,EAAK,MACZ,MAAO,EAAK,MACR,CAAE,WAAY,EAAK,MAAM,WAAY,GAAI,EAAK,MAAM,QAAS,QAAS,EAAK,OAAQ,EACnF,OACJ,UACA,QACF,CAAC,EAAE,KAAK,CAAC,KAAY,CACnB,UAAW,EAAO,QAAQ,GAC1B,aAAc,EAAO,QAAQ,MAC7B,SAAU,EAAO,SACjB,MAAO,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC1F,QAAS,EAAO,OAAO,QACvB,MAAO,EAAO,MACd,OAAQ,EACV,EAAE,EAEJ,OADiB,MAAM,GACP,gBAAgB,CAC9B,KAAM,EAAe,CAAE,WAAU,WAAU,CAAC,EAC5C,MACA,YACA,OAAQ,EACR,UAAW,EAAW,UACtB,cAAe,EACf,MAAO,EAAM,MACb,QACA,QAAS,GAAW,QACpB,MAAO,CAAC,EACR,eACA,OAAQ,EAAM,QAAU,GACxB,YAAa,EAAM,YACnB,KAAM,EAAM,KACZ,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EACF,EACD,GAAI,EAAO,WAAa,EAAG,QAAQ,KAAK,EAAO,QAAQ,EACvD,MAAO,EAAO,CACd,GAAI,aAAiB,GAAmB,aAAiB,OAAS,EAAM,UAAY,EAClF,EAAK,EAAM,OAAO,EACpB,MAAM,GAKH,SAAS,CAAoB,CAAC,EAAmC,CACtE,IAAM,EAAO,CAAC,IACZ,EAAS,KAAK,CACZ,QAAS,EAAS,IAClB,QAAS,EAAQ,QAAQ,CAAQ,CACnC,CAAC,EACG,EAAY,EAAM,UACxB,MAAO,CACL,IAAK,EAAK,EAAM,QAAQ,EACxB,UAAW,EACP,MAAO,IAAwB,CAC7B,IAAM,EAAW,MAAM,EAAU,CAAM,EACvC,OAAO,EAAK,CAAQ,GAEtB,MACN,EAIF,eAAsB,CAAoB,CAAC,EAKxC,CACD,IAAI,EAAM,EAAM,IAChB,MAAO,GACL,GAAI,CACF,MAAO,CAAE,MAAK,MAAO,MAAM,EAAM,QAAQ,CAAG,CAAE,EAC9C,MAAO,EAAO,CACd,GAAI,CAAC,EAAM,WAAa,EAAE,aAAiB,IAAgB,EAAM,SAAW,YAAa,MAAM,EAC/F,MAAO,GACL,GAAI,CACF,EAAM,MAAM,EAAM,UAAU,EAAM,MAAM,EACxC,MACA,MAAO,EAAc,CACrB,GAAI,EAAM,OAAO,QAAS,MAAM,EAChC,MAAM,EAAW,IAAK,OAAW,CAAE,OAAQ,EAAM,MAAO,CAAC,IAO5D,SAAS,CAAoB,EAAG,CACrC,GAAI,CAAC,QAAQ,OAAO,MAAO,EAAK,qCAAqC,EAIhE,SAAS,CAAU,CAAC,EAA2B,EAA4B,CAChF,GAAI,CAAC,EAAQ,OAAO,GAAS,OAC7B,GAAI,CAAC,EAAO,OAAO,EACnB,OAAO,EAAQ;AAAA,EAAO,EAGxB,SAAS,CAAQ,CAAC,EAAyB,CAEzC,GADA,EAAqB,EACjB,EAAM,cAAgB,SAAc,CAAC,OAAO,UAAU,EAAM,WAAW,GAAK,EAAM,aAAe,GACnG,EAAK,2CAA2C,EAElD,GAAI,EAAM,MAAQ,CAAC,EAAM,UAAY,CAAC,EAAM,QAAS,EAAK,yCAAyC,EAGrG,SAAS,CAAc,EAAW,CAChC,IAAM,EAAO,QAAQ,IAAI,KAAO,QAAQ,IAAI,EAC5C,GAAI,CAEF,OADA,QAAQ,MAAM,CAAI,EACX,QAAQ,IAAI,EACnB,KAAM,CACN,MAAM,IAAI,EAAe,iCAAiC,GAAM,GAIpE,SAAS,CAAU,CAAC,EAAgB,CAClC,GAAI,CACF,OAAO,EAAwB,CAAK,EACpC,KAAM,CACN,MAAM,IAAI,EAAe,sDAAsD,GAInF,SAAS,CAAa,CAAC,EAAmD,CACxE,MAAO,OAAO,IAAU,CACtB,GAAI,EAAM,MACR,MAAM,EAAoB,CACxB,IAAK,EAAM,OACX,UAAW,EAAM,SAAS,UAC1B,UAAW,EAAM,SAAS,YAC1B,MAAO,CAAE,WAAY,EAAM,MAAM,WAAY,QAAS,EAAM,MAAM,EAAG,EACrE,OAAQ,EAAM,MAChB,CAAC,EACH,MAAO,CACL,MAAO,EAAM,MACb,MAAO,EACH,MAAM,EACJ,EAAM,OACN,EAAM,SAAS,UACf,EAAM,SAAS,YACf,EACA,EAAM,MACR,EACA,EAAM,KACZ,GAIJ,eAAe,CAAa,CAC1B,EACA,EACA,EACA,EACA,EACA,CACA,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,KAAK,IAAI,EAAI,KAC1B,EACJ,MAAO,KAAK,IAAI,EAAI,GAAY,CAAC,GAAQ,QAAS,CAChD,EAAS,MAAM,EAAI,MAAM,KAAK,CAAE,SAAU,CAAE,YAAW,WAAU,CAAE,EAAG,CAAE,QAAO,CAAC,EAAE,MAAM,CAAC,IAAU,CACjG,GAAI,GAAU,aAAiB,GAAe,EAAM,SAAW,YAAa,MAAM,EAClF,OACD,EACD,IAAM,EAAQ,GAAQ,KAAK,KAAK,CAAC,IAAS,EAAK,KAAO,CAAI,EAC1D,GAAI,GAAO,OAAS,WAAY,CAC9B,EAAQ,UAAU,sEAAyE,EAC3F,OAEF,GAAI,EAAO,OAAO,EAClB,MAAM,EAAW,GAAI,OAAW,CAAE,QAAO,CAAC,EAAE,MAAM,IAAM,EAAE,EAE5D,GAAI,GAAQ,QAAS,OACrB,GAAI,CAAC,EAAQ,CACX,EAAQ,sDAAsD,EAC9D,OAEF,EAAQ,UAAU,6CAAgD,EAGpE,SAAS,CAAO,CAAC,EAAiB,CAChC,QAAQ,OAAO,MAAM,2BAA2B;AAAA,CAAW,EAG7D,SAAS,CAAI,CAAC,EAAwB,CACpC,QAAQ,OAAO,MAAM,gCAAgC;AAAA,CAAW,EAChE,QAAQ,KAAK,CAAC", | ||
| "debugId": "9DD95031ABBC46BB64756E2164756E21", | ||
| "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": ";6zBAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,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": "32F498F8C857F10E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../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 !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. 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": ";0cAoBO,SAAM,OAAU,OAAO,QAAG,oCAA+B,OAAE,cAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,EAAK,UAAY,SAAS,EACjG,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CACjD,EACA,EACA,CACA,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC", | ||
| "debugId": "559E6EF5AFB302A164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAGA,IAAM,EAAiD,mBACjD,EAAiD,OAGhD,IAAM,EAAiB", | ||
| "debugId": "A5E3D4F21C09A34264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/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 = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") 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 legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\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 = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\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\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) 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 legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: OPENCODE_VERSION,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\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" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0A3213BE8D51E5D264756E2164756E21", | ||
| "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)\nconst RESERVED_REASONING_FIELDS = new Set([\"role\", \"content\", \"tool_calls\"])\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.StructWithRest(\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 reasoning_details: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\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.StructWithRest(\n 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 reasoning_details: optionalNull(Schema.Unknown),\n tool_calls: optionalNull(Schema.Array(OpenAIChatToolCallDelta)),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\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?: string\n readonly reasoningDetails: Array<unknown>\n readonly reasoningDetailsObserved: boolean\n readonly reasoningEmitted: boolean\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 return typeof field === \"string\" ? field : undefined\n}\n\nconst reasoningDetails = (parts: ReadonlyArray<ReasoningPart>, native: unknown) => {\n const observed = parts.flatMap((part) => {\n const details = part.providerMetadata?.openai?.reasoningDetails\n return Array.isArray(details) ? details : []\n })\n if (parts.some((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))) return observed\n if (isRecord(native) && Array.isArray(native.reasoning_details)) return native.reasoning_details\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 configuredField?: string,\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 details = reasoningDetails(reasoning, message.native?.openaiCompatible)\n const observedField = reasoning.map(reasoningField).find((value) => value !== undefined)\n const nativeReasoning = openAICompatibleReasoningContent(message.native?.openaiCompatible)\n const fullyStructured = reasoning.every((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))\n const field = (() => {\n if (configuredField !== undefined) return configuredField\n if (reasoning.length === 0) return undefined\n if (observedField !== undefined) return observedField\n if (nativeReasoning !== undefined) return \"reasoning_content\"\n if (!fullyStructured) return \"reasoning_content\"\n })()\n const reasoningText = (() => {\n if (configuredField !== undefined) return reasoning.length === 0 ? (nativeReasoning ?? \"\") : text\n if (reasoning.length === 0) return nativeReasoning\n return text\n })()\n const result = {\n role: \"assistant\" as const,\n content: content.length === 0 ? null : ProviderShared.joinText(content),\n tool_calls: toolCalls.length === 0 ? undefined : toolCalls,\n reasoning_details: details,\n }\n if (field === undefined || reasoningText === undefined) return result\n return { ...result, [field]: reasoningText }\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* (\n message: OpenAIChatRequestMessage,\n reasoningField?: string,\n) {\n if (message.role === \"user\") return [yield* lowerUserMessage(message)]\n if (message.role === \"assistant\") return [yield* lowerAssistantMessage(message, reasoningField)]\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, request.model.compatibility?.reasoningField)))\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 reasoningField = request.model.compatibility?.reasoningField\n if (reasoningField && RESERVED_REASONING_FIELDS.has(reasoningField))\n return yield* ProviderShared.invalidRequest(\n `OpenAI Chat reasoning field conflicts with reserved field ${reasoningField}`,\n )\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 = (\n delta: Schema.Schema.Type<typeof OpenAIChatDelta> | null | undefined,\n configuredField?: string,\n) => {\n if (!delta) return undefined\n const fields = new Set([configuredField, \"reasoning_content\", \"reasoning\", \"reasoning_text\"])\n for (const field of fields) {\n if (field === undefined) continue\n const text = delta[field]\n if (typeof text === \"string\" && text.length > 0) return { field, text }\n }\n return undefined\n}\n\nconst detailText = (details: ReadonlyArray<unknown>) => {\n const text = details.flatMap((detail) => {\n if (!isRecord(detail)) return []\n if (detail.type === \"reasoning.text\" && typeof detail.text === \"string\" && detail.text) return [detail.text]\n if (detail.type === \"reasoning.summary\" && typeof detail.summary === \"string\" && detail.summary)\n return [detail.summary]\n return []\n })\n if (text.length > 0) return text.join(\"\")\n}\n\nconst appendReasoningDetails = (result: Array<unknown>, details: ReadonlyArray<unknown>) => {\n for (const detail of details) {\n const previous = result.at(-1)\n if (\n !isRecord(previous) ||\n previous.type !== \"reasoning.text\" ||\n !isRecord(detail) ||\n detail.type !== \"reasoning.text\" ||\n conflictingReasoningTextDetails(previous, detail)\n ) {\n result.push(detail)\n continue\n }\n result[result.length - 1] = {\n ...previous,\n ...Object.fromEntries(Object.entries(detail).filter((entry) => entry[1] !== undefined)),\n text: `${typeof previous.text === \"string\" ? previous.text : \"\"}${typeof detail.text === \"string\" ? detail.text : \"\"}`,\n signature: mergeDetailValue(previous.signature, detail.signature),\n format: mergeDetailValue(previous.format, detail.format),\n }\n }\n}\n\nconst mergeDetailValue = (previous: unknown, current: unknown) =>\n previous || current || (previous !== undefined ? previous : current)\n\nconst conflictingReasoningTextDetails = (previous: Record<string, unknown>, current: Record<string, unknown>) =>\n conflictingDetailValue(previous.id, current.id) ||\n conflictingDetailValue(previous.index, current.index) ||\n conflictingDetailValue(previous.format, current.format) ||\n (Boolean(previous.signature) && Boolean(current.signature) && previous.signature !== current.signature)\n\nconst conflictingDetailValue = (previous: unknown, current: unknown) =>\n previous !== undefined && previous !== null && current !== undefined && current !== null && previous !== current\n\nconst reasoningMetadata = (field: ParserState[\"reasoningField\"], details?: ReadonlyArray<unknown>) => ({\n openai: {\n ...(field ? { reasoningField: field } : {}),\n ...(details ? { reasoningDetails: details } : {}),\n },\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, state.reasoningField)\n const reasoningField = state.reasoningField ?? (!state.lifecycle.text.has(\"text-0\") ? reasoning?.field : undefined)\n const detailDelta = Array.isArray(delta?.reasoning_details) ? delta.reasoning_details : undefined\n if (detailDelta !== undefined) appendReasoningDetails(state.reasoningDetails, detailDelta)\n const reasoningDetailsObserved = state.reasoningDetailsObserved || detailDelta !== undefined\n const deltaMetadata = reasoningMetadata(reasoningField)\n const text = detailDelta?.length ? (detailText(detailDelta) ?? reasoning?.text) : reasoning?.text\n if (!state.lifecycle.text.has(\"text-0\") && text !== undefined)\n lifecycle = Lifecycle.reasoningDelta(lifecycle, events, \"reasoning-0\", text, deltaMetadata)\n else if (\n reasoningDetailsObserved &&\n !lifecycle.reasoning.has(\"reasoning-0\") &&\n (Boolean(delta?.content) || toolDeltas.length > 0)\n )\n lifecycle = Lifecycle.reasoningStart(lifecycle, events, \"reasoning-0\", deltaMetadata)\n const reasoningEmitted = state.reasoningEmitted || lifecycle.reasoning.has(\"reasoning-0\")\n\n if (delta?.content) {\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningMetadata(reasoningField, reasoningDetailsObserved ? state.reasoningDetails : undefined),\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.content)\n }\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 reasoningDetails: state.reasoningDetails,\n reasoningDetailsObserved,\n reasoningEmitted,\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 metadata = reasoningMetadata(\n state.reasoningField,\n state.reasoningDetailsObserved ? state.reasoningDetails : undefined,\n )\n const started =\n state.reasoningDetailsObserved && !state.reasoningEmitted\n ? Lifecycle.reasoningStart(state.lifecycle, events, \"reasoning-0\", reasoningMetadata(state.reasoningField))\n : state.lifecycle\n const ended = Lifecycle.reasoningEnd(started, events, \"reasoning-0\", metadata)\n const lifecycle = state.toolCallEvents.length ? Lifecycle.stepStart(ended, events) : ended\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: (request) => ({\n tools: ToolStream.empty<number>(),\n pendingTools: {},\n toolCallEvents: [],\n lifecycle: Lifecycle.initial(),\n reasoningField: request.model.compatibility?.reasoningField,\n reasoningDetails: [],\n reasoningDetailsObserved: false,\n reasoningEmitted: false,\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": "FBA4B66E2826312D64756E2164756E21", | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,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": "A7C647FE3BB2567964756E2164756E21", | ||
| "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/util/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 global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.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": ";qrBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,aAAa,EAAE,SAAU,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,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,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": "A266671956B7B9B464756E2164756E21", | ||
| "names": [] | ||
| } |
+1
-1
| { | ||
| "name": "@opencode-ai/cli-linux-arm64", | ||
| "version": "0.0.0-next-16006", | ||
| "version": "0.0.0-next-16008", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "repository": { |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/mini.ts", "src/mini-host.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { waitForCatalogReady } from \"./services/catalog\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => {\n if (input.model)\n await waitForCatalogReady({\n sdk: input.client,\n directory: input.location.directory,\n workspace: input.location.workspaceID,\n model: { providerID: input.model.providerID, modelID: input.model.id },\n signal: input.signal,\n })\n return {\n model: input.model,\n agent: requestedAgent\n ? await validateAgent(\n input.client,\n input.location.directory,\n input.location.workspaceID,\n requestedAgent,\n input.signal,\n )\n : input.agent,\n }\n }\n}\n\nasync function validateAgent(\n sdk: OpenCodeClient,\n directory: string,\n workspace: string | undefined,\n name?: string,\n signal?: AbortSignal,\n) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline && !signal?.aborted) {\n agents = await sdk.agent.list({ location: { directory, workspace } }, { signal }).catch((error) => {\n if (signal && error instanceof ClientError && error.reason === \"Transport\") throw error\n return undefined\n })\n const agent = agents?.data.find((item) => item.id === name)\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 if (agent) return name\n await setTimeout(25, undefined, { signal }).catch(() => {})\n }\n if (signal?.aborted) return\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths?: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths ?? {\n home: Global.Path.home,\n state: Global.Path.state,\n log: Global.Path.log,\n }\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": ";6iBAGA,0BAAS,6BCAT,uBACA,wBAAS,yBACT,yBACA,0BAAS,iBAEF,SAAM,OAA0B,+DASvC,cAAS,CAAW,CAAC,EAA4C,CAC/D,IAAM,EAAa,EAAgC,EAAK,KAAK,EAAW,YAAY,CAAC,EACrF,MAAO,MACC,eAAc,CAAC,EAAO,CAC1B,GAAI,CAAC,EAAO,OACZ,OAAO,EAAW,eAAe,CAAK,QAElC,YAAW,CAAC,EAAO,EAAS,CAChC,GAAI,CAAC,EAAO,OACZ,MAAM,EAAW,YAAY,EAAO,CAAO,EAAE,MAAM,IAAG,CAAG,OAAS,EAEtE,EAGF,SAAS,CAAM,CAAC,EAA2D,CACzE,MAAO,CACL,SAAS,CAAC,EAAU,CAClB,IAAI,EAAa,GAEjB,OADA,QAAQ,GAAG,EAAM,CAAQ,EAClB,IAAM,CACX,GAAI,CAAC,EAAY,OACjB,EAAa,GACb,QAAQ,IAAI,EAAM,CAAQ,GAGhC,EAGF,SAAS,CAAW,CAClB,EACA,EACkC,CAClC,GAAI,CAAC,QAAQ,IAAI,sBAAuB,OACxC,IAAM,EAAQ,IAAI,KAAK,EACpB,YAAY,EACZ,QAAQ,QAAS,EAAE,EACnB,QAAQ,UAAW,GAAG,EACnB,EAAS,EAAK,KAAK,EAAS,SAAU,GAAG,KAAS,EAAY,WAAW,EACzE,EAAO,CAAC,IACZ,KAAK,UAAU,EAAM,CAAC,EAAM,IAAW,OAAO,IAAU,SAAW,OAAO,CAAK,EAAI,EAAQ,CAAC,EAC9F,EAAG,UAAU,EAAK,QAAQ,CAAM,EAAG,CAAE,UAAW,EAAK,CAAC,EACtD,EAAG,cACD,EAAK,KAAK,EAAS,SAAU,aAAa,EAC1C,EAAK,CACH,KAAM,IAAI,KAAK,EAAE,YAAY,KAC1B,EACH,KAAM,CACR,CAAC,EAAI;AAAA,CACP,EACA,IAAM,EAAQ,CACZ,KAAK,CAAC,EAAc,EAAgB,CAClC,EAAG,eACD,EACA,EAAK,CACH,KAAM,IAAI,KAAK,EAAE,YAAY,EAC7B,IAAK,EAAY,IACjB,OACA,MACF,CAAC,EAAI;AAAA,CACP,EAEJ,EAMA,OALA,EAAM,MAAM,cAAe,CACzB,KAAM,EAAY,KAClB,IAAK,EAAY,IACjB,KAAM,CACR,CAAC,EACM,EAGT,SAAS,CAAiB,CAAC,EAAmC,CAC5D,OAAO,IAAI,EAAW,EAAG,SAAS,EAAQ,GAAG,CAAC,EAGzC,SAAS,CAAuB,CACrC,EAA2B,QAAQ,MACnC,EAA8C,EAC9C,EAA4B,QACV,CAClB,GAAI,EAAM,MAAO,MAAO,CAAE,QAAO,OAAO,EAAG,EAAG,EAC9C,IAAM,EAAS,IAAa,QAAU,SAAW,WACjD,GAAI,CACF,IAAM,EAAS,EAAK,CAAM,EACtB,EAAU,GACd,MAAO,CACL,MAAO,EACP,OAAO,EAAG,CACR,GAAI,EAAS,OACb,EAAU,GACV,EAAO,QAAQ,EAEnB,EACA,MAAO,EAAO,CACd,MAAU,MAAM,EAAyB,CAAE,MAAO,CAAM,CAAC,GAK7D,eAAsB,CAAwB,CAC5C,EACA,EAAkC,EAClC,CACA,IAAM,EAAW,EAAQ,EACzB,GAAI,CACF,OAAO,MAAM,EAAI,CAAQ,SACzB,CACA,EAAS,QAAQ,GAKd,SAAS,CAAc,CAAC,EAIlB,CACX,IAAM,EAAQ,EAAM,OAAS,CAC3B,KAAM,EAAO,KAAK,KAClB,MAAO,EAAO,KAAK,MACnB,IAAK,EAAO,KAAK,GACnB,EACM,EAAc,CAClB,IAAK,QAAQ,IACb,IAAK,EAAM,UACX,KAAM,QAAQ,KAAK,MAAM,CAAC,CAC5B,EACA,MAAO,CACL,SAAU,CAAE,MAAO,EAAM,SAAS,KAAM,EACxC,SAAU,QACV,OAAQ,CACN,KAAK,CAAC,EAAO,CACX,QAAQ,OAAO,MAAM,CAAK,EAE9B,EACA,MAAO,CACL,SAAU,CAAC,IAAQ,EAAS,IAAI,IAAI,CAAG,EAAG,MAAM,CAClD,EACA,OAAQ,MACA,KAAI,CAAC,EAAS,CAClB,IAAQ,cAAe,KAAa,0CACpC,OAAO,EAAW,CAAO,EAE7B,EACA,MAAO,CAAE,KAAM,EAAM,IAAK,EAC1B,QAAS,CACP,OAAQ,EAAO,QAAQ,EACvB,QAAS,EAAO,SAAS,CAC3B,EACA,QAAS,CACP,WAAY,CAAC,IAAK,MAAM,EAAE,SAAS,QAAQ,IAAI,oBAAoB,YAAY,GAAK,EAAE,EACtF,IAAK,IAAM,YAAY,IAAI,CAC7B,EACA,YAAa,CACX,MAAO,EAAY,EAAM,IAAK,CAAW,CAC3C,EACA,YAAa,EAAY,EAAM,KAAK,CACtC,EDhJF,MAAM,UAAuB,KAAM,CAAC,CAEpC,eAAsB,EAAO,CAAC,EAAyB,CACrD,GAAI,CACF,EAAS,CAAK,EACd,IAAM,EAAS,MAAM,EAAsB,MAAO,IAAa,CAC7D,IAAM,EAAe,EAAW,QAAQ,MAAM,MAAQ,OAAY,MAAM,EAAU,EAAG,EAAM,MAAM,EAC3F,EAAsB,yCACtB,EAAY,EAAe,EAC3B,EAAa,EAAqB,EAAM,MAAM,EAC9C,EAAM,EAAW,IACjB,EAAY,EAAW,EAAM,KAAK,EAClC,EAAQ,EAAY,CAAE,WAAY,EAAU,WAAY,QAAS,EAAU,EAAG,EAAI,OAClF,EAAU,EAAc,EAAM,KAAK,EACnC,EAAgB,MAAO,EAAyB,IAAwB,CAC5E,IAAM,EAAW,MAAM,EAAkB,CACvC,IAAK,EACL,UAAW,EAAW,UACtB,SACA,QAAS,CAAC,IACR,EAAqB,CACnB,SACA,SAAU,CAAE,WAAU,EACtB,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,KAAM,EAAM,KACZ,MAAO,EACP,MAAO,EAAM,MACb,UACA,QACF,CAAC,EAAE,MAAM,CAAC,IAAU,CAClB,GAAI,aAAiB,OAAS,EAAM,UAAY,oBAC9C,MAAM,IAAI,EAAe,EAAM,OAAO,EACxC,MAAM,EACP,CACL,CAAC,EACK,EAAS,EAAS,MACxB,MAAO,CACL,IAAK,EAAS,IACd,UAAW,EAAO,QAAQ,GAC1B,aAAc,EAAO,QAAQ,MAC7B,SAAU,EAAO,SACjB,MAAO,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC1F,QAAS,EAAO,OAAO,QACvB,MAAO,EAAO,MACd,OAAQ,EAAO,MACjB,GAEI,EAAS,CACb,EACA,EAMA,IAEA,EAAqB,CACnB,SACA,SAAU,CAAE,UAAW,EAAK,SAAS,UAAW,UAAW,EAAK,SAAS,WAAY,EACrF,MAAO,EAAK,MACZ,MAAO,EAAK,MACR,CAAE,WAAY,EAAK,MAAM,WAAY,GAAI,EAAK,MAAM,QAAS,QAAS,EAAK,OAAQ,EACnF,OACJ,UACA,QACF,CAAC,EAAE,KAAK,CAAC,KAAY,CACnB,UAAW,EAAO,QAAQ,GAC1B,aAAc,EAAO,QAAQ,MAC7B,SAAU,EAAO,SACjB,MAAO,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC1F,QAAS,EAAO,OAAO,QACvB,MAAO,EAAO,MACd,OAAQ,EACV,EAAE,EAEJ,OADiB,MAAM,GACP,gBAAgB,CAC9B,KAAM,EAAe,CAAE,WAAU,WAAU,CAAC,EAC5C,MACA,YACA,OAAQ,EACR,UAAW,EAAW,UACtB,cAAe,EACf,MAAO,EAAM,MACb,QACA,QAAS,GAAW,QACpB,MAAO,CAAC,EACR,eACA,OAAQ,EAAM,QAAU,GACxB,YAAa,EAAM,YACnB,KAAM,EAAM,KACZ,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EACF,EACD,GAAI,EAAO,WAAa,EAAG,QAAQ,KAAK,EAAO,QAAQ,EACvD,MAAO,EAAO,CACd,GAAI,aAAiB,GAAmB,aAAiB,OAAS,EAAM,UAAY,EAClF,EAAK,EAAM,OAAO,EACpB,MAAM,GAKH,SAAS,CAAoB,CAAC,EAAmC,CACtE,IAAM,EAAO,CAAC,IACZ,EAAS,KAAK,CACZ,QAAS,EAAS,IAClB,QAAS,EAAQ,QAAQ,CAAQ,CACnC,CAAC,EACG,EAAY,EAAM,UACxB,MAAO,CACL,IAAK,EAAK,EAAM,QAAQ,EACxB,UAAW,EACP,MAAO,IAAwB,CAC7B,IAAM,EAAW,MAAM,EAAU,CAAM,EACvC,OAAO,EAAK,CAAQ,GAEtB,MACN,EAIF,eAAsB,CAAoB,CAAC,EAKxC,CACD,IAAI,EAAM,EAAM,IAChB,MAAO,GACL,GAAI,CACF,MAAO,CAAE,MAAK,MAAO,MAAM,EAAM,QAAQ,CAAG,CAAE,EAC9C,MAAO,EAAO,CACd,GAAI,CAAC,EAAM,WAAa,EAAE,aAAiB,IAAgB,EAAM,SAAW,YAAa,MAAM,EAC/F,MAAO,GACL,GAAI,CACF,EAAM,MAAM,EAAM,UAAU,EAAM,MAAM,EACxC,MACA,MAAO,EAAc,CACrB,GAAI,EAAM,OAAO,QAAS,MAAM,EAChC,MAAM,EAAW,IAAK,OAAW,CAAE,OAAQ,EAAM,MAAO,CAAC,IAO5D,SAAS,CAAoB,EAAG,CACrC,GAAI,CAAC,QAAQ,OAAO,MAAO,EAAK,qCAAqC,EAIhE,SAAS,CAAU,CAAC,EAA2B,EAA4B,CAChF,GAAI,CAAC,EAAQ,OAAO,GAAS,OAC7B,GAAI,CAAC,EAAO,OAAO,EACnB,OAAO,EAAQ;AAAA,EAAO,EAGxB,SAAS,CAAQ,CAAC,EAAyB,CAEzC,GADA,EAAqB,EACjB,EAAM,cAAgB,SAAc,CAAC,OAAO,UAAU,EAAM,WAAW,GAAK,EAAM,aAAe,GACnG,EAAK,2CAA2C,EAElD,GAAI,EAAM,MAAQ,CAAC,EAAM,UAAY,CAAC,EAAM,QAAS,EAAK,yCAAyC,EAGrG,SAAS,CAAc,EAAW,CAChC,IAAM,EAAO,QAAQ,IAAI,KAAO,QAAQ,IAAI,EAC5C,GAAI,CAEF,OADA,QAAQ,MAAM,CAAI,EACX,QAAQ,IAAI,EACnB,KAAM,CACN,MAAM,IAAI,EAAe,iCAAiC,GAAM,GAIpE,SAAS,CAAU,CAAC,EAAgB,CAClC,GAAI,CACF,OAAO,EAAwB,CAAK,EACpC,KAAM,CACN,MAAM,IAAI,EAAe,sDAAsD,GAInF,SAAS,CAAa,CAAC,EAAmD,CACxE,MAAO,OAAO,IAAU,CACtB,GAAI,EAAM,MACR,MAAM,EAAoB,CACxB,IAAK,EAAM,OACX,UAAW,EAAM,SAAS,UAC1B,UAAW,EAAM,SAAS,YAC1B,MAAO,CAAE,WAAY,EAAM,MAAM,WAAY,QAAS,EAAM,MAAM,EAAG,EACrE,OAAQ,EAAM,MAChB,CAAC,EACH,MAAO,CACL,MAAO,EAAM,MACb,MAAO,EACH,MAAM,EACJ,EAAM,OACN,EAAM,SAAS,UACf,EAAM,SAAS,YACf,EACA,EAAM,MACR,EACA,EAAM,KACZ,GAIJ,eAAe,CAAa,CAC1B,EACA,EACA,EACA,EACA,EACA,CACA,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,KAAK,IAAI,EAAI,KAC1B,EACJ,MAAO,KAAK,IAAI,EAAI,GAAY,CAAC,GAAQ,QAAS,CAChD,EAAS,MAAM,EAAI,MAAM,KAAK,CAAE,SAAU,CAAE,YAAW,WAAU,CAAE,EAAG,CAAE,QAAO,CAAC,EAAE,MAAM,CAAC,IAAU,CACjG,GAAI,GAAU,aAAiB,GAAe,EAAM,SAAW,YAAa,MAAM,EAClF,OACD,EACD,IAAM,EAAQ,GAAQ,KAAK,KAAK,CAAC,IAAS,EAAK,KAAO,CAAI,EAC1D,GAAI,GAAO,OAAS,WAAY,CAC9B,EAAQ,UAAU,sEAAyE,EAC3F,OAEF,GAAI,EAAO,OAAO,EAClB,MAAM,EAAW,GAAI,OAAW,CAAE,QAAO,CAAC,EAAE,MAAM,IAAM,EAAE,EAE5D,GAAI,GAAQ,QAAS,OACrB,GAAI,CAAC,EAAQ,CACX,EAAQ,sDAAsD,EAC9D,OAEF,EAAQ,UAAU,6CAAgD,EAGpE,SAAS,CAAO,CAAC,EAAiB,CAChC,QAAQ,OAAO,MAAM,2BAA2B;AAAA,CAAW,EAG7D,SAAS,CAAI,CAAC,EAAwB,CACpC,QAAQ,OAAO,MAAM,gCAAgC;AAAA,CAAW,EAChE,QAAQ,KAAK,CAAC", | ||
| "debugId": "9DD95031ABBC46BB64756E2164756E21", | ||
| "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": ";qhBAOO,SAAM,OAAK,OAAW,UAAK,wBAAmB,OAmBxC,OAAS,MAAsB,MAAK,OAEpC,OAAY,MAAC,SAA+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": "CB1B39BE4F85243964756E2164756E21", | ||
| "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": "10280EA5ACB8F12E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "9AAADDC3C35BECB364756E2164756E21", | ||
| "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": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "A9D1C2CA39DA6D3C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/xai-images.ts", "../ai/src/providers/xai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport { GeneratedImage, ImageModel, ImageResponse, type ImageRequestFor, type ImageRoute } from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport {\n InvalidProviderOutputReason,\n LLMError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema\"\nimport { ProviderShared, optionalNull } from \"./shared\"\nimport { ImageInputs } from \"./utils/image-input\"\n\nconst ADAPTER = \"xai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.x.ai/v1\"\nexport const PATH = \"/images/generations\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type XAIImageString<Known extends string> = Known | (string & {})\n\nexport type XAIImageOptions = {\n readonly n?: number\n readonly aspectRatio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly aspect_ratio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly resolution?: XAIImageString<\"1k\" | \"2k\">\n readonly responseFormat?: XAIImageString<\"url\" | \"b64_json\">\n readonly response_format?: XAIImageString<\"url\" | \"b64_json\">\n} & Record<string, unknown>\n\ntype XAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\n\nconst XAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: optionalNull(Schema.String),\n url: optionalNull(Schema.String),\n revised_prompt: optionalNull(Schema.String),\n mime_type: optionalNull(Schema.String),\n }),\n ),\n usage: Schema.optional(Schema.Unknown),\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 http?: HttpOptions\n}\n\nconst nativeOptions = (options: XAIImageOptions | undefined) => {\n if (!options) return undefined\n const { aspectRatio, responseFormat, ...native } = options\n return {\n aspect_ratio: aspectRatio,\n response_format: responseFormat,\n ...native,\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\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<XAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"XAIImages.generate\")(function* (request: ImageRequestFor<XAIImageOptions>, execute) {\n const http = mergeHttpOptions(request.model.http, request.http)\n const imageReferences = (request.images ?? []).map((image) => {\n if (image.type === \"bytes\") return { url: ImageInputs.dataUrl(image), type: \"image_url\" as const }\n if (image.type === \"url\") return { url: image.url, type: \"image_url\" as const }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (imageReferences.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"xAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n image: imageReferences.length === 1 ? imageReferences[0] : undefined,\n images: imageReferences.length > 1 ? imageReferences : undefined,\n },\n nativeOptions(request.options),\n http?.body,\n ) as XAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${imageReferences.length === 0 ? PATH : EDIT_PATH}`,\n http?.query,\n )\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 xAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(XAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"xAI Images returned an invalid response\")),\n )\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n const mediaType = item.mime_type ?? \"application/octet-stream\"\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`xAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType,\n data,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`xAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"xAI Images returned no images\")\n const usage = ProviderShared.isRecord(decoded.usage) ? decoded.usage : undefined\n return new ImageResponse({\n images,\n usage: usage === undefined ? undefined : new Usage({ providerMetadata: { xai: usage } }),\n providerMetadata: usage === undefined ? undefined : { xai: { usage } },\n })\n }),\n }\n return ImageModel.make<XAIImageOptions>({ id: input.id, provider: \"xai\", route, http: input.http })\n}\n\nexport const XAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { HttpOptions, 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\"\nimport { XAIImages } from \"../protocols/xai-images\"\n\nexport const id = ProviderID.make(\"xai\")\n\nexport type ModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport type { XAIImageOptions } from \"../protocols/xai-images\"\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 const image = (modelID: string | ModelID) =>\n XAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL,\n headers: input.headers,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n return {\n id,\n model: responses,\n responses,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model = provider.model\nexport const responses = provider.responses\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "BEE5FD66BF44806864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/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 = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"next\") 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 legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\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 = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\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\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) 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 legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: OPENCODE_VERSION,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\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" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0A3213BE8D51E5D264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "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": "9470F49987143BCE64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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/util/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 SessionMessageInfo,\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 const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\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 prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = 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 writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\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 prePromotionError = undefined\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 && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n continue\n }\n if (!promoted) continue\n if (finalizing) 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\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\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 renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\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 renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\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 renderedTools.add(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 renderedTools.add(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 projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n id: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n callID: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { structured: item.state.structured, content: item.state.content, result: item.state.result },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({ ...item, state: { ...item.state, status: \"completed\" } })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return projected.found\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 if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n controller.abort()\n const found = await reconcile()\n if (!found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void 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 contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\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": "F5124D2EDA0B872464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/gemini.ts", "../ai/src/protocols/google-images.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 { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport {\n GeneratedImage,\n ImageModel,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport {\n InvalidProviderOutputReason,\n LLMError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n type ProviderMetadata,\n} from \"../schema\"\nimport { ProviderShared } from \"./shared\"\nimport { ImageInputs } from \"./utils/image-input\"\n\nconst ADAPTER = \"google-images\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\nexport type GoogleImageString<Known extends string> = Known | (string & {})\n\nexport type GoogleImageOptions = {\n readonly aspectRatio?: GoogleImageString<\n \"1:1\" | \"2:3\" | \"3:2\" | \"3:4\" | \"4:3\" | \"4:5\" | \"5:4\" | \"9:16\" | \"16:9\" | \"21:9\"\n >\n readonly imageSize?: GoogleImageString<\"1K\" | \"2K\" | \"4K\">\n readonly seed?: number\n readonly thinkingLevel?: GoogleImageString<\"MINIMAL\" | \"LOW\" | \"MEDIUM\" | \"HIGH\">\n readonly includeThoughts?: boolean\n} & Record<string, unknown>\n\nexport type GoogleImageBody = Record<string, unknown> & {\n readonly contents: ReadonlyArray<{\n readonly role: \"user\"\n readonly parts: ReadonlyArray<Record<string, unknown>>\n }>\n readonly generationConfig: Record<string, unknown>\n}\n\nconst GoogleUsage = Schema.StructWithRest(\n 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 promptTokensDetails: Schema.optional(Schema.Unknown),\n candidatesTokensDetails: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst GoogleImageResponse = Schema.Struct({\n candidates: Schema.optional(\n Schema.Array(\n Schema.Struct({\n index: Schema.optional(Schema.Number),\n content: Schema.optional(\n Schema.Struct({\n parts: Schema.Array(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n inlineData: Schema.optional(\n Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n ),\n }),\n ),\n }),\n ),\n finishReason: Schema.optional(Schema.String),\n finishMessage: Schema.optional(Schema.String),\n safetyRatings: Schema.optional(Schema.Unknown),\n citationMetadata: Schema.optional(Schema.Unknown),\n groundingMetadata: Schema.optional(Schema.Unknown),\n }),\n ),\n ),\n usageMetadata: Schema.optional(GoogleUsage),\n modelVersion: Schema.optional(Schema.String),\n responseId: Schema.optional(Schema.String),\n promptFeedback: Schema.optional(Schema.Unknown),\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 http?: HttpOptions\n}\n\nconst nativeOptions = (options: GoogleImageOptions | undefined) => {\n const { aspectRatio, imageSize, seed, thinkingLevel, includeThoughts, ...native } = options ?? {}\n const image = {\n aspectRatio,\n imageSize,\n }\n const thinkingConfig = {\n thinkingLevel,\n includeThoughts,\n }\n return (\n mergeJsonRecords(\n {\n responseModalities: [\"IMAGE\"],\n imageConfig: Object.values(image).some((value) => value !== undefined) ? image : undefined,\n seed,\n thinkingConfig: Object.values(thinkingConfig).some((value) => value !== undefined) ? thinkingConfig : undefined,\n },\n native,\n ) ?? { responseModalities: [\"IMAGE\"] }\n )\n}\n\nconst invalidOutput = (message: string, providerMetadata?: ProviderMetadata) =>\n new LLMError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER, providerMetadata }),\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\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<GoogleImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"GoogleImages.generate\")(function* (request: ImageRequestFor<GoogleImageOptions>, execute) {\n const imageParts = yield* Effect.forEach(request.images ?? [], googleImagePart)\n const http = mergeHttpOptions(request.model.http, request.http)\n const requestBody = mergeJsonRecords(\n {\n contents: [{ role: \"user\", parts: [{ text: request.prompt }, ...imageParts] }],\n generationConfig: nativeOptions(request.options),\n },\n http?.body,\n ) as GoogleImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}/models/${request.model.id}:generateContent`,\n http?.query,\n )\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 Google Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(GoogleImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"Google Images returned an invalid response\")),\n )\n const candidates = decoded.candidates ?? []\n const candidateMetadata = candidates.map((candidate, candidateIndex) => ({\n index: candidate.index ?? candidateIndex,\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n groundingMetadata: candidate.groundingMetadata,\n parts: (candidate.content?.parts ?? []).map((part) =>\n part.inlineData === undefined\n ? {\n type: \"text\",\n text: part.text,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n }\n : {\n type: \"inlineData\",\n mediaType: part.inlineData.mimeType,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n },\n ),\n }))\n const encoded = candidates.flatMap((candidate, candidateIndex) =>\n (candidate.content?.parts ?? []).flatMap((part, partIndex) =>\n part.inlineData === undefined || part.thought === true\n ? []\n : [{ candidate, candidateIndex, partIndex, inlineData: part.inlineData }],\n ),\n )\n const images = yield* Effect.forEach(encoded, (item) =>\n Effect.fromResult(Encoding.decodeBase64(item.inlineData.data)).pipe(\n Effect.mapError(() =>\n invalidOutput(\n `Google Images candidate ${item.candidateIndex} part ${item.partIndex} contains invalid base64 data`,\n ),\n ),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: item.inlineData.mimeType,\n data,\n providerMetadata: {\n google: {\n candidateIndex: item.candidate.index ?? item.candidateIndex,\n partIndex: item.partIndex,\n finishReason: item.candidate.finishReason,\n safetyRatings: item.candidate.safetyRatings,\n citationMetadata: item.candidate.citationMetadata,\n groundingMetadata: item.candidate.groundingMetadata,\n thoughtSignature: item.candidate.content?.parts[item.partIndex]?.thoughtSignature,\n },\n },\n }),\n ),\n ),\n )\n if (images.length === 0) {\n const finishReasons = candidates.flatMap((candidate) =>\n candidate.finishReason === undefined ? [] : [candidate.finishReason],\n )\n return yield* invalidOutput(\n `Google Images returned no final images${\n finishReasons.length === 0 ? \"\" : ` (finish reasons: ${finishReasons.join(\", \")})`\n }; inspect reason.providerMetadata.google for prompt feedback and candidate details`,\n {\n google: {\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n )\n }\n const usage = decoded.usageMetadata\n const outputTokens =\n usage?.candidatesTokenCount === undefined\n ? undefined\n : usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0)\n return new ImageResponse({\n images,\n usage:\n usage === undefined\n ? undefined\n : new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: ProviderShared.subtractTokens(\n usage.promptTokenCount,\n usage.cachedContentTokenCount,\n ),\n cacheReadInputTokens: usage.cachedContentTokenCount,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n }),\n providerMetadata: {\n google: {\n modelVersion: decoded.modelVersion,\n responseId: decoded.responseId,\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n })\n }),\n }\n return ImageModel.make<GoogleImageOptions>({ id: input.id, provider: \"google\", route, http: input.http })\n}\n\nconst googleImagePart = (image: ImageInput): Effect.Effect<Record<string, unknown>, LLMError> => {\n if (image.type === \"bytes\")\n return Effect.succeed({ inlineData: { mimeType: image.mediaType, data: Encoding.encodeBase64(image.data) } })\n if (image.type === \"file-uri\") return Effect.succeed({ fileData: { mimeType: image.mediaType, fileUri: image.uri } })\n if (image.type === \"url\")\n return ImageInputs.decodeDataUrl(image.url, ADAPTER).pipe(\n Effect.flatMap((decoded) => {\n if (decoded === undefined)\n return Effect.fail(\n ImageInputs.invalid(\n ADAPTER,\n \"Google generateContent does not fetch public image URLs; use bytes, a data URL, or a Gemini file URI\",\n ),\n )\n return Effect.succeed({\n inlineData: { mimeType: decoded.mediaType, data: Encoding.encodeBase64(decoded.data) },\n })\n }),\n )\n return Effect.fail(\n ImageInputs.invalid(ADAPTER, \"Google generateContent requires Gemini file URIs rather than provider file IDs\"),\n )\n}\n\nexport const GoogleImages = {\n model,\n} as const\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 { HttpOptions, ProviderID, mergeHttpOptions, type ModelID, type ProviderOptions } from \"../schema\"\nimport { Gemini } from \"../protocols/gemini\"\nimport { GoogleImages } from \"../protocols/google-images\"\n\nexport type { GoogleImageOptions } from \"../protocols/google-images\"\n\nexport const id = ProviderID.make(\"google\")\n\nexport const routes = [Gemini.route]\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\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 const image = (modelID: string | ModelID) =>\n GoogleImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n http: mergeHttpOptions(input.http === undefined ? undefined : HttpOptions.make(input.http)),\n })\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n image,\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\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D871D8E85A5F0B6064756E2164756E21", | ||
| "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 \"@opencode-ai/util/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 { App } from \"../app.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 app: App\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": "50658BD40F21A87064756E2164756E21", | ||
| "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": ";66BAAA,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,CAC1C,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": "F19BD5B958368ADF64756E2164756E21", | ||
| "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": "F00983A5F194B1CF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,EAAO,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": "38039D5DBB286AAA64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "8C2E101EFA5FCAC064756E2164756E21", | ||
| "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": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,CACH", | ||
| "debugId": "8C3F2FBBFCF6226164756E2164756E21", | ||
| "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": "724547B77B93B9C464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/catalog.ts", "src/util/io.ts", "src/session-target.ts"], | ||
| "sourcesContent": [ | ||
| "import { ClientError, type OpenCodeClient } from \"@opencode-ai/client/promise\"\n\n// Location plugins initialize asynchronously, so explicit model selection must\n// wait for that exact model before prompt admission. The execution path owns\n// the authoritative error if readiness times out.\nexport async function waitForCatalogReady(input: {\n sdk: OpenCodeClient\n directory: string\n workspace?: string\n model: { providerID: string; modelID: string }\n timeoutMs?: number\n signal?: AbortSignal\n}) {\n const deadline = Date.now() + (input.timeoutMs ?? 5_000)\n while (Date.now() < deadline && !input.signal?.aborted) {\n const models = await input.sdk.model\n .list(\n { location: { directory: input.directory, workspace: input.workspace } },\n { signal: input.signal },\n )\n .then((result) => result.data)\n .catch((error) => {\n if (input.signal && error instanceof ClientError && error.reason === \"Transport\") throw error\n return undefined\n })\n if (models?.some((model) => model.providerID === input.model.providerID && model.id === input.model.modelID)) return\n await wait(25, input.signal)\n }\n}\n\nfunction wait(delay: number, signal?: AbortSignal) {\n if (!signal) return new Promise<void>((resolve) => setTimeout(resolve, delay))\n if (signal.aborted) return Promise.resolve()\n return new Promise<void>((resolve) => {\n const timer = setTimeout(done, delay)\n signal.addEventListener(\"abort\", done, { once: true })\n function done() {\n clearTimeout(timer)\n signal?.removeEventListener(\"abort\", done)\n resolve()\n }\n })\n}\n", | ||
| "import { text } from \"node:stream/consumers\"\n\nexport function readStdin() {\n return text(process.stdin)\n}\n", | ||
| "import type { LocationGetOutput, ModelRef, OpenCodeClient, SessionInfo } from \"@opencode-ai/client/promise\"\nimport { Model } from \"@opencode-ai/schema/model\"\n\nconst SESSION_PAGE_LIMIT = 50\n\nexport type SessionTarget = {\n session: SessionInfo\n location: LocationGetOutput\n model: ModelRef | undefined\n agent: string | undefined\n resume: boolean\n}\n\nexport type SessionTargetPreparation = (input: {\n client: OpenCodeClient\n location: LocationGetOutput\n session: SessionInfo | undefined\n model: ModelRef | undefined\n agent: string | undefined\n signal?: AbortSignal\n}) => Promise<{ model: ModelRef | undefined; agent: string | undefined }>\n\nexport class SessionTargetMutationError extends Error {\n override readonly name = \"SessionTargetMutationError\"\n\n constructor(cause: unknown) {\n super(cause instanceof Error ? cause.message : \"Session target mutation failed\", { cause })\n }\n}\n\nexport async function resolveSessionTarget(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: ModelRef\n agent?: string\n prepare: SessionTargetPreparation\n signal?: AbortSignal\n}): Promise<SessionTarget> {\n const selection = await selectSession(input)\n const selected = selection.session\n const location =\n selection.location ??\n (await resolveLocation(\n input.client,\n selected ? { directory: selected.location.directory, workspace: selected.location.workspaceID } : input.location,\n input.signal,\n ))\n const prepared = await input.prepare({\n client: input.client,\n location,\n session: selected,\n model: input.model ?? selected?.model,\n agent: input.agent ?? selected?.agent,\n signal: input.signal,\n })\n const session =\n selected ??\n (await input.client.session\n .create(\n {\n agent: prepared.agent,\n model: prepared.model,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n },\n ...requestOptions(input.signal),\n )\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n }))\n return {\n session,\n location,\n model: prepared.model,\n agent: prepared.agent,\n resume: selected !== undefined,\n }\n}\n\nexport function parseSessionTargetModel(value?: string): ModelRef | undefined {\n if (!value) return\n const model = Model.Ref.parse(value)\n return { providerID: model.providerID, id: model.id, variant: model.variant }\n}\n\nasync function selectSession(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n signal?: AbortSignal\n}) {\n const explicit = input.session\n ? await input.client.session.get({ sessionID: input.session }, ...requestOptions(input.signal)).catch((error) => {\n if (error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"SessionNotFoundError\")\n return undefined\n throw error\n })\n : undefined\n if (input.session && !explicit) throw new Error(\"Session not found\")\n if (explicit)\n return {\n session: input.fork\n ? await input.client.session\n .fork({ sessionID: explicit.id }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : explicit,\n }\n if (!input.continue) return { session: undefined }\n\n const location = await resolveLocation(input.client, input.location, input.signal)\n const selected = await latestSession(input.client, location, undefined, input.signal)\n if (!selected) return { session: undefined, location }\n return {\n session: input.fork\n ? await input.client.session.fork({ sessionID: selected.id }, ...requestOptions(input.signal)).catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : selected,\n }\n}\n\nasync function latestSession(\n client: OpenCodeClient,\n location: LocationGetOutput,\n cursor?: string,\n signal?: AbortSignal,\n): Promise<SessionInfo | undefined> {\n const page = await client.session.list(\n {\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n limit: SESSION_PAGE_LIMIT,\n order: \"desc\",\n ...(cursor ? { cursor } : {}),\n },\n ...requestOptions(signal),\n )\n const selected = page.data.find(\n (session) =>\n session.location.directory === location.directory && session.location.workspaceID === location.workspaceID,\n )\n if (selected) return selected\n if (!page.cursor.next || page.data.length === 0) return\n return latestSession(client, location, page.cursor.next, signal)\n}\n\nfunction resolveLocation(\n client: OpenCodeClient,\n location?: { directory?: string; workspace?: string },\n signal?: AbortSignal,\n) {\n if (!location && !signal) return client.location.get()\n if (!location) return client.location.get(undefined, { signal })\n return client.location.get({ location }, ...requestOptions(signal))\n}\n\nfunction requestOptions(signal?: AbortSignal): [] | [{ signal: AbortSignal }] {\n return signal ? [{ signal }] : []\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "1651A23FFC7E921064756E2164756E21", | ||
| "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": "785133A9050484F264756E2164756E21", | ||
| "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/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": "756178589AFEE7D264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": "7B19C79549B809C664756E2164756E21", | ||
| "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": ";+0BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,EACnD,CACH", | ||
| "debugId": "708CBF61CC3A534864756E2164756E21", | ||
| "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/util/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 global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.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": ";qrBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,aAAa,EAAE,SAAU,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,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,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": "A266671956B7B9B464756E2164756E21", | ||
| "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((body) => {\n const sourceAssistants = request.messages.filter((message) => message.role === \"assistant\")\n let assistantIndex = 0\n const messages = body.messages.map((message) => {\n if (message.role !== \"assistant\") return message\n const source = sourceAssistants[assistantIndex++]\n const reasoning = source?.content\n .filter((part) => part.type === \"reasoning\")\n .map((part) => part.text)\n .join(\"\")\n const reasoningDetails = Array.isArray(message.reasoning_details) ? message.reasoning_details : undefined\n return {\n ...message,\n reasoning_content: undefined,\n reasoning_text: undefined,\n reasoning: reasoning && reasoningDetails && reasoningDetails.length > 0 ? reasoning : undefined,\n reasoning_details: reasoningDetails,\n }\n })\n return {\n ...body,\n messages,\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": ";wjBAWO,SAAM,OAAmC,OAAS,gBAC5C,OAAK,OAAW,UAAK,OAAQ,aAAQ,OAC5C,OAAU,kBAmBV,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,IAAI,CAAC,IAAS,CACnB,IAAM,EAAmB,EAAQ,SAAS,OAAO,CAAC,IAAY,EAAQ,OAAS,WAAW,EACtF,EAAiB,EACf,EAAW,EAAK,SAAS,IAAI,CAAC,IAAY,CAC9C,GAAI,EAAQ,OAAS,YAAa,OAAO,EAEzC,IAAM,EADS,EAAiB,MACN,QACvB,OAAO,CAAC,IAAS,EAAK,OAAS,WAAW,EAC1C,IAAI,CAAC,IAAS,EAAK,IAAI,EACvB,KAAK,EAAE,EACJ,EAAmB,MAAM,QAAQ,EAAQ,iBAAiB,EAAI,EAAQ,kBAAoB,OAChG,MAAO,IACF,EACH,kBAAmB,OACnB,eAAgB,OAChB,UAAW,GAAa,GAAoB,EAAiB,OAAS,EAAI,EAAY,OACtF,kBAAmB,CACrB,EACD,EACD,MAAO,IACF,EACH,cACG,EAAY,EAAQ,iBAAiB,UAAU,CACpD,EACD,CACH,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": "CA44D002C2E6109C64756E2164756E21", | ||
| "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": ";66BAAA,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,CAC5C,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": "A605F4AF0F04164664756E2164756E21", | ||
| "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/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/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(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\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 {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"beta\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n observability: {\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(\n process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER,\n ),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n instanceID,\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: OPENCODE_VERSION,\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 truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\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": "69F71F63E2E7BD8264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/image-input.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding } from \"effect\"\nimport type { ImageInput } from \"../../image\"\nimport { InvalidRequestReason, LLMError } from \"../../schema\"\n\nconst invalid = (module: string, message: string) =>\n new LLMError({\n module,\n method: \"generate\",\n reason: new InvalidRequestReason({ message }),\n })\n\nexport const dataUrl = (input: Extract<ImageInput, { readonly type: \"bytes\" }>) =>\n `data:${input.mediaType};base64,${Encoding.encodeBase64(input.data)}`\n\nexport const decodeDataUrl = (\n url: string,\n module: string,\n): Effect.Effect<{ readonly mediaType: string; readonly data: Uint8Array } | undefined, LLMError> => {\n if (!url.startsWith(\"data:\")) return Effect.succeed(undefined)\n const match = /^data:([^;,]+);base64,(.*)$/s.exec(url)\n if (!match) return Effect.fail(invalid(module, \"Image data URLs must contain a MIME type and base64 data\"))\n return Effect.fromResult(Encoding.decodeBase64(match[2])).pipe(\n Effect.mapError(() => invalid(module, \"Image data URL contains invalid base64 data\")),\n Effect.map((data) => ({ mediaType: match[1], data })),\n )\n}\n\nexport const invalidImageInput = invalid\n\nexport const ImageInputs = {\n dataUrl,\n decodeDataUrl,\n invalid: invalidImageInput,\n} as const\n" | ||
| ], | ||
| "mappings": ";mHAIA,SAAM,EAAU,CAAC,EAAgB,IAC/B,IAAI,EAAS,CACX,SACA,OAAQ,WACR,OAAQ,IAAI,EAAqB,CAAE,SAAQ,CAAC,CAC9C,CAAC,EAEU,EAAU,CAAC,IACtB,QAAQ,EAAM,oBAAoB,EAAS,aAAa,EAAM,IAAI,IAEvD,EAAgB,CAC3B,EACA,IACmG,CACnG,GAAI,CAAC,EAAI,WAAW,OAAO,EAAG,OAAO,EAAO,QAAQ,MAAS,EAC7D,IAAM,EAAQ,+BAA+B,KAAK,CAAG,EACrD,GAAI,CAAC,EAAO,OAAO,EAAO,KAAK,EAAQ,EAAQ,0DAA0D,CAAC,EAC1G,OAAO,EAAO,WAAW,EAAS,aAAa,EAAM,EAAE,CAAC,EAAE,KACxD,EAAO,SAAS,IAAM,EAAQ,EAAQ,6CAA6C,CAAC,EACpF,EAAO,IAAI,CAAC,KAAU,CAAE,UAAW,EAAM,GAAI,MAAK,EAAE,CACtD,GAGW,EAAoB,EAEpB,EAAc,CACzB,UACA,gBACA,QAAS,CACX", | ||
| "debugId": "119647D36351F86D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/identifier.ts", "../schema/src/project-id.ts", "../schema/src/workspace-id.ts", "../schema/src/location.ts", "../schema/src/event.ts", "../schema/src/money.ts", "../schema/src/integration-id.ts", "../schema/src/credential.ts", "../schema/src/connection.ts", "../schema/src/integration.ts", "../schema/src/provider.ts", "../schema/src/model.ts"], | ||
| "sourcesContent": [ | ||
| "const length = 26\nconst chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nlet lastTimestamp = 0\nlet counter = 0\n\nexport function ascending() {\n return create(false)\n}\n\nexport function descending() {\n return create(true)\n}\n\nexport function create(descending: boolean, timestamp = Date.now()) {\n if (timestamp !== lastTimestamp) {\n lastTimestamp = timestamp\n counter = 0\n }\n counter++\n\n const current = BigInt(timestamp) * 0x1000n + BigInt(counter)\n const value = descending ? ~current : current\n const time = Array.from({ length: 6 }, (_, index) =>\n Number((value >> BigInt(40 - 8 * index)) & 0xffn)\n .toString(16)\n .padStart(2, \"0\"),\n ).join(\"\")\n const bytes = crypto.getRandomValues(new Uint8Array(length - 12))\n return time + Array.from(bytes, (byte) => chars[byte % 62]).join(\"\")\n}\n", | ||
| "import { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const ProjectID = Schema.String.pipe(\n Schema.brand(\"Project.ID\"),\n statics((schema) => ({ global: schema.make(\"global\") })),\n)\nexport type ProjectID = typeof ProjectID.Type\n", | ||
| "import { Schema } from \"effect\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const WorkspaceID = Schema.String.check(Schema.isStartsWith(\"wrk\")).pipe(\n Schema.brand(\"WorkspaceV2.ID\"),\n statics((schema) => {\n const create = () => schema.make(\"wrk_\" + ascending())\n return {\n ascending: (id?: string) => {\n if (!id) return create()\n if (!id.startsWith(\"wrk\")) throw new Error(`ID ${id} does not start with wrk`)\n return schema.make(id)\n },\n create,\n }\n }),\n)\nexport type WorkspaceID = typeof WorkspaceID.Type\n", | ||
| "export * as Location from \"./location.js\"\n\nimport { Schema } from \"effect\"\nimport { AbsolutePath, optional } from \"./schema.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n}).annotate({ identifier: \"Location.Ref\" })\n\nexport class Info extends Schema.Class<Info>(\"Location.Info\")({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n project: Schema.Struct({\n id: ProjectID,\n directory: AbsolutePath,\n }),\n}) {}\n\nexport function response<S extends Schema.Top>(data: S) {\n return Schema.Struct({ location: Info, data })\n}\n", | ||
| "export * as Event from \"./event.js\"\n\nimport { Schema, SchemaTransformation } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Location } from \"./location.js\"\nimport { DateTimeUtcFromMillis, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"evt_\")).pipe(\n Schema.brand(\"Event.ID\"),\n statics((schema) => ({ create: () => schema.make(\"evt_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\n/**\n * Position in one aggregate's durable log. Values originate from the durable\n * event envelope and synced markers;\n * `after` cursors accept only values that came from those sources.\n */\nexport const Seq = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(Schema.brand(\"Event.Seq\"))\nexport type Seq = typeof Seq.Type\n\n/** Durable schema version of one event type, from the event definition that committed it. */\nexport const Version = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).pipe(Schema.brand(\"Event.Version\"))\nexport type Version = typeof Version.Type\n\nconst DurableEnvelope = Schema.Struct({ aggregateID: Schema.String, seq: Seq, version: Version })\nexport type DurableEnvelope = typeof DurableEnvelope.Type\n\nexport type DurableDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"durable\"\n readonly durable: {\n readonly version: number\n readonly aggregate: string\n }\n readonly data: DataSchema\n}\n\nexport type EphemeralDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"ephemeral\"\n readonly durable?: never\n readonly data: DataSchema\n}\n\nexport type Definition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = DurableDefinition<Type, DataSchema> | EphemeralDefinition<Type, DataSchema>\n\nexport type Data<D extends Definition> = Schema.Schema.Type<D[\"data\"]>\n\ntype PayloadBase<D extends Definition> = {\n readonly id: ID\n readonly type: D[\"type\"]\n readonly created: typeof DateTimeUtcFromMillis.Type\n readonly data: Data<D>\n readonly location?: Location.Ref\n readonly metadata?: Record<string, unknown>\n}\n\nexport type Payload<D extends Definition = Definition> = D extends DurableDefinition\n ? PayloadBase<D> & { readonly durable: DurableEnvelope }\n : PayloadBase<D> & { readonly durable?: never }\n\ntype Input<Type extends string, Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>> = {\n readonly type: Type\n readonly identifier?: string\n readonly durable?: {\n readonly version: number\n readonly aggregate: string\n }\n readonly schema: Fields\n}\n\nexport function durable<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Input<Type, Fields> & { readonly durable: NonNullable<Input<Type, Fields>[\"durable\"]> }) {\n const data = Schema.Struct(input.schema)\n const durable = Schema.Struct({\n aggregateID: DurableEnvelope.fields.aggregateID,\n seq: DurableEnvelope.fields.seq,\n version: Schema.Literal(input.durable.version).pipe(\n Schema.decodeTo(\n Schema.toType(Version),\n SchemaTransformation.transform({\n decode: () => Version.make(input.durable.version),\n encode: () => input.durable.version,\n }),\n ),\n ),\n })\n return Schema.Struct({\n id: ID,\n created: DateTimeUtcFromMillis,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n durable,\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"durable\" as const,\n durable: input.durable,\n data,\n })),\n ) satisfies DurableDefinition<Type, typeof data>\n}\n\nexport function ephemeral<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Omit<Input<Type, Fields>, \"durable\">) {\n const data = Schema.Struct(input.schema)\n return Schema.Struct({\n id: ID,\n created: DateTimeUtcFromMillis,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"ephemeral\" as const,\n durable: undefined,\n data,\n })),\n ) satisfies EphemeralDefinition<Type, typeof data>\n}\n\nexport function inventory<const Definitions extends ReadonlyArray<Definition>>(...definitions: Definitions) {\n return Object.freeze(definitions)\n}\n\nexport function latest(definitions: ReadonlyArray<Definition>) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n const existing = result.get(definition.type)\n if (!existing) {\n result.set(definition.type, definition)\n return result\n }\n if (definition.durable && existing.durable && definition.durable.version !== existing.durable.version) {\n if (definition.durable.version > existing.durable.version) result.set(definition.type, definition)\n return result\n }\n if (definition !== existing) throw new Error(`Duplicate latest event definition for ${definition.type}`)\n return result\n }, new Map<string, Definition>()),\n )\n}\n\nexport function versionedType(type: string, version: number) {\n return `${type}.${version}`\n}\n\nexport function durableMap<const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n if (definition.durability !== \"durable\") return result\n const key = versionedType(definition.type, definition.durable.version)\n if (result.has(key)) throw new Error(`Duplicate durable event definition for ${key}`)\n result.set(key, definition)\n return result\n }, new Map<string, DurableDefinition>()),\n )\n}\n\nfunction readonlyMap<Key, Value>(map: Map<Key, Value>): ReadonlyMap<Key, Value> {\n const result: ReadonlyMap<Key, Value> = Object.freeze({\n get size() {\n return map.size\n },\n entries: () => map.entries(),\n forEach: (callback: (value: Value, key: Key, map: ReadonlyMap<Key, Value>) => void, thisArg?: unknown) =>\n map.forEach((value, key) => callback.call(thisArg, value, key, result)),\n get: (key: Key) => map.get(key),\n has: (key: Key) => map.has(key),\n keys: () => map.keys(),\n values: () => map.values(),\n [Symbol.iterator]: () => map[Symbol.iterator](),\n })\n return result\n}\n", | ||
| "export * as Money from \"./money.js\"\n\nimport { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const USD = Schema.Finite.pipe(\n Schema.brand(\"Money.USD\"),\n Schema.annotate({ identifier: \"Money.USD\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USD = typeof USD.Type\n\nexport const USDPerMillionTokens = Schema.Finite.pipe(\n Schema.brand(\"Money.USDPerMillionTokens\"),\n Schema.annotate({ identifier: \"Money.USDPerMillionTokens\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USDPerMillionTokens = typeof USDPerMillionTokens.Type\n", | ||
| "import { Schema } from \"effect\"\n\nexport const IntegrationID = Schema.String.pipe(Schema.brand(\"Integration.ID\"))\nexport type IntegrationID = typeof IntegrationID.Type\n\nexport const IntegrationMethodID = Schema.String.pipe(Schema.brand(\"Integration.MethodID\"))\nexport type IntegrationMethodID = typeof IntegrationMethodID.Type\n", | ||
| "export * as Credential from \"./credential.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { IntegrationMethodID } from \"./integration-id.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"Credential.ID\"),\n statics((schema) => ({ create: () => schema.make(\"cred_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport interface OAuth extends Schema.Schema.Type<typeof OAuth> {}\nexport const OAuth = Schema.Struct({\n type: Schema.Literal(\"oauth\"),\n methodID: IntegrationMethodID,\n refresh: Schema.String,\n access: Schema.String,\n expires: NonNegativeInt,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n}).annotate({ identifier: \"Credential.OAuth\" })\n\nexport interface Key extends Schema.Schema.Type<typeof Key> {}\nexport const Key = Schema.Struct({\n type: Schema.Literal(\"key\"),\n key: Schema.String,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n}).annotate({ identifier: \"Credential.Key\" })\n\nexport const Value = Schema.Union([OAuth, Key])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Credential.Value\" })\nexport type Value = Schema.Schema.Type<typeof Value>\n", | ||
| "export * as Connection from \"./connection.js\"\n\nimport { Schema } from \"effect\"\nimport { Credential } from \"./credential.js\"\n\nexport interface CredentialInfo extends Schema.Schema.Type<typeof CredentialInfo> {}\nexport const CredentialInfo = Schema.Struct({\n type: Schema.Literal(\"credential\"),\n id: Credential.ID,\n label: Schema.String,\n}).annotate({ identifier: \"Connection.CredentialInfo\" })\n\nexport interface EnvInfo extends Schema.Schema.Type<typeof EnvInfo> {}\nexport const EnvInfo = Schema.Struct({\n type: Schema.Literal(\"env\"),\n name: Schema.String,\n}).annotate({ identifier: \"Connection.EnvInfo\" })\n\nexport const Info = Schema.Union([CredentialInfo, EnvInfo])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Connection.Info\" })\nexport type Info = typeof Info.Type\n", | ||
| "export * as Integration from \"./integration.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { Connection } from \"./connection.js\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\nimport { IntegrationID, IntegrationMethodID } from \"./integration-id.js\"\n\nexport const ID = IntegrationID\nexport type ID = typeof ID.Type\n\nexport const MethodID = IntegrationMethodID\nexport type MethodID = typeof MethodID.Type\n\nexport interface When extends Schema.Schema.Type<typeof When> {}\nexport const When = Schema.Struct({\n key: Schema.String,\n op: Schema.Literals([\"eq\", \"neq\"]),\n value: Schema.String,\n}).annotate({ identifier: \"Integration.When\" })\n\nexport interface TextPrompt extends Schema.Schema.Type<typeof TextPrompt> {}\nexport const TextPrompt = Schema.Struct({\n type: Schema.Literal(\"text\"),\n key: Schema.String,\n message: Schema.String,\n placeholder: optional(Schema.String),\n when: optional(When),\n}).annotate({ identifier: \"Integration.TextPrompt\" })\n\nexport interface SelectPrompt extends Schema.Schema.Type<typeof SelectPrompt> {}\nexport const SelectPrompt = Schema.Struct({\n type: Schema.Literal(\"select\"),\n key: Schema.String,\n message: Schema.String,\n options: Schema.Array(\n Schema.Struct({\n label: Schema.String,\n value: Schema.String,\n hint: optional(Schema.String),\n }),\n ),\n when: optional(When),\n}).annotate({ identifier: \"Integration.SelectPrompt\" })\n\nexport const Prompt = Schema.Union([TextPrompt, SelectPrompt]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type Prompt = typeof Prompt.Type\n\nexport interface OAuthMethod extends Schema.Schema.Type<typeof OAuthMethod> {}\nexport const OAuthMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"oauth\"),\n label: Schema.String,\n prompts: optional(Schema.Array(Prompt)),\n}).annotate({ identifier: \"Integration.OAuthMethod\" })\n\nexport interface CommandMethod extends Schema.Schema.Type<typeof CommandMethod> {}\nexport const CommandMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"command\"),\n label: Schema.String,\n command: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.CommandMethod\" })\n\nexport interface KeyMethod extends Schema.Schema.Type<typeof KeyMethod> {}\nexport const KeyMethod = Schema.Struct({\n type: Schema.Literal(\"key\"),\n label: optional(Schema.String),\n}).annotate({ identifier: \"Integration.KeyMethod\" })\n\nexport interface EnvMethod extends Schema.Schema.Type<typeof EnvMethod> {}\nexport const EnvMethod = Schema.Struct({\n type: Schema.Literal(\"env\"),\n names: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.EnvMethod\" })\n\nexport const Method = Schema.Union([OAuthMethod, CommandMethod, KeyMethod, EnvMethod])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Integration.Method\" })\nexport type Method = typeof Method.Type\n\nexport const Inputs = Schema.Record(Schema.String, Schema.String).annotate({ identifier: \"Integration.Inputs\" })\nexport type Inputs = typeof Inputs.Type\n\nconst Updated = ephemeral({\n type: \"integration.updated\",\n schema: {},\n})\nconst ConnectionUpdated = ephemeral({\n type: \"integration.connection.updated\",\n schema: { integrationID: ID },\n})\nexport const Event = { Updated, ConnectionUpdated, Definitions: inventory(Updated, ConnectionUpdated) }\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n id: ID,\n name: Schema.String,\n}).annotate({ identifier: \"Integration.Ref\" })\n\nexport const Info = Schema.Struct({\n id: ID,\n name: Schema.String,\n methods: Schema.Array(Method),\n connections: Schema.Array(Connection.Info),\n}).annotate({ identifier: \"Integration.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const AttemptID = Schema.String.pipe(\n Schema.brand(\"Integration.AttemptID\"),\n statics((schema) => ({ create: () => schema.make(\"con_\" + ascending()) })),\n)\nexport type AttemptID = typeof AttemptID.Type\n\nconst AttemptTime = Schema.Struct({\n created: Schema.Number,\n expires: Schema.Number,\n})\n\nexport class Attempt extends Schema.Class<Attempt>(\"Integration.Attempt\")({\n attemptID: AttemptID,\n url: Schema.String,\n instructions: Schema.String,\n mode: Schema.Literals([\"auto\", \"code\"]),\n time: AttemptTime,\n}) {}\n\nexport const AttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.AttemptStatus\" })\nexport type AttemptStatus = typeof AttemptStatus.Type\n\nexport interface CommandAttempt extends Schema.Schema.Type<typeof CommandAttempt> {}\nexport const CommandAttempt = Schema.Struct({\n attemptID: AttemptID,\n time: AttemptTime,\n}).annotate({ identifier: \"Integration.CommandAttempt\" })\n\nexport const CommandAttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), message: optional(Schema.String), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.CommandAttemptStatus\" })\nexport type CommandAttemptStatus = typeof CommandAttemptStatus.Type\n", | ||
| "export * as Provider from \"./provider.js\"\n\nimport { Effect, Schema } from \"effect\"\nimport { Integration } from \"./integration.js\"\nimport { optional, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"ProviderV2.ID\"),\n statics((schema) => ({\n opencode: schema.make(\"opencode\"),\n anthropic: schema.make(\"anthropic\"),\n openai: schema.make(\"openai\"),\n google: schema.make(\"google\"),\n googleVertex: schema.make(\"google-vertex\"),\n githubCopilot: schema.make(\"github-copilot\"),\n amazonBedrock: schema.make(\"amazon-bedrock\"),\n azure: schema.make(\"azure\"),\n openrouter: schema.make(\"openrouter\"),\n mistral: schema.make(\"mistral\"),\n gitlab: schema.make(\"gitlab\"),\n })),\n)\nexport type ID = typeof ID.Type\n\nexport const Package = Schema.String\nexport type Package = typeof Package.Type\n\nexport const Overlays = {\n settings: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n headers: Schema.Record(Schema.String, Schema.String).pipe(optional),\n body: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n}\n\nexport const Settings = Schema.Record(Schema.String, Schema.Json).annotate({ identifier: \"Provider.Settings\" })\nexport type Settings = typeof Settings.Type\n\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\nexport const Request = Schema.Struct({\n settings: Settings.pipe(Schema.withConstructorDefault(Effect.succeed({}))),\n headers: Schema.Record(Schema.String, Schema.String),\n body: Schema.Record(Schema.String, Schema.Json),\n}).annotate({ identifier: \"Provider.Request\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n integrationID: Integration.ID.pipe(optional),\n name: Schema.String,\n disabled: Schema.Boolean.pipe(optional),\n package: Package,\n ...Overlays,\n})\n .annotate({ identifier: \"ProviderV2.Info\" })\n .pipe(\n statics(() => ({\n empty: (id: ID): Info => ({ id, name: id, package: \"\" }),\n })),\n )\n", | ||
| "export * as Model from \"./model.js\"\n\nimport { Schema } from \"effect\"\nimport { optional, statics } from \"./schema.js\"\nimport { Provider } from \"./provider.js\"\nimport { Money } from \"./money.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Model.ID\"))\nexport type ID = typeof ID.Type\n\nexport const VariantID = Schema.String.pipe(Schema.brand(\"Model.VariantID\"))\nexport type VariantID = typeof VariantID.Type\n\nexport const Ref = Schema.Struct({\n id: ID,\n providerID: Provider.ID,\n variant: VariantID.pipe(optional),\n})\n .annotate({ identifier: \"Model.Ref\" })\n .pipe(\n statics((schema) => ({\n parse: (input: string) => {\n const providerEnd = input.indexOf(\"/\")\n if (providerEnd <= 0) throw new Error(`Invalid model reference: ${input}`)\n const providerID = input.slice(0, providerEnd)\n const variantStart = input.indexOf(\"#\", providerEnd + 1)\n const id = input.slice(providerEnd + 1, variantStart === -1 ? undefined : variantStart)\n const variant = variantStart === -1 ? undefined : input.slice(variantStart + 1)\n if (!id || providerID.includes(\"#\") || (variant !== undefined && (!variant || variant.includes(\"#\"))))\n throw new Error(`Invalid model reference: ${input}`)\n return schema.make({\n providerID: Provider.ID.make(providerID),\n id: ID.make(id),\n ...(variant ? { variant: VariantID.make(variant) } : {}),\n })\n },\n })),\n )\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\n\nexport const Family = Schema.String.pipe(Schema.brand(\"Model.Family\"))\nexport type Family = typeof Family.Type\n\nexport interface Capabilities extends Schema.Schema.Type<typeof Capabilities> {}\nexport const Capabilities = Schema.Struct({\n tools: Schema.Boolean,\n input: Schema.Array(Schema.String),\n output: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Model.Capabilities\" })\n\nexport interface Cost extends Schema.Schema.Type<typeof Cost> {}\nexport const Cost = Schema.Struct({\n tier: Schema.Struct({\n type: Schema.tag(\"context\"),\n size: Schema.Int,\n }).pipe(optional),\n input: Money.USDPerMillionTokens,\n output: Money.USDPerMillionTokens,\n cache: Schema.Struct({\n read: Money.USDPerMillionTokens,\n write: Money.USDPerMillionTokens,\n }),\n}).annotate({ identifier: \"Model.Cost\" })\n\nexport interface Variant extends Schema.Schema.Type<typeof Variant> {}\nexport const Variant = Schema.Struct({\n id: VariantID,\n ...Provider.Overlays,\n}).annotate({ identifier: \"Model.Variant\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n modelID: ID,\n providerID: Provider.ID,\n family: Family.pipe(optional),\n name: Schema.String,\n package: Provider.Package.pipe(optional),\n ...Provider.Overlays,\n capabilities: Capabilities,\n variants: Schema.Array(Variant),\n time: Schema.Struct({\n released: Schema.Finite,\n }),\n cost: Schema.Array(Cost),\n status: Schema.Literals([\"alpha\", \"beta\", \"deprecated\", \"active\"]),\n enabled: Schema.Boolean,\n limit: Schema.Struct({\n context: Schema.Int,\n input: Schema.Int.pipe(optional),\n output: Schema.Int,\n }),\n})\n .annotate({ identifier: \"Model.Info\" })\n .pipe(\n statics(() => ({\n empty: (providerID: Provider.ID, id: ID) =>\n ({\n id,\n modelID: id,\n providerID,\n name: id,\n capabilities: { tools: false, input: [], output: [] },\n variants: [],\n time: { released: 0 },\n cost: [],\n status: \"active\",\n enabled: true,\n limit: { context: 0, output: 0 },\n }) satisfies Info,\n })),\n )\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "EF478CB74FCBF1BC64756E2164756E21", | ||
| "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": "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", | ||
| "debugId": "3CB01C2851098DD564756E2164756E21", | ||
| "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": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "B0232AD7946D45B064756E2164756E21", | ||
| "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": "741EAB9563D6410A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAGA,IAAM,EAAiD,mBACjD,EAAiD,OAGhD,IAAM,EAAiB", | ||
| "debugId": "A79637B518439A0064756E2164756E21", | ||
| "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 { ImageOptions, ImageRequest, ImageRequestFor, ImageResponse } from \"./image\"\nimport type { LLMError } from \"./schema\"\n\nexport type Execute = RequestExecutor.Interface[\"execute\"]\n\nexport interface Interface {\n readonly generate: <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n ) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/ImageClient\") {}\n\nexport const generate = <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n): 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, Service, type Execute as ImageExecute } from \"./image-client\"\n\nexport interface ImageRoute<Options extends ImageOptions = ImageOptions> {\n readonly id: string\n readonly generate: (\n request: ImageRequestFor<Options>,\n execute: ImageExecute,\n ) => Effect.Effect<ImageResponse, LLMError>\n}\n\nexport type ImageOptions = Record<string, unknown>\n\nexport class ImageModel<Options extends ImageOptions = ImageOptions> {\n declare protected readonly _Options: (options: Options) => Options\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n\n constructor(input: ImageModel.Input<Options>) {\n this.id = input.id\n this.provider = input.provider\n this.route = input.route\n this.http = input.http\n }\n\n static make<Options extends ImageOptions = ImageOptions>(input: ImageModel.MakeInput<Options>) {\n return new ImageModel<Options>({\n id: ModelID.make(input.id),\n provider: ProviderID.make(input.provider),\n route: input.route,\n http: input.http,\n })\n }\n}\n\nexport namespace ImageModel {\n export interface Input<Options extends ImageOptions = ImageOptions> {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n }\n\n export interface MakeInput<Options extends ImageOptions = ImageOptions>\n extends Omit<Input<Options>, \"id\" | \"provider\"> {\n readonly id: string | ModelID\n readonly provider: string | ProviderID\n }\n}\n\nexport const ImageModelSchema = Schema.declare((value): value is ImageModel => value instanceof ImageModel, {\n expected: \"Image.Model\",\n})\n\nconst ImageBytesInput = Schema.Struct({\n type: Schema.Literal(\"bytes\"),\n data: Schema.Uint8Array,\n mediaType: Schema.String,\n})\nconst ImageUrlInput = Schema.Struct({\n type: Schema.Literal(\"url\"),\n url: Schema.String,\n})\nconst ImageFileIDInput = Schema.Struct({\n type: Schema.Literal(\"file-id\"),\n id: Schema.String,\n})\nconst ImageFileURIInput = Schema.Struct({\n type: Schema.Literal(\"file-uri\"),\n uri: Schema.String,\n mediaType: Schema.String,\n})\n\nexport const ImageInputSchema = Schema.Union([\n ImageBytesInput,\n ImageUrlInput,\n ImageFileIDInput,\n ImageFileURIInput,\n]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type ImageInput = Schema.Schema.Type<typeof ImageInputSchema>\n\nexport const ImageInput = {\n bytes: (data: Uint8Array, mediaType: string): ImageInput => ({ type: \"bytes\", data, mediaType }),\n url: (url: string): ImageInput => ({ type: \"url\", url }),\n file: (id: string): ImageInput => ({ type: \"file-id\", id }),\n fileUri: (uri: string, mediaType: string): ImageInput => ({ type: \"file-uri\", uri, mediaType }),\n} as const\n\nexport class ImageRequest extends Schema.Class<ImageRequest>(\"Image.Request\")({\n model: ImageModelSchema,\n prompt: Schema.String,\n images: Schema.optional(Schema.Array(ImageInputSchema)),\n options: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n http: Schema.optional(HttpOptions),\n}) {\n declare protected readonly _ImageRequest: void\n}\n\nexport type ImageRequestFor<Options extends ImageOptions = ImageOptions> = Omit<ImageRequest, \"model\" | \"options\"> & {\n readonly model: ImageModel<Options>\n readonly options?: Options\n}\n\nexport type ImageModelOptions<Model> = Model extends ImageModel<infer Options> ? Options : never\n\nexport type ImageRequestInput<Model extends object = ImageModel> = Omit<\n ConstructorParameters<typeof ImageRequest>[0],\n \"model\" | \"options\" | \"http\"\n> & {\n readonly model: Model\n readonly options?: NoInfer<ImageModelOptions<Model>>\n readonly http?: HttpOptions.Input\n} & (Model extends ImageModel<ImageModelOptions<Model>> ? unknown : never)\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 function request<const Model extends object>(\n input: ImageRequestInput<Model>,\n): ImageRequestFor<ImageModelOptions<Model>>\nexport function request(input: ImageRequest): ImageRequest\nexport function request(input: ImageRequest | ImageRequestInput) {\n if (input instanceof ImageRequest) return input\n return new ImageRequest({\n ...input,\n model: input.model as unknown as ImageModel,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n}\n\nexport function generate<const Model extends object>(\n input: ImageRequestInput<Model>,\n): Effect.Effect<ImageResponse, LLMError, Service>\nexport function generate(input: ImageRequest): Effect.Effect<ImageResponse, LLMError, Service>\nexport function generate(input: ImageRequest | ImageRequestInput) {\n return Effect.try({\n try: () => (input instanceof ImageRequest ? input : 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((request) => ImageClient.generate(request as unknown as ImageRequestFor<ImageOptions>)))\n}\n\nexport const Image = {\n request,\n generate,\n} as const\n" | ||
| ], | ||
| "mappings": ";0MAaO,WAAM,eAAgB,EAAQ,QAA4B,EAAE,uBAAuB,CAAE,CAAC,CAUtF,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,ECjBO,MAAM,CAAwD,CAE1D,GACA,SACA,MACA,KAET,WAAW,CAAC,EAAkC,CAC5C,KAAK,GAAK,EAAM,GAChB,KAAK,SAAW,EAAM,SACtB,KAAK,MAAQ,EAAM,MACnB,KAAK,KAAO,EAAM,WAGb,KAAiD,CAAC,EAAsC,CAC7F,OAAO,IAAI,EAAoB,CAC7B,GAAI,EAAQ,KAAK,EAAM,EAAE,EACzB,SAAU,EAAW,KAAK,EAAM,QAAQ,EACxC,MAAO,EAAM,MACb,KAAM,EAAM,IACd,CAAC,EAEL,CAiBO,IAAM,EAAmB,EAAO,QAAQ,CAAC,IAA+B,aAAiB,EAAY,CAC1G,SAAU,aACZ,CAAC,EAEK,EAAkB,EAAO,OAAO,CACpC,KAAM,EAAO,QAAQ,OAAO,EAC5B,KAAM,EAAO,WACb,UAAW,EAAO,MACpB,CAAC,EACK,EAAgB,EAAO,OAAO,CAClC,KAAM,EAAO,QAAQ,KAAK,EAC1B,IAAK,EAAO,MACd,CAAC,EACK,EAAmB,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,SAAS,EAC9B,GAAI,EAAO,MACb,CAAC,EACK,EAAoB,EAAO,OAAO,CACtC,KAAM,EAAO,QAAQ,UAAU,EAC/B,IAAK,EAAO,OACZ,UAAW,EAAO,MACpB,CAAC,EAEY,EAAmB,EAAO,MAAM,CAC3C,EACA,EACA,EACA,CACF,CAAC,EAAE,KAAK,EAAO,cAAc,MAAM,CAAC,EAU7B,MAAM,UAAqB,EAAO,MAAoB,eAAe,EAAE,CAC5E,MAAO,EACP,OAAQ,EAAO,OACf,OAAQ,EAAO,SAAS,EAAO,MAAM,CAAgB,CAAC,EACtD,QAAS,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EACrE,KAAM,EAAO,SAAS,CAAW,CACnC,CAAC,CAAE,CAEH,CAkBO,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": "7EB40FB69048C63064756E2164756E21", | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,GADQ,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": "A7C647FE3BB2567964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "B22977C5D69FA8F964756E2164756E21", | ||
| "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/util/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": "CA9156F00EA13B0864756E2164756E21", | ||
| "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 config: {\n update: (update) => runServicePromise(config.update(update)),\n },\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,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,CACF,CAAC,CACH,EACD,CACH", | ||
| "debugId": "2052B4722717971764756E2164756E21", | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,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,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": "C438659FAA988AEB64756E2164756E21", | ||
| "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": ";00BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "3D18391EA78871E664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": ";66BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,EAC/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": "8036730A7197E0FA64756E2164756E21", | ||
| "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": ";ujBAOO,SAAM,OAAK,OAAW,UAAK,2BAAsB,OAiB3C,OAAS,MAAC,OAAkB,UAAK,OAExC,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": "E0FCE86E12FEFD2464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../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 !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. 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": ";0cAoBO,SAAM,OAAU,OAAO,QAAG,oCAA+B,OAAE,cAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,EAAK,UAAY,SAAS,EACjG,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CACjD,EACA,EACA,CACA,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC", | ||
| "debugId": "559E6EF5AFB302A164756E2164756E21", | ||
| "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, HttpClientResponse } from \"effect/unstable/http\"\nimport {\n ImageModel,\n GeneratedImage,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth\"\nimport {\n InvalidProviderOutputReason,\n LLMError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema\"\nimport { ProviderShared } from \"./shared\"\nimport { ImageInputs } from \"./utils/image-input\"\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\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type OpenAIImageString<Known extends string> = Known | (string & {})\n\nexport type OpenAIImageOptions = {\n readonly mask?: ImageInput\n readonly n?: number\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly moderation?: OpenAIImageString<\"auto\" | \"low\">\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly outputCompression?: number\n} & Record<string, unknown>\n\nexport type OpenAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\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 http?: HttpOptions\n}\n\nconst nativeOptions = (options: OpenAIImageOptions | undefined) => {\n if (!options) return undefined\n const { mask: _, outputFormat, outputCompression, ...native } = options\n return {\n output_format: outputFormat,\n output_compression: outputCompression,\n ...native,\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\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<OpenAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"OpenAIImages.generate\")(function* (request: ImageRequestFor<OpenAIImageOptions>, execute) {\n const mask = request.options?.mask\n if (mask !== undefined && (request.images?.length ?? 0) === 0)\n return yield* ImageInputs.invalid(ADAPTER, \"An OpenAI image mask requires at least one input image\")\n const http = mergeHttpOptions(request.model.http, request.http)\n const sourceImages = request.images ?? []\n const multipartImages = yield* Effect.forEach(sourceImages, (image) => {\n if (image.type === \"bytes\") return Effect.succeed({ data: image.data, mediaType: image.mediaType })\n if (image.type === \"url\") return ImageInputs.decodeDataUrl(image.url, ADAPTER)\n return Effect.succeed(undefined)\n })\n const multipartMask =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { data: mask.data, mediaType: mask.mediaType }\n : mask.type === \"url\"\n ? yield* ImageInputs.decodeDataUrl(mask.url, ADAPTER)\n : undefined\n const useMultipart =\n sourceImages.length > 0 &&\n multipartImages.every((image) => image !== undefined) &&\n (mask === undefined || multipartMask !== undefined)\n const path = sourceImages.length === 0 ? PATH : EDIT_PATH\n const url = applyQuery(`${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${path}`, http?.query)\n\n if (useMultipart) {\n const form = new FormData()\n form.append(\"model\", request.model.id)\n form.append(\"prompt\", request.prompt)\n Object.entries(mergeJsonRecords(nativeOptions(request.options), http?.body) ?? {}).forEach(([key, value]) => {\n if ([\"model\", \"prompt\", \"image\", \"image[]\", \"images\", \"mask\"].includes(key)) return\n form.append(key, typeof value === \"string\" ? value : ProviderShared.encodeJson(value))\n })\n multipartImages.forEach((image, index) => {\n if (image === undefined) return\n form.append(\"image[]\", imageBlob(image.data, image.mediaType), `image-${index}`)\n })\n if (multipartMask !== undefined)\n form.append(\"mask\", imageBlob(multipartMask.data, multipartMask.mediaType), \"mask\")\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: \"[multipart/form-data]\",\n headers: Headers.remove(Headers.fromInput({ ...input.headers, ...http?.headers }), \"content-type\"),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(HttpClientRequest.setHeaders(headers), HttpClientRequest.bodyFormData(form)),\n )\n return yield* parseResponse(response, request.options, http?.body)\n }\n\n const references = sourceImages.map((image) => {\n if (image.type === \"bytes\") return { image_url: ImageInputs.dataUrl(image) }\n if (image.type === \"url\") return { image_url: image.url }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (references.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const maskReference =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { image_url: ImageInputs.dataUrl(mask) }\n : mask.type === \"url\"\n ? { image_url: mask.url }\n : mask.type === \"file-id\"\n ? { file_id: mask.id }\n : undefined\n if (mask !== undefined && maskReference === undefined)\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts masks as URLs, data URLs, bytes, or file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n images: references.length === 0 ? undefined : references,\n mask: maskReference,\n },\n nativeOptions(request.options),\n http?.body,\n ) as OpenAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\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 return yield* parseResponse(response, request.options, http?.body)\n }),\n }\n return ImageModel.make<OpenAIImageOptions>({ id: input.id, provider: \"openai\", route, http: input.http })\n}\n\nconst parseResponse = Effect.fn(\"OpenAIImages.parseResponse\")(function* (\n response: HttpClientResponse.HttpClientResponse,\n options: OpenAIImageOptions | undefined,\n overlay: Record<string, unknown> | undefined,\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 requestBody = mergeJsonRecords(nativeOptions(options), overlay)\n const format =\n decoded.output_format ?? (typeof requestBody?.output_format === \"string\" ? requestBody.output_format : \"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\nconst imageBlob = (data: Uint8Array, mediaType: string) => {\n const buffer = new ArrayBuffer(data.byteLength)\n new Uint8Array(buffer).set(data)\n return new Blob([buffer], { type: mediaType })\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 OpenAIImageString } 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 }\n\nexport interface ImageGenerationOptions {\n readonly action?: OpenAIImageString<\"auto\" | \"generate\" | \"edit\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly inputFidelity?: OpenAIImageString<\"low\" | \"high\">\n readonly outputCompression?: number\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly partialImages?: number\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\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, ...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 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 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": "2782C69AAA6A04AA64756E2164756E21", | ||
| "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": ";+0BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "9ACC856DE1AF0E2064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "7A113230590D497C64756E2164756E21", | ||
| "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": ";83BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,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,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": "2A70DC944264601764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "F2BD269CDA912CB964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/prompt.ts", "../schema/src/shell.ts", "../schema/src/session-error.ts", "../schema/src/session-id.ts", "../schema/src/permission.ts", "../schema/src/agent.ts", "../schema/src/skill.ts", "../schema/src/snapshot.ts", "../schema/src/token-usage.ts", "../schema/src/session-message.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { statics } from \"./schema.js\"\n\nexport interface PromptMention extends Schema.Schema.Type<typeof PromptMention> {}\nexport const PromptMention = Schema.Struct({\n start: Schema.Finite,\n end: Schema.Finite,\n text: Schema.String,\n}).annotate({ identifier: \"Prompt.Mention\" })\n\nexport const FileSource = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"inline\") }),\n Schema.Struct({ type: Schema.Literal(\"uri\"), uri: Schema.String }),\n])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Prompt.FileSource\" })\nexport type FileSource = typeof FileSource.Type\n\nexport const Base64 = Schema.String.check(\n Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/),\n).annotate({ identifier: \"Prompt.Base64\" })\nexport type Base64 = typeof Base64.Type\n\nexport interface FileAttachment extends Schema.Schema.Type<typeof FileAttachment> {}\nexport const FileAttachment = Schema.Struct({\n data: Base64,\n mime: Schema.String,\n source: FileSource,\n name: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mention: PromptMention.pipe(optional),\n})\n .annotate({ identifier: \"Prompt.FileAttachment\" })\n .pipe(\n statics((schema) => ({\n create: (input: FileAttachment) =>\n schema.make({\n data: input.data,\n mime: input.mime,\n source: input.source,\n name: input.name,\n description: input.description,\n mention: input.mention,\n }),\n })),\n )\n\nexport interface AgentAttachment extends Schema.Schema.Type<typeof AgentAttachment> {}\nexport const AgentAttachment = Schema.Struct({\n name: Schema.String,\n mention: PromptMention.pipe(optional),\n}).annotate({ identifier: \"Prompt.AgentAttachment\" })\n\nexport interface Prompt extends Schema.Schema.Type<typeof Prompt> {}\nexport const Prompt = Schema.Struct({\n text: Schema.String,\n files: Schema.Array(FileAttachment).pipe(optional),\n agents: Schema.Array(AgentAttachment).pipe(optional),\n})\n .annotate({ identifier: \"Prompt\" })\n .pipe(\n statics((schema) => ({\n equivalence: Schema.toEquivalence(schema),\n fromUserMessage: (input: Pick<Prompt, \"text\" | \"files\" | \"agents\">) =>\n schema.make({\n text: input.text,\n ...(input.files === undefined ? {} : { files: input.files }),\n ...(input.agents === undefined ? {} : { agents: input.agents }),\n }),\n })),\n )\n", | ||
| "export * as Shell from \"./shell.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\n\nconst IDSchema = Schema.String.check(Schema.isStartsWith(\"sh_\")).pipe(Schema.brand(\"Shell.ID\"))\n\nexport const ID = IDSchema.pipe(\n statics((schema: typeof IDSchema) => {\n const create = () => schema.make(\"sh_\" + ascending())\n return {\n create,\n ascending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type ID = typeof ID.Type\n\nexport const Status = Schema.Literals([\"running\", \"exited\", \"timeout\", \"killed\"])\nexport type Status = typeof Status.Type\n\nexport const Time = Schema.Struct({\n started: Schema.Finite,\n completed: optional(Schema.Finite),\n})\nexport interface Time extends Schema.Schema.Type<typeof Time> {}\n\n// Opaque caller-supplied tags echoed back on Info and events. The Shell service never interprets\n// these; callers (e.g. ShellTool stores the originating session ID) use them to filter or correlate.\nexport const Metadata = Schema.Record(Schema.String, Schema.Unknown)\nexport type Metadata = typeof Metadata.Type\n\nexport const Info = Schema.Struct({\n id: ID,\n status: Status,\n command: Schema.String,\n cwd: Schema.String,\n shell: Schema.String,\n // Absolute path of the file capturing combined stdout/stderr. Page through it via `output`.\n file: Schema.String,\n pid: optional(NonNegativeInt),\n exit: optional(Schema.Finite),\n // Always present; defaults to an empty object when the creator supplies no metadata.\n metadata: Metadata,\n time: Time,\n}).annotate({ identifier: \"Shell.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nconst Created = ephemeral({ type: \"shell.created\", schema: { info: Info } })\nconst Exited = ephemeral({ type: \"shell.exited\", schema: { id: ID, exit: optional(Schema.Finite), status: Status } })\nconst Deleted = ephemeral({ type: \"shell.deleted\", schema: { id: ID } })\nexport const Event = { Created, Exited, Deleted, Definitions: inventory(Created, Exited, Deleted) }\n\nexport const CreateInput = Schema.Struct({\n command: Schema.String,\n cwd: optional(Schema.String),\n timeout: NonNegativeInt,\n metadata: optional(Metadata),\n})\nexport interface CreateInput extends Schema.Schema.Type<typeof CreateInput> {}\n\nexport const OutputInput = Schema.Struct({\n cursor: optional(NonNegativeInt),\n limit: optional(NonNegativeInt),\n})\nexport interface OutputInput extends Schema.Schema.Type<typeof OutputInput> {}\n\nexport const Output = Schema.Struct({\n output: Schema.String,\n // Absolute cursor after this page. Equals `size` once fully caught up.\n cursor: NonNegativeInt,\n // Total bytes captured so far. A consumer has more to page while `cursor < size`.\n size: NonNegativeInt,\n truncated: Schema.Boolean,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n", | ||
| "export * as SessionError from \"./session-error.js\"\n\nimport { Schema } from \"effect\"\n\nexport interface Error extends Schema.Schema.Type<typeof Error> {}\nexport const Error = Schema.Struct({\n type: Schema.String,\n message: Schema.String,\n}).annotate({ identifier: \"Session.StructuredError\" })\n", | ||
| "import { Schema } from \"effect\"\nimport { descending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const SessionID = Schema.String.check(Schema.isStartsWith(\"ses\")).pipe(\n Schema.brand(\"SessionID\"),\n statics((schema) => {\n const create = () => schema.make(\"ses_\" + descending())\n return {\n create,\n descending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type SessionID = typeof SessionID.Type\n", | ||
| "export * as Permission from \"./permission.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"per\")).pipe(\n Schema.brand(\"PermissionV2.ID\"),\n statics((schema) => ({ create: (id?: string) => schema.make(id ?? \"per_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Source = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"tool\"),\n messageID: Schema.String,\n callID: Schema.String,\n }),\n]).annotate({ identifier: \"PermissionV2.Source\" })\nexport type Source = typeof Source.Type\n\nconst RequestFields = {\n sessionID: SessionID,\n action: Schema.String,\n resources: Schema.Array(Schema.String),\n save: Schema.Array(Schema.String).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n source: Source.pipe(optional),\n}\n\nexport const Request = Schema.Struct({\n id: ID,\n ...RequestFields,\n}).annotate({ identifier: \"PermissionV2.Request\" })\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\n\nexport const Reply = Schema.Literals([\"once\", \"always\", \"reject\"]).annotate({ identifier: \"PermissionV2.Reply\" })\nexport type Reply = typeof Reply.Type\n\nconst Asked = ephemeral({ type: \"permission.v2.asked\", schema: Request.fields })\nconst Replied = ephemeral({\n type: \"permission.v2.replied\",\n schema: {\n sessionID: SessionID,\n requestID: ID,\n reply: Reply,\n },\n})\nexport const Event = { Asked, Replied, Definitions: inventory(Asked, Replied) }\n\nexport const Effect = Schema.Literals([\"allow\", \"deny\", \"ask\"]).annotate({ identifier: \"PermissionV2.Effect\" })\nexport type Effect = typeof Effect.Type\n\nexport interface Rule extends Schema.Schema.Type<typeof Rule> {}\nexport const Rule = Schema.Struct({\n action: Schema.String,\n resource: Schema.String,\n effect: Effect,\n}).annotate({ identifier: \"PermissionV2.Rule\" })\n\nexport const Ruleset = Schema.Array(Rule).annotate({ identifier: \"PermissionV2.Ruleset\" })\nexport type Ruleset = typeof Ruleset.Type\n", | ||
| "export * as Agent from \"./agent.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Permission } from \"./permission.js\"\nimport { Provider } from \"./provider.js\"\nimport { PositiveInt, statics } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"agent.updated\", schema: {} })\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Agent.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Agent.Name\"))\nexport type Name = typeof Name.Type\n\nexport const Color = Schema.Union([\n Schema.String.check(Schema.isPattern(/^#[0-9a-fA-F]{6}$/)),\n Schema.Literals([\"primary\", \"secondary\", \"accent\", \"success\", \"warning\", \"error\", \"info\"]),\n]).annotate({ identifier: \"Agent.Color\" })\nexport type Color = typeof Color.Type\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n model: Model.Ref.pipe(optional),\n request: Provider.Request,\n system: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mode: Schema.Literals([\"subagent\", \"primary\", \"all\"]),\n hidden: Schema.Boolean,\n color: Color.pipe(optional),\n steps: PositiveInt.pipe(optional),\n permissions: Permission.Ruleset,\n})\n .annotate({ identifier: \"Agent.Info\" })\n .pipe(\n statics(() => ({\n empty: (id: ID) =>\n ({\n id,\n name: Name.make(id),\n request: { settings: {}, headers: {}, body: {} },\n mode: \"all\",\n hidden: false,\n permissions: [\n { action: \"*\", resource: \"*\", effect: \"allow\" },\n { action: \"external_directory\", resource: \"*\", effect: \"ask\" },\n ],\n }) satisfies Info,\n })),\n )\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Skill from \"./skill.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { AbsolutePath } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Skill.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Skill.Name\"))\nexport type Name = typeof Name.Type\n\nexport interface DirectorySource extends Schema.Schema.Type<typeof DirectorySource> {}\nexport const DirectorySource = Schema.Struct({\n type: Schema.tag(\"directory\"),\n path: AbsolutePath,\n}).annotate({ identifier: \"Skill.DirectorySource\" })\n\nexport interface UrlSource extends Schema.Schema.Type<typeof UrlSource> {}\nexport const UrlSource = Schema.Struct({\n type: Schema.tag(\"url\"),\n url: Schema.String,\n}).annotate({ identifier: \"Skill.UrlSource\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n description: Schema.String.pipe(optional),\n slash: Schema.Boolean.pipe(optional),\n autoinvoke: Schema.Boolean.pipe(optional),\n location: AbsolutePath,\n content: Schema.String,\n}).annotate({ identifier: \"Skill.Info\" })\n\nconst Updated = ephemeral({ type: \"skill.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface EmbeddedSource extends Schema.Schema.Type<typeof EmbeddedSource> {}\nexport const EmbeddedSource = Schema.Struct({\n type: Schema.tag(\"embedded\"),\n skill: Schema.suspend(() => Info),\n}).annotate({ identifier: \"Skill.EmbeddedSource\" })\n\nexport type Source = DirectorySource | UrlSource | EmbeddedSource\nexport const Source = Object.assign(\n Schema.Union([DirectorySource, UrlSource, EmbeddedSource]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Skill.Source\" }),\n ),\n {\n equals: (a: Source, b: Source) => {\n if (a.type !== b.type) return false\n if (a.type === \"directory\" && b.type === \"directory\") return a.path === b.path\n if (a.type === \"url\" && b.type === \"url\") return a.url === b.url\n if (a.type === \"embedded\" && b.type === \"embedded\") return a.skill.id === b.skill.id\n return false\n },\n key: (source: Source) =>\n source.type === \"directory\"\n ? `directory:${source.path}`\n : source.type === \"url\"\n ? `url:${source.url}`\n : `embedded:${source.skill.id}`,\n },\n)\n", | ||
| "export * as Snapshot from \"./snapshot.js\"\n\nimport { Schema } from \"effect\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Snapshot.ID\"))\nexport type ID = typeof ID.Type\n", | ||
| "export * as TokenUsage from \"./token-usage.js\"\n\nimport { Schema } from \"effect\"\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n input: Schema.Finite,\n output: Schema.Finite,\n reasoning: Schema.Finite,\n cache: Schema.Struct({\n read: Schema.Finite,\n write: Schema.Finite,\n }),\n}).annotate({ identifier: \"TokenUsage.Info\" })\n", | ||
| "export * as SessionMessage from \"./session-message.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ToolContent } from \"./llm.js\"\nimport { Model } from \"./model.js\"\nimport { Prompt } from \"./prompt.js\"\nimport { DateTimeUtcFromMillis, PositiveInt, RelativePath, statics } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Event } from \"./event.js\"\nimport { Shell as ShellSchema } from \"./shell.js\"\nimport { FinishReason } from \"./llm.js\"\nimport { SessionError } from \"./session-error.js\"\nimport { Agent } from \"./agent.js\"\nimport { Skill as SkillSchema } from \"./skill.js\"\nimport { Money } from \"./money.js\"\nimport { Snapshot } from \"./snapshot.js\"\nimport { TokenUsage } from \"./token-usage.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"msg_\")).pipe(\n Schema.brand(\"Session.Message.ID\"),\n statics((schema) => ({\n create: () => schema.make(\"msg_\" + ascending()),\n fromEvent: (eventID: Event.ID) => schema.make(eventID.replace(/^evt_/, \"msg_\")),\n })),\n)\nexport type ID = typeof ID.Type\n\nconst Base = {\n id: ID,\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n time: Schema.Struct({ created: DateTimeUtcFromMillis }),\n}\n\nexport const ProviderState = Schema.Record(Schema.String, Schema.Unknown).annotate({\n identifier: \"Session.Message.ProviderState\",\n})\nexport type ProviderState = typeof ProviderState.Type\n\nexport interface AgentSelected extends Schema.Schema.Type<typeof AgentSelected> {}\nexport const AgentSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"agent-switched\"),\n agent: Agent.ID,\n}).annotate({ identifier: \"Session.Message.AgentSelected\" })\n\nexport interface ModelSelected extends Schema.Schema.Type<typeof ModelSelected> {}\nexport const ModelSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"model-switched\"),\n model: Model.Ref,\n previous: Model.Ref.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ModelSelected\" })\n\nexport interface User extends Schema.Schema.Type<typeof User> {}\nexport const User = Schema.Struct({\n ...Base,\n text: Prompt.fields.text,\n files: Prompt.fields.files,\n agents: Prompt.fields.agents,\n type: Schema.tag(\"user\"),\n}).annotate({ identifier: \"Session.Message.User\" })\n\nexport interface Synthetic extends Schema.Schema.Type<typeof Synthetic> {}\nexport const Synthetic = Schema.Struct({\n ...Base,\n text: Schema.String,\n description: Schema.String.pipe(optional),\n type: Schema.tag(\"synthetic\"),\n}).annotate({ identifier: \"Session.Message.Synthetic\" })\n\nexport interface System extends Schema.Schema.Type<typeof System> {}\nexport const System = Schema.Struct({\n ...Base,\n type: Schema.tag(\"system\"),\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.System\" })\n\nexport interface Skill extends Schema.Schema.Type<typeof Skill> {}\nexport const Skill = Schema.Struct({\n ...Base,\n type: Schema.tag(\"skill\"),\n skill: SkillSchema.ID,\n name: SkillSchema.Name,\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.Skill\" })\n\nexport interface Shell extends Schema.Schema.Type<typeof Shell> {}\nexport const Shell = Schema.Struct({\n ...Base,\n type: Schema.tag(\"shell\"),\n shellID: ShellSchema.ID,\n command: Schema.String,\n status: ShellSchema.Status,\n exit: Schema.Number.pipe(optional),\n output: ShellSchema.Output.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Shell\" })\n\nexport interface ToolStateStreaming extends Schema.Schema.Type<typeof ToolStateStreaming> {}\nexport const ToolStateStreaming = Schema.Struct({\n status: Schema.tag(\"streaming\"),\n input: Schema.String,\n}).annotate({ identifier: \"Session.Message.ToolState.Streaming\" })\n\nexport interface ToolStateRunning extends Schema.Schema.Type<typeof ToolStateRunning> {}\nexport const ToolStateRunning = Schema.Struct({\n status: Schema.tag(\"running\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n structured: Schema.Record(Schema.String, Schema.Unknown),\n content: ToolContent.pipe(Schema.Array),\n}).annotate({ identifier: \"Session.Message.ToolState.Running\" })\n\nexport interface ToolStateCompleted extends Schema.Schema.Type<typeof ToolStateCompleted> {}\nexport const ToolStateCompleted = Schema.Struct({\n status: Schema.tag(\"completed\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n content: ToolContent.pipe(Schema.Array),\n structured: Schema.Record(Schema.String, Schema.Unknown),\n result: Schema.Unknown.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Completed\" })\n\nexport interface ToolStateError extends Schema.Schema.Type<typeof ToolStateError> {}\nexport const ToolStateError = Schema.Struct({\n status: Schema.tag(\"error\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n content: ToolContent.pipe(Schema.Array),\n structured: Schema.Record(Schema.String, Schema.Unknown),\n error: SessionError.Error,\n result: Schema.Unknown.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Error\" })\n\nexport const ToolState = Schema.Union([ToolStateStreaming, ToolStateRunning, ToolStateCompleted, ToolStateError]).pipe(\n Schema.toTaggedUnion(\"status\"),\n)\nexport type ToolState = ToolStateStreaming | ToolStateRunning | ToolStateCompleted | ToolStateError\n\nexport interface AssistantTool extends Schema.Schema.Type<typeof AssistantTool> {}\nexport const AssistantTool = Schema.Struct({\n type: Schema.tag(\"tool\"),\n id: Schema.String,\n name: Schema.String,\n executed: Schema.Boolean.pipe(optional),\n providerState: ProviderState.pipe(optional),\n providerResultState: ProviderState.pipe(optional),\n state: ToolState,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n ran: DateTimeUtcFromMillis.pipe(optional),\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant.Tool\" })\n\nexport interface AssistantText extends Schema.Schema.Type<typeof AssistantText> {}\nexport const AssistantText = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.Assistant.Text\" })\n\nexport interface AssistantReasoning extends Schema.Schema.Type<typeof AssistantReasoning> {}\nexport const AssistantReasoning = Schema.Struct({\n type: Schema.tag(\"reasoning\"),\n text: Schema.String,\n state: ProviderState.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }).pipe(optional),\n}).annotate({ identifier: \"Session.Message.Assistant.Reasoning\" })\n\nexport const AssistantContent = Schema.Union([AssistantText, AssistantReasoning, AssistantTool]).pipe(\n Schema.toTaggedUnion(\"type\"),\n)\nexport type AssistantContent = AssistantText | AssistantReasoning | AssistantTool\n\nexport interface AssistantRetry extends Schema.Schema.Type<typeof AssistantRetry> {}\nexport const AssistantRetry = Schema.Struct({\n attempt: PositiveInt,\n at: DateTimeUtcFromMillis,\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Assistant.Retry\" })\n\nexport interface Assistant extends Schema.Schema.Type<typeof Assistant> {}\nexport const Assistant = Schema.Struct({\n ...Base,\n type: Schema.tag(\"assistant\"),\n agent: Agent.ID,\n model: Model.Ref,\n content: AssistantContent.pipe(Schema.Array),\n snapshot: Schema.Struct({\n start: Snapshot.ID.pipe(optional),\n end: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n }).pipe(optional),\n finish: FinishReason.pipe(optional),\n cost: Money.USD.pipe(optional),\n tokens: TokenUsage.Info.pipe(optional),\n error: SessionError.Error.pipe(optional),\n retry: AssistantRetry.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant\" })\n\nconst CompactionBase = { type: Schema.tag(\"compaction\"), ...Base }\n\nexport interface CompactionRunning extends Schema.Schema.Type<typeof CompactionRunning> {}\nexport const CompactionRunning = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"running\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Running\" })\n\nexport interface CompactionCompleted extends Schema.Schema.Type<typeof CompactionCompleted> {}\nexport const CompactionCompleted = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"completed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Completed\" })\n\nexport interface CompactionFailed extends Schema.Schema.Type<typeof CompactionFailed> {}\nexport const CompactionFailed = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"failed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Compaction.Failed\" })\n\nexport const Compaction = Schema.Union([CompactionRunning, CompactionCompleted, CompactionFailed]).pipe(\n Schema.toTaggedUnion(\"status\"),\n Schema.annotate({ identifier: \"Session.Message.Compaction\" }),\n)\nexport type Compaction = CompactionRunning | CompactionCompleted | CompactionFailed\n\nexport const Info = Schema.Union([\n AgentSelected,\n ModelSelected,\n User,\n Synthetic,\n System,\n Skill,\n Shell,\n Assistant,\n Compaction,\n])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Session.Message.Info\" })\nexport type Info = AgentSelected | ModelSelected | User | Synthetic | System | Skill | Shell | Assistant | Compaction\nexport type Type = Info[\"type\"]\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "26D2714F964DFB8864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": ";6zBAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,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": "32F498F8C857F10E64756E2164756E21", | ||
| "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 reasoning_details: optionalArray(Schema.Unknown),\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 reasoning_details: optionalNull(Schema.Array(Schema.Unknown)),\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 readonly reasoningDetails: Array<unknown>\n readonly reasoningDetailsObserved: boolean\n readonly reasoningEmitted: boolean\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}\n\nconst reasoningDetails = (parts: ReadonlyArray<ReasoningPart>, native: unknown) => {\n const observed = parts.flatMap((part) => {\n const details = part.providerMetadata?.openai?.reasoningDetails\n return Array.isArray(details) ? details : []\n })\n if (parts.some((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))) return observed\n if (isRecord(native) && Array.isArray(native.reasoning_details)) return native.reasoning_details\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 details = reasoningDetails(reasoning, message.native?.openaiCompatible)\n const observedField = reasoning.map(reasoningField).find((value) => value !== undefined)\n const nativeReasoning = openAICompatibleReasoningContent(message.native?.openaiCompatible)\n const fullyStructured = reasoning.every((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))\n const field = (() => {\n if (reasoning.length === 0) return\n if (observedField !== undefined) return observedField\n if (nativeReasoning !== undefined) return \"reasoning_content\"\n if (!fullyStructured) return \"reasoning_content\"\n })()\n const reasoningContent = (() => {\n if (reasoning.length === 0) return nativeReasoning\n if (field === \"reasoning_content\") return text\n })()\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: reasoningContent,\n reasoning: reasoning.length > 0 && field === \"reasoning\" ? text : undefined,\n reasoning_text: reasoning.length > 0 && field === \"reasoning_text\" ? text : undefined,\n reasoning_details: details,\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 detailText = (details: ReadonlyArray<unknown>) => {\n const text = details.flatMap((detail) => {\n if (!isRecord(detail)) return []\n if (detail.type === \"reasoning.text\" && typeof detail.text === \"string\" && detail.text) return [detail.text]\n if (detail.type === \"reasoning.summary\" && typeof detail.summary === \"string\" && detail.summary)\n return [detail.summary]\n return []\n })\n if (text.length > 0) return text.join(\"\")\n}\n\nconst appendReasoningDetails = (result: Array<unknown>, details: ReadonlyArray<unknown>) => {\n for (const detail of details) {\n const previous = result.at(-1)\n if (\n !isRecord(previous) ||\n previous.type !== \"reasoning.text\" ||\n !isRecord(detail) ||\n detail.type !== \"reasoning.text\" ||\n conflictingReasoningTextDetails(previous, detail)\n ) {\n result.push(detail)\n continue\n }\n result[result.length - 1] = {\n ...previous,\n ...Object.fromEntries(Object.entries(detail).filter((entry) => entry[1] !== undefined)),\n text: `${typeof previous.text === \"string\" ? previous.text : \"\"}${typeof detail.text === \"string\" ? detail.text : \"\"}`,\n signature: mergeDetailValue(previous.signature, detail.signature),\n format: mergeDetailValue(previous.format, detail.format),\n }\n }\n}\n\nconst mergeDetailValue = (previous: unknown, current: unknown) =>\n previous || current || (previous !== undefined ? previous : current)\n\nconst conflictingReasoningTextDetails = (previous: Record<string, unknown>, current: Record<string, unknown>) =>\n conflictingDetailValue(previous.id, current.id) ||\n conflictingDetailValue(previous.index, current.index) ||\n conflictingDetailValue(previous.format, current.format) ||\n (Boolean(previous.signature) && Boolean(current.signature) && previous.signature !== current.signature)\n\nconst conflictingDetailValue = (previous: unknown, current: unknown) =>\n previous !== undefined && previous !== null && current !== undefined && current !== null && previous !== current\n\nconst reasoningMetadata = (field: ParserState[\"reasoningField\"], details?: ReadonlyArray<unknown>) => ({\n openai: {\n ...(field ? { reasoningField: field } : {}),\n ...(details ? { reasoningDetails: details } : {}),\n },\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 ?? (!state.lifecycle.text.has(\"text-0\") ? reasoning?.field : undefined)\n const detailDelta = Array.isArray(delta?.reasoning_details) ? delta.reasoning_details : undefined\n if (detailDelta !== undefined) appendReasoningDetails(state.reasoningDetails, detailDelta)\n const reasoningDetailsObserved = state.reasoningDetailsObserved || detailDelta !== undefined\n const deltaMetadata = reasoningMetadata(reasoningField)\n const text = detailDelta?.length ? (detailText(detailDelta) ?? reasoning?.text) : reasoning?.text\n if (!state.lifecycle.text.has(\"text-0\") && text !== undefined)\n lifecycle = Lifecycle.reasoningDelta(lifecycle, events, \"reasoning-0\", text, deltaMetadata)\n else if (\n reasoningDetailsObserved &&\n !lifecycle.reasoning.has(\"reasoning-0\") &&\n (Boolean(delta?.content) || toolDeltas.length > 0)\n )\n lifecycle = Lifecycle.reasoningStart(lifecycle, events, \"reasoning-0\", deltaMetadata)\n const reasoningEmitted = state.reasoningEmitted || lifecycle.reasoning.has(\"reasoning-0\")\n\n if (delta?.content) {\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningMetadata(reasoningField, reasoningDetailsObserved ? state.reasoningDetails : undefined),\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.content)\n }\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 reasoningDetails: state.reasoningDetails,\n reasoningDetailsObserved,\n reasoningEmitted,\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 metadata = reasoningMetadata(\n state.reasoningField,\n state.reasoningDetailsObserved ? state.reasoningDetails : undefined,\n )\n const started =\n state.reasoningDetailsObserved && !state.reasoningEmitted\n ? Lifecycle.reasoningStart(state.lifecycle, events, \"reasoning-0\", reasoningMetadata(state.reasoningField))\n : state.lifecycle\n const ended = Lifecycle.reasoningEnd(started, events, \"reasoning-0\", metadata)\n const lifecycle = state.toolCallEvents.length ? Lifecycle.stepStart(ended, events) : ended\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 reasoningDetails: [],\n reasoningDetailsObserved: false,\n reasoningEmitted: false,\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": "BEA8E8C68B4CCFAC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/runtime.queue.ts"], | ||
| "sourcesContent": [ | ||
| "// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and local\n// operations drain one at a time. Ordinary prompts submitted during an active\n// ordinary turn are admitted immediately to the server's durable queue.\n//\n// The queue also handles /exit, /quit, and /new commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"../util/locale\"\nimport { isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt, delivery: \"steer\" | \"queue\") => void\n onAdmissionError?: (prompt: RunPrompt, error: unknown) => void | Promise<void>\n onNewSession?: () => void | Promise<void>\n admit: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n settle: () => Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal, admitted: () => void) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n active?: RunPrompt\n admission?: Promise<void>\n ctrl?: AbortController\n closed: boolean\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn are admitted as\n// durable queued work instead of remaining editable process-local state.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = Promise.withResolvers<{ type: \"closed\" }>()\n const done = Promise.withResolvers<void>()\n const state: State = {\n queue: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n let admissions = Promise.resolve()\n let admissionVersion = 0\n const admissionController = new AbortController()\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n state.ctrl?.abort()\n admissionController.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()\n if (!prompt) {\n continue\n }\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n },\n )\n await input.onNewSession()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n { type: \"turn.send\" },\n {\n phase: \"running\",\n status: \"sending prompt\",\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n const admission = Promise.withResolvers<void>()\n const version = admissionVersion\n state.ctrl = ctrl\n state.admission = admission.promise\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent, \"steer\")\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal, admission.resolve).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n ctrl.abort()\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n if (sent.mode !== \"shell\" && admissionVersion !== version) {\n do {\n const current = admissionVersion\n await admissions\n if (state.closed) break\n await input.settle()\n if (current === admissionVersion) break\n } while (!state.closed)\n }\n } finally {\n admission.resolve()\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n if (state.admission === admission.promise) state.admission = undefined\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n { type: \"turn.idle\" },\n {\n phase: \"idle\",\n status: \"\",\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n prompt.mode !== \"shell\" &&\n prompt.command?.source !== \"skill\" &&\n !isNewCommand(prompt.text)\n ) {\n const sent = { ...prompt, messageID: SessionMessage.ID.create() }\n const admission = state.admission\n admissionVersion += 1\n input.onSend?.(sent, \"queue\")\n admissions = admissions\n .then(() => admission)\n .then(() => input.admit(sent, admissionController.signal))\n .catch((error) => (state.closed ? undefined : input.onAdmissionError?.(sent, error)))\n return\n }\n\n state.queue.push(prompt)\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n close()\n await draining?.catch(() => {})\n await admissions\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "2E3AF2B4E3E2FAB064756E2164756E21", | ||
| "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": ";k0BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,KAAK,EAChD,CACH", | ||
| "debugId": "DB92895116DCBFB864756E2164756E21", | ||
| "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": ";2oBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "3DACFEDC893EC11A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "41B6B139F6D8B33664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
258498612
0