🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@opencode-ai/cli-linux-x64-musl

Package Overview
Dependencies
Maintainers
2
Versions
1775
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

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

Comparing version
0.0.0-next-15319
to
0.0.0-next-15324
bin/chunk-01fcvqmy.js.map

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

+10
{
"version": 3,
"sources": ["../core/src/image/photon.ts"],
"sourcesContent": [
"// @ts-ignore Bun's static file import is embedded by `bun build --compile`; some consumers also declare *.wasm.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n"
],
"mappings": ";yvBAGA,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF",
"debugId": "A3C9808554D97F6064756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/mcp/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? Global.Path.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nasync 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 (await Bun.file(candidate).exists()) return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const file = Bun.file(configPath)\n const text = (await file.exists()) ? await file.text() : \"{}\"\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await Bun.write(configPath, applyEdits(text, edits))\n}\n"
],
"mappings": ";ucAAA,mBAAS,gBACT,yBAOA,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,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,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAe,CAAiB,CAAC,EAAmB,CAClD,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,GAAI,MAAM,IAAI,KAAK,CAAS,EAAE,OAAO,EAAG,OAAO,EAEjD,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,IAAI,KAAK,CAAU,EAC1B,EAAQ,MAAM,EAAK,OAAO,EAAK,MAAM,EAAK,KAAK,EAAI,KACnD,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,IAAI,MAAM,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "A193A710D86097CA64756E2164756E21",
"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": ";snBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,KAAK,EAChD,CACH",
"debugId": "390B56B9AF46BBE264756E2164756E21",
"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 } from \"@opencode-ai/client/effect\"\nimport { Server } from \"../../services/server\"\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* Server.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(\n endpoint: Service.Endpoint,\n input: readonly string[],\n params: Record<string, string>,\n) {\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": "765493D47A52B97264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "BB8850E8CCDAEBDC64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/variant.shared.ts", "src/mini/session.shared.ts", "src/mini/theme.ts"],
"sourcesContent": [
"// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > saved preference > session history.\n//\n// The saved variant persists across sessions in ~/.local/state/opencode/model.json\n// so your last-used variant sticks. Cycling (ctrl+t) updates both the active\n// variant and the persisted file.\nimport path from \"path\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { makeGlobalNode } from \"@opencode-ai/core/effect/app-node\"\nimport { makeRuntime } from \"@opencode-ai/core/effect/runtime\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\n\nconst MODEL_FILE = path.join(Global.Path.state, \"model.json\")\n\ntype ModelState = Record<string, unknown> & {\n variant?: Record<string, string | undefined>\n}\ntype VariantService = {\n readonly resolveSavedVariant: (model: RunInput[\"model\"]) => Effect.Effect<string | undefined>\n readonly saveVariant: (model: RunInput[\"model\"], variant: string | undefined) => Effect.Effect<void>\n}\ntype VariantRuntime = {\n resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined>\n saveVariant(model: RunInput[\"model\"], variant: string | undefined): Promise<void>\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n\nclass Service extends Context.Service<Service, VariantService>()(\"@opencode/RunVariant\") {}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction variantKey(model: NonNullable<RunInput[\"model\"]>): string {\n return modelKey(model.providerID, model.modelID)\n}\n\nexport function modelInfo(providers: RunProvider[] | undefined, model: NonNullable<RunInput[\"model\"]>) {\n const provider = providers?.find((item) => item.id === model.providerID)\n return {\n provider: provider?.name ?? model.providerID,\n model: provider?.models[model.modelID]?.name ?? model.modelID,\n }\n}\n\nexport function formatModelLabel(\n model: NonNullable<RunInput[\"model\"]>,\n variant: string | undefined,\n providers?: RunProvider[],\n): string {\n const names = modelInfo(providers, model)\n const label = variant ? ` · ${variant}` : \"\"\n return `${names.model} · ${names.provider}${label}`\n}\n\nexport function cycleVariant(current: string | undefined, variants: string[]): string | undefined {\n if (variants.length === 0) {\n return undefined\n }\n\n if (!current) {\n return variants[0]\n }\n\n const idx = variants.indexOf(current)\n if (idx === -1 || idx === variants.length - 1) {\n return undefined\n }\n\n return variants[idx + 1]\n}\n\nexport function pickVariant(model: RunInput[\"model\"], input: RunSession | SessionMessages): string | undefined {\n return sessionVariant(Array.isArray(input) ? createSession(input) : input, model)\n}\n\nfunction fitVariant(value: string | undefined, variants: string[]): string | undefined {\n if (!value) {\n return undefined\n }\n\n if (variants.length === 0 || variants.includes(value)) {\n return value\n }\n\n return undefined\n}\n\n// Picks the active variant. CLI flag wins, then saved preference, then session\n// history. fitVariant() checks saved and session values against the available\n// variants list -- if the provider doesn't offer a variant, it drops.\nexport function resolveVariant(\n input: string | undefined,\n session: string | undefined,\n saved: string | undefined,\n variants: string[],\n): string | undefined {\n if (input !== undefined) {\n return input\n }\n\n const fallback = fitVariant(saved, variants)\n const current = fitVariant(session, variants)\n if (current !== undefined) {\n return current\n }\n\n return fallback\n}\n\nfunction state(value: unknown): ModelState {\n if (!isRecord(value)) {\n return {}\n }\n\n const variant = isRecord(value.variant)\n ? Object.fromEntries(\n Object.entries(value.variant).flatMap(([key, item]) => {\n if (typeof item !== \"string\") {\n return []\n }\n\n return [[key, item] as const]\n }),\n )\n : undefined\n\n return {\n ...value,\n variant,\n }\n}\n\nconst layer = Layer.fresh(\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const file = yield* FSUtil.Service\n\n const read = Effect.fn(\"RunVariant.read\")(function* () {\n return yield* file.readJson(MODEL_FILE).pipe(\n Effect.map(state),\n Effect.catchCause(() => Effect.succeed(state(undefined))),\n )\n })\n\n const resolveSavedVariant = Effect.fn(\"RunVariant.resolveSavedVariant\")(function* (model: RunInput[\"model\"]) {\n if (!model) {\n return undefined\n }\n\n return (yield* read()).variant?.[variantKey(model)]\n })\n\n const saveVariant = Effect.fn(\"RunVariant.saveVariant\")(function* (\n model: RunInput[\"model\"],\n variant: string | undefined,\n ) {\n if (!model) {\n return\n }\n\n const current = yield* read()\n const next = {\n ...current.variant,\n }\n const key = variantKey(model)\n if (variant) {\n next[key] = variant\n }\n\n if (!variant) {\n delete next[key]\n }\n\n yield* file\n .writeJson(MODEL_FILE, {\n ...current,\n variant: next,\n })\n .pipe(Effect.orElseSucceed(() => undefined))\n })\n\n return Service.of({\n resolveSavedVariant,\n saveVariant,\n })\n }),\n ),\n)\n\nconst node = makeGlobalNode({ service: Service, layer, deps: [FSUtil.node] })\n\n/** @internal Exported for testing. */\nexport function createVariantRuntime(replacements?: readonly LayerNode.Replacement[]): VariantRuntime {\n const runtime = makeRuntime(Service, AppNodeBuilder.build(node, replacements))\n return {\n resolveSavedVariant: (model) => runtime.runPromise((svc) => svc.resolveSavedVariant(model)).catch(() => undefined),\n saveVariant: (model, variant) => runtime.runPromise((svc) => svc.saveVariant(model, variant)).catch(() => {}),\n }\n}\n\nconst runtime = createVariantRuntime()\n\nexport async function resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined> {\n return runtime.resolveSavedVariant(model)\n}\n\nexport function saveVariant(model: RunInput[\"model\"], variant: string | undefined): void {\n void runtime.saveVariant(model, variant)\n}\n",
"// Session message extraction and prompt history.\n//\n// Fetches session messages from the SDK and extracts user turn text for\n// the prompt history ring. Also finds the most recently used variant for\n// the current model so the footer can pre-select it.\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { Message, Part } from \"@opencode-ai/sdk/v2\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = Array<{ info: Message; parts: Part[] }>\n\ntype Turn = {\n prompt: RunPrompt\n provider: string | undefined\n model: string | undefined\n variant: string | undefined\n}\n\nexport type RunSession = {\n first: boolean\n turns: Turn[]\n model?: NonNullable<RunInput[\"model\"]>\n variant?: string\n}\n\nfunction fileName(url: string, filename?: string) {\n if (filename) {\n return filename\n }\n\n try {\n const next = new URL(url)\n if (next.protocol !== \"file:\") {\n return url\n }\n\n const name = next.pathname.split(\"/\").at(-1)\n if (name) {\n return decodeURIComponent(name)\n }\n } catch {}\n\n return url\n}\n\nfunction fileSource(\n part: Extract<SessionMessages[number][\"parts\"][number], { type: \"file\" }>,\n text: { start: number; end: number; value: string },\n) {\n if (part.source) {\n return {\n ...structuredClone(part.source),\n text,\n }\n }\n\n return {\n type: \"file\" as const,\n path: part.filename ?? part.url,\n text,\n }\n}\n\nexport function messagePrompt(msg: SessionMessages[number]): RunPrompt {\n const parts: RunPrompt[\"parts\"] = []\n let text = msg.parts\n .filter((part): part is Extract<SessionMessages[number][\"parts\"][number], { type: \"text\" }> => {\n return part.type === \"text\" && !part.synthetic\n })\n .map((part) => part.text)\n .join(\"\")\n let cursor = Bun.stringWidth(text)\n const used: Array<{ start: number; end: number }> = []\n\n const take = (value: string): { start: number; end: number; value: string } | undefined => {\n let from = 0\n while (true) {\n const idx = text.indexOf(value, from)\n if (idx === -1) {\n return undefined\n }\n\n const start = Bun.stringWidth(text.slice(0, idx))\n const end = start + Bun.stringWidth(value)\n if (!used.some((item) => item.start < end && start < item.end)) {\n return { start, end, value }\n }\n\n from = idx + value.length\n }\n }\n\n const add = (value: string) => {\n const gap = text ? \" \" : \"\"\n const start = cursor + Bun.stringWidth(gap)\n text += gap + value\n const end = start + Bun.stringWidth(value)\n cursor = end\n return { start, end, value }\n }\n\n for (const part of msg.parts) {\n if (part.type === \"file\") {\n const next = part.source?.text ? structuredClone(part.source.text) : take(\"@\" + fileName(part.url, part.filename))\n const span = next ?? add(\"@\" + fileName(part.url, part.filename))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"file\",\n mime: part.mime,\n filename: part.filename,\n url: part.url,\n source: fileSource(part, span),\n })\n continue\n }\n\n if (part.type !== \"agent\") {\n continue\n }\n\n const span = part.source ? structuredClone(part.source) : (take(\"@\" + part.name) ?? add(\"@\" + part.name))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"agent\",\n name: part.name,\n source: span,\n })\n }\n\n return { text, parts }\n}\n\nfunction turn(msg: SessionMessages[number]): Turn | undefined {\n if (msg.info.role !== \"user\") {\n return undefined\n }\n\n return {\n prompt: messagePrompt(msg),\n provider: msg.info.model.providerID,\n model: msg.info.model.modelID,\n variant: msg.info.model.variant,\n }\n}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((msg) => {\n const item = turn(msg)\n return item ? [item] : []\n }),\n }\n}\n\nexport async function resolveCurrentSession(\n sdk: RunInput[\"sdk\"],\n sessionID: string,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }),\n sdk.session.get({ sessionID }),\n ])\n const messages = response.data.toReversed()\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) => {\n if (message.type !== \"user\") return []\n return [\n {\n prompt: {\n text: message.text,\n parts: [\n ...(message.files ?? []).map((file) => ({\n type: \"file\" as const,\n url: file.source.type === \"uri\" ? file.source.uri : `data:${file.mime};base64,${file.data}`,\n mime: file.mime,\n filename: file.name,\n source: file.mention\n ? {\n type: \"file\" as const,\n path: file.name ?? (file.source.type === \"uri\" ? file.source.uri : \"inline attachment\"),\n text: { start: file.mention.start, end: file.mention.end, value: file.mention.text },\n }\n : undefined,\n })),\n ...(message.agents ?? []).map((agent) => ({\n type: \"agent\" as const,\n name: agent.name,\n source: agent.mention\n ? { start: agent.mention.start, end: agent.mention.end, value: agent.mention.text }\n : undefined,\n })),\n ],\n },\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n },\n ]\n }),\n ...(session.model && {\n model: {\n providerID: session.model.providerID,\n modelID: session.model.id,\n },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n const out: RunPrompt[] = []\n\n for (const turn of session.turns) {\n if (!turn.prompt.text.trim()) {\n continue\n }\n\n if (out[out.length - 1] && promptSame(out[out.length - 1], turn.prompt)) {\n continue\n }\n\n out.push(promptCopy(turn.prompt))\n }\n\n return out.slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) {\n return undefined\n }\n\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) {\n return session.variant\n }\n\n for (let idx = session.turns.length - 1; idx >= 0; idx -= 1) {\n const turn = session.turns[idx]\n if (turn.provider !== model.providerID || turn.model !== model.modelID) {\n continue\n }\n\n return turn.variant\n }\n\n return undefined\n}\n",
"// Theme resolution for direct interactive mode.\n//\n// Derives scrollback and footer colors from the terminal's actual palette.\n// resolveRunTheme() queries the renderer for the terminal's palette,\n// detects dark/light mode, builds a small system theme locally, and maps it to\n// the run footer + scrollback color model. Falls back to a hardcoded dark-mode\n// palette if detection fails.\nimport { RGBA, SyntaxStyle, type CliRenderer, type ColorInput, type TerminalColors } from \"@opentui/core\"\nimport type { TuiThemeCurrent } from \"@opencode-ai/plugin/tui\"\nimport type { EntryKind } from \"./types\"\n\ntype Tone = {\n body: ColorInput\n start?: ColorInput\n}\n\nexport type RunEntryTheme = Record<EntryKind, Tone>\n\nexport type RunSplashTheme = {\n left: ColorInput\n right: ColorInput\n leftShadow: ColorInput\n rightShadow: ColorInput\n}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: ColorInput\n success: ColorInput\n error: ColorInput\n muted: ColorInput\n text: ColorInput\n status: ColorInput\n statusAccent: ColorInput\n shade: ColorInput\n surface: ColorInput\n pane: ColorInput\n border: ColorInput\n line: ColorInput\n}\n\nexport type RunBlockTheme = {\n highlight: ColorInput\n warning: ColorInput\n text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\n subtleSyntax?: SyntaxStyle\n diffAdded: ColorInput\n diffRemoved: ColorInput\n diffAddedBg: ColorInput\n diffRemovedBg: ColorInput\n diffContextBg: ColorInput\n diffHighlightAdded: ColorInput\n diffHighlightRemoved: ColorInput\n diffLineNumber: ColorInput\n diffAddedLineNumberBg: ColorInput\n diffRemovedLineNumberBg: ColorInput\n}\n\nexport type RunTheme = {\n background: ColorInput\n footer: RunFooterTheme\n entry: RunEntryTheme\n splash: RunSplashTheme\n block: RunBlockTheme\n}\n\ntype ThemeColor = Exclude<keyof TuiThemeCurrent, \"thinkingOpacity\">\ntype HexColor = `#${string}`\ntype RefName = string\ntype Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\ntype ColorValue = HexColor | RefName | Variant | RGBA | number\ntype ThemeJson = {\n defs?: Record<string, HexColor | RefName>\n theme: Omit<Record<ThemeColor, ColorValue>, \"selectedListItemText\" | \"backgroundMenu\"> & {\n selectedListItemText?: ColorValue\n backgroundMenu?: ColorValue\n thinkingOpacity?: number\n }\n}\n\ntype SharedSyntaxTheme = TuiThemeCurrent & {\n _hasSelectedListItemText: boolean\n}\n\nexport const transparent = RGBA.fromValues(0, 0, 0, 0)\n\nfunction alpha(color: RGBA, value: number): RGBA {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, value)))\n}\n\nfunction rgba(hex: string, value?: number): RGBA {\n const color = RGBA.fromHex(hex)\n return value === undefined ? color : alpha(color, value)\n}\n\nfunction mode(bg: RGBA): \"dark\" | \"light\" {\n return luminance(bg) > 0.5 ? \"light\" : \"dark\"\n}\n\nfunction luminance(color: RGBA): number {\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b\n}\n\nfunction fade(color: RGBA, base: RGBA, fallback: number, scale: number, limit: number): RGBA {\n if (color.a === 0) {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, fallback)))\n }\n\n const target = Math.min(limit, color.a * scale)\n const mix = Math.min(1, target / color.a)\n\n return RGBA.fromValues(\n base.r + (color.r - base.r) * mix,\n base.g + (color.g - base.g) * mix,\n base.b + (color.b - base.b) * mix,\n color.a,\n )\n}\n\nfunction ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansi = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansi[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const value = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(value(r), value(g), value(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nfunction tint(base: RGBA, overlay: RGBA, value: number): RGBA {\n return RGBA.fromInts(\n Math.round((base.r + (overlay.r - base.r) * value) * 255),\n Math.round((base.g + (overlay.g - base.g) * value) * 255),\n Math.round((base.b + (overlay.b - base.b) * value) * 255),\n )\n}\n\nfunction blend(color: RGBA, bg: RGBA): RGBA {\n if (color.a >= 1) {\n return color\n }\n\n return RGBA.fromValues(\n bg.r + (color.r - bg.r) * color.a,\n bg.g + (color.g - bg.g) * color.a,\n bg.b + (color.b - bg.b) * color.a,\n 1,\n )\n}\n\nfunction chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\n}\n\nfunction opaqueSyntaxStyle(style: SyntaxStyle | undefined, bg: RGBA): SyntaxStyle | undefined {\n if (!style) {\n return undefined\n }\n\n return SyntaxStyle.fromStyles(\n Object.fromEntries(\n [...style.getAllStyles()].map(([name, value]) => [\n name,\n {\n ...value,\n fg: value.fg ? blend(value.fg, bg) : value.fg,\n bg: value.bg ? blend(value.bg, bg) : value.bg,\n },\n ]),\n ),\n )\n}\n\nfunction indexedPalette(colors: TerminalColors, size: number = Math.max(colors.palette.length, 16)): RGBA[] {\n return Array.from({ length: size }, (_, index) => {\n const value = colors.palette[index]\n return RGBA.fromIndex(index, value ? RGBA.fromHex(value) : ansiToRgba(index))\n })\n}\n\nfunction srgbToLinear(value: number): number {\n if (value <= 0.04045) {\n return value / 12.92\n }\n\n return ((value + 0.055) / 1.055) ** 2.4\n}\n\nfunction oklab(color: RGBA) {\n const r = srgbToLinear(color.r)\n const g = srgbToLinear(color.g)\n const b = srgbToLinear(color.b)\n\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b)\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b)\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b)\n\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\nfunction nearestIndexed(indexed: RGBA[], rgba: RGBA): RGBA {\n const target = oklab(rgba)\n const hit = indexed.reduce(\n (best, item) => {\n const sample = oklab(item)\n const dl = sample.l - target.l\n const da = sample.a - target.a\n const db = sample.b - target.b\n const dist = dl * dl * 2 + da * da + db * db\n if (dist >= best.dist) return best\n return {\n dist,\n item,\n }\n },\n {\n dist: Number.POSITIVE_INFINITY,\n item: indexed[0]!,\n },\n )\n\n return RGBA.clone(hit.item)\n}\n\nfunction paletteColor(colors: TerminalColors, index: number): RGBA {\n const value = colors.palette[index]\n return value ? RGBA.fromHex(value) : ansiToRgba(index)\n}\n\nfunction splashShadow(indexed: RGBA[], base: RGBA, overlay: RGBA, value: number): RGBA {\n const mixed = tint(base, overlay, value)\n return nearestIndexed(indexed, mixed)\n}\n\nexport function resolveTheme(theme: ThemeJson, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const defs = theme.defs ?? {}\n\n const resolveColor = (value: ColorValue, chain: string[] = []): RGBA => {\n if (value instanceof RGBA) return value\n\n if (typeof value === \"number\") {\n return RGBA.fromIndex(value, ansiToRgba(value))\n }\n\n if (typeof value !== \"string\") {\n return resolveColor(value[pick], chain)\n }\n\n if (value === \"transparent\" || value === \"none\") {\n return RGBA.fromInts(0, 0, 0, 0)\n }\n\n if (value.startsWith(\"#\")) {\n return RGBA.fromHex(value)\n }\n\n if (chain.includes(value)) {\n throw new Error(`Circular color reference: ${[...chain, value].join(\" -> \")}`)\n }\n\n const next = defs[value] ?? theme.theme[value as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${value}\" not found in defs or theme`)\n }\n\n return resolveColor(next, [...chain, value])\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText:\n theme.theme.selectedListItemText === undefined\n ? resolved.background!\n : resolveColor(theme.theme.selectedListItemText),\n backgroundMenu:\n theme.theme.backgroundMenu === undefined ? resolved.backgroundElement! : resolveColor(theme.theme.backgroundMenu),\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): Record<number, RGBA> {\n const r = bg.r * 255\n const g = bg.g * 255\n const b = bg.b * 255\n const lum = 0.299 * r + 0.587 * g + 0.114 * b\n const cast = 0.25 * (1 - chroma(bg)) ** 2\n\n const gray = (level: number) => {\n const factor = level / 12\n\n if (isDark && lum < 10) {\n const value = Math.floor(factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n if (!isDark && lum > 245) {\n const value = Math.floor(255 - factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n const value = isDark ? lum + (255 - lum) * factor * 0.4 : lum * (1 - factor * 0.4)\n const tone = RGBA.fromInts(Math.floor(value), Math.floor(value), Math.floor(value))\n if (cast === 0) return map(tone)\n\n const ratio = lum === 0 ? 0 : value / lum\n return map(\n tint(\n tone,\n RGBA.fromInts(\n Math.floor(Math.max(0, Math.min(r * ratio, 255))),\n Math.floor(Math.max(0, Math.min(g * ratio, 255))),\n Math.floor(Math.max(0, Math.min(b * ratio, 255))),\n ),\n cast,\n ),\n )\n }\n\n return Object.fromEntries(Array.from({ length: 12 }, (_, index) => [index + 1, gray(index + 1)]))\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): RGBA {\n const lum = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n const gray = isDark\n ? lum < 10\n ? 180\n : Math.min(Math.floor(160 + lum * 0.3), 200)\n : lum > 245\n ? 75\n : Math.max(Math.floor(100 - (255 - lum) * 0.2), 60)\n\n return map(RGBA.fromInts(gray, gray, gray))\n}\n\nexport function generateSystem(colors: TerminalColors, pick: \"dark\" | \"light\"): ThemeJson {\n const bg_snapshot = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg_snapshot = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const bg = RGBA.defaultBackground(bg_snapshot)\n const fg = RGBA.defaultForeground(fg_snapshot)\n const isDark = pick === \"dark\"\n\n const color = (index: number) => paletteColor(colors, index)\n\n const grays = generateGrayScale(bg_snapshot, isDark, (rgba) => rgba)\n const textMuted = generateMutedTextColor(bg_snapshot, isDark, (rgba) => rgba)\n\n const ansi = {\n red: color(1),\n green: color(2),\n yellow: color(3),\n blue: color(4),\n magenta: color(5),\n cyan: color(6),\n red_bright: color(9),\n green_bright: color(10),\n }\n\n const diff_alpha = isDark ? 0.22 : 0.14\n const diff_context_bg = grays[2]\n const primary = ansi.cyan\n const secondary = ansi.magenta\n\n return {\n theme: {\n primary,\n secondary,\n accent: primary,\n error: ansi.red,\n warning: ansi.yellow,\n success: ansi.green,\n info: ansi.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: alpha(bg, 0),\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansi.green,\n diffRemoved: ansi.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansi.green_bright,\n diffHighlightRemoved: ansi.red_bright,\n diffAddedBg: tint(bg_snapshot, ansi.green, diff_alpha),\n diffRemovedBg: tint(bg_snapshot, ansi.red, diff_alpha),\n diffContextBg: diff_context_bg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg: tint(diff_context_bg, ansi.green, diff_alpha),\n diffRemovedLineNumberBg: tint(diff_context_bg, ansi.red, diff_alpha),\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansi.blue,\n markdownLinkText: ansi.cyan,\n markdownCode: ansi.green,\n markdownBlockQuote: ansi.yellow,\n markdownEmph: ansi.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansi.blue,\n markdownListEnumeration: ansi.cyan,\n markdownImage: ansi.blue,\n markdownImageText: ansi.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansi.magenta,\n syntaxFunction: ansi.blue,\n syntaxVariable: fg,\n syntaxString: ansi.green,\n syntaxNumber: ansi.yellow,\n syntaxType: ansi.cyan,\n syntaxOperator: ansi.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction quantizeColor(indexed: RGBA[], rgba: RGBA): RGBA {\n if (rgba.a === 0 || rgba.intent === \"default\" || rgba.intent === \"indexed\") {\n return RGBA.clone(rgba)\n }\n\n return nearestIndexed(indexed, rgba)\n}\n\nfunction quantizeTheme(theme: TuiThemeCurrent, indexed: RGBA[]): TuiThemeCurrent {\n const resolved = Object.fromEntries(\n Object.entries(theme)\n .filter(([key]) => key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, quantizeColor(indexed, value as RGBA)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n thinkingOpacity: theme.thinkingOpacity,\n }\n}\n\nfunction splashTheme(theme: TuiThemeCurrent, indexed: RGBA[]): RunSplashTheme {\n const left = nearestIndexed(indexed, theme.textMuted)\n const right = nearestIndexed(indexed, theme.text)\n return {\n left,\n right,\n leftShadow: splashShadow(indexed, theme.background, left, 0.14),\n rightShadow: splashShadow(indexed, theme.background, right, 0.14),\n }\n}\n\nfunction map(\n footerTheme: TuiThemeCurrent,\n scrollbackTheme: TuiThemeCurrent,\n splash: RunSplashTheme,\n syntax?: SyntaxStyle,\n subtleSyntax?: SyntaxStyle,\n): RunTheme {\n const opaqueSubtleSyntax = opaqueSyntaxStyle(subtleSyntax, scrollbackTheme.background)\n subtleSyntax?.destroy()\n const footerBackground = alpha(footerTheme.background, 1)\n const footerMode = mode(footerBackground)\n const shade = fade(footerTheme.backgroundMenu, footerTheme.background, 0.12, 0.56, 0.72)\n const surface = fade(footerTheme.backgroundMenu, footerTheme.background, 0.18, 0.76, 0.9)\n const line = fade(footerTheme.backgroundMenu, footerTheme.background, 0.24, 0.9, 0.98)\n const statusBase = tint(footerBackground, rgba(\"#000000\"), footerMode === \"dark\" ? 0.12 : 0.06)\n const statusAccentBase =\n footerMode === \"dark\" ? tint(footerBackground, rgba(\"#ffffff\"), 0.06) : tint(statusBase, rgba(\"#000000\"), 0.04)\n const collapsedStatus = footerMode === \"dark\" && luminance(statusBase) <= 0.04\n // Pure-black backgrounds need a slight lift or the row disappears into the terminal background.\n const status = collapsedStatus ? tint(statusBase, statusAccentBase, 0.7) : statusBase\n const statusAccent = collapsedStatus ? tint(status, rgba(\"#ffffff\"), 0.06) : statusAccentBase\n\n return {\n background: footerTheme.background,\n footer: {\n highlight: footerTheme.primary,\n selected: footerTheme.backgroundElement,\n selectedText: footerTheme.selectedListItemText,\n warning: footerTheme.warning,\n success: footerTheme.success,\n error: footerTheme.error,\n muted: footerTheme.textMuted,\n text: footerTheme.text,\n status,\n statusAccent,\n shade,\n surface,\n pane: footerTheme.backgroundMenu,\n border: footerTheme.border,\n line,\n },\n entry: {\n system: {\n body: scrollbackTheme.textMuted,\n },\n user: {\n body: scrollbackTheme.primary,\n },\n assistant: {\n body: scrollbackTheme.text,\n },\n reasoning: {\n body: scrollbackTheme.textMuted,\n },\n tool: {\n body: scrollbackTheme.text,\n start: scrollbackTheme.textMuted,\n },\n error: {\n body: scrollbackTheme.error,\n },\n },\n splash,\n block: {\n highlight: scrollbackTheme.primary,\n warning: scrollbackTheme.warning,\n text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\n subtleSyntax: opaqueSubtleSyntax,\n diffAdded: scrollbackTheme.diffAdded,\n diffRemoved: scrollbackTheme.diffRemoved,\n diffAddedBg: transparent,\n diffRemovedBg: transparent,\n diffContextBg: transparent,\n diffHighlightAdded: scrollbackTheme.diffHighlightAdded,\n diffHighlightRemoved: scrollbackTheme.diffHighlightRemoved,\n diffLineNumber: scrollbackTheme.diffLineNumber,\n diffAddedLineNumberBg: scrollbackTheme.diffAddedLineNumberBg,\n diffRemovedLineNumberBg: scrollbackTheme.diffRemovedLineNumberBg,\n },\n }\n}\n\nconst seed = {\n highlight: RGBA.fromIndex(6, rgba(\"#38bdf8\")),\n muted: RGBA.fromIndex(8, rgba(\"#64748b\")),\n text: RGBA.defaultForeground(rgba(\"#f8fafc\")),\n panel: rgba(\"#0f172a\"),\n success: RGBA.fromIndex(2, rgba(\"#22c55e\")),\n warning: RGBA.fromIndex(3, rgba(\"#f59e0b\")),\n error: RGBA.fromIndex(1, rgba(\"#ef4444\")),\n}\n\nfunction tone(body: ColorInput, start?: ColorInput): Tone {\n return {\n body,\n start,\n }\n}\n\nconst fallbackSplashIndexed = Array.from({ length: 256 }, (_, index) => RGBA.fromIndex(index))\nconst fallbackSplashLeft = RGBA.fromIndex(67)\nconst fallbackSplashRight = RGBA.fromIndex(110)\n\nexport const RUN_THEME_FALLBACK: RunTheme = {\n background: RGBA.fromValues(0, 0, 0, 0),\n footer: {\n highlight: seed.highlight,\n selected: seed.text,\n selectedText: seed.panel,\n warning: seed.warning,\n success: seed.success,\n error: seed.error,\n muted: seed.muted,\n text: seed.text,\n status: tint(seed.panel, rgba(\"#000000\"), 0.12),\n statusAccent: tint(seed.panel, rgba(\"#ffffff\"), 0.06),\n shade: alpha(seed.panel, 0.68),\n surface: alpha(seed.panel, 0.86),\n pane: seed.panel,\n border: seed.muted,\n line: alpha(seed.panel, 0.96),\n },\n entry: {\n system: tone(seed.muted),\n user: tone(seed.highlight),\n assistant: tone(seed.text),\n reasoning: tone(seed.muted),\n tool: tone(seed.text, seed.muted),\n error: tone(seed.error),\n },\n splash: {\n left: fallbackSplashLeft,\n right: fallbackSplashRight,\n leftShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashLeft, 0.14),\n rightShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashRight, 0.14),\n },\n block: {\n highlight: seed.highlight,\n warning: seed.warning,\n text: seed.text,\n muted: seed.muted,\n diffAdded: seed.success,\n diffRemoved: seed.error,\n diffAddedBg: alpha(seed.success, 0.18),\n diffRemovedBg: alpha(seed.error, 0.18),\n diffContextBg: alpha(seed.panel, 0.72),\n diffHighlightAdded: seed.success,\n diffHighlightRemoved: seed.error,\n diffLineNumber: seed.muted,\n diffAddedLineNumberBg: alpha(seed.success, 0.12),\n diffRemovedLineNumberBg: alpha(seed.error, 0.12),\n },\n}\n\nexport async function resolveRunTheme(renderer: CliRenderer): Promise<RunTheme> {\n try {\n const colors = await renderer.getPalette({\n size: 256,\n })\n const bg = colors.defaultBackground ?? colors.palette[0]\n if (!bg) {\n return RUN_THEME_FALLBACK\n }\n\n // Palette-only terminal reloads can leave renderer.themeMode stale, but\n // ANSI slot zero is not the terminal background when OSC 11 is absent.\n const pick = colors.defaultBackground\n ? mode(RGBA.fromHex(colors.defaultBackground))\n : (renderer.themeMode ?? mode(RGBA.fromHex(bg)))\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const indexed = indexedPalette(colors, 256)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const shared = await import(\"@opencode-ai/tui/context/theme\")\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n const syntax = shared.generateSyntax(syntaxTheme)\n return map(\n footerTheme,\n scrollbackTheme,\n splashTheme(scrollbackTheme, indexed),\n syntax,\n shared.generateSubtleSyntax(syntaxTheme),\n )\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n"
],
"mappings": "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",
"debugId": "453E404AC73CF8C764756E2164756E21",
"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\"\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.start(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";moBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,MAAM,MAAO,EAAc,QAAQ,CAAC,EACrE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "9A2890B350262C9264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/component/spinner.tsx", "../tui/src/ui/spinner.ts"],
"sourcesContent": [
"import { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\nimport { Show } from \"solid-js\";\nimport { useTheme } from \"../context/theme\";\nimport { useKV } from \"../context/kv\";\nimport { registerOpencodeSpinner } from \"./register-spinner\";\nregisterOpencodeSpinner();\nexport const SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nexport function Spinner(props) {\n const {\n theme\n } = useTheme();\n const kv = useKV();\n const color = () => props.color ?? theme.textMuted;\n return _$createComponent(Show, {\n get when() {\n return kv.get(\"animations_enabled\", true);\n },\n get fallback() {\n return (() => {\n var _el$4 = _$createElement(\"text\"),\n _el$5 = _$createTextNode(`⋯ `);\n _$insertNode(_el$4, _el$5);\n _$insert(_el$4, () => props.children, null);\n _$effect(_$p => _$setProp(_el$4, \"fg\", color(), _$p));\n return _el$4;\n })();\n },\n get children() {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"spinner\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"flexDirection\", \"row\");\n _$setProp(_el$, \"gap\", 1);\n _$setProp(_el$2, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$2, \"interval\", 80);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return props.children;\n },\n get children() {\n var _el$3 = _$createElement(\"text\");\n _$insert(_el$3, () => props.children);\n _$effect(_$p => _$setProp(_el$3, \"fg\", color(), _$p));\n return _el$3;\n }\n }), null);\n _$effect(_$p => _$setProp(_el$2, \"color\", color(), _$p));\n return _el$;\n }\n });\n}",
"import type { ColorInput } from \"@opentui/core\"\nimport { RGBA } from \"@opentui/core\"\nimport type { ColorGenerator } from \"opentui-spinner\"\n\ninterface AdvancedGradientOptions {\n colors: ColorInput[]\n trailLength: number\n defaultColor?: ColorInput\n direction?: \"forward\" | \"backward\" | \"bidirectional\"\n holdFrames?: { start?: number; end?: number }\n enableFading?: boolean\n minAlpha?: number\n}\n\ninterface ScannerState {\n activePosition: number\n isHolding: boolean\n holdProgress: number\n holdTotal: number\n movementProgress: number\n movementTotal: number\n isMovingForward: boolean\n}\n\nfunction getScannerState(\n frameIndex: number,\n totalChars: number,\n options: Pick<AdvancedGradientOptions, \"direction\" | \"holdFrames\">,\n): ScannerState {\n const { direction = \"forward\", holdFrames = {} } = options\n\n if (direction === \"bidirectional\") {\n const forwardFrames = totalChars\n const holdEndFrames = holdFrames.end ?? 0\n const backwardFrames = totalChars - 1\n\n if (frameIndex < forwardFrames) {\n // Moving forward\n return {\n activePosition: frameIndex,\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: frameIndex,\n movementTotal: forwardFrames,\n isMovingForward: true,\n }\n } else if (frameIndex < forwardFrames + holdEndFrames) {\n // Holding at end\n return {\n activePosition: totalChars - 1,\n isHolding: true,\n holdProgress: frameIndex - forwardFrames,\n holdTotal: holdEndFrames,\n movementProgress: 0,\n movementTotal: 0,\n isMovingForward: true,\n }\n } else if (frameIndex < forwardFrames + holdEndFrames + backwardFrames) {\n // Moving backward\n const backwardIndex = frameIndex - forwardFrames - holdEndFrames\n return {\n activePosition: totalChars - 2 - backwardIndex,\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: backwardIndex,\n movementTotal: backwardFrames,\n isMovingForward: false,\n }\n } else {\n // Holding at start\n return {\n activePosition: 0,\n isHolding: true,\n holdProgress: frameIndex - forwardFrames - holdEndFrames - backwardFrames,\n holdTotal: holdFrames.start ?? 0,\n movementProgress: 0,\n movementTotal: 0,\n isMovingForward: false,\n }\n }\n } else if (direction === \"backward\") {\n return {\n activePosition: totalChars - 1 - (frameIndex % totalChars),\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: frameIndex % totalChars,\n movementTotal: totalChars,\n isMovingForward: false,\n }\n } else {\n return {\n activePosition: frameIndex % totalChars,\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: frameIndex % totalChars,\n movementTotal: totalChars,\n isMovingForward: true,\n }\n }\n}\n\nfunction calculateColorIndex(\n frameIndex: number,\n charIndex: number,\n totalChars: number,\n options: Pick<AdvancedGradientOptions, \"direction\" | \"holdFrames\" | \"trailLength\">,\n state?: ScannerState,\n): number {\n const { trailLength } = options\n const { activePosition, isHolding, holdProgress, isMovingForward } =\n state ?? getScannerState(frameIndex, totalChars, options)\n\n // Calculate directional distance (positive means trailing behind)\n const directionalDistance = isMovingForward\n ? activePosition - charIndex // For forward: trail is to the left (lower indices)\n : charIndex - activePosition // For backward: trail is to the right (higher indices)\n\n // Handle hold frame fading: keep the lead bright, fade the trail\n if (isHolding) {\n // Shift the color index by how long we've been holding\n return directionalDistance + holdProgress\n }\n\n // Normal movement - show gradient trail only behind the movement direction\n if (directionalDistance > 0 && directionalDistance < trailLength) {\n return directionalDistance\n }\n\n // At the active position, show the brightest color\n if (directionalDistance === 0) {\n return 0\n }\n\n return -1\n}\n\nfunction createKnightRiderTrail(options: AdvancedGradientOptions): ColorGenerator {\n const { colors, defaultColor, enableFading = true, minAlpha = 0 } = options\n\n // Use the provided defaultColor if it's an RGBA instance, otherwise convert/default\n // We use RGBA.fromHex for the fallback to ensure we have an RGBA object.\n // Note: If defaultColor is a string, we convert it once here.\n const defaultRgba = defaultColor instanceof RGBA ? defaultColor : RGBA.fromHex((defaultColor as string) || \"#000000\")\n\n // Store the base alpha from the inactive factor\n const baseInactiveAlpha = defaultRgba.a\n\n let cachedFrameIndex = -1\n let cachedState: ScannerState | null = null\n\n return (frameIndex: number, charIndex: number, _totalFrames: number, totalChars: number) => {\n if (frameIndex !== cachedFrameIndex) {\n cachedFrameIndex = frameIndex\n cachedState = getScannerState(frameIndex, totalChars, options)\n }\n\n const state = cachedState!\n\n const index = calculateColorIndex(frameIndex, charIndex, totalChars, options, state)\n\n // Calculate global fade for inactive dots during hold or movement\n const { isHolding, holdProgress, holdTotal, movementProgress, movementTotal } = state\n\n let fadeFactor = 1.0\n if (enableFading) {\n if (isHolding && holdTotal > 0) {\n // Fade out linearly to minAlpha\n const progress = Math.min(holdProgress / holdTotal, 1)\n fadeFactor = Math.max(minAlpha, 1 - progress * (1 - minAlpha))\n } else if (!isHolding && movementTotal > 0) {\n // Fade in linearly from minAlpha during movement\n const progress = Math.min(movementProgress / Math.max(1, movementTotal - 1), 1)\n fadeFactor = minAlpha + progress * (1 - minAlpha)\n }\n }\n\n // Combine base inactive alpha with the fade factor\n // This ensures inactiveFactor is respected while still allowing fading animation\n defaultRgba.a = baseInactiveAlpha * fadeFactor\n\n if (index === -1) {\n return defaultRgba\n }\n\n return colors[index] ?? defaultRgba\n }\n}\n\n/**\n * Derives a gradient of tail colors from a single bright color using alpha falloff\n * @param brightColor The brightest color (center/head of the scanner)\n * @param steps Number of gradient steps (default: 6)\n * @returns Array of RGBA colors with alpha-based trail fade (background-independent)\n */\nexport function deriveTrailColors(brightColor: ColorInput, steps: number = 6): RGBA[] {\n const baseRgba = brightColor instanceof RGBA ? brightColor : RGBA.fromHex(brightColor as string)\n\n const colors: RGBA[] = []\n\n for (let i = 0; i < steps; i++) {\n // Alpha-based falloff with optional bloom effect\n let alpha: number\n let brightnessFactor: number\n\n if (i === 0) {\n // Lead position: full brightness and opacity\n alpha = 1.0\n brightnessFactor = 1.0\n } else if (i === 1) {\n // Slight bloom/glare effect: brighten color but reduce opacity slightly\n alpha = 0.9\n brightnessFactor = 1.15\n } else {\n // Exponential alpha decay for natural-looking trail fade\n alpha = Math.pow(0.65, i - 1)\n brightnessFactor = 1.0\n }\n\n const r = Math.min(1.0, baseRgba.r * brightnessFactor)\n const g = Math.min(1.0, baseRgba.g * brightnessFactor)\n const b = Math.min(1.0, baseRgba.b * brightnessFactor)\n\n colors.push(RGBA.fromValues(r, g, b, alpha))\n }\n\n return colors\n}\n\n/**\n * Derives the inactive/default color from a bright color using alpha\n * @param brightColor The brightest color (center/head of the scanner)\n * @param factor Alpha factor for inactive color (default: 0.2, range: 0-1)\n * @returns The same color with reduced alpha for background-independent dimming\n */\nexport function deriveInactiveColor(brightColor: ColorInput, factor: number = 0.2): RGBA {\n const baseRgba = brightColor instanceof RGBA ? brightColor : RGBA.fromHex(brightColor as string)\n\n // Use the full color brightness but adjust alpha for background-independent dimming\n return RGBA.fromValues(baseRgba.r, baseRgba.g, baseRgba.b, factor)\n}\n\nexport type KnightRiderStyle = \"blocks\" | \"diamonds\"\n\nexport interface KnightRiderOptions {\n width?: number\n style?: KnightRiderStyle\n holdStart?: number\n holdEnd?: number\n colors?: ColorInput[]\n /** Single color to derive trail from (alternative to providing colors array) */\n color?: ColorInput\n /** Number of trail steps when using single color (default: 6) */\n trailSteps?: number\n defaultColor?: ColorInput\n /** Alpha factor for inactive color when using single color (default: 0.2, range: 0-1) */\n inactiveFactor?: number\n /** Enable fading of inactive dots during hold and movement (default: true) */\n enableFading?: boolean\n /** Minimum alpha value when fading (default: 0, range: 0-1) */\n minAlpha?: number\n}\n\n/**\n * Creates frame strings for a Knight Rider style scanner animation\n * @param options Configuration options for the Knight Rider effect\n * @returns Array of frame strings\n */\nexport function createFrames(options: KnightRiderOptions = {}): string[] {\n const width = options.width ?? 8\n const style = options.style ?? \"diamonds\"\n const holdStart = options.holdStart ?? 30\n const holdEnd = options.holdEnd ?? 9\n\n const colors =\n options.colors ??\n (options.color\n ? deriveTrailColors(options.color, options.trailSteps)\n : [\n RGBA.fromHex(\"#ff0000\"), // Brightest Red (Center)\n RGBA.fromHex(\"#ff5555\"), // Glare/Bloom\n RGBA.fromHex(\"#dd0000\"), // Trail 1\n RGBA.fromHex(\"#aa0000\"), // Trail 2\n RGBA.fromHex(\"#770000\"), // Trail 3\n RGBA.fromHex(\"#440000\"), // Trail 4\n ])\n\n const defaultColor =\n options.defaultColor ??\n (options.color ? deriveInactiveColor(options.color, options.inactiveFactor) : RGBA.fromHex(\"#330000\"))\n\n const trailOptions = {\n colors,\n trailLength: colors.length,\n defaultColor,\n direction: \"bidirectional\" as const,\n holdFrames: { start: holdStart, end: holdEnd },\n enableFading: options.enableFading,\n minAlpha: options.minAlpha,\n }\n\n // Bidirectional cycle: Forward (width) + Hold End + Backward (width-1) + Hold Start\n const totalFrames = width + holdEnd + (width - 1) + holdStart\n\n // Generate dynamic frames where inactive pixels are dots and active ones are blocks\n const frames = Array.from({ length: totalFrames }, (_, frameIndex) => {\n return Array.from({ length: width }, (_, charIndex) => {\n const index = calculateColorIndex(frameIndex, charIndex, width, trailOptions)\n\n if (style === \"diamonds\") {\n const shapes = [\"⬥\", \"◆\", \"⬩\", \"⬪\"]\n if (index >= 0 && index < trailOptions.colors.length) {\n return shapes[Math.min(index, shapes.length - 1)]\n }\n return \"·\"\n }\n\n // Default to blocks\n // It's active if we have a valid color index that is within our colors array\n const isActive = index >= 0 && index < trailOptions.colors.length\n return isActive ? \"■\" : \"⬝\"\n }).join(\"\")\n })\n\n return frames\n}\n\n/**\n * Creates a color generator function for Knight Rider style scanner animation\n * @param options Configuration options for the Knight Rider effect\n * @returns ColorGenerator function\n */\nexport function createColors(options: KnightRiderOptions = {}): ColorGenerator {\n const holdStart = options.holdStart ?? 30\n const holdEnd = options.holdEnd ?? 9\n\n const colors =\n options.colors ??\n (options.color\n ? deriveTrailColors(options.color, options.trailSteps)\n : [\n RGBA.fromHex(\"#ff0000\"), // Brightest Red (Center)\n RGBA.fromHex(\"#ff5555\"), // Glare/Bloom\n RGBA.fromHex(\"#dd0000\"), // Trail 1\n RGBA.fromHex(\"#aa0000\"), // Trail 2\n RGBA.fromHex(\"#770000\"), // Trail 3\n RGBA.fromHex(\"#440000\"), // Trail 4\n ])\n\n const defaultColor =\n options.defaultColor ??\n (options.color ? deriveInactiveColor(options.color, options.inactiveFactor) : RGBA.fromHex(\"#330000\"))\n\n const trailOptions = {\n colors,\n trailLength: colors.length,\n defaultColor,\n direction: \"bidirectional\" as const,\n holdFrames: { start: holdStart, end: holdEnd },\n enableFading: options.enableFading,\n minAlpha: options.minAlpha,\n }\n\n return createKnightRiderTrail(trailOptions)\n}\n"
],
"mappings": "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",
"debugId": "4C48640D3F7A34EB64756E2164756E21",
"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\"\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 found = yield* Service.discover(yield* ServiceConfig.options())\n process.stdout.write((found ? found.url : \"stopped\") + EOL)\n }),\n)\n"
],
"mappings": ";moBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,CAC3C,IAAM,EAAQ,MAAO,EAAQ,SAAS,MAAO,EAAc,QAAQ,CAAC,EACpE,QAAQ,OAAO,OAAO,EAAQ,EAAM,IAAM,WAAa,CAAG,EAC3D,CACH",
"debugId": "CD40A788604694A464756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/mcp/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient, type McpServer } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.mcp.list({ location: { directory: process.cwd() } }))\n const servers = (response.data?.data ?? []).toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";krBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,IADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GACjF,MAAM,MAAQ,CAAC,GAAG,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC3F,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "C16B7D1BE03FD88364756E2164756E21",
"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 { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ 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.v2.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": ";guBAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,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,GAAG,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EAC3G,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "1DFDBD74CC83730664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../../node_modules/.bun/@opentui+keymap@0.4.3+aeceedea454d57be/node_modules/@opentui/keymap/src/opentui.js", "../tui/src/util/session.ts", "../tui/src/logo.ts"],
"sourcesContent": [
"// @bun\nimport\"../chunks/index-p35cyhc4.js\";\n\n// src/opentui.ts\nimport { CliRenderEvents, KeyEvent, RenderableEvents } from \"@opentui/core\";\nimport { Keymap } from \"@opentui/keymap\";\nimport { registerDefaultKeys, registerEnabledFields, registerMetadataFields } from \"@opentui/keymap/addons\";\nfunction createSyntheticCommandEvent() {\n return new KeyEvent({\n name: \"command\",\n ctrl: false,\n meta: false,\n shift: false,\n option: false,\n sequence: \"\",\n number: false,\n raw: \"\",\n eventType: \"press\",\n source: \"raw\"\n });\n}\nfunction normalizeRuntimePlatform(platform) {\n if (platform === \"darwin\") {\n return \"macos\";\n }\n if (platform === \"win32\") {\n return \"windows\";\n }\n if (platform === \"linux\") {\n return \"linux\";\n }\n return \"unknown\";\n}\nfunction createOpenTuiHostMetadata(renderer) {\n const platform = normalizeRuntimePlatform(process.platform);\n const hasKittyKeyboard = renderer.capabilities?.kitty_keyboard === true;\n return {\n platform,\n primaryModifier: platform === \"macos\" ? \"super\" : platform === \"unknown\" ? \"unknown\" : \"ctrl\",\n modifiers: {\n ctrl: \"supported\",\n shift: \"supported\",\n meta: \"supported\",\n super: hasKittyKeyboard ? \"supported\" : \"unknown\",\n hyper: hasKittyKeyboard ? \"supported\" : \"unknown\"\n }\n };\n}\nfunction createOpenTuiKeymapHost(renderer) {\n return {\n get metadata() {\n return createOpenTuiHostMetadata(renderer);\n },\n rootTarget: renderer.root,\n get isDestroyed() {\n return renderer.isDestroyed;\n },\n getFocusedTarget() {\n const focused = renderer.currentFocusedRenderable;\n if (!focused || focused.isDestroyed || !focused.focused) {\n return null;\n }\n return focused;\n },\n getParentTarget(target) {\n return target.parent;\n },\n isTargetDestroyed(target) {\n return target.isDestroyed;\n },\n onKeyPress(listener) {\n renderer.keyInput.prependListener(\"keypress\", listener);\n return () => {\n renderer.keyInput.off(\"keypress\", listener);\n };\n },\n onKeyRelease(listener) {\n renderer.keyInput.prependListener(\"keyrelease\", listener);\n return () => {\n renderer.keyInput.off(\"keyrelease\", listener);\n };\n },\n onFocusChange(listener) {\n renderer.on(CliRenderEvents.FOCUSED_RENDERABLE, listener);\n return () => {\n renderer.off(CliRenderEvents.FOCUSED_RENDERABLE, listener);\n };\n },\n onDestroy(listener) {\n renderer.once(CliRenderEvents.DESTROY, listener);\n return () => {\n renderer.off(CliRenderEvents.DESTROY, listener);\n };\n },\n onTargetDestroy(target, listener) {\n target.once(RenderableEvents.DESTROYED, listener);\n return () => {\n target.off(RenderableEvents.DESTROYED, listener);\n };\n },\n onRawInput(listener) {\n renderer.prependInputHandler(listener);\n return () => {\n renderer.removeInputHandler(listener);\n };\n },\n createCommandEvent() {\n return createSyntheticCommandEvent();\n }\n };\n}\nfunction createOpenTuiKeymap(renderer) {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot create a keymap for a destroyed renderer\");\n }\n return new Keymap(createOpenTuiKeymapHost(renderer));\n}\nfunction createDefaultOpenTuiKeymap(renderer) {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot create a keymap for a destroyed renderer\");\n }\n const keymap = new Keymap(createOpenTuiKeymapHost(renderer));\n registerDefaultKeys(keymap);\n registerEnabledFields(keymap);\n registerMetadataFields(keymap);\n return keymap;\n}\nexport {\n createOpenTuiKeymapHost,\n createOpenTuiKeymap,\n createDefaultOpenTuiKeymap\n};\n\n//# debugId=3536CBBE2B01723A64756E2164756E21\n//# sourceMappingURL=opentui.js.map\n",
"import type { SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/sdk/v2\"\n\nexport function isDefaultTitle(title: string) {\n return /^(New session - |Child session - )\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(title)\n}\n\nexport function lastAssistantWithUsage(messages: ReadonlyArray<SessionMessageInfo>, boundary?: string) {\n const boundaryIndex = boundary ? messages.findIndex((message) => message.id === boundary) : -1\n if (boundary && boundaryIndex === -1) return undefined\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && (boundaryIndex === -1 || index < boundaryIndex),\n )\n}\n",
"export const logo = {\n left: [\" \", \"█▀▀█ █▀▀█ █▀▀█ █▀▀▄\", \"█__█ █__█ █^^^ █__█\", \"▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀\"],\n right: [\" ▄ \", \"█▀▀▀ █▀▀█ █▀▀█ █▀▀█\", \"█___ █__█ █__█ █^^^\", \"▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀\"],\n}\n\nexport const go = {\n left: [\" \", \"█▀▀▀\", \"█_^█\", \"▀▀▀▀\"],\n right: [\" \", \"█▀▀█\", \"█__█\", \"▀▀▀▀\"],\n}\n\nexport const marks = \"_^~,\"\n"
],
"mappings": "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",
"debugId": "6E060562FDC2086964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/mini.ts", "src/mini/run.ts", "src/mini/noninteractive.ts", "src/mini/ui.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Server } from \"../services/server\"\nimport { waitForCatalogReady } from \"./catalog.shared\"\nimport { INTERACTIVE_INPUT_ERROR, resolveInteractiveStdin } from \"./runtime.stdin\"\nimport type { RunInput, RunTuiConfig } from \"./types\"\n\nexport type MiniCommandInput = {\n server: Server.Resolved\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?: RunTuiConfig | Promise<RunTuiConfig>\n}\n\ntype Session = Awaited<ReturnType<OpenCodeClient[\"session\"][\"get\"]>>\nexport async function runMini(input: MiniCommandInput) {\n validate(input)\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await Bun.stdin.text(), input.prompt)\n const runtimeTask = import(\"./runtime\")\n const directory = localDirectory()\n\n try {\n const sdk = OpenCode.make({\n baseUrl: input.server.endpoint.url,\n headers: Service.headers(input.server.endpoint),\n })\n const model = parseModel(input.model)\n let agentTask: Promise<string | undefined> | undefined\n const resolveAgent = () => {\n agentTask ??= validateAgent(sdk, directory, input.agent)\n return agentTask\n }\n const resolveSession = async () => {\n const [agent, selected] = await Promise.all([\n resolveAgent(),\n selectSession(sdk, directory, input),\n ])\n const readyModel =\n model ?? (selected?.model ? { providerID: selected.model.providerID, modelID: selected.model.id } : undefined)\n if (readyModel) await waitForCatalogReady({ sdk, directory, model: readyModel })\n const session = selected ?? (await createSession(sdk, directory, agent, model))\n return { id: session.id, title: session.title, resume: selected !== undefined }\n }\n const create = (\n _sdk: OpenCodeClient,\n next: { agent: string | undefined; model: RunInput[\"model\"]; variant: string | undefined },\n ) => createSession(sdk, directory, next.agent, next.model, next.variant)\n const runtime = await runtimeTask\n await runtime.runInteractiveDeferredMode({\n sdk,\n directory,\n resolveAgent,\n session: resolveSession,\n createSession: create,\n agent: input.agent,\n model,\n variant: undefined,\n files: [],\n initialInput,\n thinking: true,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n })\n } catch (error) {\n if (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR) fail(error.message)\n throw error\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 resolveInteractiveStdin().cleanup?.()\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 fail(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string): RunInput[\"model\"] {\n if (!value) return\n const [providerID, ...rest] = value.split(\"/\")\n const modelID = rest.join(\"/\")\n if (!providerID || !modelID) fail(\"--model must use the format provider/model\")\n return { providerID, modelID }\n}\n\nasync function validateAgent(sdk: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline) {\n agents = await sdk.agent.list({ location: { directory } }).catch(() => undefined)\n const agent = agents?.data.find((item) => item.id === name)\n if (agent?.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n if (agent) return name\n await Bun.sleep(25)\n }\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nasync function selectSession(sdk: OpenCodeClient, directory: string, input: MiniCommandInput, preselected?: Session) {\n const selected =\n preselected ??\n (input.session\n ? await sdk.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await sdk.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined)\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected) return\n if (!input.fork) return selected\n return sdk.session.fork({ sessionID: selected.id })\n}\n\nasync function createSession(\n sdk: OpenCodeClient,\n directory: string,\n agent: string | undefined,\n model: RunInput[\"model\"],\n variant?: string,\n): Promise<Session> {\n if (model) await waitForCatalogReady({ sdk, directory, model })\n return sdk.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory },\n })\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n",
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { Model } from \"@opencode-ai/schema/model\"\nimport type { ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Server } from \"../services/server\"\nimport { loadRunAgents, waitForCatalogReady } from \"./catalog.shared\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { toolInlineInfo } from \"./tool\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: Server.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\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return run(input).catch((error) => reportError(input, error instanceof Error ? error.message : String(error)))\n}\n\nasync function run(input: RunCommandInput) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = process.env.PWD ?? process.cwd()\n const directory = localDirectory(root)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await Bun.stdin.text())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Service.Endpoint) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const requestedDirectory = prepared.directory ?? (await client.location.get()).directory\n if (!requestedDirectory) fail(\"Failed to resolve server directory\")\n const session = await selectSession(client, requestedDirectory, input)\n const cwd = session?.location.directory ?? requestedDirectory\n const workspace = session?.location.workspaceID\n const explicit = parseRunModel(input.model)\n const explicitModel = explicit?.model\n const variant = explicit?.variant\n const sessionModel = session?.model ? { providerID: session.model.providerID, modelID: session.model.id } : undefined\n const defaultModel =\n !explicitModel && !sessionModel\n ? await client.model\n .default({ location: { directory: cwd, workspace } })\n .then((result) => (result.data ? { providerID: result.data.providerID, modelID: result.data.id } : undefined))\n : undefined\n const model = pickRunModel(explicitModel, variant, sessionModel, defaultModel)\n if (variant && !model)\n return reportError(input, \"Cannot select a variant before selecting a model\", session?.id)\n if (model) {\n await waitForCatalogReady({ sdk: client, directory: cwd, workspace, model })\n const available = await client.model.list({ location: { directory: cwd, workspace } })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.modelID))\n return reportError(input, `Model unavailable: ${model.providerID}/${model.modelID}`, session?.id)\n }\n const agent = await validateAgent(client, cwd, input.agent)\n const selected =\n session ??\n (await client.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory: cwd },\n }))\n if (!session && input.title !== undefined) {\n await client.session.rename({\n sessionID: selected.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: selected.id,\n message: prepared.message,\n files: prepared.files,\n agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: true,\n renderTool,\n renderToolError,\n }).catch((error) => reportError(input, error instanceof Error ? error.message : String(error), selected.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\nexport function pickRunModel(\n explicit: { providerID: string; modelID: string } | undefined,\n variant: string | undefined,\n session: { providerID: string; modelID: string } | undefined,\n fallback: { providerID: string; modelID: string } | undefined,\n) {\n if (explicit) return explicit\n if (!variant) return\n return session ?? fallback\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 if (!value) return\n const ref = Model.Ref.parse(value)\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const agents = await loadRunAgents(client, directory).catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function selectSession(client: OpenCodeClient, directory: string, input: RunCommandInput) {\n const selected = input.session\n ? await client.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await client.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected || !input.fork) return selected\n return client.session.fork({ sessionID: selected.id })\n}\n\nasync function prepareFile(input: string, directory: string): 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 (!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: ToolPart) {\n const info = toolInlineInfo(part)\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: ToolPart) {\n const info = toolInlineInfo(part)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction reportError(input: RunCommandInput, 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 { EventSubscribeOutput, OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { ReasoningPart, StepFinishPart, StepStartPart, TextPart, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\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 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 renderTool: (part: ToolPart) => Promise<void>\n renderToolError: (part: ToolPart) => 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, unknown>\n raw?: string\n provider?: unknown\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let questionRejected = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let admission: AbortController | 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: TextPart, 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 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 rejectQuestion = async (request: { id: string }) => {\n questionRejected = true\n await input.client.question.reject({ sessionID: input.sessionID, requestID: request.id }).catch(() => {})\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n formCancelled = true\n await input.client.form.cancel({ sessionID: request.sessionID, formID: request.id }).catch(() => {})\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (event.type === \"question.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await rejectQuestion(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached && event.data.form.sessionID === GLOBAL_FORM_SESSION_ID))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || questionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part: StepStartPart = {\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 (!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 starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part: TextPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part: ReasoningPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n tools.set(event.data.callID, {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(event.data.callID)\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.called\") {\n const current = tools.get(event.data.callID)\n tools.set(event.data.callID, {\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 })\n continue\n }\n if (event.type === \"session.tool.success\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: event.data.content\n .filter((item) => item.type === \"text\")\n .map((item) => item.text)\n .join(\"\\n\"),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(part)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const error = event.data.error.message\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) {\n await input.renderToolError(part)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n const part: StepFinishPart = {\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 (interrupted || permissionRejected || questionRejected || formCancelled) continue\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 (!emittedError && !questionRejected && !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 (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, questions, forms] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.question.list({ sessionID: input.sessionID }).catch(() => undefined),\n Promise.all(\n (input.attached ? [input.sessionID] : [input.sessionID, GLOBAL_FORM_SESSION_ID]).map((sessionID) =>\n input.client.form.list({ sessionID }).catch(() => undefined),\n ),\n ),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(questions ?? []).map(rejectQuestion),\n ...forms.flatMap((response) => response ?? []).map(cancelForm),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n }\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,${Buffer.from(await Bun.file(new URL(file.url)).arrayBuffer()).toString(\"base64\")}`\n return { attachment: { uri, mime: file.mime, 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 Bun.file(new URL(file.url)).text()\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": "15A4F394DAB5AB8C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/restart.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";moBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,MAAM,CAAO,EAC9C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "3593438C17FF91FC64756E2164756E21",
"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": ";8nBAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,EAAO,CAC7C,QAAQ,OAAO,OAAO,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "17C6A7A4119A9A6964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../../node_modules/.bun/@opentui+keymap@0.4.3+aeceedea454d57be/node_modules/@opentui/keymap/src/extras/index.js", "../tui/src/config/keybind.ts", "../tui/src/config/index.tsx"],
"sourcesContent": [
"// @bun\nimport\"../../chunks/index-p35cyhc4.js\";\n\n// src/extras/binding-lookup.ts\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar EMPTY_BINDINGS = Object.freeze([]);\nfunction isObject(value) {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction isKeyLike(value) {\n return typeof value === \"string\" || isObject(value);\n}\nfunction cloneKeyLike(key) {\n if (typeof key === \"string\") {\n return key;\n }\n return { ...key };\n}\nfunction normalizeCommand(command) {\n if (command.length === 0) {\n throw new Error(\"Invalid binding command: command cannot be empty\");\n }\n return command;\n}\nfunction mapCommand(command, commandMap) {\n const configCommand = normalizeCommand(command);\n if (!commandMap || !hasOwn.call(commandMap, configCommand)) {\n return configCommand;\n }\n const mappedCommand = commandMap[configCommand];\n if (typeof mappedCommand !== \"string\") {\n throw new Error(`Invalid binding command map entry for \"${configCommand}\": expected a command string`);\n }\n if (mappedCommand.length === 0) {\n throw new Error(`Invalid binding command map entry for \"${configCommand}\": command cannot be empty`);\n }\n return mappedCommand;\n}\nfunction invalidBindingValue(command, index) {\n const location = index === undefined ? `\"${command}\"` : `\"${command}\" at index ${index}`;\n return new Error(`Invalid binding value for ${location}: expected false, a key, a binding object, or an array of keys/binding objects`);\n}\nfunction resolveBindingItem(command, item, index) {\n if (!isKeyLike(item)) {\n throw invalidBindingValue(command, index);\n }\n if (typeof item === \"string\" || !(\"key\" in item)) {\n return {\n key: cloneKeyLike(item),\n cmd: command\n };\n }\n const key = item.key;\n if (!isKeyLike(key)) {\n throw invalidBindingValue(command, index);\n }\n return {\n ...item,\n key: cloneKeyLike(key),\n cmd: command\n };\n}\nfunction resolveBindingValue(command, value, bindingDefaults) {\n if (value === false || value === \"none\") {\n return;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return;\n }\n const items = value;\n const bindings = new Array(items.length);\n for (let index = 0;index < items.length; index += 1) {\n const binding2 = resolveBindingItem(command, items[index], index);\n bindings[index] = bindingDefaults ? withBindingDefaults(command, binding2, bindingDefaults) : binding2;\n }\n return bindings;\n }\n const binding = resolveBindingItem(command, value);\n return [bindingDefaults ? withBindingDefaults(command, binding, bindingDefaults) : binding];\n}\nfunction withBindingDefaults(command, binding, bindingDefaults) {\n const defaults = bindingDefaults?.({ command, binding });\n if (!defaults)\n return binding;\n return { ...defaults, ...binding };\n}\nfunction flattenBindings(byCommand) {\n let bindingCount = 0;\n for (const bindings of byCommand.values()) {\n bindingCount += bindings.length;\n }\n const result = new Array(bindingCount);\n let bindingIndex = 0;\n for (const bindings of byCommand.values()) {\n for (let index = 0;index < bindings.length; index += 1) {\n result[bindingIndex] = bindings[index];\n bindingIndex += 1;\n }\n }\n return result;\n}\nfunction normalizeBindings(config, commandMap, bindingDefaults) {\n const byCommand = new Map;\n for (const rawCommand in config) {\n if (!hasOwn.call(config, rawCommand)) {\n continue;\n }\n const command = mapCommand(rawCommand, commandMap);\n const commandBindings = resolveBindingValue(command, config[rawCommand], bindingDefaults);\n if (!commandBindings) {\n byCommand.delete(command);\n } else {\n byCommand.set(command, commandBindings);\n }\n }\n return {\n bindings: flattenBindings(byCommand),\n byCommand\n };\n}\nfunction gatherBindings(byCommand, commands) {\n const gatheredByCommand = new Map;\n const bindings = [];\n for (const command of commands) {\n const commandBindings = byCommand.get(command);\n if (!commandBindings)\n continue;\n gatheredByCommand.set(command, commandBindings);\n for (let index = 0;index < commandBindings.length; index += 1) {\n bindings.push(commandBindings[index]);\n }\n }\n return { bindings, byCommand: gatheredByCommand };\n}\nfunction createBindingLookup(config, options) {\n let currentConfig = config;\n let normalized = normalizeBindings(currentConfig, options?.commandMap, options?.bindingDefaults);\n const gathered = new Map;\n return {\n get bindings() {\n return normalized.bindings;\n },\n get(command) {\n return normalized.byCommand.get(command) ?? EMPTY_BINDINGS;\n },\n has(command) {\n return normalized.byCommand.has(command);\n },\n gather(name, commands) {\n const existing = gathered.get(name);\n if (existing)\n return existing.bindings;\n const next = gatherBindings(normalized.byCommand, commands);\n gathered.set(name, next);\n return next.bindings;\n },\n pick(name, commands) {\n const group = gathered.get(name);\n if (!group)\n return [];\n const result = [];\n for (const command of commands) {\n const bindings = group.byCommand.get(command);\n if (!bindings)\n continue;\n for (let index = 0;index < bindings.length; index += 1) {\n result.push(bindings[index]);\n }\n }\n return result;\n },\n omit(name, commands) {\n const group = gathered.get(name);\n if (!group)\n return [];\n if (commands.length === 0)\n return group.bindings;\n if (commands.length === 1) {\n const omitted2 = commands[0];\n const result2 = [];\n for (let index = 0;index < group.bindings.length; index += 1) {\n const binding = group.bindings[index];\n if (typeof binding.cmd === \"string\" && binding.cmd === omitted2)\n continue;\n result2.push(binding);\n }\n return result2;\n }\n const omitted = new Set(commands);\n const result = [];\n for (let index = 0;index < group.bindings.length; index += 1) {\n const binding = group.bindings[index];\n if (typeof binding.cmd === \"string\" && omitted.has(binding.cmd))\n continue;\n result.push(binding);\n }\n return result;\n },\n invalidate(name) {\n if (name === undefined) {\n gathered.clear();\n return;\n }\n gathered.delete(name);\n },\n update(nextConfig) {\n if (nextConfig) {\n currentConfig = nextConfig;\n }\n normalized = normalizeBindings(currentConfig, options?.commandMap, options?.bindingDefaults);\n gathered.clear();\n }\n };\n}\n// src/extras/command-bindings.ts\nfunction isCommandBindingKey(value) {\n return typeof value === \"string\" || !!value && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction commandBindings(bindings, options) {\n const normalized = [];\n const indexesByCommand = new Map;\n for (const [command, key] of Object.entries(bindings)) {\n if (!isCommandBindingKey(key)) {\n const error = new Error(`Invalid command binding for \"${command}\": command bindings must map command strings to key strings or keystroke objects`);\n options?.onError?.({\n code: \"invalid-command-binding\",\n command,\n value: key,\n reason: error\n });\n continue;\n }\n const normalizedCommand = command.trim();\n const nextBinding = {\n key: typeof key === \"string\" ? key : { ...key },\n cmd: normalizedCommand\n };\n const existingIndex = indexesByCommand.get(normalizedCommand);\n if (existingIndex !== undefined) {\n const previousBinding = normalized[existingIndex];\n options?.onWarning?.({\n code: \"command-binding-override\",\n command: normalizedCommand,\n previousKey: previousBinding.key,\n nextKey: nextBinding.key\n });\n normalized[existingIndex] = nextBinding;\n continue;\n }\n indexesByCommand.set(normalizedCommand, normalized.length);\n normalized.push(nextBinding);\n }\n return normalized;\n}\n// src/extras/formatting.ts\nfunction formatStroke(part, options) {\n if (part.tokenName) {\n const tokenDisplay = options.tokenDisplay;\n if (!tokenDisplay)\n return part.display;\n if (typeof tokenDisplay === \"function\")\n return tokenDisplay(part.tokenName, part) ?? part.display;\n return tokenDisplay[part.tokenName] ?? part.display;\n }\n if (part.patternName) {\n const patternDisplay = options.patternDisplay;\n if (!patternDisplay)\n return part.display;\n if (typeof patternDisplay === \"function\")\n return patternDisplay(part.patternName, part) ?? part.display;\n return patternDisplay[part.patternName] ?? part.display;\n }\n if (!options.keyNameAliases && !options.modifierAliases)\n return part.display;\n const stroke = part.stroke;\n const modifierAliases = options.modifierAliases;\n let formatted = \"\";\n let pieceCount = 0;\n if (stroke.ctrl) {\n formatted = modifierAliases?.ctrl ?? \"ctrl\";\n pieceCount = 1;\n }\n if (stroke.shift) {\n const alias = modifierAliases?.shift ?? \"shift\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n if (stroke.meta) {\n const alias = modifierAliases?.meta ?? \"meta\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n if (stroke.super) {\n const alias = modifierAliases?.super ?? \"super\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n if (stroke.hyper) {\n const alias = modifierAliases?.hyper ?? \"hyper\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n const name = stroke.name === \"return\" ? \"enter\" : stroke.name;\n const keyName = options.keyNameAliases?.[name] ?? name;\n return pieceCount === 0 ? keyName : `${formatted}+${keyName}`;\n}\nfunction formatKeySequence(parts, options = {}) {\n if (!parts || parts.length === 0)\n return \"\";\n const separator = options.separator ?? \" \";\n let formatted = formatStroke(parts[0], options);\n for (let index = 1;index < parts.length; index += 1) {\n formatted += separator + formatStroke(parts[index], options);\n }\n return formatted;\n}\nfunction formatCommandBindings(bindings, options = {}) {\n if (!bindings?.length)\n return;\n const bindingSeparator = options.bindingSeparator ?? \", \";\n const dedupe = options.dedupe !== false;\n const seen = dedupe ? new Set : undefined;\n let formatted = \"\";\n let itemCount = 0;\n for (const binding of bindings) {\n const item = formatKeySequence(binding.sequence, options);\n if (!item)\n continue;\n if (seen) {\n if (seen.has(item))\n continue;\n seen.add(item);\n }\n formatted = itemCount === 0 ? item : `${formatted}${bindingSeparator}${item}`;\n itemCount += 1;\n }\n return formatted;\n}\nexport {\n formatKeySequence,\n formatCommandBindings,\n createBindingLookup,\n commandBindings\n};\n\n//# debugId=418A62FEB87D11F164756E2164756E21\n//# sourceMappingURL=index.js.map\n",
"export * as TuiKeybind from \"./keybind\"\n\nimport type { KeyEvent, Renderable } from \"@opentui/core\"\nimport type { Binding } from \"@opentui/keymap\"\nimport type { BindingCommandMap, BindingConfig, BindingDefaults } from \"@opentui/keymap/extras\"\nimport { Schema } from \"effect\"\n\nconst KeyStroke = Schema.Struct({\n name: Schema.String,\n ctrl: Schema.optional(Schema.Boolean),\n shift: Schema.optional(Schema.Boolean),\n meta: Schema.optional(Schema.Boolean),\n super: Schema.optional(Schema.Boolean),\n hyper: Schema.optional(Schema.Boolean),\n})\n\nconst BindingObject = Schema.StructWithRest(\n Schema.Struct({\n key: Schema.Union([Schema.String, KeyStroke]),\n event: Schema.optional(Schema.Literals([\"press\", \"release\"])),\n preventDefault: Schema.optional(Schema.Boolean),\n fallthrough: Schema.optional(Schema.Boolean),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst BindingItem = Schema.Union([Schema.String, KeyStroke, BindingObject])\nexport const BindingValueSchema = Schema.Union([\n Schema.Literal(false),\n Schema.Literal(\"none\"),\n BindingItem,\n Schema.Array(BindingItem),\n])\nexport type BindingValueSchema = Schema.Schema.Type<typeof BindingValueSchema>\n\ntype Definition = {\n default: BindingValueSchema\n description: string\n}\n\nexport const LeaderDefault = \"ctrl+x\"\n\nconst keybind = (value: Definition[\"default\"], description: string): Definition => ({ default: value, description })\n\nexport const Definitions = {\n leader: keybind(LeaderDefault, \"Leader key for keybind combinations\"),\n\n app_exit: keybind(\"ctrl+c,ctrl+d,<leader>q\", \"Exit the application\"),\n app_debug: keybind(\"none\", \"Toggle debug panel\"),\n app_console: keybind(\"none\", \"Toggle console\"),\n app_heap_snapshot: keybind(\"none\", \"Write heap snapshot\"),\n app_toggle_animations: keybind(\"none\", \"Toggle animations\"),\n app_toggle_file_context: keybind(\"none\", \"Toggle file context\"),\n app_toggle_diffwrap: keybind(\"none\", \"Toggle diff wrapping\"),\n app_toggle_paste_summary: keybind(\"none\", \"Toggle paste summary\"),\n app_toggle_session_directory_filter: keybind(\"none\", \"Toggle session directory filtering\"),\n command_list: keybind(\"ctrl+p\", \"List available commands\"),\n help_show: keybind(\"none\", \"Open help dialog\"),\n docs_open: keybind(\"none\", \"Open documentation\"),\n diff_open: keybind(\"none\", \"Open diff viewer\"),\n diff_close: keybind(\"escape,q\", \"Close diff viewer\"),\n diff_toggle: keybind(\"enter,space\", \"Toggle diff viewer item\"),\n diff_expand: keybind(\"right\", \"Expand diff viewer item\"),\n diff_expand_all: keybind(\"E\", \"Expand all diff viewer folders\"),\n diff_collapse: keybind(\"left\", \"Collapse diff viewer item\"),\n diff_switch_focus: keybind(\"tab\", \"Switch diff viewer focus\"),\n diff_next_hunk: keybind(\"]\", \"Jump to next diff hunk\"),\n diff_previous_hunk: keybind(\"[\", \"Jump to previous diff hunk\"),\n diff_next_file: keybind(\"n\", \"Jump to next diff file\"),\n diff_previous_file: keybind(\"p\", \"Jump to previous diff file\"),\n diff_toggle_file_tree: keybind(\"b\", \"Toggle diff viewer file tree\"),\n diff_single_patch: keybind(\"s\", \"Toggle single patch view\"),\n diff_switch_source: keybind(\"d\", \"Switch diff viewer source\"),\n diff_toggle_view: keybind(\"v\", \"Toggle diff viewer split or unified view\"),\n diff_help: keybind(\"?\", \"Show more diff viewer shortcuts\"),\n\n editor_open: keybind(\"<leader>e\", \"Open external editor\"),\n theme_list: keybind(\"<leader>t\", \"List available themes\"),\n theme_switch_mode: keybind(\"none\", \"Switch between light and dark theme mode\"),\n theme_mode_lock: keybind(\"none\", \"Lock or unlock theme mode\"),\n sidebar_toggle: keybind(\"<leader>b\", \"Toggle sidebar\"),\n scrollbar_toggle: keybind(\"none\", \"Toggle session scrollbar\"),\n status_view: keybind(\"<leader>s\", \"View status\"),\n debug_view: keybind(\"none\", \"View debug info\"),\n\n session_export: keybind(\"<leader>x\", \"Export session to editor\"),\n session_copy: keybind(\"none\", \"Copy session transcript\"),\n session_move: keybind(\"none\", \"Move session\"),\n session_new: keybind(\"<leader>n\", \"Create a new session\"),\n session_list: keybind(\"<leader>l\", \"List all sessions\"),\n session_timeline: keybind(\"<leader>g\", \"Show session timeline\"),\n session_fork: keybind(\"none\", \"Fork session from message\"),\n session_rename: keybind(\"ctrl+r\", \"Rename session\"),\n session_delete: keybind(\"ctrl+d\", \"Delete session\"),\n session_share: keybind(\"none\", \"Share current session\"),\n session_unshare: keybind(\"none\", \"Unshare current session\"),\n session_interrupt: keybind(\"escape\", \"Interrupt current session\"),\n session_background: keybind(\"ctrl+b\", \"Background blocking session tools\"),\n session_compact: keybind(\"<leader>c\", \"Compact the session\"),\n session_toggle_timestamps: keybind(\"none\", \"Toggle message timestamps\"),\n session_toggle_generic_tool_output: keybind(\"none\", \"Toggle generic tool output\"),\n session_queued_prompts: keybind(\"<leader>q\", \"Manage queued prompts\"),\n session_child_first: keybind(\"down\", \"Toggle subagent picker\"),\n session_child_cycle: keybind(\"right\", \"Go to next child session\"),\n session_child_cycle_reverse: keybind(\"left\", \"Go to previous child session\"),\n session_parent: keybind(\"up\", \"Go to parent session\"),\n session_pin_toggle: keybind(\"ctrl+f\", \"Pin or unpin session in the session list\"),\n session_quick_switch_1: keybind(\"<leader>1\", \"Switch to session in quick slot 1\"),\n session_quick_switch_2: keybind(\"<leader>2\", \"Switch to session in quick slot 2\"),\n session_quick_switch_3: keybind(\"<leader>3\", \"Switch to session in quick slot 3\"),\n session_quick_switch_4: keybind(\"<leader>4\", \"Switch to session in quick slot 4\"),\n session_quick_switch_5: keybind(\"<leader>5\", \"Switch to session in quick slot 5\"),\n session_quick_switch_6: keybind(\"<leader>6\", \"Switch to session in quick slot 6\"),\n session_quick_switch_7: keybind(\"<leader>7\", \"Switch to session in quick slot 7\"),\n session_quick_switch_8: keybind(\"<leader>8\", \"Switch to session in quick slot 8\"),\n session_quick_switch_9: keybind(\"<leader>9\", \"Switch to session in quick slot 9\"),\n\n stash_delete: keybind(\"ctrl+d\", \"Delete stash entry\"),\n model_provider_list: keybind(\"ctrl+a\", \"Open provider list from model dialog\"),\n model_favorite_toggle: keybind(\"ctrl+f\", \"Toggle model favorite status\"),\n model_list: keybind(\"<leader>m\", \"List available models\"),\n model_cycle_recent: keybind(\"f2\", \"Next recently used model\"),\n model_cycle_recent_reverse: keybind(\"shift+f2\", \"Previous recently used model\"),\n model_cycle_favorite: keybind(\"none\", \"Next favorite model\"),\n model_cycle_favorite_reverse: keybind(\"none\", \"Previous favorite model\"),\n mcp_list: keybind(\"none\", \"List MCP servers\"),\n provider_connect: keybind(\"none\", \"Connect integration\"),\n console_org_switch: keybind(\"none\", \"Switch console organization\"),\n agent_list: keybind(\"<leader>a\", \"List agents\"),\n agent_cycle: keybind(\"tab\", \"Next agent\"),\n agent_cycle_reverse: keybind(\"shift+tab\", \"Previous agent\"),\n variant_cycle: keybind(\"ctrl+t\", \"Cycle model variants\"),\n variant_list: keybind(\"none\", \"List model variants\"),\n\n messages_page_up: keybind(\"pageup,ctrl+alt+b\", \"Scroll messages up by one page\"),\n messages_page_down: keybind(\"pagedown,ctrl+alt+f\", \"Scroll messages down by one page\"),\n messages_line_up: keybind(\"ctrl+alt+y\", \"Scroll messages up by one line\"),\n messages_line_down: keybind(\"ctrl+alt+e\", \"Scroll messages down by one line\"),\n messages_half_page_up: keybind(\"ctrl+alt+u\", \"Scroll messages up by half page\"),\n messages_half_page_down: keybind(\"ctrl+alt+d\", \"Scroll messages down by half page\"),\n messages_first: keybind(\"ctrl+g,home\", \"Navigate to first message\"),\n messages_last: keybind(\"ctrl+alt+g,end\", \"Navigate to last message\"),\n messages_next: keybind(\"none\", \"Navigate to next message\"),\n messages_previous: keybind(\"none\", \"Navigate to previous message\"),\n messages_last_user: keybind(\"none\", \"Navigate to last user message\"),\n messages_copy: keybind(\"<leader>y\", \"Copy message\"),\n messages_undo: keybind(\"<leader>u\", \"Undo message\"),\n messages_redo: keybind(\"<leader>r\", \"Redo message\"),\n messages_toggle_conceal: keybind(\"<leader>h\", \"Toggle code block concealment in messages\"),\n tool_details: keybind(\"none\", \"Toggle tool details visibility\"),\n display_thinking: keybind(\"none\", \"Toggle thinking blocks visibility\"),\n\n prompt_submit: keybind(\"none\", \"Submit prompt\"),\n prompt_editor_context_clear: keybind(\"none\", \"Clear editor context\"),\n prompt_skills: keybind(\"none\", \"Open skill selector\"),\n prompt_stash: keybind(\"none\", \"Stash prompt\"),\n prompt_stash_pop: keybind(\"none\", \"Pop stashed prompt\"),\n prompt_stash_list: keybind(\"none\", \"List stashed prompts\"),\n workspace_set: keybind(\"none\", \"Set workspace\"),\n\n input_clear: keybind(\"ctrl+c\", \"Clear input field\"),\n input_paste: keybind({ key: \"ctrl+v\", preventDefault: false }, \"Paste from clipboard\"),\n input_submit: keybind(\"return\", \"Submit input\"),\n input_newline: keybind(\"shift+return,ctrl+return,alt+return,ctrl+j\", \"Insert newline in input\"),\n input_move_left: keybind(\"left,ctrl+b\", \"Move cursor left in input\"),\n input_move_right: keybind(\"right,ctrl+f\", \"Move cursor right in input\"),\n input_move_up: keybind(\"up\", \"Move cursor up in input\"),\n input_move_down: keybind(\"down\", \"Move cursor down in input\"),\n input_select_left: keybind(\"shift+left\", \"Select left in input\"),\n input_select_right: keybind(\"shift+right\", \"Select right in input\"),\n input_select_up: keybind(\"shift+up\", \"Select up in input\"),\n input_select_down: keybind(\"shift+down\", \"Select down in input\"),\n input_line_home: keybind(\"ctrl+a\", \"Move to start of line in input\"),\n input_line_end: keybind(\"ctrl+e\", \"Move to end of line in input\"),\n input_select_line_home: keybind(\"ctrl+shift+a\", \"Select to start of line in input\"),\n input_select_line_end: keybind(\"ctrl+shift+e\", \"Select to end of line in input\"),\n input_visual_line_home: keybind(\"alt+a\", \"Move to start of visual line in input\"),\n input_visual_line_end: keybind(\"alt+e\", \"Move to end of visual line in input\"),\n input_select_visual_line_home: keybind(\"alt+shift+a\", \"Select to start of visual line in input\"),\n input_select_visual_line_end: keybind(\"alt+shift+e\", \"Select to end of visual line in input\"),\n input_buffer_home: keybind(\"home\", \"Move to start of buffer in input\"),\n input_buffer_end: keybind(\"end\", \"Move to end of buffer in input\"),\n input_select_buffer_home: keybind(\"shift+home\", \"Select to start of buffer in input\"),\n input_select_buffer_end: keybind(\"shift+end\", \"Select to end of buffer in input\"),\n input_delete_line: keybind(\"ctrl+shift+d\", \"Delete line in input\"),\n input_delete_to_line_end: keybind(\"ctrl+k\", \"Delete to end of line in input\"),\n input_delete_to_line_start: keybind(\"ctrl+u\", \"Delete to start of line in input\"),\n input_backspace: keybind(\"backspace,shift+backspace\", \"Backspace in input\"),\n input_delete: keybind(\"ctrl+d,delete,shift+delete\", \"Delete character in input\"),\n input_undo: keybind(\"ctrl+-,super+z\", \"Undo in input\"),\n input_redo: keybind(\"ctrl+.,super+shift+z\", \"Redo in input\"),\n input_word_forward: keybind(\"alt+f,alt+right,ctrl+right\", \"Move word forward in input\"),\n input_word_backward: keybind(\"alt+b,alt+left,ctrl+left\", \"Move word backward in input\"),\n input_select_word_forward: keybind(\"alt+shift+f,alt+shift+right\", \"Select word forward in input\"),\n input_select_word_backward: keybind(\"alt+shift+b,alt+shift+left\", \"Select word backward in input\"),\n input_delete_word_forward: keybind(\"alt+d,alt+delete,ctrl+delete\", \"Delete word forward in input\"),\n input_delete_word_backward: keybind(\"ctrl+w,ctrl+backspace,alt+backspace\", \"Delete word backward in input\"),\n input_select_all: keybind(\"super+a\", \"Select all in input\"),\n history_previous: keybind(\"up\", \"Previous history item\"),\n history_next: keybind(\"down\", \"Next history item\"),\n\n \"dialog.select.prev\": keybind(\"up,ctrl+p\", \"Move to previous dialog item\"),\n \"dialog.select.next\": keybind(\"down,ctrl+n\", \"Move to next dialog item\"),\n \"dialog.select.page_up\": keybind(\"pageup\", \"Move up one page in dialog\"),\n \"dialog.select.page_down\": keybind(\"pagedown\", \"Move down one page in dialog\"),\n \"dialog.select.home\": keybind(\"home\", \"Move to first dialog item\"),\n \"dialog.select.end\": keybind(\"end\", \"Move to last dialog item\"),\n \"dialog.select.submit\": keybind(\"return\", \"Submit selected dialog item\"),\n \"dialog.prompt.submit\": keybind(\"return\", \"Submit dialog prompt\"),\n \"dialog.project_copy.generate\": keybind(\"tab\", \"Generate project copy name\"),\n \"dialog.mcp.toggle\": keybind(\"space\", \"Toggle MCP in MCP dialog\"),\n \"dialog.move_session.new\": keybind(\"ctrl+m\", \"New project copy\"),\n \"dialog.move_session.delete\": keybind(\"ctrl+d\", \"Delete project copy\"),\n \"dialog.move_session.refresh\": keybind(\"ctrl+r\", \"Refresh project copies\"),\n \"prompt.autocomplete.prev\": keybind(\"up,ctrl+p\", \"Move to previous autocomplete item\"),\n \"prompt.autocomplete.next\": keybind(\"down,ctrl+n\", \"Move to next autocomplete item\"),\n \"prompt.autocomplete.hide\": keybind(\"escape\", \"Hide autocomplete\"),\n \"prompt.autocomplete.select\": keybind(\"return\", \"Select autocomplete item\"),\n \"prompt.autocomplete.complete\": keybind(\"tab\", \"Complete autocomplete item\"),\n \"permission.prompt.fullscreen\": keybind(\"ctrl+f\", \"Toggle permission prompt fullscreen\"),\n \"plugins.toggle\": keybind(\"space\", \"Toggle plugin\"),\n \"dialog.plugins.install\": keybind(\"shift+i\", \"Install plugin from plugin dialog\"),\n\n terminal_suspend: keybind(\"ctrl+z\", \"Suspend terminal\"),\n terminal_title_toggle: keybind(\"none\", \"Toggle terminal title\"),\n tips_toggle: keybind(\"<leader>h\", \"Toggle tips on home screen\"),\n plugin_manager: keybind(\"none\", \"Open plugin manager dialog\"),\n plugin_install: keybind(\"none\", \"Install plugin\"),\n\n which_key_toggle: keybind(\"ctrl+alt+k\", \"Toggle which-key panel\"),\n which_key_layout_toggle: keybind(\"ctrl+alt+shift+k\", \"Switch which-key layout\"),\n which_key_pending_toggle: keybind(\"ctrl+alt+shift+p\", \"Toggle which-key pending preview\"),\n which_key_group_previous: keybind(\"ctrl+alt+left,ctrl+alt+[\", \"Previous which-key group\"),\n which_key_group_next: keybind(\"ctrl+alt+right,ctrl+alt+]\", \"Next which-key group\"),\n which_key_scroll_up: keybind(\"ctrl+alt+up,ctrl+alt+p\", \"Scroll which-key up\"),\n which_key_scroll_down: keybind(\"ctrl+alt+down,ctrl+alt+n\", \"Scroll which-key down\"),\n which_key_page_up: keybind(\"ctrl+alt+pageup\", \"Page which-key up\"),\n which_key_page_down: keybind(\"ctrl+alt+pagedown\", \"Page which-key down\"),\n which_key_home: keybind(\"ctrl+alt+home\", \"Jump to first which-key binding\"),\n which_key_end: keybind(\"ctrl+alt+end\", \"Jump to last which-key binding\"),\n} satisfies Record<string, Definition>\n\ntype KeybindName = keyof typeof Definitions\nconst KeybindNames = new Set<string>(Object.keys(Definitions))\n\nexport const KeybindOverrides = Schema.Struct(\n Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [\n name,\n Schema.optional(BindingValueSchema).annotate({ description: item.description }),\n ]),\n ),\n).annotate({ description: \"TUI keybinding overrides\" })\nexport const Descriptions = Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [name, item.description]),\n) as Record<KeybindName, string>\nexport const CommandMap = {\n app_exit: \"app.exit\",\n app_debug: \"app.debug\",\n app_console: \"app.console\",\n app_heap_snapshot: \"app.heap_snapshot\",\n app_toggle_animations: \"app.toggle.animations\",\n app_toggle_file_context: \"app.toggle.file_context\",\n app_toggle_diffwrap: \"app.toggle.diffwrap\",\n app_toggle_paste_summary: \"app.toggle.paste_summary\",\n app_toggle_session_directory_filter: \"app.toggle.session_directory_filter\",\n command_list: \"command.palette.show\",\n help_show: \"help.show\",\n docs_open: \"docs.open\",\n diff_open: \"diff.open\",\n diff_close: \"diff.close\",\n diff_toggle: \"diff.toggle\",\n diff_expand: \"diff.expand\",\n diff_expand_all: \"diff.expand_all\",\n diff_collapse: \"diff.collapse\",\n diff_switch_focus: \"diff.switch_focus\",\n diff_next_hunk: \"diff.next_hunk\",\n diff_previous_hunk: \"diff.previous_hunk\",\n diff_next_file: \"diff.next_file\",\n diff_previous_file: \"diff.previous_file\",\n diff_toggle_file_tree: \"diff.toggle_file_tree\",\n diff_single_patch: \"diff.single_patch\",\n diff_switch_source: \"diff.switch_source\",\n diff_toggle_view: \"diff.toggle_view\",\n diff_help: \"diff.help\",\n editor_open: \"prompt.editor\",\n theme_list: \"theme.switch\",\n theme_switch_mode: \"theme.switch_mode\",\n theme_mode_lock: \"theme.mode.lock\",\n sidebar_toggle: \"session.sidebar.toggle\",\n scrollbar_toggle: \"session.toggle.scrollbar\",\n status_view: \"opencode.status\",\n debug_view: \"opencode.debug\",\n session_export: \"session.export\",\n session_copy: \"session.copy\",\n session_move: \"session.move\",\n session_new: \"session.new\",\n session_list: \"session.list\",\n session_timeline: \"session.timeline\",\n session_fork: \"session.fork\",\n session_rename: \"session.rename\",\n session_delete: \"session.delete\",\n session_share: \"session.share\",\n session_unshare: \"session.unshare\",\n session_interrupt: \"session.interrupt\",\n session_background: \"session.background\",\n session_compact: \"session.compact\",\n session_toggle_timestamps: \"session.toggle.timestamps\",\n session_toggle_generic_tool_output: \"session.toggle.generic_tool_output\",\n session_queued_prompts: \"session.queued_prompts\",\n session_child_first: \"session.child.first\",\n session_child_cycle: \"session.child.next\",\n session_child_cycle_reverse: \"session.child.previous\",\n session_parent: \"session.parent\",\n session_pin_toggle: \"session.pin.toggle\",\n session_quick_switch_1: \"session.quick_switch.1\",\n session_quick_switch_2: \"session.quick_switch.2\",\n session_quick_switch_3: \"session.quick_switch.3\",\n session_quick_switch_4: \"session.quick_switch.4\",\n session_quick_switch_5: \"session.quick_switch.5\",\n session_quick_switch_6: \"session.quick_switch.6\",\n session_quick_switch_7: \"session.quick_switch.7\",\n session_quick_switch_8: \"session.quick_switch.8\",\n session_quick_switch_9: \"session.quick_switch.9\",\n stash_delete: \"stash.delete\",\n model_provider_list: \"model.dialog.provider\",\n model_favorite_toggle: \"model.dialog.favorite\",\n model_list: \"model.list\",\n model_cycle_recent: \"model.cycle_recent\",\n model_cycle_recent_reverse: \"model.cycle_recent_reverse\",\n model_cycle_favorite: \"model.cycle_favorite\",\n model_cycle_favorite_reverse: \"model.cycle_favorite_reverse\",\n mcp_list: \"mcp.list\",\n provider_connect: \"provider.connect\",\n console_org_switch: \"console.org.switch\",\n agent_list: \"agent.list\",\n agent_cycle: \"agent.cycle\",\n agent_cycle_reverse: \"agent.cycle.reverse\",\n variant_cycle: \"variant.cycle\",\n variant_list: \"variant.list\",\n messages_page_up: \"session.page.up\",\n messages_page_down: \"session.page.down\",\n messages_line_up: \"session.line.up\",\n messages_line_down: \"session.line.down\",\n messages_half_page_up: \"session.half.page.up\",\n messages_half_page_down: \"session.half.page.down\",\n messages_first: \"session.first\",\n messages_last: \"session.last\",\n messages_next: \"session.message.next\",\n messages_previous: \"session.message.previous\",\n messages_last_user: \"session.messages_last_user\",\n messages_copy: \"messages.copy\",\n messages_undo: \"session.undo\",\n messages_redo: \"session.redo\",\n messages_toggle_conceal: \"session.toggle.conceal\",\n tool_details: \"session.toggle.actions\",\n display_thinking: \"session.toggle.thinking\",\n prompt_submit: \"prompt.submit\",\n prompt_editor_context_clear: \"prompt.editor_context.clear\",\n prompt_skills: \"prompt.skills\",\n prompt_stash: \"prompt.stash\",\n prompt_stash_pop: \"prompt.stash.pop\",\n prompt_stash_list: \"prompt.stash.list\",\n workspace_set: \"workspace.set\",\n input_clear: \"prompt.clear\",\n input_paste: \"prompt.paste\",\n input_submit: \"input.submit\",\n input_newline: \"input.newline\",\n input_move_left: \"input.move.left\",\n input_move_right: \"input.move.right\",\n input_move_up: \"input.move.up\",\n input_move_down: \"input.move.down\",\n input_select_left: \"input.select.left\",\n input_select_right: \"input.select.right\",\n input_select_up: \"input.select.up\",\n input_select_down: \"input.select.down\",\n input_line_home: \"input.line.home\",\n input_line_end: \"input.line.end\",\n input_select_line_home: \"input.select.line.home\",\n input_select_line_end: \"input.select.line.end\",\n input_visual_line_home: \"input.visual.line.home\",\n input_visual_line_end: \"input.visual.line.end\",\n input_select_visual_line_home: \"input.select.visual.line.home\",\n input_select_visual_line_end: \"input.select.visual.line.end\",\n input_buffer_home: \"input.buffer.home\",\n input_buffer_end: \"input.buffer.end\",\n input_select_buffer_home: \"input.select.buffer.home\",\n input_select_buffer_end: \"input.select.buffer.end\",\n input_delete_line: \"input.delete.line\",\n input_delete_to_line_end: \"input.delete.to.line.end\",\n input_delete_to_line_start: \"input.delete.to.line.start\",\n input_backspace: \"input.backspace\",\n input_delete: \"input.delete\",\n input_undo: \"input.undo\",\n input_redo: \"input.redo\",\n input_word_forward: \"input.word.forward\",\n input_word_backward: \"input.word.backward\",\n input_select_word_forward: \"input.select.word.forward\",\n input_select_word_backward: \"input.select.word.backward\",\n input_delete_word_forward: \"input.delete.word.forward\",\n input_delete_word_backward: \"input.delete.word.backward\",\n input_select_all: \"input.select.all\",\n history_previous: \"prompt.history.previous\",\n history_next: \"prompt.history.next\",\n terminal_suspend: \"terminal.suspend\",\n terminal_title_toggle: \"terminal.title.toggle\",\n tips_toggle: \"tips.toggle\",\n plugin_manager: \"plugins.list\",\n plugin_install: \"plugins.install\",\n which_key_toggle: \"which-key.toggle\",\n which_key_layout_toggle: \"which-key.layout.toggle\",\n which_key_pending_toggle: \"which-key.pending.toggle\",\n which_key_group_previous: \"which-key.group.previous\",\n which_key_group_next: \"which-key.group.next\",\n which_key_scroll_up: \"which-key.scroll.up\",\n which_key_scroll_down: \"which-key.scroll.down\",\n which_key_page_up: \"which-key.page.up\",\n which_key_page_down: \"which-key.page.down\",\n which_key_home: \"which-key.home\",\n which_key_end: \"which-key.end\",\n} satisfies BindingCommandMap\nconst CommandDescriptions = Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [\n CommandMap[name as keyof typeof CommandMap] ?? name,\n item.description,\n ]),\n) as Record<string, string>\n\nexport type Keybinds = { [K in KeybindName]: BindingValueSchema }\nexport type KeybindOverrides = Partial<Keybinds>\nexport type BindingLookupView = {\n readonly bindings: readonly Binding<Renderable, KeyEvent>[]\n get(command: string): readonly Binding<Renderable, KeyEvent>[]\n has(command: string): boolean\n gather(name: string, commands: readonly string[]): readonly Binding<Renderable, KeyEvent>[]\n pick(name: string, commands: readonly string[]): Binding<Renderable, KeyEvent>[]\n omit(name: string, commands: readonly string[]): Binding<Renderable, KeyEvent>[]\n}\n\nexport function toBindingConfig(keybinds: Keybinds): BindingConfig<Renderable, KeyEvent> {\n return Object.fromEntries(Object.entries(keybinds)) as BindingConfig<Renderable, KeyEvent>\n}\n\nconst decodeBindingValue = Schema.decodeUnknownSync(BindingValueSchema)\n\nexport function defaultValue(name: KeybindName) {\n return Definitions[name].default\n}\n\nexport function parse(keybinds: KeybindOverrides): Keybinds {\n const invalid = unknownKeys(keybinds)\n if (invalid.length) throw new Error(`Unrecognized keybind${invalid.length === 1 ? \"\" : \"s\"}: ${invalid.join(\", \")}`)\n return Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [\n name,\n decodeBindingValue(keybinds[name as KeybindName] ?? item.default),\n ]),\n ) as Keybinds\n}\n\nexport const Keybinds = { parse }\n\nexport function unknownKeys(input: object) {\n return Object.keys(input).filter((key) => !KeybindNames.has(key))\n}\n\nexport function bindingDefaults(): BindingDefaults<Renderable, KeyEvent> {\n return ({ command, binding }) => {\n if (binding.desc !== undefined) return\n return { desc: CommandDescriptions[command] }\n }\n}\n",
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nexport * as TuiConfig from \".\";\nimport { createBindingLookup } from \"@opentui/keymap/extras\";\nimport { Schema } from \"effect\";\nimport { createContext, useContext } from \"solid-js\";\nimport { TuiKeybind } from \"./keybind\";\nexport const AttentionSoundName = Schema.Literals([\"default\", \"question\", \"permission\", \"error\", \"done\", \"subagent_done\"]);\nexport const PluginOptions = Schema.Record(Schema.String, Schema.Unknown);\nexport const PluginSpec = Schema.Union([Schema.String, Schema.mutable(Schema.Tuple([Schema.String, PluginOptions]))]);\nexport const LeaderTimeoutDefault = 2000;\nexport const LeaderTimeout = Schema.Int.check(Schema.isGreaterThan(0)).annotate({\n description: \"Leader key timeout in milliseconds\"\n});\nexport const ScrollSpeed = Schema.Number.check(Schema.isGreaterThanOrEqualTo(0.001));\nexport const ScrollAcceleration = Schema.Struct({\n enabled: Schema.Boolean.annotate({\n description: \"Enable scroll acceleration\"\n })\n}).annotate({\n description: \"Scroll acceleration settings\"\n});\nexport const DiffStyle = Schema.Literals([\"auto\", \"stacked\"]).annotate({\n description: \"Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column\"\n});\nexport const AttentionSounds = Schema.Record(AttentionSoundName, Schema.optionalKey(Schema.String));\nexport const Attention = Schema.Struct({\n enabled: Schema.optional(Schema.Boolean),\n notifications: Schema.optional(Schema.Boolean),\n sound: Schema.optional(Schema.Boolean),\n volume: Schema.optional(Schema.Number.check(Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(1))),\n sound_pack: Schema.optional(Schema.String),\n sounds: Schema.optional(AttentionSounds)\n}).annotate({\n description: \"Attention notification and sound settings\"\n});\nconst PromptSize = Schema.Int.check(Schema.isGreaterThan(0));\nexport const Prompt = Schema.Struct({\n max_height: Schema.optional(PromptSize).annotate({\n description: \"Prompt textarea max height\"\n }),\n max_width: Schema.optional(Schema.Union([PromptSize, Schema.Literal(\"auto\")])).annotate({\n description: \"Home prompt max width: a positive integer for a fixed cap, or 'auto' to scale with terminal width\"\n })\n}).annotate({\n description: \"Prompt size settings\"\n});\nexport const Info = Schema.Struct({\n $schema: Schema.optional(Schema.String),\n theme: Schema.optional(Schema.String),\n keybinds: Schema.optional(TuiKeybind.KeybindOverrides),\n plugin: Schema.optional(Schema.Array(PluginSpec)),\n plugin_enabled: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)),\n leader_timeout: Schema.optional(LeaderTimeout),\n attention: Schema.optional(Attention),\n prompt: Schema.optional(Prompt),\n scroll_speed: Schema.optional(ScrollSpeed).annotate({\n description: \"TUI scroll speed\"\n }),\n scroll_acceleration: Schema.optional(ScrollAcceleration),\n diff_style: Schema.optional(DiffStyle),\n mouse: Schema.optional(Schema.Boolean).annotate({\n description: \"Enable or disable mouse capture (default: true)\"\n })\n});\nexport const ResolveOptions = Schema.Struct({\n terminalSuspend: Schema.Boolean\n});\nexport function resolve(input, options) {\n const keybinds = {\n ...input.keybinds\n };\n if (!options.terminalSuspend) {\n keybinds.terminal_suspend = \"none\";\n if (keybinds.input_undo === undefined) {\n const inputUndo = TuiKeybind.defaultValue(\"input_undo\");\n keybinds.input_undo = [\"ctrl+z\", ...(typeof inputUndo === \"string\" ? inputUndo.split(\",\") : [])].filter((value, index, values) => values.indexOf(value) === index).join(\",\");\n }\n }\n return {\n ...input,\n attention: {\n enabled: input.attention?.enabled ?? false,\n notifications: input.attention?.notifications ?? true,\n sound: input.attention?.sound ?? true,\n volume: input.attention?.volume ?? 0.4,\n sound_pack: input.attention?.sound_pack ?? \"opencode.default\",\n sounds: input.attention?.sounds ?? {}\n },\n keybinds: createBindingLookup(TuiKeybind.toBindingConfig(TuiKeybind.parse(keybinds)), {\n commandMap: TuiKeybind.CommandMap,\n bindingDefaults: TuiKeybind.bindingDefaults()\n }),\n leader_timeout: input.leader_timeout ?? LeaderTimeoutDefault,\n mouse: input.mouse ?? true\n };\n}\nconst ConfigContext = createContext();\nexport function TuiConfigProvider(props) {\n return _$createComponent(ConfigContext.Provider, {\n get value() {\n return props.config;\n },\n get children() {\n return props.children;\n }\n });\n}\nexport function useTuiConfig() {\n const value = useContext(ConfigContext);\n if (!value) throw new Error(\"TuiConfigProvider is missing\");\n return value;\n}"
],
"mappings": "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",
"debugId": "A90A1ACAA2D7C66F64756E2164756E21",
"names": []
}

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

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

