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

@opencode-ai/cli-windows-arm64

Package Overview
Dependencies
Maintainers
2
Versions
2106
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@opencode-ai/cli-windows-arm64 - npm Package Compare versions

Comparing version
0.0.0-next-15587
to
0.0.0-next-15590
+9
bin/chunk-1dttj29b.js.map
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "701F83C45105EFEF64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/run.ts"],
"sourcesContent": [
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { 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": ";mzCAKA,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,OAAO,aAAQ,MACnC,YAAQ,OAAO,oBAAe,OAAM,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": "ED1315E3DD1F3C9164756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/service/stop.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\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": ";u9BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,MACH",
"debugId": "090BD39C32AD5C6F64756E2164756E21",
"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": ";k9BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,SAAI,OAAO,oBAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "C6D62EDFBA3BDE2964756E2164756E21",
"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": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH",
"debugId": "6F7688EDC57F9A2E64756E2164756E21",
"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": ";ojCAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,WAAM,WAAO,OAAc,aAAQ,MAAC,OAC9D,OAAW,WAAO,OAAc,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": "B5177AA5608CC2AE64756E2164756E21",
"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 { OpenCode, type McpServer } from \"@opencode-ai/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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "461864826FFEF13564756E2164756E21",
"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 options = yield* ServiceConfig.options()\n const status = yield* Service.status(options)\n if (status.type !== \"ready\") {\n process.stdout.write(status.type + EOL)\n return\n }\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? status.type) + EOL)\n }),\n)\n"
],
"mappings": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,OAAS,WAAO,OAAQ,OAAO,CAAO,EAC5C,GAAI,EAAO,OAAS,QAAS,CAC3B,QAAQ,OAAO,MAAM,EAAO,KAAO,CAAG,EACtC,OAEF,IAAM,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,EAAO,MAAQ,CAAG,EACvD,CACH",
"debugId": "30CC89327FBFD67C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../core/src/util/process-lock.ts", "src/server-process.ts", "src/commands/handlers/serve.ts"],
"sourcesContent": [
"import { dlopen, read, type Pointer } from \"bun:ffi\"\nimport { closeSync, existsSync, mkdirSync, openSync } from \"node:fs\"\nimport { connect, createServer, type Server, type Socket } from \"node:net\"\nimport path from \"node:path\"\nimport { Effect, Schema } from \"effect\"\nimport { Hash } from \"./hash\"\n\nexport namespace ProcessLock {\n export class HeldError extends Schema.TaggedErrorClass<HeldError>()(\"ProcessLockHeldError\", {\n file: Schema.String,\n }) {\n override get message() {\n return `Process lock is already held: ${this.file}`\n }\n }\n\n export class SystemError extends Schema.TaggedErrorClass<SystemError>()(\"ProcessLockSystemError\", {\n file: Schema.String,\n operation: Schema.Literals([\"open\", \"acquire\"]),\n code: Schema.String,\n }) {\n override get message() {\n return `Process lock ${this.operation} failed for ${this.file}: ${this.code}`\n }\n }\n\n export type LockError = HeldError | SystemError\n\n const acquirePosix = Effect.fnUntraced(function* (file: string) {\n const fd = yield* Effect.try({\n try: () => {\n mkdirSync(path.dirname(file), { recursive: true })\n return openSync(file, \"a+\", 0o600)\n },\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"open\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n const result = yield* Effect.try({\n try: () => lock(fd),\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"acquire\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n }).pipe(\n Effect.tapError(() =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n ),\n )\n if (result.acquired) {\n return fd\n }\n closeSync(fd)\n return yield* result.held\n ? new HeldError({ file })\n : new SystemError({ file, operation: \"acquire\", code: String(result.code) })\n })\n\n export const acquire = Effect.fn(\"ProcessLock.acquire\")(function* (file: string) {\n if (process.platform === \"win32\") {\n yield* Effect.acquireRelease(acquireWindows(file), closeWindows)\n return\n }\n yield* Effect.acquireRelease(acquirePosix(file), (fd) =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n )\n })\n}\n\ntype Result =\n | { readonly acquired: true }\n | { readonly acquired: false; readonly held: true }\n | { readonly acquired: false; readonly held: false; readonly code: number }\n\nconst LOCK_EX = 2\nconst LOCK_NB = 4\nconst DARWIN_EWOULDBLOCK = 35\nconst LINUX_EWOULDBLOCK = 11\n\nfunction lock(fd: number): Result {\n if (process.platform === \"darwin\") return lockDarwin(fd)\n if (process.platform === \"linux\") return lockLinux(fd)\n throw new Error(`Unsupported process lock platform: ${process.platform}`)\n}\n\nfunction lockDarwin(fd: number): Result {\n const library = dlopen(\"/usr/lib/libSystem.B.dylib\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __error: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__error())\n if (result === 0) return { acquired: true }\n if (code === DARWIN_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nfunction lockLinux(fd: number): Result {\n const musl = `/lib/libc.musl-${process.arch === \"arm64\" ? \"aarch64\" : \"x86_64\"}.so.1`\n const library = dlopen(existsSync(musl) ? musl : \"libc.so.6\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __errno_location: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__errno_location())\n if (result === 0) return { acquired: true }\n if (code === LINUX_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nfunction errorCode(pointer: Pointer | null) {\n if (pointer === null) throw new Error(\"Failed to read process lock error code\")\n return read.i32(pointer, 0)\n}\n\nfunction acquireWindows(file: string) {\n return Effect.callback<Server, ProcessLock.LockError>((resume) => {\n const server = createServer()\n let probe: Socket | undefined\n const pipe = `\\\\\\\\.\\\\pipe\\\\opencode-process-lock-${Hash.sha256(path.resolve(file).toLowerCase())}`\n const onError = (cause: NodeJS.ErrnoException) => {\n server.off(\"listening\", onListening)\n probe = connect(pipe)\n const onProbeError = () => {\n probe?.off(\"connect\", onConnect)\n resume(\n Effect.fail(\n new ProcessLock.SystemError({\n file,\n operation: \"acquire\",\n code: cause.code ?? cause.message,\n }),\n ),\n )\n }\n const onConnect = () => {\n probe?.off(\"error\", onProbeError)\n probe?.destroy()\n resume(Effect.fail(new ProcessLock.HeldError({ file })))\n }\n probe.once(\"connect\", onConnect)\n probe.once(\"error\", onProbeError)\n }\n const onListening = () => {\n server.off(\"error\", onError)\n resume(Effect.succeed(server))\n }\n server.once(\"error\", onError)\n server.once(\"listening\", onListening)\n server.on(\"connection\", (socket) => socket.destroy())\n server.listen(pipe)\n return Effect.sync(() => {\n probe?.destroy()\n server.close()\n })\n })\n}\n\nfunction closeWindows(server: Server) {\n return Effect.callback<void>((resume) => {\n if (!server.listening) return resume(Effect.void)\n server.close((error) => resume(error ? Effect.die(error) : Effect.void))\n })\n}\n",
"export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { ProcessLock } from \"@opencode-ai/core/util/process-lock\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\nexport const run = Effect.fn(\"cli.server-process.run\")((options: Options) =>\n processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node]))),\n Effect.provide(NodeServices.layer),\n ),\n)\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n if (serviceOptions !== undefined) {\n const acquired = yield* ProcessLock.acquire(serviceOptions.file + \".lock\").pipe(\n Effect.as(true),\n Effect.catchTag(\"ProcessLockHeldError\", () => Effect.succeed(false)),\n )\n if (!acquired) return yield* Effect.void\n if ((yield* Service.discover(serviceOptions)) !== undefined) return yield* Effect.void\n }\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const password =\n options.mode === \"service\"\n ? yield* ServiceConfig.password()\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start({\n hostname: options.hostname ?? config.hostname ?? \"127.0.0.1\",\n port: Option.fromNullishOr(options.port ?? config.port),\n password,\n instanceID,\n service:\n serviceOptions === undefined\n ? undefined\n : { onListen: (address) => register(address, password, instanceID, serviceOptions.file) },\n }).pipe(Effect.provide(Logger.layer([], { mergeWithExisting: false })))\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const publish = fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* publish\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const assertRegistration = Effect.gen(function* () {\n const found = yield* current\n if (\n found !== undefined &&\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n )\n return\n yield* publish\n })\n yield* Effect.addFinalizer(() =>\n current.pipe(\n Effect.flatMap((current) => (current?.id === id ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n ),\n )\n yield* assertRegistration.pipe(\n Effect.catchCause((cause) => Effect.logWarning(\"failed to reassert service registration\", { cause })),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.forkScoped,\n )\n})\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n",
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fn(\"cli.serve\")(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n"
],
"mappings": "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",
"debugId": "A78EEB7A254E222E64756E2164756E21",
"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 { 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 type { MiniToolPart } from \"./types\"\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: MiniToolPart) {\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: MiniToolPart) {\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 { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { UI } from \"./ui\"\nimport type { MiniToolPart } from \"./types\"\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: MiniToolPart) => Promise<void>\n renderToolError: (part: MiniToolPart) => 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: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const 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 = {\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 = {\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 = {\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: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: 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: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(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 = {\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": "2F24F4EE3491C84264756E2164756E21",
"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": ";mzCAKA,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,OAAY,OAAO,oBAAe,OAAM,WAAM,OAC9C,OAAS,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": "BB0C86B19086DAAD64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../../node_modules/.bun/cli-spinners@3.4.0/node_modules/cli-spinners/index.js", "../../node_modules/.bun/opentui-spinner@0.0.7+d3ea10796c516e66/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+d3ea10796c516e66/node_modules/opentui-spinner/dist/solid.mjs", "../tui/src/component/register-spinner.ts"],
"sourcesContent": [
"import spinners from './spinners.json' with {type: 'json'};\n\nexport default spinners;\n\nconst spinnersList = Object.keys(spinners);\n\nexport function randomSpinner() {\n\tconst randomIndex = Math.floor(Math.random() * spinnersList.length);\n\tconst spinnerName = spinnersList[randomIndex];\n\treturn spinners[spinnerName];\n}\n",
"import{Renderable as e,parseColor as t,resolveRenderLib as n}from\"@opentui/core\";import r from\"cli-spinners\";const i=1e3/60,a=1e3;function o(e){if(!Number.isFinite(e)||e<i||e>a)throw RangeError(`Spinner interval must be a finite number between ${i}ms and ${a}ms`);return e}const s={now:()=>performance.now(),setInterval:(e,t)=>{let n=setInterval(e,t);return n.unref(),n},clearInterval:e=>clearInterval(e)},c=new class{active=new Map;heap=[];timer=null;timerDueAt=0;generation=0;lastWakeAt=-1/0;clock;constructor(e=s,t=16){this.denseTickThreshold=t,this.clock=e}setClock(e){if(this.active.size>0||this.timer!==null)throw Error(`Cannot replace the spinner scheduler clock while active`);this.clock=e}start(e,t,n){if(this.active.has(e))return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n};this.active.set(e,r),this.push(r),this.armNext()}reschedule(e,t){let n=this.active.get(e);if(!n)return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n.advance};this.active.set(e,r),this.push(r),this.compactIfNeeded(),this.armNext()}stop(e){this.active.delete(e)&&(this.compactIfNeeded(),this.armNext())}armNext(){this.discardStaleRoots();let e=this.heap[0];if(!e){this.cancelTimer(),this.lastWakeAt=-1/0;return}let t=this.clock.now(),n=Math.max(e.nextDueAt,this.lastWakeAt+i);if(this.timer!==null&&this.timerDueAt===n)return;this.cancelTimer();let r=this.generation,a=Math.max(n-t,0);this.timerDueAt=n,this.timer=this.clock.setInterval(()=>this.tick(r),a)}cancelTimer(){this.timer!==null&&(this.generation++,this.clock.clearInterval(this.timer),this.timer=null)}tick(e){if(e!==this.generation||this.timer===null)return;let t=this.timer;this.generation++,this.timer=null,this.clock.clearInterval(t);let n=this.clock.now();this.discardStaleRoots();let r=!1,i=0,a=[];for(;this.heap[0]&&this.heap[0].nextDueAt<=n;){let e=this.pop();if(!(!e||!this.isCurrent(e))){try{e.advance()}catch(e){a.push(e)}if(r=!0,this.isCurrent(e)&&(e.nextDueAt=n+e.interval,this.push(e),i++,i===this.denseTickThreshold)){let e=this.heap;this.heap=[];for(let t of e)if(this.isCurrent(t)){if(t.nextDueAt<=n){try{t.advance()}catch(e){a.push(e)}if(r=!0,!this.isCurrent(t))continue;t.nextDueAt=n+t.interval}this.heap.push(t)}this.heapify();break}}}if(r&&(this.lastWakeAt=n),this.compactIfNeeded(),this.armNext(),a.length===1)throw a[0];if(a.length>1)throw AggregateError(a,`Multiple spinner callbacks failed`)}isCurrent(e){return this.active.get(e.spinner)===e}discardStaleRoots(){for(;this.heap[0]&&!this.isCurrent(this.heap[0]);)this.pop()}compactIfNeeded(){this.heap.length<=this.active.size*2+16||(this.heap=Array.from(this.active.values()),this.heapify())}heapify(){for(let e=Math.floor(this.heap.length/2)-1;e>=0;e--)this.siftDown(e)}push(e){this.heap.push(e);let t=this.heap.length-1;for(;t>0;){let n=Math.floor((t-1)/2);if(this.heap[n].nextDueAt<=e.nextDueAt)break;this.heap[t]=this.heap[n],t=n}this.heap[t]=e}pop(){let e=this.heap[0],t=this.heap.pop();return!e||!t||this.heap.length===0?e:(this.heap[0]=t,this.siftDown(0),e)}siftDown(e){let t=this.heap[e],n=e;for(;;){let e=n*2+1;if(e>=this.heap.length)break;let r=e+1,i=r<this.heap.length&&this.heap[r].nextDueAt<this.heap[e].nextDueAt?r:e;if(this.heap[i].nextDueAt>=t.nextDueAt)break;this.heap[n]=this.heap[i],n=i}this.heap[n]=t}};function l(e,t=1){if(e.length===0)throw RangeError(`createPulse requires at least one color`);return n=>e[Math.floor(n*t)%e.length]}function u(e){if(e.length===0)throw RangeError(`createWave requires at least one color`);return(t,n,r,i)=>{let a=(n+t)%i;return e[Math.floor(a/i*e.length)]??e[0]}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=class extends e{_name;_frames;_interval;_autoplay;_backgroundColor;_parsedBackgroundColor;_color;_parsedColor;_currentFrameIndex=0;_encodedFrames={};_lib=n();_isRunning=!1;_advanceFrame=()=>{!this._isRunning||this.isDestroyed||(this._currentFrameIndex=(this._currentFrameIndex+1)%this._frames.length,this.requestRender())};_defaultOptions={name:`dots`,frames:r.dots.frames,interval:r.dots.interval,autoplay:!0,backgroundColor:`transparent`,color:`white`};constructor(e,n){super(e,n),this._name=n.name,this._frames=n.frames?.length?n.frames:this._name?r[this._name].frames:this._defaultOptions.frames,this._interval=o(n.interval??(this._name?r[this._name].interval:this._defaultOptions.interval)),this._autoplay=n.autoplay??this._defaultOptions.autoplay,this._backgroundColor=n.backgroundColor??this._defaultOptions.backgroundColor,this._parsedBackgroundColor=t(this._backgroundColor),this._color=n.color??this._defaultOptions.color,this._parsedColor=typeof this._color==`function`?t(this._defaultOptions.color):t(this._color),this.height=1,this._encodeFrames(),this._autoplay&&this.start()}_encodeFrames(){let e=0;for(let t of this._frames){if(this._encodedFrames[t])continue;let n=this._lib.encodeUnicode(t,this.ctx.widthMethod);n&&(this._encodedFrames[t]=n,e=Math.max(e,n.data.reduce((e,t)=>e+t.width,0)))}this.width=e}_freeFrames(){for(let e in this._encodedFrames)this._encodedFrames[e]&&this._lib.freeUnicode(this._encodedFrames[e]);this._encodedFrames={}}get interval(){return this._interval}set interval(e){this._interval=o(e),this._isRunning&&c.reschedule(this,this._interval)}get name(){return this._name}set name(e){let t=e?r[e].frames:this._defaultOptions.frames,n=o(e?r[e].interval:this._defaultOptions.interval),i=!d(this._frames,t),a=this._interval!==n;this._name=e,this._interval=n,i&&(this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()),this._isRunning&&a&&c.reschedule(this,n)}get frames(){return this._frames}set frames(e){let t=e.length===0?this._defaultOptions.frames:e;if(d(this._frames,t)){this._frames=t;return}this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()}get color(){return this._color}set color(e){this._color=e,typeof e!=`function`&&(this._parsedColor=t(e)),this.visible&&this.requestRender()}get backgroundColor(){return this._backgroundColor}set backgroundColor(e){this._backgroundColor=e,this._parsedBackgroundColor=t(e),this.visible&&this.requestRender()}get visible(){return super.visible}set visible(e){e!==super.visible&&(super.visible=e,this._isRunning&&(e?c.start(this,this._interval,this._advanceFrame):c.stop(this)))}get autoplay(){return this._autoplay}set autoplay(e){this._autoplay=e,e?this.start():this.stop()}start(){this._isRunning||this.isDestroyed||(this._isRunning=!0,this.visible&&c.start(this,this._interval,this._advanceFrame))}stop(){this._isRunning&&(this._isRunning=!1,c.stop(this))}renderSelf(e){if(!this.visible)return;let n=this._frames[this._currentFrameIndex];if(!n)return;let r=this._encodedFrames[n];if(!r)return;let i=this.x;for(let n=0;n<r.data.length;n++){let a=typeof this._color==`function`?t(this._color(this._currentFrameIndex,n,this._frames.length,r.data.length)):this._parsedColor;e.drawChar(r.data[n].char,i,this.y,a,this._parsedBackgroundColor),i+=r.data[n].width}}destroySelf(){this.stop(),this._freeFrames(),super.destroySelf()}};export{l as n,u as r,f as t};",
"import{t as e}from\"./src-DjeqLSfu.mjs\";import{extend as t}from\"@opentui/solid/components\";function n(){t({spinner:e})}n();export{n as registerSpinner};",
"import { getComponentCatalogue } from \"@opentui/solid/components\"\nimport { registerSpinner } from \"opentui-spinner/solid\"\n\nexport function registerOpencodeSpinner() {\n if (!getComponentCatalogue().spinner) registerSpinner()\n}\n"
],
"mappings": "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",
"debugId": "7367A37937B2D35C64756E2164756E21",
"names": []
}
{
"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": ";2xBAGA,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,gBAAK,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": "C030B92523378F5864756E2164756E21",
"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": "646BB809BE43AA1864756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/mcp/logout.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n"
],
"mappings": ";ojCAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "38C6995869B5E78064756E2164756E21",
"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",
"import type { SessionMessageInfo, SessionMessageUser } from \"@opencode-ai/client/promise\"\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = SessionMessageInfo[]\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 messagePrompt(message: SessionMessageUser): RunPrompt {\n return {\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\",\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}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) =>\n message.type === \"user\"\n ? [{ prompt: messagePrompt(message), provider: undefined, model: undefined, variant: undefined }]\n : [],\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 current = createSession(response.data.toReversed())\n return {\n ...current,\n turns: current.turns.map((turn) => ({\n ...turn,\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n })),\n ...(session.model && {\n model: { providerID: session.model.providerID, modelID: session.model.id },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n return session.turns\n .map((turn) => turn.prompt)\n .filter((prompt) => prompt.text.trim())\n .filter((prompt, index, prompts) => index === 0 || !promptSame(prompts[index - 1], prompt))\n .map(promptCopy)\n .slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) return\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) return session.variant\n\n return session.turns.findLast((turn) => turn.provider === model.providerID && turn.model === model.modelID)?.variant\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 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 chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\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): RunTheme {\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 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(footerTheme, scrollbackTheme, splashTheme(scrollbackTheme, indexed), syntax)\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n"
],
"mappings": "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",
"debugId": "A752D63D6B1547EE64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["../tui/src/theme/color.ts", "../tui/src/theme/v1.ts", "../tui/src/theme/index.ts", "../tui/src/theme/system.ts", "../tui/src/context/helper.tsx", "../tui/src/context/theme.tsx"],
"sourcesContent": [
"import { RGBA } from \"@opentui/core\"\n\nexport function ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansiColors = [\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(ansiColors[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 val = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(val(r), val(g), val(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\nexport function tint(base: RGBA, overlay: RGBA, alpha: number): RGBA {\n const r = base.r + (overlay.r - base.r) * alpha\n const g = base.g + (overlay.g - base.g) * alpha\n const b = base.b + (overlay.b - base.b) * alpha\n return RGBA.fromInts(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255))\n}\n",
"import { RGBA, SyntaxStyle } from \"@opentui/core\"\nimport aura from \"./assets/aura.json\" with { type: \"json\" }\nimport ayu from \"./assets/ayu.json\" with { type: \"json\" }\nimport carbonfox from \"./assets/carbonfox.json\" with { type: \"json\" }\nimport catppuccinFrappe from \"./assets/catppuccin-frappe.json\" with { type: \"json\" }\nimport catppuccinMacchiato from \"./assets/catppuccin-macchiato.json\" with { type: \"json\" }\nimport catppuccin from \"./assets/catppuccin.json\" with { type: \"json\" }\nimport cobalt2 from \"./assets/cobalt2.json\" with { type: \"json\" }\nimport cursor from \"./assets/cursor.json\" with { type: \"json\" }\nimport dracula from \"./assets/dracula.json\" with { type: \"json\" }\nimport everforest from \"./assets/everforest.json\" with { type: \"json\" }\nimport flexoki from \"./assets/flexoki.json\" with { type: \"json\" }\nimport github from \"./assets/github.json\" with { type: \"json\" }\nimport gruvbox from \"./assets/gruvbox.json\" with { type: \"json\" }\nimport kanagawa from \"./assets/kanagawa.json\" with { type: \"json\" }\nimport lucentOrng from \"./assets/lucent-orng.json\" with { type: \"json\" }\nimport material from \"./assets/material.json\" with { type: \"json\" }\nimport matrix from \"./assets/matrix.json\" with { type: \"json\" }\nimport mercury from \"./assets/mercury.json\" with { type: \"json\" }\nimport monokai from \"./assets/monokai.json\" with { type: \"json\" }\nimport nightowl from \"./assets/nightowl.json\" with { type: \"json\" }\nimport nord from \"./assets/nord.json\" with { type: \"json\" }\nimport onedark from \"./assets/one-dark.json\" with { type: \"json\" }\nimport opencode from \"./assets/opencode.json\" with { type: \"json\" }\nimport orng from \"./assets/orng.json\" with { type: \"json\" }\nimport osakaJade from \"./assets/osaka-jade.json\" with { type: \"json\" }\nimport palenight from \"./assets/palenight.json\" with { type: \"json\" }\nimport rosepine from \"./assets/rosepine.json\" with { type: \"json\" }\nimport solarized from \"./assets/solarized.json\" with { type: \"json\" }\nimport synthwave84 from \"./assets/synthwave84.json\" with { type: \"json\" }\nimport tokyonight from \"./assets/tokyonight.json\" with { type: \"json\" }\nimport vercel from \"./assets/vercel.json\" with { type: \"json\" }\nimport vesper from \"./assets/vesper.json\" with { type: \"json\" }\nimport zenburn from \"./assets/zenburn.json\" with { type: \"json\" }\n\nexport type Theme = {\n readonly primary: RGBA\n readonly secondary: RGBA\n readonly accent: RGBA\n readonly error: RGBA\n readonly warning: RGBA\n readonly success: RGBA\n readonly info: RGBA\n readonly text: RGBA\n readonly textMuted: RGBA\n readonly selectedListItemText: RGBA\n readonly background: RGBA\n readonly backgroundPanel: RGBA\n readonly backgroundElement: RGBA\n readonly backgroundMenu: RGBA\n readonly border: RGBA\n readonly borderActive: RGBA\n readonly borderSubtle: RGBA\n readonly diffAdded: RGBA\n readonly diffRemoved: RGBA\n readonly diffContext: RGBA\n readonly diffHunkHeader: RGBA\n readonly diffHighlightAdded: RGBA\n readonly diffHighlightRemoved: RGBA\n readonly diffAddedBg: RGBA\n readonly diffRemovedBg: RGBA\n readonly diffContextBg: RGBA\n readonly diffLineNumber: RGBA\n readonly diffAddedLineNumberBg: RGBA\n readonly diffRemovedLineNumberBg: RGBA\n readonly markdownText: RGBA\n readonly markdownHeading: RGBA\n readonly markdownLink: RGBA\n readonly markdownLinkText: RGBA\n readonly markdownCode: RGBA\n readonly markdownBlockQuote: RGBA\n readonly markdownEmph: RGBA\n readonly markdownStrong: RGBA\n readonly markdownHorizontalRule: RGBA\n readonly markdownListItem: RGBA\n readonly markdownListEnumeration: RGBA\n readonly markdownImage: RGBA\n readonly markdownImageText: RGBA\n readonly markdownCodeBlock: RGBA\n readonly syntaxComment: RGBA\n readonly syntaxKeyword: RGBA\n readonly syntaxFunction: RGBA\n readonly syntaxVariable: RGBA\n readonly syntaxString: RGBA\n readonly syntaxNumber: RGBA\n readonly syntaxType: RGBA\n readonly syntaxOperator: RGBA\n readonly syntaxPunctuation: RGBA\n readonly thinkingOpacity: number\n _hasSelectedListItemText: boolean\n}\n\nexport type ThemeColor = Exclude<keyof Theme, \"thinkingOpacity\" | \"_hasSelectedListItemText\">\nexport type HexColor = `#${string}`\nexport type RefName = string\nexport type Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\nexport type ColorValue = HexColor | RefName | Variant | RGBA\nexport type ThemeJson = {\n $schema?: string\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\nexport const DEFAULT_THEMES: Record<string, ThemeJson> = {\n aura,\n ayu,\n catppuccin,\n [\"catppuccin-frappe\"]: catppuccinFrappe,\n [\"catppuccin-macchiato\"]: catppuccinMacchiato,\n cobalt2,\n cursor,\n dracula,\n everforest,\n flexoki,\n github,\n gruvbox,\n kanagawa,\n material,\n matrix,\n mercury,\n monokai,\n nightowl,\n nord,\n [\"one-dark\"]: onedark,\n [\"osaka-jade\"]: osakaJade,\n opencode,\n orng,\n [\"lucent-orng\"]: lucentOrng,\n palenight,\n rosepine,\n solarized,\n synthwave84,\n tokyonight,\n vesper,\n vercel,\n zenburn,\n carbonfox,\n}\n\nexport function selectedForeground(theme: Theme, bg?: RGBA): RGBA {\n if (theme._hasSelectedListItemText) return theme.selectedListItemText\n\n if (theme.background.a === 0) {\n const targetColor = bg ?? theme.primary\n const { r, g, b } = targetColor\n const luminance = 0.299 * r + 0.587 * g + 0.114 * b\n return luminance > 0.5 ? RGBA.fromInts(0, 0, 0) : RGBA.fromInts(255, 255, 255)\n }\n\n return theme.background\n}\n\nexport function generateSyntax(theme: Theme) {\n return SyntaxStyle.fromTheme(getSyntaxRules(theme))\n}\n\nfunction getSyntaxRules(theme: Theme) {\n return [\n {\n scope: [\"default\"],\n style: {\n foreground: theme.text,\n },\n },\n {\n scope: [\"prompt\"],\n style: {\n foreground: theme.accent,\n },\n },\n {\n scope: [\"extmark.file\"],\n style: {\n foreground: theme.warning,\n bold: true,\n },\n },\n {\n scope: [\"extmark.agent\"],\n style: {\n foreground: theme.secondary,\n bold: true,\n },\n },\n {\n scope: [\"extmark.paste\"],\n style: {\n foreground: selectedForeground(theme, theme.warning),\n background: theme.warning,\n bold: true,\n },\n },\n {\n scope: [\"comment\"],\n style: {\n foreground: theme.syntaxComment,\n italic: true,\n },\n },\n {\n scope: [\"comment.documentation\"],\n style: {\n foreground: theme.syntaxComment,\n italic: true,\n },\n },\n {\n scope: [\"string\", \"symbol\"],\n style: {\n foreground: theme.syntaxString,\n },\n },\n {\n scope: [\"number\", \"boolean\"],\n style: {\n foreground: theme.syntaxNumber,\n },\n },\n {\n scope: [\"character.special\"],\n style: {\n foreground: theme.syntaxString,\n },\n },\n {\n scope: [\"keyword.return\", \"keyword.conditional\", \"keyword.repeat\", \"keyword.coroutine\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"keyword.type\"],\n style: {\n foreground: theme.syntaxType,\n bold: true,\n italic: true,\n },\n },\n {\n scope: [\"keyword.function\", \"function.method\"],\n style: {\n foreground: theme.syntaxFunction,\n },\n },\n {\n scope: [\"keyword\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"keyword.import\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"operator\", \"keyword.operator\", \"punctuation.delimiter\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"keyword.conditional.ternary\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"variable\", \"variable.parameter\", \"function.method.call\", \"function.call\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"variable.member\", \"function\", \"constructor\"],\n style: {\n foreground: theme.syntaxFunction,\n },\n },\n {\n scope: [\"type\", \"module\"],\n style: {\n foreground: theme.syntaxType,\n },\n },\n {\n scope: [\"constant\"],\n style: {\n foreground: theme.syntaxNumber,\n },\n },\n {\n scope: [\"property\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"class\"],\n style: {\n foreground: theme.syntaxType,\n },\n },\n {\n scope: [\"parameter\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"punctuation\", \"punctuation.bracket\"],\n style: {\n foreground: theme.syntaxPunctuation,\n },\n },\n {\n scope: [\"variable.builtin\", \"type.builtin\", \"function.builtin\", \"module.builtin\", \"constant.builtin\"],\n style: {\n foreground: theme.error,\n },\n },\n {\n scope: [\"variable.super\"],\n style: {\n foreground: theme.error,\n },\n },\n {\n scope: [\"string.escape\", \"string.regexp\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"keyword.directive\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"punctuation.special\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"keyword.modifier\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"keyword.exception\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n // Markdown specific styles\n {\n scope: [\"markup.heading\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.1\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n underline: true,\n },\n },\n {\n scope: [\"markup.heading.2\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.3\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.4\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.5\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.6\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.bold\", \"markup.strong\"],\n style: {\n foreground: theme.markdownStrong,\n bold: true,\n },\n },\n {\n scope: [\"markup.italic\"],\n style: {\n foreground: theme.markdownEmph,\n italic: true,\n },\n },\n {\n scope: [\"markup.list\"],\n style: {\n foreground: theme.markdownListItem,\n },\n },\n {\n scope: [\"markup.quote\"],\n style: {\n foreground: theme.markdownBlockQuote,\n italic: true,\n },\n },\n {\n scope: [\"markup.raw\", \"markup.raw.block\"],\n style: {\n foreground: theme.markdownCode,\n },\n },\n {\n scope: [\"markup.raw.inline\"],\n style: {\n foreground: theme.markdownCode,\n background: theme.background,\n },\n },\n {\n scope: [\"markup.link\"],\n style: {\n foreground: theme.markdownLink,\n underline: true,\n },\n },\n {\n scope: [\"markup.link.label\"],\n style: {\n foreground: theme.markdownLinkText,\n underline: true,\n },\n },\n {\n scope: [\"markup.link.url\"],\n style: {\n foreground: theme.markdownLink,\n underline: true,\n },\n },\n {\n scope: [\"label\"],\n style: {\n foreground: theme.markdownLinkText,\n },\n },\n {\n scope: [\"spell\", \"nospell\"],\n style: {\n foreground: theme.text,\n },\n },\n // Additional common highlight groups\n {\n scope: [\"string.special\", \"string.special.url\"],\n style: {\n foreground: theme.markdownLink,\n underline: true,\n },\n },\n {\n scope: [\"character\"],\n style: {\n foreground: theme.syntaxString,\n },\n },\n {\n scope: [\"float\"],\n style: {\n foreground: theme.syntaxNumber,\n },\n },\n {\n scope: [\"comment.error\"],\n style: {\n foreground: theme.error,\n italic: true,\n bold: true,\n },\n },\n {\n scope: [\"comment.warning\"],\n style: {\n foreground: theme.warning,\n italic: true,\n bold: true,\n },\n },\n {\n scope: [\"comment.todo\", \"comment.note\"],\n style: {\n foreground: theme.info,\n italic: true,\n bold: true,\n },\n },\n {\n scope: [\"namespace\"],\n style: {\n foreground: theme.syntaxType,\n },\n },\n {\n scope: [\"field\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"type.definition\"],\n style: {\n foreground: theme.syntaxType,\n bold: true,\n },\n },\n {\n scope: [\"keyword.export\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"attribute\", \"annotation\"],\n style: {\n foreground: theme.warning,\n },\n },\n {\n scope: [\"tag\"],\n style: {\n foreground: theme.error,\n },\n },\n {\n scope: [\"tag.attribute\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"tag.delimiter\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"markup.strikethrough\"],\n style: {\n foreground: theme.textMuted,\n },\n },\n {\n scope: [\"markup.underline\"],\n style: {\n foreground: theme.text,\n underline: true,\n },\n },\n {\n scope: [\"markup.list.checked\"],\n style: {\n foreground: theme.success,\n },\n },\n {\n scope: [\"markup.list.unchecked\"],\n style: {\n foreground: theme.textMuted,\n },\n },\n {\n scope: [\"diff.plus\"],\n style: {\n foreground: theme.diffAdded,\n background: theme.diffAddedBg,\n },\n },\n {\n scope: [\"diff.minus\"],\n style: {\n foreground: theme.diffRemoved,\n background: theme.diffRemovedBg,\n },\n },\n {\n scope: [\"diff.delta\"],\n style: {\n foreground: theme.diffContext,\n background: theme.diffContextBg,\n },\n },\n {\n scope: [\"error\"],\n style: {\n foreground: theme.error,\n bold: true,\n },\n },\n {\n scope: [\"warning\"],\n style: {\n foreground: theme.warning,\n bold: true,\n },\n },\n {\n scope: [\"info\"],\n style: {\n foreground: theme.info,\n },\n },\n {\n scope: [\"debug\"],\n style: {\n foreground: theme.textMuted,\n },\n },\n ]\n}\n",
"import { RGBA } from \"@opentui/core\"\nimport { ansiToRgba } from \"./color\"\nimport { DEFAULT_THEMES, type ColorValue, type Theme, type ThemeColor, type ThemeJson } from \"./v1\"\n\nexport { DEFAULT_THEMES, generateSyntax, selectedForeground, type Theme, type ThemeJson } from \"./v1\"\n\nconst pluginThemes: Record<string, ThemeJson> = {}\nlet customThemes: Record<string, ThemeJson> = {}\nlet systemTheme: ThemeJson | undefined\nconst listeners = new Set<(themes: Record<string, ThemeJson>) => void>()\n\nfunction listThemes() {\n // Priority: defaults < plugin installs < custom files < generated system.\n const themes = {\n ...DEFAULT_THEMES,\n ...pluginThemes,\n ...customThemes,\n }\n if (!systemTheme) return themes\n return {\n ...themes,\n system: systemTheme,\n }\n}\n\nfunction syncThemes() {\n const themes = listThemes()\n for (const listener of listeners) listener(themes)\n}\n\nexport function allThemes() {\n return listThemes()\n}\n\nexport function isTheme(theme: unknown): theme is ThemeJson {\n if (typeof theme !== \"object\" || theme === null || Array.isArray(theme)) return false\n const value = Reflect.get(theme, \"theme\")\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function subscribeThemes(listener: (themes: Record<string, ThemeJson>) => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\nexport function setCustomThemes(themes: Record<string, ThemeJson>) {\n customThemes = themes\n syncThemes()\n}\n\nexport function setSystemTheme(theme: ThemeJson | undefined) {\n systemTheme = theme\n syncThemes()\n}\n\nexport function hasTheme(name: string) {\n if (!name) return false\n return allThemes()[name] !== undefined\n}\n\nexport function addTheme(name: string, theme: unknown) {\n if (!name) return false\n if (!isTheme(theme)) return false\n if (hasTheme(name)) return false\n pluginThemes[name] = theme\n syncThemes()\n return true\n}\n\nexport function upsertTheme(name: string, theme: unknown) {\n if (!name) return false\n if (!isTheme(theme)) return false\n if (customThemes[name] !== undefined) {\n customThemes[name] = theme\n } else {\n pluginThemes[name] = theme\n }\n syncThemes()\n return true\n}\n\nexport function resolveTheme(theme: ThemeJson, mode: \"dark\" | \"light\") {\n const defs = theme.defs ?? {}\n function resolveColor(c: ColorValue, chain: string[] = []): RGBA {\n if (c instanceof RGBA) return c\n if (typeof c === \"string\") {\n if (c === \"transparent\" || c === \"none\") return RGBA.fromInts(0, 0, 0, 0)\n\n if (c.startsWith(\"#\")) return RGBA.fromHex(c)\n\n if (chain.includes(c)) {\n throw new Error(`Circular color reference: ${[...chain, c].join(\" -> \")}`)\n }\n\n const next = defs[c] ?? theme.theme[c as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${c}\" not found in defs or theme`)\n }\n return resolveColor(next, [...chain, c])\n }\n if (typeof c === \"number\") {\n return ansiToRgba(c)\n }\n return resolveColor(c[mode], chain)\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]) => {\n return [key, resolveColor(value as ColorValue)]\n }),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n // Handle selectedListItemText separately since it's optional\n const hasSelectedListItemText = theme.theme.selectedListItemText !== undefined\n if (hasSelectedListItemText) {\n resolved.selectedListItemText = resolveColor(theme.theme.selectedListItemText!)\n } else {\n // Backward compatibility: if selectedListItemText is not defined, use background color\n // This preserves the current behavior for all existing themes\n resolved.selectedListItemText = resolved.background\n }\n\n // Handle backgroundMenu - optional with fallback to backgroundElement\n if (theme.theme.backgroundMenu !== undefined) {\n resolved.backgroundMenu = resolveColor(theme.theme.backgroundMenu)\n } else {\n resolved.backgroundMenu = resolved.backgroundElement\n }\n\n // Handle thinkingOpacity - optional with default of 0.6\n const thinkingOpacity = theme.theme.thinkingOpacity ?? 0.6\n\n return {\n ...resolved,\n _hasSelectedListItemText: hasSelectedListItemText,\n thinkingOpacity,\n } as Theme\n}\n",
"import { RGBA, type TerminalColors } from \"@opentui/core\"\nimport { ansiToRgba, tint } from \"./color\"\n\nexport function terminalMode(colors: TerminalColors): \"dark\" | \"light\" | undefined {\n const bg = colors.defaultBackground\n if (!bg) return\n const { r, g, b } = RGBA.fromHex(bg)\n return 0.299 * r + 0.587 * g + 0.114 * b > 0.5 ? \"light\" : \"dark\"\n}\n\nexport function generateSystem(colors: TerminalColors, mode: \"dark\" | \"light\") {\n const bg = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const transparent = RGBA.fromValues(bg.r, bg.g, bg.b, 0)\n const isDark = mode === \"dark\"\n\n const col = (index: number) => {\n const value = colors.palette[index]\n if (value) return RGBA.fromHex(value)\n return ansiToRgba(index)\n }\n\n const grays = generateGrayScale(bg, isDark)\n const textMuted = generateMutedTextColor(bg, isDark)\n const ansiColors = {\n red: col(1),\n green: col(2),\n yellow: col(3),\n blue: col(4),\n magenta: col(5),\n cyan: col(6),\n redBright: col(9),\n greenBright: col(10),\n }\n\n const diffAlpha = isDark ? 0.22 : 0.14\n const diffAddedBg = tint(bg, ansiColors.green, diffAlpha)\n const diffRemovedBg = tint(bg, ansiColors.red, diffAlpha)\n const diffContextBg = grays[2]\n const diffAddedLineNumberBg = tint(diffContextBg, ansiColors.green, diffAlpha)\n const diffRemovedLineNumberBg = tint(diffContextBg, ansiColors.red, diffAlpha)\n\n return {\n theme: {\n primary: ansiColors.cyan,\n secondary: ansiColors.magenta,\n accent: ansiColors.cyan,\n error: ansiColors.red,\n warning: ansiColors.yellow,\n success: ansiColors.green,\n info: ansiColors.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: transparent,\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: ansiColors.green,\n diffRemoved: ansiColors.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansiColors.greenBright,\n diffHighlightRemoved: ansiColors.redBright,\n diffAddedBg,\n diffRemovedBg,\n diffContextBg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg,\n diffRemovedLineNumberBg,\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansiColors.blue,\n markdownLinkText: ansiColors.cyan,\n markdownCode: ansiColors.green,\n markdownBlockQuote: ansiColors.yellow,\n markdownEmph: ansiColors.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansiColors.blue,\n markdownListEnumeration: ansiColors.cyan,\n markdownImage: ansiColors.blue,\n markdownImageText: ansiColors.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansiColors.magenta,\n syntaxFunction: ansiColors.blue,\n syntaxVariable: fg,\n syntaxString: ansiColors.green,\n syntaxNumber: ansiColors.yellow,\n syntaxType: ansiColors.cyan,\n syntaxOperator: ansiColors.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean): Record<number, RGBA> {\n const grays: Record<number, RGBA> = {}\n const bgR = bg.r * 255\n const bgG = bg.g * 255\n const bgB = bg.b * 255\n const luminance = 0.299 * bgR + 0.587 * bgG + 0.114 * bgB\n\n for (let i = 1; i <= 12; i++) {\n const factor = i / 12\n\n if (isDark && luminance < 10) {\n const gray = Math.floor(factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n if (!isDark && luminance > 245) {\n const gray = Math.floor(255 - factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n const next = isDark ? luminance + (255 - luminance) * factor * 0.4 : luminance * (1 - factor * 0.4)\n const ratio = next / luminance\n grays[i] = RGBA.fromInts(\n Math.floor(Math.min(Math.max(bgR * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgG * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgB * ratio, 0), 255)),\n )\n }\n\n return grays\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean): RGBA {\n const luminance = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n if (isDark) {\n const gray = luminance < 10 ? 180 : Math.min(Math.floor(160 + luminance * 0.3), 200)\n return RGBA.fromInts(gray, gray, gray)\n }\n\n const gray = luminance > 245 ? 75 : Math.max(Math.floor(100 - (255 - luminance) * 0.2), 60)\n return RGBA.fromInts(gray, gray, gray)\n}\n",
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { memo as _$memo } from \"@opentui/solid\";\nimport { createContext, Show, useContext } from \"solid-js\";\nexport function createSimpleContext(input) {\n const ctx = createContext();\n return {\n context: ctx,\n provider: props => {\n const init = input.init(props);\n return (// @ts-expect-error\n _$createComponent(Show, {\n get when() {\n return init.ready === undefined || init.ready === true;\n },\n get children() {\n return _$createComponent(ctx.Provider, {\n value: init,\n get children() {\n return props.children;\n }\n });\n }\n })\n );\n },\n use() {\n const value = useContext(ctx);\n if (!value) throw new Error(`${input.name} context must be used within a context provider`);\n return value;\n }\n };\n}",
"import { CliRenderEvents } from \"@opentui/core\";\nimport { useRenderer } from \"@opentui/solid\";\nimport { allThemes, generateSyntax, hasTheme, isTheme, resolveTheme, setCustomThemes, setSystemTheme, subscribeThemes } from \"../theme\";\nimport { generateSystem, terminalMode } from \"../theme/system\";\nimport { createEffect, createMemo, onCleanup, onMount } from \"solid-js\";\nimport { createStore, produce } from \"solid-js/store\";\nimport { createSimpleContext } from \"./helper\";\nimport { useConfig } from \"../config\";\nimport { Global } from \"@opencode-ai/core/global\";\nimport { Glob } from \"@opencode-ai/core/util/glob\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nconst themeSource = {\n async discover() {\n const directories = [Global.Path.config];\n for (let current = process.cwd();; current = path.dirname(current)) {\n directories.push(path.join(current, \".opencode\"));\n if (path.dirname(current) === current) break;\n }\n return discoverThemes(directories);\n },\n subscribeRefresh(refresh) {\n process.on(\"SIGUSR2\", refresh);\n return () => process.off(\"SIGUSR2\", refresh);\n }\n};\nexport async function discoverThemes(directories) {\n const result = {};\n for (const directory of directories) {\n const files = await Glob.scan(\"themes/*.json\", {\n cwd: directory,\n absolute: true,\n dot: true,\n symlink: true\n });\n for (const file of files) {\n result[path.basename(file, \".json\")] = JSON.parse(await readFile(file, \"utf8\"));\n }\n }\n return result;\n}\nexport { DEFAULT_THEMES, addTheme, allThemes, generateSyntax, hasTheme, selectedForeground, upsertTheme } from \"../theme\";\nconst THEME_REFRESH_DELAYS = [250, 1000];\nconst [store, setStore] = createStore({\n themes: allThemes(),\n mode: \"dark\",\n lock: undefined,\n active: \"opencode\",\n ready: false\n});\nsubscribeThemes(themes => setStore(\"themes\", themes));\nexport const {\n use: useTheme,\n provider: ThemeProvider\n} = createSimpleContext({\n name: \"Theme\",\n init: props => {\n const renderer = useRenderer();\n const configState = useConfig();\n const config = configState.data;\n const themes = props.source ?? themeSource;\n const pick = value => {\n if (value === \"dark\" || value === \"light\") return value;\n return;\n };\n setStore(produce(draft => {\n const lock = pick(config.theme?.mode);\n const mode = lock ?? pick(renderer.themeMode) ?? props.mode;\n draft.mode = mode;\n draft.lock = lock;\n const active = config.theme?.name ?? \"opencode\";\n draft.active = typeof active === \"string\" ? active : \"opencode\";\n draft.ready = false;\n }));\n createEffect(() => {\n const theme = config.theme?.name;\n if (theme) setStore(\"active\", theme);\n });\n createEffect(() => {\n const mode = config.theme?.mode;\n if (mode === \"dark\" || mode === \"light\") {\n pin(mode, false);\n return;\n }\n if (mode === \"system\" && store.lock !== undefined) free(false);\n });\n function syncCustomThemes() {\n return themes.discover().then(themes => {\n setCustomThemes(Object.entries(themes).reduce((result, [name, theme]) => {\n if (isTheme(theme)) result[name] = theme;\n return result;\n }, {}));\n }).catch(() => setStore(\"active\", \"opencode\"));\n }\n onMount(() => {\n void Promise.allSettled([resolveSystemTheme(store.mode), syncCustomThemes()]).finally(() => {\n setStore(\"ready\", true);\n });\n });\n let systemThemeSignature;\n let systemThemeMode;\n let hasResolvedSystemTheme = false;\n function resolveSystemTheme(mode = store.mode) {\n return renderer.getPalette({\n size: 16\n }).then(colors => {\n if (!colors.palette[0]) {\n if (hasResolvedSystemTheme) return;\n setSystemTheme(undefined);\n if (store.active === \"system\") setStore(\"active\", \"opencode\");\n return;\n }\n const next = store.lock ?? terminalMode(colors) ?? mode;\n if (store.mode !== next) setStore(\"mode\", next);\n const signature = JSON.stringify(colors);\n hasResolvedSystemTheme = true;\n if (store.themes.system && systemThemeSignature === signature && systemThemeMode === next) return;\n systemThemeSignature = signature;\n systemThemeMode = next;\n setSystemTheme(generateSystem(colors, next));\n }).catch(() => {\n if (hasResolvedSystemTheme) return;\n setSystemTheme(undefined);\n if (store.active === \"system\") setStore(\"active\", \"opencode\");\n });\n }\n let systemRefreshRunning = false;\n let systemRefreshQueued = false;\n let systemRefreshMode = store.mode;\n function refreshSystemTheme(mode = store.mode) {\n systemRefreshMode = mode;\n if (systemRefreshRunning) {\n systemRefreshQueued = true;\n return;\n }\n systemRefreshRunning = true;\n const retry = renderer.paletteDetectionStatus === \"detecting\";\n renderer.clearPaletteCache();\n void resolveSystemTheme(mode).finally(() => {\n systemRefreshRunning = false;\n if (!retry && !systemRefreshQueued) return;\n systemRefreshQueued = false;\n refreshSystemTheme(systemRefreshMode);\n });\n }\n function apply(mode) {\n if (store.mode === mode) return;\n setStore(\"mode\", mode);\n refreshSystemTheme(mode);\n }\n function pin(mode = store.mode, persist = true) {\n setStore(\"lock\", mode);\n apply(mode);\n if (!persist) return;\n void configState.update(draft => {\n draft.theme = {\n ...draft.theme,\n mode\n };\n }).catch(() => {});\n }\n function free(persist = true) {\n setStore(\"lock\", undefined);\n refreshSystemTheme(renderer.themeMode ?? store.mode);\n if (!persist) return;\n void configState.update(draft => {\n draft.theme = {\n ...draft.theme,\n mode: \"system\"\n };\n }).catch(() => {});\n }\n const handle = mode => {\n if (store.lock) return;\n apply(mode);\n };\n renderer.on(CliRenderEvents.THEME_MODE, handle);\n const handleThemeNotification = sequence => {\n if (sequence !== \"\\x1b[?997;1n\" && sequence !== \"\\x1b[?997;2n\") return false;\n queueMicrotask(() => refreshSystemTheme());\n return false;\n };\n renderer.prependInputHandler(handleThemeNotification);\n let themeRefreshTimeouts = [];\n const refresh = () => {\n for (const timeout of themeRefreshTimeouts) clearTimeout(timeout);\n themeRefreshTimeouts = THEME_REFRESH_DELAYS.map(delay => setTimeout(() => {\n refreshSystemTheme();\n if (delay === THEME_REFRESH_DELAYS[THEME_REFRESH_DELAYS.length - 1]) void syncCustomThemes();\n }, delay));\n };\n let unsubscribeRefresh;\n unsubscribeRefresh = themes.subscribeRefresh?.(refresh);\n onCleanup(() => {\n renderer.off(CliRenderEvents.THEME_MODE, handle);\n renderer.removeInputHandler(handleThemeNotification);\n unsubscribeRefresh?.();\n for (const timeout of themeRefreshTimeouts) clearTimeout(timeout);\n themeRefreshTimeouts.length = 0;\n });\n const values = createMemo(() => {\n const active = store.themes[store.active];\n if (active) return resolveTheme(active, store.mode);\n return resolveTheme(store.themes.opencode, store.mode);\n });\n createEffect(() => renderer.setBackgroundColor(values().background));\n const syntax = createSyntaxStyleMemo(() => generateSyntax(values()));\n return {\n theme: new Proxy(values(), {\n get(_target, prop) {\n // @ts-expect-error Properties are forwarded to the current reactive value.\n return values()[prop];\n }\n }),\n get selected() {\n return store.active;\n },\n all: allThemes,\n has: hasTheme,\n syntax,\n mode: () => store.mode,\n locked: () => store.lock !== undefined,\n lock: () => pin(store.mode),\n unlock: free,\n setMode: pin,\n set(theme) {\n if (!hasTheme(theme)) return false;\n setStore(\"active\", theme);\n void configState.update(draft => {\n draft.theme = {\n ...draft.theme,\n name: theme\n };\n }).catch(() => {});\n return true;\n },\n get ready() {\n return store.ready;\n }\n };\n }\n});\nexport function createSyntaxStyleMemo(factory) {\n const renderer = useRenderer();\n const retained = new Set();\n let current;\n const release = style => {\n retained.add(style);\n void renderer.idle().catch(() => {}).finally(() => {\n if (!retained.delete(style)) return;\n style.destroy();\n });\n };\n onCleanup(() => {\n if (current) release(current);\n });\n return createMemo(() => {\n const previous = current;\n current = factory();\n if (previous) release(previous);\n return current;\n });\n}"
],
"mappings": "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",
"debugId": "FA706C3B85321FED64756E2164756E21",
"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": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,OAChD,MACH",
"debugId": "A7D41E69027BC60664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/config/v1/index.tsx"],
"sourcesContent": [
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nexport * as TuiConfig from \".\";\nexport * as TuiConfigV1 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": "552B9A8BF35F31CD64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "BEE6740510D71E9E64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/component/spinner.tsx", "../tui/src/ui/spinner.ts"],
"sourcesContent": [
"import { 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 { memo as _$memo } from \"@opentui/solid\";\nimport { Show } from \"solid-js\";\nimport { useTheme } from \"../context/theme\";\nimport { useConfig } from \"../config\";\nimport { registerOpencodeSpinner } from \"./register-spinner\";\nregisterOpencodeSpinner();\nexport const SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nexport function Spinner(props) {\n const {\n theme\n } = useTheme();\n const config = useConfig().data;\n const color = () => props.color ?? theme.textMuted;\n return _$createComponent(Show, {\n get when() {\n return config.animations ?? true;\n },\n get fallback() {\n return (() => {\n var _el$4 = _$createElement(\"text\");\n _$insert(_el$4, (() => {\n var _c$ = _$memo(() => !!props.children);\n return () => _c$() ? [\"\\u22EF \", _$memo(() => props.children)] : \"⋯\";\n })());\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": "0BEE8070E7FEF55364756E2164756E21",
"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": ";+sBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC",
"debugId": "38D7816DA8F6D59664756E2164756E21",
"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?: (onStatus: (status: Service.Status) => void, signal: AbortSignal) => 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 ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : 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: (onStatus, signal) =>\n Effect.runPromise(Service.start({ ...reconnectOptions, onStatus }).pipe(Effect.provide(NodeFileSystem.layer)), {\n signal,\n }),\n reload: () =>\n Effect.runPromise(\n Effect.gen(function* () {\n yield* Service.stop(options, { targetVersion: options.version })\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)\n 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": "D0E3AE8A22ADF02764756E2164756E21",
"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, { targetVersion: options.version })\n const transport = yield* Service.start(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,WAAO,OAAQ,UAAK,EAAS,CAAE,cAAe,EAAQ,OAAQ,CAAC,EAC/D,IAAM,EAAY,MAAO,EAAQ,MAAM,CAAO,EAC9C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "2F4962C0C5C0BA0F64756E2164756E21",
"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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,WAAM,WAAO,OAAc,aAAQ,MAAC,EACrE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "FF54CEA0D9570E7D64756E2164756E21",
"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/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Effect, FileSystem, Option, 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))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n 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* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": "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",
"debugId": "85FB5E9EB3B7F8CF64756E2164756E21",
"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 { ModelInfo, SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/client\"\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 const end = boundaryIndex === -1 ? messages.length : boundaryIndex\n const compactionIndex = messages.findLastIndex(\n (message, index) => message.type === \"compaction\" && message.status === \"completed\" && index < end,\n )\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && index > compactionIndex && index < end,\n )\n}\n\nexport function contextUsage(\n messages: ReadonlyArray<SessionMessageInfo>,\n models: ReadonlyArray<ModelInfo> | undefined,\n boundary?: string,\n) {\n const last = lastAssistantWithUsage(messages, boundary)\n if (!last) return\n const tokens =\n last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write\n if (tokens <= 0) return\n const model = models?.find((model) => model.providerID === last.model.providerID && model.id === last.model.id)\n return {\n tokens,\n percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : undefined,\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": "E080D453E920D2DE64756E2164756E21",
"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": ";kuCAYA,OAAwB,OACxB,SAAM,OAAiB,MAAC,cAAI,cAAK,cAAK,cAAK,cAAK,cAAK,cAAK,cAAK,cAAK,aAAG,OACjE,QAAe,UACf,OAAS,MACb,YAAQ,OAAK,eAAU,MAAC,OACxB,WAAO,OAAK,eAAU,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": "2F1E472CFF5BA2A264756E2164756E21",
"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": ";yvBAAA,mBAAS,gBACT,yBAOA,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,MAAC,OAAO,MACzC,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": "E8C839A6D883F7F464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/auth.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.connect.oauth({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, 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 status = yield* Effect.promise(() => client.integration.attempt.status({ attemptID, location })).pipe(\n Effect.map((result) => result.data),\n )\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, attemptID)\n }\n return status\n })\n"
],
"mappings": ";ojCAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,QAAQ,MAAM,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,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,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,YAAW,UAAS,CAAC,CAAC,EAAE,KACrG,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CACpC,EACA,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,CAAS,EAEtC,OAAO,EACR",
"debugId": "8C1F0624D531BC2D64756E2164756E21",
"names": []
}

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

