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

@opencode-ai/cli-linux-arm64

Package Overview
Dependencies
Maintainers
2
Versions
1882
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

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

Comparing version
0.0.0-next-15386
to
0.0.0-next-15390
+10
bin/chunk-02aaadar.js.map
{
"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": ";w2BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,WAAM,WAAO,OAAc,QAAQ,CAAC,EAC9D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH",
"debugId": "4343F2FE82A1F5A664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/mini.ts", "src/mini/run.ts", "src/mini/noninteractive.ts", "src/mini/ui.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Server } from \"../services/server\"\nimport { waitForCatalogReady } from \"./catalog.shared\"\nimport { INTERACTIVE_INPUT_ERROR, resolveInteractiveStdin } from \"./runtime.stdin\"\nimport type { RunInput, RunTuiConfig } from \"./types\"\n\nexport type MiniCommandInput = {\n server: Server.Resolved\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: RunTuiConfig | Promise<RunTuiConfig>\n}\n\ntype Session = Awaited<ReturnType<OpenCodeClient[\"session\"][\"get\"]>>\nexport async function runMini(input: MiniCommandInput) {\n validate(input)\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await Bun.stdin.text(), input.prompt)\n const runtimeTask = import(\"./runtime\")\n const directory = localDirectory()\n\n try {\n const sdk = OpenCode.make({\n baseUrl: input.server.endpoint.url,\n headers: Service.headers(input.server.endpoint),\n })\n const model = parseModel(input.model)\n let agentTask: Promise<string | undefined> | undefined\n const resolveAgent = () => {\n agentTask ??= validateAgent(sdk, directory, input.agent)\n return agentTask\n }\n const resolveSession = async () => {\n const [agent, selected] = await Promise.all([\n resolveAgent(),\n selectSession(sdk, directory, input),\n ])\n const readyModel =\n model ?? (selected?.model ? { providerID: selected.model.providerID, modelID: selected.model.id } : undefined)\n if (readyModel) await waitForCatalogReady({ sdk, directory, model: readyModel })\n const session = selected ?? (await createSession(sdk, directory, agent, model))\n return { id: session.id, title: session.title, resume: selected !== undefined }\n }\n const create = (\n _sdk: OpenCodeClient,\n next: { agent: string | undefined; model: RunInput[\"model\"]; variant: string | undefined },\n ) => createSession(sdk, directory, next.agent, next.model, next.variant)\n const runtime = await runtimeTask\n await runtime.runInteractiveDeferredMode({\n sdk,\n directory,\n resolveAgent,\n session: resolveSession,\n createSession: create,\n agent: input.agent,\n model,\n variant: undefined,\n files: [],\n initialInput,\n thinking: true,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n })\n } catch (error) {\n if (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR) fail(error.message)\n throw error\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n resolveInteractiveStdin().cleanup?.()\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string): RunInput[\"model\"] {\n if (!value) return\n const [providerID, ...rest] = value.split(\"/\")\n const modelID = rest.join(\"/\")\n if (!providerID || !modelID) fail(\"--model must use the format provider/model\")\n return { providerID, modelID }\n}\n\nasync function validateAgent(sdk: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline) {\n agents = await sdk.agent.list({ location: { directory } }).catch(() => undefined)\n const agent = agents?.data.find((item) => item.id === name)\n if (agent?.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n if (agent) return name\n await Bun.sleep(25)\n }\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nasync function selectSession(sdk: OpenCodeClient, directory: string, input: MiniCommandInput, preselected?: Session) {\n const selected =\n preselected ??\n (input.session\n ? await sdk.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await sdk.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined)\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected) return\n if (!input.fork) return selected\n return sdk.session.fork({ sessionID: selected.id })\n}\n\nasync function createSession(\n sdk: OpenCodeClient,\n directory: string,\n agent: string | undefined,\n model: RunInput[\"model\"],\n variant?: string,\n): Promise<Session> {\n if (model) await waitForCatalogReady({ sdk, directory, model })\n return sdk.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory },\n })\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n",
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { Model } from \"@opencode-ai/schema/model\"\nimport type { ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Server } from \"../services/server\"\nimport { loadRunAgents, waitForCatalogReady } from \"./catalog.shared\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { toolInlineInfo } from \"./tool\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: Server.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return run(input).catch((error) => reportError(input, error instanceof Error ? error.message : String(error)))\n}\n\nasync function run(input: RunCommandInput) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = process.env.PWD ?? process.cwd()\n const directory = localDirectory(root)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await Bun.stdin.text())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Service.Endpoint) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const requestedDirectory = prepared.directory ?? (await client.location.get()).directory\n if (!requestedDirectory) fail(\"Failed to resolve server directory\")\n const session = await selectSession(client, requestedDirectory, input)\n const cwd = session?.location.directory ?? requestedDirectory\n const workspace = session?.location.workspaceID\n const explicit = parseRunModel(input.model)\n const explicitModel = explicit?.model\n const variant = explicit?.variant\n const sessionModel = session?.model ? { providerID: session.model.providerID, modelID: session.model.id } : undefined\n const defaultModel =\n !explicitModel && !sessionModel\n ? await client.model\n .default({ location: { directory: cwd, workspace } })\n .then((result) => (result.data ? { providerID: result.data.providerID, modelID: result.data.id } : undefined))\n : undefined\n const model = pickRunModel(explicitModel, variant, sessionModel, defaultModel)\n if (variant && !model)\n return reportError(input, \"Cannot select a variant before selecting a model\", session?.id)\n if (model) {\n await waitForCatalogReady({ sdk: client, directory: cwd, workspace, model })\n const available = await client.model.list({ location: { directory: cwd, workspace } })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.modelID))\n return reportError(input, `Model unavailable: ${model.providerID}/${model.modelID}`, session?.id)\n }\n const agent = await validateAgent(client, cwd, input.agent)\n const selected =\n session ??\n (await client.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory: cwd },\n }))\n if (!session && input.title !== undefined) {\n await client.session.rename({\n sessionID: selected.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: selected.id,\n message: prepared.message,\n files: prepared.files,\n agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: true,\n renderTool,\n renderToolError,\n }).catch((error) => reportError(input, error instanceof Error ? error.message : String(error), selected.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nexport function pickRunModel(\n explicit: { providerID: string; modelID: string } | undefined,\n variant: string | undefined,\n session: { providerID: string; modelID: string } | undefined,\n fallback: { providerID: string; modelID: string } | undefined,\n) {\n if (explicit) return explicit\n if (!variant) return\n return session ?? fallback\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n if (!value) return\n const ref = Model.Ref.parse(value)\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const agents = await loadRunAgents(client, directory).catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function selectSession(client: OpenCodeClient, directory: string, input: RunCommandInput) {\n const selected = input.session\n ? await client.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await client.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected || !input.fork) return selected\n return client.session.fork({ sessionID: selected.id })\n}\n\nasync function prepareFile(input: string, directory: string): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: ToolPart) {\n const info = toolInlineInfo(part)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: ToolPart) {\n const info = toolInlineInfo(part)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction reportError(input: RunCommandInput, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n",
"import type { EventSubscribeOutput, OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { ReasoningPart, StepFinishPart, StepStartPart, TextPart, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n renderTool: (part: ToolPart) => Promise<void>\n renderToolError: (part: ToolPart) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, unknown>\n raw?: string\n provider?: unknown\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let questionRejected = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let admission: AbortController | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: TextPart, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const rejectQuestion = async (request: { id: string }) => {\n questionRejected = true\n await input.client.question.reject({ sessionID: input.sessionID, requestID: request.id }).catch(() => {})\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n formCancelled = true\n await input.client.form.cancel({ sessionID: request.sessionID, formID: request.id }).catch(() => {})\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (event.type === \"question.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await rejectQuestion(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached && event.data.form.sessionID === GLOBAL_FORM_SESSION_ID))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || questionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part: StepStartPart = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part: TextPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part: ReasoningPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n tools.set(event.data.callID, {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(event.data.callID)\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.called\") {\n const current = tools.get(event.data.callID)\n tools.set(event.data.callID, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n })\n continue\n }\n if (event.type === \"session.tool.success\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: event.data.content\n .filter((item) => item.type === \"text\")\n .map((item) => item.text)\n .join(\"\\n\"),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(part)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const error = event.data.error.message\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) {\n await input.renderToolError(part)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n const part: StepFinishPart = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (interrupted || permissionRejected || questionRejected || formCancelled) continue\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (!emittedError && !questionRejected && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, questions, forms] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.question.list({ sessionID: input.sessionID }).catch(() => undefined),\n Promise.all(\n (input.attached ? [input.sessionID] : [input.sessionID, GLOBAL_FORM_SESSION_ID]).map((sessionID) =>\n input.client.form.list({ sessionID }).catch(() => undefined),\n ),\n ),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(questions ?? []).map(rejectQuestion),\n ...forms.flatMap((response) => response ?? []).map(cancelForm),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${Buffer.from(await Bun.file(new URL(file.url)).arrayBuffer()).toString(\"base64\")}`\n return { attachment: { uri, mime: file.mime, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await Bun.file(new URL(file.url)).text()\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n",
"import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n"
],
"mappings": "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",
"debugId": "EE4E18A642B8A83164756E2164756E21",
"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": ";6sCAKA,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,MAAM,EAC9C,EAAS,MAAO,EAAO,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EACxF,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,SACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,IACd,CAAC,CACH,EACD,CACH",
"debugId": "3BA42DBF02DC7C7064756E2164756E21",
"names": []
}

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

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