{
"version": 3,
"sources": ["src/commands/handlers/run.ts"],
"sourcesContent": [
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Server } from \"../../services/server\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../mini\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* Server.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo,\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OACxE,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,OACxC,OAAS,WAAO,EAAO,QAAQ,CACnC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH",
"debugId": "2EB2F70852B63EDE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mini.ts"],
"sourcesContent": [
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Server } from \"../../services/server\"\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* Server.resolve({ server: serverURL, standalone: input.standalone })\n yield* Effect.promise(() =>\n runMini({\n server,\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,MAAC,OACxD,SAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAO,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EACxF,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,SACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,IACd,CAAC,CACH,EACD,CACH",
"debugId": "7640E4873DCD374264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Effect, FileSystem, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\n\n// The CLI's service configuration file, plus the Service.Options 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))\n\nfunction configKey(key: string): Key {\n if (keys.includes(key as Key)) return key as Key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst env = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const filename = InstallationChannel === \"local\" ? \"service-local.json\" : \"service.json\"\n return {\n fs,\n file: path.join(global.state, filename),\n configFile: path.join(global.config, filename),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file } = yield* env\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? undefined : process.argv[1]\n if (!compiled && entrypoint === undefined) return yield* Effect.fail(new Error(\"Failed to resolve CLI entrypoint\"))\n return {\n file,\n version: InstallationVersion,\n command: [process.execPath, ...(entrypoint ? [entrypoint] : []), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* env\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* env\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})\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": "8DCAFE043F2B595A64756E2164756E21",
"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\"\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.start(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n"
],
"mappings": ";guBAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,EAAQ,MAAM,MAAO,EAAc,QAAQ,CAAC,EAC9D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH",
"debugId": "68986A53DFA8367A64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data?.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";krBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC3F,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC7G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,MAAM,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EAC/D,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "FB6EAC469FFF99D764756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/migrate.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n"
],
"mappings": ";6ZAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,uBAAuB,CAAC",
"debugId": "D055A053D94E579864756E2164756E21",
"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 createOpencodeClient,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpencodeClient,\n} from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ 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.v2.integration.connect.oauth({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data?.data\n if (!attempt) return yield* Effect.fail(new Error(started.error?.message ?? \"Failed to start OAuth attempt\"))\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, 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 attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const response = yield* Effect.promise(() => client.v2.integration.attempt.status({ attemptID, location }))\n const status = response.data?.data\n if (!status || status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, attemptID)\n }\n return status\n })\n"
],
"mappings": ";guBAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,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,EAEzG,IAAM,EAAU,MAAO,EAAO,QAAQ,IACpC,EAAO,GAAG,YAAY,QAAQ,MAAM,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAClH,EACM,EAAU,EAAQ,MAAM,KAC9B,GAAI,CAAC,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,EAAQ,OAAO,SAAW,+BAA+B,CAAC,EAC5G,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,EAAQ,SAAS,EACpD,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,IAEA,EAAO,IAAI,SAAU,EAAG,CAEtB,IAAM,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,YAAY,QAAQ,OAAO,CAAE,YAAW,UAAS,CAAC,CAAC,GAClF,MAAM,KAC9B,GAAI,CAAC,GAAU,EAAO,SAAW,UAE/B,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,CAAS,EAEtC,OAAO,EACR",
"debugId": "25A3631140B01A3764756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/stop.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/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.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n"
],
"mappings": ";moBAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "86FADC54793CFCFE64756E2164756E21",
"names": []
}

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