+1
-1
{
"name": "@opencode-ai/cli-windows-arm64",
"version": "0.0.0-next-15587",
"version": "0.0.0-next-15590",
"license": "MIT",

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

{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "BEE6740510D71E9E64756E2164756E21",
"names": []
}

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": ";mzCAKA,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,OAAY,OAAO,oBAAe,OAAM,WAAM,OAC9C,OAAS,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": "BB0C86B19086DAAD64756E2164756E21",
"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": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH",
"debugId": "6F7688EDC57F9A2E64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/service/start.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,WAAM,WAAO,OAAc,aAAQ,MAAC,EACrE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "FF54CEA0D9570E7D64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/config/v1/index.tsx"],
"sourcesContent": [
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nexport * as TuiConfig from \".\";\nexport * as TuiConfigV1 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": "552B9A8BF35F31CD64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../../node_modules/.bun/cli-spinners@3.4.0/node_modules/cli-spinners/index.js", "../../node_modules/.bun/opentui-spinner@0.0.7+d3ea10796c516e66/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+d3ea10796c516e66/node_modules/opentui-spinner/dist/solid.mjs", "../tui/src/component/register-spinner.ts"],
"sourcesContent": [
"import spinners from './spinners.json' with {type: 'json'};\n\nexport default spinners;\n\nconst spinnersList = Object.keys(spinners);\n\nexport function randomSpinner() {\n\tconst randomIndex = Math.floor(Math.random() * spinnersList.length);\n\tconst spinnerName = spinnersList[randomIndex];\n\treturn spinners[spinnerName];\n}\n",
"import{Renderable as e,parseColor as t,resolveRenderLib as n}from\"@opentui/core\";import r from\"cli-spinners\";const i=1e3/60,a=1e3;function o(e){if(!Number.isFinite(e)||e<i||e>a)throw RangeError(`Spinner interval must be a finite number between ${i}ms and ${a}ms`);return e}const s={now:()=>performance.now(),setInterval:(e,t)=>{let n=setInterval(e,t);return n.unref(),n},clearInterval:e=>clearInterval(e)},c=new class{active=new Map;heap=[];timer=null;timerDueAt=0;generation=0;lastWakeAt=-1/0;clock;constructor(e=s,t=16){this.denseTickThreshold=t,this.clock=e}setClock(e){if(this.active.size>0||this.timer!==null)throw Error(`Cannot replace the spinner scheduler clock while active`);this.clock=e}start(e,t,n){if(this.active.has(e))return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n};this.active.set(e,r),this.push(r),this.armNext()}reschedule(e,t){let n=this.active.get(e);if(!n)return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n.advance};this.active.set(e,r),this.push(r),this.compactIfNeeded(),this.armNext()}stop(e){this.active.delete(e)&&(this.compactIfNeeded(),this.armNext())}armNext(){this.discardStaleRoots();let e=this.heap[0];if(!e){this.cancelTimer(),this.lastWakeAt=-1/0;return}let t=this.clock.now(),n=Math.max(e.nextDueAt,this.lastWakeAt+i);if(this.timer!==null&&this.timerDueAt===n)return;this.cancelTimer();let r=this.generation,a=Math.max(n-t,0);this.timerDueAt=n,this.timer=this.clock.setInterval(()=>this.tick(r),a)}cancelTimer(){this.timer!==null&&(this.generation++,this.clock.clearInterval(this.timer),this.timer=null)}tick(e){if(e!==this.generation||this.timer===null)return;let t=this.timer;this.generation++,this.timer=null,this.clock.clearInterval(t);let n=this.clock.now();this.discardStaleRoots();let r=!1,i=0,a=[];for(;this.heap[0]&&this.heap[0].nextDueAt<=n;){let e=this.pop();if(!(!e||!this.isCurrent(e))){try{e.advance()}catch(e){a.push(e)}if(r=!0,this.isCurrent(e)&&(e.nextDueAt=n+e.interval,this.push(e),i++,i===this.denseTickThreshold)){let e=this.heap;this.heap=[];for(let t of e)if(this.isCurrent(t)){if(t.nextDueAt<=n){try{t.advance()}catch(e){a.push(e)}if(r=!0,!this.isCurrent(t))continue;t.nextDueAt=n+t.interval}this.heap.push(t)}this.heapify();break}}}if(r&&(this.lastWakeAt=n),this.compactIfNeeded(),this.armNext(),a.length===1)throw a[0];if(a.length>1)throw AggregateError(a,`Multiple spinner callbacks failed`)}isCurrent(e){return this.active.get(e.spinner)===e}discardStaleRoots(){for(;this.heap[0]&&!this.isCurrent(this.heap[0]);)this.pop()}compactIfNeeded(){this.heap.length<=this.active.size*2+16||(this.heap=Array.from(this.active.values()),this.heapify())}heapify(){for(let e=Math.floor(this.heap.length/2)-1;e>=0;e--)this.siftDown(e)}push(e){this.heap.push(e);let t=this.heap.length-1;for(;t>0;){let n=Math.floor((t-1)/2);if(this.heap[n].nextDueAt<=e.nextDueAt)break;this.heap[t]=this.heap[n],t=n}this.heap[t]=e}pop(){let e=this.heap[0],t=this.heap.pop();return!e||!t||this.heap.length===0?e:(this.heap[0]=t,this.siftDown(0),e)}siftDown(e){let t=this.heap[e],n=e;for(;;){let e=n*2+1;if(e>=this.heap.length)break;let r=e+1,i=r<this.heap.length&&this.heap[r].nextDueAt<this.heap[e].nextDueAt?r:e;if(this.heap[i].nextDueAt>=t.nextDueAt)break;this.heap[n]=this.heap[i],n=i}this.heap[n]=t}};function l(e,t=1){if(e.length===0)throw RangeError(`createPulse requires at least one color`);return n=>e[Math.floor(n*t)%e.length]}function u(e){if(e.length===0)throw RangeError(`createWave requires at least one color`);return(t,n,r,i)=>{let a=(n+t)%i;return e[Math.floor(a/i*e.length)]??e[0]}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=class extends e{_name;_frames;_interval;_autoplay;_backgroundColor;_parsedBackgroundColor;_color;_parsedColor;_currentFrameIndex=0;_encodedFrames={};_lib=n();_isRunning=!1;_advanceFrame=()=>{!this._isRunning||this.isDestroyed||(this._currentFrameIndex=(this._currentFrameIndex+1)%this._frames.length,this.requestRender())};_defaultOptions={name:`dots`,frames:r.dots.frames,interval:r.dots.interval,autoplay:!0,backgroundColor:`transparent`,color:`white`};constructor(e,n){super(e,n),this._name=n.name,this._frames=n.frames?.length?n.frames:this._name?r[this._name].frames:this._defaultOptions.frames,this._interval=o(n.interval??(this._name?r[this._name].interval:this._defaultOptions.interval)),this._autoplay=n.autoplay??this._defaultOptions.autoplay,this._backgroundColor=n.backgroundColor??this._defaultOptions.backgroundColor,this._parsedBackgroundColor=t(this._backgroundColor),this._color=n.color??this._defaultOptions.color,this._parsedColor=typeof this._color==`function`?t(this._defaultOptions.color):t(this._color),this.height=1,this._encodeFrames(),this._autoplay&&this.start()}_encodeFrames(){let e=0;for(let t of this._frames){if(this._encodedFrames[t])continue;let n=this._lib.encodeUnicode(t,this.ctx.widthMethod);n&&(this._encodedFrames[t]=n,e=Math.max(e,n.data.reduce((e,t)=>e+t.width,0)))}this.width=e}_freeFrames(){for(let e in this._encodedFrames)this._encodedFrames[e]&&this._lib.freeUnicode(this._encodedFrames[e]);this._encodedFrames={}}get interval(){return this._interval}set interval(e){this._interval=o(e),this._isRunning&&c.reschedule(this,this._interval)}get name(){return this._name}set name(e){let t=e?r[e].frames:this._defaultOptions.frames,n=o(e?r[e].interval:this._defaultOptions.interval),i=!d(this._frames,t),a=this._interval!==n;this._name=e,this._interval=n,i&&(this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()),this._isRunning&&a&&c.reschedule(this,n)}get frames(){return this._frames}set frames(e){let t=e.length===0?this._defaultOptions.frames:e;if(d(this._frames,t)){this._frames=t;return}this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()}get color(){return this._color}set color(e){this._color=e,typeof e!=`function`&&(this._parsedColor=t(e)),this.visible&&this.requestRender()}get backgroundColor(){return this._backgroundColor}set backgroundColor(e){this._backgroundColor=e,this._parsedBackgroundColor=t(e),this.visible&&this.requestRender()}get visible(){return super.visible}set visible(e){e!==super.visible&&(super.visible=e,this._isRunning&&(e?c.start(this,this._interval,this._advanceFrame):c.stop(this)))}get autoplay(){return this._autoplay}set autoplay(e){this._autoplay=e,e?this.start():this.stop()}start(){this._isRunning||this.isDestroyed||(this._isRunning=!0,this.visible&&c.start(this,this._interval,this._advanceFrame))}stop(){this._isRunning&&(this._isRunning=!1,c.stop(this))}renderSelf(e){if(!this.visible)return;let n=this._frames[this._currentFrameIndex];if(!n)return;let r=this._encodedFrames[n];if(!r)return;let i=this.x;for(let n=0;n<r.data.length;n++){let a=typeof this._color==`function`?t(this._color(this._currentFrameIndex,n,this._frames.length,r.data.length)):this._parsedColor;e.drawChar(r.data[n].char,i,this.y,a,this._parsedBackgroundColor),i+=r.data[n].width}}destroySelf(){this.stop(),this._freeFrames(),super.destroySelf()}};export{l as n,u as r,f as t};",
"import{t as e}from\"./src-DjeqLSfu.mjs\";import{extend as t}from\"@opentui/solid/components\";function n(){t({spinner:e})}n();export{n as registerSpinner};",
"import { getComponentCatalogue } from \"@opentui/solid/components\"\nimport { registerSpinner } from \"opentui-spinner/solid\"\n\nexport function registerOpencodeSpinner() {\n if (!getComponentCatalogue().spinner) registerSpinner()\n}\n"
],
"mappings": "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",
"debugId": "7367A37937B2D35C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/logout.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n"
],
"mappings": ";ojCAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "38C6995869B5E78064756E2164756E21",
"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?: (onStatus: (status: Service.Status) => void, signal: AbortSignal) => 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 ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : 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: (onStatus, signal) =>\n Effect.runPromise(Service.start({ ...reconnectOptions, onStatus }).pipe(Effect.provide(NodeFileSystem.layer)), {\n signal,\n }),\n reload: () =>\n Effect.runPromise(\n Effect.gen(function* () {\n yield* Service.stop(options, { targetVersion: options.version })\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)\n 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": "D0E3AE8A22ADF02764756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/auth.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.connect.oauth({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, 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 status = yield* Effect.promise(() => client.integration.attempt.status({ attemptID, location })).pipe(\n Effect.map((result) => result.data),\n )\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, attemptID)\n }\n return status\n })\n"
],
"mappings": ";ojCAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,QAAQ,MAAM,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,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,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,YAAW,UAAS,CAAC,CAAC,EAAE,KACrG,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CACpC,EACA,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,CAAS,EAEtC,OAAO,EACR",
"debugId": "8C1F0624D531BC2D64756E2164756E21",
"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": ";k9BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,SAAI,OAAO,oBAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "C6D62EDFBA3BDE2964756E2164756E21",
"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": "646BB809BE43AA1864756E2164756E21",
"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": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,OAChD,MACH",
"debugId": "A7D41E69027BC60664756E2164756E21",
"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": ";mzCAKA,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,OAAO,aAAQ,MACnC,YAAQ,OAAO,oBAAe,OAAM,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": "ED1315E3DD1F3C9164756E2164756E21",
"names": []
}

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

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