{
"version": 3,
"sources": ["../core/src/image/photon.ts"],
"sourcesContent": [
"// @ts-ignore Bun's static file import is embedded by `bun build --compile`; some consumers also declare *.wasm.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n"
],
"mappings": ";yvBAGA,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF",
"debugId": "436F6D3CEBB3311E64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/util/locale.ts"],
"sourcesContent": [
"export function titlecase(str: string) {\n return str.replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport function time(input: number): string {\n const date = new Date(input)\n return date.toLocaleTimeString(undefined, { timeStyle: \"short\" })\n}\n\nexport function datetime(input: number): string {\n const date = new Date(input)\n const localTime = time(input)\n const localDate = date.toLocaleDateString()\n return `${localTime} · ${localDate}`\n}\n\nexport function todayTimeOrDateTime(input: number): string {\n const date = new Date(input)\n const now = new Date()\n const isToday =\n date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth() && date.getDate() === now.getDate()\n\n if (isToday) {\n return time(input)\n } else {\n return datetime(input)\n }\n}\n\nexport function number(num: number): string {\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + \"M\"\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + \"K\"\n }\n return num.toString()\n}\n\nexport function duration(input: number) {\n if (input < 1000) {\n return `${input}ms`\n }\n if (input < 60000) {\n return `${(input / 1000).toFixed(1)}s`\n }\n if (input < 3600000) {\n const minutes = Math.floor(input / 60000)\n const seconds = Math.floor((input % 60000) / 1000)\n return `${minutes}m ${seconds}s`\n }\n if (input < 86400000) {\n const hours = Math.floor(input / 3600000)\n const minutes = Math.floor((input % 3600000) / 60000)\n return `${hours}h ${minutes}m`\n }\n const days = Math.floor(input / 86400000)\n const hours = Math.floor((input % 86400000) / 3600000)\n return `${days}d ${hours}h`\n}\n\nexport function truncate(str: string, len: number): string {\n if (str.length <= len) return str\n return str.slice(0, len - 1) + \"…\"\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n\nexport function truncateWidth(str: string, width: number): string {\n if (width <= 0) return \"\"\n if (Bun.stringWidth(str) <= width) return str\n if (width === 1) return \"…\"\n\n const result: string[] = []\n let used = 0\n for (const item of graphemeSegmenter.segment(str)) {\n const next = Bun.stringWidth(item.segment)\n if (used + next > width - 1) break\n result.push(item.segment)\n used += next\n }\n return result.join(\"\") + \"…\"\n}\n\nexport function truncateLeft(str: string, len: number): string {\n if (str.length <= len) return str\n return \"…\" + str.slice(-(len - 1))\n}\n\nexport function truncateMiddle(str: string, maxLength: number = 35): string {\n if (str.length <= maxLength) return str\n\n const ellipsis = \"…\"\n const keepStart = Math.ceil((maxLength - ellipsis.length) / 2)\n const keepEnd = Math.floor((maxLength - ellipsis.length) / 2)\n\n return str.slice(0, keepStart) + ellipsis + str.slice(-keepEnd)\n}\n\nexport function pluralize(count: number, singular: string, plural: string): string {\n const template = count === 1 ? singular : plural\n return template.replace(\"{}\", count.toString())\n}\n\nexport * as Locale from \"./locale\"\n"
],
"mappings": ";4QAAO,SAAS,CAAS,CAAC,EAAa,CACrC,OAAO,EAAI,QAAQ,QAAS,CAAC,IAAM,EAAE,YAAY,CAAC,EAG7C,SAAS,CAAI,CAAC,EAAuB,CAE1C,OADa,IAAI,KAAK,CAAK,EACf,mBAAmB,OAAW,CAAE,UAAW,OAAQ,CAAC,EAG3D,SAAS,CAAQ,CAAC,EAAuB,CAC9C,IAAM,EAAO,IAAI,KAAK,CAAK,EACrB,EAAY,EAAK,CAAK,EACtB,EAAY,EAAK,mBAAmB,EAC1C,MAAO,GAAG,UAAc,IAGnB,SAAS,CAAmB,CAAC,EAAuB,CACzD,IAAM,EAAO,IAAI,KAAK,CAAK,EACrB,EAAM,IAAI,KAIhB,GAFE,EAAK,YAAY,IAAM,EAAI,YAAY,GAAK,EAAK,SAAS,IAAM,EAAI,SAAS,GAAK,EAAK,QAAQ,IAAM,EAAI,QAAQ,EAGjH,OAAO,EAAK,CAAK,EAEjB,YAAO,EAAS,CAAK,EAIlB,SAAS,CAAM,CAAC,EAAqB,CAC1C,GAAI,GAAO,IACT,OAAQ,EAAM,KAAS,QAAQ,CAAC,EAAI,IAC/B,QAAI,GAAO,KAChB,OAAQ,EAAM,MAAM,QAAQ,CAAC,EAAI,IAEnC,OAAO,EAAI,SAAS,EAGf,SAAS,CAAQ,CAAC,EAAe,CACtC,GAAI,EAAQ,KACV,MAAO,GAAG,MAEZ,GAAI,EAAQ,MACV,MAAO,IAAI,EAAQ,MAAM,QAAQ,CAAC,KAEpC,GAAI,EAAQ,QAAS,CACnB,IAAM,EAAU,KAAK,MAAM,EAAQ,KAAK,EAClC,EAAU,KAAK,MAAO,EAAQ,MAAS,IAAI,EACjD,MAAO,GAAG,MAAY,KAExB,GAAI,EAAQ,SAAU,CACpB,IAAM,EAAQ,KAAK,MAAM,EAAQ,OAAO,EAClC,EAAU,KAAK,MAAO,EAAQ,QAAW,KAAK,EACpD,MAAO,GAAG,MAAU,KAEtB,IAAM,EAAO,KAAK,MAAM,EAAQ,QAAQ,EAClC,EAAQ,KAAK,MAAO,EAAQ,SAAY,OAAO,EACrD,MAAO,GAAG,MAAS,KAGd,SAAS,CAAQ,CAAC,EAAa,EAAqB,CACzD,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,OAAO,EAAI,MAAM,EAAG,EAAM,CAAC,EAAI,SAGjC,IAAM,EAAoB,IAAI,KAAK,UAAU,OAAW,CAAE,YAAa,UAAW,CAAC,EAE5E,SAAS,CAAa,CAAC,EAAa,EAAuB,CAChE,GAAI,GAAS,EAAG,MAAO,GACvB,GAAI,IAAI,YAAY,CAAG,GAAK,EAAO,OAAO,EAC1C,GAAI,IAAU,EAAG,MAAO,SAExB,IAAM,EAAmB,CAAC,EACtB,EAAO,EACX,QAAW,KAAQ,EAAkB,QAAQ,CAAG,EAAG,CACjD,IAAM,EAAO,IAAI,YAAY,EAAK,OAAO,EACzC,GAAI,EAAO,EAAO,EAAQ,EAAG,MAC7B,EAAO,KAAK,EAAK,OAAO,EACxB,GAAQ,EAEV,OAAO,EAAO,KAAK,EAAE,EAAI,SAGpB,SAAS,CAAY,CAAC,EAAa,EAAqB,CAC7D,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,MAAO,SAAK,EAAI,MAAM,EAAE,EAAM,EAAE,EAG3B,SAAS,CAAc,CAAC,EAAa,EAAoB,GAAY,CAC1E,GAAI,EAAI,QAAU,EAAW,OAAO,EAEpC,IAAM,EAAW,SACX,EAAY,KAAK,MAAM,EAAY,EAAS,QAAU,CAAC,EACvD,EAAU,KAAK,OAAO,EAAY,EAAS,QAAU,CAAC,EAE5D,OAAO,EAAI,MAAM,EAAG,CAAS,EAAI,EAAW,EAAI,MAAM,CAAC,CAAO,EAGzD,SAAS,CAAS,CAAC,EAAe,EAAkB,EAAwB,CAEjF,OADiB,IAAU,EAAI,EAAW,GAC1B,QAAQ,KAAM,EAAM,SAAS,CAAC",
"debugId": "1EF6EA7B0B74E9EF64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Effect, FileSystem, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\n\n// The CLI's service configuration file, plus the Service.Options binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\n\nfunction configKey(key: string): Key {\n if (keys.includes(key as Key)) return key as Key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst env = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const filename = InstallationChannel === \"local\" ? \"service-local.json\" : \"service.json\"\n return {\n fs,\n file: path.join(global.state, filename),\n configFile: path.join(global.config, filename),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file } = yield* env\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? undefined : process.argv[1]\n if (!compiled && entrypoint === undefined) return yield* Effect.fail(new Error(\"Failed to resolve CLI entrypoint\"))\n return {\n file,\n version: InstallationVersion,\n command: [process.execPath, ...(entrypoint ? [entrypoint] : []), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* env\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* env\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": "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",
"debugId": "0CA85A341319196E64756E2164756E21",
"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/mcp/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient, type McpServer } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.mcp.list({ location: { directory: process.cwd() } }))\n const servers = (response.data?.data ?? []).toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";0zBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,IADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GACjF,MAAM,MAAQ,CAAC,GAAG,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC3F,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "4242572592A8759664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/demo.ts"],
"sourcesContent": [
"// Demo mode for testing direct interactive mode without a real SDK.\n//\n// Enabled with `--demo`. Intercepts prompt submissions and generates synthetic\n// SDK events that feed through the real reducer and footer pipeline. This\n// lets you test scrollback formatting, permission UI, question UI, and tool\n// snapshots without making actual model calls. Pass a demo slash command as\n// the initial interactive message to trigger a preview immediately.\n//\n// Slash commands:\n// /permission [kind] → triggers a permission request variant\n// /question [kind] → triggers a question request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, bash,\n// write, edit, patch, task, question, error, mix)\n//\n// Demo mode also handles permission and question replies locally, completing\n// or failing the synthetic tool parts as appropriate.\nimport path from \"path\"\nimport type { Event, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { createSessionData, reduceSessionData, type SessionData } from \"./session-data\"\nimport { writeSessionOutput } from \"./stream\"\nimport type { FooterApi, PermissionReply, QuestionReject, QuestionReply, RunPrompt, StreamCommit } from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"bash\",\n \"write\",\n \"edit\",\n \"patch\",\n \"task\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"bash\", \"read\", \"task\", \"external\", \"doom\"] as const\nconst QUESTIONS = [\"multi\", \"single\", \"checklist\", \"custom\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype QuestionKind = (typeof QUESTIONS)[number]\n\nfunction permissionKind(value: string | undefined): PermissionKind | undefined {\n const next = (value || \"edit\").toLowerCase()\n return PERMISSIONS.find((item) => item === next)\n}\n\nfunction questionKind(value: string | undefined): QuestionKind | undefined {\n const next = (value || \"multi\").toLowerCase()\n return QUESTIONS.find((item) => item === next)\n}\n\nconst SAMPLE_MARKDOWN = [\n \"# Direct Mode Demo\",\n \"\",\n \"This is a realistic assistant response for direct-mode formatting checks.\",\n \"It mixes **bold**, _italic_, `inline code`, links, code fences, and tables in one streamed reply.\",\n \"\",\n \"## Summary\",\n \"\",\n \"- Restored the final markdown flush so the last block is committed on idle.\",\n \"- Switched markdown scrollback commits back to top-level block boundaries.\",\n \"- Added footer-level regression coverage for split-footer rendering.\",\n \"\",\n \"## Status\",\n \"\",\n \"| Area | Before | After | Notes |\",\n \"| --- | --- | --- | --- |\",\n \"| Direct mode | Missing final rows | Stable | Final markdown block now flushes on idle |\",\n \"| Tables | Dropped in streaming mode | Visible | Block-based commits match the working OpenTUI demo |\",\n \"| Tests | Partial coverage | Broader coverage | Includes a footer-level split render capture |\",\n \"\",\n \"> This sample intentionally includes a wide table so you can spot wrapping and commit bugs quickly.\",\n \"\",\n \"```ts\",\n \"const result = { markdown: true, tables: 2, stable: true }\",\n \"```\",\n \"\",\n \"## Files\",\n \"\",\n \"| File | Change |\",\n \"| --- | --- |\",\n \"| `scrollback.surface.ts` | Align markdown commit logic with the split-footer demo |\",\n \"| `footer.ts` | Keep active surfaces across footer-height-only resizes |\",\n \"| `footer.test.ts` | Capture real split-footer markdown payloads during idle completion |\",\n \"\",\n \"Next step: run `/fmt table` if you want a tighter table-only sample.\",\n].join(\"\\n\")\n\nconst SAMPLE_TABLE = [\n \"# Table Sample\",\n \"\",\n \"| Kind | Example | Notes |\",\n \"| --- | --- | --- |\",\n \"| Pipe | `A\\\\|B` | Escaped pipes should stay in one cell |\",\n \"| Unicode | `漢字` | Wide characters should remain aligned |\",\n \"| Wrap | `LongTokenWithoutNaturalBreaks_1234567890` | Useful for width stress |\",\n \"| Status | done | Final row should still appear after idle |\",\n].join(\"\\n\")\n\ntype Ref = {\n msg: string\n part: string\n call: string\n tool: string\n input: Record<string, unknown>\n start: number\n}\n\ntype Ask = {\n ref: Ref\n}\n\ntype Perm = {\n ref: Ref\n done: {\n title: string\n output: string\n metadata?: Record<string, unknown>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: Record<string, unknown>\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n data: SessionData\n footer: FooterApi\n limits: () => Record<string, number>\n msg: number\n part: number\n call: number\n perm: number\n ask: number\n perms: Map<string, Perm>\n asks: Map<string, Ask>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\n limits: () => Record<string, number>\n footer: FooterApi\n}\n\nfunction note(footer: FooterApi, text: string): void {\n footer.append({\n kind: \"system\",\n text,\n phase: \"start\",\n source: \"system\",\n })\n}\n\nfunction clearSubagent(footer: FooterApi): void {\n footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [],\n details: {},\n permissions: [],\n questions: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n partID: string\n callID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n toolCalls?: number\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n partID: input.partID,\n callID: input.callID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n toolCalls: input.toolCalls,\n lastUpdatedAt: Date.now(),\n },\n ],\n details: {\n [input.sessionID]: {\n sessionID: input.sessionID,\n commits: input.commits,\n },\n },\n permissions: [],\n questions: [],\n },\n })\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (!signal) {\n setTimeout(resolve, ms)\n return\n }\n\n if (signal.aborted) {\n resolve()\n return\n }\n\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", done)\n resolve()\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", done)\n resolve()\n }, ms)\n\n signal.addEventListener(\"abort\", done, { once: true })\n })\n}\n\nfunction split(text: string): string[] {\n if (text.length <= 48) {\n return [text]\n }\n\n const size = Math.ceil(text.length / 3)\n return [text.slice(0, size), text.slice(size, size * 2), text.slice(size * 2)]\n}\n\nfunction take(state: State, key: \"msg\" | \"part\" | \"call\" | \"perm\" | \"ask\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction feed(state: State, event: Event): void {\n const out = reduceSessionData({\n data: state.data,\n event,\n sessionID: state.id,\n thinking: state.thinking,\n limits: state.limits(),\n })\n state.data = out.data\n writeSessionOutput(\n {\n footer: state.footer,\n },\n out,\n )\n}\n\nfunction open(state: State): string {\n const id = take(state, \"msg\", \"msg\")\n feed(state, {\n type: \"message.updated\",\n properties: {\n sessionID: state.id,\n info: {\n id,\n sessionID: state.id,\n role: \"assistant\",\n time: {\n created: Date.now(),\n },\n parentID: `user_${id}`,\n modelID: \"demo\",\n providerID: \"demo\",\n mode: \"demo\",\n agent: \"demo\",\n path: {\n cwd: process.cwd(),\n root: process.cwd(),\n },\n cost: 0.001,\n tokens: {\n input: 120,\n output: 320,\n reasoning: 80,\n cache: {\n read: 0,\n write: 0,\n },\n },\n },\n },\n } as Event)\n return id\n}\n\nasync function emitText(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n const start = Date.now()\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"text\",\n text: \"\",\n time: {\n start,\n },\n },\n },\n } as Event)\n\n let next = \"\"\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n next += item\n feed(state, {\n type: \"message.part.delta\",\n properties: {\n sessionID: state.id,\n messageID: msg,\n partID: part,\n field: \"text\",\n delta: item,\n },\n } as Event)\n await wait(45, signal)\n }\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"text\",\n text: next,\n time: {\n start,\n end: Date.now(),\n },\n },\n },\n } as Event)\n}\n\nasync function emitReasoning(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n const start = Date.now()\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"reasoning\",\n text: \"\",\n time: {\n start,\n },\n },\n },\n } as Event)\n\n let next = \"\"\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n next += item\n feed(state, {\n type: \"message.part.delta\",\n properties: {\n sessionID: state.id,\n messageID: msg,\n partID: part,\n field: \"text\",\n delta: item,\n },\n } as Event)\n await wait(45, signal)\n }\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"reasoning\",\n text: next,\n time: {\n start,\n end: Date.now(),\n },\n },\n },\n } as Event)\n}\n\nfunction make(state: State, tool: string, input: Record<string, unknown>): Ref {\n return {\n msg: open(state),\n part: take(state, \"part\", \"part\"),\n call: take(state, \"call\", \"call\"),\n tool,\n input,\n start: Date.now(),\n }\n}\n\nfunction startTool(state: State, ref: Ref, metadata: Record<string, unknown> = {}): void {\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: ref.part,\n sessionID: state.id,\n messageID: ref.msg,\n type: \"tool\",\n callID: ref.call,\n tool: ref.tool,\n state: {\n status: \"running\",\n input: ref.input,\n metadata,\n time: {\n start: ref.start,\n },\n },\n },\n },\n } as Event)\n}\n\nfunction askPermission(state: State, item: Permit): void {\n startTool(state, item.ref)\n\n const id = take(state, \"perm\", \"perm\")\n state.perms.set(id, {\n ref: item.ref,\n done: item.done,\n })\n\n feed(state, {\n type: \"permission.asked\",\n properties: {\n id,\n sessionID: state.id,\n permission: item.permission,\n patterns: item.patterns,\n metadata: item.metadata ?? {},\n always: item.always,\n tool: {\n messageID: item.ref.msg,\n callID: item.ref.call,\n },\n },\n } as Event)\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n title: string\n output: string\n metadata?: Record<string, unknown>\n },\n): void {\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: ref.part,\n sessionID: state.id,\n messageID: ref.msg,\n type: \"tool\",\n callID: ref.call,\n tool: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n output: output.output,\n title: output.title,\n metadata: output.metadata ?? {},\n time: {\n start: ref.start,\n end: Date.now(),\n },\n },\n },\n },\n } as Event)\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: ref.part,\n sessionID: state.id,\n messageID: ref.msg,\n type: \"tool\",\n callID: ref.call,\n tool: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error,\n metadata: {},\n time: {\n start: ref.start,\n end: Date.now(),\n },\n },\n },\n },\n } as Event)\n}\n\nfunction emitError(state: State, text: string): void {\n const event = {\n id: `session.error:${state.id}:${Date.now()}`,\n type: \"session.error\",\n properties: {\n sessionID: state.id,\n error: {\n name: \"UnknownError\",\n data: {\n message: text,\n },\n },\n },\n } satisfies Event\n feed(state, event)\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"bash\", {\n command: \"git status\",\n workdir: process.cwd(),\n description: \"Show git status\",\n })\n startTool(state, ref)\n await wait(70, signal)\n doneTool(state, ref, {\n title: \"git status\",\n output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exitCode: 0,\n },\n })\n}\n\nfunction emitWrite(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"write\", {\n filePath: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\n title: \"write\",\n output: \"\",\n metadata: {},\n })\n}\n\nfunction emitEdit(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"edit\", {\n filePath: file,\n })\n doneTool(state, ref, {\n title: \"edit\",\n output: \"\",\n metadata: {\n diff: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\n })\n}\n\nfunction emitPatch(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"patch\", {\n patchText: \"*** Begin Patch\\n*** End Patch\",\n })\n doneTool(state, ref, {\n title: \"patch\",\n output: \"\",\n metadata: {\n files: [\n {\n type: \"update\",\n filePath: file,\n relativePath: \"src/demo-format.ts\",\n diff: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n type: \"add\",\n filePath: path.join(process.cwd(), \"README-demo.md\"),\n relativePath: \"README-demo.md\",\n diff: \"@@ -0,0 +1,4 @@\\n+# Demo\\n+This is a generated preview file.\\n\",\n deletions: 0,\n },\n ],\n },\n })\n}\n\nfunction emitTask(state: State): void {\n const ref = make(state, \"task\", {\n description: \"Scan run/* for reducer touchpoints\",\n subagent_type: \"explore\",\n })\n doneTool(state, ref, {\n title: \"Reducer touchpoints found\",\n output: \"\",\n metadata: {\n toolcalls: 4,\n sessionId: \"sub_demo_1\",\n },\n })\n const part = {\n id: \"sub_demo_tool_1\",\n type: \"tool\",\n sessionID: \"sub_demo_1\",\n messageID: \"sub_demo_msg_tool\",\n callID: \"sub_demo_call_1\",\n tool: \"read\",\n state: {\n status: \"running\",\n input: {\n filePath: \"packages/cli/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n time: {\n start: Date.now(),\n },\n },\n } satisfies ToolPart\n showSubagent(state, {\n sessionID: \"sub_demo_1\",\n partID: ref.part,\n callID: ref.call,\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\n toolCalls: 4,\n commits: [\n {\n kind: \"user\",\n text: \"Scan run/* for reducer touchpoints\",\n phase: \"start\",\n source: \"system\",\n },\n {\n kind: \"reasoning\",\n text: \"Thinking: tracing reducer and footer boundaries\",\n phase: \"progress\",\n source: \"reasoning\",\n messageID: \"sub_demo_msg_reasoning\",\n partID: \"sub_demo_reasoning_1\",\n },\n {\n kind: \"tool\",\n text: \"running read\",\n phase: \"start\",\n source: \"tool\",\n messageID: \"sub_demo_msg_tool\",\n partID: \"sub_demo_tool_1\",\n tool: \"read\",\n part,\n },\n {\n kind: \"assistant\",\n text: \"Footer updates flow through stream.ts into RunFooter\",\n phase: \"progress\",\n source: \"assistant\",\n messageID: \"sub_demo_msg_text\",\n partID: \"sub_demo_text_1\",\n },\n ],\n })\n}\n\nfunction emitQuestionTool(state: State): void {\n const ref = make(state, \"question\", {\n questions: [\n {\n header: \"Style\",\n question: \"Which output style do you want to inspect?\",\n options: [\n { label: \"Diff\", description: \"Show diff block\" },\n { label: \"Code\", description: \"Show code block\" },\n ],\n multiple: false,\n },\n {\n header: \"Extras\",\n question: \"Pick extra rows\",\n options: [\n { label: \"Usage\", description: \"Add usage row\" },\n { label: \"Duration\", description: \"Add duration row\" },\n ],\n multiple: true,\n custom: true,\n },\n ],\n })\n doneTool(state, ref, {\n title: \"question\",\n output: \"\",\n metadata: {\n answers: [[\"Diff\"], [\"Usage\", \"custom-note\"]],\n },\n })\n}\n\nfunction emitPermission(state: State, kind: PermissionKind = \"edit\"): void {\n const root = process.cwd()\n const file = path.join(root, \"src\", \"demo-format.ts\")\n\n if (kind === \"bash\") {\n const command = \"git status --short\"\n const ref = make(state, \"bash\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"bash\",\n patterns: [command],\n always: [\"*\"],\n done: {\n title: \"git status --short\",\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exitCode: 0,\n },\n },\n })\n return\n }\n\n if (kind === \"read\") {\n const target = path.join(root, \"package.json\")\n const ref = make(state, \"read\", {\n filePath: target,\n offset: 1,\n limit: 80,\n })\n askPermission(state, {\n ref,\n permission: \"read\",\n patterns: [target],\n always: [target],\n done: {\n title: \"read\",\n output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"task\") {\n const ref = make(state, \"task\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n subagent_type: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"task\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n title: \"Footer spacing checked\",\n output: \"\",\n metadata: {\n toolcalls: 3,\n sessionId: \"sub_demo_perm_1\",\n },\n },\n })\n return\n }\n\n if (kind === \"external\") {\n const dir = path.join(path.dirname(root), \"demo-shared\")\n const target = path.join(dir, \"README.md\")\n const ref = make(state, \"read\", {\n filePath: target,\n offset: 1,\n limit: 40,\n })\n askPermission(state, {\n ref,\n permission: \"external_directory\",\n patterns: [`${dir}/**`],\n metadata: {\n parentDir: dir,\n filepath: target,\n },\n always: [`${dir}/**`],\n done: {\n title: \"read\",\n output: `1: # External demo\\n2: Shared preview file\\nPath: ${target}`,\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"doom\") {\n const ref = make(state, \"task\", {\n description: \"Retry the formatter after repeated failures\",\n subagent_type: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\n title: \"Retry allowed\",\n output: \"Continuing after repeated failures.\\n\",\n metadata: {},\n },\n })\n return\n }\n\n const diff = \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\"\n const ref = make(state, \"edit\", {\n filePath: file,\n filepath: file,\n diff,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n title: \"edit\",\n output: \"\",\n metadata: {\n diff,\n },\n },\n })\n}\n\nfunction emitQuestion(state: State, kind: QuestionKind = \"multi\"): void {\n const questions = (() => {\n if (kind === \"single\") {\n return [\n {\n header: \"Mode\",\n question: \"Which footer should be the reference for spacing checks?\",\n options: [\n { label: \"Permission\", description: \"Inspect the permission footer\" },\n { label: \"Question\", description: \"Keep this question footer open\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: false,\n },\n ]\n }\n\n if (kind === \"checklist\") {\n return [\n {\n header: \"Checks\",\n question: \"Select the direct-mode cases you want to inspect next\",\n options: [\n { label: \"Diff\", description: \"Show an edit diff in the footer\" },\n { label: \"Task\", description: \"Show a structured task summary\" },\n { label: \"Error\", description: \"Show an error transcript row\" },\n ],\n multiple: true,\n custom: false,\n },\n ]\n }\n\n if (kind === \"custom\") {\n return [\n {\n header: \"Reply\",\n question: \"What custom answer should appear in the footer preview?\",\n options: [\n { label: \"Short note\", description: \"Keep the answer to one line\" },\n { label: \"Wrapped note\", description: \"Use a longer answer to test wrapping\" },\n ],\n multiple: false,\n custom: true,\n },\n ]\n }\n\n return [\n {\n header: \"Layout\",\n question: \"Which footer view should stay active while testing?\",\n options: [\n { label: \"Prompt\", description: \"Return to prompt\" },\n { label: \"Question\", description: \"Keep question open\" },\n ],\n multiple: false,\n },\n {\n header: \"Rows\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit edit diff\" },\n { label: \"Task\", description: \"Emit task card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n })()\n\n const ref = make(state, \"question\", { questions })\n startTool(state, ref)\n\n const id = take(state, \"ask\", \"ask\")\n state.asks.set(id, { ref })\n\n feed(state, {\n type: \"question.asked\",\n properties: {\n id,\n sessionID: state.id,\n questions,\n tool: {\n messageID: ref.msg,\n callID: ref.call,\n },\n },\n } as Event)\n}\n\nasync function emitFmt(state: State, kind: string, body: string, signal?: AbortSignal): Promise<boolean> {\n if (kind === \"text\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"markdown\" || kind === \"md\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"table\") {\n await emitText(state, body || SAMPLE_TABLE, signal)\n return true\n }\n\n if (kind === \"reasoning\") {\n await emitReasoning(state, body || \"Planning next steps [REDACTED] while preserving reducer ordering.\", signal)\n return true\n }\n\n if (kind === \"bash\") {\n await emitBash(state, signal)\n return true\n }\n\n if (kind === \"write\") {\n emitWrite(state)\n return true\n }\n\n if (kind === \"edit\") {\n emitEdit(state)\n return true\n }\n\n if (kind === \"patch\") {\n emitPatch(state)\n return true\n }\n\n if (kind === \"task\") {\n emitTask(state)\n return true\n }\n\n if (kind === \"question\") {\n emitQuestionTool(state)\n return true\n }\n\n if (kind === \"error\") {\n emitError(state, body || \"demo error event\")\n return true\n }\n\n if (kind === \"mix\") {\n await emitText(state, SAMPLE_MARKDOWN, signal)\n await wait(50, signal)\n await emitReasoning(state, \"Thinking through formatter edge cases [REDACTED].\", signal)\n await wait(50, signal)\n await emitBash(state, signal)\n emitWrite(state)\n emitEdit(state)\n emitPatch(state)\n emitTask(state)\n emitQuestionTool(state)\n emitError(state, \"demo mixed scenario error\")\n return true\n }\n\n return false\n}\n\nfunction intro(state: State): void {\n note(\n state.footer,\n [\n \"Demo slash commands enabled for interactive mode.\",\n `- /permission [kind] (${PERMISSIONS.join(\", \")})`,\n `- /question [kind] (${QUESTIONS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission bash\",\n \"- /question custom\",\n \"- /fmt markdown\",\n \"- /fmt table\",\n \"- /fmt text your custom text\",\n ].join(\"\\n\"),\n )\n}\n\nexport function createRunDemo(input: Input) {\n const state: State = {\n id: input.sessionID,\n thinking: input.thinking,\n data: createSessionData(),\n footer: input.footer,\n limits: input.limits,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n ask: 0,\n perms: new Map(),\n asks: new Map(),\n }\n\n const start = async (): Promise<void> => {\n intro(state)\n }\n\n const prompt = async (line: RunPrompt, signal?: AbortSignal): Promise<boolean> => {\n const text = line.text.trim()\n const list = text.split(/\\s+/)\n const cmd = list[0] || \"\"\n\n clearSubagent(state.footer)\n\n if (cmd === \"/help\") {\n intro(state)\n return true\n }\n\n if (cmd === \"/permission\") {\n const kind = permissionKind(list[1])\n if (!kind) {\n note(state.footer, `Pick a permission kind: ${PERMISSIONS.join(\", \")}`)\n return true\n }\n\n emitPermission(state, kind)\n return true\n }\n\n if (cmd === \"/question\") {\n const kind = questionKind(list[1])\n if (!kind) {\n note(state.footer, `Pick a question kind: ${QUESTIONS.join(\", \")}`)\n return true\n }\n\n emitQuestion(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[1] || \"\").toLowerCase()\n const body = list.slice(2).join(\" \")\n if (!kind) {\n note(state.footer, `Pick a kind: ${KINDS.join(\", \")}`)\n return true\n }\n\n const ok = await emitFmt(state, kind, body, signal)\n if (ok) {\n return true\n }\n\n note(state.footer, `Unknown kind \"${kind}\". Use: ${KINDS.join(\", \")}`)\n return true\n }\n\n return false\n }\n\n const permission = (input: PermissionReply): boolean => {\n const item = state.perms.get(input.requestID)\n if (!item || !input.reply) {\n return false\n }\n\n state.perms.delete(input.requestID)\n const event = {\n id: `permission.replied:${input.requestID}:${Date.now()}`,\n type: \"permission.replied\",\n properties: {\n sessionID: state.id,\n requestID: input.requestID,\n reply: input.reply,\n },\n } satisfies Event\n feed(state, event)\n\n if (input.reply === \"reject\") {\n failTool(state, item.ref, input.message || \"permission rejected\")\n return true\n }\n\n doneTool(state, item.ref, item.done)\n return true\n }\n\n const questionReply = (input: QuestionReply): boolean => {\n const ask = state.asks.get(input.requestID)\n if (!ask || !input.answers) {\n return false\n }\n\n state.asks.delete(input.requestID)\n const event = {\n id: `question.replied:${input.requestID}:${Date.now()}`,\n type: \"question.replied\",\n properties: {\n sessionID: state.id,\n requestID: input.requestID,\n answers: input.answers,\n },\n } satisfies Event\n feed(state, event)\n doneTool(state, ask.ref, {\n title: \"question\",\n output: \"\",\n metadata: {\n answers: input.answers,\n },\n })\n return true\n }\n\n const questionReject = (input: QuestionReject): boolean => {\n const ask = state.asks.get(input.requestID)\n if (!ask) {\n return false\n }\n\n state.asks.delete(input.requestID)\n feed(state, {\n type: \"question.rejected\",\n properties: {\n sessionID: state.id,\n requestID: input.requestID,\n },\n } as Event)\n failTool(state, ask.ref, \"question rejected\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n questionReply,\n questionReject,\n }\n}\n"
],
"mappings": "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",
"debugId": "08C7AF4A98C7CA2364756E2164756E21",
"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": ";swBAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,OAAO,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "D4F64FCC42F6496364756E2164756E21",
"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": ";8vBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,GAAG,EACrC,CACH",
"debugId": "821D0D2E47DE645D64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/mini/variant.shared.ts", "src/mini/session.shared.ts", "src/mini/theme.ts"],
"sourcesContent": [
"// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > saved preference > session history.\n//\n// The saved variant persists across sessions in ~/.local/state/opencode/model.json\n// so your last-used variant sticks. Cycling (ctrl+t) updates both the active\n// variant and the persisted file.\nimport path from \"path\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { makeGlobalNode } from \"@opencode-ai/core/effect/app-node\"\nimport { makeRuntime } from \"@opencode-ai/core/effect/runtime\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\n\nconst MODEL_FILE = path.join(Global.Path.state, \"model.json\")\n\ntype ModelState = Record<string, unknown> & {\n variant?: Record<string, string | undefined>\n}\ntype VariantService = {\n readonly resolveSavedVariant: (model: RunInput[\"model\"]) => Effect.Effect<string | undefined>\n readonly saveVariant: (model: RunInput[\"model\"], variant: string | undefined) => Effect.Effect<void>\n}\ntype VariantRuntime = {\n resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined>\n saveVariant(model: RunInput[\"model\"], variant: string | undefined): Promise<void>\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n\nclass Service extends Context.Service<Service, VariantService>()(\"@opencode/RunVariant\") {}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction variantKey(model: NonNullable<RunInput[\"model\"]>): string {\n return modelKey(model.providerID, model.modelID)\n}\n\nexport function modelInfo(providers: RunProvider[] | undefined, model: NonNullable<RunInput[\"model\"]>) {\n const provider = providers?.find((item) => item.id === model.providerID)\n return {\n provider: provider?.name ?? model.providerID,\n model: provider?.models[model.modelID]?.name ?? model.modelID,\n }\n}\n\nexport function formatModelLabel(\n model: NonNullable<RunInput[\"model\"]>,\n variant: string | undefined,\n providers?: RunProvider[],\n): string {\n const names = modelInfo(providers, model)\n const label = variant ? ` · ${variant}` : \"\"\n return `${names.model} · ${names.provider}${label}`\n}\n\nexport function cycleVariant(current: string | undefined, variants: string[]): string | undefined {\n if (variants.length === 0) {\n return undefined\n }\n\n if (!current) {\n return variants[0]\n }\n\n const idx = variants.indexOf(current)\n if (idx === -1 || idx === variants.length - 1) {\n return undefined\n }\n\n return variants[idx + 1]\n}\n\nexport function pickVariant(model: RunInput[\"model\"], input: RunSession | SessionMessages): string | undefined {\n return sessionVariant(Array.isArray(input) ? createSession(input) : input, model)\n}\n\nfunction fitVariant(value: string | undefined, variants: string[]): string | undefined {\n if (!value) {\n return undefined\n }\n\n if (variants.length === 0 || variants.includes(value)) {\n return value\n }\n\n return undefined\n}\n\n// Picks the active variant. CLI flag wins, then saved preference, then session\n// history. fitVariant() checks saved and session values against the available\n// variants list -- if the provider doesn't offer a variant, it drops.\nexport function resolveVariant(\n input: string | undefined,\n session: string | undefined,\n saved: string | undefined,\n variants: string[],\n): string | undefined {\n if (input !== undefined) {\n return input\n }\n\n const fallback = fitVariant(saved, variants)\n const current = fitVariant(session, variants)\n if (current !== undefined) {\n return current\n }\n\n return fallback\n}\n\nfunction state(value: unknown): ModelState {\n if (!isRecord(value)) {\n return {}\n }\n\n const variant = isRecord(value.variant)\n ? Object.fromEntries(\n Object.entries(value.variant).flatMap(([key, item]) => {\n if (typeof item !== \"string\") {\n return []\n }\n\n return [[key, item] as const]\n }),\n )\n : undefined\n\n return {\n ...value,\n variant,\n }\n}\n\nconst layer = Layer.fresh(\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const file = yield* FSUtil.Service\n\n const read = Effect.fn(\"RunVariant.read\")(function* () {\n return yield* file.readJson(MODEL_FILE).pipe(\n Effect.map(state),\n Effect.catchCause(() => Effect.succeed(state(undefined))),\n )\n })\n\n const resolveSavedVariant = Effect.fn(\"RunVariant.resolveSavedVariant\")(function* (model: RunInput[\"model\"]) {\n if (!model) {\n return undefined\n }\n\n return (yield* read()).variant?.[variantKey(model)]\n })\n\n const saveVariant = Effect.fn(\"RunVariant.saveVariant\")(function* (\n model: RunInput[\"model\"],\n variant: string | undefined,\n ) {\n if (!model) {\n return\n }\n\n const current = yield* read()\n const next = {\n ...current.variant,\n }\n const key = variantKey(model)\n if (variant) {\n next[key] = variant\n }\n\n if (!variant) {\n delete next[key]\n }\n\n yield* file\n .writeJson(MODEL_FILE, {\n ...current,\n variant: next,\n })\n .pipe(Effect.orElseSucceed(() => undefined))\n })\n\n return Service.of({\n resolveSavedVariant,\n saveVariant,\n })\n }),\n ),\n)\n\nconst node = makeGlobalNode({ service: Service, layer, deps: [FSUtil.node] })\n\n/** @internal Exported for testing. */\nexport function createVariantRuntime(replacements?: readonly LayerNode.Replacement[]): VariantRuntime {\n const runtime = makeRuntime(Service, AppNodeBuilder.build(node, replacements))\n return {\n resolveSavedVariant: (model) => runtime.runPromise((svc) => svc.resolveSavedVariant(model)).catch(() => undefined),\n saveVariant: (model, variant) => runtime.runPromise((svc) => svc.saveVariant(model, variant)).catch(() => {}),\n }\n}\n\nconst runtime = createVariantRuntime()\n\nexport async function resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined> {\n return runtime.resolveSavedVariant(model)\n}\n\nexport function saveVariant(model: RunInput[\"model\"], variant: string | undefined): void {\n void runtime.saveVariant(model, variant)\n}\n",
"// Session message extraction and prompt history.\n//\n// Fetches session messages from the SDK and extracts user turn text for\n// the prompt history ring. Also finds the most recently used variant for\n// the current model so the footer can pre-select it.\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { Message, Part } from \"@opencode-ai/sdk/v2\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = Array<{ info: Message; parts: Part[] }>\n\ntype Turn = {\n prompt: RunPrompt\n provider: string | undefined\n model: string | undefined\n variant: string | undefined\n}\n\nexport type RunSession = {\n first: boolean\n turns: Turn[]\n model?: NonNullable<RunInput[\"model\"]>\n variant?: string\n}\n\nfunction fileName(url: string, filename?: string) {\n if (filename) {\n return filename\n }\n\n try {\n const next = new URL(url)\n if (next.protocol !== \"file:\") {\n return url\n }\n\n const name = next.pathname.split(\"/\").at(-1)\n if (name) {\n return decodeURIComponent(name)\n }\n } catch {}\n\n return url\n}\n\nfunction fileSource(\n part: Extract<SessionMessages[number][\"parts\"][number], { type: \"file\" }>,\n text: { start: number; end: number; value: string },\n) {\n if (part.source) {\n return {\n ...structuredClone(part.source),\n text,\n }\n }\n\n return {\n type: \"file\" as const,\n path: part.filename ?? part.url,\n text,\n }\n}\n\nexport function messagePrompt(msg: SessionMessages[number]): RunPrompt {\n const parts: RunPrompt[\"parts\"] = []\n let text = msg.parts\n .filter((part): part is Extract<SessionMessages[number][\"parts\"][number], { type: \"text\" }> => {\n return part.type === \"text\" && !part.synthetic\n })\n .map((part) => part.text)\n .join(\"\")\n let cursor = Bun.stringWidth(text)\n const used: Array<{ start: number; end: number }> = []\n\n const take = (value: string): { start: number; end: number; value: string } | undefined => {\n let from = 0\n while (true) {\n const idx = text.indexOf(value, from)\n if (idx === -1) {\n return undefined\n }\n\n const start = Bun.stringWidth(text.slice(0, idx))\n const end = start + Bun.stringWidth(value)\n if (!used.some((item) => item.start < end && start < item.end)) {\n return { start, end, value }\n }\n\n from = idx + value.length\n }\n }\n\n const add = (value: string) => {\n const gap = text ? \" \" : \"\"\n const start = cursor + Bun.stringWidth(gap)\n text += gap + value\n const end = start + Bun.stringWidth(value)\n cursor = end\n return { start, end, value }\n }\n\n for (const part of msg.parts) {\n if (part.type === \"file\") {\n const next = part.source?.text ? structuredClone(part.source.text) : take(\"@\" + fileName(part.url, part.filename))\n const span = next ?? add(\"@\" + fileName(part.url, part.filename))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"file\",\n mime: part.mime,\n filename: part.filename,\n url: part.url,\n source: fileSource(part, span),\n })\n continue\n }\n\n if (part.type !== \"agent\") {\n continue\n }\n\n const span = part.source ? structuredClone(part.source) : (take(\"@\" + part.name) ?? add(\"@\" + part.name))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"agent\",\n name: part.name,\n source: span,\n })\n }\n\n return { text, parts }\n}\n\nfunction turn(msg: SessionMessages[number]): Turn | undefined {\n if (msg.info.role !== \"user\") {\n return undefined\n }\n\n return {\n prompt: messagePrompt(msg),\n provider: msg.info.model.providerID,\n model: msg.info.model.modelID,\n variant: msg.info.model.variant,\n }\n}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((msg) => {\n const item = turn(msg)\n return item ? [item] : []\n }),\n }\n}\n\nexport async function resolveCurrentSession(\n sdk: RunInput[\"sdk\"],\n sessionID: string,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }),\n sdk.session.get({ sessionID }),\n ])\n const messages = response.data.toReversed()\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) => {\n if (message.type !== \"user\") return []\n return [\n {\n prompt: {\n text: message.text,\n parts: [\n ...(message.files ?? []).map((file) => ({\n type: \"file\" as const,\n url: file.source.type === \"uri\" ? file.source.uri : `data:${file.mime};base64,${file.data}`,\n mime: file.mime,\n filename: file.name,\n source: file.mention\n ? {\n type: \"file\" as const,\n path: file.name ?? (file.source.type === \"uri\" ? file.source.uri : \"inline attachment\"),\n text: { start: file.mention.start, end: file.mention.end, value: file.mention.text },\n }\n : undefined,\n })),\n ...(message.agents ?? []).map((agent) => ({\n type: \"agent\" as const,\n name: agent.name,\n source: agent.mention\n ? { start: agent.mention.start, end: agent.mention.end, value: agent.mention.text }\n : undefined,\n })),\n ],\n },\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n },\n ]\n }),\n ...(session.model && {\n model: {\n providerID: session.model.providerID,\n modelID: session.model.id,\n },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n const out: RunPrompt[] = []\n\n for (const turn of session.turns) {\n if (!turn.prompt.text.trim()) {\n continue\n }\n\n if (out[out.length - 1] && promptSame(out[out.length - 1], turn.prompt)) {\n continue\n }\n\n out.push(promptCopy(turn.prompt))\n }\n\n return out.slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) {\n return undefined\n }\n\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) {\n return session.variant\n }\n\n for (let idx = session.turns.length - 1; idx >= 0; idx -= 1) {\n const turn = session.turns[idx]\n if (turn.provider !== model.providerID || turn.model !== model.modelID) {\n continue\n }\n\n return turn.variant\n }\n\n return undefined\n}\n",
"// Theme resolution for direct interactive mode.\n//\n// Derives scrollback and footer colors from the terminal's actual palette.\n// resolveRunTheme() queries the renderer for the terminal's palette,\n// detects dark/light mode, builds a small system theme locally, and maps it to\n// the run footer + scrollback color model. Falls back to a hardcoded dark-mode\n// palette if detection fails.\nimport { RGBA, SyntaxStyle, type CliRenderer, type ColorInput, type TerminalColors } from \"@opentui/core\"\nimport type { TuiThemeCurrent } from \"@opencode-ai/plugin/tui\"\nimport type { EntryKind } from \"./types\"\n\ntype Tone = {\n body: ColorInput\n start?: ColorInput\n}\n\nexport type RunEntryTheme = Record<EntryKind, Tone>\n\nexport type RunSplashTheme = {\n left: ColorInput\n right: ColorInput\n leftShadow: ColorInput\n rightShadow: ColorInput\n}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: ColorInput\n success: ColorInput\n error: ColorInput\n muted: ColorInput\n text: ColorInput\n status: ColorInput\n statusAccent: ColorInput\n shade: ColorInput\n surface: ColorInput\n pane: ColorInput\n border: ColorInput\n line: ColorInput\n}\n\nexport type RunBlockTheme = {\n highlight: ColorInput\n warning: ColorInput\n text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\n subtleSyntax?: SyntaxStyle\n diffAdded: ColorInput\n diffRemoved: ColorInput\n diffAddedBg: ColorInput\n diffRemovedBg: ColorInput\n diffContextBg: ColorInput\n diffHighlightAdded: ColorInput\n diffHighlightRemoved: ColorInput\n diffLineNumber: ColorInput\n diffAddedLineNumberBg: ColorInput\n diffRemovedLineNumberBg: ColorInput\n}\n\nexport type RunTheme = {\n background: ColorInput\n footer: RunFooterTheme\n entry: RunEntryTheme\n splash: RunSplashTheme\n block: RunBlockTheme\n}\n\ntype ThemeColor = Exclude<keyof TuiThemeCurrent, \"thinkingOpacity\">\ntype HexColor = `#${string}`\ntype RefName = string\ntype Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\ntype ColorValue = HexColor | RefName | Variant | RGBA | number\ntype ThemeJson = {\n defs?: Record<string, HexColor | RefName>\n theme: Omit<Record<ThemeColor, ColorValue>, \"selectedListItemText\" | \"backgroundMenu\"> & {\n selectedListItemText?: ColorValue\n backgroundMenu?: ColorValue\n thinkingOpacity?: number\n }\n}\n\ntype SharedSyntaxTheme = TuiThemeCurrent & {\n _hasSelectedListItemText: boolean\n}\n\nexport const transparent = RGBA.fromValues(0, 0, 0, 0)\n\nfunction alpha(color: RGBA, value: number): RGBA {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, value)))\n}\n\nfunction rgba(hex: string, value?: number): RGBA {\n const color = RGBA.fromHex(hex)\n return value === undefined ? color : alpha(color, value)\n}\n\nfunction mode(bg: RGBA): \"dark\" | \"light\" {\n return luminance(bg) > 0.5 ? \"light\" : \"dark\"\n}\n\nfunction luminance(color: RGBA): number {\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b\n}\n\nfunction fade(color: RGBA, base: RGBA, fallback: number, scale: number, limit: number): RGBA {\n if (color.a === 0) {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, fallback)))\n }\n\n const target = Math.min(limit, color.a * scale)\n const mix = Math.min(1, target / color.a)\n\n return RGBA.fromValues(\n base.r + (color.r - base.r) * mix,\n base.g + (color.g - base.g) * mix,\n base.b + (color.b - base.b) * mix,\n color.a,\n )\n}\n\nfunction ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansi = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansi[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const value = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(value(r), value(g), value(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nfunction tint(base: RGBA, overlay: RGBA, value: number): RGBA {\n return RGBA.fromInts(\n Math.round((base.r + (overlay.r - base.r) * value) * 255),\n Math.round((base.g + (overlay.g - base.g) * value) * 255),\n Math.round((base.b + (overlay.b - base.b) * value) * 255),\n )\n}\n\nfunction blend(color: RGBA, bg: RGBA): RGBA {\n if (color.a >= 1) {\n return color\n }\n\n return RGBA.fromValues(\n bg.r + (color.r - bg.r) * color.a,\n bg.g + (color.g - bg.g) * color.a,\n bg.b + (color.b - bg.b) * color.a,\n 1,\n )\n}\n\nfunction chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\n}\n\nfunction opaqueSyntaxStyle(style: SyntaxStyle | undefined, bg: RGBA): SyntaxStyle | undefined {\n if (!style) {\n return undefined\n }\n\n return SyntaxStyle.fromStyles(\n Object.fromEntries(\n [...style.getAllStyles()].map(([name, value]) => [\n name,\n {\n ...value,\n fg: value.fg ? blend(value.fg, bg) : value.fg,\n bg: value.bg ? blend(value.bg, bg) : value.bg,\n },\n ]),\n ),\n )\n}\n\nfunction indexedPalette(colors: TerminalColors, size: number = Math.max(colors.palette.length, 16)): RGBA[] {\n return Array.from({ length: size }, (_, index) => {\n const value = colors.palette[index]\n return RGBA.fromIndex(index, value ? RGBA.fromHex(value) : ansiToRgba(index))\n })\n}\n\nfunction srgbToLinear(value: number): number {\n if (value <= 0.04045) {\n return value / 12.92\n }\n\n return ((value + 0.055) / 1.055) ** 2.4\n}\n\nfunction oklab(color: RGBA) {\n const r = srgbToLinear(color.r)\n const g = srgbToLinear(color.g)\n const b = srgbToLinear(color.b)\n\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b)\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b)\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b)\n\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\nfunction nearestIndexed(indexed: RGBA[], rgba: RGBA): RGBA {\n const target = oklab(rgba)\n const hit = indexed.reduce(\n (best, item) => {\n const sample = oklab(item)\n const dl = sample.l - target.l\n const da = sample.a - target.a\n const db = sample.b - target.b\n const dist = dl * dl * 2 + da * da + db * db\n if (dist >= best.dist) return best\n return {\n dist,\n item,\n }\n },\n {\n dist: Number.POSITIVE_INFINITY,\n item: indexed[0]!,\n },\n )\n\n return RGBA.clone(hit.item)\n}\n\nfunction paletteColor(colors: TerminalColors, index: number): RGBA {\n const value = colors.palette[index]\n return value ? RGBA.fromHex(value) : ansiToRgba(index)\n}\n\nfunction splashShadow(indexed: RGBA[], base: RGBA, overlay: RGBA, value: number): RGBA {\n const mixed = tint(base, overlay, value)\n return nearestIndexed(indexed, mixed)\n}\n\nexport function resolveTheme(theme: ThemeJson, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const defs = theme.defs ?? {}\n\n const resolveColor = (value: ColorValue, chain: string[] = []): RGBA => {\n if (value instanceof RGBA) return value\n\n if (typeof value === \"number\") {\n return RGBA.fromIndex(value, ansiToRgba(value))\n }\n\n if (typeof value !== \"string\") {\n return resolveColor(value[pick], chain)\n }\n\n if (value === \"transparent\" || value === \"none\") {\n return RGBA.fromInts(0, 0, 0, 0)\n }\n\n if (value.startsWith(\"#\")) {\n return RGBA.fromHex(value)\n }\n\n if (chain.includes(value)) {\n throw new Error(`Circular color reference: ${[...chain, value].join(\" -> \")}`)\n }\n\n const next = defs[value] ?? theme.theme[value as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${value}\" not found in defs or theme`)\n }\n\n return resolveColor(next, [...chain, value])\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText:\n theme.theme.selectedListItemText === undefined\n ? resolved.background!\n : resolveColor(theme.theme.selectedListItemText),\n backgroundMenu:\n theme.theme.backgroundMenu === undefined ? resolved.backgroundElement! : resolveColor(theme.theme.backgroundMenu),\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): Record<number, RGBA> {\n const r = bg.r * 255\n const g = bg.g * 255\n const b = bg.b * 255\n const lum = 0.299 * r + 0.587 * g + 0.114 * b\n const cast = 0.25 * (1 - chroma(bg)) ** 2\n\n const gray = (level: number) => {\n const factor = level / 12\n\n if (isDark && lum < 10) {\n const value = Math.floor(factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n if (!isDark && lum > 245) {\n const value = Math.floor(255 - factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n const value = isDark ? lum + (255 - lum) * factor * 0.4 : lum * (1 - factor * 0.4)\n const tone = RGBA.fromInts(Math.floor(value), Math.floor(value), Math.floor(value))\n if (cast === 0) return map(tone)\n\n const ratio = lum === 0 ? 0 : value / lum\n return map(\n tint(\n tone,\n RGBA.fromInts(\n Math.floor(Math.max(0, Math.min(r * ratio, 255))),\n Math.floor(Math.max(0, Math.min(g * ratio, 255))),\n Math.floor(Math.max(0, Math.min(b * ratio, 255))),\n ),\n cast,\n ),\n )\n }\n\n return Object.fromEntries(Array.from({ length: 12 }, (_, index) => [index + 1, gray(index + 1)]))\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): RGBA {\n const lum = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n const gray = isDark\n ? lum < 10\n ? 180\n : Math.min(Math.floor(160 + lum * 0.3), 200)\n : lum > 245\n ? 75\n : Math.max(Math.floor(100 - (255 - lum) * 0.2), 60)\n\n return map(RGBA.fromInts(gray, gray, gray))\n}\n\nexport function generateSystem(colors: TerminalColors, pick: \"dark\" | \"light\"): ThemeJson {\n const bg_snapshot = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg_snapshot = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const bg = RGBA.defaultBackground(bg_snapshot)\n const fg = RGBA.defaultForeground(fg_snapshot)\n const isDark = pick === \"dark\"\n\n const color = (index: number) => paletteColor(colors, index)\n\n const grays = generateGrayScale(bg_snapshot, isDark, (rgba) => rgba)\n const textMuted = generateMutedTextColor(bg_snapshot, isDark, (rgba) => rgba)\n\n const ansi = {\n red: color(1),\n green: color(2),\n yellow: color(3),\n blue: color(4),\n magenta: color(5),\n cyan: color(6),\n red_bright: color(9),\n green_bright: color(10),\n }\n\n const diff_alpha = isDark ? 0.22 : 0.14\n const diff_context_bg = grays[2]\n const primary = ansi.cyan\n const secondary = ansi.magenta\n\n return {\n theme: {\n primary,\n secondary,\n accent: primary,\n error: ansi.red,\n warning: ansi.yellow,\n success: ansi.green,\n info: ansi.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: alpha(bg, 0),\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansi.green,\n diffRemoved: ansi.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansi.green_bright,\n diffHighlightRemoved: ansi.red_bright,\n diffAddedBg: tint(bg_snapshot, ansi.green, diff_alpha),\n diffRemovedBg: tint(bg_snapshot, ansi.red, diff_alpha),\n diffContextBg: diff_context_bg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg: tint(diff_context_bg, ansi.green, diff_alpha),\n diffRemovedLineNumberBg: tint(diff_context_bg, ansi.red, diff_alpha),\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansi.blue,\n markdownLinkText: ansi.cyan,\n markdownCode: ansi.green,\n markdownBlockQuote: ansi.yellow,\n markdownEmph: ansi.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansi.blue,\n markdownListEnumeration: ansi.cyan,\n markdownImage: ansi.blue,\n markdownImageText: ansi.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansi.magenta,\n syntaxFunction: ansi.blue,\n syntaxVariable: fg,\n syntaxString: ansi.green,\n syntaxNumber: ansi.yellow,\n syntaxType: ansi.cyan,\n syntaxOperator: ansi.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction quantizeColor(indexed: RGBA[], rgba: RGBA): RGBA {\n if (rgba.a === 0 || rgba.intent === \"default\" || rgba.intent === \"indexed\") {\n return RGBA.clone(rgba)\n }\n\n return nearestIndexed(indexed, rgba)\n}\n\nfunction quantizeTheme(theme: TuiThemeCurrent, indexed: RGBA[]): TuiThemeCurrent {\n const resolved = Object.fromEntries(\n Object.entries(theme)\n .filter(([key]) => key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, quantizeColor(indexed, value as RGBA)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n thinkingOpacity: theme.thinkingOpacity,\n }\n}\n\nfunction splashTheme(theme: TuiThemeCurrent, indexed: RGBA[]): RunSplashTheme {\n const left = nearestIndexed(indexed, theme.textMuted)\n const right = nearestIndexed(indexed, theme.text)\n return {\n left,\n right,\n leftShadow: splashShadow(indexed, theme.background, left, 0.14),\n rightShadow: splashShadow(indexed, theme.background, right, 0.14),\n }\n}\n\nfunction map(\n footerTheme: TuiThemeCurrent,\n scrollbackTheme: TuiThemeCurrent,\n splash: RunSplashTheme,\n syntax?: SyntaxStyle,\n subtleSyntax?: SyntaxStyle,\n): RunTheme {\n const opaqueSubtleSyntax = opaqueSyntaxStyle(subtleSyntax, scrollbackTheme.background)\n subtleSyntax?.destroy()\n const footerBackground = alpha(footerTheme.background, 1)\n const footerMode = mode(footerBackground)\n const shade = fade(footerTheme.backgroundMenu, footerTheme.background, 0.12, 0.56, 0.72)\n const surface = fade(footerTheme.backgroundMenu, footerTheme.background, 0.18, 0.76, 0.9)\n const line = fade(footerTheme.backgroundMenu, footerTheme.background, 0.24, 0.9, 0.98)\n const statusBase = tint(footerBackground, rgba(\"#000000\"), footerMode === \"dark\" ? 0.12 : 0.06)\n const statusAccentBase =\n footerMode === \"dark\" ? tint(footerBackground, rgba(\"#ffffff\"), 0.06) : tint(statusBase, rgba(\"#000000\"), 0.04)\n const collapsedStatus = footerMode === \"dark\" && luminance(statusBase) <= 0.04\n // Pure-black backgrounds need a slight lift or the row disappears into the terminal background.\n const status = collapsedStatus ? tint(statusBase, statusAccentBase, 0.7) : statusBase\n const statusAccent = collapsedStatus ? tint(status, rgba(\"#ffffff\"), 0.06) : statusAccentBase\n\n return {\n background: footerTheme.background,\n footer: {\n highlight: footerTheme.primary,\n selected: footerTheme.backgroundElement,\n selectedText: footerTheme.selectedListItemText,\n warning: footerTheme.warning,\n success: footerTheme.success,\n error: footerTheme.error,\n muted: footerTheme.textMuted,\n text: footerTheme.text,\n status,\n statusAccent,\n shade,\n surface,\n pane: footerTheme.backgroundMenu,\n border: footerTheme.border,\n line,\n },\n entry: {\n system: {\n body: scrollbackTheme.textMuted,\n },\n user: {\n body: scrollbackTheme.primary,\n },\n assistant: {\n body: scrollbackTheme.text,\n },\n reasoning: {\n body: scrollbackTheme.textMuted,\n },\n tool: {\n body: scrollbackTheme.text,\n start: scrollbackTheme.textMuted,\n },\n error: {\n body: scrollbackTheme.error,\n },\n },\n splash,\n block: {\n highlight: scrollbackTheme.primary,\n warning: scrollbackTheme.warning,\n text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\n subtleSyntax: opaqueSubtleSyntax,\n diffAdded: scrollbackTheme.diffAdded,\n diffRemoved: scrollbackTheme.diffRemoved,\n diffAddedBg: transparent,\n diffRemovedBg: transparent,\n diffContextBg: transparent,\n diffHighlightAdded: scrollbackTheme.diffHighlightAdded,\n diffHighlightRemoved: scrollbackTheme.diffHighlightRemoved,\n diffLineNumber: scrollbackTheme.diffLineNumber,\n diffAddedLineNumberBg: scrollbackTheme.diffAddedLineNumberBg,\n diffRemovedLineNumberBg: scrollbackTheme.diffRemovedLineNumberBg,\n },\n }\n}\n\nconst seed = {\n highlight: RGBA.fromIndex(6, rgba(\"#38bdf8\")),\n muted: RGBA.fromIndex(8, rgba(\"#64748b\")),\n text: RGBA.defaultForeground(rgba(\"#f8fafc\")),\n panel: rgba(\"#0f172a\"),\n success: RGBA.fromIndex(2, rgba(\"#22c55e\")),\n warning: RGBA.fromIndex(3, rgba(\"#f59e0b\")),\n error: RGBA.fromIndex(1, rgba(\"#ef4444\")),\n}\n\nfunction tone(body: ColorInput, start?: ColorInput): Tone {\n return {\n body,\n start,\n }\n}\n\nconst fallbackSplashIndexed = Array.from({ length: 256 }, (_, index) => RGBA.fromIndex(index))\nconst fallbackSplashLeft = RGBA.fromIndex(67)\nconst fallbackSplashRight = RGBA.fromIndex(110)\n\nexport const RUN_THEME_FALLBACK: RunTheme = {\n background: RGBA.fromValues(0, 0, 0, 0),\n footer: {\n highlight: seed.highlight,\n selected: seed.text,\n selectedText: seed.panel,\n warning: seed.warning,\n success: seed.success,\n error: seed.error,\n muted: seed.muted,\n text: seed.text,\n status: tint(seed.panel, rgba(\"#000000\"), 0.12),\n statusAccent: tint(seed.panel, rgba(\"#ffffff\"), 0.06),\n shade: alpha(seed.panel, 0.68),\n surface: alpha(seed.panel, 0.86),\n pane: seed.panel,\n border: seed.muted,\n line: alpha(seed.panel, 0.96),\n },\n entry: {\n system: tone(seed.muted),\n user: tone(seed.highlight),\n assistant: tone(seed.text),\n reasoning: tone(seed.muted),\n tool: tone(seed.text, seed.muted),\n error: tone(seed.error),\n },\n splash: {\n left: fallbackSplashLeft,\n right: fallbackSplashRight,\n leftShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashLeft, 0.14),\n rightShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashRight, 0.14),\n },\n block: {\n highlight: seed.highlight,\n warning: seed.warning,\n text: seed.text,\n muted: seed.muted,\n diffAdded: seed.success,\n diffRemoved: seed.error,\n diffAddedBg: alpha(seed.success, 0.18),\n diffRemovedBg: alpha(seed.error, 0.18),\n diffContextBg: alpha(seed.panel, 0.72),\n diffHighlightAdded: seed.success,\n diffHighlightRemoved: seed.error,\n diffLineNumber: seed.muted,\n diffAddedLineNumberBg: alpha(seed.success, 0.12),\n diffRemovedLineNumberBg: alpha(seed.error, 0.12),\n },\n}\n\nexport async function resolveRunTheme(renderer: CliRenderer): Promise<RunTheme> {\n try {\n const colors = await renderer.getPalette({\n size: 256,\n })\n const bg = colors.defaultBackground ?? colors.palette[0]\n if (!bg) {\n return RUN_THEME_FALLBACK\n }\n\n // Palette-only terminal reloads can leave renderer.themeMode stale, but\n // ANSI slot zero is not the terminal background when OSC 11 is absent.\n const pick = colors.defaultBackground\n ? mode(RGBA.fromHex(colors.defaultBackground))\n : (renderer.themeMode ?? mode(RGBA.fromHex(bg)))\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const indexed = indexedPalette(colors, 256)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const shared = await import(\"@opencode-ai/tui/context/theme\")\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n const syntax = shared.generateSyntax(syntaxTheme)\n return map(\n footerTheme,\n scrollbackTheme,\n splashTheme(scrollbackTheme, indexed),\n syntax,\n shared.generateSubtleSyntax(syntaxTheme),\n )\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n"
],
"mappings": "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",
"debugId": "FB11007EBC40580B64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "3919E83709574D1464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/session-data.ts", "src/mini/stream.ts"],
"sourcesContent": [
"// Core reducer for direct interactive mode.\n//\n// Takes raw SDK events and produces two outputs:\n// - StreamCommit[]: append-only scrollback entries (text, tool, error, etc.)\n// - FooterOutput: status bar patches and view transitions (permission, question)\n//\n// The reducer mutates SessionData in place for performance but has no\n// external side effects -- no IO, no footer calls. The demo runtime\n// (demo.ts) feeds events in and forwards output to the footer through\n// stream.ts; the current transport reuses the blocker helpers below.\n//\n// Key design decisions:\n//\n// - Text parts buffer in `data.text` until their message role is confirmed as\n// \"assistant\". This prevents echoing user-role text parts. The `ready()`\n// check gates output: if we see a text delta before the message.updated\n// event that tells us the role, we stash it and flush later via `replay()`.\n//\n// - Tool echo stripping: bash tools may echo their own output in the next\n// assistant text part. `stashEcho()` records completed bash output, and\n// `stripEcho()` removes it from the start of the next assistant chunk.\n//\n// - Permission and question requests queue in `data.permissions` and\n// `data.questions`. The footer shows whichever is first. When a reply\n// event arrives, the queue entry is removed and the footer falls back\n// to the next pending request or to the prompt view.\nimport type { Event, PermissionRequest, QuestionRequest, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport { toolView } from \"./tool\"\nimport type { FooterOutput, FooterPatch, FooterView, StreamCommit } from \"./types\"\n\nconst money = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n})\n\ntype Tokens = {\n input?: number\n output?: number\n reasoning?: number\n cache?: {\n read?: number\n write?: number\n }\n}\n\ntype PartKind = \"assistant\" | \"reasoning\" | \"user\"\ntype MessageRole = \"assistant\" | \"user\"\ntype Dict = Record<string, unknown>\ntype SessionCommit = StreamCommit\n\n// Mutable accumulator for the reducer. Each field tracks a different aspect\n// of the stream so we can produce correct incremental output:\n//\n// - ids: parts and error keys we've already committed (dedup guard)\n// - tools: tool parts we've emitted a \"start\" for but not yet completed\n// - call: tool call inputs, keyed by msg:call, for enriching permission views\n// - role: message ID → \"assistant\" | \"user\", learned from message.updated\n// - msg: part ID → message ID\n// - part: part ID → \"assistant\" | \"reasoning\" (text parts only)\n// - text: part ID → full accumulated text so far\n// - sent: part ID → byte offset of last flushed text (for incremental output)\n// - visible: part ID → rendered text for an active part after display transforms\n// - end: part IDs whose time.end has arrived (part is finished)\n// - shell: shell ID → chosen transcript source for direct shell calls\n// - echo: message ID → bash outputs to strip from the next assistant chunk\ntype ShellCall = {\n source: \"shell\" | \"tool\"\n command?: string\n}\n\nexport type SessionData = {\n includeUserText: boolean\n announced: boolean\n ids: Set<string>\n tools: Set<string>\n call: Map<string, Dict>\n shell: Map<string, ShellCall>\n permissions: PermissionRequest[]\n questions: QuestionRequest[]\n role: Map<string, MessageRole>\n msg: Map<string, string>\n part: Map<string, PartKind>\n text: Map<string, string>\n sent: Map<string, number>\n visible: Map<string, string>\n end: Set<string>\n echo: Map<string, Set<string>>\n}\n\nexport type SessionDataInput = {\n data: SessionData\n event: Event\n sessionID: string\n thinking: boolean\n limits: Record<string, number>\n}\n\nexport type SessionDataOutput = {\n data: SessionData\n commits: SessionCommit[]\n footer?: FooterOutput\n}\n\nexport function createSessionData(\n input: {\n includeUserText?: boolean\n } = {},\n): SessionData {\n return {\n includeUserText: input.includeUserText ?? false,\n announced: false,\n ids: new Set(),\n tools: new Set(),\n call: new Map(),\n shell: new Map(),\n permissions: [],\n questions: [],\n role: new Map(),\n msg: new Map(),\n part: new Map(),\n text: new Map(),\n sent: new Map(),\n visible: new Map(),\n end: new Set(),\n echo: new Map(),\n }\n}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction formatUsage(\n tokens: Tokens | undefined,\n limit: number | undefined,\n cost: number | undefined,\n): string | undefined {\n const total =\n (tokens?.input ?? 0) +\n (tokens?.output ?? 0) +\n (tokens?.reasoning ?? 0) +\n (tokens?.cache?.read ?? 0) +\n (tokens?.cache?.write ?? 0)\n\n if (total <= 0) {\n if (typeof cost === \"number\" && cost > 0) {\n return money.format(cost)\n }\n return undefined\n }\n\n const text =\n limit && limit > 0 ? `${Locale.number(total)} (${Math.round((total / limit) * 100)}%)` : Locale.number(total)\n\n if (typeof cost === \"number\" && cost > 0) {\n return `${text} · ${money.format(cost)}`\n }\n\n return text\n}\n\nexport function formatError(error: {\n name?: string\n message?: string\n data?: {\n message?: string\n }\n}): string {\n if (error.data?.message) {\n return error.data.message\n }\n\n if (error.message) {\n return error.message\n }\n\n if (error.name) {\n return error.name\n }\n\n return \"unknown error\"\n}\n\nfunction isAbort(error: { name?: string } | undefined): boolean {\n return error?.name === \"MessageAbortedError\"\n}\n\nfunction msgErr(id: string): string {\n return `msg:${id}:error`\n}\n\nfunction patch(patch?: FooterPatch, view?: FooterView): FooterOutput | undefined {\n if (!patch && !view) {\n return undefined\n }\n\n return {\n patch,\n view,\n }\n}\n\nfunction out(data: SessionData, commits: SessionCommit[], footer?: FooterOutput): SessionDataOutput {\n if (!footer) {\n return {\n data,\n commits,\n }\n }\n\n return {\n data,\n commits,\n footer,\n }\n}\n\nexport function pickBlockerView(input: { permission?: PermissionRequest; question?: QuestionRequest }): FooterView {\n if (input.permission) {\n return { type: \"permission\", request: input.permission }\n }\n\n if (input.question) {\n return { type: \"question\", request: input.question }\n }\n\n return { type: \"prompt\" }\n}\n\nexport function blockerStatus(view: FooterView) {\n if (view.type === \"permission\") {\n return \"awaiting permission\"\n }\n\n if (view.type === \"question\") {\n return \"awaiting answer\"\n }\n\n return \"\"\n}\n\nfunction pickSessionView(data: SessionData): FooterView {\n return pickBlockerView({\n permission: data.permissions[0],\n question: data.questions[0],\n })\n}\n\nfunction queueFooter(data: SessionData): FooterOutput {\n const view = pickSessionView(data)\n\n return {\n view,\n patch: { status: blockerStatus(view) },\n }\n}\n\nfunction queueOut(data: SessionData, commits: SessionCommit[]): SessionDataOutput {\n return out(data, commits, queueFooter(data))\n}\n\nfunction upsert<T extends { id: string }>(list: T[], item: T) {\n const idx = list.findIndex((entry) => entry.id === item.id)\n if (idx === -1) {\n list.push(item)\n return\n }\n\n list[idx] = item\n}\n\nfunction remove(list: Array<{ id: string }>, id: string): boolean {\n const idx = list.findIndex((entry) => entry.id === id)\n if (idx === -1) {\n return false\n }\n\n list.splice(idx, 1)\n return true\n}\n\nfunction key(msg: string, call: string): string {\n return `${msg}:${call}`\n}\n\nfunction enrichPermission(data: SessionData, request: PermissionRequest): PermissionRequest {\n if (!request.tool) {\n return request\n }\n\n const input = data.call.get(key(request.tool.messageID, request.tool.callID))\n if (!input) {\n return request\n }\n\n const meta = request.metadata ?? {}\n if (meta.input === input) {\n return request\n }\n\n return {\n ...request,\n metadata: {\n ...meta,\n input,\n },\n }\n}\n\n// Updates the active permission request when the matching tool part gets\n// new input (e.g., a diff). This keeps the permission UI in sync with the\n// tool's evolving state. Only triggers a footer update if the currently\n// displayed permission was the one that changed.\nfunction syncPermission(data: SessionData, part: ToolPart): FooterOutput | undefined {\n data.call.set(key(part.messageID, part.callID), part.state.input)\n if (data.permissions.length === 0) {\n return undefined\n }\n\n let changed = false\n let active = false\n data.permissions = data.permissions.map((request, index) => {\n if (!request.tool || request.tool.messageID !== part.messageID || request.tool.callID !== part.callID) {\n return request\n }\n\n const next = enrichPermission(data, request)\n if (next === request) {\n return request\n }\n\n changed = true\n active ||= index === 0\n return next\n })\n\n if (!changed || !active) {\n return undefined\n }\n\n return {\n view: pickSessionView(data),\n }\n}\n\n// Question tool replies can complete without a matching question.replied event.\n// When that happens, drop the recovered pending request tied to this tool call so\n// the footer can return to the next blocker or to the prompt.\nfunction syncQuestion(data: SessionData, part: ToolPart): FooterOutput | undefined {\n if (part.tool !== \"question\") {\n return undefined\n }\n\n if (part.state.status !== \"completed\" && part.state.status !== \"error\") {\n return undefined\n }\n\n const next = data.questions.filter(\n (request) => request.tool?.messageID !== part.messageID || request.tool?.callID !== part.callID,\n )\n if (next.length === data.questions.length) {\n return undefined\n }\n\n data.questions = next\n return queueFooter(data)\n}\n\nfunction toolStatus(part: ToolPart): string {\n if (part.tool !== \"task\") {\n return `running ${part.tool}`\n }\n\n const state = part.state as {\n input?: {\n description?: unknown\n subagent_type?: unknown\n }\n }\n const desc = state.input?.description\n if (typeof desc === \"string\" && desc.trim()) {\n return `running ${desc.trim()}`\n }\n\n const type = state.input?.subagent_type\n if (typeof type === \"string\" && type.trim()) {\n return `running ${type.trim()}`\n }\n\n return \"running task\"\n}\n\n// Returns true if we can flush this part's text to scrollback.\n//\n// We gate on the message role being \"assistant\" because user-role messages\n// also contain text parts (the user's own input) which we don't want to\n// echo. If we haven't received the message.updated event yet, we return\n// false and the text stays buffered until replay() flushes it.\nfunction ready(data: SessionData, partID: string): boolean {\n const msg = data.msg.get(partID)\n if (!msg) {\n return true\n }\n\n const role = data.role.get(msg)\n if (!role) {\n return false\n }\n\n if (role === \"assistant\") {\n return true\n }\n\n return data.includeUserText && role === \"user\"\n}\n\nfunction syncText(data: SessionData, partID: string, next: string) {\n const prev = data.text.get(partID) ?? \"\"\n if (!next) {\n return prev\n }\n\n if (!prev || next.length >= prev.length) {\n data.text.set(partID, next)\n return next\n }\n\n return prev\n}\n\n// Records bash tool output for echo stripping. Some models echo bash output\n// verbatim at the start of their next text part. We save both the raw and\n// trimmed forms so stripEcho() can match either.\nfunction stashEcho(data: SessionData, part: ToolPart) {\n if (part.tool !== \"bash\") {\n return\n }\n\n if (typeof part.messageID !== \"string\" || !part.messageID) {\n return\n }\n\n const output = \"output\" in part.state ? part.state.output : undefined\n if (typeof output !== \"string\") {\n return\n }\n\n const text = output.replace(/^\\n+/, \"\")\n if (!text.trim()) {\n return\n }\n\n const set = data.echo.get(part.messageID) ?? new Set<string>()\n set.add(text)\n const trim = text.replace(/\\n+$/, \"\")\n if (trim && trim !== text) {\n set.add(trim)\n }\n data.echo.set(part.messageID, set)\n}\n\nfunction stripEcho(data: SessionData, msg: string | undefined, chunk: string): string {\n if (!msg) {\n return chunk\n }\n\n const set = data.echo.get(msg)\n if (!set || set.size === 0) {\n return chunk\n }\n\n data.echo.delete(msg)\n const list = [...set].sort((a, b) => b.length - a.length)\n for (const item of list) {\n if (!item || !chunk.startsWith(item)) {\n continue\n }\n\n return chunk.slice(item.length).replace(/^\\n+/, \"\")\n }\n\n return chunk\n}\n\nfunction flushPart(data: SessionData, commits: SessionCommit[], partID: string, interrupted = false) {\n const kind = data.part.get(partID)\n if (!kind) {\n return\n }\n\n const text = data.text.get(partID) ?? \"\"\n const sent = data.sent.get(partID) ?? 0\n let chunk = text.slice(sent)\n const msg = data.msg.get(partID)\n\n if (sent === 0) {\n chunk = chunk.replace(/^\\n+/, \"\")\n // Some models emit a standalone whitespace token before real content.\n // Keep buffering until we have visible text so scrollback doesn't get a blank row.\n if (!chunk.trim()) {\n return\n }\n if (kind === \"reasoning\" && chunk) {\n chunk = `Thinking: ${chunk.replace(/\\[REDACTED\\]/g, \"\")}`\n }\n if (kind === \"assistant\" && chunk) {\n chunk = stripEcho(data, msg, chunk)\n if (!chunk.trim()) {\n return\n }\n }\n }\n\n if (chunk) {\n data.sent.set(partID, text.length)\n data.visible.set(partID, (data.visible.get(partID) ?? \"\") + chunk)\n commits.push({\n kind,\n text: chunk,\n phase: \"progress\",\n source: kind === \"user\" ? \"system\" : kind,\n messageID: msg,\n partID,\n })\n }\n\n if (!interrupted) {\n return\n }\n\n commits.push({\n kind,\n text: \"\",\n phase: \"final\",\n source: kind === \"user\" ? \"system\" : kind,\n messageID: msg,\n partID,\n interrupted: true,\n })\n}\n\nfunction drop(data: SessionData, partID: string) {\n data.part.delete(partID)\n data.text.delete(partID)\n data.sent.delete(partID)\n data.visible.delete(partID)\n data.msg.delete(partID)\n data.end.delete(partID)\n}\n\n// Called when we learn a message's role (from message.updated). Flushes any\n// buffered text parts that were waiting on role confirmation. User-role\n// parts are silently dropped.\nfunction replay(data: SessionData, commits: SessionCommit[], messageID: string, role: MessageRole, thinking: boolean) {\n for (const [partID, msg] of data.msg.entries()) {\n if (msg !== messageID || data.ids.has(partID)) {\n continue\n }\n\n if (role === \"user\" && !data.includeUserText) {\n data.ids.add(partID)\n drop(data, partID)\n continue\n }\n\n const kind = data.part.get(partID)\n if (!kind) {\n continue\n }\n\n if (role === \"user\" && kind === \"assistant\") {\n data.part.set(partID, \"user\")\n }\n\n if (kind === \"reasoning\" && !thinking) {\n if (data.end.has(partID)) {\n data.ids.add(partID)\n }\n drop(data, partID)\n continue\n }\n\n flushPart(data, commits, partID)\n\n if (!data.end.has(partID)) {\n continue\n }\n\n data.ids.add(partID)\n drop(data, partID)\n }\n}\n\nfunction toolCommit(\n part: ToolPart,\n next: Pick<SessionCommit, \"text\" | \"phase\" | \"toolState\"> & { toolError?: string },\n): SessionCommit {\n return {\n kind: \"tool\",\n source: \"tool\",\n messageID: part.messageID,\n partID: part.id,\n tool: part.tool,\n part,\n ...next,\n }\n}\n\nfunction shellPartID(shellID: string): string {\n return `shell:${shellID}`\n}\n\nfunction claimShell(data: SessionData, shellID: string, source: ShellCall[\"source\"], command?: string): ShellCall {\n const current = data.shell.get(shellID)\n if (current) {\n if (command && !current.command) {\n current.command = command\n }\n\n return current\n }\n\n const next = {\n source,\n ...(command ? { command } : {}),\n } satisfies ShellCall\n data.shell.set(shellID, next)\n return next\n}\n\nfunction bashCommand(part: ToolPart): string | undefined {\n if (part.tool !== \"bash\") {\n return undefined\n }\n\n const input = part.state.input\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n return undefined\n }\n\n const command = Reflect.get(input, \"command\")\n return typeof command === \"string\" ? command : undefined\n}\n\nfunction shellCommit(\n input: {\n callID: string\n command: string\n },\n next: Pick<SessionCommit, \"text\" | \"phase\" | \"toolState\">,\n): SessionCommit {\n return {\n kind: \"tool\",\n source: \"tool\",\n partID: shellPartID(input.callID),\n tool: \"bash\",\n shell: input,\n ...next,\n }\n}\n\nfunction startShell(callID: string, command: string): SessionCommit {\n return shellCommit(\n {\n callID,\n command,\n },\n {\n text: \"running shell\",\n phase: \"start\",\n toolState: \"running\",\n },\n )\n}\n\nfunction doneShell(callID: string, command: string, output: string): SessionCommit {\n return shellCommit(\n {\n callID,\n command,\n },\n {\n text: output,\n phase: \"progress\",\n toolState: \"completed\",\n },\n )\n}\n\nfunction startTool(part: ToolPart): SessionCommit {\n return toolCommit(part, {\n text: toolStatus(part),\n phase: \"start\",\n toolState: \"running\",\n })\n}\n\nfunction doneTool(part: ToolPart): SessionCommit {\n return toolCommit(part, {\n text: \"\",\n phase: \"final\",\n toolState: \"completed\",\n })\n}\n\nfunction failTool(part: ToolPart, text: string): SessionCommit {\n return toolCommit(part, {\n text,\n phase: \"final\",\n toolState: \"error\",\n toolError: text,\n })\n}\n\n// The main reducer. Takes one SDK event and returns scrollback commits and\n// footer updates. Called once per event from the stream transport's watch loop.\n//\n// Event handling follows the SDK event types:\n// message.updated → learn role, flush buffered parts, track usage\n// message.part.delta → accumulate text, flush if ready\n// message.part.updated → handle text/reasoning/tool state transitions\n// permission.* → manage the permission queue, drive footer view\n// question.* → manage the question queue, drive footer view\n// session.error → emit error scrollback entry\nexport function reduceSessionData(input: SessionDataInput): SessionDataOutput {\n const commits: SessionCommit[] = []\n const data = input.data\n const event = input.event\n\n if (event.type === \"session.shell.started\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n const shell = claimShell(data, event.properties.shell.id, \"shell\", event.properties.shell.command)\n if (shell.source !== \"shell\") {\n return out(data, commits)\n }\n\n const partID = shellPartID(event.properties.shell.id)\n if (data.ids.has(partID) || data.tools.has(partID)) {\n return out(data, commits, patch({ status: \"running shell\" }))\n }\n\n data.tools.add(partID)\n commits.push(startShell(event.properties.shell.id, shell.command ?? event.properties.shell.command))\n return out(data, commits, patch({ status: \"running shell\" }))\n }\n\n if (event.type === \"session.shell.ended\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n const shell = claimShell(data, event.properties.shell.id, \"shell\")\n if (shell.source !== \"shell\") {\n return out(data, commits)\n }\n\n const partID = shellPartID(event.properties.shell.id)\n const seen = data.tools.has(partID)\n const command = shell.command ?? \"\"\n data.tools.delete(partID)\n if (data.ids.has(partID)) {\n return out(data, commits)\n }\n\n if (!seen && command) {\n commits.push(startShell(event.properties.shell.id, command))\n }\n\n data.ids.add(partID)\n commits.push(doneShell(event.properties.shell.id, command, event.properties.output.output))\n return out(data, commits)\n }\n\n if (event.type === \"message.updated\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n const info = event.properties.info\n if (typeof info.id === \"string\") {\n data.role.set(info.id, info.role)\n replay(data, commits, info.id, info.role, input.thinking)\n }\n\n if (info.role !== \"assistant\") {\n return out(data, commits)\n }\n\n let next: FooterPatch | undefined\n if (!data.announced) {\n data.announced = true\n next = { status: \"assistant responding\" }\n }\n\n const usage = formatUsage(\n info.tokens,\n input.limits[modelKey(info.providerID, info.modelID)],\n typeof info.cost === \"number\" ? info.cost : undefined,\n )\n if (usage) {\n next = {\n ...next,\n usage,\n }\n }\n\n if (typeof info.id === \"string\" && info.error && !isAbort(info.error) && !data.ids.has(msgErr(info.id))) {\n data.ids.add(msgErr(info.id))\n commits.push({\n kind: \"error\",\n text: formatError(info.error),\n phase: \"start\",\n source: \"system\",\n messageID: info.id,\n })\n }\n\n return out(data, commits, patch(next))\n }\n\n if (event.type === \"message.part.delta\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (\n typeof event.properties.partID !== \"string\" ||\n typeof event.properties.field !== \"string\" ||\n typeof event.properties.delta !== \"string\"\n ) {\n return out(data, commits)\n }\n\n if (event.properties.field !== \"text\") {\n return out(data, commits)\n }\n\n const partID = event.properties.partID\n if (data.ids.has(partID)) {\n return out(data, commits)\n }\n\n if (typeof event.properties.messageID === \"string\") {\n data.msg.set(partID, event.properties.messageID)\n }\n\n const text = data.text.get(partID) ?? \"\"\n data.text.set(partID, text + event.properties.delta)\n\n const kind = data.part.get(partID)\n if (!kind) {\n return out(data, commits)\n }\n\n if (kind === \"reasoning\" && !input.thinking) {\n return out(data, commits)\n }\n\n if (!ready(data, partID)) {\n return out(data, commits)\n }\n\n flushPart(data, commits, partID)\n return out(data, commits)\n }\n\n if (event.type === \"message.part.updated\") {\n const part = event.properties.part\n if (part.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (part.type === \"tool\") {\n const view = syncPermission(data, part) ?? syncQuestion(data, part)\n if (part.tool === \"bash\" && part.callID) {\n if (claimShell(data, part.callID, \"tool\", bashCommand(part)).source === \"shell\") {\n return out(data, commits, view)\n }\n }\n\n if (part.state.status === \"running\") {\n if (data.ids.has(part.id)) {\n return out(data, commits, view)\n }\n\n if (!data.tools.has(part.id)) {\n data.tools.add(part.id)\n commits.push(startTool(part))\n }\n\n return out(data, commits, view ?? patch({ status: toolStatus(part) }))\n }\n\n if (part.state.status === \"completed\") {\n const seen = data.tools.has(part.id)\n const mode = toolView(part.tool)\n data.tools.delete(part.id)\n if (data.ids.has(part.id)) {\n return out(data, commits, view)\n }\n\n if (!seen) {\n commits.push(startTool(part))\n }\n\n data.ids.add(part.id)\n stashEcho(data, part)\n\n const output = part.state.output\n if (mode.output && typeof output === \"string\" && output.trim()) {\n commits.push({\n kind: \"tool\",\n text: output,\n phase: \"progress\",\n source: \"tool\",\n messageID: part.messageID,\n partID: part.id,\n tool: part.tool,\n part,\n toolState: \"completed\",\n })\n }\n\n if (mode.final) {\n commits.push(doneTool(part))\n }\n\n return out(data, commits, view)\n }\n\n if (part.state.status === \"error\") {\n const seen = data.tools.has(part.id)\n data.tools.delete(part.id)\n if (data.ids.has(part.id)) {\n return out(data, commits, view)\n }\n\n if (!seen) {\n commits.push(startTool(part))\n }\n\n data.ids.add(part.id)\n const text =\n typeof part.state.error === \"string\" && part.state.error.trim() ? part.state.error : \"unknown error\"\n commits.push(failTool(part, text))\n return out(data, commits, view)\n }\n }\n\n if (part.type !== \"text\" && part.type !== \"reasoning\") {\n return out(data, commits)\n }\n\n if (data.ids.has(part.id)) {\n return out(data, commits)\n }\n\n const kind = part.type === \"text\" ? \"assistant\" : \"reasoning\"\n if (typeof part.messageID === \"string\") {\n data.msg.set(part.id, part.messageID)\n }\n\n const msg = part.messageID\n const role = msg ? data.role.get(msg) : undefined\n if (role === \"user\" && part.type === \"text\" && !data.includeUserText) {\n data.ids.add(part.id)\n drop(data, part.id)\n return out(data, commits)\n }\n\n if (kind === \"reasoning\" && !input.thinking) {\n if (part.time?.end) {\n data.ids.add(part.id)\n }\n drop(data, part.id)\n return out(data, commits)\n }\n\n data.part.set(part.id, role === \"user\" && kind === \"assistant\" ? \"user\" : kind)\n syncText(data, part.id, part.text)\n\n if (part.time?.end) {\n data.end.add(part.id)\n }\n\n if (msg && !role) {\n return out(data, commits)\n }\n\n if (!ready(data, part.id)) {\n return out(data, commits)\n }\n\n flushPart(data, commits, part.id)\n\n if (!part.time?.end) {\n return out(data, commits)\n }\n\n data.ids.add(part.id)\n drop(data, part.id)\n return out(data, commits)\n }\n\n if (event.type === \"permission.asked\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n upsert(data.permissions, enrichPermission(data, event.properties))\n return queueOut(data, commits)\n }\n\n if (event.type === \"permission.replied\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (!remove(data.permissions, event.properties.requestID)) {\n return out(data, commits)\n }\n\n return queueOut(data, commits)\n }\n\n if (event.type === \"question.asked\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n upsert(data.questions, event.properties)\n return queueOut(data, commits)\n }\n\n if (event.type === \"question.replied\" || event.type === \"question.rejected\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (!remove(data.questions, event.properties.requestID)) {\n return out(data, commits)\n }\n\n return queueOut(data, commits)\n }\n\n if (event.type === \"session.error\") {\n if (event.properties.sessionID !== input.sessionID || !event.properties.error) {\n return out(data, commits)\n }\n\n commits.push({\n kind: \"error\",\n text: formatError(event.properties.error),\n phase: \"start\",\n source: \"system\",\n })\n return out(data, commits)\n }\n\n return out(data, commits)\n}\n",
"// Thin bridge between reducer output and the footer API.\n//\n// The reducers produce StreamCommit[] and an optional FooterOutput (patch +\n// view + subagent state). This module forwards them to footer.append() and\n// footer.event() respectively, adding trace writes along the way. It also\n// defaults status updates to phase \"running\" if the caller didn't set a\n// phase -- a convenience so reducer code doesn't have to repeat that.\nimport type { FooterApi, FooterOutput, FooterPatch, FooterSubagentState, StreamCommit } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype OutputInput = {\n footer: FooterApi\n trace?: Trace\n}\n\ntype StreamOutput = {\n commits: StreamCommit[]\n footer?: FooterOutput\n}\n\n// Default to \"running\" phase when a status string arrives without an explicit phase.\nfunction patch(next: FooterPatch): FooterPatch {\n if (typeof next.status === \"string\" && next.phase === undefined) {\n return {\n phase: \"running\",\n ...next,\n }\n }\n\n return next\n}\n\nfunction summarize(value: unknown): unknown {\n if (typeof value === \"string\") {\n if (value.length <= 160) {\n return value\n }\n\n return {\n type: \"string\",\n length: value.length,\n preview: `${value.slice(0, 160)}...`,\n }\n }\n\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n length: value.length,\n }\n }\n\n if (!value || typeof value !== \"object\") {\n return value\n }\n\n return {\n type: \"object\",\n keys: Object.keys(value),\n }\n}\n\nfunction traceCommit(commit: StreamCommit) {\n return {\n ...commit,\n text: summarize(commit.text),\n textLength: commit.text.length,\n part: commit.part\n ? {\n id: commit.part.id,\n sessionID: commit.part.sessionID,\n messageID: commit.part.messageID,\n callID: commit.part.callID,\n tool: commit.part.tool,\n state: {\n status: commit.part.state.status,\n title: \"title\" in commit.part.state ? summarize(commit.part.state.title) : undefined,\n error: \"error\" in commit.part.state ? summarize(commit.part.state.error) : undefined,\n time: \"time\" in commit.part.state ? summarize(commit.part.state.time) : undefined,\n input: summarize(commit.part.state.input),\n metadata: \"metadata\" in commit.part.state ? summarize(commit.part.state.metadata) : undefined,\n },\n }\n : undefined,\n }\n}\n\nexport function traceSubagentState(state: FooterSubagentState) {\n return {\n tabs: state.tabs,\n details: Object.fromEntries(\n Object.entries(state.details).map(([sessionID, detail]) => [\n sessionID,\n {\n sessionID,\n commits: detail.commits.map(traceCommit),\n },\n ]),\n ),\n permissions: state.permissions.map((item) => ({\n id: item.id,\n sessionID: item.sessionID,\n permission: item.permission,\n patterns: item.patterns,\n tool: item.tool,\n metadata: item.metadata\n ? {\n keys: Object.keys(item.metadata),\n input: summarize(item.metadata.input),\n }\n : undefined,\n })),\n questions: state.questions.map((item) => ({\n id: item.id,\n sessionID: item.sessionID,\n questions: item.questions.map((question) => ({\n header: question.header,\n question: question.question,\n options: question.options.length,\n multiple: question.multiple,\n })),\n })),\n }\n}\n\nexport function traceFooterOutput(footer?: FooterOutput) {\n if (!footer?.subagent) {\n return footer\n }\n\n return {\n ...footer,\n subagent: traceSubagentState(footer.subagent),\n }\n}\n\n// Forwards reducer output to the footer: commits go to scrollback, patches update the status bar.\nexport function writeSessionOutput(input: OutputInput, out: StreamOutput): void {\n for (const commit of out.commits) {\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n\n if (out.footer?.patch) {\n const next = patch(out.footer.patch)\n input.trace?.write(\"ui.patch\", next)\n input.footer.event({\n type: \"stream.patch\",\n patch: next,\n })\n }\n\n if (out.footer?.subagent) {\n input.trace?.write(\"ui.subagent\", traceSubagentState(out.footer.subagent))\n input.footer.event({\n type: \"stream.subagent\",\n state: out.footer.subagent,\n })\n }\n\n if (!out.footer?.view) {\n return\n }\n\n input.trace?.write(\"ui.patch\", {\n view: out.footer.view,\n })\n input.footer.event({\n type: \"stream.view\",\n view: out.footer.view,\n })\n}\n"
],
"mappings": "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",
"debugId": "A7AAB1B7AF2ED25764756E2164756E21",
"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": ";6sCAKA,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,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH",
"debugId": "EF27BC7F8E4EC16364756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/mini/runtime.queue.ts"],
"sourcesContent": [
"// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and queue up\n// here. The queue drains one turn at a time; ordinary prompts waiting behind\n// an active ordinary turn are exposed for edit/removal until they begin.\n//\n// The queue also handles /exit, /quit, and /new commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { ascending } from \"@opencode-ai/schema/identifier\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport { isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, FooterQueuedPrompt, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype Deferred<T = void> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (error?: unknown) => void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt) => void\n onNewSession?: () => void | Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n queued: FooterQueuedPrompt[]\n active?: RunPrompt\n ctrl?: AbortController\n closed: boolean\n}\n\nfunction defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (error?: unknown) => void\n const promise = new Promise<T>((next, fail) => {\n resolve = next\n reject = fail\n })\n\n return { promise, resolve, reject }\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn remain local and\n// are exposed by the footer for edit/removal until their turn begins.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = defer<{ type: \"closed\" }>()\n const done = defer()\n const state: State = {\n queue: [],\n queued: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const syncQueue = () => {\n const queue = state.queue.length\n emit({ type: \"queue\", queue }, { queue })\n emit(\n {\n type: \"queued.prompts\",\n prompts: [...state.queued],\n },\n { queued: state.queued.length },\n )\n }\n\n const removeLocalQueued = (queued: FooterQueuedPrompt) => {\n if (!state.queued.includes(queued)) return\n state.queued = state.queued.filter((item) => item !== queued)\n syncQueue()\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n state.queued.length = 0\n state.ctrl?.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()\n if (!prompt) {\n continue\n }\n\n const queued = state.queued.find((item) => item.prompt === prompt)\n if (queued) removeLocalQueued(queued)\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n syncQueue()\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n )\n await input.onNewSession()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? queued?.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n {\n type: \"turn.send\",\n queue: state.queue.length,\n },\n {\n phase: \"running\",\n status: \"sending prompt\",\n queue: state.queue.length,\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n state.ctrl = ctrl\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent)\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n ctrl.abort()\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n } finally {\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n {\n type: \"turn.idle\",\n queue: state.queue.length,\n },\n {\n phase: \"idle\",\n status: \"\",\n queue: state.queue.length,\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n !active.command &&\n prompt.mode !== \"shell\" &&\n !prompt.command &&\n !isNewCommand(prompt.text)\n ) {\n const queued: FooterQueuedPrompt = {\n messageID: SessionMessage.ID.create(),\n partID: \"prt_\" + ascending(),\n prompt,\n }\n state.queued = [...state.queued, queued]\n state.queue.push(prompt)\n syncQueue()\n return\n }\n\n state.queue.push(prompt)\n syncQueue()\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n const offRemoveQueued = input.footer.onQueuedRemove((messageID) => {\n const queued = state.queued.find((item) => item.messageID === messageID)\n if (!queued) return false\n state.queue = state.queue.filter((prompt) => prompt !== queued.prompt)\n removeLocalQueued(queued)\n return true\n })\n\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n offRemoveQueued()\n close()\n await draining?.catch(() => {})\n }\n}\n"
],
"mappings": "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",
"debugId": "7AE502F697664CF164756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/mcp/logout.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.v2.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n"
],
"mappings": ";w2BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,GAAG,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EAC3G,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "F98BF6DAAF09377A64756E2164756E21",
"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": "BD4A0E57D6436E8964756E2164756E21",
"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": ";+kBAAA,mBAAS,gBACT,yBAOA,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAe,CAAiB,CAAC,EAAmB,CAClD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GAAI,MAAM,IAAI,KAAK,CAAS,EAAE,OAAO,EAAG,OAAO,EAEjD,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,IAAI,KAAK,CAAU,EAC1B,EAAQ,MAAM,EAAK,OAAO,EAAK,MAAM,EAAK,KAAK,EAAI,KACnD,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,IAAI,MAAM,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "2AD5B22AC246E94C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/status.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const found = yield* Service.discover(yield* ServiceConfig.options())\n process.stdout.write((found ? found.url : \"stopped\") + EOL)\n }),\n)\n"
],
"mappings": ";2wBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAQ,WAAO,EAAQ,SAAS,MAAO,EAAc,QAAQ,CAAC,EACpE,QAAQ,OAAO,OAAO,EAAQ,EAAM,IAAM,WAAa,CAAG,EAC3D,CACH",
"debugId": "B6B9095F34B372CF64756E2164756E21",
"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": "21042075F3D0B78964756E2164756E21",
"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": ";2wBAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "475D37DA67FC5ED164756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data?.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";0zBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC3F,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC7G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,MAAM,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EAC/D,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "01D4B121A32173BD64756E2164756E21",
"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": ";2wBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,EAAQ,MAAM,MAAO,EAAc,QAAQ,CAAC,EACrE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "21DDF5A5E13DA9AA64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/service/set.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n"
],
"mappings": ";8vBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,IAAK,EAAM,KAAK,EAChD,CACH",
"debugId": "FB4055592A5437EA64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/standalone.ts", "src/services/server.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport path from \"node:path\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? [] : process.argv[1] ? [process.argv[1]] : []\n if (!compiled && entrypoint.length === 0) throw new Error(\"Failed to resolve CLI entrypoint\")\n const [executable, ...args] = options.command ?? [process.execPath, ...entrypoint, \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const output = yield* proc.stdout.pipe(Stream.decodeText(), Stream.splitLines, Stream.take(1), Stream.mkString)\n if (!output) return yield* Effect.fail(new Error(\"Standalone server exited before reporting readiness\"))\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Service.Endpoint & { readonly pid: number }\n },\n Effect.provide(AppNodeBuilder.build(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n",
"import { NodeFileSystem } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: Service.StartOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Service.Endpoint\n readonly reconnect?: (attempt: number) => Promise<Service.Endpoint>\n readonly reload?: () => Promise<void>\n}\n\nexport const resolve = Effect.fn(\"cli.server.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password\n ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) }\n : undefined,\n } satisfies Service.Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n const endpoint = yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\")\n const reconnectOptions = { ...options, version: undefined }\n return {\n endpoint,\n reconnect: (attempt) =>\n Effect.runPromise(\n Effect.gen(function* () {\n if (attempt > 3) return yield* Service.start(reconnectOptions)\n const endpoint = yield* Service.discover(reconnectOptions)\n if (endpoint !== undefined) return endpoint\n return yield* Effect.fail(new Error(\"Background server is unavailable\"))\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n reload: () =>\n Effect.runPromise(\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.start(options)\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n } satisfies Resolved\n})\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: Service.StartOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.start(options)\n if (mismatch === \"ignore\") return yield* Service.start({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined) return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.start(options)\n})\n\nfunction connectError(endpoint: Service.Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as Server from \"./server\"\n"
],
"mappings": "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",
"debugId": "F044DC1149E6AB6864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/auth.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n createOpencodeClient,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpencodeClient,\n} from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.v2.integration.connect.oauth({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data?.data\n if (!attempt) return yield* Effect.fail(new Error(started.error?.message ?? \"Failed to start OAuth attempt\"))\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpencodeClient,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const response = yield* Effect.promise(() => client.v2.integration.attempt.status({ attemptID, location }))\n const status = response.data?.data\n if (!status || status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, attemptID)\n }\n return status\n })\n"
],
"mappings": ";w2BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAEzG,IAAM,EAAU,MAAO,EAAO,QAAQ,IACpC,EAAO,GAAG,YAAY,QAAQ,MAAM,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAClH,EACM,EAAU,EAAQ,MAAM,KAC9B,GAAI,CAAC,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,EAAQ,OAAO,SAAW,+BAA+B,CAAC,EAC5G,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAQ,SAAS,EACpD,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CAEtB,IAAM,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,YAAY,QAAQ,OAAO,CAAE,YAAW,UAAS,CAAC,CAAC,GAClF,MAAM,KAC9B,GAAI,CAAC,GAAU,EAAO,SAAW,UAE/B,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,CAAS,EAEtC,OAAO,EACR",
"debugId": "CE9FAE5F94DF8FFE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/tool.ts"],
"sourcesContent": [
"// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (bash, edit, write, task, etc.) has a ToolRule that controls\n// five display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// permission → display info for the permission UI (icon, title, diff)\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport type { ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { LANGUAGE_EXTENSIONS } from \"@opencode-ai/tui/util/filetype\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport type ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\nexport type ToolPhase = \"start\" | \"progress\" | \"final\"\n\nexport type ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n type?: string\n relativePath?: string\n filePath?: string\n movePath?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n path?: string\n pattern?: string\n filePath?: string\n filepath?: string\n url?: string\n query?: string\n subagent_type?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\nexport type ToolFrame = {\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n}\n\nexport type ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\nexport type ToolPermissionInfo = {\n icon: string\n title: string\n lines: string[]\n diff?: string\n file?: string\n}\n\nexport type ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolPermissionProps = {\n input: ToolInput\n metadata: ToolMetadata\n patterns: string[]\n}\n\ntype ToolPermissionCtx = {\n input: ToolDict\n meta: ToolDict\n patterns: string[]\n}\n\ntype ToolName =\n | \"invalid\"\n | \"bash\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"task\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n | \"plan_exit\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n permission?: (props: ToolPermissionProps) => ToolPermissionInfo\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n return {}\n }\n\n return { ...v }\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction permission(ctx: ToolPermissionCtx): ToolPermissionProps {\n return {\n input: ctx.input,\n metadata: ctx.meta,\n patterns: ctx.patterns,\n }\n}\n\nfunction webSearchProviderLabel(provider: unknown) {\n if (provider === \"parallel\") return \"Parallel Web Search\"\n if (provider === \"exa\") return \"Exa Web Search\"\n return \"Web Search\"\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nfunction num(v: unknown): number | undefined {\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n return undefined\n }\n\n return v\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction info(data: ToolDict, skip: string[] = []): string {\n const list = Object.entries(data).filter(([key, val]) => {\n if (skip.includes(key)) {\n return false\n }\n\n return typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\"\n })\n\n if (list.length === 0) {\n return \"\"\n }\n\n return `[${list.map(([key, val]) => `${key}=${String(val)}`).join(\", \")}]`\n}\n\nfunction span(state: ToolDict): string {\n const time = dict(state.time)\n const start = num(time.start)\n const end = num(time.end)\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = info(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx.state)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean } = {}): string {\n if (!input) {\n return \"\"\n }\n\n const cwd = process.cwd()\n const home = os.homedir()\n const abs = path.isAbsolute(input) ? input : path.resolve(cwd, input)\n const rel = path.relative(cwd, abs)\n\n if (!rel) {\n return \".\"\n }\n\n if (!rel.startsWith(\"..\")) {\n return rel.replaceAll(\"\\\\\", \"/\")\n }\n\n if (opts.home && home && (abs === home || abs.startsWith(home + path.sep))) {\n return abs.replace(home, \"~\").replaceAll(\"\\\\\", \"/\")\n }\n\n return abs.replaceAll(\"\\\\\", \"/\")\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = text(ctx.state.title) || (Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\")\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${toolPath(dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = toolPath(p.input.filePath)\n const description = info(p.frame.input, [\"filePath\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Edit ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.subagent_type || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Task`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: `Skill \"${p.input.name ?? \"\"}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: text(p.frame.state.title) || \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: text(p.frame.state.title) || (calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\"),\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n filePath?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.filePath ? toolPath(input.filePath, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || lspTitle(p.input),\n }\n}\n\nfunction runPlanExit(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || \"Switching to build agent\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction patchTitle(file: PatchFile): string {\n const rel = file.relativePath\n const from = file.filePath\n if (file.type === \"add\") {\n return `# Created ${rel || toolPath(from)}`\n }\n if (file.type === \"delete\") {\n return `# Deleted ${rel || toolPath(from)}`\n }\n if (file.type === \"move\") {\n return `# Moved ${toolPath(from)} -> ${rel || toolPath(file.movePath)}`\n }\n\n return `# Patched ${rel || toolPath(from)}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${toolPath(file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const diff = p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${toolPath(file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.movePath || file.filePath || file.relativePath\n return [\n {\n title: patchTitle(file),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length === 0) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const desc = p.input.description\n const title = text(p.frame.state.title)\n const rows = [desc || title].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Task`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? toolPath(wd) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `# Running in ${dir}` : \"\"\n }\n\n return `# Running in ${dir}\\n$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? toolPath(wdRaw) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollBashFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit ?? num(p.frame.meta.exitCode) ?? num(p.frame.meta.exit_code)\n const time = span(p.frame.state)\n if (code === undefined) {\n if (!time) {\n return \"bash completed\"\n }\n\n return `bash completed · ${time}`\n }\n\n return `bash completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = toolPath(p.input.filePath)\n const extra = info(p.frame.input, [\"filePath\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile): string {\n const type = file.type\n const rel = file.relativePath\n const from = file.filePath\n\n if (type === \"add\") {\n return `+ Created ${rel || toolPath(from)}`\n }\n\n if (type === \"delete\") {\n return `- Deleted ${rel || toolPath(from)}`\n }\n\n if (type === \"move\") {\n return `→ Moved ${toolPath(from)} → ${rel || toolPath(file.movePath)}`\n }\n\n return `~ Patched ${rel || toolPath(from)}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame.state)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const show_updates = !files.some((file) => file?.type && file.type !== \"update\")\n const shown = files.filter((file) => show_updates || file.type !== \"update\")\n const rows = shown.slice(0, 6).map(patchLine)\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const row = p.input.description || text(p.frame.state.title)\n if (!row) {\n return `# ${kind} Task`\n }\n\n return `# ${kind} Task\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame.state)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input)}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.input.name ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${toolPath(dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nfunction permEdit(p: ToolPermissionProps): ToolPermissionInfo {\n const input = p.input as { filePath?: string; filepath?: string; diff?: string }\n const file = input.filePath || input.filepath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Edit ${toolPath(file, { home: true })}`,\n lines: [],\n diff: p.metadata.diff ?? input.diff,\n file,\n }\n}\n\nfunction permRead(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Read ${toolPath(file, { home: true })}`,\n lines: file ? [`Path: ${toolPath(file, { home: true })}`] : [],\n }\n}\n\nfunction permGlob(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Glob \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permGrep(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Grep \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permList(p: ToolPermissionProps): ToolPermissionInfo {\n const dir = text(dict(p.input).path) || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `List ${toolPath(dir, { home: true })}`,\n lines: dir ? [`Path: ${toolPath(dir, { home: true })}`] : [],\n }\n}\n\nfunction permBash(p: ToolPermissionProps): ToolPermissionInfo {\n const cmd = p.input.command || \"\"\n return {\n icon: \"#\",\n title: \"Shell command\",\n lines: cmd ? [`$ ${cmd}`] : p.patterns.map((item) => `- ${item}`),\n }\n}\n\nfunction permTask(p: ToolPermissionProps): ToolPermissionInfo {\n const type = p.input.subagent_type || \"general\"\n const desc = p.input.description\n return {\n icon: \"#\",\n title: `${Locale.titlecase(type)} Task`,\n lines: desc ? [`◉ ${desc}`] : [],\n }\n}\n\nfunction permWebfetch(p: ToolPermissionProps): ToolPermissionInfo {\n const url = p.input.url || \"\"\n return {\n icon: \"%\",\n title: `WebFetch ${url}`,\n lines: url ? [`URL: ${url}`] : [],\n }\n}\n\nfunction permWebSearch(p: ToolPermissionProps): ToolPermissionInfo {\n const query = p.input.query || \"\"\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: query ? `${title} \"${query}\"` : title,\n lines: query ? [`Query: ${query}`] : [],\n }\n}\n\nfunction permLsp(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || \"\"\n const line = typeof p.input.line === \"number\" ? p.input.line : undefined\n const char = typeof p.input.character === \"number\" ? p.input.character : undefined\n const pos = line !== undefined && char !== undefined ? `${line}:${char}` : undefined\n return {\n icon: \"→\",\n title: lspTitle(p.input, { home: true }),\n lines: [\n ...(p.input.operation ? [`Operation: ${p.input.operation}`] : []),\n ...(file ? [`Path: ${toolPath(file, { home: true })}`] : []),\n ...(pos ? [`Position: ${pos}`] : []),\n ],\n }\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n bash: {\n view: {\n output: true,\n final: false,\n },\n run: runBash,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollBashFinal,\n },\n permission: permBash,\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n permission: permEdit,\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n task: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n permission: permTask,\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n permission: permRead,\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n permission: permGlob,\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n permission: permGrep,\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n permission: permList,\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n permission: permLsp,\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n permission: permWebfetch,\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n permission: permWebSearch,\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n plan_exit: {\n view: {\n output: true,\n final: false,\n },\n run: runPlanExit,\n scroll: {\n start: () => \"\",\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: ToolPart): ToolFrame {\n const state = dict(part.state)\n return {\n raw: \"\",\n name: part.tool,\n input: dict(state.input),\n meta: \"metadata\" in part.state ? dict(part.state.metadata) : {},\n state,\n status: text(state.status),\n error: text(state.error),\n }\n}\n\nexport function toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const state = dict(commit.part?.state)\n return {\n raw,\n name: commit.tool || commit.part?.tool || \"tool\",\n input: dict(state.input),\n meta: commit.part?.state && \"metadata\" in commit.part.state ? dict(commit.part.state.metadata) : {},\n state,\n status: commit.toolState ?? text(state.status),\n error: (commit.toolError ?? \"\").trim(),\n }\n}\n\nfunction runBash(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output).trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.tool).snap)\n )\n}\n\nexport function toolInlineInfo(part: ToolPart): ToolInline {\n const ctx = frame(part)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nexport function toolPermissionInfo(\n name: string,\n input: ToolDict,\n meta: ToolDict,\n patterns: string[],\n): ToolPermissionInfo | undefined {\n const draw = rule(name)?.permission\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(permission({ input, meta, patterns }))\n } catch {\n return undefined\n }\n}\n\nexport function toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"task\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(text(ctx.state.output))\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n"
],
"mappings": "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",
"debugId": "B3B33886BA1EB3A664756E2164756E21",
"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": ";qiBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC",
"debugId": "05053B958036D04064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/restart.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.start(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";2wBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,MAAM,CAAO,EAC9C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "36AA0DCA6FD4E41264756E2164756E21",
"names": []
}
+1
-1
{
"name": "@opencode-ai/cli-linux-arm64",
"version": "0.0.0-next-15386",
"version": "0.0.0-next-15390",
"license": "MIT",

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

{
"version": 3,
"sources": ["src/mini/tool.ts"],
"sourcesContent": [
"// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (bash, edit, write, task, etc.) has a ToolRule that controls\n// five display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// permission → display info for the permission UI (icon, title, diff)\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport type { ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { LANGUAGE_EXTENSIONS } from \"@opencode-ai/tui/util/filetype\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport type ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\nexport type ToolPhase = \"start\" | \"progress\" | \"final\"\n\nexport type ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n type?: string\n relativePath?: string\n filePath?: string\n movePath?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n path?: string\n pattern?: string\n filePath?: string\n filepath?: string\n url?: string\n query?: string\n subagent_type?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\nexport type ToolFrame = {\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n}\n\nexport type ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\nexport type ToolPermissionInfo = {\n icon: string\n title: string\n lines: string[]\n diff?: string\n file?: string\n}\n\nexport type ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolPermissionProps = {\n input: ToolInput\n metadata: ToolMetadata\n patterns: string[]\n}\n\ntype ToolPermissionCtx = {\n input: ToolDict\n meta: ToolDict\n patterns: string[]\n}\n\ntype ToolName =\n | \"invalid\"\n | \"bash\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"task\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n | \"plan_exit\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n permission?: (props: ToolPermissionProps) => ToolPermissionInfo\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n return {}\n }\n\n return { ...v }\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction permission(ctx: ToolPermissionCtx): ToolPermissionProps {\n return {\n input: ctx.input,\n metadata: ctx.meta,\n patterns: ctx.patterns,\n }\n}\n\nfunction webSearchProviderLabel(provider: unknown) {\n if (provider === \"parallel\") return \"Parallel Web Search\"\n if (provider === \"exa\") return \"Exa Web Search\"\n return \"Web Search\"\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nfunction num(v: unknown): number | undefined {\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n return undefined\n }\n\n return v\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction info(data: ToolDict, skip: string[] = []): string {\n const list = Object.entries(data).filter(([key, val]) => {\n if (skip.includes(key)) {\n return false\n }\n\n return typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\"\n })\n\n if (list.length === 0) {\n return \"\"\n }\n\n return `[${list.map(([key, val]) => `${key}=${String(val)}`).join(\", \")}]`\n}\n\nfunction span(state: ToolDict): string {\n const time = dict(state.time)\n const start = num(time.start)\n const end = num(time.end)\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = info(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx.state)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean } = {}): string {\n if (!input) {\n return \"\"\n }\n\n const cwd = process.cwd()\n const home = os.homedir()\n const abs = path.isAbsolute(input) ? input : path.resolve(cwd, input)\n const rel = path.relative(cwd, abs)\n\n if (!rel) {\n return \".\"\n }\n\n if (!rel.startsWith(\"..\")) {\n return rel.replaceAll(\"\\\\\", \"/\")\n }\n\n if (opts.home && home && (abs === home || abs.startsWith(home + path.sep))) {\n return abs.replace(home, \"~\").replaceAll(\"\\\\\", \"/\")\n }\n\n return abs.replaceAll(\"\\\\\", \"/\")\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = text(ctx.state.title) || (Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\")\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${toolPath(dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = toolPath(p.input.filePath)\n const description = info(p.frame.input, [\"filePath\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Edit ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.subagent_type || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Task`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: `Skill \"${p.input.name ?? \"\"}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: text(p.frame.state.title) || \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: text(p.frame.state.title) || (calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\"),\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n filePath?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.filePath ? toolPath(input.filePath, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || lspTitle(p.input),\n }\n}\n\nfunction runPlanExit(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || \"Switching to build agent\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction patchTitle(file: PatchFile): string {\n const rel = file.relativePath\n const from = file.filePath\n if (file.type === \"add\") {\n return `# Created ${rel || toolPath(from)}`\n }\n if (file.type === \"delete\") {\n return `# Deleted ${rel || toolPath(from)}`\n }\n if (file.type === \"move\") {\n return `# Moved ${toolPath(from)} -> ${rel || toolPath(file.movePath)}`\n }\n\n return `# Patched ${rel || toolPath(from)}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${toolPath(file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const diff = p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${toolPath(file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.movePath || file.filePath || file.relativePath\n return [\n {\n title: patchTitle(file),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length === 0) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const desc = p.input.description\n const title = text(p.frame.state.title)\n const rows = [desc || title].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Task`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? toolPath(wd) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `# Running in ${dir}` : \"\"\n }\n\n return `# Running in ${dir}\\n$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? toolPath(wdRaw) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollBashFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit ?? num(p.frame.meta.exitCode) ?? num(p.frame.meta.exit_code)\n const time = span(p.frame.state)\n if (code === undefined) {\n if (!time) {\n return \"bash completed\"\n }\n\n return `bash completed · ${time}`\n }\n\n return `bash completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = toolPath(p.input.filePath)\n const extra = info(p.frame.input, [\"filePath\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile): string {\n const type = file.type\n const rel = file.relativePath\n const from = file.filePath\n\n if (type === \"add\") {\n return `+ Created ${rel || toolPath(from)}`\n }\n\n if (type === \"delete\") {\n return `- Deleted ${rel || toolPath(from)}`\n }\n\n if (type === \"move\") {\n return `→ Moved ${toolPath(from)} → ${rel || toolPath(file.movePath)}`\n }\n\n return `~ Patched ${rel || toolPath(from)}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame.state)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const show_updates = !files.some((file) => file?.type && file.type !== \"update\")\n const shown = files.filter((file) => show_updates || file.type !== \"update\")\n const rows = shown.slice(0, 6).map(patchLine)\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const row = p.input.description || text(p.frame.state.title)\n if (!row) {\n return `# ${kind} Task`\n }\n\n return `# ${kind} Task\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame.state)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input)}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.input.name ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${toolPath(dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nfunction permEdit(p: ToolPermissionProps): ToolPermissionInfo {\n const input = p.input as { filePath?: string; filepath?: string; diff?: string }\n const file = input.filePath || input.filepath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Edit ${toolPath(file, { home: true })}`,\n lines: [],\n diff: p.metadata.diff ?? input.diff,\n file,\n }\n}\n\nfunction permRead(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Read ${toolPath(file, { home: true })}`,\n lines: file ? [`Path: ${toolPath(file, { home: true })}`] : [],\n }\n}\n\nfunction permGlob(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Glob \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permGrep(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Grep \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permList(p: ToolPermissionProps): ToolPermissionInfo {\n const dir = text(dict(p.input).path) || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `List ${toolPath(dir, { home: true })}`,\n lines: dir ? [`Path: ${toolPath(dir, { home: true })}`] : [],\n }\n}\n\nfunction permBash(p: ToolPermissionProps): ToolPermissionInfo {\n const cmd = p.input.command || \"\"\n return {\n icon: \"#\",\n title: \"Shell command\",\n lines: cmd ? [`$ ${cmd}`] : p.patterns.map((item) => `- ${item}`),\n }\n}\n\nfunction permTask(p: ToolPermissionProps): ToolPermissionInfo {\n const type = p.input.subagent_type || \"general\"\n const desc = p.input.description\n return {\n icon: \"#\",\n title: `${Locale.titlecase(type)} Task`,\n lines: desc ? [`◉ ${desc}`] : [],\n }\n}\n\nfunction permWebfetch(p: ToolPermissionProps): ToolPermissionInfo {\n const url = p.input.url || \"\"\n return {\n icon: \"%\",\n title: `WebFetch ${url}`,\n lines: url ? [`URL: ${url}`] : [],\n }\n}\n\nfunction permWebSearch(p: ToolPermissionProps): ToolPermissionInfo {\n const query = p.input.query || \"\"\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: query ? `${title} \"${query}\"` : title,\n lines: query ? [`Query: ${query}`] : [],\n }\n}\n\nfunction permLsp(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || \"\"\n const line = typeof p.input.line === \"number\" ? p.input.line : undefined\n const char = typeof p.input.character === \"number\" ? p.input.character : undefined\n const pos = line !== undefined && char !== undefined ? `${line}:${char}` : undefined\n return {\n icon: \"→\",\n title: lspTitle(p.input, { home: true }),\n lines: [\n ...(p.input.operation ? [`Operation: ${p.input.operation}`] : []),\n ...(file ? [`Path: ${toolPath(file, { home: true })}`] : []),\n ...(pos ? [`Position: ${pos}`] : []),\n ],\n }\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n bash: {\n view: {\n output: true,\n final: false,\n },\n run: runBash,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollBashFinal,\n },\n permission: permBash,\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n permission: permEdit,\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n task: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n permission: permTask,\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n permission: permRead,\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n permission: permGlob,\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n permission: permGrep,\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n permission: permList,\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n permission: permLsp,\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n permission: permWebfetch,\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n permission: permWebSearch,\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n plan_exit: {\n view: {\n output: true,\n final: false,\n },\n run: runPlanExit,\n scroll: {\n start: () => \"\",\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: ToolPart): ToolFrame {\n const state = dict(part.state)\n return {\n raw: \"\",\n name: part.tool,\n input: dict(state.input),\n meta: \"metadata\" in part.state ? dict(part.state.metadata) : {},\n state,\n status: text(state.status),\n error: text(state.error),\n }\n}\n\nexport function toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const state = dict(commit.part?.state)\n return {\n raw,\n name: commit.tool || commit.part?.tool || \"tool\",\n input: dict(state.input),\n meta: commit.part?.state && \"metadata\" in commit.part.state ? dict(commit.part.state.metadata) : {},\n state,\n status: commit.toolState ?? text(state.status),\n error: (commit.toolError ?? \"\").trim(),\n }\n}\n\nfunction runBash(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output).trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.tool).snap)\n )\n}\n\nexport function toolInlineInfo(part: ToolPart): ToolInline {\n const ctx = frame(part)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nexport function toolPermissionInfo(\n name: string,\n input: ToolDict,\n meta: ToolDict,\n patterns: string[],\n): ToolPermissionInfo | undefined {\n const draw = rule(name)?.permission\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(permission({ input, meta, patterns }))\n } catch {\n return undefined\n }\n}\n\nexport function toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"task\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(text(ctx.state.output))\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n"
],
"mappings": "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",
"debugId": "B3B33886BA1EB3A664756E2164756E21",
"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": ";8vBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,IAAK,EAAM,KAAK,EAChD,CACH",
"debugId": "FB4055592A5437EA64756E2164756E21",
"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/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": ";6sCAKA,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,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH",
"debugId": "EF27BC7F8E4EC16364756E2164756E21",
"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": ";2wBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,EAAQ,MAAM,MAAO,EAAc,QAAQ,CAAC,EACrE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "21DDF5A5E13DA9AA64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data?.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";0zBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC3F,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC7G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,MAAM,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EAC/D,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "01D4B121A32173BD64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Effect, FileSystem, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\n\n// The CLI's service configuration file, plus the Service.Options binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\n\nfunction configKey(key: string): Key {\n if (keys.includes(key as Key)) return key as Key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst env = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const filename = InstallationChannel === \"local\" ? \"service-local.json\" : \"service.json\"\n return {\n fs,\n file: path.join(global.state, filename),\n configFile: path.join(global.config, filename),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file } = yield* env\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? undefined : process.argv[1]\n if (!compiled && entrypoint === undefined) return yield* Effect.fail(new Error(\"Failed to resolve CLI entrypoint\"))\n return {\n file,\n version: InstallationVersion,\n command: [process.execPath, ...(entrypoint ? [entrypoint] : []), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* env\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* env\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": "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",
"debugId": "0CA85A341319196E64756E2164756E21",
"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": ";swBAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,OAAO,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH",
"debugId": "D4F64FCC42F6496364756E2164756E21",
"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": ";w2BAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,WAAM,WAAO,OAAc,QAAQ,CAAC,EAC9D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH",
"debugId": "4343F2FE82A1F5A664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient, type McpServer } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.v2.mcp.list({ location: { directory: process.cwd() } }))\n const servers = (response.data?.data ?? []).toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";0zBAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,IADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GACjF,MAAM,MAAQ,CAAC,GAAG,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC3F,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "4242572592A8759664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/status.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const found = yield* Service.discover(yield* ServiceConfig.options())\n process.stdout.write((found ? found.url : \"stopped\") + EOL)\n }),\n)\n"
],
"mappings": ";2wBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAQ,WAAO,EAAQ,SAAS,MAAO,EAAc,QAAQ,CAAC,EACpE,QAAQ,OAAO,OAAO,EAAQ,EAAM,IAAM,WAAa,CAAG,EAC3D,CACH",
"debugId": "B6B9095F34B372CF64756E2164756E21",
"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": ";6sCAKA,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,MAAM,EAC9C,EAAS,MAAO,EAAO,QAAQ,CAAE,OAAQ,EAAW,WAAY,EAAM,UAAW,CAAC,EACxF,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,SACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,IACd,CAAC,CACH,EACD,CACH",
"debugId": "3BA42DBF02DC7C7064756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"],
"sourcesContent": [
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}",
"import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.start(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.connect.oauth(\n {\n integrationID,\n methodID: method.id,\n inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.attempt.cancel(\n { attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.attempt.status({ attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n"
],
"mappings": "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",
"debugId": "21042075F3D0B78964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/runtime.queue.ts"],
"sourcesContent": [
"// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and queue up\n// here. The queue drains one turn at a time; ordinary prompts waiting behind\n// an active ordinary turn are exposed for edit/removal until they begin.\n//\n// The queue also handles /exit, /quit, and /new commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { ascending } from \"@opencode-ai/schema/identifier\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport { isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, FooterQueuedPrompt, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype Deferred<T = void> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (error?: unknown) => void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt) => void\n onNewSession?: () => void | Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n queued: FooterQueuedPrompt[]\n active?: RunPrompt\n ctrl?: AbortController\n closed: boolean\n}\n\nfunction defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (error?: unknown) => void\n const promise = new Promise<T>((next, fail) => {\n resolve = next\n reject = fail\n })\n\n return { promise, resolve, reject }\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn remain local and\n// are exposed by the footer for edit/removal until their turn begins.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = defer<{ type: \"closed\" }>()\n const done = defer()\n const state: State = {\n queue: [],\n queued: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const syncQueue = () => {\n const queue = state.queue.length\n emit({ type: \"queue\", queue }, { queue })\n emit(\n {\n type: \"queued.prompts\",\n prompts: [...state.queued],\n },\n { queued: state.queued.length },\n )\n }\n\n const removeLocalQueued = (queued: FooterQueuedPrompt) => {\n if (!state.queued.includes(queued)) return\n state.queued = state.queued.filter((item) => item !== queued)\n syncQueue()\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n state.queued.length = 0\n state.ctrl?.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()\n if (!prompt) {\n continue\n }\n\n const queued = state.queued.find((item) => item.prompt === prompt)\n if (queued) removeLocalQueued(queued)\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n syncQueue()\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n )\n await input.onNewSession()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? queued?.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n {\n type: \"turn.send\",\n queue: state.queue.length,\n },\n {\n phase: \"running\",\n status: \"sending prompt\",\n queue: state.queue.length,\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n state.ctrl = ctrl\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent)\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n ctrl.abort()\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n } finally {\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n {\n type: \"turn.idle\",\n queue: state.queue.length,\n },\n {\n phase: \"idle\",\n status: \"\",\n queue: state.queue.length,\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n !active.command &&\n prompt.mode !== \"shell\" &&\n !prompt.command &&\n !isNewCommand(prompt.text)\n ) {\n const queued: FooterQueuedPrompt = {\n messageID: SessionMessage.ID.create(),\n partID: \"prt_\" + ascending(),\n prompt,\n }\n state.queued = [...state.queued, queued]\n state.queue.push(prompt)\n syncQueue()\n return\n }\n\n state.queue.push(prompt)\n syncQueue()\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n const offRemoveQueued = input.footer.onQueuedRemove((messageID) => {\n const queued = state.queued.find((item) => item.messageID === messageID)\n if (!queued) return false\n state.queue = state.queue.filter((prompt) => prompt !== queued.prompt)\n removeLocalQueued(queued)\n return true\n })\n\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n offRemoveQueued()\n close()\n await draining?.catch(() => {})\n }\n}\n"
],
"mappings": "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",
"debugId": "7AE502F697664CF164756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/restart.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.start(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";2wBAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,MAAM,CAAO,EAC9C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "36AA0DCA6FD4E41264756E2164756E21",
"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/mini/mini.ts", "src/mini/run.ts", "src/mini/noninteractive.ts", "src/mini/ui.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Server } from \"../services/server\"\nimport { waitForCatalogReady } from \"./catalog.shared\"\nimport { INTERACTIVE_INPUT_ERROR, resolveInteractiveStdin } from \"./runtime.stdin\"\nimport type { RunInput, RunTuiConfig } from \"./types\"\n\nexport type MiniCommandInput = {\n server: Server.Resolved\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: RunTuiConfig | Promise<RunTuiConfig>\n}\n\ntype Session = Awaited<ReturnType<OpenCodeClient[\"session\"][\"get\"]>>\nexport async function runMini(input: MiniCommandInput) {\n validate(input)\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await Bun.stdin.text(), input.prompt)\n const runtimeTask = import(\"./runtime\")\n const directory = localDirectory()\n\n try {\n const sdk = OpenCode.make({\n baseUrl: input.server.endpoint.url,\n headers: Service.headers(input.server.endpoint),\n })\n const model = parseModel(input.model)\n let agentTask: Promise<string | undefined> | undefined\n const resolveAgent = () => {\n agentTask ??= validateAgent(sdk, directory, input.agent)\n return agentTask\n }\n const resolveSession = async () => {\n const [agent, selected] = await Promise.all([\n resolveAgent(),\n selectSession(sdk, directory, input),\n ])\n const readyModel =\n model ?? (selected?.model ? { providerID: selected.model.providerID, modelID: selected.model.id } : undefined)\n if (readyModel) await waitForCatalogReady({ sdk, directory, model: readyModel })\n const session = selected ?? (await createSession(sdk, directory, agent, model))\n return { id: session.id, title: session.title, resume: selected !== undefined }\n }\n const create = (\n _sdk: OpenCodeClient,\n next: { agent: string | undefined; model: RunInput[\"model\"]; variant: string | undefined },\n ) => createSession(sdk, directory, next.agent, next.model, next.variant)\n const runtime = await runtimeTask\n await runtime.runInteractiveDeferredMode({\n sdk,\n directory,\n resolveAgent,\n session: resolveSession,\n createSession: create,\n agent: input.agent,\n model,\n variant: undefined,\n files: [],\n initialInput,\n thinking: true,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n })\n } catch (error) {\n if (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR) fail(error.message)\n throw error\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n resolveInteractiveStdin().cleanup?.()\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string): RunInput[\"model\"] {\n if (!value) return\n const [providerID, ...rest] = value.split(\"/\")\n const modelID = rest.join(\"/\")\n if (!providerID || !modelID) fail(\"--model must use the format provider/model\")\n return { providerID, modelID }\n}\n\nasync function validateAgent(sdk: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline) {\n agents = await sdk.agent.list({ location: { directory } }).catch(() => undefined)\n const agent = agents?.data.find((item) => item.id === name)\n if (agent?.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n if (agent) return name\n await Bun.sleep(25)\n }\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nasync function selectSession(sdk: OpenCodeClient, directory: string, input: MiniCommandInput, preselected?: Session) {\n const selected =\n preselected ??\n (input.session\n ? await sdk.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await sdk.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined)\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected) return\n if (!input.fork) return selected\n return sdk.session.fork({ sessionID: selected.id })\n}\n\nasync function createSession(\n sdk: OpenCodeClient,\n directory: string,\n agent: string | undefined,\n model: RunInput[\"model\"],\n variant?: string,\n): Promise<Session> {\n if (model) await waitForCatalogReady({ sdk, directory, model })\n return sdk.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory },\n })\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n",
"import { Service } from \"@opencode-ai/client/effect\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { Model } from \"@opencode-ai/schema/model\"\nimport type { ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Server } from \"../services/server\"\nimport { loadRunAgents, waitForCatalogReady } from \"./catalog.shared\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { toolInlineInfo } from \"./tool\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: Server.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return run(input).catch((error) => reportError(input, error instanceof Error ? error.message : String(error)))\n}\n\nasync function run(input: RunCommandInput) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = process.env.PWD ?? process.cwd()\n const directory = localDirectory(root)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await Bun.stdin.text())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Service.Endpoint) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const requestedDirectory = prepared.directory ?? (await client.location.get()).directory\n if (!requestedDirectory) fail(\"Failed to resolve server directory\")\n const session = await selectSession(client, requestedDirectory, input)\n const cwd = session?.location.directory ?? requestedDirectory\n const workspace = session?.location.workspaceID\n const explicit = parseRunModel(input.model)\n const explicitModel = explicit?.model\n const variant = explicit?.variant\n const sessionModel = session?.model ? { providerID: session.model.providerID, modelID: session.model.id } : undefined\n const defaultModel =\n !explicitModel && !sessionModel\n ? await client.model\n .default({ location: { directory: cwd, workspace } })\n .then((result) => (result.data ? { providerID: result.data.providerID, modelID: result.data.id } : undefined))\n : undefined\n const model = pickRunModel(explicitModel, variant, sessionModel, defaultModel)\n if (variant && !model)\n return reportError(input, \"Cannot select a variant before selecting a model\", session?.id)\n if (model) {\n await waitForCatalogReady({ sdk: client, directory: cwd, workspace, model })\n const available = await client.model.list({ location: { directory: cwd, workspace } })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.modelID))\n return reportError(input, `Model unavailable: ${model.providerID}/${model.modelID}`, session?.id)\n }\n const agent = await validateAgent(client, cwd, input.agent)\n const selected =\n session ??\n (await client.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory: cwd },\n }))\n if (!session && input.title !== undefined) {\n await client.session.rename({\n sessionID: selected.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: selected.id,\n message: prepared.message,\n files: prepared.files,\n agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: true,\n renderTool,\n renderToolError,\n }).catch((error) => reportError(input, error instanceof Error ? error.message : String(error), selected.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nexport function pickRunModel(\n explicit: { providerID: string; modelID: string } | undefined,\n variant: string | undefined,\n session: { providerID: string; modelID: string } | undefined,\n fallback: { providerID: string; modelID: string } | undefined,\n) {\n if (explicit) return explicit\n if (!variant) return\n return session ?? fallback\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n if (!value) return\n const ref = Model.Ref.parse(value)\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const agents = await loadRunAgents(client, directory).catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function selectSession(client: OpenCodeClient, directory: string, input: RunCommandInput) {\n const selected = input.session\n ? await client.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await client.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected || !input.fork) return selected\n return client.session.fork({ sessionID: selected.id })\n}\n\nasync function prepareFile(input: string, directory: string): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: ToolPart) {\n const info = toolInlineInfo(part)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: ToolPart) {\n const info = toolInlineInfo(part)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction reportError(input: RunCommandInput, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n",
"import type { EventSubscribeOutput, OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { ReasoningPart, StepFinishPart, StepStartPart, TextPart, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n renderTool: (part: ToolPart) => Promise<void>\n renderToolError: (part: ToolPart) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, unknown>\n raw?: string\n provider?: unknown\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let questionRejected = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let admission: AbortController | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: TextPart, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const rejectQuestion = async (request: { id: string }) => {\n questionRejected = true\n await input.client.question.reject({ sessionID: input.sessionID, requestID: request.id }).catch(() => {})\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n formCancelled = true\n await input.client.form.cancel({ sessionID: request.sessionID, formID: request.id }).catch(() => {})\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (event.type === \"question.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await rejectQuestion(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached && event.data.form.sessionID === GLOBAL_FORM_SESSION_ID))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || questionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part: StepStartPart = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part: TextPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part: ReasoningPart = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n tools.set(event.data.callID, {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(event.data.callID)\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.called\") {\n const current = tools.get(event.data.callID)\n tools.set(event.data.callID, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n })\n continue\n }\n if (event.type === \"session.tool.success\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: event.data.content\n .filter((item) => item.type === \"text\")\n .map((item) => item.text)\n .join(\"\\n\"),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(part)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const error = event.data.error.message\n const part: ToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) {\n await input.renderToolError(part)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n const part: StepFinishPart = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (interrupted || permissionRejected || questionRejected || formCancelled) continue\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (!emittedError && !questionRejected && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, questions, forms] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.question.list({ sessionID: input.sessionID }).catch(() => undefined),\n Promise.all(\n (input.attached ? [input.sessionID] : [input.sessionID, GLOBAL_FORM_SESSION_ID]).map((sessionID) =>\n input.client.form.list({ sessionID }).catch(() => undefined),\n ),\n ),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(questions ?? []).map(rejectQuestion),\n ...forms.flatMap((response) => response ?? []).map(cancelForm),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${Buffer.from(await Bun.file(new URL(file.url)).arrayBuffer()).toString(\"base64\")}`\n return { attachment: { uri, mime: file.mime, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await Bun.file(new URL(file.url)).text()\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n",
"import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n"
],
"mappings": ";8wBAsBA,oBAAsB,OAAO,MAAC,OAAyB,MACrD,QAAS,MAAK,OACd,SAAM,OAAe,OAAW,aAAQ,WAAM,WAAQ,YAAY,WAAM,SAAI,WAAM,KAAK,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,ECzKhB,eAAS,qBACT,qBCHA,cAAS,yFCHT,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,EAAgB,IAAsB,CACvD,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,EAAsB,CAC1B,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,EAAiB,CACrB,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,EAAsB,CAC1B,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,EAAiB,CACrB,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,EAAiB,CACrB,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,EAAuB,CAC3B,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,EAAgB,CACxC,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,EAAgB,CAC7C,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": "EE4E18A642B8A83164756E2164756E21",
"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": ";qiBAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC",
"debugId": "05053B958036D04064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/standalone.ts", "src/services/server.ts"],
"sourcesContent": [
"import { Service } from \"@opencode-ai/client/effect\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport path from \"node:path\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const compiled = path.basename(process.execPath).replace(/\\.exe$/, \"\") !== \"bun\"\n const entrypoint = compiled ? [] : process.argv[1] ? [process.argv[1]] : []\n if (!compiled && entrypoint.length === 0) throw new Error(\"Failed to resolve CLI entrypoint\")\n const [executable, ...args] = options.command ?? [process.execPath, ...entrypoint, \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const output = yield* proc.stdout.pipe(Stream.decodeText(), Stream.splitLines, Stream.take(1), Stream.mkString)\n if (!output) return yield* Effect.fail(new Error(\"Standalone server exited before reporting readiness\"))\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Service.Endpoint & { readonly pid: number }\n },\n Effect.provide(AppNodeBuilder.build(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n",
"import { NodeFileSystem } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: Service.StartOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Service.Endpoint\n readonly reconnect?: (attempt: number) => Promise<Service.Endpoint>\n readonly reload?: () => Promise<void>\n}\n\nexport const resolve = Effect.fn(\"cli.server.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password\n ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) }\n : undefined,\n } satisfies Service.Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n const endpoint = yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\")\n const reconnectOptions = { ...options, version: undefined }\n return {\n endpoint,\n reconnect: (attempt) =>\n Effect.runPromise(\n Effect.gen(function* () {\n if (attempt > 3) return yield* Service.start(reconnectOptions)\n const endpoint = yield* Service.discover(reconnectOptions)\n if (endpoint !== undefined) return endpoint\n return yield* Effect.fail(new Error(\"Background server is unavailable\"))\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n reload: () =>\n Effect.runPromise(\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.start(options)\n }).pipe(Effect.provide(NodeFileSystem.layer)),\n ),\n } satisfies Resolved\n})\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: Service.StartOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\n if (mismatch === \"replace\") return yield* Service.start(options)\n if (mismatch === \"ignore\") return yield* Service.start({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined) return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.start(options)\n})\n\nfunction connectError(endpoint: Service.Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as Server from \"./server\"\n"
],
"mappings": ";okBAKA,2BAAS,oBACT,yBAEA,SAAM,OAAQ,OAAO,YAAO,MAAE,IAAK,EAAO,MAAO,CAAC,EAC5C,EAAc,EAAO,qBAAqB,EAAO,eAAe,CAAK,CAAC,EAM5E,SAAS,CAAO,CAAC,EAAkB,EAAkB,CACnD,IAAM,EAAW,EAAK,SAAS,QAAQ,QAAQ,EAAE,QAAQ,SAAU,EAAE,IAAM,MACrE,EAAa,EAAW,CAAC,EAAI,QAAQ,KAAK,GAAK,CAAC,QAAQ,KAAK,EAAE,EAAI,CAAC,EAC1E,GAAI,CAAC,GAAY,EAAW,SAAW,EAAG,MAAU,MAAM,kCAAkC,EAC5F,IAAO,KAAe,GAAQ,EAAQ,SAAW,CAAC,QAAQ,SAAU,GAAG,EAAY,OAAO,EAC1F,GAAI,CAAC,EAAY,MAAU,MAAM,6CAA6C,EAC9E,OAAO,EAAa,KAAK,EAAY,CAAC,GAAG,EAAM,UAAW,SAAU,GAAG,EAAG,CACxE,IAAK,QAAQ,IAAI,EAGjB,IAAK,CAAE,kBAAmB,CAAS,EACnC,UAAW,GAGX,MAAO,OACP,OAAQ,SACR,WAAY,UACZ,eAAgB,WAClB,CAAC,EAGH,IAAM,EAAe,EAAO,GAAG,yBAAyB,EACtD,SAAU,CAAC,EAAkB,CAC3B,IAAM,EAAW,EAAY,EAAE,EAAE,SAAS,WAAW,EAE/C,EAAO,OADG,MAAO,EAAoB,qBACf,MAAM,EAAQ,EAAU,CAAO,CAAC,EACtD,EAAS,MAAO,EAAK,OAAO,KAAK,EAAO,WAAW,EAAG,EAAO,WAAY,EAAO,KAAK,CAAC,EAAG,EAAO,QAAQ,EAC9G,GAAI,CAAC,EAAQ,OAAO,MAAO,EAAO,KAAS,MAAM,qDAAqD,CAAC,EAEvG,MAAO,CACL,KAFY,MAAO,EAAO,WAAW,IAAM,EAAY,CAAM,CAAC,GAEnD,IACX,KAAM,CAAE,KAAM,QAAkB,SAAU,WAAY,UAAS,EAC/D,IAAK,EAAK,GACZ,GAEF,EAAO,QAAQ,EAAe,MAAM,EAAkB,IAAI,CAAC,CAC7D,EAEO,SAAS,CAAK,CAAC,EAAmB,CAAC,EAAG,CAC3C,OAAO,EAAa,CAAO,EChCtB,IAAM,EAAU,EAAO,GAAG,oBAAoB,EAAE,SAAU,CAAC,EAAY,CAC5E,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EACF,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EACnF,MACN,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAU,MAAO,EAAc,QAAQ,EACvC,EAAW,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,EAAK,UAAY,SAAS,EAClG,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,WACA,UAAW,CAAC,IACV,EAAO,WACL,EAAO,IAAI,SAAU,EAAG,CACtB,GAAI,EAAU,EAAG,OAAO,MAAO,EAAQ,MAAM,CAAgB,EAC7D,IAAM,EAAW,MAAO,EAAQ,SAAS,CAAgB,EACzD,GAAI,IAAa,OAAW,OAAO,EACnC,OAAO,MAAO,EAAO,KAAS,MAAM,kCAAkC,CAAC,EACxE,EAAE,KAAK,EAAO,QAAQ,EAAe,KAAK,CAAC,CAC9C,EACF,OAAQ,IACN,EAAO,WACL,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,MAAM,CAAO,EAC7B,EAAE,KAAK,EAAO,QAAQ,EAAe,KAAK,CAAC,CAC9C,CACJ,EACD,EAEK,EAAiB,EAAO,WAAW,SAAU,CACjD,EACA,EACA,CACA,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,MAAM,CAAO,EAC/D,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,MAAM,IAAK,EAAS,QAAS,MAAU,CAAC,EAEzF,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OAAW,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EACvH,OAAO,MAAO,EAAQ,MAAM,CAAO,EACpC,EAED,SAAS,CAAY,CAAC,EAA4B,EAAgB,CAChE,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC",
"debugId": "F044DC1149E6AB6864756E2164756E21",
"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": "BD4A0E57D6436E8964756E2164756E21",
"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": ";+kBAAA,mBAAS,gBACT,yBAOA,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAe,CAAiB,CAAC,EAAmB,CAClD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GAAI,MAAM,IAAI,KAAK,CAAS,EAAE,OAAO,EAAG,OAAO,EAEjD,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,IAAI,KAAK,CAAU,EAC1B,EAAQ,MAAM,EAAK,OAAO,EAAK,MAAM,EAAK,KAAK,EAAI,KACnD,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,IAAI,MAAM,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "2AD5B22AC246E94C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/variant.shared.ts", "src/mini/session.shared.ts", "src/mini/theme.ts"],
"sourcesContent": [
"// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > saved preference > session history.\n//\n// The saved variant persists across sessions in ~/.local/state/opencode/model.json\n// so your last-used variant sticks. Cycling (ctrl+t) updates both the active\n// variant and the persisted file.\nimport path from \"path\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { makeGlobalNode } from \"@opencode-ai/core/effect/app-node\"\nimport { makeRuntime } from \"@opencode-ai/core/effect/runtime\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\n\nconst MODEL_FILE = path.join(Global.Path.state, \"model.json\")\n\ntype ModelState = Record<string, unknown> & {\n variant?: Record<string, string | undefined>\n}\ntype VariantService = {\n readonly resolveSavedVariant: (model: RunInput[\"model\"]) => Effect.Effect<string | undefined>\n readonly saveVariant: (model: RunInput[\"model\"], variant: string | undefined) => Effect.Effect<void>\n}\ntype VariantRuntime = {\n resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined>\n saveVariant(model: RunInput[\"model\"], variant: string | undefined): Promise<void>\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n\nclass Service extends Context.Service<Service, VariantService>()(\"@opencode/RunVariant\") {}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction variantKey(model: NonNullable<RunInput[\"model\"]>): string {\n return modelKey(model.providerID, model.modelID)\n}\n\nexport function modelInfo(providers: RunProvider[] | undefined, model: NonNullable<RunInput[\"model\"]>) {\n const provider = providers?.find((item) => item.id === model.providerID)\n return {\n provider: provider?.name ?? model.providerID,\n model: provider?.models[model.modelID]?.name ?? model.modelID,\n }\n}\n\nexport function formatModelLabel(\n model: NonNullable<RunInput[\"model\"]>,\n variant: string | undefined,\n providers?: RunProvider[],\n): string {\n const names = modelInfo(providers, model)\n const label = variant ? ` · ${variant}` : \"\"\n return `${names.model} · ${names.provider}${label}`\n}\n\nexport function cycleVariant(current: string | undefined, variants: string[]): string | undefined {\n if (variants.length === 0) {\n return undefined\n }\n\n if (!current) {\n return variants[0]\n }\n\n const idx = variants.indexOf(current)\n if (idx === -1 || idx === variants.length - 1) {\n return undefined\n }\n\n return variants[idx + 1]\n}\n\nexport function pickVariant(model: RunInput[\"model\"], input: RunSession | SessionMessages): string | undefined {\n return sessionVariant(Array.isArray(input) ? createSession(input) : input, model)\n}\n\nfunction fitVariant(value: string | undefined, variants: string[]): string | undefined {\n if (!value) {\n return undefined\n }\n\n if (variants.length === 0 || variants.includes(value)) {\n return value\n }\n\n return undefined\n}\n\n// Picks the active variant. CLI flag wins, then saved preference, then session\n// history. fitVariant() checks saved and session values against the available\n// variants list -- if the provider doesn't offer a variant, it drops.\nexport function resolveVariant(\n input: string | undefined,\n session: string | undefined,\n saved: string | undefined,\n variants: string[],\n): string | undefined {\n if (input !== undefined) {\n return input\n }\n\n const fallback = fitVariant(saved, variants)\n const current = fitVariant(session, variants)\n if (current !== undefined) {\n return current\n }\n\n return fallback\n}\n\nfunction state(value: unknown): ModelState {\n if (!isRecord(value)) {\n return {}\n }\n\n const variant = isRecord(value.variant)\n ? Object.fromEntries(\n Object.entries(value.variant).flatMap(([key, item]) => {\n if (typeof item !== \"string\") {\n return []\n }\n\n return [[key, item] as const]\n }),\n )\n : undefined\n\n return {\n ...value,\n variant,\n }\n}\n\nconst layer = Layer.fresh(\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const file = yield* FSUtil.Service\n\n const read = Effect.fn(\"RunVariant.read\")(function* () {\n return yield* file.readJson(MODEL_FILE).pipe(\n Effect.map(state),\n Effect.catchCause(() => Effect.succeed(state(undefined))),\n )\n })\n\n const resolveSavedVariant = Effect.fn(\"RunVariant.resolveSavedVariant\")(function* (model: RunInput[\"model\"]) {\n if (!model) {\n return undefined\n }\n\n return (yield* read()).variant?.[variantKey(model)]\n })\n\n const saveVariant = Effect.fn(\"RunVariant.saveVariant\")(function* (\n model: RunInput[\"model\"],\n variant: string | undefined,\n ) {\n if (!model) {\n return\n }\n\n const current = yield* read()\n const next = {\n ...current.variant,\n }\n const key = variantKey(model)\n if (variant) {\n next[key] = variant\n }\n\n if (!variant) {\n delete next[key]\n }\n\n yield* file\n .writeJson(MODEL_FILE, {\n ...current,\n variant: next,\n })\n .pipe(Effect.orElseSucceed(() => undefined))\n })\n\n return Service.of({\n resolveSavedVariant,\n saveVariant,\n })\n }),\n ),\n)\n\nconst node = makeGlobalNode({ service: Service, layer, deps: [FSUtil.node] })\n\n/** @internal Exported for testing. */\nexport function createVariantRuntime(replacements?: readonly LayerNode.Replacement[]): VariantRuntime {\n const runtime = makeRuntime(Service, AppNodeBuilder.build(node, replacements))\n return {\n resolveSavedVariant: (model) => runtime.runPromise((svc) => svc.resolveSavedVariant(model)).catch(() => undefined),\n saveVariant: (model, variant) => runtime.runPromise((svc) => svc.saveVariant(model, variant)).catch(() => {}),\n }\n}\n\nconst runtime = createVariantRuntime()\n\nexport async function resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined> {\n return runtime.resolveSavedVariant(model)\n}\n\nexport function saveVariant(model: RunInput[\"model\"], variant: string | undefined): void {\n void runtime.saveVariant(model, variant)\n}\n",
"// Session message extraction and prompt history.\n//\n// Fetches session messages from the SDK and extracts user turn text for\n// the prompt history ring. Also finds the most recently used variant for\n// the current model so the footer can pre-select it.\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { Message, Part } from \"@opencode-ai/sdk/v2\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = Array<{ info: Message; parts: Part[] }>\n\ntype Turn = {\n prompt: RunPrompt\n provider: string | undefined\n model: string | undefined\n variant: string | undefined\n}\n\nexport type RunSession = {\n first: boolean\n turns: Turn[]\n model?: NonNullable<RunInput[\"model\"]>\n variant?: string\n}\n\nfunction fileName(url: string, filename?: string) {\n if (filename) {\n return filename\n }\n\n try {\n const next = new URL(url)\n if (next.protocol !== \"file:\") {\n return url\n }\n\n const name = next.pathname.split(\"/\").at(-1)\n if (name) {\n return decodeURIComponent(name)\n }\n } catch {}\n\n return url\n}\n\nfunction fileSource(\n part: Extract<SessionMessages[number][\"parts\"][number], { type: \"file\" }>,\n text: { start: number; end: number; value: string },\n) {\n if (part.source) {\n return {\n ...structuredClone(part.source),\n text,\n }\n }\n\n return {\n type: \"file\" as const,\n path: part.filename ?? part.url,\n text,\n }\n}\n\nexport function messagePrompt(msg: SessionMessages[number]): RunPrompt {\n const parts: RunPrompt[\"parts\"] = []\n let text = msg.parts\n .filter((part): part is Extract<SessionMessages[number][\"parts\"][number], { type: \"text\" }> => {\n return part.type === \"text\" && !part.synthetic\n })\n .map((part) => part.text)\n .join(\"\")\n let cursor = Bun.stringWidth(text)\n const used: Array<{ start: number; end: number }> = []\n\n const take = (value: string): { start: number; end: number; value: string } | undefined => {\n let from = 0\n while (true) {\n const idx = text.indexOf(value, from)\n if (idx === -1) {\n return undefined\n }\n\n const start = Bun.stringWidth(text.slice(0, idx))\n const end = start + Bun.stringWidth(value)\n if (!used.some((item) => item.start < end && start < item.end)) {\n return { start, end, value }\n }\n\n from = idx + value.length\n }\n }\n\n const add = (value: string) => {\n const gap = text ? \" \" : \"\"\n const start = cursor + Bun.stringWidth(gap)\n text += gap + value\n const end = start + Bun.stringWidth(value)\n cursor = end\n return { start, end, value }\n }\n\n for (const part of msg.parts) {\n if (part.type === \"file\") {\n const next = part.source?.text ? structuredClone(part.source.text) : take(\"@\" + fileName(part.url, part.filename))\n const span = next ?? add(\"@\" + fileName(part.url, part.filename))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"file\",\n mime: part.mime,\n filename: part.filename,\n url: part.url,\n source: fileSource(part, span),\n })\n continue\n }\n\n if (part.type !== \"agent\") {\n continue\n }\n\n const span = part.source ? structuredClone(part.source) : (take(\"@\" + part.name) ?? add(\"@\" + part.name))\n used.push({ start: span.start, end: span.end })\n parts.push({\n type: \"agent\",\n name: part.name,\n source: span,\n })\n }\n\n return { text, parts }\n}\n\nfunction turn(msg: SessionMessages[number]): Turn | undefined {\n if (msg.info.role !== \"user\") {\n return undefined\n }\n\n return {\n prompt: messagePrompt(msg),\n provider: msg.info.model.providerID,\n model: msg.info.model.modelID,\n variant: msg.info.model.variant,\n }\n}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((msg) => {\n const item = turn(msg)\n return item ? [item] : []\n }),\n }\n}\n\nexport async function resolveCurrentSession(\n sdk: RunInput[\"sdk\"],\n sessionID: string,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }),\n sdk.session.get({ sessionID }),\n ])\n const messages = response.data.toReversed()\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) => {\n if (message.type !== \"user\") return []\n return [\n {\n prompt: {\n text: message.text,\n parts: [\n ...(message.files ?? []).map((file) => ({\n type: \"file\" as const,\n url: file.source.type === \"uri\" ? file.source.uri : `data:${file.mime};base64,${file.data}`,\n mime: file.mime,\n filename: file.name,\n source: file.mention\n ? {\n type: \"file\" as const,\n path: file.name ?? (file.source.type === \"uri\" ? file.source.uri : \"inline attachment\"),\n text: { start: file.mention.start, end: file.mention.end, value: file.mention.text },\n }\n : undefined,\n })),\n ...(message.agents ?? []).map((agent) => ({\n type: \"agent\" as const,\n name: agent.name,\n source: agent.mention\n ? { start: agent.mention.start, end: agent.mention.end, value: agent.mention.text }\n : undefined,\n })),\n ],\n },\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n },\n ]\n }),\n ...(session.model && {\n model: {\n providerID: session.model.providerID,\n modelID: session.model.id,\n },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n const out: RunPrompt[] = []\n\n for (const turn of session.turns) {\n if (!turn.prompt.text.trim()) {\n continue\n }\n\n if (out[out.length - 1] && promptSame(out[out.length - 1], turn.prompt)) {\n continue\n }\n\n out.push(promptCopy(turn.prompt))\n }\n\n return out.slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) {\n return undefined\n }\n\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) {\n return session.variant\n }\n\n for (let idx = session.turns.length - 1; idx >= 0; idx -= 1) {\n const turn = session.turns[idx]\n if (turn.provider !== model.providerID || turn.model !== model.modelID) {\n continue\n }\n\n return turn.variant\n }\n\n return undefined\n}\n",
"// Theme resolution for direct interactive mode.\n//\n// Derives scrollback and footer colors from the terminal's actual palette.\n// resolveRunTheme() queries the renderer for the terminal's palette,\n// detects dark/light mode, builds a small system theme locally, and maps it to\n// the run footer + scrollback color model. Falls back to a hardcoded dark-mode\n// palette if detection fails.\nimport { RGBA, SyntaxStyle, type CliRenderer, type ColorInput, type TerminalColors } from \"@opentui/core\"\nimport type { TuiThemeCurrent } from \"@opencode-ai/plugin/tui\"\nimport type { EntryKind } from \"./types\"\n\ntype Tone = {\n body: ColorInput\n start?: ColorInput\n}\n\nexport type RunEntryTheme = Record<EntryKind, Tone>\n\nexport type RunSplashTheme = {\n left: ColorInput\n right: ColorInput\n leftShadow: ColorInput\n rightShadow: ColorInput\n}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: ColorInput\n success: ColorInput\n error: ColorInput\n muted: ColorInput\n text: ColorInput\n status: ColorInput\n statusAccent: ColorInput\n shade: ColorInput\n surface: ColorInput\n pane: ColorInput\n border: ColorInput\n line: ColorInput\n}\n\nexport type RunBlockTheme = {\n highlight: ColorInput\n warning: ColorInput\n text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\n subtleSyntax?: SyntaxStyle\n diffAdded: ColorInput\n diffRemoved: ColorInput\n diffAddedBg: ColorInput\n diffRemovedBg: ColorInput\n diffContextBg: ColorInput\n diffHighlightAdded: ColorInput\n diffHighlightRemoved: ColorInput\n diffLineNumber: ColorInput\n diffAddedLineNumberBg: ColorInput\n diffRemovedLineNumberBg: ColorInput\n}\n\nexport type RunTheme = {\n background: ColorInput\n footer: RunFooterTheme\n entry: RunEntryTheme\n splash: RunSplashTheme\n block: RunBlockTheme\n}\n\ntype ThemeColor = Exclude<keyof TuiThemeCurrent, \"thinkingOpacity\">\ntype HexColor = `#${string}`\ntype RefName = string\ntype Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\ntype ColorValue = HexColor | RefName | Variant | RGBA | number\ntype ThemeJson = {\n defs?: Record<string, HexColor | RefName>\n theme: Omit<Record<ThemeColor, ColorValue>, \"selectedListItemText\" | \"backgroundMenu\"> & {\n selectedListItemText?: ColorValue\n backgroundMenu?: ColorValue\n thinkingOpacity?: number\n }\n}\n\ntype SharedSyntaxTheme = TuiThemeCurrent & {\n _hasSelectedListItemText: boolean\n}\n\nexport const transparent = RGBA.fromValues(0, 0, 0, 0)\n\nfunction alpha(color: RGBA, value: number): RGBA {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, value)))\n}\n\nfunction rgba(hex: string, value?: number): RGBA {\n const color = RGBA.fromHex(hex)\n return value === undefined ? color : alpha(color, value)\n}\n\nfunction mode(bg: RGBA): \"dark\" | \"light\" {\n return luminance(bg) > 0.5 ? \"light\" : \"dark\"\n}\n\nfunction luminance(color: RGBA): number {\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b\n}\n\nfunction fade(color: RGBA, base: RGBA, fallback: number, scale: number, limit: number): RGBA {\n if (color.a === 0) {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, fallback)))\n }\n\n const target = Math.min(limit, color.a * scale)\n const mix = Math.min(1, target / color.a)\n\n return RGBA.fromValues(\n base.r + (color.r - base.r) * mix,\n base.g + (color.g - base.g) * mix,\n base.b + (color.b - base.b) * mix,\n color.a,\n )\n}\n\nfunction ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansi = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansi[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const value = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(value(r), value(g), value(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nfunction tint(base: RGBA, overlay: RGBA, value: number): RGBA {\n return RGBA.fromInts(\n Math.round((base.r + (overlay.r - base.r) * value) * 255),\n Math.round((base.g + (overlay.g - base.g) * value) * 255),\n Math.round((base.b + (overlay.b - base.b) * value) * 255),\n )\n}\n\nfunction blend(color: RGBA, bg: RGBA): RGBA {\n if (color.a >= 1) {\n return color\n }\n\n return RGBA.fromValues(\n bg.r + (color.r - bg.r) * color.a,\n bg.g + (color.g - bg.g) * color.a,\n bg.b + (color.b - bg.b) * color.a,\n 1,\n )\n}\n\nfunction chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\n}\n\nfunction opaqueSyntaxStyle(style: SyntaxStyle | undefined, bg: RGBA): SyntaxStyle | undefined {\n if (!style) {\n return undefined\n }\n\n return SyntaxStyle.fromStyles(\n Object.fromEntries(\n [...style.getAllStyles()].map(([name, value]) => [\n name,\n {\n ...value,\n fg: value.fg ? blend(value.fg, bg) : value.fg,\n bg: value.bg ? blend(value.bg, bg) : value.bg,\n },\n ]),\n ),\n )\n}\n\nfunction indexedPalette(colors: TerminalColors, size: number = Math.max(colors.palette.length, 16)): RGBA[] {\n return Array.from({ length: size }, (_, index) => {\n const value = colors.palette[index]\n return RGBA.fromIndex(index, value ? RGBA.fromHex(value) : ansiToRgba(index))\n })\n}\n\nfunction srgbToLinear(value: number): number {\n if (value <= 0.04045) {\n return value / 12.92\n }\n\n return ((value + 0.055) / 1.055) ** 2.4\n}\n\nfunction oklab(color: RGBA) {\n const r = srgbToLinear(color.r)\n const g = srgbToLinear(color.g)\n const b = srgbToLinear(color.b)\n\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b)\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b)\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b)\n\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\nfunction nearestIndexed(indexed: RGBA[], rgba: RGBA): RGBA {\n const target = oklab(rgba)\n const hit = indexed.reduce(\n (best, item) => {\n const sample = oklab(item)\n const dl = sample.l - target.l\n const da = sample.a - target.a\n const db = sample.b - target.b\n const dist = dl * dl * 2 + da * da + db * db\n if (dist >= best.dist) return best\n return {\n dist,\n item,\n }\n },\n {\n dist: Number.POSITIVE_INFINITY,\n item: indexed[0]!,\n },\n )\n\n return RGBA.clone(hit.item)\n}\n\nfunction paletteColor(colors: TerminalColors, index: number): RGBA {\n const value = colors.palette[index]\n return value ? RGBA.fromHex(value) : ansiToRgba(index)\n}\n\nfunction splashShadow(indexed: RGBA[], base: RGBA, overlay: RGBA, value: number): RGBA {\n const mixed = tint(base, overlay, value)\n return nearestIndexed(indexed, mixed)\n}\n\nexport function resolveTheme(theme: ThemeJson, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const defs = theme.defs ?? {}\n\n const resolveColor = (value: ColorValue, chain: string[] = []): RGBA => {\n if (value instanceof RGBA) return value\n\n if (typeof value === \"number\") {\n return RGBA.fromIndex(value, ansiToRgba(value))\n }\n\n if (typeof value !== \"string\") {\n return resolveColor(value[pick], chain)\n }\n\n if (value === \"transparent\" || value === \"none\") {\n return RGBA.fromInts(0, 0, 0, 0)\n }\n\n if (value.startsWith(\"#\")) {\n return RGBA.fromHex(value)\n }\n\n if (chain.includes(value)) {\n throw new Error(`Circular color reference: ${[...chain, value].join(\" -> \")}`)\n }\n\n const next = defs[value] ?? theme.theme[value as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${value}\" not found in defs or theme`)\n }\n\n return resolveColor(next, [...chain, value])\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText:\n theme.theme.selectedListItemText === undefined\n ? resolved.background!\n : resolveColor(theme.theme.selectedListItemText),\n backgroundMenu:\n theme.theme.backgroundMenu === undefined ? resolved.backgroundElement! : resolveColor(theme.theme.backgroundMenu),\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): Record<number, RGBA> {\n const r = bg.r * 255\n const g = bg.g * 255\n const b = bg.b * 255\n const lum = 0.299 * r + 0.587 * g + 0.114 * b\n const cast = 0.25 * (1 - chroma(bg)) ** 2\n\n const gray = (level: number) => {\n const factor = level / 12\n\n if (isDark && lum < 10) {\n const value = Math.floor(factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n if (!isDark && lum > 245) {\n const value = Math.floor(255 - factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n const value = isDark ? lum + (255 - lum) * factor * 0.4 : lum * (1 - factor * 0.4)\n const tone = RGBA.fromInts(Math.floor(value), Math.floor(value), Math.floor(value))\n if (cast === 0) return map(tone)\n\n const ratio = lum === 0 ? 0 : value / lum\n return map(\n tint(\n tone,\n RGBA.fromInts(\n Math.floor(Math.max(0, Math.min(r * ratio, 255))),\n Math.floor(Math.max(0, Math.min(g * ratio, 255))),\n Math.floor(Math.max(0, Math.min(b * ratio, 255))),\n ),\n cast,\n ),\n )\n }\n\n return Object.fromEntries(Array.from({ length: 12 }, (_, index) => [index + 1, gray(index + 1)]))\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): RGBA {\n const lum = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n const gray = isDark\n ? lum < 10\n ? 180\n : Math.min(Math.floor(160 + lum * 0.3), 200)\n : lum > 245\n ? 75\n : Math.max(Math.floor(100 - (255 - lum) * 0.2), 60)\n\n return map(RGBA.fromInts(gray, gray, gray))\n}\n\nexport function generateSystem(colors: TerminalColors, pick: \"dark\" | \"light\"): ThemeJson {\n const bg_snapshot = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg_snapshot = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const bg = RGBA.defaultBackground(bg_snapshot)\n const fg = RGBA.defaultForeground(fg_snapshot)\n const isDark = pick === \"dark\"\n\n const color = (index: number) => paletteColor(colors, index)\n\n const grays = generateGrayScale(bg_snapshot, isDark, (rgba) => rgba)\n const textMuted = generateMutedTextColor(bg_snapshot, isDark, (rgba) => rgba)\n\n const ansi = {\n red: color(1),\n green: color(2),\n yellow: color(3),\n blue: color(4),\n magenta: color(5),\n cyan: color(6),\n red_bright: color(9),\n green_bright: color(10),\n }\n\n const diff_alpha = isDark ? 0.22 : 0.14\n const diff_context_bg = grays[2]\n const primary = ansi.cyan\n const secondary = ansi.magenta\n\n return {\n theme: {\n primary,\n secondary,\n accent: primary,\n error: ansi.red,\n warning: ansi.yellow,\n success: ansi.green,\n info: ansi.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: alpha(bg, 0),\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansi.green,\n diffRemoved: ansi.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansi.green_bright,\n diffHighlightRemoved: ansi.red_bright,\n diffAddedBg: tint(bg_snapshot, ansi.green, diff_alpha),\n diffRemovedBg: tint(bg_snapshot, ansi.red, diff_alpha),\n diffContextBg: diff_context_bg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg: tint(diff_context_bg, ansi.green, diff_alpha),\n diffRemovedLineNumberBg: tint(diff_context_bg, ansi.red, diff_alpha),\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansi.blue,\n markdownLinkText: ansi.cyan,\n markdownCode: ansi.green,\n markdownBlockQuote: ansi.yellow,\n markdownEmph: ansi.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansi.blue,\n markdownListEnumeration: ansi.cyan,\n markdownImage: ansi.blue,\n markdownImageText: ansi.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansi.magenta,\n syntaxFunction: ansi.blue,\n syntaxVariable: fg,\n syntaxString: ansi.green,\n syntaxNumber: ansi.yellow,\n syntaxType: ansi.cyan,\n syntaxOperator: ansi.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction quantizeColor(indexed: RGBA[], rgba: RGBA): RGBA {\n if (rgba.a === 0 || rgba.intent === \"default\" || rgba.intent === \"indexed\") {\n return RGBA.clone(rgba)\n }\n\n return nearestIndexed(indexed, rgba)\n}\n\nfunction quantizeTheme(theme: TuiThemeCurrent, indexed: RGBA[]): TuiThemeCurrent {\n const resolved = Object.fromEntries(\n Object.entries(theme)\n .filter(([key]) => key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, quantizeColor(indexed, value as RGBA)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n thinkingOpacity: theme.thinkingOpacity,\n }\n}\n\nfunction splashTheme(theme: TuiThemeCurrent, indexed: RGBA[]): RunSplashTheme {\n const left = nearestIndexed(indexed, theme.textMuted)\n const right = nearestIndexed(indexed, theme.text)\n return {\n left,\n right,\n leftShadow: splashShadow(indexed, theme.background, left, 0.14),\n rightShadow: splashShadow(indexed, theme.background, right, 0.14),\n }\n}\n\nfunction map(\n footerTheme: TuiThemeCurrent,\n scrollbackTheme: TuiThemeCurrent,\n splash: RunSplashTheme,\n syntax?: SyntaxStyle,\n subtleSyntax?: SyntaxStyle,\n): RunTheme {\n const opaqueSubtleSyntax = opaqueSyntaxStyle(subtleSyntax, scrollbackTheme.background)\n subtleSyntax?.destroy()\n const footerBackground = alpha(footerTheme.background, 1)\n const footerMode = mode(footerBackground)\n const shade = fade(footerTheme.backgroundMenu, footerTheme.background, 0.12, 0.56, 0.72)\n const surface = fade(footerTheme.backgroundMenu, footerTheme.background, 0.18, 0.76, 0.9)\n const line = fade(footerTheme.backgroundMenu, footerTheme.background, 0.24, 0.9, 0.98)\n const statusBase = tint(footerBackground, rgba(\"#000000\"), footerMode === \"dark\" ? 0.12 : 0.06)\n const statusAccentBase =\n footerMode === \"dark\" ? tint(footerBackground, rgba(\"#ffffff\"), 0.06) : tint(statusBase, rgba(\"#000000\"), 0.04)\n const collapsedStatus = footerMode === \"dark\" && luminance(statusBase) <= 0.04\n // Pure-black backgrounds need a slight lift or the row disappears into the terminal background.\n const status = collapsedStatus ? tint(statusBase, statusAccentBase, 0.7) : statusBase\n const statusAccent = collapsedStatus ? tint(status, rgba(\"#ffffff\"), 0.06) : statusAccentBase\n\n return {\n background: footerTheme.background,\n footer: {\n highlight: footerTheme.primary,\n selected: footerTheme.backgroundElement,\n selectedText: footerTheme.selectedListItemText,\n warning: footerTheme.warning,\n success: footerTheme.success,\n error: footerTheme.error,\n muted: footerTheme.textMuted,\n text: footerTheme.text,\n status,\n statusAccent,\n shade,\n surface,\n pane: footerTheme.backgroundMenu,\n border: footerTheme.border,\n line,\n },\n entry: {\n system: {\n body: scrollbackTheme.textMuted,\n },\n user: {\n body: scrollbackTheme.primary,\n },\n assistant: {\n body: scrollbackTheme.text,\n },\n reasoning: {\n body: scrollbackTheme.textMuted,\n },\n tool: {\n body: scrollbackTheme.text,\n start: scrollbackTheme.textMuted,\n },\n error: {\n body: scrollbackTheme.error,\n },\n },\n splash,\n block: {\n highlight: scrollbackTheme.primary,\n warning: scrollbackTheme.warning,\n text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\n subtleSyntax: opaqueSubtleSyntax,\n diffAdded: scrollbackTheme.diffAdded,\n diffRemoved: scrollbackTheme.diffRemoved,\n diffAddedBg: transparent,\n diffRemovedBg: transparent,\n diffContextBg: transparent,\n diffHighlightAdded: scrollbackTheme.diffHighlightAdded,\n diffHighlightRemoved: scrollbackTheme.diffHighlightRemoved,\n diffLineNumber: scrollbackTheme.diffLineNumber,\n diffAddedLineNumberBg: scrollbackTheme.diffAddedLineNumberBg,\n diffRemovedLineNumberBg: scrollbackTheme.diffRemovedLineNumberBg,\n },\n }\n}\n\nconst seed = {\n highlight: RGBA.fromIndex(6, rgba(\"#38bdf8\")),\n muted: RGBA.fromIndex(8, rgba(\"#64748b\")),\n text: RGBA.defaultForeground(rgba(\"#f8fafc\")),\n panel: rgba(\"#0f172a\"),\n success: RGBA.fromIndex(2, rgba(\"#22c55e\")),\n warning: RGBA.fromIndex(3, rgba(\"#f59e0b\")),\n error: RGBA.fromIndex(1, rgba(\"#ef4444\")),\n}\n\nfunction tone(body: ColorInput, start?: ColorInput): Tone {\n return {\n body,\n start,\n }\n}\n\nconst fallbackSplashIndexed = Array.from({ length: 256 }, (_, index) => RGBA.fromIndex(index))\nconst fallbackSplashLeft = RGBA.fromIndex(67)\nconst fallbackSplashRight = RGBA.fromIndex(110)\n\nexport const RUN_THEME_FALLBACK: RunTheme = {\n background: RGBA.fromValues(0, 0, 0, 0),\n footer: {\n highlight: seed.highlight,\n selected: seed.text,\n selectedText: seed.panel,\n warning: seed.warning,\n success: seed.success,\n error: seed.error,\n muted: seed.muted,\n text: seed.text,\n status: tint(seed.panel, rgba(\"#000000\"), 0.12),\n statusAccent: tint(seed.panel, rgba(\"#ffffff\"), 0.06),\n shade: alpha(seed.panel, 0.68),\n surface: alpha(seed.panel, 0.86),\n pane: seed.panel,\n border: seed.muted,\n line: alpha(seed.panel, 0.96),\n },\n entry: {\n system: tone(seed.muted),\n user: tone(seed.highlight),\n assistant: tone(seed.text),\n reasoning: tone(seed.muted),\n tool: tone(seed.text, seed.muted),\n error: tone(seed.error),\n },\n splash: {\n left: fallbackSplashLeft,\n right: fallbackSplashRight,\n leftShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashLeft, 0.14),\n rightShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashRight, 0.14),\n },\n block: {\n highlight: seed.highlight,\n warning: seed.warning,\n text: seed.text,\n muted: seed.muted,\n diffAdded: seed.success,\n diffRemoved: seed.error,\n diffAddedBg: alpha(seed.success, 0.18),\n diffRemovedBg: alpha(seed.error, 0.18),\n diffContextBg: alpha(seed.panel, 0.72),\n diffHighlightAdded: seed.success,\n diffHighlightRemoved: seed.error,\n diffLineNumber: seed.muted,\n diffAddedLineNumberBg: alpha(seed.success, 0.12),\n diffRemovedLineNumberBg: alpha(seed.error, 0.12),\n },\n}\n\nexport async function resolveRunTheme(renderer: CliRenderer): Promise<RunTheme> {\n try {\n const colors = await renderer.getPalette({\n size: 256,\n })\n const bg = colors.defaultBackground ?? colors.palette[0]\n if (!bg) {\n return RUN_THEME_FALLBACK\n }\n\n // Palette-only terminal reloads can leave renderer.themeMode stale, but\n // ANSI slot zero is not the terminal background when OSC 11 is absent.\n const pick = colors.defaultBackground\n ? mode(RGBA.fromHex(colors.defaultBackground))\n : (renderer.themeMode ?? mode(RGBA.fromHex(bg)))\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const indexed = indexedPalette(colors, 256)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const shared = await import(\"@opencode-ai/tui/context/theme\")\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n const syntax = shared.generateSyntax(syntaxTheme)\n return map(\n footerTheme,\n scrollbackTheme,\n splashTheme(scrollbackTheme, indexed),\n syntax,\n shared.generateSubtleSyntax(syntaxTheme),\n )\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n"
],
"mappings": "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",
"debugId": "FB11007EBC40580B64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/demo.ts"],
"sourcesContent": [
"// Demo mode for testing direct interactive mode without a real SDK.\n//\n// Enabled with `--demo`. Intercepts prompt submissions and generates synthetic\n// SDK events that feed through the real reducer and footer pipeline. This\n// lets you test scrollback formatting, permission UI, question UI, and tool\n// snapshots without making actual model calls. Pass a demo slash command as\n// the initial interactive message to trigger a preview immediately.\n//\n// Slash commands:\n// /permission [kind] → triggers a permission request variant\n// /question [kind] → triggers a question request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, bash,\n// write, edit, patch, task, question, error, mix)\n//\n// Demo mode also handles permission and question replies locally, completing\n// or failing the synthetic tool parts as appropriate.\nimport path from \"path\"\nimport type { Event, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { createSessionData, reduceSessionData, type SessionData } from \"./session-data\"\nimport { writeSessionOutput } from \"./stream\"\nimport type { FooterApi, PermissionReply, QuestionReject, QuestionReply, RunPrompt, StreamCommit } from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"bash\",\n \"write\",\n \"edit\",\n \"patch\",\n \"task\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"bash\", \"read\", \"task\", \"external\", \"doom\"] as const\nconst QUESTIONS = [\"multi\", \"single\", \"checklist\", \"custom\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype QuestionKind = (typeof QUESTIONS)[number]\n\nfunction permissionKind(value: string | undefined): PermissionKind | undefined {\n const next = (value || \"edit\").toLowerCase()\n return PERMISSIONS.find((item) => item === next)\n}\n\nfunction questionKind(value: string | undefined): QuestionKind | undefined {\n const next = (value || \"multi\").toLowerCase()\n return QUESTIONS.find((item) => item === next)\n}\n\nconst SAMPLE_MARKDOWN = [\n \"# Direct Mode Demo\",\n \"\",\n \"This is a realistic assistant response for direct-mode formatting checks.\",\n \"It mixes **bold**, _italic_, `inline code`, links, code fences, and tables in one streamed reply.\",\n \"\",\n \"## Summary\",\n \"\",\n \"- Restored the final markdown flush so the last block is committed on idle.\",\n \"- Switched markdown scrollback commits back to top-level block boundaries.\",\n \"- Added footer-level regression coverage for split-footer rendering.\",\n \"\",\n \"## Status\",\n \"\",\n \"| Area | Before | After | Notes |\",\n \"| --- | --- | --- | --- |\",\n \"| Direct mode | Missing final rows | Stable | Final markdown block now flushes on idle |\",\n \"| Tables | Dropped in streaming mode | Visible | Block-based commits match the working OpenTUI demo |\",\n \"| Tests | Partial coverage | Broader coverage | Includes a footer-level split render capture |\",\n \"\",\n \"> This sample intentionally includes a wide table so you can spot wrapping and commit bugs quickly.\",\n \"\",\n \"```ts\",\n \"const result = { markdown: true, tables: 2, stable: true }\",\n \"```\",\n \"\",\n \"## Files\",\n \"\",\n \"| File | Change |\",\n \"| --- | --- |\",\n \"| `scrollback.surface.ts` | Align markdown commit logic with the split-footer demo |\",\n \"| `footer.ts` | Keep active surfaces across footer-height-only resizes |\",\n \"| `footer.test.ts` | Capture real split-footer markdown payloads during idle completion |\",\n \"\",\n \"Next step: run `/fmt table` if you want a tighter table-only sample.\",\n].join(\"\\n\")\n\nconst SAMPLE_TABLE = [\n \"# Table Sample\",\n \"\",\n \"| Kind | Example | Notes |\",\n \"| --- | --- | --- |\",\n \"| Pipe | `A\\\\|B` | Escaped pipes should stay in one cell |\",\n \"| Unicode | `漢字` | Wide characters should remain aligned |\",\n \"| Wrap | `LongTokenWithoutNaturalBreaks_1234567890` | Useful for width stress |\",\n \"| Status | done | Final row should still appear after idle |\",\n].join(\"\\n\")\n\ntype Ref = {\n msg: string\n part: string\n call: string\n tool: string\n input: Record<string, unknown>\n start: number\n}\n\ntype Ask = {\n ref: Ref\n}\n\ntype Perm = {\n ref: Ref\n done: {\n title: string\n output: string\n metadata?: Record<string, unknown>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: Record<string, unknown>\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n data: SessionData\n footer: FooterApi\n limits: () => Record<string, number>\n msg: number\n part: number\n call: number\n perm: number\n ask: number\n perms: Map<string, Perm>\n asks: Map<string, Ask>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\n limits: () => Record<string, number>\n footer: FooterApi\n}\n\nfunction note(footer: FooterApi, text: string): void {\n footer.append({\n kind: \"system\",\n text,\n phase: \"start\",\n source: \"system\",\n })\n}\n\nfunction clearSubagent(footer: FooterApi): void {\n footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [],\n details: {},\n permissions: [],\n questions: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n partID: string\n callID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n toolCalls?: number\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n partID: input.partID,\n callID: input.callID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n toolCalls: input.toolCalls,\n lastUpdatedAt: Date.now(),\n },\n ],\n details: {\n [input.sessionID]: {\n sessionID: input.sessionID,\n commits: input.commits,\n },\n },\n permissions: [],\n questions: [],\n },\n })\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (!signal) {\n setTimeout(resolve, ms)\n return\n }\n\n if (signal.aborted) {\n resolve()\n return\n }\n\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", done)\n resolve()\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", done)\n resolve()\n }, ms)\n\n signal.addEventListener(\"abort\", done, { once: true })\n })\n}\n\nfunction split(text: string): string[] {\n if (text.length <= 48) {\n return [text]\n }\n\n const size = Math.ceil(text.length / 3)\n return [text.slice(0, size), text.slice(size, size * 2), text.slice(size * 2)]\n}\n\nfunction take(state: State, key: \"msg\" | \"part\" | \"call\" | \"perm\" | \"ask\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction feed(state: State, event: Event): void {\n const out = reduceSessionData({\n data: state.data,\n event,\n sessionID: state.id,\n thinking: state.thinking,\n limits: state.limits(),\n })\n state.data = out.data\n writeSessionOutput(\n {\n footer: state.footer,\n },\n out,\n )\n}\n\nfunction open(state: State): string {\n const id = take(state, \"msg\", \"msg\")\n feed(state, {\n type: \"message.updated\",\n properties: {\n sessionID: state.id,\n info: {\n id,\n sessionID: state.id,\n role: \"assistant\",\n time: {\n created: Date.now(),\n },\n parentID: `user_${id}`,\n modelID: \"demo\",\n providerID: \"demo\",\n mode: \"demo\",\n agent: \"demo\",\n path: {\n cwd: process.cwd(),\n root: process.cwd(),\n },\n cost: 0.001,\n tokens: {\n input: 120,\n output: 320,\n reasoning: 80,\n cache: {\n read: 0,\n write: 0,\n },\n },\n },\n },\n } as Event)\n return id\n}\n\nasync function emitText(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n const start = Date.now()\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"text\",\n text: \"\",\n time: {\n start,\n },\n },\n },\n } as Event)\n\n let next = \"\"\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n next += item\n feed(state, {\n type: \"message.part.delta\",\n properties: {\n sessionID: state.id,\n messageID: msg,\n partID: part,\n field: \"text\",\n delta: item,\n },\n } as Event)\n await wait(45, signal)\n }\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"text\",\n text: next,\n time: {\n start,\n end: Date.now(),\n },\n },\n },\n } as Event)\n}\n\nasync function emitReasoning(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n const start = Date.now()\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"reasoning\",\n text: \"\",\n time: {\n start,\n },\n },\n },\n } as Event)\n\n let next = \"\"\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n next += item\n feed(state, {\n type: \"message.part.delta\",\n properties: {\n sessionID: state.id,\n messageID: msg,\n partID: part,\n field: \"text\",\n delta: item,\n },\n } as Event)\n await wait(45, signal)\n }\n\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: part,\n sessionID: state.id,\n messageID: msg,\n type: \"reasoning\",\n text: next,\n time: {\n start,\n end: Date.now(),\n },\n },\n },\n } as Event)\n}\n\nfunction make(state: State, tool: string, input: Record<string, unknown>): Ref {\n return {\n msg: open(state),\n part: take(state, \"part\", \"part\"),\n call: take(state, \"call\", \"call\"),\n tool,\n input,\n start: Date.now(),\n }\n}\n\nfunction startTool(state: State, ref: Ref, metadata: Record<string, unknown> = {}): void {\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: ref.part,\n sessionID: state.id,\n messageID: ref.msg,\n type: \"tool\",\n callID: ref.call,\n tool: ref.tool,\n state: {\n status: \"running\",\n input: ref.input,\n metadata,\n time: {\n start: ref.start,\n },\n },\n },\n },\n } as Event)\n}\n\nfunction askPermission(state: State, item: Permit): void {\n startTool(state, item.ref)\n\n const id = take(state, \"perm\", \"perm\")\n state.perms.set(id, {\n ref: item.ref,\n done: item.done,\n })\n\n feed(state, {\n type: \"permission.asked\",\n properties: {\n id,\n sessionID: state.id,\n permission: item.permission,\n patterns: item.patterns,\n metadata: item.metadata ?? {},\n always: item.always,\n tool: {\n messageID: item.ref.msg,\n callID: item.ref.call,\n },\n },\n } as Event)\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n title: string\n output: string\n metadata?: Record<string, unknown>\n },\n): void {\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: ref.part,\n sessionID: state.id,\n messageID: ref.msg,\n type: \"tool\",\n callID: ref.call,\n tool: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n output: output.output,\n title: output.title,\n metadata: output.metadata ?? {},\n time: {\n start: ref.start,\n end: Date.now(),\n },\n },\n },\n },\n } as Event)\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n feed(state, {\n type: \"message.part.updated\",\n properties: {\n sessionID: state.id,\n time: Date.now(),\n part: {\n id: ref.part,\n sessionID: state.id,\n messageID: ref.msg,\n type: \"tool\",\n callID: ref.call,\n tool: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error,\n metadata: {},\n time: {\n start: ref.start,\n end: Date.now(),\n },\n },\n },\n },\n } as Event)\n}\n\nfunction emitError(state: State, text: string): void {\n const event = {\n id: `session.error:${state.id}:${Date.now()}`,\n type: \"session.error\",\n properties: {\n sessionID: state.id,\n error: {\n name: \"UnknownError\",\n data: {\n message: text,\n },\n },\n },\n } satisfies Event\n feed(state, event)\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"bash\", {\n command: \"git status\",\n workdir: process.cwd(),\n description: \"Show git status\",\n })\n startTool(state, ref)\n await wait(70, signal)\n doneTool(state, ref, {\n title: \"git status\",\n output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exitCode: 0,\n },\n })\n}\n\nfunction emitWrite(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"write\", {\n filePath: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\n title: \"write\",\n output: \"\",\n metadata: {},\n })\n}\n\nfunction emitEdit(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"edit\", {\n filePath: file,\n })\n doneTool(state, ref, {\n title: \"edit\",\n output: \"\",\n metadata: {\n diff: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\n })\n}\n\nfunction emitPatch(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"patch\", {\n patchText: \"*** Begin Patch\\n*** End Patch\",\n })\n doneTool(state, ref, {\n title: \"patch\",\n output: \"\",\n metadata: {\n files: [\n {\n type: \"update\",\n filePath: file,\n relativePath: \"src/demo-format.ts\",\n diff: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n type: \"add\",\n filePath: path.join(process.cwd(), \"README-demo.md\"),\n relativePath: \"README-demo.md\",\n diff: \"@@ -0,0 +1,4 @@\\n+# Demo\\n+This is a generated preview file.\\n\",\n deletions: 0,\n },\n ],\n },\n })\n}\n\nfunction emitTask(state: State): void {\n const ref = make(state, \"task\", {\n description: \"Scan run/* for reducer touchpoints\",\n subagent_type: \"explore\",\n })\n doneTool(state, ref, {\n title: \"Reducer touchpoints found\",\n output: \"\",\n metadata: {\n toolcalls: 4,\n sessionId: \"sub_demo_1\",\n },\n })\n const part = {\n id: \"sub_demo_tool_1\",\n type: \"tool\",\n sessionID: \"sub_demo_1\",\n messageID: \"sub_demo_msg_tool\",\n callID: \"sub_demo_call_1\",\n tool: \"read\",\n state: {\n status: \"running\",\n input: {\n filePath: \"packages/cli/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n time: {\n start: Date.now(),\n },\n },\n } satisfies ToolPart\n showSubagent(state, {\n sessionID: \"sub_demo_1\",\n partID: ref.part,\n callID: ref.call,\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\n toolCalls: 4,\n commits: [\n {\n kind: \"user\",\n text: \"Scan run/* for reducer touchpoints\",\n phase: \"start\",\n source: \"system\",\n },\n {\n kind: \"reasoning\",\n text: \"Thinking: tracing reducer and footer boundaries\",\n phase: \"progress\",\n source: \"reasoning\",\n messageID: \"sub_demo_msg_reasoning\",\n partID: \"sub_demo_reasoning_1\",\n },\n {\n kind: \"tool\",\n text: \"running read\",\n phase: \"start\",\n source: \"tool\",\n messageID: \"sub_demo_msg_tool\",\n partID: \"sub_demo_tool_1\",\n tool: \"read\",\n part,\n },\n {\n kind: \"assistant\",\n text: \"Footer updates flow through stream.ts into RunFooter\",\n phase: \"progress\",\n source: \"assistant\",\n messageID: \"sub_demo_msg_text\",\n partID: \"sub_demo_text_1\",\n },\n ],\n })\n}\n\nfunction emitQuestionTool(state: State): void {\n const ref = make(state, \"question\", {\n questions: [\n {\n header: \"Style\",\n question: \"Which output style do you want to inspect?\",\n options: [\n { label: \"Diff\", description: \"Show diff block\" },\n { label: \"Code\", description: \"Show code block\" },\n ],\n multiple: false,\n },\n {\n header: \"Extras\",\n question: \"Pick extra rows\",\n options: [\n { label: \"Usage\", description: \"Add usage row\" },\n { label: \"Duration\", description: \"Add duration row\" },\n ],\n multiple: true,\n custom: true,\n },\n ],\n })\n doneTool(state, ref, {\n title: \"question\",\n output: \"\",\n metadata: {\n answers: [[\"Diff\"], [\"Usage\", \"custom-note\"]],\n },\n })\n}\n\nfunction emitPermission(state: State, kind: PermissionKind = \"edit\"): void {\n const root = process.cwd()\n const file = path.join(root, \"src\", \"demo-format.ts\")\n\n if (kind === \"bash\") {\n const command = \"git status --short\"\n const ref = make(state, \"bash\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"bash\",\n patterns: [command],\n always: [\"*\"],\n done: {\n title: \"git status --short\",\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exitCode: 0,\n },\n },\n })\n return\n }\n\n if (kind === \"read\") {\n const target = path.join(root, \"package.json\")\n const ref = make(state, \"read\", {\n filePath: target,\n offset: 1,\n limit: 80,\n })\n askPermission(state, {\n ref,\n permission: \"read\",\n patterns: [target],\n always: [target],\n done: {\n title: \"read\",\n output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"task\") {\n const ref = make(state, \"task\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n subagent_type: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"task\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n title: \"Footer spacing checked\",\n output: \"\",\n metadata: {\n toolcalls: 3,\n sessionId: \"sub_demo_perm_1\",\n },\n },\n })\n return\n }\n\n if (kind === \"external\") {\n const dir = path.join(path.dirname(root), \"demo-shared\")\n const target = path.join(dir, \"README.md\")\n const ref = make(state, \"read\", {\n filePath: target,\n offset: 1,\n limit: 40,\n })\n askPermission(state, {\n ref,\n permission: \"external_directory\",\n patterns: [`${dir}/**`],\n metadata: {\n parentDir: dir,\n filepath: target,\n },\n always: [`${dir}/**`],\n done: {\n title: \"read\",\n output: `1: # External demo\\n2: Shared preview file\\nPath: ${target}`,\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"doom\") {\n const ref = make(state, \"task\", {\n description: \"Retry the formatter after repeated failures\",\n subagent_type: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\n title: \"Retry allowed\",\n output: \"Continuing after repeated failures.\\n\",\n metadata: {},\n },\n })\n return\n }\n\n const diff = \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\"\n const ref = make(state, \"edit\", {\n filePath: file,\n filepath: file,\n diff,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n title: \"edit\",\n output: \"\",\n metadata: {\n diff,\n },\n },\n })\n}\n\nfunction emitQuestion(state: State, kind: QuestionKind = \"multi\"): void {\n const questions = (() => {\n if (kind === \"single\") {\n return [\n {\n header: \"Mode\",\n question: \"Which footer should be the reference for spacing checks?\",\n options: [\n { label: \"Permission\", description: \"Inspect the permission footer\" },\n { label: \"Question\", description: \"Keep this question footer open\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: false,\n },\n ]\n }\n\n if (kind === \"checklist\") {\n return [\n {\n header: \"Checks\",\n question: \"Select the direct-mode cases you want to inspect next\",\n options: [\n { label: \"Diff\", description: \"Show an edit diff in the footer\" },\n { label: \"Task\", description: \"Show a structured task summary\" },\n { label: \"Error\", description: \"Show an error transcript row\" },\n ],\n multiple: true,\n custom: false,\n },\n ]\n }\n\n if (kind === \"custom\") {\n return [\n {\n header: \"Reply\",\n question: \"What custom answer should appear in the footer preview?\",\n options: [\n { label: \"Short note\", description: \"Keep the answer to one line\" },\n { label: \"Wrapped note\", description: \"Use a longer answer to test wrapping\" },\n ],\n multiple: false,\n custom: true,\n },\n ]\n }\n\n return [\n {\n header: \"Layout\",\n question: \"Which footer view should stay active while testing?\",\n options: [\n { label: \"Prompt\", description: \"Return to prompt\" },\n { label: \"Question\", description: \"Keep question open\" },\n ],\n multiple: false,\n },\n {\n header: \"Rows\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit edit diff\" },\n { label: \"Task\", description: \"Emit task card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n })()\n\n const ref = make(state, \"question\", { questions })\n startTool(state, ref)\n\n const id = take(state, \"ask\", \"ask\")\n state.asks.set(id, { ref })\n\n feed(state, {\n type: \"question.asked\",\n properties: {\n id,\n sessionID: state.id,\n questions,\n tool: {\n messageID: ref.msg,\n callID: ref.call,\n },\n },\n } as Event)\n}\n\nasync function emitFmt(state: State, kind: string, body: string, signal?: AbortSignal): Promise<boolean> {\n if (kind === \"text\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"markdown\" || kind === \"md\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"table\") {\n await emitText(state, body || SAMPLE_TABLE, signal)\n return true\n }\n\n if (kind === \"reasoning\") {\n await emitReasoning(state, body || \"Planning next steps [REDACTED] while preserving reducer ordering.\", signal)\n return true\n }\n\n if (kind === \"bash\") {\n await emitBash(state, signal)\n return true\n }\n\n if (kind === \"write\") {\n emitWrite(state)\n return true\n }\n\n if (kind === \"edit\") {\n emitEdit(state)\n return true\n }\n\n if (kind === \"patch\") {\n emitPatch(state)\n return true\n }\n\n if (kind === \"task\") {\n emitTask(state)\n return true\n }\n\n if (kind === \"question\") {\n emitQuestionTool(state)\n return true\n }\n\n if (kind === \"error\") {\n emitError(state, body || \"demo error event\")\n return true\n }\n\n if (kind === \"mix\") {\n await emitText(state, SAMPLE_MARKDOWN, signal)\n await wait(50, signal)\n await emitReasoning(state, \"Thinking through formatter edge cases [REDACTED].\", signal)\n await wait(50, signal)\n await emitBash(state, signal)\n emitWrite(state)\n emitEdit(state)\n emitPatch(state)\n emitTask(state)\n emitQuestionTool(state)\n emitError(state, \"demo mixed scenario error\")\n return true\n }\n\n return false\n}\n\nfunction intro(state: State): void {\n note(\n state.footer,\n [\n \"Demo slash commands enabled for interactive mode.\",\n `- /permission [kind] (${PERMISSIONS.join(\", \")})`,\n `- /question [kind] (${QUESTIONS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission bash\",\n \"- /question custom\",\n \"- /fmt markdown\",\n \"- /fmt table\",\n \"- /fmt text your custom text\",\n ].join(\"\\n\"),\n )\n}\n\nexport function createRunDemo(input: Input) {\n const state: State = {\n id: input.sessionID,\n thinking: input.thinking,\n data: createSessionData(),\n footer: input.footer,\n limits: input.limits,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n ask: 0,\n perms: new Map(),\n asks: new Map(),\n }\n\n const start = async (): Promise<void> => {\n intro(state)\n }\n\n const prompt = async (line: RunPrompt, signal?: AbortSignal): Promise<boolean> => {\n const text = line.text.trim()\n const list = text.split(/\\s+/)\n const cmd = list[0] || \"\"\n\n clearSubagent(state.footer)\n\n if (cmd === \"/help\") {\n intro(state)\n return true\n }\n\n if (cmd === \"/permission\") {\n const kind = permissionKind(list[1])\n if (!kind) {\n note(state.footer, `Pick a permission kind: ${PERMISSIONS.join(\", \")}`)\n return true\n }\n\n emitPermission(state, kind)\n return true\n }\n\n if (cmd === \"/question\") {\n const kind = questionKind(list[1])\n if (!kind) {\n note(state.footer, `Pick a question kind: ${QUESTIONS.join(\", \")}`)\n return true\n }\n\n emitQuestion(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[1] || \"\").toLowerCase()\n const body = list.slice(2).join(\" \")\n if (!kind) {\n note(state.footer, `Pick a kind: ${KINDS.join(\", \")}`)\n return true\n }\n\n const ok = await emitFmt(state, kind, body, signal)\n if (ok) {\n return true\n }\n\n note(state.footer, `Unknown kind \"${kind}\". Use: ${KINDS.join(\", \")}`)\n return true\n }\n\n return false\n }\n\n const permission = (input: PermissionReply): boolean => {\n const item = state.perms.get(input.requestID)\n if (!item || !input.reply) {\n return false\n }\n\n state.perms.delete(input.requestID)\n const event = {\n id: `permission.replied:${input.requestID}:${Date.now()}`,\n type: \"permission.replied\",\n properties: {\n sessionID: state.id,\n requestID: input.requestID,\n reply: input.reply,\n },\n } satisfies Event\n feed(state, event)\n\n if (input.reply === \"reject\") {\n failTool(state, item.ref, input.message || \"permission rejected\")\n return true\n }\n\n doneTool(state, item.ref, item.done)\n return true\n }\n\n const questionReply = (input: QuestionReply): boolean => {\n const ask = state.asks.get(input.requestID)\n if (!ask || !input.answers) {\n return false\n }\n\n state.asks.delete(input.requestID)\n const event = {\n id: `question.replied:${input.requestID}:${Date.now()}`,\n type: \"question.replied\",\n properties: {\n sessionID: state.id,\n requestID: input.requestID,\n answers: input.answers,\n },\n } satisfies Event\n feed(state, event)\n doneTool(state, ask.ref, {\n title: \"question\",\n output: \"\",\n metadata: {\n answers: input.answers,\n },\n })\n return true\n }\n\n const questionReject = (input: QuestionReject): boolean => {\n const ask = state.asks.get(input.requestID)\n if (!ask) {\n return false\n }\n\n state.asks.delete(input.requestID)\n feed(state, {\n type: \"question.rejected\",\n properties: {\n sessionID: state.id,\n requestID: input.requestID,\n },\n } as Event)\n failTool(state, ask.ref, \"question rejected\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n questionReply,\n questionReject,\n }\n}\n"
],
"mappings": "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",
"debugId": "08C7AF4A98C7CA2364756E2164756E21",
"names": []
}

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

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