{
"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": ";snBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,MAAO,EAAc,MAAM,EAAM,GAAG,EACrC,CACH",
"debugId": "BA8B3133EBAA814D64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"],
"sourcesContent": [
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}",
"import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.start(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.connect.oauth(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.attempt.cancel(\n { 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, 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 attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.attempt.status({ 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": "6451758B36CD093864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/standalone.ts", "src/services/server.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport path from \"node:path\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? [] : process.argv[1] ? [process.argv[1]] : []\n if (!compiled && entrypoint.length === 0) throw new Error(\"Failed to resolve CLI entrypoint\")\n const [executable, ...args] = options.command ?? [process.execPath, ...entrypoint, \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const output = yield* proc.stdout.pipe(Stream.decodeText(), Stream.splitLines, Stream.take(1), Stream.mkString)\n if (!output) return yield* Effect.fail(new Error(\"Standalone server exited before reporting readiness\"))\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Service.Endpoint & { readonly pid: number }\n },\n Effect.provide(AppNodeBuilder.build(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n",
"import { NodeFileSystem } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: Service.StartOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Service.Endpoint\n readonly reconnect?: (attempt: number) => Promise<Service.Endpoint>\n readonly reload?: () => Promise<void>\n}\n\nexport const resolve = Effect.fn(\"cli.server.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\n ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) }\n : undefined,\n } satisfies Service.Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n const endpoint = yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\")\n const reconnectOptions = { ...options, version: undefined }\n return {\n endpoint,\n reconnect: (attempt) =>\n Effect.runPromise(\n Effect.gen(function* () {\n if (attempt > 3) return yield* Service.start(reconnectOptions)\n const endpoint = yield* Service.discover(reconnectOptions)\n if (endpoint !== undefined) return endpoint\n return yield* Effect.fail(new Error(\"Background server is unavailable\"))\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n reload: () =>\n Effect.runPromise(\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.start(options)\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n } satisfies Resolved\n})\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: Service.StartOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.start(options)\n if (mismatch === \"ignore\") return yield* Service.start({ ...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) return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.start(options)\n})\n\nfunction connectError(endpoint: Service.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 Server from \"./server\"\n"
],
"mappings": "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",
"debugId": "BE36345256595EE564756E2164756E21",
"names": []
}
+1
-1
{
"name": "@opencode-ai/cli-linux-x64-musl",
"version": "0.0.0-next-15319",
"version": "0.0.0-next-15324",
"license": "MIT",

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

{
"version": 3,
"sources": ["../tui/src/component/spinner.tsx", "../tui/src/ui/spinner.ts"],
"sourcesContent": [
"import { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\nimport { Show } from \"solid-js\";\nimport { useTheme } from \"../context/theme\";\nimport { useKV } from \"../context/kv\";\nimport { registerOpencodeSpinner } from \"./register-spinner\";\nregisterOpencodeSpinner();\nexport const SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nexport function Spinner(props) {\n const {\n theme\n } = useTheme();\n const kv = useKV();\n const color = () => props.color ?? theme.textMuted;\n return _$createComponent(Show, {\n get when() {\n return kv.get(\"animations_enabled\", true);\n },\n get fallback() {\n return (() => {\n var _el$4 = _$createElement(\"text\"),\n _el$5 = _$createTextNode(`⋯ `);\n _$insertNode(_el$4, _el$5);\n _$insert(_el$4, () => props.children, null);\n _$effect(_$p => _$setProp(_el$4, \"fg\", color(), _$p));\n return _el$4;\n })();\n },\n get children() {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"spinner\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"flexDirection\", \"row\");\n _$setProp(_el$, \"gap\", 1);\n _$setProp(_el$2, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$2, \"interval\", 80);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return props.children;\n },\n get children() {\n var _el$3 = _$createElement(\"text\");\n _$insert(_el$3, () => props.children);\n _$effect(_$p => _$setProp(_el$3, \"fg\", color(), _$p));\n return _el$3;\n }\n }), null);\n _$effect(_$p => _$setProp(_el$2, \"color\", color(), _$p));\n return _el$;\n }\n });\n}",
"import type { ColorInput } from \"@opentui/core\"\nimport { RGBA } from \"@opentui/core\"\nimport type { ColorGenerator } from \"opentui-spinner\"\n\ninterface AdvancedGradientOptions {\n colors: ColorInput[]\n trailLength: number\n defaultColor?: ColorInput\n direction?: \"forward\" | \"backward\" | \"bidirectional\"\n holdFrames?: { start?: number; end?: number }\n enableFading?: boolean\n minAlpha?: number\n}\n\ninterface ScannerState {\n activePosition: number\n isHolding: boolean\n holdProgress: number\n holdTotal: number\n movementProgress: number\n movementTotal: number\n isMovingForward: boolean\n}\n\nfunction getScannerState(\n frameIndex: number,\n totalChars: number,\n options: Pick<AdvancedGradientOptions, \"direction\" | \"holdFrames\">,\n): ScannerState {\n const { direction = \"forward\", holdFrames = {} } = options\n\n if (direction === \"bidirectional\") {\n const forwardFrames = totalChars\n const holdEndFrames = holdFrames.end ?? 0\n const backwardFrames = totalChars - 1\n\n if (frameIndex < forwardFrames) {\n // Moving forward\n return {\n activePosition: frameIndex,\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: frameIndex,\n movementTotal: forwardFrames,\n isMovingForward: true,\n }\n } else if (frameIndex < forwardFrames + holdEndFrames) {\n // Holding at end\n return {\n activePosition: totalChars - 1,\n isHolding: true,\n holdProgress: frameIndex - forwardFrames,\n holdTotal: holdEndFrames,\n movementProgress: 0,\n movementTotal: 0,\n isMovingForward: true,\n }\n } else if (frameIndex < forwardFrames + holdEndFrames + backwardFrames) {\n // Moving backward\n const backwardIndex = frameIndex - forwardFrames - holdEndFrames\n return {\n activePosition: totalChars - 2 - backwardIndex,\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: backwardIndex,\n movementTotal: backwardFrames,\n isMovingForward: false,\n }\n } else {\n // Holding at start\n return {\n activePosition: 0,\n isHolding: true,\n holdProgress: frameIndex - forwardFrames - holdEndFrames - backwardFrames,\n holdTotal: holdFrames.start ?? 0,\n movementProgress: 0,\n movementTotal: 0,\n isMovingForward: false,\n }\n }\n } else if (direction === \"backward\") {\n return {\n activePosition: totalChars - 1 - (frameIndex % totalChars),\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: frameIndex % totalChars,\n movementTotal: totalChars,\n isMovingForward: false,\n }\n } else {\n return {\n activePosition: frameIndex % totalChars,\n isHolding: false,\n holdProgress: 0,\n holdTotal: 0,\n movementProgress: frameIndex % totalChars,\n movementTotal: totalChars,\n isMovingForward: true,\n }\n }\n}\n\nfunction calculateColorIndex(\n frameIndex: number,\n charIndex: number,\n totalChars: number,\n options: Pick<AdvancedGradientOptions, \"direction\" | \"holdFrames\" | \"trailLength\">,\n state?: ScannerState,\n): number {\n const { trailLength } = options\n const { activePosition, isHolding, holdProgress, isMovingForward } =\n state ?? getScannerState(frameIndex, totalChars, options)\n\n // Calculate directional distance (positive means trailing behind)\n const directionalDistance = isMovingForward\n ? activePosition - charIndex // For forward: trail is to the left (lower indices)\n : charIndex - activePosition // For backward: trail is to the right (higher indices)\n\n // Handle hold frame fading: keep the lead bright, fade the trail\n if (isHolding) {\n // Shift the color index by how long we've been holding\n return directionalDistance + holdProgress\n }\n\n // Normal movement - show gradient trail only behind the movement direction\n if (directionalDistance > 0 && directionalDistance < trailLength) {\n return directionalDistance\n }\n\n // At the active position, show the brightest color\n if (directionalDistance === 0) {\n return 0\n }\n\n return -1\n}\n\nfunction createKnightRiderTrail(options: AdvancedGradientOptions): ColorGenerator {\n const { colors, defaultColor, enableFading = true, minAlpha = 0 } = options\n\n // Use the provided defaultColor if it's an RGBA instance, otherwise convert/default\n // We use RGBA.fromHex for the fallback to ensure we have an RGBA object.\n // Note: If defaultColor is a string, we convert it once here.\n const defaultRgba = defaultColor instanceof RGBA ? defaultColor : RGBA.fromHex((defaultColor as string) || \"#000000\")\n\n // Store the base alpha from the inactive factor\n const baseInactiveAlpha = defaultRgba.a\n\n let cachedFrameIndex = -1\n let cachedState: ScannerState | null = null\n\n return (frameIndex: number, charIndex: number, _totalFrames: number, totalChars: number) => {\n if (frameIndex !== cachedFrameIndex) {\n cachedFrameIndex = frameIndex\n cachedState = getScannerState(frameIndex, totalChars, options)\n }\n\n const state = cachedState!\n\n const index = calculateColorIndex(frameIndex, charIndex, totalChars, options, state)\n\n // Calculate global fade for inactive dots during hold or movement\n const { isHolding, holdProgress, holdTotal, movementProgress, movementTotal } = state\n\n let fadeFactor = 1.0\n if (enableFading) {\n if (isHolding && holdTotal > 0) {\n // Fade out linearly to minAlpha\n const progress = Math.min(holdProgress / holdTotal, 1)\n fadeFactor = Math.max(minAlpha, 1 - progress * (1 - minAlpha))\n } else if (!isHolding && movementTotal > 0) {\n // Fade in linearly from minAlpha during movement\n const progress = Math.min(movementProgress / Math.max(1, movementTotal - 1), 1)\n fadeFactor = minAlpha + progress * (1 - minAlpha)\n }\n }\n\n // Combine base inactive alpha with the fade factor\n // This ensures inactiveFactor is respected while still allowing fading animation\n defaultRgba.a = baseInactiveAlpha * fadeFactor\n\n if (index === -1) {\n return defaultRgba\n }\n\n return colors[index] ?? defaultRgba\n }\n}\n\n/**\n * Derives a gradient of tail colors from a single bright color using alpha falloff\n * @param brightColor The brightest color (center/head of the scanner)\n * @param steps Number of gradient steps (default: 6)\n * @returns Array of RGBA colors with alpha-based trail fade (background-independent)\n */\nexport function deriveTrailColors(brightColor: ColorInput, steps: number = 6): RGBA[] {\n const baseRgba = brightColor instanceof RGBA ? brightColor : RGBA.fromHex(brightColor as string)\n\n const colors: RGBA[] = []\n\n for (let i = 0; i < steps; i++) {\n // Alpha-based falloff with optional bloom effect\n let alpha: number\n let brightnessFactor: number\n\n if (i === 0) {\n // Lead position: full brightness and opacity\n alpha = 1.0\n brightnessFactor = 1.0\n } else if (i === 1) {\n // Slight bloom/glare effect: brighten color but reduce opacity slightly\n alpha = 0.9\n brightnessFactor = 1.15\n } else {\n // Exponential alpha decay for natural-looking trail fade\n alpha = Math.pow(0.65, i - 1)\n brightnessFactor = 1.0\n }\n\n const r = Math.min(1.0, baseRgba.r * brightnessFactor)\n const g = Math.min(1.0, baseRgba.g * brightnessFactor)\n const b = Math.min(1.0, baseRgba.b * brightnessFactor)\n\n colors.push(RGBA.fromValues(r, g, b, alpha))\n }\n\n return colors\n}\n\n/**\n * Derives the inactive/default color from a bright color using alpha\n * @param brightColor The brightest color (center/head of the scanner)\n * @param factor Alpha factor for inactive color (default: 0.2, range: 0-1)\n * @returns The same color with reduced alpha for background-independent dimming\n */\nexport function deriveInactiveColor(brightColor: ColorInput, factor: number = 0.2): RGBA {\n const baseRgba = brightColor instanceof RGBA ? brightColor : RGBA.fromHex(brightColor as string)\n\n // Use the full color brightness but adjust alpha for background-independent dimming\n return RGBA.fromValues(baseRgba.r, baseRgba.g, baseRgba.b, factor)\n}\n\nexport type KnightRiderStyle = \"blocks\" | \"diamonds\"\n\nexport interface KnightRiderOptions {\n width?: number\n style?: KnightRiderStyle\n holdStart?: number\n holdEnd?: number\n colors?: ColorInput[]\n /** Single color to derive trail from (alternative to providing colors array) */\n color?: ColorInput\n /** Number of trail steps when using single color (default: 6) */\n trailSteps?: number\n defaultColor?: ColorInput\n /** Alpha factor for inactive color when using single color (default: 0.2, range: 0-1) */\n inactiveFactor?: number\n /** Enable fading of inactive dots during hold and movement (default: true) */\n enableFading?: boolean\n /** Minimum alpha value when fading (default: 0, range: 0-1) */\n minAlpha?: number\n}\n\n/**\n * Creates frame strings for a Knight Rider style scanner animation\n * @param options Configuration options for the Knight Rider effect\n * @returns Array of frame strings\n */\nexport function createFrames(options: KnightRiderOptions = {}): string[] {\n const width = options.width ?? 8\n const style = options.style ?? \"diamonds\"\n const holdStart = options.holdStart ?? 30\n const holdEnd = options.holdEnd ?? 9\n\n const colors =\n options.colors ??\n (options.color\n ? deriveTrailColors(options.color, options.trailSteps)\n : [\n RGBA.fromHex(\"#ff0000\"), // Brightest Red (Center)\n RGBA.fromHex(\"#ff5555\"), // Glare/Bloom\n RGBA.fromHex(\"#dd0000\"), // Trail 1\n RGBA.fromHex(\"#aa0000\"), // Trail 2\n RGBA.fromHex(\"#770000\"), // Trail 3\n RGBA.fromHex(\"#440000\"), // Trail 4\n ])\n\n const defaultColor =\n options.defaultColor ??\n (options.color ? deriveInactiveColor(options.color, options.inactiveFactor) : RGBA.fromHex(\"#330000\"))\n\n const trailOptions = {\n colors,\n trailLength: colors.length,\n defaultColor,\n direction: \"bidirectional\" as const,\n holdFrames: { start: holdStart, end: holdEnd },\n enableFading: options.enableFading,\n minAlpha: options.minAlpha,\n }\n\n // Bidirectional cycle: Forward (width) + Hold End + Backward (width-1) + Hold Start\n const totalFrames = width + holdEnd + (width - 1) + holdStart\n\n // Generate dynamic frames where inactive pixels are dots and active ones are blocks\n const frames = Array.from({ length: totalFrames }, (_, frameIndex) => {\n return Array.from({ length: width }, (_, charIndex) => {\n const index = calculateColorIndex(frameIndex, charIndex, width, trailOptions)\n\n if (style === \"diamonds\") {\n const shapes = [\"⬥\", \"◆\", \"⬩\", \"⬪\"]\n if (index >= 0 && index < trailOptions.colors.length) {\n return shapes[Math.min(index, shapes.length - 1)]\n }\n return \"·\"\n }\n\n // Default to blocks\n // It's active if we have a valid color index that is within our colors array\n const isActive = index >= 0 && index < trailOptions.colors.length\n return isActive ? \"■\" : \"⬝\"\n }).join(\"\")\n })\n\n return frames\n}\n\n/**\n * Creates a color generator function for Knight Rider style scanner animation\n * @param options Configuration options for the Knight Rider effect\n * @returns ColorGenerator function\n */\nexport function createColors(options: KnightRiderOptions = {}): ColorGenerator {\n const holdStart = options.holdStart ?? 30\n const holdEnd = options.holdEnd ?? 9\n\n const colors =\n options.colors ??\n (options.color\n ? deriveTrailColors(options.color, options.trailSteps)\n : [\n RGBA.fromHex(\"#ff0000\"), // Brightest Red (Center)\n RGBA.fromHex(\"#ff5555\"), // Glare/Bloom\n RGBA.fromHex(\"#dd0000\"), // Trail 1\n RGBA.fromHex(\"#aa0000\"), // Trail 2\n RGBA.fromHex(\"#770000\"), // Trail 3\n RGBA.fromHex(\"#440000\"), // Trail 4\n ])\n\n const defaultColor =\n options.defaultColor ??\n (options.color ? deriveInactiveColor(options.color, options.inactiveFactor) : RGBA.fromHex(\"#330000\"))\n\n const trailOptions = {\n colors,\n trailLength: colors.length,\n defaultColor,\n direction: \"bidirectional\" as const,\n holdFrames: { start: holdStart, end: holdEnd },\n enableFading: options.enableFading,\n minAlpha: options.minAlpha,\n }\n\n return createKnightRiderTrail(trailOptions)\n}\n"
],
"mappings": "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",
"debugId": "4C48640D3F7A34EB64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/set.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n"
],
"mappings": ";snBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,KAAK,EAChD,CACH",
"debugId": "390B56B9AF46BBE264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Effect, FileSystem, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\n\n// The CLI's service configuration file, plus the Service.Options 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))\n\nfunction configKey(key: string): Key {\n if (keys.includes(key as Key)) return key as Key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst env = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const filename = InstallationChannel === \"local\" ? \"service-local.json\" : \"service.json\"\n return {\n fs,\n file: path.join(global.state, filename),\n configFile: path.join(global.config, filename),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file } = yield* env\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? undefined : process.argv[1]\n if (!compiled && entrypoint === undefined) return yield* Effect.fail(new Error(\"Failed to resolve CLI entrypoint\"))\n return {\n file,\n version: InstallationVersion,\n command: [process.execPath, ...(entrypoint ? [entrypoint] : []), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* env\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* env\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})\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": "8DCAFE043F2B595A64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient, type McpServer } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.mcp.list({ location: { directory: process.cwd() } }))\n const servers = (response.data?.data ?? []).toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";krBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,IADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GACjF,MAAM,MAAQ,CAAC,GAAG,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC3F,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "C16B7D1BE03FD88364756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/logout.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ 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.v2.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": ";guBAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,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,GAAG,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EAC3G,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "1DFDBD74CC83730664756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/mini/mini.ts", "src/mini/run.ts", "src/mini/noninteractive.ts", "src/mini/ui.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Server } from \"../services/server\"\nimport { waitForCatalogReady } from \"./catalog.shared\"\nimport { INTERACTIVE_INPUT_ERROR, resolveInteractiveStdin } from \"./runtime.stdin\"\nimport type { RunInput, RunTuiConfig } from \"./types\"\n\nexport type MiniCommandInput = {\n server: Server.Resolved\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?: RunTuiConfig | Promise<RunTuiConfig>\n}\n\ntype Session = Awaited<ReturnType<OpenCodeClient[\"session\"][\"get\"]>>\nexport async function runMini(input: MiniCommandInput) {\n validate(input)\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await Bun.stdin.text(), input.prompt)\n const runtimeTask = import(\"./runtime\")\n const directory = localDirectory()\n\n try {\n const sdk = OpenCode.make({\n baseUrl: input.server.endpoint.url,\n headers: Service.headers(input.server.endpoint),\n })\n const model = parseModel(input.model)\n let agentTask: Promise<string | undefined> | undefined\n const resolveAgent = () => {\n agentTask ??= validateAgent(sdk, directory, input.agent)\n return agentTask\n }\n const resolveSession = async () => {\n const [agent, selected] = await Promise.all([\n resolveAgent(),\n selectSession(sdk, directory, input),\n ])\n const readyModel =\n model ?? (selected?.model ? { providerID: selected.model.providerID, modelID: selected.model.id } : undefined)\n if (readyModel) await waitForCatalogReady({ sdk, directory, model: readyModel })\n const session = selected ?? (await createSession(sdk, directory, agent, model))\n return { id: session.id, title: session.title, resume: selected !== undefined }\n }\n const create = (\n _sdk: OpenCodeClient,\n next: { agent: string | undefined; model: RunInput[\"model\"]; variant: string | undefined },\n ) => createSession(sdk, directory, next.agent, next.model, next.variant)\n const runtime = await runtimeTask\n await runtime.runInteractiveDeferredMode({\n sdk,\n directory,\n resolveAgent,\n session: resolveSession,\n createSession: create,\n agent: input.agent,\n model,\n variant: undefined,\n files: [],\n initialInput,\n thinking: true,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n })\n } catch (error) {\n if (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR) fail(error.message)\n throw error\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 resolveInteractiveStdin().cleanup?.()\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 fail(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string): RunInput[\"model\"] {\n if (!value) return\n const [providerID, ...rest] = value.split(\"/\")\n const modelID = rest.join(\"/\")\n if (!providerID || !modelID) fail(\"--model must use the format provider/model\")\n return { providerID, modelID }\n}\n\nasync function validateAgent(sdk: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline) {\n agents = await sdk.agent.list({ location: { directory } }).catch(() => undefined)\n const agent = agents?.data.find((item) => item.id === name)\n if (agent?.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n if (agent) return name\n await Bun.sleep(25)\n }\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nasync function selectSession(sdk: OpenCodeClient, directory: string, input: MiniCommandInput, preselected?: Session) {\n const selected =\n preselected ??\n (input.session\n ? await sdk.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await sdk.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined)\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected) return\n if (!input.fork) return selected\n return sdk.session.fork({ sessionID: selected.id })\n}\n\nasync function createSession(\n sdk: OpenCodeClient,\n directory: string,\n agent: string | undefined,\n model: RunInput[\"model\"],\n variant?: string,\n): Promise<Session> {\n if (model) await waitForCatalogReady({ sdk, directory, model })\n return sdk.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory },\n })\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n",
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { Model } from \"@opencode-ai/schema/model\"\nimport type { ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Server } from \"../services/server\"\nimport { loadRunAgents, waitForCatalogReady } from \"./catalog.shared\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { toolInlineInfo } from \"./tool\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: Server.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\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return run(input).catch((error) => reportError(input, error instanceof Error ? error.message : String(error)))\n}\n\nasync function run(input: RunCommandInput) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = process.env.PWD ?? process.cwd()\n const directory = localDirectory(root)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await Bun.stdin.text())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Service.Endpoint) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const requestedDirectory = prepared.directory ?? (await client.location.get()).directory\n if (!requestedDirectory) fail(\"Failed to resolve server directory\")\n const session = await selectSession(client, requestedDirectory, input)\n const cwd = session?.location.directory ?? requestedDirectory\n const workspace = session?.location.workspaceID\n const explicit = parseRunModel(input.model)\n const explicitModel = explicit?.model\n const variant = explicit?.variant\n const sessionModel = session?.model ? { providerID: session.model.providerID, modelID: session.model.id } : undefined\n const defaultModel =\n !explicitModel && !sessionModel\n ? await client.model\n .default({ location: { directory: cwd, workspace } })\n .then((result) => (result.data ? { providerID: result.data.providerID, modelID: result.data.id } : undefined))\n : undefined\n const model = pickRunModel(explicitModel, variant, sessionModel, defaultModel)\n if (variant && !model)\n return reportError(input, \"Cannot select a variant before selecting a model\", session?.id)\n if (model) {\n await waitForCatalogReady({ sdk: client, directory: cwd, workspace, model })\n const available = await client.model.list({ location: { directory: cwd, workspace } })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.modelID))\n return reportError(input, `Model unavailable: ${model.providerID}/${model.modelID}`, session?.id)\n }\n const agent = await validateAgent(client, cwd, input.agent)\n const selected =\n session ??\n (await client.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory: cwd },\n }))\n if (!session && input.title !== undefined) {\n await client.session.rename({\n sessionID: selected.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: selected.id,\n message: prepared.message,\n files: prepared.files,\n agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: true,\n renderTool,\n renderToolError,\n }).catch((error) => reportError(input, error instanceof Error ? error.message : String(error), selected.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\nexport function pickRunModel(\n explicit: { providerID: string; modelID: string } | undefined,\n variant: string | undefined,\n session: { providerID: string; modelID: string } | undefined,\n fallback: { providerID: string; modelID: string } | undefined,\n) {\n if (explicit) return explicit\n if (!variant) return\n return session ?? fallback\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 if (!value) return\n const ref = Model.Ref.parse(value)\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const agents = await loadRunAgents(client, directory).catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function selectSession(client: OpenCodeClient, directory: string, input: RunCommandInput) {\n const selected = input.session\n ? await client.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await client.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected || !input.fork) return selected\n return client.session.fork({ sessionID: selected.id })\n}\n\nasync function prepareFile(input: string, directory: string): 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 (!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: ToolPart) {\n const info = toolInlineInfo(part)\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: ToolPart) {\n const info = toolInlineInfo(part)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction reportError(input: RunCommandInput, 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 { EventSubscribeOutput, OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { ReasoningPart, StepFinishPart, StepStartPart, TextPart, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\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 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 renderTool: (part: ToolPart) => Promise<void>\n renderToolError: (part: ToolPart) => 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, unknown>\n raw?: string\n provider?: unknown\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let questionRejected = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let admission: AbortController | 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: TextPart, 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 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 rejectQuestion = async (request: { id: string }) => {\n questionRejected = true\n await input.client.question.reject({ sessionID: input.sessionID, requestID: request.id }).catch(() => {})\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n formCancelled = true\n await input.client.form.cancel({ sessionID: request.sessionID, formID: request.id }).catch(() => {})\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (event.type === \"question.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await rejectQuestion(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached && event.data.form.sessionID === GLOBAL_FORM_SESSION_ID))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || questionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part: StepStartPart = {\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 (!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 starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part: TextPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part: ReasoningPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n tools.set(event.data.callID, {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(event.data.callID)\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.called\") {\n const current = tools.get(event.data.callID)\n tools.set(event.data.callID, {\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 })\n continue\n }\n if (event.type === \"session.tool.success\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: event.data.content\n .filter((item) => item.type === \"text\")\n .map((item) => item.text)\n .join(\"\\n\"),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(part)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const error = event.data.error.message\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) {\n await input.renderToolError(part)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n const part: StepFinishPart = {\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 (interrupted || permissionRejected || questionRejected || formCancelled) continue\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 (!emittedError && !questionRejected && !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 (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, questions, forms] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.question.list({ sessionID: input.sessionID }).catch(() => undefined),\n Promise.all(\n (input.attached ? [input.sessionID] : [input.sessionID, GLOBAL_FORM_SESSION_ID]).map((sessionID) =>\n input.client.form.list({ sessionID }).catch(() => undefined),\n ),\n ),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(questions ?? []).map(rejectQuestion),\n ...forms.flatMap((response) => response ?? []).map(cancelForm),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n }\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,${Buffer.from(await Bun.file(new URL(file.url)).arrayBuffer()).toString(\"base64\")}`\n return { attachment: { uri, mime: file.mime, 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 Bun.file(new URL(file.url)).text()\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": "15A4F394DAB5AB8C64756E2164756E21",
"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": ";8nBAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,EAAO,CAC7C,QAAQ,OAAO,OAAO,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "17C6A7A4119A9A6964756E2164756E21",
"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\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.start(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.connect.oauth(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.attempt.cancel(\n { 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, 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 attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.attempt.status({ 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": ";k9BAYA,OAAwB,OACxB,SAAM,OAAiB,MAAC,cAAI,cAAK,cAAK,cAAK,cAAK,cAAK,cAAK,cAAK,cAAK,aAAG,OACjE,QAAe,UACf,OAAS,MACb,OAAQ,EAAK,UAAU,CAAC,EACxB,MAAO,EAAK,UAAU,CAAC,EACvB,WAAY,EAAK,kBAAkB,EACnC,MAAO,EAAK,UAAU,CAAC,EACvB,QAAS,EAAK,UAAU,CAAC,CAC3B,EACM,EAAO,CACX,MAAO,CACL,OAAQ,SACR,MAAO,EAAO,MACd,UAAW,EACb,EACA,KAAM,CACJ,OAAQ,SACR,MAAO,EAAO,OACd,UAAW,EACb,EACA,QAAS,CACP,OAAQ,SACR,MAAO,EAAO,QACd,UAAW,EACb,EACA,QAAS,CACP,OAAQ,SACR,MAAO,EAAO,MACd,UAAW,EACb,EACA,MAAO,CACL,OAAQ,SACR,MAAO,EAAO,MACd,UAAW,EACb,CACF,EACA,SAAS,EAAG,CAAC,EAAM,EAAO,CACxB,IAAM,EAAQ,EAAK,GACnB,OAAO,EAAuB,KAAO,IAAM,CACzC,IAAI,EAAO,EAAgB,KAAK,EAC9B,EAAQ,EAAgB,KAAK,EAC7B,EAAQ,EAAgB,MAAM,EAC9B,EAAQ,EAAgB,MAAM,EAoChC,OAnCA,EAAa,EAAM,CAAK,EACxB,EAAU,EAAM,QAAS,MAAM,EAC/B,EAAU,EAAM,YAAa,CAAC,EAC9B,EAAU,EAAM,gBAAiB,QAAQ,EACzC,EAAa,EAAO,CAAK,EACzB,EAAa,EAAO,CAAK,EACzB,EAAU,EAAO,QAAS,MAAM,EAChC,EAAU,EAAO,YAAa,CAAC,EAC/B,EAAU,EAAO,gBAAiB,KAAK,EACvC,EAAU,EAAO,MAAO,CAAC,EACzB,EAAU,EAAO,aAAc,CAAC,EAChC,EAAS,EAAO,IAAM,EAAM,MAAM,EAClC,EAAU,EAAO,WAAY,MAAM,EACnC,EAAS,EAAO,CAAK,EACrB,EAAS,EAAM,EAAkB,EAAM,IACjC,KAAI,EAAG,CACT,OAAO,EAAM,cAEX,SAAQ,EAAG,CACb,IAAI,EAAQ,EAAgB,MAAM,EAGlC,OAFA,EAAa,EAAO,EAAiB,QAAE,CAAC,EACxC,EAAS,KAAO,EAAU,EAAO,KAAM,EAAO,MAAO,CAAG,CAAC,EAClD,EAEX,CAAC,EAAG,IAAI,EACR,EAAS,KAAO,CACd,IAAI,EAAM,EAAM,MACd,EAAO,EAAO,WAGhB,OAFA,IAAQ,EAAI,IAAM,EAAI,EAAI,EAAU,EAAO,KAAM,EAAK,EAAI,CAAC,GAC3D,IAAS,EAAI,IAAM,EAAI,EAAI,EAAU,EAAO,KAAM,EAAM,EAAI,CAAC,GACtD,GACN,CACD,EAAG,OACH,EAAG,MACL,CAAC,EACM,IACN,EAAG,CACJ,eAAgB,GAChB,gBAAiB,CAAC,EAAM,SAC1B,CAAC,EAEH,SAAS,EAAc,CAAC,EAAO,CAM7B,OALA,EAAY,KAAS,CACnB,GAAI,EAAM,OAAS,UAAY,EAAE,EAAM,MAAQ,EAAM,OAAS,KAAM,OACpE,EAAM,eAAe,EACrB,EAAM,OAAO,EACd,GACO,IAAM,CACZ,IAAI,EAAQ,EAAgB,KAAK,EAwBjC,OAvBA,EAAU,EAAO,QAAS,MAAM,EAChC,EAAU,EAAO,SAAU,CAAC,EAC5B,EAAU,EAAO,gBAAiB,KAAK,EACvC,EAAU,EAAO,MAAO,CAAC,EACzB,EAAS,EAAO,EAAkB,EAAM,IAClC,KAAI,EAAG,CACT,OAAO,EAAM,QAAQ,GAEvB,SAAU,KAAQ,EAAE,IAAM,CACxB,IAAI,EAAQ,EAAgB,SAAS,EAIrC,OAHA,EAAU,EAAO,SAAU,CAAc,EACzC,EAAU,EAAO,WAAY,EAAE,EAC/B,EAAS,KAAO,EAAU,EAAO,QAAS,EAAO,OAAQ,CAAG,CAAC,EACtD,IACN,GAAI,IAAM,CACX,IAAI,EAAQ,EAAgB,MAAM,EAKlC,OAJA,EAAU,EAAO,WAAY,MAAM,EACnC,EAAU,EAAO,WAAY,EAAI,EACjC,EAAS,EAAO,CAAI,EACpB,EAAS,KAAO,EAAU,EAAO,KAAM,EAAO,WAAY,CAAG,CAAC,EACvD,IACN,CAAC,CACN,CAAC,CAAC,EACK,IACN,EAEL,SAAS,CAAO,CAAC,EAAM,CACrB,OAAO,IAAI,QAAQ,KAAW,CAC5B,IAAM,EAAQ,WAAW,EAAS,EAAY,EAC9C,EAAM,MAAM,EACZ,IAAM,EAAS,IAAM,CACnB,aAAa,CAAK,EAClB,EAAQ,GAEL,EAAK,KAAK,EAAQ,CAAM,EAC9B,EAEH,eAAe,CAAQ,CAAC,EAAU,CAChC,MAAM,EAAQ,EAAS,KAAK,CAAC,EAC7B,GAAI,CACF,EAAS,mBAAqB,qBAC9B,CACA,GAAI,CACF,EAAS,WAAa,qBACtB,CACA,GAAI,CAAC,EAAS,YAAa,EAAS,QAAQ,IAIlD,eAAsB,CAAkB,EAAG,CACzC,IAAM,EAAS,QAAQ,OACjB,EAAa,IAAI,gBACjB,EAAU,CAAC,SAAU,SAAU,SAAS,EACxC,EAAS,IAAM,CACnB,GAAI,CAAC,EAAW,OAAO,QAAS,EAAW,MAAM,GAGnD,GADA,EAAQ,QAAQ,KAAU,QAAQ,GAAG,EAAQ,CAAM,CAAC,EAChD,CAAC,EAAO,OAAS,CAAC,QAAQ,MAAM,MAAO,CACzC,IAAI,EAAS,GACT,EAAU,GACV,EACA,EACE,EAAQ,MAAO,EAAM,IAAS,CAClC,GAAI,EAAQ,MAAU,MAAM,iBAAiB,EAC7C,GAAI,EAAS,MAAU,MAAM,oCAAoC,EACjE,EAAU,GACV,GAAI,CACF,IAAM,EAAQ,IAAS,UAAY,OAAY,EAAK,GAC9C,EAAS,IAAS,UAAY,IAAM,EAAK,GAAM,OAC/C,EAAY,GAAO,UAAY;AAAA,EAAO,GAC5C,EAAS,IAAI,QAAQ,CAAC,EAAS,IAAW,CACxC,EAAO,MAAM,GAAG,KAAU;AAAA,EAAS,IAAa,KAAS,EAAQ,EAAO,CAAK,EAAI,EAAQ,CAAC,EAC3F,EACD,MAAM,SACN,CACA,EAAU,GACV,EAAS,SAGP,EAAQ,IAAM,CAClB,GAAI,EAAW,OAAO,EAMtB,OALA,EAAS,GACT,GAAa,SAAY,CACvB,MAAM,GAAQ,MAAM,IAAM,EAAE,EAC5B,EAAQ,QAAQ,KAAU,QAAQ,IAAI,EAAQ,CAAM,CAAC,IACpD,EACI,GAET,MAAO,CACL,OAAQ,EAAW,OACnB,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,KAAM,KAAQ,EAAM,OAAQ,CAAI,EAChC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,OACF,EAEF,IAAI,EACJ,GAAI,CAGF,QAAQ,OAAO,MAAM;AAAA,CAAI,EACzB,EAAW,MAAM,EAAkB,CACjC,MAAO,QAAQ,MACf,SAAU,GACV,UAAW,GACX,mBAAoB,GACpB,YAAa,GACb,YAAa,CAAC,EACd,WAAY,eACZ,aAAc,EACd,mBAAoB,iBACpB,YAAa,WACb,gBAAiB,EACnB,CAAC,EACD,IAAM,EAAiB,GAChB,EAAS,GAAc,EAAa,EACrC,EAAa,EAAO,IAAM,EAAkB,GAAgB,CAChE,QAAS,EACT,OAAQ,CACV,CAAC,EAAG,CAAc,EACb,EAAW,MAAM,CAAM,EAC5B,MAAM,EAAQ,EAAe,KAAK,CAAC,EACnC,IAAI,EAAS,GACT,EAAU,GACV,EACA,EACE,EAAQ,CAAC,EAAM,IAAS,CAC5B,GAAI,EAAQ,OAAO,QAAQ,OAAW,MAAM,iBAAiB,CAAC,EAC9D,GAAI,EAAS,OAAO,QAAQ,OAAW,MAAM,oCAAoC,CAAC,EAgBlF,OAfA,EAAU,GACV,GAAU,SAAY,CACpB,GAAI,IAAS,UACX,EAAW,CAAI,EACf,EAAe,cAAc,EACxB,KACL,GAAI,IAAS,WAAa,IAAS,WAAa,IAAS,QAAS,EAAW,MAAS,EACtF,EAAe,kBAAkB,GAAI,EAAM,CAAI,CAAC,EAChD,EAAe,cAAc,EAE/B,MAAM,EAAQ,EAAe,KAAK,CAAC,IAClC,EAAE,QAAQ,IAAM,CACjB,EAAU,GACV,EAAS,OACV,EACM,GAEH,EAAQ,IAAM,CAClB,GAAI,EAAW,OAAO,EAWtB,OAVA,EAAS,GACT,GAAa,SAAY,CACvB,MAAM,GAAQ,MAAM,IAAM,EAAE,EAC5B,GAAI,CACF,MAAM,EAAS,CAAc,EAC7B,MAAM,EAAQ,CAAU,SACxB,CACA,EAAQ,QAAQ,KAAU,QAAQ,IAAI,EAAQ,CAAM,CAAC,KAEtD,EACI,GAET,MAAO,CACL,OAAQ,EAAW,OACnB,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,KAAM,KAAQ,EAAM,OAAQ,CAAI,EAChC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,OACF,EACA,MAAO,EAAO,CACd,GAAI,CACF,GAAI,EAAU,MAAM,EAAS,CAAQ,SACrC,CACA,EAAQ,QAAQ,KAAU,QAAQ,IAAI,EAAQ,CAAM,CAAC,EAEvD,MAAM,GCnRV,IAAM,EAAgB,WAChB,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,KAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,IAAM,EAAW,MAAO,EAAO,eAC7B,EAAO,QAAQ,IAAM,EAAmB,CAAC,EACzC,CAAC,IAAU,EAAQ,IAAM,EAAM,MAAM,CAAC,EAAE,KAAK,EAAO,MAAM,CAC5D,EACM,EAAO,MAAO,GAAM,EAAU,EAAO,eAAe,EAAM,GAAG,CAAC,EAAE,KACpE,EAAO,UAAU,EAAW,aAAa,EAAS,MAAM,CAAC,EACzD,EAAO,IACT,EACA,GAAI,EAAK,UAAU,CAAI,EAAG,OAE1B,IAAM,EAAY,EAAS,OAAO,QAClC,MAAO,EAAQ,IAAM,EAAS,QAAQ,EAAY,0BAA4B,GAAa,EAAK,KAAK,CAAC,CAAC,EAAE,KACvG,EAAO,MACT,EACA,QAAQ,SAAW,EAAY,IAAM,EACtC,CACH,EAEM,GAAQ,EAAO,GAAG,uBAAuB,EAAE,SAAU,CAAC,EAAwB,EAAiB,CACnG,MAAO,EAAQ,IAAM,EAAS,MAAM,QAAQ,CAAC,EAC7C,MAAO,EAAQ,IAAM,EAAS,QAAQ,2BAA2B,CAAC,EAElE,IAAM,EAAW,MAAO,EAAQ,MAAM,MAAO,EAAc,QAAQ,CAAC,EAC9D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAQ,MAAO,EAAQ,CAAC,IAAW,EAAO,YAAY,IAAI,CAAE,gBAAe,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAClG,EAAc,MAAO,EAAS,EAAM,KAAM,6CAA6C,EACvF,EAAS,MAAO,EACpB,EAAY,QAAQ,KAAK,CAAC,IAAc,EAAU,OAAS,OAAO,EAClE,uCACF,EAEA,MAAO,EAAQ,IAAM,EAAS,QAAQ,2BAA2B,CAAC,EAYlE,IAAM,GAXU,MAAO,EAAQ,CAAC,IAC9B,EAAO,YAAY,QAAQ,MACzB,CACE,gBACA,SAAU,EAAO,GACjB,OAAQ,EAAS,CAAE,QAAO,EAAI,CAAC,EAC/B,UACF,EACA,CAAE,QAAO,CACX,CACF,GACwB,KASxB,GARA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OACzB,CAAE,UAAW,EAAQ,UAAW,UAAS,EACzC,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CACvC,CACF,EAAE,KAAK,EAAO,MAAM,CACtB,EACI,EAAQ,OAAS,OAAQ,MAAO,EAAO,KAAS,MAAM,0CAA0C,CAAC,EAErG,MAAO,EAAQ,IAAM,EAAS,KAAK,UAAU,EAAQ,KAAK,CAAC,EAC3D,MAAO,EAAQ,IAAM,EAAS,KAAK,EAAQ,YAAY,CAAC,EACxD,MAAO,EAAQ,SAAY,CACzB,IAAQ,QAAS,GAAS,KAAa,0CACvC,MAAM,EAAK,EAAQ,GAAG,EACvB,EAAE,KAAK,EAAO,MAAM,EACrB,MAAO,EAAQ,IAAM,EAAS,QAAQ,8BAA8B,CAAC,EAErE,IAAM,EAAS,MAAO,GAAoB,EAAQ,EAAQ,SAAS,EACnE,GAAI,EAAO,SAAW,SAAU,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EAC5E,GAAI,EAAO,SAAW,UAAW,MAAO,EAAO,KAAS,MAAM,qBAAqB,CAAC,EAEpF,MAAO,EAAQ,IAAM,EAAS,QAAQ,+BAA+B,CAAC,EACtE,MAAO,EAAQ,IAAM,EAAS,MAAM,MAAM,CAAC,EAC5C,EAEK,GAAsB,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACxE,EACA,EACA,CACA,MAAO,GAAM,CACX,IAAM,EAAW,MAAO,EAAQ,CAAC,IAC/B,EAAO,YAAY,QAAQ,OAAO,CAAE,YAAW,UAAS,EAAG,CAAE,QAAO,CAAC,CACvE,EACA,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,MAAO,EAAO,MAAM,GAAG,GAE1B,EAED,SAAS,CAAU,CAAC,EAA2C,CAC7D,OAAO,EAAO,WAAW,CACvB,IAAK,EACL,MAAO,CAAC,IAAU,CACpB,CAAC,EAGH,SAAS,CAAW,CAAC,EAA6B,EAAiB,CACjE,OAAO,IAAU,MAAQ,IAAU,OAAY,EAAO,KAAS,MAAM,CAAO,CAAC,EAAI,EAAO,QAAQ,CAAK,EAGvG,SAAS,EAAY,CAAC,EAA6B,CACjD,IAAM,EAAQ,EAAM,OAAO,CAAK,EAChC,GAAI,aAAiB,MAAO,OAAO,EAAM,QACzC,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,YAAa,GAAS,OAAO,EAAM,UAAY,SAChG,OAAO,EAAM,QAEf,OAAO,OAAO,CAAK",
"debugId": "6451758B36CD093864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "BB8850E8CCDAEBDC64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/standalone.ts", "src/services/server.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport path from \"node:path\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? [] : process.argv[1] ? [process.argv[1]] : []\n if (!compiled && entrypoint.length === 0) throw new Error(\"Failed to resolve CLI entrypoint\")\n const [executable, ...args] = options.command ?? [process.execPath, ...entrypoint, \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const output = yield* proc.stdout.pipe(Stream.decodeText(), Stream.splitLines, Stream.take(1), Stream.mkString)\n if (!output) return yield* Effect.fail(new Error(\"Standalone server exited before reporting readiness\"))\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Service.Endpoint & { readonly pid: number }\n },\n Effect.provide(AppNodeBuilder.build(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n",
"import { NodeFileSystem } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: Service.StartOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Service.Endpoint\n readonly reconnect?: (attempt: number) => Promise<Service.Endpoint>\n readonly reload?: () => Promise<void>\n}\n\nexport const resolve = Effect.fn(\"cli.server.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\n ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) }\n : undefined,\n } satisfies Service.Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n const endpoint = yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\")\n const reconnectOptions = { ...options, version: undefined }\n return {\n endpoint,\n reconnect: (attempt) =>\n Effect.runPromise(\n Effect.gen(function* () {\n if (attempt > 3) return yield* Service.start(reconnectOptions)\n const endpoint = yield* Service.discover(reconnectOptions)\n if (endpoint !== undefined) return endpoint\n return yield* Effect.fail(new Error(\"Background server is unavailable\"))\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n reload: () =>\n Effect.runPromise(\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.start(options)\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n } satisfies Resolved\n})\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: Service.StartOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.start(options)\n if (mismatch === \"ignore\") return yield* Service.start({ ...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) return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.start(options)\n})\n\nfunction connectError(endpoint: Service.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 Server from \"./server\"\n"
],
"mappings": "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",
"debugId": "BE36345256595EE564756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../../node_modules/.bun/@opentui+keymap@0.4.3+aeceedea454d57be/node_modules/@opentui/keymap/src/extras/index.js", "../tui/src/config/keybind.ts", "../tui/src/config/index.tsx"],
"sourcesContent": [
"// @bun\nimport\"../../chunks/index-p35cyhc4.js\";\n\n// src/extras/binding-lookup.ts\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar EMPTY_BINDINGS = Object.freeze([]);\nfunction isObject(value) {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction isKeyLike(value) {\n return typeof value === \"string\" || isObject(value);\n}\nfunction cloneKeyLike(key) {\n if (typeof key === \"string\") {\n return key;\n }\n return { ...key };\n}\nfunction normalizeCommand(command) {\n if (command.length === 0) {\n throw new Error(\"Invalid binding command: command cannot be empty\");\n }\n return command;\n}\nfunction mapCommand(command, commandMap) {\n const configCommand = normalizeCommand(command);\n if (!commandMap || !hasOwn.call(commandMap, configCommand)) {\n return configCommand;\n }\n const mappedCommand = commandMap[configCommand];\n if (typeof mappedCommand !== \"string\") {\n throw new Error(`Invalid binding command map entry for \"${configCommand}\": expected a command string`);\n }\n if (mappedCommand.length === 0) {\n throw new Error(`Invalid binding command map entry for \"${configCommand}\": command cannot be empty`);\n }\n return mappedCommand;\n}\nfunction invalidBindingValue(command, index) {\n const location = index === undefined ? `\"${command}\"` : `\"${command}\" at index ${index}`;\n return new Error(`Invalid binding value for ${location}: expected false, a key, a binding object, or an array of keys/binding objects`);\n}\nfunction resolveBindingItem(command, item, index) {\n if (!isKeyLike(item)) {\n throw invalidBindingValue(command, index);\n }\n if (typeof item === \"string\" || !(\"key\" in item)) {\n return {\n key: cloneKeyLike(item),\n cmd: command\n };\n }\n const key = item.key;\n if (!isKeyLike(key)) {\n throw invalidBindingValue(command, index);\n }\n return {\n ...item,\n key: cloneKeyLike(key),\n cmd: command\n };\n}\nfunction resolveBindingValue(command, value, bindingDefaults) {\n if (value === false || value === \"none\") {\n return;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return;\n }\n const items = value;\n const bindings = new Array(items.length);\n for (let index = 0;index < items.length; index += 1) {\n const binding2 = resolveBindingItem(command, items[index], index);\n bindings[index] = bindingDefaults ? withBindingDefaults(command, binding2, bindingDefaults) : binding2;\n }\n return bindings;\n }\n const binding = resolveBindingItem(command, value);\n return [bindingDefaults ? withBindingDefaults(command, binding, bindingDefaults) : binding];\n}\nfunction withBindingDefaults(command, binding, bindingDefaults) {\n const defaults = bindingDefaults?.({ command, binding });\n if (!defaults)\n return binding;\n return { ...defaults, ...binding };\n}\nfunction flattenBindings(byCommand) {\n let bindingCount = 0;\n for (const bindings of byCommand.values()) {\n bindingCount += bindings.length;\n }\n const result = new Array(bindingCount);\n let bindingIndex = 0;\n for (const bindings of byCommand.values()) {\n for (let index = 0;index < bindings.length; index += 1) {\n result[bindingIndex] = bindings[index];\n bindingIndex += 1;\n }\n }\n return result;\n}\nfunction normalizeBindings(config, commandMap, bindingDefaults) {\n const byCommand = new Map;\n for (const rawCommand in config) {\n if (!hasOwn.call(config, rawCommand)) {\n continue;\n }\n const command = mapCommand(rawCommand, commandMap);\n const commandBindings = resolveBindingValue(command, config[rawCommand], bindingDefaults);\n if (!commandBindings) {\n byCommand.delete(command);\n } else {\n byCommand.set(command, commandBindings);\n }\n }\n return {\n bindings: flattenBindings(byCommand),\n byCommand\n };\n}\nfunction gatherBindings(byCommand, commands) {\n const gatheredByCommand = new Map;\n const bindings = [];\n for (const command of commands) {\n const commandBindings = byCommand.get(command);\n if (!commandBindings)\n continue;\n gatheredByCommand.set(command, commandBindings);\n for (let index = 0;index < commandBindings.length; index += 1) {\n bindings.push(commandBindings[index]);\n }\n }\n return { bindings, byCommand: gatheredByCommand };\n}\nfunction createBindingLookup(config, options) {\n let currentConfig = config;\n let normalized = normalizeBindings(currentConfig, options?.commandMap, options?.bindingDefaults);\n const gathered = new Map;\n return {\n get bindings() {\n return normalized.bindings;\n },\n get(command) {\n return normalized.byCommand.get(command) ?? EMPTY_BINDINGS;\n },\n has(command) {\n return normalized.byCommand.has(command);\n },\n gather(name, commands) {\n const existing = gathered.get(name);\n if (existing)\n return existing.bindings;\n const next = gatherBindings(normalized.byCommand, commands);\n gathered.set(name, next);\n return next.bindings;\n },\n pick(name, commands) {\n const group = gathered.get(name);\n if (!group)\n return [];\n const result = [];\n for (const command of commands) {\n const bindings = group.byCommand.get(command);\n if (!bindings)\n continue;\n for (let index = 0;index < bindings.length; index += 1) {\n result.push(bindings[index]);\n }\n }\n return result;\n },\n omit(name, commands) {\n const group = gathered.get(name);\n if (!group)\n return [];\n if (commands.length === 0)\n return group.bindings;\n if (commands.length === 1) {\n const omitted2 = commands[0];\n const result2 = [];\n for (let index = 0;index < group.bindings.length; index += 1) {\n const binding = group.bindings[index];\n if (typeof binding.cmd === \"string\" && binding.cmd === omitted2)\n continue;\n result2.push(binding);\n }\n return result2;\n }\n const omitted = new Set(commands);\n const result = [];\n for (let index = 0;index < group.bindings.length; index += 1) {\n const binding = group.bindings[index];\n if (typeof binding.cmd === \"string\" && omitted.has(binding.cmd))\n continue;\n result.push(binding);\n }\n return result;\n },\n invalidate(name) {\n if (name === undefined) {\n gathered.clear();\n return;\n }\n gathered.delete(name);\n },\n update(nextConfig) {\n if (nextConfig) {\n currentConfig = nextConfig;\n }\n normalized = normalizeBindings(currentConfig, options?.commandMap, options?.bindingDefaults);\n gathered.clear();\n }\n };\n}\n// src/extras/command-bindings.ts\nfunction isCommandBindingKey(value) {\n return typeof value === \"string\" || !!value && typeof value === \"object\" && !Array.isArray(value);\n}\nfunction commandBindings(bindings, options) {\n const normalized = [];\n const indexesByCommand = new Map;\n for (const [command, key] of Object.entries(bindings)) {\n if (!isCommandBindingKey(key)) {\n const error = new Error(`Invalid command binding for \"${command}\": command bindings must map command strings to key strings or keystroke objects`);\n options?.onError?.({\n code: \"invalid-command-binding\",\n command,\n value: key,\n reason: error\n });\n continue;\n }\n const normalizedCommand = command.trim();\n const nextBinding = {\n key: typeof key === \"string\" ? key : { ...key },\n cmd: normalizedCommand\n };\n const existingIndex = indexesByCommand.get(normalizedCommand);\n if (existingIndex !== undefined) {\n const previousBinding = normalized[existingIndex];\n options?.onWarning?.({\n code: \"command-binding-override\",\n command: normalizedCommand,\n previousKey: previousBinding.key,\n nextKey: nextBinding.key\n });\n normalized[existingIndex] = nextBinding;\n continue;\n }\n indexesByCommand.set(normalizedCommand, normalized.length);\n normalized.push(nextBinding);\n }\n return normalized;\n}\n// src/extras/formatting.ts\nfunction formatStroke(part, options) {\n if (part.tokenName) {\n const tokenDisplay = options.tokenDisplay;\n if (!tokenDisplay)\n return part.display;\n if (typeof tokenDisplay === \"function\")\n return tokenDisplay(part.tokenName, part) ?? part.display;\n return tokenDisplay[part.tokenName] ?? part.display;\n }\n if (part.patternName) {\n const patternDisplay = options.patternDisplay;\n if (!patternDisplay)\n return part.display;\n if (typeof patternDisplay === \"function\")\n return patternDisplay(part.patternName, part) ?? part.display;\n return patternDisplay[part.patternName] ?? part.display;\n }\n if (!options.keyNameAliases && !options.modifierAliases)\n return part.display;\n const stroke = part.stroke;\n const modifierAliases = options.modifierAliases;\n let formatted = \"\";\n let pieceCount = 0;\n if (stroke.ctrl) {\n formatted = modifierAliases?.ctrl ?? \"ctrl\";\n pieceCount = 1;\n }\n if (stroke.shift) {\n const alias = modifierAliases?.shift ?? \"shift\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n if (stroke.meta) {\n const alias = modifierAliases?.meta ?? \"meta\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n if (stroke.super) {\n const alias = modifierAliases?.super ?? \"super\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n if (stroke.hyper) {\n const alias = modifierAliases?.hyper ?? \"hyper\";\n formatted = pieceCount === 0 ? alias : `${formatted}+${alias}`;\n pieceCount += 1;\n }\n const name = stroke.name === \"return\" ? \"enter\" : stroke.name;\n const keyName = options.keyNameAliases?.[name] ?? name;\n return pieceCount === 0 ? keyName : `${formatted}+${keyName}`;\n}\nfunction formatKeySequence(parts, options = {}) {\n if (!parts || parts.length === 0)\n return \"\";\n const separator = options.separator ?? \" \";\n let formatted = formatStroke(parts[0], options);\n for (let index = 1;index < parts.length; index += 1) {\n formatted += separator + formatStroke(parts[index], options);\n }\n return formatted;\n}\nfunction formatCommandBindings(bindings, options = {}) {\n if (!bindings?.length)\n return;\n const bindingSeparator = options.bindingSeparator ?? \", \";\n const dedupe = options.dedupe !== false;\n const seen = dedupe ? new Set : undefined;\n let formatted = \"\";\n let itemCount = 0;\n for (const binding of bindings) {\n const item = formatKeySequence(binding.sequence, options);\n if (!item)\n continue;\n if (seen) {\n if (seen.has(item))\n continue;\n seen.add(item);\n }\n formatted = itemCount === 0 ? item : `${formatted}${bindingSeparator}${item}`;\n itemCount += 1;\n }\n return formatted;\n}\nexport {\n formatKeySequence,\n formatCommandBindings,\n createBindingLookup,\n commandBindings\n};\n\n//# debugId=418A62FEB87D11F164756E2164756E21\n//# sourceMappingURL=index.js.map\n",
"export * as TuiKeybind from \"./keybind\"\n\nimport type { KeyEvent, Renderable } from \"@opentui/core\"\nimport type { Binding } from \"@opentui/keymap\"\nimport type { BindingCommandMap, BindingConfig, BindingDefaults } from \"@opentui/keymap/extras\"\nimport { Schema } from \"effect\"\n\nconst KeyStroke = Schema.Struct({\n name: Schema.String,\n ctrl: Schema.optional(Schema.Boolean),\n shift: Schema.optional(Schema.Boolean),\n meta: Schema.optional(Schema.Boolean),\n super: Schema.optional(Schema.Boolean),\n hyper: Schema.optional(Schema.Boolean),\n})\n\nconst BindingObject = Schema.StructWithRest(\n Schema.Struct({\n key: Schema.Union([Schema.String, KeyStroke]),\n event: Schema.optional(Schema.Literals([\"press\", \"release\"])),\n preventDefault: Schema.optional(Schema.Boolean),\n fallthrough: Schema.optional(Schema.Boolean),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst BindingItem = Schema.Union([Schema.String, KeyStroke, BindingObject])\nexport const BindingValueSchema = Schema.Union([\n Schema.Literal(false),\n Schema.Literal(\"none\"),\n BindingItem,\n Schema.Array(BindingItem),\n])\nexport type BindingValueSchema = Schema.Schema.Type<typeof BindingValueSchema>\n\ntype Definition = {\n default: BindingValueSchema\n description: string\n}\n\nexport const LeaderDefault = \"ctrl+x\"\n\nconst keybind = (value: Definition[\"default\"], description: string): Definition => ({ default: value, description })\n\nexport const Definitions = {\n leader: keybind(LeaderDefault, \"Leader key for keybind combinations\"),\n\n app_exit: keybind(\"ctrl+c,ctrl+d,<leader>q\", \"Exit the application\"),\n app_debug: keybind(\"none\", \"Toggle debug panel\"),\n app_console: keybind(\"none\", \"Toggle console\"),\n app_heap_snapshot: keybind(\"none\", \"Write heap snapshot\"),\n app_toggle_animations: keybind(\"none\", \"Toggle animations\"),\n app_toggle_file_context: keybind(\"none\", \"Toggle file context\"),\n app_toggle_diffwrap: keybind(\"none\", \"Toggle diff wrapping\"),\n app_toggle_paste_summary: keybind(\"none\", \"Toggle paste summary\"),\n app_toggle_session_directory_filter: keybind(\"none\", \"Toggle session directory filtering\"),\n command_list: keybind(\"ctrl+p\", \"List available commands\"),\n help_show: keybind(\"none\", \"Open help dialog\"),\n docs_open: keybind(\"none\", \"Open documentation\"),\n diff_open: keybind(\"none\", \"Open diff viewer\"),\n diff_close: keybind(\"escape,q\", \"Close diff viewer\"),\n diff_toggle: keybind(\"enter,space\", \"Toggle diff viewer item\"),\n diff_expand: keybind(\"right\", \"Expand diff viewer item\"),\n diff_expand_all: keybind(\"E\", \"Expand all diff viewer folders\"),\n diff_collapse: keybind(\"left\", \"Collapse diff viewer item\"),\n diff_switch_focus: keybind(\"tab\", \"Switch diff viewer focus\"),\n diff_next_hunk: keybind(\"]\", \"Jump to next diff hunk\"),\n diff_previous_hunk: keybind(\"[\", \"Jump to previous diff hunk\"),\n diff_next_file: keybind(\"n\", \"Jump to next diff file\"),\n diff_previous_file: keybind(\"p\", \"Jump to previous diff file\"),\n diff_toggle_file_tree: keybind(\"b\", \"Toggle diff viewer file tree\"),\n diff_single_patch: keybind(\"s\", \"Toggle single patch view\"),\n diff_switch_source: keybind(\"d\", \"Switch diff viewer source\"),\n diff_toggle_view: keybind(\"v\", \"Toggle diff viewer split or unified view\"),\n diff_help: keybind(\"?\", \"Show more diff viewer shortcuts\"),\n\n editor_open: keybind(\"<leader>e\", \"Open external editor\"),\n theme_list: keybind(\"<leader>t\", \"List available themes\"),\n theme_switch_mode: keybind(\"none\", \"Switch between light and dark theme mode\"),\n theme_mode_lock: keybind(\"none\", \"Lock or unlock theme mode\"),\n sidebar_toggle: keybind(\"<leader>b\", \"Toggle sidebar\"),\n scrollbar_toggle: keybind(\"none\", \"Toggle session scrollbar\"),\n status_view: keybind(\"<leader>s\", \"View status\"),\n debug_view: keybind(\"none\", \"View debug info\"),\n\n session_export: keybind(\"<leader>x\", \"Export session to editor\"),\n session_copy: keybind(\"none\", \"Copy session transcript\"),\n session_move: keybind(\"none\", \"Move session\"),\n session_new: keybind(\"<leader>n\", \"Create a new session\"),\n session_list: keybind(\"<leader>l\", \"List all sessions\"),\n session_timeline: keybind(\"<leader>g\", \"Show session timeline\"),\n session_fork: keybind(\"none\", \"Fork session from message\"),\n session_rename: keybind(\"ctrl+r\", \"Rename session\"),\n session_delete: keybind(\"ctrl+d\", \"Delete session\"),\n session_share: keybind(\"none\", \"Share current session\"),\n session_unshare: keybind(\"none\", \"Unshare current session\"),\n session_interrupt: keybind(\"escape\", \"Interrupt current session\"),\n session_background: keybind(\"ctrl+b\", \"Background blocking session tools\"),\n session_compact: keybind(\"<leader>c\", \"Compact the session\"),\n session_toggle_timestamps: keybind(\"none\", \"Toggle message timestamps\"),\n session_toggle_generic_tool_output: keybind(\"none\", \"Toggle generic tool output\"),\n session_queued_prompts: keybind(\"<leader>q\", \"Manage queued prompts\"),\n session_child_first: keybind(\"<leader>down\", \"Toggle subagent picker\"),\n session_child_cycle: keybind(\"right\", \"Go to next child session\"),\n session_child_cycle_reverse: keybind(\"left\", \"Go to previous child session\"),\n session_parent: keybind(\"up\", \"Go to parent session\"),\n session_pin_toggle: keybind(\"ctrl+f\", \"Pin or unpin session in the session list\"),\n session_quick_switch_1: keybind(\"<leader>1\", \"Switch to session in quick slot 1\"),\n session_quick_switch_2: keybind(\"<leader>2\", \"Switch to session in quick slot 2\"),\n session_quick_switch_3: keybind(\"<leader>3\", \"Switch to session in quick slot 3\"),\n session_quick_switch_4: keybind(\"<leader>4\", \"Switch to session in quick slot 4\"),\n session_quick_switch_5: keybind(\"<leader>5\", \"Switch to session in quick slot 5\"),\n session_quick_switch_6: keybind(\"<leader>6\", \"Switch to session in quick slot 6\"),\n session_quick_switch_7: keybind(\"<leader>7\", \"Switch to session in quick slot 7\"),\n session_quick_switch_8: keybind(\"<leader>8\", \"Switch to session in quick slot 8\"),\n session_quick_switch_9: keybind(\"<leader>9\", \"Switch to session in quick slot 9\"),\n\n stash_delete: keybind(\"ctrl+d\", \"Delete stash entry\"),\n model_provider_list: keybind(\"ctrl+a\", \"Open provider list from model dialog\"),\n model_favorite_toggle: keybind(\"ctrl+f\", \"Toggle model favorite status\"),\n model_list: keybind(\"<leader>m\", \"List available models\"),\n model_cycle_recent: keybind(\"f2\", \"Next recently used model\"),\n model_cycle_recent_reverse: keybind(\"shift+f2\", \"Previous recently used model\"),\n model_cycle_favorite: keybind(\"none\", \"Next favorite model\"),\n model_cycle_favorite_reverse: keybind(\"none\", \"Previous favorite model\"),\n mcp_list: keybind(\"none\", \"List MCP servers\"),\n provider_connect: keybind(\"none\", \"Connect integration\"),\n console_org_switch: keybind(\"none\", \"Switch console organization\"),\n agent_list: keybind(\"<leader>a\", \"List agents\"),\n agent_cycle: keybind(\"tab\", \"Next agent\"),\n agent_cycle_reverse: keybind(\"shift+tab\", \"Previous agent\"),\n variant_cycle: keybind(\"ctrl+t\", \"Cycle model variants\"),\n variant_list: keybind(\"none\", \"List model variants\"),\n\n messages_page_up: keybind(\"pageup,ctrl+alt+b\", \"Scroll messages up by one page\"),\n messages_page_down: keybind(\"pagedown,ctrl+alt+f\", \"Scroll messages down by one page\"),\n messages_line_up: keybind(\"ctrl+alt+y\", \"Scroll messages up by one line\"),\n messages_line_down: keybind(\"ctrl+alt+e\", \"Scroll messages down by one line\"),\n messages_half_page_up: keybind(\"ctrl+alt+u\", \"Scroll messages up by half page\"),\n messages_half_page_down: keybind(\"ctrl+alt+d\", \"Scroll messages down by half page\"),\n messages_first: keybind(\"ctrl+g,home\", \"Navigate to first message\"),\n messages_last: keybind(\"ctrl+alt+g,end\", \"Navigate to last message\"),\n messages_next: keybind(\"none\", \"Navigate to next message\"),\n messages_previous: keybind(\"none\", \"Navigate to previous message\"),\n messages_last_user: keybind(\"none\", \"Navigate to last user message\"),\n messages_copy: keybind(\"<leader>y\", \"Copy message\"),\n messages_undo: keybind(\"<leader>u\", \"Undo message\"),\n messages_redo: keybind(\"<leader>r\", \"Redo message\"),\n messages_toggle_conceal: keybind(\"<leader>h\", \"Toggle code block concealment in messages\"),\n tool_details: keybind(\"none\", \"Toggle tool details visibility\"),\n display_thinking: keybind(\"none\", \"Toggle thinking blocks visibility\"),\n\n prompt_submit: keybind(\"none\", \"Submit prompt\"),\n prompt_editor_context_clear: keybind(\"none\", \"Clear editor context\"),\n prompt_skills: keybind(\"none\", \"Open skill selector\"),\n prompt_stash: keybind(\"none\", \"Stash prompt\"),\n prompt_stash_pop: keybind(\"none\", \"Pop stashed prompt\"),\n prompt_stash_list: keybind(\"none\", \"List stashed prompts\"),\n workspace_set: keybind(\"none\", \"Set workspace\"),\n\n input_clear: keybind(\"ctrl+c\", \"Clear input field\"),\n input_paste: keybind({ key: \"ctrl+v\", preventDefault: false }, \"Paste from clipboard\"),\n input_submit: keybind(\"return\", \"Submit input\"),\n input_newline: keybind(\"shift+return,ctrl+return,alt+return,ctrl+j\", \"Insert newline in input\"),\n input_move_left: keybind(\"left,ctrl+b\", \"Move cursor left in input\"),\n input_move_right: keybind(\"right,ctrl+f\", \"Move cursor right in input\"),\n input_move_up: keybind(\"up\", \"Move cursor up in input\"),\n input_move_down: keybind(\"down\", \"Move cursor down in input\"),\n input_select_left: keybind(\"shift+left\", \"Select left in input\"),\n input_select_right: keybind(\"shift+right\", \"Select right in input\"),\n input_select_up: keybind(\"shift+up\", \"Select up in input\"),\n input_select_down: keybind(\"shift+down\", \"Select down in input\"),\n input_line_home: keybind(\"ctrl+a\", \"Move to start of line in input\"),\n input_line_end: keybind(\"ctrl+e\", \"Move to end of line in input\"),\n input_select_line_home: keybind(\"ctrl+shift+a\", \"Select to start of line in input\"),\n input_select_line_end: keybind(\"ctrl+shift+e\", \"Select to end of line in input\"),\n input_visual_line_home: keybind(\"alt+a\", \"Move to start of visual line in input\"),\n input_visual_line_end: keybind(\"alt+e\", \"Move to end of visual line in input\"),\n input_select_visual_line_home: keybind(\"alt+shift+a\", \"Select to start of visual line in input\"),\n input_select_visual_line_end: keybind(\"alt+shift+e\", \"Select to end of visual line in input\"),\n input_buffer_home: keybind(\"home\", \"Move to start of buffer in input\"),\n input_buffer_end: keybind(\"end\", \"Move to end of buffer in input\"),\n input_select_buffer_home: keybind(\"shift+home\", \"Select to start of buffer in input\"),\n input_select_buffer_end: keybind(\"shift+end\", \"Select to end of buffer in input\"),\n input_delete_line: keybind(\"ctrl+shift+d\", \"Delete line in input\"),\n input_delete_to_line_end: keybind(\"ctrl+k\", \"Delete to end of line in input\"),\n input_delete_to_line_start: keybind(\"ctrl+u\", \"Delete to start of line in input\"),\n input_backspace: keybind(\"backspace,shift+backspace\", \"Backspace in input\"),\n input_delete: keybind(\"ctrl+d,delete,shift+delete\", \"Delete character in input\"),\n input_undo: keybind(\"ctrl+-,super+z\", \"Undo in input\"),\n input_redo: keybind(\"ctrl+.,super+shift+z\", \"Redo in input\"),\n input_word_forward: keybind(\"alt+f,alt+right,ctrl+right\", \"Move word forward in input\"),\n input_word_backward: keybind(\"alt+b,alt+left,ctrl+left\", \"Move word backward in input\"),\n input_select_word_forward: keybind(\"alt+shift+f,alt+shift+right\", \"Select word forward in input\"),\n input_select_word_backward: keybind(\"alt+shift+b,alt+shift+left\", \"Select word backward in input\"),\n input_delete_word_forward: keybind(\"alt+d,alt+delete,ctrl+delete\", \"Delete word forward in input\"),\n input_delete_word_backward: keybind(\"ctrl+w,ctrl+backspace,alt+backspace\", \"Delete word backward in input\"),\n input_select_all: keybind(\"super+a\", \"Select all in input\"),\n history_previous: keybind(\"up\", \"Previous history item\"),\n history_next: keybind(\"down\", \"Next history item\"),\n\n \"dialog.select.prev\": keybind(\"up,ctrl+p\", \"Move to previous dialog item\"),\n \"dialog.select.next\": keybind(\"down,ctrl+n\", \"Move to next dialog item\"),\n \"dialog.select.page_up\": keybind(\"pageup\", \"Move up one page in dialog\"),\n \"dialog.select.page_down\": keybind(\"pagedown\", \"Move down one page in dialog\"),\n \"dialog.select.home\": keybind(\"home\", \"Move to first dialog item\"),\n \"dialog.select.end\": keybind(\"end\", \"Move to last dialog item\"),\n \"dialog.select.submit\": keybind(\"return\", \"Submit selected dialog item\"),\n \"dialog.prompt.submit\": keybind(\"return\", \"Submit dialog prompt\"),\n \"dialog.project_copy.generate\": keybind(\"tab\", \"Generate project copy name\"),\n \"dialog.mcp.toggle\": keybind(\"space\", \"Toggle MCP in MCP dialog\"),\n \"dialog.move_session.new\": keybind(\"ctrl+m\", \"New project copy\"),\n \"dialog.move_session.delete\": keybind(\"ctrl+d\", \"Delete project copy\"),\n \"dialog.move_session.refresh\": keybind(\"ctrl+r\", \"Refresh project copies\"),\n \"prompt.autocomplete.prev\": keybind(\"up,ctrl+p\", \"Move to previous autocomplete item\"),\n \"prompt.autocomplete.next\": keybind(\"down,ctrl+n\", \"Move to next autocomplete item\"),\n \"prompt.autocomplete.hide\": keybind(\"escape\", \"Hide autocomplete\"),\n \"prompt.autocomplete.select\": keybind(\"return\", \"Select autocomplete item\"),\n \"prompt.autocomplete.complete\": keybind(\"tab\", \"Complete autocomplete item\"),\n \"permission.prompt.fullscreen\": keybind(\"ctrl+f\", \"Toggle permission prompt fullscreen\"),\n \"plugins.toggle\": keybind(\"space\", \"Toggle plugin\"),\n \"dialog.plugins.install\": keybind(\"shift+i\", \"Install plugin from plugin dialog\"),\n\n terminal_suspend: keybind(\"ctrl+z\", \"Suspend terminal\"),\n terminal_title_toggle: keybind(\"none\", \"Toggle terminal title\"),\n tips_toggle: keybind(\"<leader>h\", \"Toggle tips on home screen\"),\n plugin_manager: keybind(\"none\", \"Open plugin manager dialog\"),\n plugin_install: keybind(\"none\", \"Install plugin\"),\n\n which_key_toggle: keybind(\"ctrl+alt+k\", \"Toggle which-key panel\"),\n which_key_layout_toggle: keybind(\"ctrl+alt+shift+k\", \"Switch which-key layout\"),\n which_key_pending_toggle: keybind(\"ctrl+alt+shift+p\", \"Toggle which-key pending preview\"),\n which_key_group_previous: keybind(\"ctrl+alt+left,ctrl+alt+[\", \"Previous which-key group\"),\n which_key_group_next: keybind(\"ctrl+alt+right,ctrl+alt+]\", \"Next which-key group\"),\n which_key_scroll_up: keybind(\"ctrl+alt+up,ctrl+alt+p\", \"Scroll which-key up\"),\n which_key_scroll_down: keybind(\"ctrl+alt+down,ctrl+alt+n\", \"Scroll which-key down\"),\n which_key_page_up: keybind(\"ctrl+alt+pageup\", \"Page which-key up\"),\n which_key_page_down: keybind(\"ctrl+alt+pagedown\", \"Page which-key down\"),\n which_key_home: keybind(\"ctrl+alt+home\", \"Jump to first which-key binding\"),\n which_key_end: keybind(\"ctrl+alt+end\", \"Jump to last which-key binding\"),\n} satisfies Record<string, Definition>\n\ntype KeybindName = keyof typeof Definitions\nconst KeybindNames = new Set<string>(Object.keys(Definitions))\n\nexport const KeybindOverrides = Schema.Struct(\n Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [\n name,\n Schema.optional(BindingValueSchema).annotate({ description: item.description }),\n ]),\n ),\n).annotate({ description: \"TUI keybinding overrides\" })\nexport const Descriptions = Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [name, item.description]),\n) as Record<KeybindName, string>\nexport const CommandMap = {\n app_exit: \"app.exit\",\n app_debug: \"app.debug\",\n app_console: \"app.console\",\n app_heap_snapshot: \"app.heap_snapshot\",\n app_toggle_animations: \"app.toggle.animations\",\n app_toggle_file_context: \"app.toggle.file_context\",\n app_toggle_diffwrap: \"app.toggle.diffwrap\",\n app_toggle_paste_summary: \"app.toggle.paste_summary\",\n app_toggle_session_directory_filter: \"app.toggle.session_directory_filter\",\n command_list: \"command.palette.show\",\n help_show: \"help.show\",\n docs_open: \"docs.open\",\n diff_open: \"diff.open\",\n diff_close: \"diff.close\",\n diff_toggle: \"diff.toggle\",\n diff_expand: \"diff.expand\",\n diff_expand_all: \"diff.expand_all\",\n diff_collapse: \"diff.collapse\",\n diff_switch_focus: \"diff.switch_focus\",\n diff_next_hunk: \"diff.next_hunk\",\n diff_previous_hunk: \"diff.previous_hunk\",\n diff_next_file: \"diff.next_file\",\n diff_previous_file: \"diff.previous_file\",\n diff_toggle_file_tree: \"diff.toggle_file_tree\",\n diff_single_patch: \"diff.single_patch\",\n diff_switch_source: \"diff.switch_source\",\n diff_toggle_view: \"diff.toggle_view\",\n diff_help: \"diff.help\",\n editor_open: \"prompt.editor\",\n theme_list: \"theme.switch\",\n theme_switch_mode: \"theme.switch_mode\",\n theme_mode_lock: \"theme.mode.lock\",\n sidebar_toggle: \"session.sidebar.toggle\",\n scrollbar_toggle: \"session.toggle.scrollbar\",\n status_view: \"opencode.status\",\n debug_view: \"opencode.debug\",\n session_export: \"session.export\",\n session_copy: \"session.copy\",\n session_move: \"session.move\",\n session_new: \"session.new\",\n session_list: \"session.list\",\n session_timeline: \"session.timeline\",\n session_fork: \"session.fork\",\n session_rename: \"session.rename\",\n session_delete: \"session.delete\",\n session_share: \"session.share\",\n session_unshare: \"session.unshare\",\n session_interrupt: \"session.interrupt\",\n session_background: \"session.background\",\n session_compact: \"session.compact\",\n session_toggle_timestamps: \"session.toggle.timestamps\",\n session_toggle_generic_tool_output: \"session.toggle.generic_tool_output\",\n session_queued_prompts: \"session.queued_prompts\",\n session_child_first: \"session.child.first\",\n session_child_cycle: \"session.child.next\",\n session_child_cycle_reverse: \"session.child.previous\",\n session_parent: \"session.parent\",\n session_pin_toggle: \"session.pin.toggle\",\n session_quick_switch_1: \"session.quick_switch.1\",\n session_quick_switch_2: \"session.quick_switch.2\",\n session_quick_switch_3: \"session.quick_switch.3\",\n session_quick_switch_4: \"session.quick_switch.4\",\n session_quick_switch_5: \"session.quick_switch.5\",\n session_quick_switch_6: \"session.quick_switch.6\",\n session_quick_switch_7: \"session.quick_switch.7\",\n session_quick_switch_8: \"session.quick_switch.8\",\n session_quick_switch_9: \"session.quick_switch.9\",\n stash_delete: \"stash.delete\",\n model_provider_list: \"model.dialog.provider\",\n model_favorite_toggle: \"model.dialog.favorite\",\n model_list: \"model.list\",\n model_cycle_recent: \"model.cycle_recent\",\n model_cycle_recent_reverse: \"model.cycle_recent_reverse\",\n model_cycle_favorite: \"model.cycle_favorite\",\n model_cycle_favorite_reverse: \"model.cycle_favorite_reverse\",\n mcp_list: \"mcp.list\",\n provider_connect: \"provider.connect\",\n console_org_switch: \"console.org.switch\",\n agent_list: \"agent.list\",\n agent_cycle: \"agent.cycle\",\n agent_cycle_reverse: \"agent.cycle.reverse\",\n variant_cycle: \"variant.cycle\",\n variant_list: \"variant.list\",\n messages_page_up: \"session.page.up\",\n messages_page_down: \"session.page.down\",\n messages_line_up: \"session.line.up\",\n messages_line_down: \"session.line.down\",\n messages_half_page_up: \"session.half.page.up\",\n messages_half_page_down: \"session.half.page.down\",\n messages_first: \"session.first\",\n messages_last: \"session.last\",\n messages_next: \"session.message.next\",\n messages_previous: \"session.message.previous\",\n messages_last_user: \"session.messages_last_user\",\n messages_copy: \"messages.copy\",\n messages_undo: \"session.undo\",\n messages_redo: \"session.redo\",\n messages_toggle_conceal: \"session.toggle.conceal\",\n tool_details: \"session.toggle.actions\",\n display_thinking: \"session.toggle.thinking\",\n prompt_submit: \"prompt.submit\",\n prompt_editor_context_clear: \"prompt.editor_context.clear\",\n prompt_skills: \"prompt.skills\",\n prompt_stash: \"prompt.stash\",\n prompt_stash_pop: \"prompt.stash.pop\",\n prompt_stash_list: \"prompt.stash.list\",\n workspace_set: \"workspace.set\",\n input_clear: \"prompt.clear\",\n input_paste: \"prompt.paste\",\n input_submit: \"input.submit\",\n input_newline: \"input.newline\",\n input_move_left: \"input.move.left\",\n input_move_right: \"input.move.right\",\n input_move_up: \"input.move.up\",\n input_move_down: \"input.move.down\",\n input_select_left: \"input.select.left\",\n input_select_right: \"input.select.right\",\n input_select_up: \"input.select.up\",\n input_select_down: \"input.select.down\",\n input_line_home: \"input.line.home\",\n input_line_end: \"input.line.end\",\n input_select_line_home: \"input.select.line.home\",\n input_select_line_end: \"input.select.line.end\",\n input_visual_line_home: \"input.visual.line.home\",\n input_visual_line_end: \"input.visual.line.end\",\n input_select_visual_line_home: \"input.select.visual.line.home\",\n input_select_visual_line_end: \"input.select.visual.line.end\",\n input_buffer_home: \"input.buffer.home\",\n input_buffer_end: \"input.buffer.end\",\n input_select_buffer_home: \"input.select.buffer.home\",\n input_select_buffer_end: \"input.select.buffer.end\",\n input_delete_line: \"input.delete.line\",\n input_delete_to_line_end: \"input.delete.to.line.end\",\n input_delete_to_line_start: \"input.delete.to.line.start\",\n input_backspace: \"input.backspace\",\n input_delete: \"input.delete\",\n input_undo: \"input.undo\",\n input_redo: \"input.redo\",\n input_word_forward: \"input.word.forward\",\n input_word_backward: \"input.word.backward\",\n input_select_word_forward: \"input.select.word.forward\",\n input_select_word_backward: \"input.select.word.backward\",\n input_delete_word_forward: \"input.delete.word.forward\",\n input_delete_word_backward: \"input.delete.word.backward\",\n input_select_all: \"input.select.all\",\n history_previous: \"prompt.history.previous\",\n history_next: \"prompt.history.next\",\n terminal_suspend: \"terminal.suspend\",\n terminal_title_toggle: \"terminal.title.toggle\",\n tips_toggle: \"tips.toggle\",\n plugin_manager: \"plugins.list\",\n plugin_install: \"plugins.install\",\n which_key_toggle: \"which-key.toggle\",\n which_key_layout_toggle: \"which-key.layout.toggle\",\n which_key_pending_toggle: \"which-key.pending.toggle\",\n which_key_group_previous: \"which-key.group.previous\",\n which_key_group_next: \"which-key.group.next\",\n which_key_scroll_up: \"which-key.scroll.up\",\n which_key_scroll_down: \"which-key.scroll.down\",\n which_key_page_up: \"which-key.page.up\",\n which_key_page_down: \"which-key.page.down\",\n which_key_home: \"which-key.home\",\n which_key_end: \"which-key.end\",\n} satisfies BindingCommandMap\nconst CommandDescriptions = Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [\n CommandMap[name as keyof typeof CommandMap] ?? name,\n item.description,\n ]),\n) as Record<string, string>\n\nexport type Keybinds = { [K in KeybindName]: BindingValueSchema }\nexport type KeybindOverrides = Partial<Keybinds>\nexport type BindingLookupView = {\n readonly bindings: readonly Binding<Renderable, KeyEvent>[]\n get(command: string): readonly Binding<Renderable, KeyEvent>[]\n has(command: string): boolean\n gather(name: string, commands: readonly string[]): readonly Binding<Renderable, KeyEvent>[]\n pick(name: string, commands: readonly string[]): Binding<Renderable, KeyEvent>[]\n omit(name: string, commands: readonly string[]): Binding<Renderable, KeyEvent>[]\n}\n\nexport function toBindingConfig(keybinds: Keybinds): BindingConfig<Renderable, KeyEvent> {\n return Object.fromEntries(Object.entries(keybinds)) as BindingConfig<Renderable, KeyEvent>\n}\n\nconst decodeBindingValue = Schema.decodeUnknownSync(BindingValueSchema)\n\nexport function defaultValue(name: KeybindName) {\n return Definitions[name].default\n}\n\nexport function parse(keybinds: KeybindOverrides): Keybinds {\n const invalid = unknownKeys(keybinds)\n if (invalid.length) throw new Error(`Unrecognized keybind${invalid.length === 1 ? \"\" : \"s\"}: ${invalid.join(\", \")}`)\n return Object.fromEntries(\n Object.entries(Definitions).map(([name, item]) => [\n name,\n decodeBindingValue(keybinds[name as KeybindName] ?? item.default),\n ]),\n ) as Keybinds\n}\n\nexport const Keybinds = { parse }\n\nexport function unknownKeys(input: object) {\n return Object.keys(input).filter((key) => !KeybindNames.has(key))\n}\n\nexport function bindingDefaults(): BindingDefaults<Renderable, KeyEvent> {\n return ({ command, binding }) => {\n if (binding.desc !== undefined) return\n return { desc: CommandDescriptions[command] }\n }\n}\n",
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nexport * as TuiConfig from \".\";\nimport { createBindingLookup } from \"@opentui/keymap/extras\";\nimport { Schema } from \"effect\";\nimport { createContext, useContext } from \"solid-js\";\nimport { TuiKeybind } from \"./keybind\";\nexport const AttentionSoundName = Schema.Literals([\"default\", \"question\", \"permission\", \"error\", \"done\", \"subagent_done\"]);\nexport const PluginOptions = Schema.Record(Schema.String, Schema.Unknown);\nexport const PluginSpec = Schema.Union([Schema.String, Schema.mutable(Schema.Tuple([Schema.String, PluginOptions]))]);\nexport const LeaderTimeoutDefault = 2000;\nexport const LeaderTimeout = Schema.Int.check(Schema.isGreaterThan(0)).annotate({\n description: \"Leader key timeout in milliseconds\"\n});\nexport const ScrollSpeed = Schema.Number.check(Schema.isGreaterThanOrEqualTo(0.001));\nexport const ScrollAcceleration = Schema.Struct({\n enabled: Schema.Boolean.annotate({\n description: \"Enable scroll acceleration\"\n })\n}).annotate({\n description: \"Scroll acceleration settings\"\n});\nexport const DiffStyle = Schema.Literals([\"auto\", \"stacked\"]).annotate({\n description: \"Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column\"\n});\nexport const AttentionSounds = Schema.Record(AttentionSoundName, Schema.optionalKey(Schema.String));\nexport const Attention = Schema.Struct({\n enabled: Schema.optional(Schema.Boolean),\n notifications: Schema.optional(Schema.Boolean),\n sound: Schema.optional(Schema.Boolean),\n volume: Schema.optional(Schema.Number.check(Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(1))),\n sound_pack: Schema.optional(Schema.String),\n sounds: Schema.optional(AttentionSounds)\n}).annotate({\n description: \"Attention notification and sound settings\"\n});\nconst PromptSize = Schema.Int.check(Schema.isGreaterThan(0));\nexport const Prompt = Schema.Struct({\n max_height: Schema.optional(PromptSize).annotate({\n description: \"Prompt textarea max height\"\n }),\n max_width: Schema.optional(Schema.Union([PromptSize, Schema.Literal(\"auto\")])).annotate({\n description: \"Home prompt max width: a positive integer for a fixed cap, or 'auto' to scale with terminal width\"\n })\n}).annotate({\n description: \"Prompt size settings\"\n});\nexport const Info = Schema.Struct({\n $schema: Schema.optional(Schema.String),\n theme: Schema.optional(Schema.String),\n keybinds: Schema.optional(TuiKeybind.KeybindOverrides),\n plugin: Schema.optional(Schema.Array(PluginSpec)),\n plugin_enabled: Schema.optional(Schema.Record(Schema.String, Schema.Boolean)),\n leader_timeout: Schema.optional(LeaderTimeout),\n attention: Schema.optional(Attention),\n prompt: Schema.optional(Prompt),\n scroll_speed: Schema.optional(ScrollSpeed).annotate({\n description: \"TUI scroll speed\"\n }),\n scroll_acceleration: Schema.optional(ScrollAcceleration),\n diff_style: Schema.optional(DiffStyle),\n mouse: Schema.optional(Schema.Boolean).annotate({\n description: \"Enable or disable mouse capture (default: true)\"\n })\n});\nexport const ResolveOptions = Schema.Struct({\n terminalSuspend: Schema.Boolean\n});\nexport function resolve(input, options) {\n const keybinds = {\n ...input.keybinds\n };\n if (!options.terminalSuspend) {\n keybinds.terminal_suspend = \"none\";\n if (keybinds.input_undo === undefined) {\n const inputUndo = TuiKeybind.defaultValue(\"input_undo\");\n keybinds.input_undo = [\"ctrl+z\", ...(typeof inputUndo === \"string\" ? inputUndo.split(\",\") : [])].filter((value, index, values) => values.indexOf(value) === index).join(\",\");\n }\n }\n return {\n ...input,\n attention: {\n enabled: input.attention?.enabled ?? false,\n notifications: input.attention?.notifications ?? true,\n sound: input.attention?.sound ?? true,\n volume: input.attention?.volume ?? 0.4,\n sound_pack: input.attention?.sound_pack ?? \"opencode.default\",\n sounds: input.attention?.sounds ?? {}\n },\n keybinds: createBindingLookup(TuiKeybind.toBindingConfig(TuiKeybind.parse(keybinds)), {\n commandMap: TuiKeybind.CommandMap,\n bindingDefaults: TuiKeybind.bindingDefaults()\n }),\n leader_timeout: input.leader_timeout ?? LeaderTimeoutDefault,\n mouse: input.mouse ?? true\n };\n}\nconst ConfigContext = createContext();\nexport function TuiConfigProvider(props) {\n return _$createComponent(ConfigContext.Provider, {\n get value() {\n return props.config;\n },\n get children() {\n return props.children;\n }\n });\n}\nexport function useTuiConfig() {\n const value = useContext(ConfigContext);\n if (!value) throw new Error(\"TuiConfigProvider is missing\");\n return value;\n}"
],
"mappings": "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",
"debugId": "D3C0B14AEBE6980864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/restart.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";moBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,MAAM,CAAO,EAC9C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "3593438C17FF91FC64756E2164756E21",
"names": []
}

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

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