{
"version": 3,
"sources": ["src/mini/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",
"import type { SessionMessageInfo, SessionMessageUser } from \"@opencode-ai/client/promise\"\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = SessionMessageInfo[]\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 messagePrompt(message: SessionMessageUser): RunPrompt {\n return {\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\",\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}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) =>\n message.type === \"user\"\n ? [{ prompt: messagePrompt(message), provider: undefined, model: undefined, variant: undefined }]\n : [],\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 current = createSession(response.data.toReversed())\n return {\n ...current,\n turns: current.turns.map((turn) => ({\n ...turn,\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n })),\n ...(session.model && {\n model: { providerID: session.model.providerID, modelID: session.model.id },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n return session.turns\n .map((turn) => turn.prompt)\n .filter((prompt) => prompt.text.trim())\n .filter((prompt, index, prompts) => index === 0 || !promptSame(prompts[index - 1], prompt))\n .map(promptCopy)\n .slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) return\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) return session.variant\n\n return session.turns.findLast((turn) => turn.provider === model.providerID && turn.model === model.modelID)?.variant\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 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 chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\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): RunTheme {\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 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(footerTheme, scrollbackTheme, splashTheme(scrollbackTheme, indexed), syntax)\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n"
],
"mappings": "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",
"debugId": "A752D63D6B1547EE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/component/spinner.tsx", "../tui/src/ui/spinner.ts"],
"sourcesContent": [
"import { 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 { memo as _$memo } from \"@opentui/solid\";\nimport { Show } from \"solid-js\";\nimport { useTheme } from \"../context/theme\";\nimport { useConfig } from \"../config\";\nimport { registerOpencodeSpinner } from \"./register-spinner\";\nregisterOpencodeSpinner();\nexport const SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nexport function Spinner(props) {\n const {\n theme\n } = useTheme();\n const config = useConfig().data;\n const color = () => props.color ?? theme.textMuted;\n return _$createComponent(Show, {\n get when() {\n return config.animations ?? true;\n },\n get fallback() {\n return (() => {\n var _el$4 = _$createElement(\"text\");\n _$insert(_el$4, (() => {\n var _c$ = _$memo(() => !!props.children);\n return () => _c$() ? [\"\\u22EF \", _$memo(() => props.children)] : \"⋯\";\n })());\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": "0BEE8070E7FEF55364756E2164756E21",
"names": []
}

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

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

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