{
"version": 3,
"sources": ["src/commands/handlers/mcp/logout.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { createOpencodeClient } from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.v2.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n"
],
"mappings": ";w2BAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,GAAG,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EAC3G,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "F98BF6DAAF09377A64756E2164756E21",
"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": ";yvBAGA,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,0CAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF",
"debugId": "436F6D3CEBB3311E64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/auth.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n createOpencodeClient,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpencodeClient,\n} from \"@opencode-ai/sdk/v2/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.start(options))\n const client = createOpencodeClient({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.v2.integration.connect.oauth({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data?.data\n if (!attempt) return yield* Effect.fail(new Error(started.error?.message ?? \"Failed to start OAuth attempt\"))\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpencodeClient,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const response = yield* Effect.promise(() => client.v2.integration.attempt.status({ attemptID, location }))\n const status = response.data?.data\n if (!status || status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, attemptID)\n }\n return status\n })\n"
],
"mappings": ";w2BAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,MAAM,CAAO,GACjD,EAAS,EAAqB,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAE3F,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAEzG,IAAM,EAAU,MAAO,EAAO,QAAQ,IACpC,EAAO,GAAG,YAAY,QAAQ,MAAM,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAClH,EACM,EAAU,EAAQ,MAAM,KAC9B,GAAI,CAAC,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,EAAQ,OAAO,SAAW,+BAA+B,CAAC,EAC5G,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAQ,SAAS,EACpD,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CAEtB,IAAM,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,GAAG,YAAY,QAAQ,OAAO,CAAE,YAAW,UAAS,CAAC,CAAC,GAClF,MAAM,KAC9B,GAAI,CAAC,GAAU,EAAO,SAAW,UAE/B,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,CAAS,EAEtC,OAAO,EACR",
"debugId": "CE9FAE5F94DF8FFE64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/util/locale.ts"],
"sourcesContent": [
"export function titlecase(str: string) {\n return str.replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport function time(input: number): string {\n const date = new Date(input)\n return date.toLocaleTimeString(undefined, { timeStyle: \"short\" })\n}\n\nexport function datetime(input: number): string {\n const date = new Date(input)\n const localTime = time(input)\n const localDate = date.toLocaleDateString()\n return `${localTime} · ${localDate}`\n}\n\nexport function todayTimeOrDateTime(input: number): string {\n const date = new Date(input)\n const now = new Date()\n const isToday =\n date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth() && date.getDate() === now.getDate()\n\n if (isToday) {\n return time(input)\n } else {\n return datetime(input)\n }\n}\n\nexport function number(num: number): string {\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + \"M\"\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + \"K\"\n }\n return num.toString()\n}\n\nexport function duration(input: number) {\n if (input < 1000) {\n return `${input}ms`\n }\n if (input < 60000) {\n return `${(input / 1000).toFixed(1)}s`\n }\n if (input < 3600000) {\n const minutes = Math.floor(input / 60000)\n const seconds = Math.floor((input % 60000) / 1000)\n return `${minutes}m ${seconds}s`\n }\n if (input < 86400000) {\n const hours = Math.floor(input / 3600000)\n const minutes = Math.floor((input % 3600000) / 60000)\n return `${hours}h ${minutes}m`\n }\n const days = Math.floor(input / 86400000)\n const hours = Math.floor((input % 86400000) / 3600000)\n return `${days}d ${hours}h`\n}\n\nexport function truncate(str: string, len: number): string {\n if (str.length <= len) return str\n return str.slice(0, len - 1) + \"…\"\n}\n\nexport function truncateLeft(str: string, len: number): string {\n if (str.length <= len) return str\n return \"…\" + str.slice(-(len - 1))\n}\n\nexport function truncateMiddle(str: string, maxLength: number = 35): string {\n if (str.length <= maxLength) return str\n\n const ellipsis = \"…\"\n const keepStart = Math.ceil((maxLength - ellipsis.length) / 2)\n const keepEnd = Math.floor((maxLength - ellipsis.length) / 2)\n\n return str.slice(0, keepStart) + ellipsis + str.slice(-keepEnd)\n}\n\nexport function pluralize(count: number, singular: string, plural: string): string {\n const template = count === 1 ? singular : plural\n return template.replace(\"{}\", count.toString())\n}\n\nexport * as Locale from \"./locale\"\n"
],
"mappings": ";wPAAO,SAAS,CAAS,CAAC,EAAa,CACrC,OAAO,EAAI,QAAQ,QAAS,CAAC,IAAM,EAAE,YAAY,CAAC,EAG7C,SAAS,CAAI,CAAC,EAAuB,CAE1C,OADa,IAAI,KAAK,CAAK,EACf,mBAAmB,OAAW,CAAE,UAAW,OAAQ,CAAC,EAG3D,SAAS,CAAQ,CAAC,EAAuB,CAC9C,IAAM,EAAO,IAAI,KAAK,CAAK,EACrB,EAAY,EAAK,CAAK,EACtB,EAAY,EAAK,mBAAmB,EAC1C,MAAO,GAAG,UAAc,IAGnB,SAAS,CAAmB,CAAC,EAAuB,CACzD,IAAM,EAAO,IAAI,KAAK,CAAK,EACrB,EAAM,IAAI,KAIhB,GAFE,EAAK,YAAY,IAAM,EAAI,YAAY,GAAK,EAAK,SAAS,IAAM,EAAI,SAAS,GAAK,EAAK,QAAQ,IAAM,EAAI,QAAQ,EAGjH,OAAO,EAAK,CAAK,EAEjB,YAAO,EAAS,CAAK,EAIlB,SAAS,CAAM,CAAC,EAAqB,CAC1C,GAAI,GAAO,IACT,OAAQ,EAAM,KAAS,QAAQ,CAAC,EAAI,IAC/B,QAAI,GAAO,KAChB,OAAQ,EAAM,MAAM,QAAQ,CAAC,EAAI,IAEnC,OAAO,EAAI,SAAS,EAGf,SAAS,CAAQ,CAAC,EAAe,CACtC,GAAI,EAAQ,KACV,MAAO,GAAG,MAEZ,GAAI,EAAQ,MACV,MAAO,IAAI,EAAQ,MAAM,QAAQ,CAAC,KAEpC,GAAI,EAAQ,QAAS,CACnB,IAAM,EAAU,KAAK,MAAM,EAAQ,KAAK,EAClC,EAAU,KAAK,MAAO,EAAQ,MAAS,IAAI,EACjD,MAAO,GAAG,MAAY,KAExB,GAAI,EAAQ,SAAU,CACpB,IAAM,EAAQ,KAAK,MAAM,EAAQ,OAAO,EAClC,EAAU,KAAK,MAAO,EAAQ,QAAW,KAAK,EACpD,MAAO,GAAG,MAAU,KAEtB,IAAM,EAAO,KAAK,MAAM,EAAQ,QAAQ,EAClC,EAAQ,KAAK,MAAO,EAAQ,SAAY,OAAO,EACrD,MAAO,GAAG,MAAS,KAGd,SAAS,CAAQ,CAAC,EAAa,EAAqB,CACzD,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,OAAO,EAAI,MAAM,EAAG,EAAM,CAAC,EAAI,SAG1B,SAAS,CAAY,CAAC,EAAa,EAAqB,CAC7D,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,MAAO,SAAK,EAAI,MAAM,EAAE,EAAM,EAAE,EAG3B,SAAS,CAAc,CAAC,EAAa,EAAoB,GAAY,CAC1E,GAAI,EAAI,QAAU,EAAW,OAAO,EAEpC,IAAM,EAAW,SACX,EAAY,KAAK,MAAM,EAAY,EAAS,QAAU,CAAC,EACvD,EAAU,KAAK,OAAO,EAAY,EAAS,QAAU,CAAC,EAE5D,OAAO,EAAI,MAAM,EAAG,CAAS,EAAI,EAAW,EAAI,MAAM,CAAC,CAAO,EAGzD,SAAS,CAAS,CAAC,EAAe,EAAkB,EAAwB,CAEjF,OADiB,IAAU,EAAI,EAAW,GAC1B,QAAQ,KAAM,EAAM,SAAS,CAAC",
"debugId": "E0A6C13496F96CF364756E2164756E21",
"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": ";2wBAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "475D37DA67FC5ED164756E2164756E21",
"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": ";8vBAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,GAAG,EACrC,CACH",
"debugId": "821D0D2E47DE645D64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "3919E83709574D1464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini/session-data.ts", "src/mini/stream.ts"],
"sourcesContent": [
"// Core reducer for direct interactive mode.\n//\n// Takes raw SDK events and produces two outputs:\n// - StreamCommit[]: append-only scrollback entries (text, tool, error, etc.)\n// - FooterOutput: status bar patches and view transitions (permission, question)\n//\n// The reducer mutates SessionData in place for performance but has no\n// external side effects -- no IO, no footer calls. The demo runtime\n// (demo.ts) feeds events in and forwards output to the footer through\n// stream.ts; the current transport reuses the blocker helpers below.\n//\n// Key design decisions:\n//\n// - Text parts buffer in `data.text` until their message role is confirmed as\n// \"assistant\". This prevents echoing user-role text parts. The `ready()`\n// check gates output: if we see a text delta before the message.updated\n// event that tells us the role, we stash it and flush later via `replay()`.\n//\n// - Tool echo stripping: bash tools may echo their own output in the next\n// assistant text part. `stashEcho()` records completed bash output, and\n// `stripEcho()` removes it from the start of the next assistant chunk.\n//\n// - Permission and question requests queue in `data.permissions` and\n// `data.questions`. The footer shows whichever is first. When a reply\n// event arrives, the queue entry is removed and the footer falls back\n// to the next pending request or to the prompt view.\nimport type { Event, PermissionRequest, QuestionRequest, ToolPart } from \"@opencode-ai/sdk/v2\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport { toolView } from \"./tool\"\nimport type { FooterOutput, FooterPatch, FooterView, StreamCommit } from \"./types\"\n\nconst money = new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n})\n\ntype Tokens = {\n input?: number\n output?: number\n reasoning?: number\n cache?: {\n read?: number\n write?: number\n }\n}\n\ntype PartKind = \"assistant\" | \"reasoning\" | \"user\"\ntype MessageRole = \"assistant\" | \"user\"\ntype Dict = Record<string, unknown>\ntype SessionCommit = StreamCommit\n\n// Mutable accumulator for the reducer. Each field tracks a different aspect\n// of the stream so we can produce correct incremental output:\n//\n// - ids: parts and error keys we've already committed (dedup guard)\n// - tools: tool parts we've emitted a \"start\" for but not yet completed\n// - call: tool call inputs, keyed by msg:call, for enriching permission views\n// - role: message ID → \"assistant\" | \"user\", learned from message.updated\n// - msg: part ID → message ID\n// - part: part ID → \"assistant\" | \"reasoning\" (text parts only)\n// - text: part ID → full accumulated text so far\n// - sent: part ID → byte offset of last flushed text (for incremental output)\n// - visible: part ID → rendered text for an active part after display transforms\n// - end: part IDs whose time.end has arrived (part is finished)\n// - shell: shell ID → chosen transcript source for direct shell calls\n// - echo: message ID → bash outputs to strip from the next assistant chunk\ntype ShellCall = {\n source: \"shell\" | \"tool\"\n command?: string\n}\n\nexport type SessionData = {\n includeUserText: boolean\n announced: boolean\n ids: Set<string>\n tools: Set<string>\n call: Map<string, Dict>\n shell: Map<string, ShellCall>\n permissions: PermissionRequest[]\n questions: QuestionRequest[]\n role: Map<string, MessageRole>\n msg: Map<string, string>\n part: Map<string, PartKind>\n text: Map<string, string>\n sent: Map<string, number>\n visible: Map<string, string>\n end: Set<string>\n echo: Map<string, Set<string>>\n}\n\nexport type SessionDataInput = {\n data: SessionData\n event: Event\n sessionID: string\n thinking: boolean\n limits: Record<string, number>\n}\n\nexport type SessionDataOutput = {\n data: SessionData\n commits: SessionCommit[]\n footer?: FooterOutput\n}\n\nexport function createSessionData(\n input: {\n includeUserText?: boolean\n } = {},\n): SessionData {\n return {\n includeUserText: input.includeUserText ?? false,\n announced: false,\n ids: new Set(),\n tools: new Set(),\n call: new Map(),\n shell: new Map(),\n permissions: [],\n questions: [],\n role: new Map(),\n msg: new Map(),\n part: new Map(),\n text: new Map(),\n sent: new Map(),\n visible: new Map(),\n end: new Set(),\n echo: new Map(),\n }\n}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction formatUsage(\n tokens: Tokens | undefined,\n limit: number | undefined,\n cost: number | undefined,\n): string | undefined {\n const total =\n (tokens?.input ?? 0) +\n (tokens?.output ?? 0) +\n (tokens?.reasoning ?? 0) +\n (tokens?.cache?.read ?? 0) +\n (tokens?.cache?.write ?? 0)\n\n if (total <= 0) {\n if (typeof cost === \"number\" && cost > 0) {\n return money.format(cost)\n }\n return undefined\n }\n\n const text =\n limit && limit > 0 ? `${Locale.number(total)} (${Math.round((total / limit) * 100)}%)` : Locale.number(total)\n\n if (typeof cost === \"number\" && cost > 0) {\n return `${text} · ${money.format(cost)}`\n }\n\n return text\n}\n\nexport function formatError(error: {\n name?: string\n message?: string\n data?: {\n message?: string\n }\n}): string {\n if (error.data?.message) {\n return error.data.message\n }\n\n if (error.message) {\n return error.message\n }\n\n if (error.name) {\n return error.name\n }\n\n return \"unknown error\"\n}\n\nfunction isAbort(error: { name?: string } | undefined): boolean {\n return error?.name === \"MessageAbortedError\"\n}\n\nfunction msgErr(id: string): string {\n return `msg:${id}:error`\n}\n\nfunction patch(patch?: FooterPatch, view?: FooterView): FooterOutput | undefined {\n if (!patch && !view) {\n return undefined\n }\n\n return {\n patch,\n view,\n }\n}\n\nfunction out(data: SessionData, commits: SessionCommit[], footer?: FooterOutput): SessionDataOutput {\n if (!footer) {\n return {\n data,\n commits,\n }\n }\n\n return {\n data,\n commits,\n footer,\n }\n}\n\nexport function pickBlockerView(input: { permission?: PermissionRequest; question?: QuestionRequest }): FooterView {\n if (input.permission) {\n return { type: \"permission\", request: input.permission }\n }\n\n if (input.question) {\n return { type: \"question\", request: input.question }\n }\n\n return { type: \"prompt\" }\n}\n\nexport function blockerStatus(view: FooterView) {\n if (view.type === \"permission\") {\n return \"awaiting permission\"\n }\n\n if (view.type === \"question\") {\n return \"awaiting answer\"\n }\n\n return \"\"\n}\n\nfunction pickSessionView(data: SessionData): FooterView {\n return pickBlockerView({\n permission: data.permissions[0],\n question: data.questions[0],\n })\n}\n\nfunction queueFooter(data: SessionData): FooterOutput {\n const view = pickSessionView(data)\n\n return {\n view,\n patch: { status: blockerStatus(view) },\n }\n}\n\nfunction queueOut(data: SessionData, commits: SessionCommit[]): SessionDataOutput {\n return out(data, commits, queueFooter(data))\n}\n\nfunction upsert<T extends { id: string }>(list: T[], item: T) {\n const idx = list.findIndex((entry) => entry.id === item.id)\n if (idx === -1) {\n list.push(item)\n return\n }\n\n list[idx] = item\n}\n\nfunction remove(list: Array<{ id: string }>, id: string): boolean {\n const idx = list.findIndex((entry) => entry.id === id)\n if (idx === -1) {\n return false\n }\n\n list.splice(idx, 1)\n return true\n}\n\nfunction key(msg: string, call: string): string {\n return `${msg}:${call}`\n}\n\nfunction enrichPermission(data: SessionData, request: PermissionRequest): PermissionRequest {\n if (!request.tool) {\n return request\n }\n\n const input = data.call.get(key(request.tool.messageID, request.tool.callID))\n if (!input) {\n return request\n }\n\n const meta = request.metadata ?? {}\n if (meta.input === input) {\n return request\n }\n\n return {\n ...request,\n metadata: {\n ...meta,\n input,\n },\n }\n}\n\n// Updates the active permission request when the matching tool part gets\n// new input (e.g., a diff). This keeps the permission UI in sync with the\n// tool's evolving state. Only triggers a footer update if the currently\n// displayed permission was the one that changed.\nfunction syncPermission(data: SessionData, part: ToolPart): FooterOutput | undefined {\n data.call.set(key(part.messageID, part.callID), part.state.input)\n if (data.permissions.length === 0) {\n return undefined\n }\n\n let changed = false\n let active = false\n data.permissions = data.permissions.map((request, index) => {\n if (!request.tool || request.tool.messageID !== part.messageID || request.tool.callID !== part.callID) {\n return request\n }\n\n const next = enrichPermission(data, request)\n if (next === request) {\n return request\n }\n\n changed = true\n active ||= index === 0\n return next\n })\n\n if (!changed || !active) {\n return undefined\n }\n\n return {\n view: pickSessionView(data),\n }\n}\n\n// Question tool replies can complete without a matching question.replied event.\n// When that happens, drop the recovered pending request tied to this tool call so\n// the footer can return to the next blocker or to the prompt.\nfunction syncQuestion(data: SessionData, part: ToolPart): FooterOutput | undefined {\n if (part.tool !== \"question\") {\n return undefined\n }\n\n if (part.state.status !== \"completed\" && part.state.status !== \"error\") {\n return undefined\n }\n\n const next = data.questions.filter(\n (request) => request.tool?.messageID !== part.messageID || request.tool?.callID !== part.callID,\n )\n if (next.length === data.questions.length) {\n return undefined\n }\n\n data.questions = next\n return queueFooter(data)\n}\n\nfunction toolStatus(part: ToolPart): string {\n if (part.tool !== \"task\") {\n return `running ${part.tool}`\n }\n\n const state = part.state as {\n input?: {\n description?: unknown\n subagent_type?: unknown\n }\n }\n const desc = state.input?.description\n if (typeof desc === \"string\" && desc.trim()) {\n return `running ${desc.trim()}`\n }\n\n const type = state.input?.subagent_type\n if (typeof type === \"string\" && type.trim()) {\n return `running ${type.trim()}`\n }\n\n return \"running task\"\n}\n\n// Returns true if we can flush this part's text to scrollback.\n//\n// We gate on the message role being \"assistant\" because user-role messages\n// also contain text parts (the user's own input) which we don't want to\n// echo. If we haven't received the message.updated event yet, we return\n// false and the text stays buffered until replay() flushes it.\nfunction ready(data: SessionData, partID: string): boolean {\n const msg = data.msg.get(partID)\n if (!msg) {\n return true\n }\n\n const role = data.role.get(msg)\n if (!role) {\n return false\n }\n\n if (role === \"assistant\") {\n return true\n }\n\n return data.includeUserText && role === \"user\"\n}\n\nfunction syncText(data: SessionData, partID: string, next: string) {\n const prev = data.text.get(partID) ?? \"\"\n if (!next) {\n return prev\n }\n\n if (!prev || next.length >= prev.length) {\n data.text.set(partID, next)\n return next\n }\n\n return prev\n}\n\n// Records bash tool output for echo stripping. Some models echo bash output\n// verbatim at the start of their next text part. We save both the raw and\n// trimmed forms so stripEcho() can match either.\nfunction stashEcho(data: SessionData, part: ToolPart) {\n if (part.tool !== \"bash\") {\n return\n }\n\n if (typeof part.messageID !== \"string\" || !part.messageID) {\n return\n }\n\n const output = \"output\" in part.state ? part.state.output : undefined\n if (typeof output !== \"string\") {\n return\n }\n\n const text = output.replace(/^\\n+/, \"\")\n if (!text.trim()) {\n return\n }\n\n const set = data.echo.get(part.messageID) ?? new Set<string>()\n set.add(text)\n const trim = text.replace(/\\n+$/, \"\")\n if (trim && trim !== text) {\n set.add(trim)\n }\n data.echo.set(part.messageID, set)\n}\n\nfunction stripEcho(data: SessionData, msg: string | undefined, chunk: string): string {\n if (!msg) {\n return chunk\n }\n\n const set = data.echo.get(msg)\n if (!set || set.size === 0) {\n return chunk\n }\n\n data.echo.delete(msg)\n const list = [...set].sort((a, b) => b.length - a.length)\n for (const item of list) {\n if (!item || !chunk.startsWith(item)) {\n continue\n }\n\n return chunk.slice(item.length).replace(/^\\n+/, \"\")\n }\n\n return chunk\n}\n\nfunction flushPart(data: SessionData, commits: SessionCommit[], partID: string, interrupted = false) {\n const kind = data.part.get(partID)\n if (!kind) {\n return\n }\n\n const text = data.text.get(partID) ?? \"\"\n const sent = data.sent.get(partID) ?? 0\n let chunk = text.slice(sent)\n const msg = data.msg.get(partID)\n\n if (sent === 0) {\n chunk = chunk.replace(/^\\n+/, \"\")\n // Some models emit a standalone whitespace token before real content.\n // Keep buffering until we have visible text so scrollback doesn't get a blank row.\n if (!chunk.trim()) {\n return\n }\n if (kind === \"reasoning\" && chunk) {\n chunk = `Thinking: ${chunk.replace(/\\[REDACTED\\]/g, \"\")}`\n }\n if (kind === \"assistant\" && chunk) {\n chunk = stripEcho(data, msg, chunk)\n if (!chunk.trim()) {\n return\n }\n }\n }\n\n if (chunk) {\n data.sent.set(partID, text.length)\n data.visible.set(partID, (data.visible.get(partID) ?? \"\") + chunk)\n commits.push({\n kind,\n text: chunk,\n phase: \"progress\",\n source: kind === \"user\" ? \"system\" : kind,\n messageID: msg,\n partID,\n })\n }\n\n if (!interrupted) {\n return\n }\n\n commits.push({\n kind,\n text: \"\",\n phase: \"final\",\n source: kind === \"user\" ? \"system\" : kind,\n messageID: msg,\n partID,\n interrupted: true,\n })\n}\n\nfunction drop(data: SessionData, partID: string) {\n data.part.delete(partID)\n data.text.delete(partID)\n data.sent.delete(partID)\n data.visible.delete(partID)\n data.msg.delete(partID)\n data.end.delete(partID)\n}\n\n// Called when we learn a message's role (from message.updated). Flushes any\n// buffered text parts that were waiting on role confirmation. User-role\n// parts are silently dropped.\nfunction replay(data: SessionData, commits: SessionCommit[], messageID: string, role: MessageRole, thinking: boolean) {\n for (const [partID, msg] of data.msg.entries()) {\n if (msg !== messageID || data.ids.has(partID)) {\n continue\n }\n\n if (role === \"user\" && !data.includeUserText) {\n data.ids.add(partID)\n drop(data, partID)\n continue\n }\n\n const kind = data.part.get(partID)\n if (!kind) {\n continue\n }\n\n if (role === \"user\" && kind === \"assistant\") {\n data.part.set(partID, \"user\")\n }\n\n if (kind === \"reasoning\" && !thinking) {\n if (data.end.has(partID)) {\n data.ids.add(partID)\n }\n drop(data, partID)\n continue\n }\n\n flushPart(data, commits, partID)\n\n if (!data.end.has(partID)) {\n continue\n }\n\n data.ids.add(partID)\n drop(data, partID)\n }\n}\n\nfunction toolCommit(\n part: ToolPart,\n next: Pick<SessionCommit, \"text\" | \"phase\" | \"toolState\"> & { toolError?: string },\n): SessionCommit {\n return {\n kind: \"tool\",\n source: \"tool\",\n messageID: part.messageID,\n partID: part.id,\n tool: part.tool,\n part,\n ...next,\n }\n}\n\nfunction shellPartID(shellID: string): string {\n return `shell:${shellID}`\n}\n\nfunction claimShell(data: SessionData, shellID: string, source: ShellCall[\"source\"], command?: string): ShellCall {\n const current = data.shell.get(shellID)\n if (current) {\n if (command && !current.command) {\n current.command = command\n }\n\n return current\n }\n\n const next = {\n source,\n ...(command ? { command } : {}),\n } satisfies ShellCall\n data.shell.set(shellID, next)\n return next\n}\n\nfunction bashCommand(part: ToolPart): string | undefined {\n if (part.tool !== \"bash\") {\n return undefined\n }\n\n const input = part.state.input\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n return undefined\n }\n\n const command = Reflect.get(input, \"command\")\n return typeof command === \"string\" ? command : undefined\n}\n\nfunction shellCommit(\n input: {\n callID: string\n command: string\n },\n next: Pick<SessionCommit, \"text\" | \"phase\" | \"toolState\">,\n): SessionCommit {\n return {\n kind: \"tool\",\n source: \"tool\",\n partID: shellPartID(input.callID),\n tool: \"bash\",\n shell: input,\n ...next,\n }\n}\n\nfunction startShell(callID: string, command: string): SessionCommit {\n return shellCommit(\n {\n callID,\n command,\n },\n {\n text: \"running shell\",\n phase: \"start\",\n toolState: \"running\",\n },\n )\n}\n\nfunction doneShell(callID: string, command: string, output: string): SessionCommit {\n return shellCommit(\n {\n callID,\n command,\n },\n {\n text: output,\n phase: \"progress\",\n toolState: \"completed\",\n },\n )\n}\n\nfunction startTool(part: ToolPart): SessionCommit {\n return toolCommit(part, {\n text: toolStatus(part),\n phase: \"start\",\n toolState: \"running\",\n })\n}\n\nfunction doneTool(part: ToolPart): SessionCommit {\n return toolCommit(part, {\n text: \"\",\n phase: \"final\",\n toolState: \"completed\",\n })\n}\n\nfunction failTool(part: ToolPart, text: string): SessionCommit {\n return toolCommit(part, {\n text,\n phase: \"final\",\n toolState: \"error\",\n toolError: text,\n })\n}\n\n// The main reducer. Takes one SDK event and returns scrollback commits and\n// footer updates. Called once per event from the stream transport's watch loop.\n//\n// Event handling follows the SDK event types:\n// message.updated → learn role, flush buffered parts, track usage\n// message.part.delta → accumulate text, flush if ready\n// message.part.updated → handle text/reasoning/tool state transitions\n// permission.* → manage the permission queue, drive footer view\n// question.* → manage the question queue, drive footer view\n// session.error → emit error scrollback entry\nexport function reduceSessionData(input: SessionDataInput): SessionDataOutput {\n const commits: SessionCommit[] = []\n const data = input.data\n const event = input.event\n\n if (event.type === \"session.shell.started\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n const shell = claimShell(data, event.properties.shell.id, \"shell\", event.properties.shell.command)\n if (shell.source !== \"shell\") {\n return out(data, commits)\n }\n\n const partID = shellPartID(event.properties.shell.id)\n if (data.ids.has(partID) || data.tools.has(partID)) {\n return out(data, commits, patch({ status: \"running shell\" }))\n }\n\n data.tools.add(partID)\n commits.push(startShell(event.properties.shell.id, shell.command ?? event.properties.shell.command))\n return out(data, commits, patch({ status: \"running shell\" }))\n }\n\n if (event.type === \"session.shell.ended\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n const shell = claimShell(data, event.properties.shell.id, \"shell\")\n if (shell.source !== \"shell\") {\n return out(data, commits)\n }\n\n const partID = shellPartID(event.properties.shell.id)\n const seen = data.tools.has(partID)\n const command = shell.command ?? \"\"\n data.tools.delete(partID)\n if (data.ids.has(partID)) {\n return out(data, commits)\n }\n\n if (!seen && command) {\n commits.push(startShell(event.properties.shell.id, command))\n }\n\n data.ids.add(partID)\n commits.push(doneShell(event.properties.shell.id, command, event.properties.output.output))\n return out(data, commits)\n }\n\n if (event.type === \"message.updated\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n const info = event.properties.info\n if (typeof info.id === \"string\") {\n data.role.set(info.id, info.role)\n replay(data, commits, info.id, info.role, input.thinking)\n }\n\n if (info.role !== \"assistant\") {\n return out(data, commits)\n }\n\n let next: FooterPatch | undefined\n if (!data.announced) {\n data.announced = true\n next = { status: \"assistant responding\" }\n }\n\n const usage = formatUsage(\n info.tokens,\n input.limits[modelKey(info.providerID, info.modelID)],\n typeof info.cost === \"number\" ? info.cost : undefined,\n )\n if (usage) {\n next = {\n ...next,\n usage,\n }\n }\n\n if (typeof info.id === \"string\" && info.error && !isAbort(info.error) && !data.ids.has(msgErr(info.id))) {\n data.ids.add(msgErr(info.id))\n commits.push({\n kind: \"error\",\n text: formatError(info.error),\n phase: \"start\",\n source: \"system\",\n messageID: info.id,\n })\n }\n\n return out(data, commits, patch(next))\n }\n\n if (event.type === \"message.part.delta\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (\n typeof event.properties.partID !== \"string\" ||\n typeof event.properties.field !== \"string\" ||\n typeof event.properties.delta !== \"string\"\n ) {\n return out(data, commits)\n }\n\n if (event.properties.field !== \"text\") {\n return out(data, commits)\n }\n\n const partID = event.properties.partID\n if (data.ids.has(partID)) {\n return out(data, commits)\n }\n\n if (typeof event.properties.messageID === \"string\") {\n data.msg.set(partID, event.properties.messageID)\n }\n\n const text = data.text.get(partID) ?? \"\"\n data.text.set(partID, text + event.properties.delta)\n\n const kind = data.part.get(partID)\n if (!kind) {\n return out(data, commits)\n }\n\n if (kind === \"reasoning\" && !input.thinking) {\n return out(data, commits)\n }\n\n if (!ready(data, partID)) {\n return out(data, commits)\n }\n\n flushPart(data, commits, partID)\n return out(data, commits)\n }\n\n if (event.type === \"message.part.updated\") {\n const part = event.properties.part\n if (part.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (part.type === \"tool\") {\n const view = syncPermission(data, part) ?? syncQuestion(data, part)\n if (part.tool === \"bash\" && part.callID) {\n if (claimShell(data, part.callID, \"tool\", bashCommand(part)).source === \"shell\") {\n return out(data, commits, view)\n }\n }\n\n if (part.state.status === \"running\") {\n if (data.ids.has(part.id)) {\n return out(data, commits, view)\n }\n\n if (!data.tools.has(part.id)) {\n data.tools.add(part.id)\n commits.push(startTool(part))\n }\n\n return out(data, commits, view ?? patch({ status: toolStatus(part) }))\n }\n\n if (part.state.status === \"completed\") {\n const seen = data.tools.has(part.id)\n const mode = toolView(part.tool)\n data.tools.delete(part.id)\n if (data.ids.has(part.id)) {\n return out(data, commits, view)\n }\n\n if (!seen) {\n commits.push(startTool(part))\n }\n\n data.ids.add(part.id)\n stashEcho(data, part)\n\n const output = part.state.output\n if (mode.output && typeof output === \"string\" && output.trim()) {\n commits.push({\n kind: \"tool\",\n text: output,\n phase: \"progress\",\n source: \"tool\",\n messageID: part.messageID,\n partID: part.id,\n tool: part.tool,\n part,\n toolState: \"completed\",\n })\n }\n\n if (mode.final) {\n commits.push(doneTool(part))\n }\n\n return out(data, commits, view)\n }\n\n if (part.state.status === \"error\") {\n const seen = data.tools.has(part.id)\n data.tools.delete(part.id)\n if (data.ids.has(part.id)) {\n return out(data, commits, view)\n }\n\n if (!seen) {\n commits.push(startTool(part))\n }\n\n data.ids.add(part.id)\n const text =\n typeof part.state.error === \"string\" && part.state.error.trim() ? part.state.error : \"unknown error\"\n commits.push(failTool(part, text))\n return out(data, commits, view)\n }\n }\n\n if (part.type !== \"text\" && part.type !== \"reasoning\") {\n return out(data, commits)\n }\n\n if (data.ids.has(part.id)) {\n return out(data, commits)\n }\n\n const kind = part.type === \"text\" ? \"assistant\" : \"reasoning\"\n if (typeof part.messageID === \"string\") {\n data.msg.set(part.id, part.messageID)\n }\n\n const msg = part.messageID\n const role = msg ? data.role.get(msg) : undefined\n if (role === \"user\" && part.type === \"text\" && !data.includeUserText) {\n data.ids.add(part.id)\n drop(data, part.id)\n return out(data, commits)\n }\n\n if (kind === \"reasoning\" && !input.thinking) {\n if (part.time?.end) {\n data.ids.add(part.id)\n }\n drop(data, part.id)\n return out(data, commits)\n }\n\n data.part.set(part.id, role === \"user\" && kind === \"assistant\" ? \"user\" : kind)\n syncText(data, part.id, part.text)\n\n if (part.time?.end) {\n data.end.add(part.id)\n }\n\n if (msg && !role) {\n return out(data, commits)\n }\n\n if (!ready(data, part.id)) {\n return out(data, commits)\n }\n\n flushPart(data, commits, part.id)\n\n if (!part.time?.end) {\n return out(data, commits)\n }\n\n data.ids.add(part.id)\n drop(data, part.id)\n return out(data, commits)\n }\n\n if (event.type === \"permission.asked\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n upsert(data.permissions, enrichPermission(data, event.properties))\n return queueOut(data, commits)\n }\n\n if (event.type === \"permission.replied\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (!remove(data.permissions, event.properties.requestID)) {\n return out(data, commits)\n }\n\n return queueOut(data, commits)\n }\n\n if (event.type === \"question.asked\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n upsert(data.questions, event.properties)\n return queueOut(data, commits)\n }\n\n if (event.type === \"question.replied\" || event.type === \"question.rejected\") {\n if (event.properties.sessionID !== input.sessionID) {\n return out(data, commits)\n }\n\n if (!remove(data.questions, event.properties.requestID)) {\n return out(data, commits)\n }\n\n return queueOut(data, commits)\n }\n\n if (event.type === \"session.error\") {\n if (event.properties.sessionID !== input.sessionID || !event.properties.error) {\n return out(data, commits)\n }\n\n commits.push({\n kind: \"error\",\n text: formatError(event.properties.error),\n phase: \"start\",\n source: \"system\",\n })\n return out(data, commits)\n }\n\n return out(data, commits)\n}\n",
"// Thin bridge between reducer output and the footer API.\n//\n// The reducers produce StreamCommit[] and an optional FooterOutput (patch +\n// view + subagent state). This module forwards them to footer.append() and\n// footer.event() respectively, adding trace writes along the way. It also\n// defaults status updates to phase \"running\" if the caller didn't set a\n// phase -- a convenience so reducer code doesn't have to repeat that.\nimport type { FooterApi, FooterOutput, FooterPatch, FooterSubagentState, StreamCommit } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype OutputInput = {\n footer: FooterApi\n trace?: Trace\n}\n\ntype StreamOutput = {\n commits: StreamCommit[]\n footer?: FooterOutput\n}\n\n// Default to \"running\" phase when a status string arrives without an explicit phase.\nfunction patch(next: FooterPatch): FooterPatch {\n if (typeof next.status === \"string\" && next.phase === undefined) {\n return {\n phase: \"running\",\n ...next,\n }\n }\n\n return next\n}\n\nfunction summarize(value: unknown): unknown {\n if (typeof value === \"string\") {\n if (value.length <= 160) {\n return value\n }\n\n return {\n type: \"string\",\n length: value.length,\n preview: `${value.slice(0, 160)}...`,\n }\n }\n\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n length: value.length,\n }\n }\n\n if (!value || typeof value !== \"object\") {\n return value\n }\n\n return {\n type: \"object\",\n keys: Object.keys(value),\n }\n}\n\nfunction traceCommit(commit: StreamCommit) {\n return {\n ...commit,\n text: summarize(commit.text),\n textLength: commit.text.length,\n part: commit.part\n ? {\n id: commit.part.id,\n sessionID: commit.part.sessionID,\n messageID: commit.part.messageID,\n callID: commit.part.callID,\n tool: commit.part.tool,\n state: {\n status: commit.part.state.status,\n title: \"title\" in commit.part.state ? summarize(commit.part.state.title) : undefined,\n error: \"error\" in commit.part.state ? summarize(commit.part.state.error) : undefined,\n time: \"time\" in commit.part.state ? summarize(commit.part.state.time) : undefined,\n input: summarize(commit.part.state.input),\n metadata: \"metadata\" in commit.part.state ? summarize(commit.part.state.metadata) : undefined,\n },\n }\n : undefined,\n }\n}\n\nexport function traceSubagentState(state: FooterSubagentState) {\n return {\n tabs: state.tabs,\n details: Object.fromEntries(\n Object.entries(state.details).map(([sessionID, detail]) => [\n sessionID,\n {\n sessionID,\n commits: detail.commits.map(traceCommit),\n },\n ]),\n ),\n permissions: state.permissions.map((item) => ({\n id: item.id,\n sessionID: item.sessionID,\n permission: item.permission,\n patterns: item.patterns,\n tool: item.tool,\n metadata: item.metadata\n ? {\n keys: Object.keys(item.metadata),\n input: summarize(item.metadata.input),\n }\n : undefined,\n })),\n questions: state.questions.map((item) => ({\n id: item.id,\n sessionID: item.sessionID,\n questions: item.questions.map((question) => ({\n header: question.header,\n question: question.question,\n options: question.options.length,\n multiple: question.multiple,\n })),\n })),\n }\n}\n\nexport function traceFooterOutput(footer?: FooterOutput) {\n if (!footer?.subagent) {\n return footer\n }\n\n return {\n ...footer,\n subagent: traceSubagentState(footer.subagent),\n }\n}\n\n// Forwards reducer output to the footer: commits go to scrollback, patches update the status bar.\nexport function writeSessionOutput(input: OutputInput, out: StreamOutput): void {\n for (const commit of out.commits) {\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n\n if (out.footer?.patch) {\n const next = patch(out.footer.patch)\n input.trace?.write(\"ui.patch\", next)\n input.footer.event({\n type: \"stream.patch\",\n patch: next,\n })\n }\n\n if (out.footer?.subagent) {\n input.trace?.write(\"ui.subagent\", traceSubagentState(out.footer.subagent))\n input.footer.event({\n type: \"stream.subagent\",\n state: out.footer.subagent,\n })\n }\n\n if (!out.footer?.view) {\n return\n }\n\n input.trace?.write(\"ui.patch\", {\n view: out.footer.view,\n })\n input.footer.event({\n type: \"stream.view\",\n view: out.footer.view,\n })\n}\n"
],
"mappings": "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",
"debugId": "A7AAB1B7AF2ED25764756E2164756E21",
"names": []
}

Sorry, the diff of this file is not supported yet