Sign In

@opencode-ai/cli-linux-x64

Package Overview
Dependencies
Maintainers
2
Versions
3242
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@opencode-ai/cli-linux-x64 - npm Package Compare versions

Comparing version
0.0.0-dev-17534
to
0.0.0-dev-17545
+10
bin/chunk-01nb3hft.js.map
{
"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": ";+2BAMA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,KACnC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,MAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "AC29D2595147585164756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

{
"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, 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": ";u9BAAA,cAAS,WAcT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,UAAS,CAAC,CACnG,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": "E7720170A868DD4964756E2164756E21",
"names": []
}

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 { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n paths: { home: string; state: string; log: string }\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, paths: input.paths }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\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 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 const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n"
],
"mappings": "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",
"debugId": "D7923AF63D6D656F64756E2164756E21",
"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": ";02BAAA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,QAAQ,OAAO,OAAO,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "964F05233A307BE364756E2164756E21",
"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": ";k2BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,MAAO,EAAc,MAAM,EAAM,GAAG,EACrC,CACH",
"debugId": "C5EABBB3676B039064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n"
],
"mappings": ";qpBAAA,cAAS,WACT,oBACA,mBAAS,UAAU,eAAM,oBAOzB,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,IAC/B,EAAO,GAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "63C37569617632C464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/auth/login.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.login,\n Effect.fn(\"cli.auth.login\")(function* (input) {\n process.stdout.write(\"Logging in...\" + 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(\"Logged in\" + 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": ";m6BAAA,cAAS,WAQT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,KAAK,SAAS,MAChC,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,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": "139ECAC11EBB094464756E2164756E21",
"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 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 \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,EAAG,CACrC,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,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,SACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "8AF34F346308B64464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/server-process.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"],
"sourcesContent": [
"export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, 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\"\nimport { WebUi } from \"./services/web-ui\"\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 const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\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 const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) 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 transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\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 transform,\n ).pipe(\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 (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n shutdown: Effect.Effect<void>,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n",
"import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const headers = {\n \"content-type\": FSUtil.mimeType(name),\n \"cache-control\": html ? \"no-cache\" : \"public, max-age=31536000, immutable\",\n \"content-security-policy\": html\n ? cspForHtml(typeof file === \"string\" ? file : Buffer.from(file).toString())\n : csp(),\n \"x-content-type-options\": \"nosniff\",\n }\n return Effect.succeed(\n request.method === \"HEAD\" ? HttpServerResponse.empty({ headers }) : HttpServerResponse.raw(file, { headers }),\n )\n}\n\nfunction isRouteNotFound(error: unknown) {\n return error instanceof HttpServerError.HttpServerError && error.reason._tag === \"RouteNotFound\"\n}\n\nfunction csp(hash = \"\") {\n return `default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${hash ? ` 'sha256-${hash}'` : \"\"}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; media-src 'self' data:; connect-src * data: blob:`\n}\n\nfunction cspForHtml(body: string) {\n const match = body.match(\n /<script\\b(?![^>]*\\bsrc\\s*=)[^>]*\\bid=([\"'])oc-theme-preload-script\\1[^>]*>([\\s\\S]*?)<\\/script>/i,\n )\n return csp(match ? createHash(\"sha256\").update(match[2]).digest(\"base64\") : \"\")\n}\n\nexport * as WebUi from \"./web-ui\"\n",
"import { Effect, FileSystem, Option } from \"effect\"\nimport path from \"node:path\"\nimport { brotliDecompressSync } from \"node:zlib\"\nimport { OPENCODE_LOCAL } from \"./version\"\n\nexport type AssetMap = Readonly<Record<string, string | Uint8Array>>\ntype EncodedAssetMap = Readonly<Record<string, { readonly content: string; readonly encoding: \"utf8\" | \"base64\" }>>\n\nexport const load = Effect.fn(\"cli.app-assets.load\")(function* () {\n const embedded = yield* Effect.tryPromise(() => import(\"virtual:opencode-app-assets\")).pipe(Effect.option)\n if (Option.isSome(embedded) && embedded.value.default.length > 0) return decodeArchive(embedded.value.default)\n if (!OPENCODE_LOCAL) return yield* Effect.fail(new Error(\"Web UI assets are missing from the CLI build\"))\n return decode(yield* sourceAssets())\n})\n\nfunction decodeArchive(archive: string) {\n const body = brotliDecompressSync(Buffer.from(archive, \"base64\")).toString()\n return decode(JSON.parse(body) as EncodedAssetMap)\n}\n\nconst sourceAssets = Effect.fnUntraced(function* () {\n const fs = yield* FileSystem.FileSystem\n const root = path.resolve(import.meta.dirname, \"../../app/dist\")\n const files = yield* fs.readDirectory(root, { recursive: true })\n return Object.fromEntries(\n (yield* Effect.forEach(\n files.filter((file) => !file.endsWith(\".map\")),\n Effect.fnUntraced(function* (file) {\n const target = path.join(root, file)\n if ((yield* fs.stat(target)).type === \"Directory\") return\n const body = Buffer.from(yield* fs.readFile(target))\n const encoding = isText(file) ? \"utf8\" : \"base64\"\n return [file, { encoding, content: body.toString(encoding) }] as const\n }),\n { concurrency: \"unbounded\" },\n )).filter((asset) => asset !== undefined),\n )\n})\n\nfunction decode(assets: EncodedAssetMap): AssetMap {\n return Object.fromEntries(\n Object.entries(assets).map(([key, asset]) => [\n key,\n asset.encoding === \"utf8\" ? asset.content : Buffer.from(asset.content, \"base64\"),\n ]),\n )\n}\n\nfunction isText(file: string) {\n return file === \"_headers\" || /\\.(?:css|html|js|json|svg|txt|webmanifest|xml)$/.test(file)\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": "0A0ABE4D2C1DA20664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/models.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.models,\n Effect.fn(\"cli.models\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const response = yield* Effect.promise(() => client.model.list({ location: { directory: process.cwd() } }))\n const models = response.data\n .map((model) => `${model.providerID}/${model.id}`)\n .toSorted((a, b) => a.localeCompare(b))\n if (models.length > 0) process.stdout.write(models.join(EOL) + EOL)\n }),\n)\n"
],
"mappings": ";giCAGA,cAAS,WAKT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EAEK,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KACrB,IAAI,CAAC,IAAU,GAAG,EAAM,cAAc,EAAM,IAAI,EAChD,SAAS,CAAC,EAAG,IAAM,EAAE,cAAc,CAAC,CAAC,EACxC,GAAI,EAAO,OAAS,EAAG,QAAQ,OAAO,MAAM,EAAO,KAAK,CAAG,EAAI,CAAG,EACnE,CACH",
"debugId": "5821BA922140A58E64756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

{
"version": 3,
"sources": ["src/commands/handlers/import.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionTransfer } from \"@opencode-ai/schema/session-transfer\"\nimport { Effect, Option, Schema } from \"effect\"\nimport { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.import,\n Effect.fn(\"cli.import\")(function* (input) {\n const text = yield* Effect.tryPromise({\n try: () =>\n input.file.startsWith(\"http://\") || input.file.startsWith(\"https://\")\n ? fetch(input.file).then((response) => {\n if (!response.ok) throw new Error(`Failed to fetch session data: ${response.statusText}`)\n return response.text()\n })\n : Bun.file(input.file).text(),\n catch: (cause) =>\n new Error(`Failed to read session data: ${cause instanceof Error ? cause.message : String(cause)}`),\n })\n const data = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(SessionTransfer.Data))(text)\n const encoded = Schema.encodeSync(SessionTransfer.Data)(data)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const location = yield* Effect.promise(() =>\n client.location.get({\n location: { directory: path.resolve(Option.getOrElse(input.directory, () => process.cwd())) },\n }),\n )\n const response = yield* Effect.promise(() =>\n fetch(new URL(\"/api/session/import\", server.endpoint.url), {\n method: \"POST\",\n headers: { ...Service.headers(server.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...encoded,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n }),\n }),\n )\n if (response.status === 409) {\n process.stderr.write(`Session already exists${EOL}`)\n return\n }\n if (!response.ok) yield* Effect.fail(new Error(`Failed to import session: ${response.statusText}`))\n const imported = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ data: Session.Info })))(\n yield* Effect.promise(() => response.text()),\n )\n process.stdout.write(`Imported session: ${imported.data.id}${EOL}`)\n }),\n)\n"
],
"mappings": ";w8CAKA,cAAS,WACT,oBAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAM,KAAK,WAAW,SAAS,GAAK,EAAM,KAAK,WAAW,UAAU,EAChE,MAAM,EAAM,IAAI,EAAE,KAAK,CAAC,IAAa,CACnC,GAAI,CAAC,EAAS,GAAI,MAAU,MAAM,iCAAiC,EAAS,YAAY,EACxF,OAAO,EAAS,KAAK,EACtB,EACD,IAAI,KAAK,EAAM,IAAI,EAAE,KAAK,EAChC,MAAO,CAAC,IACF,MAAM,gCAAgC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAAG,CACtG,CAAC,EACK,EAAO,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAgB,IAAI,CAAC,EAAE,CAAI,EAC1F,EAAU,EAAO,WAAW,EAAgB,IAAI,EAAE,CAAI,EACtD,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAW,MAAO,EAAO,QAAQ,IACrC,EAAO,SAAS,IAAI,CAClB,SAAU,CAAE,UAAW,EAAK,QAAQ,EAAO,UAAU,EAAM,UAAW,IAAM,QAAQ,IAAI,CAAC,CAAC,CAAE,CAC9F,CAAC,CACH,EACM,EAAW,MAAO,EAAO,QAAQ,IACrC,MAAM,IAAI,IAAI,sBAAuB,EAAO,SAAS,GAAG,EAAG,CACzD,OAAQ,OACR,QAAS,IAAK,EAAQ,QAAQ,EAAO,QAAQ,EAAG,eAAgB,kBAAmB,EACnF,KAAM,KAAK,UAAU,IAChB,EACH,SAAU,CAAE,UAAW,EAAS,UAAW,YAAa,EAAS,WAAY,CAC/E,CAAC,CACH,CAAC,CACH,EACA,GAAI,EAAS,SAAW,IAAK,CAC3B,QAAQ,OAAO,MAAM,yBAAyB,GAAK,EACnD,OAEF,GAAI,CAAC,EAAS,GAAI,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAS,YAAY,CAAC,EAClG,IAAM,EAAW,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAO,OAAO,CAAE,KAAM,EAAQ,IAAK,CAAC,CAAC,CAAC,EAC7G,MAAO,EAAO,QAAQ,IAAM,EAAS,KAAK,CAAC,CAC7C,EACA,QAAQ,OAAO,MAAM,qBAAqB,EAAS,KAAK,KAAK,GAAK,EACnE,CACH",
"debugId": "C59C54865F20F2B464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/version.ts"],
"sourcesContent": [
"declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n"
],
"mappings": ";AAGA,IAAM,EAAiD,kBACjD,EAAiD,MAGhD,IAAM,EAAiB",
"debugId": "9DA15B077484707A64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "C4F86025DA3C956C64756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

{
"version": 3,
"sources": ["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": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,QACnC,EAAO,GAAG,qBAAqB,EAAE,SAAU,EAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "B12C64E1114CEEA564756E2164756E21",
"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": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,EAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "95DE40FAC869802764756E2164756E21",
"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\"\nimport { Global } from \"@opencode-ai/util/global\"\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({\n server: serverURL,\n standalone: input.standalone,\n mismatch: \"replace\",\n })\n const config = yield* Config.Service\n const global = yield* Global.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: Option.getOrUndefined(input.replay) ?? resolved.mini?.replay ?? true,\n replayLimit: Option.getOrUndefined(input.replayLimit) ?? resolved.mini?.replay_limit,\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n paths: { home: global.home, state: global.state, log: global.log },\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAQA,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAM,CAAC,IACtD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,UAAS,wBAAyB,MAAO,EAAO,QAAQ,IAAa,wCAAa,EAC1F,MAAO,EAAO,QAAQ,SAAY,EAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EACR,WAAY,EAAM,WAClB,SAAU,SACZ,CAAC,EACK,EAAS,MAAO,EAAO,QACvB,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,EAAO,eAAe,EAAM,MAAM,GAAK,EAAS,MAAM,QAAU,GACxE,YAAa,EAAO,eAAe,EAAM,WAAW,GAAK,EAAS,MAAM,aACxE,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,EACA,MAAO,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CACnE,CAAC,CACH,EACD,CACH",
"debugId": "5769DF631F16904864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/config.ts"],
"sourcesContent": [
"import { EOL } from \"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.debug.commands.config,\n Effect.fn(\"cli.debug.config\")(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 entries = yield* Effect.promise(() => client.config.get({ location: { directory: process.cwd() } }))\n process.stdout.write(JSON.stringify(entries, null, 2) + EOL)\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,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,EACpF,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACzG,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAS,KAAM,CAAC,EAAI,CAAG,EAC5D,CACH",
"debugId": "310EF66AA206BC0F64756E2164756E21",
"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": "FB3258041526C59464756E2164756E21",
"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 { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderOptions,\n type ProviderMetadata,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n} from \"../schema/index.js\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared.js\"\nimport { GeminiToolSchema } from \"./utils/gemini-tool-schema.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\n\nconst ADAPTER = \"gemini\"\n// Google documents this sentinel for replaying Gemini 3 function calls after their original signature was lost.\nconst SKIP_THOUGHT_SIGNATURE_VALIDATOR = \"skip_thought_signature_validator\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\n// Gemini 3 rejects replayed function calls without a thought signature. Google's SDKs avoid that in normal chats by\n// retaining complete model responses, but OpenCode reconstructs durable history and may encounter an unsigned call\n// from an older or external session. Model IDs are open-ended, so unknown Gemini aliases inherit current behavior.\nconst requiresThoughtSignatureFallback = (modelID: string) => {\n if (!/(^|\\/)gemini-/i.test(modelID)) return false\n if (/(^|\\/)gemini-(?:1|2)(?:[.-]|$)/i.test(modelID)) return false\n if (/(^|\\/)gemini-pro(?:-vision)?$/i.test(modelID)) return false\n return !/(^|\\/)gemini-robotics-er-1\\.5(?:[.-]|$)/i.test(modelID)\n}\n\nexport interface OptionsInput {\n readonly [key: string]: unknown\n readonly cachedContent?: string\n readonly safetySettings?: ReadonlyArray<{\n readonly category:\n | \"HARM_CATEGORY_UNSPECIFIED\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\"\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_CIVIC_INTEGRITY\"\n | (string & {})\n readonly threshold:\n | \"HARM_BLOCK_THRESHOLD_UNSPECIFIED\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_ONLY_HIGH\"\n | \"BLOCK_NONE\"\n | \"OFF\"\n | (string & {})\n }>\n readonly serviceTier?: \"standard\" | \"flex\" | \"priority\" | (string & {})\n readonly thinkingConfig?: {\n readonly thinkingBudget?: number\n readonly includeThoughts?: boolean\n readonly thinkingLevel?: \"minimal\" | \"low\" | \"medium\" | \"high\" | (string & {})\n }\n}\n\nexport type ProviderOptionsInput = ProviderOptions & {\n readonly gemini?: OptionsInput\n}\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})\ntype GeminiInlineDataPart = Schema.Schema.Type<typeof GeminiInlineDataPart>\n\nconst GeminiFunctionCallPart = Schema.Struct({\n functionCall: Schema.Struct({\n id: Schema.optional(Schema.String),\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 id: Schema.optional(Schema.String),\n name: Schema.String,\n response: Schema.Unknown,\n parts: Schema.optional(Schema.Array(GeminiInlineDataPart)),\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 thinkingLevel: Schema.optional(Schema.String),\n})\n\nconst GeminiSafetySetting = Schema.Struct({\n category: Schema.String,\n threshold: Schema.String,\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 frequencyPenalty: Schema.optional(Schema.Number),\n presencePenalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n thinkingConfig: Schema.optional(GeminiThinkingConfig),\n})\n\nconst GeminiBodyFields = {\n cachedContent: Schema.optional(Schema.String),\n contents: Schema.Array(GeminiContent),\n safetySettings: optionalArray(GeminiSafetySetting),\n serviceTier: Schema.optional(Schema.String),\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 GeminiPromptFeedback = Schema.StructWithRest(\n Schema.Struct({\n blockReason: Schema.optional(Schema.String),\n blockReasonMessage: Schema.optional(Schema.String),\n safetyRatings: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\ntype GeminiPromptFeedback = Schema.Schema.Type<typeof GeminiPromptFeedback>\n\nconst GeminiEvent = Schema.Struct({\n candidates: optionalArray(GeminiCandidate),\n promptFeedback: Schema.optional(GeminiPromptFeedback),\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 promptFeedback?: GeminiPromptFeedback\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 root parameter schemas while preserving nested empty objects,\n// expand type arrays into `anyOf`, derive `nullable: true` from null members,\n// coerce `const` to `[const]` enum, recurse properties/items, and propagate\n// only an allowlisted set of keys (description, required, format, type,\n// nullable, enum, properties, items, allOf, anyOf, oneOf, minLength).\n// Anything outside the allowlist (e.g. `additionalProperties`, `$ref`) is\n// 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 = ProviderShared.normalizeMedia(part)\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 functionCallId = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.functionCallId === \"string\"\n ? google.functionCallId\n : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart) => ({\n functionCall: { id: functionCallId(part.providerMetadata), 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 // Parallel Gemini 3 calls may carry one signature on the first call; unsigned sibling calls are valid.\n let hasSignedToolCall = false\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 const lowered = lowerToolCall(part)\n const signature = lowered.thoughtSignature\n parts.push({\n ...lowered,\n thoughtSignature:\n signature ??\n (requiresThoughtSignatureFallback(request.model.id) && !hasSignedToolCall\n ? SKIP_THOUGHT_SIGNATURE_VALIDATOR\n : undefined),\n })\n if (signature !== undefined) hasSignedToolCall = true\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 id: functionCallId(part.providerMetadata),\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<Tool.Content> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n const media: GeminiInlineDataPart[] = []\n for (const item of content) {\n if (item.type === \"text\") continue\n const value = ProviderShared.normalizeToolFile(item)\n media.push({ inlineData: { mimeType: value.mime, data: value.base64 } })\n }\n parts.push({\n functionResponse: {\n id: functionCallId(part.providerMetadata),\n name: part.name,\n response: {\n name: part.name,\n content: text.join(\"\\n\"),\n },\n parts: media.length > 0 ? media : undefined,\n },\n })\n }\n contents.push({ role: \"user\", parts })\n }\n\n return contents\n})\n\nconst resolveOptions = (request: LLMRequest) => {\n const input = request.providerOptions?.gemini\n const value = input?.thinkingConfig\n const thinkingConfig = {\n thinkingBudget:\n ProviderShared.isRecord(value) && typeof value.thinkingBudget === \"number\" ? value.thinkingBudget : undefined,\n includeThoughts:\n ProviderShared.isRecord(value) && typeof value.includeThoughts === \"boolean\"\n ? value.includeThoughts\n : ProviderShared.isRecord(value)\n ? true\n : undefined,\n thinkingLevel:\n ProviderShared.isRecord(value) && typeof value.thinkingLevel === \"string\" ? value.thinkingLevel : undefined,\n }\n return {\n cachedContent: typeof input?.cachedContent === \"string\" ? input.cachedContent : undefined,\n safetySettings: mapSafetySettings(input?.safetySettings),\n serviceTier: typeof input?.serviceTier === \"string\" ? input.serviceTier : undefined,\n thinkingConfig: Object.values(thinkingConfig).some((item) => item !== undefined) ? thinkingConfig : undefined,\n }\n}\n\nfunction mapSafetySettings(value: unknown) {\n if (!Array.isArray(value)) return undefined\n const settings = value.flatMap((item) =>\n ProviderShared.isRecord(item) && typeof item.category === \"string\" && typeof item.threshold === \"string\"\n ? [{ category: item.category, threshold: item.threshold }]\n : [],\n )\n return settings\n}\n\nconst fromRequest = Effect.fn(\"Gemini.fromRequest\")(function* (request: LLMRequest) {\n const hasTools = request.tools.length > 0\n const generation = request.generation\n const options = resolveOptions(request)\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 frequencyPenalty: generation?.frequencyPenalty,\n presencePenalty: generation?.presencePenalty,\n seed: generation?.seed,\n stopSequences: generation?.stop,\n thinkingConfig: options.thinkingConfig,\n }\n\n return {\n cachedContent: options.cachedContent,\n contents: yield* lowerMessages(request),\n safetySettings: options.safetySettings,\n serviceTier: options.serviceTier,\n systemInstruction:\n request.system.length === 0 ? undefined : { parts: [{ text: ProviderShared.joinText(request.system) }] },\n tools: hasTools\n ? [\n {\n functionDeclarations: request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n },\n ]\n : undefined,\n toolConfig: hasTools && 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 === undefined) return hasToolCalls ? \"tool-calls\" : \"unknown\"\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 finishReason === \"MODEL_ARMOR\" ||\n finishReason === \"IMAGE_PROHIBITED_CONTENT\" ||\n finishReason === \"IMAGE_RECITATION\" ||\n finishReason === \"LANGUAGE\"\n )\n return \"content-filter\"\n if (\n finishReason === \"MALFORMED_FUNCTION_CALL\" ||\n finishReason === \"UNEXPECTED_TOOL_CALL\" ||\n finishReason === \"NO_IMAGE\" ||\n finishReason === \"TOO_MANY_TOOL_CALLS\" ||\n finishReason === \"MISSING_THOUGHT_SIGNATURE\" ||\n finishReason === \"MALFORMED_RESPONSE\"\n )\n return \"error\"\n return \"unknown\"\n}\n\nconst finish = (state: ParserState): ReadonlyArray<LLMEvent> => {\n const promptBlockReason = state.finishReason === undefined ? state.promptFeedback?.blockReason : undefined\n const finishReason = state.finishReason ?? promptBlockReason\n if (finishReason === undefined && state.usage === undefined) return []\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: {\n normalized:\n promptBlockReason === undefined ? mapFinishReason(finishReason, state.hasToolCalls) : \"content-filter\",\n raw: finishReason,\n },\n usage: state.usage,\n providerMetadata:\n state.promptFeedback === undefined ? undefined : googleMetadata({ promptFeedback: state.promptFeedback }),\n })\n return events\n}\n\nconst step = (state: ParserState, event: GeminiEvent) => {\n const nextState = {\n ...state,\n promptFeedback: event.promptFeedback ?? state.promptFeedback,\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 const metadata = {\n ...(part.functionCall.id === undefined ? {} : { functionCallId: part.functionCall.id }),\n ...(part.thoughtSignature === undefined ? {} : { thoughtSignature: part.thoughtSignature }),\n }\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: Object.keys(metadata).length > 0 ? googleMetadata(metadata) : 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.js\"\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.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n type ProviderMetadata,\n} from \"../schema/index.js\"\nimport { ProviderShared } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\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 AIError({\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>, AIError> => {\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.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { HttpOptions, ProviderID, mergeHttpOptions, type ModelID } from \"../schema/index.js\"\nimport { Gemini } from \"../protocols/gemini.js\"\nimport { GoogleImages } from \"../protocols/google-images.js\"\n\nexport type { GoogleImageOptions } from \"../protocols/google-images.js\"\nexport type GeminiOptionsInput = Gemini.OptionsInput\nexport type GeminiProviderOptionsInput = Gemini.ProviderOptionsInput\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 readonly providerOptions?: Gemini.ProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: Gemini.ProviderOptionsInput\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<Gemini.ProviderOptionsInput>({ id: modelID }),\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, Gemini.ProviderOptionsInput>[\"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": "CAF816C9E0368C2164756E2164756E21",
"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": ";u9BAAA,cAAS,WAST,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,OAC/B,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "169AF9E03063C63064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"],
"sourcesContent": [
"import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { 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 (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\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 return { model, agent: next.agent }\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 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 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 LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n ToolContent,\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 { nonEmptyToolContent, 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 metadata: Record<string, JsonValue>\n content: ToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.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.inbox.delivered\") {\n if (event.data.inboxID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.id), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n metadata: {},\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.id))\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.id))\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.id)\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 metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) {\n current.metadata = event.data.metadata\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\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 metadata: event.data.metadata,\n content: event.data.content,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\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 metadata: event.data.metadata,\n content: event.data.content,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const metadata = event.data.metadata ?? current.metadata\n const content = event.data.content ?? nonEmptyToolContent(current.content)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\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 metadata,\n content,\n error: event.data.error,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (content && toolOutputText(current.tool, content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n metadata,\n content,\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 (input.compatibility === \"v1\" && event.data.error.message === \"The provider response ended unexpectedly.\") {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n partID: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n id: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (item.state.content && toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({\n ...item,\n state: {\n status: \"completed\",\n input: item.state.input,\n metadata: item.state.metadata,\n content: item.state.content,\n },\n })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\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 if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, id: string) {\n return `${messageID}\\u0000${id}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; id: 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 metadata: {},\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": "3CD5BB354BE4332D64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* (input: { readonly checkVersion?: boolean } = {}) {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: input.checkVersion ? OPENCODE_VERSION : undefined,\n command: [\n ...selfCommand(),\n \"serve\",\n \"--service\",\n ...(process.env.OPENCODE_CPU_PROFILE ? [\"--cpu-profile\", process.env.OPENCODE_CPU_PROFILE] : []),\n ],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": ";ylBAKA,sBAAS,eACT,oBAOO,IAAM,EAAO,EAAO,OAAO,CAChC,SAAU,EAAO,SAAS,EAAO,MAAM,EACvC,KAAM,EAAO,SAAS,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,EAAG,EAAO,oBAAoB,KAAM,CAAC,CAAC,EAC5G,SAAU,EAAO,SAAS,EAAO,MAAM,CACzC,CAAC,EAMD,IAAM,EAAa,EAAO,oBAAoB,EAAO,eAAe,CAAI,CAAC,EACnE,EAAqB,EAAO,oBAAoB,EAAO,eAAe,EAAQ,IAAI,CAAC,EAElF,SAAS,CAAQ,CAAC,EAAU,EAAkB,CACnD,GAAI,IAAY,UAAY,IAAY,OAAS,IAAY,QAAU,IAAY,OAAQ,MAAO,eAClG,MAAO,WAAW,EAAQ,QAAQ,mBAAoB,GAAG,SAGpD,SAAS,CAAW,CAAC,EAAU,EAAkB,CACtD,GAAI,IAAY,UAAY,IAAY,OAAS,IAAY,QAAU,IAAY,OAAQ,MAAO,OAClG,GAAI,IAAY,QAAS,MAAO,OAChC,MAAO,KAAU,OAAO,SAAS,EAAK,KAAK,CAAO,EAAE,MAAM,EAAG,CAAC,EAAG,EAAE,EAAI,MAGlE,SAAS,CAAc,CAAC,EAAU,EAAkB,CACzD,GAAI,IAAY,UAAY,IAAY,QAAS,OACjD,MAAO,WAAW,EAAK,KAAK,CAAO,SAG9B,SAAS,CAAuB,CACrC,EACA,EAAU,EACV,EAAmB,EACnB,CACA,GAAI,IAAY,OAAW,MAAO,GAClC,GAAI,IAAY,EAAkB,MAAO,GACzC,IAAM,EAAS,SAAS,KACxB,GAAI,CAAC,EAAQ,WAAW,CAAM,EAAG,MAAO,GACxC,MAAO,kBAAkB,KAAK,EAAQ,MAAM,EAAO,MAAM,CAAC,EAGrD,IAAM,EAAsB,EAAO,WAAW,SAAU,CAC7D,EACA,EACA,EAAU,EACV,EAAmB,EACnB,CACA,IAAM,EAAK,MAAO,EAAW,WACvB,EAAO,MAAO,EAAG,eAAe,CAAM,EAAE,KAAK,EAAO,MAAM,EAChE,GAAI,EAAO,OAAO,CAAI,EAAG,OACzB,IAAM,EAAe,MAAO,EAAmB,EAAK,KAAK,EAAE,KAAK,EAAO,MAAM,EAC7E,GAAI,EAAO,OAAO,CAAY,EAAG,OACjC,GAAI,CAAC,EAAwB,EAAa,MAAM,QAAS,EAAS,CAAgB,EAAG,OACrF,MAAO,EAAG,gBAAgB,EAAM,EAAK,MAAO,CAAE,KAAM,KAAM,KAAM,GAAM,CAAC,EAAE,KAAK,EAAO,MAAM,EAC5F,EAEY,EAAgB,EAAO,WAAW,SAAU,CAAC,EAAgB,EAAc,CACtF,IAAM,EAAK,MAAO,EAAW,WACvB,EAAO,MAAO,EAAG,eAAe,CAAM,EAAE,KAAK,EAAO,MAAM,EAChE,GAAI,EAAO,OAAO,CAAI,EAAG,OACzB,GAAI,EAAO,OAAO,MAAO,EAAW,EAAK,KAAK,EAAE,KAAK,EAAO,MAAM,CAAC,EAAG,OACtE,MAAO,EAAG,gBAAgB,EAAM,EAAK,MAAO,CAAE,KAAM,KAAM,KAAM,GAAM,CAAC,EAAE,KAAK,EAAO,MAAM,EAC5F,EAED,SAAS,CAAS,CAAC,EAAkB,CACnC,GAAI,IAAQ,YAAc,IAAQ,QAAU,IAAQ,WAAY,OAAO,EACvE,MAAU,MAAM,+BAA+B,GAAK,EAGtD,IAAM,EAAQ,EAAO,IAAI,SAAU,EAAG,CACpC,IAAM,EAAK,MAAO,EAAW,WACvB,EAAS,MAAO,EAAO,QACvB,EAAO,EAAS,EAChB,EAAS,EAAe,EACxB,EAAO,EAAK,KAAK,EAAO,MAAO,CAAI,EACzC,MAAO,CACL,KACA,OACA,iBAAkB,EAAS,EAAK,KAAK,EAAO,OAAQ,CAAM,EAAI,OAC9D,wBAAyB,CACvB,GAAI,EAAS,CAAC,EAAK,KAAK,EAAO,MAAO,CAAM,CAAC,EAAI,CAAC,EAClD,GAAI,IAAS,gBAAkB,IAAqB,QAAU,CAAC,EAAK,KAAK,EAAO,MAAO,cAAc,CAAC,EAAI,CAAC,CAC7G,EACA,WAAY,EAAK,KAAK,EAAO,OAAQ,CAAI,CAC3C,EACD,EAEY,EAAU,EAAO,WAAW,SAAU,CAAC,EAA6C,CAAC,EAAG,CACnG,IAAQ,OAAM,2BAA4B,MAAO,EAEjD,OADA,MAAO,EAAO,QAAQ,EAAyB,CAAC,IAAW,EAAoB,EAAQ,CAAI,CAAC,EACrF,CACL,OACA,QAAS,EAAM,aAAe,EAAmB,OACjD,QAAS,CACP,GAAG,EAAY,EACf,QACA,YACA,GAAI,QAAQ,IAAI,qBAAuB,CAAC,gBAAiB,QAAQ,IAAI,oBAAoB,EAAI,CAAC,CAChG,CACF,EACD,EAEY,EAAO,EAAO,GAAG,yBAAyB,EAAE,SAAU,EAAG,CACpE,IAAQ,KAAI,aAAY,oBAAqB,MAAO,EACpD,GAAI,EAAkB,MAAO,EAAc,EAAkB,CAAU,EACvE,OAAO,MAAO,EAAG,eAAe,CAAU,EAAE,KAC1C,EAAO,QAAQ,CAAU,EACzB,EAAO,MAAM,IAAM,EAAO,QAAQ,CAAC,CAAS,CAAC,CAC/C,EACD,EAEK,EAAQ,EAAO,GAAG,0BAA0B,EAAE,SAAU,CAAC,EAAa,CAC1E,IAAQ,KAAI,cAAe,MAAO,EAC5B,EAAO,EAAa,OAC1B,MAAO,EAAG,cAAc,EAAK,QAAQ,CAAU,EAAG,CAAE,UAAW,EAAK,CAAC,EACrE,MAAO,EAAG,gBAAgB,EAAM,KAAK,UAAU,EAAO,KAAM,CAAC,EAAI;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EACtF,MAAO,EAAG,OAAO,EAAM,CAAU,EAClC,EAEY,EAAW,EAAO,GAAG,6BAA6B,EAAE,SAAU,CAAC,EAAgB,CAC1F,IAAM,EAAW,MAAO,EAAK,EAC7B,GAAI,IAAU,QAAa,EAAS,SAAU,OAAO,EAAS,SAC9D,IAAM,EAAO,GAAS,EAAY,EAAE,EAAE,SAAS,WAAW,EAK1D,OADA,MAAO,EAAM,IAAK,EAAU,SAAU,CAAK,CAAC,EACrC,EACR,EAEY,EAAM,EAAO,GAAG,wBAAwB,EAAE,SAAU,CAAC,EAAc,CAC9E,GAAI,IAAQ,OAAW,CACrB,IAAQ,SAAU,KAAc,GAAS,MAAO,EAAK,EACrD,OAAO,KAAK,UAAU,EAAM,KAAM,CAAC,EAErC,OAAQ,EAAU,CAAG,OACd,WACH,OAAQ,MAAO,EAAK,GAAG,UAAY,OAEhC,OAAQ,CACX,IAAM,GAAQ,MAAO,EAAK,GAAG,KAC7B,OAAO,IAAS,OAAY,GAAK,OAAO,CAAI,CAC9C,KACK,WACH,OAAO,MAAO,EAAS,EAG3B,MAAU,MAAM,+BAA+B,GAAK,EACrD,EAEY,EAAM,EAAO,GAAG,wBAAwB,EAAE,SAAU,CAAC,EAAa,EAAe,CAC5F,OAAQ,EAAU,CAAG,OACd,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,MAAO,EAAM,IAAM,MAAO,EAAK,EAAI,SAAU,CAAM,CAAC,EACpD,MACF,KACK,OAAQ,CACX,IAAM,EAAO,OAAO,CAAK,EACzB,GAAI,CAAC,OAAO,UAAU,CAAI,GAAK,EAAO,GAAK,EAAO,MAAQ,MAAU,MAAM,kCAAkC,EAC5G,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,MAAO,EAAM,IAAM,MAAO,EAAK,EAAI,MAAK,CAAC,EACzC,MACF,KACK,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,MAAO,EAAS,CAAK,EACrB,MACF,GAEH,EAEY,EAAQ,EAAO,GAAG,0BAA0B,EAAE,SAAU,CAAC,EAAa,CACjF,OAAQ,EAAU,CAAG,OACd,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,IAAQ,SAAU,KAAc,GAAS,MAAO,EAAK,EACrD,MAAO,EAAM,CAAI,EACjB,MACF,KACK,OAAQ,CACX,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,IAAQ,KAAM,KAAU,GAAS,MAAO,EAAK,EAC7C,MAAO,EAAM,CAAI,EACjB,MACF,KACK,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,IAAQ,SAAU,KAAc,GAAS,MAAO,EAAK,EACrD,MAAO,EAAM,CAAI,EACjB,MACF,GAEH",
"debugId": "48AD3F43345FB9C664756E2164756E21",
"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+5f449c48df7de738/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+5f449c48df7de738/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": "E5C92705FC0C259964756E2164756E21",
"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 || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n"
],
"mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,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,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH",
"debugId": "CC02D734CA9C84E664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/plugin/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,KAClC,EAAO,GAAG,iBAAiB,EAAE,SAAU,EAAG,CACxC,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,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": "ECCE97B14418C4C764756E2164756E21",
"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": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,OACnC,EAAO,GAAG,oBAAoB,EAAE,SAAU,EAAG,CAC3C,IAAM,EAAU,MAAO,EAAc,QAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH",
"debugId": "720DF74CF5CDDC1364756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"],
"sourcesContent": [
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}",
"import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n ...(server ? { answer: { 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": "72DA89E8D46185B364756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/server-connection.ts"],
"sourcesContent": [
"import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const mismatch = args.mismatch ?? \"ignore\"\n const options = yield* ServiceConfig.options({ checkVersion: mismatch !== \"ignore\" })\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, mismatch),\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* (options: EnsureOptions, mismatch: NonNullable<Args[\"mismatch\"]>) {\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": ";6eAoBO,IAAM,EAAU,EAAO,GAAG,+BAA+B,EAAE,SAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAW,EAAK,UAAY,SAC5B,EAAU,MAAO,EAAc,QAAQ,CAAE,aAAc,IAAa,QAAS,CAAC,EACpF,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,CAAQ,EAC/E,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CAAC,EAAwB,EAAyC,CACnH,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC",
"debugId": "F2D2A57D8223BAC964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../core/src/workspace/driver.ts", "../core/src/workspace/sql.ts", "../core/src/workspace.ts", "../core/src/environment/files.ts", "../core/src/environment/exec-defaults.ts", "../core/src/environment/local.ts", "../core/src/environment/memory.ts", "../core/src/environment/environment.ts", "../core/src/environment/index.ts"],
"sourcesContent": [
"export * as WorkspaceDriver from \"./driver.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport type { Scope } from \"effect\"\nimport type { Driver as EnvironmentDriver } from \"../environment/driver.js\"\n\n/**\n * Smallest provider-owned JSON value required to reconnect to the same\n * provider resource. Core stores it opaquely and hands it back; only the\n * owning driver reads inside.\n */\nexport const Binding = Schema.Record(Schema.String, Schema.Json)\nexport type Binding = typeof Binding.Type\n\nexport class Error extends Schema.TaggedErrorClass<Error>()(\"WorkspaceDriver.Error\", {\n message: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {}\n\nexport class ProviderNotFound extends Schema.TaggedErrorClass<ProviderNotFound>()(\"WorkspaceDriver.ProviderNotFound\", {\n provider: Schema.String,\n}) {}\n\nexport interface Interface {\n readonly create: (input: {\n readonly workspaceID: Workspace.ID\n }) => Effect.Effect<{ readonly binding: Binding }, Error>\n readonly connect: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<EnvironmentDriver, Error, Scope.Scope>\n readonly suspendForIdle: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<void, Error>\n readonly destroy: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n }) => Effect.Effect<void, Error>\n}\n\nexport const make = (driver: Interface) => driver\n\nexport interface Registry {\n readonly get: (provider: string) => Effect.Effect<Interface, ProviderNotFound>\n}\n\nexport class RegistryService extends Context.Service<RegistryService, Registry>()(\n \"@opencode/WorkspaceDriverRegistry\",\n) {}\n\nexport const registry = (drivers: Readonly<Record<string, Interface>>): Registry => ({\n get: (provider) => {\n const driver = Object.hasOwn(drivers, provider) ? drivers[provider] : undefined\n return driver ? Effect.succeed(driver) : Effect.fail(new ProviderNotFound({ provider }))\n },\n})\n\nexport const registryNode = (drivers: Readonly<Record<string, Interface>>) =>\n makeGlobalNode({\n service: RegistryService,\n layer: Layer.succeed(RegistryService, RegistryService.of(registry(drivers))),\n deps: [],\n })\n\nexport const node = registryNode({})\n",
"import { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\"\nimport type { WorkspaceDriver } from \"./driver.js\"\n\nexport const WorkspaceTable = sqliteTable(\"workspace\", {\n id: text().$type<Workspace.ID>().primaryKey(),\n provider: text().notNull(),\n binding: text({ mode: \"json\" }).$type<WorkspaceDriver.Binding>().notNull(),\n created_at: integer().notNull(),\n last_used_at: integer().notNull(),\n})\n",
"export * as Workspace from \"./workspace.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { eq } from \"drizzle-orm\"\nimport { Clock, Context, Duration, Effect, Exit, Layer, Ref, Schedule, Schema, Scope } from \"effect\"\nimport { systemError } from \"effect/PlatformError\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver as EnvironmentDriver } from \"./environment/driver.js\"\nimport { Database } from \"./database/database.js\"\nimport { KeyedMutex } from \"./effect/keyed-mutex.js\"\nimport { WorkspaceDriver } from \"./workspace/driver.js\"\nimport { WorkspaceTable } from \"./workspace/sql.js\"\n\nexport const ID = Workspace.ID\nexport type ID = Workspace.ID\n\nexport class Info extends Schema.Class<Info>(\"Workspace.Info\")({\n id: ID,\n provider: Schema.String,\n binding: WorkspaceDriver.Binding,\n createdAt: Schema.Number,\n lastUsedAt: Schema.Number,\n}) {}\n\nexport class NotFound extends Schema.TaggedErrorClass<NotFound>()(\"Workspace.NotFound\", { workspaceID: ID }) {}\n\nexport interface Interface {\n readonly create: (provider: string) => Effect.Effect<Info, WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly connect: (\n workspaceID: ID,\n ) => Effect.Effect<EnvironmentDriver, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly destroy: (\n workspaceID: ID,\n ) => Effect.Effect<void, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n}\n\nexport interface Options {\n readonly idleThreshold?: Duration.Input\n readonly pollInterval?: Duration.Input\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Workspace\") {}\n\ninterface Connection {\n readonly driver: WorkspaceDriver.Interface\n readonly environment: EnvironmentDriver\n readonly saveBinding: (binding: WorkspaceDriver.Binding) => Effect.Effect<void>\n readonly lastActivity: Ref.Ref<number>\n readonly active: Ref.Ref<number>\n readonly scope: Scope.Closeable\n}\n\nexport const configured = (options: Options = {}) =>\n makeGlobalNode({\n service: Service,\n layer: layer(options),\n deps: [Database.node, WorkspaceDriver.node],\n })\n\nconst layer = (options: Options) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const db = (yield* Database.Service).db\n const registry = yield* WorkspaceDriver.RegistryService\n const lifetime = yield* Scope.Scope\n const connections = new Map<ID, Connection>()\n const locks = KeyedMutex.makeUnsafe<ID>()\n const idleThreshold = Duration.toMillis(options.idleThreshold ?? Duration.minutes(20))\n\n const load = Effect.fn(\"Workspace.load\")(function* (workspaceID: ID) {\n const row = yield* db\n .select()\n .from(WorkspaceTable)\n .where(eq(WorkspaceTable.id, workspaceID))\n .get()\n .pipe(Effect.orDie)\n if (!row) return yield* new NotFound({ workspaceID })\n return row\n })\n\n const open = Effect.fn(\"Workspace.open\")(function* (workspaceID: ID) {\n const existing = connections.get(workspaceID)\n if (existing) return existing\n\n const row = yield* load(workspaceID)\n const driver = yield* registry.get(row.provider)\n const saveBinding = (value: WorkspaceDriver.Binding) =>\n db\n .update(WorkspaceTable)\n .set({ binding: value })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n const scope = yield* Scope.fork(lifetime)\n const environment = yield* driver.connect({ workspaceID, binding: row.binding, saveBinding }).pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n )\n const now = yield* Clock.currentTimeMillis\n const connection: Connection = {\n driver,\n environment,\n saveBinding,\n lastActivity: yield* Ref.make(now),\n active: yield* Ref.make(0),\n scope,\n }\n connections.set(workspaceID, connection)\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: now })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n return connection\n })\n\n yield* Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis\n yield* Effect.forEach(\n [...connections.entries()],\n ([workspaceID, expected]) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = connections.get(workspaceID)\n if (connection !== expected || (yield* Ref.get(connection.active)) > 0) return\n const lastActivity = yield* Ref.get(connection.lastActivity)\n if (now - lastActivity < idleThreshold) return\n const row = yield* load(workspaceID)\n // Deliberate: a racing spawn blocks, then wakes cleanly. Unlocking mid-suspend could reattach a sandbox being terminated.\n yield* connection.driver.suspendForIdle({\n workspaceID,\n binding: row.binding,\n saveBinding: connection.saveBinding,\n })\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: lastActivity })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n connections.delete(workspaceID)\n yield* Scope.close(connection.scope, Exit.void)\n }).pipe(Effect.catchCause((cause) => Effect.logError(\"workspace idle suspension failed\", cause))),\n ),\n { concurrency: \"unbounded\", discard: true },\n )\n }).pipe(Effect.repeat(Schedule.spaced(options.pollInterval ?? Duration.minutes(1))), Effect.forkScoped)\n\n return Service.of({\n create: Effect.fn(\"Workspace.create\")(function* (provider) {\n const driver = yield* registry.get(provider)\n const workspaceID = ID.create()\n const result = yield* driver.create({ workspaceID })\n const now = yield* Clock.currentTimeMillis\n yield* db\n .insert(WorkspaceTable)\n .values({ id: workspaceID, provider, binding: result.binding, created_at: now, last_used_at: now })\n .run()\n .pipe(Effect.orDie)\n return new Info({ id: workspaceID, provider, binding: result.binding, createdAt: now, lastUsedAt: now })\n }),\n connect: Effect.fn(\"Workspace.connect\")(function* (workspaceID) {\n const spawner = make((command) =>\n Effect.acquireRelease(\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = yield* open(workspaceID).pipe(\n Effect.mapError((cause) =>\n systemError({\n _tag: \"Unknown\",\n module: \"Workspace\",\n method: \"spawn\",\n description: `Failed to wake workspace ${workspaceID}`,\n cause,\n }),\n ),\n )\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n yield* Ref.update(connection.active, (active) => active + 1)\n return connection\n }),\n ),\n (connection) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n yield* Ref.update(connection.active, (active) => active - 1)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n }),\n ),\n ).pipe(Effect.flatMap((connection) => connection.environment.spawner.spawn(command))),\n )\n // Overrides are connection-bound; per-spawn routing is required before any driver ships them, so they are deliberately omitted.\n return { spawner }\n }),\n destroy: Effect.fn(\"Workspace.destroy\")(function* (workspaceID) {\n yield* locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* load(workspaceID)\n const connection = connections.get(workspaceID)\n connections.delete(workspaceID)\n if (connection) yield* Scope.close(connection.scope, Exit.void)\n const driver = yield* registry.get(row.provider)\n yield* driver.destroy({ workspaceID, binding: row.binding })\n yield* db.delete(WorkspaceTable).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n }),\n )\n }),\n })\n }),\n )\n\nexport const node = configured()\n\n// TODO(workspace-plan): add the boot janitor and ~23h safety snapshot rotation in a later PR.\n// TODO(workspace-plan): make cold wake interruptible with a re-pin loop against janitor races.\n// TODO(workspace-plan): consider RcMap at end-of-series consolidation; idle suspend and destroy need distinct finalizers.\n",
"import { Effect, Schema } from \"effect\"\n\nexport const FileType = Schema.Literals([\"file\", \"directory\", \"symlink\", \"other\"])\nexport type FileType = typeof FileType.Type\n\nexport interface FileInfo {\n readonly type: FileType\n readonly size: number\n readonly mtimeMs: number\n}\n\nexport interface DirEntry {\n readonly name: string\n readonly type: FileType\n}\n\nexport class NotFound extends Schema.TaggedErrorClass<NotFound>()(\"Environment.NotFound\", {\n path: Schema.String,\n}) {}\n\nexport class WrongKind extends Schema.TaggedErrorClass<WrongKind>()(\"Environment.WrongKind\", {\n path: Schema.String,\n actual: FileType,\n}) {}\n\nexport class Failed extends Schema.TaggedErrorClass<Failed>()(\"Environment.Failed\", {\n path: Schema.String,\n cause: Schema.Defect(),\n}) {}\n\nexport interface FilesImpl {\n /**\n * Content operations (`read`, `list`) follow final symlinks; metadata operations (`stat` and entry\n * tags returned by `list`) do not. `info` describes the target file whose bytes are returned.\n * The process-backed default caps collected output at 64 MiB; larger whole-file reads fail with\n * `Failed`, so callers must use ranges for larger files.\n */\n readonly read: (\n path: string,\n range?: { readonly offset: number; readonly length: number },\n ) => Effect.Effect<{ readonly info: FileInfo; readonly bytes: Uint8Array }, NotFound | WrongKind | Failed>\n readonly write: (path: string, bytes: Uint8Array) => Effect.Effect<void, Failed>\n /** Describes the path entry itself, so a final symlink is reported as `symlink` rather than followed. */\n readonly stat: (path: string) => Effect.Effect<FileInfo, NotFound | Failed>\n /** Follows a final symlink to the listed directory while preserving each returned entry's own type. */\n readonly list: (path: string) => Effect.Effect<ReadonlyArray<DirEntry>, NotFound | WrongKind | Failed>\n readonly remove: (path: string) => Effect.Effect<void, Failed>\n readonly move: (from: string, to: string) => Effect.Effect<void, NotFound | Failed>\n readonly mkdir: (path: string) => Effect.Effect<void, Failed>\n}\n\nexport interface Files extends FilesImpl {}\n\n/**\n * Derives a follow-stat kind from the lstat-like Files contract. A dangling\n * symlink fails with `NotFound`.\n */\nexport const typeFollowing = (files: Files, path: string) =>\n files.stat(path).pipe(\n Effect.flatMap((info) =>\n info.type === \"symlink\"\n ? files.read(path, { offset: 0, length: 0 }).pipe(\n Effect.map((result) => result.info.type),\n Effect.catchTag(\"Environment.WrongKind\", (error) => Effect.succeed(error.actual)),\n )\n : Effect.succeed(info.type),\n ),\n )\n\nexport * as EnvironmentFiles from \"./files.js\"\n",
"import { Effect, Stream } from \"effect\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { collectStream } from \"@opencode-ai/util/process\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FileType, type FilesImpl } from \"./files.js\"\n\n/**\n * Files derived from spawning processes: one process per intent, \"$1\" is\n * always the target path. Scripts report classification through an exit-code\n * protocol (44/45/46) so failures never require parsing localized error text;\n * LC_ALL=C pins the one stderr match that remains. Requires GNU coreutils and\n * findutils in the target image — BSD and busybox userlands will not work.\n * Malformed output from these scripts is our own bug and dies as a defect.\n */\n\nconst MAX_DATA_BYTES = 64 * 1024 * 1024\nconst MAX_ERROR_BYTES = 64 * 1024\nconst NOT_FOUND = 44\nconst WRONG_KIND = 45\nconst FAILED = 46\nconst TAB = \"\\t\"\n\nconst loadMetadata = (flags = \"\") => `\nmetadata=$(stat ${flags} -c '%F${TAB}%s${TAB}%Y' -- \"$1\" 2>&1) || {\n case \"$metadata\" in\n *'No such file or directory'*|*'Not a directory'*) exit ${NOT_FOUND} ;;\n *) printf '%s' \"$metadata\" >&2; exit ${FAILED} ;;\n esac\n}\n`\n\nconst statScript = `\n${loadMetadata()}\nprintf '%s\\n' \"$metadata\"\n`\n\nconst readScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != 'regular file' ] && [ \"$kind\" != 'regular empty file' ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nprintf '%s\\n' \"$metadata\"\nif [ \"$2\" = range ]; then\n dd if=\"$1\" iflag=skip_bytes,count_bytes skip=\"$3\" count=\"$4\" status=none\nelse\n cat -- \"$1\"\nfi\n`\n\nconst listScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != directory ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nfind -H \"$1\" -mindepth 1 -maxdepth 1 -printf '%y\\\\0%f\\\\0'\n`\n\nconst moveScript = `\n${loadMetadata()}\nmv -- \"$1\" \"$2\"\n`\n\ninterface Result {\n readonly exitCode: number\n readonly stdout: Uint8Array\n readonly stderr: Uint8Array\n}\n\nexport const execDefaults = (spawner: ChildProcessSpawner[\"Service\"]): FilesImpl => {\n const run = (\n path: string,\n script: string,\n args: ReadonlyArray<string> = [],\n stdin?: Uint8Array,\n ): Effect.Effect<Result, Failed> =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\"sh\", [\"-c\", script, \"sh\", path, ...args], {\n env: { LC_ALL: \"C\" },\n extendEnv: true,\n stdin: stdin === undefined ? undefined : Stream.make(stdin),\n })\n const handle = yield* spawner.spawn(command).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, MAX_DATA_BYTES),\n collectStream(handle.stderr, MAX_ERROR_BYTES),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n if (stdout.truncated || stderr.truncated) {\n return yield* new Failed({ path, cause: new Error(\"Process output exceeded its collection limit\") })\n }\n return { exitCode, stdout: stdout.buffer, stderr: stderr.buffer }\n }),\n )\n\n const classify = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n ): Effect.Effect<A, NotFound | WrongKind | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n if (result.exitCode === WRONG_KIND) {\n return Effect.fail(new WrongKind({ path, actual: parseType(new TextDecoder().decode(result.stderr)) }))\n }\n return Effect.fail(processFailure(path, result))\n }\n\n const complete = (path: string, result: Result) =>\n result.exitCode === 0 ? Effect.void : Effect.fail(processFailure(path, result))\n\n return {\n stat: (path) => run(path, statScript).pipe(Effect.flatMap((result) => classifyPlain(path, result, parseInfo))),\n read: (path, range) =>\n run(\n path,\n readScript,\n range === undefined ? [\"whole\"] : [\"range\", String(range.offset), String(range.length)],\n ).pipe(\n Effect.flatMap((result) =>\n classify(path, result, (stdout) => {\n const newline = stdout.indexOf(10)\n if (newline < 0) throw new Error(\"Missing read metadata header\")\n return {\n info: parseInfo(stdout.slice(0, newline)),\n bytes: stdout.slice(newline + 1),\n }\n }),\n ),\n ),\n write: (path, bytes) =>\n run(path, `mkdir -p \"$(dirname \"$1\")\" && cat > \"$1\"`, [], bytes).pipe(\n Effect.flatMap((result) => complete(path, result)),\n ),\n list: (path) => run(path, listScript).pipe(Effect.flatMap((result) => classify(path, result, parseList))),\n remove: (path) => run(path, `rm -rf -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n move: (from, to) =>\n run(from, moveScript, [to]).pipe(Effect.flatMap((result) => classifyPlain(from, result, () => undefined))),\n mkdir: (path) => run(path, `mkdir -p -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n }\n}\n\n/** `classify` for scripts whose protocol never reports WrongKind. */\nconst classifyPlain = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n): Effect.Effect<A, NotFound | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n return Effect.fail(processFailure(path, result))\n}\n\nconst processFailure = (path: string, result: Result) =>\n new Failed({\n path,\n cause: new Error(new TextDecoder().decode(result.stderr).trim() || `Process exited with code ${result.exitCode}`),\n })\n\nconst parseInfo = (bytes: Uint8Array): FileInfo => {\n const [rawType, rawSize, rawMtime] = new TextDecoder().decode(bytes).trim().split(TAB)\n const size = Number(rawSize)\n const mtimeMs = Number(rawMtime) * 1_000\n if (!rawType || !Number.isFinite(size) || !Number.isFinite(mtimeMs)) throw new Error(\"Invalid stat output\")\n return { type: parseType(rawType), size, mtimeMs }\n}\n\nconst parseType = (value: string): FileType => {\n if (value === \"regular file\" || value === \"regular empty file\" || value === \"f\") return \"file\"\n if (value === \"directory\" || value === \"d\") return \"directory\"\n if (value === \"symbolic link\" || value === \"l\") return \"symlink\"\n return \"other\"\n}\n\nconst parseList = (bytes: Uint8Array) => {\n const fields = new TextDecoder().decode(bytes).split(\"\\0\")\n fields.pop()\n if (fields.length % 2 !== 0) throw new Error(\"Invalid find output\")\n return Array.from({ length: fields.length / 2 }, (_, index) => ({\n name: fields[index * 2 + 1],\n type: parseType(fields[index * 2]),\n }))\n}\n\nexport * as EnvironmentExecDefaults from \"./exec-defaults.js\"\n",
"import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Effect } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\n/**\n * The host filesystem binding. Deliberately raw node:fs rather than effect's\n * FileSystem service or FSUtil: the contract needs lstat semantics (stat\n * reports \"symlink\") and typed directory entries, and effect's node\n * FileSystem provides neither — its stat always follows symlinks and\n * readDirectory returns names only. FSUtil hits the same gap and its\n * readDirectoryEntries already bypasses to raw node readdir internally.\n * Nothing above the environment seam touches node:fs.\n */\nexport const makeLocalDriver = (spawner: ChildProcessSpawner[\"Service\"]): Driver => {\n const overrides: FilesImpl = {\n read: (value, range) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"file\") return yield* new WrongKind({ path: value, actual: info.type })\n if (range === undefined) {\n const bytes = yield* attempt(value, () => fs.readFile(value), true)\n return { info, bytes }\n }\n const bytes = yield* attempt(\n value,\n async () => {\n const handle = await fs.open(value, \"r\")\n try {\n const buffer = new Uint8Array(range.length)\n const result = await handle.read(buffer, 0, range.length, range.offset)\n return buffer.subarray(0, result.bytesRead)\n } finally {\n await handle.close()\n }\n },\n true,\n )\n return { info, bytes }\n }),\n stat: (value) => stat(value, false),\n list: (value) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"directory\") return yield* new WrongKind({ path: value, actual: info.type })\n const entries = yield* attempt(value, () => fs.readdir(value, { withFileTypes: true }), true)\n return entries.map((entry) => ({ name: entry.name, type: fileType(entry) }))\n }),\n write: (value, bytes) =>\n attempt(value, async () => {\n await fs.mkdir(path.dirname(value), { recursive: true })\n await fs.writeFile(value, bytes)\n }),\n remove: (value) => attempt(value, () => fs.rm(value, { recursive: true, force: true })),\n move: (from, to) =>\n Effect.gen(function* () {\n yield* stat(from, false)\n const destination = yield* stat(to, false).pipe(\n Effect.map((info) => (info.type === \"directory\" ? path.join(to, path.basename(from)) : to)),\n Effect.catchIf(\n (error) => error instanceof NotFound,\n () => Effect.succeed(to),\n ),\n )\n yield* attempt(from, () => fs.rename(from, destination))\n }),\n mkdir: (value) => attempt(value, () => fs.mkdir(value, { recursive: true }).then(() => undefined)),\n }\n\n return { spawner, overrides }\n}\n\nconst stat = (value: string, follow: boolean) =>\n attempt(value, () => (follow ? fs.stat(value) : fs.lstat(value)), true).pipe(\n Effect.map((stats): FileInfo => ({ type: fileType(stats), size: stats.size, mtimeMs: stats.mtimeMs })),\n )\n\nconst fileType = (entry: { isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean }): FileType => {\n if (entry.isFile()) return \"file\"\n if (entry.isDirectory()) return \"directory\"\n if (entry.isSymbolicLink()) return \"symlink\"\n return \"other\"\n}\n\nfunction attempt<A>(value: string, run: () => Promise<A>): Effect.Effect<A, Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing: true): Effect.Effect<A, NotFound | Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing = false) {\n return Effect.tryPromise({\n try: run,\n catch: (cause) =>\n missing && isMissing(cause) ? new NotFound({ path: value }) : new Failed({ path: value, cause }),\n })\n}\n\nconst isMissing = (cause: unknown) =>\n cause !== null &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\")\n\nexport * as EnvironmentLocal from \"./local.js\"\n",
"import path from \"node:path\"\nimport { Effect, PlatformError } from \"effect\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\ntype Node =\n | { readonly type: \"file\"; readonly bytes: Uint8Array; readonly mtimeMs: number }\n | { readonly type: \"directory\"; readonly mtimeMs: number }\n | { readonly type: \"symlink\"; readonly target: string; readonly mtimeMs: number }\n\nexport interface MemoryDriver extends Driver {\n readonly symlink: (target: string, path: string) => Effect.Effect<void, Failed>\n}\n\nexport const makeMemoryDriver = (): MemoryDriver => {\n const nodes = new Map<string, Node>([[\"/\", { type: \"directory\", mtimeMs: Date.now() }]])\n const key = (value: string) => path.posix.resolve(\"/\", value)\n const info = (node: Node): FileInfo => ({\n type: node.type,\n size:\n node.type === \"file\"\n ? node.bytes.length\n : node.type === \"symlink\"\n ? new TextEncoder().encode(node.target).length\n : 0,\n mtimeMs: node.mtimeMs,\n })\n const resolveKey = (value: string, followFinal: boolean, seen = new Set<string>()): string | undefined => {\n const normalized = key(value)\n const parts = normalized.split(\"/\").filter(Boolean)\n const base = \"/\"\n const walk = (current: string, index: number): string | undefined => {\n if (index === parts.length) return current\n const part = parts[index]\n const candidate = path.posix.join(current, part)\n const node = nodes.get(candidate)\n if (node?.type !== \"symlink\" || (!followFinal && index === parts.length - 1)) return walk(candidate, index + 1)\n if (seen.has(candidate)) return undefined\n seen.add(candidate)\n const target = path.posix.resolve(path.posix.dirname(candidate), node.target)\n return resolveKey(path.posix.join(target, ...parts.slice(index + 1)), followFinal, seen)\n }\n return walk(base, 0)\n }\n const lookup = (value: string) => nodes.get(resolveKey(value, false) ?? key(value))\n const requireParent = (value: string) => {\n const parentPath = path.posix.dirname(key(value))\n const parent = nodes.get(resolveKey(parentPath, true) ?? parentPath)\n if (!parent) throw new Error(`Parent directory does not exist: ${path.posix.dirname(value)}`)\n if (parent.type !== \"directory\") throw new Error(`Parent is not a directory: ${path.posix.dirname(value)}`)\n }\n const mkdirSync = (value: string) => {\n const target = resolveKey(value, false) ?? key(value)\n const existing = nodes.get(target)\n if (existing?.type === \"directory\") return\n if (existing) throw new Error(`Path is not a directory: ${value}`)\n const parent = path.posix.dirname(target)\n if (parent !== target) mkdirSync(parent)\n nodes.set(target, { type: \"directory\", mtimeMs: Date.now() })\n }\n const failed = (value: string, cause: unknown) => new Failed({ path: value, cause })\n const overrides: FilesImpl = {\n stat: (value) => {\n const node = lookup(value)\n return node ? Effect.succeed(info(node)) : Effect.fail(new NotFound({ path: value }))\n },\n read: (value, range) => {\n const original = lookup(value)\n if (!original) return Effect.fail(new NotFound({ path: value }))\n if (original.type === \"directory\") return Effect.fail(new WrongKind({ path: value, actual: \"directory\" }))\n const resolved = resolveKey(value, true)\n const node = resolved === undefined ? undefined : nodes.get(resolved)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"file\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const bytes = range === undefined ? node.bytes : node.bytes.subarray(range.offset, range.offset + range.length)\n return Effect.succeed({ info: info(node), bytes: bytes.slice() })\n },\n write: (value, bytes) =>\n Effect.try({\n try: () => {\n mkdirSync(path.posix.dirname(key(value)))\n const existing = lookup(value)\n if (existing?.type === \"directory\") throw new Error(`Path is a directory: ${value}`)\n const target = existing?.type === \"symlink\" ? resolveKey(value, true) : resolveKey(value, false)\n if (!target) throw new Error(`Cannot resolve symlink: ${value}`)\n requireParent(target)\n nodes.set(target, { type: \"file\", bytes: bytes.slice(), mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n list: (value) => {\n const target = resolveKey(value, true) ?? key(value)\n const node = nodes.get(target)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"directory\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const entries = [...nodes.entries()]\n .filter(([entry]) => entry !== target && path.posix.dirname(entry) === target)\n .map(([entry, child]) => ({ name: path.posix.basename(entry), type: child.type satisfies FileType }))\n .sort((a, b) => a.name.localeCompare(b.name))\n return Effect.succeed(entries)\n },\n remove: (value) =>\n Effect.sync(() => {\n const target = resolveKey(value, false) ?? key(value)\n for (const entry of nodes.keys()) {\n if (entry === target || entry.startsWith(`${target}/`)) nodes.delete(entry)\n }\n }),\n move: (from, to) => {\n const source = resolveKey(from, false) ?? key(from)\n const node = nodes.get(source)\n if (!node) return Effect.fail(new NotFound({ path: from }))\n return Effect.try({\n try: () => {\n const requested = resolveKey(to, false) ?? key(to)\n const destination =\n nodes.get(requested)?.type === \"directory\"\n ? path.posix.join(requested, path.posix.basename(source))\n : requested\n if (node.type === \"directory\" && destination.startsWith(`${source}/`)) {\n throw new Error(`Cannot move a directory into itself: ${from}`)\n }\n const existing = nodes.get(destination)\n if (node.type === \"directory\" && existing && existing.type !== \"directory\") {\n throw new Error(`Cannot overwrite a non-directory with a directory: ${to}`)\n }\n requireParent(destination)\n const moved = [...nodes.entries()].filter(([entry]) => entry === source || entry.startsWith(`${source}/`))\n for (const [entry] of moved) nodes.delete(entry)\n for (const [entry, child] of moved) nodes.set(`${destination}${entry.slice(source.length)}`, child)\n },\n catch: (cause) => failed(from, cause),\n })\n },\n mkdir: (value) => Effect.try({ try: () => mkdirSync(value), catch: (cause) => failed(value, cause) }),\n }\n\n const spawner = make((command) =>\n Effect.suspend(() => {\n const description = command._tag === \"StandardCommand\" ? command.command : \"pipeline\"\n return Effect.fail(\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"EnvironmentMemory\",\n method: \"spawn\",\n pathOrDescriptor: description,\n cause: failed(description, new Error(\"The memory driver cannot spawn processes\")),\n }),\n )\n }),\n )\n\n return {\n spawner,\n overrides,\n symlink: (target, value) =>\n Effect.try({\n try: () => {\n requireParent(value)\n nodes.set(resolveKey(value, false) ?? key(value), { type: \"symlink\", target, mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n }\n}\n\nexport * as EnvironmentMemory from \"./memory.js\"\n",
"import { CrossSpawnSpawner } from \"@opencode-ai/util/cross-spawn-spawner\"\nimport { makeLocationNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Files } from \"./files.js\"\nimport { makeFiles } from \"./index.js\"\nimport { makeLocalDriver } from \"./local.js\"\nimport { Location } from \"../location.js\"\nimport { Workspace } from \"../workspace.js\"\n\nexport interface Interface {\n readonly files: Files\n readonly spawner: ChildProcessSpawner[\"Service\"]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Environment\") {}\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n const location = yield* Location.Service\n const workspace = yield* Workspace.Service\n const driver = location.workspaceID\n ? yield* workspace.connect(location.workspaceID).pipe(\n // Environment has no error channel; an unknown or destroyed placement is a configuration defect by design.\n Effect.mapError(\n (cause) => new Error(`Failed to bind Environment to workspace ${location.workspaceID}`, { cause }),\n ),\n Effect.orDie,\n )\n : makeLocalDriver(spawner)\n return Service.of({ files: makeFiles(driver), spawner: driver.spawner })\n }),\n)\n\nexport const node = makeLocationNode({\n service: Service,\n layer,\n deps: [CrossSpawnSpawner.node, Location.node, Workspace.node],\n})\n\nexport * as EnvironmentService from \"./environment.js\"\n",
"export * as Environment from \"./index.js\"\n\nexport { type Driver } from \"./driver.js\"\nexport {\n type DirEntry,\n Failed,\n type FileInfo,\n type Files,\n type FilesImpl,\n type FileType,\n NotFound,\n typeFollowing,\n WrongKind,\n} from \"./files.js\"\nexport { execDefaults } from \"./exec-defaults.js\"\nexport { makeLocalDriver } from \"./local.js\"\nexport { makeMemoryDriver, type MemoryDriver } from \"./memory.js\"\nexport { type Interface, node, Service } from \"./environment.js\"\n\nimport type { Driver } from \"./driver.js\"\nimport { execDefaults } from \"./exec-defaults.js\"\nimport type { Files } from \"./files.js\"\n\nexport const makeFiles = (driver: Driver): Files => ({\n ...execDefaults(driver.spawner),\n ...driver.overrides,\n})\n"
],
"mappings": "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",
"debugId": "89C9A1BAA656875164756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

{
"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": ";k2BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,KAAK,EAChD,CACH",
"debugId": "5F0616EB3C4E00A164756E2164756E21",
"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.js\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image.js\"\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": ";8pCAGA,IAAe,ICDf,oBACA,wBAAS,YAIT,IAAM,EAAiB,CAAC,GAAI,GAAI,GAAI,GAAI,EAAE,EAE7B,EAAO,EAAO,IAAI,SAAU,EAAG,CACxC,WAA4E,4BAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF",
"debugId": "3C68E2A3D575C0DE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/export.ts"],
"sourcesContent": [
"import { OpenCode, type SessionInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL, tmpdir } from \"node:os\"\nimport path from \"node:path\"\nimport { emitKeypressEvents, type Key } from \"node:readline\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.export,\n Effect.fn(\"cli.export\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const requested = Option.getOrUndefined(input.session)\n const selected = requested\n ? undefined\n : yield* Effect.promise(async () => {\n const location = await client.location.get({ location: { directory: process.cwd() } })\n const page = await client.session.list({\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n order: \"desc\",\n limit: 50,\n })\n if (page.data.length === 0) {\n process.stderr.write(`No sessions found${EOL}`)\n return undefined\n }\n return selectSession(page.data, input.sanitize)\n })\n const sessionID = requested ?? selected?.session.id\n if (!sessionID) return\n const data = yield* Effect.promise(() =>\n client.session.export({ sessionID, sanitize: selected?.sanitize ?? input.sanitize }),\n )\n process.stdout.write(yield* Effect.promise(() => writeExport(data, sessionID, requested !== undefined)))\n }),\n)\n\ntype Selection = { session: SessionInfo; sanitize: boolean }\n\nfunction selectSession(sessions: SessionInfo[], initialSanitize: boolean) {\n if (!process.stdin.isTTY) return Promise.reject(new Error(\"Session ID is required when stdin is not interactive\"))\n const input = process.stdin\n const output = process.stderr\n const wasRaw = input.isRaw\n const wasPaused = input.isPaused()\n const date = new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n })\n const columns = output.columns ?? 100\n const titleWidth = Math.max(8, Math.min(48, columns - 34))\n let selected = 0\n let offset = 0\n let sanitize = initialSanitize\n let height = 0\n\n const render = () => {\n const visible = sessions.slice(offset, offset + 10)\n const lines = [\" \\x1b[36mExport session\\x1b[0m\", \"\"]\n lines.push(\n ...visible.map((session) => {\n const index = sessions.indexOf(session)\n const title = (session.title ?? \"Untitled session\").slice(0, titleWidth).padEnd(titleWidth)\n const updated = date.format(session.time.updated).slice(0, 18).padEnd(18)\n const row = `${index === selected ? \">\" : \" \"} ${title} ${updated} ${session.id.slice(-8)}`\n return index === selected ? `\\x1b[1m${row}\\x1b[0m` : row\n }),\n \"\",\n ` [${sanitize ? \"x\" : \" \"}] sanitize sensitive data`,\n \"\",\n \" navigate \\x1b[2mup/down\\x1b[0m sanitize \\x1b[2mspace\\x1b[0m export \\x1b[2menter\\x1b[0m cancel \\x1b[2mesc\\x1b[0m\",\n )\n if (height > 0) output.write(`\\x1b[${height}F\\x1b[J`)\n output.write(lines.join(EOL) + EOL)\n height = lines.length\n }\n const clear = () => {\n if (height > 0) output.write(`\\x1b[${height}F\\x1b[J`)\n output.write(\"\\x1b[?25h\")\n input.removeListener(\"keypress\", onKeypress)\n input.setRawMode(wasRaw ?? false)\n if (wasPaused) input.pause()\n }\n const onKeypress = (value: string | undefined, key: Key) => {\n if (key.name === \"up\") {\n selected = (selected - 1 + sessions.length) % sessions.length\n if (selected === sessions.length - 1) offset = Math.max(0, sessions.length - 10)\n if (selected < offset) offset = selected\n }\n if (key.name === \"down\") {\n selected = (selected + 1) % sessions.length\n if (selected === 0) offset = 0\n if (selected >= offset + 10) offset = selected - 9\n }\n if (key.name === \"space\" || value === \" \") sanitize = !sanitize\n if (key.name === \"return\") return finish(sessions[selected])\n if (key.name === \"escape\" || (key.ctrl && key.name === \"c\")) return cancel()\n render()\n }\n const finish = (session: SessionInfo) => {\n clear()\n resolveSelection?.({ session, sanitize })\n }\n const cancel = () => {\n clear()\n resolveSelection?.()\n }\n let resolveSelection: ((selection?: Selection) => void) | undefined\n\n emitKeypressEvents(input)\n input.setRawMode(true)\n input.resume()\n input.on(\"keypress\", onKeypress)\n output.write(\"\\x1b[?25l\")\n render()\n return new Promise<Selection | undefined>((resolve) => {\n resolveSelection = resolve\n })\n}\n\nexport async function writeExport(data: unknown, sessionID: string, stdout: boolean) {\n const json = JSON.stringify(data, null, 2) + EOL\n if (stdout) return json\n const file = path.join(tmpdir(), `opencode-session-${sessionID}-${crypto.randomUUID().slice(0, 8)}.json`)\n await Bun.write(file, json)\n return file + EOL\n}\n"
],
"mappings": "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",
"debugId": "267F674B00F908D664756E2164756E21",
"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": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,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,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": "E599A476963924A964756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

{
"version": 3,
"sources": ["src/commands/handlers/pair.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n"
],
"mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH",
"debugId": "F2D2F4E83000C0CD64756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

+1
-1
{
"name": "@opencode-ai/cli-linux-x64",
"version": "0.0.0-dev-17534",
"version": "0.0.0-dev-17545",
"license": "MIT",

@@ -5,0 +5,0 @@ "repository": {

{
"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": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,QACnC,EAAO,GAAG,qBAAqB,EAAE,SAAU,EAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "B12C64E1114CEEA564756E2164756E21",
"names": []
}

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 { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n paths: { home: string; state: string; log: string }\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, paths: input.paths }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\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 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 const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n"
],
"mappings": "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",
"debugId": "D7923AF63D6D656F64756E2164756E21",
"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.js\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image.js\"\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": ";8pCAGA,IAAe,ICDf,oBACA,wBAAS,YAIT,IAAM,EAAiB,CAAC,GAAI,GAAI,GAAI,GAAI,EAAE,EAE7B,EAAO,EAAO,IAAI,SAAU,EAAG,CACxC,WAA4E,4BAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF",
"debugId": "3C68E2A3D575C0DE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/server-connection.ts"],
"sourcesContent": [
"import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const mismatch = args.mismatch ?? \"ignore\"\n const options = yield* ServiceConfig.options({ checkVersion: mismatch !== \"ignore\" })\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, mismatch),\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* (options: EnsureOptions, mismatch: NonNullable<Args[\"mismatch\"]>) {\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": ";6eAoBO,IAAM,EAAU,EAAO,GAAG,+BAA+B,EAAE,SAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAW,EAAK,UAAY,SAC5B,EAAU,MAAO,EAAc,QAAQ,CAAE,aAAc,IAAa,QAAS,CAAC,EACpF,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,CAAQ,EAC/E,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CAAC,EAAwB,EAAyC,CACnH,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC",
"debugId": "F2D2A57D8223BAC964756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

{
"version": 3,
"sources": ["src/server-process.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"],
"sourcesContent": [
"export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions, type Info } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, 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\"\nimport { WebUi } from \"./services/web-ui\"\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 const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\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 const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) 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 transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\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 transform,\n ).pipe(\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 (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n shutdown: Effect.Effect<void>,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const owns = (found: Info | undefined) =>\n found?.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* current.pipe(\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n",
"import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const headers = {\n \"content-type\": FSUtil.mimeType(name),\n \"cache-control\": html ? \"no-cache\" : \"public, max-age=31536000, immutable\",\n \"content-security-policy\": html\n ? cspForHtml(typeof file === \"string\" ? file : Buffer.from(file).toString())\n : csp(),\n \"x-content-type-options\": \"nosniff\",\n }\n return Effect.succeed(\n request.method === \"HEAD\" ? HttpServerResponse.empty({ headers }) : HttpServerResponse.raw(file, { headers }),\n )\n}\n\nfunction isRouteNotFound(error: unknown) {\n return error instanceof HttpServerError.HttpServerError && error.reason._tag === \"RouteNotFound\"\n}\n\nfunction csp(hash = \"\") {\n return `default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${hash ? ` 'sha256-${hash}'` : \"\"}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; media-src 'self' data:; connect-src * data: blob:`\n}\n\nfunction cspForHtml(body: string) {\n const match = body.match(\n /<script\\b(?![^>]*\\bsrc\\s*=)[^>]*\\bid=([\"'])oc-theme-preload-script\\1[^>]*>([\\s\\S]*?)<\\/script>/i,\n )\n return csp(match ? createHash(\"sha256\").update(match[2]).digest(\"base64\") : \"\")\n}\n\nexport * as WebUi from \"./web-ui\"\n",
"import { Effect, FileSystem, Option } from \"effect\"\nimport path from \"node:path\"\nimport { brotliDecompressSync } from \"node:zlib\"\nimport { OPENCODE_LOCAL } from \"./version\"\n\nexport type AssetMap = Readonly<Record<string, string | Uint8Array>>\ntype EncodedAssetMap = Readonly<Record<string, { readonly content: string; readonly encoding: \"utf8\" | \"base64\" }>>\n\nexport const load = Effect.fn(\"cli.app-assets.load\")(function* () {\n const embedded = yield* Effect.tryPromise(() => import(\"virtual:opencode-app-assets\")).pipe(Effect.option)\n if (Option.isSome(embedded) && embedded.value.default.length > 0) return decodeArchive(embedded.value.default)\n if (!OPENCODE_LOCAL) return yield* Effect.fail(new Error(\"Web UI assets are missing from the CLI build\"))\n return decode(yield* sourceAssets())\n})\n\nfunction decodeArchive(archive: string) {\n const body = brotliDecompressSync(Buffer.from(archive, \"base64\")).toString()\n return decode(JSON.parse(body) as EncodedAssetMap)\n}\n\nconst sourceAssets = Effect.fnUntraced(function* () {\n const fs = yield* FileSystem.FileSystem\n const root = path.resolve(import.meta.dirname, \"../../app/dist\")\n const files = yield* fs.readDirectory(root, { recursive: true })\n return Object.fromEntries(\n (yield* Effect.forEach(\n files.filter((file) => !file.endsWith(\".map\")),\n Effect.fnUntraced(function* (file) {\n const target = path.join(root, file)\n if ((yield* fs.stat(target)).type === \"Directory\") return\n const body = Buffer.from(yield* fs.readFile(target))\n const encoding = isText(file) ? \"utf8\" : \"base64\"\n return [file, { encoding, content: body.toString(encoding) }] as const\n }),\n { concurrency: \"unbounded\" },\n )).filter((asset) => asset !== undefined),\n )\n})\n\nfunction decode(assets: EncodedAssetMap): AssetMap {\n return Object.fromEntries(\n Object.entries(assets).map(([key, asset]) => [\n key,\n asset.encoding === \"utf8\" ? asset.content : Buffer.from(asset.content, \"base64\"),\n ]),\n )\n}\n\nfunction isText(file: string) {\n return file === \"_headers\" || /\\.(?:css|html|js|json|svg|txt|webmanifest|xml)$/.test(file)\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": "0A0ABE4D2C1DA20664756E2164756E21",
"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 || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n"
],
"mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,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,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH",
"debugId": "CC02D734CA9C84E664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"],
"sourcesContent": [
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}",
"import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n ...(server ? { answer: { 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": "72DA89E8D46185B364756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

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/version.ts"],
"sourcesContent": [
"declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n"
],
"mappings": ";AAGA,IAAM,EAAiD,kBACjD,EAAiD,MAGhD,IAAM,EAAiB",
"debugId": "A1B63C5D0A2A990764756E2164756E21",
"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 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 \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,EAAG,CACrC,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,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,SACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "8AF34F346308B64464756E2164756E21",
"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+5f449c48df7de738/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+5f449c48df7de738/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": "E5C92705FC0C259964756E2164756E21",
"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": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,OACnC,EAAO,GAAG,oBAAoB,EAAE,SAAU,EAAG,CAC3C,IAAM,EAAU,MAAO,EAAc,QAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH",
"debugId": "720DF74CF5CDDC1364756E2164756E21",
"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(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n"
],
"mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH",
"debugId": "F2D2F4E83000C0CD64756E2164756E21",
"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 { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderOptions,\n type ProviderMetadata,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n} from \"../schema/index.js\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared.js\"\nimport { GeminiToolSchema } from \"./utils/gemini-tool-schema.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\n\nconst ADAPTER = \"gemini\"\n// Google documents this sentinel for replaying Gemini 3 function calls after their original signature was lost.\nconst SKIP_THOUGHT_SIGNATURE_VALIDATOR = \"skip_thought_signature_validator\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\n// Gemini 3 rejects replayed function calls without a thought signature. Google's SDKs avoid that in normal chats by\n// retaining complete model responses, but OpenCode reconstructs durable history and may encounter an unsigned call\n// from an older or external session. Model IDs are open-ended, so unknown Gemini aliases inherit current behavior.\nconst requiresThoughtSignatureFallback = (modelID: string) => {\n if (!/(^|\\/)gemini-/i.test(modelID)) return false\n if (/(^|\\/)gemini-(?:1|2)(?:[.-]|$)/i.test(modelID)) return false\n if (/(^|\\/)gemini-pro(?:-vision)?$/i.test(modelID)) return false\n return !/(^|\\/)gemini-robotics-er-1\\.5(?:[.-]|$)/i.test(modelID)\n}\n\nexport interface OptionsInput {\n readonly [key: string]: unknown\n readonly cachedContent?: string\n readonly safetySettings?: ReadonlyArray<{\n readonly category:\n | \"HARM_CATEGORY_UNSPECIFIED\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\"\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_CIVIC_INTEGRITY\"\n | (string & {})\n readonly threshold:\n | \"HARM_BLOCK_THRESHOLD_UNSPECIFIED\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_ONLY_HIGH\"\n | \"BLOCK_NONE\"\n | \"OFF\"\n | (string & {})\n }>\n readonly serviceTier?: \"standard\" | \"flex\" | \"priority\" | (string & {})\n readonly thinkingConfig?: {\n readonly thinkingBudget?: number\n readonly includeThoughts?: boolean\n readonly thinkingLevel?: \"minimal\" | \"low\" | \"medium\" | \"high\" | (string & {})\n }\n}\n\nexport type ProviderOptionsInput = ProviderOptions & {\n readonly gemini?: OptionsInput\n}\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})\ntype GeminiInlineDataPart = Schema.Schema.Type<typeof GeminiInlineDataPart>\n\nconst GeminiFunctionCallPart = Schema.Struct({\n functionCall: Schema.Struct({\n id: Schema.optional(Schema.String),\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 id: Schema.optional(Schema.String),\n name: Schema.String,\n response: Schema.Unknown,\n parts: Schema.optional(Schema.Array(GeminiInlineDataPart)),\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 thinkingLevel: Schema.optional(Schema.String),\n})\n\nconst GeminiSafetySetting = Schema.Struct({\n category: Schema.String,\n threshold: Schema.String,\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 frequencyPenalty: Schema.optional(Schema.Number),\n presencePenalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n thinkingConfig: Schema.optional(GeminiThinkingConfig),\n})\n\nconst GeminiBodyFields = {\n cachedContent: Schema.optional(Schema.String),\n contents: Schema.Array(GeminiContent),\n safetySettings: optionalArray(GeminiSafetySetting),\n serviceTier: Schema.optional(Schema.String),\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 root parameter schemas while preserving nested empty objects,\n// expand type arrays into `anyOf`, derive `nullable: true` from null members,\n// coerce `const` to `[const]` enum, recurse properties/items, and propagate\n// only an allowlisted set of keys (description, required, format, type,\n// nullable, enum, properties, items, allOf, anyOf, oneOf, minLength).\n// Anything outside the allowlist (e.g. `additionalProperties`, `$ref`) is\n// 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 = ProviderShared.normalizeMedia(part)\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 functionCallId = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.functionCallId === \"string\"\n ? google.functionCallId\n : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart) => ({\n functionCall: { id: functionCallId(part.providerMetadata), 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 // Parallel Gemini 3 calls may carry one signature on the first call; unsigned sibling calls are valid.\n let hasSignedToolCall = false\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 const lowered = lowerToolCall(part)\n const signature = lowered.thoughtSignature\n parts.push({\n ...lowered,\n thoughtSignature:\n signature ??\n (requiresThoughtSignatureFallback(request.model.id) && !hasSignedToolCall\n ? SKIP_THOUGHT_SIGNATURE_VALIDATOR\n : undefined),\n })\n if (signature !== undefined) hasSignedToolCall = true\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 id: functionCallId(part.providerMetadata),\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<Tool.Content> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n const media: GeminiInlineDataPart[] = []\n for (const item of content) {\n if (item.type === \"text\") continue\n const value = ProviderShared.normalizeToolFile(item)\n media.push({ inlineData: { mimeType: value.mime, data: value.base64 } })\n }\n parts.push({\n functionResponse: {\n id: functionCallId(part.providerMetadata),\n name: part.name,\n response: {\n name: part.name,\n content: text.join(\"\\n\"),\n },\n parts: media.length > 0 ? media : undefined,\n },\n })\n }\n contents.push({ role: \"user\", parts })\n }\n\n return contents\n})\n\nconst resolveOptions = (request: LLMRequest) => {\n const input = request.providerOptions?.gemini\n const value = input?.thinkingConfig\n const thinkingConfig = {\n thinkingBudget:\n ProviderShared.isRecord(value) && typeof value.thinkingBudget === \"number\" ? value.thinkingBudget : undefined,\n includeThoughts:\n ProviderShared.isRecord(value) && typeof value.includeThoughts === \"boolean\"\n ? value.includeThoughts\n : ProviderShared.isRecord(value)\n ? true\n : undefined,\n thinkingLevel:\n ProviderShared.isRecord(value) && typeof value.thinkingLevel === \"string\" ? value.thinkingLevel : undefined,\n }\n return {\n cachedContent: typeof input?.cachedContent === \"string\" ? input.cachedContent : undefined,\n safetySettings: mapSafetySettings(input?.safetySettings),\n serviceTier: typeof input?.serviceTier === \"string\" ? input.serviceTier : undefined,\n thinkingConfig: Object.values(thinkingConfig).some((item) => item !== undefined) ? thinkingConfig : undefined,\n }\n}\n\nfunction mapSafetySettings(value: unknown) {\n if (!Array.isArray(value)) return undefined\n const settings = value.flatMap((item) =>\n ProviderShared.isRecord(item) && typeof item.category === \"string\" && typeof item.threshold === \"string\"\n ? [{ category: item.category, threshold: item.threshold }]\n : [],\n )\n return settings\n}\n\nconst fromRequest = Effect.fn(\"Gemini.fromRequest\")(function* (request: LLMRequest) {\n const hasTools = request.tools.length > 0\n const generation = request.generation\n const options = resolveOptions(request)\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 frequencyPenalty: generation?.frequencyPenalty,\n presencePenalty: generation?.presencePenalty,\n seed: generation?.seed,\n stopSequences: generation?.stop,\n thinkingConfig: options.thinkingConfig,\n }\n\n return {\n cachedContent: options.cachedContent,\n contents: yield* lowerMessages(request),\n safetySettings: options.safetySettings,\n serviceTier: options.serviceTier,\n systemInstruction:\n request.system.length === 0 ? undefined : { parts: [{ text: ProviderShared.joinText(request.system) }] },\n tools: hasTools\n ? [\n {\n functionDeclarations: request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n },\n ]\n : undefined,\n toolConfig: hasTools && 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 === undefined) return hasToolCalls ? \"tool-calls\" : \"unknown\"\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 finishReason === \"MODEL_ARMOR\" ||\n finishReason === \"IMAGE_PROHIBITED_CONTENT\" ||\n finishReason === \"IMAGE_RECITATION\" ||\n finishReason === \"LANGUAGE\"\n )\n return \"content-filter\"\n if (\n finishReason === \"MALFORMED_FUNCTION_CALL\" ||\n finishReason === \"UNEXPECTED_TOOL_CALL\" ||\n finishReason === \"NO_IMAGE\" ||\n finishReason === \"TOO_MANY_TOOL_CALLS\" ||\n finishReason === \"MISSING_THOUGHT_SIGNATURE\" ||\n finishReason === \"MALFORMED_RESPONSE\"\n )\n 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: {\n normalized: mapFinishReason(state.finishReason, state.hasToolCalls),\n raw: state.finishReason,\n },\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 const metadata = {\n ...(part.functionCall.id === undefined ? {} : { functionCallId: part.functionCall.id }),\n ...(part.thoughtSignature === undefined ? {} : { thoughtSignature: part.thoughtSignature }),\n }\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: Object.keys(metadata).length > 0 ? googleMetadata(metadata) : 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.js\"\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.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n type ProviderMetadata,\n} from \"../schema/index.js\"\nimport { ProviderShared } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\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 AIError({\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>, AIError> => {\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.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { HttpOptions, ProviderID, mergeHttpOptions, type ModelID } from \"../schema/index.js\"\nimport { Gemini } from \"../protocols/gemini.js\"\nimport { GoogleImages } from \"../protocols/google-images.js\"\n\nexport type { GoogleImageOptions } from \"../protocols/google-images.js\"\nexport type GeminiOptionsInput = Gemini.OptionsInput\nexport type GeminiProviderOptionsInput = Gemini.ProviderOptionsInput\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 readonly providerOptions?: Gemini.ProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: Gemini.ProviderOptionsInput\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<Gemini.ProviderOptionsInput>({ id: modelID }),\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, Gemini.ProviderOptionsInput>[\"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": ";suBAyBA,IAAM,EAAU,SAEV,GAAmC,mCAC5B,EAAmB,mDAK1B,GAAmC,CAAC,IAAoB,CAC5D,GAAI,CAAC,iBAAiB,KAAK,CAAO,EAAG,MAAO,GAC5C,GAAI,kCAAkC,KAAK,CAAO,EAAG,MAAO,GAC5D,GAAI,iCAAiC,KAAK,CAAO,EAAG,MAAO,GAC3D,MAAO,CAAC,2CAA2C,KAAK,CAAO,GAuC3D,GAAiB,EAAO,OAAO,CACnC,KAAM,EAAO,OACb,QAAS,EAAO,SAAS,EAAO,OAAO,EACvC,iBAAkB,EAAO,SAAS,EAAO,MAAM,CACjD,CAAC,EAEK,EAAuB,EAAO,OAAO,CACzC,WAAY,EAAO,OAAO,CACxB,SAAU,EAAO,OACjB,KAAM,EAAO,MACf,CAAC,CACH,CAAC,EAGK,GAAyB,EAAO,OAAO,CAC3C,aAAc,EAAO,OAAO,CAC1B,GAAI,EAAO,SAAS,EAAO,MAAM,EACjC,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,GAAI,EAAO,SAAS,EAAO,MAAM,EACjC,KAAM,EAAO,OACb,SAAU,EAAO,QACjB,MAAO,EAAO,SAAS,EAAO,MAAM,CAAoB,CAAC,CAC3D,CAAC,CACH,CAAC,EAEK,GAAoB,EAAO,MAAM,CACrC,GACA,EACA,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,EAC/C,cAAe,EAAO,SAAS,EAAO,MAAM,CAC9C,CAAC,EAEK,GAAsB,EAAO,OAAO,CACxC,SAAU,EAAO,OACjB,UAAW,EAAO,MACpB,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,iBAAkB,EAAO,SAAS,EAAO,MAAM,EAC/C,gBAAiB,EAAO,SAAS,EAAO,MAAM,EAC9C,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,cAAe,EAAc,EAAO,MAAM,EAC1C,eAAgB,EAAO,SAAS,EAAoB,CACtD,CAAC,EAEK,GAAmB,CACvB,cAAe,EAAO,SAAS,EAAO,MAAM,EAC5C,SAAU,EAAO,MAAM,CAAa,EACpC,eAAgB,EAAc,EAAmB,EACjD,YAAa,EAAO,SAAS,EAAO,MAAM,EAC1C,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,EAsCK,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,EAAe,eAAe,CAAI,EAChD,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,EAAiB,CAAC,IAAmD,CACzE,IAAM,EAAS,GAAkB,OACjC,OAAO,EAAe,SAAS,CAAM,GAAK,OAAO,EAAO,iBAAmB,SACvE,EAAO,eACP,QAGA,GAAgB,CAAC,KAAwB,CAC7C,aAAc,CAAE,GAAI,EAAe,EAAK,gBAAgB,EAAG,KAAM,EAAK,KAAM,KAAM,EAAK,KAAM,EAC7F,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,EAEhE,EAAoB,GACxB,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,IAAM,EAAU,GAAc,CAAI,EAC5B,EAAY,EAAQ,iBAS1B,GARA,EAAM,KAAK,IACN,EACH,iBACE,IACC,GAAiC,EAAQ,MAAM,EAAE,GAAK,CAAC,EACpD,GACA,OACR,CAAC,EACG,IAAc,OAAW,EAAoB,GACjD,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,GAAI,EAAe,EAAK,gBAAgB,EACxC,KAAM,EAAK,KACX,SAAU,CACR,KAAM,EAAK,KACX,QAAS,EAAe,eAAe,CAAI,CAC7C,CACF,CACF,CAAC,EACD,SAEF,IAAM,EAAuC,EAAK,OAAO,MACnD,EAAO,EAAQ,OAAO,CAAC,IAAS,EAAK,OAAS,MAAM,EAAE,IAAI,CAAC,IAAS,EAAK,IAAI,EAC7E,EAAgC,CAAC,EACvC,QAAW,KAAQ,EAAS,CAC1B,GAAI,EAAK,OAAS,OAAQ,SAC1B,IAAM,EAAQ,EAAe,kBAAkB,CAAI,EACnD,EAAM,KAAK,CAAE,WAAY,CAAE,SAAU,EAAM,KAAM,KAAM,EAAM,MAAO,CAAE,CAAC,EAEzE,EAAM,KAAK,CACT,iBAAkB,CAChB,GAAI,EAAe,EAAK,gBAAgB,EACxC,KAAM,EAAK,KACX,SAAU,CACR,KAAM,EAAK,KACX,QAAS,EAAK,KAAK;AAAA,CAAI,CACzB,EACA,MAAO,EAAM,OAAS,EAAI,EAAQ,MACpC,CACF,CAAC,EAEH,EAAS,KAAK,CAAE,KAAM,OAAQ,OAAM,CAAC,EAGvC,OAAO,EACR,EAEK,GAAiB,CAAC,IAAwB,CAC9C,IAAM,EAAQ,EAAQ,iBAAiB,OACjC,EAAQ,GAAO,eACf,EAAiB,CACrB,eACE,EAAe,SAAS,CAAK,GAAK,OAAO,EAAM,iBAAmB,SAAW,EAAM,eAAiB,OACtG,gBACE,EAAe,SAAS,CAAK,GAAK,OAAO,EAAM,kBAAoB,UAC/D,EAAM,gBACN,EAAe,SAAS,CAAK,EAC3B,GACA,OACR,cACE,EAAe,SAAS,CAAK,GAAK,OAAO,EAAM,gBAAkB,SAAW,EAAM,cAAgB,MACtG,EACA,MAAO,CACL,cAAe,OAAO,GAAO,gBAAkB,SAAW,EAAM,cAAgB,OAChF,eAAgB,GAAkB,GAAO,cAAc,EACvD,YAAa,OAAO,GAAO,cAAgB,SAAW,EAAM,YAAc,OAC1E,eAAgB,OAAO,OAAO,CAAc,EAAE,KAAK,CAAC,IAAS,IAAS,MAAS,EAAI,EAAiB,MACtG,GAGF,SAAS,EAAiB,CAAC,EAAgB,CACzC,GAAI,CAAC,MAAM,QAAQ,CAAK,EAAG,OAM3B,OALiB,EAAM,QAAQ,CAAC,IAC9B,EAAe,SAAS,CAAI,GAAK,OAAO,EAAK,WAAa,UAAY,OAAO,EAAK,YAAc,SAC5F,CAAC,CAAE,SAAU,EAAK,SAAU,UAAW,EAAK,SAAU,CAAC,EACvD,CAAC,CACP,EAIF,IAAM,GAAc,EAAO,GAAG,oBAAoB,EAAE,SAAU,CAAC,EAAqB,CAClF,IAAM,EAAW,EAAQ,MAAM,OAAS,EAClC,EAAa,EAAQ,WACrB,EAAU,GAAe,CAAO,EAChC,EAA0B,EAAQ,MAAM,eAAe,WACvD,EAAmB,CACvB,gBAAiB,GAAY,UAC7B,YAAa,GAAY,YACzB,KAAM,GAAY,KAClB,KAAM,GAAY,KAClB,iBAAkB,GAAY,iBAC9B,gBAAiB,GAAY,gBAC7B,KAAM,GAAY,KAClB,cAAe,GAAY,KAC3B,eAAgB,EAAQ,cAC1B,EAEA,MAAO,CACL,cAAe,EAAQ,cACvB,SAAU,MAAO,GAAc,CAAO,EACtC,eAAgB,EAAQ,eACxB,YAAa,EAAQ,YACrB,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,GAAY,EAAQ,WAAa,MAAO,GAAgB,EAAQ,UAAU,EAAI,OAC1F,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,OAAW,OAAO,EAAe,aAAe,UACrE,GAAI,IAAiB,OAAQ,OAAO,EAAe,aAAe,OAClE,GAAI,IAAiB,aAAc,MAAO,SAC1C,GACE,IAAiB,gBACjB,IAAiB,cACjB,IAAiB,UACjB,IAAiB,aACjB,IAAiB,sBACjB,IAAiB,QACjB,IAAiB,eACjB,IAAiB,4BACjB,IAAiB,oBACjB,IAAiB,WAEjB,MAAO,iBACT,GACE,IAAiB,2BACjB,IAAiB,wBACjB,IAAiB,YACjB,IAAiB,uBACjB,IAAiB,6BACjB,IAAiB,qBAEjB,MAAO,QACT,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,UAQV,OAPA,EAAU,OAAO,EAAW,EAAQ,CAClC,OAAQ,CACN,WAAY,GAAgB,EAAM,aAAc,EAAM,YAAY,EAClE,IAAK,EAAM,YACb,EACA,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,MACb,EAAW,IACX,EAAK,aAAa,KAAO,OAAY,CAAC,EAAI,CAAE,eAAgB,EAAK,aAAa,EAAG,KACjF,EAAK,mBAAqB,OAAY,CAAC,EAAI,CAAE,iBAAkB,EAAK,gBAAiB,CAC3F,EACA,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,OAAO,KAAK,CAAQ,EAAE,OAAS,EAAI,EAAe,CAAQ,EAAI,MAClF,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,EC3mBD,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,GAAQ,CACV,OAAQ,EACR,OAAQ,WACR,OAAQ,IAAI,GAA4B,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,GAAQ,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,IAAuE,CAC9F,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,EC7SO,IAAM,GAAK,GAAW,KAAK,QAAQ,EAE7B,GAAS,CAAC,EAAO,KAAK,EAc7B,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,MAAmC,CAAE,GAAI,CAAQ,CAAC,EAC9F,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,GAAoF,CAAC,EAAS,IACzG,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": "B61086ECCDDA258864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/config.ts"],
"sourcesContent": [
"import { EOL } from \"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.debug.commands.config,\n Effect.fn(\"cli.debug.config\")(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 entries = yield* Effect.promise(() => client.config.get({ location: { directory: process.cwd() } }))\n process.stdout.write(JSON.stringify(entries, null, 2) + EOL)\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,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,EACpF,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACzG,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAS,KAAM,CAAC,EAAI,CAAG,EAC5D,CACH",
"debugId": "310EF66AA206BC0F64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/export.ts"],
"sourcesContent": [
"import { OpenCode, type SessionInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL, tmpdir } from \"node:os\"\nimport path from \"node:path\"\nimport { emitKeypressEvents, type Key } from \"node:readline\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.export,\n Effect.fn(\"cli.export\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const requested = Option.getOrUndefined(input.session)\n const selected = requested\n ? undefined\n : yield* Effect.promise(async () => {\n const location = await client.location.get({ location: { directory: process.cwd() } })\n const page = await client.session.list({\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n order: \"desc\",\n limit: 50,\n })\n if (page.data.length === 0) {\n process.stderr.write(`No sessions found${EOL}`)\n return undefined\n }\n return selectSession(page.data, input.sanitize)\n })\n const sessionID = requested ?? selected?.session.id\n if (!sessionID) return\n const data = yield* Effect.promise(() =>\n client.session.export({ sessionID, sanitize: selected?.sanitize ?? input.sanitize }),\n )\n process.stdout.write(yield* Effect.promise(() => writeExport(data, sessionID, requested !== undefined)))\n }),\n)\n\ntype Selection = { session: SessionInfo; sanitize: boolean }\n\nfunction selectSession(sessions: SessionInfo[], initialSanitize: boolean) {\n if (!process.stdin.isTTY) return Promise.reject(new Error(\"Session ID is required when stdin is not interactive\"))\n const input = process.stdin\n const output = process.stderr\n const wasRaw = input.isRaw\n const wasPaused = input.isPaused()\n const date = new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n })\n const columns = output.columns ?? 100\n const titleWidth = Math.max(8, Math.min(48, columns - 34))\n let selected = 0\n let offset = 0\n let sanitize = initialSanitize\n let height = 0\n\n const render = () => {\n const visible = sessions.slice(offset, offset + 10)\n const lines = [\" \\x1b[36mExport session\\x1b[0m\", \"\"]\n lines.push(\n ...visible.map((session) => {\n const index = sessions.indexOf(session)\n const title = (session.title ?? \"Untitled session\").slice(0, titleWidth).padEnd(titleWidth)\n const updated = date.format(session.time.updated).slice(0, 18).padEnd(18)\n const row = `${index === selected ? \">\" : \" \"} ${title} ${updated} ${session.id.slice(-8)}`\n return index === selected ? `\\x1b[1m${row}\\x1b[0m` : row\n }),\n \"\",\n ` [${sanitize ? \"x\" : \" \"}] sanitize sensitive data`,\n \"\",\n \" navigate \\x1b[2mup/down\\x1b[0m sanitize \\x1b[2mspace\\x1b[0m export \\x1b[2menter\\x1b[0m cancel \\x1b[2mesc\\x1b[0m\",\n )\n if (height > 0) output.write(`\\x1b[${height}F\\x1b[J`)\n output.write(lines.join(EOL) + EOL)\n height = lines.length\n }\n const clear = () => {\n if (height > 0) output.write(`\\x1b[${height}F\\x1b[J`)\n output.write(\"\\x1b[?25h\")\n input.removeListener(\"keypress\", onKeypress)\n input.setRawMode(wasRaw ?? false)\n if (wasPaused) input.pause()\n }\n const onKeypress = (value: string | undefined, key: Key) => {\n if (key.name === \"up\") {\n selected = (selected - 1 + sessions.length) % sessions.length\n if (selected === sessions.length - 1) offset = Math.max(0, sessions.length - 10)\n if (selected < offset) offset = selected\n }\n if (key.name === \"down\") {\n selected = (selected + 1) % sessions.length\n if (selected === 0) offset = 0\n if (selected >= offset + 10) offset = selected - 9\n }\n if (key.name === \"space\" || value === \" \") sanitize = !sanitize\n if (key.name === \"return\") return finish(sessions[selected])\n if (key.name === \"escape\" || (key.ctrl && key.name === \"c\")) return cancel()\n render()\n }\n const finish = (session: SessionInfo) => {\n clear()\n resolveSelection?.({ session, sanitize })\n }\n const cancel = () => {\n clear()\n resolveSelection?.()\n }\n let resolveSelection: ((selection?: Selection) => void) | undefined\n\n emitKeypressEvents(input)\n input.setRawMode(true)\n input.resume()\n input.on(\"keypress\", onKeypress)\n output.write(\"\\x1b[?25l\")\n render()\n return new Promise<Selection | undefined>((resolve) => {\n resolveSelection = resolve\n })\n}\n\nexport async function writeExport(data: unknown, sessionID: string, stdout: boolean) {\n const json = JSON.stringify(data, null, 2) + EOL\n if (stdout) return json\n const file = path.join(tmpdir(), `opencode-session-${sessionID}-${crypto.randomUUID().slice(0, 8)}.json`)\n await Bun.write(file, json)\n return file + EOL\n}\n"
],
"mappings": "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",
"debugId": "267F674B00F908D664756E2164756E21",
"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": ";u9BAAA,cAAS,WAST,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,OAC/B,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "169AF9E03063C63064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"],
"sourcesContent": [
"import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { 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 (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\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 return { model, agent: next.agent }\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 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 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 LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n ToolContent,\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 { nonEmptyToolContent, 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 metadata: Record<string, JsonValue>\n content: ToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.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.inbox.delivered\") {\n if (event.data.inboxID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.id), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n metadata: {},\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.id))\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.id))\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.id)\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 metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) {\n current.metadata = event.data.metadata\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\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 metadata: event.data.metadata,\n content: event.data.content,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\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 metadata: event.data.metadata,\n content: event.data.content,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const metadata = event.data.metadata ?? current.metadata\n const content = event.data.content ?? nonEmptyToolContent(current.content)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\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 metadata,\n content,\n error: event.data.error,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (content && toolOutputText(current.tool, content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n metadata,\n content,\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 (input.compatibility === \"v1\" && event.data.error.message === \"The provider response ended unexpectedly.\") {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n partID: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n id: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (item.state.content && toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({\n ...item,\n state: {\n status: \"completed\",\n input: item.state.input,\n metadata: item.state.metadata,\n content: item.state.content,\n },\n })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\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 if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, id: string) {\n return `${messageID}\\u0000${id}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; id: 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 metadata: {},\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": "3CD5BB354BE4332D64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/auth/login.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.login,\n Effect.fn(\"cli.auth.login\")(function* (input) {\n process.stdout.write(\"Logging in...\" + 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(\"Logged in\" + 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": ";m6BAAA,cAAS,WAQT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,KAAK,SAAS,MAChC,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,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": "139ECAC11EBB094464756E2164756E21",
"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, 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": ";u9BAAA,cAAS,WAcT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,UAAS,CAAC,CACnG,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": "E7720170A868DD4964756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

{
"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\"\nimport { Global } from \"@opencode-ai/util/global\"\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({\n server: serverURL,\n standalone: input.standalone,\n mismatch: \"replace\",\n })\n const config = yield* Config.Service\n const global = yield* Global.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: Option.getOrUndefined(input.replay) ?? resolved.mini?.replay ?? true,\n replayLimit: Option.getOrUndefined(input.replayLimit) ?? resolved.mini?.replay_limit,\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n paths: { home: global.home, state: global.state, log: global.log },\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAQA,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAM,CAAC,IACtD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,UAAS,wBAAyB,MAAO,EAAO,QAAQ,IAAa,wCAAa,EAC1F,MAAO,EAAO,QAAQ,SAAY,EAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EACR,WAAY,EAAM,WAClB,SAAU,SACZ,CAAC,EACK,EAAS,MAAO,EAAO,QACvB,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,EAAO,eAAe,EAAM,MAAM,GAAK,EAAS,MAAM,QAAU,GACxE,YAAa,EAAO,eAAe,EAAM,WAAW,GAAK,EAAS,MAAM,aACxE,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,EACA,MAAO,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CACnE,CAAC,CACH,EACD,CACH",
"debugId": "5769DF631F16904864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/models.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.models,\n Effect.fn(\"cli.models\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const response = yield* Effect.promise(() => client.model.list({ location: { directory: process.cwd() } }))\n const models = response.data\n .map((model) => `${model.providerID}/${model.id}`)\n .toSorted((a, b) => a.localeCompare(b))\n if (models.length > 0) process.stdout.write(models.join(EOL) + EOL)\n }),\n)\n"
],
"mappings": ";giCAGA,cAAS,WAKT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EAEK,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KACrB,IAAI,CAAC,IAAU,GAAG,EAAM,cAAc,EAAM,IAAI,EAChD,SAAS,CAAC,EAAG,IAAM,EAAE,cAAc,CAAC,CAAC,EACxC,GAAI,EAAO,OAAS,EAAG,QAAQ,OAAO,MAAM,EAAO,KAAK,CAAG,EAAI,CAAG,EACnE,CACH",
"debugId": "5821BA922140A58E64756E2164756E21",
"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": ";k2BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,MAAO,EAAc,MAAM,EAAM,GAAG,EACrC,CACH",
"debugId": "C5EABBB3676B039064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../core/src/workspace/driver.ts", "../core/src/workspace/sql.ts", "../core/src/workspace.ts", "../core/src/environment/files.ts", "../core/src/environment/exec-defaults.ts", "../core/src/environment/local.ts", "../core/src/environment/memory.ts", "../core/src/environment/environment.ts", "../core/src/environment/index.ts"],
"sourcesContent": [
"export * as WorkspaceDriver from \"./driver.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport type { Scope } from \"effect\"\nimport type { Driver as EnvironmentDriver } from \"../environment/driver.js\"\n\n/**\n * Smallest provider-owned JSON value required to reconnect to the same\n * provider resource. Core stores it opaquely and hands it back; only the\n * owning driver reads inside.\n */\nexport const Binding = Schema.Record(Schema.String, Schema.Json)\nexport type Binding = typeof Binding.Type\n\nexport class Error extends Schema.TaggedErrorClass<Error>()(\"WorkspaceDriver.Error\", {\n message: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {}\n\nexport class ProviderNotFound extends Schema.TaggedErrorClass<ProviderNotFound>()(\"WorkspaceDriver.ProviderNotFound\", {\n provider: Schema.String,\n}) {}\n\nexport interface Interface {\n readonly create: (input: {\n readonly workspaceID: Workspace.ID\n }) => Effect.Effect<{ readonly binding: Binding }, Error>\n readonly connect: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<EnvironmentDriver, Error, Scope.Scope>\n readonly suspendForIdle: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<void, Error>\n readonly destroy: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n }) => Effect.Effect<void, Error>\n}\n\nexport const make = (driver: Interface) => driver\n\nexport interface Registry {\n readonly get: (provider: string) => Effect.Effect<Interface, ProviderNotFound>\n}\n\nexport class RegistryService extends Context.Service<RegistryService, Registry>()(\n \"@opencode/WorkspaceDriverRegistry\",\n) {}\n\nexport const registry = (drivers: Readonly<Record<string, Interface>>): Registry => ({\n get: (provider) => {\n const driver = Object.hasOwn(drivers, provider) ? drivers[provider] : undefined\n return driver ? Effect.succeed(driver) : Effect.fail(new ProviderNotFound({ provider }))\n },\n})\n\nexport const registryNode = (drivers: Readonly<Record<string, Interface>>) =>\n makeGlobalNode({\n service: RegistryService,\n layer: Layer.succeed(RegistryService, RegistryService.of(registry(drivers))),\n deps: [],\n })\n\nexport const node = registryNode({})\n",
"import { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\"\nimport type { WorkspaceDriver } from \"./driver.js\"\n\nexport const WorkspaceTable = sqliteTable(\"workspace\", {\n id: text().$type<Workspace.ID>().primaryKey(),\n provider: text().notNull(),\n binding: text({ mode: \"json\" }).$type<WorkspaceDriver.Binding>().notNull(),\n created_at: integer().notNull(),\n last_used_at: integer().notNull(),\n})\n",
"export * as Workspace from \"./workspace.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { eq } from \"drizzle-orm\"\nimport { Clock, Context, Duration, Effect, Exit, Layer, Ref, Schedule, Schema, Scope } from \"effect\"\nimport { systemError } from \"effect/PlatformError\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver as EnvironmentDriver } from \"./environment/driver.js\"\nimport { Database } from \"./database/database.js\"\nimport { KeyedMutex } from \"./effect/keyed-mutex.js\"\nimport { WorkspaceDriver } from \"./workspace/driver.js\"\nimport { WorkspaceTable } from \"./workspace/sql.js\"\n\nexport const ID = Workspace.ID\nexport type ID = Workspace.ID\n\nexport class Info extends Schema.Class<Info>(\"Workspace.Info\")({\n id: ID,\n provider: Schema.String,\n binding: WorkspaceDriver.Binding,\n createdAt: Schema.Number,\n lastUsedAt: Schema.Number,\n}) {}\n\nexport class NotFound extends Schema.TaggedErrorClass<NotFound>()(\"Workspace.NotFound\", { workspaceID: ID }) {}\n\nexport interface Interface {\n readonly create: (provider: string) => Effect.Effect<Info, WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly connect: (\n workspaceID: ID,\n ) => Effect.Effect<EnvironmentDriver, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly destroy: (\n workspaceID: ID,\n ) => Effect.Effect<void, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n}\n\nexport interface Options {\n readonly idleThreshold?: Duration.Input\n readonly pollInterval?: Duration.Input\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Workspace\") {}\n\ninterface Connection {\n readonly driver: WorkspaceDriver.Interface\n readonly environment: EnvironmentDriver\n readonly saveBinding: (binding: WorkspaceDriver.Binding) => Effect.Effect<void>\n readonly lastActivity: Ref.Ref<number>\n readonly active: Ref.Ref<number>\n readonly scope: Scope.Closeable\n}\n\nexport const configured = (options: Options = {}) =>\n makeGlobalNode({\n service: Service,\n layer: layer(options),\n deps: [Database.node, WorkspaceDriver.node],\n })\n\nconst layer = (options: Options) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const db = (yield* Database.Service).db\n const registry = yield* WorkspaceDriver.RegistryService\n const lifetime = yield* Scope.Scope\n const connections = new Map<ID, Connection>()\n const locks = KeyedMutex.makeUnsafe<ID>()\n const idleThreshold = Duration.toMillis(options.idleThreshold ?? Duration.minutes(20))\n\n const load = Effect.fn(\"Workspace.load\")(function* (workspaceID: ID) {\n const row = yield* db\n .select()\n .from(WorkspaceTable)\n .where(eq(WorkspaceTable.id, workspaceID))\n .get()\n .pipe(Effect.orDie)\n if (!row) return yield* new NotFound({ workspaceID })\n return row\n })\n\n const open = Effect.fn(\"Workspace.open\")(function* (workspaceID: ID) {\n const existing = connections.get(workspaceID)\n if (existing) return existing\n\n const row = yield* load(workspaceID)\n const driver = yield* registry.get(row.provider)\n const saveBinding = (value: WorkspaceDriver.Binding) =>\n db\n .update(WorkspaceTable)\n .set({ binding: value })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n const scope = yield* Scope.fork(lifetime)\n const environment = yield* driver.connect({ workspaceID, binding: row.binding, saveBinding }).pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n )\n const now = yield* Clock.currentTimeMillis\n const connection: Connection = {\n driver,\n environment,\n saveBinding,\n lastActivity: yield* Ref.make(now),\n active: yield* Ref.make(0),\n scope,\n }\n connections.set(workspaceID, connection)\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: now })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n return connection\n })\n\n yield* Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis\n yield* Effect.forEach(\n [...connections.entries()],\n ([workspaceID, expected]) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = connections.get(workspaceID)\n if (connection !== expected || (yield* Ref.get(connection.active)) > 0) return\n const lastActivity = yield* Ref.get(connection.lastActivity)\n if (now - lastActivity < idleThreshold) return\n const row = yield* load(workspaceID)\n // Deliberate: a racing spawn blocks, then wakes cleanly. Unlocking mid-suspend could reattach a sandbox being terminated.\n yield* connection.driver.suspendForIdle({\n workspaceID,\n binding: row.binding,\n saveBinding: connection.saveBinding,\n })\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: lastActivity })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n connections.delete(workspaceID)\n yield* Scope.close(connection.scope, Exit.void)\n }).pipe(Effect.catchCause((cause) => Effect.logError(\"workspace idle suspension failed\", cause))),\n ),\n { concurrency: \"unbounded\", discard: true },\n )\n }).pipe(Effect.repeat(Schedule.spaced(options.pollInterval ?? Duration.minutes(1))), Effect.forkScoped)\n\n return Service.of({\n create: Effect.fn(\"Workspace.create\")(function* (provider) {\n const driver = yield* registry.get(provider)\n const workspaceID = ID.create()\n const result = yield* driver.create({ workspaceID })\n const now = yield* Clock.currentTimeMillis\n yield* db\n .insert(WorkspaceTable)\n .values({ id: workspaceID, provider, binding: result.binding, created_at: now, last_used_at: now })\n .run()\n .pipe(Effect.orDie)\n return new Info({ id: workspaceID, provider, binding: result.binding, createdAt: now, lastUsedAt: now })\n }),\n connect: Effect.fn(\"Workspace.connect\")(function* (workspaceID) {\n const spawner = make((command) =>\n Effect.acquireRelease(\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = yield* open(workspaceID).pipe(\n Effect.mapError((cause) =>\n systemError({\n _tag: \"Unknown\",\n module: \"Workspace\",\n method: \"spawn\",\n description: `Failed to wake workspace ${workspaceID}`,\n cause,\n }),\n ),\n )\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n yield* Ref.update(connection.active, (active) => active + 1)\n return connection\n }),\n ),\n (connection) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n yield* Ref.update(connection.active, (active) => active - 1)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n }),\n ),\n ).pipe(Effect.flatMap((connection) => connection.environment.spawner.spawn(command))),\n )\n // Overrides are connection-bound; per-spawn routing is required before any driver ships them, so they are deliberately omitted.\n return { spawner }\n }),\n destroy: Effect.fn(\"Workspace.destroy\")(function* (workspaceID) {\n yield* locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* load(workspaceID)\n const connection = connections.get(workspaceID)\n connections.delete(workspaceID)\n if (connection) yield* Scope.close(connection.scope, Exit.void)\n const driver = yield* registry.get(row.provider)\n yield* driver.destroy({ workspaceID, binding: row.binding })\n yield* db.delete(WorkspaceTable).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n }),\n )\n }),\n })\n }),\n )\n\nexport const node = configured()\n\n// TODO(workspace-plan): add the boot janitor and ~23h safety snapshot rotation in a later PR.\n// TODO(workspace-plan): make cold wake interruptible with a re-pin loop against janitor races.\n// TODO(workspace-plan): consider RcMap at end-of-series consolidation; idle suspend and destroy need distinct finalizers.\n",
"import { Effect, Schema } from \"effect\"\n\nexport const FileType = Schema.Literals([\"file\", \"directory\", \"symlink\", \"other\"])\nexport type FileType = typeof FileType.Type\n\nexport interface FileInfo {\n readonly type: FileType\n readonly size: number\n readonly mtimeMs: number\n}\n\nexport interface DirEntry {\n readonly name: string\n readonly type: FileType\n}\n\nexport class NotFound extends Schema.TaggedErrorClass<NotFound>()(\"Environment.NotFound\", {\n path: Schema.String,\n}) {}\n\nexport class WrongKind extends Schema.TaggedErrorClass<WrongKind>()(\"Environment.WrongKind\", {\n path: Schema.String,\n actual: FileType,\n}) {}\n\nexport class Failed extends Schema.TaggedErrorClass<Failed>()(\"Environment.Failed\", {\n path: Schema.String,\n cause: Schema.Defect(),\n}) {}\n\nexport interface FilesImpl {\n /**\n * Content operations (`read`, `list`) follow final symlinks; metadata operations (`stat` and entry\n * tags returned by `list`) do not. `info` describes the target file whose bytes are returned.\n * The process-backed default caps collected output at 64 MiB; larger whole-file reads fail with\n * `Failed`, so callers must use ranges for larger files.\n */\n readonly read: (\n path: string,\n range?: { readonly offset: number; readonly length: number },\n ) => Effect.Effect<{ readonly info: FileInfo; readonly bytes: Uint8Array }, NotFound | WrongKind | Failed>\n readonly write: (path: string, bytes: Uint8Array) => Effect.Effect<void, Failed>\n /** Describes the path entry itself, so a final symlink is reported as `symlink` rather than followed. */\n readonly stat: (path: string) => Effect.Effect<FileInfo, NotFound | Failed>\n /** Follows a final symlink to the listed directory while preserving each returned entry's own type. */\n readonly list: (path: string) => Effect.Effect<ReadonlyArray<DirEntry>, NotFound | WrongKind | Failed>\n readonly remove: (path: string) => Effect.Effect<void, Failed>\n readonly move: (from: string, to: string) => Effect.Effect<void, NotFound | Failed>\n readonly mkdir: (path: string) => Effect.Effect<void, Failed>\n}\n\nexport interface Files extends FilesImpl {}\n\n/**\n * Derives a follow-stat kind from the lstat-like Files contract. A dangling\n * symlink fails with `NotFound`.\n */\nexport const typeFollowing = (files: Files, path: string) =>\n files.stat(path).pipe(\n Effect.flatMap((info) =>\n info.type === \"symlink\"\n ? files.read(path, { offset: 0, length: 0 }).pipe(\n Effect.map((result) => result.info.type),\n Effect.catchTag(\"Environment.WrongKind\", (error) => Effect.succeed(error.actual)),\n )\n : Effect.succeed(info.type),\n ),\n )\n\nexport * as EnvironmentFiles from \"./files.js\"\n",
"import { Effect, Stream } from \"effect\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { collectStream } from \"@opencode-ai/util/process\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FileType, type FilesImpl } from \"./files.js\"\n\n/**\n * Files derived from spawning processes: one process per intent, \"$1\" is\n * always the target path. Scripts report classification through an exit-code\n * protocol (44/45/46) so failures never require parsing localized error text;\n * LC_ALL=C pins the one stderr match that remains. Requires GNU coreutils and\n * findutils in the target image — BSD and busybox userlands will not work.\n * Malformed output from these scripts is our own bug and dies as a defect.\n */\n\nconst MAX_DATA_BYTES = 64 * 1024 * 1024\nconst MAX_ERROR_BYTES = 64 * 1024\nconst NOT_FOUND = 44\nconst WRONG_KIND = 45\nconst FAILED = 46\nconst TAB = \"\\t\"\n\nconst loadMetadata = (flags = \"\") => `\nmetadata=$(stat ${flags} -c '%F${TAB}%s${TAB}%Y' -- \"$1\" 2>&1) || {\n case \"$metadata\" in\n *'No such file or directory'*|*'Not a directory'*) exit ${NOT_FOUND} ;;\n *) printf '%s' \"$metadata\" >&2; exit ${FAILED} ;;\n esac\n}\n`\n\nconst statScript = `\n${loadMetadata()}\nprintf '%s\\n' \"$metadata\"\n`\n\nconst readScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != 'regular file' ] && [ \"$kind\" != 'regular empty file' ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nprintf '%s\\n' \"$metadata\"\nif [ \"$2\" = range ]; then\n dd if=\"$1\" iflag=skip_bytes,count_bytes skip=\"$3\" count=\"$4\" status=none\nelse\n cat -- \"$1\"\nfi\n`\n\nconst listScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != directory ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nfind -H \"$1\" -mindepth 1 -maxdepth 1 -printf '%y\\\\0%f\\\\0'\n`\n\nconst moveScript = `\n${loadMetadata()}\nmv -- \"$1\" \"$2\"\n`\n\ninterface Result {\n readonly exitCode: number\n readonly stdout: Uint8Array\n readonly stderr: Uint8Array\n}\n\nexport const execDefaults = (spawner: ChildProcessSpawner[\"Service\"]): FilesImpl => {\n const run = (\n path: string,\n script: string,\n args: ReadonlyArray<string> = [],\n stdin?: Uint8Array,\n ): Effect.Effect<Result, Failed> =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\"sh\", [\"-c\", script, \"sh\", path, ...args], {\n env: { LC_ALL: \"C\" },\n extendEnv: true,\n stdin: stdin === undefined ? undefined : Stream.make(stdin),\n })\n const handle = yield* spawner.spawn(command).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, MAX_DATA_BYTES),\n collectStream(handle.stderr, MAX_ERROR_BYTES),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n if (stdout.truncated || stderr.truncated) {\n return yield* new Failed({ path, cause: new Error(\"Process output exceeded its collection limit\") })\n }\n return { exitCode, stdout: stdout.buffer, stderr: stderr.buffer }\n }),\n )\n\n const classify = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n ): Effect.Effect<A, NotFound | WrongKind | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n if (result.exitCode === WRONG_KIND) {\n return Effect.fail(new WrongKind({ path, actual: parseType(new TextDecoder().decode(result.stderr)) }))\n }\n return Effect.fail(processFailure(path, result))\n }\n\n const complete = (path: string, result: Result) =>\n result.exitCode === 0 ? Effect.void : Effect.fail(processFailure(path, result))\n\n return {\n stat: (path) => run(path, statScript).pipe(Effect.flatMap((result) => classifyPlain(path, result, parseInfo))),\n read: (path, range) =>\n run(\n path,\n readScript,\n range === undefined ? [\"whole\"] : [\"range\", String(range.offset), String(range.length)],\n ).pipe(\n Effect.flatMap((result) =>\n classify(path, result, (stdout) => {\n const newline = stdout.indexOf(10)\n if (newline < 0) throw new Error(\"Missing read metadata header\")\n return {\n info: parseInfo(stdout.slice(0, newline)),\n bytes: stdout.slice(newline + 1),\n }\n }),\n ),\n ),\n write: (path, bytes) =>\n run(path, `mkdir -p \"$(dirname \"$1\")\" && cat > \"$1\"`, [], bytes).pipe(\n Effect.flatMap((result) => complete(path, result)),\n ),\n list: (path) => run(path, listScript).pipe(Effect.flatMap((result) => classify(path, result, parseList))),\n remove: (path) => run(path, `rm -rf -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n move: (from, to) =>\n run(from, moveScript, [to]).pipe(Effect.flatMap((result) => classifyPlain(from, result, () => undefined))),\n mkdir: (path) => run(path, `mkdir -p -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n }\n}\n\n/** `classify` for scripts whose protocol never reports WrongKind. */\nconst classifyPlain = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n): Effect.Effect<A, NotFound | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n return Effect.fail(processFailure(path, result))\n}\n\nconst processFailure = (path: string, result: Result) =>\n new Failed({\n path,\n cause: new Error(new TextDecoder().decode(result.stderr).trim() || `Process exited with code ${result.exitCode}`),\n })\n\nconst parseInfo = (bytes: Uint8Array): FileInfo => {\n const [rawType, rawSize, rawMtime] = new TextDecoder().decode(bytes).trim().split(TAB)\n const size = Number(rawSize)\n const mtimeMs = Number(rawMtime) * 1_000\n if (!rawType || !Number.isFinite(size) || !Number.isFinite(mtimeMs)) throw new Error(\"Invalid stat output\")\n return { type: parseType(rawType), size, mtimeMs }\n}\n\nconst parseType = (value: string): FileType => {\n if (value === \"regular file\" || value === \"regular empty file\" || value === \"f\") return \"file\"\n if (value === \"directory\" || value === \"d\") return \"directory\"\n if (value === \"symbolic link\" || value === \"l\") return \"symlink\"\n return \"other\"\n}\n\nconst parseList = (bytes: Uint8Array) => {\n const fields = new TextDecoder().decode(bytes).split(\"\\0\")\n fields.pop()\n if (fields.length % 2 !== 0) throw new Error(\"Invalid find output\")\n return Array.from({ length: fields.length / 2 }, (_, index) => ({\n name: fields[index * 2 + 1],\n type: parseType(fields[index * 2]),\n }))\n}\n\nexport * as EnvironmentExecDefaults from \"./exec-defaults.js\"\n",
"import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Effect } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\n/**\n * The host filesystem binding. Deliberately raw node:fs rather than effect's\n * FileSystem service or FSUtil: the contract needs lstat semantics (stat\n * reports \"symlink\") and typed directory entries, and effect's node\n * FileSystem provides neither — its stat always follows symlinks and\n * readDirectory returns names only. FSUtil hits the same gap and its\n * readDirectoryEntries already bypasses to raw node readdir internally.\n * Nothing above the environment seam touches node:fs.\n */\nexport const makeLocalDriver = (spawner: ChildProcessSpawner[\"Service\"]): Driver => {\n const overrides: FilesImpl = {\n read: (value, range) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"file\") return yield* new WrongKind({ path: value, actual: info.type })\n if (range === undefined) {\n const bytes = yield* attempt(value, () => fs.readFile(value), true)\n return { info, bytes }\n }\n const bytes = yield* attempt(\n value,\n async () => {\n const handle = await fs.open(value, \"r\")\n try {\n const buffer = new Uint8Array(range.length)\n const result = await handle.read(buffer, 0, range.length, range.offset)\n return buffer.subarray(0, result.bytesRead)\n } finally {\n await handle.close()\n }\n },\n true,\n )\n return { info, bytes }\n }),\n stat: (value) => stat(value, false),\n list: (value) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"directory\") return yield* new WrongKind({ path: value, actual: info.type })\n const entries = yield* attempt(value, () => fs.readdir(value, { withFileTypes: true }), true)\n return entries.map((entry) => ({ name: entry.name, type: fileType(entry) }))\n }),\n write: (value, bytes) =>\n attempt(value, async () => {\n await fs.mkdir(path.dirname(value), { recursive: true })\n await fs.writeFile(value, bytes)\n }),\n remove: (value) => attempt(value, () => fs.rm(value, { recursive: true, force: true })),\n move: (from, to) =>\n Effect.gen(function* () {\n yield* stat(from, false)\n const destination = yield* stat(to, false).pipe(\n Effect.map((info) => (info.type === \"directory\" ? path.join(to, path.basename(from)) : to)),\n Effect.catchIf(\n (error) => error instanceof NotFound,\n () => Effect.succeed(to),\n ),\n )\n yield* attempt(from, () => fs.rename(from, destination))\n }),\n mkdir: (value) => attempt(value, () => fs.mkdir(value, { recursive: true }).then(() => undefined)),\n }\n\n return { spawner, overrides }\n}\n\nconst stat = (value: string, follow: boolean) =>\n attempt(value, () => (follow ? fs.stat(value) : fs.lstat(value)), true).pipe(\n Effect.map((stats): FileInfo => ({ type: fileType(stats), size: stats.size, mtimeMs: stats.mtimeMs })),\n )\n\nconst fileType = (entry: { isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean }): FileType => {\n if (entry.isFile()) return \"file\"\n if (entry.isDirectory()) return \"directory\"\n if (entry.isSymbolicLink()) return \"symlink\"\n return \"other\"\n}\n\nfunction attempt<A>(value: string, run: () => Promise<A>): Effect.Effect<A, Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing: true): Effect.Effect<A, NotFound | Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing = false) {\n return Effect.tryPromise({\n try: run,\n catch: (cause) =>\n missing && isMissing(cause) ? new NotFound({ path: value }) : new Failed({ path: value, cause }),\n })\n}\n\nconst isMissing = (cause: unknown) =>\n cause !== null &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\")\n\nexport * as EnvironmentLocal from \"./local.js\"\n",
"import path from \"node:path\"\nimport { Effect, PlatformError } from \"effect\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\ntype Node =\n | { readonly type: \"file\"; readonly bytes: Uint8Array; readonly mtimeMs: number }\n | { readonly type: \"directory\"; readonly mtimeMs: number }\n | { readonly type: \"symlink\"; readonly target: string; readonly mtimeMs: number }\n\nexport interface MemoryDriver extends Driver {\n readonly symlink: (target: string, path: string) => Effect.Effect<void, Failed>\n}\n\nexport const makeMemoryDriver = (): MemoryDriver => {\n const nodes = new Map<string, Node>([[\"/\", { type: \"directory\", mtimeMs: Date.now() }]])\n const key = (value: string) => path.posix.resolve(\"/\", value)\n const info = (node: Node): FileInfo => ({\n type: node.type,\n size:\n node.type === \"file\"\n ? node.bytes.length\n : node.type === \"symlink\"\n ? new TextEncoder().encode(node.target).length\n : 0,\n mtimeMs: node.mtimeMs,\n })\n const resolveKey = (value: string, followFinal: boolean, seen = new Set<string>()): string | undefined => {\n const normalized = key(value)\n const parts = normalized.split(\"/\").filter(Boolean)\n const base = \"/\"\n const walk = (current: string, index: number): string | undefined => {\n if (index === parts.length) return current\n const part = parts[index]\n const candidate = path.posix.join(current, part)\n const node = nodes.get(candidate)\n if (node?.type !== \"symlink\" || (!followFinal && index === parts.length - 1)) return walk(candidate, index + 1)\n if (seen.has(candidate)) return undefined\n seen.add(candidate)\n const target = path.posix.resolve(path.posix.dirname(candidate), node.target)\n return resolveKey(path.posix.join(target, ...parts.slice(index + 1)), followFinal, seen)\n }\n return walk(base, 0)\n }\n const lookup = (value: string) => nodes.get(resolveKey(value, false) ?? key(value))\n const requireParent = (value: string) => {\n const parentPath = path.posix.dirname(key(value))\n const parent = nodes.get(resolveKey(parentPath, true) ?? parentPath)\n if (!parent) throw new Error(`Parent directory does not exist: ${path.posix.dirname(value)}`)\n if (parent.type !== \"directory\") throw new Error(`Parent is not a directory: ${path.posix.dirname(value)}`)\n }\n const mkdirSync = (value: string) => {\n const target = resolveKey(value, false) ?? key(value)\n const existing = nodes.get(target)\n if (existing?.type === \"directory\") return\n if (existing) throw new Error(`Path is not a directory: ${value}`)\n const parent = path.posix.dirname(target)\n if (parent !== target) mkdirSync(parent)\n nodes.set(target, { type: \"directory\", mtimeMs: Date.now() })\n }\n const failed = (value: string, cause: unknown) => new Failed({ path: value, cause })\n const overrides: FilesImpl = {\n stat: (value) => {\n const node = lookup(value)\n return node ? Effect.succeed(info(node)) : Effect.fail(new NotFound({ path: value }))\n },\n read: (value, range) => {\n const original = lookup(value)\n if (!original) return Effect.fail(new NotFound({ path: value }))\n if (original.type === \"directory\") return Effect.fail(new WrongKind({ path: value, actual: \"directory\" }))\n const resolved = resolveKey(value, true)\n const node = resolved === undefined ? undefined : nodes.get(resolved)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"file\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const bytes = range === undefined ? node.bytes : node.bytes.subarray(range.offset, range.offset + range.length)\n return Effect.succeed({ info: info(node), bytes: bytes.slice() })\n },\n write: (value, bytes) =>\n Effect.try({\n try: () => {\n mkdirSync(path.posix.dirname(key(value)))\n const existing = lookup(value)\n if (existing?.type === \"directory\") throw new Error(`Path is a directory: ${value}`)\n const target = existing?.type === \"symlink\" ? resolveKey(value, true) : resolveKey(value, false)\n if (!target) throw new Error(`Cannot resolve symlink: ${value}`)\n requireParent(target)\n nodes.set(target, { type: \"file\", bytes: bytes.slice(), mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n list: (value) => {\n const target = resolveKey(value, true) ?? key(value)\n const node = nodes.get(target)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"directory\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const entries = [...nodes.entries()]\n .filter(([entry]) => entry !== target && path.posix.dirname(entry) === target)\n .map(([entry, child]) => ({ name: path.posix.basename(entry), type: child.type satisfies FileType }))\n .sort((a, b) => a.name.localeCompare(b.name))\n return Effect.succeed(entries)\n },\n remove: (value) =>\n Effect.sync(() => {\n const target = resolveKey(value, false) ?? key(value)\n for (const entry of nodes.keys()) {\n if (entry === target || entry.startsWith(`${target}/`)) nodes.delete(entry)\n }\n }),\n move: (from, to) => {\n const source = resolveKey(from, false) ?? key(from)\n const node = nodes.get(source)\n if (!node) return Effect.fail(new NotFound({ path: from }))\n return Effect.try({\n try: () => {\n const requested = resolveKey(to, false) ?? key(to)\n const destination =\n nodes.get(requested)?.type === \"directory\"\n ? path.posix.join(requested, path.posix.basename(source))\n : requested\n if (node.type === \"directory\" && destination.startsWith(`${source}/`)) {\n throw new Error(`Cannot move a directory into itself: ${from}`)\n }\n const existing = nodes.get(destination)\n if (node.type === \"directory\" && existing && existing.type !== \"directory\") {\n throw new Error(`Cannot overwrite a non-directory with a directory: ${to}`)\n }\n requireParent(destination)\n const moved = [...nodes.entries()].filter(([entry]) => entry === source || entry.startsWith(`${source}/`))\n for (const [entry] of moved) nodes.delete(entry)\n for (const [entry, child] of moved) nodes.set(`${destination}${entry.slice(source.length)}`, child)\n },\n catch: (cause) => failed(from, cause),\n })\n },\n mkdir: (value) => Effect.try({ try: () => mkdirSync(value), catch: (cause) => failed(value, cause) }),\n }\n\n const spawner = make((command) =>\n Effect.suspend(() => {\n const description = command._tag === \"StandardCommand\" ? command.command : \"pipeline\"\n return Effect.fail(\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"EnvironmentMemory\",\n method: \"spawn\",\n pathOrDescriptor: description,\n cause: failed(description, new Error(\"The memory driver cannot spawn processes\")),\n }),\n )\n }),\n )\n\n return {\n spawner,\n overrides,\n symlink: (target, value) =>\n Effect.try({\n try: () => {\n requireParent(value)\n nodes.set(resolveKey(value, false) ?? key(value), { type: \"symlink\", target, mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n }\n}\n\nexport * as EnvironmentMemory from \"./memory.js\"\n",
"import { CrossSpawnSpawner } from \"@opencode-ai/util/cross-spawn-spawner\"\nimport { makeLocationNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Files } from \"./files.js\"\nimport { makeFiles } from \"./index.js\"\nimport { makeLocalDriver } from \"./local.js\"\nimport { Location } from \"../location.js\"\nimport { Workspace } from \"../workspace.js\"\n\nexport interface Interface {\n readonly files: Files\n readonly spawner: ChildProcessSpawner[\"Service\"]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Environment\") {}\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n const location = yield* Location.Service\n const workspace = yield* Workspace.Service\n const driver = location.workspaceID\n ? yield* workspace.connect(location.workspaceID).pipe(\n // Environment has no error channel; an unknown or destroyed placement is a configuration defect by design.\n Effect.mapError(\n (cause) => new Error(`Failed to bind Environment to workspace ${location.workspaceID}`, { cause }),\n ),\n Effect.orDie,\n )\n : makeLocalDriver(spawner)\n return Service.of({ files: makeFiles(driver), spawner: driver.spawner })\n }),\n)\n\nexport const node = makeLocationNode({\n service: Service,\n layer,\n deps: [CrossSpawnSpawner.node, Location.node, Workspace.node],\n})\n\nexport * as EnvironmentService from \"./environment.js\"\n",
"export * as Environment from \"./index.js\"\n\nexport { type Driver } from \"./driver.js\"\nexport {\n type DirEntry,\n Failed,\n type FileInfo,\n type Files,\n type FilesImpl,\n type FileType,\n NotFound,\n typeFollowing,\n WrongKind,\n} from \"./files.js\"\nexport { execDefaults } from \"./exec-defaults.js\"\nexport { makeLocalDriver } from \"./local.js\"\nexport { makeMemoryDriver, type MemoryDriver } from \"./memory.js\"\nexport { type Interface, node, Service } from \"./environment.js\"\n\nimport type { Driver } from \"./driver.js\"\nimport { execDefaults } from \"./exec-defaults.js\"\nimport type { Files } from \"./files.js\"\n\nexport const makeFiles = (driver: Driver): Files => ({\n ...execDefaults(driver.spawner),\n ...driver.overrides,\n})\n"
],
"mappings": "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",
"debugId": "89C9A1BAA656875164756E2164756E21",
"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": ";+2BAMA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,KACnC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,MAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "AC29D2595147585164756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n"
],
"mappings": ";qpBAAA,cAAS,WACT,oBACA,mBAAS,UAAU,eAAM,oBAOzB,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,IAC/B,EAAO,GAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "63C37569617632C464756E2164756E21",
"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": "FB3258041526C59464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/plugin/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,KAClC,EAAO,GAAG,iBAAiB,EAAE,SAAU,EAAG,CACxC,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,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": "ECCE97B14418C4C764756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

{
"version": 3,
"sources": ["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": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,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,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": "E599A476963924A964756E2164756E21",
"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": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,EAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "95DE40FAC869802764756E2164756E21",
"names": []
}

Sorry, the diff of this file is too big to display

{
"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": ";k2BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,KAAK,EAChD,CACH",
"debugId": "5F0616EB3C4E00A164756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "C4F86025DA3C956C64756E2164756E21",
"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": ";02BAAA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,QAAQ,OAAO,OAAO,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "964F05233A307BE364756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* (input: { readonly checkVersion?: boolean } = {}) {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: input.checkVersion ? OPENCODE_VERSION : undefined,\n command: [\n ...selfCommand(),\n \"serve\",\n \"--service\",\n ...(process.env.OPENCODE_CPU_PROFILE ? [\"--cpu-profile\", process.env.OPENCODE_CPU_PROFILE] : []),\n ],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": "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",
"debugId": "48AD3F43345FB9C664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/import.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionTransfer } from \"@opencode-ai/schema/session-transfer\"\nimport { Effect, Option, Schema } from \"effect\"\nimport { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.import,\n Effect.fn(\"cli.import\")(function* (input) {\n const text = yield* Effect.tryPromise({\n try: () =>\n input.file.startsWith(\"http://\") || input.file.startsWith(\"https://\")\n ? fetch(input.file).then((response) => {\n if (!response.ok) throw new Error(`Failed to fetch session data: ${response.statusText}`)\n return response.text()\n })\n : Bun.file(input.file).text(),\n catch: (cause) =>\n new Error(`Failed to read session data: ${cause instanceof Error ? cause.message : String(cause)}`),\n })\n const data = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(SessionTransfer.Data))(text)\n const encoded = Schema.encodeSync(SessionTransfer.Data)(data)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const location = yield* Effect.promise(() =>\n client.location.get({\n location: { directory: path.resolve(Option.getOrElse(input.directory, () => process.cwd())) },\n }),\n )\n const response = yield* Effect.promise(() =>\n fetch(new URL(\"/api/session/import\", server.endpoint.url), {\n method: \"POST\",\n headers: { ...Service.headers(server.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...encoded,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n }),\n }),\n )\n if (response.status === 409) {\n process.stderr.write(`Session already exists${EOL}`)\n return\n }\n if (!response.ok) yield* Effect.fail(new Error(`Failed to import session: ${response.statusText}`))\n const imported = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ data: Session.Info })))(\n yield* Effect.promise(() => response.text()),\n )\n process.stdout.write(`Imported session: ${imported.data.id}${EOL}`)\n }),\n)\n"
],
"mappings": ";w8CAKA,cAAS,WACT,oBAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAM,KAAK,WAAW,SAAS,GAAK,EAAM,KAAK,WAAW,UAAU,EAChE,MAAM,EAAM,IAAI,EAAE,KAAK,CAAC,IAAa,CACnC,GAAI,CAAC,EAAS,GAAI,MAAU,MAAM,iCAAiC,EAAS,YAAY,EACxF,OAAO,EAAS,KAAK,EACtB,EACD,IAAI,KAAK,EAAM,IAAI,EAAE,KAAK,EAChC,MAAO,CAAC,IACF,MAAM,gCAAgC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAAG,CACtG,CAAC,EACK,EAAO,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAgB,IAAI,CAAC,EAAE,CAAI,EAC1F,EAAU,EAAO,WAAW,EAAgB,IAAI,EAAE,CAAI,EACtD,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAW,MAAO,EAAO,QAAQ,IACrC,EAAO,SAAS,IAAI,CAClB,SAAU,CAAE,UAAW,EAAK,QAAQ,EAAO,UAAU,EAAM,UAAW,IAAM,QAAQ,IAAI,CAAC,CAAC,CAAE,CAC9F,CAAC,CACH,EACM,EAAW,MAAO,EAAO,QAAQ,IACrC,MAAM,IAAI,IAAI,sBAAuB,EAAO,SAAS,GAAG,EAAG,CACzD,OAAQ,OACR,QAAS,IAAK,EAAQ,QAAQ,EAAO,QAAQ,EAAG,eAAgB,kBAAmB,EACnF,KAAM,KAAK,UAAU,IAChB,EACH,SAAU,CAAE,UAAW,EAAS,UAAW,YAAa,EAAS,WAAY,CAC/E,CAAC,CACH,CAAC,CACH,EACA,GAAI,EAAS,SAAW,IAAK,CAC3B,QAAQ,OAAO,MAAM,yBAAyB,GAAK,EACnD,OAEF,GAAI,CAAC,EAAS,GAAI,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAS,YAAY,CAAC,EAClG,IAAM,EAAW,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAO,OAAO,CAAE,KAAM,EAAQ,IAAK,CAAC,CAAC,CAAC,EAC7G,MAAO,EAAO,QAAQ,IAAM,EAAS,KAAK,CAAC,CAC7C,EACA,QAAQ,OAAO,MAAM,qBAAqB,EAAS,KAAK,KAAK,GAAK,EACnE,CACH",
"debugId": "C59C54865F20F2B464756E2164756E21",
"names": []
}

Sorry, the diff of this file is not supported yet