{
"version": 3,
"sources": ["src/commands/handlers/service/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 options = yield* ServiceConfig.options()\n const status = yield* Service.status(options)\n if (status.type !== \"ready\") {\n process.stdout.write(status.type + EOL)\n return\n }\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? status.type) + EOL)\n }),\n)\n"
],
"mappings": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,OAAS,WAAO,OAAQ,OAAO,CAAO,EAC5C,GAAI,EAAO,OAAS,QAAS,CAC3B,QAAQ,OAAO,MAAM,EAAO,KAAO,CAAG,EACtC,OAEF,IAAM,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,EAAO,MAAQ,CAAG,EACvD,CACH",
"debugId": "30CC89327FBFD67C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\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 = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "461864826FFEF13564756E2164756E21",
"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 { ModelInfo, SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/client\"\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 const end = boundaryIndex === -1 ? messages.length : boundaryIndex\n const compactionIndex = messages.findLastIndex(\n (message, index) => message.type === \"compaction\" && message.status === \"completed\" && index < end,\n )\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && index > compactionIndex && index < end,\n )\n}\n\nexport function contextUsage(\n messages: ReadonlyArray<SessionMessageInfo>,\n models: ReadonlyArray<ModelInfo> | undefined,\n boundary?: string,\n) {\n const last = lastAssistantWithUsage(messages, boundary)\n if (!last) return\n const tokens =\n last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write\n if (tokens <= 0) return\n const model = models?.find((model) => model.providerID === last.model.providerID && model.id === last.model.id)\n return {\n tokens,\n percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : undefined,\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": "E080D453E920D2DE64756E2164756E21",
"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 { 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 type { MiniToolPart } from \"./types\"\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: MiniToolPart) {\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: MiniToolPart) {\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 { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { UI } from \"./ui\"\nimport type { MiniToolPart } from \"./types\"\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: MiniToolPart) => Promise<void>\n renderToolError: (part: MiniToolPart) => 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: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const 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 = {\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 = {\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 = {\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: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: 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: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(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 = {\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": ";gzBAsBA,oBAAsB,OAAO,MAAC,OAAyB,MACrD,QAAS,MAAK,OACd,SAAM,OAAe,OAAW,aAAQ,WAAM,WAAQ,YAAY,WAAM,SAAI,WAAM,UAAK,EAAG,EAAM,MAAM,EAChG,EAAqB,yCACrB,EAAY,GAAe,EAEjC,GAAI,CACF,IAAM,EAAM,EAAS,KAAK,CACxB,QAAS,EAAM,OAAO,SAAS,IAC/B,QAAS,EAAQ,QAAQ,EAAM,OAAO,QAAQ,CAChD,CAAC,EACK,EAAQ,GAAW,EAAM,KAAK,EAChC,EACE,EAAe,IAAM,CAEzB,OADA,IAAc,GAAc,EAAK,EAAW,EAAM,KAAK,EAChD,GAEH,EAAiB,SAAY,CACjC,IAAO,EAAO,GAAY,MAAM,QAAQ,IAAI,CAC1C,EAAa,EACb,GAAc,EAAK,EAAW,CAAK,CACrC,CAAC,EACK,EACJ,IAAU,GAAU,MAAQ,CAAE,WAAY,EAAS,MAAM,WAAY,QAAS,EAAS,MAAM,EAAG,EAAI,QACtG,GAAI,EAAY,MAAM,EAAoB,CAAE,MAAK,YAAW,MAAO,CAAW,CAAC,EAC/E,IAAM,EAAU,GAAa,MAAM,EAAc,EAAK,EAAW,EAAO,CAAK,EAC7E,MAAO,CAAE,GAAI,EAAQ,GAAI,MAAO,EAAQ,MAAO,OAAQ,IAAa,MAAU,GAE1E,EAAS,CACb,EACA,IACG,EAAc,EAAK,EAAW,EAAK,MAAO,EAAK,MAAO,EAAK,OAAO,EAEvE,MADgB,MAAM,GACR,2BAA2B,CACvC,MACA,YACA,eACA,QAAS,EACT,cAAe,EACf,MAAO,EAAM,MACb,QACA,QAAS,OACT,MAAO,CAAC,EACR,eACA,SAAU,GACV,OAAQ,EAAM,QAAU,GACxB,YAAa,EAAM,YACnB,KAAM,EAAM,KACZ,UAAW,EAAM,SACnB,CAAC,EACD,MAAO,EAAO,CACd,GAAI,aAAiB,OAAS,EAAM,UAAY,EAAyB,EAAK,EAAM,OAAO,EAC3F,MAAM,GAIH,SAAS,CAAoB,EAAG,CACrC,GAAI,CAAC,QAAQ,OAAO,MAAO,EAAK,qCAAqC,EAIhE,SAAS,CAAU,CAAC,EAA2B,EAA4B,CAChF,GAAI,CAAC,EAAQ,OAAO,GAAS,OAC7B,GAAI,CAAC,EAAO,OAAO,EACnB,OAAO,EAAQ;AAAA,EAAO,EAGxB,SAAS,EAAQ,CAAC,EAAyB,CAEzC,GADA,EAAqB,EACjB,EAAM,cAAgB,SAAc,CAAC,OAAO,UAAU,EAAM,WAAW,GAAK,EAAM,aAAe,GACnG,EAAK,2CAA2C,EAElD,GAAI,EAAM,MAAQ,CAAC,EAAM,UAAY,CAAC,EAAM,QAAS,EAAK,yCAAyC,EACnG,EAAwB,EAAE,UAAU,EAGtC,SAAS,EAAc,EAAW,CAChC,IAAM,EAAO,QAAQ,IAAI,KAAO,QAAQ,IAAI,EAC5C,GAAI,CAEF,OADA,QAAQ,MAAM,CAAI,EACX,QAAQ,IAAI,EACnB,KAAM,CACN,EAAK,iCAAiC,GAAM,GAIhD,SAAS,EAAU,CAAC,EAAmC,CACrD,GAAI,CAAC,EAAO,OACZ,IAAO,KAAe,GAAQ,EAAM,MAAM,GAAG,EACvC,EAAU,EAAK,KAAK,GAAG,EAC7B,GAAI,CAAC,GAAc,CAAC,EAAS,EAAK,4CAA4C,EAC9E,MAAO,CAAE,aAAY,SAAQ,EAG/B,eAAe,EAAa,CAAC,EAAqB,EAAmB,EAAe,CAClF,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,KAAK,IAAI,EAAI,KAC1B,EACJ,MAAO,KAAK,IAAI,EAAI,EAAU,CAC5B,EAAS,MAAM,EAAI,MAAM,KAAK,CAAE,SAAU,CAAE,WAAU,CAAE,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAChF,IAAM,EAAQ,GAAQ,KAAK,KAAK,CAAC,IAAS,EAAK,KAAO,CAAI,EAC1D,GAAI,GAAO,OAAS,WAAY,CAC9B,EAAQ,UAAU,sEAAyE,EAC3F,OAEF,GAAI,EAAO,OAAO,EAClB,MAAM,IAAI,MAAM,EAAE,EAEpB,GAAI,CAAC,EAAQ,CACX,EAAQ,sDAAsD,EAC9D,OAEF,EAAQ,UAAU,6CAAgD,EAGpE,eAAe,EAAa,CAAC,EAAqB,EAAmB,EAAyB,EAAuB,CACnH,IAAM,EACJ,IACC,EAAM,QACH,MAAM,EAAI,QAAQ,IAAI,CAAE,UAAW,EAAM,OAAQ,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EACzE,EAAM,SACJ,MAAM,EAAI,QACP,KAAK,CAAE,YAAW,SAAU,KAAM,MAAO,EAAG,MAAO,MAAO,CAAC,EAC3D,KAAK,CAAC,IAAW,EAAO,KAAK,EAAE,EAClC,QACR,GAAI,EAAM,SAAW,CAAC,EAAU,EAAK,mBAAmB,EACxD,GAAI,CAAC,EAAU,OACf,GAAI,CAAC,EAAM,KAAM,OAAO,EACxB,OAAO,EAAI,QAAQ,KAAK,CAAE,UAAW,EAAS,EAAG,CAAC,EAGpD,eAAe,CAAa,CAC1B,EACA,EACA,EACA,EACA,EACkB,CAClB,GAAI,EAAO,MAAM,EAAoB,CAAE,MAAK,YAAW,OAAM,CAAC,EAC9D,OAAO,EAAI,QAAQ,OAAO,CACxB,QACA,MAAO,EAAQ,CAAE,WAAY,EAAM,WAAY,GAAI,EAAM,QAAS,SAAQ,EAAI,OAC9E,SAAU,CAAE,WAAU,CACxB,CAAC,EAGH,SAAS,CAAO,CAAC,EAAiB,CAChC,QAAQ,OAAO,MAAM,2BAA2B;AAAA,CAAW,EAG7D,SAAS,CAAI,CAAC,EAAwB,CACpC,QAAQ,OAAO,MAAM,gCAAgC;AAAA,CAAW,EAChE,QAAQ,KAAK,CAAC,EC1KhB,eAAS,qBACT,qBCHA,cAAS,yFCFT,cAAS,YAEF,IAAM,EAAQ,CACnB,SAAU,WACV,YAAa,UACb,kBAAmB,kBACnB,iBAAkB,iBACpB,EAEO,SAAS,CAAO,IAAI,EAAmB,CAC5C,QAAQ,OAAO,MAAM,EAAQ,KAAK,GAAG,EAAI,EAAG,EAG9C,IAAI,EAAQ,GAEL,SAAS,EAAK,EAAG,CACtB,GAAI,EAAO,OACX,EAAQ,EAAM,WAAW,EACzB,EAAQ,GAGH,SAAS,EAAK,CAAC,EAAiB,CACrC,GAAI,EAAQ,WAAW,SAAS,EAAG,EAAU,EAAQ,MAAM,CAAgB,EAC3E,EAAQ,EAAM,iBAAmB,UAAY,EAAM,YAAc,CAAO,ED8B1E,IAAM,EAAyB,SAE/B,eAAsB,CAAuB,CAAC,EAAc,CAC1D,IAAM,EAAa,IAAI,gBACjB,EAAS,EAAM,OAAO,MAAM,UAAU,CAAE,OAAQ,EAAW,MAAO,CAAC,EAAE,OAAO,eAAe,EAEjG,IADkB,MAAM,EAAO,KAAK,GACtB,KAAM,MAAU,MAAM,mDAAmD,EAEvF,IAAM,EAAY,EAAe,GAAG,OAAO,EACrC,EAAS,IAAI,IACb,EAAQ,IAAI,IACd,EAAY,GACZ,EAAW,GACX,EAAe,GACf,EAAmB,GACnB,EAAqB,GACrB,EAAgB,GAChB,EAAc,GACd,EAEE,EAAO,CAAC,EAAc,EAAmB,IAAkC,CAC/E,GAAI,EAAM,SAAW,OAAQ,MAAO,GAEpC,OADA,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAE,OAAM,YAAW,UAAW,EAAM,aAAc,CAAK,CAAC,EAAI,CAAG,EAC5F,IAGH,EAAY,CAAC,EAAgD,IAAsB,CACvF,GAAI,EAAK,OAAQ,EAAW,CAAE,MAAK,CAAC,EAAG,OACvC,IAAM,EAAO,EAAK,KAAK,KAAK,EAC5B,GAAI,CAAC,EAAM,OACX,GAAI,CAAC,QAAQ,OAAO,MAAO,CACzB,QAAQ,OAAO,MAAM,EAAO,CAAG,EAC/B,OAEF,EAAG,MAAM,EACT,EAAG,QAAQ,CAAI,EACf,EAAG,MAAM,GAGL,EAAkB,MAAO,IAA8E,CAC3G,GAAI,CAAC,EAAM,KACT,EAAqB,GACrB,EAAG,QACD,EAAG,MAAM,kBAAoB,IAC7B,EAAG,MAAM,YACP,yBAAyB,EAAQ,WAAW,EAAQ,UAAU,KAAK,IAAI,oBAC3E,EASF,GAPA,MAAM,EAAM,OAAO,WAChB,MAAM,CACL,UAAW,EAAM,UACjB,UAAW,EAAQ,GACnB,MAAO,EAAM,KAAO,OAAS,QAC/B,CAAC,EACA,MAAM,IAAM,EAAE,EACb,CAAC,EAAM,KACT,MAAM,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,GAIjF,EAAiB,MAAO,IAA4B,CACxD,EAAmB,GACnB,MAAM,EAAM,OAAO,SAAS,OAAO,CAAE,UAAW,EAAM,UAAW,UAAW,EAAQ,EAAG,CAAC,EAAE,MAAM,IAAM,EAAE,GAGpG,EAAa,MAAO,IAAmD,CAC3E,EAAgB,GAChB,MAAM,EAAM,OAAO,KAAK,OAAO,CAAE,UAAW,EAAQ,UAAW,OAAQ,EAAQ,EAAG,CAAC,EAAE,MAAM,IAAM,EAAE,GAG/F,GAAU,SAAY,CAC1B,MAAO,CAAC,EAAW,OAAO,QAAS,CACjC,IAAM,EAAO,MAAM,EAAO,KAAK,EAAE,MAAM,CAAC,IAAU,CAChD,GAAI,CAAC,EAAc,MAAM,EACzB,MAAO,CAAE,KAAM,GAAe,MAAO,MAAU,EAChD,EACD,GAAI,EAAK,KAAM,CACb,GAAI,EAAc,OAClB,MAAU,MAAM,mDAAmD,EAErE,IAAM,EAAQ,EAAK,MAEnB,GAAI,EAAM,OAAS,uBAAyB,GAAa,EAAM,KAAK,YAAc,EAAM,UAAW,CACjG,MAAM,EAAgB,EAAM,IAAI,EAChC,SAEF,GAAI,EAAM,OAAS,qBAAuB,GAAa,EAAM,KAAK,YAAc,EAAM,UAAW,CAC/F,MAAM,EAAe,EAAM,IAAI,EAC/B,SAEF,GACE,EAAM,OAAS,gBACf,IACC,EAAM,KAAK,KAAK,YAAc,EAAM,WAClC,CAAC,EAAM,UAAY,EAAM,KAAK,KAAK,YAAc,GACpD,CACA,MAAM,EAAW,EAAM,KAAK,IAAI,EAChC,SAEF,GAAI,EAAE,cAAe,EAAM,OAAS,EAAM,KAAK,YAAc,EAAM,UAAW,SAC9E,IAAM,EAAO,GAAS,YAAa,EAAQ,EAAM,QAAU,MAAS,EAEpE,GAAI,EAAM,OAAS,0BACjB,GAAI,EAAM,KAAK,UAAY,EAAW,CACpC,EAAW,GACX,UAGJ,GACE,EAAM,OAAS,iCACf,EAAM,KAAK,SAAW,SACrB,GAAe,GAAsB,GAAoB,GAE1D,OAEF,GAAI,CAAC,EAAU,SAEf,GAAI,EAAM,OAAS,uBAAwB,CACzC,IAAM,EAAO,CACX,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,aACN,SAAU,EAAM,KAAK,QACvB,EACA,GAAI,CAAC,EAAK,aAAc,EAAM,CAAE,MAAK,CAAC,GAAK,EAAM,SAAW,OAC1D,EAAG,MAAM,EACT,EAAG,QAAQ,KAAK,EAAM,KAAK,cAAU,EAAM,KAAK,MAAM,IAAI,EAC1D,EAAG,MAAM,EAEX,SAGF,GAAI,EAAM,OAAS,uBAAwB,CACzC,EAAO,IAAI,OAAQ,CAAE,GAAI,EAAO,EAAM,EAAE,EAAG,UAAW,CAAK,CAAC,EAC5D,SAEF,GAAI,EAAM,OAAS,qBAAsB,CACvC,IAAM,EAAU,EAAO,IAAI,MAAM,EACjC,EAAO,OAAO,MAAM,EACpB,IAAM,EAAO,CACX,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,KAAM,EAAM,KAAK,KACjB,KAAM,CAAE,MAAO,GAAS,WAAa,EAAM,IAAK,CAAK,CACvD,EACA,EAAU,EAAM,CAAI,EACpB,SAGF,GAAI,EAAM,OAAS,4BAA6B,CAC9C,EAAO,IAAI,YAAa,CAAE,GAAI,EAAO,EAAM,EAAE,EAAG,UAAW,CAAK,CAAC,EACjE,SAEF,GAAI,EAAM,OAAS,2BAA6B,EAAM,SAAU,CAC9D,IAAM,EAAU,EAAO,IAAI,WAAW,EACtC,EAAO,OAAO,WAAW,EACzB,IAAM,EAAO,CACX,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,YACN,KAAM,EAAM,KAAK,KACjB,SAAU,EAAM,KAAK,MACrB,KAAM,CAAE,MAAO,GAAS,WAAa,EAAM,IAAK,CAAK,CACvD,EACA,GAAI,EAAK,YAAa,EAAM,CAAE,MAAK,CAAC,EAAG,SACvC,IAAM,EAAO,EAAK,KAAK,KAAK,EAC5B,GAAI,CAAC,EAAM,SACX,IAAM,EAAO,aAAa,IAC1B,GAAI,CAAC,QAAQ,OAAO,MAAO,CACzB,QAAQ,OAAO,MAAM,EAAO,CAAG,EAC/B,SAEF,EAAG,MAAM,EACT,EAAG,QAAQ,GAAG,EAAG,MAAM,kBAAoB,WAAgB,EAAG,MAAM,aAAa,EACjF,EAAG,MAAM,EACT,SAGF,GAAI,EAAM,OAAS,6BAA8B,CAC/C,EAAM,IAAI,EAAM,KAAK,OAAQ,CAC3B,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EACX,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,EAAM,KAAK,KACjB,MAAO,CAAC,CACV,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,2BAA4B,CAC7C,IAAM,EAAU,EAAM,IAAI,EAAM,KAAK,MAAM,EAC3C,GAAI,EAAS,EAAQ,IAAM,EAAM,KAAK,KACtC,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,IAAM,EAAU,EAAM,IAAI,EAAM,KAAK,MAAM,EAC3C,EAAM,IAAI,EAAM,KAAK,OAAQ,CAC3B,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,GAAS,WAAa,EACjC,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,GAAS,MAAQ,OACvB,MAAO,EAAM,KAAK,MAClB,IAAK,GAAS,IACd,SAAU,CAAE,SAAU,EAAM,KAAK,SAAU,MAAO,EAAM,KAAK,KAAM,CACrE,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,uBAAwB,CACzC,IAAM,EAAU,EAAM,IAAI,EAAM,KAAK,MAAM,GAAK,EAAa,CAAK,EAC5D,EAAqB,CACzB,GAAI,EAAQ,GACZ,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,OAAQ,EAAM,KAAK,OACnB,KAAM,EAAQ,KACd,MAAO,CACL,OAAQ,YACR,MAAO,EAAQ,MACf,OAAQ,EAAM,KAAK,QAChB,OAAO,CAAC,IAAS,EAAK,OAAS,MAAM,EACrC,IAAI,CAAC,IAAS,EAAK,IAAI,EACvB,KAAK;AAAA,CAAI,EACZ,MAAO,EAAQ,KACf,SAAU,CACR,WAAY,EAAM,KAAK,WACvB,QAAS,EAAM,KAAK,QACpB,OAAQ,EAAM,KAAK,OACnB,aAAc,EAAQ,SACtB,eAAgB,CAAE,SAAU,EAAM,KAAK,SAAU,MAAO,EAAM,KAAK,WAAY,EAC/E,SAAU,EAAQ,GACpB,EACA,KAAM,CAAE,MAAO,EAAQ,UAAW,IAAK,CAAK,CAC9C,CACF,EAEA,GADA,EAAM,OAAO,EAAM,KAAK,MAAM,EAC1B,CAAC,EAAK,WAAY,EAAM,CAAE,MAAK,CAAC,EAAG,MAAM,EAAM,WAAW,CAAI,EAClE,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,IAAM,EAAU,EAAM,IAAI,EAAM,KAAK,MAAM,GAAK,EAAa,CAAK,EAC5D,EAAQ,EAAM,KAAK,MAAM,QACzB,EAAqB,CACzB,GAAI,EAAQ,GACZ,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,OAAQ,EAAM,KAAK,OACnB,KAAM,EAAQ,KACd,MAAO,CACL,OAAQ,QACR,MAAO,EAAQ,MACf,QACA,SAAU,CACR,OAAQ,EAAM,KAAK,OACnB,aAAc,EAAQ,SACtB,eAAgB,CAAE,SAAU,EAAM,KAAK,SAAU,MAAO,EAAM,KAAK,WAAY,EAC/E,SAAU,EAAQ,GACpB,EACA,KAAM,CAAE,MAAO,EAAQ,UAAW,IAAK,CAAK,CAC9C,CACF,EAEA,GADA,EAAM,OAAO,EAAM,KAAK,MAAM,EAC1B,CAAC,EAAK,WAAY,EAAM,CAAE,MAAK,CAAC,EAClC,MAAM,EAAM,gBAAgB,CAAI,EAChC,EAAG,MAAM,CAAK,EAEhB,SAGF,GAAI,EAAM,OAAS,qBAAsB,CACvC,IAAM,EAAO,CACX,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,cACN,OAAQ,EAAM,KAAK,OACnB,SAAU,EAAM,KAAK,SACrB,KAAM,EAAM,KAAK,KACjB,OAAQ,EAAM,KAAK,MACrB,EACA,EAAK,cAAe,EAAM,CAAE,MAAK,CAAC,EAClC,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,GAAI,GAAe,GAAsB,GAAoB,EAAe,SAG5E,GAFA,EAAe,GACf,QAAQ,SAAW,EACf,CAAC,EAAK,QAAS,EAAM,CAAE,MAAO,EAAM,KAAK,KAAM,CAAC,EAAG,EAAG,MAAM,EAAM,KAAK,MAAM,OAAO,EACxF,SAEF,GAAI,EAAM,OAAS,2BAA4B,CAC7C,GAAI,CAAC,GAAgB,CAAC,GAAoB,CAAC,GAGzC,GAFA,EAAe,GACf,QAAQ,SAAW,EACf,CAAC,EAAK,QAAS,EAAM,CAAE,MAAO,EAAM,KAAK,KAAM,CAAC,EAAG,EAAG,MAAM,EAAM,KAAK,MAAM,OAAO,EAE1F,OAEF,GAAI,EAAM,OAAS,gCAAiC,CAClD,GAAI,EAAM,KAAK,SAAW,QAAU,EAAa,QAAQ,SAAW,IACpE,GAAI,EAAM,KAAK,SAAW,QAAU,CAAC,EAAc,CACjD,EAAe,GACf,QAAQ,SAAW,EACnB,IAAM,EAAQ,CAAE,KAAM,UAAoB,QAAS,wBAAwB,EAAM,KAAK,QAAS,EAC/F,GAAI,CAAC,EAAK,QAAS,EAAM,CAAE,OAAM,CAAC,EAAG,EAAG,MAAM,EAAM,OAAO,EAE7D,OAEF,GAAI,EAAM,OAAS,8BAA+B,SAIhD,EAAY,IAAM,CACtB,GAAI,EAAa,QAAQ,KAAK,GAAG,EACjC,EAAc,GACd,QAAQ,SAAW,IACnB,GAAW,MAAM,EACZ,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,GAEpF,QAAQ,GAAG,SAAU,CAAS,EAE9B,IAAI,EACJ,GAAI,CACF,GAAI,EAAM,MACR,MAAM,EAAM,OAAO,QAAQ,YAAY,CAAE,UAAW,EAAM,UAAW,MAAO,EAAM,KAAM,CAAC,EAE3F,IAAM,EAAW,EAAM,MACnB,CAAE,WAAY,EAAM,MAAM,WAAY,GAAI,EAAM,MAAM,QAAS,QAAS,EAAM,OAAQ,EACtF,EAAM,QACJ,MAAM,EAAM,OAAO,QAChB,IAAI,CAAE,UAAW,EAAM,SAAU,CAAC,EAClC,KAAK,CAAC,IAAW,EAAO,KAAK,EAC7B,KAAK,MAAO,IAAU,CACrB,GAAI,EAAO,MAAO,IAAK,EAAO,QAAS,EAAM,OAAQ,EAErD,IAAM,GADS,MAAM,EAAM,OAAO,MAAM,QAAQ,GACxB,KACxB,OAAO,EAAW,CAAE,WAAY,EAAS,WAAY,GAAI,EAAS,GAAI,QAAS,EAAM,OAAQ,EAAI,OAClG,EACH,OACN,GAAI,EAAM,SAAW,CAAC,EAAU,MAAU,MAAM,kDAAkD,EAClG,GAAI,EACF,MAAM,EAAM,OAAO,QAAQ,YAAY,CAAE,UAAW,EAAM,UAAW,MAAO,CAAS,CAAC,EAGxF,IAAM,EAAW,MAAM,QAAQ,IAAI,EAAM,MAAM,IAAI,EAAW,CAAC,EAC/D,GAAI,EAAa,OACjB,EAAY,GACZ,EAAY,GAAQ,EACpB,EAAY,IAAI,gBAChB,IAAM,EAAW,MAAM,EAAM,OAAO,QACjC,OACC,CACE,UAAW,EAAM,UACjB,GAAI,EACJ,KAAM,CAAC,EAAM,QAAS,GAAG,EAAS,QAAQ,CAAC,IAAU,EAAK,KAAO,CAAC,EAAK,IAAI,EAAI,CAAC,CAAE,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM,EAChG,MAAO,EAAS,QAAQ,CAAC,IAAU,EAAK,WAAa,CAAC,EAAK,UAAU,EAAI,CAAC,CAAE,EAC5E,SAAU,OACZ,EACA,CAAE,OAAQ,EAAU,MAAO,CAC7B,EACC,MAAM,MAAO,IAAU,CACtB,GAAI,EACF,MAAM,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,EAIrF,GAFA,EAAW,MAAM,EACjB,MAAM,GAAW,MAAM,IAAM,EAAE,EAC3B,GAAe,EAAc,OACjC,MAAM,EACP,EAEH,GADA,EAAY,OACR,CAAC,EAAU,OACf,GAAI,EAAa,MAAM,EAAM,OAAO,QAAQ,UAAU,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAM,EAAE,EAEpG,IAAO,EAAa,EAAW,GAAS,MAAM,QAAQ,IAAI,CACxD,EAAM,OAAO,WAAW,KAAK,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAClF,EAAM,OAAO,SAAS,KAAK,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAChF,QAAQ,KACL,EAAM,SAAW,CAAC,EAAM,SAAS,EAAI,CAAC,EAAM,UAAW,CAAsB,GAAG,IAAI,CAAC,IACpF,EAAM,OAAO,KAAK,KAAK,CAAE,WAAU,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,CAC7D,CACF,CACF,CAAC,EACD,MAAM,QAAQ,IAAI,CAChB,IAAI,GAAe,CAAC,GAAG,IAAI,CAAe,EAC1C,IAAI,GAAa,CAAC,GAAG,IAAI,CAAc,EACvC,GAAG,EAAM,QAAQ,CAAC,IAAa,GAAY,CAAC,CAAC,EAAE,IAAI,CAAU,CAC/D,CAAC,EACD,MAAM,SACN,CACA,QAAQ,IAAI,SAAU,CAAS,EAC/B,EAAW,MAAM,EACjB,MAAM,EAAO,SAAS,MAAS,EAAE,MAAM,IAAM,EAAE,GAInD,SAAS,CAAM,CAAC,EAAiB,CAC/B,MAAO,OAAO,EAAQ,QAAQ,QAAS,EAAE,IAG3C,SAAS,CAAY,CAAC,EAIR,CACZ,MAAO,CACL,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,GAAS,EAAM,OAAO,EACjC,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,OACN,MAAO,CAAC,CACV,EAGF,SAAS,EAAQ,CAAC,EAAgB,CAChC,GAAI,OAAO,IAAU,SAAU,OAAO,EACtC,GAAI,OAAO,IAAU,SAAU,OAAO,IAAI,KAAK,CAAK,EAAE,QAAQ,EAC9D,OAAO,KAAK,IAAI,EAGlB,eAAe,EAAW,CAAC,EAAY,CACrC,GAAI,EAAK,OAAS,aAIhB,MAAO,CAAE,WAAY,CAAE,IAHX,EAAK,IAAI,WAAW,OAAO,EACnC,EAAK,IACL,QAAQ,EAAK,eAAe,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,EAAK,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,SAAS,QAAQ,IAClF,KAAM,EAAK,KAAM,KAAM,EAAK,QAAS,CAAE,EAErE,IAAM,EAAU,EAAK,IAAI,WAAW,OAAO,EACvC,OAAO,KAAK,EAAK,IAAI,MAAM,EAAK,IAAI,QAAQ,GAAG,EAAI,CAAC,EAAG,QAAQ,EAAE,SAAS,MAAM,EAChF,MAAM,IAAI,KAAK,IAAI,IAAI,EAAK,GAAG,CAAC,EAAE,KAAK,EAC3C,MAAO,CAAE,KAAM,eAAe,EAAK;AAAA,EAAe;AAAA,QAAmB,ED9bvE,IAAM,GAAwB,SAEvB,SAAS,EAAiB,CAAC,EAAwB,CACxD,OAAO,GAAI,CAAK,EAAE,MAAM,CAAC,IAAU,EAAY,EAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAAC,CAAC,EAG/G,eAAe,EAAG,CAAC,EAAwB,CACzC,GAAI,EAAM,MAAQ,CAAC,EAAM,UAAY,CAAC,EAAM,QAAS,EAAK,yCAAyC,EACnG,IAAM,EAAO,QAAQ,IAAI,KAAO,QAAQ,IAAI,EACtC,EAAY,GAAe,CAAI,EAC/B,EAAU,GAAW,GAAc,EAAM,OAAO,EAAG,QAAQ,MAAM,MAAQ,OAAY,MAAM,IAAI,MAAM,KAAK,CAAC,EACjH,GAAI,CAAC,GAAS,KAAK,EAAG,EAAK,4BAA4B,EACvD,IAAM,EAAQ,MAAM,QAAQ,IAAI,EAAM,KAAK,IAAI,CAAC,IAAS,GAAY,EAAM,CAAI,CAAC,CAAC,EAEjF,OAAO,GAAQ,EADE,CAAE,YAAW,UAAS,OAAM,EACb,EAAM,OAAO,QAAQ,EAGvD,eAAe,EAAO,CAAC,EAAwB,EAAoB,EAA4B,CAC7F,IAAM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAqB,EAAS,YAAc,MAAM,EAAO,SAAS,IAAI,GAAG,UAC/E,GAAI,CAAC,EAAoB,EAAK,oCAAoC,EAClE,IAAM,EAAU,MAAM,GAAc,EAAQ,EAAoB,CAAK,EAC/D,EAAM,GAAS,SAAS,WAAa,EACrC,EAAY,GAAS,SAAS,YAC9B,EAAW,GAAc,EAAM,KAAK,EACpC,EAAgB,GAAU,MAC1B,EAAU,GAAU,QACpB,EAAe,GAAS,MAAQ,CAAE,WAAY,EAAQ,MAAM,WAAY,QAAS,EAAQ,MAAM,EAAG,EAAI,OACtG,EACJ,CAAC,GAAiB,CAAC,EACf,MAAM,EAAO,MACV,QAAQ,CAAE,SAAU,CAAE,UAAW,EAAK,WAAU,CAAE,CAAC,EACnD,KAAK,CAAC,IAAY,EAAO,KAAO,CAAE,WAAY,EAAO,KAAK,WAAY,QAAS,EAAO,KAAK,EAAG,EAAI,MAAU,EAC/G,OACA,EAAQ,GAAa,EAAe,EAAS,EAAc,CAAY,EAC7E,GAAI,GAAW,CAAC,EACd,OAAO,EAAY,EAAO,mDAAoD,GAAS,EAAE,EAC3F,GAAI,GAGF,GAFA,MAAM,EAAoB,CAAE,IAAK,EAAQ,UAAW,EAAK,YAAW,OAAM,CAAC,EAEvE,EADc,MAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,EAAK,WAAU,CAAE,CAAC,GACtE,KAAK,KAAK,CAAC,IAAS,EAAK,aAAe,EAAM,YAAc,EAAK,KAAO,EAAM,OAAO,EAClG,OAAO,EAAY,EAAO,sBAAsB,EAAM,cAAc,EAAM,UAAW,GAAS,EAAE,EAEpG,IAAM,EAAQ,MAAM,GAAc,EAAQ,EAAK,EAAM,KAAK,EACpD,EACJ,GACC,MAAM,EAAO,QAAQ,OAAO,CAC3B,QACA,MAAO,EAAQ,CAAE,WAAY,EAAM,WAAY,GAAI,EAAM,QAAS,SAAQ,EAAI,OAC9E,SAAU,CAAE,UAAW,CAAI,CAC7B,CAAC,EACH,GAAI,CAAC,GAAW,EAAM,QAAU,OAC9B,MAAM,EAAO,QAAQ,OAAO,CAC1B,UAAW,EAAS,GACpB,MAAO,EAAM,OAAS,EAAS,QAAQ,MAAM,EAAG,EAAE,GAAK,EAAS,QAAQ,OAAS,GAAK,MAAQ,GAChG,CAAC,EAGH,MAAM,EAAwB,CAC5B,SACA,UAAW,EAAS,GACpB,QAAS,EAAS,QAClB,MAAO,EAAS,MAChB,QACA,QACA,UACA,SAAU,EAAM,UAAY,GAC5B,OAAQ,EAAM,OACd,KAAM,EAAM,MAAQ,GACpB,SAAU,GACV,cACA,kBACF,CAAC,EAAE,MAAM,CAAC,IAAU,EAAY,EAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAG,EAAS,EAAE,CAAC,EAGtG,SAAS,EAAU,CAAC,EAA6B,EAA2B,CACjF,GAAI,CAAC,EAAS,OAAO,GAAS,OAC9B,GAAI,CAAC,EAAO,OAAO,EACnB,OAAO,EAAU;AAAA,EAAO,EAGnB,SAAS,EAAY,CAC1B,EACA,EACA,EACA,EACA,CACA,GAAI,EAAU,OAAO,EACrB,GAAI,CAAC,EAAS,OACd,OAAO,GAAW,EAGpB,SAAS,EAAa,CAAC,EAAmB,CAExC,OADc,EAAQ,IAAI,CAAC,IAAU,EAAK,SAAS,GAAG,EAAI,IAAI,EAAK,QAAQ,KAAM,MAAK,KAAO,CAAK,EAAE,KAAK,GAAG,GAC5F,OAGlB,SAAS,EAAc,CAAC,EAAc,CACpC,GAAI,CAEF,OADA,QAAQ,MAAM,CAAI,EACX,QAAQ,IAAI,EACnB,KAAM,CACN,EAAK,iCAAiC,GAAM,GAIzC,SAAS,EAAa,CAAC,EAAgB,CAC5C,GAAI,CAAC,EAAO,OACZ,IAAM,EAAM,GAAM,IAAI,MAAM,CAAK,EACjC,MAAO,CACL,MAAO,CAAE,WAAY,EAAI,WAAY,QAAS,EAAI,EAAG,EACrD,QAAS,EAAI,OACf,EAGF,eAAe,EAAa,CAAC,EAAwB,EAAmB,EAAe,CACrF,GAAI,CAAC,EAAM,OACX,IAAM,EAAS,MAAM,GAAc,EAAQ,CAAS,EAAE,MAAM,IAAG,CAAG,OAAS,EAC3E,GAAI,CAAC,EAAQ,CACX,EAAQ,sDAAsD,EAC9D,OAEF,IAAM,EAAQ,EAAO,KAAK,CAAC,IAAS,EAAK,KAAO,CAAI,EACpD,GAAI,CAAC,EAAO,CACV,EAAQ,UAAU,6CAAgD,EAClE,OAEF,GAAI,EAAM,OAAS,WAAY,CAC7B,EAAQ,UAAU,sEAAyE,EAC3F,OAEF,OAAO,EAGT,eAAe,EAAa,CAAC,EAAwB,EAAmB,EAAwB,CAC9F,IAAM,EAAW,EAAM,QACnB,MAAM,EAAO,QAAQ,IAAI,CAAE,UAAW,EAAM,OAAQ,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAC5E,EAAM,SACJ,MAAM,EAAO,QACV,KAAK,CAAE,YAAW,SAAU,KAAM,MAAO,EAAG,MAAO,MAAO,CAAC,EAC3D,KAAK,CAAC,IAAW,EAAO,KAAK,EAAE,EAClC,OACN,GAAI,EAAM,SAAW,CAAC,EAAU,EAAK,mBAAmB,EACxD,GAAI,CAAC,GAAY,CAAC,EAAM,KAAM,OAAO,EACrC,OAAO,EAAO,QAAQ,KAAK,CAAE,UAAW,EAAS,EAAG,CAAC,EAGvD,eAAe,EAAW,CAAC,EAAe,EAAsC,CAC9E,IAAM,EAAO,GAAK,QAAQ,EAAW,CAAK,EACpC,EAAS,MAAM,GAAK,EAAM,GAAG,EAAE,MAAM,IAAM,EAAK,mBAAmB,GAAO,CAAC,EACjF,GAAI,CACF,IAAM,EAAO,MAAM,EAAO,KAAK,EAC/B,GAAI,CAAC,EAAK,OAAO,GAAK,EAAK,KAAO,GAChC,EAAK,wEAAwE,GAAO,EACtF,IAAM,EAAU,OAAO,MAAM,OAAO,EAAK,IAAI,CAAC,EAC1C,EAAS,EACb,MAAO,EAAS,EAAQ,OAAQ,CAC9B,IAAM,EAAO,MAAM,EAAO,KAAK,EAAS,EAAQ,EAAQ,OAAS,EAAQ,CAAM,EAC/E,GAAI,EAAK,YAAc,EAAG,MAC1B,GAAU,EAAK,UAEjB,IAAM,EAAQ,EAAQ,SAAS,EAAG,CAAM,EAClC,EAAW,GAAO,SAAS,CAAI,EAC/B,EAAO,EAAM,SAAS,MAAM,EAC5B,EACJ,EAAS,WAAW,QAAQ,GAAK,IAAa,kBAC1C,EACA,CAAC,GAAgB,CAAK,GAAK,OAAO,KAAK,EAAM,MAAM,EAAE,OAAO,CAAK,EAC/D,aACA,EACR,MAAO,CACL,IAAK,QAAQ,YAAe,EAAM,SAAS,QAAQ,IACnD,SAAU,GAAK,SAAS,CAAI,EAC5B,MACF,SACA,CACA,MAAM,EAAO,MAAM,GAIvB,SAAS,EAAe,CAAC,EAAmB,CAC1C,GAAI,EAAM,SAAW,EAAG,MAAO,GAC/B,GAAI,EAAM,SAAS,CAAC,EAAG,MAAO,GAC9B,OAAO,EAAM,OAAO,CAAC,EAAO,IAAS,EAAQ,OAAO,EAAO,GAAM,EAAO,IAAM,EAAO,EAAG,EAAG,CAAC,EAAI,EAAM,OAAS,IAGjH,eAAe,EAAU,CAAC,EAAoB,CAC5C,IAAM,EAAO,EAAe,CAAI,EAChC,GAAI,EAAK,OAAS,QAAS,CAGzB,GAFA,EAAG,MAAM,EACT,EAAG,QAAQ,EAAG,MAAM,YAAc,EAAK,KAAM,EAAG,MAAM,YAAc,EAAK,KAAK,EAC1E,EAAK,MAAM,KAAK,EAAG,EAAG,QAAQ,EAAK,IAAI,EAC3C,EAAG,MAAM,EACT,OAEF,EAAG,QACD,EAAG,MAAM,YAAc,EAAK,KAC5B,EAAG,MAAM,YAAc,EAAK,MAC5B,EAAK,YAAc,EAAG,MAAM,SAAW,EAAK,YAAc,EAAG,MAAM,YAAc,EACnF,EAGF,eAAe,EAAe,CAAC,EAAoB,CACjD,IAAM,EAAO,EAAe,CAAI,EAChC,EAAG,QAAQ,EAAG,MAAM,YAAc,SAAI,EAAG,MAAM,YAAc,GAAG,EAAK,cAAc,EAGrF,SAAS,CAAO,CAAC,EAAiB,CAChC,EAAG,QAAQ,EAAG,MAAM,kBAAoB,IAAK,EAAG,MAAM,YAAa,CAAO,EAG5E,SAAS,CAAW,CAAC,EAAwB,EAAiB,EAAoB,CAEhF,GADA,QAAQ,SAAW,EACf,EAAM,SAAW,OAAQ,CAC3B,QAAQ,OAAO,MACb,KAAK,UAAU,CACb,KAAM,QACN,UAAW,KAAK,IAAI,EACpB,UAAW,GAAa,GACxB,MAAO,CAAE,KAAM,UAAW,SAAQ,CACpC,CAAC,EAAI;AAAA,CACP,EACA,OAEF,EAAG,MAAM,CAAO,EAGlB,SAAS,CAAI,CAAC,EAAwB,CACpC,MAAU,MAAM,CAAO",
"debugId": "2F24F4EE3491C84264756E2164756E21",
"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": "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",
"debugId": "2F1E472CFF5BA2A264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/theme/color.ts", "../tui/src/theme/v1.ts", "../tui/src/theme/index.ts", "../tui/src/theme/system.ts", "../tui/src/context/helper.tsx", "../tui/src/context/theme.tsx"],
"sourcesContent": [
"import { RGBA } from \"@opentui/core\"\n\nexport function ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansiColors = [\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(ansiColors[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 val = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(val(r), val(g), val(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\nexport function tint(base: RGBA, overlay: RGBA, alpha: number): RGBA {\n const r = base.r + (overlay.r - base.r) * alpha\n const g = base.g + (overlay.g - base.g) * alpha\n const b = base.b + (overlay.b - base.b) * alpha\n return RGBA.fromInts(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255))\n}\n",
"import { RGBA, SyntaxStyle } from \"@opentui/core\"\nimport aura from \"./assets/aura.json\" with { type: \"json\" }\nimport ayu from \"./assets/ayu.json\" with { type: \"json\" }\nimport carbonfox from \"./assets/carbonfox.json\" with { type: \"json\" }\nimport catppuccinFrappe from \"./assets/catppuccin-frappe.json\" with { type: \"json\" }\nimport catppuccinMacchiato from \"./assets/catppuccin-macchiato.json\" with { type: \"json\" }\nimport catppuccin from \"./assets/catppuccin.json\" with { type: \"json\" }\nimport cobalt2 from \"./assets/cobalt2.json\" with { type: \"json\" }\nimport cursor from \"./assets/cursor.json\" with { type: \"json\" }\nimport dracula from \"./assets/dracula.json\" with { type: \"json\" }\nimport everforest from \"./assets/everforest.json\" with { type: \"json\" }\nimport flexoki from \"./assets/flexoki.json\" with { type: \"json\" }\nimport github from \"./assets/github.json\" with { type: \"json\" }\nimport gruvbox from \"./assets/gruvbox.json\" with { type: \"json\" }\nimport kanagawa from \"./assets/kanagawa.json\" with { type: \"json\" }\nimport lucentOrng from \"./assets/lucent-orng.json\" with { type: \"json\" }\nimport material from \"./assets/material.json\" with { type: \"json\" }\nimport matrix from \"./assets/matrix.json\" with { type: \"json\" }\nimport mercury from \"./assets/mercury.json\" with { type: \"json\" }\nimport monokai from \"./assets/monokai.json\" with { type: \"json\" }\nimport nightowl from \"./assets/nightowl.json\" with { type: \"json\" }\nimport nord from \"./assets/nord.json\" with { type: \"json\" }\nimport onedark from \"./assets/one-dark.json\" with { type: \"json\" }\nimport opencode from \"./assets/opencode.json\" with { type: \"json\" }\nimport orng from \"./assets/orng.json\" with { type: \"json\" }\nimport osakaJade from \"./assets/osaka-jade.json\" with { type: \"json\" }\nimport palenight from \"./assets/palenight.json\" with { type: \"json\" }\nimport rosepine from \"./assets/rosepine.json\" with { type: \"json\" }\nimport solarized from \"./assets/solarized.json\" with { type: \"json\" }\nimport synthwave84 from \"./assets/synthwave84.json\" with { type: \"json\" }\nimport tokyonight from \"./assets/tokyonight.json\" with { type: \"json\" }\nimport vercel from \"./assets/vercel.json\" with { type: \"json\" }\nimport vesper from \"./assets/vesper.json\" with { type: \"json\" }\nimport zenburn from \"./assets/zenburn.json\" with { type: \"json\" }\n\nexport type Theme = {\n readonly primary: RGBA\n readonly secondary: RGBA\n readonly accent: RGBA\n readonly error: RGBA\n readonly warning: RGBA\n readonly success: RGBA\n readonly info: RGBA\n readonly text: RGBA\n readonly textMuted: RGBA\n readonly selectedListItemText: RGBA\n readonly background: RGBA\n readonly backgroundPanel: RGBA\n readonly backgroundElement: RGBA\n readonly backgroundMenu: RGBA\n readonly border: RGBA\n readonly borderActive: RGBA\n readonly borderSubtle: RGBA\n readonly diffAdded: RGBA\n readonly diffRemoved: RGBA\n readonly diffContext: RGBA\n readonly diffHunkHeader: RGBA\n readonly diffHighlightAdded: RGBA\n readonly diffHighlightRemoved: RGBA\n readonly diffAddedBg: RGBA\n readonly diffRemovedBg: RGBA\n readonly diffContextBg: RGBA\n readonly diffLineNumber: RGBA\n readonly diffAddedLineNumberBg: RGBA\n readonly diffRemovedLineNumberBg: RGBA\n readonly markdownText: RGBA\n readonly markdownHeading: RGBA\n readonly markdownLink: RGBA\n readonly markdownLinkText: RGBA\n readonly markdownCode: RGBA\n readonly markdownBlockQuote: RGBA\n readonly markdownEmph: RGBA\n readonly markdownStrong: RGBA\n readonly markdownHorizontalRule: RGBA\n readonly markdownListItem: RGBA\n readonly markdownListEnumeration: RGBA\n readonly markdownImage: RGBA\n readonly markdownImageText: RGBA\n readonly markdownCodeBlock: RGBA\n readonly syntaxComment: RGBA\n readonly syntaxKeyword: RGBA\n readonly syntaxFunction: RGBA\n readonly syntaxVariable: RGBA\n readonly syntaxString: RGBA\n readonly syntaxNumber: RGBA\n readonly syntaxType: RGBA\n readonly syntaxOperator: RGBA\n readonly syntaxPunctuation: RGBA\n readonly thinkingOpacity: number\n _hasSelectedListItemText: boolean\n}\n\nexport type ThemeColor = Exclude<keyof Theme, \"thinkingOpacity\" | \"_hasSelectedListItemText\">\nexport type HexColor = `#${string}`\nexport type RefName = string\nexport type Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\nexport type ColorValue = HexColor | RefName | Variant | RGBA\nexport type ThemeJson = {\n $schema?: string\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\nexport const DEFAULT_THEMES: Record<string, ThemeJson> = {\n aura,\n ayu,\n catppuccin,\n [\"catppuccin-frappe\"]: catppuccinFrappe,\n [\"catppuccin-macchiato\"]: catppuccinMacchiato,\n cobalt2,\n cursor,\n dracula,\n everforest,\n flexoki,\n github,\n gruvbox,\n kanagawa,\n material,\n matrix,\n mercury,\n monokai,\n nightowl,\n nord,\n [\"one-dark\"]: onedark,\n [\"osaka-jade\"]: osakaJade,\n opencode,\n orng,\n [\"lucent-orng\"]: lucentOrng,\n palenight,\n rosepine,\n solarized,\n synthwave84,\n tokyonight,\n vesper,\n vercel,\n zenburn,\n carbonfox,\n}\n\nexport function selectedForeground(theme: Theme, bg?: RGBA): RGBA {\n if (theme._hasSelectedListItemText) return theme.selectedListItemText\n\n if (theme.background.a === 0) {\n const targetColor = bg ?? theme.primary\n const { r, g, b } = targetColor\n const luminance = 0.299 * r + 0.587 * g + 0.114 * b\n return luminance > 0.5 ? RGBA.fromInts(0, 0, 0) : RGBA.fromInts(255, 255, 255)\n }\n\n return theme.background\n}\n\nexport function generateSyntax(theme: Theme) {\n return SyntaxStyle.fromTheme(getSyntaxRules(theme))\n}\n\nfunction getSyntaxRules(theme: Theme) {\n return [\n {\n scope: [\"default\"],\n style: {\n foreground: theme.text,\n },\n },\n {\n scope: [\"prompt\"],\n style: {\n foreground: theme.accent,\n },\n },\n {\n scope: [\"extmark.file\"],\n style: {\n foreground: theme.warning,\n bold: true,\n },\n },\n {\n scope: [\"extmark.agent\"],\n style: {\n foreground: theme.secondary,\n bold: true,\n },\n },\n {\n scope: [\"extmark.paste\"],\n style: {\n foreground: selectedForeground(theme, theme.warning),\n background: theme.warning,\n bold: true,\n },\n },\n {\n scope: [\"comment\"],\n style: {\n foreground: theme.syntaxComment,\n italic: true,\n },\n },\n {\n scope: [\"comment.documentation\"],\n style: {\n foreground: theme.syntaxComment,\n italic: true,\n },\n },\n {\n scope: [\"string\", \"symbol\"],\n style: {\n foreground: theme.syntaxString,\n },\n },\n {\n scope: [\"number\", \"boolean\"],\n style: {\n foreground: theme.syntaxNumber,\n },\n },\n {\n scope: [\"character.special\"],\n style: {\n foreground: theme.syntaxString,\n },\n },\n {\n scope: [\"keyword.return\", \"keyword.conditional\", \"keyword.repeat\", \"keyword.coroutine\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"keyword.type\"],\n style: {\n foreground: theme.syntaxType,\n bold: true,\n italic: true,\n },\n },\n {\n scope: [\"keyword.function\", \"function.method\"],\n style: {\n foreground: theme.syntaxFunction,\n },\n },\n {\n scope: [\"keyword\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"keyword.import\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"operator\", \"keyword.operator\", \"punctuation.delimiter\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"keyword.conditional.ternary\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"variable\", \"variable.parameter\", \"function.method.call\", \"function.call\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"variable.member\", \"function\", \"constructor\"],\n style: {\n foreground: theme.syntaxFunction,\n },\n },\n {\n scope: [\"type\", \"module\"],\n style: {\n foreground: theme.syntaxType,\n },\n },\n {\n scope: [\"constant\"],\n style: {\n foreground: theme.syntaxNumber,\n },\n },\n {\n scope: [\"property\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"class\"],\n style: {\n foreground: theme.syntaxType,\n },\n },\n {\n scope: [\"parameter\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"punctuation\", \"punctuation.bracket\"],\n style: {\n foreground: theme.syntaxPunctuation,\n },\n },\n {\n scope: [\"variable.builtin\", \"type.builtin\", \"function.builtin\", \"module.builtin\", \"constant.builtin\"],\n style: {\n foreground: theme.error,\n },\n },\n {\n scope: [\"variable.super\"],\n style: {\n foreground: theme.error,\n },\n },\n {\n scope: [\"string.escape\", \"string.regexp\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"keyword.directive\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"punctuation.special\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"keyword.modifier\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n {\n scope: [\"keyword.exception\"],\n style: {\n foreground: theme.syntaxKeyword,\n italic: true,\n },\n },\n // Markdown specific styles\n {\n scope: [\"markup.heading\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.1\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n underline: true,\n },\n },\n {\n scope: [\"markup.heading.2\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.3\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.4\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.5\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.heading.6\"],\n style: {\n foreground: theme.markdownHeading,\n bold: true,\n },\n },\n {\n scope: [\"markup.bold\", \"markup.strong\"],\n style: {\n foreground: theme.markdownStrong,\n bold: true,\n },\n },\n {\n scope: [\"markup.italic\"],\n style: {\n foreground: theme.markdownEmph,\n italic: true,\n },\n },\n {\n scope: [\"markup.list\"],\n style: {\n foreground: theme.markdownListItem,\n },\n },\n {\n scope: [\"markup.quote\"],\n style: {\n foreground: theme.markdownBlockQuote,\n italic: true,\n },\n },\n {\n scope: [\"markup.raw\", \"markup.raw.block\"],\n style: {\n foreground: theme.markdownCode,\n },\n },\n {\n scope: [\"markup.raw.inline\"],\n style: {\n foreground: theme.markdownCode,\n background: theme.background,\n },\n },\n {\n scope: [\"markup.link\"],\n style: {\n foreground: theme.markdownLink,\n underline: true,\n },\n },\n {\n scope: [\"markup.link.label\"],\n style: {\n foreground: theme.markdownLinkText,\n underline: true,\n },\n },\n {\n scope: [\"markup.link.url\"],\n style: {\n foreground: theme.markdownLink,\n underline: true,\n },\n },\n {\n scope: [\"label\"],\n style: {\n foreground: theme.markdownLinkText,\n },\n },\n {\n scope: [\"spell\", \"nospell\"],\n style: {\n foreground: theme.text,\n },\n },\n // Additional common highlight groups\n {\n scope: [\"string.special\", \"string.special.url\"],\n style: {\n foreground: theme.markdownLink,\n underline: true,\n },\n },\n {\n scope: [\"character\"],\n style: {\n foreground: theme.syntaxString,\n },\n },\n {\n scope: [\"float\"],\n style: {\n foreground: theme.syntaxNumber,\n },\n },\n {\n scope: [\"comment.error\"],\n style: {\n foreground: theme.error,\n italic: true,\n bold: true,\n },\n },\n {\n scope: [\"comment.warning\"],\n style: {\n foreground: theme.warning,\n italic: true,\n bold: true,\n },\n },\n {\n scope: [\"comment.todo\", \"comment.note\"],\n style: {\n foreground: theme.info,\n italic: true,\n bold: true,\n },\n },\n {\n scope: [\"namespace\"],\n style: {\n foreground: theme.syntaxType,\n },\n },\n {\n scope: [\"field\"],\n style: {\n foreground: theme.syntaxVariable,\n },\n },\n {\n scope: [\"type.definition\"],\n style: {\n foreground: theme.syntaxType,\n bold: true,\n },\n },\n {\n scope: [\"keyword.export\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"attribute\", \"annotation\"],\n style: {\n foreground: theme.warning,\n },\n },\n {\n scope: [\"tag\"],\n style: {\n foreground: theme.error,\n },\n },\n {\n scope: [\"tag.attribute\"],\n style: {\n foreground: theme.syntaxKeyword,\n },\n },\n {\n scope: [\"tag.delimiter\"],\n style: {\n foreground: theme.syntaxOperator,\n },\n },\n {\n scope: [\"markup.strikethrough\"],\n style: {\n foreground: theme.textMuted,\n },\n },\n {\n scope: [\"markup.underline\"],\n style: {\n foreground: theme.text,\n underline: true,\n },\n },\n {\n scope: [\"markup.list.checked\"],\n style: {\n foreground: theme.success,\n },\n },\n {\n scope: [\"markup.list.unchecked\"],\n style: {\n foreground: theme.textMuted,\n },\n },\n {\n scope: [\"diff.plus\"],\n style: {\n foreground: theme.diffAdded,\n background: theme.diffAddedBg,\n },\n },\n {\n scope: [\"diff.minus\"],\n style: {\n foreground: theme.diffRemoved,\n background: theme.diffRemovedBg,\n },\n },\n {\n scope: [\"diff.delta\"],\n style: {\n foreground: theme.diffContext,\n background: theme.diffContextBg,\n },\n },\n {\n scope: [\"error\"],\n style: {\n foreground: theme.error,\n bold: true,\n },\n },\n {\n scope: [\"warning\"],\n style: {\n foreground: theme.warning,\n bold: true,\n },\n },\n {\n scope: [\"info\"],\n style: {\n foreground: theme.info,\n },\n },\n {\n scope: [\"debug\"],\n style: {\n foreground: theme.textMuted,\n },\n },\n ]\n}\n",
"import { RGBA } from \"@opentui/core\"\nimport { ansiToRgba } from \"./color\"\nimport { DEFAULT_THEMES, type ColorValue, type Theme, type ThemeColor, type ThemeJson } from \"./v1\"\n\nexport { DEFAULT_THEMES, generateSyntax, selectedForeground, type Theme, type ThemeJson } from \"./v1\"\n\nconst pluginThemes: Record<string, ThemeJson> = {}\nlet customThemes: Record<string, ThemeJson> = {}\nlet systemTheme: ThemeJson | undefined\nconst listeners = new Set<(themes: Record<string, ThemeJson>) => void>()\n\nfunction listThemes() {\n // Priority: defaults < plugin installs < custom files < generated system.\n const themes = {\n ...DEFAULT_THEMES,\n ...pluginThemes,\n ...customThemes,\n }\n if (!systemTheme) return themes\n return {\n ...themes,\n system: systemTheme,\n }\n}\n\nfunction syncThemes() {\n const themes = listThemes()\n for (const listener of listeners) listener(themes)\n}\n\nexport function allThemes() {\n return listThemes()\n}\n\nexport function isTheme(theme: unknown): theme is ThemeJson {\n if (typeof theme !== \"object\" || theme === null || Array.isArray(theme)) return false\n const value = Reflect.get(theme, \"theme\")\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nexport function subscribeThemes(listener: (themes: Record<string, ThemeJson>) => void) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n}\n\nexport function setCustomThemes(themes: Record<string, ThemeJson>) {\n customThemes = themes\n syncThemes()\n}\n\nexport function setSystemTheme(theme: ThemeJson | undefined) {\n systemTheme = theme\n syncThemes()\n}\n\nexport function hasTheme(name: string) {\n if (!name) return false\n return allThemes()[name] !== undefined\n}\n\nexport function addTheme(name: string, theme: unknown) {\n if (!name) return false\n if (!isTheme(theme)) return false\n if (hasTheme(name)) return false\n pluginThemes[name] = theme\n syncThemes()\n return true\n}\n\nexport function upsertTheme(name: string, theme: unknown) {\n if (!name) return false\n if (!isTheme(theme)) return false\n if (customThemes[name] !== undefined) {\n customThemes[name] = theme\n } else {\n pluginThemes[name] = theme\n }\n syncThemes()\n return true\n}\n\nexport function resolveTheme(theme: ThemeJson, mode: \"dark\" | \"light\") {\n const defs = theme.defs ?? {}\n function resolveColor(c: ColorValue, chain: string[] = []): RGBA {\n if (c instanceof RGBA) return c\n if (typeof c === \"string\") {\n if (c === \"transparent\" || c === \"none\") return RGBA.fromInts(0, 0, 0, 0)\n\n if (c.startsWith(\"#\")) return RGBA.fromHex(c)\n\n if (chain.includes(c)) {\n throw new Error(`Circular color reference: ${[...chain, c].join(\" -> \")}`)\n }\n\n const next = defs[c] ?? theme.theme[c as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${c}\" not found in defs or theme`)\n }\n return resolveColor(next, [...chain, c])\n }\n if (typeof c === \"number\") {\n return ansiToRgba(c)\n }\n return resolveColor(c[mode], chain)\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]) => {\n return [key, resolveColor(value as ColorValue)]\n }),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n // Handle selectedListItemText separately since it's optional\n const hasSelectedListItemText = theme.theme.selectedListItemText !== undefined\n if (hasSelectedListItemText) {\n resolved.selectedListItemText = resolveColor(theme.theme.selectedListItemText!)\n } else {\n // Backward compatibility: if selectedListItemText is not defined, use background color\n // This preserves the current behavior for all existing themes\n resolved.selectedListItemText = resolved.background\n }\n\n // Handle backgroundMenu - optional with fallback to backgroundElement\n if (theme.theme.backgroundMenu !== undefined) {\n resolved.backgroundMenu = resolveColor(theme.theme.backgroundMenu)\n } else {\n resolved.backgroundMenu = resolved.backgroundElement\n }\n\n // Handle thinkingOpacity - optional with default of 0.6\n const thinkingOpacity = theme.theme.thinkingOpacity ?? 0.6\n\n return {\n ...resolved,\n _hasSelectedListItemText: hasSelectedListItemText,\n thinkingOpacity,\n } as Theme\n}\n",
"import { RGBA, type TerminalColors } from \"@opentui/core\"\nimport { ansiToRgba, tint } from \"./color\"\n\nexport function terminalMode(colors: TerminalColors): \"dark\" | \"light\" | undefined {\n const bg = colors.defaultBackground\n if (!bg) return\n const { r, g, b } = RGBA.fromHex(bg)\n return 0.299 * r + 0.587 * g + 0.114 * b > 0.5 ? \"light\" : \"dark\"\n}\n\nexport function generateSystem(colors: TerminalColors, mode: \"dark\" | \"light\") {\n const bg = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const transparent = RGBA.fromValues(bg.r, bg.g, bg.b, 0)\n const isDark = mode === \"dark\"\n\n const col = (index: number) => {\n const value = colors.palette[index]\n if (value) return RGBA.fromHex(value)\n return ansiToRgba(index)\n }\n\n const grays = generateGrayScale(bg, isDark)\n const textMuted = generateMutedTextColor(bg, isDark)\n const ansiColors = {\n red: col(1),\n green: col(2),\n yellow: col(3),\n blue: col(4),\n magenta: col(5),\n cyan: col(6),\n redBright: col(9),\n greenBright: col(10),\n }\n\n const diffAlpha = isDark ? 0.22 : 0.14\n const diffAddedBg = tint(bg, ansiColors.green, diffAlpha)\n const diffRemovedBg = tint(bg, ansiColors.red, diffAlpha)\n const diffContextBg = grays[2]\n const diffAddedLineNumberBg = tint(diffContextBg, ansiColors.green, diffAlpha)\n const diffRemovedLineNumberBg = tint(diffContextBg, ansiColors.red, diffAlpha)\n\n return {\n theme: {\n primary: ansiColors.cyan,\n secondary: ansiColors.magenta,\n accent: ansiColors.cyan,\n error: ansiColors.red,\n warning: ansiColors.yellow,\n success: ansiColors.green,\n info: ansiColors.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: transparent,\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: ansiColors.green,\n diffRemoved: ansiColors.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansiColors.greenBright,\n diffHighlightRemoved: ansiColors.redBright,\n diffAddedBg,\n diffRemovedBg,\n diffContextBg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg,\n diffRemovedLineNumberBg,\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansiColors.blue,\n markdownLinkText: ansiColors.cyan,\n markdownCode: ansiColors.green,\n markdownBlockQuote: ansiColors.yellow,\n markdownEmph: ansiColors.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansiColors.blue,\n markdownListEnumeration: ansiColors.cyan,\n markdownImage: ansiColors.blue,\n markdownImageText: ansiColors.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansiColors.magenta,\n syntaxFunction: ansiColors.blue,\n syntaxVariable: fg,\n syntaxString: ansiColors.green,\n syntaxNumber: ansiColors.yellow,\n syntaxType: ansiColors.cyan,\n syntaxOperator: ansiColors.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean): Record<number, RGBA> {\n const grays: Record<number, RGBA> = {}\n const bgR = bg.r * 255\n const bgG = bg.g * 255\n const bgB = bg.b * 255\n const luminance = 0.299 * bgR + 0.587 * bgG + 0.114 * bgB\n\n for (let i = 1; i <= 12; i++) {\n const factor = i / 12\n\n if (isDark && luminance < 10) {\n const gray = Math.floor(factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n if (!isDark && luminance > 245) {\n const gray = Math.floor(255 - factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n const next = isDark ? luminance + (255 - luminance) * factor * 0.4 : luminance * (1 - factor * 0.4)\n const ratio = next / luminance\n grays[i] = RGBA.fromInts(\n Math.floor(Math.min(Math.max(bgR * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgG * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgB * ratio, 0), 255)),\n )\n }\n\n return grays\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean): RGBA {\n const luminance = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n if (isDark) {\n const gray = luminance < 10 ? 180 : Math.min(Math.floor(160 + luminance * 0.3), 200)\n return RGBA.fromInts(gray, gray, gray)\n }\n\n const gray = luminance > 245 ? 75 : Math.max(Math.floor(100 - (255 - luminance) * 0.2), 60)\n return RGBA.fromInts(gray, gray, gray)\n}\n",
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { memo as _$memo } from \"@opentui/solid\";\nimport { createContext, Show, useContext } from \"solid-js\";\nexport function createSimpleContext(input) {\n const ctx = createContext();\n return {\n context: ctx,\n provider: props => {\n const init = input.init(props);\n return (// @ts-expect-error\n _$createComponent(Show, {\n get when() {\n return init.ready === undefined || init.ready === true;\n },\n get children() {\n return _$createComponent(ctx.Provider, {\n value: init,\n get children() {\n return props.children;\n }\n });\n }\n })\n );\n },\n use() {\n const value = useContext(ctx);\n if (!value) throw new Error(`${input.name} context must be used within a context provider`);\n return value;\n }\n };\n}",
"import { CliRenderEvents } from \"@opentui/core\";\nimport { useRenderer } from \"@opentui/solid\";\nimport { allThemes, generateSyntax, hasTheme, isTheme, resolveTheme, setCustomThemes, setSystemTheme, subscribeThemes } from \"../theme\";\nimport { generateSystem, terminalMode } from \"../theme/system\";\nimport { createEffect, createMemo, onCleanup, onMount } from \"solid-js\";\nimport { createStore, produce } from \"solid-js/store\";\nimport { createSimpleContext } from \"./helper\";\nimport { useConfig } from \"../config\";\nimport { Global } from \"@opencode-ai/core/global\";\nimport { Glob } from \"@opencode-ai/core/util/glob\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nconst themeSource = {\n async discover() {\n const directories = [Global.Path.config];\n for (let current = process.cwd();; current = path.dirname(current)) {\n directories.push(path.join(current, \".opencode\"));\n if (path.dirname(current) === current) break;\n }\n return discoverThemes(directories);\n },\n subscribeRefresh(refresh) {\n process.on(\"SIGUSR2\", refresh);\n return () => process.off(\"SIGUSR2\", refresh);\n }\n};\nexport async function discoverThemes(directories) {\n const result = {};\n for (const directory of directories) {\n const files = await Glob.scan(\"themes/*.json\", {\n cwd: directory,\n absolute: true,\n dot: true,\n symlink: true\n });\n for (const file of files) {\n result[path.basename(file, \".json\")] = JSON.parse(await readFile(file, \"utf8\"));\n }\n }\n return result;\n}\nexport { DEFAULT_THEMES, addTheme, allThemes, generateSyntax, hasTheme, selectedForeground, upsertTheme } from \"../theme\";\nconst THEME_REFRESH_DELAYS = [250, 1000];\nconst [store, setStore] = createStore({\n themes: allThemes(),\n mode: \"dark\",\n lock: undefined,\n active: \"opencode\",\n ready: false\n});\nsubscribeThemes(themes => setStore(\"themes\", themes));\nexport const {\n use: useTheme,\n provider: ThemeProvider\n} = createSimpleContext({\n name: \"Theme\",\n init: props => {\n const renderer = useRenderer();\n const configState = useConfig();\n const config = configState.data;\n const themes = props.source ?? themeSource;\n const pick = value => {\n if (value === \"dark\" || value === \"light\") return value;\n return;\n };\n setStore(produce(draft => {\n const lock = pick(config.theme?.mode);\n const mode = lock ?? pick(renderer.themeMode) ?? props.mode;\n draft.mode = mode;\n draft.lock = lock;\n const active = config.theme?.name ?? \"opencode\";\n draft.active = typeof active === \"string\" ? active : \"opencode\";\n draft.ready = false;\n }));\n createEffect(() => {\n const theme = config.theme?.name;\n if (theme) setStore(\"active\", theme);\n });\n createEffect(() => {\n const mode = config.theme?.mode;\n if (mode === \"dark\" || mode === \"light\") {\n pin(mode, false);\n return;\n }\n if (mode === \"system\" && store.lock !== undefined) free(false);\n });\n function syncCustomThemes() {\n return themes.discover().then(themes => {\n setCustomThemes(Object.entries(themes).reduce((result, [name, theme]) => {\n if (isTheme(theme)) result[name] = theme;\n return result;\n }, {}));\n }).catch(() => setStore(\"active\", \"opencode\"));\n }\n onMount(() => {\n void Promise.allSettled([resolveSystemTheme(store.mode), syncCustomThemes()]).finally(() => {\n setStore(\"ready\", true);\n });\n });\n let systemThemeSignature;\n let systemThemeMode;\n let hasResolvedSystemTheme = false;\n function resolveSystemTheme(mode = store.mode) {\n return renderer.getPalette({\n size: 16\n }).then(colors => {\n if (!colors.palette[0]) {\n if (hasResolvedSystemTheme) return;\n setSystemTheme(undefined);\n if (store.active === \"system\") setStore(\"active\", \"opencode\");\n return;\n }\n const next = store.lock ?? terminalMode(colors) ?? mode;\n if (store.mode !== next) setStore(\"mode\", next);\n const signature = JSON.stringify(colors);\n hasResolvedSystemTheme = true;\n if (store.themes.system && systemThemeSignature === signature && systemThemeMode === next) return;\n systemThemeSignature = signature;\n systemThemeMode = next;\n setSystemTheme(generateSystem(colors, next));\n }).catch(() => {\n if (hasResolvedSystemTheme) return;\n setSystemTheme(undefined);\n if (store.active === \"system\") setStore(\"active\", \"opencode\");\n });\n }\n let systemRefreshRunning = false;\n let systemRefreshQueued = false;\n let systemRefreshMode = store.mode;\n function refreshSystemTheme(mode = store.mode) {\n systemRefreshMode = mode;\n if (systemRefreshRunning) {\n systemRefreshQueued = true;\n return;\n }\n systemRefreshRunning = true;\n const retry = renderer.paletteDetectionStatus === \"detecting\";\n renderer.clearPaletteCache();\n void resolveSystemTheme(mode).finally(() => {\n systemRefreshRunning = false;\n if (!retry && !systemRefreshQueued) return;\n systemRefreshQueued = false;\n refreshSystemTheme(systemRefreshMode);\n });\n }\n function apply(mode) {\n if (store.mode === mode) return;\n setStore(\"mode\", mode);\n refreshSystemTheme(mode);\n }\n function pin(mode = store.mode, persist = true) {\n setStore(\"lock\", mode);\n apply(mode);\n if (!persist) return;\n void configState.update(draft => {\n draft.theme = {\n ...draft.theme,\n mode\n };\n }).catch(() => {});\n }\n function free(persist = true) {\n setStore(\"lock\", undefined);\n refreshSystemTheme(renderer.themeMode ?? store.mode);\n if (!persist) return;\n void configState.update(draft => {\n draft.theme = {\n ...draft.theme,\n mode: \"system\"\n };\n }).catch(() => {});\n }\n const handle = mode => {\n if (store.lock) return;\n apply(mode);\n };\n renderer.on(CliRenderEvents.THEME_MODE, handle);\n const handleThemeNotification = sequence => {\n if (sequence !== \"\\x1b[?997;1n\" && sequence !== \"\\x1b[?997;2n\") return false;\n queueMicrotask(() => refreshSystemTheme());\n return false;\n };\n renderer.prependInputHandler(handleThemeNotification);\n let themeRefreshTimeouts = [];\n const refresh = () => {\n for (const timeout of themeRefreshTimeouts) clearTimeout(timeout);\n themeRefreshTimeouts = THEME_REFRESH_DELAYS.map(delay => setTimeout(() => {\n refreshSystemTheme();\n if (delay === THEME_REFRESH_DELAYS[THEME_REFRESH_DELAYS.length - 1]) void syncCustomThemes();\n }, delay));\n };\n let unsubscribeRefresh;\n unsubscribeRefresh = themes.subscribeRefresh?.(refresh);\n onCleanup(() => {\n renderer.off(CliRenderEvents.THEME_MODE, handle);\n renderer.removeInputHandler(handleThemeNotification);\n unsubscribeRefresh?.();\n for (const timeout of themeRefreshTimeouts) clearTimeout(timeout);\n themeRefreshTimeouts.length = 0;\n });\n const values = createMemo(() => {\n const active = store.themes[store.active];\n if (active) return resolveTheme(active, store.mode);\n return resolveTheme(store.themes.opencode, store.mode);\n });\n createEffect(() => renderer.setBackgroundColor(values().background));\n const syntax = createSyntaxStyleMemo(() => generateSyntax(values()));\n return {\n theme: new Proxy(values(), {\n get(_target, prop) {\n // @ts-expect-error Properties are forwarded to the current reactive value.\n return values()[prop];\n }\n }),\n get selected() {\n return store.active;\n },\n all: allThemes,\n has: hasTheme,\n syntax,\n mode: () => store.mode,\n locked: () => store.lock !== undefined,\n lock: () => pin(store.mode),\n unlock: free,\n setMode: pin,\n set(theme) {\n if (!hasTheme(theme)) return false;\n setStore(\"active\", theme);\n void configState.update(draft => {\n draft.theme = {\n ...draft.theme,\n name: theme\n };\n }).catch(() => {});\n return true;\n },\n get ready() {\n return store.ready;\n }\n };\n }\n});\nexport function createSyntaxStyleMemo(factory) {\n const renderer = useRenderer();\n const retained = new Set();\n let current;\n const release = style => {\n retained.add(style);\n void renderer.idle().catch(() => {}).finally(() => {\n if (!retained.delete(style)) return;\n style.destroy();\n });\n };\n onCleanup(() => {\n if (current) release(current);\n });\n return createMemo(() => {\n const previous = current;\n current = factory();\n if (previous) release(previous);\n return current;\n });\n}"
],
"mappings": "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",
"debugId": "FA706C3B85321FED64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "701F83C45105EFEF64756E2164756E21",
"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": ";u9BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,MACH",
"debugId": "090BD39C32AD5C6F64756E2164756E21",
"names": []
}

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

{
"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 { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Effect, FileSystem, Option, 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))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n 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* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": "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",
"debugId": "85FB5E9EB3B7F8CF64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../core/src/util/process-lock.ts", "src/server-process.ts", "src/commands/handlers/serve.ts"],
"sourcesContent": [
"import { dlopen, read, type Pointer } from \"bun:ffi\"\nimport { closeSync, existsSync, mkdirSync, openSync } from \"node:fs\"\nimport { connect, createServer, type Server, type Socket } from \"node:net\"\nimport path from \"node:path\"\nimport { Effect, Schema } from \"effect\"\nimport { Hash } from \"./hash\"\n\nexport namespace ProcessLock {\n export class HeldError extends Schema.TaggedErrorClass<HeldError>()(\"ProcessLockHeldError\", {\n file: Schema.String,\n }) {\n override get message() {\n return `Process lock is already held: ${this.file}`\n }\n }\n\n export class SystemError extends Schema.TaggedErrorClass<SystemError>()(\"ProcessLockSystemError\", {\n file: Schema.String,\n operation: Schema.Literals([\"open\", \"acquire\"]),\n code: Schema.String,\n }) {\n override get message() {\n return `Process lock ${this.operation} failed for ${this.file}: ${this.code}`\n }\n }\n\n export type LockError = HeldError | SystemError\n\n const acquirePosix = Effect.fnUntraced(function* (file: string) {\n const fd = yield* Effect.try({\n try: () => {\n mkdirSync(path.dirname(file), { recursive: true })\n return openSync(file, \"a+\", 0o600)\n },\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"open\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n const result = yield* Effect.try({\n try: () => lock(fd),\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"acquire\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n }).pipe(\n Effect.tapError(() =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n ),\n )\n if (result.acquired) {\n return fd\n }\n closeSync(fd)\n return yield* result.held\n ? new HeldError({ file })\n : new SystemError({ file, operation: \"acquire\", code: String(result.code) })\n })\n\n export const acquire = Effect.fn(\"ProcessLock.acquire\")(function* (file: string) {\n if (process.platform === \"win32\") {\n yield* Effect.acquireRelease(acquireWindows(file), closeWindows)\n return\n }\n yield* Effect.acquireRelease(acquirePosix(file), (fd) =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n )\n })\n}\n\ntype Result =\n | { readonly acquired: true }\n | { readonly acquired: false; readonly held: true }\n | { readonly acquired: false; readonly held: false; readonly code: number }\n\nconst LOCK_EX = 2\nconst LOCK_NB = 4\nconst DARWIN_EWOULDBLOCK = 35\nconst LINUX_EWOULDBLOCK = 11\n\nfunction lock(fd: number): Result {\n if (process.platform === \"darwin\") return lockDarwin(fd)\n if (process.platform === \"linux\") return lockLinux(fd)\n throw new Error(`Unsupported process lock platform: ${process.platform}`)\n}\n\nfunction lockDarwin(fd: number): Result {\n const library = dlopen(\"/usr/lib/libSystem.B.dylib\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __error: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__error())\n if (result === 0) return { acquired: true }\n if (code === DARWIN_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nfunction lockLinux(fd: number): Result {\n const musl = `/lib/libc.musl-${process.arch === \"arm64\" ? \"aarch64\" : \"x86_64\"}.so.1`\n const library = dlopen(existsSync(musl) ? musl : \"libc.so.6\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __errno_location: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__errno_location())\n if (result === 0) return { acquired: true }\n if (code === LINUX_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nfunction errorCode(pointer: Pointer | null) {\n if (pointer === null) throw new Error(\"Failed to read process lock error code\")\n return read.i32(pointer, 0)\n}\n\nfunction acquireWindows(file: string) {\n return Effect.callback<Server, ProcessLock.LockError>((resume) => {\n const server = createServer()\n let probe: Socket | undefined\n const pipe = `\\\\\\\\.\\\\pipe\\\\opencode-process-lock-${Hash.sha256(path.resolve(file).toLowerCase())}`\n const onError = (cause: NodeJS.ErrnoException) => {\n server.off(\"listening\", onListening)\n probe = connect(pipe)\n const onProbeError = () => {\n probe?.off(\"connect\", onConnect)\n resume(\n Effect.fail(\n new ProcessLock.SystemError({\n file,\n operation: \"acquire\",\n code: cause.code ?? cause.message,\n }),\n ),\n )\n }\n const onConnect = () => {\n probe?.off(\"error\", onProbeError)\n probe?.destroy()\n resume(Effect.fail(new ProcessLock.HeldError({ file })))\n }\n probe.once(\"connect\", onConnect)\n probe.once(\"error\", onProbeError)\n }\n const onListening = () => {\n server.off(\"error\", onError)\n resume(Effect.succeed(server))\n }\n server.once(\"error\", onError)\n server.once(\"listening\", onListening)\n server.on(\"connection\", (socket) => socket.destroy())\n server.listen(pipe)\n return Effect.sync(() => {\n probe?.destroy()\n server.close()\n })\n })\n}\n\nfunction closeWindows(server: Server) {\n return Effect.callback<void>((resume) => {\n if (!server.listening) return resume(Effect.void)\n server.close((error) => resume(error ? Effect.die(error) : Effect.void))\n })\n}\n",
"export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { ProcessLock } from \"@opencode-ai/core/util/process-lock\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\nexport const run = Effect.fn(\"cli.server-process.run\")((options: Options) =>\n processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node]))),\n Effect.provide(NodeServices.layer),\n ),\n)\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n if (serviceOptions !== undefined) {\n const acquired = yield* ProcessLock.acquire(serviceOptions.file + \".lock\").pipe(\n Effect.as(true),\n Effect.catchTag(\"ProcessLockHeldError\", () => Effect.succeed(false)),\n )\n if (!acquired) return yield* Effect.void\n if ((yield* Service.discover(serviceOptions)) !== undefined) return yield* Effect.void\n }\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const password =\n options.mode === \"service\"\n ? yield* ServiceConfig.password()\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start({\n hostname: options.hostname ?? config.hostname ?? \"127.0.0.1\",\n port: Option.fromNullishOr(options.port ?? config.port),\n password,\n instanceID,\n service:\n serviceOptions === undefined\n ? undefined\n : { onListen: (address) => register(address, password, instanceID, serviceOptions.file) },\n }).pipe(Effect.provide(Logger.layer([], { mergeWithExisting: false })))\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const publish = fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* publish\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const assertRegistration = Effect.gen(function* () {\n const found = yield* current\n if (\n found !== undefined &&\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n )\n return\n yield* publish\n })\n yield* Effect.addFinalizer(() =>\n current.pipe(\n Effect.flatMap((current) => (current?.id === id ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n ),\n )\n yield* assertRegistration.pipe(\n Effect.catchCause((cause) => Effect.logWarning(\"failed to reassert service registration\", { cause })),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.forkScoped,\n )\n})\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n",
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fn(\"cli.serve\")(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n"
],
"mappings": "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",
"debugId": "A78EEB7A254E222E64756E2164756E21",
"names": []
}
{
"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": ";2xBAGA,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,gBAAK,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": "C030B92523378F5864756E2164756E21",
"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, { targetVersion: options.version })\n const transport = yield* Service.start(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,WAAO,OAAQ,UAAK,EAAS,CAAE,cAAe,EAAQ,OAAQ,CAAC,EAC/D,IAAM,EAAY,MAAO,EAAQ,MAAM,CAAO,EAC9C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "2F4962C0C5C0BA0F64756E2164756E21",
"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": ";yvBAAA,mBAAS,gBACT,yBAOA,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,MAAC,OAAO,MACzC,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": "E8C839A6D883F7F464756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/pair.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\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": ";ojCAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,WAAM,WAAO,OAAc,aAAQ,MAAC,OAC9D,OAAW,WAAO,OAAc,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": "B5177AA5608CC2AE64756E2164756E21",
"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": ";+sBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC",
"debugId": "38D7816DA8F6D59664756E2164756E21",
"names": []
}

Sorry, the diff of this file is not supported yet