@opencode-ai/cli-linux-arm64
Advanced tools
Sorry, the diff of this file is too big to display
| { | ||
| "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": ";m5BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,MACH", | ||
| "debugId": "EDA48A741965D9DD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "27B420EE804B2F9B64756E2164756E21", | ||
| "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": ";k8BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,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": "79CE10C01AB9E47564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "99FE0A150A359F3B64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/util/which.ts"], | ||
| "sourcesContent": [ | ||
| "import whichPkg from \"which\"\nimport path from \"path\"\nimport { Global } from \"../global\"\n\nexport function which(cmd: string, env?: NodeJS.ProcessEnv) {\n const base = env?.PATH ?? env?.Path ?? process.env.PATH ?? process.env.Path ?? \"\"\n const full = base ? base + path.delimiter + Global.Path.bin : Global.Path.bin\n const result = whichPkg.sync(cmd, {\n nothrow: true,\n path: full,\n pathExt: env?.PATHEXT ?? env?.PathExt ?? process.env.PATHEXT ?? process.env.PathExt,\n })\n return typeof result === \"string\" ? result : null\n}\n" | ||
| ], | ||
| "mappings": ";kJAAA,oBACA,yBAGO,SAAS,CAAK,CAAC,EAAa,EAAyB,CAC1D,IAAM,EAAO,GAAK,MAAQ,GAAK,MAAQ,QAAQ,IAAI,MAAQ,QAAQ,IAAI,MAAQ,GACzE,EAAO,EAAO,EAAO,EAAK,UAAY,EAAO,KAAK,IAAM,EAAO,KAAK,IACpE,EAAS,UAAS,KAAK,EAAK,CAChC,QAAS,GACT,KAAM,EACN,QAAS,GAAK,SAAW,GAAK,SAAW,QAAQ,IAAI,SAAW,QAAQ,IAAI,OAC9E,CAAC,EACD,OAAO,OAAO,IAAW,SAAW,EAAS", | ||
| "debugId": "3FDF64415C0FDE0864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "4AC02974BD9762AD64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";k8BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,OAAO,MAC9C,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": "0758F1A37AF2F0C464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { waitForCatalogReady } from \"../services/catalog\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n prepare: async (next) => {\n const selected =\n next.model ??\n (await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data))\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n if (model) {\n await waitForCatalogReady({\n sdk: client,\n directory: next.location.directory,\n workspace: next.location.workspaceID,\n model: { providerID: model.providerID, modelID: model.id },\n })\n const available = await client.model.list({\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.id))\n throw new RunTargetError(`Model unavailable: ${model.providerID}/${model.id}`, next.session?.id)\n }\n return {\n model,\n agent: input.agent\n ? await validateAgent(client, next.location.directory, next.location.workspaceID, input.agent)\n : next.agent,\n }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, workspace: string | undefined, name?: string) {\n if (!name) return\n const agents = await client.agent\n .list({ location: { directory, workspace } })\n .then((result) => result.data)\n .catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction errorMessage(error: unknown) {\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\")\n return error.message\n return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LLMToolContent,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n structured: Record<string, JsonValue>\n content: LLMToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.callID), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) {\n current.structured = event.data.structured\n current.content = event.data.content\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n error: event.data.error,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (toolOutputText(current.tool, current.content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n result: event.data.result,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (\n input.compatibility === \"v1\" &&\n event.data.error.message === \"Provider stream ended without a terminal finish event\"\n ) {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, callID: string) {\n return `${messageID}\\u0000${callID}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n structured: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "20A3F18C63FB9EFA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-compatible.ts"], | ||
| "sourcesContent": [ | ||
| "import { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { profiles, type OpenAICompatibleProfile } from \"./openai-compatible-profile\"\n\nexport const id = ProviderID.make(\"openai-compatible\")\n\ntype GenericModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL: string\n readonly provider?: string\n}\n\nexport type FamilyModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport const routes = [OpenAICompatibleChat.route]\n\nexport const configure = (input: GenericModelOptions) => {\n const provider = input.provider ?? \"openai-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = OpenAICompatibleChat.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: AuthOptions.bearer(input, []),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID, provider: ProviderID.make(provider) }),\n configure,\n }\n}\n\nconst define = (profile: OpenAICompatibleProfile) => {\n const configureProfile = (input: FamilyModelOptions = {}) => {\n const facade = configure({\n ...input,\n baseURL: input.baseURL ?? profile.baseURL,\n provider: profile.provider,\n })\n return {\n id: ProviderID.make(profile.provider),\n model: facade.model,\n configure: configureProfile,\n }\n }\n return configureProfile()\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n\nexport const baseten = define(profiles.baseten)\nexport const cerebras = define(profiles.cerebras)\nexport const deepinfra = define(profiles.deepinfra)\nexport const deepseek = define(profiles.deepseek)\nexport const fireworks = define(profiles.fireworks)\nexport const groq = define(profiles.groq)\nexport const togetherai = define(profiles.togetherai)\n" | ||
| ], | ||
| "mappings": ";mfAOO,SAAM,OAAK,OAAW,UAAK,wBAAmB,OAmBxC,OAAS,MAAsB,MAAK,OAEpC,OAAY,MAAC,IAA+B,CACvD,IAAM,EAAW,EAAM,UAAY,qBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAA6B,EAAM,KAAK,IACzC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAY,OAAO,EAAO,CAAC,CAAC,CACpC,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,EAAS,SAAU,EAAW,KAAK,CAAQ,CAAE,CAAC,EACtG,WACF,GAGI,EAAS,CAAC,IAAqC,CACnD,IAAM,EAAmB,CAAC,EAA4B,CAAC,IAAM,CAC3D,IAAM,EAAS,EAAU,IACpB,EACH,QAAS,EAAM,SAAW,EAAQ,QAClC,SAAU,EAAQ,QACpB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,EAAQ,QAAQ,EACpC,MAAO,EAAO,MACd,UAAW,CACb,GAEF,OAAO,EAAiB,GAGb,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAC5E,EAAU,CACR,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,EAEL,EAAU,EAAO,EAAS,OAAO,EACjC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAO,EAAO,EAAS,IAAI,EAC3B,EAAa,EAAO,EAAS,UAAU", | ||
| "debugId": "7B74B408419DBED164756E2164756E21", | ||
| "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": "CEEC4C830CC9F3E264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({ server: serverURL, standalone: input.standalone })\n const config = yield* Config.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n tuiConfig: resolved,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";siCAOA,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,MAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EAC5F,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,KACZ,UAAW,CACb,CAAC,CACH,EACD,CACH", | ||
| "debugId": "AB8B37D022B8ACF464756E2164756E21", | ||
| "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": ";m5BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,OAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "FF3F2DCA77D65C0A64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/cli-spinners@3.4.0/node_modules/cli-spinners/index.js", "../../node_modules/.bun/opentui-spinner@0.0.7+5ab4a390c455099d/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+5ab4a390c455099d/node_modules/opentui-spinner/dist/solid.mjs", "../tui/src/component/register-spinner.ts"], | ||
| "sourcesContent": [ | ||
| "import spinners from './spinners.json' with {type: 'json'};\n\nexport default spinners;\n\nconst spinnersList = Object.keys(spinners);\n\nexport function randomSpinner() {\n\tconst randomIndex = Math.floor(Math.random() * spinnersList.length);\n\tconst spinnerName = spinnersList[randomIndex];\n\treturn spinners[spinnerName];\n}\n", | ||
| "import{Renderable as e,parseColor as t,resolveRenderLib as n}from\"@opentui/core\";import r from\"cli-spinners\";const i=1e3/60,a=1e3;function o(e){if(!Number.isFinite(e)||e<i||e>a)throw RangeError(`Spinner interval must be a finite number between ${i}ms and ${a}ms`);return e}const s={now:()=>performance.now(),setInterval:(e,t)=>{let n=setInterval(e,t);return n.unref(),n},clearInterval:e=>clearInterval(e)},c=new class{active=new Map;heap=[];timer=null;timerDueAt=0;generation=0;lastWakeAt=-1/0;clock;constructor(e=s,t=16){this.denseTickThreshold=t,this.clock=e}setClock(e){if(this.active.size>0||this.timer!==null)throw Error(`Cannot replace the spinner scheduler clock while active`);this.clock=e}start(e,t,n){if(this.active.has(e))return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n};this.active.set(e,r),this.push(r),this.armNext()}reschedule(e,t){let n=this.active.get(e);if(!n)return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n.advance};this.active.set(e,r),this.push(r),this.compactIfNeeded(),this.armNext()}stop(e){this.active.delete(e)&&(this.compactIfNeeded(),this.armNext())}armNext(){this.discardStaleRoots();let e=this.heap[0];if(!e){this.cancelTimer(),this.lastWakeAt=-1/0;return}let t=this.clock.now(),n=Math.max(e.nextDueAt,this.lastWakeAt+i);if(this.timer!==null&&this.timerDueAt===n)return;this.cancelTimer();let r=this.generation,a=Math.max(n-t,0);this.timerDueAt=n,this.timer=this.clock.setInterval(()=>this.tick(r),a)}cancelTimer(){this.timer!==null&&(this.generation++,this.clock.clearInterval(this.timer),this.timer=null)}tick(e){if(e!==this.generation||this.timer===null)return;let t=this.timer;this.generation++,this.timer=null,this.clock.clearInterval(t);let n=this.clock.now();this.discardStaleRoots();let r=!1,i=0,a=[];for(;this.heap[0]&&this.heap[0].nextDueAt<=n;){let e=this.pop();if(!(!e||!this.isCurrent(e))){try{e.advance()}catch(e){a.push(e)}if(r=!0,this.isCurrent(e)&&(e.nextDueAt=n+e.interval,this.push(e),i++,i===this.denseTickThreshold)){let e=this.heap;this.heap=[];for(let t of e)if(this.isCurrent(t)){if(t.nextDueAt<=n){try{t.advance()}catch(e){a.push(e)}if(r=!0,!this.isCurrent(t))continue;t.nextDueAt=n+t.interval}this.heap.push(t)}this.heapify();break}}}if(r&&(this.lastWakeAt=n),this.compactIfNeeded(),this.armNext(),a.length===1)throw a[0];if(a.length>1)throw AggregateError(a,`Multiple spinner callbacks failed`)}isCurrent(e){return this.active.get(e.spinner)===e}discardStaleRoots(){for(;this.heap[0]&&!this.isCurrent(this.heap[0]);)this.pop()}compactIfNeeded(){this.heap.length<=this.active.size*2+16||(this.heap=Array.from(this.active.values()),this.heapify())}heapify(){for(let e=Math.floor(this.heap.length/2)-1;e>=0;e--)this.siftDown(e)}push(e){this.heap.push(e);let t=this.heap.length-1;for(;t>0;){let n=Math.floor((t-1)/2);if(this.heap[n].nextDueAt<=e.nextDueAt)break;this.heap[t]=this.heap[n],t=n}this.heap[t]=e}pop(){let e=this.heap[0],t=this.heap.pop();return!e||!t||this.heap.length===0?e:(this.heap[0]=t,this.siftDown(0),e)}siftDown(e){let t=this.heap[e],n=e;for(;;){let e=n*2+1;if(e>=this.heap.length)break;let r=e+1,i=r<this.heap.length&&this.heap[r].nextDueAt<this.heap[e].nextDueAt?r:e;if(this.heap[i].nextDueAt>=t.nextDueAt)break;this.heap[n]=this.heap[i],n=i}this.heap[n]=t}};function l(e,t=1){if(e.length===0)throw RangeError(`createPulse requires at least one color`);return n=>e[Math.floor(n*t)%e.length]}function u(e){if(e.length===0)throw RangeError(`createWave requires at least one color`);return(t,n,r,i)=>{let a=(n+t)%i;return e[Math.floor(a/i*e.length)]??e[0]}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=class extends e{_name;_frames;_interval;_autoplay;_backgroundColor;_parsedBackgroundColor;_color;_parsedColor;_currentFrameIndex=0;_encodedFrames={};_lib=n();_isRunning=!1;_advanceFrame=()=>{!this._isRunning||this.isDestroyed||(this._currentFrameIndex=(this._currentFrameIndex+1)%this._frames.length,this.requestRender())};_defaultOptions={name:`dots`,frames:r.dots.frames,interval:r.dots.interval,autoplay:!0,backgroundColor:`transparent`,color:`white`};constructor(e,n){super(e,n),this._name=n.name,this._frames=n.frames?.length?n.frames:this._name?r[this._name].frames:this._defaultOptions.frames,this._interval=o(n.interval??(this._name?r[this._name].interval:this._defaultOptions.interval)),this._autoplay=n.autoplay??this._defaultOptions.autoplay,this._backgroundColor=n.backgroundColor??this._defaultOptions.backgroundColor,this._parsedBackgroundColor=t(this._backgroundColor),this._color=n.color??this._defaultOptions.color,this._parsedColor=typeof this._color==`function`?t(this._defaultOptions.color):t(this._color),this.height=1,this._encodeFrames(),this._autoplay&&this.start()}_encodeFrames(){let e=0;for(let t of this._frames){if(this._encodedFrames[t])continue;let n=this._lib.encodeUnicode(t,this.ctx.widthMethod);n&&(this._encodedFrames[t]=n,e=Math.max(e,n.data.reduce((e,t)=>e+t.width,0)))}this.width=e}_freeFrames(){for(let e in this._encodedFrames)this._encodedFrames[e]&&this._lib.freeUnicode(this._encodedFrames[e]);this._encodedFrames={}}get interval(){return this._interval}set interval(e){this._interval=o(e),this._isRunning&&c.reschedule(this,this._interval)}get name(){return this._name}set name(e){let t=e?r[e].frames:this._defaultOptions.frames,n=o(e?r[e].interval:this._defaultOptions.interval),i=!d(this._frames,t),a=this._interval!==n;this._name=e,this._interval=n,i&&(this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()),this._isRunning&&a&&c.reschedule(this,n)}get frames(){return this._frames}set frames(e){let t=e.length===0?this._defaultOptions.frames:e;if(d(this._frames,t)){this._frames=t;return}this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()}get color(){return this._color}set color(e){this._color=e,typeof e!=`function`&&(this._parsedColor=t(e)),this.visible&&this.requestRender()}get backgroundColor(){return this._backgroundColor}set backgroundColor(e){this._backgroundColor=e,this._parsedBackgroundColor=t(e),this.visible&&this.requestRender()}get visible(){return super.visible}set visible(e){e!==super.visible&&(super.visible=e,this._isRunning&&(e?c.start(this,this._interval,this._advanceFrame):c.stop(this)))}get autoplay(){return this._autoplay}set autoplay(e){this._autoplay=e,e?this.start():this.stop()}start(){this._isRunning||this.isDestroyed||(this._isRunning=!0,this.visible&&c.start(this,this._interval,this._advanceFrame))}stop(){this._isRunning&&(this._isRunning=!1,c.stop(this))}renderSelf(e){if(!this.visible)return;let n=this._frames[this._currentFrameIndex];if(!n)return;let r=this._encodedFrames[n];if(!r)return;let i=this.x;for(let n=0;n<r.data.length;n++){let a=typeof this._color==`function`?t(this._color(this._currentFrameIndex,n,this._frames.length,r.data.length)):this._parsedColor;e.drawChar(r.data[n].char,i,this.y,a,this._parsedBackgroundColor),i+=r.data[n].width}}destroySelf(){this.stop(),this._freeFrames(),super.destroySelf()}};export{l as n,u as r,f as t};", | ||
| "import{t as e}from\"./src-DjeqLSfu.mjs\";import{extend as t}from\"@opentui/solid/components\";function n(){t({spinner:e})}n();export{n as registerSpinner};", | ||
| "import { getComponentCatalogue } from \"@opentui/solid/components\"\nimport { registerSpinner } from \"opentui-spinner/solid\"\n\nexport function registerOpencodeSpinner() {\n if (!getComponentCatalogue().spinner) registerSpinner()\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0EF20730E129425264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const 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": ";6zBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,MAAC,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": "4B2F37AEA6019C9D64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/isexe@2.0.0/node_modules/isexe/windows.js", "../../node_modules/.bun/isexe@2.0.0/node_modules/isexe/mode.js", "../../node_modules/.bun/isexe@2.0.0/node_modules/isexe/index.js", "../../node_modules/.bun/which@2.0.2/node_modules/which/which.js", "../../node_modules/.bun/path-key@3.1.1/node_modules/path-key/index.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/resolveCommand.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/escape.js", "../../node_modules/.bun/shebang-regex@3.0.0/node_modules/shebang-regex/index.js", "../../node_modules/.bun/shebang-command@2.0.0/node_modules/shebang-command/index.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/readShebang.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/enoent.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/index.js"], | ||
| "sourcesContent": [ | ||
| "module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction checkPathExt (path, options) {\n var pathext = options.pathExt !== undefined ?\n options.pathExt : process.env.PATHEXT\n\n if (!pathext) {\n return true\n }\n\n pathext = pathext.split(';')\n if (pathext.indexOf('') !== -1) {\n return true\n }\n for (var i = 0; i < pathext.length; i++) {\n var p = pathext[i].toLowerCase()\n if (p && path.substr(-p.length).toLowerCase() === p) {\n return true\n }\n }\n return false\n}\n\nfunction checkStat (stat, path, options) {\n if (!stat.isSymbolicLink() && !stat.isFile()) {\n return false\n }\n return checkPathExt(path, options)\n}\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, path, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), path, options)\n}\n", | ||
| "module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), options)\n}\n\nfunction checkStat (stat, options) {\n return stat.isFile() && checkMode(stat, options)\n}\n\nfunction checkMode (stat, options) {\n var mod = stat.mode\n var uid = stat.uid\n var gid = stat.gid\n\n var myUid = options.uid !== undefined ?\n options.uid : process.getuid && process.getuid()\n var myGid = options.gid !== undefined ?\n options.gid : process.getgid && process.getgid()\n\n var u = parseInt('100', 8)\n var g = parseInt('010', 8)\n var o = parseInt('001', 8)\n var ug = u | g\n\n var ret = (mod & o) ||\n (mod & g) && gid === myGid ||\n (mod & u) && uid === myUid ||\n (mod & ug) && myUid === 0\n\n return ret\n}\n", | ||
| "var fs = require('fs')\nvar core\nif (process.platform === 'win32' || global.TESTING_WINDOWS) {\n core = require('./windows.js')\n} else {\n core = require('./mode.js')\n}\n\nmodule.exports = isexe\nisexe.sync = sync\n\nfunction isexe (path, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = {}\n }\n\n if (!cb) {\n if (typeof Promise !== 'function') {\n throw new TypeError('callback not provided')\n }\n\n return new Promise(function (resolve, reject) {\n isexe(path, options || {}, function (er, is) {\n if (er) {\n reject(er)\n } else {\n resolve(is)\n }\n })\n })\n }\n\n core(path, options || {}, function (er, is) {\n // ignore EACCES because that just means we aren't allowed to run it\n if (er) {\n if (er.code === 'EACCES' || options && options.ignoreErrors) {\n er = null\n is = false\n }\n }\n cb(er, is)\n })\n}\n\nfunction sync (path, options) {\n // my kingdom for a filtered catch\n try {\n return core.sync(path, options || {})\n } catch (er) {\n if (options && options.ignoreErrors || er.code === 'EACCES') {\n return false\n } else {\n throw er\n }\n }\n}\n", | ||
| "const isWindows = process.platform === 'win32' ||\n process.env.OSTYPE === 'cygwin' ||\n process.env.OSTYPE === 'msys'\n\nconst path = require('path')\nconst COLON = isWindows ? ';' : ':'\nconst isexe = require('isexe')\n\nconst getNotFoundError = (cmd) =>\n Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })\n\nconst getPathInfo = (cmd, opt) => {\n const colon = opt.colon || COLON\n\n // If it has a slash, then we don't bother searching the pathenv.\n // just check the file itself, and that's it.\n const pathEnv = cmd.match(/\\//) || isWindows && cmd.match(/\\\\/) ? ['']\n : (\n [\n // windows always checks the cwd first\n ...(isWindows ? [process.cwd()] : []),\n ...(opt.path || process.env.PATH ||\n /* istanbul ignore next: very unusual */ '').split(colon),\n ]\n )\n const pathExtExe = isWindows\n ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'\n : ''\n const pathExt = isWindows ? pathExtExe.split(colon) : ['']\n\n if (isWindows) {\n if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')\n pathExt.unshift('')\n }\n\n return {\n pathEnv,\n pathExt,\n pathExtExe,\n }\n}\n\nconst which = (cmd, opt, cb) => {\n if (typeof opt === 'function') {\n cb = opt\n opt = {}\n }\n if (!opt)\n opt = {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n const step = i => new Promise((resolve, reject) => {\n if (i === pathEnv.length)\n return opt.all && found.length ? resolve(found)\n : reject(getNotFoundError(cmd))\n\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n resolve(subStep(p, i, 0))\n })\n\n const subStep = (p, i, ii) => new Promise((resolve, reject) => {\n if (ii === pathExt.length)\n return resolve(step(i + 1))\n const ext = pathExt[ii]\n isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {\n if (!er && is) {\n if (opt.all)\n found.push(p + ext)\n else\n return resolve(p + ext)\n }\n return resolve(subStep(p, i, ii + 1))\n })\n })\n\n return cb ? step(0).then(res => cb(null, res), cb) : step(0)\n}\n\nconst whichSync = (cmd, opt) => {\n opt = opt || {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n for (let i = 0; i < pathEnv.length; i ++) {\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n for (let j = 0; j < pathExt.length; j ++) {\n const cur = p + pathExt[j]\n try {\n const is = isexe.sync(cur, { pathExt: pathExtExe })\n if (is) {\n if (opt.all)\n found.push(cur)\n else\n return cur\n }\n } catch (ex) {}\n }\n }\n\n if (opt.all && found.length)\n return found\n\n if (opt.nothrow)\n return null\n\n throw getNotFoundError(cmd)\n}\n\nmodule.exports = which\nwhich.sync = whichSync\n", | ||
| "'use strict';\n\nconst pathKey = (options = {}) => {\n\tconst environment = options.env || process.env;\n\tconst platform = options.platform || process.platform;\n\n\tif (platform !== 'win32') {\n\t\treturn 'PATH';\n\t}\n\n\treturn Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path';\n};\n\nmodule.exports = pathKey;\n// TODO: Remove this for the next major release\nmodule.exports.default = pathKey;\n", | ||
| "'use strict';\n\nconst path = require('path');\nconst which = require('which');\nconst getPathKey = require('path-key');\n\nfunction resolveCommandAttempt(parsed, withoutPathExt) {\n const env = parsed.options.env || process.env;\n const cwd = process.cwd();\n const hasCustomCwd = parsed.options.cwd != null;\n // Worker threads do not have process.chdir()\n const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled;\n\n // If a custom `cwd` was specified, we need to change the process cwd\n // because `which` will do stat calls but does not support a custom cwd\n if (shouldSwitchCwd) {\n try {\n process.chdir(parsed.options.cwd);\n } catch (err) {\n /* Empty */\n }\n }\n\n let resolved;\n\n try {\n resolved = which.sync(parsed.command, {\n path: env[getPathKey({ env })],\n pathExt: withoutPathExt ? path.delimiter : undefined,\n });\n } catch (e) {\n /* Empty */\n } finally {\n if (shouldSwitchCwd) {\n process.chdir(cwd);\n }\n }\n\n // If we successfully resolved, ensure that an absolute path is returned\n // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it\n if (resolved) {\n resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);\n }\n\n return resolved;\n}\n\nfunction resolveCommand(parsed) {\n return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);\n}\n\nmodule.exports = resolveCommand;\n", | ||
| "'use strict';\n\n// See http://www.robvanderwoude.com/escapechars.php\nconst metaCharsRegExp = /([()\\][%!^\"`<>&|;, *?])/g;\n\nfunction escapeCommand(arg) {\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n return arg;\n}\n\nfunction escapeArgument(arg, doubleEscapeMetaChars) {\n // Convert to string\n arg = `${arg}`;\n\n // Algorithm below is based on https://qntm.org/cmd\n // It's slightly altered to disable JS backtracking to avoid hanging on specially crafted input\n // Please see https://github.com/moxystudio/node-cross-spawn/pull/160 for more information\n\n // Sequence of backslashes followed by a double quote:\n // double up all the backslashes and escape the double quote\n arg = arg.replace(/(?=(\\\\+?)?)\\1\"/g, '$1$1\\\\\"');\n\n // Sequence of backslashes followed by the end of the string\n // (which will become a double quote later):\n // double up all the backslashes\n arg = arg.replace(/(?=(\\\\+?)?)\\1$/, '$1$1');\n\n // All other backslashes occur literally\n\n // Quote the whole thing:\n arg = `\"${arg}\"`;\n\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n // Double escape meta chars if necessary\n if (doubleEscapeMetaChars) {\n arg = arg.replace(metaCharsRegExp, '^$1');\n }\n\n return arg;\n}\n\nmodule.exports.command = escapeCommand;\nmodule.exports.argument = escapeArgument;\n", | ||
| "'use strict';\nmodule.exports = /^#!(.*)/;\n", | ||
| "'use strict';\nconst shebangRegex = require('shebang-regex');\n\nmodule.exports = (string = '') => {\n\tconst match = string.match(shebangRegex);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tconst [path, argument] = match[0].replace(/#! ?/, '').split(' ');\n\tconst binary = path.split('/').pop();\n\n\tif (binary === 'env') {\n\t\treturn argument;\n\t}\n\n\treturn argument ? `${binary} ${argument}` : binary;\n};\n", | ||
| "'use strict';\n\nconst fs = require('fs');\nconst shebangCommand = require('shebang-command');\n\nfunction readShebang(command) {\n // Read the first 150 bytes from the file\n const size = 150;\n const buffer = Buffer.alloc(size);\n\n let fd;\n\n try {\n fd = fs.openSync(command, 'r');\n fs.readSync(fd, buffer, 0, size, 0);\n fs.closeSync(fd);\n } catch (e) { /* Empty */ }\n\n // Attempt to extract shebang (null is returned if not a shebang)\n return shebangCommand(buffer.toString());\n}\n\nmodule.exports = readShebang;\n", | ||
| "'use strict';\n\nconst path = require('path');\nconst resolveCommand = require('./util/resolveCommand');\nconst escape = require('./util/escape');\nconst readShebang = require('./util/readShebang');\n\nconst isWin = process.platform === 'win32';\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\nfunction detectShebang(parsed) {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed) {\n if (!isWin) {\n return parsed;\n }\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile);\n\n // If a shell is required, use cmd.exe and take care of escaping everything correctly\n // Note that `forceShell` is an hidden option used only in tests\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`\n // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument\n // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,\n // we need to double escape them\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);\n\n // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\\bar)\n // This is necessary otherwise it will always fail with ENOENT in those cases\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escape.command(parsed.command);\n parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped\n }\n\n return parsed;\n}\n\nfunction parse(command, args, options) {\n // Normalize arguments, similar to nodejs\n if (args && !Array.isArray(args)) {\n options = args;\n args = null;\n }\n\n args = args ? args.slice(0) : []; // Clone array to avoid changing the original\n options = Object.assign({}, options); // Clone object to avoid changing the original\n\n // Build our parsed object\n const parsed = {\n command,\n args,\n options,\n file: undefined,\n original: {\n command,\n args,\n },\n };\n\n // Delegate further parsing to shell or non-shell\n return options.shell ? parsed : parseNonShell(parsed);\n}\n\nmodule.exports = parse;\n", | ||
| "'use strict';\n\nconst isWin = process.platform === 'win32';\n\nfunction notFoundError(original, syscall) {\n return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {\n code: 'ENOENT',\n errno: 'ENOENT',\n syscall: `${syscall} ${original.command}`,\n path: original.command,\n spawnargs: original.args,\n });\n}\n\nfunction hookChildProcess(cp, parsed) {\n if (!isWin) {\n return;\n }\n\n const originalEmit = cp.emit;\n\n cp.emit = function (name, arg1) {\n // If emitting \"exit\" event and exit code is 1, we need to check if\n // the command exists and emit an \"error\" instead\n // See https://github.com/IndigoUnited/node-cross-spawn/issues/16\n if (name === 'exit') {\n const err = verifyENOENT(arg1, parsed);\n\n if (err) {\n return originalEmit.call(cp, 'error', err);\n }\n }\n\n return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params\n };\n}\n\nfunction verifyENOENT(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawn');\n }\n\n return null;\n}\n\nfunction verifyENOENTSync(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawnSync');\n }\n\n return null;\n}\n\nmodule.exports = {\n hookChildProcess,\n verifyENOENT,\n verifyENOENTSync,\n notFoundError,\n};\n", | ||
| "'use strict';\n\nconst cp = require('child_process');\nconst parse = require('./lib/parse');\nconst enoent = require('./lib/enoent');\n\nfunction spawn(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);\n\n // Hook into child process \"exit\" event to emit an error if the command\n // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n enoent.hookChildProcess(spawned, parsed);\n\n return spawned;\n}\n\nfunction spawnSync(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);\n\n // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);\n\n return result;\n}\n\nmodule.exports = spawn;\nmodule.exports.spawn = spawn;\nmodule.exports.sync = spawnSync;\n\nmodule.exports._parse = parse;\nmodule.exports._enoent = enoent;\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "AFDEB1FB2EAD97DC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/anthropic-compatible.ts", "../ai/src/providers/anthropic.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { ProviderID, type ModelID } from \"../schema\"\n\nexport const id = ProviderID.make(\"anthropic-compatible\")\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL: string\n readonly provider?: string\n }\n\nexport const routes = [AnthropicMessages.route]\n\nconst auth = (input: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\").pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config) => {\n if (!input.baseURL) throw new Error(\"Anthropic-compatible providers require a baseURL\")\n const provider = input.provider ?? \"anthropic-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = AnthropicMessages.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: auth(input),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic-compatible apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n}\n\nexport * as AnthropicCompatible from \"./anthropic-compatible\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { AnthropicCompatible } from \"./anthropic-compatible\"\n\nexport const id = ProviderID.make(\"anthropic\")\n\nexport const routes = [AnthropicMessages.route]\n\nexport type Config = RouteDefaultsInput & ProviderAuthOption<\"optional\"> & { readonly baseURL?: string }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL?: string\n }\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"ANTHROPIC_API_KEY\"))\n .pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config = {}) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n const compatible = AnthropicCompatible.configure({\n ...rest,\n auth: auth(input),\n baseURL: baseURL ?? AnthropicMessages.DEFAULT_BASE_URL,\n provider: id,\n })\n return {\n id,\n model: (modelID: string | ModelID) => compatible.model(modelID),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";qhBAOO,SAAM,OAAK,OAAW,UAAK,2BAAsB,OAiB3C,OAAS,MAAC,OAAkB,UAAK,EAExC,EAAO,CAAC,IAA0C,CACtD,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EAAE,KAAK,EAAK,OAAO,WAAW,CAAC,GAG/F,EAAY,CAAC,IAAkB,CAC1C,GAAI,CAAC,EAAM,QAAS,MAAU,MAAM,kDAAkD,EACtF,IAAM,EAAW,EAAM,UAAY,wBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAAQ,EAAkB,MAAM,KAAK,IACtC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAK,CAAK,CAClB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,CAAQ,CAAC,EACjE,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,+DAA+D,EACjF,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,GCvDX,IAAM,EAAK,EAAW,KAAK,WAAW,EAEhC,EAAS,CAAC,EAAkB,KAAK,EAYxC,EAAO,CAAC,IAA4C,CACxD,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAO,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,EAC5E,OAAO,EAAK,OAAO,mBAAmB,CAAC,EACvC,KAAK,EAAK,OAAO,WAAW,CAAC,GAGrB,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EAC/C,EAAa,EAAoB,UAAU,IAC5C,EACH,KAAM,EAAK,CAAK,EAChB,QAAS,GAAW,EAAkB,iBACtC,SAAU,CACZ,CAAC,EACD,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAW,MAAM,CAAO,EAC9D,WACF,GAGW,EAAW,EAAU,EACrB,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,oDAAoD,EACtE,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,MACnB,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "9057033AD42464FF64756E2164756E21", | ||
| "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": "C1A5277AA99EFB5D64756E2164756E21", | ||
| "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": "386F70A7F8A36E9464756E2164756E21", | ||
| "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": "6D30C1B3D33DC19D64756E2164756E21", | ||
| "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": "00183B2CFECA9CE364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/flag/flag.ts"], | ||
| "sourcesContent": [ | ||
| "import { Config } from \"effect\"\n\nexport function truthy(key: string) {\n const value = process.env[key]?.toLowerCase()\n return value === \"true\" || value === \"1\"\n}\n\nconst copy = process.env[\"OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT\"]\nconst fff = process.env[\"OPENCODE_DISABLE_FFF\"]\n\nfunction enabledByExperimental(key: string) {\n return process.env[key] === undefined ? truthy(\"OPENCODE_EXPERIMENTAL\") : truthy(key)\n}\n\nexport const Flag = {\n OTEL_EXPORTER_OTLP_ENDPOINT: process.env[\"OTEL_EXPORTER_OTLP_ENDPOINT\"],\n OTEL_EXPORTER_OTLP_HEADERS: process.env[\"OTEL_EXPORTER_OTLP_HEADERS\"],\n\n OPENCODE_AUTO_HEAP_SNAPSHOT: truthy(\"OPENCODE_AUTO_HEAP_SNAPSHOT\"),\n OPENCODE_GIT_BASH_PATH: process.env[\"OPENCODE_GIT_BASH_PATH\"],\n OPENCODE_CONFIG: process.env[\"OPENCODE_CONFIG\"],\n OPENCODE_CONFIG_CONTENT: process.env[\"OPENCODE_CONFIG_CONTENT\"],\n OPENCODE_DISABLE_AUTOUPDATE: truthy(\"OPENCODE_DISABLE_AUTOUPDATE\"),\n OPENCODE_ALWAYS_NOTIFY_UPDATE: truthy(\"OPENCODE_ALWAYS_NOTIFY_UPDATE\"),\n OPENCODE_DISABLE_PRUNE: truthy(\"OPENCODE_DISABLE_PRUNE\"),\n OPENCODE_DISABLE_TERMINAL_TITLE: truthy(\"OPENCODE_DISABLE_TERMINAL_TITLE\"),\n OPENCODE_SHOW_TTFD: truthy(\"OPENCODE_SHOW_TTFD\"),\n OPENCODE_DISABLE_AUTOCOMPACT: truthy(\"OPENCODE_DISABLE_AUTOCOMPACT\"),\n OPENCODE_DISABLE_MODELS_FETCH: truthy(\"OPENCODE_DISABLE_MODELS_FETCH\"),\n OPENCODE_DISABLE_MOUSE: truthy(\"OPENCODE_DISABLE_MOUSE\"),\n OPENCODE_FAKE_VCS: process.env[\"OPENCODE_FAKE_VCS\"],\n OPENCODE_SERVER_PASSWORD: process.env[\"OPENCODE_SERVER_PASSWORD\"],\n OPENCODE_SERVER_USERNAME: process.env[\"OPENCODE_SERVER_USERNAME\"],\n OPENCODE_DISABLE_FFF: fff === undefined ? process.platform === \"win32\" : truthy(\"OPENCODE_DISABLE_FFF\"),\n OPENCODE_DISABLE_FILEWATCHER: truthy(\"OPENCODE_DISABLE_FILEWATCHER\"),\n\n // Experimental\n OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT:\n copy === undefined ? process.platform === \"win32\" : truthy(\"OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT\"),\n OPENCODE_MODELS_URL: process.env[\"OPENCODE_MODELS_URL\"],\n OPENCODE_MODELS_PATH: process.env[\"OPENCODE_MODELS_PATH\"],\n OPENCODE_DB: process.env[\"OPENCODE_DB\"],\n\n OPENCODE_WORKSPACE_ID: process.env[\"OPENCODE_WORKSPACE_ID\"],\n OPENCODE_EXPERIMENTAL_WORKSPACES: enabledByExperimental(\"OPENCODE_EXPERIMENTAL_WORKSPACES\"),\n\n // Evaluated at access time (not module load) because tests, the CLI, and\n // external tooling set these env vars at runtime.\n get OPENCODE_DISABLE_PROJECT_CONFIG() {\n return truthy(\"OPENCODE_DISABLE_PROJECT_CONFIG\")\n },\n get OPENCODE_EXPERIMENTAL_REFERENCES() {\n return enabledByExperimental(\"OPENCODE_EXPERIMENTAL_REFERENCES\")\n },\n get OPENCODE_TUI_CONFIG() {\n return process.env[\"OPENCODE_TUI_CONFIG\"]\n },\n get OPENCODE_CONFIG_DIR() {\n return process.env[\"OPENCODE_CONFIG_DIR\"]\n },\n get OPENCODE_PURE() {\n return truthy(\"OPENCODE_PURE\")\n },\n get OPENCODE_PERMISSION() {\n return process.env[\"OPENCODE_PERMISSION\"]\n },\n get OPENCODE_PLUGIN_META_FILE() {\n return process.env[\"OPENCODE_PLUGIN_META_FILE\"]\n },\n get OPENCODE_CLIENT() {\n return process.env[\"OPENCODE_CLIENT\"] ?? \"cli\"\n },\n}\n" | ||
| ], | ||
| "mappings": ";AAEO,SAAS,CAAM,CAAC,EAAa,CAClC,IAAM,EAAQ,QAAQ,IAAI,IAAM,YAAY,EAC5C,OAAO,IAAU,QAAU,IAAU,IAGvC,IAAM,EAAO,QAAQ,IAAI,6CACnB,EAAM,QAAQ,IAAI,qBAExB,SAAS,CAAqB,CAAC,EAAa,CAC1C,OAAO,QAAQ,IAAI,KAAS,OAAY,EAAO,uBAAuB,EAAI,EAAO,CAAG,EAG/E,IAAM,EAAO,CAClB,4BAA6B,QAAQ,IAAI,4BACzC,2BAA4B,QAAQ,IAAI,2BAExC,4BAA6B,EAAO,6BAA6B,EACjE,uBAAwB,QAAQ,IAAI,uBACpC,gBAAiB,QAAQ,IAAI,gBAC7B,wBAAyB,QAAQ,IAAI,wBACrC,4BAA6B,EAAO,6BAA6B,EACjE,8BAA+B,EAAO,+BAA+B,EACrE,uBAAwB,EAAO,wBAAwB,EACvD,gCAAiC,EAAO,iCAAiC,EACzE,mBAAoB,EAAO,oBAAoB,EAC/C,6BAA8B,EAAO,8BAA8B,EACnE,8BAA+B,EAAO,+BAA+B,EACrE,uBAAwB,EAAO,wBAAwB,EACvD,kBAAmB,QAAQ,IAAI,kBAC/B,yBAA0B,QAAQ,IAAI,yBACtC,yBAA0B,QAAQ,IAAI,yBACtC,qBAAsB,IAAQ,OAAY,GAA+B,EAAO,sBAAsB,EACtG,6BAA8B,EAAO,8BAA8B,EAGnE,6CACE,IAAS,OAAY,GAA+B,EAAO,8CAA8C,EAC3G,oBAAqB,QAAQ,IAAI,oBACjC,qBAAsB,QAAQ,IAAI,qBAClC,YAAa,QAAQ,IAAI,YAEzB,sBAAuB,QAAQ,IAAI,sBACnC,iCAAkC,EAAsB,kCAAkC,KAItF,gCAA+B,EAAG,CACpC,OAAO,EAAO,iCAAiC,MAE7C,iCAAgC,EAAG,CACrC,OAAO,EAAsB,kCAAkC,MAE7D,oBAAmB,EAAG,CACxB,OAAO,QAAQ,IAAI,wBAEjB,oBAAmB,EAAG,CACxB,OAAO,QAAQ,IAAI,wBAEjB,cAAa,EAAG,CAClB,OAAO,EAAO,eAAe,MAE3B,oBAAmB,EAAG,CACxB,OAAO,QAAQ,IAAI,wBAEjB,0BAAyB,EAAG,CAC9B,OAAO,QAAQ,IAAI,8BAEjB,gBAAe,EAAG,CACpB,OAAO,QAAQ,IAAI,iBAAsB,MAE7C", | ||
| "debugId": "C3F337B7904EE60864756E2164756E21", | ||
| "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": "26B34B0E6CBF901664756E2164756E21", | ||
| "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": ";i/BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,SAAM,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": "8D446B788F974FF664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": "FB87FF499F4D9E0F64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/installation/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare global {\n const OPENCODE_VERSION: string\n const OPENCODE_CHANNEL: string\n}\n\nexport const InstallationVersion = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nexport const InstallationChannel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\nexport const InstallationLocal = InstallationChannel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAKO,IAAM,EAA6D,mBAC7D,EAA6D,OAC7D,EAAoB", | ||
| "debugId": "A782260327D9CD4C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\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 hostname,\n port,\n password,\n database: {\n path: process.env.OPENCODE_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 },\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: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction 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": "2D9D110B3E96116264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "617F5451D05A50E464756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts", "src/util/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function defaultPort(channel = InstallationChannel) {\n if (channel === \"latest\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n return {\n file,\n version: InstallationVersion,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n", | ||
| "import path from \"node:path\"\n\nexport function selfCommand() {\n const runtime = path.basename(process.execPath, path.extname(process.execPath)).toLowerCase()\n if (runtime !== \"bun\" && runtime !== \"node\" && runtime !== \"nodejs\") return [process.execPath]\n if (!process.argv[1]) throw new Error(\"Failed to resolve CLI entrypoint\")\n if (runtime === \"node\" || runtime === \"nodejs\") return [process.execPath, ...nodeFlags(), process.argv[1]]\n return [process.execPath, process.argv[1]]\n}\n\nfunction nodeFlags() {\n return process.execArgv.flatMap((arg, index, args) => {\n if (index > 0 && args[index - 1] === \"--conditions\") return []\n if (arg === \"--conditions\") return args[index + 1] ? [arg, args[index + 1]] : []\n if (arg.startsWith(\"--conditions=\")) return [arg]\n if (\n arg === \"--experimental-ffi\" ||\n arg === \"--use-system-ca\" ||\n arg === \"--enable-source-maps\" ||\n arg === \"--no-addons\"\n )\n return [arg]\n if (arg === \"--no-warnings\" || arg.startsWith(\"--disable-warning=\")) return [arg]\n return []\n })\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "3018EFA96BE5F1F964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "432D22233CD650BF64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-images.ts", "../ai/src/providers/openai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest, 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": "25210C75951610CF64756E2164756E21", | ||
| "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": ";0wBAeA,SAAM,OAAU,kBACH,OAAmB,2BACnB,OAAO,2BACP,OAAY,qBAgDnB,OAAmB,OAAO,YAAO,MACrC,UAAM,OAAO,MACX,EAAO,OAAO,CACZ,SAAU,EAAa,EAAO,MAAM,EACpC,IAAK,EAAa,EAAO,MAAM,EAC/B,eAAgB,EAAa,EAAO,MAAM,EAC1C,UAAW,EAAa,EAAO,MAAM,CACvC,CAAC,CACH,EACA,MAAO,EAAO,SAAS,EAAO,OAAO,CACvC,CAAC,EAUK,EAAgB,CAAC,IAAyC,CAC9D,GAAI,CAAC,EAAS,OACd,IAAQ,cAAa,oBAAmB,GAAW,EACnD,MAAO,CACL,aAAc,EACd,gBAAiB,KACd,CACL,GAGI,EAAgB,CAAC,IACrB,IAAI,EAAS,CACX,OAAQ,EACR,OAAQ,WACR,OAAQ,IAAI,EAA4B,CAAE,UAAS,MAAO,CAAQ,CAAC,CACrE,CAAC,EAEG,EAAa,CAAC,EAAa,IAA8C,CAC7E,GAAI,CAAC,EAAO,OAAO,EACnB,IAAM,EAAO,IAAI,IAAI,CAAG,EAExB,OADA,OAAO,QAAQ,CAAK,EAAE,QAAQ,EAAE,EAAK,KAAW,EAAK,aAAa,IAAI,EAAK,CAAK,CAAC,EAC1E,EAAK,SAAS,GAGV,GAAQ,CAAC,IAAsB,CAC1C,IAAM,EAAqC,CACzC,GAAI,EACJ,SAAU,EAAO,GAAG,oBAAoB,EAAE,SAAU,CAAC,EAA2C,EAAS,CACvG,IAAM,EAAO,EAAiB,EAAQ,MAAM,KAAM,EAAQ,IAAI,EACxD,GAAmB,EAAQ,QAAU,CAAC,GAAG,IAAI,CAAC,IAAU,CAC5D,GAAI,EAAM,OAAS,QAAS,MAAO,CAAE,IAAK,EAAY,QAAQ,CAAK,EAAG,KAAM,WAAqB,EACjG,GAAI,EAAM,OAAS,MAAO,MAAO,CAAE,IAAK,EAAM,IAAK,KAAM,WAAqB,EAC9E,GAAI,EAAM,OAAS,UAAW,MAAO,CAAE,QAAS,EAAM,EAAG,EACzD,OACD,EACD,GAAI,EAAgB,KAAK,CAAC,IAAU,IAAU,MAAS,EACrD,OAAO,MAAO,EAAY,QAAQ,EAAS,+DAA+D,EAC5G,IAAM,EAAc,EAClB,CACE,MAAO,EAAQ,MAAM,GACrB,OAAQ,EAAQ,OAChB,MAAO,EAAgB,SAAW,EAAI,EAAgB,GAAK,OAC3D,OAAQ,EAAgB,OAAS,EAAI,EAAkB,MACzD,EACA,EAAc,EAAQ,OAAO,EAC7B,GAAM,IACR,EACM,EAAO,EAAe,WAAW,CAAW,EAC5C,EAAM,EACV,IAAI,EAAM,SAAW,GAAkB,QAAQ,MAAO,EAAE,IAAI,EAAgB,SAAW,EAAI,EAAO,IAClG,GAAM,KACR,EACM,EAAU,MAAO,EAAK,SAAS,EAAM,IAAI,EAAE,CAC/C,UACA,OAAQ,OACR,MACA,KAAM,EACN,QAAS,EAAQ,UAAU,IAAK,EAAM,WAAY,GAAM,OAAQ,CAAC,CACnE,CAAC,EAOK,EAAU,OANC,MAAO,EACtB,EAAkB,KAAK,CAAG,EAAE,KAC1B,EAAkB,WAAW,CAAO,EACpC,EAAkB,SAAS,EAAM,kBAAkB,CACrD,CACF,GACgC,KAAK,KACnC,EAAO,SAAS,IAAM,EAAc,wCAAwC,CAAC,CAC/E,EACM,EAAU,MAAO,EAAO,oBAAoB,CAAgB,EAAE,CAAO,EAAE,KAC3E,EAAO,SAAS,IAAM,EAAc,yCAAyC,CAAC,CAChF,EACM,EAAS,MAAO,EAAO,QAAQ,EAAQ,KAAM,CAAC,EAAM,IAAU,CAClE,IAAM,EAAY,EAAK,WAAa,2BACpC,GAAI,EAAK,SACP,OAAO,EAAO,WAAW,EAAS,aAAa,EAAK,QAAQ,CAAC,EAAE,KAC7D,EAAO,SAAS,IAAM,EAAc,qBAAqB,gCAAoC,CAAC,EAC9F,EAAO,IACL,CAAC,IACC,IAAI,EAAe,CACjB,YACA,OACA,iBACE,EAAK,iBAAmB,QAAa,EAAK,iBAAmB,KACzD,OACA,CAAE,IAAK,CAAE,cAAe,EAAK,cAAe,CAAE,CACtD,CAAC,CACL,CACF,EACF,GAAI,EAAK,IACP,OAAO,EAAO,QACZ,IAAI,EAAe,CACjB,YACA,KAAM,EAAK,IACX,iBACE,EAAK,iBAAmB,QAAa,EAAK,iBAAmB,KACzD,OACA,CAAE,IAAK,CAAE,cAAe,EAAK,cAAe,CAAE,CACtD,CAAC,CACH,EACF,OAAO,EAAO,KAAK,EAAc,qBAAqB,oCAAwC,CAAC,EAChG,EACD,GAAI,EAAO,SAAW,EAAG,OAAO,MAAO,EAAc,+BAA+B,EACpF,IAAM,EAAQ,EAAe,SAAS,EAAQ,KAAK,EAAI,EAAQ,MAAQ,OACvE,OAAO,IAAI,EAAc,CACvB,SACA,MAAO,IAAU,OAAY,OAAY,IAAI,EAAM,CAAE,iBAAkB,CAAE,IAAK,CAAM,CAAE,CAAC,EACvF,iBAAkB,IAAU,OAAY,OAAY,CAAE,IAAK,CAAE,OAAM,CAAE,CACvE,CAAC,EACF,CACH,EACA,OAAO,EAAW,KAAsB,CAAE,GAAI,EAAM,GAAI,SAAU,MAAO,QAAO,KAAM,EAAM,IAAK,CAAC,GAGvF,EAAY,CACvB,QACF,ECjMO,IAAM,EAAK,EAAW,KAAK,KAAK,EAS1B,GAAS,CAAiB,EAA4B,CAAK,EAElE,EAAO,CAAC,IAA4C,EAAY,OAAO,EAAS,aAAa,EAE7F,GAA2B,CAAC,IAAwB,CACxD,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAAuB,EAAM,KAAK,IAC7B,EACH,SAAU,EACV,SAAU,CAAE,QAAS,GAAoC,EAAS,IAAI,OAAQ,EAC9E,KAAM,EAAK,CAAK,CAClB,CAAC,GAGG,GAAsB,CAAC,IAAwB,CACnD,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAA4B,EAAM,KAAK,IAClC,EACH,SAAU,EACV,SAAU,CAAE,QAAS,GAAoC,EAAS,IAAI,OAAQ,EAC9E,KAAM,EAAK,CAAK,CAClB,CAAC,GAGU,EAAY,CAAC,EAAsB,CAAC,IAAM,CACrD,IAAM,EAAiB,GAAyB,CAAK,EAC/C,EAAY,GAAoB,CAAK,EACrC,EAAY,CAAC,IAA8B,EAAe,MAAM,CAAE,GAAI,CAAQ,CAAC,EAUrF,MAAO,CACL,KACA,MAAO,EACP,YACA,KAbW,CAAC,IAA8B,EAAU,MAAM,CAAE,GAAI,CAAQ,CAAC,EAczE,MAbY,CAAC,IACb,EAAU,MAAM,CACd,GAAI,EACJ,KAAM,EAAK,CAAK,EAChB,QAAS,EAAM,SAAoC,EAAS,IAAI,QAChE,QAAS,EAAM,QACf,KAAM,EAAM,OAAS,OAAY,OAAY,EAAY,KAAK,EAAM,IAAI,CAC1E,CAAC,EAOD,WACF,GAGW,EAAW,EAAU,EACrB,GAAQ,EAAS,MACjB,GAAY,EAAS,UACrB,GAAO,EAAS,KAChB,GAAQ,EAAS", | ||
| "debugId": "FCA7B9B4834F582564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "EB340A0043CB5A3464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/effect/layer-node.ts", "../core/src/effect/app-node.ts", "../core/src/global.ts", "../../node_modules/.bun/xdg-basedir@5.1.0/node_modules/xdg-basedir/index.js", "../core/src/util/flock.ts", "../core/src/util/hash.ts"], | ||
| "sourcesContent": [ | ||
| "import { Brand, Context, Layer } from \"effect\"\n\ntype AnyNode = Node<unknown, unknown, any>\ntype RuntimeLayer = Layer.Layer<never, unknown, unknown>\ntype NodeList<Item extends AnyNode = AnyNode> = readonly [] | readonly [Item, ...Item[]]\nexport type Output<Item> = [Item] extends [never] ? never : Item extends Node<infer A, unknown, any> ? A : never\nexport type Error<Item> = [Item] extends [never] ? never : Item extends Node<unknown, infer E, any> ? E : never\ntype NodeTag<Item> = [Item] extends [never] ? undefined : Item extends Node<unknown, unknown, infer T> ? T : never\ntype Missing<Required, Dependencies extends NodeList> = Exclude<Required, Output<Dependencies[number]>>\ntype CheckDependencies<Implementation extends Layer.Any, Dependencies extends NodeList> = [\n Missing<Layer.Services<Implementation>, Dependencies>,\n] extends [never]\n ? unknown\n : { readonly \"Missing dependencies\": Missing<Layer.Services<Implementation>, Dependencies> }\ndeclare const $OutputType: unique symbol\ndeclare const $ErrorType: unique symbol\n\nexport type Tag<Name extends string = string> = Name & Brand.Brand<\"LayerNode.Tag\">\n\nconst makeTag = Brand.nominal<Tag>()\n\nexport interface Node<A, E = never, T extends Tag | undefined = undefined> {\n readonly kind: \"layer\" | \"unbound\" | \"group\"\n readonly name: string\n readonly service?: Context.Service.Any\n readonly implementation?: Layer.Any\n readonly dependencies: readonly AnyNode[]\n readonly tag?: T\n readonly [$OutputType]?: () => A\n readonly [$ErrorType]?: () => E\n}\n\ntype NodeIdentity =\n | { readonly service: Context.Service.Any; readonly name?: never }\n | { readonly name: string; readonly service?: never }\ntype DistributiveOmit<A, K extends PropertyKey> = A extends unknown ? Omit<A, K> : never\n\nexport type TagConfig = Readonly<Record<string, readonly string[]>>\ntype TagNames<Config extends TagConfig> = keyof Config & string\ntype NodeInTags<Names extends string> = Node<unknown, unknown, Tag<Names> | undefined>\ntype CheckTags<Items extends NodeList, Names extends string> = [Exclude<Items[number], NodeInTags<Names>>] extends [\n never,\n]\n ? unknown\n : { readonly \"Invalid tag dependencies\": Exclude<Items[number], NodeInTags<Names>> }\n\nexport interface Tags<Config extends TagConfig> {\n readonly values: { readonly [Name in TagNames<Config>]: Tag<Name> }\n readonly make: <Name extends TagNames<Config>>(\n name: Name,\n ) => <const Implementation extends Layer.Any, const Items extends NodeList>(\n input: DistributiveOmit<MakeInput<Implementation, Items, Tag<Name>>, \"tag\"> &\n CheckTags<Items, Name | Extract<Config[Name][number], string>>,\n ) => Node<Layer.Success<Implementation>, Layer.Error<Implementation> | Error<Items[number]>, Tag<Name>>\n}\n\nexport function tags<const Config extends { readonly [Name in keyof Config]: readonly (keyof Config & string)[] }>(\n config: Config,\n): Tags<Config> {\n const names = Object.keys(config) as TagNames<Config>[]\n const values = Object.fromEntries(names.map((name) => [name, makeTag(name)])) as Tags<Config>[\"values\"]\n return {\n values,\n make: ((name: TagNames<Config>) => (input: DistributiveOmit<MakeInput<Layer.Any, NodeList, Tag>, \"tag\">) =>\n make({ ...input, tag: values[name] })) as Tags<Config>[\"make\"],\n }\n}\n\n// Nodes ---------------------------------------------------------------------\n\ntype MakeInput<\n Implementation extends Layer.Any,\n Items extends NodeList,\n T extends Tag | undefined = undefined,\n> = NodeIdentity & {\n readonly layer: Implementation\n readonly deps: Items & CheckDependencies<Implementation, NoInfer<Items>>\n readonly tag?: T\n}\n\nexport function make<\n const Implementation extends Layer.Any,\n const Items extends NodeList,\n const T extends Tag | undefined = undefined,\n>(\n input: MakeInput<Implementation, Items, T>,\n): Node<Layer.Success<Implementation>, Layer.Error<Implementation> | Error<Items[number]>, T> {\n return {\n kind: \"layer\",\n name: input.service !== undefined ? input.service.key : input.name,\n service: input.service,\n implementation: input.layer,\n dependencies: input.deps,\n tag: input.tag,\n }\n}\n\nexport function unbound<R, Shape, const T extends Tag>(service: Context.Key<R, Shape>, tag: T): Node<R, never, T> {\n return {\n kind: \"unbound\",\n name: service.key,\n service,\n dependencies: [],\n tag,\n }\n}\n\nexport function group<const Items extends readonly AnyNode[]>(\n dependencies: Items,\n): Node<Output<Items[number]>, Error<Items[number]>, NodeTag<Items[number]>> {\n return { kind: \"group\", name: \"group\", dependencies }\n}\n\nexport type Replacement = readonly [source: AnyNode, replacement: AnyNode | Layer.Any]\nexport type Replacements = readonly Replacement[]\n\ntype CheckReplacementErrors<SourceError, ReplacementError> = [Exclude<ReplacementError, SourceError>] extends [never]\n ? unknown\n : { readonly \"New replacement errors\": Exclude<ReplacementError, SourceError> }\n\ntype CheckReplacement<Item> = Item extends readonly [Node<infer A, infer E, infer T>, infer Replacement]\n ? Replacement extends Node<NoInfer<A>, infer E2, T>\n ? CheckReplacementErrors<E, NoInfer<E2>>\n : Replacement extends Layer.Layer<NoInfer<A>, infer E2, infer _R>\n ? CheckReplacementErrors<E, NoInfer<E2>>\n : { readonly \"Invalid replacement\": Replacement }\n : { readonly \"Invalid replacement\": Item }\n\ntype CheckReplacements<Items extends Replacements> = {\n readonly [K in keyof Items]: CheckReplacement<Items[K]>\n}\n\ntype ValidReplacements<Items extends Replacements> = Items & CheckReplacements<Items>\n\nfunction replacementNode(source: AnyNode, replacement: AnyNode | Layer.Any) {\n const replacementNode: AnyNode = isNode(replacement)\n ? replacement\n : {\n kind: \"layer\",\n name: source.name,\n service: source.service,\n implementation: replacement,\n dependencies: source.dependencies,\n tag: source.tag,\n }\n if (source.name !== replacementNode.name) {\n throw new Error(`Cannot replace ${source.name} with ${replacementNode.name}`)\n }\n if (source.tag !== replacementNode.tag) {\n throw new Error(`Cannot replace ${source.name} across tags`)\n }\n return replacementNode\n}\n\nfunction isNode(input: Layer.Any | AnyNode): input is AnyNode {\n return \"kind\" in input && \"dependencies\" in input\n}\n\n// Tree -----------------------------------------------------------------------\n\ntype Visit<Result> = (node: AnyNode, context: VisitContext<Result>) => Result\n\ntype VisitContext<Result> = {\n readonly cache: Map<AnyNode, Result>\n readonly visit: (node: AnyNode) => Result\n}\n\nfunction walk<Result>(\n root: AnyNode,\n visit: Visit<Result>,\n options: {\n readonly cache?: Map<AnyNode, Result>\n readonly resolve?: (node: AnyNode) => AnyNode\n readonly detectCycles?: boolean\n } = {},\n) {\n const cache = options.cache ?? new Map<AnyNode, Result>()\n const visiting = new Set<AnyNode>()\n const stack: AnyNode[] = []\n\n const recur = (node: AnyNode): Result => {\n const target = options.resolve?.(node) ?? node\n const cached = cache.get(target)\n if (cached !== undefined || cache.has(target)) return cached!\n\n if (options.detectCycles !== false && visiting.has(target)) {\n const start = stack.indexOf(target)\n throw new Error(\n `Cycle detected in layer tree: ${[...stack.slice(start), target].map((item) => item.name).join(\" -> \")}`,\n )\n }\n\n visiting.add(target)\n stack.push(target)\n try {\n const result = visit(target, { cache, visit: recur })\n if (!cache.has(target)) cache.set(target, result)\n return result\n } finally {\n stack.pop()\n visiting.delete(target)\n }\n }\n\n return recur(root)\n}\n\nexport function hoist<A, E, T extends Tag, const Items extends Replacements = readonly []>(\n root: Node<A, E, any>,\n tag: T,\n replacements?: ValidReplacements<Items>,\n): {\n readonly node: Node<A, E>\n readonly hoisted: Node<unknown, E>\n} {\n const hoisted = new Map<string, AnyNode>()\n const replacementMap = replacementMapFrom(replacements)\n\n const node = walk<AnyNode>(\n root,\n (node, context) => {\n if (node.kind === \"group\") {\n return { ...node, dependencies: node.dependencies.map(context.visit) }\n }\n if (node.tag === tag) {\n const existing = hoisted.get(node.name)\n if (existing && existing.implementation !== node.implementation) {\n throw new Error(`Tag ${tag} has conflicting implementations for ${node.name}`)\n }\n hoisted.set(node.name, rewriteReplacementDependencies(node, replacementMap))\n return group([])\n }\n if (node.kind === \"unbound\") {\n return node\n }\n return { ...node, dependencies: node.dependencies.map(context.visit) }\n },\n { resolve: (node) => replacementMap.get(node.name) ?? node },\n )\n\n return {\n node: node as Node<A, E>,\n hoisted: group(Array.from(hoisted.values())) as Node<unknown, E>,\n }\n}\n\nexport function compile<A, E, const Items extends Replacements = readonly []>(\n root: Node<A, E, any>,\n replacements?: ValidReplacements<Items>,\n): Layer.Layer<A, E> {\n const replacementMap = replacementMapFrom(replacements)\n const cache = new Map<AnyNode, RuntimeLayer>()\n const compileNode = (node: AnyNode) =>\n walk<RuntimeLayer>(\n node,\n (node, context) => {\n if (node.kind === \"unbound\") throw new Error(`Unbound layer node: ${node.name}`)\n const dependencies = node.dependencies.flatMap(flatten).map(context.visit)\n const implementation = node.implementation! as RuntimeLayer\n return dependencies.length === 0\n ? implementation\n : implementation.pipe(Layer.provide(dependencies as [RuntimeLayer, ...RuntimeLayer[]]))\n },\n { cache, resolve: (node) => replacementMap.get(node.name) ?? node },\n )\n const layers = flatten(root).map((node) => compileNode(node))\n const layer = layers.reduce<RuntimeLayer>((result, layer) => layer.pipe(Layer.provideMerge(result)), Layer.empty)\n return layer as Layer.Layer<A, E>\n}\n\nfunction replacementMapFrom(replacements?: Replacements) {\n return (\n replacements?.reduce((map, [source, replacement]) => {\n const normalized = rewriteReplacementDependencies(replacementNode(source, replacement), map)\n const current = new Map([[source.name, normalized]])\n for (const [name, node] of map) map.set(name, rewriteReplacementDependencies(node, current))\n map.set(source.name, normalized)\n return map\n }, new Map<string, AnyNode>()) ?? new Map<string, AnyNode>()\n )\n}\n\nfunction rewriteReplacementDependencies(root: AnyNode, replacements: ReadonlyMap<string, AnyNode>) {\n if (replacements.size === 0) return root\n const cache = new Map<AnyNode, AnyNode>()\n const visiting = new Set<AnyNode>()\n const stack: AnyNode[] = []\n\n const recur = (node: AnyNode, isRoot = false): AnyNode => {\n const target = isRoot ? node : (replacements.get(node.name) ?? node)\n const cached = cache.get(target)\n if (cached !== undefined || cache.has(target)) return cached!\n if (visiting.has(target)) {\n const start = stack.indexOf(target)\n throw new Error(\n `Cycle detected in layer tree: ${[...stack.slice(start), target].map((item) => item.name).join(\" -> \")}`,\n )\n }\n\n visiting.add(target)\n stack.push(target)\n try {\n const dependencies = target.dependencies.map((dependency) => recur(dependency))\n const result = dependencies.every((dependency, index) => dependency === target.dependencies[index])\n ? target\n : { ...target, dependencies }\n cache.set(target, result)\n return result\n } finally {\n stack.pop()\n visiting.delete(target)\n }\n }\n\n return recur(root, true)\n}\n\nexport function hasUnbound(root: Node<unknown, unknown, any>, source: AnyNode): boolean {\n if (source.kind !== \"unbound\") throw new Error(`Cannot check non-unbound layer node: ${source.name}`)\n return walk<boolean>(root, (node, context) => {\n if (node === source) return true\n return node.dependencies.some(context.visit)\n })\n}\n\nfunction flatten(node: AnyNode): readonly AnyNode[] {\n return node.kind === \"group\" ? node.dependencies.flatMap(flatten) : [node]\n}\n\nexport * as LayerNode from \"./layer-node\"\n", | ||
| "import { LayerNode } from \"./layer-node\"\n\nexport const tags = LayerNode.tags({\n location: [\"global\"],\n global: [],\n})\n\nexport type GlobalNode<A, E = never> = LayerNode.Node<A, E, (typeof tags.values)[\"global\"]>\nexport type LocationNode<A, E = never> = LayerNode.Node<A, E, (typeof tags.values)[\"location\"]>\n\nexport const makeGlobalNode = tags.make(\"global\")\nexport const makeLocationNode = tags.make(\"location\")\n\nexport * as Node from \"./app-node\"\n", | ||
| "import path from \"path\"\nimport fs from \"fs/promises\"\nimport { xdgData, xdgCache, xdgConfig, xdgState } from \"xdg-basedir\"\nimport os from \"os\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { Flock } from \"./util/flock\"\nimport { makeGlobalNode } from \"./effect/app-node\"\n\nconst app = \"opencode\"\nconst data = path.join(xdgData!, app)\nconst cache = path.join(xdgCache!, app)\nconst config = path.join(xdgConfig!, app)\nconst state = path.join(xdgState!, app)\nconst tmp = path.join(os.tmpdir(), app)\n\nconst paths = {\n get home() {\n return process.env.OPENCODE_TEST_HOME ?? os.homedir()\n },\n data,\n bin: path.join(cache, \"bin\"),\n log: path.join(data, \"log\"),\n repos: path.join(data, \"repos\"),\n cache,\n config,\n state,\n tmp,\n}\n\nexport const Path = paths\n\nFlock.setGlobal({ state })\n\nawait Promise.all([\n fs.mkdir(Path.data, { recursive: true }),\n fs.mkdir(Path.config, { recursive: true }),\n fs.mkdir(Path.state, { recursive: true }),\n fs.mkdir(Path.tmp, { recursive: true }),\n fs.mkdir(Path.log, { recursive: true }),\n fs.mkdir(Path.bin, { recursive: true }),\n fs.mkdir(Path.repos, { recursive: true }),\n])\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Global\") {}\n\nexport interface Interface {\n readonly home: string\n readonly data: string\n readonly cache: string\n readonly config: string\n readonly state: string\n readonly tmp: string\n readonly bin: string\n readonly log: string\n readonly repos: string\n}\n\nexport function make(input: Partial<Interface> = {}): Interface {\n return {\n home: Path.home,\n data: Path.data,\n cache: Path.cache,\n config: Path.config,\n state: Path.state,\n tmp: Path.tmp,\n bin: Path.bin,\n log: Path.log,\n repos: Path.repos,\n ...input,\n }\n}\n\nconst layer = Layer.effect(\n Service,\n Effect.sync(() => Service.of(make({ config: process.env.OPENCODE_CONFIG_DIR ?? Path.config }))),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer: layer, deps: [] })\n\nexport const layerWith = (input: Partial<Interface>) =>\n Layer.effect(\n Service,\n Effect.sync(() => Service.of(make(input))),\n )\n\nexport * as Global from \"./global\"\n", | ||
| "import os from 'os';\nimport path from 'path';\n\nconst homeDirectory = os.homedir();\nconst {env} = process;\n\nexport const xdgData = env.XDG_DATA_HOME ||\n\t(homeDirectory ? path.join(homeDirectory, '.local', 'share') : undefined);\n\nexport const xdgConfig = env.XDG_CONFIG_HOME ||\n\t(homeDirectory ? path.join(homeDirectory, '.config') : undefined);\n\nexport const xdgState = env.XDG_STATE_HOME ||\n\t(homeDirectory ? path.join(homeDirectory, '.local', 'state') : undefined);\n\nexport const xdgCache = env.XDG_CACHE_HOME || (homeDirectory ? path.join(homeDirectory, '.cache') : undefined);\n\nexport const xdgRuntime = env.XDG_RUNTIME_DIR || undefined;\n\nexport const xdgDataDirectories = (env.XDG_DATA_DIRS || '/usr/local/share/:/usr/share/').split(':');\n\nif (xdgData) {\n\txdgDataDirectories.unshift(xdgData);\n}\n\nexport const xdgConfigDirectories = (env.XDG_CONFIG_DIRS || '/etc/xdg').split(':');\n\nif (xdgConfig) {\n\txdgConfigDirectories.unshift(xdgConfig);\n}\n", | ||
| "import path from \"path\"\nimport os from \"os\"\nimport { randomBytes, randomUUID } from \"crypto\"\nimport { mkdir, readFile, rm, stat, utimes, writeFile } from \"fs/promises\"\nimport { Hash } from \"./hash\"\nimport { Effect } from \"effect\"\n\nexport type FlockGlobal = {\n state: string\n}\n\nexport namespace Flock {\n let global: FlockGlobal | undefined\n\n export function setGlobal(g: FlockGlobal) {\n global = g\n }\n\n const root = () => {\n if (!global) throw new Error(\"Flock global not set\")\n return path.join(global.state, \"locks\")\n }\n\n // Defaults for callers that do not provide timing options.\n const defaultOpts = {\n staleMs: 60_000,\n timeoutMs: 5 * 60_000,\n baseDelayMs: 100,\n maxDelayMs: 2_000,\n }\n\n export interface WaitEvent {\n key: string\n attempt: number\n delay: number\n waited: number\n }\n\n export type Wait = (input: WaitEvent) => void | Promise<void>\n\n export interface Options {\n dir?: string\n signal?: AbortSignal\n staleMs?: number\n timeoutMs?: number\n baseDelayMs?: number\n maxDelayMs?: number\n onWait?: Wait\n }\n\n type Opts = {\n staleMs: number\n timeoutMs: number\n baseDelayMs: number\n maxDelayMs: number\n }\n\n type Owned = {\n acquired: true\n startHeartbeat: (intervalMs?: number) => void\n release: () => Promise<void>\n }\n\n export interface Lease {\n release: () => Promise<void>\n [Symbol.asyncDispose]: () => Promise<void>\n }\n\n function code(err: unknown) {\n if (typeof err !== \"object\" || err === null || !(\"code\" in err)) return\n const value = err.code\n if (typeof value !== \"string\") return\n return value\n }\n\n function sleep(ms: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error(\"Aborted\"))\n return\n }\n\n let timer: NodeJS.Timeout | undefined\n\n const done = () => {\n signal?.removeEventListener(\"abort\", abort)\n resolve()\n }\n\n const abort = () => {\n if (timer) {\n clearTimeout(timer)\n }\n signal?.removeEventListener(\"abort\", abort)\n reject(signal?.reason ?? new Error(\"Aborted\"))\n }\n\n signal?.addEventListener(\"abort\", abort, { once: true })\n timer = setTimeout(done, ms)\n })\n }\n\n function jitter(ms: number) {\n const j = Math.floor(ms * 0.3)\n const d = Math.floor(Math.random() * (2 * j + 1)) - j\n return Math.max(0, ms + d)\n }\n\n function mono() {\n return performance.now()\n }\n\n function wall() {\n return performance.timeOrigin + mono()\n }\n\n async function stats(file: string) {\n try {\n return await stat(file)\n } catch (err) {\n const errCode = code(err)\n if (errCode === \"ENOENT\" || errCode === \"ENOTDIR\") return\n throw err\n }\n }\n\n async function stale(lockDir: string, heartbeatPath: string, metaPath: string, staleMs: number) {\n // Stale detection allows automatic recovery after crashed owners.\n const now = wall()\n const heartbeat = await stats(heartbeatPath)\n if (heartbeat) {\n return now - heartbeat.mtimeMs > staleMs\n }\n\n const meta = await stats(metaPath)\n if (meta) {\n return now - meta.mtimeMs > staleMs\n }\n\n const dir = await stats(lockDir)\n if (!dir) {\n return false\n }\n\n return now - dir.mtimeMs > staleMs\n }\n\n async function tryAcquireLockDir(lockDir: string, opts: Opts): Promise<Owned | { acquired: false }> {\n const token = randomUUID?.() ?? randomBytes(16).toString(\"hex\")\n const metaPath = path.join(lockDir, \"meta.json\")\n const heartbeatPath = path.join(lockDir, \"heartbeat\")\n\n try {\n await mkdir(lockDir, { mode: 0o700 })\n } catch (err) {\n if (code(err) !== \"EEXIST\") {\n throw err\n }\n\n if (!(await stale(lockDir, heartbeatPath, metaPath, opts.staleMs))) {\n return { acquired: false }\n }\n\n const breakerPath = lockDir + \".breaker\"\n try {\n await mkdir(breakerPath, { mode: 0o700 })\n } catch (claimErr) {\n const errCode = code(claimErr)\n if (errCode === \"EEXIST\") {\n const breaker = await stats(breakerPath)\n if (breaker && wall() - breaker.mtimeMs > opts.staleMs) {\n await rm(breakerPath, { recursive: true, force: true }).catch(() => undefined)\n }\n return { acquired: false }\n }\n\n if (errCode === \"ENOENT\" || errCode === \"ENOTDIR\") {\n return { acquired: false }\n }\n\n throw claimErr\n }\n\n try {\n // Breaker ownership ensures only one contender performs stale cleanup.\n if (!(await stale(lockDir, heartbeatPath, metaPath, opts.staleMs))) {\n return { acquired: false }\n }\n\n await rm(lockDir, { recursive: true, force: true })\n\n try {\n await mkdir(lockDir, { mode: 0o700 })\n } catch (retryErr) {\n const errCode = code(retryErr)\n if (errCode === \"EEXIST\" || errCode === \"ENOTEMPTY\") {\n return { acquired: false }\n }\n throw retryErr\n }\n } finally {\n await rm(breakerPath, { recursive: true, force: true }).catch(() => undefined)\n }\n }\n\n const meta = {\n token,\n pid: process.pid,\n hostname: os.hostname(),\n createdAt: new Date().toISOString(),\n }\n\n await writeFile(heartbeatPath, \"\", { flag: \"wx\" }).catch(async () => {\n await rm(lockDir, { recursive: true, force: true })\n throw new Error(\"Lock acquired but heartbeat already existed (possible compromise).\")\n })\n\n await writeFile(metaPath, JSON.stringify(meta, null, 2), { flag: \"wx\" }).catch(async () => {\n await rm(lockDir, { recursive: true, force: true })\n throw new Error(\"Lock acquired but meta.json already existed (possible compromise).\")\n })\n\n let timer: NodeJS.Timeout | undefined\n\n const startHeartbeat = (intervalMs = Math.max(100, Math.floor(opts.staleMs / 3))) => {\n if (timer) return\n // Heartbeat prevents long critical sections from being evicted as stale.\n timer = setInterval(() => {\n const t = new Date()\n void utimes(heartbeatPath, t, t).catch(() => undefined)\n }, intervalMs)\n timer.unref?.()\n }\n\n const release = async () => {\n if (timer) {\n clearInterval(timer)\n timer = undefined\n }\n\n const current = await readFile(metaPath, \"utf8\")\n .then((raw) => {\n const parsed = JSON.parse(raw)\n if (!parsed || typeof parsed !== \"object\") return {}\n return {\n token: \"token\" in parsed && typeof parsed.token === \"string\" ? parsed.token : undefined,\n }\n })\n .catch((err) => {\n const errCode = code(err)\n if (errCode === \"ENOENT\" || errCode === \"ENOTDIR\") {\n throw new Error(\"Refusing to release: lock is compromised (metadata missing).\")\n }\n if (err instanceof SyntaxError) {\n throw new Error(\"Refusing to release: lock is compromised (metadata invalid).\")\n }\n throw err\n })\n // Token check prevents deleting a lock that was re-acquired by another process.\n if (current.token !== token) {\n throw new Error(\"Refusing to release: lock token mismatch (not the owner).\")\n }\n\n await rm(lockDir, { recursive: true, force: true })\n }\n\n return {\n acquired: true,\n startHeartbeat,\n release,\n }\n }\n\n async function acquireLockDir(\n lockDir: string,\n input: { key: string; onWait?: Wait; signal?: AbortSignal },\n opts: Opts,\n ) {\n const stop = mono() + opts.timeoutMs\n let attempt = 0\n let waited = 0\n let delay = opts.baseDelayMs\n\n while (true) {\n input.signal?.throwIfAborted()\n\n const res = await tryAcquireLockDir(lockDir, opts)\n if (res.acquired) {\n return res\n }\n\n if (mono() > stop) {\n throw new Error(`Timed out waiting for lock: ${input.key}`)\n }\n\n attempt += 1\n const ms = jitter(delay)\n await input.onWait?.({\n key: input.key,\n attempt,\n delay: ms,\n waited,\n })\n await sleep(ms, input.signal)\n waited += ms\n delay = Math.min(opts.maxDelayMs, Math.floor(delay * 1.7))\n }\n }\n\n export async function acquire(key: string, input: Options = {}): Promise<Lease> {\n input.signal?.throwIfAborted()\n const cfg: Opts = {\n staleMs: input.staleMs ?? defaultOpts.staleMs,\n timeoutMs: input.timeoutMs ?? defaultOpts.timeoutMs,\n baseDelayMs: input.baseDelayMs ?? defaultOpts.baseDelayMs,\n maxDelayMs: input.maxDelayMs ?? defaultOpts.maxDelayMs,\n }\n const dir = input.dir ?? root()\n\n await mkdir(dir, { recursive: true })\n const lockfile = path.join(dir, Hash.fast(key) + \".lock\")\n const lock = await acquireLockDir(\n lockfile,\n {\n key,\n onWait: input.onWait,\n signal: input.signal,\n },\n cfg,\n )\n lock.startHeartbeat()\n\n const release = () => lock.release()\n return {\n release,\n [Symbol.asyncDispose]() {\n return release()\n },\n }\n }\n\n export async function withLock<T>(key: string, fn: () => Promise<T>, input: Options = {}) {\n await using _ = await acquire(key, input)\n input.signal?.throwIfAborted()\n return await fn()\n }\n\n export const effect = Effect.fn(\"Flock.effect\")(function* (key: string, input: Options = {}) {\n return yield* Effect.acquireRelease(\n Effect.promise((signal) => Flock.acquire(key, { ...input, signal })).pipe(\n Effect.withSpan(\"Flock.acquire\", {\n attributes: { key },\n }),\n ),\n (lock) => Effect.promise(() => lock.release()).pipe(Effect.withSpan(\"Flock.release\")),\n ).pipe(Effect.asVoid)\n })\n}\n", | ||
| "import { createHash } from \"crypto\"\n\nexport namespace Hash {\n export function fast(input: string | Buffer): string {\n return createHash(\"sha1\").update(input).digest(\"hex\")\n }\n\n export function sha256(input: string | Buffer): string {\n return createHash(\"sha256\").update(input).digest(\"hex\")\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "A64AE88F2F73772164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Duration, Effect, Fiber, Layer, Schema, Stream } from \"effect\"\nimport type { PlatformError } from \"effect/PlatformError\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { CrossSpawnSpawner } from \"./cross-spawn-spawner\"\nimport { makeGlobalNode } from \"./effect/app-node\"\n\nexport class AppProcessError extends Schema.TaggedErrorClass<AppProcessError>()(\"AppProcessError\", {\n command: Schema.String,\n exitCode: Schema.optional(Schema.Number),\n stderr: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {\n override get message() {\n const detail =\n this.stderr?.trim() || (this.cause instanceof Error ? this.cause.message : this.cause && String(this.cause))\n const status = this.exitCode === undefined ? \"\" : ` (exit ${this.exitCode})`\n return `Command failed${status}: ${this.command}${detail ? `: ${detail}` : \"\"}`\n }\n}\n\nexport interface RunOptions {\n readonly combineOutput?: boolean\n readonly maxOutputBytes?: number\n readonly maxErrorBytes?: number\n readonly signal?: AbortSignal\n readonly timeout?: Duration.Input\n readonly stdin?: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>\n}\n\nexport interface RunStreamOptions {\n readonly signal?: AbortSignal\n readonly includeStderr?: boolean\n readonly okExitCodes?: ReadonlyArray<number>\n readonly maxErrorBytes?: number\n}\n\nexport interface RunResult {\n readonly command: string\n readonly exitCode: number\n readonly output?: Buffer\n readonly stdout: Buffer\n readonly stderr: Buffer\n readonly outputTruncated?: boolean\n readonly stdoutTruncated: boolean\n readonly stderrTruncated: boolean\n}\n\nexport type Interface = ChildProcessSpawner[\"Service\"] & {\n readonly run: (command: ChildProcess.Command, options?: RunOptions) => Effect.Effect<RunResult, AppProcessError>\n readonly runStream: (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ) => Stream.Stream<string, AppProcessError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/AppProcess\") {}\n\nexport const requireSuccess = (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n result.exitCode === 0\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nexport const requireExitIn =\n (codes: ReadonlyArray<number>) =>\n (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n codes.includes(result.exitCode)\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nconst describeCommand = (command: ChildProcess.Command): string => {\n if (command._tag === \"StandardCommand\") {\n return command.args.length ? `${command.command} ${command.args.join(\" \")}` : command.command\n }\n return `${describeCommand(command.left)} | ${describeCommand(command.right)}`\n}\n\nconst wrapError = (description: string, cause: unknown): AppProcessError =>\n cause instanceof AppProcessError ? cause : new AppProcessError({ command: description, cause })\n\nexport const abortError = (signal: AbortSignal): Error => {\n const reason = signal.reason\n if (reason instanceof Error) return reason\n const err = new Error(\"Aborted\")\n err.name = \"AbortError\"\n return err\n}\n\nexport const waitForAbort = (signal: AbortSignal) =>\n Effect.callback<never, Error>((resume) => {\n if (signal.aborted) {\n resume(Effect.fail(abortError(signal)))\n return\n }\n const onabort = () => resume(Effect.fail(abortError(signal)))\n signal.addEventListener(\"abort\", onabort, { once: true })\n return Effect.sync(() => signal.removeEventListener(\"abort\", onabort))\n })\n\nconst normalizeStdin = (\n input: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>,\n): Stream.Stream<Uint8Array, PlatformError> =>\n typeof input === \"string\"\n ? Stream.make(new TextEncoder().encode(input))\n : input instanceof Uint8Array\n ? Stream.make(input)\n : input\n\nexport const collectStream = (stream: Stream.Stream<Uint8Array, PlatformError>, maxOutputBytes: number | undefined) =>\n Stream.runFold(\n stream,\n () => ({ chunks: [] as Uint8Array[], bytes: 0, truncated: false }),\n (acc, chunk) => {\n if (maxOutputBytes === undefined) {\n acc.chunks.push(chunk)\n acc.bytes += chunk.length\n return acc\n }\n const remaining = maxOutputBytes - acc.bytes\n if (remaining > 0) acc.chunks.push(remaining >= chunk.length ? chunk : chunk.slice(0, remaining))\n acc.bytes += chunk.length\n acc.truncated = acc.truncated || acc.bytes > maxOutputBytes\n return acc\n },\n ).pipe(Effect.map((x) => ({ buffer: Buffer.concat(x.chunks), truncated: x.truncated })))\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n\n const runCommand = (command: ChildProcess.Command, options?: RunOptions) => {\n const description = describeCommand(command)\n const collect = Effect.scoped(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n if (options?.combineOutput) {\n const [output, exitCode] = yield* Effect.all(\n [collectStream(handle.all, options.maxOutputBytes), handle.exitCode],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n output: output.buffer,\n stdout: Buffer.alloc(0),\n stderr: Buffer.alloc(0),\n outputTruncated: output.truncated,\n stdoutTruncated: false,\n stderrTruncated: false,\n } satisfies RunResult\n }\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, options?.maxOutputBytes),\n collectStream(handle.stderr, options?.maxErrorBytes),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n stdout: stdout.buffer,\n stderr: stderr.buffer,\n stdoutTruncated: stdout.truncated,\n stderrTruncated: stderr.truncated,\n } satisfies RunResult\n }),\n )\n const timed = options?.timeout\n ? Effect.timeoutOrElse(collect, {\n duration: options.timeout,\n orElse: () => Effect.fail(new AppProcessError({ command: description, cause: new Error(\"Timed out\") })),\n })\n : collect\n const aborted = options?.signal\n ? timed.pipe(\n Effect.raceFirst(\n waitForAbort(options.signal).pipe(Effect.mapError((cause) => wrapError(description, cause))),\n ),\n )\n : timed\n return aborted.pipe(Effect.catch((cause) => Effect.fail(wrapError(description, cause))))\n }\n\n const run = Effect.fn(\"AppProcess.run\")(function* (command: ChildProcess.Command, options?: RunOptions) {\n if (options?.stdin === undefined) return yield* runCommand(command, options)\n if (command._tag !== \"StandardCommand\") {\n return yield* new AppProcessError({\n command: describeCommand(command),\n cause: new Error(\"stdin option only supports StandardCommand; received PipedCommand\"),\n })\n }\n const next = ChildProcess.make(command.command, command.args, {\n ...command.options,\n stdin: normalizeStdin(options.stdin),\n })\n return yield* runCommand(next, options)\n })\n\n const runStream = (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ): Stream.Stream<string, AppProcessError> => {\n const description = describeCommand(command)\n const okExitCodes = options?.okExitCodes\n const built: Stream.Stream<string, AppProcessError | PlatformError> = Stream.unwrap(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n const stderrFiber = yield* Effect.forkScoped(\n collectStream(handle.stderr, options?.maxErrorBytes).pipe(Effect.map((x) => x.buffer.toString(\"utf8\"))),\n )\n const source = options?.includeStderr === true ? handle.all : handle.stdout\n const lines = source.pipe(\n Stream.decodeText,\n Stream.splitLines,\n Stream.filter((line) => line.length > 0),\n )\n const tail = Stream.unwrap(\n Effect.gen(function* () {\n const code = yield* handle.exitCode\n if (okExitCodes && okExitCodes.length > 0 && !okExitCodes.includes(code)) {\n const stderr = yield* Fiber.join(stderrFiber)\n return Stream.fail(new AppProcessError({ command: description, exitCode: code, stderr }))\n }\n return Stream.empty\n }),\n )\n return Stream.concat(lines, tail) as Stream.Stream<string, AppProcessError | PlatformError>\n }),\n )\n const mapped = built.pipe(\n Stream.catch((cause): Stream.Stream<string, AppProcessError> => Stream.fail(wrapError(description, cause))),\n )\n if (!options?.signal) return mapped\n const signal = options.signal\n return mapped.pipe(\n Stream.interruptWhen(waitForAbort(signal).pipe(Effect.mapError((cause) => wrapError(description, cause)))),\n )\n }\n\n return Service.of({ ...spawner, run, runStream })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer: layer, deps: [CrossSpawnSpawner.node] })\n\nexport * as AppProcess from \"./process\"\n" | ||
| ], | ||
| "mappings": ";0aAOO,WAAM,eAAwB,OAAO,iBAAkC,EAAE,kBAAmB,CACjG,QAAS,EAAO,OAChB,SAAU,EAAO,SAAS,EAAO,MAAM,EACvC,OAAQ,EAAO,SAAS,EAAO,MAAM,EACrC,MAAO,EAAO,SAAS,EAAO,OAAO,CAAC,CACxC,CAAC,CAAE,IACY,QAAO,EAAG,CACrB,IAAM,EACJ,KAAK,QAAQ,KAAK,IAAM,KAAK,iBAAiB,MAAQ,KAAK,MAAM,QAAU,KAAK,OAAS,OAAO,KAAK,KAAK,GAE5G,MAAO,iBADQ,KAAK,WAAa,OAAY,GAAK,UAAU,KAAK,gBAC9B,KAAK,UAAU,EAAS,KAAK,IAAW,KAE/E,CAqCO,MAAM,UAAgB,EAAQ,QAA4B,EAAE,sBAAsB,CAAE,CAAC,CAErF,IAAM,EAAiB,CAAC,IAC7B,EAAO,WAAa,EAChB,EAAO,QAAQ,CAAM,EACrB,EAAO,KACL,IAAI,EAAgB,CAClB,QAAS,EAAO,QAChB,SAAU,EAAO,SACjB,OAAQ,EAAO,OAAO,SAAS,MAAM,CACvC,CAAC,CACH,EAEO,EACX,CAAC,IACD,CAAC,IACC,EAAM,SAAS,EAAO,QAAQ,EAC1B,EAAO,QAAQ,CAAM,EACrB,EAAO,KACL,IAAI,EAAgB,CAClB,QAAS,EAAO,QAChB,SAAU,EAAO,SACjB,OAAQ,EAAO,OAAO,SAAS,MAAM,CACvC,CAAC,CACH,EAEF,EAAkB,CAAC,IAA0C,CACjE,GAAI,EAAQ,OAAS,kBACnB,OAAO,EAAQ,KAAK,OAAS,GAAG,EAAQ,WAAW,EAAQ,KAAK,KAAK,GAAG,IAAM,EAAQ,QAExF,MAAO,GAAG,EAAgB,EAAQ,IAAI,OAAO,EAAgB,EAAQ,KAAK,KAGtE,EAAY,CAAC,EAAqB,IACtC,aAAiB,EAAkB,EAAQ,IAAI,EAAgB,CAAE,QAAS,EAAa,OAAM,CAAC,EAEnF,EAAa,CAAC,IAA+B,CACxD,IAAM,EAAS,EAAO,OACtB,GAAI,aAAkB,MAAO,OAAO,EACpC,IAAM,EAAU,MAAM,SAAS,EAE/B,OADA,EAAI,KAAO,aACJ,GAGI,EAAe,CAAC,IAC3B,EAAO,SAAuB,CAAC,IAAW,CACxC,GAAI,EAAO,QAAS,CAClB,EAAO,EAAO,KAAK,EAAW,CAAM,CAAC,CAAC,EACtC,OAEF,IAAM,EAAU,IAAM,EAAO,EAAO,KAAK,EAAW,CAAM,CAAC,CAAC,EAE5D,OADA,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,EAAK,CAAC,EACjD,EAAO,KAAK,IAAM,EAAO,oBAAoB,QAAS,CAAO,CAAC,EACtE,EAEG,EAAiB,CACrB,IAEA,OAAO,IAAU,SACb,EAAO,KAAK,IAAI,YAAY,EAAE,OAAO,CAAK,CAAC,EAC3C,aAAiB,WACf,EAAO,KAAK,CAAK,EACjB,EAEK,EAAgB,CAAC,EAAkD,IAC9E,EAAO,QACL,EACA,KAAO,CAAE,OAAQ,CAAC,EAAmB,MAAO,EAAG,UAAW,EAAM,GAChE,CAAC,EAAK,IAAU,CACd,GAAI,IAAmB,OAGrB,OAFA,EAAI,OAAO,KAAK,CAAK,EACrB,EAAI,OAAS,EAAM,OACZ,EAET,IAAM,EAAY,EAAiB,EAAI,MACvC,GAAI,EAAY,EAAG,EAAI,OAAO,KAAK,GAAa,EAAM,OAAS,EAAQ,EAAM,MAAM,EAAG,CAAS,CAAC,EAGhG,OAFA,EAAI,OAAS,EAAM,OACnB,EAAI,UAAY,EAAI,WAAa,EAAI,MAAQ,EACtC,EAEX,EAAE,KAAK,EAAO,IAAI,CAAC,KAAO,CAAE,OAAQ,OAAO,OAAO,EAAE,MAAM,EAAG,UAAW,EAAE,SAAU,EAAE,CAAC,EAEnF,EAAQ,EAAM,OAClB,EACA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAU,MAAO,EAEjB,EAAa,CAAC,EAA+B,IAAyB,CAC1E,IAAM,EAAc,EAAgB,CAAO,EACrC,EAAU,EAAO,OACrB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAQ,MAAM,CAAO,EAC3C,GAAI,GAAS,cAAe,CAC1B,IAAO,EAAQ,GAAY,MAAO,EAAO,IACvC,CAAC,EAAc,EAAO,IAAK,EAAQ,cAAc,EAAG,EAAO,QAAQ,EACnE,CAAE,YAAa,WAAY,CAC7B,EACA,MAAO,CACL,QAAS,EACT,WACA,OAAQ,EAAO,OACf,OAAQ,OAAO,MAAM,CAAC,EACtB,OAAQ,OAAO,MAAM,CAAC,EACtB,gBAAiB,EAAO,UACxB,gBAAiB,GACjB,gBAAiB,EACnB,EAEF,IAAO,EAAQ,EAAQ,GAAY,MAAO,EAAO,IAC/C,CACE,EAAc,EAAO,OAAQ,GAAS,cAAc,EACpD,EAAc,EAAO,OAAQ,GAAS,aAAa,EACnD,EAAO,QACT,EACA,CAAE,YAAa,WAAY,CAC7B,EACA,MAAO,CACL,QAAS,EACT,WACA,OAAQ,EAAO,OACf,OAAQ,EAAO,OACf,gBAAiB,EAAO,UACxB,gBAAiB,EAAO,SAC1B,EACD,CACH,EACM,EAAQ,GAAS,QACnB,EAAO,cAAc,EAAS,CAC5B,SAAU,EAAQ,QAClB,OAAQ,IAAM,EAAO,KAAK,IAAI,EAAgB,CAAE,QAAS,EAAa,MAAW,MAAM,WAAW,CAAE,CAAC,CAAC,CACxG,CAAC,EACD,EAQJ,QAPgB,GAAS,QACrB,EAAM,KACJ,EAAO,UACL,EAAa,EAAQ,MAAM,EAAE,KAAK,EAAO,SAAS,CAAC,IAAU,EAAU,EAAa,CAAK,CAAC,CAAC,CAC7F,CACF,EACA,GACW,KAAK,EAAO,MAAM,CAAC,IAAU,EAAO,KAAK,EAAU,EAAa,CAAK,CAAC,CAAC,CAAC,GAGnF,EAAM,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAA+B,EAAsB,CACtG,GAAI,GAAS,QAAU,OAAW,OAAO,MAAO,EAAW,EAAS,CAAO,EAC3E,GAAI,EAAQ,OAAS,kBACnB,OAAO,MAAO,IAAI,EAAgB,CAChC,QAAS,EAAgB,CAAO,EAChC,MAAW,MAAM,mEAAmE,CACtF,CAAC,EAEH,IAAM,EAAO,EAAa,KAAK,EAAQ,QAAS,EAAQ,KAAM,IACzD,EAAQ,QACX,MAAO,EAAe,EAAQ,KAAK,CACrC,CAAC,EACD,OAAO,MAAO,EAAW,EAAM,CAAO,EACvC,EAEK,EAAY,CAChB,EACA,IAC2C,CAC3C,IAAM,EAAc,EAAgB,CAAO,EACrC,EAAc,GAAS,YA0BvB,EAzBgE,EAAO,OAC3E,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAQ,MAAM,CAAO,EACrC,EAAc,MAAO,EAAO,WAChC,EAAc,EAAO,OAAQ,GAAS,aAAa,EAAE,KAAK,EAAO,IAAI,CAAC,IAAM,EAAE,OAAO,SAAS,MAAM,CAAC,CAAC,CACxG,EAEM,GADS,GAAS,gBAAkB,GAAO,EAAO,IAAM,EAAO,QAChD,KACnB,EAAO,WACP,EAAO,WACP,EAAO,OAAO,CAAC,IAAS,EAAK,OAAS,CAAC,CACzC,EACM,EAAO,EAAO,OAClB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAO,MAAO,EAAO,SAC3B,GAAI,GAAe,EAAY,OAAS,GAAK,CAAC,EAAY,SAAS,CAAI,EAAG,CACxE,IAAM,EAAS,MAAO,EAAM,KAAK,CAAW,EAC5C,OAAO,EAAO,KAAK,IAAI,EAAgB,CAAE,QAAS,EAAa,SAAU,EAAM,QAAO,CAAC,CAAC,EAE1F,OAAO,EAAO,MACf,CACH,EACA,OAAO,EAAO,OAAO,EAAO,CAAI,EACjC,CACH,EACqB,KACnB,EAAO,MAAM,CAAC,IAAkD,EAAO,KAAK,EAAU,EAAa,CAAK,CAAC,CAAC,CAC5G,EACA,GAAI,CAAC,GAAS,OAAQ,OAAO,EAC7B,IAAM,EAAS,EAAQ,OACvB,OAAO,EAAO,KACZ,EAAO,cAAc,EAAa,CAAM,EAAE,KAAK,EAAO,SAAS,CAAC,IAAU,EAAU,EAAa,CAAK,CAAC,CAAC,CAAC,CAC3G,GAGF,OAAO,EAAQ,GAAG,IAAK,EAAS,MAAK,WAAU,CAAC,EACjD,CACH,EAEa,EAAO,EAAe,CAAE,QAAS,EAAS,MAAO,EAAO,KAAM,CAAC,EAAkB,IAAI,CAAE,CAAC", | ||
| "debugId": "13F0BCBFD9B7706164756E2164756E21", | ||
| "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": ";s4BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH", | ||
| "debugId": "7BA1AD57D82EE0A264756E2164756E21", | ||
| "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 queue up\n// here. The queue drains one turn at a time; ordinary prompts waiting behind\n// an active ordinary turn are exposed for edit/removal until they begin.\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, FooterQueuedPrompt, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype Deferred<T = void> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (error?: unknown) => void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt) => void\n onNewSession?: () => void | Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n queued: FooterQueuedPrompt[]\n active?: RunPrompt\n ctrl?: AbortController\n closed: boolean\n}\n\nfunction defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (error?: unknown) => void\n const promise = new Promise<T>((next, fail) => {\n resolve = next\n reject = fail\n })\n\n return { promise, resolve, reject }\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 remain local and\n// are exposed by the footer for edit/removal until their turn begins.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = defer<{ type: \"closed\" }>()\n const done = defer()\n const state: State = {\n queue: [],\n queued: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\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 syncQueue = () => {\n const queue = state.queue.length\n emit({ type: \"queue\", queue }, { queue })\n emit(\n {\n type: \"queued.prompts\",\n prompts: [...state.queued],\n },\n { queued: state.queued.length },\n )\n }\n\n const removeLocalQueued = (queued: FooterQueuedPrompt) => {\n if (!state.queued.includes(queued)) return\n state.queued = state.queued.filter((item) => item !== queued)\n syncQueue()\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.queued.length = 0\n state.ctrl?.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 const queued = state.queued.find((item) => item.prompt === prompt)\n if (queued) removeLocalQueued(queued)\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n syncQueue()\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 queue: state.queue.length,\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\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 ?? queued?.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n {\n type: \"turn.send\",\n queue: state.queue.length,\n },\n {\n phase: \"running\",\n status: \"sending prompt\",\n queue: state.queue.length,\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n state.ctrl = ctrl\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)\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal).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 } finally {\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\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 {\n type: \"turn.idle\",\n queue: state.queue.length,\n },\n {\n phase: \"idle\",\n status: \"\",\n queue: state.queue.length,\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 !active.command &&\n prompt.mode !== \"shell\" &&\n !prompt.command &&\n !isNewCommand(prompt.text)\n ) {\n const queued: FooterQueuedPrompt = {\n messageID: SessionMessage.ID.create(),\n prompt,\n }\n state.queued = [...state.queued, queued]\n state.queue.push(prompt)\n syncQueue()\n return\n }\n\n state.queue.push(prompt)\n syncQueue()\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 const offRemoveQueued = input.footer.onQueuedRemove((messageID) => {\n const queued = state.queued.find((item) => item.messageID === messageID)\n if (!queued) return false\n state.queue = state.queue.filter((prompt) => prompt !== queued.prompt)\n removeLocalQueued(queued)\n return true\n })\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 offRemoveQueued()\n close()\n await draining?.catch(() => {})\n }\n}\n" | ||
| ], | ||
| "mappings": ";wYA0CA,cAAS,MAAe,OAAgB,MACtC,SAAI,OACA,OAMJ,WAAO,MAAE,QALO,IAAI,QAAW,CAAC,EAAM,IAAS,CAC7C,EAAU,EACV,EAAS,EACV,EAEiB,UAAS,QAAO,EAQpC,eAAsB,CAAc,CAAC,EAAkC,CACrE,IAAM,EAAO,EAA0B,EACjC,EAAO,EAAM,EACb,EAAe,CACnB,MAAO,CAAC,EACR,OAAQ,CAAC,EACT,OAAQ,EAAM,OAAO,QACvB,EACI,EAEE,EAAO,CAAC,EAAmB,IAAiC,CAChE,EAAM,OAAO,MAAM,WAAY,CAAG,EAClC,EAAM,OAAO,MAAM,CAAI,GAGnB,EAAY,IAAM,CACtB,IAAM,EAAQ,EAAM,MAAM,OAC1B,EAAK,CAAE,KAAM,QAAS,OAAM,EAAG,CAAE,OAAM,CAAC,EACxC,EACE,CACE,KAAM,iBACN,QAAS,CAAC,GAAG,EAAM,MAAM,CAC3B,EACA,CAAE,OAAQ,EAAM,OAAO,MAAO,CAChC,GAGI,EAAoB,CAAC,IAA+B,CACxD,GAAI,CAAC,EAAM,OAAO,SAAS,CAAM,EAAG,OACpC,EAAM,OAAS,EAAM,OAAO,OAAO,CAAC,IAAS,IAAS,CAAM,EAC5D,EAAU,GAGN,EAAS,IAAM,CACnB,GAAI,CAAC,EAAM,QAAU,EACnB,OAGF,EAAK,QAAQ,GAGT,EAAQ,IAAM,CAClB,GAAI,EAAM,OACR,OAGF,EAAM,OAAS,GACf,EAAM,MAAM,OAAS,EACrB,EAAM,OAAO,OAAS,EACtB,EAAM,MAAM,MAAM,EAClB,EAAK,QAAQ,CAAE,KAAM,QAAS,CAAC,EAC/B,EAAO,GAGH,EAAQ,IAAM,CAClB,GAAI,GAAY,EAAM,QAAU,EAAM,MAAM,SAAW,EACrD,OAGF,GAAY,SAAY,CACtB,GAAI,CACF,MAAO,CAAC,EAAM,QAAU,EAAM,MAAM,OAAS,EAAG,CAC9C,IAAM,EAAS,EAAM,MAAM,MAAM,EACjC,GAAI,CAAC,EACH,SAGF,IAAM,EAAS,EAAM,OAAO,KAAK,CAAC,IAAS,EAAK,SAAW,CAAM,EACjE,GAAI,EAAQ,EAAkB,CAAM,EAEpC,GAAI,EAAO,OAAS,SAAW,EAAa,EAAO,IAAI,EAAG,CAExD,GADA,EAAU,EACN,CAAC,EAAM,aAAc,CACvB,EACE,CACE,KAAM,eACN,MAAO,CACL,OAAQ,0BACV,CACF,EACA,CACE,OAAQ,0BACV,CACF,EACA,SAGF,EACE,CACE,KAAM,eACN,MAAO,CACL,MAAO,UACP,OAAQ,uBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,CACE,MAAO,UACP,OAAQ,uBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,MAAM,EAAM,aAAa,EACzB,SAGF,IAAM,EACJ,EAAO,OAAS,QACZ,EACA,IACK,EACH,UAAW,EAAO,WAAa,GAAQ,WAAa,EAAe,GAAG,OAAO,CAC/E,EACN,EAAM,OAAS,EAEf,EACE,CACE,KAAM,YACN,MAAO,EAAM,MAAM,MACrB,EACA,CACE,MAAO,UACP,OAAQ,iBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,IAAM,EAAQ,KAAK,IAAI,EACjB,EAAO,IAAI,gBACjB,EAAM,KAAO,EAEb,GAAI,CAEF,GADA,MAAM,EAAM,OAAO,KAAK,EACpB,EAAM,OACR,MAGF,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EAAS,CACb,KAAM,OACN,KAAM,EAAK,KACX,MAAO,QACP,OAAQ,SACR,UAAW,EAAK,SAClB,EACA,EAAM,OAAO,MAAM,YAAa,CAAM,EACtC,EAAM,OAAO,OAAO,CAAM,EAI5B,GAFA,EAAM,SAAS,CAAI,EAEf,EAAM,OACR,MAGF,IAAM,EAAO,EAAM,IAAI,EAAM,EAAK,MAAM,EAAE,KACxC,KAAO,CAAE,KAAM,MAAgB,GAC/B,CAAC,KAAW,CAAE,KAAM,QAAkB,OAAM,EAC9C,EAEM,EAAO,MAAM,QAAQ,KAAK,CAAC,EAAM,EAAK,OAAO,CAAC,EACpD,GAAI,EAAK,OAAS,SAAU,CAC1B,EAAK,MAAM,EACX,MAGF,GAAI,EAAK,OAAS,QAChB,MAAM,EAAK,aAEb,CACA,GAAI,EAAM,OAAS,EACjB,EAAM,KAAO,OAGf,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EAAW,EAAO,SAAS,KAAK,IAAI,EAAG,KAAK,IAAI,EAAI,CAAK,CAAC,EAChE,EACE,CACE,KAAM,gBACN,UACF,EACA,CACE,UACF,CACF,EAEF,EAAM,OAAS,SAGnB,MAAO,EAAO,CACd,EAAK,OAAO,CAAK,EACjB,cACA,CACA,EAAW,OACX,EACE,CACE,KAAM,YACN,MAAO,EAAM,MAAM,MACrB,EACA,CACE,MAAO,OACP,OAAQ,GACR,MAAO,EAAM,MAAM,MACrB,CACF,EAGF,EAAO,IACN,GAGC,EAAS,CAAC,IAAsB,CACpC,GAAI,CAAC,EAAO,KAAK,KAAK,GAAK,EAAM,OAC/B,OAGF,GAAI,EAAO,OAAS,SAAW,EAAc,EAAO,IAAI,EAAG,CACzD,EAAM,OAAO,MAAM,EACnB,OAGF,IAAM,EAAS,EAAM,OACrB,GACE,GACA,EAAO,OAAS,SAChB,CAAC,EAAO,SACR,EAAO,OAAS,SAChB,CAAC,EAAO,SACR,CAAC,EAAa,EAAO,IAAI,EACzB,CACA,IAAM,EAA6B,CACjC,UAAW,EAAe,GAAG,OAAO,EACpC,QACF,EACA,EAAM,OAAS,CAAC,GAAG,EAAM,OAAQ,CAAM,EACvC,EAAM,MAAM,KAAK,CAAM,EACvB,EAAU,EACV,OAKF,GAFA,EAAM,MAAM,KAAK,CAAM,EACvB,EAAU,EACN,EAAO,OAAS,SAAW,EAAa,EAAO,IAAI,EAAG,CACxD,EAAM,EACN,OAGF,EACE,CACE,KAAM,QACN,MAAO,EACT,EACA,CACE,MAAO,EACT,CACF,EACA,EAAM,GAGF,EAAY,EAAM,OAAO,SAAS,CAAC,IAAW,CAClD,EAAO,CAAM,EACd,EACK,EAAW,EAAM,OAAO,QAAQ,IAAM,CAC1C,EAAM,EACP,EACK,EAAkB,EAAM,OAAO,eAAe,CAAC,IAAc,CACjE,IAAM,EAAS,EAAM,OAAO,KAAK,CAAC,IAAS,EAAK,YAAc,CAAS,EACvE,GAAI,CAAC,EAAQ,MAAO,GAGpB,OAFA,EAAM,MAAQ,EAAM,MAAM,OAAO,CAAC,IAAW,IAAW,EAAO,MAAM,EACrE,EAAkB,CAAM,EACjB,GACR,EAED,GAAI,CACF,GAAI,EAAM,OACR,OAGF,EAAO,CACL,KAAM,EAAM,cAAgB,GAC5B,MAAO,CAAC,CACV,CAAC,EACD,EAAO,EACP,MAAM,EAAK,eACX,CACA,EAAU,EACV,EAAS,EACT,EAAgB,EAChB,EAAM,EACN,MAAM,GAAU,MAAM,IAAM,EAAE", | ||
| "debugId": "4F679C2DA567CF7264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": ";84BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,SAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "BAE2C498B41752CD64756E2164756E21", | ||
| "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": ";m5BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,WAAO,OAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "D55CD43173E9573764756E2164756E21", | ||
| "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}\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 })\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 { Flag } from \"@opencode-ai/core/flag/flag\"\nimport { Global } from \"@opencode-ai/core/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: Flag.OPENCODE_SHOW_TTFD,\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C584B22E83243C8464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "3D70178C02F2934464756E2164756E21", | ||
| "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": ";m6BAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,OAAK,gBAAW,eAAU,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": "5EC01D57B8A46C1864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../client/src/effect/service.ts"], | ||
| "sourcesContent": [ | ||
| "import { ServiceStatus } from \"@opencode-ai/protocol/groups/health\"\nimport { Effect, FileSystem, Option, Schedule, Schema } from \"effect\"\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport type { DiscoverOptions, Endpoint, EnsureOptions, StopOptions } from \"../service.js\"\n\nexport * from \"../service.js\"\n/** Contents of the local service registration file. */\nexport type Info = import(\"../service.js\").Info\n\n// Find, start, and stop the local opencode background service.\n//\n// The service daemon advertises itself through a registration file in the\n// user's state directory: url, pid, version, and the private password, with\n// 0600 permissions. That file is the complete discovery contract — reading it\n// is all a client needs to connect. The daemon's own configuration (port,\n// persisted password) is CLI-owned and never read here.\n\ntype Contender = {\n readonly child: ChildProcess\n readonly error: () => Error | undefined\n}\n\n// Read-only lookup: registration file plus health check and version gate.\n// Never spawns; escalation to ensure() is the caller's policy.\n/** Discover a healthy, compatible local service without starting one. */\nexport const discover = Effect.fn(\"service.discover\")(function* (options: DiscoverOptions = {}) {\n return (yield* discoverLocal(options))?.endpoint\n})\n\n/** Recognize an authenticated compatible service bound to an expected URL, including while it starts or fails. */\nexport const incumbent = Effect.fn(\"service.incumbent\")(function* (\n options: DiscoverOptions & { readonly url: string },\n) {\n const info = yield* read(options.file)\n const found = info === undefined ? undefined : yield* probe({ ...info, url: options.url })\n if (found === undefined || found.legacy) return undefined\n if (options.version !== undefined && found.version !== options.version) return undefined\n return { endpoint: found.endpoint, state: found.state }\n})\n\nconst discoverLocal = Effect.fnUntraced(function* (options: DiscoverOptions) {\n const found = (yield* registered(options.file)).service\n if (found?.state !== \"ready\") return undefined\n if (options.version !== undefined && found.version !== options.version) return undefined\n return found\n})\n\n// Idempotent ensure-running: reuses a healthy compatible server, replaces a\n// version-mismatched one, and otherwise spawns small contenders until a server\n// becomes discoverable. A contender is never killed merely for slow startup.\n/** Ensure a healthy, compatible local service is running. */\nexport const ensure = Effect.fn(\"service.ensure\")(function* (options: EnsureOptions = {}) {\n const contenders = new Set<Contender>()\n let announced = false\n let lastSpawn = 0\n let spawnDelay = 5_000\n let ownerHeld = false\n const announce = (reason: \"missing\" | \"version-mismatch\", previousVersion?: string) =>\n Effect.sync(() => {\n if (announced) return\n announced = true\n options.onStart?.(reason, previousVersion)\n })\n const spawnContender = Effect.gen(function* () {\n const [command, ...args] = options.command ?? [\"opencode\", \"serve\", \"--service\"]\n if (command === undefined) return yield* Effect.fail(new Error(\"Missing service command\"))\n return yield* Effect.try({\n try: () => {\n const child = spawn(command, args, { detached: true, stdio: \"ignore\" })\n let error: Error | undefined\n child.once(\"error\", (cause) => {\n error = new Error(\"Failed to start server\", { cause })\n })\n child.unref()\n return { child, error: () => error }\n },\n catch: (cause) => new Error(\"Failed to start server\", { cause }),\n })\n })\n const found = yield* Effect.gen(function* () {\n const registration = yield* registered(options.file, true)\n const info = registration.info\n const service = registration.service\n if (service !== undefined) {\n ownerHeld = false\n spawnDelay = 5_000\n const compatible = !service.legacy && (options.version === undefined || service.version === options.version)\n if (compatible && service.state === \"ready\") return Option.some(service)\n if (compatible && service.state === \"failed\")\n return yield* Effect.fail(new Error(\"Background service failed to start\"))\n if (compatible) return Option.none<LocalService>()\n yield* announce(\"version-mismatch\", service.version)\n yield* kill(service, options).pipe(Effect.ignore)\n lastSpawn = 0\n return Option.none<LocalService>()\n } else if (lastSpawn === 0 && info !== undefined) lastSpawn = Date.now()\n\n const failure = [...contenders].map(contenderFailure).find((error): error is Error => error !== undefined)\n if (failure !== undefined) return yield* Effect.fail(failure)\n const finished = [...contenders].filter(contenderFinished)\n if (finished.some((item) => item.child.exitCode === 0)) {\n ownerHeld = true\n spawnDelay = Math.min(spawnDelay * 2, 30_000)\n }\n finished.forEach((item) => contenders.delete(item))\n // Keep one candidate plus one lock probe so a pre-lock stall cannot block recovery.\n if (contenders.size < 2 && Date.now() - lastSpawn >= spawnDelay) {\n yield* announce(\"missing\")\n contenders.add(yield* spawnContender)\n lastSpawn = Date.now()\n }\n return Option.none<LocalService>()\n }).pipe(\n Effect.repeat({\n until: Option.isSome,\n schedule: Schedule.max([Schedule.spaced(\"1 second\"), Schedule.recurs(120)]),\n }),\n )\n if (Option.isNone(found))\n return yield* Effect.fail(new Error(\"Timed out waiting for the background service to start\"))\n return found.value.endpoint\n})\n\nfunction contenderFailure(contender: Contender) {\n const error = contender.error()\n if (error !== undefined) return error\n if (contender.child.exitCode !== null && contender.child.exitCode !== 0)\n return new Error(`Server process exited with code ${contender.child.exitCode}`)\n if (contender.child.signalCode !== null)\n return new Error(`Server process terminated by ${contender.child.signalCode}`)\n return undefined\n}\n\nfunction contenderFinished(contender: Contender) {\n return contender.error() !== undefined || contender.child.exitCode !== null || contender.child.signalCode !== null\n}\n\n/** Stop the registered local service. */\nexport const stop = Effect.fn(\"service.stop\")(function* (options: StopOptions = {}) {\n const existing = yield* find(options)\n if (existing !== undefined) yield* kill(existing, options)\n})\n\nfunction fallback() {\n const state = process.env[\"XDG_STATE_HOME\"] ?? join(homedir(), \".local\", \"state\")\n return join(state, \"opencode\", \"service.json\")\n}\n\n/** Create HTTP authentication headers for a service endpoint. */\nexport function headers(endpoint: Endpoint) {\n if (endpoint.auth === undefined) return undefined\n return { authorization: \"Basic \" + btoa(endpoint.auth.username + \":\" + endpoint.auth.password) }\n}\n\n/** Schema for the local service registration file. */\nexport const Info = Schema.Struct({\n id: Schema.optional(Schema.String),\n version: Schema.optional(Schema.String),\n url: Schema.String,\n pid: Schema.Int.check(Schema.isGreaterThan(0)),\n password: Schema.optional(Schema.String),\n})\n\nconst decode = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeHealth = Schema.decodeUnknownOption(ServiceStatus.Health)\nconst decodeLegacyHealth = Schema.decodeUnknownOption(Schema.Struct({ healthy: Schema.Literal(true) }))\n\n// A missing or corrupt file means no valid info; callers treat both\n// the same (the registering server self-evicts, clients rediscover).\nconst read = Effect.fnUntraced(function* (file?: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(file ?? fallback()).pipe(Effect.option)\n if (Option.isNone(text)) return undefined\n return yield* decode(text.value).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n})\n\ntype LocalService = {\n readonly info: Info\n readonly endpoint: Endpoint\n readonly version?: string\n readonly state: \"ready\" | \"waiting\" | \"failed\"\n readonly legacy: boolean\n}\n\nconst probe = Effect.fnUntraced(function* (info: Info, allowLegacy = false) {\n const endpoint = {\n url: info.url,\n auth:\n info.password === undefined\n ? undefined\n : { type: \"basic\" as const, username: \"opencode\", password: info.password },\n } satisfies Endpoint\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(\"/api/health\", info.url), {\n headers: headers(endpoint),\n signal: AbortSignal.timeout(2_000),\n }),\n ).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n if (response === undefined) return undefined\n const body = yield* Effect.tryPromise(() => response.json()).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n const health = decodeHealth(body)\n if (Option.isSome(health)) {\n if (health.value.pid !== info.pid) return undefined\n if (info.version !== undefined && health.value.version !== info.version) return undefined\n return {\n info,\n endpoint,\n version: health.value.version,\n state: response.ok ? \"ready\" : response.status === 500 ? \"failed\" : \"waiting\",\n legacy: false,\n } satisfies LocalService\n }\n if (\n !allowLegacy ||\n Option.isNone(decodeLegacyHealth(body)) ||\n (typeof body === \"object\" && body !== null && (\"version\" in body || \"pid\" in body))\n )\n return undefined\n return { info, endpoint, state: \"ready\", legacy: true } satisfies LocalService\n})\n\nconst registered = Effect.fnUntraced(function* (file?: string, allowLegacy = false) {\n const info = yield* read(file)\n if (info === undefined) return { info: undefined, service: undefined }\n return { info, service: yield* probe(info, allowLegacy) }\n})\n\n// Health-checked lookup without the version gate: lifecycle operations must be\n// able to see (and replace or stop) a server from a different version.\nconst find = Effect.fnUntraced(function* (options: { readonly file?: string }) {\n return (yield* registered(options.file, true)).service\n})\n\n// 50ms cadence bounded at ~5s, shared by stop escalation and each ensure\n// discovery window.\nconst poll = Schedule.max([Schedule.spaced(\"50 millis\"), Schedule.recurs(100)])\n\nconst signal = (pid: number, name: NodeJS.Signals) =>\n Effect.try({ try: () => process.kill(pid, name), catch: (cause) => cause }).pipe(Effect.ignore)\n\nconst stopped = Effect.fnUntraced(function* (pid: number) {\n const running = yield* Effect.try({ try: () => process.kill(pid, 0), catch: () => false }).pipe(\n Effect.orElseSucceed(() => false),\n )\n if (!running) return true\n return yield* Effect.fail(new Error(`Server process ${pid} is still running`))\n})\n\nfunction same(left: Info, right: Info) {\n return left.id === right.id && left.version === right.version && left.url === right.url && left.pid === right.pid\n}\n\nconst kill = Effect.fnUntraced(function* (service: LocalService, options: { readonly file?: string }) {\n const requested = yield* requestStop(service)\n if (requested === \"rejected\") return\n if (requested === \"unsupported\") {\n // A stale registration may point at a reused PID. Authenticate again\n // immediately before the legacy signal fallback.\n const current = yield* find(options)\n if (current === undefined || !same(current.info, service.info)) return\n yield* signal(service.info.pid, \"SIGTERM\")\n }\n const done = yield* stopped(service.info.pid).pipe(Effect.retry(poll), Effect.option)\n if (Option.isSome(done)) return\n\n const latest = yield* find(options)\n if (latest === undefined || !same(latest.info, service.info)) return\n yield* signal(service.info.pid, \"SIGKILL\")\n yield* stopped(service.info.pid).pipe(Effect.retry(poll))\n})\n\nconst decodeStopResponse = Schema.decodeUnknownOption(ServiceStatus.StopResponse)\n\nconst requestStop = Effect.fnUntraced(function* (service: LocalService) {\n if (service.info.id === undefined || service.legacy) return \"unsupported\" as const\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(\"/api/service/stop\", service.info.url), {\n method: \"POST\",\n headers: { ...headers(service.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({ instanceID: service.info.id }),\n signal: AbortSignal.timeout(2_000),\n }),\n ).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n if (response === undefined || response.status === 404 || response.status === 405) return \"unsupported\" as const\n const body = yield* Effect.tryPromise(() => response.json()).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n const decoded = decodeStopResponse(body)\n if (!response.ok || Option.isNone(decoded) || !decoded.value.accepted) return \"rejected\" as const\n return \"accepted\" as const\n})\n\n/** Effect-based local service lifecycle operations. */\nexport const Service = { discover, incumbent, ensure, stop, headers, Info }\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "B720DDBAD7603C1A64756E2164756E21", | ||
| "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/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": ";shBAWO,SAAM,OAAmC,OAAS,gBAC5C,OAAK,OAAW,UAAK,OAAQ,aAAQ,OAC5C,OAAU,aAmBV,EAAiB,EAAO,eAAe,EAAO,OAAkB,CAAU,EAAG,CACjF,EAAO,OAAO,EAAO,OAAQ,EAAO,GAAG,CACzC,CAAC,EAGY,EAAW,EAAS,KAAK,CACpC,GAAI,kBACJ,KAAM,CACJ,OAAQ,EACR,KAAM,CAAC,IACM,EAAS,KAAK,KAAK,CAAO,EAAE,KACrC,EAAO,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": "4A7F4E560E4C36D864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/standalone.ts", "src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Deferred, Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport { selfCommand } from \"../util/process\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const [executable, ...args] = options.command ?? [...selfCommand(), \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const readyLine = yield* Deferred.make<string, Error>()\n // Keep draining stdout after readiness so later server writes cannot hit EPIPE.\n yield* proc.stdout.pipe(\n Stream.decodeText(),\n Stream.splitLines,\n Stream.runForEach((line) => Deferred.succeed(readyLine, line)),\n Effect.ensuring(Deferred.fail(readyLine, new Error(\"Standalone server exited before reporting readiness\"))),\n Effect.forkScoped,\n )\n const output = yield* Deferred.await(readyLine)\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Endpoint & { readonly pid: number }\n },\n Effect.provide(LayerNode.compile(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n", | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "EBD5BCED70CF266264756E2164756E21", | ||
| "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": "C5B0B5AE02329DB564756E2164756E21", | ||
| "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": ";4rBAwBA,SAAM,OAAU,cACV,OAAc,SAAI,SAAY,OAAe,gBAAW,OACjD,EAAmB,mDAK1B,GAAiB,EAAO,OAAO,CACnC,KAAM,EAAO,OACb,QAAS,EAAO,SAAS,EAAO,OAAO,EACvC,iBAAkB,EAAO,SAAS,EAAO,MAAM,CACjD,CAAC,EAEK,GAAuB,EAAO,OAAO,CACzC,WAAY,EAAO,OAAO,CACxB,SAAU,EAAO,OACjB,KAAM,EAAO,MACf,CAAC,CACH,CAAC,EAEK,GAAyB,EAAO,OAAO,CAC3C,aAAc,EAAO,OAAO,CAC1B,KAAM,EAAO,OACb,KAAM,EAAO,OACf,CAAC,EACD,iBAAkB,EAAO,SAAS,EAAO,MAAM,CACjD,CAAC,EAEK,GAA6B,EAAO,OAAO,CAC/C,iBAAkB,EAAO,OAAO,CAC9B,KAAM,EAAO,OACb,SAAU,EAAO,OACnB,CAAC,CACH,CAAC,EAEK,GAAoB,EAAO,MAAM,CACrC,GACA,GACA,GACA,EACF,CAAC,EAEK,EAAgB,EAAO,OAAO,CAClC,KAAM,EAAO,SAAS,CAAC,OAAQ,OAAO,CAAC,EACvC,MAAO,EAAO,MAAM,EAAiB,CACvC,CAAC,EAGK,GAA0B,EAAO,OAAO,CAC5C,MAAO,EAAO,MAAM,EAAO,OAAO,CAAE,KAAM,EAAO,MAAO,CAAC,CAAC,CAC5D,CAAC,EAEK,GAA4B,EAAO,OAAO,CAC9C,KAAM,EAAO,OACb,YAAa,EAAO,OACpB,WAAY,EAAO,SAAS,CAAU,CACxC,CAAC,EAEK,GAAa,EAAO,OAAO,CAC/B,qBAAsB,EAAO,MAAM,EAAyB,CAC9D,CAAC,EAEK,GAAmB,EAAO,OAAO,CACrC,sBAAuB,EAAO,OAAO,CACnC,KAAM,EAAO,SAAS,CAAC,OAAQ,OAAQ,KAAK,CAAC,EAC7C,qBAAsB,EAAc,EAAO,MAAM,CACnD,CAAC,CACH,CAAC,EAEK,GAAuB,EAAO,OAAO,CACzC,eAAgB,EAAO,SAAS,EAAO,MAAM,EAC7C,gBAAiB,EAAO,SAAS,EAAO,OAAO,CACjD,CAAC,EAEK,GAAyB,EAAO,OAAO,CAC3C,gBAAiB,EAAO,SAAS,EAAO,MAAM,EAC9C,YAAa,EAAO,SAAS,EAAO,MAAM,EAC1C,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,cAAe,EAAc,EAAO,MAAM,EAC1C,eAAgB,EAAO,SAAS,EAAoB,CACtD,CAAC,EAEK,GAAmB,CACvB,SAAU,EAAO,MAAM,CAAa,EACpC,kBAAmB,EAAO,SAAS,EAAuB,EAC1D,MAAO,EAAc,EAAU,EAC/B,WAAY,EAAO,SAAS,EAAgB,EAC5C,iBAAkB,EAAO,SAAS,EAAsB,CAC1D,EACM,GAAa,EAAO,OAAO,EAAgB,EAG3C,GAAc,EAAO,OAAO,CAChC,wBAAyB,EAAO,SAAS,EAAO,MAAM,EACtD,mBAAoB,EAAO,SAAS,EAAO,MAAM,EACjD,iBAAkB,EAAO,SAAS,EAAO,MAAM,EAC/C,qBAAsB,EAAO,SAAS,EAAO,MAAM,EACnD,gBAAiB,EAAO,SAAS,EAAO,MAAM,CAChD,CAAC,EAGK,GAAkB,EAAO,OAAO,CACpC,QAAS,EAAO,SAAS,CAAa,EACtC,aAAc,EAAO,SAAS,EAAO,MAAM,CAC7C,CAAC,EAEK,GAAc,EAAO,OAAO,CAChC,WAAY,EAAc,EAAe,EACzC,cAAe,EAAO,SAAS,EAAW,CAC5C,CAAC,EAoCK,GAAY,CAAC,EAAsB,KAA6B,CACpE,KAAM,EAAK,KACX,YAAa,EAAK,YAClB,WAAY,EAAiB,QAAQ,CAAW,CAClD,GAEM,GAAkB,CAAC,IACvB,EAAe,gBAAgB,SAAU,EAAY,CACnD,KAAM,KAAO,CAAE,sBAAuB,CAAE,KAAM,MAAgB,CAAE,GAChE,KAAM,KAAO,CAAE,sBAAuB,CAAE,KAAM,MAAgB,CAAE,GAChE,SAAU,KAAO,CAAE,sBAAuB,CAAE,KAAM,KAAe,CAAE,GACnE,KAAM,CAAC,KAAU,CAAE,sBAAuB,CAAE,KAAM,MAAgB,qBAAsB,CAAC,CAAI,CAAE,CAAE,EACnG,CAAC,EAEG,GAAgB,EAAO,GAAG,sBAAsB,EAAE,SAAU,CAAC,EAA4B,CAC7F,GAAI,EAAK,OAAS,OAAQ,MAAO,CAAE,KAAM,EAAK,IAAK,EACnD,IAAM,EAAQ,MAAO,EAAe,cAAc,SAAU,EAAM,CAAW,EAC7E,MAAO,CAAE,WAAY,CAAE,SAAU,EAAM,KAAM,KAAM,EAAM,MAAO,CAAE,EACnE,EAEK,EAAiB,CAAC,KAAyD,CAAE,OAAQ,CAAS,GAE9F,EAAmB,CAAC,IAAmD,CAC3E,IAAM,EAAS,GAAkB,OACjC,OAAO,EAAe,SAAS,CAAM,GAAK,OAAO,EAAO,mBAAqB,SACzE,EAAO,iBACP,QAGA,GAAgB,CAAC,KAAwB,CAC7C,aAAc,CAAE,KAAM,EAAK,KAAM,KAAM,EAAK,KAAM,EAClD,iBAAkB,EAAiB,EAAK,gBAAgB,CAC1D,GAEM,GAAgB,EAAO,GAAG,sBAAsB,EAAE,SAAU,CAAC,EAAqB,CACtF,IAAM,EAA4B,CAAC,EAEnC,QAAW,KAAW,EAAQ,SAAU,CACtC,GAAI,EAAQ,OAAS,SAAU,CAC7B,IAAM,EAAO,MAAO,EAAe,oBAAoB,SAAU,CAAO,EAClE,EAAW,EAAS,GAAG,EAAE,EAC/B,GAAI,GAAU,OAAS,OACrB,EAAS,EAAS,OAAS,GAAK,CAAE,KAAM,OAAQ,MAAO,CAAC,GAAG,EAAS,MAAO,CAAE,KAAM,EAAK,IAAK,CAAC,CAAE,EAC7F,OAAS,KAAK,CAAE,KAAM,OAAQ,MAAO,CAAC,CAAE,KAAM,EAAK,IAAK,CAAC,CAAE,CAAC,EACjE,SAGF,GAAI,EAAQ,OAAS,OAAQ,CAC3B,IAAM,EAA6D,CAAC,EACpE,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,CAAC,EAAe,gBAAgB,EAAM,CAAC,OAAQ,OAAO,CAAC,EACzD,OAAO,MAAO,EAAe,mBAAmB,SAAU,OAAQ,CAAC,OAAQ,OAAO,CAAC,EACrF,EAAM,KAAK,MAAO,GAAc,CAAI,CAAC,EAEvC,EAAS,KAAK,CAAE,KAAM,OAAQ,OAAM,CAAC,EACrC,SAGF,GAAI,EAAQ,OAAS,YAAa,CAChC,IAAM,EAA6D,CAAC,EACpE,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,CAAC,EAAe,gBAAgB,EAAM,CAAC,OAAQ,YAAa,WAAW,CAAC,EAC1E,OAAO,MAAO,EAAe,mBAAmB,SAAU,YAAa,CAAC,OAAQ,YAAa,WAAW,CAAC,EAC3G,GAAI,EAAK,OAAS,OAAQ,CACxB,EAAM,KAAK,CAAE,KAAM,EAAK,IAAK,CAAC,EAC9B,SAEF,GAAI,EAAK,OAAS,YAAa,CAC7B,EAAM,KAAK,CAAE,KAAM,EAAK,KAAM,QAAS,GAAM,iBAAkB,EAAiB,EAAK,gBAAgB,CAAE,CAAC,EACxG,SAEF,GAAI,EAAK,OAAS,YAAa,CAC7B,EAAM,KAAK,GAAc,CAAI,CAAC,EAC9B,UAGJ,EAAS,KAAK,CAAE,KAAM,QAAS,OAAM,CAAC,EACtC,SAGF,IAAM,EAA6D,CAAC,EACpE,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,CAAC,EAAe,gBAAgB,EAAM,CAAC,aAAa,CAAC,EACvD,OAAO,MAAO,EAAe,mBAAmB,SAAU,OAAQ,CAAC,aAAa,CAAC,EACnF,GAAI,EAAK,OAAO,OAAS,UAAW,CAClC,EAAM,KAAK,CACT,iBAAkB,CAChB,KAAM,EAAK,KACX,SAAU,CACR,KAAM,EAAK,KACX,QAAS,EAAe,eAAe,CAAI,CAC7C,CACF,CACF,CAAC,EACD,SAEF,IAAM,EAAsC,EAAK,OAAO,MAClD,EAAO,EAAQ,OAAO,CAAC,IAAS,EAAK,OAAS,MAAM,EAAE,IAAI,CAAC,IAAS,EAAK,IAAI,EACnF,EAAM,KAAK,CACT,iBAAkB,CAChB,KAAM,EAAK,KACX,SAAU,CACR,KAAM,EAAK,KACX,QAAS,EAAK,KAAK;AAAA,CAAI,CACzB,CACF,CACF,CAAC,EACD,QAAW,KAAQ,EAAS,CAC1B,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAQ,MAAO,EAAe,iBAAiB,SAAU,EAAM,CAAW,EAChF,EAAM,KAAK,CAAE,WAAY,CAAE,SAAU,EAAM,KAAM,KAAM,EAAM,MAAO,CAAE,CAAC,GAG3E,EAAS,KAAK,CAAE,KAAM,OAAQ,OAAM,CAAC,EAGvC,OAAO,EACR,EAEK,GAAgB,CAAC,IAAwB,EAAQ,iBAAiB,OAElE,GAAiB,CAAC,IAAwB,CAC9C,IAAM,EAAQ,GAAc,CAAO,GAAG,eACtC,GAAI,CAAC,EAAe,SAAS,CAAK,EAAG,OACrC,IAAM,EAAS,CACb,eAAgB,OAAO,EAAM,iBAAmB,SAAW,EAAM,eAAiB,OAClF,gBAAiB,OAAO,EAAM,kBAAoB,UAAY,EAAM,gBAAkB,MACxF,EACA,OAAO,OAAO,OAAO,CAAM,EAAE,KAAK,CAAC,IAAS,IAAS,MAAS,EAAI,EAAS,QAGvE,GAAc,EAAO,GAAG,oBAAoB,EAAE,SAAU,CAAC,EAAqB,CAClF,IAAM,EAAe,EAAQ,MAAM,OAAS,GAAK,EAAQ,YAAY,OAAS,OACxE,EAAa,EAAQ,WACrB,EAA0B,EAAQ,MAAM,eAAe,WACvD,EAAmB,CACvB,gBAAiB,GAAY,UAC7B,YAAa,GAAY,YACzB,KAAM,GAAY,KAClB,KAAM,GAAY,KAClB,cAAe,GAAY,KAC3B,eAAgB,GAAe,CAAO,CACxC,EAEA,MAAO,CACL,SAAU,MAAO,GAAc,CAAO,EACtC,kBACE,EAAQ,OAAO,SAAW,EAAI,OAAY,CAAE,MAAO,CAAC,CAAE,KAAM,EAAe,SAAS,EAAQ,MAAM,CAAE,CAAC,CAAE,EACzG,MAAO,EACH,CACE,CACE,qBAAsB,EAAQ,MAAM,IAAI,CAAC,IACvC,GAAU,EAAM,EAAqB,mBAAmB,EAAK,YAAa,CAAuB,CAAC,CACpG,CACF,CACF,EACA,OACJ,WAAY,GAAgB,EAAQ,WAAa,MAAO,GAAgB,EAAQ,UAAU,EAAI,OAC9F,iBAAkB,OAAO,OAAO,CAAgB,EAAE,KAAK,CAAC,IAAU,IAAU,MAAS,EACjF,EACA,MACN,EACD,EASK,GAAW,CAAC,IAAmC,CACnD,GAAI,CAAC,EAAO,OACZ,IAAM,EAAS,EAAM,wBACf,EAAY,EAAe,eAAe,EAAM,iBAAkB,CAAM,EAKxE,EACJ,EAAM,uBAAyB,OAAY,EAAM,sBAAwB,EAAM,oBAAsB,GAAK,OAC5G,OAAO,IAAI,EAAM,CACf,YAAa,EAAM,iBACnB,eACA,qBAAsB,EACtB,qBAAsB,EACtB,gBAAiB,EAAM,mBACvB,YAAa,EAAe,YAAY,EAAM,iBAAkB,EAAc,EAAM,eAAe,EACnG,iBAAkB,CAAE,OAAQ,CAAM,CACpC,CAAC,GAGG,GAAkB,CAAC,EAAkC,IAAwC,CACjG,GAAI,IAAiB,OAAQ,OAAO,EAAe,aAAe,OAClE,GAAI,IAAiB,aAAc,MAAO,SAC1C,GACE,IAAiB,gBACjB,IAAiB,cACjB,IAAiB,UACjB,IAAiB,aACjB,IAAiB,sBACjB,IAAiB,OAEjB,MAAO,iBACT,GAAI,IAAiB,0BAA2B,MAAO,QACvD,MAAO,WAGH,GAAS,CAAC,IACd,EAAM,cAAgB,EAAM,OACvB,IAAM,CACL,IAAM,EAAqB,CAAC,EACtB,EAAY,EAAM,mBACpB,EAAU,aACR,EAAM,UACN,EACA,cACA,EAAe,CAAE,iBAAkB,EAAM,kBAAmB,CAAC,CAC/D,EACA,EAAM,UAKV,OAJA,EAAU,OAAO,EAAW,EAAQ,CAClC,OAAQ,GAAgB,EAAM,aAAc,EAAM,YAAY,EAC9D,MAAO,EAAM,KACf,CAAC,EACM,IACN,EACH,CAAC,EAED,GAAO,CAAC,EAAoB,IAAuB,CACvD,IAAM,EAAY,IACb,EACH,MAAO,EAAM,cAAiB,GAAS,EAAM,aAAa,GAAK,EAAM,MAAS,EAAM,KACtF,EACM,EAAY,EAAM,aAAa,GACrC,GAAI,CAAC,GAAW,QACd,OAAO,EAAO,QAAQ,CACpB,IAAK,EAAW,aAAc,GAAW,cAAgB,EAAU,YAAa,EAChF,CAAC,CACH,CAAU,EAEZ,IAAM,EAAqB,CAAC,EACxB,EAAe,EAAU,aACzB,EAAY,EAAU,UACtB,EAAiB,EAAU,eAC3B,EAAqB,EAAU,mBAEnC,QAAW,KAAQ,EAAU,QAAQ,MAAO,CAC1C,GAAI,qBAAsB,GAAQ,EAAK,kBAAoB,YAAa,GAAQ,EAAK,QACnF,EAAqB,EAAK,iBAC5B,GAAI,SAAU,GAAQ,EAAK,KAAK,OAAS,EAAG,CAC1C,GAAI,EAAK,QAAS,CAChB,EAAY,EAAU,eACpB,EACA,EACA,cACA,EAAK,KACL,EAAK,iBAAmB,EAAe,CAAE,iBAAkB,EAAK,gBAAiB,CAAC,EAAI,MACxF,EACA,SAEF,EAAY,EAAU,aACpB,EACA,EACA,cACA,EAAqB,EAAe,CAAE,iBAAkB,CAAmB,CAAC,EAAI,MAClF,EACA,EAAY,EAAU,UAAU,EAAW,EAAQ,SAAU,EAAK,IAAI,EACtE,SAGF,GAAI,iBAAkB,EAAM,CAC1B,IAAM,EAAQ,EAAK,aAAa,KAC1B,EAAK,QAAQ,MACnB,EAAY,EAAU,aACpB,EACA,EACA,cACA,EAAqB,EAAe,CAAE,iBAAkB,CAAmB,CAAC,EAAI,MAClF,EACA,EAAY,EAAU,UAAU,EAAW,CAAM,EACjD,EAAO,KACL,EAAS,SAAS,CAChB,KACA,KAAM,EAAK,aAAa,KACxB,QACA,iBAAkB,EAAK,iBACnB,EAAe,CAAE,iBAAkB,EAAK,gBAAiB,CAAC,EAC1D,MACN,CAAC,CACH,EACA,EAAe,IAInB,OAAO,EAAO,QAAQ,CACpB,IACK,EACH,eACA,YACA,iBACA,qBACA,aAAc,EAAU,cAAgB,EAAU,YACpD,EACA,CACF,CAAU,GAWC,EAAW,EAAS,KAAK,CACpC,GAAI,EACJ,KAAM,CACJ,OAAQ,GACR,KAAM,EACR,EACA,OAAQ,CACN,MAAO,EAAS,UAAU,EAAW,EACrC,QAAS,KAAO,CAAE,aAAc,GAAO,eAAgB,EAAG,UAAW,EAAU,QAAQ,CAAE,GACzF,QACA,OAAQ,EACV,CACF,CAAC,EAEY,GAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,SAAU,SACV,oBAAqB,SACrB,WAEA,SAAU,EAAS,KAAK,EAAG,aAAc,WAAW,EAAQ,MAAM,mCAAoC,CACpG,QAAS,CACX,CAAC,EACD,KAAM,EAAK,KACX,QAAS,EAAQ,GACnB,CAAC,ECveD,IAAM,EAAU,gBACH,GAAmB,mDAsB1B,GAAc,EAAO,eACzB,EAAO,OAAO,CACZ,wBAAyB,EAAO,SAAS,EAAO,MAAM,EACtD,mBAAoB,EAAO,SAAS,EAAO,MAAM,EACjD,iBAAkB,EAAO,SAAS,EAAO,MAAM,EAC/C,qBAAsB,EAAO,SAAS,EAAO,MAAM,EACnD,gBAAiB,EAAO,SAAS,EAAO,MAAM,EAC9C,oBAAqB,EAAO,SAAS,EAAO,OAAO,EACnD,wBAAyB,EAAO,SAAS,EAAO,OAAO,CACzD,CAAC,EACD,CAAC,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CAC/C,EAEM,GAAsB,EAAO,OAAO,CACxC,WAAY,EAAO,SACjB,EAAO,MACL,EAAO,OAAO,CACZ,MAAO,EAAO,SAAS,EAAO,MAAM,EACpC,QAAS,EAAO,SACd,EAAO,OAAO,CACZ,MAAO,EAAO,MACZ,EAAO,OAAO,CACZ,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,QAAS,EAAO,SAAS,EAAO,OAAO,EACvC,iBAAkB,EAAO,SAAS,EAAO,MAAM,EAC/C,WAAY,EAAO,SACjB,EAAO,OAAO,CACZ,SAAU,EAAO,OACjB,KAAM,EAAO,MACf,CAAC,CACH,CACF,CAAC,CACH,CACF,CAAC,CACH,EACA,aAAc,EAAO,SAAS,EAAO,MAAM,EAC3C,cAAe,EAAO,SAAS,EAAO,MAAM,EAC5C,cAAe,EAAO,SAAS,EAAO,OAAO,EAC7C,iBAAkB,EAAO,SAAS,EAAO,OAAO,EAChD,kBAAmB,EAAO,SAAS,EAAO,OAAO,CACnD,CAAC,CACH,CACF,EACA,cAAe,EAAO,SAAS,EAAW,EAC1C,aAAc,EAAO,SAAS,EAAO,MAAM,EAC3C,WAAY,EAAO,SAAS,EAAO,MAAM,EACzC,eAAgB,EAAO,SAAS,EAAO,OAAO,CAChD,CAAC,EAUK,GAAgB,CAAC,IAA4C,CACjE,IAAQ,cAAa,YAAW,OAAM,gBAAe,qBAAoB,GAAW,GAAW,CAAC,EAC1F,EAAQ,CACZ,cACA,WACF,EACM,EAAiB,CACrB,gBACA,iBACF,EACA,OACE,EACE,CACE,mBAAoB,CAAC,OAAO,EAC5B,YAAa,OAAO,OAAO,CAAK,EAAE,KAAK,CAAC,IAAU,IAAU,MAAS,EAAI,EAAQ,OACjF,OACA,eAAgB,OAAO,OAAO,CAAc,EAAE,KAAK,CAAC,IAAU,IAAU,MAAS,EAAI,EAAiB,MACxG,EACA,CACF,GAAK,CAAE,mBAAoB,CAAC,OAAO,CAAE,GAInC,EAAgB,CAAC,EAAiB,IACtC,IAAI,GAAS,CACX,OAAQ,EACR,OAAQ,WACR,OAAQ,IAAI,EAA4B,CAAE,UAAS,MAAO,EAAS,kBAAiB,CAAC,CACvF,CAAC,EAEG,GAAa,CAAC,EAAa,IAA8C,CAC7E,GAAI,CAAC,EAAO,OAAO,EACnB,IAAM,EAAO,IAAI,IAAI,CAAG,EAExB,OADA,OAAO,QAAQ,CAAK,EAAE,QAAQ,EAAE,EAAK,KAAW,EAAK,aAAa,IAAI,EAAK,CAAK,CAAC,EAC1E,EAAK,SAAS,GAGV,GAAQ,CAAC,IAAsB,CAC1C,IAAM,EAAwC,CAC5C,GAAI,EACJ,SAAU,EAAO,GAAG,uBAAuB,EAAE,SAAU,CAAC,EAA8C,EAAS,CAC7G,IAAM,EAAa,MAAO,EAAO,QAAQ,EAAQ,QAAU,CAAC,EAAG,EAAe,EACxE,EAAO,EAAiB,EAAQ,MAAM,KAAM,EAAQ,IAAI,EACxD,EAAc,EAClB,CACE,SAAU,CAAC,CAAE,KAAM,OAAQ,MAAO,CAAC,CAAE,KAAM,EAAQ,MAAO,EAAG,GAAG,CAAU,CAAE,CAAC,EAC7E,iBAAkB,GAAc,EAAQ,OAAO,CACjD,EACA,GAAM,IACR,EACM,EAAO,EAAe,WAAW,CAAW,EAC5C,EAAM,GACV,IAAI,EAAM,SAAW,IAAkB,QAAQ,MAAO,EAAE,YAAY,EAAQ,MAAM,qBAClF,GAAM,KACR,EACM,EAAU,MAAO,EAAK,SAAS,EAAM,IAAI,EAAE,CAC/C,UACA,OAAQ,OACR,MACA,KAAM,EACN,QAAS,EAAQ,UAAU,IAAK,EAAM,WAAY,GAAM,OAAQ,CAAC,CACnE,CAAC,EAOK,EAAU,OANC,MAAO,EACtB,EAAkB,KAAK,CAAG,EAAE,KAC1B,EAAkB,WAAW,CAAO,EACpC,EAAkB,SAAS,EAAM,kBAAkB,CACrD,CACF,GACgC,KAAK,KACnC,EAAO,SAAS,IAAM,EAAc,2CAA2C,CAAC,CAClF,EACM,EAAU,MAAO,EAAO,oBAAoB,EAAmB,EAAE,CAAO,EAAE,KAC9E,EAAO,SAAS,IAAM,EAAc,4CAA4C,CAAC,CACnF,EACM,EAAa,EAAQ,YAAc,CAAC,EACpC,EAAoB,EAAW,IAAI,CAAC,EAAW,KAAoB,CACvE,MAAO,EAAU,OAAS,EAC1B,aAAc,EAAU,aACxB,cAAe,EAAU,cACzB,cAAe,EAAU,cACzB,iBAAkB,EAAU,iBAC5B,kBAAmB,EAAU,kBAC7B,OAAQ,EAAU,SAAS,OAAS,CAAC,GAAG,IAAI,CAAC,IAC3C,EAAK,aAAe,OAChB,CACE,KAAM,OACN,KAAM,EAAK,KACX,QAAS,EAAK,QACd,iBAAkB,EAAK,gBACzB,EACA,CACE,KAAM,aACN,UAAW,EAAK,WAAW,SAC3B,QAAS,EAAK,QACd,iBAAkB,EAAK,gBACzB,CACN,CACF,EAAE,EACI,GAAU,EAAW,QAAQ,CAAC,EAAW,KAC5C,EAAU,SAAS,OAAS,CAAC,GAAG,QAAQ,CAAC,EAAM,KAC9C,EAAK,aAAe,QAAa,EAAK,UAAY,GAC9C,CAAC,EACD,CAAC,CAAE,YAAW,iBAAgB,aAAW,WAAY,EAAK,UAAW,CAAC,CAC5E,CACF,EACM,EAAS,MAAO,EAAO,QAAQ,GAAS,CAAC,IAC7C,EAAO,WAAW,EAAS,aAAa,EAAK,WAAW,IAAI,CAAC,EAAE,KAC7D,EAAO,SAAS,IACd,EACE,2BAA2B,EAAK,uBAAuB,EAAK,wCAC9D,CACF,EACA,EAAO,IACL,CAAC,IACC,IAAI,GAAe,CACjB,UAAW,EAAK,WAAW,SAC3B,OACA,iBAAkB,CAChB,OAAQ,CACN,eAAgB,EAAK,UAAU,OAAS,EAAK,eAC7C,UAAW,EAAK,UAChB,aAAc,EAAK,UAAU,aAC7B,cAAe,EAAK,UAAU,cAC9B,iBAAkB,EAAK,UAAU,iBACjC,kBAAmB,EAAK,UAAU,kBAClC,iBAAkB,EAAK,UAAU,SAAS,MAAM,EAAK,YAAY,gBACnE,CACF,CACF,CAAC,CACL,CACF,CACF,EACA,GAAI,EAAO,SAAW,EAAG,CACvB,IAAM,EAAgB,EAAW,QAAQ,CAAC,IACxC,EAAU,eAAiB,OAAY,CAAC,EAAI,CAAC,EAAU,YAAY,CACrE,EACA,OAAO,MAAO,EACZ,yCACE,EAAc,SAAW,EAAI,GAAK,qBAAqB,EAAc,KAAK,IAAI,yFAEhF,CACE,OAAQ,CACN,eAAgB,EAAQ,eACxB,WAAY,CACd,CACF,CACF,EAEF,IAAM,EAAQ,EAAQ,cAChB,EACJ,GAAO,uBAAyB,OAC5B,OACA,EAAM,sBAAwB,EAAM,oBAAsB,GAChE,OAAO,IAAI,GAAc,CACvB,SACA,MACE,IAAU,OACN,OACA,IAAI,EAAM,CACR,YAAa,EAAM,iBACnB,eACA,qBAAsB,EAAe,eACnC,EAAM,iBACN,EAAM,uBACR,EACA,qBAAsB,EAAM,wBAC5B,gBAAiB,EAAM,mBACvB,YAAa,EAAe,YAAY,EAAM,iBAAkB,EAAc,EAAM,eAAe,EACnG,iBAAkB,CAAE,OAAQ,CAAM,CACpC,CAAC,EACP,iBAAkB,CAChB,OAAQ,CACN,aAAc,EAAQ,aACtB,WAAY,EAAQ,WACpB,eAAgB,EAAQ,eACxB,WAAY,CACd,CACF,CACF,CAAC,EACF,CACH,EACA,OAAO,GAAW,KAAyB,CAAE,GAAI,EAAM,GAAI,SAAU,SAAU,QAAO,KAAM,EAAM,IAAK,CAAC,GAGpG,GAAkB,CAAC,IAAwE,CAC/F,GAAI,EAAM,OAAS,QACjB,OAAO,EAAO,QAAQ,CAAE,WAAY,CAAE,SAAU,EAAM,UAAW,KAAM,EAAS,aAAa,EAAM,IAAI,CAAE,CAAE,CAAC,EAC9G,GAAI,EAAM,OAAS,WAAY,OAAO,EAAO,QAAQ,CAAE,SAAU,CAAE,SAAU,EAAM,UAAW,QAAS,EAAM,GAAI,CAAE,CAAC,EACpH,GAAI,EAAM,OAAS,MACjB,OAAO,EAAY,cAAc,EAAM,IAAK,CAAO,EAAE,KACnD,EAAO,QAAQ,CAAC,IAAY,CAC1B,GAAI,IAAY,OACd,OAAO,EAAO,KACZ,EAAY,QACV,EACA,sGACF,CACF,EACF,OAAO,EAAO,QAAQ,CACpB,WAAY,CAAE,SAAU,EAAQ,UAAW,KAAM,EAAS,aAAa,EAAQ,IAAI,CAAE,CACvF,CAAC,EACF,CACH,EACF,OAAO,EAAO,KACZ,EAAY,QAAQ,EAAS,gFAAgF,CAC/G,GAGW,GAAe,CAC1B,QACF,EC/SO,IAAM,GAAK,GAAW,KAAK,QAAQ,EAE7B,GAAS,CAAC,EAAO,KAAK,EAa7B,GAAO,CAAC,IAA4C,CACxD,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAO,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,EAC5E,OAAO,EAAK,OAAO,8BAA8B,CAAC,EAClD,KAAK,EAAK,OAAO,gBAAgB,CAAC,GAGjC,GAAkB,CAAC,IAAkB,CACzC,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EACrD,OAAO,EAAO,MAAM,KAAK,IAAK,EAAM,SAAU,CAAE,SAAQ,EAAG,KAAM,GAAK,CAAK,CAAE,CAAC,GAGnE,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAAQ,GAAgB,CAAK,EASnC,MAAO,CACL,MACA,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,CAAQ,CAAC,EACjE,MAXY,CAAC,IACb,GAAa,MAAM,CACjB,GAAI,EACJ,KAAM,GAAK,CAAK,EAChB,QAAS,EAAM,QACf,QAAS,EAAM,QACf,KAAM,EAAiB,EAAM,OAAS,OAAY,OAAY,GAAY,KAAK,EAAM,IAAI,CAAC,CAC5F,CAAC,EAKD,WACF,GAGW,GAAW,EAAU,EACrB,GAAuD,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,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO,EAEL,GAAQ,GAAS", | ||
| "debugId": "18C2A35BE5828BA664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/azure.ts"], | ||
| "sourcesContent": [ | ||
| "import { Auth } from \"../route/auth\"\nimport { type AtLeastOne, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options\"\n\nexport const id = ProviderID.make(\"azure\")\nconst routeAuth = Auth.remove(\"authorization\")\n\n// Azure needs the customer's resource URL; supply either `resourceName`\n// (helper builds the URL) or `baseURL` directly.\ntype AzureURL = AtLeastOne<{ readonly resourceName: string; readonly baseURL: string }>\n\nexport type ModelOptions = AzureURL &\n RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly apiVersion?: string\n readonly queryParams?: Record<string, string>\n readonly useCompletionUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\nexport type Config = ModelOptions\n\nexport type Settings = ProviderPackage.Settings &\n AzureURL & {\n readonly apiKey?: string\n readonly apiVersion?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nconst resourceBaseURL = (resourceName: string) => `https://${resourceName.trim()}.openai.azure.com/openai/v1`\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"azure-openai-responses\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"azure-openai-chat\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst defaults = (input: Config) => {\n const {\n apiKey: _,\n apiVersion: _apiVersion,\n resourceName: _resourceName,\n useCompletionUrls: _useCompletionUrls,\n baseURL: _baseURL,\n queryParams: _queryParams,\n ...rest\n } = input\n if (\"auth\" in rest) {\n const { auth: _, ...withoutAuth } = rest\n return withoutAuth\n }\n return rest\n}\n\nconst auth = (input: Config) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.remove(\"authorization\").andThen(\n Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"AZURE_OPENAI_API_KEY\"))\n .pipe(Auth.header(\"api-key\")),\n )\n}\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: {\n // AtLeastOne guarantees at least one is set; baseURL wins if both are.\n baseURL: input.baseURL ?? resourceBaseURL(input.resourceName!),\n query: {\n ...(input.apiVersion ? { \"api-version\": input.apiVersion } : {}),\n ...input.queryParams,\n },\n },\n })\n\nexport const configure = (input: Config) => {\n const configuredResponsesRoute = configuredRoute(responsesRoute, input)\n const configuredChatRoute = configuredRoute(chatRoute, input)\n const modelDefaults = defaults(input)\n\n const responses = (modelID: string | ModelID) =>\n configuredResponsesRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n const chat = (modelID: string | ModelID) =>\n configuredChatRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n return {\n id,\n model: (modelID: string | ModelID) => (input.useCompletionUrls === true ? chat(modelID) : responses(modelID)),\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nconst config = (settings: Settings): Config => {\n const common = {\n apiKey: settings.apiKey,\n apiVersion: settings.apiVersion,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n if (settings.baseURL !== undefined) return { ...common, baseURL: settings.baseURL }\n if (settings.resourceName !== undefined) return { ...common, resourceName: settings.resourceName }\n throw new Error(\"Azure requires resourceName or baseURL\")\n}\n\nexport const responsesModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).responses(modelID)\nexport const chatModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).chat(modelID)\nexport const model = responsesModel\n" | ||
| ], | ||
| "mappings": ";yMASO,SAAM,OAAK,OAAW,KAAK,OAAO,EACnC,EAAY,EAAK,OAAO,eAAe,EAwBvC,EAAkB,CAAC,IAAyB,WAAW,EAAa,KAAK,+BAEzE,EAAiC,EAAM,KAAK,CAChD,GAAI,yBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEK,EAAuB,EAAM,KAAK,CACtC,GAAI,oBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEY,EAAS,CAAC,EAAgB,CAAS,EAE1C,EAAW,CAAC,IAAkB,CAClC,IACE,OAAQ,EACR,WAAY,EACZ,aAAc,EACd,kBAAmB,EACnB,QAAS,EACT,YAAa,KACV,GACD,EACJ,GAAI,SAAU,EAAM,CAClB,IAAQ,KAAM,KAAM,GAAgB,EACpC,OAAO,EAET,OAAO,GAGH,EAAO,CAAC,IAAkB,CAC9B,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,OAAO,eAAe,EAAE,QAClC,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EACjE,OAAO,EAAK,OAAO,sBAAsB,CAAC,EAC1C,KAAK,EAAK,OAAO,SAAS,CAAC,CAChC,GAGI,EAAkB,CAAiB,EAAiC,IACxE,EAAM,KAAK,CACT,KAAM,EAAK,CAAK,EAChB,SAAU,CAER,QAAS,EAAM,SAAW,EAAgB,EAAM,YAAa,EAC7D,MAAO,IACD,EAAM,WAAa,CAAE,cAAe,EAAM,UAAW,EAAI,CAAC,KAC3D,EAAM,WACX,CACF,CACF,CAAC,EAEU,EAAY,CAAC,IAAkB,CAC1C,IAAM,EAA2B,EAAgB,EAAgB,CAAK,EAChE,EAAsB,EAAgB,EAAW,CAAK,EACtD,EAAgB,EAAS,CAAK,EAE9B,EAAY,CAAC,IACjB,EAAyB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE1F,EAAO,CAAC,IACZ,EAAoB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE3F,MAAO,CACL,KACA,MAAO,CAAC,IAA+B,EAAM,oBAAsB,GAAO,EAAK,CAAO,EAAI,EAAU,CAAO,EAC3G,YACA,OACA,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEM,EAAS,CAAC,IAA+B,CAC7C,IAAM,EAAS,CACb,OAAQ,EAAS,OACjB,WAAY,EAAS,WACrB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,gBAAiB,EAAS,gBAC1B,YAAa,EAAS,cAAgB,OAAY,OAAY,IAAK,EAAS,WAAY,CAC1F,EACA,GAAI,EAAS,UAAY,OAAW,MAAO,IAAK,EAAQ,QAAS,EAAS,OAAQ,EAClF,GAAI,EAAS,eAAiB,OAAW,MAAO,IAAK,EAAQ,aAAc,EAAS,YAAa,EACjG,MAAU,MAAM,wCAAwC,GAG7C,EAAgE,CAAC,EAAS,IACrF,EAAU,EAAO,CAAQ,CAAC,EAAE,UAAU,CAAO,EAClC,EAA2D,CAAC,EAAS,IAChF,EAAU,EAAO,CAAQ,CAAC,EAAE,KAAK,CAAO,EAC7B,EAAQ", | ||
| "debugId": "9C2C62CF8C41C41E64756E2164756E21", | ||
| "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": ";s4BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,OAChD,CACH", | ||
| "debugId": "690DE1FBD3ECE44F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "A1DE0F97B2A71E7F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i/BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,OAC/D,OAAW,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": "A0DAD33C5960896464756E2164756E21", | ||
| "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": ";k8BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,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": "C78BE684C27115FB64756E2164756E21", | ||
| "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": ";m5BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,WAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "A8B06D04F9DF845764756E2164756E21", | ||
| "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": ";igCAKA,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,OACxC,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": "F06313D5A6DB0C8764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/frontend/actions.ts", "../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/semantics.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "import { tmpdir } from \"node:os\"\nimport { extname, join, resolve } from \"node:path\"\nimport type { CliRenderer, Renderable } from \"@opentui/core\"\nimport {\n createMockKeys,\n createMockMouse,\n KeyCodes,\n type KeyInput,\n type MockInput,\n type MockMouse,\n} from \"@opentui/core/testing\"\nimport { Config, Effect, FileSystem, Schema } from \"effect\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationSemantics } from \"./semantics\"\n\nexport type Action = SimulationProtocol.Frontend.Action\nexport type Element = SimulationProtocol.Frontend.Element\n\nexport interface Harness {\n readonly renderer: CliRenderer\n readonly mockInput: MockInput\n readonly mockMouse: MockMouse\n readonly resize: (cols: number, rows: number) => void\n readonly renderOnce: () => Promise<void>\n readonly screen: () => string\n}\n\ntype RenderBuffer = {\n readonly width: number\n readonly height: number\n getRealCharBytes(includeAnsi?: boolean): Uint8Array\n}\n\nconst decoder = new TextDecoder()\n\nfunction isKeyCode(key: string): key is keyof typeof KeyCodes {\n return Object.hasOwn(KeyCodes, key)\n}\n\nfunction keyInput(key: string): KeyInput {\n const named = key.toUpperCase()\n return isKeyCode(named) ? named : key\n}\n\nfunction children(renderable: Renderable) {\n return renderable.getChildren().filter((child): child is Renderable => \"num\" in child)\n}\n\nfunction all(renderable: Renderable): Renderable[] {\n return [renderable, ...children(renderable).flatMap(all)]\n}\n\nfunction mouseListeners(renderable: Renderable) {\n const general = Reflect.get(renderable, \"_mouseListener\")\n const specific = Reflect.get(renderable, \"_mouseListeners\")\n return Boolean(general) || (specific && typeof specific === \"object\" && Object.keys(specific).length > 0)\n}\n\nfunction hit(renderer: CliRenderer, renderable: Renderable) {\n if (renderable.width <= 0 || renderable.height <= 0) return false\n const x = Math.floor(renderable.screenX + renderable.width / 2)\n const y = Math.floor(renderable.screenY + renderable.height / 2)\n const target = renderer.hitTest(x, y)\n return all(renderable).some((item) => item.num === target)\n}\n\n/**\n * Builds the harness the simulation server drives.\n *\n * When the renderer is the headless simulation renderer, its TestRendererSetup\n * provides the supported testing APIs. For the visible terminal renderer the\n * harness falls back to `requestRender` + `idle` and reading the private\n * `currentRenderBuffer`.\n */\nexport function createHarness(renderer: CliRenderer): Harness {\n const setup = SimulationRenderer.setupFor(renderer)\n return {\n renderer,\n mockInput: setup?.mockInput ?? createMockKeys(renderer),\n mockMouse: setup?.mockMouse ?? createMockMouse(renderer),\n resize: setup?.resize ?? ((cols, rows) => renderer.resize(cols, rows)),\n renderOnce:\n setup?.renderOnce ??\n (async () => {\n renderer.requestRender()\n await renderer.idle()\n }),\n // captureCharFrame follows the test renderer's output sink. Recording\n // redirects that sink to the timeline, so read the live render buffer\n // instead; it is also the source used by screenshots.\n screen: () => decoder.decode((Reflect.get(renderer, \"currentRenderBuffer\") as RenderBuffer).getRealCharBytes()),\n }\n}\n\nexport function elements(renderer: CliRenderer): Element[] {\n return all(renderer.root)\n .filter((renderable) => renderable.visible && !renderable.isDestroyed)\n .map((renderable) => {\n const clickable = mouseListeners(renderable) && hit(renderer, renderable)\n return {\n id: renderable.id,\n num: renderable.num,\n x: renderable.screenX,\n y: renderable.screenY,\n width: renderable.width,\n height: renderable.height,\n focusable: renderable.focusable,\n focused: renderable.focused,\n clickable,\n editor: renderer.currentFocusedEditor === renderable,\n } satisfies Element\n })\n .filter((element) => element.focusable || element.clickable || element.editor)\n}\n\nexport function state(harness: Harness) {\n return {\n focused: {\n renderable: harness.renderer.currentFocusedRenderable?.num,\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function snapshot(harness: Harness): SimulationProtocol.Frontend.SemanticSnapshot {\n const ids = new Set<string>()\n const visit = (renderable: Renderable, parent?: string): SimulationProtocol.Frontend.SemanticNode[] => {\n if (!renderable.visible || renderable.isDestroyed) return []\n const definition = SimulationSemantics.read(renderable)?.()\n if (definition && ids.has(renderable.id)) throw new Error(`duplicate semantic UI id: ${renderable.id}`)\n if (definition) ids.add(renderable.id)\n const node = definition\n ? [{ id: renderable.id, ...definition, ...(parent === undefined ? {} : { parent }), element: renderable.num }]\n : []\n const ancestor = definition ? renderable.id : parent\n return [...node, ...children(renderable).flatMap((child) => visit(child, ancestor))]\n }\n return Schema.decodeUnknownSync(SimulationProtocol.Frontend.SemanticSnapshot)({\n format: \"opencode-ui-snapshot-v1\",\n nodes: visit(harness.renderer.root),\n })\n}\n\nexport function matches(harness: Pick<Harness, \"screen\">, text: string) {\n return harness.screen().includes(text)\n}\n\nexport const capture = Effect.fn(\"SimulationActions.capture\")(function* (harness: Harness) {\n yield* Effect.tryPromise(() => harness.renderOnce())\n const buffer = harness.renderer.currentRenderBuffer\n return {\n cols: buffer.width,\n rows: buffer.height,\n cursor: [0, 0] as const,\n lines: buffer.getSpanLines().map((line) => ({\n spans: line.spans.map((span) => ({\n text: span.text,\n fg: span.fg.toInts(),\n bg: span.bg.toInts(),\n attributes: span.attributes,\n width: span.width,\n })),\n })),\n } satisfies SimulationProtocol.Frontend.CapturedFrame\n})\n\nexport const screenshot = Effect.fn(\"SimulationActions.screenshot\")(function* (harness: Harness, name?: string) {\n const filename = name ?? `screenshot-${crypto.randomUUID()}`\n if (!filename || filename.includes(\"/\") || filename.includes(\"\\\\\") || extname(filename))\n return yield* Effect.fail(new Error(\"screenshot name must not contain a path or extension\"))\n yield* Effect.tryPromise(() => harness.renderOnce())\n const { SimulationPng } = yield* Effect.promise(() => import(\"./png\"))\n const image = SimulationPng.screenshot(harness.renderer)\n const directory = resolve(\n yield* Config.string(\"OPENCODE_DRIVE_MEDIA_DIR\").pipe(\n Config.withDefault(join(tmpdir(), \"opencode-drive\", \"output\")),\n ),\n )\n const fs = yield* FileSystem.FileSystem\n yield* fs.makeDirectory(directory, { recursive: true })\n const path = join(directory, `${filename}.png`)\n yield* fs.writeFile(path, image.data)\n return path\n})\n\nexport const execute = Effect.fn(\"SimulationActions.execute\")(function* (harness: Harness, action: Action) {\n switch (action.type) {\n case \"ui.type\":\n yield* Effect.tryPromise(() => harness.mockInput.typeText(action.text))\n break\n case \"ui.press\":\n harness.mockInput.pressKey(keyInput(action.key), action.modifiers)\n break\n case \"ui.enter\":\n harness.mockInput.pressEnter()\n break\n case \"ui.arrow\":\n harness.mockInput.pressArrow(action.direction)\n break\n case \"ui.focus\":\n all(harness.renderer.root)\n .find((item) => item.num === action.target)\n ?.focus()\n break\n case \"ui.click\": {\n const target = all(harness.renderer.root).find((item) => item.num === action.target)\n if (!target || !target.visible || target.isDestroyed)\n return yield* Effect.fail(new Error(`click target is stale or unavailable: ${action.target}`))\n if (action.semantic) {\n const current = snapshot(harness).nodes.find((node) => node.element === action.target)\n if (\n current?.id !== action.semantic.id ||\n current.instance !== action.semantic.instance ||\n current.element !== action.semantic.element\n )\n return yield* Effect.fail(new Error(`semantic click target is stale or unavailable: ${action.semantic.id}`))\n }\n if (\n !Number.isFinite(action.x) ||\n action.x < 0 ||\n action.x >= target.width ||\n !Number.isFinite(action.y) ||\n action.y < 0 ||\n action.y >= target.height\n )\n return yield* Effect.fail(new Error(\"click position must be within the target element\"))\n yield* Effect.tryPromise(() => harness.mockMouse.click(target.screenX + action.x, target.screenY + action.y))\n break\n }\n case \"ui.resize\":\n if (\n !Number.isSafeInteger(action.cols) ||\n action.cols <= 0 ||\n !Number.isSafeInteger(action.rows) ||\n action.rows <= 0\n ) {\n return yield* Effect.fail(new Error(\"resize cols and rows must be positive integers\"))\n }\n harness.resize(action.cols, action.rows)\n SimulationRenderer.recordResize(harness.renderer, action.cols, action.rows)\n break\n }\n yield* Effect.tryPromise(() => harness.renderOnce())\n return state(harness)\n})\n\nexport * as SimulationActions from \"./actions\"\n", | ||
| "import { createWriteStream, type WriteStream } from \"node:fs\"\nimport { mkdir } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { Writable } from \"node:stream\"\nimport { finished } from \"node:stream/promises\"\nimport { Schema } from \"effect\"\n\nexport const Header = Schema.Struct({\n type: Schema.Literal(\"header\"),\n version: Schema.Literal(1),\n cols: Schema.Number,\n rows: Schema.Number,\n encoding: Schema.Literal(\"base64\"),\n})\nexport interface Header extends Schema.Schema.Type<typeof Header> {}\n\nexport const Output = Schema.Struct({\n type: Schema.Literal(\"output\"),\n at_ms: Schema.Number,\n data: Schema.String,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n\nexport const Resize = Schema.Struct({\n type: Schema.Literal(\"resize\"),\n at_ms: Schema.Number,\n cols: Schema.Number,\n rows: Schema.Number,\n})\nexport interface Resize extends Schema.Schema.Type<typeof Resize> {}\n\nexport const Event = Schema.Union([Header, Output, Resize])\nexport type Event = Schema.Schema.Type<typeof Event>\n\nexport class Timeline extends Writable {\n readonly isTTY = true\n readonly path: string\n readonly columns: number\n readonly rows: number\n private readonly output: WriteStream\n private readonly started = performance.now()\n private readonly timestamps: number[] = []\n private done?: Promise<string>\n\n private constructor(path: string, cols: number, rows: number, output: WriteStream) {\n super()\n this.path = path\n this.columns = cols\n this.rows = rows\n this.output = output\n // finish() reports stream failures; keep Writable from also throwing them process-wide.\n this.on(\"error\", () => {})\n output.on(\"error\", (error) => this.destroy(error))\n }\n\n static async create(path: string, cols: number, rows: number) {\n await mkdir(dirname(path), { recursive: true })\n const output = createWriteStream(path)\n const timeline = new Timeline(path, cols, rows, output)\n await new Promise<void>((resolve, reject) => {\n output.write(\n `${JSON.stringify({ type: \"header\", version: 1, cols, rows, encoding: \"base64\" } satisfies Header)}\\n`,\n (error) => (error ? reject(error) : resolve()),\n )\n })\n return timeline\n }\n\n getColorDepth() {\n return 24\n }\n\n override write(chunk: unknown, callback?: (error?: Error | null) => void): boolean\n override write(chunk: unknown, encoding: BufferEncoding, callback?: (error?: Error | null) => void): boolean\n override write(\n chunk: unknown,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ) {\n if (!this.writableEnded) {\n this.timestamps.push(this.elapsed())\n if (typeof encoding === \"function\") return super.write(chunk, encoding)\n if (encoding === undefined) return super.write(chunk, callback)\n return super.write(chunk, encoding, callback)\n }\n const done = typeof encoding === \"function\" ? encoding : callback\n queueMicrotask(() => done?.(null))\n return true\n }\n\n override _write(chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void) {\n this.writeOutput(chunk, this.timestamps.shift() ?? this.elapsed(), callback)\n }\n\n override _final(callback: (error?: Error | null) => void) {\n this.writeOutput(Buffer.alloc(0), this.elapsed(), (error) => {\n if (error) return callback(error)\n this.output.end(callback)\n })\n }\n\n finish() {\n if (this.done) return this.done\n this.end()\n this.done = finished(this).then(() => this.path)\n return this.done\n }\n\n resize(cols: number, rows: number) {\n if (this.writableEnded) return\n const event = { type: \"resize\", at_ms: this.elapsed(), cols, rows } satisfies Resize\n this.output.write(`${JSON.stringify(event)}\\n`)\n }\n\n private elapsed() {\n return Math.max(0, Math.round(performance.now() - this.started))\n }\n\n private writeOutput(data: Buffer, at_ms: number, callback: (error?: Error | null) => void) {\n const event = {\n type: \"output\",\n at_ms,\n data: data.toString(\"base64\"),\n } satisfies Output\n this.output.write(`${JSON.stringify(event)}\\n`, callback)\n }\n}\n\nexport * as SimulationRecording from \"./recording\"\n", | ||
| "import type { CliRenderer, CliRendererConfig } from \"@opentui/core\"\nimport { createTestRenderer, type TestRendererSetup } from \"@opentui/core/testing\"\nimport { Effect } from \"effect\"\nimport { Timeline } from \"../recording\"\n\nconst setups = new WeakMap<CliRenderer, TestRendererSetup>()\nconst recordings = new WeakMap<CliRenderer, Timeline>()\n\n/**\n * Creates a headless renderer with optional recording: a real CliRenderer\n * backed by an in-memory screen buffer. The TestRendererSetup is kept\n * module-side so the harness can use supported testing APIs without app\n * code carrying it around.\n */\nexport interface Viewport {\n readonly cols: number\n readonly rows: number\n}\n\nexport const create = Effect.fn(\"SimulationRenderer.create\")(function* (\n options: CliRendererConfig,\n path?: string,\n viewport?: Viewport,\n) {\n const cols = viewport?.cols ?? 100\n const rows = viewport?.rows ?? 40\n const recording = path\n ? yield* Effect.acquireRelease(\n Effect.tryPromise(() => Timeline.create(path, cols, rows)),\n (recording) =>\n Effect.tryPromise(() => recording.finish()).pipe(\n Effect.catch((error) =>\n Effect.sync(() => process.stderr.write(`Failed to finish UI recording: ${error}\\n`)),\n ),\n ),\n )\n : undefined\n const setup = yield* Effect.acquireRelease(\n Effect.tryPromise(() =>\n createTestRenderer({\n ...options,\n width: cols,\n height: rows,\n ...(recording\n ? {\n stdout: recording as unknown as NodeJS.WriteStream,\n bufferedOutput: \"stdout\" as const,\n }\n : {}),\n }),\n ),\n (setup) =>\n Effect.sync(() => {\n if (!setup.renderer.isDestroyed) setup.renderer.destroy()\n }),\n )\n setups.set(setup.renderer, setup)\n if (recording) recordings.set(setup.renderer, recording)\n return setup.renderer\n})\n\nexport function recordResize(renderer: CliRenderer, cols: number, rows: number) {\n recordings.get(renderer)?.resize(cols, rows)\n}\n\nexport function setupFor(renderer: CliRenderer): TestRendererSetup | undefined {\n return setups.get(renderer)\n}\n\nexport function finish(renderer: CliRenderer) {\n const recording = recordings.get(renderer)\n if (!recording) return Effect.fail(new Error(\"UI recording is not available\"))\n return Effect.tryPromise(() => recording.finish())\n}\n\nexport * as SimulationRenderer from \"./renderer\"\n", | ||
| "import type { Renderable } from \"@opentui/core\"\nimport type { SimulationProtocol } from \"../protocol\"\n\n// Semantic renderables set an explicit stable OpenTUI id so ui.state and\n// ui.snapshot expose the same identity. Hierarchy and element handles come\n// from the live render tree.\nexport type Definition = Omit<SimulationProtocol.Frontend.SemanticNode, \"id\" | \"element\" | \"parent\">\n\nconst key = Symbol.for(\"opencode.simulation.semantics\")\n\nconst bind = (definition: () => Definition) => (renderable: Renderable) => {\n Object.defineProperty(renderable, key, { value: definition, configurable: true })\n}\n\nexport const read = (renderable: Renderable) => {\n const definition: unknown = Reflect.get(renderable, key)\n return typeof definition === \"function\" ? (definition as () => Definition) : undefined\n}\n\nexport const SimulationSemantics = { bind, read }\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationActions, type Harness } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\n\nfunction handle(harness: Harness, request: SimulationProtocol.Frontend.Request) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.screenshot\":\n return SimulationActions.screenshot(harness, request.params?.name)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.snapshot\":\n return Effect.sync(() => SimulationActions.snapshot(harness))\n case \"ui.matches\":\n return Effect.sync(() => SimulationActions.matches(harness, request.params.text))\n case \"ui.recording.finish\":\n return SimulationRenderer.finish(harness.renderer)\n case \"ui.type\":\n return SimulationActions.execute(harness, { type: \"ui.type\", text: request.params.text })\n case \"ui.enter\":\n return SimulationActions.execute(harness, { type: \"ui.enter\" })\n case \"ui.press\":\n return SimulationActions.execute(harness, {\n type: \"ui.press\",\n key: request.params.key,\n modifiers: request.params.modifiers,\n })\n case \"ui.arrow\":\n return SimulationActions.execute(harness, { type: \"ui.arrow\", direction: request.params.direction })\n case \"ui.focus\":\n return SimulationActions.execute(harness, { type: \"ui.focus\", target: request.params.target })\n case \"ui.click\":\n return SimulationActions.execute(harness, {\n type: \"ui.click\",\n target: request.params.target,\n x: request.params.x,\n y: request.params.y,\n semantic: request.params.semantic,\n })\n case \"ui.resize\":\n return SimulationActions.execute(harness, {\n type: \"ui.resize\",\n cols: request.params.cols,\n rows: request.params.rows,\n })\n }\n}\n\nexport const start = Effect.fn(\"SimulationServer.start\")(function* (harness: Harness, endpoint: string) {\n return yield* SimulationControlServer.start({\n endpoint,\n label: \"opencode drive ui websocket\",\n data: () => ({ drive: true as const }),\n decode: SimulationProtocol.Frontend.decodeRequestEffect,\n handle: (_socket, request) => handle(harness, request),\n })\n})\n\nexport * as SimulationServer from \"./server\"\n", | ||
| "import { createCliRenderer, type CliRendererConfig } from \"@opentui/core\"\nimport { Config, Effect } from \"effect\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationActions } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationServer } from \"./server\"\n\n/** Drive-mode renderer and control-server acquisition. */\nexport const create = Effect.fn(\"Drive.create\")(function* (options: CliRendererConfig) {\n const headless = (yield* Config.string(\"OPENCODE_DRIVE_RENDERER\").pipe(Config.withDefault(\"visible\"))) === \"headless\"\n const manifest = yield* DriveManifest.resolve()\n const renderer = headless\n ? yield* SimulationRenderer.create(options, manifest.recording?.timeline, manifest.viewport)\n : yield* Effect.acquireRelease(\n Effect.tryPromise(() => createCliRenderer(options)),\n (renderer) =>\n Effect.sync(() => {\n if (!renderer.isDestroyed) renderer.destroy()\n }),\n )\n if (!headless && manifest.viewport) renderer.resize(manifest.viewport.cols, manifest.viewport.rows)\n const server = yield* SimulationServer.start(SimulationActions.createHarness(renderer), manifest.endpoints.ui)\n yield* Effect.sync(() => process.stderr.write(`opencode drive ui websocket: ${server.url}\\n`))\n return renderer\n})\n\nexport * as Drive from \"./simulation\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "082C19EA0CB93F2964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";k8BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,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": "F2C9BE10495C553C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/plugin/sdk.ts", "../plugin/src/v2/effect/tool.ts", "../plugin/src/v2/effect/plugin.ts", "../schema/src/session.ts", "../schema/src/command.ts", "../schema/src/reference.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SdkPlugins from \"./sdk\"\n\nimport type { Plugin } from \"@opencode-ai/plugin/v2/effect/plugin\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { makeGlobalNode } from \"../effect/app-node\"\nimport { EventV2 } from \"../event\"\nimport type { PluginV2 } from \"../plugin\"\n\nexport const Updated = EventV2.ephemeral({ type: \"sdk.plugin.updated\", schema: {} })\n\n/**\n * Holds the plugins an embedder (the `@opencode-ai/sdk-next` host) contributes,\n * so `PluginSupervisor` can add them on every Location boot through the ordinary\n * generation path that `PluginSupervisor` uses for plugins discovered from\n * config. Registration publishes an unlocated update so every booted Location\n * reloads its plugin generation from the shared store.\n *\n * Each host-global layer owns one private store. Location graphs reuse that\n * layer through Effect's memoization, so separate hosts remain isolated while\n * every Location in one host sees the same registrations.\n */\nexport interface Interface {\n readonly register: (plugin: Plugin) => Effect.Effect<void>\n readonly all: () => readonly PluginV2.Versioned[]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/SdkPlugins\") {}\n\nexport const layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const events = yield* EventV2.Service\n const plugins = new Map<string, PluginV2.Versioned>()\n let revision = 0\n return Service.of({\n register: (plugin) =>\n Effect.sync(() => {\n plugins.set(plugin.id, { ...plugin, version: String(++revision) })\n }).pipe(Effect.andThen(events.publish(Updated, {})), Effect.asVoid),\n all: () => [...plugins.values()],\n })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer, deps: [EventV2.node] })\n", | ||
| "export * as Tool from \"./tool.js\"\n\nimport { Agent } from \"@opencode-ai/schema/agent\"\nimport type { LLM } from \"@opencode-ai/schema/llm\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from \"@standard-schema/spec\"\nimport { Effect, JsonSchema, Schema } from \"effect\"\nimport type { Hooks, Transform } from \"./registration.js\"\n\nexport interface Context {\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly progress: (update: Progress) => Effect.Effect<void>\n}\n\nexport interface Progress {\n readonly structured: Readonly<Record<string, unknown>>\n readonly content?: ReadonlyArray<Content>\n}\n\nexport type StandardSchemaType<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output> &\n StandardJSONSchemaV1<Input, Output>\nexport type SchemaType<A> = Schema.Codec<A, any> | StandardSchemaType<any, A>\ntype IsAny<A> = 0 extends 1 & A ? true : false\nexport type InputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\nexport type OutputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<infer A, any>\n ? A\n : never\nexport type EncodedValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<any, infer A>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\n\ntype ToolDefinition = {\n readonly name: string\n readonly description: string\n readonly inputSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n}\n\ntype ToolCall = {\n readonly input: unknown\n readonly [key: string]: unknown\n}\n\ntype ToolResultValue =\n | { readonly type: \"json\"; readonly value: unknown }\n | { readonly type: \"text\"; readonly value: unknown }\n | { readonly type: \"error\"; readonly value: unknown }\n | { readonly type: \"content\"; readonly value: ReadonlyArray<LLM.ToolContent> }\n\ntype ToolOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<LLM.ToolContent>\n}\n\nexport class Failure extends Schema.TaggedErrorClass<Failure>()(\"LLM.ToolFailure\", {\n message: Schema.String,\n error: Schema.optional(Schema.Defect()),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport class RegistrationError extends Schema.TaggedErrorClass<RegistrationError>()(\"Tool.RegistrationError\", {\n name: Schema.String,\n message: Schema.String,\n}) {}\n\nexport type Content =\n | { readonly type: \"text\"; readonly text: string }\n | { readonly type: \"file\"; readonly data: string; readonly mime: string; readonly name?: string }\n\nexport type Definition<\n Input extends SchemaType<any>,\n Structured extends SchemaType<any>,\n Output extends SchemaType<any> = any,\n> = {\n readonly description: string\n readonly input: Input\n readonly output: Output\n readonly structured?: Structured\n readonly permission?: string\n readonly toStructuredOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => OutputValue<Structured>\n readonly execute: (input: InputValue<Input>, context: Context) => Effect.Effect<OutputValue<Output>, Failure>\n readonly toModelOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => ReadonlyArray<Content>\n}\n\nexport type DynamicOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<Content>\n}\n\n/**\n * Config for a tool whose input shape is a raw JSON Schema not known at compile\n * time (MCP servers, plugin manifests). Input is passed through as `unknown`;\n * `execute` returns the already-projected structured value and model content.\n */\nexport type DynamicDefinition = {\n readonly description: string\n readonly jsonSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n readonly permission?: string\n readonly execute: (input: unknown, context: Context) => Effect.Effect<DynamicOutput, Failure>\n}\n\nexport type AnyTool = Definition<any, any> | DynamicDefinition\n\nexport function make<\n Input extends SchemaType<any>,\n Output extends SchemaType<any>,\n Structured extends SchemaType<any> = Output,\n>(config: Definition<Input, Structured, Output>): Definition<Input, Structured, Output>\nexport function make(config: DynamicDefinition): DynamicDefinition\nexport function make(config: AnyTool): AnyTool\nexport function make(config: AnyTool): AnyTool {\n return config\n}\n\nfunction toModelContent(part: Content) {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text }\n return { type: \"file\" as const, uri: `data:${part.mime};base64,${part.data}`, mime: part.mime, name: part.name }\n}\n\nexport const validateName = (name: string) =>\n /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(name)\n ? Effect.void\n : Effect.fail(new RegistrationError({ name, message: `Invalid tool name: ${name}` }))\n\nexport const registrationEntries = (tools: Readonly<Record<string, AnyTool>>, namespace?: string) =>\n Object.entries(tools).map(([name, tool]) => {\n const normalized = name.replace(/[^a-zA-Z0-9_-]/g, \"_\")\n return {\n key: namespace === undefined ? normalized : `${namespace.replaceAll(\".\", \"_\")}_${normalized}`,\n name: normalized,\n namespace,\n tool,\n }\n })\n\nexport const validateNamespace = (namespace: string) =>\n namespace.split(\".\").every((segment) => /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(segment))\n ? Effect.void\n : Effect.fail(\n new RegistrationError({ name: namespace, message: `Invalid tool namespace: ${JSON.stringify(namespace)}` }),\n )\n\nexport const withPermission = <T extends AnyTool>(\n tool: T,\n permission: string,\n): Omit<T, \"permission\"> & {\n readonly permission: string\n} => ({ ...tool, permission })\n\nexport const permission = (tool: AnyTool, name: string) => tool.permission ?? name\n\nexport const definition = (name: string, tool: AnyTool): ToolDefinition =>\n \"jsonSchema\" in tool\n ? {\n name,\n description: tool.description,\n inputSchema: tool.jsonSchema,\n outputSchema: tool.outputSchema,\n }\n : {\n name,\n description: tool.description,\n inputSchema: inputJsonSchema(tool.input),\n outputSchema: outputJsonSchema(tool.structured ?? tool.output),\n }\n\nexport const settle = (tool: AnyTool, call: ToolCall, context: Context): Effect.Effect<ToolOutput, Failure> =>\n Effect.gen(function* () {\n if (\"jsonSchema\" in tool) {\n const output = yield* tool.execute(call.input, context)\n return { structured: output.structured, content: output.content.map(toModelContent) }\n }\n\n const input = yield* decodeInput(tool.input, call.input)\n const value = yield* tool.execute(input, context)\n const output = yield* encodeOutput(tool.output, value)\n const structured =\n tool.structured && tool.toStructuredOutput\n ? yield* encodeOutput(tool.structured, tool.toStructuredOutput({ input, output }))\n : output\n return {\n structured,\n content:\n tool.toModelOutput?.({ input, output }).map(toModelContent) ??\n (typeof output === \"string\" ? [{ type: \"text\" as const, text: output }] : []),\n }\n })\n\nfunction decodeInput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError((error) => new Failure({ message: `Invalid tool input: ${error.message}` })),\n )\n return validateStandard(schema, value, \"Invalid tool input\")\n}\n\nfunction encodeOutput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.encodeEffect(schema)(value).pipe(\n Effect.mapError(\n (error) => new Failure({ message: `Tool returned an invalid value for its output schema: ${error.message}` }),\n ),\n )\n return validateStandard(schema, value, \"Tool returned an invalid value for its output schema\")\n}\n\nfunction validateStandard(schema: StandardSchemaType, value: unknown, prefix: string): Effect.Effect<unknown, Failure> {\n return Effect.gen(function* () {\n const pending = yield* Effect.try({\n try: () => schema[\"~standard\"].validate(value),\n catch: (error) => standardFailure(prefix, error),\n })\n const result =\n pending instanceof Promise\n ? yield* Effect.tryPromise({ try: () => pending, catch: (error) => standardFailure(prefix, error) })\n : pending\n if (result.issues)\n return yield* Effect.fail(\n new Failure({ message: `${prefix}: ${result.issues.map((issue) => issue.message).join(\", \")}` }),\n )\n return result.value\n })\n}\n\nfunction standardFailure(prefix: string, error: unknown) {\n return new Failure({ message: `${prefix}: ${error instanceof Error ? error.message : String(error)}` })\n}\n\nfunction inputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.input({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction outputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.output({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction toJsonSchema(schema: Schema.Top): JsonSchema.JsonSchema {\n const document = Schema.toJsonSchemaDocument(schema)\n if (Object.keys(document.definitions).length === 0) return document.schema\n return { ...document.schema, $defs: document.definitions }\n}\n\nexport interface ToolExecuteBeforeEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n input: unknown\n}\n\nexport interface ToolExecuteAfterEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly input: unknown\n result: ToolResultValue\n output?: ToolOutput\n outputPaths?: ReadonlyArray<string>\n}\n\nexport interface RegisterOptions {\n readonly namespace?: string\n /** Defaults to true. False exposes the tool directly to the provider. */\n readonly codemode?: boolean\n}\n\nexport interface ToolDraft {\n add(name: string, tool: AnyTool, options?: RegisterOptions): void\n}\n\nexport interface ToolHooks {\n readonly \"execute.before\": ToolExecuteBeforeEvent\n readonly \"execute.after\": ToolExecuteAfterEvent\n}\n\nexport interface ToolDomain {\n readonly transform: Transform<ToolDraft>\n readonly hook: Hooks<ToolHooks>\n}\n", | ||
| "import type { PluginApi } from \"@opencode-ai/client/effect/api\"\nimport type { Effect, Scope } from \"effect\"\nimport type { PluginOptions } from \"../options.js\"\nimport type { AgentDomain } from \"./agent.js\"\nimport type { AISDKDomain } from \"./aisdk.js\"\nimport type { CatalogDomain } from \"./catalog.js\"\nimport type { CommandDomain } from \"./command.js\"\nimport type { EventDomain } from \"./event.js\"\nimport type { IntegrationDomain } from \"./integration.js\"\nimport type { ReferenceDomain } from \"./reference.js\"\nimport type { SessionDomain } from \"./session.js\"\nimport type { SkillDomain } from \"./skill.js\"\nimport type { ToolDomain } from \"./tool.js\"\n\nexport interface Context {\n readonly options: PluginOptions\n readonly agent: AgentDomain\n readonly aisdk: AISDKDomain\n readonly catalog: CatalogDomain\n readonly command: CommandDomain\n readonly event: EventDomain\n readonly integration: IntegrationDomain\n readonly plugin: PluginApi<unknown>\n readonly reference: ReferenceDomain\n readonly session: SessionDomain\n readonly skill: SkillDomain\n readonly tool: ToolDomain\n}\n\nexport interface Plugin<R = Scope.Scope> {\n readonly id: string\n readonly effect: (context: Context) => Effect.Effect<void, never, R>\n}\n\nexport function define<R = Scope.Scope>(plugin: Plugin<R>) {\n return plugin\n}\n", | ||
| "export * as Session from \"./session.js\"\n\nimport { Schema } from \"effect\"\nimport { Agent } from \"./agent.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionEvent } from \"./session-event.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Money } from \"./money.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { Revert } from \"./session-revert.js\"\n\nexport const ID = SessionID\nexport type ID = SessionID\n\nexport const Event = SessionEvent\n\nexport { Revert }\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n parentID: ID.pipe(optional),\n fork: Schema.Struct({\n sessionID: ID,\n /** Messages before this exclusive boundary are copied into the fork. */\n messageID: SessionMessage.ID.pipe(optional),\n }).pipe(optional),\n projectID: Project.ID,\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n updated: DateTimeUtcFromMillis,\n archived: DateTimeUtcFromMillis.pipe(optional),\n }),\n title: Schema.String,\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n revert: Revert.pipe(optional),\n}).annotate({ identifier: \"Session.Info\" })\n\nexport const ListAnchor = Schema.Struct({\n id: ID,\n time: Schema.Finite,\n direction: Schema.Literals([\"previous\", \"next\"]),\n}).annotate({ identifier: \"Session.ListAnchor\" })\nexport interface ListAnchor extends Schema.Schema.Type<typeof ListAnchor> {}\n", | ||
| "export * as Command from \"./command.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Agent } from \"./agent.js\"\n\nconst Updated = ephemeral({ type: \"command.updated\", schema: {} })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n name: Schema.String,\n template: Schema.String,\n description: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n subtask: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Command.Info\" })\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Reference from \"./reference.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"reference.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface LocalSource extends Schema.Schema.Type<typeof LocalSource> {}\nexport const LocalSource = Schema.Struct({\n type: Schema.Literal(\"local\"),\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.LocalSource\" })\n\nexport interface GitSource extends Schema.Schema.Type<typeof GitSource> {}\nexport const GitSource = Schema.Struct({\n type: Schema.Literal(\"git\"),\n repository: Schema.String,\n branch: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.GitSource\" })\n\nexport const Source = Schema.Union([LocalSource, GitSource])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Reference.Source\" })\nexport type Source = typeof Source.Type\n\nexport const Info = Schema.Struct({\n name: Schema.String,\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n source: Source,\n}).annotate({ identifier: \"Reference.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "5B3446E1347CC99164756E2164756E21", | ||
| "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": ";i/BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,SAAM,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": "12A9B8C4E8A17BCC64756E2164756E21", | ||
| "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": ["../schema/src/llm.ts"], | ||
| "sourcesContent": [ | ||
| "export * as LLM from \"./llm.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\n\nexport const ProviderMetadata = Schema.Record(Schema.String, Schema.Record(Schema.String, Schema.Unknown)).annotate({\n identifier: \"LLM.ProviderMetadata\",\n})\nexport type ProviderMetadata = Schema.Schema.Type<typeof ProviderMetadata>\n\nexport const FinishReason = Schema.Literals([\"stop\", \"length\", \"tool-calls\", \"content-filter\", \"error\", \"unknown\"])\nexport type FinishReason = typeof FinishReason.Type\n\nexport interface ToolTextContent extends Schema.Schema.Type<typeof ToolTextContent> {}\nexport const ToolTextContent = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n}).annotate({ identifier: \"Tool.TextContent\" })\n\nexport interface ToolFileContent extends Schema.Schema.Type<typeof ToolFileContent> {}\nexport const ToolFileContent = Schema.Struct({\n type: Schema.Literal(\"file\"),\n uri: Schema.String,\n mime: Schema.String,\n name: optional(Schema.String),\n}).annotate({ identifier: \"Tool.FileContent\" })\n\nexport const ToolContent = Schema.Union([ToolTextContent, ToolFileContent])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"LLM.ToolContent\" })\nexport type ToolContent = Schema.Schema.Type<typeof ToolContent>\n" | ||
| ], | ||
| "mappings": ";oRAKO,SAAM,OAAmB,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EAAE,SAAS,CAClH,WAAY,sBACd,CAAC,EAGY,EAAe,EAAO,SAAS,CAAC,OAAQ,SAAU,aAAc,iBAAkB,QAAS,SAAS,CAAC,EAIrG,EAAkB,EAAO,OAAO,CAC3C,KAAM,EAAO,QAAQ,MAAM,EAC3B,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAkB,EAAO,OAAO,CAC3C,KAAM,EAAO,QAAQ,MAAM,EAC3B,IAAK,EAAO,OACZ,KAAM,EAAO,OACb,KAAM,EAAS,EAAO,MAAM,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEjC,EAAc,EAAO,MAAM,CAAC,EAAiB,CAAe,CAAC,EACvE,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,iBAAkB,CAAC", | ||
| "debugId": "EEAF746DD9E5ADDB64756E2164756E21", | ||
| "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": "E360E15DCC35832B64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/route/auth-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { Config, Redacted } from \"effect\"\nimport { Auth } from \"./auth\"\n\nexport type ApiKeyMode = \"optional\" | \"required\"\n\nexport type AuthOverride = {\n readonly auth: Auth.Definition\n readonly apiKey?: never\n}\n\nexport type OptionalApiKeyAuth = {\n readonly apiKey?: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type RequiredApiKeyAuth = {\n readonly apiKey: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type ProviderAuthOption<Mode extends ApiKeyMode> =\n | AuthOverride\n | (Mode extends \"optional\" ? OptionalApiKeyAuth : RequiredApiKeyAuth)\n\nexport type ModelOptions<Base, Mode extends ApiKeyMode> = Omit<Base, \"apiKey\" | \"auth\"> & ProviderAuthOption<Mode>\n\nexport type ModelArgs<Base, Mode extends ApiKeyMode> = Mode extends \"optional\"\n ? readonly [options?: ModelOptions<Base, Mode>]\n : readonly [options: ModelOptions<Base, Mode>]\n\nexport type ModelFactory<Base, Mode extends ApiKeyMode, Model> = (id: string, ...args: ModelArgs<Base, Mode>) => Model\n\n/**\n * Require at least one of the keys in `T`. Use for option shapes where any\n * subset of fields is acceptable but at least one must be present (e.g. Azure\n * accepts `resourceName` or `baseURL`).\n */\nexport type AtLeastOne<T> = {\n [K in keyof T]: Required<Pick<T, K>> & Partial<Omit<T, K>>\n}[keyof T]\n\n/**\n * Standard bearer-auth resolution for providers: honor an explicit `auth`\n * override, otherwise resolve `apiKey` (option > config var) and apply it as\n * a bearer token.\n */\nexport const bearer = (\n options: ProviderAuthOption<\"optional\">,\n envVar: string | ReadonlyArray<string>,\n): Auth.Definition => {\n if (\"auth\" in options && options.auth) return options.auth\n return (Array.isArray(envVar) ? envVar : [envVar])\n .reduce(\n (auth, name) => auth.orElse(Auth.config(name)),\n Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\"),\n )\n .bearer()\n}\n\nexport * as AuthOptions from \"./auth-options\"\n" | ||
| ], | ||
| "mappings": ";kJA8CO,SAAM,EAAS,CACpB,EACA,IACoB,CACpB,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAQ,MAAM,QAAQ,CAAM,EAAI,EAAS,CAAC,CAAM,GAC7C,OACC,CAAC,EAAM,IAAS,EAAK,OAAO,EAAK,OAAO,CAAI,CAAC,EAC7C,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,CAC1E,EACC,OAAO", | ||
| "debugId": "65151E7687B1C6E664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/lifecycle.ts", "../ai/src/protocols/utils/gemini-tool-schema.ts", "../ai/src/protocols/utils/tool-schema.ts"], | ||
| "sourcesContent": [ | ||
| "import { LLMEvent, type FinishReason, type ProviderMetadata, type Usage } from \"../../schema\"\n\nexport interface State {\n readonly stepStarted: boolean\n readonly text: ReadonlySet<string>\n readonly reasoning: ReadonlySet<string>\n}\n\nexport const initial = (): State => ({ stepStarted: false, text: new Set(), reasoning: new Set() })\n\nexport const stepStart = (state: State, events: LLMEvent[]): State => {\n if (state.stepStarted) return state\n events.push(LLMEvent.stepStart({ index: 0 }))\n return { ...state, stepStarted: true }\n}\n\nexport const textDelta = (state: State, events: LLMEvent[], id: string, text: string): State => {\n const stepped = stepStart(state, events)\n if (stepped.text.has(id)) {\n events.push(LLMEvent.textDelta({ id, text }))\n return stepped\n }\n events.push(LLMEvent.textStart({ id }), LLMEvent.textDelta({ id, text }))\n return { ...stepped, text: new Set([...stepped.text, id]) }\n}\n\nexport const reasoningStart = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningStart({ id, providerMetadata }))\n return { ...stepped, reasoning: new Set([...stepped.reasoning, id]) }\n}\n\nexport const reasoningDelta = (\n state: State,\n events: LLMEvent[],\n id: string,\n text: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n const started = reasoningStart(state, events, id, providerMetadata)\n events.push(LLMEvent.reasoningDelta({ id, text, providerMetadata }))\n return started\n}\n\nexport const reasoningEnd = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (!state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningEnd({ id, providerMetadata }))\n const reasoning = new Set(stepped.reasoning)\n reasoning.delete(id)\n return { ...stepped, reasoning }\n}\n\nexport const textEnd = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (!state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textEnd({ id, providerMetadata }))\n const text = new Set(stepped.text)\n text.delete(id)\n return { ...stepped, text }\n}\n\nconst closeOpenBlocks = (state: State, events: LLMEvent[]): State => {\n for (const id of state.reasoning) events.push(LLMEvent.reasoningEnd({ id }))\n for (const id of state.text) events.push(LLMEvent.textEnd({ id }))\n return { ...state, text: new Set(), reasoning: new Set() }\n}\n\nexport const finish = (\n state: State,\n events: LLMEvent[],\n input: {\n readonly reason: FinishReason\n readonly usage?: Usage\n readonly providerMetadata?: ProviderMetadata\n },\n): State => {\n const stepped = closeOpenBlocks(stepStart(state, events), events)\n events.push(\n LLMEvent.stepFinish({\n index: 0,\n reason: input.reason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n }),\n LLMEvent.finish(input),\n )\n return { ...stepped, stepStarted: false }\n}\n\nexport * as Lifecycle from \"./lifecycle\"\n", | ||
| "import { isRecord } from \"../../utils/record\"\n\n// Gemini accepts a JSON Schema-like dialect for tool parameters, but rejects a\n// handful of common JSON Schema shapes. Keep this projection isolated so the\n// Gemini protocol file still reads like the other protocol modules.\nconst SCHEMA_INTENT_KEYS = [\n \"type\",\n \"properties\",\n \"items\",\n \"prefixItems\",\n \"enum\",\n \"const\",\n \"$ref\",\n \"additionalProperties\",\n \"patternProperties\",\n \"required\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n]\n\nconst hasCombiner = (schema: unknown) =>\n isRecord(schema) && (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf) || Array.isArray(schema.allOf))\n\nconst hasSchemaIntent = (schema: unknown) =>\n isRecord(schema) && (hasCombiner(schema) || SCHEMA_INTENT_KEYS.some((key) => key in schema))\n\nconst sanitizeNode = (schema: unknown): unknown => {\n if (!isRecord(schema)) return Array.isArray(schema) ? schema.map(sanitizeNode) : schema\n\n const result: Record<string, unknown> = Object.fromEntries(\n Object.entries(schema).map(([key, value]) => [\n key,\n key === \"enum\" && Array.isArray(value) ? value.map(String) : sanitizeNode(value),\n ]),\n )\n\n if (Array.isArray(result.enum) && (result.type === \"integer\" || result.type === \"number\")) result.type = \"string\"\n\n const properties = result.properties\n if (result.type === \"object\" && isRecord(properties) && Array.isArray(result.required)) {\n result.required = result.required.filter((field) => typeof field === \"string\" && field in properties)\n }\n\n if (result.type === \"array\" && !hasCombiner(result)) {\n result.items = result.items ?? {}\n if (isRecord(result.items) && !hasSchemaIntent(result.items)) result.items = { ...result.items, type: \"string\" }\n }\n\n if (typeof result.type === \"string\" && result.type !== \"object\" && !hasCombiner(result)) {\n delete result.properties\n delete result.required\n }\n\n return result\n}\n\nconst emptyObjectSchema = (schema: Record<string, unknown>) =>\n schema.type === \"object\" &&\n (!isRecord(schema.properties) || Object.keys(schema.properties).length === 0) &&\n !schema.additionalProperties\n\nconst projectNode = (schema: unknown): Record<string, unknown> | undefined => {\n if (!isRecord(schema)) return undefined\n if (emptyObjectSchema(schema)) return undefined\n return Object.fromEntries(\n [\n [\"description\", schema.description],\n [\"required\", schema.required],\n [\"format\", schema.format],\n [\"type\", Array.isArray(schema.type) ? schema.type.filter((type) => type !== \"null\")[0] : schema.type],\n [\"nullable\", Array.isArray(schema.type) && schema.type.includes(\"null\") ? true : undefined],\n [\"enum\", schema.const !== undefined ? [schema.const] : schema.enum],\n [\n \"properties\",\n isRecord(schema.properties)\n ? Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => [key, projectNode(value)]))\n : undefined,\n ],\n [\n \"items\",\n Array.isArray(schema.items)\n ? schema.items.map(projectNode)\n : schema.items === undefined\n ? undefined\n : projectNode(schema.items),\n ],\n [\"allOf\", Array.isArray(schema.allOf) ? schema.allOf.map(projectNode) : undefined],\n [\"anyOf\", Array.isArray(schema.anyOf) ? schema.anyOf.map(projectNode) : undefined],\n [\"oneOf\", Array.isArray(schema.oneOf) ? schema.oneOf.map(projectNode) : undefined],\n [\"minLength\", schema.minLength],\n ].filter((entry) => entry[1] !== undefined),\n )\n}\n\nexport const convert = (schema: unknown) => projectNode(sanitizeNode(schema))\n\nexport * as GeminiToolSchema from \"./gemini-tool-schema\"\n", | ||
| "import type { JsonSchema, ModelToolSchemaCompatibility } from \"../../schema\"\nimport { isRecord } from \"../../utils/record\"\nimport { GeminiToolSchema } from \"./gemini-tool-schema\"\n\nconst removeNullSchemas = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(removeNullSchemas)\n if (!isRecord(value)) return value\n const fields = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"anyOf\")\n .map(([key, field]) => [key, removeNullSchemas(field)]),\n )\n if (!Array.isArray(value.anyOf)) return fields\n const variants = value.anyOf.filter((variant) => !isRecord(variant) || variant.type !== \"null\").map(removeNullSchemas)\n if (variants.length === 1 && isRecord(variants[0])) return { ...fields, ...variants[0] }\n return { ...fields, anyOf: variants }\n}\n\nconst tupleItemsSchema = (items: ReadonlyArray<unknown>) => {\n const projected = items.map(moonshotNode)\n if (projected.length === 0) return {}\n if (projected.length === 1) return projected[0]\n return { anyOf: projected }\n}\n\nconst moonshotNode = (schema: unknown): unknown => {\n if (Array.isArray(schema)) return schema.map(moonshotNode)\n if (!isRecord(schema)) return schema\n if (typeof schema.$ref === \"string\") return { $ref: schema.$ref }\n return Object.fromEntries(\n Object.entries(schema).flatMap(([key, value]) => {\n if (key === \"items\" && Array.isArray(value)) return [[key, tupleItemsSchema(value)]]\n if (key === \"prefixItems\") {\n if (\"items\" in schema) return []\n return [[\"items\", tupleItemsSchema(Array.isArray(value) ? value : [])]]\n }\n if (key === \"unevaluatedItems\") return []\n return [[key, moonshotNode(value)]]\n }),\n )\n}\n\nconst moonshot = (schema: JsonSchema): JsonSchema => {\n const projected = moonshotNode(schema)\n return isRecord(projected) ? projected : {}\n}\n\nconst openAI = (schema: JsonSchema): JsonSchema => {\n const variants = Array.isArray(schema.anyOf) ? schema.anyOf.filter(isRecord) : []\n const flattened =\n variants.length === 0\n ? { ...schema, type: \"object\" }\n : {\n ...Object.fromEntries(Object.entries(schema).filter(([key]) => key !== \"anyOf\")),\n type: \"object\",\n properties: variants.reduce(\n (properties, variant) => ({ ...(isRecord(variant.properties) ? variant.properties : {}), ...properties }),\n {},\n ),\n additionalProperties: false,\n }\n const normalized = removeNullSchemas(flattened)\n return isRecord(normalized) ? normalized : { type: \"object\" }\n}\n\nconst gemini = (schema: JsonSchema): JsonSchema => GeminiToolSchema.convert(schema) ?? {}\n\nconst modelCompatibility = (\n schema: JsonSchema,\n compatibility: ModelToolSchemaCompatibility | undefined,\n): JsonSchema => {\n if (compatibility === undefined) return schema\n switch (compatibility) {\n case \"gemini\":\n return gemini(schema)\n case \"moonshot\":\n return moonshot(schema)\n }\n}\n\nexport const ToolSchemaProjection = {\n gemini,\n modelCompatibility,\n moonshot,\n openAI,\n} as const\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "41650E0BAA859DC764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": ";mxBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "89FC557E6EDE19C664756E2164756E21", | ||
| "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": "B243792CC654F7B964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
+3
-3
@@ -5,7 +5,7 @@ { | ||
| "sourcesContent": [ | ||
| "#!/usr/bin/env bun\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\nimport { Commands } from \"./commands/commands\"\nimport { Runtime } from \"./framework/runtime\"\nimport { Observability } from \"@opencode-ai/core/observability\"\nimport { Updater } from \"./services/updater\"\nimport { InstallationChannel, InstallationVersion, InstallationLocal } from \"@opencode-ai/core/installation/version\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Config } from \"./config\"\nimport { Npm } from \"@opencode-ai/core/npm\"\n\nconst Handlers = Runtime.handlers(Commands, {\n $: () => import(\"./commands/handlers/default\"),\n api: () => import(\"./commands/handlers/api\"),\n auth: {\n connect: () => import(\"./commands/handlers/auth/connect\"),\n },\n debug: {\n agents: () => import(\"./commands/handlers/debug/agents\"),\n },\n console: {\n login: () => import(\"./commands/handlers/console/login\"),\n },\n mcp: {\n list: () => import(\"./commands/handlers/mcp/list\"),\n add: () => import(\"./commands/handlers/mcp/add\"),\n auth: () => import(\"./commands/handlers/mcp/auth\"),\n logout: () => import(\"./commands/handlers/mcp/logout\"),\n },\n plugin: {\n list: () => import(\"./commands/handlers/plugin/list\"),\n },\n migrate: () => import(\"./commands/handlers/migrate\"),\n mini: () => import(\"./commands/handlers/mini\"),\n run: () => import(\"./commands/handlers/run\"),\n pair: () => import(\"./commands/handlers/pair\"),\n service: {\n start: () => import(\"./commands/handlers/service/start\"),\n restart: () => import(\"./commands/handlers/service/restart\"),\n status: () => import(\"./commands/handlers/service/status\"),\n stop: () => import(\"./commands/handlers/service/stop\"),\n get: () => import(\"./commands/handlers/service/get\"),\n set: () => import(\"./commands/handlers/service/set\"),\n unset: () => import(\"./commands/handlers/service/unset\"),\n },\n serve: () => import(\"./commands/handlers/serve\"),\n})\n\nEffect.logInfo(\"cli starting\", {\n version: InstallationVersion,\n channel: InstallationChannel,\n local: InstallationLocal,\n args: process.argv.slice(2),\n}).pipe(\n Effect.flatMap(() => Runtime.run(Commands, Handlers, { version: InstallationVersion })),\n Effect.annotateLogs({ role: \"cli\" }),\n Effect.provide(Config.layer),\n Effect.provide(Updater.layer),\n Effect.provide(LayerNode.compile(LayerNode.group([Global.node, AppProcess.node, Npm.node]))),\n Effect.provide(Observability.layer),\n Effect.provide(NodeServices.layer),\n Effect.scoped,\n Effect.tap(() => Effect.sync(() => process.exit(process.exitCode ?? 0))),\n NodeRuntime.runMain,\n)\n" | ||
| "#!/usr/bin/env bun\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\nimport { Commands } from \"./commands/commands\"\nimport { Runtime } from \"./framework/runtime\"\nimport { Observability } from \"@opencode-ai/core/observability\"\nimport { Updater } from \"./services/updater\"\nimport { InstallationChannel, InstallationVersion, InstallationLocal } from \"@opencode-ai/core/installation/version\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Config } from \"./config\"\nimport { Npm } from \"@opencode-ai/core/npm\"\n\nconst Handlers = Runtime.handlers(Commands, {\n $: () => import(\"./commands/handlers/default\"),\n api: () => import(\"./commands/handlers/api\"),\n auth: {\n connect: () => import(\"./commands/handlers/auth/connect\"),\n },\n debug: {\n agents: () => import(\"./commands/handlers/debug/agents\"),\n },\n console: {\n login: () => import(\"./commands/handlers/console/login\"),\n },\n mcp: {\n list: () => import(\"./commands/handlers/mcp/list\"),\n add: () => import(\"./commands/handlers/mcp/add\"),\n auth: () => import(\"./commands/handlers/mcp/auth\"),\n logout: () => import(\"./commands/handlers/mcp/logout\"),\n },\n plugin: {\n list: () => import(\"./commands/handlers/plugin/list\"),\n },\n migrate: () => import(\"./commands/handlers/migrate\"),\n mini: () => import(\"./commands/handlers/mini\"),\n run: () => import(\"./commands/handlers/run\"),\n pair: () => import(\"./commands/handlers/pair\"),\n service: {\n start: () => import(\"./commands/handlers/service/start\"),\n restart: () => import(\"./commands/handlers/service/restart\"),\n status: () => import(\"./commands/handlers/service/status\"),\n stop: () => import(\"./commands/handlers/service/stop\"),\n get: () => import(\"./commands/handlers/service/get\"),\n set: () => import(\"./commands/handlers/service/set\"),\n unset: () => import(\"./commands/handlers/service/unset\"),\n },\n serve: () => import(\"./commands/handlers/serve\"),\n})\n\nEffect.logInfo(\"cli starting\", {\n version: InstallationVersion,\n channel: InstallationChannel,\n local: InstallationLocal,\n args: process.argv.slice(2),\n}).pipe(\n Effect.flatMap(() => Runtime.run(Commands, Handlers, { version: InstallationVersion })),\n Effect.annotateLogs({ role: \"cli\" }),\n Effect.provide(Config.layer),\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node, Npm.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(\n Observability.layer({\n endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,\n headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,\n }),\n ),\n Effect.provide(NodeServices.layer),\n Effect.scoped,\n Effect.tap(() => Effect.sync(() => process.exit(process.exitCode ?? 0))),\n NodeRuntime.runMain,\n)\n" | ||
| ], | ||
| "mappings": ";;u3BAeA,SAAM,OAAW,OAAQ,cAAS,OAAU,MAC1C,OAAG,SAAa,yCAChB,SAAK,SAAa,yCAClB,UAAM,MACJ,aAAS,SAAa,wCACxB,OACA,WAAO,MACL,YAAQ,SAAa,wCACvB,OACA,QAAS,CACP,MAAO,IAAa,wCACtB,EACA,IAAK,CACH,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,KAAM,IAAa,yCACnB,OAAQ,IAAa,wCACvB,EACA,OAAQ,CACN,KAAM,IAAa,wCACrB,EACA,QAAS,IAAa,yCACtB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,KAAM,IAAa,yCACnB,QAAS,CACP,MAAO,IAAa,yCACpB,QAAS,IAAa,yCACtB,OAAQ,IAAa,yCACrB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,IAAK,IAAa,yCAClB,MAAO,IAAa,wCACtB,EACA,MAAO,IAAa,wCACtB,CAAC,EAED,EAAO,QAAQ,eAAgB,CAC7B,QAAS,EACT,QAAS,EACT,MAAO,EACP,KAAM,QAAQ,KAAK,MAAM,CAAC,CAC5B,CAAC,EAAE,KACD,EAAO,QAAQ,IAAM,EAAQ,IAAI,EAAU,EAAU,CAAE,QAAS,CAAoB,CAAC,CAAC,EACtF,EAAO,aAAa,CAAE,KAAM,KAAM,CAAC,EACnC,EAAO,QAAQ,EAAO,KAAK,EAC3B,EAAO,QAAQ,EAAQ,KAAK,EAC5B,EAAO,QAAQ,EAAU,QAAQ,EAAU,MAAM,CAAC,EAAO,KAAM,EAAW,KAAM,EAAI,IAAI,CAAC,CAAC,CAAC,EAC3F,EAAO,QAAQ,EAAc,KAAK,EAClC,EAAO,QAAQ,EAAa,KAAK,EACjC,EAAO,OACP,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,QAAQ,KAAK,QAAQ,UAAY,CAAC,CAAC,CAAC,EACvE,EAAY,OACd", | ||
| "debugId": "20BFBC5C84D8235A64756E2164756E21", | ||
| "mappings": ";;y5BAeA,SAAM,OAAW,OAAQ,cAAS,OAAU,MAC1C,OAAG,SAAa,yCAChB,SAAK,SAAa,yCAClB,UAAM,MACJ,aAAS,SAAa,wCACxB,OACA,WAAO,MACL,YAAQ,SAAa,wCACvB,OACA,aAAS,CACP,MAAO,IAAa,wCACtB,EACA,IAAK,CACH,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,KAAM,IAAa,yCACnB,OAAQ,IAAa,wCACvB,EACA,OAAQ,CACN,KAAM,IAAa,wCACrB,EACA,QAAS,IAAa,yCACtB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,KAAM,IAAa,yCACnB,QAAS,CACP,MAAO,IAAa,yCACpB,QAAS,IAAa,yCACtB,OAAQ,IAAa,yCACrB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,IAAK,IAAa,yCAClB,MAAO,IAAa,wCACtB,EACA,MAAO,IAAa,wCACtB,CAAC,EAED,EAAO,QAAQ,eAAgB,CAC7B,QAAS,EACT,QAAS,EACT,MAAO,EACP,KAAM,QAAQ,KAAK,MAAM,CAAC,CAC5B,CAAC,EAAE,KACD,EAAO,QAAQ,IAAM,EAAQ,IAAI,EAAU,EAAU,CAAE,QAAS,CAAoB,CAAC,CAAC,EACtF,EAAO,aAAa,CAAE,KAAM,KAAM,CAAC,EACnC,EAAO,QAAQ,EAAO,KAAK,EAC3B,EAAO,QAAQ,EAAQ,KAAK,EAC5B,EAAO,QACL,EAAU,QAAQ,EAAU,MAAM,CAAC,EAAO,KAAM,EAAW,KAAM,EAAI,IAAI,CAAC,EAAG,CAC3E,CACE,EAAO,KACP,EAAO,UAAU,QAAQ,IAAI,oBAAsB,CAAE,OAAQ,QAAQ,IAAI,mBAAoB,EAAI,CAAC,CAAC,CACrG,CACF,CAAC,CACH,EACA,EAAO,QACL,EAAc,MAAM,CAClB,SAAU,QAAQ,IAAI,4BACtB,QAAS,QAAQ,IAAI,0BACvB,CAAC,CACH,EACA,EAAO,QAAQ,EAAa,KAAK,EACjC,EAAO,OACP,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,QAAQ,KAAK,QAAQ,UAAY,CAAC,CAAC,CAAC,EACvE,EAAY,OACd", | ||
| "debugId": "6D8575549479872464756E2164756E21", | ||
| "names": [] | ||
| } |
+1
-1
| { | ||
| "name": "@opencode-ai/cli-linux-arm64", | ||
| "version": "0.0.0-next-15915", | ||
| "version": "0.0.0-next-15917", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "repository": { |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";o2BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH", | ||
| "debugId": "55A9FFA548651C1C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "4AC02974BD9762AD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/frontend/actions.ts", "../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/semantics.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "import { tmpdir } from \"node:os\"\nimport { extname, join, resolve } from \"node:path\"\nimport type { CliRenderer, Renderable } from \"@opentui/core\"\nimport {\n createMockKeys,\n createMockMouse,\n KeyCodes,\n type KeyInput,\n type MockInput,\n type MockMouse,\n} from \"@opentui/core/testing\"\nimport { Config, Effect, FileSystem, Schema } from \"effect\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationSemantics } from \"./semantics\"\n\nexport type Action = SimulationProtocol.Frontend.Action\nexport type Element = SimulationProtocol.Frontend.Element\n\nexport interface Harness {\n readonly renderer: CliRenderer\n readonly mockInput: MockInput\n readonly mockMouse: MockMouse\n readonly resize: (cols: number, rows: number) => void\n readonly renderOnce: () => Promise<void>\n readonly screen: () => string\n}\n\ntype RenderBuffer = {\n readonly width: number\n readonly height: number\n getRealCharBytes(includeAnsi?: boolean): Uint8Array\n}\n\nconst decoder = new TextDecoder()\n\nfunction isKeyCode(key: string): key is keyof typeof KeyCodes {\n return Object.hasOwn(KeyCodes, key)\n}\n\nfunction keyInput(key: string): KeyInput {\n const named = key.toUpperCase()\n return isKeyCode(named) ? named : key\n}\n\nfunction children(renderable: Renderable) {\n return renderable.getChildren().filter((child): child is Renderable => \"num\" in child)\n}\n\nfunction all(renderable: Renderable): Renderable[] {\n return [renderable, ...children(renderable).flatMap(all)]\n}\n\nfunction mouseListeners(renderable: Renderable) {\n const general = Reflect.get(renderable, \"_mouseListener\")\n const specific = Reflect.get(renderable, \"_mouseListeners\")\n return Boolean(general) || (specific && typeof specific === \"object\" && Object.keys(specific).length > 0)\n}\n\nfunction hit(renderer: CliRenderer, renderable: Renderable) {\n if (renderable.width <= 0 || renderable.height <= 0) return false\n const x = Math.floor(renderable.screenX + renderable.width / 2)\n const y = Math.floor(renderable.screenY + renderable.height / 2)\n const target = renderer.hitTest(x, y)\n return all(renderable).some((item) => item.num === target)\n}\n\n/**\n * Builds the harness the simulation server drives.\n *\n * When the renderer is the headless simulation renderer, its TestRendererSetup\n * provides the supported testing APIs. For the visible terminal renderer the\n * harness falls back to `requestRender` + `idle` and reading the private\n * `currentRenderBuffer`.\n */\nexport function createHarness(renderer: CliRenderer): Harness {\n const setup = SimulationRenderer.setupFor(renderer)\n return {\n renderer,\n mockInput: setup?.mockInput ?? createMockKeys(renderer),\n mockMouse: setup?.mockMouse ?? createMockMouse(renderer),\n resize: setup?.resize ?? ((cols, rows) => renderer.resize(cols, rows)),\n renderOnce:\n setup?.renderOnce ??\n (async () => {\n renderer.requestRender()\n await renderer.idle()\n }),\n // captureCharFrame follows the test renderer's output sink. Recording\n // redirects that sink to the timeline, so read the live render buffer\n // instead; it is also the source used by screenshots.\n screen: () => decoder.decode((Reflect.get(renderer, \"currentRenderBuffer\") as RenderBuffer).getRealCharBytes()),\n }\n}\n\nexport function elements(renderer: CliRenderer): Element[] {\n return all(renderer.root)\n .filter((renderable) => renderable.visible && !renderable.isDestroyed)\n .map((renderable) => {\n const clickable = mouseListeners(renderable) && hit(renderer, renderable)\n return {\n id: renderable.id,\n num: renderable.num,\n x: renderable.screenX,\n y: renderable.screenY,\n width: renderable.width,\n height: renderable.height,\n focusable: renderable.focusable,\n focused: renderable.focused,\n clickable,\n editor: renderer.currentFocusedEditor === renderable,\n } satisfies Element\n })\n .filter((element) => element.focusable || element.clickable || element.editor)\n}\n\nexport function state(harness: Harness) {\n return {\n focused: {\n renderable: harness.renderer.currentFocusedRenderable?.num,\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function snapshot(harness: Harness): SimulationProtocol.Frontend.SemanticSnapshot {\n const ids = new Set<string>()\n const visit = (renderable: Renderable, parent?: string): SimulationProtocol.Frontend.SemanticNode[] => {\n if (!renderable.visible || renderable.isDestroyed) return []\n const definition = SimulationSemantics.read(renderable)?.()\n if (definition && ids.has(renderable.id)) throw new Error(`duplicate semantic UI id: ${renderable.id}`)\n if (definition) ids.add(renderable.id)\n const node = definition\n ? [{ id: renderable.id, ...definition, ...(parent === undefined ? {} : { parent }), element: renderable.num }]\n : []\n const ancestor = definition ? renderable.id : parent\n return [...node, ...children(renderable).flatMap((child) => visit(child, ancestor))]\n }\n return Schema.decodeUnknownSync(SimulationProtocol.Frontend.SemanticSnapshot)({\n format: \"opencode-ui-snapshot-v1\",\n nodes: visit(harness.renderer.root),\n })\n}\n\nexport function matches(harness: Pick<Harness, \"screen\">, text: string) {\n return harness.screen().includes(text)\n}\n\nexport const capture = Effect.fn(\"SimulationActions.capture\")(function* (harness: Harness) {\n yield* Effect.tryPromise(() => harness.renderOnce())\n const buffer = harness.renderer.currentRenderBuffer\n return {\n cols: buffer.width,\n rows: buffer.height,\n cursor: [0, 0] as const,\n lines: buffer.getSpanLines().map((line) => ({\n spans: line.spans.map((span) => ({\n text: span.text,\n fg: span.fg.toInts(),\n bg: span.bg.toInts(),\n attributes: span.attributes,\n width: span.width,\n })),\n })),\n } satisfies SimulationProtocol.Frontend.CapturedFrame\n})\n\nexport const screenshot = Effect.fn(\"SimulationActions.screenshot\")(function* (harness: Harness, name?: string) {\n const filename = name ?? `screenshot-${crypto.randomUUID()}`\n if (!filename || filename.includes(\"/\") || filename.includes(\"\\\\\") || extname(filename))\n return yield* Effect.fail(new Error(\"screenshot name must not contain a path or extension\"))\n yield* Effect.tryPromise(() => harness.renderOnce())\n const { SimulationPng } = yield* Effect.promise(() => import(\"./png\"))\n const image = SimulationPng.screenshot(harness.renderer)\n const directory = resolve(\n yield* Config.string(\"OPENCODE_DRIVE_MEDIA_DIR\").pipe(\n Config.withDefault(join(tmpdir(), \"opencode-drive\", \"output\")),\n ),\n )\n const fs = yield* FileSystem.FileSystem\n yield* fs.makeDirectory(directory, { recursive: true })\n const path = join(directory, `${filename}.png`)\n yield* fs.writeFile(path, image.data)\n return path\n})\n\nexport const execute = Effect.fn(\"SimulationActions.execute\")(function* (harness: Harness, action: Action) {\n switch (action.type) {\n case \"ui.type\":\n yield* Effect.tryPromise(() => harness.mockInput.typeText(action.text))\n break\n case \"ui.press\":\n harness.mockInput.pressKey(keyInput(action.key), action.modifiers)\n break\n case \"ui.enter\":\n harness.mockInput.pressEnter()\n break\n case \"ui.arrow\":\n harness.mockInput.pressArrow(action.direction)\n break\n case \"ui.focus\":\n all(harness.renderer.root)\n .find((item) => item.num === action.target)\n ?.focus()\n break\n case \"ui.click\": {\n const target = all(harness.renderer.root).find((item) => item.num === action.target)\n if (!target || !target.visible || target.isDestroyed)\n return yield* Effect.fail(new Error(`click target is stale or unavailable: ${action.target}`))\n if (action.semantic) {\n const current = snapshot(harness).nodes.find((node) => node.element === action.target)\n if (\n current?.id !== action.semantic.id ||\n current.instance !== action.semantic.instance ||\n current.element !== action.semantic.element\n )\n return yield* Effect.fail(new Error(`semantic click target is stale or unavailable: ${action.semantic.id}`))\n }\n if (\n !Number.isFinite(action.x) ||\n action.x < 0 ||\n action.x >= target.width ||\n !Number.isFinite(action.y) ||\n action.y < 0 ||\n action.y >= target.height\n )\n return yield* Effect.fail(new Error(\"click position must be within the target element\"))\n yield* Effect.tryPromise(() => harness.mockMouse.click(target.screenX + action.x, target.screenY + action.y))\n break\n }\n case \"ui.resize\":\n if (\n !Number.isSafeInteger(action.cols) ||\n action.cols <= 0 ||\n !Number.isSafeInteger(action.rows) ||\n action.rows <= 0\n ) {\n return yield* Effect.fail(new Error(\"resize cols and rows must be positive integers\"))\n }\n harness.resize(action.cols, action.rows)\n SimulationRenderer.recordResize(harness.renderer, action.cols, action.rows)\n break\n }\n yield* Effect.tryPromise(() => harness.renderOnce())\n return state(harness)\n})\n\nexport * as SimulationActions from \"./actions\"\n", | ||
| "import { createWriteStream, type WriteStream } from \"node:fs\"\nimport { mkdir } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { Writable } from \"node:stream\"\nimport { finished } from \"node:stream/promises\"\nimport { Schema } from \"effect\"\n\nexport const Header = Schema.Struct({\n type: Schema.Literal(\"header\"),\n version: Schema.Literal(1),\n cols: Schema.Number,\n rows: Schema.Number,\n encoding: Schema.Literal(\"base64\"),\n})\nexport interface Header extends Schema.Schema.Type<typeof Header> {}\n\nexport const Output = Schema.Struct({\n type: Schema.Literal(\"output\"),\n at_ms: Schema.Number,\n data: Schema.String,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n\nexport const Resize = Schema.Struct({\n type: Schema.Literal(\"resize\"),\n at_ms: Schema.Number,\n cols: Schema.Number,\n rows: Schema.Number,\n})\nexport interface Resize extends Schema.Schema.Type<typeof Resize> {}\n\nexport const Event = Schema.Union([Header, Output, Resize])\nexport type Event = Schema.Schema.Type<typeof Event>\n\nexport class Timeline extends Writable {\n readonly isTTY = true\n readonly path: string\n readonly columns: number\n readonly rows: number\n private readonly output: WriteStream\n private readonly started = performance.now()\n private readonly timestamps: number[] = []\n private done?: Promise<string>\n\n private constructor(path: string, cols: number, rows: number, output: WriteStream) {\n super()\n this.path = path\n this.columns = cols\n this.rows = rows\n this.output = output\n // finish() reports stream failures; keep Writable from also throwing them process-wide.\n this.on(\"error\", () => {})\n output.on(\"error\", (error) => this.destroy(error))\n }\n\n static async create(path: string, cols: number, rows: number) {\n await mkdir(dirname(path), { recursive: true })\n const output = createWriteStream(path)\n const timeline = new Timeline(path, cols, rows, output)\n await new Promise<void>((resolve, reject) => {\n output.write(\n `${JSON.stringify({ type: \"header\", version: 1, cols, rows, encoding: \"base64\" } satisfies Header)}\\n`,\n (error) => (error ? reject(error) : resolve()),\n )\n })\n return timeline\n }\n\n getColorDepth() {\n return 24\n }\n\n override write(chunk: unknown, callback?: (error?: Error | null) => void): boolean\n override write(chunk: unknown, encoding: BufferEncoding, callback?: (error?: Error | null) => void): boolean\n override write(\n chunk: unknown,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ) {\n if (!this.writableEnded) {\n this.timestamps.push(this.elapsed())\n if (typeof encoding === \"function\") return super.write(chunk, encoding)\n if (encoding === undefined) return super.write(chunk, callback)\n return super.write(chunk, encoding, callback)\n }\n const done = typeof encoding === \"function\" ? encoding : callback\n queueMicrotask(() => done?.(null))\n return true\n }\n\n override _write(chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void) {\n this.writeOutput(chunk, this.timestamps.shift() ?? this.elapsed(), callback)\n }\n\n override _final(callback: (error?: Error | null) => void) {\n this.writeOutput(Buffer.alloc(0), this.elapsed(), (error) => {\n if (error) return callback(error)\n this.output.end(callback)\n })\n }\n\n finish() {\n if (this.done) return this.done\n this.end()\n this.done = finished(this).then(() => this.path)\n return this.done\n }\n\n resize(cols: number, rows: number) {\n if (this.writableEnded) return\n const event = { type: \"resize\", at_ms: this.elapsed(), cols, rows } satisfies Resize\n this.output.write(`${JSON.stringify(event)}\\n`)\n }\n\n private elapsed() {\n return Math.max(0, Math.round(performance.now() - this.started))\n }\n\n private writeOutput(data: Buffer, at_ms: number, callback: (error?: Error | null) => void) {\n const event = {\n type: \"output\",\n at_ms,\n data: data.toString(\"base64\"),\n } satisfies Output\n this.output.write(`${JSON.stringify(event)}\\n`, callback)\n }\n}\n\nexport * as SimulationRecording from \"./recording\"\n", | ||
| "import type { CliRenderer, CliRendererConfig } from \"@opentui/core\"\nimport { createTestRenderer, type TestRendererSetup } from \"@opentui/core/testing\"\nimport { Effect } from \"effect\"\nimport { Timeline } from \"../recording\"\n\nconst setups = new WeakMap<CliRenderer, TestRendererSetup>()\nconst recordings = new WeakMap<CliRenderer, Timeline>()\n\n/**\n * Creates a headless renderer with optional recording: a real CliRenderer\n * backed by an in-memory screen buffer. The TestRendererSetup is kept\n * module-side so the harness can use supported testing APIs without app\n * code carrying it around.\n */\nexport interface Viewport {\n readonly cols: number\n readonly rows: number\n}\n\nexport const create = Effect.fn(\"SimulationRenderer.create\")(function* (\n options: CliRendererConfig,\n path?: string,\n viewport?: Viewport,\n) {\n const cols = viewport?.cols ?? 100\n const rows = viewport?.rows ?? 40\n const recording = path\n ? yield* Effect.acquireRelease(\n Effect.tryPromise(() => Timeline.create(path, cols, rows)),\n (recording) =>\n Effect.tryPromise(() => recording.finish()).pipe(\n Effect.catch((error) =>\n Effect.sync(() => process.stderr.write(`Failed to finish UI recording: ${error}\\n`)),\n ),\n ),\n )\n : undefined\n const setup = yield* Effect.acquireRelease(\n Effect.tryPromise(() =>\n createTestRenderer({\n ...options,\n width: cols,\n height: rows,\n ...(recording\n ? {\n stdout: recording as unknown as NodeJS.WriteStream,\n bufferedOutput: \"stdout\" as const,\n }\n : {}),\n }),\n ),\n (setup) =>\n Effect.sync(() => {\n if (!setup.renderer.isDestroyed) setup.renderer.destroy()\n }),\n )\n setups.set(setup.renderer, setup)\n if (recording) recordings.set(setup.renderer, recording)\n return setup.renderer\n})\n\nexport function recordResize(renderer: CliRenderer, cols: number, rows: number) {\n recordings.get(renderer)?.resize(cols, rows)\n}\n\nexport function setupFor(renderer: CliRenderer): TestRendererSetup | undefined {\n return setups.get(renderer)\n}\n\nexport function finish(renderer: CliRenderer) {\n const recording = recordings.get(renderer)\n if (!recording) return Effect.fail(new Error(\"UI recording is not available\"))\n return Effect.tryPromise(() => recording.finish())\n}\n\nexport * as SimulationRenderer from \"./renderer\"\n", | ||
| "import type { Renderable } from \"@opentui/core\"\nimport type { SimulationProtocol } from \"../protocol\"\n\n// Semantic renderables set an explicit stable OpenTUI id so ui.state and\n// ui.snapshot expose the same identity. Hierarchy and element handles come\n// from the live render tree.\nexport type Definition = Omit<SimulationProtocol.Frontend.SemanticNode, \"id\" | \"element\" | \"parent\">\n\nconst key = Symbol.for(\"opencode.simulation.semantics\")\n\nconst bind = (definition: () => Definition) => (renderable: Renderable) => {\n Object.defineProperty(renderable, key, { value: definition, configurable: true })\n}\n\nexport const read = (renderable: Renderable) => {\n const definition: unknown = Reflect.get(renderable, key)\n return typeof definition === \"function\" ? (definition as () => Definition) : undefined\n}\n\nexport const SimulationSemantics = { bind, read }\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationActions, type Harness } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\n\nfunction handle(harness: Harness, request: SimulationProtocol.Frontend.Request) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.screenshot\":\n return SimulationActions.screenshot(harness, request.params?.name)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.snapshot\":\n return Effect.sync(() => SimulationActions.snapshot(harness))\n case \"ui.matches\":\n return Effect.sync(() => SimulationActions.matches(harness, request.params.text))\n case \"ui.recording.finish\":\n return SimulationRenderer.finish(harness.renderer)\n case \"ui.type\":\n return SimulationActions.execute(harness, { type: \"ui.type\", text: request.params.text })\n case \"ui.enter\":\n return SimulationActions.execute(harness, { type: \"ui.enter\" })\n case \"ui.press\":\n return SimulationActions.execute(harness, {\n type: \"ui.press\",\n key: request.params.key,\n modifiers: request.params.modifiers,\n })\n case \"ui.arrow\":\n return SimulationActions.execute(harness, { type: \"ui.arrow\", direction: request.params.direction })\n case \"ui.focus\":\n return SimulationActions.execute(harness, { type: \"ui.focus\", target: request.params.target })\n case \"ui.click\":\n return SimulationActions.execute(harness, {\n type: \"ui.click\",\n target: request.params.target,\n x: request.params.x,\n y: request.params.y,\n semantic: request.params.semantic,\n })\n case \"ui.resize\":\n return SimulationActions.execute(harness, {\n type: \"ui.resize\",\n cols: request.params.cols,\n rows: request.params.rows,\n })\n }\n}\n\nexport const start = Effect.fn(\"SimulationServer.start\")(function* (harness: Harness, endpoint: string) {\n return yield* SimulationControlServer.start({\n endpoint,\n label: \"opencode drive ui websocket\",\n data: () => ({ drive: true as const }),\n decode: SimulationProtocol.Frontend.decodeRequestEffect,\n handle: (_socket, request) => handle(harness, request),\n })\n})\n\nexport * as SimulationServer from \"./server\"\n", | ||
| "import { createCliRenderer, type CliRendererConfig } from \"@opentui/core\"\nimport { Config, Effect } from \"effect\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationActions } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationServer } from \"./server\"\n\n/** Drive-mode renderer and control-server acquisition. */\nexport const create = Effect.fn(\"Drive.create\")(function* (options: CliRendererConfig) {\n const headless = (yield* Config.string(\"OPENCODE_DRIVE_RENDERER\").pipe(Config.withDefault(\"visible\"))) === \"headless\"\n const manifest = yield* DriveManifest.resolve()\n const renderer = headless\n ? yield* SimulationRenderer.create(options, manifest.recording?.timeline, manifest.viewport)\n : yield* Effect.acquireRelease(\n Effect.tryPromise(() => createCliRenderer(options)),\n (renderer) =>\n Effect.sync(() => {\n if (!renderer.isDestroyed) renderer.destroy()\n }),\n )\n if (!headless && manifest.viewport) renderer.resize(manifest.viewport.cols, manifest.viewport.rows)\n const server = yield* SimulationServer.start(SimulationActions.createHarness(renderer), manifest.endpoints.ui)\n yield* Effect.sync(() => process.stderr.write(`opencode drive ui websocket: ${server.url}\\n`))\n return renderer\n})\n\nexport * as Drive from \"./simulation\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "082C19EA0CB93F2964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "27B420EE804B2F9B64756E2164756E21", | ||
| "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": "B86B8876910DCFCE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/status.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "9A2BF00F84A4EDBE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/migrate.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n" | ||
| ], | ||
| "mappings": ";ivBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "16CFE6704F84F1D764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../client/src/effect/service.ts"], | ||
| "sourcesContent": [ | ||
| "import { ServiceStatus } from \"@opencode-ai/protocol/groups/health\"\nimport { Effect, FileSystem, Option, Schedule, Schema } from \"effect\"\nimport { spawn, type ChildProcess } from \"node:child_process\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport type { DiscoverOptions, Endpoint, EnsureOptions, StopOptions } from \"../service.js\"\n\nexport * from \"../service.js\"\n/** Contents of the local service registration file. */\nexport type Info = import(\"../service.js\").Info\n\n// Find, start, and stop the local opencode background service.\n//\n// The service daemon advertises itself through a registration file in the\n// user's state directory: url, pid, version, and the private password, with\n// 0600 permissions. That file is the complete discovery contract — reading it\n// is all a client needs to connect. The daemon's own configuration (port,\n// persisted password) is CLI-owned and never read here.\n\ntype Contender = {\n readonly child: ChildProcess\n readonly error: () => Error | undefined\n}\n\n// Read-only lookup: registration file plus health check and version gate.\n// Never spawns; escalation to ensure() is the caller's policy.\n/** Discover a healthy, compatible local service without starting one. */\nexport const discover = Effect.fn(\"service.discover\")(function* (options: DiscoverOptions = {}) {\n return (yield* discoverLocal(options))?.endpoint\n})\n\n/** Recognize an authenticated compatible service bound to an expected URL, including while it starts or fails. */\nexport const incumbent = Effect.fn(\"service.incumbent\")(function* (\n options: DiscoverOptions & { readonly url: string },\n) {\n const info = yield* read(options.file)\n const found = info === undefined ? undefined : yield* probe({ ...info, url: options.url })\n if (found === undefined || found.legacy) return undefined\n if (options.version !== undefined && found.version !== options.version) return undefined\n return { endpoint: found.endpoint, state: found.state }\n})\n\nconst discoverLocal = Effect.fnUntraced(function* (options: DiscoverOptions) {\n const found = (yield* registered(options.file)).service\n if (found?.state !== \"ready\") return undefined\n if (options.version !== undefined && found.version !== options.version) return undefined\n return found\n})\n\n// Idempotent ensure-running: reuses a healthy compatible server, replaces a\n// version-mismatched one, and otherwise spawns small contenders until a server\n// becomes discoverable. A contender is never killed merely for slow startup.\n/** Ensure a healthy, compatible local service is running. */\nexport const ensure = Effect.fn(\"service.ensure\")(function* (options: EnsureOptions = {}) {\n const contenders = new Set<Contender>()\n let announced = false\n let lastSpawn = 0\n let spawnDelay = 5_000\n let ownerHeld = false\n const announce = (reason: \"missing\" | \"version-mismatch\", previousVersion?: string) =>\n Effect.sync(() => {\n if (announced) return\n announced = true\n options.onStart?.(reason, previousVersion)\n })\n const spawnContender = Effect.gen(function* () {\n const [command, ...args] = options.command ?? [\"opencode\", \"serve\", \"--service\"]\n if (command === undefined) return yield* Effect.fail(new Error(\"Missing service command\"))\n return yield* Effect.try({\n try: () => {\n const child = spawn(command, args, { detached: true, stdio: \"ignore\" })\n let error: Error | undefined\n child.once(\"error\", (cause) => {\n error = new Error(\"Failed to start server\", { cause })\n })\n child.unref()\n return { child, error: () => error }\n },\n catch: (cause) => new Error(\"Failed to start server\", { cause }),\n })\n })\n const found = yield* Effect.gen(function* () {\n const registration = yield* registered(options.file, true)\n const info = registration.info\n const service = registration.service\n if (service !== undefined) {\n ownerHeld = false\n spawnDelay = 5_000\n const compatible = !service.legacy && (options.version === undefined || service.version === options.version)\n if (compatible && service.state === \"ready\") return Option.some(service)\n if (compatible && service.state === \"failed\")\n return yield* Effect.fail(new Error(\"Background service failed to start\"))\n if (compatible) return Option.none<LocalService>()\n yield* announce(\"version-mismatch\", service.version)\n yield* kill(service, options).pipe(Effect.ignore)\n lastSpawn = 0\n return Option.none<LocalService>()\n } else if (lastSpawn === 0 && info !== undefined) lastSpawn = Date.now()\n\n const failure = [...contenders].map(contenderFailure).find((error): error is Error => error !== undefined)\n if (failure !== undefined) return yield* Effect.fail(failure)\n const finished = [...contenders].filter(contenderFinished)\n if (finished.some((item) => item.child.exitCode === 0)) {\n ownerHeld = true\n spawnDelay = Math.min(spawnDelay * 2, 30_000)\n }\n finished.forEach((item) => contenders.delete(item))\n // Keep one candidate plus one lock probe so a pre-lock stall cannot block recovery.\n if (contenders.size < 2 && Date.now() - lastSpawn >= spawnDelay) {\n yield* announce(\"missing\")\n contenders.add(yield* spawnContender)\n lastSpawn = Date.now()\n }\n return Option.none<LocalService>()\n }).pipe(\n Effect.repeat({\n until: Option.isSome,\n schedule: Schedule.max([Schedule.spaced(\"1 second\"), Schedule.recurs(120)]),\n }),\n )\n if (Option.isNone(found))\n return yield* Effect.fail(new Error(\"Timed out waiting for the background service to start\"))\n return found.value.endpoint\n})\n\nfunction contenderFailure(contender: Contender) {\n const error = contender.error()\n if (error !== undefined) return error\n if (contender.child.exitCode !== null && contender.child.exitCode !== 0)\n return new Error(`Server process exited with code ${contender.child.exitCode}`)\n if (contender.child.signalCode !== null)\n return new Error(`Server process terminated by ${contender.child.signalCode}`)\n return undefined\n}\n\nfunction contenderFinished(contender: Contender) {\n return contender.error() !== undefined || contender.child.exitCode !== null || contender.child.signalCode !== null\n}\n\n/** Stop the registered local service. */\nexport const stop = Effect.fn(\"service.stop\")(function* (options: StopOptions = {}) {\n const existing = yield* find(options)\n if (existing !== undefined) yield* kill(existing, options)\n})\n\nfunction fallback() {\n const state = process.env[\"XDG_STATE_HOME\"] ?? join(homedir(), \".local\", \"state\")\n return join(state, \"opencode\", \"service.json\")\n}\n\n/** Create HTTP authentication headers for a service endpoint. */\nexport function headers(endpoint: Endpoint) {\n if (endpoint.auth === undefined) return undefined\n return { authorization: \"Basic \" + btoa(endpoint.auth.username + \":\" + endpoint.auth.password) }\n}\n\n/** Schema for the local service registration file. */\nexport const Info = Schema.Struct({\n id: Schema.optional(Schema.String),\n version: Schema.optional(Schema.String),\n url: Schema.String,\n pid: Schema.Int.check(Schema.isGreaterThan(0)),\n password: Schema.optional(Schema.String),\n})\n\nconst decode = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeHealth = Schema.decodeUnknownOption(ServiceStatus.Health)\nconst decodeLegacyHealth = Schema.decodeUnknownOption(Schema.Struct({ healthy: Schema.Literal(true) }))\n\n// A missing or corrupt file means no valid info; callers treat both\n// the same (the registering server self-evicts, clients rediscover).\nconst read = Effect.fnUntraced(function* (file?: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(file ?? fallback()).pipe(Effect.option)\n if (Option.isNone(text)) return undefined\n return yield* decode(text.value).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n})\n\ntype LocalService = {\n readonly info: Info\n readonly endpoint: Endpoint\n readonly version?: string\n readonly state: \"ready\" | \"waiting\" | \"failed\"\n readonly legacy: boolean\n}\n\nconst probe = Effect.fnUntraced(function* (info: Info, allowLegacy = false) {\n const endpoint = {\n url: info.url,\n auth:\n info.password === undefined\n ? undefined\n : { type: \"basic\" as const, username: \"opencode\", password: info.password },\n } satisfies Endpoint\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(\"/api/health\", info.url), {\n headers: headers(endpoint),\n signal: AbortSignal.timeout(2_000),\n }),\n ).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n if (response === undefined) return undefined\n const body = yield* Effect.tryPromise(() => response.json()).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n const health = decodeHealth(body)\n if (Option.isSome(health)) {\n if (health.value.pid !== info.pid) return undefined\n if (info.version !== undefined && health.value.version !== info.version) return undefined\n return {\n info,\n endpoint,\n version: health.value.version,\n state: response.ok ? \"ready\" : response.status === 500 ? \"failed\" : \"waiting\",\n legacy: false,\n } satisfies LocalService\n }\n if (\n !allowLegacy ||\n Option.isNone(decodeLegacyHealth(body)) ||\n (typeof body === \"object\" && body !== null && (\"version\" in body || \"pid\" in body))\n )\n return undefined\n return { info, endpoint, state: \"ready\", legacy: true } satisfies LocalService\n})\n\nconst registered = Effect.fnUntraced(function* (file?: string, allowLegacy = false) {\n const info = yield* read(file)\n if (info === undefined) return { info: undefined, service: undefined }\n return { info, service: yield* probe(info, allowLegacy) }\n})\n\n// Health-checked lookup without the version gate: lifecycle operations must be\n// able to see (and replace or stop) a server from a different version.\nconst find = Effect.fnUntraced(function* (options: { readonly file?: string }) {\n return (yield* registered(options.file, true)).service\n})\n\n// 50ms cadence bounded at ~5s, shared by stop escalation and each ensure\n// discovery window.\nconst poll = Schedule.max([Schedule.spaced(\"50 millis\"), Schedule.recurs(100)])\n\nconst signal = (pid: number, name: NodeJS.Signals) =>\n Effect.try({ try: () => process.kill(pid, name), catch: (cause) => cause }).pipe(Effect.ignore)\n\nconst stopped = Effect.fnUntraced(function* (pid: number) {\n const running = yield* Effect.try({ try: () => process.kill(pid, 0), catch: () => false }).pipe(\n Effect.orElseSucceed(() => false),\n )\n if (!running) return true\n return yield* Effect.fail(new Error(`Server process ${pid} is still running`))\n})\n\nfunction same(left: Info, right: Info) {\n return left.id === right.id && left.version === right.version && left.url === right.url && left.pid === right.pid\n}\n\nconst kill = Effect.fnUntraced(function* (service: LocalService, options: { readonly file?: string }) {\n const requested = yield* requestStop(service)\n if (requested === \"rejected\") return\n if (requested === \"unsupported\") {\n // A stale registration may point at a reused PID. Authenticate again\n // immediately before the legacy signal fallback.\n const current = yield* find(options)\n if (current === undefined || !same(current.info, service.info)) return\n yield* signal(service.info.pid, \"SIGTERM\")\n }\n const done = yield* stopped(service.info.pid).pipe(Effect.retry(poll), Effect.option)\n if (Option.isSome(done)) return\n\n const latest = yield* find(options)\n if (latest === undefined || !same(latest.info, service.info)) return\n yield* signal(service.info.pid, \"SIGKILL\")\n yield* stopped(service.info.pid).pipe(Effect.retry(poll))\n})\n\nconst decodeStopResponse = Schema.decodeUnknownOption(ServiceStatus.StopResponse)\n\nconst requestStop = Effect.fnUntraced(function* (service: LocalService) {\n if (service.info.id === undefined || service.legacy) return \"unsupported\" as const\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(\"/api/service/stop\", service.info.url), {\n method: \"POST\",\n headers: { ...headers(service.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({ instanceID: service.info.id }),\n signal: AbortSignal.timeout(2_000),\n }),\n ).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n if (response === undefined || response.status === 404 || response.status === 405) return \"unsupported\" as const\n const body = yield* Effect.tryPromise(() => response.json()).pipe(Effect.option, Effect.map(Option.getOrUndefined))\n const decoded = decodeStopResponse(body)\n if (!response.ok || Option.isNone(decoded) || !decoded.value.accepted) return \"rejected\" as const\n return \"accepted\" as const\n})\n\n/** Effect-based local service lifecycle operations. */\nexport const Service = { discover, incumbent, ensure, stop, headers, Info }\n" | ||
| ], | ||
| "mappings": ";mIAEA,qBAAS,sBACT,kBAAS,WACT,eAAS,aAuBF,IAAM,EAAW,EAAO,GAAG,kBAAkB,EAAE,SAAU,CAAC,EAA2B,CAAC,EAAG,CAC9F,OAAQ,MAAO,EAAc,CAAO,IAAI,SACzC,EAGY,EAAY,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAChE,EACA,CACA,IAAM,EAAO,MAAO,EAAK,EAAQ,IAAI,EAC/B,EAAQ,IAAS,OAAY,OAAY,MAAO,EAAM,IAAK,EAAM,IAAK,EAAQ,GAAI,CAAC,EACzF,GAAI,IAAU,QAAa,EAAM,OAAQ,OACzC,GAAI,EAAQ,UAAY,QAAa,EAAM,UAAY,EAAQ,QAAS,OACxE,MAAO,CAAE,SAAU,EAAM,SAAU,MAAO,EAAM,KAAM,EACvD,EAEK,EAAgB,EAAO,WAAW,SAAU,CAAC,EAA0B,CAC3E,IAAM,GAAS,MAAO,EAAW,EAAQ,IAAI,GAAG,QAChD,GAAI,GAAO,QAAU,QAAS,OAC9B,GAAI,EAAQ,UAAY,QAAa,EAAM,UAAY,EAAQ,QAAS,OACxE,OAAO,EACR,EAMY,EAAS,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAyB,CAAC,EAAG,CACxF,IAAM,EAAa,IAAI,IACnB,EAAY,GACZ,EAAY,EACZ,EAAa,KACb,EAAY,GACV,EAAW,CAAC,EAAwC,IACxD,EAAO,KAAK,IAAM,CAChB,GAAI,EAAW,OACf,EAAY,GACZ,EAAQ,UAAU,EAAQ,CAAe,EAC1C,EACG,EAAiB,EAAO,IAAI,SAAU,EAAG,CAC7C,IAAO,KAAY,GAAQ,EAAQ,SAAW,CAAC,WAAY,QAAS,WAAW,EAC/E,GAAI,IAAY,OAAW,OAAO,MAAO,EAAO,KAAS,MAAM,yBAAyB,CAAC,EACzF,OAAO,MAAO,EAAO,IAAI,CACvB,IAAK,IAAM,CACT,IAAM,EAAQ,EAAM,EAAS,EAAM,CAAE,SAAU,GAAM,MAAO,QAAS,CAAC,EAClE,EAKJ,OAJA,EAAM,KAAK,QAAS,CAAC,IAAU,CAC7B,EAAY,MAAM,yBAA0B,CAAE,OAAM,CAAC,EACtD,EACD,EAAM,MAAM,EACL,CAAE,QAAO,MAAO,IAAM,CAAM,GAErC,MAAO,CAAC,IAAc,MAAM,yBAA0B,CAAE,OAAM,CAAC,CACjE,CAAC,EACF,EACK,EAAQ,MAAO,EAAO,IAAI,SAAU,EAAG,CAC3C,IAAM,EAAe,MAAO,EAAW,EAAQ,KAAM,EAAI,EACnD,EAAO,EAAa,KACpB,EAAU,EAAa,QAC7B,GAAI,IAAY,OAAW,CACzB,EAAY,GACZ,EAAa,KACb,IAAM,EAAa,CAAC,EAAQ,SAAW,EAAQ,UAAY,QAAa,EAAQ,UAAY,EAAQ,SACpG,GAAI,GAAc,EAAQ,QAAU,QAAS,OAAO,EAAO,KAAK,CAAO,EACvE,GAAI,GAAc,EAAQ,QAAU,SAClC,OAAO,MAAO,EAAO,KAAS,MAAM,oCAAoC,CAAC,EAC3E,GAAI,EAAY,OAAO,EAAO,KAAmB,EAIjD,OAHA,MAAO,EAAS,mBAAoB,EAAQ,OAAO,EACnD,MAAO,EAAK,EAAS,CAAO,EAAE,KAAK,EAAO,MAAM,EAChD,EAAY,EACL,EAAO,KAAmB,EAC5B,QAAI,IAAc,GAAK,IAAS,OAAW,EAAY,KAAK,IAAI,EAEvE,IAAM,EAAU,CAAC,GAAG,CAAU,EAAE,IAAI,CAAgB,EAAE,KAAK,CAAC,IAA0B,IAAU,MAAS,EACzG,GAAI,IAAY,OAAW,OAAO,MAAO,EAAO,KAAK,CAAO,EAC5D,IAAM,EAAW,CAAC,GAAG,CAAU,EAAE,OAAO,CAAiB,EACzD,GAAI,EAAS,KAAK,CAAC,IAAS,EAAK,MAAM,WAAa,CAAC,EACnD,EAAY,GACZ,EAAa,KAAK,IAAI,EAAa,EAAG,KAAM,EAI9C,GAFA,EAAS,QAAQ,CAAC,IAAS,EAAW,OAAO,CAAI,CAAC,EAE9C,EAAW,KAAO,GAAK,KAAK,IAAI,EAAI,GAAa,EACnD,MAAO,EAAS,SAAS,EACzB,EAAW,IAAI,MAAO,CAAc,EACpC,EAAY,KAAK,IAAI,EAEvB,OAAO,EAAO,KAAmB,EAClC,EAAE,KACD,EAAO,OAAO,CACZ,MAAO,EAAO,OACd,SAAU,EAAS,IAAI,CAAC,EAAS,OAAO,UAAU,EAAG,EAAS,OAAO,GAAG,CAAC,CAAC,CAC5E,CAAC,CACH,EACA,GAAI,EAAO,OAAO,CAAK,EACrB,OAAO,MAAO,EAAO,KAAS,MAAM,uDAAuD,CAAC,EAC9F,OAAO,EAAM,MAAM,SACpB,EAED,SAAS,CAAgB,CAAC,EAAsB,CAC9C,IAAM,EAAQ,EAAU,MAAM,EAC9B,GAAI,IAAU,OAAW,OAAO,EAChC,GAAI,EAAU,MAAM,WAAa,MAAQ,EAAU,MAAM,WAAa,EACpE,OAAW,MAAM,mCAAmC,EAAU,MAAM,UAAU,EAChF,GAAI,EAAU,MAAM,aAAe,KACjC,OAAW,MAAM,gCAAgC,EAAU,MAAM,YAAY,EAC/E,OAGF,SAAS,CAAiB,CAAC,EAAsB,CAC/C,OAAO,EAAU,MAAM,IAAM,QAAa,EAAU,MAAM,WAAa,MAAQ,EAAU,MAAM,aAAe,KAIzG,IAAM,EAAO,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAuB,CAAC,EAAG,CAClF,IAAM,EAAW,MAAO,EAAK,CAAO,EACpC,GAAI,IAAa,OAAW,MAAO,EAAK,EAAU,CAAO,EAC1D,EAED,SAAS,CAAQ,EAAG,CAClB,IAAM,EAAQ,QAAQ,IAAI,gBAAqB,EAAK,EAAQ,EAAG,SAAU,OAAO,EAChF,OAAO,EAAK,EAAO,WAAY,cAAc,EAIxC,SAAS,CAAO,CAAC,EAAoB,CAC1C,GAAI,EAAS,OAAS,OAAW,OACjC,MAAO,CAAE,cAAe,SAAW,KAAK,EAAS,KAAK,SAAW,IAAM,EAAS,KAAK,QAAQ,CAAE,EAI1F,IAAM,EAAO,EAAO,OAAO,CAChC,GAAI,EAAO,SAAS,EAAO,MAAM,EACjC,QAAS,EAAO,SAAS,EAAO,MAAM,EACtC,IAAK,EAAO,OACZ,IAAK,EAAO,IAAI,MAAM,EAAO,cAAc,CAAC,CAAC,EAC7C,SAAU,EAAO,SAAS,EAAO,MAAM,CACzC,CAAC,EAEK,EAAS,EAAO,oBAAoB,EAAO,eAAe,CAAI,CAAC,EAC/D,EAAe,EAAO,oBAAoB,EAAc,MAAM,EAC9D,EAAqB,EAAO,oBAAoB,EAAO,OAAO,CAAE,QAAS,EAAO,QAAQ,EAAI,CAAE,CAAC,CAAC,EAIhG,EAAO,EAAO,WAAW,SAAU,CAAC,EAAe,CAEvD,IAAM,EAAO,OADF,MAAO,EAAW,YACN,eAAe,GAAQ,EAAS,CAAC,EAAE,KAAK,EAAO,MAAM,EAC5E,GAAI,EAAO,OAAO,CAAI,EAAG,OACzB,OAAO,MAAO,EAAO,EAAK,KAAK,EAAE,KAAK,EAAO,OAAQ,EAAO,IAAI,EAAO,cAAc,CAAC,EACvF,EAUK,EAAQ,EAAO,WAAW,SAAU,CAAC,EAAY,EAAc,GAAO,CAC1E,IAAM,EAAW,CACf,IAAK,EAAK,IACV,KACE,EAAK,WAAa,OACd,OACA,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAK,QAAS,CAChF,EACM,EAAW,MAAO,EAAO,WAAW,IACxC,MAAM,IAAI,IAAI,cAAe,EAAK,GAAG,EAAG,CACtC,QAAS,EAAQ,CAAQ,EACzB,OAAQ,YAAY,QAAQ,IAAK,CACnC,CAAC,CACH,EAAE,KAAK,EAAO,OAAQ,EAAO,IAAI,EAAO,cAAc,CAAC,EACvD,GAAI,IAAa,OAAW,OAC5B,IAAM,EAAO,MAAO,EAAO,WAAW,IAAM,EAAS,KAAK,CAAC,EAAE,KAAK,EAAO,OAAQ,EAAO,IAAI,EAAO,cAAc,CAAC,EAC5G,EAAS,EAAa,CAAI,EAChC,GAAI,EAAO,OAAO,CAAM,EAAG,CACzB,GAAI,EAAO,MAAM,MAAQ,EAAK,IAAK,OACnC,GAAI,EAAK,UAAY,QAAa,EAAO,MAAM,UAAY,EAAK,QAAS,OACzE,MAAO,CACL,OACA,WACA,QAAS,EAAO,MAAM,QACtB,MAAO,EAAS,GAAK,QAAU,EAAS,SAAW,IAAM,SAAW,UACpE,OAAQ,EACV,EAEF,GACE,CAAC,GACD,EAAO,OAAO,EAAmB,CAAI,CAAC,GACrC,OAAO,IAAS,UAAY,IAAS,QAAS,YAAa,KAAQ,QAAS,IAE7E,OACF,MAAO,CAAE,OAAM,WAAU,MAAO,QAAS,OAAQ,EAAK,EACvD,EAEK,EAAa,EAAO,WAAW,SAAU,CAAC,EAAe,EAAc,GAAO,CAClF,IAAM,EAAO,MAAO,EAAK,CAAI,EAC7B,GAAI,IAAS,OAAW,MAAO,CAAE,KAAM,OAAW,QAAS,MAAU,EACrE,MAAO,CAAE,OAAM,QAAS,MAAO,EAAM,EAAM,CAAW,CAAE,EACzD,EAIK,EAAO,EAAO,WAAW,SAAU,CAAC,EAAqC,CAC7E,OAAQ,MAAO,EAAW,EAAQ,KAAM,EAAI,GAAG,QAChD,EAIK,EAAO,EAAS,IAAI,CAAC,EAAS,OAAO,WAAW,EAAG,EAAS,OAAO,GAAG,CAAC,CAAC,EAExE,EAAS,CAAC,EAAa,IAC3B,EAAO,IAAI,CAAE,IAAK,IAAM,QAAQ,KAAK,EAAK,CAAI,EAAG,MAAO,CAAC,IAAU,CAAM,CAAC,EAAE,KAAK,EAAO,MAAM,EAE1F,EAAU,EAAO,WAAW,SAAU,CAAC,EAAa,CAIxD,GAAI,EAHY,MAAO,EAAO,IAAI,CAAE,IAAK,IAAM,QAAQ,KAAK,EAAK,CAAC,EAAG,MAAO,IAAM,EAAM,CAAC,EAAE,KACzF,EAAO,cAAc,IAAM,EAAK,CAClC,GACc,MAAO,GACrB,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,oBAAsB,CAAC,EAC9E,EAED,SAAS,CAAI,CAAC,EAAY,EAAa,CACrC,OAAO,EAAK,KAAO,EAAM,IAAM,EAAK,UAAY,EAAM,SAAW,EAAK,MAAQ,EAAM,KAAO,EAAK,MAAQ,EAAM,IAGhH,IAAM,EAAO,EAAO,WAAW,SAAU,CAAC,EAAuB,EAAqC,CACpG,IAAM,EAAY,MAAO,EAAY,CAAO,EAC5C,GAAI,IAAc,WAAY,OAC9B,GAAI,IAAc,cAAe,CAG/B,IAAM,EAAU,MAAO,EAAK,CAAO,EACnC,GAAI,IAAY,QAAa,CAAC,EAAK,EAAQ,KAAM,EAAQ,IAAI,EAAG,OAChE,MAAO,EAAO,EAAQ,KAAK,IAAK,SAAS,EAE3C,IAAM,EAAO,MAAO,EAAQ,EAAQ,KAAK,GAAG,EAAE,KAAK,EAAO,MAAM,CAAI,EAAG,EAAO,MAAM,EACpF,GAAI,EAAO,OAAO,CAAI,EAAG,OAEzB,IAAM,EAAS,MAAO,EAAK,CAAO,EAClC,GAAI,IAAW,QAAa,CAAC,EAAK,EAAO,KAAM,EAAQ,IAAI,EAAG,OAC9D,MAAO,EAAO,EAAQ,KAAK,IAAK,SAAS,EACzC,MAAO,EAAQ,EAAQ,KAAK,GAAG,EAAE,KAAK,EAAO,MAAM,CAAI,CAAC,EACzD,EAEK,EAAqB,EAAO,oBAAoB,EAAc,YAAY,EAE1E,EAAc,EAAO,WAAW,SAAU,CAAC,EAAuB,CACtE,GAAI,EAAQ,KAAK,KAAO,QAAa,EAAQ,OAAQ,MAAO,cAC5D,IAAM,EAAW,MAAO,EAAO,WAAW,IACxC,MAAM,IAAI,IAAI,oBAAqB,EAAQ,KAAK,GAAG,EAAG,CACpD,OAAQ,OACR,QAAS,IAAK,EAAQ,EAAQ,QAAQ,EAAG,eAAgB,kBAAmB,EAC5E,KAAM,KAAK,UAAU,CAAE,WAAY,EAAQ,KAAK,EAAG,CAAC,EACpD,OAAQ,YAAY,QAAQ,IAAK,CACnC,CAAC,CACH,EAAE,KAAK,EAAO,OAAQ,EAAO,IAAI,EAAO,cAAc,CAAC,EACvD,GAAI,IAAa,QAAa,EAAS,SAAW,KAAO,EAAS,SAAW,IAAK,MAAO,cACzF,IAAM,EAAO,MAAO,EAAO,WAAW,IAAM,EAAS,KAAK,CAAC,EAAE,KAAK,EAAO,OAAQ,EAAO,IAAI,EAAO,cAAc,CAAC,EAC5G,EAAU,EAAmB,CAAI,EACvC,GAAI,CAAC,EAAS,IAAM,EAAO,OAAO,CAAO,GAAK,CAAC,EAAQ,MAAM,SAAU,MAAO,WAC9E,MAAO,WACR,EAGY,EAAU,CAAE,WAAU,YAAW,SAAQ,OAAM,UAAS,MAAK", | ||
| "debugId": "B720DDBAD7603C1A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/llm.ts"], | ||
| "sourcesContent": [ | ||
| "export * as LLM from \"./llm.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\n\nexport const ProviderMetadata = Schema.Record(Schema.String, Schema.Record(Schema.String, Schema.Unknown)).annotate({\n identifier: \"LLM.ProviderMetadata\",\n})\nexport type ProviderMetadata = Schema.Schema.Type<typeof ProviderMetadata>\n\nexport const FinishReason = Schema.Literals([\"stop\", \"length\", \"tool-calls\", \"content-filter\", \"error\", \"unknown\"])\nexport type FinishReason = typeof FinishReason.Type\n\nexport interface ToolTextContent extends Schema.Schema.Type<typeof ToolTextContent> {}\nexport const ToolTextContent = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n}).annotate({ identifier: \"Tool.TextContent\" })\n\nexport interface ToolFileContent extends Schema.Schema.Type<typeof ToolFileContent> {}\nexport const ToolFileContent = Schema.Struct({\n type: Schema.Literal(\"file\"),\n uri: Schema.String,\n mime: Schema.String,\n name: optional(Schema.String),\n}).annotate({ identifier: \"Tool.FileContent\" })\n\nexport const ToolContent = Schema.Union([ToolTextContent, ToolFileContent])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"LLM.ToolContent\" })\nexport type ToolContent = Schema.Schema.Type<typeof ToolContent>\n" | ||
| ], | ||
| "mappings": ";oRAKO,SAAM,OAAmB,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EAAE,SAAS,CAClH,WAAY,sBACd,CAAC,EAGY,EAAe,EAAO,SAAS,CAAC,OAAQ,SAAU,aAAc,iBAAkB,QAAS,SAAS,CAAC,EAIrG,EAAkB,EAAO,OAAO,CAC3C,KAAM,EAAO,QAAQ,MAAM,EAC3B,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAkB,EAAO,OAAO,CAC3C,KAAM,EAAO,QAAQ,MAAM,EAC3B,IAAK,EAAO,OACZ,KAAM,EAAO,OACb,KAAM,EAAS,EAAO,MAAM,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEjC,EAAc,EAAO,MAAM,CAAC,EAAiB,CAAe,CAAC,EACvE,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,iBAAkB,CAAC", | ||
| "debugId": "824E814D22AD92BC64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "C57B3A2934A8D52E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/plugin/sdk.ts", "../plugin/src/v2/effect/tool.ts", "../plugin/src/v2/effect/plugin.ts", "../schema/src/session.ts", "../schema/src/command.ts", "../schema/src/reference.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SdkPlugins from \"./sdk\"\n\nimport type { Plugin } from \"@opencode-ai/plugin/v2/effect/plugin\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { makeGlobalNode } from \"../effect/app-node\"\nimport { EventV2 } from \"../event\"\nimport type { PluginV2 } from \"../plugin\"\n\nexport const Updated = EventV2.ephemeral({ type: \"sdk.plugin.updated\", schema: {} })\n\n/**\n * Holds the plugins an embedder (the `@opencode-ai/sdk-next` host) contributes,\n * so `PluginSupervisor` can add them on every Location boot through the ordinary\n * generation path that `PluginSupervisor` uses for plugins discovered from\n * config. Registration publishes an unlocated update so every booted Location\n * reloads its plugin generation from the shared store.\n *\n * Each host-global layer owns one private store. Location graphs reuse that\n * layer through Effect's memoization, so separate hosts remain isolated while\n * every Location in one host sees the same registrations.\n */\nexport interface Interface {\n readonly register: (plugin: Plugin) => Effect.Effect<void>\n readonly all: () => readonly PluginV2.Versioned[]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/SdkPlugins\") {}\n\nexport const layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const events = yield* EventV2.Service\n const plugins = new Map<string, PluginV2.Versioned>()\n let revision = 0\n return Service.of({\n register: (plugin) =>\n Effect.sync(() => {\n plugins.set(plugin.id, { ...plugin, version: String(++revision) })\n }).pipe(Effect.andThen(events.publish(Updated, {})), Effect.asVoid),\n all: () => [...plugins.values()],\n })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer, deps: [EventV2.node] })\n", | ||
| "export * as Tool from \"./tool.js\"\n\nimport { Agent } from \"@opencode-ai/schema/agent\"\nimport type { LLM } from \"@opencode-ai/schema/llm\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from \"@standard-schema/spec\"\nimport { Effect, JsonSchema, Schema } from \"effect\"\nimport type { Hooks, Transform } from \"./registration.js\"\n\nexport interface Context {\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly progress: (update: Progress) => Effect.Effect<void>\n}\n\nexport interface Progress {\n readonly structured: Readonly<Record<string, unknown>>\n readonly content?: ReadonlyArray<Content>\n}\n\nexport type StandardSchemaType<Input = unknown, Output = Input> = StandardSchemaV1<Input, Output> &\n StandardJSONSchemaV1<Input, Output>\nexport type SchemaType<A> = Schema.Codec<A, any> | StandardSchemaType<any, A>\ntype IsAny<A> = 0 extends 1 & A ? true : false\nexport type InputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\nexport type OutputValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<infer A, any>\n ? A\n : never\nexport type EncodedValue<S> =\n IsAny<S> extends true\n ? any\n : S extends Schema.Codec<any, infer A>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : never\n\ntype ToolDefinition = {\n readonly name: string\n readonly description: string\n readonly inputSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n}\n\ntype ToolCall = {\n readonly input: unknown\n readonly [key: string]: unknown\n}\n\ntype ToolResultValue =\n | { readonly type: \"json\"; readonly value: unknown }\n | { readonly type: \"text\"; readonly value: unknown }\n | { readonly type: \"error\"; readonly value: unknown }\n | { readonly type: \"content\"; readonly value: ReadonlyArray<LLM.ToolContent> }\n\ntype ToolOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<LLM.ToolContent>\n}\n\nexport class Failure extends Schema.TaggedErrorClass<Failure>()(\"LLM.ToolFailure\", {\n message: Schema.String,\n error: Schema.optional(Schema.Defect()),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport class RegistrationError extends Schema.TaggedErrorClass<RegistrationError>()(\"Tool.RegistrationError\", {\n name: Schema.String,\n message: Schema.String,\n}) {}\n\nexport type Content =\n | { readonly type: \"text\"; readonly text: string }\n | { readonly type: \"file\"; readonly data: string; readonly mime: string; readonly name?: string }\n\nexport type Definition<\n Input extends SchemaType<any>,\n Structured extends SchemaType<any>,\n Output extends SchemaType<any> = any,\n> = {\n readonly description: string\n readonly input: Input\n readonly output: Output\n readonly structured?: Structured\n readonly permission?: string\n readonly toStructuredOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => OutputValue<Structured>\n readonly execute: (input: InputValue<Input>, context: Context) => Effect.Effect<OutputValue<Output>, Failure>\n readonly toModelOutput?: (input: {\n readonly input: InputValue<Input>\n readonly output: EncodedValue<Output>\n }) => ReadonlyArray<Content>\n}\n\nexport type DynamicOutput = {\n readonly structured: unknown\n readonly content: ReadonlyArray<Content>\n}\n\n/**\n * Config for a tool whose input shape is a raw JSON Schema not known at compile\n * time (MCP servers, plugin manifests). Input is passed through as `unknown`;\n * `execute` returns the already-projected structured value and model content.\n */\nexport type DynamicDefinition = {\n readonly description: string\n readonly jsonSchema: JsonSchema.JsonSchema\n readonly outputSchema?: JsonSchema.JsonSchema\n readonly permission?: string\n readonly execute: (input: unknown, context: Context) => Effect.Effect<DynamicOutput, Failure>\n}\n\nexport type AnyTool = Definition<any, any> | DynamicDefinition\n\nexport function make<\n Input extends SchemaType<any>,\n Output extends SchemaType<any>,\n Structured extends SchemaType<any> = Output,\n>(config: Definition<Input, Structured, Output>): Definition<Input, Structured, Output>\nexport function make(config: DynamicDefinition): DynamicDefinition\nexport function make(config: AnyTool): AnyTool\nexport function make(config: AnyTool): AnyTool {\n return config\n}\n\nfunction toModelContent(part: Content) {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text }\n return { type: \"file\" as const, uri: `data:${part.mime};base64,${part.data}`, mime: part.mime, name: part.name }\n}\n\nexport const validateName = (name: string) =>\n /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(name)\n ? Effect.void\n : Effect.fail(new RegistrationError({ name, message: `Invalid tool name: ${name}` }))\n\nexport const registrationEntries = (tools: Readonly<Record<string, AnyTool>>, namespace?: string) =>\n Object.entries(tools).map(([name, tool]) => {\n const normalized = name.replace(/[^a-zA-Z0-9_-]/g, \"_\")\n return {\n key: namespace === undefined ? normalized : `${namespace.replaceAll(\".\", \"_\")}_${normalized}`,\n name: normalized,\n namespace,\n tool,\n }\n })\n\nexport const validateNamespace = (namespace: string) =>\n namespace.split(\".\").every((segment) => /^[A-Za-z][A-Za-z0-9_-]{0,63}$/.test(segment))\n ? Effect.void\n : Effect.fail(\n new RegistrationError({ name: namespace, message: `Invalid tool namespace: ${JSON.stringify(namespace)}` }),\n )\n\nexport const withPermission = <T extends AnyTool>(\n tool: T,\n permission: string,\n): Omit<T, \"permission\"> & {\n readonly permission: string\n} => ({ ...tool, permission })\n\nexport const permission = (tool: AnyTool, name: string) => tool.permission ?? name\n\nexport const definition = (name: string, tool: AnyTool): ToolDefinition =>\n \"jsonSchema\" in tool\n ? {\n name,\n description: tool.description,\n inputSchema: tool.jsonSchema,\n outputSchema: tool.outputSchema,\n }\n : {\n name,\n description: tool.description,\n inputSchema: inputJsonSchema(tool.input),\n outputSchema: outputJsonSchema(tool.structured ?? tool.output),\n }\n\nexport const settle = (tool: AnyTool, call: ToolCall, context: Context): Effect.Effect<ToolOutput, Failure> =>\n Effect.gen(function* () {\n if (\"jsonSchema\" in tool) {\n const output = yield* tool.execute(call.input, context)\n return { structured: output.structured, content: output.content.map(toModelContent) }\n }\n\n const input = yield* decodeInput(tool.input, call.input)\n const value = yield* tool.execute(input, context)\n const output = yield* encodeOutput(tool.output, value)\n const structured =\n tool.structured && tool.toStructuredOutput\n ? yield* encodeOutput(tool.structured, tool.toStructuredOutput({ input, output }))\n : output\n return {\n structured,\n content:\n tool.toModelOutput?.({ input, output }).map(toModelContent) ??\n (typeof output === \"string\" ? [{ type: \"text\" as const, text: output }] : []),\n }\n })\n\nfunction decodeInput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.decodeUnknownEffect(schema)(value).pipe(\n Effect.mapError((error) => new Failure({ message: `Invalid tool input: ${error.message}` })),\n )\n return validateStandard(schema, value, \"Invalid tool input\")\n}\n\nfunction encodeOutput(schema: SchemaType<any>, value: unknown): Effect.Effect<any, Failure> {\n if (Schema.isSchema(schema))\n return Schema.encodeEffect(schema)(value).pipe(\n Effect.mapError(\n (error) => new Failure({ message: `Tool returned an invalid value for its output schema: ${error.message}` }),\n ),\n )\n return validateStandard(schema, value, \"Tool returned an invalid value for its output schema\")\n}\n\nfunction validateStandard(schema: StandardSchemaType, value: unknown, prefix: string): Effect.Effect<unknown, Failure> {\n return Effect.gen(function* () {\n const pending = yield* Effect.try({\n try: () => schema[\"~standard\"].validate(value),\n catch: (error) => standardFailure(prefix, error),\n })\n const result =\n pending instanceof Promise\n ? yield* Effect.tryPromise({ try: () => pending, catch: (error) => standardFailure(prefix, error) })\n : pending\n if (result.issues)\n return yield* Effect.fail(\n new Failure({ message: `${prefix}: ${result.issues.map((issue) => issue.message).join(\", \")}` }),\n )\n return result.value\n })\n}\n\nfunction standardFailure(prefix: string, error: unknown) {\n return new Failure({ message: `${prefix}: ${error instanceof Error ? error.message : String(error)}` })\n}\n\nfunction inputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.input({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction outputJsonSchema(schema: SchemaType<any>): JsonSchema.JsonSchema {\n if (!Schema.isSchema(schema))\n return schema[\"~standard\"].jsonSchema.output({ target: \"draft-2020-12\" }) as JsonSchema.JsonSchema\n return toJsonSchema(schema)\n}\n\nfunction toJsonSchema(schema: Schema.Top): JsonSchema.JsonSchema {\n const document = Schema.toJsonSchemaDocument(schema)\n if (Object.keys(document.definitions).length === 0) return document.schema\n return { ...document.schema, $defs: document.definitions }\n}\n\nexport interface ToolExecuteBeforeEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n input: unknown\n}\n\nexport interface ToolExecuteAfterEvent {\n readonly tool: string\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly callID: string\n readonly input: unknown\n result: ToolResultValue\n output?: ToolOutput\n outputPaths?: ReadonlyArray<string>\n}\n\nexport interface RegisterOptions {\n readonly namespace?: string\n /** Defaults to true. False exposes the tool directly to the provider. */\n readonly codemode?: boolean\n}\n\nexport interface ToolDraft {\n add(name: string, tool: AnyTool, options?: RegisterOptions): void\n}\n\nexport interface ToolHooks {\n readonly \"execute.before\": ToolExecuteBeforeEvent\n readonly \"execute.after\": ToolExecuteAfterEvent\n}\n\nexport interface ToolDomain {\n readonly transform: Transform<ToolDraft>\n readonly hook: Hooks<ToolHooks>\n}\n", | ||
| "import type { PluginApi } from \"@opencode-ai/client/effect/api\"\nimport type { Effect, Scope } from \"effect\"\nimport type { PluginOptions } from \"../options.js\"\nimport type { AgentDomain } from \"./agent.js\"\nimport type { AISDKDomain } from \"./aisdk.js\"\nimport type { CatalogDomain } from \"./catalog.js\"\nimport type { CommandDomain } from \"./command.js\"\nimport type { EventDomain } from \"./event.js\"\nimport type { IntegrationDomain } from \"./integration.js\"\nimport type { ReferenceDomain } from \"./reference.js\"\nimport type { SessionDomain } from \"./session.js\"\nimport type { SkillDomain } from \"./skill.js\"\nimport type { ToolDomain } from \"./tool.js\"\n\nexport interface Context {\n readonly options: PluginOptions\n readonly agent: AgentDomain\n readonly aisdk: AISDKDomain\n readonly catalog: CatalogDomain\n readonly command: CommandDomain\n readonly event: EventDomain\n readonly integration: IntegrationDomain\n readonly plugin: PluginApi<unknown>\n readonly reference: ReferenceDomain\n readonly session: SessionDomain\n readonly skill: SkillDomain\n readonly tool: ToolDomain\n}\n\nexport interface Plugin<R = Scope.Scope> {\n readonly id: string\n readonly effect: (context: Context) => Effect.Effect<void, never, R>\n}\n\nexport function define<R = Scope.Scope>(plugin: Plugin<R>) {\n return plugin\n}\n", | ||
| "export * as Session from \"./session.js\"\n\nimport { Schema } from \"effect\"\nimport { Agent } from \"./agent.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionEvent } from \"./session-event.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Money } from \"./money.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { Revert } from \"./session-revert.js\"\n\nexport const ID = SessionID\nexport type ID = SessionID\n\nexport const Event = SessionEvent\n\nexport { Revert }\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n parentID: ID.pipe(optional),\n fork: Schema.Struct({\n sessionID: ID,\n /** Messages before this exclusive boundary are copied into the fork. */\n messageID: SessionMessage.ID.pipe(optional),\n }).pipe(optional),\n projectID: Project.ID,\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n updated: DateTimeUtcFromMillis,\n archived: DateTimeUtcFromMillis.pipe(optional),\n }),\n title: Schema.String,\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n revert: Revert.pipe(optional),\n}).annotate({ identifier: \"Session.Info\" })\n\nexport const ListAnchor = Schema.Struct({\n id: ID,\n time: Schema.Finite,\n direction: Schema.Literals([\"previous\", \"next\"]),\n}).annotate({ identifier: \"Session.ListAnchor\" })\nexport interface ListAnchor extends Schema.Schema.Type<typeof ListAnchor> {}\n", | ||
| "export * as Command from \"./command.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Agent } from \"./agent.js\"\n\nconst Updated = ephemeral({ type: \"command.updated\", schema: {} })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n name: Schema.String,\n template: Schema.String,\n description: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n subtask: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Command.Info\" })\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Reference from \"./reference.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"reference.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface LocalSource extends Schema.Schema.Type<typeof LocalSource> {}\nexport const LocalSource = Schema.Struct({\n type: Schema.Literal(\"local\"),\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.LocalSource\" })\n\nexport interface GitSource extends Schema.Schema.Type<typeof GitSource> {}\nexport const GitSource = Schema.Struct({\n type: Schema.Literal(\"git\"),\n repository: Schema.String,\n branch: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.GitSource\" })\n\nexport const Source = Schema.Union([LocalSource, GitSource])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Reference.Source\" })\nexport type Source = typeof Source.Type\n\nexport const Info = Schema.Struct({\n name: Schema.String,\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n source: Source,\n}).annotate({ identifier: \"Reference.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "5B3446E1347CC99164756E2164756E21", | ||
| "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": "F90034C47967A4BE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,OAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH", | ||
| "debugId": "B71FF73628071C4764756E2164756E21", | ||
| "names": [] | ||
| } |
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": "171AF4EC7FD25F6764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/stop.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,CACH", | ||
| "debugId": "8FD5F50B48CD7B9D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "E62EFFBCF0E94EB964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "99FE0A150A359F3B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/azure.ts"], | ||
| "sourcesContent": [ | ||
| "import { Auth } from \"../route/auth\"\nimport { type AtLeastOne, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAIChat from \"../protocols/openai-chat\"\nimport * as OpenAIResponses from \"../protocols/openai-responses\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options\"\n\nexport const id = ProviderID.make(\"azure\")\nconst routeAuth = Auth.remove(\"authorization\")\n\n// Azure needs the customer's resource URL; supply either `resourceName`\n// (helper builds the URL) or `baseURL` directly.\ntype AzureURL = AtLeastOne<{ readonly resourceName: string; readonly baseURL: string }>\n\nexport type ModelOptions = AzureURL &\n RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly apiVersion?: string\n readonly queryParams?: Record<string, string>\n readonly useCompletionUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\nexport type Config = ModelOptions\n\nexport type Settings = ProviderPackage.Settings &\n AzureURL & {\n readonly apiKey?: string\n readonly apiVersion?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nconst resourceBaseURL = (resourceName: string) => `https://${resourceName.trim()}.openai.azure.com/openai/v1`\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"azure-openai-responses\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"azure-openai-chat\",\n provider: id,\n auth: routeAuth,\n endpoint: {\n query: { \"api-version\": \"v1\" },\n },\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst defaults = (input: Config) => {\n const {\n apiKey: _,\n apiVersion: _apiVersion,\n resourceName: _resourceName,\n useCompletionUrls: _useCompletionUrls,\n baseURL: _baseURL,\n queryParams: _queryParams,\n ...rest\n } = input\n if (\"auth\" in rest) {\n const { auth: _, ...withoutAuth } = rest\n return withoutAuth\n }\n return rest\n}\n\nconst auth = (input: Config) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.remove(\"authorization\").andThen(\n Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"AZURE_OPENAI_API_KEY\"))\n .pipe(Auth.header(\"api-key\")),\n )\n}\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: {\n // AtLeastOne guarantees at least one is set; baseURL wins if both are.\n baseURL: input.baseURL ?? resourceBaseURL(input.resourceName!),\n query: {\n ...(input.apiVersion ? { \"api-version\": input.apiVersion } : {}),\n ...input.queryParams,\n },\n },\n })\n\nexport const configure = (input: Config) => {\n const configuredResponsesRoute = configuredRoute(responsesRoute, input)\n const configuredChatRoute = configuredRoute(chatRoute, input)\n const modelDefaults = defaults(input)\n\n const responses = (modelID: string | ModelID) =>\n configuredResponsesRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n const chat = (modelID: string | ModelID) =>\n configuredChatRoute.with(withOpenAIOptions(modelID, modelDefaults)).model({ id: modelID })\n\n return {\n id,\n model: (modelID: string | ModelID) => (input.useCompletionUrls === true ? chat(modelID) : responses(modelID)),\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nconst config = (settings: Settings): Config => {\n const common = {\n apiKey: settings.apiKey,\n apiVersion: settings.apiVersion,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n if (settings.baseURL !== undefined) return { ...common, baseURL: settings.baseURL }\n if (settings.resourceName !== undefined) return { ...common, resourceName: settings.resourceName }\n throw new Error(\"Azure requires resourceName or baseURL\")\n}\n\nexport const responsesModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).responses(modelID)\nexport const chatModel: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure(config(settings)).chat(modelID)\nexport const model = responsesModel\n" | ||
| ], | ||
| "mappings": ";yMASO,SAAM,OAAK,OAAW,KAAK,OAAO,EACnC,EAAY,EAAK,OAAO,eAAe,EAwBvC,EAAkB,CAAC,IAAyB,WAAW,EAAa,KAAK,+BAEzE,EAAiC,EAAM,KAAK,CAChD,GAAI,yBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEK,EAAuB,EAAM,KAAK,CACtC,GAAI,oBACJ,SAAU,EACV,KAAM,EACN,SAAU,CACR,MAAO,CAAE,cAAe,IAAK,CAC/B,CACF,CAAC,EAEY,EAAS,CAAC,EAAgB,CAAS,EAE1C,EAAW,CAAC,IAAkB,CAClC,IACE,OAAQ,EACR,WAAY,EACZ,aAAc,EACd,kBAAmB,EACnB,QAAS,EACT,YAAa,KACV,GACD,EACJ,GAAI,SAAU,EAAM,CAClB,IAAQ,KAAM,KAAM,GAAgB,EACpC,OAAO,EAET,OAAO,GAGH,EAAO,CAAC,IAAkB,CAC9B,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,OAAO,eAAe,EAAE,QAClC,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EACjE,OAAO,EAAK,OAAO,sBAAsB,CAAC,EAC1C,KAAK,EAAK,OAAO,SAAS,CAAC,CAChC,GAGI,EAAkB,CAAiB,EAAiC,IACxE,EAAM,KAAK,CACT,KAAM,EAAK,CAAK,EAChB,SAAU,CAER,QAAS,EAAM,SAAW,EAAgB,EAAM,YAAa,EAC7D,MAAO,IACD,EAAM,WAAa,CAAE,cAAe,EAAM,UAAW,EAAI,CAAC,KAC3D,EAAM,WACX,CACF,CACF,CAAC,EAEU,EAAY,CAAC,IAAkB,CAC1C,IAAM,EAA2B,EAAgB,EAAgB,CAAK,EAChE,EAAsB,EAAgB,EAAW,CAAK,EACtD,EAAgB,EAAS,CAAK,EAE9B,EAAY,CAAC,IACjB,EAAyB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE1F,EAAO,CAAC,IACZ,EAAoB,KAAK,EAAkB,EAAS,CAAa,CAAC,EAAE,MAAM,CAAE,GAAI,CAAQ,CAAC,EAE3F,MAAO,CACL,KACA,MAAO,CAAC,IAA+B,EAAM,oBAAsB,GAAO,EAAK,CAAO,EAAI,EAAU,CAAO,EAC3G,YACA,OACA,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEM,EAAS,CAAC,IAA+B,CAC7C,IAAM,EAAS,CACb,OAAQ,EAAS,OACjB,WAAY,EAAS,WACrB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,gBAAiB,EAAS,gBAC1B,YAAa,EAAS,cAAgB,OAAY,OAAY,IAAK,EAAS,WAAY,CAC1F,EACA,GAAI,EAAS,UAAY,OAAW,MAAO,IAAK,EAAQ,QAAS,EAAS,OAAQ,EAClF,GAAI,EAAS,eAAiB,OAAW,MAAO,IAAK,EAAQ,aAAc,EAAS,YAAa,EACjG,MAAU,MAAM,wCAAwC,GAG7C,EAAgE,CAAC,EAAS,IACrF,EAAU,EAAO,CAAQ,CAAC,EAAE,UAAU,CAAO,EAClC,EAA2D,CAAC,EAAS,IAChF,EAAU,EAAO,CAAQ,CAAC,EAAE,KAAK,CAAO,EAC7B,EAAQ", | ||
| "debugId": "AF90D21DF44973FE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/cli-spinners@3.4.0/node_modules/cli-spinners/index.js", "../../node_modules/.bun/opentui-spinner@0.0.7+5ab4a390c455099d/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+5ab4a390c455099d/node_modules/opentui-spinner/dist/solid.mjs", "../tui/src/component/register-spinner.ts"], | ||
| "sourcesContent": [ | ||
| "import spinners from './spinners.json' with {type: 'json'};\n\nexport default spinners;\n\nconst spinnersList = Object.keys(spinners);\n\nexport function randomSpinner() {\n\tconst randomIndex = Math.floor(Math.random() * spinnersList.length);\n\tconst spinnerName = spinnersList[randomIndex];\n\treturn spinners[spinnerName];\n}\n", | ||
| "import{Renderable as e,parseColor as t,resolveRenderLib as n}from\"@opentui/core\";import r from\"cli-spinners\";const i=1e3/60,a=1e3;function o(e){if(!Number.isFinite(e)||e<i||e>a)throw RangeError(`Spinner interval must be a finite number between ${i}ms and ${a}ms`);return e}const s={now:()=>performance.now(),setInterval:(e,t)=>{let n=setInterval(e,t);return n.unref(),n},clearInterval:e=>clearInterval(e)},c=new class{active=new Map;heap=[];timer=null;timerDueAt=0;generation=0;lastWakeAt=-1/0;clock;constructor(e=s,t=16){this.denseTickThreshold=t,this.clock=e}setClock(e){if(this.active.size>0||this.timer!==null)throw Error(`Cannot replace the spinner scheduler clock while active`);this.clock=e}start(e,t,n){if(this.active.has(e))return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n};this.active.set(e,r),this.push(r),this.armNext()}reschedule(e,t){let n=this.active.get(e);if(!n)return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n.advance};this.active.set(e,r),this.push(r),this.compactIfNeeded(),this.armNext()}stop(e){this.active.delete(e)&&(this.compactIfNeeded(),this.armNext())}armNext(){this.discardStaleRoots();let e=this.heap[0];if(!e){this.cancelTimer(),this.lastWakeAt=-1/0;return}let t=this.clock.now(),n=Math.max(e.nextDueAt,this.lastWakeAt+i);if(this.timer!==null&&this.timerDueAt===n)return;this.cancelTimer();let r=this.generation,a=Math.max(n-t,0);this.timerDueAt=n,this.timer=this.clock.setInterval(()=>this.tick(r),a)}cancelTimer(){this.timer!==null&&(this.generation++,this.clock.clearInterval(this.timer),this.timer=null)}tick(e){if(e!==this.generation||this.timer===null)return;let t=this.timer;this.generation++,this.timer=null,this.clock.clearInterval(t);let n=this.clock.now();this.discardStaleRoots();let r=!1,i=0,a=[];for(;this.heap[0]&&this.heap[0].nextDueAt<=n;){let e=this.pop();if(!(!e||!this.isCurrent(e))){try{e.advance()}catch(e){a.push(e)}if(r=!0,this.isCurrent(e)&&(e.nextDueAt=n+e.interval,this.push(e),i++,i===this.denseTickThreshold)){let e=this.heap;this.heap=[];for(let t of e)if(this.isCurrent(t)){if(t.nextDueAt<=n){try{t.advance()}catch(e){a.push(e)}if(r=!0,!this.isCurrent(t))continue;t.nextDueAt=n+t.interval}this.heap.push(t)}this.heapify();break}}}if(r&&(this.lastWakeAt=n),this.compactIfNeeded(),this.armNext(),a.length===1)throw a[0];if(a.length>1)throw AggregateError(a,`Multiple spinner callbacks failed`)}isCurrent(e){return this.active.get(e.spinner)===e}discardStaleRoots(){for(;this.heap[0]&&!this.isCurrent(this.heap[0]);)this.pop()}compactIfNeeded(){this.heap.length<=this.active.size*2+16||(this.heap=Array.from(this.active.values()),this.heapify())}heapify(){for(let e=Math.floor(this.heap.length/2)-1;e>=0;e--)this.siftDown(e)}push(e){this.heap.push(e);let t=this.heap.length-1;for(;t>0;){let n=Math.floor((t-1)/2);if(this.heap[n].nextDueAt<=e.nextDueAt)break;this.heap[t]=this.heap[n],t=n}this.heap[t]=e}pop(){let e=this.heap[0],t=this.heap.pop();return!e||!t||this.heap.length===0?e:(this.heap[0]=t,this.siftDown(0),e)}siftDown(e){let t=this.heap[e],n=e;for(;;){let e=n*2+1;if(e>=this.heap.length)break;let r=e+1,i=r<this.heap.length&&this.heap[r].nextDueAt<this.heap[e].nextDueAt?r:e;if(this.heap[i].nextDueAt>=t.nextDueAt)break;this.heap[n]=this.heap[i],n=i}this.heap[n]=t}};function l(e,t=1){if(e.length===0)throw RangeError(`createPulse requires at least one color`);return n=>e[Math.floor(n*t)%e.length]}function u(e){if(e.length===0)throw RangeError(`createWave requires at least one color`);return(t,n,r,i)=>{let a=(n+t)%i;return e[Math.floor(a/i*e.length)]??e[0]}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=class extends e{_name;_frames;_interval;_autoplay;_backgroundColor;_parsedBackgroundColor;_color;_parsedColor;_currentFrameIndex=0;_encodedFrames={};_lib=n();_isRunning=!1;_advanceFrame=()=>{!this._isRunning||this.isDestroyed||(this._currentFrameIndex=(this._currentFrameIndex+1)%this._frames.length,this.requestRender())};_defaultOptions={name:`dots`,frames:r.dots.frames,interval:r.dots.interval,autoplay:!0,backgroundColor:`transparent`,color:`white`};constructor(e,n){super(e,n),this._name=n.name,this._frames=n.frames?.length?n.frames:this._name?r[this._name].frames:this._defaultOptions.frames,this._interval=o(n.interval??(this._name?r[this._name].interval:this._defaultOptions.interval)),this._autoplay=n.autoplay??this._defaultOptions.autoplay,this._backgroundColor=n.backgroundColor??this._defaultOptions.backgroundColor,this._parsedBackgroundColor=t(this._backgroundColor),this._color=n.color??this._defaultOptions.color,this._parsedColor=typeof this._color==`function`?t(this._defaultOptions.color):t(this._color),this.height=1,this._encodeFrames(),this._autoplay&&this.start()}_encodeFrames(){let e=0;for(let t of this._frames){if(this._encodedFrames[t])continue;let n=this._lib.encodeUnicode(t,this.ctx.widthMethod);n&&(this._encodedFrames[t]=n,e=Math.max(e,n.data.reduce((e,t)=>e+t.width,0)))}this.width=e}_freeFrames(){for(let e in this._encodedFrames)this._encodedFrames[e]&&this._lib.freeUnicode(this._encodedFrames[e]);this._encodedFrames={}}get interval(){return this._interval}set interval(e){this._interval=o(e),this._isRunning&&c.reschedule(this,this._interval)}get name(){return this._name}set name(e){let t=e?r[e].frames:this._defaultOptions.frames,n=o(e?r[e].interval:this._defaultOptions.interval),i=!d(this._frames,t),a=this._interval!==n;this._name=e,this._interval=n,i&&(this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()),this._isRunning&&a&&c.reschedule(this,n)}get frames(){return this._frames}set frames(e){let t=e.length===0?this._defaultOptions.frames:e;if(d(this._frames,t)){this._frames=t;return}this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()}get color(){return this._color}set color(e){this._color=e,typeof e!=`function`&&(this._parsedColor=t(e)),this.visible&&this.requestRender()}get backgroundColor(){return this._backgroundColor}set backgroundColor(e){this._backgroundColor=e,this._parsedBackgroundColor=t(e),this.visible&&this.requestRender()}get visible(){return super.visible}set visible(e){e!==super.visible&&(super.visible=e,this._isRunning&&(e?c.start(this,this._interval,this._advanceFrame):c.stop(this)))}get autoplay(){return this._autoplay}set autoplay(e){this._autoplay=e,e?this.start():this.stop()}start(){this._isRunning||this.isDestroyed||(this._isRunning=!0,this.visible&&c.start(this,this._interval,this._advanceFrame))}stop(){this._isRunning&&(this._isRunning=!1,c.stop(this))}renderSelf(e){if(!this.visible)return;let n=this._frames[this._currentFrameIndex];if(!n)return;let r=this._encodedFrames[n];if(!r)return;let i=this.x;for(let n=0;n<r.data.length;n++){let a=typeof this._color==`function`?t(this._color(this._currentFrameIndex,n,this._frames.length,r.data.length)):this._parsedColor;e.drawChar(r.data[n].char,i,this.y,a,this._parsedBackgroundColor),i+=r.data[n].width}}destroySelf(){this.stop(),this._freeFrames(),super.destroySelf()}};export{l as n,u as r,f as t};", | ||
| "import{t as e}from\"./src-DjeqLSfu.mjs\";import{extend as t}from\"@opentui/solid/components\";function n(){t({spinner:e})}n();export{n as registerSpinner};", | ||
| "import { getComponentCatalogue } from \"@opentui/solid/components\"\nimport { registerSpinner } from \"opentui-spinner/solid\"\n\nexport function registerOpencodeSpinner() {\n if (!getComponentCatalogue().spinner) registerSpinner()\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "17EE08B80A67186B64756E2164756E21", | ||
| "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/utils/lifecycle.ts", "../ai/src/protocols/utils/gemini-tool-schema.ts", "../ai/src/protocols/utils/tool-schema.ts"], | ||
| "sourcesContent": [ | ||
| "import { LLMEvent, type FinishReason, type ProviderMetadata, type Usage } from \"../../schema\"\n\nexport interface State {\n readonly stepStarted: boolean\n readonly text: ReadonlySet<string>\n readonly reasoning: ReadonlySet<string>\n}\n\nexport const initial = (): State => ({ stepStarted: false, text: new Set(), reasoning: new Set() })\n\nexport const stepStart = (state: State, events: LLMEvent[]): State => {\n if (state.stepStarted) return state\n events.push(LLMEvent.stepStart({ index: 0 }))\n return { ...state, stepStarted: true }\n}\n\nexport const textDelta = (state: State, events: LLMEvent[], id: string, text: string): State => {\n const stepped = stepStart(state, events)\n if (stepped.text.has(id)) {\n events.push(LLMEvent.textDelta({ id, text }))\n return stepped\n }\n events.push(LLMEvent.textStart({ id }), LLMEvent.textDelta({ id, text }))\n return { ...stepped, text: new Set([...stepped.text, id]) }\n}\n\nexport const reasoningStart = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningStart({ id, providerMetadata }))\n return { ...stepped, reasoning: new Set([...stepped.reasoning, id]) }\n}\n\nexport const reasoningDelta = (\n state: State,\n events: LLMEvent[],\n id: string,\n text: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n const started = reasoningStart(state, events, id, providerMetadata)\n events.push(LLMEvent.reasoningDelta({ id, text, providerMetadata }))\n return started\n}\n\nexport const reasoningEnd = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (!state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningEnd({ id, providerMetadata }))\n const reasoning = new Set(stepped.reasoning)\n reasoning.delete(id)\n return { ...stepped, reasoning }\n}\n\nexport const textEnd = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (!state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textEnd({ id, providerMetadata }))\n const text = new Set(stepped.text)\n text.delete(id)\n return { ...stepped, text }\n}\n\nconst closeOpenBlocks = (state: State, events: LLMEvent[]): State => {\n for (const id of state.reasoning) events.push(LLMEvent.reasoningEnd({ id }))\n for (const id of state.text) events.push(LLMEvent.textEnd({ id }))\n return { ...state, text: new Set(), reasoning: new Set() }\n}\n\nexport const finish = (\n state: State,\n events: LLMEvent[],\n input: {\n readonly reason: FinishReason\n readonly usage?: Usage\n readonly providerMetadata?: ProviderMetadata\n },\n): State => {\n const stepped = closeOpenBlocks(stepStart(state, events), events)\n events.push(\n LLMEvent.stepFinish({\n index: 0,\n reason: input.reason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n }),\n LLMEvent.finish(input),\n )\n return { ...stepped, stepStarted: false }\n}\n\nexport * as Lifecycle from \"./lifecycle\"\n", | ||
| "import { isRecord } from \"../../utils/record\"\n\n// Gemini accepts a JSON Schema-like dialect for tool parameters, but rejects a\n// handful of common JSON Schema shapes. Keep this projection isolated so the\n// Gemini protocol file still reads like the other protocol modules.\nconst SCHEMA_INTENT_KEYS = [\n \"type\",\n \"properties\",\n \"items\",\n \"prefixItems\",\n \"enum\",\n \"const\",\n \"$ref\",\n \"additionalProperties\",\n \"patternProperties\",\n \"required\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n]\n\nconst hasCombiner = (schema: unknown) =>\n isRecord(schema) && (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf) || Array.isArray(schema.allOf))\n\nconst hasSchemaIntent = (schema: unknown) =>\n isRecord(schema) && (hasCombiner(schema) || SCHEMA_INTENT_KEYS.some((key) => key in schema))\n\nconst sanitizeNode = (schema: unknown): unknown => {\n if (!isRecord(schema)) return Array.isArray(schema) ? schema.map(sanitizeNode) : schema\n\n const result: Record<string, unknown> = Object.fromEntries(\n Object.entries(schema).map(([key, value]) => [\n key,\n key === \"enum\" && Array.isArray(value) ? value.map(String) : sanitizeNode(value),\n ]),\n )\n\n if (Array.isArray(result.enum) && (result.type === \"integer\" || result.type === \"number\")) result.type = \"string\"\n\n const properties = result.properties\n if (result.type === \"object\" && isRecord(properties) && Array.isArray(result.required)) {\n result.required = result.required.filter((field) => typeof field === \"string\" && field in properties)\n }\n\n if (result.type === \"array\" && !hasCombiner(result)) {\n result.items = result.items ?? {}\n if (isRecord(result.items) && !hasSchemaIntent(result.items)) result.items = { ...result.items, type: \"string\" }\n }\n\n if (typeof result.type === \"string\" && result.type !== \"object\" && !hasCombiner(result)) {\n delete result.properties\n delete result.required\n }\n\n return result\n}\n\nconst emptyObjectSchema = (schema: Record<string, unknown>) =>\n schema.type === \"object\" &&\n (!isRecord(schema.properties) || Object.keys(schema.properties).length === 0) &&\n !schema.additionalProperties\n\nconst projectNode = (schema: unknown): Record<string, unknown> | undefined => {\n if (!isRecord(schema)) return undefined\n if (emptyObjectSchema(schema)) return undefined\n return Object.fromEntries(\n [\n [\"description\", schema.description],\n [\"required\", schema.required],\n [\"format\", schema.format],\n [\"type\", Array.isArray(schema.type) ? schema.type.filter((type) => type !== \"null\")[0] : schema.type],\n [\"nullable\", Array.isArray(schema.type) && schema.type.includes(\"null\") ? true : undefined],\n [\"enum\", schema.const !== undefined ? [schema.const] : schema.enum],\n [\n \"properties\",\n isRecord(schema.properties)\n ? Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => [key, projectNode(value)]))\n : undefined,\n ],\n [\n \"items\",\n Array.isArray(schema.items)\n ? schema.items.map(projectNode)\n : schema.items === undefined\n ? undefined\n : projectNode(schema.items),\n ],\n [\"allOf\", Array.isArray(schema.allOf) ? schema.allOf.map(projectNode) : undefined],\n [\"anyOf\", Array.isArray(schema.anyOf) ? schema.anyOf.map(projectNode) : undefined],\n [\"oneOf\", Array.isArray(schema.oneOf) ? schema.oneOf.map(projectNode) : undefined],\n [\"minLength\", schema.minLength],\n ].filter((entry) => entry[1] !== undefined),\n )\n}\n\nexport const convert = (schema: unknown) => projectNode(sanitizeNode(schema))\n\nexport * as GeminiToolSchema from \"./gemini-tool-schema\"\n", | ||
| "import type { JsonSchema, ModelToolSchemaCompatibility } from \"../../schema\"\nimport { isRecord } from \"../../utils/record\"\nimport { GeminiToolSchema } from \"./gemini-tool-schema\"\n\nconst removeNullSchemas = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(removeNullSchemas)\n if (!isRecord(value)) return value\n const fields = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"anyOf\")\n .map(([key, field]) => [key, removeNullSchemas(field)]),\n )\n if (!Array.isArray(value.anyOf)) return fields\n const variants = value.anyOf.filter((variant) => !isRecord(variant) || variant.type !== \"null\").map(removeNullSchemas)\n if (variants.length === 1 && isRecord(variants[0])) return { ...fields, ...variants[0] }\n return { ...fields, anyOf: variants }\n}\n\nconst tupleItemsSchema = (items: ReadonlyArray<unknown>) => {\n const projected = items.map(moonshotNode)\n if (projected.length === 0) return {}\n if (projected.length === 1) return projected[0]\n return { anyOf: projected }\n}\n\nconst moonshotNode = (schema: unknown): unknown => {\n if (Array.isArray(schema)) return schema.map(moonshotNode)\n if (!isRecord(schema)) return schema\n if (typeof schema.$ref === \"string\") return { $ref: schema.$ref }\n return Object.fromEntries(\n Object.entries(schema).flatMap(([key, value]) => {\n if (key === \"items\" && Array.isArray(value)) return [[key, tupleItemsSchema(value)]]\n if (key === \"prefixItems\") {\n if (\"items\" in schema) return []\n return [[\"items\", tupleItemsSchema(Array.isArray(value) ? value : [])]]\n }\n if (key === \"unevaluatedItems\") return []\n return [[key, moonshotNode(value)]]\n }),\n )\n}\n\nconst moonshot = (schema: JsonSchema): JsonSchema => {\n const projected = moonshotNode(schema)\n return isRecord(projected) ? projected : {}\n}\n\nconst openAI = (schema: JsonSchema): JsonSchema => {\n const variants = Array.isArray(schema.anyOf) ? schema.anyOf.filter(isRecord) : []\n const flattened =\n variants.length === 0\n ? { ...schema, type: \"object\" }\n : {\n ...Object.fromEntries(Object.entries(schema).filter(([key]) => key !== \"anyOf\")),\n type: \"object\",\n properties: variants.reduce(\n (properties, variant) => ({ ...(isRecord(variant.properties) ? variant.properties : {}), ...properties }),\n {},\n ),\n additionalProperties: false,\n }\n const normalized = removeNullSchemas(flattened)\n return isRecord(normalized) ? normalized : { type: \"object\" }\n}\n\nconst gemini = (schema: JsonSchema): JsonSchema => GeminiToolSchema.convert(schema) ?? {}\n\nconst modelCompatibility = (\n schema: JsonSchema,\n compatibility: ModelToolSchemaCompatibility | undefined,\n): JsonSchema => {\n if (compatibility === undefined) return schema\n switch (compatibility) {\n case \"gemini\":\n return gemini(schema)\n case \"moonshot\":\n return moonshot(schema)\n }\n}\n\nexport const ToolSchemaProjection = {\n gemini,\n modelCompatibility,\n moonshot,\n openAI,\n} as const\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "98944D441651726964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/isexe@2.0.0/node_modules/isexe/windows.js", "../../node_modules/.bun/isexe@2.0.0/node_modules/isexe/mode.js", "../../node_modules/.bun/isexe@2.0.0/node_modules/isexe/index.js", "../../node_modules/.bun/which@2.0.2/node_modules/which/which.js", "../../node_modules/.bun/path-key@3.1.1/node_modules/path-key/index.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/resolveCommand.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/escape.js", "../../node_modules/.bun/shebang-regex@3.0.0/node_modules/shebang-regex/index.js", "../../node_modules/.bun/shebang-command@2.0.0/node_modules/shebang-command/index.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/util/readShebang.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/parse.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/lib/enoent.js", "../../node_modules/.bun/cross-spawn@7.0.6/node_modules/cross-spawn/index.js"], | ||
| "sourcesContent": [ | ||
| "module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction checkPathExt (path, options) {\n var pathext = options.pathExt !== undefined ?\n options.pathExt : process.env.PATHEXT\n\n if (!pathext) {\n return true\n }\n\n pathext = pathext.split(';')\n if (pathext.indexOf('') !== -1) {\n return true\n }\n for (var i = 0; i < pathext.length; i++) {\n var p = pathext[i].toLowerCase()\n if (p && path.substr(-p.length).toLowerCase() === p) {\n return true\n }\n }\n return false\n}\n\nfunction checkStat (stat, path, options) {\n if (!stat.isSymbolicLink() && !stat.isFile()) {\n return false\n }\n return checkPathExt(path, options)\n}\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, path, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), path, options)\n}\n", | ||
| "module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), options)\n}\n\nfunction checkStat (stat, options) {\n return stat.isFile() && checkMode(stat, options)\n}\n\nfunction checkMode (stat, options) {\n var mod = stat.mode\n var uid = stat.uid\n var gid = stat.gid\n\n var myUid = options.uid !== undefined ?\n options.uid : process.getuid && process.getuid()\n var myGid = options.gid !== undefined ?\n options.gid : process.getgid && process.getgid()\n\n var u = parseInt('100', 8)\n var g = parseInt('010', 8)\n var o = parseInt('001', 8)\n var ug = u | g\n\n var ret = (mod & o) ||\n (mod & g) && gid === myGid ||\n (mod & u) && uid === myUid ||\n (mod & ug) && myUid === 0\n\n return ret\n}\n", | ||
| "var fs = require('fs')\nvar core\nif (process.platform === 'win32' || global.TESTING_WINDOWS) {\n core = require('./windows.js')\n} else {\n core = require('./mode.js')\n}\n\nmodule.exports = isexe\nisexe.sync = sync\n\nfunction isexe (path, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = {}\n }\n\n if (!cb) {\n if (typeof Promise !== 'function') {\n throw new TypeError('callback not provided')\n }\n\n return new Promise(function (resolve, reject) {\n isexe(path, options || {}, function (er, is) {\n if (er) {\n reject(er)\n } else {\n resolve(is)\n }\n })\n })\n }\n\n core(path, options || {}, function (er, is) {\n // ignore EACCES because that just means we aren't allowed to run it\n if (er) {\n if (er.code === 'EACCES' || options && options.ignoreErrors) {\n er = null\n is = false\n }\n }\n cb(er, is)\n })\n}\n\nfunction sync (path, options) {\n // my kingdom for a filtered catch\n try {\n return core.sync(path, options || {})\n } catch (er) {\n if (options && options.ignoreErrors || er.code === 'EACCES') {\n return false\n } else {\n throw er\n }\n }\n}\n", | ||
| "const isWindows = process.platform === 'win32' ||\n process.env.OSTYPE === 'cygwin' ||\n process.env.OSTYPE === 'msys'\n\nconst path = require('path')\nconst COLON = isWindows ? ';' : ':'\nconst isexe = require('isexe')\n\nconst getNotFoundError = (cmd) =>\n Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })\n\nconst getPathInfo = (cmd, opt) => {\n const colon = opt.colon || COLON\n\n // If it has a slash, then we don't bother searching the pathenv.\n // just check the file itself, and that's it.\n const pathEnv = cmd.match(/\\//) || isWindows && cmd.match(/\\\\/) ? ['']\n : (\n [\n // windows always checks the cwd first\n ...(isWindows ? [process.cwd()] : []),\n ...(opt.path || process.env.PATH ||\n /* istanbul ignore next: very unusual */ '').split(colon),\n ]\n )\n const pathExtExe = isWindows\n ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'\n : ''\n const pathExt = isWindows ? pathExtExe.split(colon) : ['']\n\n if (isWindows) {\n if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')\n pathExt.unshift('')\n }\n\n return {\n pathEnv,\n pathExt,\n pathExtExe,\n }\n}\n\nconst which = (cmd, opt, cb) => {\n if (typeof opt === 'function') {\n cb = opt\n opt = {}\n }\n if (!opt)\n opt = {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n const step = i => new Promise((resolve, reject) => {\n if (i === pathEnv.length)\n return opt.all && found.length ? resolve(found)\n : reject(getNotFoundError(cmd))\n\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n resolve(subStep(p, i, 0))\n })\n\n const subStep = (p, i, ii) => new Promise((resolve, reject) => {\n if (ii === pathExt.length)\n return resolve(step(i + 1))\n const ext = pathExt[ii]\n isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {\n if (!er && is) {\n if (opt.all)\n found.push(p + ext)\n else\n return resolve(p + ext)\n }\n return resolve(subStep(p, i, ii + 1))\n })\n })\n\n return cb ? step(0).then(res => cb(null, res), cb) : step(0)\n}\n\nconst whichSync = (cmd, opt) => {\n opt = opt || {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n for (let i = 0; i < pathEnv.length; i ++) {\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n for (let j = 0; j < pathExt.length; j ++) {\n const cur = p + pathExt[j]\n try {\n const is = isexe.sync(cur, { pathExt: pathExtExe })\n if (is) {\n if (opt.all)\n found.push(cur)\n else\n return cur\n }\n } catch (ex) {}\n }\n }\n\n if (opt.all && found.length)\n return found\n\n if (opt.nothrow)\n return null\n\n throw getNotFoundError(cmd)\n}\n\nmodule.exports = which\nwhich.sync = whichSync\n", | ||
| "'use strict';\n\nconst pathKey = (options = {}) => {\n\tconst environment = options.env || process.env;\n\tconst platform = options.platform || process.platform;\n\n\tif (platform !== 'win32') {\n\t\treturn 'PATH';\n\t}\n\n\treturn Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path';\n};\n\nmodule.exports = pathKey;\n// TODO: Remove this for the next major release\nmodule.exports.default = pathKey;\n", | ||
| "'use strict';\n\nconst path = require('path');\nconst which = require('which');\nconst getPathKey = require('path-key');\n\nfunction resolveCommandAttempt(parsed, withoutPathExt) {\n const env = parsed.options.env || process.env;\n const cwd = process.cwd();\n const hasCustomCwd = parsed.options.cwd != null;\n // Worker threads do not have process.chdir()\n const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled;\n\n // If a custom `cwd` was specified, we need to change the process cwd\n // because `which` will do stat calls but does not support a custom cwd\n if (shouldSwitchCwd) {\n try {\n process.chdir(parsed.options.cwd);\n } catch (err) {\n /* Empty */\n }\n }\n\n let resolved;\n\n try {\n resolved = which.sync(parsed.command, {\n path: env[getPathKey({ env })],\n pathExt: withoutPathExt ? path.delimiter : undefined,\n });\n } catch (e) {\n /* Empty */\n } finally {\n if (shouldSwitchCwd) {\n process.chdir(cwd);\n }\n }\n\n // If we successfully resolved, ensure that an absolute path is returned\n // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it\n if (resolved) {\n resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);\n }\n\n return resolved;\n}\n\nfunction resolveCommand(parsed) {\n return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);\n}\n\nmodule.exports = resolveCommand;\n", | ||
| "'use strict';\n\n// See http://www.robvanderwoude.com/escapechars.php\nconst metaCharsRegExp = /([()\\][%!^\"`<>&|;, *?])/g;\n\nfunction escapeCommand(arg) {\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n return arg;\n}\n\nfunction escapeArgument(arg, doubleEscapeMetaChars) {\n // Convert to string\n arg = `${arg}`;\n\n // Algorithm below is based on https://qntm.org/cmd\n // It's slightly altered to disable JS backtracking to avoid hanging on specially crafted input\n // Please see https://github.com/moxystudio/node-cross-spawn/pull/160 for more information\n\n // Sequence of backslashes followed by a double quote:\n // double up all the backslashes and escape the double quote\n arg = arg.replace(/(?=(\\\\+?)?)\\1\"/g, '$1$1\\\\\"');\n\n // Sequence of backslashes followed by the end of the string\n // (which will become a double quote later):\n // double up all the backslashes\n arg = arg.replace(/(?=(\\\\+?)?)\\1$/, '$1$1');\n\n // All other backslashes occur literally\n\n // Quote the whole thing:\n arg = `\"${arg}\"`;\n\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n // Double escape meta chars if necessary\n if (doubleEscapeMetaChars) {\n arg = arg.replace(metaCharsRegExp, '^$1');\n }\n\n return arg;\n}\n\nmodule.exports.command = escapeCommand;\nmodule.exports.argument = escapeArgument;\n", | ||
| "'use strict';\nmodule.exports = /^#!(.*)/;\n", | ||
| "'use strict';\nconst shebangRegex = require('shebang-regex');\n\nmodule.exports = (string = '') => {\n\tconst match = string.match(shebangRegex);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tconst [path, argument] = match[0].replace(/#! ?/, '').split(' ');\n\tconst binary = path.split('/').pop();\n\n\tif (binary === 'env') {\n\t\treturn argument;\n\t}\n\n\treturn argument ? `${binary} ${argument}` : binary;\n};\n", | ||
| "'use strict';\n\nconst fs = require('fs');\nconst shebangCommand = require('shebang-command');\n\nfunction readShebang(command) {\n // Read the first 150 bytes from the file\n const size = 150;\n const buffer = Buffer.alloc(size);\n\n let fd;\n\n try {\n fd = fs.openSync(command, 'r');\n fs.readSync(fd, buffer, 0, size, 0);\n fs.closeSync(fd);\n } catch (e) { /* Empty */ }\n\n // Attempt to extract shebang (null is returned if not a shebang)\n return shebangCommand(buffer.toString());\n}\n\nmodule.exports = readShebang;\n", | ||
| "'use strict';\n\nconst path = require('path');\nconst resolveCommand = require('./util/resolveCommand');\nconst escape = require('./util/escape');\nconst readShebang = require('./util/readShebang');\n\nconst isWin = process.platform === 'win32';\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\nfunction detectShebang(parsed) {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed) {\n if (!isWin) {\n return parsed;\n }\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile);\n\n // If a shell is required, use cmd.exe and take care of escaping everything correctly\n // Note that `forceShell` is an hidden option used only in tests\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`\n // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument\n // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,\n // we need to double escape them\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);\n\n // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\\bar)\n // This is necessary otherwise it will always fail with ENOENT in those cases\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escape.command(parsed.command);\n parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped\n }\n\n return parsed;\n}\n\nfunction parse(command, args, options) {\n // Normalize arguments, similar to nodejs\n if (args && !Array.isArray(args)) {\n options = args;\n args = null;\n }\n\n args = args ? args.slice(0) : []; // Clone array to avoid changing the original\n options = Object.assign({}, options); // Clone object to avoid changing the original\n\n // Build our parsed object\n const parsed = {\n command,\n args,\n options,\n file: undefined,\n original: {\n command,\n args,\n },\n };\n\n // Delegate further parsing to shell or non-shell\n return options.shell ? parsed : parseNonShell(parsed);\n}\n\nmodule.exports = parse;\n", | ||
| "'use strict';\n\nconst isWin = process.platform === 'win32';\n\nfunction notFoundError(original, syscall) {\n return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {\n code: 'ENOENT',\n errno: 'ENOENT',\n syscall: `${syscall} ${original.command}`,\n path: original.command,\n spawnargs: original.args,\n });\n}\n\nfunction hookChildProcess(cp, parsed) {\n if (!isWin) {\n return;\n }\n\n const originalEmit = cp.emit;\n\n cp.emit = function (name, arg1) {\n // If emitting \"exit\" event and exit code is 1, we need to check if\n // the command exists and emit an \"error\" instead\n // See https://github.com/IndigoUnited/node-cross-spawn/issues/16\n if (name === 'exit') {\n const err = verifyENOENT(arg1, parsed);\n\n if (err) {\n return originalEmit.call(cp, 'error', err);\n }\n }\n\n return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params\n };\n}\n\nfunction verifyENOENT(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawn');\n }\n\n return null;\n}\n\nfunction verifyENOENTSync(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawnSync');\n }\n\n return null;\n}\n\nmodule.exports = {\n hookChildProcess,\n verifyENOENT,\n verifyENOENTSync,\n notFoundError,\n};\n", | ||
| "'use strict';\n\nconst cp = require('child_process');\nconst parse = require('./lib/parse');\nconst enoent = require('./lib/enoent');\n\nfunction spawn(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);\n\n // Hook into child process \"exit\" event to emit an error if the command\n // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n enoent.hookChildProcess(spawned, parsed);\n\n return spawned;\n}\n\nfunction spawnSync(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);\n\n // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);\n\n return result;\n}\n\nmodule.exports = spawn;\nmodule.exports.spawn = spawn;\nmodule.exports.sync = spawnSync;\n\nmodule.exports._parse = parse;\nmodule.exports._enoent = enoent;\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "EACB0DDFF5D2094D64756E2164756E21", | ||
| "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": "DBC48E4E8CC0DEDB64756E2164756E21", | ||
| "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": "C8933FC7C2EE390D64756E2164756E21", | ||
| "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": "38B3701874E8629764756E2164756E21", | ||
| "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": "2D6FCCAAADDC321164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/start.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,WAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "D62E26ED08896BA064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"], | ||
| "sourcesContent": [ | ||
| "// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n", | ||
| "import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";i4BAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,OAAK,yBAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "DF2CE38034FD532064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";o2BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,EAChD,CACH", | ||
| "debugId": "56067E2425DCF85764756E2164756E21", | ||
| "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": "DE615A60EE9BB2D064756E2164756E21", | ||
| "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": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C812B28B6854912F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "617F5451D05A50E464756E2164756E21", | ||
| "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": "730F8EB39B96A32F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({ server: serverURL, standalone: input.standalone })\n const config = yield* Config.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n tuiConfig: resolved,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ogCAOA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EAC5F,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,KACZ,UAAW,CACb,CAAC,CACH,EACD,CACH", | ||
| "debugId": "43EB2D782450D9CA64756E2164756E21", | ||
| "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": "C773207BF06F343C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,OAAO,CAC9C,QAAQ,OAAO,MAAM,gBAAkB,EAAM,CAAG,EAChD,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC1F,MAAO,EAAQ,IAAM,EAAO,YAAY,UAAU,IAAI,CAAE,IAAK,EAAM,IAAK,UAAS,CAAC,CAAC,EACnF,IAAM,EAAgB,EAAM,IAAI,QAAQ,OAAQ,EAAE,EAC5C,EAAU,MAAO,EAAQ,IAC7B,EAAO,YAAY,QAAQ,QAAQ,CAAE,gBAAe,SAAU,QAAS,UAAS,CAAC,CACnF,EACA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,UAAW,EAAQ,KAAK,UAAW,UAAS,CAAC,CAClG,EAAE,KAAK,EAAO,MAAM,CACtB,EAEA,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAe,EAAQ,KAAK,SAAS,EACxE,GAAI,EAAO,SAAW,SAAU,OAAO,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EACnF,GAAI,EAAO,SAAW,UAAW,OAAO,MAAO,EAAO,KAAS,MAAM,wBAAwB,CAAC,EAC9F,QAAQ,OAAO,MAAM,YAAc,CAAG,EACvC,CACH,EAEM,EAAO,CACX,EACA,EACA,EACA,EAAQ,KAER,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CAAC,EAC/G,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,IAAM,EAAS,EAAS,KAAK,SAAS,KAAK,EAC3C,GAAI,CAAC,GAAS,EAAQ,QAAQ,OAAO,MAAM,EAAS,EAAM,CAAG,EAE7D,OADA,MAAO,EAAO,MAAM,GAAG,EAChB,MAAO,EAAK,EAAQ,EAAe,EAAW,GAAS,CAAC,CAAC,CAAM,EACvE,EAEH,SAAS,CAAU,CAAC,EAAwB,CAC1C,OAAO,EAAO,WAAW,CAAE,IAAK,EAAM,MAAO,CAAC,IAAU,CAAM,CAAC", | ||
| "debugId": "1CB821DBAE99EE7F64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderOptions, ReasoningEffort, TextVerbosity } from \"../schema\"\nimport { mergeProviderOptions } from \"../schema\"\nimport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options\"\n\nexport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options\"\n\nexport interface OpenAIOptionsInput {\n readonly [key: string]: unknown\n readonly store?: boolean\n readonly promptCacheKey?: string\n readonly reasoningEffort?: ReasoningEffort\n readonly reasoningSummary?: \"auto\"\n // OpenAI Responses `include` wire field. Mirrors the official SDK's\n // `ResponseIncludable[]` union exactly so AI SDK callers and direct\n // native-SDK callers share one shape and no translation is required.\n readonly include?: ReadonlyArray<OpenAIResponseIncludable>\n readonly textVerbosity?: TextVerbosity\n readonly serviceTier?: OpenAIServiceTier\n}\n\nexport type OpenAIProviderOptionsInput = ProviderOptions & {\n readonly openai?: OpenAIOptionsInput\n}\n\nconst definedEntries = (input: Record<string, unknown>) =>\n Object.entries(input).filter((entry) => entry[1] !== undefined)\n\nconst openAIProviderOptions = (options: OpenAIOptionsInput | undefined): ProviderOptions | undefined => {\n const openai = Object.fromEntries(\n definedEntries({\n store: options?.store,\n promptCacheKey: options?.promptCacheKey,\n reasoningEffort: options?.reasoningEffort,\n reasoningSummary: options?.reasoningSummary,\n include: options?.include,\n textVerbosity: options?.textVerbosity,\n serviceTier: options?.serviceTier,\n }),\n )\n if (Object.keys(openai).length === 0) return undefined\n return { openai }\n}\n\nexport const gpt5DefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined => {\n const id = modelID.toLowerCase()\n if (!id.includes(\"gpt-5\") || id.includes(\"gpt-5-chat\") || id.includes(\"gpt-5-pro\")) return undefined\n return openAIProviderOptions({\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n // GPT-5 reasoning models are configured stateless (`store: false`) by\n // `openAIDefaultOptions` below, so the only way a follow-up turn can\n // carry reasoning state is via the encrypted reasoning include. Without\n // this, callers using the default model facade get reasoning summaries\n // they cannot replay statelessly.\n include: [\"reasoning.encrypted_content\"],\n textVerbosity:\n options.textVerbosity === true && id.includes(\"gpt-5.\") && !id.includes(\"codex\") && !id.includes(\"-chat\")\n ? \"low\"\n : undefined,\n })\n}\n\nexport const openAIDefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined =>\n mergeProviderOptions(openAIProviderOptions({ store: false }), gpt5DefaultOptions(modelID, options))\n\nexport const withOpenAIOptions = <Options extends { readonly providerOptions?: OpenAIProviderOptionsInput }>(\n modelID: string,\n options: Options,\n defaults: { readonly textVerbosity?: boolean } = {},\n): Omit<Options, \"providerOptions\"> & { readonly providerOptions?: ProviderOptions } => {\n return {\n ...options,\n providerOptions: mergeProviderOptions(openAIDefaultOptions(modelID, defaults), options.providerOptions),\n }\n}\n\nexport * as OpenAIProviderOptions from \"./openai-options\"\n" | ||
| ], | ||
| "mappings": ";oDAwBA,IAAM,EAAiB,CAAC,IACtB,OAAO,QAAQ,CAAK,EAAE,OAAO,CAAC,IAAU,EAAM,KAAO,MAAS,EAE1D,EAAwB,CAAC,IAAyE,CACtG,IAAM,EAAS,OAAO,YACpB,EAAe,CACb,MAAO,GAAS,MAChB,eAAgB,GAAS,eACzB,gBAAiB,GAAS,gBAC1B,iBAAkB,GAAS,iBAC3B,QAAS,GAAS,QAClB,cAAe,GAAS,cACxB,YAAa,GAAS,WACxB,CAAC,CACH,EACA,GAAI,OAAO,KAAK,CAAM,EAAE,SAAW,EAAG,OACtC,MAAO,CAAE,QAAO,GAGL,EAAqB,CAChC,EACA,EAAgD,CAAC,IACjB,CAChC,IAAM,EAAK,EAAQ,YAAY,EAC/B,GAAI,CAAC,EAAG,SAAS,OAAO,GAAK,EAAG,SAAS,YAAY,GAAK,EAAG,SAAS,WAAW,EAAG,OACpF,OAAO,EAAsB,CAC3B,gBAAiB,SACjB,iBAAkB,OAMlB,QAAS,CAAC,6BAA6B,EACvC,cACE,EAAQ,gBAAkB,IAAQ,EAAG,SAAS,QAAQ,GAAK,CAAC,EAAG,SAAS,OAAO,GAAK,CAAC,EAAG,SAAS,OAAO,EACpG,MACA,MACR,CAAC,GAGU,EAAuB,CAClC,EACA,EAAgD,CAAC,IAEjD,EAAqB,EAAsB,CAAE,MAAO,EAAM,CAAC,EAAG,EAAmB,EAAS,CAAO,CAAC,EAEvF,EAAoB,CAC/B,EACA,EACA,EAAiD,CAAC,IACoC,CACtF,MAAO,IACF,EACH,gBAAiB,EAAqB,EAAqB,EAAS,CAAQ,EAAG,EAAQ,eAAe,CACxG", | ||
| "debugId": "B989275C75A2AA3E64756E2164756E21", | ||
| "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": ["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}\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 })\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 { Flag } from \"@opencode-ai/core/flag/flag\"\nimport { Global } from \"@opencode-ai/core/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: Flag.OPENCODE_SHOW_TTFD,\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "B9297702989D761C64756E2164756E21", | ||
| "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": "9C8064C7F02365B964756E2164756E21", | ||
| "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/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": "3C6CA99F3EC5086A64756E2164756E21", | ||
| "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": ["src/commands/handlers/debug/agents.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "FBD5446154631FCB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/standalone.ts", "src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Deferred, Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport { selfCommand } from \"../util/process\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const [executable, ...args] = options.command ?? [...selfCommand(), \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const readyLine = yield* Deferred.make<string, Error>()\n // Keep draining stdout after readiness so later server writes cannot hit EPIPE.\n yield* proc.stdout.pipe(\n Stream.decodeText(),\n Stream.splitLines,\n Stream.runForEach((line) => Deferred.succeed(readyLine, line)),\n Effect.ensuring(Deferred.fail(readyLine, new Error(\"Standalone server exited before reporting readiness\"))),\n Effect.forkScoped,\n )\n const output = yield* Deferred.await(readyLine)\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Endpoint & { readonly pid: number }\n },\n Effect.provide(LayerNode.compile(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n", | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0D9B2C1D7B66B84464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { waitForCatalogReady } from \"../services/catalog\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n prepare: async (next) => {\n const selected =\n next.model ??\n (await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data))\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n if (model) {\n await waitForCatalogReady({\n sdk: client,\n directory: next.location.directory,\n workspace: next.location.workspaceID,\n model: { providerID: model.providerID, modelID: model.id },\n })\n const available = await client.model.list({\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.id))\n throw new RunTargetError(`Model unavailable: ${model.providerID}/${model.id}`, next.session?.id)\n }\n return {\n model,\n agent: input.agent\n ? await validateAgent(client, next.location.directory, next.location.workspaceID, input.agent)\n : next.agent,\n }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, workspace: string | undefined, name?: string) {\n if (!name) return\n const agents = await client.agent\n .list({ location: { directory, workspace } })\n .then((result) => result.data)\n .catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction errorMessage(error: unknown) {\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\")\n return error.message\n return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LLMToolContent,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n structured: Record<string, JsonValue>\n content: LLMToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.callID), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n structured: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.callID))\n if (current) {\n current.structured = event.data.structured\n current.content = event.data.content\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.callID)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.callID,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n error: event.data.error,\n result: event.data.result,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (toolOutputText(current.tool, current.content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n structured: current.structured,\n content: current.content,\n result: event.data.result,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (\n input.compatibility === \"v1\" &&\n event.data.error.message === \"Provider stream ended without a terminal finish event\"\n ) {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, callID: string) {\n return `${messageID}\\u0000${callID}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n structured: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "DE7CD11D9276CF0E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "EB340A0043CB5A3464756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": ";shBAWO,SAAM,OAAmC,OAAS,gBAC5C,OAAK,OAAW,UAAK,OAAQ,aAAQ,OAC5C,OAAU,aAmBV,EAAiB,EAAO,eAAe,EAAO,OAAkB,CAAU,EAAG,CACjF,EAAO,OAAO,EAAO,OAAQ,EAAO,GAAG,CACzC,CAAC,EAGY,EAAW,EAAS,KAAK,CACpC,GAAI,kBACJ,KAAM,CACJ,OAAQ,EACR,KAAM,CAAC,IACM,EAAS,KAAK,KAAK,CAAO,EAAE,KACrC,EAAO,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": "DC6E9963A137AF7964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "432D22233CD650BF64756E2164756E21", | ||
| "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": "7D014CB044DA3C3864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";g6BAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzE,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,oBAAsB,CAAG,EAC9C,OAEF,QAAQ,OAAO,MAAM,EAAQ,IAAI,CAAC,IAAW,EAAO,EAAE,EAAE,KAAK,CAAG,EAAI,CAAG,EACxE,CACH", | ||
| "debugId": "D170785B34A3495264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/anthropic-compatible.ts", "../ai/src/providers/anthropic.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { ProviderID, type ModelID } from \"../schema\"\n\nexport const id = ProviderID.make(\"anthropic-compatible\")\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL: string\n readonly provider?: string\n }\n\nexport const routes = [AnthropicMessages.route]\n\nconst auth = (input: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\").pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config) => {\n if (!input.baseURL) throw new Error(\"Anthropic-compatible providers require a baseURL\")\n const provider = input.provider ?? \"anthropic-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = AnthropicMessages.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: auth(input),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic-compatible apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n}\n\nexport * as AnthropicCompatible from \"./anthropic-compatible\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client\"\nimport { Auth } from \"../route/auth\"\nimport type { ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { ProviderID, type ModelID } from \"../schema\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages\"\nimport { AnthropicCompatible } from \"./anthropic-compatible\"\n\nexport const id = ProviderID.make(\"anthropic\")\n\nexport const routes = [AnthropicMessages.route]\n\nexport type Config = RouteDefaultsInput & ProviderAuthOption<\"optional\"> & { readonly baseURL?: string }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL?: string\n }\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"ANTHROPIC_API_KEY\"))\n .pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config = {}) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n const compatible = AnthropicCompatible.configure({\n ...rest,\n auth: auth(input),\n baseURL: baseURL ?? AnthropicMessages.DEFAULT_BASE_URL,\n provider: id,\n })\n return {\n id,\n model: (modelID: string | ModelID) => compatible.model(modelID),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";qhBAOO,SAAM,OAAK,OAAW,UAAK,2BAAsB,OAiB3C,OAAS,MAAC,OAAkB,UAAK,EAExC,EAAO,CAAC,IAA0C,CACtD,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EAAE,KAAK,EAAK,OAAO,WAAW,CAAC,GAG/F,EAAY,CAAC,IAAkB,CAC1C,GAAI,CAAC,EAAM,QAAS,MAAU,MAAM,kDAAkD,EACtF,IAAM,EAAW,EAAM,UAAY,wBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAAQ,EAAkB,MAAM,KAAK,IACtC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAK,CAAK,CAClB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,CAAQ,CAAC,EACjE,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,+DAA+D,EACjF,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,GCvDX,IAAM,EAAK,EAAW,KAAK,WAAW,EAEhC,EAAS,CAAC,EAAkB,KAAK,EAYxC,EAAO,CAAC,IAA4C,CACxD,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAO,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,EAC5E,OAAO,EAAK,OAAO,mBAAmB,CAAC,EACvC,KAAK,EAAK,OAAO,WAAW,CAAC,GAGrB,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EAC/C,EAAa,EAAoB,UAAU,IAC5C,EACH,KAAM,EAAK,CAAK,EAChB,QAAS,GAAW,EAAkB,iBACtC,SAAU,CACZ,CAAC,EACD,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAW,MAAM,CAAO,EAC9D,WACF,GAGW,EAAW,EAAU,EACrB,EAAuD,CAAC,EAAS,IAAa,CACzF,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,oDAAoD,EACtE,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,MACnB,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "A6B2ED902E8D7B7064756E2164756E21", | ||
| "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 queue up\n// here. The queue drains one turn at a time; ordinary prompts waiting behind\n// an active ordinary turn are exposed for edit/removal until they begin.\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, FooterQueuedPrompt, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype Deferred<T = void> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (error?: unknown) => void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt) => void\n onNewSession?: () => void | Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n queued: FooterQueuedPrompt[]\n active?: RunPrompt\n ctrl?: AbortController\n closed: boolean\n}\n\nfunction defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (error?: unknown) => void\n const promise = new Promise<T>((next, fail) => {\n resolve = next\n reject = fail\n })\n\n return { promise, resolve, reject }\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 remain local and\n// are exposed by the footer for edit/removal until their turn begins.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = defer<{ type: \"closed\" }>()\n const done = defer()\n const state: State = {\n queue: [],\n queued: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\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 syncQueue = () => {\n const queue = state.queue.length\n emit({ type: \"queue\", queue }, { queue })\n emit(\n {\n type: \"queued.prompts\",\n prompts: [...state.queued],\n },\n { queued: state.queued.length },\n )\n }\n\n const removeLocalQueued = (queued: FooterQueuedPrompt) => {\n if (!state.queued.includes(queued)) return\n state.queued = state.queued.filter((item) => item !== queued)\n syncQueue()\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.queued.length = 0\n state.ctrl?.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 const queued = state.queued.find((item) => item.prompt === prompt)\n if (queued) removeLocalQueued(queued)\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n syncQueue()\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 queue: state.queue.length,\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\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 ?? queued?.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n {\n type: \"turn.send\",\n queue: state.queue.length,\n },\n {\n phase: \"running\",\n status: \"sending prompt\",\n queue: state.queue.length,\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n state.ctrl = ctrl\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)\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal).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 } finally {\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\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 {\n type: \"turn.idle\",\n queue: state.queue.length,\n },\n {\n phase: \"idle\",\n status: \"\",\n queue: state.queue.length,\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 !active.command &&\n prompt.mode !== \"shell\" &&\n !prompt.command &&\n !isNewCommand(prompt.text)\n ) {\n const queued: FooterQueuedPrompt = {\n messageID: SessionMessage.ID.create(),\n prompt,\n }\n state.queued = [...state.queued, queued]\n state.queue.push(prompt)\n syncQueue()\n return\n }\n\n state.queue.push(prompt)\n syncQueue()\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 const offRemoveQueued = input.footer.onQueuedRemove((messageID) => {\n const queued = state.queued.find((item) => item.messageID === messageID)\n if (!queued) return false\n state.queue = state.queue.filter((prompt) => prompt !== queued.prompt)\n removeLocalQueued(queued)\n return true\n })\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 offRemoveQueued()\n close()\n await draining?.catch(() => {})\n }\n}\n" | ||
| ], | ||
| "mappings": ";wYA0CA,cAAS,MAAe,OAAgB,MACtC,SAAI,OACA,OAMJ,WAAO,MAAE,QALO,IAAI,QAAW,CAAC,EAAM,IAAS,CAC7C,EAAU,EACV,EAAS,EACV,EAEiB,UAAS,QAAO,EAQpC,eAAsB,CAAc,CAAC,EAAkC,CACrE,IAAM,EAAO,EAA0B,EACjC,EAAO,EAAM,EACb,EAAe,CACnB,MAAO,CAAC,EACR,OAAQ,CAAC,EACT,OAAQ,EAAM,OAAO,QACvB,EACI,EAEE,EAAO,CAAC,EAAmB,IAAiC,CAChE,EAAM,OAAO,MAAM,WAAY,CAAG,EAClC,EAAM,OAAO,MAAM,CAAI,GAGnB,EAAY,IAAM,CACtB,IAAM,EAAQ,EAAM,MAAM,OAC1B,EAAK,CAAE,KAAM,QAAS,OAAM,EAAG,CAAE,OAAM,CAAC,EACxC,EACE,CACE,KAAM,iBACN,QAAS,CAAC,GAAG,EAAM,MAAM,CAC3B,EACA,CAAE,OAAQ,EAAM,OAAO,MAAO,CAChC,GAGI,EAAoB,CAAC,IAA+B,CACxD,GAAI,CAAC,EAAM,OAAO,SAAS,CAAM,EAAG,OACpC,EAAM,OAAS,EAAM,OAAO,OAAO,CAAC,IAAS,IAAS,CAAM,EAC5D,EAAU,GAGN,EAAS,IAAM,CACnB,GAAI,CAAC,EAAM,QAAU,EACnB,OAGF,EAAK,QAAQ,GAGT,EAAQ,IAAM,CAClB,GAAI,EAAM,OACR,OAGF,EAAM,OAAS,GACf,EAAM,MAAM,OAAS,EACrB,EAAM,OAAO,OAAS,EACtB,EAAM,MAAM,MAAM,EAClB,EAAK,QAAQ,CAAE,KAAM,QAAS,CAAC,EAC/B,EAAO,GAGH,EAAQ,IAAM,CAClB,GAAI,GAAY,EAAM,QAAU,EAAM,MAAM,SAAW,EACrD,OAGF,GAAY,SAAY,CACtB,GAAI,CACF,MAAO,CAAC,EAAM,QAAU,EAAM,MAAM,OAAS,EAAG,CAC9C,IAAM,EAAS,EAAM,MAAM,MAAM,EACjC,GAAI,CAAC,EACH,SAGF,IAAM,EAAS,EAAM,OAAO,KAAK,CAAC,IAAS,EAAK,SAAW,CAAM,EACjE,GAAI,EAAQ,EAAkB,CAAM,EAEpC,GAAI,EAAO,OAAS,SAAW,EAAa,EAAO,IAAI,EAAG,CAExD,GADA,EAAU,EACN,CAAC,EAAM,aAAc,CACvB,EACE,CACE,KAAM,eACN,MAAO,CACL,OAAQ,0BACV,CACF,EACA,CACE,OAAQ,0BACV,CACF,EACA,SAGF,EACE,CACE,KAAM,eACN,MAAO,CACL,MAAO,UACP,OAAQ,uBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,CACE,MAAO,UACP,OAAQ,uBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,MAAM,EAAM,aAAa,EACzB,SAGF,IAAM,EACJ,EAAO,OAAS,QACZ,EACA,IACK,EACH,UAAW,EAAO,WAAa,GAAQ,WAAa,EAAe,GAAG,OAAO,CAC/E,EACN,EAAM,OAAS,EAEf,EACE,CACE,KAAM,YACN,MAAO,EAAM,MAAM,MACrB,EACA,CACE,MAAO,UACP,OAAQ,iBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,IAAM,EAAQ,KAAK,IAAI,EACjB,EAAO,IAAI,gBACjB,EAAM,KAAO,EAEb,GAAI,CAEF,GADA,MAAM,EAAM,OAAO,KAAK,EACpB,EAAM,OACR,MAGF,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EAAS,CACb,KAAM,OACN,KAAM,EAAK,KACX,MAAO,QACP,OAAQ,SACR,UAAW,EAAK,SAClB,EACA,EAAM,OAAO,MAAM,YAAa,CAAM,EACtC,EAAM,OAAO,OAAO,CAAM,EAI5B,GAFA,EAAM,SAAS,CAAI,EAEf,EAAM,OACR,MAGF,IAAM,EAAO,EAAM,IAAI,EAAM,EAAK,MAAM,EAAE,KACxC,KAAO,CAAE,KAAM,MAAgB,GAC/B,CAAC,KAAW,CAAE,KAAM,QAAkB,OAAM,EAC9C,EAEM,EAAO,MAAM,QAAQ,KAAK,CAAC,EAAM,EAAK,OAAO,CAAC,EACpD,GAAI,EAAK,OAAS,SAAU,CAC1B,EAAK,MAAM,EACX,MAGF,GAAI,EAAK,OAAS,QAChB,MAAM,EAAK,aAEb,CACA,GAAI,EAAM,OAAS,EACjB,EAAM,KAAO,OAGf,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EAAW,EAAO,SAAS,KAAK,IAAI,EAAG,KAAK,IAAI,EAAI,CAAK,CAAC,EAChE,EACE,CACE,KAAM,gBACN,UACF,EACA,CACE,UACF,CACF,EAEF,EAAM,OAAS,SAGnB,MAAO,EAAO,CACd,EAAK,OAAO,CAAK,EACjB,cACA,CACA,EAAW,OACX,EACE,CACE,KAAM,YACN,MAAO,EAAM,MAAM,MACrB,EACA,CACE,MAAO,OACP,OAAQ,GACR,MAAO,EAAM,MAAM,MACrB,CACF,EAGF,EAAO,IACN,GAGC,EAAS,CAAC,IAAsB,CACpC,GAAI,CAAC,EAAO,KAAK,KAAK,GAAK,EAAM,OAC/B,OAGF,GAAI,EAAO,OAAS,SAAW,EAAc,EAAO,IAAI,EAAG,CACzD,EAAM,OAAO,MAAM,EACnB,OAGF,IAAM,EAAS,EAAM,OACrB,GACE,GACA,EAAO,OAAS,SAChB,CAAC,EAAO,SACR,EAAO,OAAS,SAChB,CAAC,EAAO,SACR,CAAC,EAAa,EAAO,IAAI,EACzB,CACA,IAAM,EAA6B,CACjC,UAAW,EAAe,GAAG,OAAO,EACpC,QACF,EACA,EAAM,OAAS,CAAC,GAAG,EAAM,OAAQ,CAAM,EACvC,EAAM,MAAM,KAAK,CAAM,EACvB,EAAU,EACV,OAKF,GAFA,EAAM,MAAM,KAAK,CAAM,EACvB,EAAU,EACN,EAAO,OAAS,SAAW,EAAa,EAAO,IAAI,EAAG,CACxD,EAAM,EACN,OAGF,EACE,CACE,KAAM,QACN,MAAO,EACT,EACA,CACE,MAAO,EACT,CACF,EACA,EAAM,GAGF,EAAY,EAAM,OAAO,SAAS,CAAC,IAAW,CAClD,EAAO,CAAM,EACd,EACK,EAAW,EAAM,OAAO,QAAQ,IAAM,CAC1C,EAAM,EACP,EACK,EAAkB,EAAM,OAAO,eAAe,CAAC,IAAc,CACjE,IAAM,EAAS,EAAM,OAAO,KAAK,CAAC,IAAS,EAAK,YAAc,CAAS,EACvE,GAAI,CAAC,EAAQ,MAAO,GAGpB,OAFA,EAAM,MAAQ,EAAM,MAAM,OAAO,CAAC,IAAW,IAAW,EAAO,MAAM,EACrE,EAAkB,CAAM,EACjB,GACR,EAED,GAAI,CACF,GAAI,EAAM,OACR,OAGF,EAAO,CACL,KAAM,EAAM,cAAgB,GAC5B,MAAO,CAAC,CACV,CAAC,EACD,EAAO,EACP,MAAM,EAAK,eACX,CACA,EAAU,EACV,EAAS,EACT,EAAgB,EAChB,EAAM,EACN,MAAM,GAAU,MAAM,IAAM,EAAE", | ||
| "debugId": "4F679C2DA567CF7264756E2164756E21", | ||
| "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": "8AF790822ECD644664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write((yield* ServiceConfig.get(Option.getOrUndefined(input.key))) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";42BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "63ADFFCDE40D177964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/restart.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";i3BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "9E17EC650CC6B0B664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts", "src/util/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function defaultPort(channel = InstallationChannel) {\n if (channel === \"latest\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n return {\n file,\n version: InstallationVersion,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n", | ||
| "import path from \"node:path\"\n\nexport function selfCommand() {\n const runtime = path.basename(process.execPath, path.extname(process.execPath)).toLowerCase()\n if (runtime !== \"bun\" && runtime !== \"node\" && runtime !== \"nodejs\") return [process.execPath]\n if (!process.argv[1]) throw new Error(\"Failed to resolve CLI entrypoint\")\n if (runtime === \"node\" || runtime === \"nodejs\") return [process.execPath, ...nodeFlags(), process.argv[1]]\n return [process.execPath, process.argv[1]]\n}\n\nfunction nodeFlags() {\n return process.execArgv.flatMap((arg, index, args) => {\n if (index > 0 && args[index - 1] === \"--conditions\") return []\n if (arg === \"--conditions\") return args[index + 1] ? [arg, args[index + 1]] : []\n if (arg.startsWith(\"--conditions=\")) return [arg]\n if (\n arg === \"--experimental-ffi\" ||\n arg === \"--use-system-ca\" ||\n arg === \"--enable-source-maps\" ||\n arg === \"--no-addons\"\n )\n return [arg]\n if (arg === \"--no-warnings\" || arg.startsWith(\"--disable-warning=\")) return [arg]\n return []\n })\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E4FDDD79810F148864756E2164756E21", | ||
| "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": ["../core/src/effect/layer-node.ts", "../core/src/effect/app-node.ts", "../core/src/global.ts", "../../node_modules/.bun/xdg-basedir@5.1.0/node_modules/xdg-basedir/index.js", "../core/src/util/flock.ts", "../core/src/util/hash.ts", "../core/src/flag/flag.ts"], | ||
| "sourcesContent": [ | ||
| "import { Brand, Context, Layer } from \"effect\"\n\ntype AnyNode = Node<unknown, unknown, any>\ntype RuntimeLayer = Layer.Layer<never, unknown, unknown>\ntype NodeList<Item extends AnyNode = AnyNode> = readonly [] | readonly [Item, ...Item[]]\nexport type Output<Item> = [Item] extends [never] ? never : Item extends Node<infer A, unknown, any> ? A : never\nexport type Error<Item> = [Item] extends [never] ? never : Item extends Node<unknown, infer E, any> ? E : never\ntype NodeTag<Item> = [Item] extends [never] ? undefined : Item extends Node<unknown, unknown, infer T> ? T : never\ntype Missing<Required, Dependencies extends NodeList> = Exclude<Required, Output<Dependencies[number]>>\ntype CheckDependencies<Implementation extends Layer.Any, Dependencies extends NodeList> = [\n Missing<Layer.Services<Implementation>, Dependencies>,\n] extends [never]\n ? unknown\n : { readonly \"Missing dependencies\": Missing<Layer.Services<Implementation>, Dependencies> }\ndeclare const $OutputType: unique symbol\ndeclare const $ErrorType: unique symbol\n\nexport type Tag<Name extends string = string> = Name & Brand.Brand<\"LayerNode.Tag\">\n\nconst makeTag = Brand.nominal<Tag>()\n\nexport interface Node<A, E = never, T extends Tag | undefined = undefined> {\n readonly kind: \"layer\" | \"unbound\" | \"group\"\n readonly name: string\n readonly service?: Context.Service.Any\n readonly implementation?: Layer.Any\n readonly dependencies: readonly AnyNode[]\n readonly tag?: T\n readonly [$OutputType]?: () => A\n readonly [$ErrorType]?: () => E\n}\n\ntype NodeIdentity =\n | { readonly service: Context.Service.Any; readonly name?: never }\n | { readonly name: string; readonly service?: never }\ntype DistributiveOmit<A, K extends PropertyKey> = A extends unknown ? Omit<A, K> : never\n\nexport type TagConfig = Readonly<Record<string, readonly string[]>>\ntype TagNames<Config extends TagConfig> = keyof Config & string\ntype NodeInTags<Names extends string> = Node<unknown, unknown, Tag<Names> | undefined>\ntype CheckTags<Items extends NodeList, Names extends string> = [Exclude<Items[number], NodeInTags<Names>>] extends [\n never,\n]\n ? unknown\n : { readonly \"Invalid tag dependencies\": Exclude<Items[number], NodeInTags<Names>> }\n\nexport interface Tags<Config extends TagConfig> {\n readonly values: { readonly [Name in TagNames<Config>]: Tag<Name> }\n readonly make: <Name extends TagNames<Config>>(\n name: Name,\n ) => <const Implementation extends Layer.Any, const Items extends NodeList>(\n input: DistributiveOmit<MakeInput<Implementation, Items, Tag<Name>>, \"tag\"> &\n CheckTags<Items, Name | Extract<Config[Name][number], string>>,\n ) => Node<Layer.Success<Implementation>, Layer.Error<Implementation> | Error<Items[number]>, Tag<Name>>\n}\n\nexport function tags<const Config extends { readonly [Name in keyof Config]: readonly (keyof Config & string)[] }>(\n config: Config,\n): Tags<Config> {\n const names = Object.keys(config) as TagNames<Config>[]\n const values = Object.fromEntries(names.map((name) => [name, makeTag(name)])) as Tags<Config>[\"values\"]\n return {\n values,\n make: ((name: TagNames<Config>) => (input: DistributiveOmit<MakeInput<Layer.Any, NodeList, Tag>, \"tag\">) =>\n make({ ...input, tag: values[name] })) as Tags<Config>[\"make\"],\n }\n}\n\n// Nodes ---------------------------------------------------------------------\n\ntype MakeInput<\n Implementation extends Layer.Any,\n Items extends NodeList,\n T extends Tag | undefined = undefined,\n> = NodeIdentity & {\n readonly layer: Implementation\n readonly deps: Items & CheckDependencies<Implementation, NoInfer<Items>>\n readonly tag?: T\n}\n\nexport function make<\n const Implementation extends Layer.Any,\n const Items extends NodeList,\n const T extends Tag | undefined = undefined,\n>(\n input: MakeInput<Implementation, Items, T>,\n): Node<Layer.Success<Implementation>, Layer.Error<Implementation> | Error<Items[number]>, T> {\n return {\n kind: \"layer\",\n name: input.service !== undefined ? input.service.key : input.name,\n service: input.service,\n implementation: input.layer,\n dependencies: input.deps,\n tag: input.tag,\n }\n}\n\nexport function unbound<R, Shape, const T extends Tag>(service: Context.Key<R, Shape>, tag: T): Node<R, never, T> {\n return {\n kind: \"unbound\",\n name: service.key,\n service,\n dependencies: [],\n tag,\n }\n}\n\nexport function group<const Items extends readonly AnyNode[]>(\n dependencies: Items,\n): Node<Output<Items[number]>, Error<Items[number]>, NodeTag<Items[number]>> {\n return { kind: \"group\", name: \"group\", dependencies }\n}\n\nexport type Replacement = readonly [source: AnyNode, replacement: AnyNode | Layer.Any]\nexport type Replacements = readonly Replacement[]\n\ntype CheckReplacementErrors<SourceError, ReplacementError> = [Exclude<ReplacementError, SourceError>] extends [never]\n ? unknown\n : { readonly \"New replacement errors\": Exclude<ReplacementError, SourceError> }\n\ntype CheckReplacement<Item> = Item extends readonly [Node<infer A, infer E, infer T>, infer Replacement]\n ? Replacement extends Node<NoInfer<A>, infer E2, T>\n ? CheckReplacementErrors<E, NoInfer<E2>>\n : Replacement extends Layer.Layer<NoInfer<A>, infer E2, never>\n ? CheckReplacementErrors<E, NoInfer<E2>>\n : { readonly \"Invalid replacement\": Replacement }\n : { readonly \"Invalid replacement\": Item }\n\ntype CheckReplacements<Items extends Replacements> = {\n readonly [K in keyof Items]: CheckReplacement<Items[K]>\n}\n\ntype ValidReplacements<Items extends Replacements> = Items & CheckReplacements<Items>\n\nfunction replacementNode(source: AnyNode, replacement: AnyNode | Layer.Any) {\n const replacementNode = isNode(replacement)\n ? replacement\n : make({\n ...nodeMakeIdentity(source),\n layer: replacement as Layer.Layer<unknown, unknown>,\n deps: [],\n tag: source.tag,\n })\n if (source.name !== replacementNode.name) {\n throw new Error(`Cannot replace ${source.name} with ${replacementNode.name}`)\n }\n if (source.tag !== replacementNode.tag) {\n throw new Error(`Cannot replace ${source.name} across tags`)\n }\n return replacementNode\n}\n\nfunction nodeMakeIdentity(node: AnyNode): NodeIdentity {\n if (node.service !== undefined) return { service: node.service }\n return { name: node.name }\n}\n\nfunction isNode(input: Layer.Any | AnyNode): input is AnyNode {\n return \"kind\" in input && \"dependencies\" in input\n}\n\n// Tree -----------------------------------------------------------------------\n\ntype Visit<Result> = (node: AnyNode, context: VisitContext<Result>) => Result\n\ntype VisitContext<Result> = {\n readonly cache: Map<AnyNode, Result>\n readonly visit: (node: AnyNode) => Result\n}\n\nfunction walk<Result>(\n root: AnyNode,\n visit: Visit<Result>,\n options: {\n readonly cache?: Map<AnyNode, Result>\n readonly resolve?: (node: AnyNode) => AnyNode\n readonly detectCycles?: boolean\n } = {},\n) {\n const cache = options.cache ?? new Map<AnyNode, Result>()\n const visiting = new Set<AnyNode>()\n const stack: AnyNode[] = []\n\n const recur = (node: AnyNode): Result => {\n const target = options.resolve?.(node) ?? node\n const cached = cache.get(target)\n if (cached !== undefined || cache.has(target)) return cached!\n\n if (options.detectCycles !== false && visiting.has(target)) {\n const start = stack.indexOf(target)\n throw new Error(\n `Cycle detected in layer tree: ${[...stack.slice(start), target].map((item) => item.name).join(\" -> \")}`,\n )\n }\n\n visiting.add(target)\n stack.push(target)\n try {\n const result = visit(target, { cache, visit: recur })\n if (!cache.has(target)) cache.set(target, result)\n return result\n } finally {\n stack.pop()\n visiting.delete(target)\n }\n }\n\n return recur(root)\n}\n\nexport function hoist<A, E, T extends Tag, const Items extends Replacements = readonly []>(\n root: Node<A, E, any>,\n tag: T,\n replacements?: ValidReplacements<Items>,\n): {\n readonly node: Node<A, E>\n readonly hoisted: Node<unknown, E>\n} {\n const hoisted = new Map<string, AnyNode>()\n const replacementMap = replacementMapFrom(replacements)\n\n const node = walk<AnyNode>(\n root,\n (node, context) => {\n if (node.kind === \"group\") {\n return { ...node, dependencies: node.dependencies.map(context.visit) }\n }\n if (node.tag === tag) {\n const existing = hoisted.get(node.name)\n if (existing && existing.implementation !== node.implementation) {\n throw new Error(`Tag ${tag} has conflicting implementations for ${node.name}`)\n }\n hoisted.set(node.name, rewriteReplacementDependencies(node, replacementMap))\n return group([])\n }\n if (node.kind === \"unbound\") {\n return node\n }\n return { ...node, dependencies: node.dependencies.map(context.visit) }\n },\n { resolve: (node) => replacementMap.get(node.name) ?? node },\n )\n\n return {\n node: node as Node<A, E>,\n hoisted: group(Array.from(hoisted.values())) as Node<unknown, E>,\n }\n}\n\nexport function compile<A, E, const Items extends Replacements = readonly []>(\n root: Node<A, E, any>,\n replacements?: ValidReplacements<Items>,\n): Layer.Layer<A, E> {\n const replacementMap = replacementMapFrom(replacements)\n const cache = new Map<AnyNode, RuntimeLayer>()\n const compileNode = (node: AnyNode) =>\n walk<RuntimeLayer>(\n node,\n (node, context) => {\n if (node.kind === \"unbound\") throw new Error(`Unbound layer node: ${node.name}`)\n const dependencies = node.dependencies.flatMap(flatten).map(context.visit)\n const implementation = node.implementation! as RuntimeLayer\n return dependencies.length === 0\n ? implementation\n : implementation.pipe(Layer.provide(dependencies as [RuntimeLayer, ...RuntimeLayer[]]))\n },\n { cache, resolve: (node) => replacementMap.get(node.name) ?? node },\n )\n const layers = flatten(root).map((node) => compileNode(node))\n const layer = layers.reduce<RuntimeLayer>((result, layer) => layer.pipe(Layer.provideMerge(result)), Layer.empty)\n return layer as Layer.Layer<A, E>\n}\n\nfunction replacementMapFrom(replacements?: Replacements) {\n return (\n replacements?.reduce((map, [source, replacement]) => {\n const normalized = rewriteReplacementDependencies(replacementNode(source, replacement), map)\n const current = new Map([[source.name, normalized]])\n for (const [name, node] of map) map.set(name, rewriteReplacementDependencies(node, current))\n map.set(source.name, normalized)\n return map\n }, new Map<string, AnyNode>()) ?? new Map<string, AnyNode>()\n )\n}\n\nfunction rewriteReplacementDependencies(root: AnyNode, replacements: ReadonlyMap<string, AnyNode>) {\n if (replacements.size === 0) return root\n const cache = new Map<AnyNode, AnyNode>()\n const visiting = new Set<AnyNode>()\n const stack: AnyNode[] = []\n\n const recur = (node: AnyNode, isRoot = false): AnyNode => {\n const target = isRoot ? node : (replacements.get(node.name) ?? node)\n const cached = cache.get(target)\n if (cached !== undefined || cache.has(target)) return cached!\n if (visiting.has(target)) {\n const start = stack.indexOf(target)\n throw new Error(\n `Cycle detected in layer tree: ${[...stack.slice(start), target].map((item) => item.name).join(\" -> \")}`,\n )\n }\n\n visiting.add(target)\n stack.push(target)\n try {\n const dependencies = target.dependencies.map((dependency) => recur(dependency))\n const result = dependencies.every((dependency, index) => dependency === target.dependencies[index])\n ? target\n : { ...target, dependencies }\n cache.set(target, result)\n return result\n } finally {\n stack.pop()\n visiting.delete(target)\n }\n }\n\n return recur(root, true)\n}\n\nexport function hasUnbound(root: Node<unknown, unknown, any>, source: AnyNode): boolean {\n if (source.kind !== \"unbound\") throw new Error(`Cannot check non-unbound layer node: ${source.name}`)\n return walk<boolean>(root, (node, context) => {\n if (node === source) return true\n return node.dependencies.some(context.visit)\n })\n}\n\nfunction flatten(node: AnyNode): readonly AnyNode[] {\n return node.kind === \"group\" ? node.dependencies.flatMap(flatten) : [node]\n}\n\nexport * as LayerNode from \"./layer-node\"\n", | ||
| "import { LayerNode } from \"./layer-node\"\n\nexport const tags = LayerNode.tags({\n location: [\"global\"],\n global: [],\n})\n\nexport type GlobalNode<A, E = never> = LayerNode.Node<A, E, (typeof tags.values)[\"global\"]>\nexport type LocationNode<A, E = never> = LayerNode.Node<A, E, (typeof tags.values)[\"location\"]>\n\nexport const makeGlobalNode = tags.make(\"global\")\nexport const makeLocationNode = tags.make(\"location\")\n\nexport * as Node from \"./app-node\"\n", | ||
| "import path from \"path\"\nimport fs from \"fs/promises\"\nimport { xdgData, xdgCache, xdgConfig, xdgState } from \"xdg-basedir\"\nimport os from \"os\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { Flock } from \"./util/flock\"\nimport { Flag } from \"./flag/flag\"\nimport { makeGlobalNode } from \"./effect/app-node\"\n\nconst app = \"opencode\"\nconst data = path.join(xdgData!, app)\nconst cache = path.join(xdgCache!, app)\nconst config = path.join(xdgConfig!, app)\nconst state = path.join(xdgState!, app)\nconst tmp = path.join(os.tmpdir(), app)\n\nconst paths = {\n get home() {\n return process.env.OPENCODE_TEST_HOME ?? os.homedir()\n },\n data,\n bin: path.join(cache, \"bin\"),\n log: path.join(data, \"log\"),\n repos: path.join(data, \"repos\"),\n cache,\n config,\n state,\n tmp,\n}\n\nexport const Path = paths\n\nFlock.setGlobal({ state })\n\nawait Promise.all([\n fs.mkdir(Path.data, { recursive: true }),\n fs.mkdir(Path.config, { recursive: true }),\n fs.mkdir(Path.state, { recursive: true }),\n fs.mkdir(Path.tmp, { recursive: true }),\n fs.mkdir(Path.log, { recursive: true }),\n fs.mkdir(Path.bin, { recursive: true }),\n fs.mkdir(Path.repos, { recursive: true }),\n])\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Global\") {}\n\nexport interface Interface {\n readonly home: string\n readonly data: string\n readonly cache: string\n readonly config: string\n readonly state: string\n readonly tmp: string\n readonly bin: string\n readonly log: string\n readonly repos: string\n}\n\nexport function make(input: Partial<Interface> = {}): Interface {\n return {\n home: Path.home,\n data: Path.data,\n cache: Path.cache,\n config: Flag.OPENCODE_CONFIG_DIR ?? Path.config,\n state: Path.state,\n tmp: Path.tmp,\n bin: Path.bin,\n log: Path.log,\n repos: Path.repos,\n ...input,\n }\n}\n\nconst layer = Layer.effect(\n Service,\n Effect.sync(() => Service.of(make())),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer: layer, deps: [] })\n\nexport const layerWith = (input: Partial<Interface>) =>\n Layer.effect(\n Service,\n Effect.sync(() => Service.of(make(input))),\n )\n\nexport * as Global from \"./global\"\n", | ||
| "import os from 'os';\nimport path from 'path';\n\nconst homeDirectory = os.homedir();\nconst {env} = process;\n\nexport const xdgData = env.XDG_DATA_HOME ||\n\t(homeDirectory ? path.join(homeDirectory, '.local', 'share') : undefined);\n\nexport const xdgConfig = env.XDG_CONFIG_HOME ||\n\t(homeDirectory ? path.join(homeDirectory, '.config') : undefined);\n\nexport const xdgState = env.XDG_STATE_HOME ||\n\t(homeDirectory ? path.join(homeDirectory, '.local', 'state') : undefined);\n\nexport const xdgCache = env.XDG_CACHE_HOME || (homeDirectory ? path.join(homeDirectory, '.cache') : undefined);\n\nexport const xdgRuntime = env.XDG_RUNTIME_DIR || undefined;\n\nexport const xdgDataDirectories = (env.XDG_DATA_DIRS || '/usr/local/share/:/usr/share/').split(':');\n\nif (xdgData) {\n\txdgDataDirectories.unshift(xdgData);\n}\n\nexport const xdgConfigDirectories = (env.XDG_CONFIG_DIRS || '/etc/xdg').split(':');\n\nif (xdgConfig) {\n\txdgConfigDirectories.unshift(xdgConfig);\n}\n", | ||
| "import path from \"path\"\nimport os from \"os\"\nimport { randomBytes, randomUUID } from \"crypto\"\nimport { mkdir, readFile, rm, stat, utimes, writeFile } from \"fs/promises\"\nimport { Hash } from \"./hash\"\nimport { Effect } from \"effect\"\n\nexport type FlockGlobal = {\n state: string\n}\n\nexport namespace Flock {\n let global: FlockGlobal | undefined\n\n export function setGlobal(g: FlockGlobal) {\n global = g\n }\n\n const root = () => {\n if (!global) throw new Error(\"Flock global not set\")\n return path.join(global.state, \"locks\")\n }\n\n // Defaults for callers that do not provide timing options.\n const defaultOpts = {\n staleMs: 60_000,\n timeoutMs: 5 * 60_000,\n baseDelayMs: 100,\n maxDelayMs: 2_000,\n }\n\n export interface WaitEvent {\n key: string\n attempt: number\n delay: number\n waited: number\n }\n\n export type Wait = (input: WaitEvent) => void | Promise<void>\n\n export interface Options {\n dir?: string\n signal?: AbortSignal\n staleMs?: number\n timeoutMs?: number\n baseDelayMs?: number\n maxDelayMs?: number\n onWait?: Wait\n }\n\n type Opts = {\n staleMs: number\n timeoutMs: number\n baseDelayMs: number\n maxDelayMs: number\n }\n\n type Owned = {\n acquired: true\n startHeartbeat: (intervalMs?: number) => void\n release: () => Promise<void>\n }\n\n export interface Lease {\n release: () => Promise<void>\n [Symbol.asyncDispose]: () => Promise<void>\n }\n\n function code(err: unknown) {\n if (typeof err !== \"object\" || err === null || !(\"code\" in err)) return\n const value = err.code\n if (typeof value !== \"string\") return\n return value\n }\n\n function sleep(ms: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new Error(\"Aborted\"))\n return\n }\n\n let timer: NodeJS.Timeout | undefined\n\n const done = () => {\n signal?.removeEventListener(\"abort\", abort)\n resolve()\n }\n\n const abort = () => {\n if (timer) {\n clearTimeout(timer)\n }\n signal?.removeEventListener(\"abort\", abort)\n reject(signal?.reason ?? new Error(\"Aborted\"))\n }\n\n signal?.addEventListener(\"abort\", abort, { once: true })\n timer = setTimeout(done, ms)\n })\n }\n\n function jitter(ms: number) {\n const j = Math.floor(ms * 0.3)\n const d = Math.floor(Math.random() * (2 * j + 1)) - j\n return Math.max(0, ms + d)\n }\n\n function mono() {\n return performance.now()\n }\n\n function wall() {\n return performance.timeOrigin + mono()\n }\n\n async function stats(file: string) {\n try {\n return await stat(file)\n } catch (err) {\n const errCode = code(err)\n if (errCode === \"ENOENT\" || errCode === \"ENOTDIR\") return\n throw err\n }\n }\n\n async function stale(lockDir: string, heartbeatPath: string, metaPath: string, staleMs: number) {\n // Stale detection allows automatic recovery after crashed owners.\n const now = wall()\n const heartbeat = await stats(heartbeatPath)\n if (heartbeat) {\n return now - heartbeat.mtimeMs > staleMs\n }\n\n const meta = await stats(metaPath)\n if (meta) {\n return now - meta.mtimeMs > staleMs\n }\n\n const dir = await stats(lockDir)\n if (!dir) {\n return false\n }\n\n return now - dir.mtimeMs > staleMs\n }\n\n async function tryAcquireLockDir(lockDir: string, opts: Opts): Promise<Owned | { acquired: false }> {\n const token = randomUUID?.() ?? randomBytes(16).toString(\"hex\")\n const metaPath = path.join(lockDir, \"meta.json\")\n const heartbeatPath = path.join(lockDir, \"heartbeat\")\n\n try {\n await mkdir(lockDir, { mode: 0o700 })\n } catch (err) {\n if (code(err) !== \"EEXIST\") {\n throw err\n }\n\n if (!(await stale(lockDir, heartbeatPath, metaPath, opts.staleMs))) {\n return { acquired: false }\n }\n\n const breakerPath = lockDir + \".breaker\"\n try {\n await mkdir(breakerPath, { mode: 0o700 })\n } catch (claimErr) {\n const errCode = code(claimErr)\n if (errCode === \"EEXIST\") {\n const breaker = await stats(breakerPath)\n if (breaker && wall() - breaker.mtimeMs > opts.staleMs) {\n await rm(breakerPath, { recursive: true, force: true }).catch(() => undefined)\n }\n return { acquired: false }\n }\n\n if (errCode === \"ENOENT\" || errCode === \"ENOTDIR\") {\n return { acquired: false }\n }\n\n throw claimErr\n }\n\n try {\n // Breaker ownership ensures only one contender performs stale cleanup.\n if (!(await stale(lockDir, heartbeatPath, metaPath, opts.staleMs))) {\n return { acquired: false }\n }\n\n await rm(lockDir, { recursive: true, force: true })\n\n try {\n await mkdir(lockDir, { mode: 0o700 })\n } catch (retryErr) {\n const errCode = code(retryErr)\n if (errCode === \"EEXIST\" || errCode === \"ENOTEMPTY\") {\n return { acquired: false }\n }\n throw retryErr\n }\n } finally {\n await rm(breakerPath, { recursive: true, force: true }).catch(() => undefined)\n }\n }\n\n const meta = {\n token,\n pid: process.pid,\n hostname: os.hostname(),\n createdAt: new Date().toISOString(),\n }\n\n await writeFile(heartbeatPath, \"\", { flag: \"wx\" }).catch(async () => {\n await rm(lockDir, { recursive: true, force: true })\n throw new Error(\"Lock acquired but heartbeat already existed (possible compromise).\")\n })\n\n await writeFile(metaPath, JSON.stringify(meta, null, 2), { flag: \"wx\" }).catch(async () => {\n await rm(lockDir, { recursive: true, force: true })\n throw new Error(\"Lock acquired but meta.json already existed (possible compromise).\")\n })\n\n let timer: NodeJS.Timeout | undefined\n\n const startHeartbeat = (intervalMs = Math.max(100, Math.floor(opts.staleMs / 3))) => {\n if (timer) return\n // Heartbeat prevents long critical sections from being evicted as stale.\n timer = setInterval(() => {\n const t = new Date()\n void utimes(heartbeatPath, t, t).catch(() => undefined)\n }, intervalMs)\n timer.unref?.()\n }\n\n const release = async () => {\n if (timer) {\n clearInterval(timer)\n timer = undefined\n }\n\n const current = await readFile(metaPath, \"utf8\")\n .then((raw) => {\n const parsed = JSON.parse(raw)\n if (!parsed || typeof parsed !== \"object\") return {}\n return {\n token: \"token\" in parsed && typeof parsed.token === \"string\" ? parsed.token : undefined,\n }\n })\n .catch((err) => {\n const errCode = code(err)\n if (errCode === \"ENOENT\" || errCode === \"ENOTDIR\") {\n throw new Error(\"Refusing to release: lock is compromised (metadata missing).\")\n }\n if (err instanceof SyntaxError) {\n throw new Error(\"Refusing to release: lock is compromised (metadata invalid).\")\n }\n throw err\n })\n // Token check prevents deleting a lock that was re-acquired by another process.\n if (current.token !== token) {\n throw new Error(\"Refusing to release: lock token mismatch (not the owner).\")\n }\n\n await rm(lockDir, { recursive: true, force: true })\n }\n\n return {\n acquired: true,\n startHeartbeat,\n release,\n }\n }\n\n async function acquireLockDir(\n lockDir: string,\n input: { key: string; onWait?: Wait; signal?: AbortSignal },\n opts: Opts,\n ) {\n const stop = mono() + opts.timeoutMs\n let attempt = 0\n let waited = 0\n let delay = opts.baseDelayMs\n\n while (true) {\n input.signal?.throwIfAborted()\n\n const res = await tryAcquireLockDir(lockDir, opts)\n if (res.acquired) {\n return res\n }\n\n if (mono() > stop) {\n throw new Error(`Timed out waiting for lock: ${input.key}`)\n }\n\n attempt += 1\n const ms = jitter(delay)\n await input.onWait?.({\n key: input.key,\n attempt,\n delay: ms,\n waited,\n })\n await sleep(ms, input.signal)\n waited += ms\n delay = Math.min(opts.maxDelayMs, Math.floor(delay * 1.7))\n }\n }\n\n export async function acquire(key: string, input: Options = {}): Promise<Lease> {\n input.signal?.throwIfAborted()\n const cfg: Opts = {\n staleMs: input.staleMs ?? defaultOpts.staleMs,\n timeoutMs: input.timeoutMs ?? defaultOpts.timeoutMs,\n baseDelayMs: input.baseDelayMs ?? defaultOpts.baseDelayMs,\n maxDelayMs: input.maxDelayMs ?? defaultOpts.maxDelayMs,\n }\n const dir = input.dir ?? root()\n\n await mkdir(dir, { recursive: true })\n const lockfile = path.join(dir, Hash.fast(key) + \".lock\")\n const lock = await acquireLockDir(\n lockfile,\n {\n key,\n onWait: input.onWait,\n signal: input.signal,\n },\n cfg,\n )\n lock.startHeartbeat()\n\n const release = () => lock.release()\n return {\n release,\n [Symbol.asyncDispose]() {\n return release()\n },\n }\n }\n\n export async function withLock<T>(key: string, fn: () => Promise<T>, input: Options = {}) {\n await using _ = await acquire(key, input)\n input.signal?.throwIfAborted()\n return await fn()\n }\n\n export const effect = Effect.fn(\"Flock.effect\")(function* (key: string, input: Options = {}) {\n return yield* Effect.acquireRelease(\n Effect.promise((signal) => Flock.acquire(key, { ...input, signal })).pipe(\n Effect.withSpan(\"Flock.acquire\", {\n attributes: { key },\n }),\n ),\n (lock) => Effect.promise(() => lock.release()).pipe(Effect.withSpan(\"Flock.release\")),\n ).pipe(Effect.asVoid)\n })\n}\n", | ||
| "import { createHash } from \"crypto\"\n\nexport namespace Hash {\n export function fast(input: string | Buffer): string {\n return createHash(\"sha1\").update(input).digest(\"hex\")\n }\n\n export function sha256(input: string | Buffer): string {\n return createHash(\"sha256\").update(input).digest(\"hex\")\n }\n}\n", | ||
| "import { Config } from \"effect\"\n\nexport function truthy(key: string) {\n const value = process.env[key]?.toLowerCase()\n return value === \"true\" || value === \"1\"\n}\n\nconst copy = process.env[\"OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT\"]\nconst fff = process.env[\"OPENCODE_DISABLE_FFF\"]\n\nfunction enabledByExperimental(key: string) {\n return process.env[key] === undefined ? truthy(\"OPENCODE_EXPERIMENTAL\") : truthy(key)\n}\n\nexport const Flag = {\n OTEL_EXPORTER_OTLP_ENDPOINT: process.env[\"OTEL_EXPORTER_OTLP_ENDPOINT\"],\n OTEL_EXPORTER_OTLP_HEADERS: process.env[\"OTEL_EXPORTER_OTLP_HEADERS\"],\n\n OPENCODE_AUTO_HEAP_SNAPSHOT: truthy(\"OPENCODE_AUTO_HEAP_SNAPSHOT\"),\n OPENCODE_GIT_BASH_PATH: process.env[\"OPENCODE_GIT_BASH_PATH\"],\n OPENCODE_CONFIG: process.env[\"OPENCODE_CONFIG\"],\n OPENCODE_CONFIG_CONTENT: process.env[\"OPENCODE_CONFIG_CONTENT\"],\n OPENCODE_DISABLE_AUTOUPDATE: truthy(\"OPENCODE_DISABLE_AUTOUPDATE\"),\n OPENCODE_ALWAYS_NOTIFY_UPDATE: truthy(\"OPENCODE_ALWAYS_NOTIFY_UPDATE\"),\n OPENCODE_DISABLE_PRUNE: truthy(\"OPENCODE_DISABLE_PRUNE\"),\n OPENCODE_DISABLE_TERMINAL_TITLE: truthy(\"OPENCODE_DISABLE_TERMINAL_TITLE\"),\n OPENCODE_SHOW_TTFD: truthy(\"OPENCODE_SHOW_TTFD\"),\n OPENCODE_DISABLE_AUTOCOMPACT: truthy(\"OPENCODE_DISABLE_AUTOCOMPACT\"),\n OPENCODE_DISABLE_MODELS_FETCH: truthy(\"OPENCODE_DISABLE_MODELS_FETCH\"),\n OPENCODE_DISABLE_MOUSE: truthy(\"OPENCODE_DISABLE_MOUSE\"),\n OPENCODE_FAKE_VCS: process.env[\"OPENCODE_FAKE_VCS\"],\n OPENCODE_SERVER_PASSWORD: process.env[\"OPENCODE_SERVER_PASSWORD\"],\n OPENCODE_SERVER_USERNAME: process.env[\"OPENCODE_SERVER_USERNAME\"],\n OPENCODE_DISABLE_FFF: fff === undefined ? process.platform === \"win32\" : truthy(\"OPENCODE_DISABLE_FFF\"),\n OPENCODE_DISABLE_FILEWATCHER: truthy(\"OPENCODE_DISABLE_FILEWATCHER\"),\n\n // Experimental\n OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT:\n copy === undefined ? process.platform === \"win32\" : truthy(\"OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT\"),\n OPENCODE_MODELS_URL: process.env[\"OPENCODE_MODELS_URL\"],\n OPENCODE_MODELS_PATH: process.env[\"OPENCODE_MODELS_PATH\"],\n OPENCODE_DB: process.env[\"OPENCODE_DB\"],\n\n OPENCODE_WORKSPACE_ID: process.env[\"OPENCODE_WORKSPACE_ID\"],\n OPENCODE_EXPERIMENTAL_WORKSPACES: enabledByExperimental(\"OPENCODE_EXPERIMENTAL_WORKSPACES\"),\n\n // Evaluated at access time (not module load) because tests, the CLI, and\n // external tooling set these env vars at runtime.\n get OPENCODE_DISABLE_PROJECT_CONFIG() {\n return truthy(\"OPENCODE_DISABLE_PROJECT_CONFIG\")\n },\n get OPENCODE_EXPERIMENTAL_REFERENCES() {\n return enabledByExperimental(\"OPENCODE_EXPERIMENTAL_REFERENCES\")\n },\n get OPENCODE_TUI_CONFIG() {\n return process.env[\"OPENCODE_TUI_CONFIG\"]\n },\n get OPENCODE_CONFIG_DIR() {\n return process.env[\"OPENCODE_CONFIG_DIR\"]\n },\n get OPENCODE_PURE() {\n return truthy(\"OPENCODE_PURE\")\n },\n get OPENCODE_PERMISSION() {\n return process.env[\"OPENCODE_PERMISSION\"]\n },\n get OPENCODE_PLUGIN_META_FILE() {\n return process.env[\"OPENCODE_PLUGIN_META_FILE\"]\n },\n get OPENCODE_CLIENT() {\n return process.env[\"OPENCODE_CLIENT\"] ?? \"cli\"\n },\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "B6930A4DC417145964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "A1DE0F97B2A71E7F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]))),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n if (\n serviceOptions !== undefined &&\n port !== undefined &&\n (yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })) !== undefined\n )\n return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start(\n {\n hostname,\n port,\n password,\n database: {\n path: process.env.OPENCODE_DB,\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: ![\"1\", \"true\"].includes(process.env.OPENCODE_DISABLE_MODELS_FETCH?.toLowerCase() ?? \"\"),\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: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "594FA0FC78D569C664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/installation/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare global {\n const OPENCODE_VERSION: string\n const OPENCODE_CHANNEL: string\n}\n\nexport const InstallationVersion = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nexport const InstallationChannel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\nexport const InstallationLocal = InstallationChannel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAKO,IAAM,EAA6D,mBAC7D,EAA6D,OAC7D,EAAoB", | ||
| "debugId": "752A4BF87EE5D56964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Duration, Effect, Fiber, Layer, Schema, Stream } from \"effect\"\nimport type { PlatformError } from \"effect/PlatformError\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { CrossSpawnSpawner } from \"./cross-spawn-spawner\"\nimport { makeGlobalNode } from \"./effect/app-node\"\n\nexport class AppProcessError extends Schema.TaggedErrorClass<AppProcessError>()(\"AppProcessError\", {\n command: Schema.String,\n exitCode: Schema.optional(Schema.Number),\n stderr: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {\n override get message() {\n const detail =\n this.stderr?.trim() || (this.cause instanceof Error ? this.cause.message : this.cause && String(this.cause))\n const status = this.exitCode === undefined ? \"\" : ` (exit ${this.exitCode})`\n return `Command failed${status}: ${this.command}${detail ? `: ${detail}` : \"\"}`\n }\n}\n\nexport interface RunOptions {\n readonly combineOutput?: boolean\n readonly maxOutputBytes?: number\n readonly maxErrorBytes?: number\n readonly signal?: AbortSignal\n readonly timeout?: Duration.Input\n readonly stdin?: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>\n}\n\nexport interface RunStreamOptions {\n readonly signal?: AbortSignal\n readonly includeStderr?: boolean\n readonly okExitCodes?: ReadonlyArray<number>\n readonly maxErrorBytes?: number\n}\n\nexport interface RunResult {\n readonly command: string\n readonly exitCode: number\n readonly output?: Buffer\n readonly stdout: Buffer\n readonly stderr: Buffer\n readonly outputTruncated?: boolean\n readonly stdoutTruncated: boolean\n readonly stderrTruncated: boolean\n}\n\nexport type Interface = ChildProcessSpawner[\"Service\"] & {\n readonly run: (command: ChildProcess.Command, options?: RunOptions) => Effect.Effect<RunResult, AppProcessError>\n readonly runStream: (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ) => Stream.Stream<string, AppProcessError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/AppProcess\") {}\n\nexport const requireSuccess = (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n result.exitCode === 0\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nexport const requireExitIn =\n (codes: ReadonlyArray<number>) =>\n (result: RunResult): Effect.Effect<RunResult, AppProcessError> =>\n codes.includes(result.exitCode)\n ? Effect.succeed(result)\n : Effect.fail(\n new AppProcessError({\n command: result.command,\n exitCode: result.exitCode,\n stderr: result.stderr.toString(\"utf8\"),\n }),\n )\n\nconst describeCommand = (command: ChildProcess.Command): string => {\n if (command._tag === \"StandardCommand\") {\n return command.args.length ? `${command.command} ${command.args.join(\" \")}` : command.command\n }\n return `${describeCommand(command.left)} | ${describeCommand(command.right)}`\n}\n\nconst wrapError = (description: string, cause: unknown): AppProcessError =>\n cause instanceof AppProcessError ? cause : new AppProcessError({ command: description, cause })\n\nexport const abortError = (signal: AbortSignal): Error => {\n const reason = signal.reason\n if (reason instanceof Error) return reason\n const err = new Error(\"Aborted\")\n err.name = \"AbortError\"\n return err\n}\n\nexport const waitForAbort = (signal: AbortSignal) =>\n Effect.callback<never, Error>((resume) => {\n if (signal.aborted) {\n resume(Effect.fail(abortError(signal)))\n return\n }\n const onabort = () => resume(Effect.fail(abortError(signal)))\n signal.addEventListener(\"abort\", onabort, { once: true })\n return Effect.sync(() => signal.removeEventListener(\"abort\", onabort))\n })\n\nconst normalizeStdin = (\n input: string | Uint8Array | Stream.Stream<Uint8Array, PlatformError>,\n): Stream.Stream<Uint8Array, PlatformError> =>\n typeof input === \"string\"\n ? Stream.make(new TextEncoder().encode(input))\n : input instanceof Uint8Array\n ? Stream.make(input)\n : input\n\nexport const collectStream = (stream: Stream.Stream<Uint8Array, PlatformError>, maxOutputBytes: number | undefined) =>\n Stream.runFold(\n stream,\n () => ({ chunks: [] as Uint8Array[], bytes: 0, truncated: false }),\n (acc, chunk) => {\n if (maxOutputBytes === undefined) {\n acc.chunks.push(chunk)\n acc.bytes += chunk.length\n return acc\n }\n const remaining = maxOutputBytes - acc.bytes\n if (remaining > 0) acc.chunks.push(remaining >= chunk.length ? chunk : chunk.slice(0, remaining))\n acc.bytes += chunk.length\n acc.truncated = acc.truncated || acc.bytes > maxOutputBytes\n return acc\n },\n ).pipe(Effect.map((x) => ({ buffer: Buffer.concat(x.chunks), truncated: x.truncated })))\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n\n const runCommand = (command: ChildProcess.Command, options?: RunOptions) => {\n const description = describeCommand(command)\n const collect = Effect.scoped(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n if (options?.combineOutput) {\n const [output, exitCode] = yield* Effect.all(\n [collectStream(handle.all, options.maxOutputBytes), handle.exitCode],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n output: output.buffer,\n stdout: Buffer.alloc(0),\n stderr: Buffer.alloc(0),\n outputTruncated: output.truncated,\n stdoutTruncated: false,\n stderrTruncated: false,\n } satisfies RunResult\n }\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, options?.maxOutputBytes),\n collectStream(handle.stderr, options?.maxErrorBytes),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n )\n return {\n command: description,\n exitCode,\n stdout: stdout.buffer,\n stderr: stderr.buffer,\n stdoutTruncated: stdout.truncated,\n stderrTruncated: stderr.truncated,\n } satisfies RunResult\n }),\n )\n const timed = options?.timeout\n ? Effect.timeoutOrElse(collect, {\n duration: options.timeout,\n orElse: () => Effect.fail(new AppProcessError({ command: description, cause: new Error(\"Timed out\") })),\n })\n : collect\n const aborted = options?.signal\n ? timed.pipe(\n Effect.raceFirst(\n waitForAbort(options.signal).pipe(Effect.mapError((cause) => wrapError(description, cause))),\n ),\n )\n : timed\n return aborted.pipe(Effect.catch((cause) => Effect.fail(wrapError(description, cause))))\n }\n\n const run = Effect.fn(\"AppProcess.run\")(function* (command: ChildProcess.Command, options?: RunOptions) {\n if (options?.stdin === undefined) return yield* runCommand(command, options)\n if (command._tag !== \"StandardCommand\") {\n return yield* new AppProcessError({\n command: describeCommand(command),\n cause: new Error(\"stdin option only supports StandardCommand; received PipedCommand\"),\n })\n }\n const next = ChildProcess.make(command.command, command.args, {\n ...command.options,\n stdin: normalizeStdin(options.stdin),\n })\n return yield* runCommand(next, options)\n })\n\n const runStream = (\n command: ChildProcess.Command,\n options?: RunStreamOptions,\n ): Stream.Stream<string, AppProcessError> => {\n const description = describeCommand(command)\n const okExitCodes = options?.okExitCodes\n const built: Stream.Stream<string, AppProcessError | PlatformError> = Stream.unwrap(\n Effect.gen(function* () {\n const handle = yield* spawner.spawn(command)\n const stderrFiber = yield* Effect.forkScoped(\n collectStream(handle.stderr, options?.maxErrorBytes).pipe(Effect.map((x) => x.buffer.toString(\"utf8\"))),\n )\n const source = options?.includeStderr === true ? handle.all : handle.stdout\n const lines = source.pipe(\n Stream.decodeText,\n Stream.splitLines,\n Stream.filter((line) => line.length > 0),\n )\n const tail = Stream.unwrap(\n Effect.gen(function* () {\n const code = yield* handle.exitCode\n if (okExitCodes && okExitCodes.length > 0 && !okExitCodes.includes(code)) {\n const stderr = yield* Fiber.join(stderrFiber)\n return Stream.fail(new AppProcessError({ command: description, exitCode: code, stderr }))\n }\n return Stream.empty\n }),\n )\n return Stream.concat(lines, tail) as Stream.Stream<string, AppProcessError | PlatformError>\n }),\n )\n const mapped = built.pipe(\n Stream.catch((cause): Stream.Stream<string, AppProcessError> => Stream.fail(wrapError(description, cause))),\n )\n if (!options?.signal) return mapped\n const signal = options.signal\n return mapped.pipe(\n Stream.interruptWhen(waitForAbort(signal).pipe(Effect.mapError((cause) => wrapError(description, cause)))),\n )\n }\n\n return Service.of({ ...spawner, run, runStream })\n }),\n)\n\nexport const node = makeGlobalNode({ service: Service, layer: layer, deps: [CrossSpawnSpawner.node] })\n\nexport * as AppProcess from \"./process\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "BB1E4513CB21E0D964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? Global.Path.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n" | ||
| ], | ||
| "mappings": ";2xBAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC", | ||
| "debugId": "C5D492BCABCFF6C764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";+8BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "A4AA5A23DC021CF164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/util/which.ts"], | ||
| "sourcesContent": [ | ||
| "import whichPkg from \"which\"\nimport path from \"path\"\nimport { Global } from \"../global\"\n\nexport function which(cmd: string, env?: NodeJS.ProcessEnv) {\n const base = env?.PATH ?? env?.Path ?? process.env.PATH ?? process.env.Path ?? \"\"\n const full = base ? base + path.delimiter + Global.Path.bin : Global.Path.bin\n const result = whichPkg.sync(cmd, {\n nothrow: true,\n path: full,\n pathExt: env?.PATHEXT ?? env?.PathExt ?? process.env.PATHEXT ?? process.env.PathExt,\n })\n return typeof result === \"string\" ? result : null\n}\n" | ||
| ], | ||
| "mappings": ";kJAAA,oBACA,yBAGO,SAAS,CAAK,CAAC,EAAa,EAAyB,CAC1D,IAAM,EAAO,GAAK,MAAQ,GAAK,MAAQ,QAAQ,IAAI,MAAQ,QAAQ,IAAI,MAAQ,GACzE,EAAO,EAAO,EAAO,EAAK,UAAY,EAAO,KAAK,IAAM,EAAO,KAAK,IACpE,EAAS,UAAS,KAAK,EAAK,CAChC,QAAS,GACT,KAAM,EACN,QAAS,GAAK,SAAW,GAAK,SAAW,QAAQ,IAAI,SAAW,QAAQ,IAAI,OAC9E,CAAC,EACD,OAAO,OAAO,IAAW,SAAW,EAAS", | ||
| "debugId": "3FDF64415C0FDE0864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-compatible.ts"], | ||
| "sourcesContent": [ | ||
| "import { ProviderID, type ModelID } from \"../schema\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat\"\nimport type { RouteDefaultsInput } from \"../route/client\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options\"\nimport type { ProviderPackage } from \"../provider-package\"\nimport { profiles, type OpenAICompatibleProfile } from \"./openai-compatible-profile\"\n\nexport const id = ProviderID.make(\"openai-compatible\")\n\ntype GenericModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL: string\n readonly provider?: string\n}\n\nexport type FamilyModelOptions = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n }\n\nexport const routes = [OpenAICompatibleChat.route]\n\nexport const configure = (input: GenericModelOptions) => {\n const provider = input.provider ?? \"openai-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = OpenAICompatibleChat.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: AuthOptions.bearer(input, []),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model({ id: modelID, provider: ProviderID.make(provider) }),\n configure,\n }\n}\n\nconst define = (profile: OpenAICompatibleProfile) => {\n const configureProfile = (input: FamilyModelOptions = {}) => {\n const facade = configure({\n ...input,\n baseURL: input.baseURL ?? profile.baseURL,\n provider: profile.provider,\n })\n return {\n id: ProviderID.make(profile.provider),\n model: facade.model,\n configure: configureProfile,\n }\n }\n return configureProfile()\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n limits: settings.limits,\n provider: settings.provider,\n }).model(modelID)\n\nexport const baseten = define(profiles.baseten)\nexport const cerebras = define(profiles.cerebras)\nexport const deepinfra = define(profiles.deepinfra)\nexport const deepseek = define(profiles.deepseek)\nexport const fireworks = define(profiles.fireworks)\nexport const groq = define(profiles.groq)\nexport const togetherai = define(profiles.togetherai)\n" | ||
| ], | ||
| "mappings": ";mfAOO,SAAM,OAAK,OAAW,UAAK,wBAAmB,OAmBxC,OAAS,MAAsB,MAAK,OAEpC,OAAY,MAAC,IAA+B,CACvD,IAAM,EAAW,EAAM,UAAY,qBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAA6B,EAAM,KAAK,IACzC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAY,OAAO,EAAO,CAAC,CAAC,CACpC,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAAM,CAAE,GAAI,EAAS,SAAU,EAAW,KAAK,CAAQ,CAAE,CAAC,EACtG,WACF,GAGI,EAAS,CAAC,IAAqC,CACnD,IAAM,EAAmB,CAAC,EAA4B,CAAC,IAAM,CAC3D,IAAM,EAAS,EAAU,IACpB,EACH,QAAS,EAAM,SAAW,EAAQ,QAClC,SAAU,EAAQ,QACpB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,EAAQ,QAAQ,EACpC,MAAO,EAAO,MACd,UAAW,CACb,GAEF,OAAO,EAAiB,GAGb,EAAW,CACtB,KACA,WACF,EAEa,EAAuD,CAAC,EAAS,IAC5E,EAAU,CACR,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,OAAQ,EAAS,OACjB,SAAU,EAAS,QACrB,CAAC,EAAE,MAAM,CAAO,EAEL,EAAU,EAAO,EAAS,OAAO,EACjC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAO,EAAO,EAAS,IAAI,EAC3B,EAAa,EAAO,EAAS,UAAU", | ||
| "debugId": "41605967F42CC59E64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is not supported yet
258409755
0290
0.35%