{
"version": 3,
"sources": ["src/commands/handlers/service/start.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/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.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.start(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";moBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,MAAM,MAAO,EAAc,QAAQ,CAAC,EACrE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "9A2890B350262C9264756E2164756E21",
"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 } from \"@opencode-ai/client/effect\"\nimport { Server } from \"../../services/server\"\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* Server.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(\n endpoint: Service.Endpoint,\n input: readonly string[],\n params: Record<string, string>,\n) {\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": ";qkCAAA,mBAAS,gBAOT,SAAM,OAAU,SAAI,SAAI,MAAC,cAAU,WAAO,YAAQ,eAAW,aAAS,YAAQ,UAAK,MAAC,OAUrE,SAAQ,aACrB,OAAS,cAAS,SAClB,OAAO,QAAG,cAAS,OAAE,cAAU,MAAC,OAAO,MAMrC,IAAM,GALS,MAAO,EAAO,QAAQ,CACnC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,WAClB,SAAU,QACZ,CAAC,GACuB,SAClB,EAAS,EAAO,UAAU,EAAM,MAAO,KAAO,CAAC,EAAE,EACjD,EAAU,MAAO,EAAe,EAAU,EAAM,QAAS,CAAM,EAC/D,EAAU,IAAI,QAAQ,EAAQ,QAAQ,CAAQ,CAAC,EACrD,QAAW,KAAU,EAAM,OAAQ,CACjC,IAAM,EAAQ,EAAO,QAAQ,GAAG,EAChC,GAAI,EAAQ,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,wCAAwC,GAAQ,CAAC,EACpG,EAAQ,IAAI,EAAO,MAAM,EAAG,CAAK,EAAE,KAAK,EAAG,EAAO,MAAM,EAAQ,CAAC,EAAE,KAAK,CAAC,EAE3E,IAAM,EAAO,EAAO,eAAe,EAAM,IAAI,EAC7C,GAAI,IAAS,QAAa,CAAC,EAAQ,IAAI,cAAc,EAAG,EAAQ,IAAI,eAAgB,kBAAkB,EAEtG,IAAM,EAAW,MAAO,EAAO,WAAW,IACxC,MAAM,IAAI,IAAI,EAAQ,KAAM,EAAS,GAAG,EAAG,CACzC,OAAQ,EAAQ,OAChB,UACA,MACF,CAAC,CACH,EACM,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAS,KAAK,CAAC,EAC1D,GAAI,EAAQ,QAAQ,OAAO,MAAM,GAAU,EAAO,SAAS,CAAG,EAAI,GAAK,EAAI,EAC5E,CACH,EAEO,SAAS,CAAgB,CAAC,EAAe,EAAqB,EAAgC,CACnG,QAAY,EAAM,KAAe,OAAO,QAAQ,EAAK,OAAS,CAAC,CAAC,EAC9D,QAAY,EAAQ,KAAc,OAAO,QAAQ,CAAU,EAAG,CAC5D,GAAI,CAAC,EAAQ,IAAI,CAAM,GAAK,EAAU,cAAgB,EAAa,SACnE,MAAO,CAAE,OAAQ,EAAO,YAAY,EAAG,KAAM,EAAY,EAAM,CAAM,CAAE,EAG3E,MAAU,MAAM,wBAAwB,GAAa,EAGhD,SAAS,CAAU,CAAC,EAA0B,CACnD,GAAI,EAAM,SAAW,GAAK,CAAC,EAAQ,IAAI,EAAM,GAAG,YAAY,CAAC,GAAK,CAAC,EAAM,GAAG,WAAW,GAAG,EAAG,OAC7F,MAAO,CAAE,OAAQ,EAAM,GAAG,YAAY,EAAG,KAAM,EAAM,EAAG,EAG1D,SAAS,CAAc,CACrB,EACA,EACA,EACA,CACA,IAAM,EAAM,EAAW,CAAK,EAC5B,GAAI,EAAK,OAAO,EAAO,QAAQ,CAAG,EAClC,GAAI,EAAM,SAAW,EAAG,OAAO,EAAO,KAAS,MAAM,uDAAuD,CAAC,EAC7G,OAAO,EAAO,WAAW,SAAY,CACnC,IAAM,EAAW,MAAM,MAAM,IAAI,IAAI,gBAAiB,EAAS,GAAG,EAAG,CAAE,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC3G,GAAI,CAAC,EAAS,GAAI,MAAU,MAAM,yCAAyC,EAAS,QAAQ,EAC5F,OAAO,EAAkB,MAAM,EAAS,KAAK,EAAe,EAAM,GAAI,CAAM,EAC7E,EAGH,SAAS,CAAW,CAAC,EAAc,EAAgC,CACjE,IAAM,EAAO,IAAI,IACX,EAAW,EAAK,WAAW,eAAgB,CAAC,EAAG,IAAiB,CACpE,IAAM,EAAQ,EAAO,GACrB,GAAI,IAAU,OAAW,MAAU,MAAM,2BAA2B,GAAM,EAE1E,OADA,EAAK,IAAI,CAAI,EACN,mBAAmB,CAAK,EAChC,EACK,EAAQ,IAAI,gBAAgB,OAAO,QAAQ,CAAM,EAAE,OAAO,EAAE,KAAU,CAAC,EAAK,IAAI,CAAI,CAAC,CAAC,EAAE,SAAS,EACvG,OAAO,EAAQ,GAAG,KAAY,IAAU",
"debugId": "765493D47A52B97264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/auth.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n createOpencodeClient,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpencodeClient,\n} from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ 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.v2.integration.connect.oauth({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data?.data\n if (!attempt) return yield* Effect.fail(new Error(started.error?.message ?? \"Failed to start OAuth attempt\"))\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, 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 attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const response = yield* Effect.promise(() => client.v2.integration.attempt.status({ attemptID, location }))\n const status = response.data?.data\n if (!status || status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, attemptID)\n }\n return status\n })\n"
],
"mappings": ";guBAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,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,EAEzG,IAAM,EAAU,MAAO,EAAO,QAAQ,IACpC,EAAO,GAAG,YAAY,QAAQ,MAAM,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAClH,EACM,EAAU,EAAQ,MAAM,KAC9B,GAAI,CAAC,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,EAAQ,OAAO,SAAW,+BAA+B,CAAC,EAC5G,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,EAAQ,SAAS,EACpD,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,IAEA,EAAO,IAAI,SAAU,EAAG,CAEtB,IAAM,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,YAAY,QAAQ,OAAO,CAAE,YAAW,UAAS,CAAC,CAAC,GAClF,MAAM,KAC9B,GAAI,CAAC,GAAU,EAAO,SAAW,UAE/B,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,CAAS,EAEtC,OAAO,EACR",
"debugId": "25A3631140B01A3764756E2164756E21",
"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": ";snBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,MAAO,EAAc,MAAM,EAAM,GAAG,EACrC,CACH",
"debugId": "BA8B3133EBAA814D64756E2164756E21",
"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/mini.ts"],
"sourcesContent": [
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Server } from \"../../services/server\"\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* Server.resolve({ server: serverURL, standalone: input.standalone })\n yield* Effect.promise(() =>\n runMini({\n server,\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,MAAC,OACxD,SAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAO,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EACxF,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,SACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,IACd,CAAC,CACH,EACD,CACH",
"debugId": "7640E4873DCD374264756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["../core/src/image/photon.ts"],
"sourcesContent": [
"// @ts-ignore Bun's static file import is embedded by `bun build --compile`; some consumers also declare *.wasm.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n"
],
"mappings": ";yvBAGA,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF",
"debugId": "A3C9808554D97F6064756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/run.ts"],
"sourcesContent": [
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Server } from \"../../services/server\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../mini\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* Server.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo,\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OACxE,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,OACxC,OAAS,WAAO,EAAO,QAAQ,CACnC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH",
"debugId": "2EB2F70852B63EDE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../../node_modules/.bun/@opentui+keymap@0.4.3+aeceedea454d57be/node_modules/@opentui/keymap/src/opentui.js", "../tui/src/util/session.ts", "../tui/src/logo.ts"],
"sourcesContent": [
"// @bun\nimport\"../chunks/index-p35cyhc4.js\";\n\n// src/opentui.ts\nimport { CliRenderEvents, KeyEvent, RenderableEvents } from \"@opentui/core\";\nimport { Keymap } from \"@opentui/keymap\";\nimport { registerDefaultKeys, registerEnabledFields, registerMetadataFields } from \"@opentui/keymap/addons\";\nfunction createSyntheticCommandEvent() {\n return new KeyEvent({\n name: \"command\",\n ctrl: false,\n meta: false,\n shift: false,\n option: false,\n sequence: \"\",\n number: false,\n raw: \"\",\n eventType: \"press\",\n source: \"raw\"\n });\n}\nfunction normalizeRuntimePlatform(platform) {\n if (platform === \"darwin\") {\n return \"macos\";\n }\n if (platform === \"win32\") {\n return \"windows\";\n }\n if (platform === \"linux\") {\n return \"linux\";\n }\n return \"unknown\";\n}\nfunction createOpenTuiHostMetadata(renderer) {\n const platform = normalizeRuntimePlatform(process.platform);\n const hasKittyKeyboard = renderer.capabilities?.kitty_keyboard === true;\n return {\n platform,\n primaryModifier: platform === \"macos\" ? \"super\" : platform === \"unknown\" ? \"unknown\" : \"ctrl\",\n modifiers: {\n ctrl: \"supported\",\n shift: \"supported\",\n meta: \"supported\",\n super: hasKittyKeyboard ? \"supported\" : \"unknown\",\n hyper: hasKittyKeyboard ? \"supported\" : \"unknown\"\n }\n };\n}\nfunction createOpenTuiKeymapHost(renderer) {\n return {\n get metadata() {\n return createOpenTuiHostMetadata(renderer);\n },\n rootTarget: renderer.root,\n get isDestroyed() {\n return renderer.isDestroyed;\n },\n getFocusedTarget() {\n const focused = renderer.currentFocusedRenderable;\n if (!focused || focused.isDestroyed || !focused.focused) {\n return null;\n }\n return focused;\n },\n getParentTarget(target) {\n return target.parent;\n },\n isTargetDestroyed(target) {\n return target.isDestroyed;\n },\n onKeyPress(listener) {\n renderer.keyInput.prependListener(\"keypress\", listener);\n return () => {\n renderer.keyInput.off(\"keypress\", listener);\n };\n },\n onKeyRelease(listener) {\n renderer.keyInput.prependListener(\"keyrelease\", listener);\n return () => {\n renderer.keyInput.off(\"keyrelease\", listener);\n };\n },\n onFocusChange(listener) {\n renderer.on(CliRenderEvents.FOCUSED_RENDERABLE, listener);\n return () => {\n renderer.off(CliRenderEvents.FOCUSED_RENDERABLE, listener);\n };\n },\n onDestroy(listener) {\n renderer.once(CliRenderEvents.DESTROY, listener);\n return () => {\n renderer.off(CliRenderEvents.DESTROY, listener);\n };\n },\n onTargetDestroy(target, listener) {\n target.once(RenderableEvents.DESTROYED, listener);\n return () => {\n target.off(RenderableEvents.DESTROYED, listener);\n };\n },\n onRawInput(listener) {\n renderer.prependInputHandler(listener);\n return () => {\n renderer.removeInputHandler(listener);\n };\n },\n createCommandEvent() {\n return createSyntheticCommandEvent();\n }\n };\n}\nfunction createOpenTuiKeymap(renderer) {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot create a keymap for a destroyed renderer\");\n }\n return new Keymap(createOpenTuiKeymapHost(renderer));\n}\nfunction createDefaultOpenTuiKeymap(renderer) {\n if (renderer.isDestroyed) {\n throw new Error(\"Cannot create a keymap for a destroyed renderer\");\n }\n const keymap = new Keymap(createOpenTuiKeymapHost(renderer));\n registerDefaultKeys(keymap);\n registerEnabledFields(keymap);\n registerMetadataFields(keymap);\n return keymap;\n}\nexport {\n createOpenTuiKeymapHost,\n createOpenTuiKeymap,\n createDefaultOpenTuiKeymap\n};\n\n//# debugId=3536CBBE2B01723A64756E2164756E21\n//# sourceMappingURL=opentui.js.map\n",
"import type { SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/sdk/v2\"\n\nexport function isDefaultTitle(title: string) {\n return /^(New session - |Child session - )\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(title)\n}\n\nexport function lastAssistantWithUsage(messages: ReadonlyArray<SessionMessageInfo>, boundary?: string) {\n const boundaryIndex = boundary ? messages.findIndex((message) => message.id === boundary) : -1\n if (boundary && boundaryIndex === -1) return undefined\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && (boundaryIndex === -1 || index < boundaryIndex),\n )\n}\n",
"export const logo = {\n left: [\" \", \"█▀▀█ █▀▀█ █▀▀█ █▀▀▄\", \"█__█ █__█ █^^^ █__█\", \"▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀\"],\n right: [\" ▄ \", \"█▀▀▀ █▀▀█ █▀▀█ █▀▀█\", \"█___ █__█ █__█ █^^^\", \"▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀\"],\n}\n\nexport const go = {\n left: [\" \", \"█▀▀▀\", \"█_^█\", \"▀▀▀▀\"],\n right: [\" \", \"█▀▀█\", \"█__█\", \"▀▀▀▀\"],\n}\n\nexport const marks = \"_^~,\"\n"
],
"mappings": "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",
"debugId": "6E060562FDC2086964756E2164756E21",
"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\"\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 found = yield* Service.discover(yield* ServiceConfig.options())\n process.stdout.write((found ? found.url : \"stopped\") + EOL)\n }),\n)\n"
],
"mappings": ";moBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,CAC3C,IAAM,EAAQ,MAAO,EAAQ,SAAS,MAAO,EAAc,QAAQ,CAAC,EACpE,QAAQ,OAAO,OAAO,EAAQ,EAAM,IAAM,WAAa,CAAG,EAC3D,CACH",
"debugId": "CD40A788604694A464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/stop.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/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.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n"
],
"mappings": ";moBAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "86FADC54793CFCFE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? Global.Path.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nasync 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 (await Bun.file(candidate).exists()) return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const file = Bun.file(configPath)\n const text = (await file.exists()) ? await file.text() : \"{}\"\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await Bun.write(configPath, applyEdits(text, edits))\n}\n"
],
"mappings": ";ucAAA,mBAAS,gBACT,yBAOA,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,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,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAe,CAAiB,CAAC,EAAmB,CAClD,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,GAAI,MAAM,IAAI,KAAK,CAAS,EAAE,OAAO,EAAG,OAAO,EAEjD,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,IAAI,KAAK,CAAU,EAC1B,EAAQ,MAAM,EAAK,OAAO,EAAK,MAAM,EAAK,KAAK,EAAI,KACnD,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,IAAI,MAAM,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "A193A710D86097CA64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data?.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";krBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC3F,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC7G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,MAAM,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EAC/D,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "FB6EAC469FFF99D764756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/migrate.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n"
],
"mappings": ";6ZAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,uBAAuB,CAAC",
"debugId": "D055A053D94E579864756E2164756E21",
"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\"\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.start(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n"
],
"mappings": ";guBAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,EAAQ,MAAM,MAAO,EAAc,QAAQ,CAAC,EAC9D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH",
"debugId": "68986A53DFA8367A64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/mini/variant.shared.ts", "src/mini/session.shared.ts", "src/mini/theme.ts"],
"sourcesContent": [
"// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > saved preference > session history.\n//\n// The saved variant persists across sessions in ~/.local/state/opencode/model.json\n// so your last-used variant sticks. Cycling (ctrl+t) updates both the active\n// variant and the persisted file.\nimport path from \"path\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { makeGlobalNode } from \"@opencode-ai/core/effect/app-node\"\nimport { makeRuntime } from \"@opencode-ai/core/effect/runtime\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\n\nconst MODEL_FILE = path.join(Global.Path.state, \"model.json\")\n\ntype ModelState = Record<string, unknown> & {\n variant?: Record<string, string | undefined>\n}\ntype VariantService = {\n readonly resolveSavedVariant: (model: RunInput[\"model\"]) => Effect.Effect<string | undefined>\n readonly saveVariant: (model: RunInput[\"model\"], variant: string | undefined) => Effect.Effect<void>\n}\ntype VariantRuntime = {\n resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined>\n saveVariant(model: RunInput[\"model\"], variant: string | undefined): Promise<void>\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n\nclass Service extends Context.Service<Service, VariantService>()(\"@opencode/RunVariant\") {}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction variantKey(model: NonNullable<RunInput[\"model\"]>): string {\n return modelKey(model.providerID, model.modelID)\n}\n\nexport function modelInfo(providers: RunProvider[] | undefined, model: NonNullable<RunInput[\"model\"]>) {\n const provider = providers?.find((item) => item.id === model.providerID)\n return {\n provider: provider?.name ?? model.providerID,\n model: provider?.models[model.modelID]?.name ?? model.modelID,\n }\n}\n\nexport function formatModelLabel(\n model: NonNullable<RunInput[\"model\"]>,\n variant: string | undefined,\n providers?: RunProvider[],\n): string {\n const names = modelInfo(providers, model)\n const label = variant ? ` · ${variant}` : \"\"\n return `${names.model} · ${names.provider}${label}`\n}\n\nexport function cycleVariant(current: string | undefined, variants: string[]): string | undefined {\n if (variants.length === 0) {\n return undefined\n }\n\n if (!current) {\n return variants[0]\n }\n\n const idx = variants.indexOf(current)\n if (idx === -1 || idx === variants.length - 1) {\n return undefined\n }\n\n return variants[idx + 1]\n}\n\nexport function pickVariant(model: RunInput[\"model\"], input: RunSession | SessionMessages): string | undefined {\n return sessionVariant(Array.isArray(input) ? createSession(input) : input, model)\n}\n\nfunction fitVariant(value: string | undefined, variants: string[]): string | undefined {\n if (!value) {\n return undefined\n }\n\n if (variants.length === 0 || variants.includes(value)) {\n return value\n }\n\n return undefined\n}\n\n// Picks the active variant. CLI flag wins, then saved preference, then session\n// history. fitVariant() checks saved and session values against the available\n// variants list -- if the provider doesn't offer a variant, it drops.\nexport function resolveVariant(\n input: string | undefined,\n session: string | undefined,\n saved: string | undefined,\n variants: string[],\n): string | undefined {\n if (input !== undefined) {\n return input\n }\n\n const fallback = fitVariant(saved, variants)\n const current = fitVariant(session, variants)\n if (current !== undefined) {\n return current\n }\n\n return fallback\n}\n\nfunction state(value: unknown): ModelState {\n if (!isRecord(value)) {\n return {}\n }\n\n const variant = isRecord(value.variant)\n ? Object.fromEntries(\n Object.entries(value.variant).flatMap(([key, item]) => {\n if (typeof item !== \"string\") {\n return []\n }\n\n return [[key, item] as const]\n }),\n )\n : undefined\n\n return {\n ...value,\n variant,\n }\n}\n\nconst layer = Layer.fresh(\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const file = yield* FSUtil.Service\n\n const read = Effect.fn(\"RunVariant.read\")(function* () {\n return yield* file.readJson(MODEL_FILE).pipe(\n Effect.map(state),\n Effect.catchCause(() => Effect.succeed(state(undefined))),\n )\n })\n\n const resolveSavedVariant = Effect.fn(\"RunVariant.resolveSavedVariant\")(function* (model: RunInput[\"model\"]) {\n if (!model) {\n return undefined\n }\n\n return (yield* read()).variant?.[variantKey(model)]\n })\n\n const saveVariant = Effect.fn(\"RunVariant.saveVariant\")(function* (\n model: RunInput[\"model\"],\n variant: string | undefined,\n ) {\n if (!model) {\n return\n }\n\n const current = yield* read()\n const next = {\n ...current.variant,\n }\n const key = variantKey(model)\n if (variant) {\n next[key] = variant\n }\n\n if (!variant) {\n delete next[key]\n }\n\n yield* file\n .writeJson(MODEL_FILE, {\n ...current,\n variant: next,\n })\n .pipe(Effect.orElseSucceed(() => undefined))\n })\n\n return Service.of({\n resolveSavedVariant,\n saveVariant,\n })\n }),\n ),\n)\n\nconst node = makeGlobalNode({ service: Service, layer, deps: [FSUtil.node] })\n\n/** @internal Exported for testing. */\nexport function createVariantRuntime(replacements?: readonly LayerNode.Replacement[]): VariantRuntime {\n const runtime = makeRuntime(Service, AppNodeBuilder.build(node, replacements))\n return {\n resolveSavedVariant: (model) => runtime.runPromise((svc) => svc.resolveSavedVariant(model)).catch(() => undefined),\n saveVariant: (model, variant) => runtime.runPromise((svc) => svc.saveVariant(model, variant)).catch(() => {}),\n }\n}\n\nconst runtime = createVariantRuntime()\n\nexport async function resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined> {\n return runtime.resolveSavedVariant(model)\n}\n\nexport function saveVariant(model: RunInput[\"model\"], variant: string | undefined): void {\n void runtime.saveVariant(model, variant)\n}\n",
"// Session message extraction and prompt history.\n//\n// Fetches session messages from the SDK and extracts user turn text for\n// the prompt history ring. Also finds the most recently used variant for\n// the current model so the footer can pre-select it.\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { Message, Part } from \"@opencode-ai/sdk/v2\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = Array<{ info: Message; parts: Part[] }>\n\ntype Turn = {\n prompt: RunPrompt\n provider: string | undefined\n model: string | undefined\n variant: string | undefined\n}\n\nexport type RunSession = {\n first: boolean\n turns: Turn[]\n model?: NonNullable<RunInput[\"model\"]>\n variant?: string\n}\n\nfunction fileName(url: string, filename?: string) {\n if (filename) {\n return filename\n }\n\n try {\n const next = new URL(url)\n if (next.protocol !== \"file:\") {\n return url\n }\n\n const name = next.pathname.split(\"/\").at(-1)\n if (name) {\n return decodeURIComponent(name)\n }\n } catch {}\n\n return url\n}\n\nfunction fileSource(\n part: Extract<SessionMessages[number][\"parts\"][number], { type: \"file\" }>,\n text: { start: number; end: number; value: string },\n) {\n if (part.source) {\n return {\n ...structuredClone(part.source),\n text,\n }\n }\n\n return {\n type: \"file\" as const,\n path: part.filename ?? part.url,\n text,\n }\n}\n\nexport function messagePrompt(msg: SessionMessages[number]): RunPrompt {\n const parts: RunPrompt[\"parts\"] = []\n let text = msg.parts\n .filter((part): part is Extract<SessionMessages[number][\"parts\"][number], { type: \"text\" }> => {\n return part.type === \"text\" && !part.synthetic\n })\n .map((part) => part.text)\n .join(\"\")\n let cursor = Bun.stringWidth(text)\n const used: Array<{ start: number; end: number }> = []\n\n const take = (value: string): { start: number; end: number; value: string } | undefined => {\n let from = 0\n while (true) {\n const idx = text.indexOf(value, from)\n if (idx === -1) {\n return undefined\n }\n\n const start = Bun.stringWidth(text.slice(0, idx))\n const end = start + Bun.stringWidth(value)\n if (!used.some((item) => item.start < end && start < item.end)) {\n return { start, end, value }\n }\n\n from = idx + value.length\n }\n }\n\n const add = (value: string) => {\n const gap = text ? \" \" : \"\"\n const start = cursor + Bun.stringWidth(gap)\n text += gap + value\n const end = start + Bun.stringWidth(value)\n cursor = end\n return { start, end, value }\n }\n\n for (const part of msg.parts) {\n if (part.type === \"file\") {\n const next = part.source?.text ? structuredClone(part.source.text) : take(\"@\" + fileName(part.url, part.filename))\n const span = next ?? add(\"@\" + fileName(part.url, part.filename))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"file\",\n mime: part.mime,\n filename: part.filename,\n url: part.url,\n source: fileSource(part, span),\n })\n continue\n }\n\n if (part.type !== \"agent\") {\n continue\n }\n\n const span = part.source ? structuredClone(part.source) : (take(\"@\" + part.name) ?? add(\"@\" + part.name))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"agent\",\n name: part.name,\n source: span,\n })\n }\n\n return { text, parts }\n}\n\nfunction turn(msg: SessionMessages[number]): Turn | undefined {\n if (msg.info.role !== \"user\") {\n return undefined\n }\n\n return {\n prompt: messagePrompt(msg),\n provider: msg.info.model.providerID,\n model: msg.info.model.modelID,\n variant: msg.info.model.variant,\n }\n}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((msg) => {\n const item = turn(msg)\n return item ? [item] : []\n }),\n }\n}\n\nexport async function resolveCurrentSession(\n sdk: RunInput[\"sdk\"],\n sessionID: string,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }),\n sdk.session.get({ sessionID }),\n ])\n const messages = response.data.toReversed()\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) => {\n if (message.type !== \"user\") return []\n return [\n {\n prompt: {\n text: message.text,\n parts: [\n ...(message.files ?? []).map((file) => ({\n type: \"file\" as const,\n url: file.source.type === \"uri\" ? file.source.uri : `data:${file.mime};base64,${file.data}`,\n mime: file.mime,\n filename: file.name,\n source: file.mention\n ? {\n type: \"file\" as const,\n path: file.name ?? (file.source.type === \"uri\" ? file.source.uri : \"inline attachment\"),\n text: { start: file.mention.start, end: file.mention.end, value: file.mention.text },\n }\n : undefined,\n })),\n ...(message.agents ?? []).map((agent) => ({\n type: \"agent\" as const,\n name: agent.name,\n source: agent.mention\n ? { start: agent.mention.start, end: agent.mention.end, value: agent.mention.text }\n : undefined,\n })),\n ],\n },\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n },\n ]\n }),\n ...(session.model && {\n model: {\n providerID: session.model.providerID,\n modelID: session.model.id,\n },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n const out: RunPrompt[] = []\n\n for (const turn of session.turns) {\n if (!turn.prompt.text.trim()) {\n continue\n }\n\n if (out[out.length - 1] && promptSame(out[out.length - 1], turn.prompt)) {\n continue\n }\n\n out.push(promptCopy(turn.prompt))\n }\n\n return out.slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) {\n return undefined\n }\n\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) {\n return session.variant\n }\n\n for (let idx = session.turns.length - 1; idx >= 0; idx -= 1) {\n const turn = session.turns[idx]\n if (turn.provider !== model.providerID || turn.model !== model.modelID) {\n continue\n }\n\n return turn.variant\n }\n\n return undefined\n}\n",
"// Theme resolution for direct interactive mode.\n//\n// Derives scrollback and footer colors from the terminal's actual palette.\n// resolveRunTheme() queries the renderer for the terminal's palette,\n// detects dark/light mode, builds a small system theme locally, and maps it to\n// the run footer + scrollback color model. Falls back to a hardcoded dark-mode\n// palette if detection fails.\nimport { RGBA, SyntaxStyle, type CliRenderer, type ColorInput, type TerminalColors } from \"@opentui/core\"\nimport type { TuiThemeCurrent } from \"@opencode-ai/plugin/tui\"\nimport type { EntryKind } from \"./types\"\n\ntype Tone = {\n body: ColorInput\n start?: ColorInput\n}\n\nexport type RunEntryTheme = Record<EntryKind, Tone>\n\nexport type RunSplashTheme = {\n left: ColorInput\n right: ColorInput\n leftShadow: ColorInput\n rightShadow: ColorInput\n}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: ColorInput\n success: ColorInput\n error: ColorInput\n muted: ColorInput\n text: ColorInput\n status: ColorInput\n statusAccent: ColorInput\n shade: ColorInput\n surface: ColorInput\n pane: ColorInput\n border: ColorInput\n line: ColorInput\n}\n\nexport type RunBlockTheme = {\n highlight: ColorInput\n warning: ColorInput\n text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\n subtleSyntax?: SyntaxStyle\n diffAdded: ColorInput\n diffRemoved: ColorInput\n diffAddedBg: ColorInput\n diffRemovedBg: ColorInput\n diffContextBg: ColorInput\n diffHighlightAdded: ColorInput\n diffHighlightRemoved: ColorInput\n diffLineNumber: ColorInput\n diffAddedLineNumberBg: ColorInput\n diffRemovedLineNumberBg: ColorInput\n}\n\nexport type RunTheme = {\n background: ColorInput\n footer: RunFooterTheme\n entry: RunEntryTheme\n splash: RunSplashTheme\n block: RunBlockTheme\n}\n\ntype ThemeColor = Exclude<keyof TuiThemeCurrent, \"thinkingOpacity\">\ntype HexColor = `#${string}`\ntype RefName = string\ntype Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\ntype ColorValue = HexColor | RefName | Variant | RGBA | number\ntype ThemeJson = {\n defs?: Record<string, HexColor | RefName>\n theme: Omit<Record<ThemeColor, ColorValue>, \"selectedListItemText\" | \"backgroundMenu\"> & {\n selectedListItemText?: ColorValue\n backgroundMenu?: ColorValue\n thinkingOpacity?: number\n }\n}\n\ntype SharedSyntaxTheme = TuiThemeCurrent & {\n _hasSelectedListItemText: boolean\n}\n\nexport const transparent = RGBA.fromValues(0, 0, 0, 0)\n\nfunction alpha(color: RGBA, value: number): RGBA {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, value)))\n}\n\nfunction rgba(hex: string, value?: number): RGBA {\n const color = RGBA.fromHex(hex)\n return value === undefined ? color : alpha(color, value)\n}\n\nfunction mode(bg: RGBA): \"dark\" | \"light\" {\n return luminance(bg) > 0.5 ? \"light\" : \"dark\"\n}\n\nfunction luminance(color: RGBA): number {\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b\n}\n\nfunction fade(color: RGBA, base: RGBA, fallback: number, scale: number, limit: number): RGBA {\n if (color.a === 0) {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, fallback)))\n }\n\n const target = Math.min(limit, color.a * scale)\n const mix = Math.min(1, target / color.a)\n\n return RGBA.fromValues(\n base.r + (color.r - base.r) * mix,\n base.g + (color.g - base.g) * mix,\n base.b + (color.b - base.b) * mix,\n color.a,\n )\n}\n\nfunction ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansi = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansi[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const value = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(value(r), value(g), value(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nfunction tint(base: RGBA, overlay: RGBA, value: number): RGBA {\n return RGBA.fromInts(\n Math.round((base.r + (overlay.r - base.r) * value) * 255),\n Math.round((base.g + (overlay.g - base.g) * value) * 255),\n Math.round((base.b + (overlay.b - base.b) * value) * 255),\n )\n}\n\nfunction blend(color: RGBA, bg: RGBA): RGBA {\n if (color.a >= 1) {\n return color\n }\n\n return RGBA.fromValues(\n bg.r + (color.r - bg.r) * color.a,\n bg.g + (color.g - bg.g) * color.a,\n bg.b + (color.b - bg.b) * color.a,\n 1,\n )\n}\n\nfunction chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\n}\n\nfunction opaqueSyntaxStyle(style: SyntaxStyle | undefined, bg: RGBA): SyntaxStyle | undefined {\n if (!style) {\n return undefined\n }\n\n return SyntaxStyle.fromStyles(\n Object.fromEntries(\n [...style.getAllStyles()].map(([name, value]) => [\n name,\n {\n ...value,\n fg: value.fg ? blend(value.fg, bg) : value.fg,\n bg: value.bg ? blend(value.bg, bg) : value.bg,\n },\n ]),\n ),\n )\n}\n\nfunction indexedPalette(colors: TerminalColors, size: number = Math.max(colors.palette.length, 16)): RGBA[] {\n return Array.from({ length: size }, (_, index) => {\n const value = colors.palette[index]\n return RGBA.fromIndex(index, value ? RGBA.fromHex(value) : ansiToRgba(index))\n })\n}\n\nfunction srgbToLinear(value: number): number {\n if (value <= 0.04045) {\n return value / 12.92\n }\n\n return ((value + 0.055) / 1.055) ** 2.4\n}\n\nfunction oklab(color: RGBA) {\n const r = srgbToLinear(color.r)\n const g = srgbToLinear(color.g)\n const b = srgbToLinear(color.b)\n\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b)\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b)\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b)\n\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\nfunction nearestIndexed(indexed: RGBA[], rgba: RGBA): RGBA {\n const target = oklab(rgba)\n const hit = indexed.reduce(\n (best, item) => {\n const sample = oklab(item)\n const dl = sample.l - target.l\n const da = sample.a - target.a\n const db = sample.b - target.b\n const dist = dl * dl * 2 + da * da + db * db\n if (dist >= best.dist) return best\n return {\n dist,\n item,\n }\n },\n {\n dist: Number.POSITIVE_INFINITY,\n item: indexed[0]!,\n },\n )\n\n return RGBA.clone(hit.item)\n}\n\nfunction paletteColor(colors: TerminalColors, index: number): RGBA {\n const value = colors.palette[index]\n return value ? RGBA.fromHex(value) : ansiToRgba(index)\n}\n\nfunction splashShadow(indexed: RGBA[], base: RGBA, overlay: RGBA, value: number): RGBA {\n const mixed = tint(base, overlay, value)\n return nearestIndexed(indexed, mixed)\n}\n\nexport function resolveTheme(theme: ThemeJson, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const defs = theme.defs ?? {}\n\n const resolveColor = (value: ColorValue, chain: string[] = []): RGBA => {\n if (value instanceof RGBA) return value\n\n if (typeof value === \"number\") {\n return RGBA.fromIndex(value, ansiToRgba(value))\n }\n\n if (typeof value !== \"string\") {\n return resolveColor(value[pick], chain)\n }\n\n if (value === \"transparent\" || value === \"none\") {\n return RGBA.fromInts(0, 0, 0, 0)\n }\n\n if (value.startsWith(\"#\")) {\n return RGBA.fromHex(value)\n }\n\n if (chain.includes(value)) {\n throw new Error(`Circular color reference: ${[...chain, value].join(\" -> \")}`)\n }\n\n const next = defs[value] ?? theme.theme[value as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${value}\" not found in defs or theme`)\n }\n\n return resolveColor(next, [...chain, value])\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText:\n theme.theme.selectedListItemText === undefined\n ? resolved.background!\n : resolveColor(theme.theme.selectedListItemText),\n backgroundMenu:\n theme.theme.backgroundMenu === undefined ? resolved.backgroundElement! : resolveColor(theme.theme.backgroundMenu),\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): Record<number, RGBA> {\n const r = bg.r * 255\n const g = bg.g * 255\n const b = bg.b * 255\n const lum = 0.299 * r + 0.587 * g + 0.114 * b\n const cast = 0.25 * (1 - chroma(bg)) ** 2\n\n const gray = (level: number) => {\n const factor = level / 12\n\n if (isDark && lum < 10) {\n const value = Math.floor(factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n if (!isDark && lum > 245) {\n const value = Math.floor(255 - factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n const value = isDark ? lum + (255 - lum) * factor * 0.4 : lum * (1 - factor * 0.4)\n const tone = RGBA.fromInts(Math.floor(value), Math.floor(value), Math.floor(value))\n if (cast === 0) return map(tone)\n\n const ratio = lum === 0 ? 0 : value / lum\n return map(\n tint(\n tone,\n RGBA.fromInts(\n Math.floor(Math.max(0, Math.min(r * ratio, 255))),\n Math.floor(Math.max(0, Math.min(g * ratio, 255))),\n Math.floor(Math.max(0, Math.min(b * ratio, 255))),\n ),\n cast,\n ),\n )\n }\n\n return Object.fromEntries(Array.from({ length: 12 }, (_, index) => [index + 1, gray(index + 1)]))\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): RGBA {\n const lum = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n const gray = isDark\n ? lum < 10\n ? 180\n : Math.min(Math.floor(160 + lum * 0.3), 200)\n : lum > 245\n ? 75\n : Math.max(Math.floor(100 - (255 - lum) * 0.2), 60)\n\n return map(RGBA.fromInts(gray, gray, gray))\n}\n\nexport function generateSystem(colors: TerminalColors, pick: \"dark\" | \"light\"): ThemeJson {\n const bg_snapshot = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg_snapshot = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const bg = RGBA.defaultBackground(bg_snapshot)\n const fg = RGBA.defaultForeground(fg_snapshot)\n const isDark = pick === \"dark\"\n\n const color = (index: number) => paletteColor(colors, index)\n\n const grays = generateGrayScale(bg_snapshot, isDark, (rgba) => rgba)\n const textMuted = generateMutedTextColor(bg_snapshot, isDark, (rgba) => rgba)\n\n const ansi = {\n red: color(1),\n green: color(2),\n yellow: color(3),\n blue: color(4),\n magenta: color(5),\n cyan: color(6),\n red_bright: color(9),\n green_bright: color(10),\n }\n\n const diff_alpha = isDark ? 0.22 : 0.14\n const diff_context_bg = grays[2]\n const primary = ansi.cyan\n const secondary = ansi.magenta\n\n return {\n theme: {\n primary,\n secondary,\n accent: primary,\n error: ansi.red,\n warning: ansi.yellow,\n success: ansi.green,\n info: ansi.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: alpha(bg, 0),\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansi.green,\n diffRemoved: ansi.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansi.green_bright,\n diffHighlightRemoved: ansi.red_bright,\n diffAddedBg: tint(bg_snapshot, ansi.green, diff_alpha),\n diffRemovedBg: tint(bg_snapshot, ansi.red, diff_alpha),\n diffContextBg: diff_context_bg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg: tint(diff_context_bg, ansi.green, diff_alpha),\n diffRemovedLineNumberBg: tint(diff_context_bg, ansi.red, diff_alpha),\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansi.blue,\n markdownLinkText: ansi.cyan,\n markdownCode: ansi.green,\n markdownBlockQuote: ansi.yellow,\n markdownEmph: ansi.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansi.blue,\n markdownListEnumeration: ansi.cyan,\n markdownImage: ansi.blue,\n markdownImageText: ansi.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansi.magenta,\n syntaxFunction: ansi.blue,\n syntaxVariable: fg,\n syntaxString: ansi.green,\n syntaxNumber: ansi.yellow,\n syntaxType: ansi.cyan,\n syntaxOperator: ansi.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction quantizeColor(indexed: RGBA[], rgba: RGBA): RGBA {\n if (rgba.a === 0 || rgba.intent === \"default\" || rgba.intent === \"indexed\") {\n return RGBA.clone(rgba)\n }\n\n return nearestIndexed(indexed, rgba)\n}\n\nfunction quantizeTheme(theme: TuiThemeCurrent, indexed: RGBA[]): TuiThemeCurrent {\n const resolved = Object.fromEntries(\n Object.entries(theme)\n .filter(([key]) => key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, quantizeColor(indexed, value as RGBA)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n thinkingOpacity: theme.thinkingOpacity,\n }\n}\n\nfunction splashTheme(theme: TuiThemeCurrent, indexed: RGBA[]): RunSplashTheme {\n const left = nearestIndexed(indexed, theme.textMuted)\n const right = nearestIndexed(indexed, theme.text)\n return {\n left,\n right,\n leftShadow: splashShadow(indexed, theme.background, left, 0.14),\n rightShadow: splashShadow(indexed, theme.background, right, 0.14),\n }\n}\n\nfunction map(\n footerTheme: TuiThemeCurrent,\n scrollbackTheme: TuiThemeCurrent,\n splash: RunSplashTheme,\n syntax?: SyntaxStyle,\n subtleSyntax?: SyntaxStyle,\n): RunTheme {\n const opaqueSubtleSyntax = opaqueSyntaxStyle(subtleSyntax, scrollbackTheme.background)\n subtleSyntax?.destroy()\n const footerBackground = alpha(footerTheme.background, 1)\n const footerMode = mode(footerBackground)\n const shade = fade(footerTheme.backgroundMenu, footerTheme.background, 0.12, 0.56, 0.72)\n const surface = fade(footerTheme.backgroundMenu, footerTheme.background, 0.18, 0.76, 0.9)\n const line = fade(footerTheme.backgroundMenu, footerTheme.background, 0.24, 0.9, 0.98)\n const statusBase = tint(footerBackground, rgba(\"#000000\"), footerMode === \"dark\" ? 0.12 : 0.06)\n const statusAccentBase =\n footerMode === \"dark\" ? tint(footerBackground, rgba(\"#ffffff\"), 0.06) : tint(statusBase, rgba(\"#000000\"), 0.04)\n const collapsedStatus = footerMode === \"dark\" && luminance(statusBase) <= 0.04\n // Pure-black backgrounds need a slight lift or the row disappears into the terminal background.\n const status = collapsedStatus ? tint(statusBase, statusAccentBase, 0.7) : statusBase\n const statusAccent = collapsedStatus ? tint(status, rgba(\"#ffffff\"), 0.06) : statusAccentBase\n\n return {\n background: footerTheme.background,\n footer: {\n highlight: footerTheme.primary,\n selected: footerTheme.backgroundElement,\n selectedText: footerTheme.selectedListItemText,\n warning: footerTheme.warning,\n success: footerTheme.success,\n error: footerTheme.error,\n muted: footerTheme.textMuted,\n text: footerTheme.text,\n status,\n statusAccent,\n shade,\n surface,\n pane: footerTheme.backgroundMenu,\n border: footerTheme.border,\n line,\n },\n entry: {\n system: {\n body: scrollbackTheme.textMuted,\n },\n user: {\n body: scrollbackTheme.primary,\n },\n assistant: {\n body: scrollbackTheme.text,\n },\n reasoning: {\n body: scrollbackTheme.textMuted,\n },\n tool: {\n body: scrollbackTheme.text,\n start: scrollbackTheme.textMuted,\n },\n error: {\n body: scrollbackTheme.error,\n },\n },\n splash,\n block: {\n highlight: scrollbackTheme.primary,\n warning: scrollbackTheme.warning,\n text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\n subtleSyntax: opaqueSubtleSyntax,\n diffAdded: scrollbackTheme.diffAdded,\n diffRemoved: scrollbackTheme.diffRemoved,\n diffAddedBg: transparent,\n diffRemovedBg: transparent,\n diffContextBg: transparent,\n diffHighlightAdded: scrollbackTheme.diffHighlightAdded,\n diffHighlightRemoved: scrollbackTheme.diffHighlightRemoved,\n diffLineNumber: scrollbackTheme.diffLineNumber,\n diffAddedLineNumberBg: scrollbackTheme.diffAddedLineNumberBg,\n diffRemovedLineNumberBg: scrollbackTheme.diffRemovedLineNumberBg,\n },\n }\n}\n\nconst seed = {\n highlight: RGBA.fromIndex(6, rgba(\"#38bdf8\")),\n muted: RGBA.fromIndex(8, rgba(\"#64748b\")),\n text: RGBA.defaultForeground(rgba(\"#f8fafc\")),\n panel: rgba(\"#0f172a\"),\n success: RGBA.fromIndex(2, rgba(\"#22c55e\")),\n warning: RGBA.fromIndex(3, rgba(\"#f59e0b\")),\n error: RGBA.fromIndex(1, rgba(\"#ef4444\")),\n}\n\nfunction tone(body: ColorInput, start?: ColorInput): Tone {\n return {\n body,\n start,\n }\n}\n\nconst fallbackSplashIndexed = Array.from({ length: 256 }, (_, index) => RGBA.fromIndex(index))\nconst fallbackSplashLeft = RGBA.fromIndex(67)\nconst fallbackSplashRight = RGBA.fromIndex(110)\n\nexport const RUN_THEME_FALLBACK: RunTheme = {\n background: RGBA.fromValues(0, 0, 0, 0),\n footer: {\n highlight: seed.highlight,\n selected: seed.text,\n selectedText: seed.panel,\n warning: seed.warning,\n success: seed.success,\n error: seed.error,\n muted: seed.muted,\n text: seed.text,\n status: tint(seed.panel, rgba(\"#000000\"), 0.12),\n statusAccent: tint(seed.panel, rgba(\"#ffffff\"), 0.06),\n shade: alpha(seed.panel, 0.68),\n surface: alpha(seed.panel, 0.86),\n pane: seed.panel,\n border: seed.muted,\n line: alpha(seed.panel, 0.96),\n },\n entry: {\n system: tone(seed.muted),\n user: tone(seed.highlight),\n assistant: tone(seed.text),\n reasoning: tone(seed.muted),\n tool: tone(seed.text, seed.muted),\n error: tone(seed.error),\n },\n splash: {\n left: fallbackSplashLeft,\n right: fallbackSplashRight,\n leftShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashLeft, 0.14),\n rightShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashRight, 0.14),\n },\n block: {\n highlight: seed.highlight,\n warning: seed.warning,\n text: seed.text,\n muted: seed.muted,\n diffAdded: seed.success,\n diffRemoved: seed.error,\n diffAddedBg: alpha(seed.success, 0.18),\n diffRemovedBg: alpha(seed.error, 0.18),\n diffContextBg: alpha(seed.panel, 0.72),\n diffHighlightAdded: seed.success,\n diffHighlightRemoved: seed.error,\n diffLineNumber: seed.muted,\n diffAddedLineNumberBg: alpha(seed.success, 0.12),\n diffRemovedLineNumberBg: alpha(seed.error, 0.12),\n },\n}\n\nexport async function resolveRunTheme(renderer: CliRenderer): Promise<RunTheme> {\n try {\n const colors = await renderer.getPalette({\n size: 256,\n })\n const bg = colors.defaultBackground ?? colors.palette[0]\n if (!bg) {\n return RUN_THEME_FALLBACK\n }\n\n // Palette-only terminal reloads can leave renderer.themeMode stale, but\n // ANSI slot zero is not the terminal background when OSC 11 is absent.\n const pick = colors.defaultBackground\n ? mode(RGBA.fromHex(colors.defaultBackground))\n : (renderer.themeMode ?? mode(RGBA.fromHex(bg)))\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const indexed = indexedPalette(colors, 256)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const shared = await import(\"@opencode-ai/tui/context/theme\")\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n const syntax = shared.generateSyntax(syntaxTheme)\n return map(\n footerTheme,\n scrollbackTheme,\n splashTheme(scrollbackTheme, indexed),\n syntax,\n shared.generateSubtleSyntax(syntaxTheme),\n )\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n"
],
"mappings": "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",
"debugId": "453E404AC73CF8C764756E2164756E21",
"names": []
}

Sorry, the diff of this file is not supported yet