New:Socket for Asana Is Now Available.Learn more
Get Started

@opencode-ai/cli-linux-arm64

Package Overview
Dependencies
Maintainers
2
Versions
3612
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-dev-18115
to
0.0.0-dev-18122
+10
bin/chunk-12hqb60y.js.map
{
"version": 3,
"sources": ["src/commands/handlers/service/set.ts"],
"sourcesContent": [
"import { 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.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value, Option.getOrUndefined(input.nestedValue))\n }),\n)\n"
],
"mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,MAAO,EAAO,eAAe,EAAM,WAAW,CAAC,EAC1F,CACH",
"debugId": "CF6C3E41EEDAD8DF64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"],
"sourcesContent": [
"// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n",
"import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem.js\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image.js\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n const loadPhoton = yield* Effect.cached(\n // A runtime without a photon wasm artifact (#photon-wasm resolves to the\n // empty string on workerd) has no resizer, by declaration: fail typed\n // before touching URLs or module loading. The path resolution and import\n // for runtimes that DO have an artifact stay inside the guard too — a\n // throw outside it (workerd's undefined import.meta.url was one) is a\n // defect that escapes the ResizerUnavailableError handling and turns any\n // image-bearing prompt into a 500 instead of degrading to passthrough.\n photonWasm === \"\"\n ? Effect.fail(new ResizerUnavailableError())\n : Effect.tryPromise({\n try: async () => {\n ;(\n globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }\n ).__OPENCODE_PHOTON_WASM_PATH = path.isAbsolute(photonWasm)\n ? photonWasm\n : fileURLToPath(new URL(photonWasm, import.meta.url))\n return await import(\"@silvia-odwyer/photon-node\")\n },\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": ";kgCAGA,IAAe,ICDf,oBACA,wBAAS,YAIT,IAAM,EAAiB,CAAC,GAAI,GAAI,GAAI,GAAI,EAAE,EAE7B,EAAO,EAAO,IAAI,SAAU,EAAG,CAC1C,IAAM,EAAa,MAAO,EAAO,OAQ/B,IAAe,GACX,EAAO,KAAK,IAAI,CAAyB,EACzC,EAAO,WAAW,CAChB,IAAK,UAED,WACA,4BAA8B,EAAK,WAAW,CAAU,EACtD,EACA,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/C,KAAa,2CAEtB,MAAO,IAAM,IAAI,CACnB,CAAC,CACP,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": "3171442DEDBA84A964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/mini/tool.ts"],
"sourcesContent": [
"// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, subagent, etc.) has a ToolRule that controls\n// four 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// 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 { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { LANGUAGE_EXTENSIONS } from \"../util/filetype\"\nimport { Locale } from \"../util/locale\"\nimport {\n canonicalToolName,\n finiteNumber,\n primitiveInputSummary,\n toolDisplayContent,\n toolDisplayMetadata,\n webSearchProviderLabel,\n} from \"../util/tool-display\"\nimport { formatPath } from \"../util/path-format\"\nimport { isRecord } from \"../util/record\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport { canonicalToolName } from \"../util/tool-display\"\n\ntype ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\ntype ToolPhase = \"start\" | \"progress\" | \"final\"\n\ntype ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n status?: string\n file?: string\n from?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n id?: string\n path?: string\n pattern?: string\n url?: string\n query?: string\n agent?: 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 name?: string\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\ntype ToolFrame = {\n directory?: string\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n output: string\n time: {\n start?: number\n end?: number\n }\n}\n\ntype ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\ntype ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"subagent\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n return isRecord(v) ? { ...v } : {}\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nexport function toolOutputText(name: string, content: ReadonlyArray<{ type: string; text?: string }> | undefined) {\n if (!content) return \"\"\n // V2 shell content appends model-only status after the user-visible command output.\n if (canonicalToolName(name) === \"shell\") return content.find((item) => item.type === \"text\")?.text ?? \"\"\n const joined = content.flatMap((item) => (item.type === \"text\" && item.text ? [item.text] : [])).join(\"\\n\")\n if (canonicalToolName(name) === \"read\") return readDisplayText(joined) ?? joined\n return joined\n}\n\n/** Read's model content is a JSON page envelope; unwrap the human-facing text. */\nexport function readDisplayText(text: string): string | undefined {\n if (!text.startsWith(\"{\")) return undefined\n const parsed = (() => {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n })()\n const envelope = dict(parsed)\n if (typeof envelope.content === \"string\" && (envelope.type === \"text-page\" || envelope.encoding === \"utf8\"))\n return envelope.content\n if (!Array.isArray(envelope.entries)) return undefined\n return envelope.entries\n .flatMap((entry): string[] => {\n if (typeof entry === \"string\") return [entry]\n const path = dict(entry).path\n return typeof path === \"string\" ? [path] : []\n })\n .join(\"\\n\")\n}\n\nfunction normalizeInput(name: string, value: unknown) {\n const input = dict(value)\n const path = typeof input.path === \"string\" ? input.path : text(input.filePath)\n const agent = typeof input.agent === \"string\" ? input.agent : text(input.subagent_type)\n return {\n ...input,\n ...([\"read\", \"write\", \"edit\", \"lsp\"].includes(name) && path ? { path } : {}),\n ...(name === \"subagent\" && agent ? { agent } : {}),\n }\n}\n\nfunction normalizeFile(value: unknown): PatchFile | undefined {\n const file = dict(value)\n const name = text(file.file) || text(file.relativePath) || text(file.filePath)\n if (!name) return\n const legacy = text(file.type)\n const status =\n text(file.status) ||\n (legacy === \"add\"\n ? \"added\"\n : legacy === \"delete\"\n ? \"deleted\"\n : legacy === \"update\"\n ? \"modified\"\n : legacy === \"move\"\n ? \"moved\"\n : legacy)\n const patch = typeof file.patch === \"string\" ? file.patch : undefined\n const deletions = finiteNumber(file.deletions)\n return {\n ...file,\n file: name,\n ...(status === \"moved\" && text(file.filePath) ? { from: text(file.filePath) } : {}),\n ...(status ? { status } : {}),\n ...(patch === undefined ? {} : { patch }),\n ...(deletions === undefined ? {} : { deletions }),\n }\n}\n\nfunction normalizeMetadata(name: string, value: unknown) {\n const metadata = dict(value)\n const files = list(metadata.files).flatMap((item) => {\n const file = normalizeFile(item)\n return file ? [file] : []\n })\n const sessionID = text(metadata.sessionID) || text(metadata.sessionId)\n return {\n ...metadata,\n ...([\"edit\", \"patch\"].includes(name) && Array.isArray(metadata.files) ? { files } : {}),\n ...(name === \"subagent\" && sessionID ? { sessionID } : {}),\n }\n}\n\nexport function normalizeTool(tool: SessionMessageAssistantTool): SessionMessageAssistantTool {\n const name = canonicalToolName(tool.name)\n if (tool.state.status === \"streaming\") return { ...tool, name }\n return {\n ...tool,\n name,\n state: {\n ...tool.state,\n input: normalizeInput(name, tool.state.input),\n metadata: normalizeMetadata(name, toolDisplayMetadata(tool.state)),\n },\n } as SessionMessageAssistantTool\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction span(frame: ToolFrame): string {\n const start = frame.time.start\n const end = frame.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 = primitiveInputSummary(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)\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; directory?: string } = {}): string {\n return formatPath(input, {\n base: opts.directory ?? process.cwd(),\n home: opts.home ? os.homedir() : undefined,\n forwardSlashes: true,\n })\n}\n\nfunction displayPath(p: ToolProps, input?: string, opts: { home?: boolean } = {}) {\n return toolPath(input, { ...opts, directory: p.frame.directory })\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const 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 ${displayPath(p, 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 ${displayPath(p, 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 ${displayPath(p, dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = displayPath(p, p.input.path)\n const description = primitiveInputSummary(p.frame.input, [\"path\"]) || 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 ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.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 const file = list<PatchFile>(p.metadata.files)[0]\n return {\n icon: \"←\",\n title: `Edit ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: file?.patch ?? 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.agent || \"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} Subagent`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n const name = p.metadata.name ?? p.input.id ?? \"\"\n return {\n icon: \"→\",\n title: `Skill \"${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: \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.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: calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n path?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean; directory?: string } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.path ? toolPath(input.path, 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: lspTitle(p.input, { directory: p.frame.directory }),\n }\n}\n\nfunction patchTitle(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `# Created ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"deleted\") {\n return `# Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `# Moved ${toolPath(file.from, { directory })} -> ${toolPath(file.file, { directory })}`\n }\n\n return `# Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.path || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${displayPath(p, file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const item = list<PatchFile>(p.metadata.files)[0]\n const file = item?.file || p.input.path || \"\"\n const diff = item?.patch || p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${displayPath(p, 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.file\n return [\n {\n title: patchTitle(file, p.frame.directory),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length !== files.length) {\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.agent || \"general\")\n const desc = p.input.description\n const rows = [desc].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Subagent`,\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 !== \".\" ? displayPath(p, wd, { home: true }) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `${dir}$` : \"\"\n }\n\n return `${dir}$ ${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 ? displayPath(p, wdRaw, { home: true }) : \"\"\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 scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit\n const time = span(p.frame)\n if (code === undefined) {\n if (!time) {\n return \"shell completed\"\n }\n\n return `shell completed · ${time}`\n }\n\n return `shell completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = displayPath(p, p.input.path)\n const extra = primitiveInputSummary(p.frame.input, [\"path\"])\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, directory?: string): string {\n if (file.status === \"added\") {\n return `+ Created ${toolPath(file.file, { directory })}`\n }\n\n if (file.status === \"deleted\") {\n return `- Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `→ Moved ${toolPath(file.from, { directory })} → ${toolPath(file.file, { directory })}`\n }\n\n return `~ Patched ${toolPath(file.file, { directory })}`\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)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const showModified = !files.some((file) => file?.status && file.status !== \"modified\")\n const shown = files.filter((file) => showModified || file.status !== \"modified\")\n const rows = shown.slice(0, 6).map((file) => patchLine(file, p.frame.directory))\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]!, p.frame.directory)\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.agent || \"general\")\n const row = p.input.description\n if (!row) {\n return `# ${kind} Subagent`\n }\n\n return `# ${kind} Subagent\\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)\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, { directory: p.frame.directory })}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.metadata.name ?? p.input.id ?? \"\"}\"`\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 ${displayPath(p, 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 ${displayPath(p, 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 ${displayPath(p, 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\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n shell: {\n view: {\n output: true,\n final: false,\n },\n run: runShell,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollShellFinal,\n },\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 },\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 subagent: {\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 },\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 },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\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: SessionMessageAssistantTool, directory?: string): ToolFrame {\n const tool = normalizeTool(part)\n if (tool.state.status === \"streaming\")\n return {\n directory,\n raw: tool.state.input,\n name: tool.name,\n input: {},\n meta: {},\n state: dict(tool.state),\n status: tool.state.status,\n error: \"\",\n output: \"\",\n time: { start: tool.time.created },\n }\n const output = toolOutputText(tool.name, toolDisplayContent(tool.state))\n return {\n directory,\n raw: output,\n name: tool.name,\n input: normalizeInput(tool.name, tool.state.input),\n meta: normalizeMetadata(tool.name, tool.state.metadata),\n state: dict(tool.state),\n status: tool.state.status,\n error: tool.state.status === \"error\" ? tool.state.error.message : \"\",\n output,\n time: {\n start: tool.time.ran ?? tool.time.created,\n end: tool.time.completed,\n },\n }\n}\n\nfunction toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const current = commit.part ? frame(commit.part, commit.directory) : undefined\n return {\n directory: commit.directory,\n raw,\n name: canonicalToolName(commit.tool || current?.name || \"tool\"),\n input: current?.input ?? {},\n meta: current?.meta ?? {},\n state: current?.state ?? {},\n status: commit.toolState ?? current?.status ?? \"\",\n error: (commit.toolError ?? current?.error ?? \"\").trim(),\n output: current?.output ?? raw,\n time: current?.time ?? {},\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output.trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name ? canonicalToolName(name) : undefined)?.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?.name).snap)\n )\n}\n\nexport function toolInlineInfo(part: SessionMessageAssistantTool, directory?: string): ToolInline {\n const ctx = frame(part, directory)\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\nfunction 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\nconst STRUCTURED_FALLBACK_LENGTH = 4_096\n\nfunction structuredFallback(value: ToolDict): RunEntryBody | undefined {\n if (Object.keys(value).length === 0) return\n const content = JSON.stringify(value, null, 2)\n if (!content) return\n const suffix = \"\\n... [truncated]\"\n return {\n type: \"code\",\n content:\n content.length <= STRUCTURED_FALLBACK_LENGTH\n ? content\n : content.slice(0, STRUCTURED_FALLBACK_LENGTH - suffix.length) + suffix,\n filetype: \"json\",\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(\n commit: StreamCommit,\n raw: string,\n options?: { shellOutput?: boolean },\n): 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 === \"shell\" && commit.phase === \"progress\" && options?.shellOutput === false) return undefined\n\n if (ctx.name === \"subagent\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(ctx.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 if (!rule(ctx.name) && !ctx.output.trim()) {\n return structuredFallback(ctx.meta) ?? 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": "B18E31DF5FEBB35A64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/config.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.config,\n Effect.fn(\"cli.debug.config\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const entries = yield* Effect.promise(() => client.config.get({ location: { directory: process.cwd() } }))\n process.stdout.write(JSON.stringify(entries, null, 2) + EOL)\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACzG,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAS,KAAM,CAAC,EAAI,CAAG,EAC5D,CACH",
"debugId": "D9A4A26C27DF103464756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/plugin/remove.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Config } from \"../../../config\"\nimport { resolveConfigPath } from \"../mcp/add\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.remove,\n Effect.fn(\"cli.plugin.remove\")(function* (input) {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const server = yield* Effect.promise(() => removePluginConfig(configPath, input.package))\n const config = yield* Config.Service\n const info = yield* config.get()\n const tui = configured(info.plugins, input.package)\n if (tui)\n yield* config.update((draft) => {\n draft.plugins = draft.plugins?.filter((entry) => !matches(entry, input.package))\n })\n\n const removed = [server ? configPath : undefined, tui ? config.path : undefined].filter(\n (file) => file !== undefined,\n )\n process.stdout.write(\n removed.length\n ? `Plugin \"${input.package}\" removed from ${removed.join(\", \")}${EOL}`\n : `Plugin \"${input.package}\" is not configured${EOL}`,\n )\n }),\n)\n\nexport async function removePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined\n throw error\n })\n if (text === undefined) return false\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (!configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(\n text,\n [\"plugins\"],\n plugins?.filter((entry) => !matches(entry, spec)),\n {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n },\n ),\n )\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some((entry) => matches(entry, spec)) ?? false\n}\n\nfunction matches(entry: unknown, spec: string) {\n return entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec)\n}\n"
],
"mappings": ";itBAAA,cAAS,WAET,mBAAS,YAAU,eAAQ,oBAS3B,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,OAClC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAmB,EAAY,EAAM,OAAO,CAAC,EAClF,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAM,EAAW,EAAK,QAAS,EAAM,OAAO,EAClD,GAAI,EACF,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,EAAM,QAAU,EAAM,SAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,EAAM,OAAO,CAAC,EAChF,EAEH,IAAM,EAAU,CAAC,EAAS,EAAa,OAAW,EAAM,EAAO,KAAO,MAAS,EAAE,OAC/E,CAAC,IAAS,IAAS,MACrB,EACA,QAAQ,OAAO,MACb,EAAQ,OACJ,WAAW,EAAM,yBAAyB,EAAQ,KAAK,IAAI,IAAI,IAC/D,WAAW,EAAM,6BAA6B,GACpD,EACD,CACH,EAEA,eAAsB,CAAkB,CAAC,EAAoB,EAAc,CACzE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,OAC/F,MAAM,EACP,EACD,GAAI,IAAS,OAAW,MAAO,GAC/B,IAAM,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,CAAC,EAAW,EAAS,CAAI,EAAG,MAAO,GAEvC,IAAM,EAAU,EACd,EACA,EACE,EACA,CAAC,SAAS,EACV,GAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,CAAI,CAAC,EAChD,CACE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CACF,CACF,EACM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KAAK,CAAC,IAAU,EAAQ,EAAO,CAAI,CAAC,GAAK,GAG3D,SAAS,CAAO,CAAC,EAAgB,EAAc,CAC7C,OAAO,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,MAAQ,YAAa,GAAS,EAAM,UAAY",
"debugId": "AABB0F36D3B15AA864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/status.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n"
],
"mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,OACnC,EAAO,GAAG,oBAAoB,EAAE,SAAU,EAAG,CAC3C,IAAM,EAAU,MAAO,EAAc,QAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH",
"debugId": "DF16EA2772FD567B64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/stats.ts"],
"sourcesContent": [
"import { ClientError, OpenCode, type SessionStatsInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { errorMessage } from \"../../util/error\"\n\nconst handler = Effect.fn(\"cli.stats\")(function* (input: Runtime.Input<typeof Commands.commands.stats>) {\n const days = Option.getOrUndefined(input.days)\n const year = Option.getOrUndefined(input.year)\n const project = Option.getOrUndefined(input.project)\n if ([days !== undefined, year !== undefined, input.all].filter(Boolean).length > 1)\n yield* Effect.fail(new Error(\"--days, --year, and --all cannot be combined\"))\n\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({ baseUrl: server.endpoint.url, headers: Service.headers(server.endpoint) })\n const range = statsRange({ days, year, all: input.all })\n const projectID =\n project === \".\"\n ? yield* request(server.endpoint.url, (signal) =>\n client.location\n .get({ location: { directory: process.cwd() } }, { signal })\n .then((location) => location.project.id),\n )\n : project\n const details = input.models || input.tools || input.cost || input.full\n const stats = yield* request(server.endpoint.url, (signal) =>\n client.session.stats(\n {\n from: range.from,\n to: range.to,\n project: projectID,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\",\n tools: input.json || input.tools || input.full ? \"detail\" : details ? \"none\" : \"summary\",\n },\n { signal },\n ),\n )\n const output = input.json\n ? JSON.stringify(stats, null, 2)\n : renderStats(stats, {\n label: range.label,\n scope: project === undefined ? \"all projects\" : project === \".\" ? \"current project\" : \"selected project\",\n models: input.models || input.full,\n tools: input.tools || input.full,\n cost: input.cost || input.full,\n limit: input.limit,\n color: process.stdout.isTTY && process.env.NO_COLOR === undefined,\n width: process.stdout.columns ?? 80,\n })\n process.stdout.write(output + EOL)\n})\n\nexport default Runtime.handler(Commands.commands.stats, (input) =>\n handler(input).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n)\n\nexport function request<A>(url: string, run: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: () => run(AbortSignal.timeout(30_000)),\n catch: (cause) =>\n cause instanceof ClientError && cause.reason === \"Transport\"\n ? new Error(`Could not reach server at ${url}`, { cause })\n : cause,\n })\n}\n\ntype RenderOptions = {\n label: string\n scope: string\n models: boolean\n tools: boolean\n cost: boolean\n limit: number\n color: boolean\n width: number\n}\n\nconst colors = terminalPalette()\n\nexport function renderStats(stats: SessionStatsInfo, options: RenderOptions) {\n const totalTokens = tokenTotal(stats.tokens)\n const toolTotals = stats.tools.mode === \"none\" ? undefined : stats.tools.totals\n const terminalTools = toolTotals ? toolTotals.succeeded + toolTotals.failed : 0\n const toolRate = !toolTotals || terminalTools === 0 ? undefined : (toolTotals.succeeded / terminalTools) * 100\n const primary = `1;${colors.primary}`\n const sessionLine = [\n metricCount(stats.sessions, \"session\", options.color),\n stats.subagents > 0 ? metricCount(stats.subagents, \"subagent\", options.color) : undefined,\n ]\n .filter((value) => value !== undefined)\n .join(\" · \")\n const toolSummary = !toolTotals\n ? \"tool stats unavailable\"\n : toolRate === undefined\n ? \"no tool calls\"\n : `${style(formatPercent(toolRate), primary, options.color)} tool success`\n const details = options.models || options.tools || options.cost\n const empty = stats.sessions === 0 && stats.prompts === 0 && stats.steps === 0\n const heading = `${style(\"opencode stats\", primary, options.color)} ${style(`· ${options.label} · ${options.scope}`, \"2\", options.color)}`\n const lines = details\n ? [style(`${options.label} · ${options.scope}`, \"2\", options.color)]\n : empty\n ? [\n heading,\n \"\",\n style(\"no activity in this range\", \"2\", options.color),\n \"\",\n style(\"opencode.ai\", \"2\", options.color),\n ]\n : [\n heading,\n \"\",\n ...renderActivity(stats.activity, stats.range.from, stats.range.to, options.color, options.width),\n \"\",\n sessionLine,\n `${metricCount(stats.prompts, \"prompt\", options.color)} · ${metricCount(stats.steps, \"step\", options.color)} · ${metricCount(totalTokens, \"token\", options.color)}`,\n `${toolSummary} · ${metricCount(stats.activeDays, \"active day\", options.color)} · best streak ${style(stats.streak.toString(), primary, options.color)} day${stats.streak === 1 ? \"\" : \"s\"}`,\n \"\",\n style(\"opencode.ai\", \"2\", options.color),\n ]\n\n if (options.cost) lines.push(...(lines.length > 0 ? [\"\"] : []), ...renderCost(stats))\n if (options.models)\n lines.push(...(lines.length > 0 ? [\"\"] : []), ...renderModels(stats, options.limit, options.width))\n if (options.tools) lines.push(...(lines.length > 0 ? [\"\"] : []), ...renderTools(stats, options.limit, options.width))\n return lines.join(EOL)\n}\n\nfunction statsRange(input: { days?: number; year?: number; all: boolean }) {\n const now = new Date()\n const to = now.getTime() + 1\n if (input.all) return { from: undefined, to, label: \"all time\" }\n if (input.days !== undefined) {\n const from = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n from.setDate(from.getDate() - Math.max(0, input.days - 1))\n return {\n from: from.getTime(),\n to,\n label: input.days === 0 || input.days === 1 ? \"today\" : `last ${input.days} days`,\n }\n }\n const year = input.year ?? now.getFullYear()\n return {\n from: new Date(year, 0, 1).getTime(),\n to: year === now.getFullYear() ? to : new Date(year + 1, 0, 1).getTime(),\n label: year === now.getFullYear() ? `${year} so far` : year.toString(),\n }\n}\n\nfunction renderActivity(\n activity: SessionStatsInfo[\"activity\"],\n from: number,\n to: number,\n color: boolean,\n width: number,\n) {\n const values = new Map(activity.map((day) => [day.date, day.steps]))\n const rangeStart = dateOrdinal(new Date(from))\n const rangeEnd = dateOrdinal(new Date(to - 1))\n const end = new Date(to - 1)\n end.setHours(12, 0, 0, 0)\n end.setDate(end.getDate() + (7 - mondayIndex(end) - 1))\n const start = new Date(from)\n start.setHours(12, 0, 0, 0)\n start.setDate(start.getDate() - mondayIndex(start))\n const maxWeeks = Math.max(1, Math.min(53, width - 4))\n const totalWeeks = Math.floor((dateOrdinal(end) - dateOrdinal(start)) / 7) + 1\n const latest = new Date(end)\n latest.setDate(latest.getDate() - (maxWeeks - 1) * 7)\n if (start < latest) start.setTime(latest.getTime())\n\n const active = [...values.values()].filter((value) => value > 0)\n const levels = [...new Set(active)].sort((a, b) => a - b)\n const weekStarts = Array.from({ length: Math.floor((dateOrdinal(end) - dateOrdinal(start)) / 7) + 1 }, (_, week) => {\n const date = new Date(start)\n date.setDate(date.getDate() + week * 7)\n return date\n })\n const weeks = weekStarts.map((week) =>\n Array.from({ length: 7 }, (_, day) => {\n const date = new Date(week)\n date.setDate(date.getDate() + day)\n const ordinal = dateOrdinal(date)\n if (ordinal < rangeStart || ordinal > rangeEnd) return \" \"\n return activityGlyph(values.get(dateKey(date)) ?? 0, levels, color)\n }),\n )\n const weekdays = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"]\n return [\n style(totalWeeks > maxWeeks ? `activity · last ${maxWeeks} weeks` : \"activity\", `1;${colors.primary}`, color),\n ` ${style(monthLabels(weekStarts), \"2\", color)}`,\n ...weekdays.flatMap((label, day) => [\n `${style(label, \"2\", color)} ${weeks.map((week) => week[day]).join(\"\")}`,\n ...(day === weekdays.length - 1 ? [] : [\"\"]),\n ]),\n \"\",\n ` ${style(\"less\", \"2\", color)} ${[0, 1, 2, 3, 4].map((level) => paintActivity(level, color)).join(\"\")} ${style(\"more\", \"2\", color)}`,\n ]\n}\n\nfunction renderCost(stats: SessionStatsInfo) {\n const input = stats.tokens.input + stats.tokens.cache.read + stats.tokens.cache.write\n const cached = input === 0 ? 0 : (stats.tokens.cache.read / input) * 100\n return [\n \"COST & TOKENS\",\n row(\"cost\", `$${stats.cost.toFixed(2)}`),\n row(\"input\", formatNumber(stats.tokens.input)),\n row(\"output\", formatNumber(stats.tokens.output)),\n row(\"reasoning\", formatNumber(stats.tokens.reasoning)),\n row(\"cache read\", formatNumber(stats.tokens.cache.read)),\n row(\"cache write\", formatNumber(stats.tokens.cache.write)),\n row(\"cached input\", formatPercent(cached)),\n ]\n}\n\nfunction renderModels(stats: SessionStatsInfo, limit: number, width: number) {\n if (stats.models.length === 0) return [\"MODELS\", \" no model usage\"]\n const models = stats.models.slice(0, limit)\n const more = stats.models.length - models.length\n if (width < 68)\n return [\n \"MODELS\",\n ...models.flatMap((item) => [\n truncate(\n `${item.model.providerID}/${item.model.id}${item.model.variant ? `#${item.model.variant}` : \"\"}`,\n width,\n ),\n ` ${formatNumber(tokenTotal(item.tokens))} tokens · ${formatNumber(item.steps)} steps · $${item.cost.toFixed(2)}`,\n ]),\n ...(more > 0 ? [\"\", `+${more.toLocaleString(\"en-US\")} more model${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n return [\n \"MODELS\",\n tableHeader(\"model\", \"tokens\", \"steps\", \"cost\"),\n ...models.map((item) =>\n tableRow(\n `${item.model.providerID}/${item.model.id}${item.model.variant ? `#${item.model.variant}` : \"\"}`,\n formatNumber(tokenTotal(item.tokens)),\n formatNumber(item.steps),\n `$${item.cost.toFixed(2)}`,\n ),\n ),\n ...(more > 0 ? [\"\", `+${more.toLocaleString(\"en-US\")} more model${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n}\n\nfunction renderTools(stats: SessionStatsInfo, limit: number, width: number) {\n if (stats.tools.mode !== \"detail\") return [\"TOOL RELIABILITY\", \" tool details unavailable\"]\n if (stats.tools.usage.length === 0) return [\"TOOL RELIABILITY\", \" no tool calls\"]\n const tools = stats.tools.usage.slice(0, limit)\n const more = stats.tools.usage.length - tools.length\n if (width < 68)\n return [\n \"TOOL RELIABILITY\",\n ...tools.flatMap((tool) => {\n const terminal = tool.succeeded + tool.failed\n return [\n truncate(tool.name, width),\n ` ${formatNumber(tool.calls)} calls · ${terminal === 0 ? \"-\" : formatPercent((tool.failed / terminal) * 100)} error · ${tool.durationP50 === undefined ? \"-\" : formatDuration(tool.durationP50)} p50`,\n ]\n }),\n \"\",\n `${formatNumber(stats.tools.totals.succeeded + stats.tools.totals.failed)} finished calls · ${formatNumber(stats.tools.totals.unfinished)} unfinished`,\n ...(more > 0 ? [`+${more.toLocaleString(\"en-US\")} more tool${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n return [\n \"TOOL RELIABILITY\",\n tableHeader(\"tool\", \"calls\", \"error\", \"p50\"),\n ...tools.map((tool) => {\n const terminal = tool.succeeded + tool.failed\n return tableRow(\n tool.name,\n formatNumber(tool.calls),\n terminal === 0 ? \"-\" : formatPercent((tool.failed / terminal) * 100),\n tool.durationP50 === undefined ? \"-\" : formatDuration(tool.durationP50),\n )\n }),\n \"\",\n `${formatNumber(stats.tools.totals.succeeded + stats.tools.totals.failed)} finished calls · ${formatNumber(stats.tools.totals.unfinished)} unfinished`,\n ...(more > 0 ? [`+${more.toLocaleString(\"en-US\")} more tool${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n}\n\nfunction row(label: string, value: string) {\n return ` ${label.padEnd(20)}${value}`\n}\n\nfunction tableHeader(label: string, second: string, third: string, fourth: string) {\n return tableRow(label, second, third, fourth)\n}\n\nfunction tableRow(label: string, second: string, third: string, fourth: string) {\n return `${truncate(label, 34).padEnd(34)}${second.padStart(10)}${third.padStart(12)}${fourth.padStart(12)}`\n}\n\nfunction truncate(value: string, width: number) {\n return value.length <= width ? value : value.slice(0, width - 1) + \"…\"\n}\n\nfunction tokenTotal(tokens: SessionStatsInfo[\"tokens\"]) {\n return tokens.input + tokens.output + tokens.reasoning + tokens.cache.read + tokens.cache.write\n}\n\nfunction formatNumber(value: number) {\n if (value >= 1_000_000_000) return `${trimDecimal(value / 1_000_000_000)}b`\n if (value >= 1_000_000) return `${trimDecimal(value / 1_000_000)}m`\n if (value >= 1_000) return `${trimDecimal(value / 1_000)}k`\n return Math.round(value).toLocaleString(\"en-US\")\n}\n\nfunction trimDecimal(value: number) {\n return value.toFixed(1).replace(/\\.0$/, \"\")\n}\n\nfunction formatPercent(value: number) {\n return `${value.toFixed(value >= 10 ? 1 : 2)}%`\n}\n\nfunction formatDuration(value: number) {\n if (value < 1_000) return `${Math.round(value)}ms`\n return `${trimDecimal(value / 1_000)}s`\n}\n\nfunction metricCount(value: number, noun: string, color: boolean) {\n return `${style(formatNumber(value), `1;${colors.primary}`, color)} ${noun}${value === 1 ? \"\" : \"s\"}`\n}\n\nfunction style(value: string, code: string, color: boolean) {\n return color ? `\\x1b[${code}m${value}\\x1b[0m` : value\n}\n\nfunction activityGlyph(value: number, levels: number[], color: boolean) {\n if (value === 0) return paintActivity(0, color)\n const index = levels.indexOf(value)\n const level = Math.max(1, Math.ceil(((index + 1) / levels.length) * 4))\n return paintActivity(level, color)\n}\n\nfunction paintActivity(level: number, color: boolean) {\n const glyph = [\"·\", \"░\", \"▒\", \"▓\", \"█\"][level]\n if (!color) return glyph\n if (level === 0) return `\\x1b[2m${glyph}\\x1b[22m`\n return `\\x1b[${colors.activity[level - 1]}m${glyph}\\x1b[39m`\n}\n\nfunction terminalPalette() {\n const background = Number(process.env.COLORFGBG?.split(\";\").at(-1))\n if (Number.isFinite(background) && background >= 7)\n return {\n primary: \"38;2;59;125;216\",\n activity: [\"38;2;153;169;192\", \"38;2;122;155;200\", \"38;2;90;140;208\", \"38;2;59;125;216\"],\n }\n if (Number.isFinite(background))\n return {\n primary: \"38;2;250;178;131\",\n activity: [\"38;2;117;99;87\", \"38;2;161;125;102\", \"38;2;206;152;116\", \"38;2;250;178;131\"],\n }\n return { primary: \"36\", activity: [\"2;36\", \"36\", \"1;36\", \"1;96\"] }\n}\n\nfunction monthLabels(weeks: Date[]) {\n const line: string[] = []\n weeks.reduce((previous, week, index) => {\n const middle = new Date(week)\n middle.setDate(middle.getDate() + 3)\n const month = middle.getMonth()\n if (month === previous) return previous\n Intl.DateTimeFormat(\"en-US\", { month: \"short\" })\n .format(middle)\n .split(\"\")\n .forEach((character, offset) => {\n line[index + offset] = character\n })\n return month\n }, -1)\n return Array.from({ length: Math.max(weeks.length, line.length) }, (_, index) => line[index] ?? \" \")\n .join(\"\")\n .trimEnd()\n}\n\nfunction mondayIndex(date: Date) {\n return (date.getDay() + 6) % 7\n}\n\nfunction dateKey(date: Date) {\n return [\n date.getFullYear(),\n String(date.getMonth() + 1).padStart(2, \"0\"),\n String(date.getDate()).padStart(2, \"0\"),\n ].join(\"-\")\n}\n\nfunction dateOrdinal(date: Date) {\n return Math.floor(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) / 86_400_000)\n}\n"
],
"mappings": "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",
"debugId": "5E3E3E3E9DD88A0664756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/api.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nconst methods = new Set([\"delete\", \"get\", \"head\", \"options\", \"patch\", \"post\", \"put\"])\n\ntype Operation = {\n operationId?: string\n}\n\ntype OpenApi = {\n paths?: Record<string, Record<string, Operation>>\n}\n\nexport default Runtime.handler(\n Commands.commands.api,\n Effect.fn(\"cli.api\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n mismatch: \"ignore\",\n })\n const endpoint = server.endpoint\n const params = Option.getOrElse(input.param, () => ({}))\n const request = yield* resolveRequest(endpoint, input.request, params)\n const headers = new Headers(Service.headers(endpoint))\n for (const header of input.header) {\n const index = header.indexOf(\":\")\n if (index < 1) return yield* Effect.fail(new Error(`Invalid header, expected name:value: ${header}`))\n headers.set(header.slice(0, index).trim(), header.slice(index + 1).trim())\n }\n const body = Option.getOrUndefined(input.data)\n if (body !== undefined && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\")\n\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(request.path, endpoint.url), {\n method: request.method,\n headers,\n body,\n }),\n )\n const output = yield* Effect.promise(() => response.text())\n if (output) process.stdout.write(output + (output.endsWith(EOL) ? \"\" : EOL))\n }),\n)\n\nexport function resolveOperation(spec: OpenApi, operationID: string, params: Record<string, string>) {\n for (const [path, operations] of Object.entries(spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(operations)) {\n if (!methods.has(method) || operation.operationId !== operationID) continue\n return { method: method.toUpperCase(), path: interpolate(path, params) }\n }\n }\n throw new Error(`Operation not found: ${operationID}`)\n}\n\nexport function rawRequest(input: readonly string[]) {\n if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith(\"/\")) return\n return { method: input[0].toUpperCase(), path: input[1] }\n}\n\nfunction resolveRequest(endpoint: Endpoint, input: readonly string[], params: Record<string, string>) {\n const raw = rawRequest(input)\n if (raw) return Effect.succeed(raw)\n if (input.length !== 1) return Effect.fail(new Error(\"Expected an operation name or an HTTP method and path\"))\n return Effect.tryPromise(async () => {\n const response = await fetch(new URL(\"/openapi.json\", endpoint.url), { headers: Service.headers(endpoint) })\n if (!response.ok) throw new Error(`Failed to load OpenAPI document: HTTP ${response.status}`)\n return resolveOperation((await response.json()) as OpenApi, input[0], params)\n })\n}\n\nfunction interpolate(path: string, params: Record<string, string>) {\n const used = new Set<string>()\n const pathname = path.replaceAll(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n used.add(name)\n return encodeURIComponent(value)\n })\n const query = new URLSearchParams(Object.entries(params).filter(([name]) => !used.has(name))).toString()\n return query ? `${pathname}?${query}` : pathname\n}\n"
],
"mappings": "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",
"debugId": "B5C1B77A74DE93A564756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/util/tool-display.ts", "../tui/src/util/path-format.ts", "../tui/src/util/filetype.ts", "../../node_modules/.bun/ansi-regex@6.3.0/node_modules/ansi-regex/index.js", "../../node_modules/.bun/strip-ansi@7.1.2/node_modules/strip-ansi/index.js"],
"sourcesContent": [
"export function canonicalToolName(name: string) {\n if (name === \"bash\") return \"shell\"\n if (name === \"task\") return \"subagent\"\n if (name === \"apply_patch\") return \"patch\"\n return name\n}\n\nexport function finiteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return\n return value\n}\n\nexport function primitiveInputSummary(input: Record<string, unknown>, omit: readonly string[] = []) {\n const entries = Object.entries(input).filter(([key, value]) => {\n if (omit.includes(key)) return false\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n })\n if (entries.length === 0) return \"\"\n return `[${entries.map(([key, value]) => `${key}=${String(value)}`).join(\", \")}]`\n}\n\nexport function webSearchProviderLabel(provider: unknown) {\n if (typeof provider !== \"string\" || !provider) return \"Web Search\"\n return `Web Search via ${provider[0].toUpperCase()}${provider.slice(1)}`\n}\n\nexport function toolDisplayMetadata(state: unknown): Record<string, unknown> {\n if (!state || typeof state !== \"object\" || Array.isArray(state)) return {}\n if (!(\"status\" in state) || state.status === \"streaming\") return {}\n if (!(\"metadata\" in state) || !state.metadata || typeof state.metadata !== \"object\") return {}\n if (Array.isArray(state.metadata)) return {}\n return state.metadata as Record<string, unknown>\n}\n\nexport function toolDisplayContent(state: SessionMessageAssistantTool[\"state\"]) {\n if (state.status === \"streaming\" || state.status === \"running\") return []\n return state.content ?? []\n}\n\nexport function nonEmptyToolContent<T>(content: ReadonlyArray<T> | undefined): [T, ...T[]] | undefined {\n if (!content) return undefined\n const [first, ...rest] = content\n return first === undefined ? undefined : [first, ...rest]\n}\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\n",
"import path from \"path\"\n\nexport function abbreviateHome(input: string, home: string) {\n if (!home) return input\n const paths = windowsPath(home) ? path.win32 : path.posix\n const relative = paths.relative(home, input)\n if (!relative) return \"~\"\n if (relative === \"..\" || relative.startsWith(\"..\" + paths.sep) || paths.isAbsolute(relative)) return input\n return \"~/\" + relative.split(paths.sep).join(\"/\")\n}\n\nexport function formatPath(\n input: string | undefined,\n options: { base: string; home?: string; forwardSlashes?: boolean },\n) {\n if (!input) return \"\"\n const windows = windowsPath(options.base)\n if (!windows && windowsPath(input)) {\n return options.forwardSlashes ? input.replaceAll(\"\\\\\", \"/\") : input\n }\n\n const paths = windows ? path.win32 : path.posix\n const absolute = paths.isAbsolute(input) ? input : paths.resolve(options.base, input)\n const relative = paths.relative(options.base, absolute)\n const formatted = !relative\n ? \".\"\n : relative !== \"..\" && !relative.startsWith(\"..\" + paths.sep) && !paths.isAbsolute(relative)\n ? relative\n : options.home\n ? abbreviateHome(absolute, options.home)\n : absolute\n return options.forwardSlashes ? formatted.replaceAll(\"\\\\\", \"/\") : formatted\n}\n\nfunction windowsPath(input: string) {\n return /^[A-Za-z]:[\\\\/]/.test(input) || input.startsWith(\"\\\\\\\\\")\n}\n",
"import path from \"node:path\"\n\nexport const LANGUAGE_EXTENSIONS: Record<string, string> = {\n \".abap\": \"abap\",\n \".bat\": \"bat\",\n \".bib\": \"bibtex\",\n \".bibtex\": \"bibtex\",\n \".clj\": \"clojure\",\n \".cljs\": \"clojure\",\n \".cljc\": \"clojure\",\n \".edn\": \"clojure\",\n \".coffee\": \"coffeescript\",\n \".c\": \"c\",\n \".cpp\": \"cpp\",\n \".cxx\": \"cpp\",\n \".cc\": \"cpp\",\n \".c++\": \"cpp\",\n \".cs\": \"csharp\",\n \".csx\": \"csharp\",\n \".css\": \"css\",\n \".d\": \"d\",\n \".pas\": \"pascal\",\n \".pascal\": \"pascal\",\n \".diff\": \"diff\",\n \".patch\": \"diff\",\n \".dart\": \"dart\",\n \".dockerfile\": \"dockerfile\",\n \".ex\": \"elixir\",\n \".exs\": \"elixir\",\n \".erl\": \"erlang\",\n \".ets\": \"typescript\",\n \".hrl\": \"erlang\",\n \".fs\": \"fsharp\",\n \".fsi\": \"fsharp\",\n \".fsx\": \"fsharp\",\n \".fsscript\": \"fsharp\",\n \".gitcommit\": \"git-commit\",\n \".gitrebase\": \"git-rebase\",\n \".go\": \"go\",\n \".groovy\": \"groovy\",\n \".gleam\": \"gleam\",\n \".hbs\": \"handlebars\",\n \".handlebars\": \"handlebars\",\n \".hs\": \"haskell\",\n \".lhs\": \"haskell\",\n \".html\": \"html\",\n \".htm\": \"html\",\n \".ini\": \"ini\",\n \".java\": \"java\",\n \".jl\": \"julia\",\n \".js\": \"javascript\",\n \".kt\": \"kotlin\",\n \".kts\": \"kotlin\",\n \".jsx\": \"javascriptreact\",\n \".json\": \"json\",\n \".tex\": \"latex\",\n \".latex\": \"latex\",\n \".less\": \"less\",\n \".lua\": \"lua\",\n \".makefile\": \"makefile\",\n makefile: \"makefile\",\n \".md\": \"markdown\",\n \".markdown\": \"markdown\",\n \".m\": \"objective-c\",\n \".mm\": \"objective-cpp\",\n \".pl\": \"perl\",\n \".pm\": \"perl\",\n \".pm6\": \"perl6\",\n \".php\": \"php\",\n \".ps1\": \"powershell\",\n \".psm1\": \"powershell\",\n \".pug\": \"jade\",\n \".jade\": \"jade\",\n \".py\": \"python\",\n \".r\": \"r\",\n \".cshtml\": \"razor\",\n \".razor\": \"razor\",\n \".rb\": \"ruby\",\n \".rake\": \"ruby\",\n \".gemspec\": \"ruby\",\n \".ru\": \"ruby\",\n \".erb\": \"erb\",\n \".html.erb\": \"erb\",\n \".js.erb\": \"erb\",\n \".css.erb\": \"erb\",\n \".json.erb\": \"erb\",\n \".rs\": \"rust\",\n \".scss\": \"scss\",\n \".sass\": \"sass\",\n \".scala\": \"scala\",\n \".shader\": \"shaderlab\",\n \".sh\": \"bash\",\n \".bash\": \"bash\",\n \".zsh\": \"bash\",\n \".ksh\": \"bash\",\n \".sql\": \"sql\",\n \".svelte\": \"svelte\",\n \".swift\": \"swift\",\n \".ts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".mtsx\": \"typescriptreact\",\n \".ctsx\": \"typescriptreact\",\n \".xml\": \"xml\",\n \".xsl\": \"xsl\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".vue\": \"vue\",\n \".zig\": \"zig\",\n \".zon\": \"zig\",\n \".astro\": \"astro\",\n \".ml\": \"ocaml\",\n \".mli\": \"ocaml\",\n \".tf\": \"terraform\",\n \".tfvars\": \"terraform-vars\",\n \".hcl\": \"hcl\",\n \".nix\": \"nix\",\n \".typ\": \"typst\",\n \".typc\": \"typst\",\n}\n\nexport function filetype(input?: string) {\n if (!input) return \"none\"\n const language = LANGUAGE_EXTENSIONS[path.extname(input)]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(language)) return \"typescript\"\n return language\n}\n",
"export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST\n\t// The payload stops at the first terminator character rather than scanning ahead for one, so an unterminated `ESC ]` cannot rescan the rest of the input. Terminals likewise abort a control string on an unexpected ESC.\n\tconst osc = `(?:\\\\u001B\\\\][^\\\\u0007\\\\u001B\\\\u009C]*${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n",
"import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n"
],
"mappings": "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",
"debugId": "B094AAEE1463381764756E2164756E21",
"names": []
}

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

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

{
"version": 3,
"sources": ["src/commands/handlers/run.ts"],
"sourcesContent": [
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n"
],
"mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH",
"debugId": "3CDA094CF5D81BA864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/plugin/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Npm } from \"@opencode-ai/util/npm\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { resolveConfigPath } from \"../mcp/add\"\nimport { Config } from \"../../../config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.add,\n Effect.fn(\"cli.plugin.add\")(function* (input) {\n if (!(yield* Effect.promise(() => Npm.isRegistryPackage(input.package))))\n return yield* Effect.fail(\n new Error(\"Plugin target must be an npm registry package name, version, tag, or semver range\"),\n )\n const npm = yield* Npm.Service\n const installed = yield* npm.add(input.package, { subpaths: [\"server\", \"\"] })\n const tui = yield* npm.resolve(input.package, { subpaths: [\"tui\"] })\n const target = configurationTarget(installed.entrypoint, tui.entrypoint)\n if (!target)\n return yield* Effect.fail(new Error(`Plugin package has no server or TUI entrypoint: ${input.package}`))\n\n if (target === \"server\") {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const changed = yield* Effect.promise(() => writePluginConfig(configPath, input.package))\n process.stdout.write(\n changed\n ? `Plugin \"${input.package}\" installed and added to ${configPath}${EOL}`\n : `Plugin \"${input.package}\" is already configured in ${configPath}${EOL}`,\n )\n return\n }\n\n const config = yield* Config.Service\n yield* config.update((draft) => {\n if (configured(draft.plugins, input.package)) return\n draft.plugins = [...(draft.plugins ?? []), input.package]\n })\n process.stdout.write(`TUI plugin \"${input.package}\" installed and added to ${config.path}${EOL}`)\n }),\n)\n\nexport function configurationTarget(server?: string, tui?: string) {\n if (server) return \"server\" as const\n if (tui) return \"tui\" as const\n}\n\nexport async function writePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(text, [\"plugins\"], [...(plugins ?? []), spec], { formattingOptions: { tabSize: 2, insertSpaces: true } }),\n )\n await mkdir(path.dirname(configPath), { recursive: true })\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some(\n (entry) =>\n entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec),\n )\n}\n"
],
"mappings": ";8tBAAA,cAAS,WACT,oBACA,gBAAS,cAAO,YAAU,eAAQ,oBAUlC,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,IAClC,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,GAAI,EAAE,MAAO,EAAO,QAAQ,IAAM,EAAI,kBAAkB,EAAM,OAAO,CAAC,GACpE,OAAO,MAAO,EAAO,KACf,MAAM,mFAAmF,CAC/F,EACF,IAAM,EAAM,MAAO,EAAI,QACjB,EAAY,MAAO,EAAI,IAAI,EAAM,QAAS,CAAE,SAAU,CAAC,SAAU,EAAE,CAAE,CAAC,EACtE,EAAM,MAAO,EAAI,QAAQ,EAAM,QAAS,CAAE,SAAU,CAAC,KAAK,CAAE,CAAC,EAC7D,EAAS,EAAoB,EAAU,WAAY,EAAI,UAAU,EACvE,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,mDAAmD,EAAM,SAAS,CAAC,EAEzG,GAAI,IAAW,SAAU,CACvB,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAY,EAAM,OAAO,CAAC,EACxF,QAAQ,OAAO,MACb,EACI,WAAW,EAAM,mCAAmC,IAAa,IACjE,WAAW,EAAM,qCAAqC,IAAa,GACzE,EACA,OAGF,IAAM,EAAS,MAAO,EAAO,QAC7B,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,GAAI,EAAW,EAAM,QAAS,EAAM,OAAO,EAAG,OAC9C,EAAM,QAAU,CAAC,GAAI,EAAM,SAAW,CAAC,EAAI,EAAM,OAAO,EACzD,EACD,QAAQ,OAAO,MAAM,eAAe,EAAM,mCAAmC,EAAO,OAAO,GAAK,EACjG,CACH,EAEO,SAAS,CAAmB,CAAC,EAAiB,EAAc,CACjE,GAAI,EAAQ,MAAO,SACnB,GAAI,EAAK,MAAO,MAGlB,eAAsB,CAAiB,CAAC,EAAoB,EAAc,CACxE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,EAAW,EAAS,CAAI,EAAG,MAAO,GAEtC,IAAM,EAAU,EACd,EACA,EAAO,EAAM,CAAC,SAAS,EAAG,CAAC,GAAI,GAAW,CAAC,EAAI,CAAI,EAAG,CAAE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CAAE,CAAC,CACjH,EACA,MAAM,EAAM,EAAK,QAAQ,CAAU,EAAG,CAAE,UAAW,EAAK,CAAC,EACzD,IAAM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KACd,CAAC,IACC,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,OAAQ,YAAa,IAAS,EAAM,UAAY,CAC9G",
"debugId": "F9822C0D465D4ECB64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n env: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\", \"env\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\" || key === \"env\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* (input: { readonly checkVersion?: boolean } = {}) {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: input.checkVersion ? OPENCODE_VERSION : undefined,\n env: (yield* read()).env,\n command: [\n ...selfCommand(),\n \"serve\",\n \"--service\",\n ],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => ({}) as Info),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string, name?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service get ${selected}`)\n switch (selected) {\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 case \"env\": {\n const env = (yield* read()).env ?? {}\n return name === undefined ? JSON.stringify(env, null, 2) : (env[name] ?? \"\")\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string, nestedValue?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && nestedValue !== undefined)\n throw new Error(`Usage: opencode service set ${selected} <value>`)\n switch (selected) {\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 case \"env\": {\n if (nestedValue === undefined) throw new Error(\"Usage: opencode service set env <key> <value>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n yield* write({ ...existing, env: { ...existing.env, [value]: nestedValue } })\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string, name?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service unset ${selected}`)\n switch (selected) {\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 case \"env\": {\n if (name === undefined) throw new Error(\"Usage: opencode service unset env <key>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n const { [name]: _removed, ...env } = existing.env ?? {}\n const { env: _existingEnv, ...rest } = existing\n yield* write(Object.keys(env).length === 0 ? rest : { ...rest, env })\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": "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",
"debugId": "2D3DC95CDBC35BF564756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/auth/logout.ts"],
"sourcesContent": [
"import { autocomplete, intro, outro, spinner } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { IntegrationInfo } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { createClient, loadIntegrations, location, request, resolveIntegration } from \"./shared\"\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.logout,\n Effect.fn(\"cli.auth.logout\")((input) =>\n logout({\n target: Option.getOrUndefined(input.target),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst logout = Effect.fn(\"cli.auth.logout.run\")(function* (input: {\n target?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Remove credential\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integrations = yield* loadIntegrations(client)\n const integration = yield* chooseIntegration(integrations, input.target)\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n const environment = integration.connections\n .filter((connection) => connection.type === \"env\")\n .map((connection) => connection.name)\n if (environment.length) {\n yield* Effect.fail(\n new Error(\n `${integration.name} is authenticated through ${environment.join(\", \")}; unset the environment variable to disconnect`,\n ),\n )\n }\n yield* Effect.fail(new Error(`No stored credentials for ${integration.name}`))\n }\n const progress = spinner()\n progress.start(\"Removing credential...\")\n yield* Effect.forEach(\n credentials,\n (connection) =>\n request((signal) => client.credential.remove({ credentialID: connection.id, location }, { signal })),\n { concurrency: \"unbounded\", discard: true },\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Disconnected from ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Failed to remove credential\", 1))),\n )\n outro(\"Done\")\n})\n\nconst chooseIntegration = Effect.fn(\"cli.auth.logout.integration\")(function* (\n integrations: IntegrationInfo[],\n target?: string,\n) {\n if (target) return yield* resolveIntegration(integrations, target)\n const configured = integrations.filter((integration) =>\n integration.connections.some((connection) => connection.type === \"credential\"),\n )\n if (configured.length === 0) return yield* Effect.fail(new Error(\"No stored credentials found\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: configured.map((integration) => ({\n value: integration.id,\n label: integration.name,\n hint: integration.connections\n .filter((connection) => connection.type === \"credential\")\n .map((connection) => connection.label)\n .join(\", \"),\n })),\n }),\n )\n return yield* resolveIntegration(configured, id)\n})\n"
],
"mappings": ";2yCAQA,IAAe,IAAQ,QACrB,EAAS,SAAS,KAAK,SAAS,OAChC,EAAO,GAAG,iBAAiB,EAAE,CAAC,IAC5B,EAAO,CACL,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EAAE,KAAK,CAAkB,CAC5B,CACF,EAEM,EAAS,EAAO,GAAG,qBAAqB,EAAE,SAAU,CAAC,EAIxD,CACD,GAAI,CAAC,EAAM,OACT,MAAO,EAAmB,6EAA6E,EACzG,EAAM,mBAAmB,EACzB,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAM,OAAQ,WAAY,EAAM,UAAW,CAAC,EACnF,EAAe,MAAO,EAAiB,CAAM,EAC7C,EAAc,MAAO,EAAkB,EAAc,EAAM,MAAM,EACjE,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,IAAM,EAAc,EAAY,YAC7B,OAAO,CAAC,IAAe,EAAW,OAAS,KAAK,EAChD,IAAI,CAAC,IAAe,EAAW,IAAI,EACtC,GAAI,EAAY,OACd,MAAO,EAAO,KACR,MACF,GAAG,EAAY,iCAAiC,EAAY,KAAK,IAAI,iDACvE,CACF,EAEF,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAY,MAAM,CAAC,EAE/E,IAAM,EAAW,EAAQ,EACzB,EAAS,MAAM,wBAAwB,EACvC,MAAO,EAAO,QACZ,EACA,CAAC,IACC,EAAQ,CAAC,IAAW,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EACrG,CAAE,YAAa,YAAa,QAAS,EAAK,CAC5C,EAAE,KACA,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,qBAAqB,EAAY,MAAM,CAAC,CAAC,EAC1F,EAAO,SAAS,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,8BAA+B,CAAC,CAAC,CAAC,CAC1F,EACA,EAAM,MAAM,EACb,EAEK,EAAoB,EAAO,GAAG,6BAA6B,EAAE,SAAU,CAC3E,EACA,EACA,CACA,GAAI,EAAQ,OAAO,MAAO,EAAmB,EAAc,CAAM,EACjE,IAAM,EAAa,EAAa,OAAO,CAAC,IACtC,EAAY,YAAY,KAAK,CAAC,IAAe,EAAW,OAAS,YAAY,CAC/E,EACA,GAAI,EAAW,SAAW,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,6BAA6B,CAAC,EAC/F,IAAM,EAAK,MAAO,EAAe,IAC/B,EAAa,CACX,QAAS,qBACT,SAAU,EACV,QAAS,EAAW,IAAI,CAAC,KAAiB,CACxC,MAAO,EAAY,GACnB,MAAO,EAAY,KACnB,KAAM,EAAY,YACf,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACvD,IAAI,CAAC,IAAe,EAAW,KAAK,EACpC,KAAK,IAAI,CACd,EAAE,CACJ,CAAC,CACH,EACA,OAAO,MAAO,EAAmB,EAAY,CAAE,EAChD",
"debugId": "4B6EAF6059DE1C9364756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"],
"sourcesContent": [
"import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\nimport { Env } from \"../env\"\nimport { errorMessage } from \"../util/error\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n // Bun's default five-minute deadline terminates the event stream used by long-running sessions.\n fetch: ((request: RequestInfo | URL, init?: RequestInit) =>\n fetch(request, { ...init, timeout: false } as BunFetchRequestInit)) as typeof fetch,\n })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n environment: input.server.service ? Env.session() : undefined,\n prepare: async (next) => {\n const selected =\n next.model ??\n (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n return { model, agent: next.agent }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n",
"import type {\n EventSubscribeOutput,\n JsonValue,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n ToolContent,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { nonEmptyToolContent, toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n metadata: Record<string, JsonValue>\n content: ToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.inbox.delivered\") {\n if (event.data.inboxID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.id), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) {\n current.metadata = event.data.metadata\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n metadata: event.data.metadata,\n content: event.data.content,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n metadata: event.data.metadata,\n content: event.data.content,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const metadata = event.data.metadata ?? current.metadata\n const content = event.data.content ?? nonEmptyToolContent(current.content)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n metadata,\n content,\n error: event.data.error,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (content && toolOutputText(current.tool, content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n metadata,\n content,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (input.compatibility === \"v1\" && event.data.error.message === \"The provider response ended unexpectedly.\") {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n partID: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n id: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (item.state.content && toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({\n ...item,\n state: {\n status: \"completed\",\n input: item.state.input,\n metadata: item.state.metadata,\n content: item.state.content,\n },\n })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, id: string) {\n return `${messageID}\\u0000${id}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; id: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n metadata: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n",
"import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n"
],
"mappings": "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",
"debugId": "8B4A09E79895D96664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "6CABE1CEE730303164756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/plugin/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type PluginInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { Config } from \"../../../config\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { discoverTuiPlugins, tuiPluginDirectories } from \"@opencode-ai/tui/plugin/discovery\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const config = yield* Config.Service\n const global = yield* Global.Service\n const info = yield* config.get()\n const discovered = yield* Effect.promise(() =>\n tuiPluginDirectories(process.cwd(), global.config).then(discoverTuiPlugins),\n )\n const output = format(\n response.data,\n [\n ...(info.plugins ?? []).flatMap((entry) => {\n const target = typeof entry === \"string\" ? entry : entry.package\n return target.startsWith(\"-\") ? [] : [{ target, source: \"configured\" as const }]\n }),\n ...discovered.map((target) => ({ target, source: \"discovered\" as const })),\n ],\n input.builtin,\n )\n if (!output) {\n process.stdout.write(\"No plugins found\" + EOL)\n return\n }\n process.stdout.write(output + EOL)\n }),\n)\n\nexport function format(\n plugins: readonly PluginInfo[],\n tui: ReadonlyArray<{ readonly target: string; readonly source: \"configured\" | \"discovered\" }>,\n builtin = false,\n) {\n const server = plugins\n .filter((plugin) => builtin || plugin.source.type !== \"builtin\")\n .toSorted((a, b) => name(a).localeCompare(name(b)))\n .map((plugin) => `${name(plugin)} (${plugin.status})`)\n const advertised = plugins.flatMap((plugin) =>\n plugin.status === \"active\" && plugin.tui && plugin.source.type === \"package\"\n ? [{ target: plugin.source.package, source: \"advertised\" as const }]\n : [],\n )\n const targets = [...tui, ...advertised]\n .filter((plugin, index, all) => all.findIndex((candidate) => candidate.target === plugin.target) === index)\n .toSorted((a, b) => a.target.localeCompare(b.target))\n .map((plugin) => `${plugin.target} (${plugin.source})`)\n return [\n targets.length ? [\"TUI\", ...targets].join(EOL) : undefined,\n server.length ? [\"Server\", ...server].join(EOL) : undefined,\n ]\n .filter((section) => section !== undefined)\n .join(EOL + EOL)\n}\n\nfunction name(plugin: PluginInfo) {\n if (plugin.id) return plugin.id\n if (plugin.source.type === \"package\") return plugin.source.package\n if (plugin.source.type === \"local\") return plugin.source.path\n return plugin.source.type\n}\n"
],
"mappings": ";o/BAAA,cAAS,WAWT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,KAClC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACrG,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAa,MAAO,EAAO,QAAQ,IACvC,EAAqB,QAAQ,IAAI,EAAG,EAAO,MAAM,EAAE,KAAK,CAAkB,CAC5E,EACM,EAAS,EACb,EAAS,KACT,CACE,IAAI,EAAK,SAAW,CAAC,GAAG,QAAQ,CAAC,IAAU,CACzC,IAAM,EAAS,OAAO,IAAU,SAAW,EAAQ,EAAM,QACzD,OAAO,EAAO,WAAW,GAAG,EAAI,CAAC,EAAI,CAAC,CAAE,SAAQ,OAAQ,YAAsB,CAAC,EAChF,EACD,GAAG,EAAW,IAAI,CAAC,KAAY,CAAE,SAAQ,OAAQ,YAAsB,EAAE,CAC3E,EACA,EAAM,OACR,EACA,GAAI,CAAC,EAAQ,CACX,QAAQ,OAAO,MAAM,mBAAqB,CAAG,EAC7C,OAEF,QAAQ,OAAO,MAAM,EAAS,CAAG,EAClC,CACH,EAEO,SAAS,CAAM,CACpB,EACA,EACA,EAAU,GACV,CACA,IAAM,EAAS,EACZ,OAAO,CAAC,IAAW,GAAW,EAAO,OAAO,OAAS,SAAS,EAC9D,SAAS,CAAC,EAAG,IAAM,EAAK,CAAC,EAAE,cAAc,EAAK,CAAC,CAAC,CAAC,EACjD,IAAI,CAAC,IAAW,GAAG,EAAK,CAAM,MAAM,EAAO,SAAS,EACjD,EAAa,EAAQ,QAAQ,CAAC,IAClC,EAAO,SAAW,UAAY,EAAO,KAAO,EAAO,OAAO,OAAS,UAC/D,CAAC,CAAE,OAAQ,EAAO,OAAO,QAAS,OAAQ,YAAsB,CAAC,EACjE,CAAC,CACP,EACM,EAAU,CAAC,GAAG,EAAK,GAAG,CAAU,EACnC,OAAO,CAAC,EAAQ,EAAO,IAAQ,EAAI,UAAU,CAAC,IAAc,EAAU,SAAW,EAAO,MAAM,IAAM,CAAK,EACzG,SAAS,CAAC,EAAG,IAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC,EACnD,IAAI,CAAC,IAAW,GAAG,EAAO,WAAW,EAAO,SAAS,EACxD,MAAO,CACL,EAAQ,OAAS,CAAC,MAAO,GAAG,CAAO,EAAE,KAAK,CAAG,EAAI,OACjD,EAAO,OAAS,CAAC,SAAU,GAAG,CAAM,EAAE,KAAK,CAAG,EAAI,MACpD,EACG,OAAO,CAAC,IAAY,IAAY,MAAS,EACzC,KAAK,EAAM,CAAG,EAGnB,SAAS,CAAI,CAAC,EAAoB,CAChC,GAAI,EAAO,GAAI,OAAO,EAAO,GAC7B,GAAI,EAAO,OAAO,OAAS,UAAW,OAAO,EAAO,OAAO,QAC3D,GAAI,EAAO,OAAO,OAAS,QAAS,OAAO,EAAO,OAAO,KACzD,OAAO,EAAO,OAAO",
"debugId": "160C0665046456CB64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/models.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.models,\n Effect.fn(\"cli.models\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const response = yield* Effect.promise(() => client.model.list({ location: { directory: process.cwd() } }))\n const models = response.data\n .map((model) => `${model.providerID}/${model.id}`)\n .toSorted((a, b) => a.localeCompare(b))\n if (models.length > 0) process.stdout.write(models.join(EOL) + EOL)\n }),\n)\n"
],
"mappings": ";giCAGA,cAAS,WAKT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EAEK,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KACrB,IAAI,CAAC,IAAU,GAAG,EAAM,cAAc,EAAM,IAAI,EAChD,SAAS,CAAC,EAAG,IAAM,EAAE,cAAc,CAAC,CAAC,EACxC,GAAI,EAAO,OAAS,EAAG,QAAQ,OAAO,MAAM,EAAO,KAAK,CAAG,EAAI,CAAG,EACnE,CACH",
"debugId": "5ACC810CDB66B66064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/auth/shared.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { OpenCode, type IntegrationInfo, type IntegrationMethod, type OpenCodeClient } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../../services/server-connection\"\n\nexport const location = { directory: process.cwd() }\n\nexport const createClient = Effect.fn(\"cli.auth.client\")(function* (input: ServerConnection.Args) {\n const server = yield* ServerConnection.resolve(input)\n return OpenCode.make({ baseUrl: server.endpoint.url, headers: Service.headers(server.endpoint) })\n})\n\nexport function request<A>(run: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({ try: run, catch: (cause) => cause })\n}\n\nexport const loadIntegrations = Effect.fn(\"cli.auth.integrations\")(function* (client: OpenCodeClient) {\n // The model endpoint is the existing public readiness boundary for the initial plugin generation.\n yield* request((signal) => client.model.default({ location }, { signal }))\n return yield* request((signal) => client.integration.list({ location }, { signal })).pipe(\n Effect.map((response) => response.data),\n )\n})\n\nexport const resolveIntegration = Effect.fn(\"cli.auth.resolve-integration\")(function* (\n integrations: IntegrationInfo[],\n target: string,\n) {\n const normalized = target.replace(/\\/+$/, \"\")\n const byID = integrations.find((integration) => integration.id === normalized)\n if (byID) return byID\n const matches = integrations.filter((integration) => integration.name.toLowerCase() === normalized.toLowerCase())\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) {\n return yield* Effect.fail(\n new Error(\n `Integration name \"${target}\" is ambiguous: ${matches.map((integration) => integration.id).join(\", \")}`,\n ),\n )\n }\n return yield* Effect.fail(new Error(`Integration not found: ${target}`))\n})\n\nexport type ConnectMethod = Exclude<IntegrationMethod, { type: \"env\" }>\n\nexport function connectMethods(integration: IntegrationInfo) {\n return integration.methods\n .filter((method): method is ConnectMethod => method.type !== \"env\")\n .toSorted((a, b) => Number(a.type === \"key\") - Number(b.type === \"key\"))\n}\n\nexport const resolveMethod = Effect.fn(\"cli.auth.resolve-method\")(function* (methods: ConnectMethod[], target: string) {\n const normalized = target.toLowerCase()\n const matches = methods.filter((method) => {\n if (method.type === \"key\") return normalized === \"key\" || method.label?.toLowerCase() === normalized\n return method.id === target || method.label.toLowerCase() === normalized\n })\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) return yield* Effect.fail(new Error(`Authentication method \"${target}\" is ambiguous`))\n const available = methods.map((method) => (method.type === \"key\" ? \"key\" : method.id)).join(\", \")\n return yield* Effect.fail(\n new Error(`Authentication method not found: ${target}${available ? `. Available: ${available}` : \"\"}`),\n )\n})\n"
],
"mappings": ";gNAKO,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAEtC,EAAe,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAA8B,CAChG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAAK,EACpD,OAAO,EAAS,KAAK,CAAE,QAAS,EAAO,SAAS,IAAK,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAAE,CAAC,EACjG,EAEM,SAAS,CAAU,CAAC,EAA0C,CACnE,OAAO,EAAO,WAAW,CAAE,IAAK,EAAK,MAAO,CAAC,IAAU,CAAM,CAAC,EAGzD,IAAM,EAAmB,EAAO,GAAG,uBAAuB,EAAE,SAAU,CAAC,EAAwB,CAGpG,OADA,MAAO,EAAQ,CAAC,IAAW,EAAO,MAAM,QAAQ,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAClE,MAAO,EAAQ,CAAC,IAAW,EAAO,YAAY,KAAK,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAAE,KACnF,EAAO,IAAI,CAAC,IAAa,EAAS,IAAI,CACxC,EACD,EAEY,EAAqB,EAAO,GAAG,8BAA8B,EAAE,SAAU,CACpF,EACA,EACA,CACA,IAAM,EAAa,EAAO,QAAQ,OAAQ,EAAE,EACtC,EAAO,EAAa,KAAK,CAAC,IAAgB,EAAY,KAAO,CAAU,EAC7E,GAAI,EAAM,OAAO,EACjB,IAAM,EAAU,EAAa,OAAO,CAAC,IAAgB,EAAY,KAAK,YAAY,IAAM,EAAW,YAAY,CAAC,EAChH,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EACnB,OAAO,MAAO,EAAO,KACf,MACF,qBAAqB,oBAAyB,EAAQ,IAAI,CAAC,IAAgB,EAAY,EAAE,EAAE,KAAK,IAAI,GACtG,CACF,EAEF,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,GAAQ,CAAC,EACxE,EAIM,SAAS,CAAc,CAAC,EAA8B,CAC3D,OAAO,EAAY,QAChB,OAAO,CAAC,IAAoC,EAAO,OAAS,KAAK,EACjE,SAAS,CAAC,EAAG,IAAM,OAAO,EAAE,OAAS,KAAK,EAAI,OAAO,EAAE,OAAS,KAAK,CAAC,EAGpE,IAAM,EAAgB,EAAO,GAAG,yBAAyB,EAAE,SAAU,CAAC,EAA0B,EAAgB,CACrH,IAAM,EAAa,EAAO,YAAY,EAChC,EAAU,EAAQ,OAAO,CAAC,IAAW,CACzC,GAAI,EAAO,OAAS,MAAO,OAAO,IAAe,OAAS,EAAO,OAAO,YAAY,IAAM,EAC1F,OAAO,EAAO,KAAO,GAAU,EAAO,MAAM,YAAY,IAAM,EAC/D,EACD,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,iBAAsB,CAAC,EAC7G,IAAM,EAAY,EAAQ,IAAI,CAAC,IAAY,EAAO,OAAS,MAAQ,MAAQ,EAAO,EAAG,EAAE,KAAK,IAAI,EAChG,OAAO,MAAO,EAAO,KACf,MAAM,oCAAoC,IAAS,EAAY,gBAAgB,IAAc,IAAI,CACvG,EACD",
"debugId": "873222A377ABD3A964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "DDBC4F65F18C8B7964756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/version.ts"],
"sourcesContent": [
"declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n"
],
"mappings": ";AAGA,IAAM,EAAiD,kBACjD,EAAiD,MAGhD,IAAM,EAAiB",
"debugId": "A5406850A91BE68264756E2164756E21",
"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(\n (yield* ServiceConfig.get(Option.getOrUndefined(input.key), Option.getOrUndefined(input.name))) + EOL,\n )\n }),\n)\n"
],
"mappings": ";02BAAA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,QAAQ,OAAO,OACZ,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,EAAG,EAAO,eAAe,EAAM,IAAI,CAAC,GAAK,CACpG,EACD,CACH",
"debugId": "214EE17A0676E5AB64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/export.ts"],
"sourcesContent": [
"import { autocomplete, cancel, intro, isCancel, log, outro } from \"@clack/prompts\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { errorMessage } from \"../../util/error\"\n\nexport default Runtime.handler(\n Commands.commands.export,\n Effect.fn(\"cli.export\")((input) =>\n Effect.gen(function* () {\n const requested = Option.getOrUndefined(input.session)\n if (!requested && !process.stdin.isTTY) {\n yield* Effect.fail(new Error(\"Pass a session ID when running without an interactive terminal\"))\n }\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const sessionID = requested\n ? requested\n : yield* Effect.gen(function* () {\n intro(\"Export session\", { output: process.stderr })\n const location = yield* Effect.tryPromise({\n try: () => client.location.get({ location: { directory: process.cwd() } }),\n catch: (cause) => cause,\n })\n const page = yield* Effect.tryPromise({\n try: () =>\n client.session.list({\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n order: \"desc\",\n limit: 50,\n }),\n catch: (cause) => cause,\n })\n if (page.data.length === 0) {\n log.error(\"No sessions found\", { output: process.stderr })\n outro(\"Done\", { output: process.stderr })\n return undefined\n }\n const selected = yield* Effect.tryPromise({\n try: () =>\n autocomplete({\n message: \"Select session to export\",\n maxItems: 10,\n options: page.data.map((session) => ({\n label: session.title,\n value: session.id,\n hint: `${new Date(session.time.updated).toLocaleString()} - ${session.id.slice(-8)}`,\n })),\n output: process.stderr,\n }),\n catch: (cause) => cause,\n })\n if (isCancel(selected)) {\n cancel(\"Cancelled\", { output: process.stderr })\n process.exitCode = 130\n return undefined\n }\n outro(\"Exporting session...\", { output: process.stderr })\n return selected\n })\n if (!sessionID) return\n const data = yield* Effect.tryPromise({\n try: () => client.session.export({ sessionID, sanitize: input.sanitize }),\n catch: (cause) => cause,\n })\n process.stdout.write(JSON.stringify(data, null, 2) + EOL)\n }).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n ),\n)\n"
],
"mappings": ";utCAIA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,CAAC,IACvB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAY,EAAO,eAAe,EAAM,OAAO,EACrD,GAAI,CAAC,GAAa,CAAC,QAAQ,MAAM,MAC/B,MAAO,EAAO,KAAS,MAAM,gEAAgE,CAAC,EAEhG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAY,EACd,EACA,MAAO,EAAO,IAAI,SAAU,EAAG,CAC7B,EAAM,iBAAkB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAClD,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IAAM,EAAO,SAAS,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,EACzE,MAAO,CAAC,IAAU,CACpB,CAAC,EACK,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAO,QAAQ,KAAK,CAClB,UAAW,EAAS,UACpB,UAAW,EAAS,YACpB,SAAU,KACV,MAAO,OACP,MAAO,EACT,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAK,KAAK,SAAW,EAAG,CAC1B,EAAI,MAAM,oBAAqB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACzD,EAAM,OAAQ,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACxC,OAEF,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IACH,EAAa,CACX,QAAS,2BACT,SAAU,GACV,QAAS,EAAK,KAAK,IAAI,CAAC,KAAa,CACnC,MAAO,EAAQ,MACf,MAAO,EAAQ,GACf,KAAM,GAAG,IAAI,KAAK,EAAQ,KAAK,OAAO,EAAE,eAAe,OAAO,EAAQ,GAAG,MAAM,EAAE,GACnF,EAAE,EACF,OAAQ,QAAQ,MAClB,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAS,CAAQ,EAAG,CACtB,EAAO,YAAa,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAC9C,QAAQ,SAAW,IACnB,OAGF,OADA,EAAM,uBAAwB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACjD,EACR,EACL,GAAI,CAAC,EAAW,OAChB,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IAAM,EAAO,QAAQ,OAAO,CAAE,YAAW,SAAU,EAAM,QAAS,CAAC,EACxE,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAM,KAAM,CAAC,EAAI,CAAG,EACzD,EAAE,KACD,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,CACF",
"debugId": "DF8E152FF462215A64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/import.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionTransfer } from \"@opencode-ai/schema/session-transfer\"\nimport { Effect, Option, Schema } from \"effect\"\nimport { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.import,\n Effect.fn(\"cli.import\")(function* (input) {\n const text = yield* Effect.tryPromise({\n try: () =>\n input.file.startsWith(\"http://\") || input.file.startsWith(\"https://\")\n ? fetch(input.file).then((response) => {\n if (!response.ok) throw new Error(`Failed to fetch session data: ${response.statusText}`)\n return response.text()\n })\n : Bun.file(input.file).text(),\n catch: (cause) =>\n new Error(`Failed to read session data: ${cause instanceof Error ? cause.message : String(cause)}`),\n })\n const data = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(SessionTransfer.Data))(text)\n const encoded = Schema.encodeSync(SessionTransfer.Data)(data)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const location = yield* Effect.promise(() =>\n client.location.get({\n location: { directory: path.resolve(Option.getOrElse(input.directory, () => process.cwd())) },\n }),\n )\n const response = yield* Effect.promise(() =>\n fetch(new URL(\"/api/session/import\", server.endpoint.url), {\n method: \"POST\",\n headers: { ...Service.headers(server.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...encoded,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n }),\n }),\n )\n if (response.status === 409) {\n process.stderr.write(`Session already exists${EOL}`)\n return\n }\n if (!response.ok) yield* Effect.fail(new Error(`Failed to import session: ${response.statusText}`))\n const imported = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ data: Session.Info })))(\n yield* Effect.promise(() => response.text()),\n )\n process.stdout.write(`Imported session: ${imported.data.id}${EOL}`)\n }),\n)\n"
],
"mappings": ";03CAKA,cAAS,WACT,oBAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAM,KAAK,WAAW,SAAS,GAAK,EAAM,KAAK,WAAW,UAAU,EAChE,MAAM,EAAM,IAAI,EAAE,KAAK,CAAC,IAAa,CACnC,GAAI,CAAC,EAAS,GAAI,MAAU,MAAM,iCAAiC,EAAS,YAAY,EACxF,OAAO,EAAS,KAAK,EACtB,EACD,IAAI,KAAK,EAAM,IAAI,EAAE,KAAK,EAChC,MAAO,CAAC,IACF,MAAM,gCAAgC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAAG,CACtG,CAAC,EACK,EAAO,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAgB,IAAI,CAAC,EAAE,CAAI,EAC1F,EAAU,EAAO,WAAW,EAAgB,IAAI,EAAE,CAAI,EACtD,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAW,MAAO,EAAO,QAAQ,IACrC,EAAO,SAAS,IAAI,CAClB,SAAU,CAAE,UAAW,EAAK,QAAQ,EAAO,UAAU,EAAM,UAAW,IAAM,QAAQ,IAAI,CAAC,CAAC,CAAE,CAC9F,CAAC,CACH,EACM,EAAW,MAAO,EAAO,QAAQ,IACrC,MAAM,IAAI,IAAI,sBAAuB,EAAO,SAAS,GAAG,EAAG,CACzD,OAAQ,OACR,QAAS,IAAK,EAAQ,QAAQ,EAAO,QAAQ,EAAG,eAAgB,kBAAmB,EACnF,KAAM,KAAK,UAAU,IAChB,EACH,SAAU,CAAE,UAAW,EAAS,UAAW,YAAa,EAAS,WAAY,CAC/E,CAAC,CACH,CAAC,CACH,EACA,GAAI,EAAS,SAAW,IAAK,CAC3B,QAAQ,OAAO,MAAM,yBAAyB,GAAK,EACnD,OAEF,GAAI,CAAC,EAAS,GAAI,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAS,YAAY,CAAC,EAClG,IAAM,EAAW,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAO,OAAO,CAAE,KAAM,EAAQ,IAAK,CAAC,CAAC,CAAC,EAC7G,MAAO,EAAO,QAAQ,IAAM,EAAS,KAAK,CAAC,CAC7C,EACA,QAAQ,OAAO,MAAM,qBAAqB,EAAS,KAAK,KAAK,GAAK,EACnE,CACH",
"debugId": "2B2AA16D2C92F4D864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../protocol/src/client.ts"],
"sourcesContent": [
"import { InvalidRequestError, SessionNotFoundError } from \"./errors.js\"\nimport { makeDefaultApi } from \"./api.js\"\nimport type { Api } from \"./api.js\"\nimport type { Context } from \"effect\"\nimport { HttpApiMiddleware } from \"effect/unstable/httpapi\"\nimport type { EventGroup } from \"./groups/event.js\"\n\nclass LocationMiddleware extends HttpApiMiddleware.Service<LocationMiddleware>()(\n \"@opencode-ai/client/LocationMiddleware\",\n) {}\n\nclass SessionLocationMiddleware extends HttpApiMiddleware.Service<SessionLocationMiddleware>()(\n \"@opencode-ai/client/SessionLocationMiddleware\",\n { error: [InvalidRequestError, SessionNotFoundError] },\n) {}\n\ntype ClientApiShape = Api<\n Context.Service.Identifier<typeof LocationMiddleware>,\n Context.Service.Shape<typeof LocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n typeof EventGroup\n>\n\nexport const ClientApi: ClientApiShape = makeDefaultApi({\n locationMiddleware: LocationMiddleware,\n // The real server uses a form-specific middleware with an undocumented `global` sentinel branch.\n // The generated client only needs a middleware identity for API typing.\n formLocationMiddleware: SessionLocationMiddleware,\n sessionLocationMiddleware: SessionLocationMiddleware,\n})\n\nexport const groupNames = {\n \"server.health\": \"health\",\n \"server.server\": \"server\",\n \"server.debug\": \"debug\",\n \"server.migration\": \"migration\",\n \"server.location\": \"location\",\n \"server.agent\": \"agent\",\n \"server.plugin\": \"plugin\",\n \"server.session\": \"session\",\n \"server.message\": \"message\",\n \"server.model\": \"model\",\n \"server.generate\": \"generate\",\n \"server.provider\": \"provider\",\n \"server.integration\": \"integration\",\n \"server.websearch\": \"websearch\",\n \"server.credential\": \"credential\",\n \"server.form\": \"form\",\n \"server.permission\": \"permission\",\n \"server.fs\": \"file\",\n \"server.command\": \"command\",\n \"server.skill\": \"skill\",\n \"server.event\": \"event\",\n \"server.pty\": \"pty\",\n \"server.shell\": \"shell\",\n \"server.mcp\": \"mcp\",\n \"server.reference\": \"reference\",\n \"server.project\": \"project\",\n \"server.worktree\": \"worktree\",\n \"server.workspace\": \"workspace\",\n \"server.vcs\": \"vcs\",\n \"server.config\": \"config\",\n} as const\n\nexport const promiseOmitEndpoints = new Set([\"pty.connect\"])\nexport const effectOmitEndpoints = new Set([\"fs.read\", \"pty.connect\"])\n"
],
"mappings": ";giCAOA,MAAM,UAA2B,EAAkB,QAA4B,EAC7E,wCACF,CAAE,CAAC,CAEH,MAAM,UAAkC,EAAkB,QAAmC,EAC3F,gDACA,CAAE,MAAO,CAAC,EAAqB,CAAoB,CAAE,CACvD,CAAE,CAAC,CAYI,IAAM,EAA4B,EAAe,CACtD,mBAAoB,EAGpB,uBAAwB,EACxB,0BAA2B,CAC7B,CAAC,EAEY,EAAa,CACxB,gBAAiB,SACjB,gBAAiB,SACjB,eAAgB,QAChB,mBAAoB,YACpB,kBAAmB,WACnB,eAAgB,QAChB,gBAAiB,SACjB,iBAAkB,UAClB,iBAAkB,UAClB,eAAgB,QAChB,kBAAmB,WACnB,kBAAmB,WACnB,qBAAsB,cACtB,mBAAoB,YACpB,oBAAqB,aACrB,cAAe,OACf,oBAAqB,aACrB,YAAa,OACb,iBAAkB,UAClB,eAAgB,QAChB,eAAgB,QAChB,aAAc,MACd,eAAgB,QAChB,aAAc,MACd,mBAAoB,YACpB,iBAAkB,UAClB,kBAAmB,WACnB,mBAAoB,YACpB,aAAc,MACd,gBAAiB,QACnB,EAEa,EAAuB,IAAI,IAAI,CAAC,aAAa,CAAC,EAC9C,EAAsB,IAAI,IAAI,CAAC,UAAW,aAAa,CAAC",
"debugId": "E55F9A2F5CB9314C64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/service/start.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,EAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "C7090F2242BA364564756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/stop.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n"
],
"mappings": ";+2BAMA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,KACnC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,MAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "7FBFFF7DC2F38B5764756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/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 drives the same\n// presentation commits and footer actions as the live transport. This\n// lets you test scrollback formatting, permission UI, canonical Form 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// /form [kind] → triggers a canonical Form request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, shell,\n// write, edit, patch, subagent, question, error, mix)\n//\n// Demo mode handles permission and Form replies locally, completing or failing\n// the synthetic tool parts through the same callbacks used by the live footer.\nimport path from \"path\"\nimport type { JsonValue, SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { parseSlashHead } from \"../prompt/parse\"\nimport { writeSessionOutput } from \"./stream\"\nimport { toolCommit, toolFinalPhase } from \"./stream-v2.subagent\"\nimport type {\n FooterApi,\n FooterView,\n FormCancel,\n FormReply,\n MiniFormRequest,\n MiniPermissionRequest,\n PermissionReply,\n RunPrompt,\n StreamCommit,\n} from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"shell\",\n \"write\",\n \"edit\",\n \"patch\",\n \"subagent\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"shell\", \"read\", \"subagent\", \"external\", \"doom\"] as const\nconst FORMS = [\"question\", \"external\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype FormKind = (typeof FORMS)[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 formKind(value: string | undefined): FormKind | undefined {\n const next = (value || \"question\").toLowerCase()\n return FORMS.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 call: string\n tool: string\n input: Record<string, JsonValue>\n start: number\n}\n\ntype FormRequest = {\n ref: Ref\n kind: FormKind\n request: MiniFormRequest\n}\n\ntype Perm = {\n ref: Ref\n done: {\n output: string\n metadata?: Record<string, JsonValue>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: MiniPermissionRequest[\"metadata\"]\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n footer: FooterApi\n msg: number\n part: number\n call: number\n perm: number\n form: number\n perms: Map<string, Perm>\n forms: Map<string, FormRequest>\n started: Set<string>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\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 forms: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n },\n ],\n details: {\n [input.sessionID]: {\n commits: input.commits,\n },\n },\n permissions: [],\n forms: [],\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\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction present(state: State, commits: StreamCommit[], view?: FooterView): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits,\n updates: view\n ? [\n {\n type: \"stream.patch\" as const,\n patch: { status: view.type === \"permission\" ? \"awaiting permission\" : \"awaiting form\" },\n },\n { type: \"stream.view\" as const, view },\n ]\n : undefined,\n },\n )\n}\n\nfunction clearBlocker(state: State): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits: [],\n updates: [\n { type: \"stream.patch\", patch: { status: \"\" } },\n { type: \"stream.view\", view: { type: \"prompt\" } },\n ],\n },\n )\n}\n\nfunction open(state: State): string {\n return take(state, \"msg\", \"msg\")\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 for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n present(state, [\n { kind: \"assistant\", source: \"assistant\", text: item, phase: \"progress\", messageID: msg, partID: part },\n ])\n await wait(45, signal)\n }\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 let first = true\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n if (state.thinking) {\n present(state, [\n {\n kind: \"reasoning\",\n source: \"reasoning\",\n text: first ? `Thinking: ${item.replace(/\\[REDACTED\\]/g, \"\")}` : item.replace(/\\[REDACTED\\]/g, \"\"),\n phase: \"progress\",\n messageID: msg,\n partID: part,\n },\n ])\n first = false\n }\n await wait(45, signal)\n }\n}\n\nfunction make(state: State, tool: string, input: Record<string, JsonValue>): Ref {\n return {\n msg: open(state),\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, JsonValue> = {}): SessionMessageAssistantTool {\n state.started.add(ref.call)\n const part = {\n type: \"tool\" as const,\n id: ref.call,\n name: ref.tool,\n state: { status: \"running\" as const, input: ref.input, metadata },\n time: { created: ref.start, ran: ref.start },\n }\n present(state, [toolCommit(part, ref.msg, \"start\")])\n return part\n}\n\nfunction askPermission(state: State, item: Permit): void {\n const tool = 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 present(state, [], {\n type: \"permission\",\n request: {\n id,\n sessionID: state.id,\n action: item.permission,\n resources: item.patterns,\n metadata: item.metadata ?? {},\n save: item.always,\n source: { type: \"tool\", messageID: item.ref.msg, id: item.ref.call },\n tool,\n },\n })\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n output: string\n metadata?: Record<string, JsonValue>\n },\n): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n const part: SessionMessageAssistantTool = {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n content: [{ type: \"text\", text: output.output }],\n metadata: output.metadata,\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n }\n present(state, [toolCommit(part, ref.msg, toolFinalPhase(part))])\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n present(state, [\n toolCommit(\n {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error: { type: \"unknown\", message: error },\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n },\n ref.msg,\n \"final\",\n ),\n ])\n}\n\nfunction emitError(state: State, text: string): void {\n present(state, [{ kind: \"error\", source: \"system\", text, phase: \"start\" }])\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"shell\", {\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 output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exit: 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 path: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\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 path: file,\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n file,\n status: \"modified\",\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\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 output: \"\",\n metadata: {\n files: [\n {\n status: \"modified\",\n file,\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n status: \"added\",\n file: path.join(process.cwd(), \"README-demo.md\"),\n patch: \"@@ -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, \"subagent\", {\n description: \"Scan run/* for reducer touchpoints\",\n agent: \"explore\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n sessionID: \"ses_demo_child\",\n status: \"completed\",\n output: \"\",\n },\n })\n const part = {\n type: \"tool\",\n id: \"sub_demo_call_1\",\n name: \"read\",\n state: {\n status: \"running\",\n input: {\n path: \"packages/tui/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n metadata: {},\n },\n time: { created: Date.now(), ran: Date.now() },\n } satisfies SessionMessageAssistantTool\n showSubagent(state, {\n sessionID: \"ses_demo_child\",\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\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 toolCommit(part, \"sub_demo_msg_tool\", \"start\"),\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 custom: 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 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 === \"shell\") {\n const command = \"git status --short\"\n const ref = make(state, \"shell\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"shell\",\n patterns: [command],\n always: [\"*\"],\n done: {\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exit: 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 path: 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 output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"subagent\") {\n const ref = make(state, \"subagent\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n agent: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"subagent\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n output: \"\",\n metadata: {\n sessionID: \"sub_demo_perm_1\",\n status: \"completed\",\n output: \"\",\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 path: 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 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, \"subagent\", {\n description: \"Retry the formatter after repeated failures\",\n agent: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\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 path: file,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n output: \"\",\n metadata: {\n files: [{ file, status: \"modified\", patch: diff }],\n },\n },\n })\n}\n\nfunction demoForm(kind: FormKind): { title: string; fields: MiniFormRequest[\"fields\"]; questions?: JsonValue[] } {\n if (kind === \"question\") {\n const questions: JsonValue[] = [\n {\n header: \"Layout\",\n question: \"Which footer view should be the reference for spacing checks?\",\n options: [\n { label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: true,\n },\n {\n header: \"Checks\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit an edit diff\" },\n { label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n return {\n title: \"Questions\",\n questions,\n fields: [\n {\n key: \"q0\",\n title: \"Layout\",\n description: \"Which footer view should be the reference for spacing checks?\",\n type: \"string\",\n options: [\n { value: \"Form\", label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { value: \"Prompt\", label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n custom: true,\n },\n {\n key: \"q1\",\n title: \"Checks\",\n description: \"Pick formatting previews\",\n type: \"multiselect\",\n options: [\n { value: \"Diff\", label: \"Diff\", description: \"Emit an edit diff\" },\n { value: \"Subagent\", label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n custom: true,\n },\n ],\n }\n }\n return {\n title: \"MCP authorization\",\n fields: [\n {\n key: \"authorization\",\n type: \"external\",\n url: \"https://example.com/opencode-demo\",\n title: \"Authorize demo MCP server\",\n description: \"Complete authorization in your browser\",\n },\n ],\n }\n}\n\nfunction emitForm(state: State, kind: FormKind = \"question\"): void {\n const form = demoForm(kind)\n const ref = make(state, kind === \"question\" ? \"question\" : \"mcp_demo\", {\n ...(form.questions ? { questions: form.questions } : { form: kind }),\n })\n startTool(state, ref)\n state.form++\n const request: MiniFormRequest = {\n id: `frm_demo_${state.form}`,\n sessionID: state.id,\n title: form.title,\n metadata:\n kind === \"question\"\n ? { kind: \"question\", tool: { messageID: ref.msg, id: ref.call } }\n : { kind: \"mcp\", message: `Synthetic ${kind} MCP elicitation` },\n fields: form.fields,\n }\n state.forms.set(request.id, { ref, kind, request })\n present(state, [], { type: \"form\", request })\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 === \"shell\") {\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 === \"subagent\") {\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 `- /form [kind] (${FORMS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission shell\",\n \"- /form question\",\n \"- /form external\",\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 footer: input.footer,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n form: 0,\n perms: new Map(),\n forms: new Map(),\n started: new Set(),\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 head = parseSlashHead(text)\n const list = head?.arguments.split(/\\s+/).filter(Boolean) ?? []\n const cmd = head ? `/${head.name}` : \"\"\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[0])\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 === \"/form\") {\n const kind = formKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a form kind: ${FORMS.join(\", \")}`)\n return true\n }\n\n emitForm(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[0] || \"\").toLowerCase()\n const body = list.slice(1).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 clearBlocker(state)\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 formReply = (input: FormReply): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n if (form.kind === \"question\") {\n doneTool(state, form.ref, {\n output: \"\",\n metadata: {\n answers: form.request.fields.map((field) => {\n const value = input.answer[field.key]\n if (value === undefined) return []\n return Array.isArray(value) ? [...value] : [String(value)]\n }),\n },\n })\n return true\n }\n doneTool(state, form.ref, {\n output: `Form submitted: ${Object.entries(input.answer)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\", \") : String(value)}`)\n .join(\"; \")}\\n`,\n metadata: { answer: input.answer },\n })\n return true\n }\n\n const formCancel = (input: FormCancel): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n failTool(state, form.ref, \"form cancelled\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n formReply,\n formCancel,\n }\n}\n"
],
"mappings": "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",
"debugId": "11082F80DBD16FAB64756E2164756E21",
"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/auth/form.ts", "src/commands/handlers/auth/login.ts"],
"sourcesContent": [
"import { confirm, log, multiselect, password, select, text, type Option } from \"@clack/prompts\"\nimport { Effect } from \"effect\"\nimport type { FormAnswer, FormField, FormFields } from \"@opencode-ai/client\"\nimport { openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\n\nconst skip = Symbol(\"skip\")\nconst custom = Symbol(\"custom\")\n\nexport const answerForm = Effect.fn(\"cli.auth.form\")(function* (fields: FormFields | undefined) {\n if (!fields) return undefined\n yield* requireInteractive(\"Authentication form input requires an interactive terminal\")\n const answer: FormAnswer = {}\n for (const field of fields) {\n if (!active(field, answer)) continue\n const value = yield* answerField(field)\n if (value !== undefined) answer[field.key] = value\n }\n return answer\n})\n\nexport const secret = Effect.fn(\"cli.auth.secret\")(function* (message: string) {\n yield* requireInteractive(\"API key input requires an interactive terminal\")\n return yield* prompt<string>(() => password({ message, validate: (value) => (!value ? \"Required\" : undefined) }))\n})\n\nconst answerField = Effect.fn(\"cli.auth.form.field\")(function* (field: FormField) {\n const message = field.title ?? field.key\n if (field.description) log.info(field.description)\n if (field.type === \"external\") {\n log.info(field.url)\n yield* openUrl(field.url)\n const acknowledged = yield* prompt<boolean>(() =>\n confirm({ message: message || \"Continue after completing this step?\", initialValue: true }),\n )\n if (!acknowledged) return yield* Effect.fail(new Error(`${message || \"External step\"} is required`))\n return true\n }\n if (field.type === \"boolean\") {\n if (field.required) return yield* prompt<boolean>(() => confirm({ message, initialValue: field.default ?? true }))\n const options: Array<Option<boolean | typeof skip>> = [\n { value: true, label: \"Yes\" },\n { value: false, label: \"No\" },\n { value: skip, label: \"Skip\" },\n ]\n const value = yield* prompt<boolean | typeof skip>(() =>\n select<boolean | typeof skip>({\n message,\n options,\n initialValue: field.default ?? skip,\n }),\n )\n if (value === skip) return undefined\n return value\n }\n if (field.type === \"multiselect\") {\n const options: Array<Option<string | typeof custom>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type another value\" })\n const values = yield* prompt<Array<string | typeof custom>>(() =>\n multiselect<string | typeof custom>({\n message,\n options,\n initialValues: field.default,\n required: field.required || (field.minItems ?? 0) > 0,\n }),\n )\n const selected = values.filter((value): value is string => value !== custom)\n if (values.includes(custom)) {\n selected.push(yield* prompt<string>(() => text({ message: \"Enter value\", validate: required })))\n }\n if (field.minItems !== undefined && selected.length < field.minItems) {\n return yield* Effect.fail(new Error(`Select at least ${field.minItems}`))\n }\n if (field.maxItems !== undefined && selected.length > field.maxItems) {\n return yield* Effect.fail(new Error(`Select at most ${field.maxItems}`))\n }\n return selected\n }\n if (field.type === \"string\" && field.options) {\n const options: Array<Option<string | typeof custom | typeof skip>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type your own answer\" })\n if (!field.required) options.push({ value: skip, label: \"Skip\" })\n const value = yield* prompt<string | typeof custom | typeof skip>(() =>\n select<string | typeof custom | typeof skip>({ message, options, initialValue: field.default }),\n )\n if (value === skip) return undefined\n if (value !== custom) return value\n }\n const value = yield* prompt<string>(() =>\n text({\n message,\n placeholder: field.type === \"string\" ? field.placeholder : undefined,\n initialValue: field.default === undefined ? undefined : String(field.default),\n validate: (input) => validateText(field, input),\n }),\n )\n if (!value && !field.required) return undefined\n if (field.type === \"string\") return value\n return Number(value)\n})\n\nfunction active(field: FormField, answer: FormAnswer) {\n if (field.type === \"external\" || !field.when) return true\n return field.when.every((condition) => {\n const value = answer[condition.key]\n if (value === undefined) return false\n const matches = Array.isArray(value) ? value.includes(String(condition.value)) : value === condition.value\n return condition.op === \"eq\" ? matches : !matches\n })\n}\n\nfunction required(value: string | undefined) {\n return value ? undefined : \"Required\"\n}\n\nfunction validateText(field: Exclude<FormField, { type: \"boolean\" | \"external\" | \"multiselect\" }>, value?: string) {\n if (!value) return field.required ? \"Required\" : undefined\n if (field.type === \"number\" || field.type === \"integer\") {\n const number = Number(value)\n if (!Number.isFinite(number)) return \"Expected a number\"\n if (field.type === \"integer\" && !Number.isInteger(number)) return \"Expected an integer\"\n if (typeof field.minimum === \"number\" && number < field.minimum) return `Must be at least ${field.minimum}`\n if (typeof field.maximum === \"number\" && number > field.maximum) return `Must be at most ${field.maximum}`\n return undefined\n }\n if (field.minLength !== undefined && value.length < field.minLength)\n return `Must be at least ${field.minLength} characters`\n if (field.maxLength !== undefined && value.length > field.maxLength)\n return `Must be at most ${field.maxLength} characters`\n if (field.pattern) {\n try {\n if (!new RegExp(field.pattern).test(value)) return \"Invalid format\"\n } catch {\n return \"Invalid format\"\n }\n }\n if (field.format === \"uri\" && !URL.canParse(value)) return \"Expected a URL\"\n if (field.format === \"email\" && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) return \"Expected an email address\"\n if (field.format === \"date\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return \"Expected a date\"\n const date = new Date(`${value}T00:00:00.000Z`)\n if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== value) return \"Expected a date\"\n }\n if (field.format === \"date-time\" && Number.isNaN(Date.parse(value))) return \"Expected a date and time\"\n return undefined\n}\n",
"import { autocomplete, intro, log, outro, select, spinner, text } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { FormAnswer, IntegrationInfo, OpenCodeClient } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { answerForm, secret } from \"./form\"\nimport {\n createClient,\n connectMethods,\n loadIntegrations,\n location,\n request,\n resolveIntegration,\n resolveMethod,\n type ConnectMethod,\n} from \"./shared\"\n\nconst integrationPriority = new Map([\n [\"opencode\", 0],\n [\"opencode-go\", 1],\n [\"openai\", 2],\n [\"github-copilot\", 3],\n [\"google\", 4],\n [\"anthropic\", 5],\n [\"openrouter\", 6],\n [\"vercel\", 7],\n])\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.login,\n Effect.fn(\"cli.auth.login\")((input) =>\n login({\n target: Option.getOrUndefined(input.target),\n method: Option.getOrUndefined(input.method),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst login = Effect.fn(\"cli.auth.login.run\")(function* (input: {\n target?: string\n method?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Connect an integration\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integration = yield* findIntegration(client, input.target)\n const methods = connectMethods(integration)\n if (methods.length === 0) yield* Effect.fail(new Error(`${integration.name} has no interactive login methods`))\n const method = yield* chooseMethod(methods, input.method)\n const answer = method.type === \"command\" ? undefined : yield* answerForm(method.form)\n yield* authenticate(client, integration, method, answer)\n outro(\"Done\")\n})\n\nconst findIntegration = Effect.fn(\"cli.auth.login.integration\")(function* (client: OpenCodeClient, target?: string) {\n if (target && URL.canParse(target)) {\n const protocol = new URL(target).protocol\n if (protocol === \"http:\" || protocol === \"https:\") {\n const progress = spinner()\n progress.start(\"Discovering authentication provider...\")\n yield* request((signal) => client.integration.wellknown.add({ url: target, location }, { signal })).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(\"Authentication provider discovered\"))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Discovery failed\", 1))),\n )\n }\n }\n const integrations = yield* loadIntegrations(client)\n if (target) return yield* resolveIntegration(integrations, target)\n const available = integrations\n .filter((integration) => connectMethods(integration).length > 0)\n .toSorted(\n (a, b) =>\n (integrationPriority.get(a.id) ?? integrationPriority.size) -\n (integrationPriority.get(b.id) ?? integrationPriority.size) ||\n a.name.localeCompare(b.name) ||\n a.id.localeCompare(b.id),\n )\n if (available.length === 0) return yield* Effect.fail(new Error(\"No authentication integrations are available\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: available.map((integration) => {\n const option = { value: integration.id, label: integration.name, hint: integration.id }\n if (integration.connections.length > 0) return { ...option, hint: \"connected\" }\n if (integration.id === \"opencode\") return { ...option, hint: \"recommended\" }\n return option\n }),\n }),\n )\n return yield* resolveIntegration(available, id)\n})\n\nconst chooseMethod = Effect.fn(\"cli.auth.login.method\")(function* (methods: ConnectMethod[], target?: string) {\n if (target) return yield* resolveMethod(methods, target)\n if (methods.length === 1) return methods[0]\n yield* requireInteractive(\"Pass --method when running without an interactive terminal\")\n const id = yield* prompt<string>(() =>\n select({\n message: \"Select login method\",\n options: methods.map((method) => {\n if (method.type === \"key\") return { value: \"key\", label: method.label ?? \"API key\" }\n return { value: method.id, label: method.label }\n }),\n }),\n )\n return yield* resolveMethod(methods, id)\n})\n\nconst authenticate = Effect.fn(\"cli.auth.login.authenticate\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: ConnectMethod,\n answer?: FormAnswer,\n) {\n if (method.type === \"key\") return yield* keyLogin(client, integration, method, answer)\n if (method.type === \"command\") return yield* commandLogin(client, integration, method)\n return yield* oauthLogin(client, integration, method, answer)\n})\n\nconst keyLogin = Effect.fn(\"cli.auth.login.key\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"key\" }>,\n answer?: FormAnswer,\n) {\n const key = yield* secret(method.label ?? `Enter your ${integration.name} API key`)\n const progress = spinner()\n progress.start(\"Saving credential...\")\n yield* request((signal) =>\n client.integration.connect.key({ integrationID: integration.id, key, answer, location }, { signal }),\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))),\n )\n})\n\nconst oauthLogin = Effect.fn(\"cli.auth.login.oauth\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"oauth\" }>,\n answer?: FormAnswer,\n) {\n const progress = spinner()\n progress.start(\"Starting authorization...\")\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n { integrationID: integration.id, methodID: method.id, answer, location },\n { signal },\n ),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID: integration.id, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n progress.stop(\"Authorization started\")\n log.info(attempt.instructions)\n log.info(attempt.url)\n if (process.stdin.isTTY && process.stdout.isTTY) yield* openUrl(attempt.url)\n\n if (attempt.mode === \"code\") {\n yield* requireInteractive(\"This login requires an interactive terminal to enter the authorization code\")\n const code = yield* prompt<string>(() =>\n text({ message: \"Paste the authorization code\", validate: (value) => (!value ? \"Required\" : undefined) }),\n )\n const completing = spinner()\n completing.start(\"Completing authorization...\")\n yield* request((signal) =>\n client.integration.oauth.complete(\n { integrationID: integration.id, attemptID: attempt.attemptID, code, location },\n { signal },\n ),\n ).pipe(\n Effect.tap(() => Effect.sync(() => completing.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => completing.stop(\"Authentication failed\", 1))),\n )\n return\n }\n\n const waiting = spinner()\n waiting.start(\"Waiting for authorization...\")\n const status = yield* waitForOAuth(client, integration.id, attempt.attemptID).pipe(\n Effect.tapCause(() => Effect.sync(() => waiting.stop(\"Authentication failed\", 1))),\n )\n if (status.status === \"complete\") {\n waiting.stop(`Connected to ${integration.name}`)\n return\n }\n waiting.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authorization expired\"))\n})\n\nconst commandLogin = Effect.fn(\"cli.auth.login.command\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"command\" }>,\n) {\n const progress = spinner()\n progress.start(\"Starting authentication command...\")\n const started = yield* request((signal) =>\n client.integration.command.connect({ integrationID: integration.id, methodID: method.id, location }, { signal }),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel(\n {\n integrationID: integration.id,\n attemptID: started.data.attemptID,\n location,\n },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n const status = yield* waitForCommand(client, integration.id, started.data.attemptID, (message) =>\n progress.message(message.trim() || \"Waiting for authentication command...\"),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n if (status.status === \"complete\") {\n progress.stop(`Connected to ${integration.name}`)\n return\n }\n progress.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authentication expired\"))\n})\n\nconst waitForOAuth = Effect.fn(\"cli.auth.login.oauth.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nconst waitForCommand = Effect.fn(\"cli.auth.login.command.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n update: (message: string) => void,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.command.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n if (response.data.message) update(response.data.message)\n yield* Effect.sleep(500)\n }\n})\n"
],
"mappings": "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",
"debugId": "EF03E1FE53D5316064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/server-process.ts", "src/services/service-registration.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"],
"sourcesContent": [
"export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport { Effect, Option, Redacted, Schedule } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { ServiceRegistration } from \"./services/service-registration\"\nimport { Updater } from \"./services/updater\"\nimport { WebUi } from \"./services/web-ui\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* ServiceRegistration.register({\n address,\n password,\n id: instanceID,\n file: serviceOptions.file,\n shutdown,\n })\n }),\n },\n transform,\n ).pipe(\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n",
"export * as ServiceRegistration from \"./service-registration\"\n\nimport { Service, type Info } from \"@opencode-ai/client/effect/service\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { OPENCODE_VERSION } from \"../version\"\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nexport const register = Effect.fnUntraced(function* (options: {\n readonly address: HttpServer.Address\n readonly password: string\n readonly id: string\n readonly file: string\n readonly shutdown: Effect.Effect<void>\n}) {\n const fs = yield* FileSystem.FileSystem\n const temp = options.file + \".\" + options.id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(options.file), { recursive: true })\n const info = {\n id: options.id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(options.address),\n pid: process.pid,\n password: options.password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(options.file).pipe(Effect.flatMap(decodeInfo))\n const owns = (found: Info) =>\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, options.file)))\n yield* current.pipe(\n Effect.catchCause((cause) =>\n Effect.logWarning(\"managed service registration check failed; shutting down\", {\n cause,\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n }).pipe(Effect.andThen(Effect.failCause(cause))),\n ),\n Effect.tap((found) =>\n owns(found)\n ? Effect.void\n : Effect.logWarning(\"managed service registration replaced; shutting down\", {\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n observedServiceID: found.id,\n observedServicePID: found.pid,\n observedVersion: found.version,\n observedURL: found.url,\n }),\n ),\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(options.shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(options.file) : Effect.void)),\n Effect.ignore,\n )\n})\n",
"import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const revalidate = html || name === \"sw.js\" || name === \"registerSW.js\"\n const headers = {\n \"content-type\": FSUtil.mimeType(name),\n \"cache-control\": revalidate ? \"no-cache\" : \"public, max-age=31536000, immutable\",\n \"content-security-policy\": html\n ? cspForHtml(typeof file === \"string\" ? file : Buffer.from(file).toString())\n : csp(),\n \"x-content-type-options\": \"nosniff\",\n }\n return Effect.succeed(\n request.method === \"HEAD\"\n ? HttpServerResponse.empty({ headers })\n : HttpServerResponse.raw(file, { headers, contentType: headers[\"content-type\"] }),\n )\n}\n\nfunction isRouteNotFound(error: unknown) {\n return error instanceof HttpServerError.HttpServerError && error.reason._tag === \"RouteNotFound\"\n}\n\nfunction csp(hash = \"\") {\n return `default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${hash ? ` 'sha256-${hash}'` : \"\"}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; media-src 'self' data:; connect-src * data: blob:`\n}\n\nfunction cspForHtml(body: string) {\n const match = body.match(\n /<script\\b(?![^>]*\\bsrc\\s*=)[^>]*\\bid=([\"'])oc-theme-preload-script\\1[^>]*>([\\s\\S]*?)<\\/script>/i,\n )\n return csp(match ? createHash(\"sha256\").update(match[2]).digest(\"base64\") : \"\")\n}\n\nexport * as WebUi from \"./web-ui\"\n",
"import { Effect, FileSystem, Option } from \"effect\"\nimport path from \"node:path\"\nimport { brotliDecompressSync } from \"node:zlib\"\nimport { OPENCODE_LOCAL } from \"./version\"\n\nexport type AssetMap = Readonly<Record<string, string | Uint8Array>>\ntype EncodedAssetMap = Readonly<Record<string, { readonly content: string; readonly encoding: \"utf8\" | \"base64\" }>>\n\nexport const load = Effect.fn(\"cli.app-assets.load\")(function* () {\n const embedded = yield* Effect.tryPromise(() => import(\"virtual:opencode-app-assets\")).pipe(Effect.option)\n if (Option.isSome(embedded) && embedded.value.default.length > 0) return decodeArchive(embedded.value.default)\n if (!OPENCODE_LOCAL) return yield* Effect.fail(new Error(\"Web UI assets are missing from the CLI build\"))\n return decode(yield* sourceAssets())\n})\n\nfunction decodeArchive(archive: string) {\n const body = brotliDecompressSync(Buffer.from(archive, \"base64\")).toString()\n return decode(JSON.parse(body) as EncodedAssetMap)\n}\n\nconst sourceAssets = Effect.fnUntraced(function* () {\n const fs = yield* FileSystem.FileSystem\n const root = path.resolve(import.meta.dirname, \"../../app/dist\")\n const files = yield* fs.readDirectory(root, { recursive: true })\n return Object.fromEntries(\n (yield* Effect.forEach(\n files.filter((file) => !file.endsWith(\".map\")),\n Effect.fnUntraced(function* (file) {\n const target = path.join(root, file)\n if ((yield* fs.stat(target)).type === \"Directory\") return\n const body = Buffer.from(yield* fs.readFile(target))\n const encoding = isText(file) ? \"utf8\" : \"base64\"\n return [file, { encoding, content: body.toString(encoding) }] as const\n }),\n { concurrency: \"unbounded\" },\n )).filter((asset) => asset !== undefined),\n )\n})\n\nfunction decode(assets: EncodedAssetMap): AssetMap {\n return Object.fromEntries(\n Object.entries(assets).map(([key, asset]) => [\n key,\n asset.encoding === \"utf8\" ? asset.content : Buffer.from(asset.content, \"base64\"),\n ]),\n )\n}\n\nfunction isText(file: string) {\n return file === \"_headers\" || /\\.(?:css|html|js|json|svg|txt|webmanifest|xml)$/.test(file)\n}\n",
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n"
],
"mappings": "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",
"debugId": "6520F46A7B01089964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../schema/src/workspace.ts"],
"sourcesContent": [
"export * as Workspace from \"./workspace.js\"\n\nimport { Schema } from \"effect\"\nimport { WorkspaceEvent } from \"./workspace-event.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport const ID = WorkspaceID\nexport type ID = WorkspaceID\n\nexport const DestroyResult = Schema.Struct({\n destroyed: Schema.Boolean.annotate({\n description: \"True when this request transitioned the workspace from existing to destroyed.\",\n }),\n}).annotate({\n identifier: \"WorkspaceDestroyResult\",\n description: \"Reports whether this request destroyed an existing workspace.\",\n})\nexport interface DestroyResult extends Schema.Schema.Type<typeof DestroyResult> {}\n\nexport const Event = WorkspaceEvent\n"
],
"mappings": ";yRAMO,IAAM,EAAK,EAGL,EAAgB,EAAO,OAAO,CACzC,UAAW,EAAO,QAAQ,SAAS,CACjC,YAAa,+EACf,CAAC,CACH,CAAC,EAAE,SAAS,CACV,WAAY,yBACZ,YAAa,+DACf,CAAC,EAGY,EAAQ",
"debugId": "61D7C53ED079CBF964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/logout.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n"
],
"mappings": ";u9BAAA,cAAS,WAST,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,OAC/B,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "B009A7B1E869B44D64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/pair.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n"
],
"mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH",
"debugId": "29ED20E3B659990464756E2164756E21",
"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/mini.ts"],
"sourcesContent": [
"import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\nimport { Global } from \"@opencode-ai/util/global\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({\n server: serverURL,\n standalone: input.standalone,\n mismatch: \"replace\",\n })\n const config = yield* Config.Service\n const global = yield* Global.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: Option.getOrUndefined(input.replay) ?? resolved.mini?.replay ?? true,\n replayLimit: Option.getOrUndefined(input.replayLimit) ?? resolved.mini?.replay_limit,\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n paths: { home: global.home, state: global.state, log: global.log },\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAQA,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAM,CAAC,IACtD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,UAAS,wBAAyB,MAAO,EAAO,QAAQ,IAAa,wCAAa,EAC1F,MAAO,EAAO,QAAQ,SAAY,EAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EACR,WAAY,EAAM,WAClB,SAAU,SACZ,CAAC,EACK,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,GAAK,EAAS,MAAM,QAAU,GACxE,YAAa,EAAO,eAAe,EAAM,WAAW,GAAK,EAAS,MAAM,aACxE,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,EACA,MAAO,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CACnE,CAAC,CACH,EACD,CACH",
"debugId": "73648F091F8C2EB564756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,EAAG,CACrC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,SACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "89DDBA589AB204AD64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../core/src/workspace/driver.ts", "../core/src/workspace/sql.ts", "../core/src/workspace.ts", "../core/src/environment/files.ts", "../core/src/environment/exec-defaults.ts", "../core/src/environment/local.ts", "../core/src/environment/memory.ts", "../core/src/environment/environment.ts", "../core/src/environment/index.ts"],
"sourcesContent": [
"export * as WorkspaceDriver from \"./driver.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport type { Scope } from \"effect\"\nimport type { Driver as EnvironmentDriver } from \"../environment/driver.js\"\n\n/**\n * Smallest provider-owned JSON value required to reconnect to the same\n * provider resource. Core stores it opaquely and hands it back; only the\n * owning driver reads inside.\n */\nexport const Binding = Schema.Record(Schema.String, Schema.Json)\nexport type Binding = typeof Binding.Type\n\nexport class Error extends Schema.TaggedError<Error>()(\"WorkspaceDriver.Error\", {\n message: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {}\n\nexport class ProviderNotFound extends Schema.TaggedError<ProviderNotFound>()(\"WorkspaceDriver.ProviderNotFound\", {\n provider: Schema.String,\n}) {}\n\nexport interface Interface {\n /**\n * Get-or-create the provider resource backing this logical workspace.\n *\n * MUST be idempotent per `workspaceID`: core retries the same ID after\n * failures and process crashes, including a crash between a successful\n * create and the binding being persisted, and another process may race the\n * same ID. Key the resource by `workspaceID` (a provider tag or a\n * deterministic name) and adopt an existing match instead of creating a\n * duplicate.\n */\n readonly create: (input: {\n readonly workspaceID: Workspace.ID\n }) => Effect.Effect<{ readonly binding: Binding }, Error>\n readonly connect: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<EnvironmentDriver, Error, Scope.Scope>\n readonly suspendForIdle: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<void, Error>\n /**\n * Release the provider resource for this workspace.\n *\n * `binding` is null when none was persisted: the workspace was never\n * provisioned, or provisioning was interrupted mid-create. Look up any\n * resource previously created for `workspaceID` and clean it up, treating\n * absence as success.\n */\n readonly destroy: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding | null\n }) => Effect.Effect<void, Error>\n}\n\nexport const make = (driver: Interface) => driver\n\nexport interface Registry {\n readonly get: (provider: string) => Effect.Effect<Interface, ProviderNotFound>\n}\n\nexport class RegistryService extends Context.Service<RegistryService, Registry>()(\n \"@opencode/WorkspaceDriverRegistry\",\n) {}\n\nexport const registry = (drivers: Readonly<Record<string, Interface>>): Registry => ({\n get: (provider) => {\n const driver = Object.hasOwn(drivers, provider) ? drivers[provider] : undefined\n return driver ? Effect.succeed(driver) : Effect.fail(new ProviderNotFound({ provider }))\n },\n})\n\nexport const registryNode = (drivers: Readonly<Record<string, Interface>>) =>\n makeGlobalNode({\n service: RegistryService,\n layer: Layer.succeed(RegistryService, RegistryService.of(registry(drivers))),\n deps: [],\n })\n\nexport const node = registryNode({})\n",
"import { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\"\nimport type { WorkspaceDriver } from \"./driver.js\"\n\nexport const WorkspaceTable = sqliteTable(\"workspace\", {\n id: text().$type<Workspace.ID>().primaryKey(),\n provider: text().notNull(),\n binding: text({ mode: \"json\" }).$type<WorkspaceDriver.Binding>(),\n created_at: integer().notNull(),\n last_used_at: integer().notNull(),\n})\n",
"export * as Workspace from \"./workspace.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { eq } from \"drizzle-orm\"\nimport { Clock, Context, Deferred, Duration, Effect, Exit, FiberSet, Layer, Ref, Schedule, Schema, Scope } from \"effect\"\nimport { systemError } from \"effect/PlatformError\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver as EnvironmentDriver } from \"./environment/driver.js\"\nimport { Database } from \"./database/database.js\"\nimport { KeyedMutex } from \"./effect/keyed-mutex.js\"\nimport { WorkspaceDriver } from \"./workspace/driver.js\"\nimport { WorkspaceTable } from \"./workspace/sql.js\"\n\nexport const ID = Workspace.ID\nexport type ID = Workspace.ID\n\nexport class Info extends Schema.Class<Info>(\"Workspace.Info\")({\n id: ID,\n provider: Schema.String,\n binding: WorkspaceDriver.Binding,\n createdAt: Schema.Number,\n lastUsedAt: Schema.Number,\n}) {}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Workspace.NotFound\", { workspaceID: ID }) {}\n\nexport interface Interface {\n /** Instantly commits a logical workspace ID. No provider work happens here. */\n readonly create: (provider: string) => Effect.Effect<ID, WorkspaceDriver.ProviderNotFound>\n /** Starts or joins the shared attempt that makes the backing resource real, then returns it. */\n readonly provision: (\n workspaceID: ID,\n ) => Effect.Effect<Info, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly connect: (\n workspaceID: ID,\n ) => Effect.Effect<EnvironmentDriver, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n /** Makes the workspace absent; reports whether this call destroyed an existing workspace. */\n readonly destroy: (workspaceID: ID) => Effect.Effect<\n Workspace.DestroyResult,\n WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound\n >\n}\n\nexport interface Options {\n readonly idleThreshold?: Duration.Input\n readonly pollInterval?: Duration.Input\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Workspace\") {}\n\ninterface Connection {\n readonly driver: WorkspaceDriver.Interface\n readonly environment: EnvironmentDriver\n readonly saveBinding: (binding: WorkspaceDriver.Binding) => Effect.Effect<void>\n readonly lastActivity: Ref.Ref<number>\n readonly active: Ref.Ref<number>\n readonly scope: Scope.Closeable\n}\n\ntype ReadinessError = NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound\n\nexport const configured = (options: Options = {}) =>\n makeGlobalNode({\n service: Service,\n layer: layer(options),\n deps: [Database.node, WorkspaceDriver.node],\n })\n\nconst layer = (options: Options) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const db = (yield* Database.Service).db\n const registry = yield* WorkspaceDriver.RegistryService\n const lifetime = yield* Scope.Scope\n const connections = new Map<ID, Connection>()\n // Destroy cancels the racing provision body by settling the deferred.\n const attempts = new Map<ID, Deferred.Deferred<Info, ReadinessError>>()\n const locks = KeyedMutex.makeUnsafe<ID>()\n const fork = yield* FiberSet.makeRuntime<never, void, never>()\n const idleThreshold = Duration.toMillis(options.idleThreshold ?? Duration.minutes(20))\n\n const find = (workspaceID: ID) =>\n db\n .select()\n .from(WorkspaceTable)\n .where(eq(WorkspaceTable.id, workspaceID))\n .get()\n .pipe(Effect.orDie)\n\n const load = Effect.fn(\"Workspace.load\")(function* (workspaceID: ID) {\n const row = yield* find(workspaceID)\n if (!row) return yield* new NotFound({ workspaceID })\n return row\n })\n\n const saveBinding = (workspaceID: ID, binding: WorkspaceDriver.Binding) =>\n db.update(WorkspaceTable).set({ binding }).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n\n const info = (row: typeof WorkspaceTable.$inferSelect, binding: WorkspaceDriver.Binding) =>\n new Info({\n id: row.id,\n provider: row.provider,\n binding,\n createdAt: row.created_at,\n lastUsedAt: row.last_used_at,\n })\n\n const provision = Effect.fn(\"Workspace.provision\")((workspaceID: ID) =>\n Effect.suspend(() => {\n const existing = attempts.get(workspaceID)\n if (existing) return Deferred.await(existing)\n\n const attempt = Deferred.makeUnsafe<Info, ReadinessError>()\n attempts.set(workspaceID, attempt)\n fork(\n locks\n .withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* load(workspaceID)\n if (row.binding) return info(row, row.binding)\n const driver = yield* registry.get(row.provider)\n const result = yield* driver.create({ workspaceID })\n yield* saveBinding(workspaceID, result.binding)\n return info(row, result.binding)\n }),\n )\n .pipe(\n Effect.raceFirst(Deferred.await(attempt)),\n Effect.onExit((exit) =>\n Effect.sync(() => {\n if (attempts.get(workspaceID) === attempt) attempts.delete(workspaceID)\n Deferred.doneUnsafe(attempt, exit)\n }),\n ),\n Effect.exit,\n Effect.asVoid,\n ),\n )\n return Deferred.await(attempt)\n }),\n )\n\n const open = Effect.fn(\"Workspace.open\")(function* (workspaceID: ID) {\n const existing = connections.get(workspaceID)\n if (existing) return existing\n\n const row = yield* load(workspaceID)\n // Bindings are persisted before provision resolves and never nulled; a raced\n // destroy deletes the whole row and surfaces as NotFound from load above.\n if (!row.binding) return yield* Effect.die(`workspace ${workspaceID} has no binding after provision`)\n const driver = yield* registry.get(row.provider)\n const persistBinding = (binding: WorkspaceDriver.Binding) => saveBinding(workspaceID, binding)\n const scope = yield* Scope.fork(lifetime)\n const environment = yield* driver\n .connect({ workspaceID, binding: row.binding, saveBinding: persistBinding })\n .pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n )\n const now = yield* Clock.currentTimeMillis\n const connection: Connection = {\n driver,\n environment,\n saveBinding: persistBinding,\n lastActivity: yield* Ref.make(now),\n active: yield* Ref.make(0),\n scope,\n }\n connections.set(workspaceID, connection)\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: now })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n return connection\n })\n\n yield* Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis\n yield* Effect.forEach(\n [...connections.entries()],\n ([workspaceID, expected]) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = connections.get(workspaceID)\n if (connection !== expected || (yield* Ref.get(connection.active)) > 0) return\n const lastActivity = yield* Ref.get(connection.lastActivity)\n if (now - lastActivity < idleThreshold) return\n const row = yield* load(workspaceID)\n if (!row.binding) return\n // Deliberate: a racing spawn blocks, then wakes cleanly. Unlocking mid-suspend could reattach a sandbox being terminated.\n yield* connection.driver.suspendForIdle({\n workspaceID,\n binding: row.binding,\n saveBinding: connection.saveBinding,\n })\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: lastActivity })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n connections.delete(workspaceID)\n yield* Scope.close(connection.scope, Exit.void)\n }).pipe(Effect.catchCause((cause) => Effect.logError(\"workspace idle suspension failed\", cause))),\n ),\n { concurrency: \"unbounded\", discard: true },\n )\n }).pipe(Effect.repeat(Schedule.spaced(options.pollInterval ?? Duration.minutes(1))), Effect.forkScoped)\n\n return Service.of({\n create: Effect.fn(\"Workspace.create\")(function* (provider) {\n yield* registry.get(provider)\n const workspaceID = ID.create()\n const now = yield* Clock.currentTimeMillis\n yield* db\n .insert(WorkspaceTable)\n .values({ id: workspaceID, provider, binding: null, created_at: now, last_used_at: now })\n .run()\n .pipe(Effect.orDie)\n return workspaceID\n }),\n provision,\n connect: Effect.fn(\"Workspace.connect\")(function* (workspaceID) {\n const spawner = make((command) =>\n Effect.acquireRelease(\n // A live connection implies the binding is already persisted, so skip the provision hop.\n Effect.suspend(() => (connections.has(workspaceID) ? Effect.void : provision(workspaceID))).pipe(\n Effect.andThen(\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = yield* open(workspaceID)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n yield* Ref.update(connection.active, (active) => active + 1)\n return connection\n }),\n ),\n ),\n Effect.mapError((cause) =>\n systemError({\n _tag: \"Unknown\",\n module: \"Workspace\",\n method: \"spawn\",\n description: `Failed to wake workspace ${workspaceID}`,\n cause,\n }),\n ),\n ),\n (connection) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n yield* Ref.update(connection.active, (active) => active - 1)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n }),\n ),\n ).pipe(Effect.flatMap((connection) => connection.environment.spawner.spawn(command))),\n )\n // Overrides are connection-bound; per-spawn routing is required before any driver ships them, so they are deliberately omitted.\n return { spawner }\n }),\n destroy: Effect.fn(\"Workspace.destroy\")(function* (workspaceID) {\n // Settling the shared attempt cancels its racing provision body and fails\n // waiters with NotFound before teardown commits. Accepted tradeoffs: if the\n // locked teardown below fails, those waiters saw NotFound for a workspace\n // that still exists (the next provision retries it), and a provision racing\n // this window may briefly succeed before teardown destroys its fresh binding.\n const attempt = attempts.get(workspaceID)\n if (attempt) {\n attempts.delete(workspaceID)\n Deferred.doneUnsafe(attempt, Exit.fail(new NotFound({ workspaceID })))\n }\n return yield* locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* find(workspaceID)\n if (!row) return { destroyed: false }\n const connection = connections.get(workspaceID)\n connections.delete(workspaceID)\n if (connection) yield* Scope.close(connection.scope, Exit.void)\n // Null binding still reaches the driver: an interrupted or crashed\n // provision may have created a resource that was never persisted. A\n // provider missing from the registry cannot block deleting a\n // never-provisioned row.\n yield* registry.get(row.provider).pipe(\n Effect.flatMap((driver) => driver.destroy({ workspaceID, binding: row.binding })),\n Effect.catchTag(\"WorkspaceDriver.ProviderNotFound\", (error) =>\n row.binding ? Effect.fail(error) : Effect.void,\n ),\n )\n yield* db.delete(WorkspaceTable).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n return { destroyed: true }\n }),\n )\n }),\n })\n }),\n )\n\nexport const node = configured()\n\n// TODO(workspace-plan): add the boot janitor and ~23h safety snapshot rotation in a later PR.\n// TODO(workspace-plan): make cold wake interruptible with a re-pin loop against janitor races.\n// TODO(workspace-plan): consider extracting a keyed shared-attempt helper (join/cancel, drop-on-settle) beside\n// KeyedMutex at end-of-series consolidation; filesystem/search.ts and session/run-coordinator.ts hand-roll the same\n// shape. Audited stdlib alternatives (rc.111): RcMap fails twice (refcount release cancels in-flight work when the\n// last waiter leaves, and one finalizer path cannot express idle-suspend vs destroy); Cache interrupts the shared\n// lookup when its last awaiter is interrupted and cannot fail waiters with NotFound on invalidation.\n",
"import { Effect, Schema } from \"effect\"\n\nexport const FileType = Schema.Literals([\"file\", \"directory\", \"symlink\", \"other\"])\nexport type FileType = typeof FileType.Type\n\nexport interface FileInfo {\n readonly type: FileType\n readonly size: number\n readonly mtimeMs: number\n}\n\nexport interface DirEntry {\n readonly name: string\n readonly type: FileType\n}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Environment.NotFound\", {\n path: Schema.String,\n}) {}\n\nexport class WrongKind extends Schema.TaggedError<WrongKind>()(\"Environment.WrongKind\", {\n path: Schema.String,\n actual: FileType,\n}) {}\n\nexport class Failed extends Schema.TaggedError<Failed>()(\"Environment.Failed\", {\n path: Schema.String,\n cause: Schema.Defect(),\n}) {}\n\nexport interface FilesImpl {\n /**\n * Content operations (`read`, `list`) follow final symlinks; metadata operations (`stat` and entry\n * tags returned by `list`) do not. `info` describes the target file whose bytes are returned.\n * The process-backed default caps collected output at 64 MiB; larger whole-file reads fail with\n * `Failed`, so callers must use ranges for larger files.\n */\n readonly read: (\n path: string,\n range?: { readonly offset: number; readonly length: number },\n ) => Effect.Effect<{ readonly info: FileInfo; readonly bytes: Uint8Array }, NotFound | WrongKind | Failed>\n readonly write: (path: string, bytes: Uint8Array) => Effect.Effect<void, Failed>\n /** Describes the path entry itself, so a final symlink is reported as `symlink` rather than followed. */\n readonly stat: (path: string) => Effect.Effect<FileInfo, NotFound | Failed>\n /** Follows a final symlink to the listed directory while preserving each returned entry's own type. */\n readonly list: (path: string) => Effect.Effect<ReadonlyArray<DirEntry>, NotFound | WrongKind | Failed>\n readonly remove: (path: string) => Effect.Effect<void, Failed>\n readonly move: (from: string, to: string) => Effect.Effect<void, NotFound | Failed>\n readonly mkdir: (path: string) => Effect.Effect<void, Failed>\n}\n\nexport interface Files extends FilesImpl {}\n\n/**\n * Derives a follow-stat kind from the lstat-like Files contract. A dangling\n * symlink fails with `NotFound`.\n */\nexport const typeFollowing = (files: Files, path: string) =>\n files.stat(path).pipe(\n Effect.flatMap((info) =>\n info.type === \"symlink\"\n ? files.read(path, { offset: 0, length: 0 }).pipe(\n Effect.map((result) => result.info.type),\n Effect.catchTag(\"Environment.WrongKind\", (error) => Effect.succeed(error.actual)),\n )\n : Effect.succeed(info.type),\n ),\n )\n\nexport * as EnvironmentFiles from \"./files.js\"\n",
"import { Effect, Stream } from \"effect\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { collectStream } from \"@opencode-ai/util/process\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FileType, type FilesImpl } from \"./files.js\"\n\n/**\n * Files derived from spawning processes: one process per intent, \"$1\" is\n * always the target path. Scripts report classification through an exit-code\n * protocol (44/45/46) so failures never require parsing localized error text;\n * LC_ALL=C pins the one stderr match that remains. Requires GNU coreutils and\n * findutils in the target image — BSD and busybox userlands will not work.\n * Malformed output from these scripts is our own bug and dies as a defect.\n */\n\nconst MAX_DATA_BYTES = 64 * 1024 * 1024\nconst MAX_ERROR_BYTES = 64 * 1024\nconst NOT_FOUND = 44\nconst WRONG_KIND = 45\nconst FAILED = 46\nconst TAB = \"\\t\"\n\nconst loadMetadata = (flags = \"\") => `\nmetadata=$(stat ${flags} -c '%F${TAB}%s${TAB}%Y' -- \"$1\" 2>&1) || {\n case \"$metadata\" in\n *'No such file or directory'*|*'Not a directory'*) exit ${NOT_FOUND} ;;\n *) printf '%s' \"$metadata\" >&2; exit ${FAILED} ;;\n esac\n}\n`\n\nconst statScript = `\n${loadMetadata()}\nprintf '%s\\n' \"$metadata\"\n`\n\nconst readScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != 'regular file' ] && [ \"$kind\" != 'regular empty file' ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nprintf '%s\\n' \"$metadata\"\nif [ \"$2\" = range ]; then\n dd if=\"$1\" iflag=skip_bytes,count_bytes skip=\"$3\" count=\"$4\" status=none\nelse\n cat -- \"$1\"\nfi\n`\n\nconst listScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != directory ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nfind -H \"$1\" -mindepth 1 -maxdepth 1 -printf '%y\\\\0%f\\\\0'\n`\n\nconst moveScript = `\n${loadMetadata()}\nmv -- \"$1\" \"$2\"\n`\n\ninterface Result {\n readonly exitCode: number\n readonly stdout: Uint8Array\n readonly stderr: Uint8Array\n}\n\nexport const execDefaults = (spawner: ChildProcessSpawner[\"Service\"]): FilesImpl => {\n const run = (\n path: string,\n script: string,\n args: ReadonlyArray<string> = [],\n stdin?: Uint8Array,\n ): Effect.Effect<Result, Failed> =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\"sh\", [\"-c\", script, \"sh\", path, ...args], {\n env: { LC_ALL: \"C\" },\n extendEnv: true,\n stdin: stdin === undefined ? undefined : Stream.make(stdin),\n })\n const handle = yield* spawner.spawn(command).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, MAX_DATA_BYTES),\n collectStream(handle.stderr, MAX_ERROR_BYTES),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n if (stdout.truncated || stderr.truncated) {\n return yield* new Failed({ path, cause: new Error(\"Process output exceeded its collection limit\") })\n }\n return { exitCode, stdout: stdout.buffer, stderr: stderr.buffer }\n }),\n )\n\n const classify = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n ): Effect.Effect<A, NotFound | WrongKind | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n if (result.exitCode === WRONG_KIND) {\n return Effect.fail(new WrongKind({ path, actual: parseType(new TextDecoder().decode(result.stderr)) }))\n }\n return Effect.fail(processFailure(path, result))\n }\n\n const complete = (path: string, result: Result) =>\n result.exitCode === 0 ? Effect.void : Effect.fail(processFailure(path, result))\n\n return {\n stat: (path) => run(path, statScript).pipe(Effect.flatMap((result) => classifyPlain(path, result, parseInfo))),\n read: (path, range) =>\n run(\n path,\n readScript,\n range === undefined ? [\"whole\"] : [\"range\", String(range.offset), String(range.length)],\n ).pipe(\n Effect.flatMap((result) =>\n classify(path, result, (stdout) => {\n const newline = stdout.indexOf(10)\n if (newline < 0) throw new Error(\"Missing read metadata header\")\n return {\n info: parseInfo(stdout.slice(0, newline)),\n bytes: stdout.slice(newline + 1),\n }\n }),\n ),\n ),\n write: (path, bytes) =>\n run(path, `mkdir -p \"$(dirname \"$1\")\" && cat > \"$1\"`, [], bytes).pipe(\n Effect.flatMap((result) => complete(path, result)),\n ),\n list: (path) => run(path, listScript).pipe(Effect.flatMap((result) => classify(path, result, parseList))),\n remove: (path) => run(path, `rm -rf -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n move: (from, to) =>\n run(from, moveScript, [to]).pipe(Effect.flatMap((result) => classifyPlain(from, result, () => undefined))),\n mkdir: (path) => run(path, `mkdir -p -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n }\n}\n\n/** `classify` for scripts whose protocol never reports WrongKind. */\nconst classifyPlain = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n): Effect.Effect<A, NotFound | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n return Effect.fail(processFailure(path, result))\n}\n\nconst processFailure = (path: string, result: Result) =>\n new Failed({\n path,\n cause: new Error(new TextDecoder().decode(result.stderr).trim() || `Process exited with code ${result.exitCode}`),\n })\n\nconst parseInfo = (bytes: Uint8Array): FileInfo => {\n const [rawType, rawSize, rawMtime] = new TextDecoder().decode(bytes).trim().split(TAB)\n const size = Number(rawSize)\n const mtimeMs = Number(rawMtime) * 1_000\n if (!rawType || !Number.isFinite(size) || !Number.isFinite(mtimeMs)) throw new Error(\"Invalid stat output\")\n return { type: parseType(rawType), size, mtimeMs }\n}\n\nconst parseType = (value: string): FileType => {\n if (value === \"regular file\" || value === \"regular empty file\" || value === \"f\") return \"file\"\n if (value === \"directory\" || value === \"d\") return \"directory\"\n if (value === \"symbolic link\" || value === \"l\") return \"symlink\"\n return \"other\"\n}\n\nconst parseList = (bytes: Uint8Array) => {\n const fields = new TextDecoder().decode(bytes).split(\"\\0\")\n fields.pop()\n if (fields.length % 2 !== 0) throw new Error(\"Invalid find output\")\n return Array.from({ length: fields.length / 2 }, (_, index) => ({\n name: fields[index * 2 + 1],\n type: parseType(fields[index * 2]),\n }))\n}\n\nexport * as EnvironmentExecDefaults from \"./exec-defaults.js\"\n",
"import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Effect } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\n/**\n * The host filesystem binding. Deliberately raw node:fs rather than effect's\n * FileSystem service or FSUtil: the contract needs lstat semantics (stat\n * reports \"symlink\") and typed directory entries, and effect's node\n * FileSystem provides neither — its stat always follows symlinks and\n * readDirectory returns names only. FSUtil hits the same gap and its\n * readDirectoryEntries already bypasses to raw node readdir internally.\n * Nothing above the environment seam touches node:fs.\n */\nexport const makeLocalDriver = (spawner: ChildProcessSpawner[\"Service\"]): Driver => {\n const overrides: FilesImpl = {\n read: (value, range) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"file\") return yield* new WrongKind({ path: value, actual: info.type })\n if (range === undefined) {\n const bytes = yield* attempt(value, () => fs.readFile(value), true)\n return { info, bytes }\n }\n const bytes = yield* attempt(\n value,\n async () => {\n const handle = await fs.open(value, \"r\")\n try {\n const buffer = new Uint8Array(range.length)\n const result = await handle.read(buffer, 0, range.length, range.offset)\n return buffer.subarray(0, result.bytesRead)\n } finally {\n await handle.close()\n }\n },\n true,\n )\n return { info, bytes }\n }),\n stat: (value) => stat(value, false),\n list: (value) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"directory\") return yield* new WrongKind({ path: value, actual: info.type })\n const entries = yield* attempt(value, () => fs.readdir(value, { withFileTypes: true }), true)\n return entries.map((entry) => ({ name: entry.name, type: fileType(entry) }))\n }),\n write: (value, bytes) =>\n attempt(value, async () => {\n await fs.mkdir(path.dirname(value), { recursive: true })\n await fs.writeFile(value, bytes)\n }),\n remove: (value) => attempt(value, () => fs.rm(value, { recursive: true, force: true })),\n move: (from, to) =>\n Effect.gen(function* () {\n yield* stat(from, false)\n const destination = yield* stat(to, false).pipe(\n Effect.map((info) => (info.type === \"directory\" ? path.join(to, path.basename(from)) : to)),\n Effect.catchIf(\n (error) => error instanceof NotFound,\n () => Effect.succeed(to),\n ),\n )\n yield* attempt(from, () => fs.rename(from, destination))\n }),\n mkdir: (value) => attempt(value, () => fs.mkdir(value, { recursive: true }).then(() => undefined)),\n }\n\n return { spawner, overrides }\n}\n\nconst stat = (value: string, follow: boolean) =>\n attempt(value, () => (follow ? fs.stat(value) : fs.lstat(value)), true).pipe(\n Effect.map((stats): FileInfo => ({ type: fileType(stats), size: stats.size, mtimeMs: stats.mtimeMs })),\n )\n\nconst fileType = (entry: { isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean }): FileType => {\n if (entry.isFile()) return \"file\"\n if (entry.isDirectory()) return \"directory\"\n if (entry.isSymbolicLink()) return \"symlink\"\n return \"other\"\n}\n\nfunction attempt<A>(value: string, run: () => Promise<A>): Effect.Effect<A, Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing: true): Effect.Effect<A, NotFound | Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing = false) {\n return Effect.tryPromise({\n try: run,\n catch: (cause) =>\n missing && isMissing(cause) ? new NotFound({ path: value }) : new Failed({ path: value, cause }),\n })\n}\n\nconst isMissing = (cause: unknown) =>\n cause !== null &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\")\n\nexport * as EnvironmentLocal from \"./local.js\"\n",
"import path from \"node:path\"\nimport { Effect, PlatformError } from \"effect\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\ntype Node =\n | { readonly type: \"file\"; readonly bytes: Uint8Array; readonly mtimeMs: number }\n | { readonly type: \"directory\"; readonly mtimeMs: number }\n | { readonly type: \"symlink\"; readonly target: string; readonly mtimeMs: number }\n\nexport interface MemoryDriver extends Driver {\n readonly symlink: (target: string, path: string) => Effect.Effect<void, Failed>\n}\n\nexport const makeMemoryDriver = (): MemoryDriver => {\n const nodes = new Map<string, Node>([[\"/\", { type: \"directory\", mtimeMs: Date.now() }]])\n const key = (value: string) => path.posix.resolve(\"/\", value)\n const info = (node: Node): FileInfo => ({\n type: node.type,\n size:\n node.type === \"file\"\n ? node.bytes.length\n : node.type === \"symlink\"\n ? new TextEncoder().encode(node.target).length\n : 0,\n mtimeMs: node.mtimeMs,\n })\n const resolveKey = (value: string, followFinal: boolean, seen = new Set<string>()): string | undefined => {\n const normalized = key(value)\n const parts = normalized.split(\"/\").filter(Boolean)\n const base = \"/\"\n const walk = (current: string, index: number): string | undefined => {\n if (index === parts.length) return current\n const part = parts[index]\n const candidate = path.posix.join(current, part)\n const node = nodes.get(candidate)\n if (node?.type !== \"symlink\" || (!followFinal && index === parts.length - 1)) return walk(candidate, index + 1)\n if (seen.has(candidate)) return undefined\n seen.add(candidate)\n const target = path.posix.resolve(path.posix.dirname(candidate), node.target)\n return resolveKey(path.posix.join(target, ...parts.slice(index + 1)), followFinal, seen)\n }\n return walk(base, 0)\n }\n const lookup = (value: string) => nodes.get(resolveKey(value, false) ?? key(value))\n const requireParent = (value: string) => {\n const parentPath = path.posix.dirname(key(value))\n const parent = nodes.get(resolveKey(parentPath, true) ?? parentPath)\n if (!parent) throw new Error(`Parent directory does not exist: ${path.posix.dirname(value)}`)\n if (parent.type !== \"directory\") throw new Error(`Parent is not a directory: ${path.posix.dirname(value)}`)\n }\n const mkdirSync = (value: string) => {\n const target = resolveKey(value, false) ?? key(value)\n const existing = nodes.get(target)\n if (existing?.type === \"directory\") return\n if (existing) throw new Error(`Path is not a directory: ${value}`)\n const parent = path.posix.dirname(target)\n if (parent !== target) mkdirSync(parent)\n nodes.set(target, { type: \"directory\", mtimeMs: Date.now() })\n }\n const failed = (value: string, cause: unknown) => new Failed({ path: value, cause })\n const overrides: FilesImpl = {\n stat: (value) => {\n const node = lookup(value)\n return node ? Effect.succeed(info(node)) : Effect.fail(new NotFound({ path: value }))\n },\n read: (value, range) => {\n const original = lookup(value)\n if (!original) return Effect.fail(new NotFound({ path: value }))\n if (original.type === \"directory\") return Effect.fail(new WrongKind({ path: value, actual: \"directory\" }))\n const resolved = resolveKey(value, true)\n const node = resolved === undefined ? undefined : nodes.get(resolved)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"file\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const bytes = range === undefined ? node.bytes : node.bytes.subarray(range.offset, range.offset + range.length)\n return Effect.succeed({ info: info(node), bytes: bytes.slice() })\n },\n write: (value, bytes) =>\n Effect.try({\n try: () => {\n mkdirSync(path.posix.dirname(key(value)))\n const existing = lookup(value)\n if (existing?.type === \"directory\") throw new Error(`Path is a directory: ${value}`)\n const target = existing?.type === \"symlink\" ? resolveKey(value, true) : resolveKey(value, false)\n if (!target) throw new Error(`Cannot resolve symlink: ${value}`)\n requireParent(target)\n nodes.set(target, { type: \"file\", bytes: bytes.slice(), mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n list: (value) => {\n const target = resolveKey(value, true) ?? key(value)\n const node = nodes.get(target)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"directory\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const entries = [...nodes.entries()]\n .filter(([entry]) => entry !== target && path.posix.dirname(entry) === target)\n .map(([entry, child]) => ({ name: path.posix.basename(entry), type: child.type satisfies FileType }))\n .sort((a, b) => a.name.localeCompare(b.name))\n return Effect.succeed(entries)\n },\n remove: (value) =>\n Effect.sync(() => {\n const target = resolveKey(value, false) ?? key(value)\n for (const entry of nodes.keys()) {\n if (entry === target || entry.startsWith(`${target}/`)) nodes.delete(entry)\n }\n }),\n move: (from, to) => {\n const source = resolveKey(from, false) ?? key(from)\n const node = nodes.get(source)\n if (!node) return Effect.fail(new NotFound({ path: from }))\n return Effect.try({\n try: () => {\n const requested = resolveKey(to, false) ?? key(to)\n const destination =\n nodes.get(requested)?.type === \"directory\"\n ? path.posix.join(requested, path.posix.basename(source))\n : requested\n if (node.type === \"directory\" && destination.startsWith(`${source}/`)) {\n throw new Error(`Cannot move a directory into itself: ${from}`)\n }\n const existing = nodes.get(destination)\n if (node.type === \"directory\" && existing && existing.type !== \"directory\") {\n throw new Error(`Cannot overwrite a non-directory with a directory: ${to}`)\n }\n requireParent(destination)\n const moved = [...nodes.entries()].filter(([entry]) => entry === source || entry.startsWith(`${source}/`))\n for (const [entry] of moved) nodes.delete(entry)\n for (const [entry, child] of moved) nodes.set(`${destination}${entry.slice(source.length)}`, child)\n },\n catch: (cause) => failed(from, cause),\n })\n },\n mkdir: (value) => Effect.try({ try: () => mkdirSync(value), catch: (cause) => failed(value, cause) }),\n }\n\n const spawner = make((command) =>\n Effect.suspend(() => {\n const description = command._tag === \"StandardCommand\" ? command.command : \"pipeline\"\n return Effect.fail(\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"EnvironmentMemory\",\n method: \"spawn\",\n pathOrDescriptor: description,\n cause: failed(description, new Error(\"The memory driver cannot spawn processes\")),\n }),\n )\n }),\n )\n\n return {\n spawner,\n overrides,\n symlink: (target, value) =>\n Effect.try({\n try: () => {\n requireParent(value)\n nodes.set(resolveKey(value, false) ?? key(value), { type: \"symlink\", target, mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n }\n}\n\nexport * as EnvironmentMemory from \"./memory.js\"\n",
"import { CrossSpawnSpawner } from \"@opencode-ai/util/cross-spawn-spawner\"\nimport { makeLocationNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Files } from \"./files.js\"\nimport { makeFiles } from \"./index.js\"\nimport { makeLocalDriver } from \"./local.js\"\nimport { Location } from \"../location.js\"\nimport { Workspace } from \"../workspace.js\"\n\nexport interface Interface {\n readonly files: Files\n readonly spawner: ChildProcessSpawner[\"Service\"]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Environment\") {}\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n const location = yield* Location.Service\n const workspace = yield* Workspace.Service\n const driver = location.workspaceID\n ? yield* workspace.connect(location.workspaceID).pipe(\n // Environment has no error channel; an unknown or destroyed placement is a configuration defect by design.\n Effect.mapError(\n (cause) => new Error(`Failed to bind Environment to workspace ${location.workspaceID}`, { cause }),\n ),\n Effect.orDie,\n )\n : makeLocalDriver(spawner)\n return Service.of({ files: makeFiles(driver), spawner: driver.spawner })\n }),\n)\n\nexport const node = makeLocationNode({\n service: Service,\n layer,\n deps: [CrossSpawnSpawner.node, Location.node, Workspace.node],\n})\n\nexport * as EnvironmentService from \"./environment.js\"\n",
"export * as Environment from \"./index.js\"\n\nexport { type Driver } from \"./driver.js\"\nexport {\n type DirEntry,\n Failed,\n type FileInfo,\n type Files,\n type FilesImpl,\n type FileType,\n NotFound,\n typeFollowing,\n WrongKind,\n} from \"./files.js\"\nexport { execDefaults } from \"./exec-defaults.js\"\nexport { makeLocalDriver } from \"./local.js\"\nexport { makeMemoryDriver, type MemoryDriver } from \"./memory.js\"\nexport { type Interface, node, Service } from \"./environment.js\"\n\nimport type { Driver } from \"./driver.js\"\nimport { execDefaults } from \"./exec-defaults.js\"\nimport type { Files } from \"./files.js\"\n\nexport const makeFiles = (driver: Driver): Files => ({\n ...execDefaults(driver.spawner),\n ...driver.overrides,\n})\n"
],
"mappings": "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",
"debugId": "9E2E8F506F3B3ED264756E2164756E21",
"names": []
}

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

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

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

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

{
"version": 3,
"sources": ["src/commands/handlers/service/restart.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,QACnC,EAAO,GAAG,qBAAqB,EAAE,SAAU,EAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "6190AF498043C73B64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/mini.ts", "src/mini-host.ts"],
"sourcesContent": [
"import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\nimport { Env } from \"./env\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n paths: { home: string; state: string; log: string }\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const environment = input.server.reconnect ? Env.session() : undefined\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n environment,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n environment,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory, paths: input.paths }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n",
"import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n"
],
"mappings": "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",
"debugId": "E188D5ABAB522A3164756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/auth/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { createClient, loadIntegrations } from \"./shared\"\nimport { errorMessage } from \"../../../util/error\"\n\nexport default Runtime.handler(Commands.commands.auth.commands.list, (input) =>\n list(input).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n)\n\nconst list = Effect.fn(\"cli.auth.list\")(function* (input) {\n const client = yield* createClient({ server: Option.getOrUndefined(input.server), standalone: input.standalone })\n const integrations = (yield* loadIntegrations(client)).filter((integration) => integration.connections.length > 0)\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify(\n integrations.map((integration) => ({\n id: integration.id,\n name: integration.name,\n connections: integration.connections,\n })),\n null,\n 2,\n ) + EOL,\n )\n return\n }\n const rows = integrations.flatMap((integration) =>\n integration.connections.map((connection) => ({\n integration: integration.name,\n source: connection.type === \"credential\" ? connection.label : connection.name,\n type: connection.type === \"credential\" ? \"stored\" : \"environment\",\n })),\n )\n if (rows.length === 0) {\n process.stdout.write(\"No authenticated integrations\" + EOL)\n return\n }\n const width = Math.max(...rows.map((row) => row.integration.length)) + 2\n process.stdout.write(\n rows.map((row) => row.integration.padEnd(width) + row.source.padEnd(28) + row.type).join(EOL) + EOL,\n )\n})\n"
],
"mappings": ";ymCAAA,cAAS,WAOT,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAK,SAAS,KAAM,CAAC,IACpE,EAAK,CAAK,EAAE,KACV,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,EAEM,EAAO,EAAO,GAAG,eAAe,EAAE,SAAU,CAAC,EAAO,CACxD,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAO,eAAe,EAAM,MAAM,EAAG,WAAY,EAAM,UAAW,CAAC,EAC1G,GAAgB,MAAO,EAAiB,CAAM,GAAG,OAAO,CAAC,IAAgB,EAAY,YAAY,OAAS,CAAC,EACjH,GAAI,EAAM,SAAW,OAAQ,CAC3B,QAAQ,OAAO,MACb,KAAK,UACH,EAAa,IAAI,CAAC,KAAiB,CACjC,GAAI,EAAY,GAChB,KAAM,EAAY,KAClB,YAAa,EAAY,WAC3B,EAAE,EACF,KACA,CACF,EAAI,CACN,EACA,OAEF,IAAM,EAAO,EAAa,QAAQ,CAAC,IACjC,EAAY,YAAY,IAAI,CAAC,KAAgB,CAC3C,YAAa,EAAY,KACzB,OAAQ,EAAW,OAAS,aAAe,EAAW,MAAQ,EAAW,KACzE,KAAM,EAAW,OAAS,aAAe,SAAW,aACtD,EAAE,CACJ,EACA,GAAI,EAAK,SAAW,EAAG,CACrB,QAAQ,OAAO,MAAM,gCAAkC,CAAG,EAC1D,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,MAAM,CAAC,EAAI,EACvE,QAAQ,OAAO,MACb,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,OAAO,CAAK,EAAI,EAAI,OAAO,OAAO,EAAE,EAAI,EAAI,IAAI,EAAE,KAAK,CAAG,EAAI,CAClG,EACD",
"debugId": "05372AD263C2F16864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n"
],
"mappings": ";wOAAA,cAAS,WACT,oBACA,mBAAS,UAAU,eAAM,oBAOzB,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,IAC/B,EAAO,GAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "C982C58DAD932A0264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/server-connection.ts"],
"sourcesContent": [
"import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const mismatch = args.mismatch ?? \"ignore\"\n const options = yield* ServiceConfig.options({ checkVersion: mismatch !== \"ignore\" })\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, mismatch),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (options: EnsureOptions, mismatch: NonNullable<Args[\"mismatch\"]>) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n"
],
"mappings": ";6eAoBO,IAAM,EAAU,EAAO,GAAG,+BAA+B,EAAE,SAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAW,EAAK,UAAY,SAC5B,EAAU,MAAO,EAAc,QAAQ,CAAE,aAAc,IAAa,QAAS,CAAC,EACpF,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,CAAQ,EAC/E,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CAAC,EAAwB,EAAyC,CACnH,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC",
"debugId": "D307D5AF45C3C41664756E2164756E21",
"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/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\nimport { errorMessage } from \"../../../util/error\"\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(() =>\n timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(Cause.squash(exit.cause))),\n ).pipe(Effect.ignore)\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n ...(server ? { answer: { server } } : {}),\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n"
],
"mappings": "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",
"debugId": "3D0BE8F1BB895E7264756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/service/unset.ts"],
"sourcesContent": [
"import { 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.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key, Option.getOrUndefined(input.name))\n }),\n)\n"
],
"mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,MAAO,EAAc,MAAM,EAAM,IAAK,EAAO,eAAe,EAAM,IAAI,CAAC,EACxE,CACH",
"debugId": "E3E11B23E96E297C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/auth.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n"
],
"mappings": ";u9BAAA,cAAS,WAcT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,UAAS,CAAC,CACnG,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR",
"debugId": "984F0A443C95315A64756E2164756E21",
"names": []
}
+1
-1
{
"name": "@opencode-ai/cli-linux-arm64",
"version": "0.0.0-dev-18115",
"version": "0.0.0-dev-18122",
"license": "MIT",

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

{
"version": 3,
"sources": ["src/commands/handlers/service/restart.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,QACnC,EAAO,GAAG,qBAAqB,EAAE,SAAU,EAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "6190AF498043C73B64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/service-config.ts"],
"sourcesContent": [
"import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n env: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\", \"env\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\" || key === \"env\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* (input: { readonly checkVersion?: boolean } = {}) {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: input.checkVersion ? OPENCODE_VERSION : undefined,\n env: (yield* read()).env,\n command: [\n ...selfCommand(),\n \"serve\",\n \"--service\",\n ],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => ({}) as Info),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string, name?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service get ${selected}`)\n switch (selected) {\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 case \"env\": {\n const env = (yield* read()).env ?? {}\n return name === undefined ? JSON.stringify(env, null, 2) : (env[name] ?? \"\")\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string, nestedValue?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && nestedValue !== undefined)\n throw new Error(`Usage: opencode service set ${selected} <value>`)\n switch (selected) {\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 case \"env\": {\n if (nestedValue === undefined) throw new Error(\"Usage: opencode service set env <key> <value>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n yield* write({ ...existing, env: { ...existing.env, [value]: nestedValue } })\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string, name?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service unset ${selected}`)\n switch (selected) {\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 case \"env\": {\n if (name === undefined) throw new Error(\"Usage: opencode service unset env <key>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n const { [name]: _removed, ...env } = existing.env ?? {}\n const { env: _existingEnv, ...rest } = existing\n yield* write(Object.keys(env).length === 0 ? rest : { ...rest, env })\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n"
],
"mappings": "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",
"debugId": "2D3DC95CDBC35BF564756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mini.ts"],
"sourcesContent": [
"import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\nimport { Global } from \"@opencode-ai/util/global\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({\n server: serverURL,\n standalone: input.standalone,\n mismatch: \"replace\",\n })\n const config = yield* Config.Service\n const global = yield* Global.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: Option.getOrUndefined(input.replay) ?? resolved.mini?.replay ?? true,\n replayLimit: Option.getOrUndefined(input.replayLimit) ?? resolved.mini?.replay_limit,\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n paths: { home: global.home, state: global.state, log: global.log },\n }),\n )\n }),\n)\n"
],
"mappings": ";qkCAQA,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAM,CAAC,IACtD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,UAAS,wBAAyB,MAAO,EAAO,QAAQ,IAAa,wCAAa,EAC1F,MAAO,EAAO,QAAQ,SAAY,EAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EACR,WAAY,EAAM,WAClB,SAAU,SACZ,CAAC,EACK,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,GAAK,EAAS,MAAM,QAAU,GACxE,YAAa,EAAO,eAAe,EAAM,WAAW,GAAK,EAAS,MAAM,aACxE,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,EACA,MAAO,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CACnE,CAAC,CACH,EACD,CACH",
"debugId": "73648F091F8C2EB564756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/stats.ts"],
"sourcesContent": [
"import { ClientError, OpenCode, type SessionStatsInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { errorMessage } from \"../../util/error\"\n\nconst handler = Effect.fn(\"cli.stats\")(function* (input: Runtime.Input<typeof Commands.commands.stats>) {\n const days = Option.getOrUndefined(input.days)\n const year = Option.getOrUndefined(input.year)\n const project = Option.getOrUndefined(input.project)\n if ([days !== undefined, year !== undefined, input.all].filter(Boolean).length > 1)\n yield* Effect.fail(new Error(\"--days, --year, and --all cannot be combined\"))\n\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({ baseUrl: server.endpoint.url, headers: Service.headers(server.endpoint) })\n const range = statsRange({ days, year, all: input.all })\n const projectID =\n project === \".\"\n ? yield* request(server.endpoint.url, (signal) =>\n client.location\n .get({ location: { directory: process.cwd() } }, { signal })\n .then((location) => location.project.id),\n )\n : project\n const details = input.models || input.tools || input.cost || input.full\n const stats = yield* request(server.endpoint.url, (signal) =>\n client.session.stats(\n {\n from: range.from,\n to: range.to,\n project: projectID,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || \"UTC\",\n tools: input.json || input.tools || input.full ? \"detail\" : details ? \"none\" : \"summary\",\n },\n { signal },\n ),\n )\n const output = input.json\n ? JSON.stringify(stats, null, 2)\n : renderStats(stats, {\n label: range.label,\n scope: project === undefined ? \"all projects\" : project === \".\" ? \"current project\" : \"selected project\",\n models: input.models || input.full,\n tools: input.tools || input.full,\n cost: input.cost || input.full,\n limit: input.limit,\n color: process.stdout.isTTY && process.env.NO_COLOR === undefined,\n width: process.stdout.columns ?? 80,\n })\n process.stdout.write(output + EOL)\n})\n\nexport default Runtime.handler(Commands.commands.stats, (input) =>\n handler(input).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n)\n\nexport function request<A>(url: string, run: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: () => run(AbortSignal.timeout(30_000)),\n catch: (cause) =>\n cause instanceof ClientError && cause.reason === \"Transport\"\n ? new Error(`Could not reach server at ${url}`, { cause })\n : cause,\n })\n}\n\ntype RenderOptions = {\n label: string\n scope: string\n models: boolean\n tools: boolean\n cost: boolean\n limit: number\n color: boolean\n width: number\n}\n\nconst colors = terminalPalette()\n\nexport function renderStats(stats: SessionStatsInfo, options: RenderOptions) {\n const totalTokens = tokenTotal(stats.tokens)\n const toolTotals = stats.tools.mode === \"none\" ? undefined : stats.tools.totals\n const terminalTools = toolTotals ? toolTotals.succeeded + toolTotals.failed : 0\n const toolRate = !toolTotals || terminalTools === 0 ? undefined : (toolTotals.succeeded / terminalTools) * 100\n const primary = `1;${colors.primary}`\n const sessionLine = [\n metricCount(stats.sessions, \"session\", options.color),\n stats.subagents > 0 ? metricCount(stats.subagents, \"subagent\", options.color) : undefined,\n ]\n .filter((value) => value !== undefined)\n .join(\" · \")\n const toolSummary = !toolTotals\n ? \"tool stats unavailable\"\n : toolRate === undefined\n ? \"no tool calls\"\n : `${style(formatPercent(toolRate), primary, options.color)} tool success`\n const details = options.models || options.tools || options.cost\n const empty = stats.sessions === 0 && stats.prompts === 0 && stats.steps === 0\n const heading = `${style(\"opencode stats\", primary, options.color)} ${style(`· ${options.label} · ${options.scope}`, \"2\", options.color)}`\n const lines = details\n ? [style(`${options.label} · ${options.scope}`, \"2\", options.color)]\n : empty\n ? [\n heading,\n \"\",\n style(\"no activity in this range\", \"2\", options.color),\n \"\",\n style(\"opencode.ai\", \"2\", options.color),\n ]\n : [\n heading,\n \"\",\n ...renderActivity(stats.activity, stats.range.from, stats.range.to, options.color, options.width),\n \"\",\n sessionLine,\n `${metricCount(stats.prompts, \"prompt\", options.color)} · ${metricCount(stats.steps, \"step\", options.color)} · ${metricCount(totalTokens, \"token\", options.color)}`,\n `${toolSummary} · ${metricCount(stats.activeDays, \"active day\", options.color)} · best streak ${style(stats.streak.toString(), primary, options.color)} day${stats.streak === 1 ? \"\" : \"s\"}`,\n \"\",\n style(\"opencode.ai\", \"2\", options.color),\n ]\n\n if (options.cost) lines.push(...(lines.length > 0 ? [\"\"] : []), ...renderCost(stats))\n if (options.models)\n lines.push(...(lines.length > 0 ? [\"\"] : []), ...renderModels(stats, options.limit, options.width))\n if (options.tools) lines.push(...(lines.length > 0 ? [\"\"] : []), ...renderTools(stats, options.limit, options.width))\n return lines.join(EOL)\n}\n\nfunction statsRange(input: { days?: number; year?: number; all: boolean }) {\n const now = new Date()\n const to = now.getTime() + 1\n if (input.all) return { from: undefined, to, label: \"all time\" }\n if (input.days !== undefined) {\n const from = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n from.setDate(from.getDate() - Math.max(0, input.days - 1))\n return {\n from: from.getTime(),\n to,\n label: input.days === 0 || input.days === 1 ? \"today\" : `last ${input.days} days`,\n }\n }\n const year = input.year ?? now.getFullYear()\n return {\n from: new Date(year, 0, 1).getTime(),\n to: year === now.getFullYear() ? to : new Date(year + 1, 0, 1).getTime(),\n label: year === now.getFullYear() ? `${year} so far` : year.toString(),\n }\n}\n\nfunction renderActivity(\n activity: SessionStatsInfo[\"activity\"],\n from: number,\n to: number,\n color: boolean,\n width: number,\n) {\n const values = new Map(activity.map((day) => [day.date, day.steps]))\n const rangeStart = dateOrdinal(new Date(from))\n const rangeEnd = dateOrdinal(new Date(to - 1))\n const end = new Date(to - 1)\n end.setHours(12, 0, 0, 0)\n end.setDate(end.getDate() + (7 - mondayIndex(end) - 1))\n const start = new Date(from)\n start.setHours(12, 0, 0, 0)\n start.setDate(start.getDate() - mondayIndex(start))\n const maxWeeks = Math.max(1, Math.min(53, width - 4))\n const totalWeeks = Math.floor((dateOrdinal(end) - dateOrdinal(start)) / 7) + 1\n const latest = new Date(end)\n latest.setDate(latest.getDate() - (maxWeeks - 1) * 7)\n if (start < latest) start.setTime(latest.getTime())\n\n const active = [...values.values()].filter((value) => value > 0)\n const levels = [...new Set(active)].sort((a, b) => a - b)\n const weekStarts = Array.from({ length: Math.floor((dateOrdinal(end) - dateOrdinal(start)) / 7) + 1 }, (_, week) => {\n const date = new Date(start)\n date.setDate(date.getDate() + week * 7)\n return date\n })\n const weeks = weekStarts.map((week) =>\n Array.from({ length: 7 }, (_, day) => {\n const date = new Date(week)\n date.setDate(date.getDate() + day)\n const ordinal = dateOrdinal(date)\n if (ordinal < rangeStart || ordinal > rangeEnd) return \" \"\n return activityGlyph(values.get(dateKey(date)) ?? 0, levels, color)\n }),\n )\n const weekdays = [\"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\", \"Su\"]\n return [\n style(totalWeeks > maxWeeks ? `activity · last ${maxWeeks} weeks` : \"activity\", `1;${colors.primary}`, color),\n ` ${style(monthLabels(weekStarts), \"2\", color)}`,\n ...weekdays.flatMap((label, day) => [\n `${style(label, \"2\", color)} ${weeks.map((week) => week[day]).join(\"\")}`,\n ...(day === weekdays.length - 1 ? [] : [\"\"]),\n ]),\n \"\",\n ` ${style(\"less\", \"2\", color)} ${[0, 1, 2, 3, 4].map((level) => paintActivity(level, color)).join(\"\")} ${style(\"more\", \"2\", color)}`,\n ]\n}\n\nfunction renderCost(stats: SessionStatsInfo) {\n const input = stats.tokens.input + stats.tokens.cache.read + stats.tokens.cache.write\n const cached = input === 0 ? 0 : (stats.tokens.cache.read / input) * 100\n return [\n \"COST & TOKENS\",\n row(\"cost\", `$${stats.cost.toFixed(2)}`),\n row(\"input\", formatNumber(stats.tokens.input)),\n row(\"output\", formatNumber(stats.tokens.output)),\n row(\"reasoning\", formatNumber(stats.tokens.reasoning)),\n row(\"cache read\", formatNumber(stats.tokens.cache.read)),\n row(\"cache write\", formatNumber(stats.tokens.cache.write)),\n row(\"cached input\", formatPercent(cached)),\n ]\n}\n\nfunction renderModels(stats: SessionStatsInfo, limit: number, width: number) {\n if (stats.models.length === 0) return [\"MODELS\", \" no model usage\"]\n const models = stats.models.slice(0, limit)\n const more = stats.models.length - models.length\n if (width < 68)\n return [\n \"MODELS\",\n ...models.flatMap((item) => [\n truncate(\n `${item.model.providerID}/${item.model.id}${item.model.variant ? `#${item.model.variant}` : \"\"}`,\n width,\n ),\n ` ${formatNumber(tokenTotal(item.tokens))} tokens · ${formatNumber(item.steps)} steps · $${item.cost.toFixed(2)}`,\n ]),\n ...(more > 0 ? [\"\", `+${more.toLocaleString(\"en-US\")} more model${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n return [\n \"MODELS\",\n tableHeader(\"model\", \"tokens\", \"steps\", \"cost\"),\n ...models.map((item) =>\n tableRow(\n `${item.model.providerID}/${item.model.id}${item.model.variant ? `#${item.model.variant}` : \"\"}`,\n formatNumber(tokenTotal(item.tokens)),\n formatNumber(item.steps),\n `$${item.cost.toFixed(2)}`,\n ),\n ),\n ...(more > 0 ? [\"\", `+${more.toLocaleString(\"en-US\")} more model${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n}\n\nfunction renderTools(stats: SessionStatsInfo, limit: number, width: number) {\n if (stats.tools.mode !== \"detail\") return [\"TOOL RELIABILITY\", \" tool details unavailable\"]\n if (stats.tools.usage.length === 0) return [\"TOOL RELIABILITY\", \" no tool calls\"]\n const tools = stats.tools.usage.slice(0, limit)\n const more = stats.tools.usage.length - tools.length\n if (width < 68)\n return [\n \"TOOL RELIABILITY\",\n ...tools.flatMap((tool) => {\n const terminal = tool.succeeded + tool.failed\n return [\n truncate(tool.name, width),\n ` ${formatNumber(tool.calls)} calls · ${terminal === 0 ? \"-\" : formatPercent((tool.failed / terminal) * 100)} error · ${tool.durationP50 === undefined ? \"-\" : formatDuration(tool.durationP50)} p50`,\n ]\n }),\n \"\",\n `${formatNumber(stats.tools.totals.succeeded + stats.tools.totals.failed)} finished calls · ${formatNumber(stats.tools.totals.unfinished)} unfinished`,\n ...(more > 0 ? [`+${more.toLocaleString(\"en-US\")} more tool${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n return [\n \"TOOL RELIABILITY\",\n tableHeader(\"tool\", \"calls\", \"error\", \"p50\"),\n ...tools.map((tool) => {\n const terminal = tool.succeeded + tool.failed\n return tableRow(\n tool.name,\n formatNumber(tool.calls),\n terminal === 0 ? \"-\" : formatPercent((tool.failed / terminal) * 100),\n tool.durationP50 === undefined ? \"-\" : formatDuration(tool.durationP50),\n )\n }),\n \"\",\n `${formatNumber(stats.tools.totals.succeeded + stats.tools.totals.failed)} finished calls · ${formatNumber(stats.tools.totals.unfinished)} unfinished`,\n ...(more > 0 ? [`+${more.toLocaleString(\"en-US\")} more tool${more === 1 ? \"\" : \"s\"}`] : []),\n ]\n}\n\nfunction row(label: string, value: string) {\n return ` ${label.padEnd(20)}${value}`\n}\n\nfunction tableHeader(label: string, second: string, third: string, fourth: string) {\n return tableRow(label, second, third, fourth)\n}\n\nfunction tableRow(label: string, second: string, third: string, fourth: string) {\n return `${truncate(label, 34).padEnd(34)}${second.padStart(10)}${third.padStart(12)}${fourth.padStart(12)}`\n}\n\nfunction truncate(value: string, width: number) {\n return value.length <= width ? value : value.slice(0, width - 1) + \"…\"\n}\n\nfunction tokenTotal(tokens: SessionStatsInfo[\"tokens\"]) {\n return tokens.input + tokens.output + tokens.reasoning + tokens.cache.read + tokens.cache.write\n}\n\nfunction formatNumber(value: number) {\n if (value >= 1_000_000_000) return `${trimDecimal(value / 1_000_000_000)}b`\n if (value >= 1_000_000) return `${trimDecimal(value / 1_000_000)}m`\n if (value >= 1_000) return `${trimDecimal(value / 1_000)}k`\n return Math.round(value).toLocaleString(\"en-US\")\n}\n\nfunction trimDecimal(value: number) {\n return value.toFixed(1).replace(/\\.0$/, \"\")\n}\n\nfunction formatPercent(value: number) {\n return `${value.toFixed(value >= 10 ? 1 : 2)}%`\n}\n\nfunction formatDuration(value: number) {\n if (value < 1_000) return `${Math.round(value)}ms`\n return `${trimDecimal(value / 1_000)}s`\n}\n\nfunction metricCount(value: number, noun: string, color: boolean) {\n return `${style(formatNumber(value), `1;${colors.primary}`, color)} ${noun}${value === 1 ? \"\" : \"s\"}`\n}\n\nfunction style(value: string, code: string, color: boolean) {\n return color ? `\\x1b[${code}m${value}\\x1b[0m` : value\n}\n\nfunction activityGlyph(value: number, levels: number[], color: boolean) {\n if (value === 0) return paintActivity(0, color)\n const index = levels.indexOf(value)\n const level = Math.max(1, Math.ceil(((index + 1) / levels.length) * 4))\n return paintActivity(level, color)\n}\n\nfunction paintActivity(level: number, color: boolean) {\n const glyph = [\"·\", \"░\", \"▒\", \"▓\", \"█\"][level]\n if (!color) return glyph\n if (level === 0) return `\\x1b[2m${glyph}\\x1b[22m`\n return `\\x1b[${colors.activity[level - 1]}m${glyph}\\x1b[39m`\n}\n\nfunction terminalPalette() {\n const background = Number(process.env.COLORFGBG?.split(\";\").at(-1))\n if (Number.isFinite(background) && background >= 7)\n return {\n primary: \"38;2;59;125;216\",\n activity: [\"38;2;153;169;192\", \"38;2;122;155;200\", \"38;2;90;140;208\", \"38;2;59;125;216\"],\n }\n if (Number.isFinite(background))\n return {\n primary: \"38;2;250;178;131\",\n activity: [\"38;2;117;99;87\", \"38;2;161;125;102\", \"38;2;206;152;116\", \"38;2;250;178;131\"],\n }\n return { primary: \"36\", activity: [\"2;36\", \"36\", \"1;36\", \"1;96\"] }\n}\n\nfunction monthLabels(weeks: Date[]) {\n const line: string[] = []\n weeks.reduce((previous, week, index) => {\n const middle = new Date(week)\n middle.setDate(middle.getDate() + 3)\n const month = middle.getMonth()\n if (month === previous) return previous\n Intl.DateTimeFormat(\"en-US\", { month: \"short\" })\n .format(middle)\n .split(\"\")\n .forEach((character, offset) => {\n line[index + offset] = character\n })\n return month\n }, -1)\n return Array.from({ length: Math.max(weeks.length, line.length) }, (_, index) => line[index] ?? \" \")\n .join(\"\")\n .trimEnd()\n}\n\nfunction mondayIndex(date: Date) {\n return (date.getDay() + 6) % 7\n}\n\nfunction dateKey(date: Date) {\n return [\n date.getFullYear(),\n String(date.getMonth() + 1).padStart(2, \"0\"),\n String(date.getDate()).padStart(2, \"0\"),\n ].join(\"-\")\n}\n\nfunction dateOrdinal(date: Date) {\n return Math.floor(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) / 86_400_000)\n}\n"
],
"mappings": "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",
"debugId": "5E3E3E3E9DD88A0664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"],
"sourcesContent": [
"// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n",
"import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem.js\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image.js\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n const loadPhoton = yield* Effect.cached(\n // A runtime without a photon wasm artifact (#photon-wasm resolves to the\n // empty string on workerd) has no resizer, by declaration: fail typed\n // before touching URLs or module loading. The path resolution and import\n // for runtimes that DO have an artifact stay inside the guard too — a\n // throw outside it (workerd's undefined import.meta.url was one) is a\n // defect that escapes the ResizerUnavailableError handling and turns any\n // image-bearing prompt into a 500 instead of degrading to passthrough.\n photonWasm === \"\"\n ? Effect.fail(new ResizerUnavailableError())\n : Effect.tryPromise({\n try: async () => {\n ;(\n globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }\n ).__OPENCODE_PHOTON_WASM_PATH = path.isAbsolute(photonWasm)\n ? photonWasm\n : fileURLToPath(new URL(photonWasm, import.meta.url))\n return await import(\"@silvia-odwyer/photon-node\")\n },\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": ";kgCAGA,IAAe,ICDf,oBACA,wBAAS,YAIT,IAAM,EAAiB,CAAC,GAAI,GAAI,GAAI,GAAI,EAAE,EAE7B,EAAO,EAAO,IAAI,SAAU,EAAG,CAC1C,IAAM,EAAa,MAAO,EAAO,OAQ/B,IAAe,GACX,EAAO,KAAK,IAAI,CAAyB,EACzC,EAAO,WAAW,CAChB,IAAK,UAED,WACA,4BAA8B,EAAK,WAAW,CAAU,EACtD,EACA,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/C,KAAa,2CAEtB,MAAO,IAAM,IAAI,CACnB,CAAC,CACP,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": "3171442DEDBA84A964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/api.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nconst methods = new Set([\"delete\", \"get\", \"head\", \"options\", \"patch\", \"post\", \"put\"])\n\ntype Operation = {\n operationId?: string\n}\n\ntype OpenApi = {\n paths?: Record<string, Record<string, Operation>>\n}\n\nexport default Runtime.handler(\n Commands.commands.api,\n Effect.fn(\"cli.api\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n mismatch: \"ignore\",\n })\n const endpoint = server.endpoint\n const params = Option.getOrElse(input.param, () => ({}))\n const request = yield* resolveRequest(endpoint, input.request, params)\n const headers = new Headers(Service.headers(endpoint))\n for (const header of input.header) {\n const index = header.indexOf(\":\")\n if (index < 1) return yield* Effect.fail(new Error(`Invalid header, expected name:value: ${header}`))\n headers.set(header.slice(0, index).trim(), header.slice(index + 1).trim())\n }\n const body = Option.getOrUndefined(input.data)\n if (body !== undefined && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\")\n\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(request.path, endpoint.url), {\n method: request.method,\n headers,\n body,\n }),\n )\n const output = yield* Effect.promise(() => response.text())\n if (output) process.stdout.write(output + (output.endsWith(EOL) ? \"\" : EOL))\n }),\n)\n\nexport function resolveOperation(spec: OpenApi, operationID: string, params: Record<string, string>) {\n for (const [path, operations] of Object.entries(spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(operations)) {\n if (!methods.has(method) || operation.operationId !== operationID) continue\n return { method: method.toUpperCase(), path: interpolate(path, params) }\n }\n }\n throw new Error(`Operation not found: ${operationID}`)\n}\n\nexport function rawRequest(input: readonly string[]) {\n if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith(\"/\")) return\n return { method: input[0].toUpperCase(), path: input[1] }\n}\n\nfunction resolveRequest(endpoint: Endpoint, input: readonly string[], params: Record<string, string>) {\n const raw = rawRequest(input)\n if (raw) return Effect.succeed(raw)\n if (input.length !== 1) return Effect.fail(new Error(\"Expected an operation name or an HTTP method and path\"))\n return Effect.tryPromise(async () => {\n const response = await fetch(new URL(\"/openapi.json\", endpoint.url), { headers: Service.headers(endpoint) })\n if (!response.ok) throw new Error(`Failed to load OpenAPI document: HTTP ${response.status}`)\n return resolveOperation((await response.json()) as OpenApi, input[0], params)\n })\n}\n\nfunction interpolate(path: string, params: Record<string, string>) {\n const used = new Set<string>()\n const pathname = path.replaceAll(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n used.add(name)\n return encodeURIComponent(value)\n })\n const query = new URLSearchParams(Object.entries(params).filter(([name]) => !used.has(name))).toString()\n return query ? `${pathname}?${query}` : pathname\n}\n"
],
"mappings": "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",
"debugId": "B5C1B77A74DE93A564756E2164756E21",
"names": []
}

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

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

{
"version": 3,
"sources": ["src/commands/handlers/debug/agents.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH",
"debugId": "6CABE1CEE730303164756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/version.ts"],
"sourcesContent": [
"declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n"
],
"mappings": ";AAGA,IAAM,EAAiD,kBACjD,EAAiD,MAGhD,IAAM,EAAiB",
"debugId": "C32BC3ABDC4C93AF64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/plugin/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type PluginInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { Config } from \"../../../config\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { discoverTuiPlugins, tuiPluginDirectories } from \"@opencode-ai/tui/plugin/discovery\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const config = yield* Config.Service\n const global = yield* Global.Service\n const info = yield* config.get()\n const discovered = yield* Effect.promise(() =>\n tuiPluginDirectories(process.cwd(), global.config).then(discoverTuiPlugins),\n )\n const output = format(\n response.data,\n [\n ...(info.plugins ?? []).flatMap((entry) => {\n const target = typeof entry === \"string\" ? entry : entry.package\n return target.startsWith(\"-\") ? [] : [{ target, source: \"configured\" as const }]\n }),\n ...discovered.map((target) => ({ target, source: \"discovered\" as const })),\n ],\n input.builtin,\n )\n if (!output) {\n process.stdout.write(\"No plugins found\" + EOL)\n return\n }\n process.stdout.write(output + EOL)\n }),\n)\n\nexport function format(\n plugins: readonly PluginInfo[],\n tui: ReadonlyArray<{ readonly target: string; readonly source: \"configured\" | \"discovered\" }>,\n builtin = false,\n) {\n const server = plugins\n .filter((plugin) => builtin || plugin.source.type !== \"builtin\")\n .toSorted((a, b) => name(a).localeCompare(name(b)))\n .map((plugin) => `${name(plugin)} (${plugin.status})`)\n const advertised = plugins.flatMap((plugin) =>\n plugin.status === \"active\" && plugin.tui && plugin.source.type === \"package\"\n ? [{ target: plugin.source.package, source: \"advertised\" as const }]\n : [],\n )\n const targets = [...tui, ...advertised]\n .filter((plugin, index, all) => all.findIndex((candidate) => candidate.target === plugin.target) === index)\n .toSorted((a, b) => a.target.localeCompare(b.target))\n .map((plugin) => `${plugin.target} (${plugin.source})`)\n return [\n targets.length ? [\"TUI\", ...targets].join(EOL) : undefined,\n server.length ? [\"Server\", ...server].join(EOL) : undefined,\n ]\n .filter((section) => section !== undefined)\n .join(EOL + EOL)\n}\n\nfunction name(plugin: PluginInfo) {\n if (plugin.id) return plugin.id\n if (plugin.source.type === \"package\") return plugin.source.package\n if (plugin.source.type === \"local\") return plugin.source.path\n return plugin.source.type\n}\n"
],
"mappings": ";o/BAAA,cAAS,WAWT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,KAClC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACrG,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAa,MAAO,EAAO,QAAQ,IACvC,EAAqB,QAAQ,IAAI,EAAG,EAAO,MAAM,EAAE,KAAK,CAAkB,CAC5E,EACM,EAAS,EACb,EAAS,KACT,CACE,IAAI,EAAK,SAAW,CAAC,GAAG,QAAQ,CAAC,IAAU,CACzC,IAAM,EAAS,OAAO,IAAU,SAAW,EAAQ,EAAM,QACzD,OAAO,EAAO,WAAW,GAAG,EAAI,CAAC,EAAI,CAAC,CAAE,SAAQ,OAAQ,YAAsB,CAAC,EAChF,EACD,GAAG,EAAW,IAAI,CAAC,KAAY,CAAE,SAAQ,OAAQ,YAAsB,EAAE,CAC3E,EACA,EAAM,OACR,EACA,GAAI,CAAC,EAAQ,CACX,QAAQ,OAAO,MAAM,mBAAqB,CAAG,EAC7C,OAEF,QAAQ,OAAO,MAAM,EAAS,CAAG,EAClC,CACH,EAEO,SAAS,CAAM,CACpB,EACA,EACA,EAAU,GACV,CACA,IAAM,EAAS,EACZ,OAAO,CAAC,IAAW,GAAW,EAAO,OAAO,OAAS,SAAS,EAC9D,SAAS,CAAC,EAAG,IAAM,EAAK,CAAC,EAAE,cAAc,EAAK,CAAC,CAAC,CAAC,EACjD,IAAI,CAAC,IAAW,GAAG,EAAK,CAAM,MAAM,EAAO,SAAS,EACjD,EAAa,EAAQ,QAAQ,CAAC,IAClC,EAAO,SAAW,UAAY,EAAO,KAAO,EAAO,OAAO,OAAS,UAC/D,CAAC,CAAE,OAAQ,EAAO,OAAO,QAAS,OAAQ,YAAsB,CAAC,EACjE,CAAC,CACP,EACM,EAAU,CAAC,GAAG,EAAK,GAAG,CAAU,EACnC,OAAO,CAAC,EAAQ,EAAO,IAAQ,EAAI,UAAU,CAAC,IAAc,EAAU,SAAW,EAAO,MAAM,IAAM,CAAK,EACzG,SAAS,CAAC,EAAG,IAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC,EACnD,IAAI,CAAC,IAAW,GAAG,EAAO,WAAW,EAAO,SAAS,EACxD,MAAO,CACL,EAAQ,OAAS,CAAC,MAAO,GAAG,CAAO,EAAE,KAAK,CAAG,EAAI,OACjD,EAAO,OAAS,CAAC,SAAU,GAAG,CAAM,EAAE,KAAK,CAAG,EAAI,MACpD,EACG,OAAO,CAAC,IAAY,IAAY,MAAS,EACzC,KAAK,EAAM,CAAG,EAGnB,SAAS,CAAI,CAAC,EAAoB,CAChC,GAAI,EAAO,GAAI,OAAO,EAAO,GAC7B,GAAI,EAAO,OAAO,OAAS,UAAW,OAAO,EAAO,OAAO,QAC3D,GAAI,EAAO,OAAO,OAAS,QAAS,OAAO,EAAO,OAAO,KACzD,OAAO,EAAO,OAAO",
"debugId": "160C0665046456CB64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/util/tool-display.ts", "../tui/src/util/path-format.ts", "../tui/src/util/filetype.ts", "../../node_modules/.bun/ansi-regex@6.3.0/node_modules/ansi-regex/index.js", "../../node_modules/.bun/strip-ansi@7.1.2/node_modules/strip-ansi/index.js"],
"sourcesContent": [
"export function canonicalToolName(name: string) {\n if (name === \"bash\") return \"shell\"\n if (name === \"task\") return \"subagent\"\n if (name === \"apply_patch\") return \"patch\"\n return name\n}\n\nexport function finiteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return\n return value\n}\n\nexport function primitiveInputSummary(input: Record<string, unknown>, omit: readonly string[] = []) {\n const entries = Object.entries(input).filter(([key, value]) => {\n if (omit.includes(key)) return false\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n })\n if (entries.length === 0) return \"\"\n return `[${entries.map(([key, value]) => `${key}=${String(value)}`).join(\", \")}]`\n}\n\nexport function webSearchProviderLabel(provider: unknown) {\n if (typeof provider !== \"string\" || !provider) return \"Web Search\"\n return `Web Search via ${provider[0].toUpperCase()}${provider.slice(1)}`\n}\n\nexport function toolDisplayMetadata(state: unknown): Record<string, unknown> {\n if (!state || typeof state !== \"object\" || Array.isArray(state)) return {}\n if (!(\"status\" in state) || state.status === \"streaming\") return {}\n if (!(\"metadata\" in state) || !state.metadata || typeof state.metadata !== \"object\") return {}\n if (Array.isArray(state.metadata)) return {}\n return state.metadata as Record<string, unknown>\n}\n\nexport function toolDisplayContent(state: SessionMessageAssistantTool[\"state\"]) {\n if (state.status === \"streaming\" || state.status === \"running\") return []\n return state.content ?? []\n}\n\nexport function nonEmptyToolContent<T>(content: ReadonlyArray<T> | undefined): [T, ...T[]] | undefined {\n if (!content) return undefined\n const [first, ...rest] = content\n return first === undefined ? undefined : [first, ...rest]\n}\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\n",
"import path from \"path\"\n\nexport function abbreviateHome(input: string, home: string) {\n if (!home) return input\n const paths = windowsPath(home) ? path.win32 : path.posix\n const relative = paths.relative(home, input)\n if (!relative) return \"~\"\n if (relative === \"..\" || relative.startsWith(\"..\" + paths.sep) || paths.isAbsolute(relative)) return input\n return \"~/\" + relative.split(paths.sep).join(\"/\")\n}\n\nexport function formatPath(\n input: string | undefined,\n options: { base: string; home?: string; forwardSlashes?: boolean },\n) {\n if (!input) return \"\"\n const windows = windowsPath(options.base)\n if (!windows && windowsPath(input)) {\n return options.forwardSlashes ? input.replaceAll(\"\\\\\", \"/\") : input\n }\n\n const paths = windows ? path.win32 : path.posix\n const absolute = paths.isAbsolute(input) ? input : paths.resolve(options.base, input)\n const relative = paths.relative(options.base, absolute)\n const formatted = !relative\n ? \".\"\n : relative !== \"..\" && !relative.startsWith(\"..\" + paths.sep) && !paths.isAbsolute(relative)\n ? relative\n : options.home\n ? abbreviateHome(absolute, options.home)\n : absolute\n return options.forwardSlashes ? formatted.replaceAll(\"\\\\\", \"/\") : formatted\n}\n\nfunction windowsPath(input: string) {\n return /^[A-Za-z]:[\\\\/]/.test(input) || input.startsWith(\"\\\\\\\\\")\n}\n",
"import path from \"node:path\"\n\nexport const LANGUAGE_EXTENSIONS: Record<string, string> = {\n \".abap\": \"abap\",\n \".bat\": \"bat\",\n \".bib\": \"bibtex\",\n \".bibtex\": \"bibtex\",\n \".clj\": \"clojure\",\n \".cljs\": \"clojure\",\n \".cljc\": \"clojure\",\n \".edn\": \"clojure\",\n \".coffee\": \"coffeescript\",\n \".c\": \"c\",\n \".cpp\": \"cpp\",\n \".cxx\": \"cpp\",\n \".cc\": \"cpp\",\n \".c++\": \"cpp\",\n \".cs\": \"csharp\",\n \".csx\": \"csharp\",\n \".css\": \"css\",\n \".d\": \"d\",\n \".pas\": \"pascal\",\n \".pascal\": \"pascal\",\n \".diff\": \"diff\",\n \".patch\": \"diff\",\n \".dart\": \"dart\",\n \".dockerfile\": \"dockerfile\",\n \".ex\": \"elixir\",\n \".exs\": \"elixir\",\n \".erl\": \"erlang\",\n \".ets\": \"typescript\",\n \".hrl\": \"erlang\",\n \".fs\": \"fsharp\",\n \".fsi\": \"fsharp\",\n \".fsx\": \"fsharp\",\n \".fsscript\": \"fsharp\",\n \".gitcommit\": \"git-commit\",\n \".gitrebase\": \"git-rebase\",\n \".go\": \"go\",\n \".groovy\": \"groovy\",\n \".gleam\": \"gleam\",\n \".hbs\": \"handlebars\",\n \".handlebars\": \"handlebars\",\n \".hs\": \"haskell\",\n \".lhs\": \"haskell\",\n \".html\": \"html\",\n \".htm\": \"html\",\n \".ini\": \"ini\",\n \".java\": \"java\",\n \".jl\": \"julia\",\n \".js\": \"javascript\",\n \".kt\": \"kotlin\",\n \".kts\": \"kotlin\",\n \".jsx\": \"javascriptreact\",\n \".json\": \"json\",\n \".tex\": \"latex\",\n \".latex\": \"latex\",\n \".less\": \"less\",\n \".lua\": \"lua\",\n \".makefile\": \"makefile\",\n makefile: \"makefile\",\n \".md\": \"markdown\",\n \".markdown\": \"markdown\",\n \".m\": \"objective-c\",\n \".mm\": \"objective-cpp\",\n \".pl\": \"perl\",\n \".pm\": \"perl\",\n \".pm6\": \"perl6\",\n \".php\": \"php\",\n \".ps1\": \"powershell\",\n \".psm1\": \"powershell\",\n \".pug\": \"jade\",\n \".jade\": \"jade\",\n \".py\": \"python\",\n \".r\": \"r\",\n \".cshtml\": \"razor\",\n \".razor\": \"razor\",\n \".rb\": \"ruby\",\n \".rake\": \"ruby\",\n \".gemspec\": \"ruby\",\n \".ru\": \"ruby\",\n \".erb\": \"erb\",\n \".html.erb\": \"erb\",\n \".js.erb\": \"erb\",\n \".css.erb\": \"erb\",\n \".json.erb\": \"erb\",\n \".rs\": \"rust\",\n \".scss\": \"scss\",\n \".sass\": \"sass\",\n \".scala\": \"scala\",\n \".shader\": \"shaderlab\",\n \".sh\": \"shellscript\",\n \".bash\": \"shellscript\",\n \".zsh\": \"shellscript\",\n \".ksh\": \"shellscript\",\n \".sql\": \"sql\",\n \".svelte\": \"svelte\",\n \".swift\": \"swift\",\n \".ts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".mtsx\": \"typescriptreact\",\n \".ctsx\": \"typescriptreact\",\n \".xml\": \"xml\",\n \".xsl\": \"xsl\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".vue\": \"vue\",\n \".zig\": \"zig\",\n \".zon\": \"zig\",\n \".astro\": \"astro\",\n \".ml\": \"ocaml\",\n \".mli\": \"ocaml\",\n \".tf\": \"terraform\",\n \".tfvars\": \"terraform-vars\",\n \".hcl\": \"hcl\",\n \".nix\": \"nix\",\n \".typ\": \"typst\",\n \".typc\": \"typst\",\n}\n\nexport function filetype(input?: string) {\n if (!input) return \"none\"\n const language = LANGUAGE_EXTENSIONS[path.extname(input)]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(language)) return \"typescript\"\n return language\n}\n",
"export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST\n\t// The payload stops at the first terminator character rather than scanning ahead for one, so an unterminated `ESC ]` cannot rescan the rest of the input. Terminals likewise abort a control string on an unexpected ESC.\n\tconst osc = `(?:\\\\u001B\\\\][^\\\\u0007\\\\u001B\\\\u009C]*${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n",
"import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n"
],
"mappings": "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",
"debugId": "EF3063F22B72E7E064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/export.ts"],
"sourcesContent": [
"import { autocomplete, cancel, intro, isCancel, log, outro } from \"@clack/prompts\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { errorMessage } from \"../../util/error\"\n\nexport default Runtime.handler(\n Commands.commands.export,\n Effect.fn(\"cli.export\")((input) =>\n Effect.gen(function* () {\n const requested = Option.getOrUndefined(input.session)\n if (!requested && !process.stdin.isTTY) {\n yield* Effect.fail(new Error(\"Pass a session ID when running without an interactive terminal\"))\n }\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const sessionID = requested\n ? requested\n : yield* Effect.gen(function* () {\n intro(\"Export session\", { output: process.stderr })\n const location = yield* Effect.tryPromise({\n try: () => client.location.get({ location: { directory: process.cwd() } }),\n catch: (cause) => cause,\n })\n const page = yield* Effect.tryPromise({\n try: () =>\n client.session.list({\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n order: \"desc\",\n limit: 50,\n }),\n catch: (cause) => cause,\n })\n if (page.data.length === 0) {\n log.error(\"No sessions found\", { output: process.stderr })\n outro(\"Done\", { output: process.stderr })\n return undefined\n }\n const selected = yield* Effect.tryPromise({\n try: () =>\n autocomplete({\n message: \"Select session to export\",\n maxItems: 10,\n options: page.data.map((session) => ({\n label: session.title,\n value: session.id,\n hint: `${new Date(session.time.updated).toLocaleString()} - ${session.id.slice(-8)}`,\n })),\n output: process.stderr,\n }),\n catch: (cause) => cause,\n })\n if (isCancel(selected)) {\n cancel(\"Cancelled\", { output: process.stderr })\n process.exitCode = 130\n return undefined\n }\n outro(\"Exporting session...\", { output: process.stderr })\n return selected\n })\n if (!sessionID) return\n const data = yield* Effect.tryPromise({\n try: () => client.session.export({ sessionID, sanitize: input.sanitize }),\n catch: (cause) => cause,\n })\n process.stdout.write(JSON.stringify(data, null, 2) + EOL)\n }).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n ),\n)\n"
],
"mappings": ";utCAIA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,CAAC,IACvB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAY,EAAO,eAAe,EAAM,OAAO,EACrD,GAAI,CAAC,GAAa,CAAC,QAAQ,MAAM,MAC/B,MAAO,EAAO,KAAS,MAAM,gEAAgE,CAAC,EAEhG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAY,EACd,EACA,MAAO,EAAO,IAAI,SAAU,EAAG,CAC7B,EAAM,iBAAkB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAClD,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IAAM,EAAO,SAAS,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,EACzE,MAAO,CAAC,IAAU,CACpB,CAAC,EACK,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAO,QAAQ,KAAK,CAClB,UAAW,EAAS,UACpB,UAAW,EAAS,YACpB,SAAU,KACV,MAAO,OACP,MAAO,EACT,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAK,KAAK,SAAW,EAAG,CAC1B,EAAI,MAAM,oBAAqB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACzD,EAAM,OAAQ,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACxC,OAEF,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IACH,EAAa,CACX,QAAS,2BACT,SAAU,GACV,QAAS,EAAK,KAAK,IAAI,CAAC,KAAa,CACnC,MAAO,EAAQ,MACf,MAAO,EAAQ,GACf,KAAM,GAAG,IAAI,KAAK,EAAQ,KAAK,OAAO,EAAE,eAAe,OAAO,EAAQ,GAAG,MAAM,EAAE,GACnF,EAAE,EACF,OAAQ,QAAQ,MAClB,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAS,CAAQ,EAAG,CACtB,EAAO,YAAa,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAC9C,QAAQ,SAAW,IACnB,OAGF,OADA,EAAM,uBAAwB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACjD,EACR,EACL,GAAI,CAAC,EAAW,OAChB,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IAAM,EAAO,QAAQ,OAAO,CAAE,YAAW,SAAU,EAAM,QAAS,CAAC,EACxE,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAM,KAAM,CAAC,EAAI,CAAG,EACzD,EAAE,KACD,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,CACF",
"debugId": "DF8E152FF462215A64756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/auth/shared.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { OpenCode, type IntegrationInfo, type IntegrationMethod, type OpenCodeClient } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../../services/server-connection\"\n\nexport const location = { directory: process.cwd() }\n\nexport const createClient = Effect.fn(\"cli.auth.client\")(function* (input: ServerConnection.Args) {\n const server = yield* ServerConnection.resolve(input)\n return OpenCode.make({ baseUrl: server.endpoint.url, headers: Service.headers(server.endpoint) })\n})\n\nexport function request<A>(run: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({ try: run, catch: (cause) => cause })\n}\n\nexport const loadIntegrations = Effect.fn(\"cli.auth.integrations\")(function* (client: OpenCodeClient) {\n // The model endpoint is the existing public readiness boundary for the initial plugin generation.\n yield* request((signal) => client.model.default({ location }, { signal }))\n return yield* request((signal) => client.integration.list({ location }, { signal })).pipe(\n Effect.map((response) => response.data),\n )\n})\n\nexport const resolveIntegration = Effect.fn(\"cli.auth.resolve-integration\")(function* (\n integrations: IntegrationInfo[],\n target: string,\n) {\n const normalized = target.replace(/\\/+$/, \"\")\n const byID = integrations.find((integration) => integration.id === normalized)\n if (byID) return byID\n const matches = integrations.filter((integration) => integration.name.toLowerCase() === normalized.toLowerCase())\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) {\n return yield* Effect.fail(\n new Error(\n `Integration name \"${target}\" is ambiguous: ${matches.map((integration) => integration.id).join(\", \")}`,\n ),\n )\n }\n return yield* Effect.fail(new Error(`Integration not found: ${target}`))\n})\n\nexport type ConnectMethod = Exclude<IntegrationMethod, { type: \"env\" }>\n\nexport function connectMethods(integration: IntegrationInfo) {\n return integration.methods\n .filter((method): method is ConnectMethod => method.type !== \"env\")\n .toSorted((a, b) => Number(a.type === \"key\") - Number(b.type === \"key\"))\n}\n\nexport const resolveMethod = Effect.fn(\"cli.auth.resolve-method\")(function* (methods: ConnectMethod[], target: string) {\n const normalized = target.toLowerCase()\n const matches = methods.filter((method) => {\n if (method.type === \"key\") return normalized === \"key\" || method.label?.toLowerCase() === normalized\n return method.id === target || method.label.toLowerCase() === normalized\n })\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) return yield* Effect.fail(new Error(`Authentication method \"${target}\" is ambiguous`))\n const available = methods.map((method) => (method.type === \"key\" ? \"key\" : method.id)).join(\", \")\n return yield* Effect.fail(\n new Error(`Authentication method not found: ${target}${available ? `. Available: ${available}` : \"\"}`),\n )\n})\n"
],
"mappings": ";gNAKO,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAEtC,EAAe,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAA8B,CAChG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAAK,EACpD,OAAO,EAAS,KAAK,CAAE,QAAS,EAAO,SAAS,IAAK,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAAE,CAAC,EACjG,EAEM,SAAS,CAAU,CAAC,EAA0C,CACnE,OAAO,EAAO,WAAW,CAAE,IAAK,EAAK,MAAO,CAAC,IAAU,CAAM,CAAC,EAGzD,IAAM,EAAmB,EAAO,GAAG,uBAAuB,EAAE,SAAU,CAAC,EAAwB,CAGpG,OADA,MAAO,EAAQ,CAAC,IAAW,EAAO,MAAM,QAAQ,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAClE,MAAO,EAAQ,CAAC,IAAW,EAAO,YAAY,KAAK,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAAE,KACnF,EAAO,IAAI,CAAC,IAAa,EAAS,IAAI,CACxC,EACD,EAEY,EAAqB,EAAO,GAAG,8BAA8B,EAAE,SAAU,CACpF,EACA,EACA,CACA,IAAM,EAAa,EAAO,QAAQ,OAAQ,EAAE,EACtC,EAAO,EAAa,KAAK,CAAC,IAAgB,EAAY,KAAO,CAAU,EAC7E,GAAI,EAAM,OAAO,EACjB,IAAM,EAAU,EAAa,OAAO,CAAC,IAAgB,EAAY,KAAK,YAAY,IAAM,EAAW,YAAY,CAAC,EAChH,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EACnB,OAAO,MAAO,EAAO,KACf,MACF,qBAAqB,oBAAyB,EAAQ,IAAI,CAAC,IAAgB,EAAY,EAAE,EAAE,KAAK,IAAI,GACtG,CACF,EAEF,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,GAAQ,CAAC,EACxE,EAIM,SAAS,CAAc,CAAC,EAA8B,CAC3D,OAAO,EAAY,QAChB,OAAO,CAAC,IAAoC,EAAO,OAAS,KAAK,EACjE,SAAS,CAAC,EAAG,IAAM,OAAO,EAAE,OAAS,KAAK,EAAI,OAAO,EAAE,OAAS,KAAK,CAAC,EAGpE,IAAM,EAAgB,EAAO,GAAG,yBAAyB,EAAE,SAAU,CAAC,EAA0B,EAAgB,CACrH,IAAM,EAAa,EAAO,YAAY,EAChC,EAAU,EAAQ,OAAO,CAAC,IAAW,CACzC,GAAI,EAAO,OAAS,MAAO,OAAO,IAAe,OAAS,EAAO,OAAO,YAAY,IAAM,EAC1F,OAAO,EAAO,KAAO,GAAU,EAAO,MAAM,YAAY,IAAM,EAC/D,EACD,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,iBAAsB,CAAC,EAC7G,IAAM,EAAY,EAAQ,IAAI,CAAC,IAAY,EAAO,OAAS,MAAQ,MAAQ,EAAO,EAAG,EAAE,KAAK,IAAI,EAChG,OAAO,MAAO,EAAO,KACf,MAAM,oCAAoC,IAAS,EAAY,gBAAgB,IAAc,IAAI,CACvG,EACD",
"debugId": "873222A377ABD3A964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/import.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionTransfer } from \"@opencode-ai/schema/session-transfer\"\nimport { Effect, Option, Schema } from \"effect\"\nimport { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.import,\n Effect.fn(\"cli.import\")(function* (input) {\n const text = yield* Effect.tryPromise({\n try: () =>\n input.file.startsWith(\"http://\") || input.file.startsWith(\"https://\")\n ? fetch(input.file).then((response) => {\n if (!response.ok) throw new Error(`Failed to fetch session data: ${response.statusText}`)\n return response.text()\n })\n : Bun.file(input.file).text(),\n catch: (cause) =>\n new Error(`Failed to read session data: ${cause instanceof Error ? cause.message : String(cause)}`),\n })\n const data = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(SessionTransfer.Data))(text)\n const encoded = Schema.encodeSync(SessionTransfer.Data)(data)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const location = yield* Effect.promise(() =>\n client.location.get({\n location: { directory: path.resolve(Option.getOrElse(input.directory, () => process.cwd())) },\n }),\n )\n const response = yield* Effect.promise(() =>\n fetch(new URL(\"/api/session/import\", server.endpoint.url), {\n method: \"POST\",\n headers: { ...Service.headers(server.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...encoded,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n }),\n }),\n )\n if (response.status === 409) {\n process.stderr.write(`Session already exists${EOL}`)\n return\n }\n if (!response.ok) yield* Effect.fail(new Error(`Failed to import session: ${response.statusText}`))\n const imported = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ data: Session.Info })))(\n yield* Effect.promise(() => response.text()),\n )\n process.stdout.write(`Imported session: ${imported.data.id}${EOL}`)\n }),\n)\n"
],
"mappings": ";03CAKA,cAAS,WACT,oBAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAM,KAAK,WAAW,SAAS,GAAK,EAAM,KAAK,WAAW,UAAU,EAChE,MAAM,EAAM,IAAI,EAAE,KAAK,CAAC,IAAa,CACnC,GAAI,CAAC,EAAS,GAAI,MAAU,MAAM,iCAAiC,EAAS,YAAY,EACxF,OAAO,EAAS,KAAK,EACtB,EACD,IAAI,KAAK,EAAM,IAAI,EAAE,KAAK,EAChC,MAAO,CAAC,IACF,MAAM,gCAAgC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAAG,CACtG,CAAC,EACK,EAAO,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAgB,IAAI,CAAC,EAAE,CAAI,EAC1F,EAAU,EAAO,WAAW,EAAgB,IAAI,EAAE,CAAI,EACtD,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAW,MAAO,EAAO,QAAQ,IACrC,EAAO,SAAS,IAAI,CAClB,SAAU,CAAE,UAAW,EAAK,QAAQ,EAAO,UAAU,EAAM,UAAW,IAAM,QAAQ,IAAI,CAAC,CAAC,CAAE,CAC9F,CAAC,CACH,EACM,EAAW,MAAO,EAAO,QAAQ,IACrC,MAAM,IAAI,IAAI,sBAAuB,EAAO,SAAS,GAAG,EAAG,CACzD,OAAQ,OACR,QAAS,IAAK,EAAQ,QAAQ,EAAO,QAAQ,EAAG,eAAgB,kBAAmB,EACnF,KAAM,KAAK,UAAU,IAChB,EACH,SAAU,CAAE,UAAW,EAAS,UAAW,YAAa,EAAS,WAAY,CAC/E,CAAC,CACH,CAAC,CACH,EACA,GAAI,EAAS,SAAW,IAAK,CAC3B,QAAQ,OAAO,MAAM,yBAAyB,GAAK,EACnD,OAEF,GAAI,CAAC,EAAS,GAAI,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAS,YAAY,CAAC,EAClG,IAAM,EAAW,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAO,OAAO,CAAE,KAAM,EAAQ,IAAK,CAAC,CAAC,CAAC,EAC7G,MAAO,EAAO,QAAQ,IAAM,EAAS,KAAK,CAAC,CAC7C,EACA,QAAQ,OAAO,MAAM,qBAAqB,EAAS,KAAK,KAAK,GAAK,EACnE,CACH",
"debugId": "2B2AA16D2C92F4D864756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/service/unset.ts"],
"sourcesContent": [
"import { 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.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key, Option.getOrUndefined(input.name))\n }),\n)\n"
],
"mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,MAAO,EAAc,MAAM,EAAM,IAAK,EAAO,eAAe,EAAM,IAAI,CAAC,EACxE,CACH",
"debugId": "E3E11B23E96E297C64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/set.ts"],
"sourcesContent": [
"import { 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.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value, Option.getOrUndefined(input.nestedValue))\n }),\n)\n"
],
"mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,MAAO,EAAO,eAAe,EAAM,WAAW,CAAC,EAC1F,CACH",
"debugId": "CF6C3E41EEDAD8DF64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"],
"sourcesContent": [
"import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\nimport { Env } from \"../env\"\nimport { errorMessage } from \"../util/error\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n // Bun's default five-minute deadline terminates the event stream used by long-running sessions.\n fetch: ((request: RequestInfo | URL, init?: RequestInit) =>\n fetch(request, { ...init, timeout: false } as BunFetchRequestInit)) as typeof fetch,\n })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n environment: input.server.service ? Env.session() : undefined,\n prepare: async (next) => {\n const selected =\n next.model ??\n (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n return { model, agent: next.agent }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n",
"import type {\n EventSubscribeOutput,\n JsonValue,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n ToolContent,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { nonEmptyToolContent, toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n metadata: Record<string, JsonValue>\n content: ToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.inbox.delivered\") {\n if (event.data.inboxID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.id), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) {\n current.metadata = event.data.metadata\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n metadata: event.data.metadata,\n content: event.data.content,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n metadata: event.data.metadata,\n content: event.data.content,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const metadata = event.data.metadata ?? current.metadata\n const content = event.data.content ?? nonEmptyToolContent(current.content)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n metadata,\n content,\n error: event.data.error,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (content && toolOutputText(current.tool, content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n metadata,\n content,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (input.compatibility === \"v1\" && event.data.error.message === \"The provider response ended unexpectedly.\") {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n partID: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n id: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (item.state.content && toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({\n ...item,\n state: {\n status: \"completed\",\n input: item.state.input,\n metadata: item.state.metadata,\n content: item.state.content,\n },\n })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, id: string) {\n return `${messageID}\\u0000${id}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; id: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n metadata: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n",
"import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n"
],
"mappings": ";+wCAGA,eAAS,qBACT,qBCMA,cAAS,WACT,mBAAS,mGCXT,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,GAAQ,GAEL,SAAS,EAAK,EAAG,CACtB,GAAI,GAAO,OACX,EAAQ,EAAM,WAAW,EACzB,GAAQ,GAGH,SAAS,EAAK,CAAC,EAAiB,CACrC,GAAI,EAAQ,WAAW,SAAS,EAAG,EAAU,EAAQ,MAAM,CAAgB,EAC3E,EAAQ,EAAM,iBAAmB,UAAY,EAAM,YAAc,CAAO,ED4C1E,IAAM,EAAyB,SAE/B,eAAsB,EAAuB,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,GAAe,GAAG,OAAO,EACrC,EAAS,IAAI,IACb,EAAQ,IAAI,IACZ,EAAe,IAAI,IACnB,EAAoB,IAAI,IACxB,EAAgB,IAAI,IACtB,EAAY,GACZ,EAAW,GACX,EAAe,GACf,EAAqB,GACrB,EAAgB,GAChB,EAAc,GACd,EAAkB,GAClB,EACA,EAAa,GACb,EACA,EAEE,EAAO,CAAC,EAAc,EAAmB,IAAkC,CAC/E,GAAI,EAAM,SAAW,OAAQ,MAAO,GAEpC,OADA,QAAQ,OAAO,MAAM,KAAK,UAAU,CAAE,OAAM,YAAW,UAAW,EAAM,aAAc,CAAK,CAAC,EAAI,CAAG,EAC5F,IAGH,EAAY,CAAC,EAAgD,IAAsB,CACvF,GAAI,EAAK,OAAQ,EAAW,CAAE,MAAK,CAAC,EAAG,OACvC,IAAM,EAAO,EAAK,KAAK,KAAK,EAC5B,GAAI,CAAC,EAAM,OACX,GAAI,CAAC,QAAQ,OAAO,MAAO,CACzB,QAAQ,OAAO,MAAM,EAAO,CAAG,EAC/B,OAEF,EAAG,MAAM,EACT,EAAG,QAAQ,CAAI,EACf,EAAG,MAAM,GAGL,GAAiB,CAAC,EAAgD,IAAsB,CAC5F,GAAI,EAAK,YAAa,EAAW,CAAE,MAAK,CAAC,EAAG,OAC5C,IAAM,EAAO,EAAK,KAAK,KAAK,EAC5B,GAAI,CAAC,EAAM,OACX,IAAM,EAAO,aAAa,IAC1B,GAAI,CAAC,QAAQ,OAAO,MAAO,OAAO,KAAK,QAAQ,OAAO,MAAM,EAAO,CAAG,EACtE,EAAG,MAAM,EACT,EAAG,QAAQ,GAAG,EAAG,MAAM,kBAAoB,WAAgB,EAAG,MAAM,aAAa,EACjF,EAAG,MAAM,GAGL,EAAY,IAAM,CACtB,GAAI,CAAC,EAAa,OAClB,IAAM,EAAQ,EAEd,GADA,EAAc,OACV,CAAC,EAAK,aAAc,EAAM,UAAW,CAAE,KAAM,EAAM,IAAK,CAAC,GAAK,EAAM,SAAW,OACjF,EAAG,MAAM,EACT,EAAG,QAAQ,EAAM,KAAK,EACtB,EAAG,MAAM,GAIP,GAAkB,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,EAAa,MAAO,IAAmD,CAC3E,GAAI,CACF,MAAM,EAAM,OAAO,KAAK,OACtB,CAAE,UAAW,EAAQ,UAAW,OAAQ,EAAQ,EAAG,EACnD,GAAG,GAAmB,EAAQ,YAAc,EAAyB,EAAM,SAAW,MAAS,CACjG,EACA,MAAO,EAAO,CACd,GAAI,CAAC,GAAmB,CAAK,EAAG,MAAM,EAExC,EAAgB,IAGZ,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,oBAAsB,GAAa,EAAM,KAAK,YAAc,EAAM,UAAW,CAC9F,MAAM,GAAgB,EAAM,IAAI,EAChC,SAEF,GACE,EAAM,OAAS,gBACf,IACC,EAAM,KAAK,KAAK,YAAc,EAAM,WAClC,CAAC,EAAM,UACN,EAAM,KAAK,KAAK,YAAc,GAC9B,GAAa,EAAM,SAAU,EAAM,QAAQ,GAC/C,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,2BACjB,GAAI,EAAM,KAAK,UAAY,EAAW,CACpC,EAAW,GACX,EAAoB,OACpB,UAGJ,GACE,EAAM,OAAS,iCACf,EAAM,KAAK,SAAW,SACrB,GAAe,GAAsB,GAEtC,OAEF,GAAI,CAAC,GAAY,EAAM,OAAS,2BAA4B,CAE1D,GADA,EAAoB,EAAM,KAAK,MAC3B,EAAY,OAChB,SAEF,GACE,CAAC,GACD,IACC,EAAM,OAAS,+BAAiC,EAAM,OAAS,iCAEhE,OACF,GAAI,CAAC,EAAU,SACf,GAAI,GAAc,CAAC,EAAM,KAAK,WAAW,oBAAoB,EAAG,SAEhE,GAAI,EAAM,OAAS,uBAAwB,CACzC,IAAM,EAAO,CACX,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,aACN,SAAU,EAAM,KAAK,QACvB,EACA,GAAI,EAAM,gBAAkB,KAAM,CAChC,EAAc,CACZ,UAAW,EACX,OACA,MAAO,KAAK,EAAM,KAAK,cAAW,EAAM,KAAK,MAAM,IACrD,EACA,SAEF,GAAI,CAAC,EAAK,aAAc,EAAM,CAAE,MAAK,CAAC,GAAK,EAAM,SAAW,OAC1D,EAAG,MAAM,EACT,EAAG,QAAQ,KAAK,EAAM,KAAK,cAAW,EAAM,KAAK,MAAM,IAAI,EAC3D,EAAG,MAAM,EAEX,SAGF,GAAI,EAAM,OAAS,uBAAwB,CACzC,EAAU,EACV,EAAO,IAAI,WAAa,EAAW,EAAM,KAAK,mBAAoB,EAAM,KAAK,OAAO,IAAK,CACvF,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,CACb,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,qBAAsB,CACvC,IAAM,EAAM,EAAW,EAAM,KAAK,mBAAoB,EAAM,KAAK,OAAO,EAClE,EAAU,EAAO,IAAI,WAAa,GAAK,EAC7C,EAAO,OAAO,WAAa,GAAK,EAChC,IAAM,EAAO,CACX,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,KAAM,EAAM,KAAK,KACjB,KAAM,CAAE,MAAO,GAAS,WAAa,EAAM,IAAK,CAAK,CACvD,EACA,EAAa,IAAI,EAAK,EAAM,KAAK,IAAI,EACrC,EAAU,EAAM,CAAI,EACpB,SAGF,GAAI,EAAM,OAAS,4BAA6B,CAC9C,EAAU,EACV,EAAO,IAAI,gBAAkB,EAAW,EAAM,KAAK,mBAAoB,EAAM,KAAK,OAAO,IAAK,CAC5F,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,CACb,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,2BAA6B,EAAM,SAAU,CAC9D,IAAM,EAAM,EAAW,EAAM,KAAK,mBAAoB,EAAM,KAAK,OAAO,EAClE,EAAU,EAAO,IAAI,gBAAkB,GAAK,EAClD,EAAO,OAAO,gBAAkB,GAAK,EACrC,IAAM,EAAO,CACX,GAAI,GAAS,IAAM,EAAO,EAAM,EAAE,EAClC,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,YACN,KAAM,EAAM,KAAK,KACjB,SAAU,EAAM,KAAK,MACrB,KAAM,CAAE,MAAO,GAAS,WAAa,EAAM,IAAK,CAAK,CACvD,EACA,EAAkB,IAAI,EAAK,EAAM,KAAK,IAAI,EAC1C,GAAe,EAAM,CAAI,EACzB,SAGF,GAAI,EAAM,OAAS,6BAA8B,CAC/C,EAAU,EACV,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,EAAE,EAAG,CAC/D,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EACX,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,EAAM,KAAK,KACjB,MAAO,CAAC,EACR,SAAU,CAAC,EACX,QAAS,CAAC,CACZ,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,2BAA4B,CAC7C,IAAM,EAAU,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,EAAE,CAAC,EAC/E,GAAI,EAAS,EAAQ,IAAM,EAAM,KAAK,KACtC,SAEF,GAAI,EAAM,OAAS,2BAA4B,CAC7C,IAAM,EAAU,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,EAAE,CAAC,EAC/E,GAAI,EAAS,EAAQ,KAAO,EAAQ,KAAO,IAAM,EAAM,KAAK,MAC5D,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,EAAU,EACV,IAAM,EAAM,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,EAAE,EAC1D,EAAU,EAAM,IAAI,CAAG,EAC7B,EAAM,IAAI,EAAK,CACb,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,EACnE,cAAe,EAAM,KAAK,MAC1B,SAAU,CAAC,EACX,QAAS,CAAC,CACZ,CAAC,EACD,SAEF,GAAI,EAAM,OAAS,wBAAyB,CAC1C,IAAM,EAAU,EAAM,IAAI,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,EAAE,CAAC,EAC/E,GAAI,EACF,EAAQ,SAAW,EAAM,KAAK,SAEhC,SAEF,GAAI,EAAM,OAAS,uBAAwB,CACzC,IAAM,EAAM,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,EAAE,EAC1D,EAAU,EAAM,IAAI,CAAG,GAAK,GAAa,CAAK,EAC9C,EAAoC,CACxC,KAAM,OACN,GAAI,EAAM,KAAK,GACf,KAAM,EAAQ,KACd,SAAU,EAAM,KAAK,SACrB,cAAe,EAAQ,cACvB,oBAAqB,EAAM,KAAK,YAChC,MAAO,CACL,OAAQ,YACR,MAAO,EAAQ,MACf,SAAU,EAAM,KAAK,SACrB,QAAS,EAAM,KAAK,OACtB,EACA,KAAM,CAAE,QAAS,EAAQ,UAAW,IAAK,EAAQ,UAAW,UAAW,CAAK,CAC9E,EACM,EAAqB,CACzB,OAAQ,EAAQ,GAChB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,GAAI,EAAM,KAAK,GACf,KAAM,EAAQ,KACd,MAAO,CACL,OAAQ,YACR,MAAO,EAAQ,MACf,OAAQ,EAAe,EAAQ,KAAM,EAAM,KAAK,OAAO,EACvD,MAAO,EAAQ,KACf,SAAU,CACR,SAAU,EAAM,KAAK,SACrB,QAAS,EAAM,KAAK,QACpB,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,EAGA,GAFA,EAAM,OAAO,CAAG,EAChB,EAAc,IAAI,CAAG,EACjB,CAAC,EAAK,WAAY,EAAM,CAAE,MAAK,CAAC,EAAG,MAAM,EAAM,WAAW,CAAI,EAClE,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,IAAM,EAAM,EAAQ,EAAM,KAAK,mBAAoB,EAAM,KAAK,EAAE,EAC1D,EAAU,EAAM,IAAI,CAAG,GAAK,GAAa,CAAK,EAC9C,EAAQ,EAAM,KAAK,MAAM,QACzB,EAAW,EAAM,KAAK,UAAY,EAAQ,SAC1C,EAAU,EAAM,KAAK,SAAW,GAAoB,EAAQ,OAAO,EACnE,EAAoC,CACxC,KAAM,OACN,GAAI,EAAM,KAAK,GACf,KAAM,EAAQ,KACd,SAAU,EAAM,KAAK,SACrB,cAAe,EAAQ,cACvB,oBAAqB,EAAM,KAAK,YAChC,MAAO,CACL,OAAQ,QACR,MAAO,EAAQ,MACf,WACA,UACA,MAAO,EAAM,KAAK,KACpB,EACA,KAAM,CAAE,QAAS,EAAQ,UAAW,IAAK,EAAQ,UAAW,UAAW,CAAK,CAC9E,EACM,EAAqB,CACzB,OAAQ,EAAQ,GAChB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,OACN,GAAI,EAAM,KAAK,GACf,KAAM,EAAQ,KACd,MAAO,CACL,OAAQ,QACR,MAAO,EAAQ,MACf,QACA,SAAU,CACR,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,EAGA,GAFA,EAAM,OAAO,CAAG,EAChB,EAAc,IAAI,CAAG,EACjB,EAAM,gBAAkB,OAAS,GAAsB,GAAgB,SAC3E,GAAI,CAAC,EAAK,WAAY,EAAM,CAAE,MAAK,CAAC,EAAG,CACrC,GAAI,GAAW,EAAe,EAAQ,KAAM,CAAO,EAAE,KAAK,EACxD,MAAM,EAAM,WAAW,IAClB,EACH,MAAO,CACL,OAAQ,YACR,MAAO,EAAQ,MACf,WACA,SACF,CACF,CAAC,EACH,MAAM,EAAM,gBAAgB,CAAI,EAChC,EAAG,MAAM,CAAK,EAEhB,SAGF,GAAI,EAAM,OAAS,qBAAsB,CACvC,EAAU,EACV,IAAM,EAAO,CACX,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,EAAM,UACjB,UAAW,EAAM,KAAK,mBACtB,KAAM,cACN,OAAQ,EAAM,KAAK,OACnB,SAAU,EAAM,KAAK,SACrB,KAAM,EAAM,KAAK,KACjB,OAAQ,EAAM,KAAK,MACrB,EACA,EAAK,cAAe,EAAM,CAAE,MAAK,CAAC,EAClC,SAEF,GAAI,EAAM,OAAS,sBAAuB,CACxC,GAAI,EAAM,gBAAkB,MAAQ,EAAM,KAAK,MAAM,UAAY,4CAA6C,CAC5G,EAAc,OACd,EAAkB,GAClB,SAEF,GAAI,GAAe,GAAsB,EAAe,SAIxD,GAHA,EAAU,EACV,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,EAAM,gBAAkB,OAAS,GAAmB,GAAsB,GAAgB,OAE9F,GADA,EAAU,EACN,CAAC,GAAgB,CAAC,GAGpB,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,gBAAkB,OAAS,GAAsB,GAAgB,OAC3E,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,GAAoB,SAAY,CACpC,IAAM,EAAiC,CAAC,EACpC,EACJ,MAAO,GAAM,CACX,IAAM,EAAO,MAAM,EAAM,OAAO,QAAQ,KACtC,EACI,CAAE,UAAW,EAAM,UAAW,MAAO,IAAK,QAAO,EACjD,CAAE,UAAW,EAAM,UAAW,MAAO,IAAK,MAAO,MAAO,CAC9D,EACA,QAAW,KAAW,EAAK,KAAM,CAC/B,GAAI,EAAQ,KAAO,EAAW,MAAO,CAAE,MAAO,GAAM,SAAU,EAAS,WAAW,CAAE,EACpF,EAAS,KAAK,CAAO,EAGvB,GADA,EAAS,EAAK,OAAO,MAAQ,OACzB,CAAC,EAAQ,MAAO,CAAE,MAAO,GAAO,SAAU,CAAC,CAAE,IAI/C,GAAY,SAAY,CAC5B,IAAM,EAAY,MAAM,GAAkB,EAC1C,QAAW,KAAW,EAAU,SAAU,CACxC,GAAI,EAAQ,OAAS,YAAa,SAClC,IAAM,EAAY,EAAQ,KAAK,WAAa,EAAQ,KAAK,QACrD,EAAc,EACd,EAAmB,EACvB,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,EAAK,OAAS,OAAQ,CACxB,IAAM,EAAU,IACV,EAAM,EAAW,EAAQ,GAAI,CAAO,EACpC,EAAW,EAAa,IAAI,CAAG,GAAK,GAC1C,GAAI,IAAa,EAAK,MAAQ,CAAC,EAAK,KAAK,WAAW,CAAQ,EAAG,SAC/D,IAAM,EAAO,EAAK,KAAK,MAAM,EAAS,MAAM,EAC5C,EACE,CACE,GAAI,EAAgB,EAAQ,GAAI,QAAQ,GAAS,EACjD,UAAW,EAAM,UACjB,UAAW,EAAQ,GACnB,KAAM,OACN,OACA,KAAM,CAAE,MAAO,EAAQ,KAAK,QAAS,IAAK,CAAU,CACtD,EACA,CACF,EACA,EAAa,IAAI,EAAK,EAAK,IAAI,EAC/B,SAEF,GAAI,EAAK,OAAS,YAAa,CAC7B,IAAM,EAAU,IAChB,GAAI,CAAC,EAAM,SAAU,SACrB,IAAM,EAAM,EAAW,EAAQ,GAAI,CAAO,EACpC,EAAW,EAAkB,IAAI,CAAG,GAAK,GAC/C,GAAI,IAAa,EAAK,MAAQ,CAAC,EAAK,KAAK,WAAW,CAAQ,EAAG,SAC/D,IAAM,EAAO,EAAK,KAAK,MAAM,EAAS,MAAM,EACtC,GAAO,CACX,GAAI,EAAgB,EAAQ,GAAI,aAAa,GAAS,EACtD,UAAW,EAAM,UACjB,UAAW,EAAQ,GACnB,KAAM,YACN,OACA,SAAU,EAAK,MACf,KAAM,CAAE,MAAO,EAAQ,KAAK,QAAS,IAAK,CAAU,CACtD,EACA,EAAkB,IAAI,EAAK,EAAK,IAAI,EACpC,GAAe,GAAM,CAAS,EAC9B,SAGF,IAAM,EAAM,EAAQ,EAAQ,GAAI,EAAK,EAAE,EACvC,GAAI,EAAc,IAAI,CAAG,GAAK,EAAK,MAAM,SAAW,aAAe,EAAK,MAAM,SAAW,UAAW,SACpG,IAAM,EAAqB,CACzB,OAAQ,EAAgB,EAAQ,GAAI,QAAQ,EAAK,IAAI,EACrD,UAAW,EAAM,UACjB,UAAW,EAAQ,GACnB,KAAM,OACN,GAAI,EAAK,GACT,KAAM,EAAK,KACX,MACE,EAAK,MAAM,SAAW,YAClB,CACE,OAAQ,YACR,MAAO,EAAK,MAAM,MAClB,OAAQ,EAAe,EAAK,KAAM,EAAK,MAAM,OAAO,EACpD,MAAO,EAAK,KACZ,SAAU,CAAE,SAAU,EAAK,MAAM,SAAU,QAAS,EAAK,MAAM,OAAQ,EACvE,KAAM,CAAE,MAAO,EAAK,KAAK,KAAO,EAAK,KAAK,QAAS,IAAK,EAAK,KAAK,WAAa,CAAU,CAC3F,EACA,CACE,OAAQ,QACR,MAAO,EAAK,MAAM,MAClB,MAAO,EAAK,MAAM,MAAM,QACxB,SAAU,CAAE,SAAU,EAAK,MAAM,SAAU,QAAS,EAAK,MAAM,OAAQ,EACvE,KAAM,CAAE,MAAO,EAAK,KAAK,KAAO,EAAK,KAAK,QAAS,IAAK,EAAK,KAAK,WAAa,CAAU,CAC3F,CACR,EAEA,GADA,EAAc,IAAI,CAAG,EACjB,EAAK,WAAY,EAAW,CAAE,MAAK,CAAC,EAAG,SAC3C,GAAI,EAAK,MAAM,SAAW,YAAa,CACrC,MAAM,EAAM,WAAW,CAAI,EAC3B,SAEF,GAAI,EAAK,MAAM,SAAW,EAAe,EAAK,KAAM,EAAK,MAAM,OAAO,EAAE,KAAK,EAC3E,MAAM,EAAM,WAAW,IAClB,EACH,MAAO,CACL,OAAQ,YACR,MAAO,EAAK,MAAM,MAClB,SAAU,EAAK,MAAM,SACrB,QAAS,EAAK,MAAM,OACtB,CACF,CAAC,EAEH,MAAM,EAAM,gBAAgB,CAAI,EAChC,EAAG,MAAM,EAAK,MAAM,MAAM,OAAO,EAGnC,GAAI,EAAQ,OAAS,CAAC,GAGpB,GAFA,EAAe,GACf,QAAQ,SAAW,EACf,CAAC,EAAK,QAAS,EAAW,CAAE,MAAO,EAAQ,KAAM,CAAC,EAAG,EAAG,MAAM,EAAQ,MAAM,OAAO,GAG3F,MAAO,CACL,MAAO,EAAU,MACjB,UAAW,EAAU,SAAS,KAAK,CAAC,IAAY,EAAQ,OAAS,WAAW,CAC9E,GAGI,GAAY,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,EAAS,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,EAAO,GAAW,MAAM,QAAQ,IAAI,CACtD,EAAM,OAAO,WAAW,KAAK,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAClF,EAAM,OAAO,KAAK,KAAK,CAAE,UAAW,EAAM,SAAU,CAAC,EAAE,MAAM,IAAG,CAAG,OAAS,EAC5E,EAAM,SACF,QAAQ,QAAQ,MAAS,EACzB,EAAM,OAAO,KAAK,QACf,KAAK,CACJ,SAAU,CAAE,UAAW,EAAM,SAAS,UAAW,UAAW,EAAM,SAAS,WAAY,CACzF,CAAC,EACA,MAAM,IAAG,CAAG,OAAS,CAC9B,CAAC,EAQD,GAPA,MAAM,QAAQ,IAAI,CAChB,IAAI,GAAe,CAAC,GAAG,IAAI,EAAe,EAC1C,IAAI,GAAS,CAAC,GAAG,IAAI,CAAU,EAC/B,GAAI,GAAW,GAAa,EAAQ,SAAU,EAAM,QAAQ,EACxD,EAAQ,KAAK,OAAO,CAAC,IAAS,EAAK,YAAc,CAAsB,EAAE,IAAI,CAAU,EACvF,CAAC,CACP,CAAC,EACG,EAAM,gBAAkB,KAAM,CAChC,MAAM,EACN,OAGF,IAAM,EAAU,EAAM,OAAO,QAAQ,KAAK,CAAE,UAAW,EAAM,SAAU,CAAC,EACxE,MAAM,QAAQ,KAAK,CAAC,EAAS,EAAU,KAAK,IAAM,CAAO,CAAC,CAAC,EAC3D,EAAa,GACb,IAAM,EAAY,MAAM,GAAU,EAClC,GACE,CAAC,EAAU,WACX,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,GACD,CAAC,EAED,MAAM,EAER,GAAI,CAAC,EAAU,OAAS,CAAC,GAAe,CAAC,GAAsB,CAAC,GAAiB,CAAC,EAAc,CAC9F,IAAM,EAAQ,GAAqB,CAAE,KAAM,UAAW,QAAS,yBAA0B,EAGzF,GAFA,EAAe,GACf,QAAQ,SAAW,EACf,CAAC,EAAK,QAAS,KAAK,IAAI,EAAG,CAAE,OAAM,CAAC,EAAG,EAAG,MAAM,EAAM,OAAO,UAEnE,CAGA,GAFA,QAAQ,IAAI,SAAU,EAAS,EAC/B,EAAW,MAAM,EACb,EAAM,gBAAkB,KAAM,MAAM,EAAO,SAAS,MAAS,EAAE,MAAM,IAAM,EAAE,EAC5E,KAAK,EAAO,SAAS,MAAS,EAAE,MAAM,IAAM,EAAE,GAIvD,SAAS,EAAY,CAAC,EAA+B,EAAoB,CACvE,MAAO,CAAC,CAAC,GAAQ,EAAK,YAAc,EAAM,WAAa,EAAK,cAAgB,EAAM,YAGpF,SAAS,EAAkB,CAAC,EAA+E,CACzG,GAAI,CAAC,EAAU,MAAO,CAAC,EACvB,MAAO,CACL,CACE,QAAS,CACP,uBAAwB,mBAAmB,EAAS,SAAS,KACzD,EAAS,YAAc,CAAE,uBAAwB,EAAS,WAAY,EAAI,CAAC,CACjF,CACF,CACF,EAGF,SAAS,EAAkB,CAAC,EAAgB,CAC1C,MAAO,CAAC,CAAC,GAAS,OAAO,IAAU,UAAY,QAAQ,IAAI,EAAO,MAAM,IAAM,0BAGhF,SAAS,CAAM,CAAC,EAAiB,CAC/B,MAAO,OAAO,EAAQ,QAAQ,QAAS,EAAE,IAG3C,SAAS,CAAO,CAAC,EAAmB,EAAY,CAC9C,MAAO,GAAG,QAAkB,IAG9B,SAAS,CAAU,CAAC,EAAmB,EAAiB,CACtD,MAAO,GAAG,QAAkB,IAG9B,SAAS,CAAe,CAAC,EAAmB,EAAc,CACxD,MAAO,OAAO,EAAU,QAAQ,QAAS,EAAE,KAAK,IAGlD,SAAS,EAAY,CAAC,EAIR,CACZ,MAAO,CACL,GAAI,EAAO,EAAM,EAAE,EACnB,UAAW,GAAS,EAAM,OAAO,EACjC,mBAAoB,EAAM,KAAK,mBAC/B,KAAM,OACN,MAAO,CAAC,EACR,SAAU,CAAC,EACX,QAAS,CAAC,CACZ,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,gBAAgB,MAAM,GAAS,IAAI,IAAI,EAAK,GAAG,CAAC,GAAG,SAAS,QAAQ,IACzD,KAAM,EAAK,QAAS,CAAE,EAEpD,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,GAAS,IAAI,IAAI,EAAK,GAAG,EAAG,MAAM,EAC5C,MAAO,CAAE,KAAM,eAAe,EAAK;AAAA,EAAe;AAAA,QAAmB,ED5vBvE,MAAM,UAAuB,KAAM,CAGtB,UAFX,WAAW,CACT,EACS,EACT,CACA,MAAM,CAAO,EAFJ,iBAIb,CAEA,IAAM,GAAwB,SAEvB,SAAS,EAAiB,CAAC,EAAwB,CACxD,OAAO,GAA6B,EAAO,CAAC,CAAC,EAIxC,SAAS,EAA4B,CAAC,EAAwB,EAA2B,CAC9F,OAAO,GAAI,EAAO,CAAO,EAAE,MAAM,CAAC,IAAU,EAAe,EAAO,EAAa,CAAK,CAAC,CAAC,EAGxF,eAAe,EAAG,CAAC,EAAwB,EAA2B,CACpE,GAAI,EAAM,MAAQ,CAAC,EAAM,UAAY,CAAC,EAAM,QAAS,EAAK,yCAAyC,EACnG,IAAM,EAAO,EAAQ,MAAQ,QAAQ,IAAI,KAAO,QAAQ,IAAI,EACtD,EAAQ,GAAe,CAAI,EAC3B,EAAY,EAAQ,mBAAqB,OAAa,EAAQ,WAAa,EAC3E,EAAU,GAAW,GAAc,EAAM,OAAO,EAAG,QAAQ,MAAM,MAAQ,OAAY,MAAM,GAAU,CAAC,EAC5G,GAAI,CAAC,GAAS,KAAK,EAAG,EAAK,4BAA4B,EACvD,IAAM,EAAQ,MAAM,QAAQ,IAAI,EAAM,KAAK,IAAI,CAAC,IAAS,GAAY,EAAM,EAAM,CAAO,CAAC,CAAC,EAE1F,OAAO,GAAQ,EADE,CAAE,YAAW,UAAS,OAAM,EACb,EAAM,OAAO,SAAU,CAAO,EAGhE,eAAe,EAAO,CAAC,EAAwB,EAAoB,EAAoB,EAA2B,CAChH,IAAM,EAAS,GAAS,KAAK,CAC3B,QAAS,EAAS,IAClB,QAAS,GAAQ,QAAQ,CAAQ,EAEjC,MAAQ,CAAC,EAA4B,IACnC,MAAM,EAAS,IAAK,EAAM,QAAS,EAAM,CAAwB,CACrE,CAAC,EACK,EAAW,GAAc,EAAM,KAAK,EACpC,EAAS,MAAM,GAAqB,CACxC,SACA,SAAU,EAAS,UAAY,CAAE,UAAW,EAAS,SAAU,EAAI,OACnE,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,KAAM,EAAM,KACZ,MAAO,EACH,CAAE,WAAY,EAAS,MAAM,WAAY,GAAI,EAAS,MAAM,QAAS,QAAS,EAAS,OAAQ,EAC/F,OACJ,MAAO,EAAM,MACb,YAAa,EAAM,OAAO,QAAU,GAAI,QAAQ,EAAI,OACpD,QAAS,MAAO,IAAS,CACvB,IAAM,EACJ,EAAK,QACJ,EAAQ,QACL,MAAM,EAAO,MACV,QAAQ,CAAE,SAAU,CAAE,UAAW,EAAK,SAAS,UAAW,UAAW,EAAK,SAAS,WAAY,CAAE,CAAC,EAClG,KAAK,CAAC,IAAW,EAAO,IAAI,EAC/B,QACA,EAAQ,EACV,CACE,WAAY,EAAS,WACrB,GAAI,EAAS,GACb,QAAS,EAAQ,UAAY,YAAa,EAAW,EAAS,QAAU,OAC1E,EACA,OACJ,IAAK,EAAQ,SAAW,GAAU,UAAY,CAAC,EAC7C,MAAM,IAAI,EAAe,mDAAoD,EAAK,SAAS,EAAE,EAC/F,MAAO,CAAE,QAAO,MAAO,EAAK,KAAM,EAEtC,CAAC,EAAE,MAAM,CAAC,IAAU,CAClB,GAAI,EAAE,aAAiB,GAAiB,MAAM,EAC9C,EAAe,EAAO,EAAM,QAAS,EAAM,SAAS,EACpD,OACD,EACD,GAAI,CAAC,EAAQ,OACb,IAAM,EAAQ,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC3F,EAAU,EAAO,OAAO,QAC9B,GAAI,CAAC,EAAO,QAAU,EAAM,QAAU,OACpC,MAAM,EAAO,QAAQ,OAAO,CAC1B,UAAW,EAAO,QAAQ,GAC1B,MAAO,EAAM,OAAS,EAAS,QAAQ,MAAM,EAAG,EAAE,GAAK,EAAS,QAAQ,OAAS,GAAK,MAAQ,GAChG,CAAC,EAGH,MAAM,GAAwB,CAC5B,SACA,UAAW,EAAO,QAAQ,GAC1B,SAAU,EAAO,SACjB,QAAS,EAAS,QAClB,MAAO,EAAS,MAChB,MAAO,EAAO,MACd,QACA,UACA,SAAU,EAAM,UAAY,GAC5B,OAAQ,EAAM,OACd,KAAM,EAAM,MAAQ,GACpB,SAAU,EAAQ,UAAY,GAC9B,cAAe,EAAQ,cACvB,WAAY,CAAC,IAAS,GAAW,EAAM,EAAO,SAAS,SAAS,EAChE,gBAAiB,CAAC,IAAS,GAAgB,EAAM,EAAO,SAAS,SAAS,CAC5E,CAAC,EAAE,MAAM,CAAC,IAAU,EAAe,EAAO,EAAa,CAAK,EAAG,EAAO,QAAQ,EAAE,CAAC,EAG5E,SAAS,EAAU,CAAC,EAA6B,EAA2B,CACjF,GAAI,CAAC,EAAS,OAAO,GAAS,OAC9B,GAAI,CAAC,EAAO,OAAO,EACnB,OAAO,EAAU;AAAA,EAAO,EAG1B,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,IAAM,EAAM,GAAwB,CAAK,EACzC,GAAI,CAAC,EAAK,OACV,MAAO,CACL,MAAO,CAAE,WAAY,EAAI,WAAY,QAAS,EAAI,EAAG,EACrD,QAAS,EAAI,OACf,EAGF,eAAe,EAAW,CAAC,EAAe,EAAmB,EAA8C,CACzG,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,EAAQ,gBAAkB,MAAQ,EAAQ,UAAY,EAAK,YAAY,EACzE,EAAK,8DAA8D,GAAO,EAC5E,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,EAAmC,EAAmB,CAC9E,IAAM,EAAO,EAAe,EAAM,CAAS,EAC3C,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,EAAmC,EAAmB,CACnF,IAAM,EAAO,EAAe,EAAM,CAAS,EAC3C,EAAG,QAAQ,EAAG,MAAM,YAAc,SAAK,EAAG,MAAM,YAAc,GAAG,EAAK,cAAc,EAI/E,SAAS,CAAc,CAAC,EAAwC,EAAiB,EAAoB,CAE1G,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": "8B4A09E79895D96664756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/mcp/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n"
],
"mappings": ";wOAAA,cAAS,WACT,oBACA,mBAAS,UAAU,eAAM,oBAOzB,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,IAC/B,EAAO,GAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC",
"debugId": "C982C58DAD932A0264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/src/mini/tool.ts"],
"sourcesContent": [
"// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, subagent, etc.) has a ToolRule that controls\n// four 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// 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 { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { LANGUAGE_EXTENSIONS } from \"../util/filetype\"\nimport { Locale } from \"../util/locale\"\nimport {\n canonicalToolName,\n finiteNumber,\n primitiveInputSummary,\n toolDisplayContent,\n toolDisplayMetadata,\n webSearchProviderLabel,\n} from \"../util/tool-display\"\nimport { formatPath } from \"../util/path-format\"\nimport { isRecord } from \"../util/record\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport { canonicalToolName } from \"../util/tool-display\"\n\ntype ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\ntype ToolPhase = \"start\" | \"progress\" | \"final\"\n\ntype ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n status?: string\n file?: string\n from?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n id?: string\n path?: string\n pattern?: string\n url?: string\n query?: string\n agent?: 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 name?: string\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\ntype ToolFrame = {\n directory?: string\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n output: string\n time: {\n start?: number\n end?: number\n }\n}\n\ntype ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\ntype ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"subagent\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n return isRecord(v) ? { ...v } : {}\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nexport function toolOutputText(name: string, content: ReadonlyArray<{ type: string; text?: string }> | undefined) {\n if (!content) return \"\"\n // V2 shell content appends model-only status after the user-visible command output.\n if (canonicalToolName(name) === \"shell\") return content.find((item) => item.type === \"text\")?.text ?? \"\"\n const joined = content.flatMap((item) => (item.type === \"text\" && item.text ? [item.text] : [])).join(\"\\n\")\n if (canonicalToolName(name) === \"read\") return readDisplayText(joined) ?? joined\n return joined\n}\n\n/** Read's model content is a JSON page envelope; unwrap the human-facing text. */\nexport function readDisplayText(text: string): string | undefined {\n if (!text.startsWith(\"{\")) return undefined\n const parsed = (() => {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n })()\n const envelope = dict(parsed)\n if (typeof envelope.content === \"string\" && (envelope.type === \"text-page\" || envelope.encoding === \"utf8\"))\n return envelope.content\n if (!Array.isArray(envelope.entries)) return undefined\n return envelope.entries\n .flatMap((entry): string[] => {\n if (typeof entry === \"string\") return [entry]\n const path = dict(entry).path\n return typeof path === \"string\" ? [path] : []\n })\n .join(\"\\n\")\n}\n\nfunction normalizeInput(name: string, value: unknown) {\n const input = dict(value)\n const path = typeof input.path === \"string\" ? input.path : text(input.filePath)\n const agent = typeof input.agent === \"string\" ? input.agent : text(input.subagent_type)\n return {\n ...input,\n ...([\"read\", \"write\", \"edit\", \"lsp\"].includes(name) && path ? { path } : {}),\n ...(name === \"subagent\" && agent ? { agent } : {}),\n }\n}\n\nfunction normalizeFile(value: unknown): PatchFile | undefined {\n const file = dict(value)\n const name = text(file.file) || text(file.relativePath) || text(file.filePath)\n if (!name) return\n const legacy = text(file.type)\n const status =\n text(file.status) ||\n (legacy === \"add\"\n ? \"added\"\n : legacy === \"delete\"\n ? \"deleted\"\n : legacy === \"update\"\n ? \"modified\"\n : legacy === \"move\"\n ? \"moved\"\n : legacy)\n const patch = typeof file.patch === \"string\" ? file.patch : undefined\n const deletions = finiteNumber(file.deletions)\n return {\n ...file,\n file: name,\n ...(status === \"moved\" && text(file.filePath) ? { from: text(file.filePath) } : {}),\n ...(status ? { status } : {}),\n ...(patch === undefined ? {} : { patch }),\n ...(deletions === undefined ? {} : { deletions }),\n }\n}\n\nfunction normalizeMetadata(name: string, value: unknown) {\n const metadata = dict(value)\n const files = list(metadata.files).flatMap((item) => {\n const file = normalizeFile(item)\n return file ? [file] : []\n })\n const sessionID = text(metadata.sessionID) || text(metadata.sessionId)\n return {\n ...metadata,\n ...([\"edit\", \"patch\"].includes(name) && Array.isArray(metadata.files) ? { files } : {}),\n ...(name === \"subagent\" && sessionID ? { sessionID } : {}),\n }\n}\n\nexport function normalizeTool(tool: SessionMessageAssistantTool): SessionMessageAssistantTool {\n const name = canonicalToolName(tool.name)\n if (tool.state.status === \"streaming\") return { ...tool, name }\n return {\n ...tool,\n name,\n state: {\n ...tool.state,\n input: normalizeInput(name, tool.state.input),\n metadata: normalizeMetadata(name, toolDisplayMetadata(tool.state)),\n },\n } as SessionMessageAssistantTool\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction span(frame: ToolFrame): string {\n const start = frame.time.start\n const end = frame.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 = primitiveInputSummary(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)\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; directory?: string } = {}): string {\n return formatPath(input, {\n base: opts.directory ?? process.cwd(),\n home: opts.home ? os.homedir() : undefined,\n forwardSlashes: true,\n })\n}\n\nfunction displayPath(p: ToolProps, input?: string, opts: { home?: boolean } = {}) {\n return toolPath(input, { ...opts, directory: p.frame.directory })\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const 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 ${displayPath(p, 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 ${displayPath(p, 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 ${displayPath(p, dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = displayPath(p, p.input.path)\n const description = primitiveInputSummary(p.frame.input, [\"path\"]) || 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 ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.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 const file = list<PatchFile>(p.metadata.files)[0]\n return {\n icon: \"←\",\n title: `Edit ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: file?.patch ?? 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.agent || \"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} Subagent`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n const name = p.metadata.name ?? p.input.id ?? \"\"\n return {\n icon: \"→\",\n title: `Skill \"${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: \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.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: calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n path?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean; directory?: string } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.path ? toolPath(input.path, 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: lspTitle(p.input, { directory: p.frame.directory }),\n }\n}\n\nfunction patchTitle(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `# Created ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"deleted\") {\n return `# Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `# Moved ${toolPath(file.from, { directory })} -> ${toolPath(file.file, { directory })}`\n }\n\n return `# Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.path || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${displayPath(p, file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const item = list<PatchFile>(p.metadata.files)[0]\n const file = item?.file || p.input.path || \"\"\n const diff = item?.patch || p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${displayPath(p, 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.file\n return [\n {\n title: patchTitle(file, p.frame.directory),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length !== files.length) {\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.agent || \"general\")\n const desc = p.input.description\n const rows = [desc].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Subagent`,\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 !== \".\" ? displayPath(p, wd, { home: true }) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `${dir}$` : \"\"\n }\n\n return `${dir}$ ${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 ? displayPath(p, wdRaw, { home: true }) : \"\"\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 scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit\n const time = span(p.frame)\n if (code === undefined) {\n if (!time) {\n return \"shell completed\"\n }\n\n return `shell completed · ${time}`\n }\n\n return `shell completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = displayPath(p, p.input.path)\n const extra = primitiveInputSummary(p.frame.input, [\"path\"])\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, directory?: string): string {\n if (file.status === \"added\") {\n return `+ Created ${toolPath(file.file, { directory })}`\n }\n\n if (file.status === \"deleted\") {\n return `- Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `→ Moved ${toolPath(file.from, { directory })} → ${toolPath(file.file, { directory })}`\n }\n\n return `~ Patched ${toolPath(file.file, { directory })}`\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)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const showModified = !files.some((file) => file?.status && file.status !== \"modified\")\n const shown = files.filter((file) => showModified || file.status !== \"modified\")\n const rows = shown.slice(0, 6).map((file) => patchLine(file, p.frame.directory))\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]!, p.frame.directory)\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.agent || \"general\")\n const row = p.input.description\n if (!row) {\n return `# ${kind} Subagent`\n }\n\n return `# ${kind} Subagent\\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)\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, { directory: p.frame.directory })}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.metadata.name ?? p.input.id ?? \"\"}\"`\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 ${displayPath(p, 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 ${displayPath(p, 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 ${displayPath(p, 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\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n shell: {\n view: {\n output: true,\n final: false,\n },\n run: runShell,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollShellFinal,\n },\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 },\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 subagent: {\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 },\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 },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\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: SessionMessageAssistantTool, directory?: string): ToolFrame {\n const tool = normalizeTool(part)\n if (tool.state.status === \"streaming\")\n return {\n directory,\n raw: tool.state.input,\n name: tool.name,\n input: {},\n meta: {},\n state: dict(tool.state),\n status: tool.state.status,\n error: \"\",\n output: \"\",\n time: { start: tool.time.created },\n }\n const output = toolOutputText(tool.name, toolDisplayContent(tool.state))\n return {\n directory,\n raw: output,\n name: tool.name,\n input: normalizeInput(tool.name, tool.state.input),\n meta: normalizeMetadata(tool.name, tool.state.metadata),\n state: dict(tool.state),\n status: tool.state.status,\n error: tool.state.status === \"error\" ? tool.state.error.message : \"\",\n output,\n time: {\n start: tool.time.ran ?? tool.time.created,\n end: tool.time.completed,\n },\n }\n}\n\nfunction toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const current = commit.part ? frame(commit.part, commit.directory) : undefined\n return {\n directory: commit.directory,\n raw,\n name: canonicalToolName(commit.tool || current?.name || \"tool\"),\n input: current?.input ?? {},\n meta: current?.meta ?? {},\n state: current?.state ?? {},\n status: commit.toolState ?? current?.status ?? \"\",\n error: (commit.toolError ?? current?.error ?? \"\").trim(),\n output: current?.output ?? raw,\n time: current?.time ?? {},\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output.trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name ? canonicalToolName(name) : undefined)?.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?.name).snap)\n )\n}\n\nexport function toolInlineInfo(part: SessionMessageAssistantTool, directory?: string): ToolInline {\n const ctx = frame(part, directory)\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\nfunction 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\nconst STRUCTURED_FALLBACK_LENGTH = 4_096\n\nfunction structuredFallback(value: ToolDict): RunEntryBody | undefined {\n if (Object.keys(value).length === 0) return\n const content = JSON.stringify(value, null, 2)\n if (!content) return\n const suffix = \"\\n... [truncated]\"\n return {\n type: \"code\",\n content:\n content.length <= STRUCTURED_FALLBACK_LENGTH\n ? content\n : content.slice(0, STRUCTURED_FALLBACK_LENGTH - suffix.length) + suffix,\n filetype: \"json\",\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(\n commit: StreamCommit,\n raw: string,\n options?: { shellOutput?: boolean },\n): 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 === \"shell\" && commit.phase === \"progress\" && options?.shellOutput === false) return undefined\n\n if (ctx.name === \"subagent\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(ctx.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 if (!rule(ctx.name) && !ctx.output.trim()) {\n return structuredFallback(ctx.meta) ?? 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": "B18E31DF5FEBB35A64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/services/server-connection.ts"],
"sourcesContent": [
"import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const mismatch = args.mismatch ?? \"ignore\"\n const options = yield* ServiceConfig.options({ checkVersion: mismatch !== \"ignore\" })\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, mismatch),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (options: EnsureOptions, mismatch: NonNullable<Args[\"mismatch\"]>) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n"
],
"mappings": ";6eAoBO,IAAM,EAAU,EAAO,GAAG,+BAA+B,EAAE,SAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAW,EAAK,UAAY,SAC5B,EAAU,MAAO,EAAc,QAAQ,CAAE,aAAc,IAAa,QAAS,CAAC,EACpF,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,CAAQ,EAC/E,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CAAC,EAAwB,EAAyC,CACnH,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC",
"debugId": "D307D5AF45C3C41664756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/start.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n"
],
"mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,EAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH",
"debugId": "C7090F2242BA364564756E2164756E21",
"names": []
}
{
"version": 3,
"sources": [],
"sourcesContent": [
],
"mappings": "",
"debugId": "DDBC4F65F18C8B7964756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["../schema/src/workspace.ts"],
"sourcesContent": [
"export * as Workspace from \"./workspace.js\"\n\nimport { WorkspaceEvent } from \"./workspace-event.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport const ID = WorkspaceID\nexport type ID = WorkspaceID\n\nexport const Event = WorkspaceEvent\n"
],
"mappings": ";iNAKO,IAAM,EAAK,EAGL,EAAQ",
"debugId": "EC6A4CF9CD9B09B764756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/stop.ts"],
"sourcesContent": [
"import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n"
],
"mappings": ";+2BAMA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,KACnC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,MAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH",
"debugId": "7FBFFF7DC2F38B5764756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/models.ts"],
"sourcesContent": [
"import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.models,\n Effect.fn(\"cli.models\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const response = yield* Effect.promise(() => client.model.list({ location: { directory: process.cwd() } }))\n const models = response.data\n .map((model) => `${model.providerID}/${model.id}`)\n .toSorted((a, b) => a.localeCompare(b))\n if (models.length > 0) process.stdout.write(models.join(EOL) + EOL)\n }),\n)\n"
],
"mappings": ";giCAGA,cAAS,WAKT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EAEK,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KACrB,IAAI,CAAC,IAAU,GAAG,EAAM,cAAc,EAAM,IAAI,EAChD,SAAS,CAAC,EAAG,IAAM,EAAE,cAAc,CAAC,CAAC,EACxC,GAAI,EAAO,OAAS,EAAG,QAAQ,OAAO,MAAM,EAAO,KAAK,CAAG,EAAI,CAAG,EACnE,CACH",
"debugId": "5ACC810CDB66B66064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/auth/form.ts", "src/commands/handlers/auth/login.ts"],
"sourcesContent": [
"import { confirm, log, multiselect, password, select, text, type Option } from \"@clack/prompts\"\nimport { Effect } from \"effect\"\nimport type { FormAnswer, FormField, FormFields } from \"@opencode-ai/client\"\nimport { openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\n\nconst skip = Symbol(\"skip\")\nconst custom = Symbol(\"custom\")\n\nexport const answerForm = Effect.fn(\"cli.auth.form\")(function* (fields: FormFields | undefined) {\n if (!fields) return undefined\n yield* requireInteractive(\"Authentication form input requires an interactive terminal\")\n const answer: FormAnswer = {}\n for (const field of fields) {\n if (!active(field, answer)) continue\n const value = yield* answerField(field)\n if (value !== undefined) answer[field.key] = value\n }\n return answer\n})\n\nexport const secret = Effect.fn(\"cli.auth.secret\")(function* (message: string) {\n yield* requireInteractive(\"API key input requires an interactive terminal\")\n return yield* prompt<string>(() => password({ message, validate: (value) => (!value ? \"Required\" : undefined) }))\n})\n\nconst answerField = Effect.fn(\"cli.auth.form.field\")(function* (field: FormField) {\n const message = field.title ?? field.key\n if (field.description) log.info(field.description)\n if (field.type === \"external\") {\n log.info(field.url)\n yield* openUrl(field.url)\n const acknowledged = yield* prompt<boolean>(() =>\n confirm({ message: message || \"Continue after completing this step?\", initialValue: true }),\n )\n if (!acknowledged) return yield* Effect.fail(new Error(`${message || \"External step\"} is required`))\n return true\n }\n if (field.type === \"boolean\") {\n if (field.required) return yield* prompt<boolean>(() => confirm({ message, initialValue: field.default ?? true }))\n const options: Array<Option<boolean | typeof skip>> = [\n { value: true, label: \"Yes\" },\n { value: false, label: \"No\" },\n { value: skip, label: \"Skip\" },\n ]\n const value = yield* prompt<boolean | typeof skip>(() =>\n select<boolean | typeof skip>({\n message,\n options,\n initialValue: field.default ?? skip,\n }),\n )\n if (value === skip) return undefined\n return value\n }\n if (field.type === \"multiselect\") {\n const options: Array<Option<string | typeof custom>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type another value\" })\n const values = yield* prompt<Array<string | typeof custom>>(() =>\n multiselect<string | typeof custom>({\n message,\n options,\n initialValues: field.default,\n required: field.required || (field.minItems ?? 0) > 0,\n }),\n )\n const selected = values.filter((value): value is string => value !== custom)\n if (values.includes(custom)) {\n selected.push(yield* prompt<string>(() => text({ message: \"Enter value\", validate: required })))\n }\n if (field.minItems !== undefined && selected.length < field.minItems) {\n return yield* Effect.fail(new Error(`Select at least ${field.minItems}`))\n }\n if (field.maxItems !== undefined && selected.length > field.maxItems) {\n return yield* Effect.fail(new Error(`Select at most ${field.maxItems}`))\n }\n return selected\n }\n if (field.type === \"string\" && field.options) {\n const options: Array<Option<string | typeof custom | typeof skip>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type your own answer\" })\n if (!field.required) options.push({ value: skip, label: \"Skip\" })\n const value = yield* prompt<string | typeof custom | typeof skip>(() =>\n select<string | typeof custom | typeof skip>({ message, options, initialValue: field.default }),\n )\n if (value === skip) return undefined\n if (value !== custom) return value\n }\n const value = yield* prompt<string>(() =>\n text({\n message,\n placeholder: field.type === \"string\" ? field.placeholder : undefined,\n initialValue: field.default === undefined ? undefined : String(field.default),\n validate: (input) => validateText(field, input),\n }),\n )\n if (!value && !field.required) return undefined\n if (field.type === \"string\") return value\n return Number(value)\n})\n\nfunction active(field: FormField, answer: FormAnswer) {\n if (field.type === \"external\" || !field.when) return true\n return field.when.every((condition) => {\n const value = answer[condition.key]\n if (value === undefined) return false\n const matches = Array.isArray(value) ? value.includes(String(condition.value)) : value === condition.value\n return condition.op === \"eq\" ? matches : !matches\n })\n}\n\nfunction required(value: string | undefined) {\n return value ? undefined : \"Required\"\n}\n\nfunction validateText(field: Exclude<FormField, { type: \"boolean\" | \"external\" | \"multiselect\" }>, value?: string) {\n if (!value) return field.required ? \"Required\" : undefined\n if (field.type === \"number\" || field.type === \"integer\") {\n const number = Number(value)\n if (!Number.isFinite(number)) return \"Expected a number\"\n if (field.type === \"integer\" && !Number.isInteger(number)) return \"Expected an integer\"\n if (typeof field.minimum === \"number\" && number < field.minimum) return `Must be at least ${field.minimum}`\n if (typeof field.maximum === \"number\" && number > field.maximum) return `Must be at most ${field.maximum}`\n return undefined\n }\n if (field.minLength !== undefined && value.length < field.minLength)\n return `Must be at least ${field.minLength} characters`\n if (field.maxLength !== undefined && value.length > field.maxLength)\n return `Must be at most ${field.maxLength} characters`\n if (field.pattern) {\n try {\n if (!new RegExp(field.pattern).test(value)) return \"Invalid format\"\n } catch {\n return \"Invalid format\"\n }\n }\n if (field.format === \"uri\" && !URL.canParse(value)) return \"Expected a URL\"\n if (field.format === \"email\" && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) return \"Expected an email address\"\n if (field.format === \"date\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return \"Expected a date\"\n const date = new Date(`${value}T00:00:00.000Z`)\n if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== value) return \"Expected a date\"\n }\n if (field.format === \"date-time\" && Number.isNaN(Date.parse(value))) return \"Expected a date and time\"\n return undefined\n}\n",
"import { autocomplete, intro, log, outro, select, spinner, text } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { FormAnswer, IntegrationInfo, OpenCodeClient } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { answerForm, secret } from \"./form\"\nimport {\n createClient,\n connectMethods,\n loadIntegrations,\n location,\n request,\n resolveIntegration,\n resolveMethod,\n type ConnectMethod,\n} from \"./shared\"\n\nconst integrationPriority = new Map([\n [\"opencode\", 0],\n [\"opencode-go\", 1],\n [\"openai\", 2],\n [\"github-copilot\", 3],\n [\"google\", 4],\n [\"anthropic\", 5],\n [\"openrouter\", 6],\n [\"vercel\", 7],\n])\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.login,\n Effect.fn(\"cli.auth.login\")((input) =>\n login({\n target: Option.getOrUndefined(input.target),\n method: Option.getOrUndefined(input.method),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst login = Effect.fn(\"cli.auth.login.run\")(function* (input: {\n target?: string\n method?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Connect an integration\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integration = yield* findIntegration(client, input.target)\n const methods = connectMethods(integration)\n if (methods.length === 0) yield* Effect.fail(new Error(`${integration.name} has no interactive login methods`))\n const method = yield* chooseMethod(methods, input.method)\n const answer = method.type === \"command\" ? undefined : yield* answerForm(method.form)\n yield* authenticate(client, integration, method, answer)\n outro(\"Done\")\n})\n\nconst findIntegration = Effect.fn(\"cli.auth.login.integration\")(function* (client: OpenCodeClient, target?: string) {\n if (target && URL.canParse(target)) {\n const protocol = new URL(target).protocol\n if (protocol === \"http:\" || protocol === \"https:\") {\n const progress = spinner()\n progress.start(\"Discovering authentication provider...\")\n yield* request((signal) => client.integration.wellknown.add({ url: target, location }, { signal })).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(\"Authentication provider discovered\"))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Discovery failed\", 1))),\n )\n }\n }\n const integrations = yield* loadIntegrations(client)\n if (target) return yield* resolveIntegration(integrations, target)\n const available = integrations\n .filter((integration) => connectMethods(integration).length > 0)\n .toSorted(\n (a, b) =>\n (integrationPriority.get(a.id) ?? integrationPriority.size) -\n (integrationPriority.get(b.id) ?? integrationPriority.size) ||\n a.name.localeCompare(b.name) ||\n a.id.localeCompare(b.id),\n )\n if (available.length === 0) return yield* Effect.fail(new Error(\"No authentication integrations are available\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: available.map((integration) => {\n const option = { value: integration.id, label: integration.name, hint: integration.id }\n if (integration.connections.length > 0) return { ...option, hint: \"connected\" }\n if (integration.id === \"opencode\") return { ...option, hint: \"recommended\" }\n return option\n }),\n }),\n )\n return yield* resolveIntegration(available, id)\n})\n\nconst chooseMethod = Effect.fn(\"cli.auth.login.method\")(function* (methods: ConnectMethod[], target?: string) {\n if (target) return yield* resolveMethod(methods, target)\n if (methods.length === 1) return methods[0]\n yield* requireInteractive(\"Pass --method when running without an interactive terminal\")\n const id = yield* prompt<string>(() =>\n select({\n message: \"Select login method\",\n options: methods.map((method) => {\n if (method.type === \"key\") return { value: \"key\", label: method.label ?? \"API key\" }\n return { value: method.id, label: method.label }\n }),\n }),\n )\n return yield* resolveMethod(methods, id)\n})\n\nconst authenticate = Effect.fn(\"cli.auth.login.authenticate\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: ConnectMethod,\n answer?: FormAnswer,\n) {\n if (method.type === \"key\") return yield* keyLogin(client, integration, method, answer)\n if (method.type === \"command\") return yield* commandLogin(client, integration, method)\n return yield* oauthLogin(client, integration, method, answer)\n})\n\nconst keyLogin = Effect.fn(\"cli.auth.login.key\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"key\" }>,\n answer?: FormAnswer,\n) {\n const key = yield* secret(method.label ?? `Enter your ${integration.name} API key`)\n const progress = spinner()\n progress.start(\"Saving credential...\")\n yield* request((signal) =>\n client.integration.connect.key({ integrationID: integration.id, key, answer, location }, { signal }),\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))),\n )\n})\n\nconst oauthLogin = Effect.fn(\"cli.auth.login.oauth\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"oauth\" }>,\n answer?: FormAnswer,\n) {\n const progress = spinner()\n progress.start(\"Starting authorization...\")\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n { integrationID: integration.id, methodID: method.id, answer, location },\n { signal },\n ),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID: integration.id, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n progress.stop(\"Authorization started\")\n log.info(attempt.instructions)\n log.info(attempt.url)\n if (process.stdin.isTTY && process.stdout.isTTY) yield* openUrl(attempt.url)\n\n if (attempt.mode === \"code\") {\n yield* requireInteractive(\"This login requires an interactive terminal to enter the authorization code\")\n const code = yield* prompt<string>(() =>\n text({ message: \"Paste the authorization code\", validate: (value) => (!value ? \"Required\" : undefined) }),\n )\n const completing = spinner()\n completing.start(\"Completing authorization...\")\n yield* request((signal) =>\n client.integration.oauth.complete(\n { integrationID: integration.id, attemptID: attempt.attemptID, code, location },\n { signal },\n ),\n ).pipe(\n Effect.tap(() => Effect.sync(() => completing.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => completing.stop(\"Authentication failed\", 1))),\n )\n return\n }\n\n const waiting = spinner()\n waiting.start(\"Waiting for authorization...\")\n const status = yield* waitForOAuth(client, integration.id, attempt.attemptID).pipe(\n Effect.tapCause(() => Effect.sync(() => waiting.stop(\"Authentication failed\", 1))),\n )\n if (status.status === \"complete\") {\n waiting.stop(`Connected to ${integration.name}`)\n return\n }\n waiting.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authorization expired\"))\n})\n\nconst commandLogin = Effect.fn(\"cli.auth.login.command\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"command\" }>,\n) {\n const progress = spinner()\n progress.start(\"Starting authentication command...\")\n const started = yield* request((signal) =>\n client.integration.command.connect({ integrationID: integration.id, methodID: method.id, location }, { signal }),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel(\n {\n integrationID: integration.id,\n attemptID: started.data.attemptID,\n location,\n },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n const status = yield* waitForCommand(client, integration.id, started.data.attemptID, (message) =>\n progress.message(message.trim() || \"Waiting for authentication command...\"),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n if (status.status === \"complete\") {\n progress.stop(`Connected to ${integration.name}`)\n return\n }\n progress.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authentication expired\"))\n})\n\nconst waitForOAuth = Effect.fn(\"cli.auth.login.oauth.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nconst waitForCommand = Effect.fn(\"cli.auth.login.command.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n update: (message: string) => void,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.command.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n if (response.data.message) update(response.data.message)\n yield* Effect.sleep(500)\n }\n})\n"
],
"mappings": "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",
"debugId": "EF03E1FE53D5316064756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/debug/config.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.config,\n Effect.fn(\"cli.debug.config\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const entries = yield* Effect.promise(() => client.config.get({ location: { directory: process.cwd() } }))\n process.stdout.write(JSON.stringify(entries, null, 2) + EOL)\n }),\n)\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACzG,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAS,KAAM,CAAC,EAAI,CAAG,EAC5D,CACH",
"debugId": "D9A4A26C27DF103464756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/mini.ts", "src/mini-host.ts"],
"sourcesContent": [
"import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\nimport { Env } from \"./env\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n paths: { home: string; state: string; log: string }\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const environment = input.server.reconnect ? Env.session() : undefined\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n environment,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n environment,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory, paths: input.paths }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n",
"import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n"
],
"mappings": "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",
"debugId": "E188D5ABAB522A3164756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/server-process.ts", "src/services/service-registration.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"],
"sourcesContent": [
"export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport { Effect, Option, Redacted, Schedule } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { ServiceRegistration } from \"./services/service-registration\"\nimport { Updater } from \"./services/updater\"\nimport { WebUi } from \"./services/web-ui\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* ServiceRegistration.register({\n address,\n password,\n id: instanceID,\n file: serviceOptions.file,\n shutdown,\n })\n }),\n },\n transform,\n ).pipe(\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n",
"export * as ServiceRegistration from \"./service-registration\"\n\nimport { Service, type Info } from \"@opencode-ai/client/effect/service\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { OPENCODE_VERSION } from \"../version\"\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nexport const register = Effect.fnUntraced(function* (options: {\n readonly address: HttpServer.Address\n readonly password: string\n readonly id: string\n readonly file: string\n readonly shutdown: Effect.Effect<void>\n}) {\n const fs = yield* FileSystem.FileSystem\n const temp = options.file + \".\" + options.id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(options.file), { recursive: true })\n const info = {\n id: options.id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(options.address),\n pid: process.pid,\n password: options.password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(options.file).pipe(Effect.flatMap(decodeInfo))\n const owns = (found: Info) =>\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, options.file)))\n yield* current.pipe(\n Effect.catchCause((cause) =>\n Effect.logWarning(\"managed service registration check failed; shutting down\", {\n cause,\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n }).pipe(Effect.andThen(Effect.failCause(cause))),\n ),\n Effect.tap((found) =>\n owns(found)\n ? Effect.void\n : Effect.logWarning(\"managed service registration replaced; shutting down\", {\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n observedServiceID: found.id,\n observedServicePID: found.pid,\n observedVersion: found.version,\n observedURL: found.url,\n }),\n ),\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(options.shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(options.file) : Effect.void)),\n Effect.ignore,\n )\n})\n",
"import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const revalidate = html || name === \"sw.js\" || name === \"registerSW.js\"\n const headers = {\n \"content-type\": FSUtil.mimeType(name),\n \"cache-control\": revalidate ? \"no-cache\" : \"public, max-age=31536000, immutable\",\n \"content-security-policy\": html\n ? cspForHtml(typeof file === \"string\" ? file : Buffer.from(file).toString())\n : csp(),\n \"x-content-type-options\": \"nosniff\",\n }\n return Effect.succeed(\n request.method === \"HEAD\"\n ? HttpServerResponse.empty({ headers })\n : HttpServerResponse.raw(file, { headers, contentType: headers[\"content-type\"] }),\n )\n}\n\nfunction isRouteNotFound(error: unknown) {\n return error instanceof HttpServerError.HttpServerError && error.reason._tag === \"RouteNotFound\"\n}\n\nfunction csp(hash = \"\") {\n return `default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${hash ? ` 'sha256-${hash}'` : \"\"}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; media-src 'self' data:; connect-src * data: blob:`\n}\n\nfunction cspForHtml(body: string) {\n const match = body.match(\n /<script\\b(?![^>]*\\bsrc\\s*=)[^>]*\\bid=([\"'])oc-theme-preload-script\\1[^>]*>([\\s\\S]*?)<\\/script>/i,\n )\n return csp(match ? createHash(\"sha256\").update(match[2]).digest(\"base64\") : \"\")\n}\n\nexport * as WebUi from \"./web-ui\"\n",
"import { Effect, FileSystem, Option } from \"effect\"\nimport path from \"node:path\"\nimport { brotliDecompressSync } from \"node:zlib\"\nimport { OPENCODE_LOCAL } from \"./version\"\n\nexport type AssetMap = Readonly<Record<string, string | Uint8Array>>\ntype EncodedAssetMap = Readonly<Record<string, { readonly content: string; readonly encoding: \"utf8\" | \"base64\" }>>\n\nexport const load = Effect.fn(\"cli.app-assets.load\")(function* () {\n const embedded = yield* Effect.tryPromise(() => import(\"virtual:opencode-app-assets\")).pipe(Effect.option)\n if (Option.isSome(embedded) && embedded.value.default.length > 0) return decodeArchive(embedded.value.default)\n if (!OPENCODE_LOCAL) return yield* Effect.fail(new Error(\"Web UI assets are missing from the CLI build\"))\n return decode(yield* sourceAssets())\n})\n\nfunction decodeArchive(archive: string) {\n const body = brotliDecompressSync(Buffer.from(archive, \"base64\")).toString()\n return decode(JSON.parse(body) as EncodedAssetMap)\n}\n\nconst sourceAssets = Effect.fnUntraced(function* () {\n const fs = yield* FileSystem.FileSystem\n const root = path.resolve(import.meta.dirname, \"../../app/dist\")\n const files = yield* fs.readDirectory(root, { recursive: true })\n return Object.fromEntries(\n (yield* Effect.forEach(\n files.filter((file) => !file.endsWith(\".map\")),\n Effect.fnUntraced(function* (file) {\n const target = path.join(root, file)\n if ((yield* fs.stat(target)).type === \"Directory\") return\n const body = Buffer.from(yield* fs.readFile(target))\n const encoding = isText(file) ? \"utf8\" : \"base64\"\n return [file, { encoding, content: body.toString(encoding) }] as const\n }),\n { concurrency: \"unbounded\" },\n )).filter((asset) => asset !== undefined),\n )\n})\n\nfunction decode(assets: EncodedAssetMap): AssetMap {\n return Object.fromEntries(\n Object.entries(assets).map(([key, asset]) => [\n key,\n asset.encoding === \"utf8\" ? asset.content : Buffer.from(asset.content, \"base64\"),\n ]),\n )\n}\n\nfunction isText(file: string) {\n return file === \"_headers\" || /\\.(?:css|html|js|json|svg|txt|webmanifest|xml)$/.test(file)\n}\n",
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n"
],
"mappings": ";urCAQA,sBAAS,gBAAa,0ECLtB,qBAKA,IAAM,EAAW,EAAO,eAAe,EAAQ,IAAI,EAC7C,GAAa,EAAO,aAAa,CAAQ,EACzC,GAAa,EAAO,oBAAoB,CAAQ,EAEzC,GAAW,EAAO,WAAW,SAAU,CAAC,EAMlD,CACD,IAAM,EAAK,MAAO,EAAW,WACvB,EAAO,EAAQ,KAAO,IAAM,EAAQ,GAAK,OAC/C,MAAO,EAAG,cAAc,GAAK,QAAQ,EAAQ,IAAI,EAAG,CAAE,UAAW,EAAK,CAAC,EACvE,IAAM,EAAO,CACX,GAAI,EAAQ,GACZ,QAAS,EACT,IAAK,EAAW,cAAc,EAAQ,OAAO,EAC7C,IAAK,QAAQ,IACb,SAAU,EAAQ,QACpB,EACM,EAAU,MAAO,GAAW,CAAI,EAChC,EAAU,EAAG,eAAe,EAAQ,IAAI,EAAE,KAAK,EAAO,QAAQ,EAAU,CAAC,EACzE,EAAO,CAAC,IACZ,EAAM,KAAO,EAAK,IAClB,EAAM,UAAY,EAAK,SACvB,EAAM,MAAQ,EAAK,KACnB,EAAM,MAAQ,EAAK,KACnB,EAAM,WAAa,EAAK,SA8B1B,OA7BA,MAAO,EAAG,gBAAgB,EAAM,EAAS,CAAE,KAAM,GAAM,CAAC,EAAE,KAAK,EAAO,QAAQ,EAAG,OAAO,EAAM,EAAQ,IAAI,CAAC,CAAC,EAC5G,MAAO,EAAQ,KACb,EAAO,WAAW,CAAC,IACjB,EAAO,WAAW,2DAA4D,CAC5E,QACA,UAAW,EAAQ,GACnB,WAAY,QAAQ,IACpB,aAAc,EAAQ,IACxB,CAAC,EAAE,KAAK,EAAO,QAAQ,EAAO,UAAU,CAAK,CAAC,CAAC,CACjD,EACA,EAAO,IAAI,CAAC,IACV,EAAK,CAAK,EACN,EAAO,KACP,EAAO,WAAW,uDAAwD,CACxE,UAAW,EAAQ,GACnB,WAAY,QAAQ,IACpB,aAAc,EAAQ,KACtB,kBAAmB,EAAM,GACzB,mBAAoB,EAAM,IAC1B,gBAAiB,EAAM,QACvB,YAAa,EAAM,GACrB,CAAC,CACP,EACA,EAAO,aAAa,CAAI,EACxB,EAAO,OAAO,EAAS,OAAO,WAAW,CAAC,EAC1C,EAAO,OACP,EAAO,QAAQ,EAAQ,QAAQ,EAC/B,EAAO,UACT,EACO,EAAQ,KACb,EAAO,QAAQ,CAAC,IAAW,EAAK,CAAK,EAAI,EAAG,OAAO,EAAQ,IAAI,EAAI,EAAO,IAAK,EAC/E,EAAO,MACT,EACD,6CCnED,qBAAS,gBCFT,oBACA,+BAAS,cAMF,IAAM,EAAO,EAAO,GAAG,qBAAqB,EAAE,SAAU,EAAG,CAChE,IAAM,EAAW,MAAO,EAAO,WAAW,IAAa,wCAA8B,EAAE,KAAK,EAAO,MAAM,EACzG,GAAI,EAAO,OAAO,CAAQ,GAAK,EAAS,MAAM,QAAQ,OAAS,EAAG,OAAO,GAAc,EAAS,MAAM,OAAO,EAC7G,GAAI,CAAC,EAAgB,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACxG,OAAO,EAAO,MAAO,GAAa,CAAC,EACpC,EAED,SAAS,EAAa,CAAC,EAAiB,CACtC,IAAM,EAAO,GAAqB,OAAO,KAAK,EAAS,QAAQ,CAAC,EAAE,SAAS,EAC3E,OAAO,EAAO,KAAK,MAAM,CAAI,CAAoB,EAGnD,IAAM,GAAe,EAAO,WAAW,SAAU,EAAG,CAClD,IAAM,EAAK,MAAO,EAAW,WACvB,EAAO,EAAK,QAAQ,YAAY,QAAS,gBAAgB,EACzD,EAAQ,MAAO,EAAG,cAAc,EAAM,CAAE,UAAW,EAAK,CAAC,EAC/D,OAAO,OAAO,aACX,MAAO,EAAO,QACb,EAAM,OAAO,CAAC,IAAS,CAAC,EAAK,SAAS,MAAM,CAAC,EAC7C,EAAO,WAAW,SAAU,CAAC,EAAM,CACjC,IAAM,EAAS,EAAK,KAAK,EAAM,CAAI,EACnC,IAAK,MAAO,EAAG,KAAK,CAAM,GAAG,OAAS,YAAa,OACnD,IAAM,EAAO,OAAO,KAAK,MAAO,EAAG,SAAS,CAAM,CAAC,EAC7C,EAAW,GAAO,CAAI,EAAI,OAAS,SACzC,MAAO,CAAC,EAAM,CAAE,WAAU,QAAS,EAAK,SAAS,CAAQ,CAAE,CAAC,EAC7D,EACD,CAAE,YAAa,WAAY,CAC7B,GAAG,OAAO,CAAC,IAAU,IAAU,MAAS,CAC1C,EACD,EAED,SAAS,CAAM,CAAC,EAAmC,CACjD,OAAO,OAAO,YACZ,OAAO,QAAQ,CAAM,EAAE,IAAI,EAAE,EAAK,KAAW,CAC3C,EACA,EAAM,WAAa,OAAS,EAAM,QAAU,OAAO,KAAK,EAAM,QAAS,QAAQ,CACjF,CAAC,CACH,EAGF,SAAS,EAAM,CAAC,EAAc,CAC5B,OAAO,IAAS,YAAc,kDAAkD,KAAK,CAAI,ED3CpF,IAAM,GAAU,EAAO,GAAG,oBAAoB,EAAE,SAAU,CAAC,EAA0C,CAC1G,IAAM,EAAa,MAAO,EAAW,WAC/B,EAAS,GAAS,OACpB,EAAO,QAAQ,EAAQ,MAAM,EAC7B,MAAO,EAAO,OAAO,EAAK,EAAE,KAAK,EAAO,eAAe,EAAW,WAAY,CAAU,CAAC,CAAC,EAC9F,MAAO,CAAO,IACZ,EAAI,KACF,EAAO,QAAQ,GAAiB,IAC9B,EAAkB,kBAAkB,KAClC,EAAO,QAAQ,CAAC,IAAY,CAC1B,IAAM,EAAM,IAAI,IAAI,EAAQ,IAAK,kBAAkB,EACnD,GAAI,EAAI,WAAa,QAAU,EAAI,SAAS,WAAW,OAAO,EAC5D,OAAO,EAAO,QAAQ,EAAmB,MAAM,CAAE,OAAQ,GAAI,CAAC,CAAC,EACjE,OAAO,EAAO,KAAK,EAAO,QAAQ,CAAC,IAAU,GAAQ,EAAS,EAAK,CAAK,CAAC,CAAC,EAC3E,CACH,CACF,CACF,EACH,EAED,SAAS,EAAO,CAAC,EAA8C,EAAU,EAAkB,CACzF,IAAM,EAAM,EAAI,SAAS,QAAQ,MAAO,EAAE,EACpC,EAAO,EAAO,KAAS,OAAY,EAAM,aACzC,EAAO,EAAO,GACpB,GAAI,CAAC,EAAM,OAAO,EAAO,QAAQ,EAAmB,MAAM,CAAE,OAAQ,GAAI,CAAC,CAAC,EAC1E,GAAI,EAAQ,SAAW,OAAS,EAAQ,SAAW,OACjD,OAAO,EAAO,QAAQ,EAAmB,MAAM,CAAE,OAAQ,GAAI,CAAC,CAAC,EACjE,IAAM,EAAO,IAAS,aAChB,EAAa,GAAQ,IAAS,SAAW,IAAS,gBAClD,EAAU,CACd,eAAgB,EAAO,SAAS,CAAI,EACpC,gBAAiB,EAAa,WAAa,sCAC3C,0BAA2B,EACvB,GAAW,OAAO,IAAS,SAAW,EAAO,OAAO,KAAK,CAAI,EAAE,SAAS,CAAC,EACzE,EAAI,EACR,yBAA0B,SAC5B,EACA,OAAO,EAAO,QACZ,EAAQ,SAAW,OACf,EAAmB,MAAM,CAAE,SAAQ,CAAC,EACpC,EAAmB,IAAI,EAAM,CAAE,UAAS,YAAa,EAAQ,eAAgB,CAAC,CACpF,EAGF,SAAS,EAAe,CAAC,EAAgB,CACvC,OAAO,aAAiB,EAAgB,iBAAmB,EAAM,OAAO,OAAS,gBAGnF,SAAS,CAAG,CAAC,EAAO,GAAI,CACtB,MAAO,2DAA2D,EAAO,YAAY,KAAU,oJAGjG,SAAS,EAAU,CAAC,EAAc,CAChC,IAAM,EAAQ,EAAK,MACjB,iGACF,EACA,OAAO,EAAI,EAAQ,GAAW,QAAQ,EAAE,OAAO,EAAM,EAAE,EAAE,OAAO,QAAQ,EAAI,EAAE,EFpCzE,IAAM,GAAM,EAAO,WAAW,SAAU,CAAC,EAAkB,CAChE,OAAO,MAAO,GAAc,CAAO,EAAE,KACnC,EAAO,QAAQ,EAAQ,KAAK,EAC5B,EAAO,QACL,EAAU,QAAQ,EAAU,MAAM,CAAC,EAAO,KAAM,EAAW,IAAI,CAAC,EAAG,CACjE,CACE,EAAO,KACP,EAAO,UAAU,QAAQ,IAAI,oBAAsB,CAAE,OAAQ,QAAQ,IAAI,mBAAoB,EAAI,CAAC,CAAC,CACrG,CACF,CAAC,CACH,EACA,EAAO,QAAQ,EAAa,KAAK,CACnC,EACD,EAEK,GAAgB,EAAO,WAAW,SAAU,CAAC,EAAkB,CACnE,IAAM,EAAS,MAAO,EAAO,QAC7B,GAAI,EAAQ,OAAS,UAAW,MAAO,EAAO,KAAK,IAAM,QAAQ,MAAM,EAAO,IAAI,CAAC,EACnF,OAAO,MAAO,EAAO,OACnB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAa,EAAQ,OAAS,UAC9B,EAAiB,EAAQ,OAAS,UAAY,MAAO,EAAc,QAAQ,EAAI,OAC/E,EAAS,EAAQ,OAAS,UAAY,MAAO,EAAc,KAAK,EAAI,CAAC,EACrE,EAAW,EAAQ,UAAY,EAAO,UAAY,YAClD,EAAO,EAAQ,MAAQ,EAAO,OAAS,EAAQ,OAAS,UAAY,EAAc,YAAY,EAAI,QAKxG,IAHE,IAAmB,QAAa,IAAS,OACrC,MAAO,EAAQ,UAAU,IAAK,EAAgB,IAAK,EAAW,EAAU,CAAI,CAAE,CAAC,EAC/E,UACY,OAAW,OAC7B,IAAQ,SAAU,MAAO,EAAO,QAAQ,IAAa,wCAA8B,EAC7E,EAAsB,MAAO,EAAI,SAEvC,GAAI,EAAQ,OAAS,QACnB,OAAO,QAAQ,IAAI,kBACnB,OAAO,QAAQ,IAAI,yBAErB,IAAM,EACJ,EAAQ,OAAS,UACb,EAAO,UAAY,EAAY,EAAE,EAAE,SAAS,WAAW,EACvD,EACE,EAAS,MAAM,CAAmB,EAClC,EAAY,EAAE,EAAE,SAAS,WAAW,EAC5C,GAAI,CAAC,EAAU,OAAO,MAAO,EAAO,KAAS,MAAM,yBAAyB,CAAC,EAC7E,IAAM,GAAa,GAAW,EACxB,GAAY,MAAO,EAAM,QAAQ,EACjC,EAAS,MAAO,EACpB,CACE,IAAK,CACH,KAAM,QAAQ,IAAI,iBAAmB,MACrC,QAAS,EACT,QAAS,CACX,EACA,WACA,OACA,WACA,WAAY,EAAO,QAAQ,IAAI,iBAAiB,EAChD,SAAU,CACR,KACE,QAAQ,IAAI,cACX,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAM,EAAE,SAAS,CAAgB,GACpE,QAAQ,IAAI,8BAAgC,KAC5C,QAAQ,IAAI,8BAAgC,OACxC,cACA,YAAY,EAAiB,QAAQ,mBAAoB,GAAG,OACpE,EACA,OAAQ,CACN,IAAK,QAAQ,IAAI,oBACjB,KAAM,QAAQ,IAAI,qBAClB,MAAO,CAAC,EAAO,QAAQ,IAAI,6BAA6B,CAC1D,EACA,OAAQ,CACN,UAAW,QAAQ,IAAI,oBACvB,QAAS,CAAC,EACR,QAAQ,IAAI,iCAAmC,QAAQ,IAAI,+BAC7D,EACA,KAAM,QAAQ,IAAI,gBAClB,QAAS,QAAQ,IAAI,uBACvB,EACA,QAAS,CACP,QAAS,QAAQ,IAAI,sBACvB,EACA,GAAI,CACF,YAAa,CAAC,EAAO,QAAQ,IAAI,8BAAgC,QAAQ,IAAI,4BAA4B,EACzG,IACE,QAAQ,IAAI,uBAAyB,OACjC,GACA,CAAC,EAAO,QAAQ,IAAI,oBAAoB,CAChD,CACF,EACA,IAAmB,OACf,OACA,CACE,SAAU,CAAC,EAAS,IAClB,EAAO,IAAI,SAAU,EAAG,CACtB,GAAI,CAAC,EAAO,SAAU,MAAO,EAAc,SAAS,CAAQ,EAC5D,OAAO,MAAO,EAAoB,SAAS,CACzC,UACA,WACA,GAAI,GACJ,KAAM,EAAe,KACrB,UACF,CAAC,EACF,CACL,EACJ,EACF,EAAE,KACA,EAAO,MAAM,CAAC,IAAU,CACtB,GAAI,IAAmB,QAAa,IAAS,QAAa,CAAC,EAAa,CAAK,EAAG,OAAO,EAAO,KAAK,CAAK,EACxG,OAAO,GAAmB,EAAgB,EAAU,CAAI,EAAE,KACxD,EAAO,QAAQ,CAAC,IACd,EACI,EAAO,KACP,EAAO,KACD,MACF,wBAAwB,QAAW,wIAEnC,CAAE,MAAO,CAAM,CACjB,CACF,CACN,CACF,EACD,CACH,EACA,GAAI,IAAW,OAAW,OAC1B,IAAM,EAAM,EAAW,cAAc,EAAO,OAAO,EAEnD,GADA,QAAQ,IAAI,EAAQ,OAAS,QAAU,KAAK,UAAU,CAAE,KAAI,CAAC,EAAI,uBAAuB,GAAK,EACzF,GAAc,CAAC,EAAqB,QAAQ,IAAI,mBAAmB,GAAU,EAGjF,OADA,OADgB,MAAO,EAAQ,SAChB,MAAM,EAAE,KAAK,EAAO,SAAS,EAAS,OAAO,YAAY,CAAC,EAAG,EAAO,UAAU,EACtF,MAAO,EAAQ,OAAS,UAC3B,EAAO,SACP,EAAQ,OAAS,QACf,GAAkB,EAClB,EAAO,MACd,EAAE,KAAK,EAAO,aAAa,CAAE,KAAM,QAAS,CAAC,CAAC,CACjD,EACD,EAEK,GAAqB,EAAO,WAAW,SAAU,CAAC,EAA0B,EAAkB,EAAc,CAChH,IAAM,EAAQ,MAAO,EAAQ,UAAU,IAAK,EAAS,IAAK,EAAW,EAAU,CAAI,CAAE,CAAC,EAAE,KACtF,EAAO,aAAa,CAAC,IAAU,IAAU,MAAS,EAClD,EAAO,MAAM,EAAS,OAAO,YAAY,CAAC,EAC1C,EAAO,cAAc,YAAY,CACnC,EACA,OAAO,EAAO,OAAO,CAAK,EAC3B,EAED,SAAS,CAAU,CAAC,EAAkB,EAAc,CAClD,MAAO,UAAU,EAAS,SAAS,GAAG,EAAI,IAAI,KAAc,KAAY,IAG1E,SAAS,CAAM,CAAC,EAAgB,CAC9B,OAAO,IAAU,KAAO,GAAO,YAAY,IAAM,OAGnD,SAAS,CAAY,CAAC,EAAyB,CAC7C,GAAI,OAAO,IAAU,UAAY,IAAU,KAAM,MAAO,GACxD,GAAI,SAAU,GAAS,EAAM,OAAS,aAAc,MAAO,GAC3D,MAAO,UAAW,GAAS,EAAa,EAAM,KAAK,EAGrD,SAAS,EAAiB,EAAG,CAC3B,OAAO,EAAO,SAAe,CAAC,IAAW,CACvC,IAAM,EAAQ,IAAM,EAAO,EAAO,IAAI,EAItC,GAHA,QAAQ,MAAM,KAAK,MAAO,CAAK,EAC/B,QAAQ,MAAM,KAAK,QAAS,CAAK,EACjC,QAAQ,MAAM,OAAO,EACjB,QAAQ,MAAM,eAAiB,QAAQ,MAAM,UAAW,EAAM,EAClE,OAAO,EAAO,KAAK,IAAM,CACvB,QAAQ,MAAM,IAAI,MAAO,CAAK,EAC9B,QAAQ,MAAM,IAAI,QAAS,CAAK,EAChC,QAAQ,MAAM,MAAM,EACrB,EACF,EInMH,IAAe,KAAQ,QACrB,EAAS,SAAS,MAClB,EAAO,WAAW,SAAU,CAAC,EAAO,CAClC,GAAI,EAAM,SAAW,EAAM,MAAO,OAAO,MAAO,EAAO,KAAS,MAAM,0CAA0C,CAAC,EACjH,OAAO,MAAO,EAAc,IAAI,CAC9B,KAAM,EAAM,QAAU,UAAY,EAAM,MAAQ,QAAU,UAC1D,SAAU,EAAO,eAAe,EAAM,QAAQ,EAC9C,KAAM,EAAO,eAAe,EAAM,IAAI,CACxC,CAAC,EACF,CACH",
"debugId": "6520F46A7B01089964756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/run.ts"],
"sourcesContent": [
"import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n"
],
"mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH",
"debugId": "3CDA094CF5D81BA864756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["src/commands/handlers/mcp/auth.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n"
],
"mappings": ";u9BAAA,cAAS,WAcT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,UAAS,CAAC,CACnG,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR",
"debugId": "984F0A443C95315A64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/logout.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n"
],
"mappings": ";u9BAAA,cAAS,WAST,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,OAC/B,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH",
"debugId": "B009A7B1E869B44D64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/service/status.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n"
],
"mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,OACnC,EAAO,GAAG,oBAAoB,EAAE,SAAU,EAAG,CAC3C,IAAM,EAAU,MAAO,EAAc,QAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH",
"debugId": "DF16EA2772FD567B64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/auth/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { createClient, loadIntegrations } from \"./shared\"\nimport { errorMessage } from \"../../../util/error\"\n\nexport default Runtime.handler(Commands.commands.auth.commands.list, (input) =>\n list(input).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n)\n\nconst list = Effect.fn(\"cli.auth.list\")(function* (input) {\n const client = yield* createClient({ server: Option.getOrUndefined(input.server), standalone: input.standalone })\n const integrations = (yield* loadIntegrations(client)).filter((integration) => integration.connections.length > 0)\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify(\n integrations.map((integration) => ({\n id: integration.id,\n name: integration.name,\n connections: integration.connections,\n })),\n null,\n 2,\n ) + EOL,\n )\n return\n }\n const rows = integrations.flatMap((integration) =>\n integration.connections.map((connection) => ({\n integration: integration.name,\n source: connection.type === \"credential\" ? connection.label : connection.name,\n type: connection.type === \"credential\" ? \"stored\" : \"environment\",\n })),\n )\n if (rows.length === 0) {\n process.stdout.write(\"No authenticated integrations\" + EOL)\n return\n }\n const width = Math.max(...rows.map((row) => row.integration.length)) + 2\n process.stdout.write(\n rows.map((row) => row.integration.padEnd(width) + row.source.padEnd(28) + row.type).join(EOL) + EOL,\n )\n})\n"
],
"mappings": ";ymCAAA,cAAS,WAOT,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAK,SAAS,KAAM,CAAC,IACpE,EAAK,CAAK,EAAE,KACV,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,EAEM,EAAO,EAAO,GAAG,eAAe,EAAE,SAAU,CAAC,EAAO,CACxD,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAO,eAAe,EAAM,MAAM,EAAG,WAAY,EAAM,UAAW,CAAC,EAC1G,GAAgB,MAAO,EAAiB,CAAM,GAAG,OAAO,CAAC,IAAgB,EAAY,YAAY,OAAS,CAAC,EACjH,GAAI,EAAM,SAAW,OAAQ,CAC3B,QAAQ,OAAO,MACb,KAAK,UACH,EAAa,IAAI,CAAC,KAAiB,CACjC,GAAI,EAAY,GAChB,KAAM,EAAY,KAClB,YAAa,EAAY,WAC3B,EAAE,EACF,KACA,CACF,EAAI,CACN,EACA,OAEF,IAAM,EAAO,EAAa,QAAQ,CAAC,IACjC,EAAY,YAAY,IAAI,CAAC,KAAgB,CAC3C,YAAa,EAAY,KACzB,OAAQ,EAAW,OAAS,aAAe,EAAW,MAAQ,EAAW,KACzE,KAAM,EAAW,OAAS,aAAe,SAAW,aACtD,EAAE,CACJ,EACA,GAAI,EAAK,SAAW,EAAG,CACrB,QAAQ,OAAO,MAAM,gCAAkC,CAAG,EAC1D,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,MAAM,CAAC,EAAI,EACvE,QAAQ,OAAO,MACb,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,OAAO,CAAK,EAAI,EAAI,OAAO,OAAO,EAAE,EAAI,EAAI,IAAI,EAAE,KAAK,CAAG,EAAI,CAClG,EACD",
"debugId": "05372AD263C2F16864756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["../core/src/workspace/driver.ts", "../core/src/workspace/sql.ts", "../core/src/workspace.ts", "../core/src/environment/files.ts", "../core/src/environment/exec-defaults.ts", "../core/src/environment/local.ts", "../core/src/environment/memory.ts", "../core/src/environment/environment.ts", "../core/src/environment/index.ts"],
"sourcesContent": [
"export * as WorkspaceDriver from \"./driver.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport type { Scope } from \"effect\"\nimport type { Driver as EnvironmentDriver } from \"../environment/driver.js\"\n\n/**\n * Smallest provider-owned JSON value required to reconnect to the same\n * provider resource. Core stores it opaquely and hands it back; only the\n * owning driver reads inside.\n */\nexport const Binding = Schema.Record(Schema.String, Schema.Json)\nexport type Binding = typeof Binding.Type\n\nexport class Error extends Schema.TaggedError<Error>()(\"WorkspaceDriver.Error\", {\n message: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {}\n\nexport class ProviderNotFound extends Schema.TaggedError<ProviderNotFound>()(\"WorkspaceDriver.ProviderNotFound\", {\n provider: Schema.String,\n}) {}\n\nexport interface Interface {\n /**\n * Get-or-create the provider resource backing this logical workspace.\n *\n * MUST be idempotent per `workspaceID`: core retries the same ID after\n * failures and process crashes, including a crash between a successful\n * create and the binding being persisted, and another process may race the\n * same ID. Key the resource by `workspaceID` (a provider tag or a\n * deterministic name) and adopt an existing match instead of creating a\n * duplicate.\n */\n readonly create: (input: {\n readonly workspaceID: Workspace.ID\n }) => Effect.Effect<{ readonly binding: Binding }, Error>\n readonly connect: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<EnvironmentDriver, Error, Scope.Scope>\n readonly suspendForIdle: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<void, Error>\n /**\n * Release the provider resource for this workspace.\n *\n * `binding` is null when none was persisted: the workspace was never\n * provisioned, or provisioning was interrupted mid-create. Look up any\n * resource previously created for `workspaceID` and clean it up, treating\n * absence as success.\n */\n readonly destroy: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding | null\n }) => Effect.Effect<void, Error>\n}\n\nexport const make = (driver: Interface) => driver\n\nexport interface Registry {\n readonly get: (provider: string) => Effect.Effect<Interface, ProviderNotFound>\n}\n\nexport class RegistryService extends Context.Service<RegistryService, Registry>()(\n \"@opencode/WorkspaceDriverRegistry\",\n) {}\n\nexport const registry = (drivers: Readonly<Record<string, Interface>>): Registry => ({\n get: (provider) => {\n const driver = Object.hasOwn(drivers, provider) ? drivers[provider] : undefined\n return driver ? Effect.succeed(driver) : Effect.fail(new ProviderNotFound({ provider }))\n },\n})\n\nexport const registryNode = (drivers: Readonly<Record<string, Interface>>) =>\n makeGlobalNode({\n service: RegistryService,\n layer: Layer.succeed(RegistryService, RegistryService.of(registry(drivers))),\n deps: [],\n })\n\nexport const node = registryNode({})\n",
"import { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\"\nimport type { WorkspaceDriver } from \"./driver.js\"\n\nexport const WorkspaceTable = sqliteTable(\"workspace\", {\n id: text().$type<Workspace.ID>().primaryKey(),\n provider: text().notNull(),\n binding: text({ mode: \"json\" }).$type<WorkspaceDriver.Binding>(),\n created_at: integer().notNull(),\n last_used_at: integer().notNull(),\n})\n",
"export * as Workspace from \"./workspace.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { eq } from \"drizzle-orm\"\nimport { Clock, Context, Deferred, Duration, Effect, Exit, FiberSet, Layer, Ref, Schedule, Schema, Scope } from \"effect\"\nimport { systemError } from \"effect/PlatformError\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver as EnvironmentDriver } from \"./environment/driver.js\"\nimport { Database } from \"./database/database.js\"\nimport { KeyedMutex } from \"./effect/keyed-mutex.js\"\nimport { WorkspaceDriver } from \"./workspace/driver.js\"\nimport { WorkspaceTable } from \"./workspace/sql.js\"\n\nexport const ID = Workspace.ID\nexport type ID = Workspace.ID\n\nexport class Info extends Schema.Class<Info>(\"Workspace.Info\")({\n id: ID,\n provider: Schema.String,\n binding: WorkspaceDriver.Binding,\n createdAt: Schema.Number,\n lastUsedAt: Schema.Number,\n}) {}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Workspace.NotFound\", { workspaceID: ID }) {}\n\nexport interface Interface {\n /** Instantly commits a logical workspace ID. No provider work happens here. */\n readonly create: (provider: string) => Effect.Effect<ID, WorkspaceDriver.ProviderNotFound>\n /** Starts or joins the shared attempt that makes the backing resource real, then returns it. */\n readonly provision: (\n workspaceID: ID,\n ) => Effect.Effect<Info, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly connect: (\n workspaceID: ID,\n ) => Effect.Effect<EnvironmentDriver, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly destroy: (\n workspaceID: ID,\n ) => Effect.Effect<void, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n}\n\nexport interface Options {\n readonly idleThreshold?: Duration.Input\n readonly pollInterval?: Duration.Input\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Workspace\") {}\n\ninterface Connection {\n readonly driver: WorkspaceDriver.Interface\n readonly environment: EnvironmentDriver\n readonly saveBinding: (binding: WorkspaceDriver.Binding) => Effect.Effect<void>\n readonly lastActivity: Ref.Ref<number>\n readonly active: Ref.Ref<number>\n readonly scope: Scope.Closeable\n}\n\ntype ReadinessError = NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound\n\nexport const configured = (options: Options = {}) =>\n makeGlobalNode({\n service: Service,\n layer: layer(options),\n deps: [Database.node, WorkspaceDriver.node],\n })\n\nconst layer = (options: Options) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const db = (yield* Database.Service).db\n const registry = yield* WorkspaceDriver.RegistryService\n const lifetime = yield* Scope.Scope\n const connections = new Map<ID, Connection>()\n // Destroy cancels the racing provision body by settling the deferred.\n const attempts = new Map<ID, Deferred.Deferred<Info, ReadinessError>>()\n const locks = KeyedMutex.makeUnsafe<ID>()\n const fork = yield* FiberSet.makeRuntime<never, void, never>()\n const idleThreshold = Duration.toMillis(options.idleThreshold ?? Duration.minutes(20))\n\n const load = Effect.fn(\"Workspace.load\")(function* (workspaceID: ID) {\n const row = yield* db\n .select()\n .from(WorkspaceTable)\n .where(eq(WorkspaceTable.id, workspaceID))\n .get()\n .pipe(Effect.orDie)\n if (!row) return yield* new NotFound({ workspaceID })\n return row\n })\n\n const saveBinding = (workspaceID: ID, binding: WorkspaceDriver.Binding) =>\n db.update(WorkspaceTable).set({ binding }).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n\n const info = (row: typeof WorkspaceTable.$inferSelect, binding: WorkspaceDriver.Binding) =>\n new Info({\n id: row.id,\n provider: row.provider,\n binding,\n createdAt: row.created_at,\n lastUsedAt: row.last_used_at,\n })\n\n const provision = Effect.fn(\"Workspace.provision\")((workspaceID: ID) =>\n Effect.suspend(() => {\n const existing = attempts.get(workspaceID)\n if (existing) return Deferred.await(existing)\n\n const attempt = Deferred.makeUnsafe<Info, ReadinessError>()\n attempts.set(workspaceID, attempt)\n fork(\n locks\n .withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* load(workspaceID)\n if (row.binding) return info(row, row.binding)\n const driver = yield* registry.get(row.provider)\n const result = yield* driver.create({ workspaceID })\n yield* saveBinding(workspaceID, result.binding)\n return info(row, result.binding)\n }),\n )\n .pipe(\n Effect.raceFirst(Deferred.await(attempt)),\n Effect.onExit((exit) =>\n Effect.sync(() => {\n if (attempts.get(workspaceID) === attempt) attempts.delete(workspaceID)\n Deferred.doneUnsafe(attempt, exit)\n }),\n ),\n Effect.exit,\n Effect.asVoid,\n ),\n )\n return Deferred.await(attempt)\n }),\n )\n\n const open = Effect.fn(\"Workspace.open\")(function* (workspaceID: ID) {\n const existing = connections.get(workspaceID)\n if (existing) return existing\n\n const row = yield* load(workspaceID)\n // Bindings are persisted before provision resolves and never nulled; a raced\n // destroy deletes the whole row and surfaces as NotFound from load above.\n if (!row.binding) return yield* Effect.die(`workspace ${workspaceID} has no binding after provision`)\n const driver = yield* registry.get(row.provider)\n const persistBinding = (binding: WorkspaceDriver.Binding) => saveBinding(workspaceID, binding)\n const scope = yield* Scope.fork(lifetime)\n const environment = yield* driver\n .connect({ workspaceID, binding: row.binding, saveBinding: persistBinding })\n .pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n )\n const now = yield* Clock.currentTimeMillis\n const connection: Connection = {\n driver,\n environment,\n saveBinding: persistBinding,\n lastActivity: yield* Ref.make(now),\n active: yield* Ref.make(0),\n scope,\n }\n connections.set(workspaceID, connection)\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: now })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n return connection\n })\n\n yield* Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis\n yield* Effect.forEach(\n [...connections.entries()],\n ([workspaceID, expected]) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = connections.get(workspaceID)\n if (connection !== expected || (yield* Ref.get(connection.active)) > 0) return\n const lastActivity = yield* Ref.get(connection.lastActivity)\n if (now - lastActivity < idleThreshold) return\n const row = yield* load(workspaceID)\n if (!row.binding) return\n // Deliberate: a racing spawn blocks, then wakes cleanly. Unlocking mid-suspend could reattach a sandbox being terminated.\n yield* connection.driver.suspendForIdle({\n workspaceID,\n binding: row.binding,\n saveBinding: connection.saveBinding,\n })\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: lastActivity })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n connections.delete(workspaceID)\n yield* Scope.close(connection.scope, Exit.void)\n }).pipe(Effect.catchCause((cause) => Effect.logError(\"workspace idle suspension failed\", cause))),\n ),\n { concurrency: \"unbounded\", discard: true },\n )\n }).pipe(Effect.repeat(Schedule.spaced(options.pollInterval ?? Duration.minutes(1))), Effect.forkScoped)\n\n return Service.of({\n create: Effect.fn(\"Workspace.create\")(function* (provider) {\n yield* registry.get(provider)\n const workspaceID = ID.create()\n const now = yield* Clock.currentTimeMillis\n yield* db\n .insert(WorkspaceTable)\n .values({ id: workspaceID, provider, binding: null, created_at: now, last_used_at: now })\n .run()\n .pipe(Effect.orDie)\n return workspaceID\n }),\n provision,\n connect: Effect.fn(\"Workspace.connect\")(function* (workspaceID) {\n const spawner = make((command) =>\n Effect.acquireRelease(\n // A live connection implies the binding is already persisted, so skip the provision hop.\n Effect.suspend(() => (connections.has(workspaceID) ? Effect.void : provision(workspaceID))).pipe(\n Effect.andThen(\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = yield* open(workspaceID)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n yield* Ref.update(connection.active, (active) => active + 1)\n return connection\n }),\n ),\n ),\n Effect.mapError((cause) =>\n systemError({\n _tag: \"Unknown\",\n module: \"Workspace\",\n method: \"spawn\",\n description: `Failed to wake workspace ${workspaceID}`,\n cause,\n }),\n ),\n ),\n (connection) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n yield* Ref.update(connection.active, (active) => active - 1)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n }),\n ),\n ).pipe(Effect.flatMap((connection) => connection.environment.spawner.spawn(command))),\n )\n // Overrides are connection-bound; per-spawn routing is required before any driver ships them, so they are deliberately omitted.\n return { spawner }\n }),\n destroy: Effect.fn(\"Workspace.destroy\")(function* (workspaceID) {\n // Settling the shared attempt cancels its racing provision body and fails\n // waiters with NotFound before teardown commits. Accepted tradeoffs: if the\n // locked teardown below fails, those waiters saw NotFound for a workspace\n // that still exists (the next provision retries it), and a provision racing\n // this window may briefly succeed before teardown destroys its fresh binding.\n const attempt = attempts.get(workspaceID)\n if (attempt) {\n attempts.delete(workspaceID)\n Deferred.doneUnsafe(attempt, Exit.fail(new NotFound({ workspaceID })))\n }\n yield* locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* load(workspaceID)\n const connection = connections.get(workspaceID)\n connections.delete(workspaceID)\n if (connection) yield* Scope.close(connection.scope, Exit.void)\n // Null binding still reaches the driver: an interrupted or crashed\n // provision may have created a resource that was never persisted. A\n // provider missing from the registry cannot block deleting a\n // never-provisioned row.\n yield* registry.get(row.provider).pipe(\n Effect.flatMap((driver) => driver.destroy({ workspaceID, binding: row.binding })),\n Effect.catchTag(\"WorkspaceDriver.ProviderNotFound\", (error) =>\n row.binding ? Effect.fail(error) : Effect.void,\n ),\n )\n yield* db.delete(WorkspaceTable).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n }),\n )\n }),\n })\n }),\n )\n\nexport const node = configured()\n\n// TODO(workspace-plan): add the boot janitor and ~23h safety snapshot rotation in a later PR.\n// TODO(workspace-plan): make cold wake interruptible with a re-pin loop against janitor races.\n// TODO(workspace-plan): consider extracting a keyed shared-attempt helper (join/cancel, drop-on-settle) beside\n// KeyedMutex at end-of-series consolidation; filesystem/search.ts and session/run-coordinator.ts hand-roll the same\n// shape. Audited stdlib alternatives (rc.111): RcMap fails twice (refcount release cancels in-flight work when the\n// last waiter leaves, and one finalizer path cannot express idle-suspend vs destroy); Cache interrupts the shared\n// lookup when its last awaiter is interrupted and cannot fail waiters with NotFound on invalidation.\n",
"import { Effect, Schema } from \"effect\"\n\nexport const FileType = Schema.Literals([\"file\", \"directory\", \"symlink\", \"other\"])\nexport type FileType = typeof FileType.Type\n\nexport interface FileInfo {\n readonly type: FileType\n readonly size: number\n readonly mtimeMs: number\n}\n\nexport interface DirEntry {\n readonly name: string\n readonly type: FileType\n}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Environment.NotFound\", {\n path: Schema.String,\n}) {}\n\nexport class WrongKind extends Schema.TaggedError<WrongKind>()(\"Environment.WrongKind\", {\n path: Schema.String,\n actual: FileType,\n}) {}\n\nexport class Failed extends Schema.TaggedError<Failed>()(\"Environment.Failed\", {\n path: Schema.String,\n cause: Schema.Defect(),\n}) {}\n\nexport interface FilesImpl {\n /**\n * Content operations (`read`, `list`) follow final symlinks; metadata operations (`stat` and entry\n * tags returned by `list`) do not. `info` describes the target file whose bytes are returned.\n * The process-backed default caps collected output at 64 MiB; larger whole-file reads fail with\n * `Failed`, so callers must use ranges for larger files.\n */\n readonly read: (\n path: string,\n range?: { readonly offset: number; readonly length: number },\n ) => Effect.Effect<{ readonly info: FileInfo; readonly bytes: Uint8Array }, NotFound | WrongKind | Failed>\n readonly write: (path: string, bytes: Uint8Array) => Effect.Effect<void, Failed>\n /** Describes the path entry itself, so a final symlink is reported as `symlink` rather than followed. */\n readonly stat: (path: string) => Effect.Effect<FileInfo, NotFound | Failed>\n /** Follows a final symlink to the listed directory while preserving each returned entry's own type. */\n readonly list: (path: string) => Effect.Effect<ReadonlyArray<DirEntry>, NotFound | WrongKind | Failed>\n readonly remove: (path: string) => Effect.Effect<void, Failed>\n readonly move: (from: string, to: string) => Effect.Effect<void, NotFound | Failed>\n readonly mkdir: (path: string) => Effect.Effect<void, Failed>\n}\n\nexport interface Files extends FilesImpl {}\n\n/**\n * Derives a follow-stat kind from the lstat-like Files contract. A dangling\n * symlink fails with `NotFound`.\n */\nexport const typeFollowing = (files: Files, path: string) =>\n files.stat(path).pipe(\n Effect.flatMap((info) =>\n info.type === \"symlink\"\n ? files.read(path, { offset: 0, length: 0 }).pipe(\n Effect.map((result) => result.info.type),\n Effect.catchTag(\"Environment.WrongKind\", (error) => Effect.succeed(error.actual)),\n )\n : Effect.succeed(info.type),\n ),\n )\n\nexport * as EnvironmentFiles from \"./files.js\"\n",
"import { Effect, Stream } from \"effect\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { collectStream } from \"@opencode-ai/util/process\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FileType, type FilesImpl } from \"./files.js\"\n\n/**\n * Files derived from spawning processes: one process per intent, \"$1\" is\n * always the target path. Scripts report classification through an exit-code\n * protocol (44/45/46) so failures never require parsing localized error text;\n * LC_ALL=C pins the one stderr match that remains. Requires GNU coreutils and\n * findutils in the target image — BSD and busybox userlands will not work.\n * Malformed output from these scripts is our own bug and dies as a defect.\n */\n\nconst MAX_DATA_BYTES = 64 * 1024 * 1024\nconst MAX_ERROR_BYTES = 64 * 1024\nconst NOT_FOUND = 44\nconst WRONG_KIND = 45\nconst FAILED = 46\nconst TAB = \"\\t\"\n\nconst loadMetadata = (flags = \"\") => `\nmetadata=$(stat ${flags} -c '%F${TAB}%s${TAB}%Y' -- \"$1\" 2>&1) || {\n case \"$metadata\" in\n *'No such file or directory'*|*'Not a directory'*) exit ${NOT_FOUND} ;;\n *) printf '%s' \"$metadata\" >&2; exit ${FAILED} ;;\n esac\n}\n`\n\nconst statScript = `\n${loadMetadata()}\nprintf '%s\\n' \"$metadata\"\n`\n\nconst readScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != 'regular file' ] && [ \"$kind\" != 'regular empty file' ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nprintf '%s\\n' \"$metadata\"\nif [ \"$2\" = range ]; then\n dd if=\"$1\" iflag=skip_bytes,count_bytes skip=\"$3\" count=\"$4\" status=none\nelse\n cat -- \"$1\"\nfi\n`\n\nconst listScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != directory ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nfind -H \"$1\" -mindepth 1 -maxdepth 1 -printf '%y\\\\0%f\\\\0'\n`\n\nconst moveScript = `\n${loadMetadata()}\nmv -- \"$1\" \"$2\"\n`\n\ninterface Result {\n readonly exitCode: number\n readonly stdout: Uint8Array\n readonly stderr: Uint8Array\n}\n\nexport const execDefaults = (spawner: ChildProcessSpawner[\"Service\"]): FilesImpl => {\n const run = (\n path: string,\n script: string,\n args: ReadonlyArray<string> = [],\n stdin?: Uint8Array,\n ): Effect.Effect<Result, Failed> =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\"sh\", [\"-c\", script, \"sh\", path, ...args], {\n env: { LC_ALL: \"C\" },\n extendEnv: true,\n stdin: stdin === undefined ? undefined : Stream.make(stdin),\n })\n const handle = yield* spawner.spawn(command).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, MAX_DATA_BYTES),\n collectStream(handle.stderr, MAX_ERROR_BYTES),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n if (stdout.truncated || stderr.truncated) {\n return yield* new Failed({ path, cause: new Error(\"Process output exceeded its collection limit\") })\n }\n return { exitCode, stdout: stdout.buffer, stderr: stderr.buffer }\n }),\n )\n\n const classify = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n ): Effect.Effect<A, NotFound | WrongKind | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n if (result.exitCode === WRONG_KIND) {\n return Effect.fail(new WrongKind({ path, actual: parseType(new TextDecoder().decode(result.stderr)) }))\n }\n return Effect.fail(processFailure(path, result))\n }\n\n const complete = (path: string, result: Result) =>\n result.exitCode === 0 ? Effect.void : Effect.fail(processFailure(path, result))\n\n return {\n stat: (path) => run(path, statScript).pipe(Effect.flatMap((result) => classifyPlain(path, result, parseInfo))),\n read: (path, range) =>\n run(\n path,\n readScript,\n range === undefined ? [\"whole\"] : [\"range\", String(range.offset), String(range.length)],\n ).pipe(\n Effect.flatMap((result) =>\n classify(path, result, (stdout) => {\n const newline = stdout.indexOf(10)\n if (newline < 0) throw new Error(\"Missing read metadata header\")\n return {\n info: parseInfo(stdout.slice(0, newline)),\n bytes: stdout.slice(newline + 1),\n }\n }),\n ),\n ),\n write: (path, bytes) =>\n run(path, `mkdir -p \"$(dirname \"$1\")\" && cat > \"$1\"`, [], bytes).pipe(\n Effect.flatMap((result) => complete(path, result)),\n ),\n list: (path) => run(path, listScript).pipe(Effect.flatMap((result) => classify(path, result, parseList))),\n remove: (path) => run(path, `rm -rf -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n move: (from, to) =>\n run(from, moveScript, [to]).pipe(Effect.flatMap((result) => classifyPlain(from, result, () => undefined))),\n mkdir: (path) => run(path, `mkdir -p -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n }\n}\n\n/** `classify` for scripts whose protocol never reports WrongKind. */\nconst classifyPlain = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n): Effect.Effect<A, NotFound | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n return Effect.fail(processFailure(path, result))\n}\n\nconst processFailure = (path: string, result: Result) =>\n new Failed({\n path,\n cause: new Error(new TextDecoder().decode(result.stderr).trim() || `Process exited with code ${result.exitCode}`),\n })\n\nconst parseInfo = (bytes: Uint8Array): FileInfo => {\n const [rawType, rawSize, rawMtime] = new TextDecoder().decode(bytes).trim().split(TAB)\n const size = Number(rawSize)\n const mtimeMs = Number(rawMtime) * 1_000\n if (!rawType || !Number.isFinite(size) || !Number.isFinite(mtimeMs)) throw new Error(\"Invalid stat output\")\n return { type: parseType(rawType), size, mtimeMs }\n}\n\nconst parseType = (value: string): FileType => {\n if (value === \"regular file\" || value === \"regular empty file\" || value === \"f\") return \"file\"\n if (value === \"directory\" || value === \"d\") return \"directory\"\n if (value === \"symbolic link\" || value === \"l\") return \"symlink\"\n return \"other\"\n}\n\nconst parseList = (bytes: Uint8Array) => {\n const fields = new TextDecoder().decode(bytes).split(\"\\0\")\n fields.pop()\n if (fields.length % 2 !== 0) throw new Error(\"Invalid find output\")\n return Array.from({ length: fields.length / 2 }, (_, index) => ({\n name: fields[index * 2 + 1],\n type: parseType(fields[index * 2]),\n }))\n}\n\nexport * as EnvironmentExecDefaults from \"./exec-defaults.js\"\n",
"import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Effect } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\n/**\n * The host filesystem binding. Deliberately raw node:fs rather than effect's\n * FileSystem service or FSUtil: the contract needs lstat semantics (stat\n * reports \"symlink\") and typed directory entries, and effect's node\n * FileSystem provides neither — its stat always follows symlinks and\n * readDirectory returns names only. FSUtil hits the same gap and its\n * readDirectoryEntries already bypasses to raw node readdir internally.\n * Nothing above the environment seam touches node:fs.\n */\nexport const makeLocalDriver = (spawner: ChildProcessSpawner[\"Service\"]): Driver => {\n const overrides: FilesImpl = {\n read: (value, range) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"file\") return yield* new WrongKind({ path: value, actual: info.type })\n if (range === undefined) {\n const bytes = yield* attempt(value, () => fs.readFile(value), true)\n return { info, bytes }\n }\n const bytes = yield* attempt(\n value,\n async () => {\n const handle = await fs.open(value, \"r\")\n try {\n const buffer = new Uint8Array(range.length)\n const result = await handle.read(buffer, 0, range.length, range.offset)\n return buffer.subarray(0, result.bytesRead)\n } finally {\n await handle.close()\n }\n },\n true,\n )\n return { info, bytes }\n }),\n stat: (value) => stat(value, false),\n list: (value) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"directory\") return yield* new WrongKind({ path: value, actual: info.type })\n const entries = yield* attempt(value, () => fs.readdir(value, { withFileTypes: true }), true)\n return entries.map((entry) => ({ name: entry.name, type: fileType(entry) }))\n }),\n write: (value, bytes) =>\n attempt(value, async () => {\n await fs.mkdir(path.dirname(value), { recursive: true })\n await fs.writeFile(value, bytes)\n }),\n remove: (value) => attempt(value, () => fs.rm(value, { recursive: true, force: true })),\n move: (from, to) =>\n Effect.gen(function* () {\n yield* stat(from, false)\n const destination = yield* stat(to, false).pipe(\n Effect.map((info) => (info.type === \"directory\" ? path.join(to, path.basename(from)) : to)),\n Effect.catchIf(\n (error) => error instanceof NotFound,\n () => Effect.succeed(to),\n ),\n )\n yield* attempt(from, () => fs.rename(from, destination))\n }),\n mkdir: (value) => attempt(value, () => fs.mkdir(value, { recursive: true }).then(() => undefined)),\n }\n\n return { spawner, overrides }\n}\n\nconst stat = (value: string, follow: boolean) =>\n attempt(value, () => (follow ? fs.stat(value) : fs.lstat(value)), true).pipe(\n Effect.map((stats): FileInfo => ({ type: fileType(stats), size: stats.size, mtimeMs: stats.mtimeMs })),\n )\n\nconst fileType = (entry: { isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean }): FileType => {\n if (entry.isFile()) return \"file\"\n if (entry.isDirectory()) return \"directory\"\n if (entry.isSymbolicLink()) return \"symlink\"\n return \"other\"\n}\n\nfunction attempt<A>(value: string, run: () => Promise<A>): Effect.Effect<A, Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing: true): Effect.Effect<A, NotFound | Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing = false) {\n return Effect.tryPromise({\n try: run,\n catch: (cause) =>\n missing && isMissing(cause) ? new NotFound({ path: value }) : new Failed({ path: value, cause }),\n })\n}\n\nconst isMissing = (cause: unknown) =>\n cause !== null &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\")\n\nexport * as EnvironmentLocal from \"./local.js\"\n",
"import path from \"node:path\"\nimport { Effect, PlatformError } from \"effect\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\ntype Node =\n | { readonly type: \"file\"; readonly bytes: Uint8Array; readonly mtimeMs: number }\n | { readonly type: \"directory\"; readonly mtimeMs: number }\n | { readonly type: \"symlink\"; readonly target: string; readonly mtimeMs: number }\n\nexport interface MemoryDriver extends Driver {\n readonly symlink: (target: string, path: string) => Effect.Effect<void, Failed>\n}\n\nexport const makeMemoryDriver = (): MemoryDriver => {\n const nodes = new Map<string, Node>([[\"/\", { type: \"directory\", mtimeMs: Date.now() }]])\n const key = (value: string) => path.posix.resolve(\"/\", value)\n const info = (node: Node): FileInfo => ({\n type: node.type,\n size:\n node.type === \"file\"\n ? node.bytes.length\n : node.type === \"symlink\"\n ? new TextEncoder().encode(node.target).length\n : 0,\n mtimeMs: node.mtimeMs,\n })\n const resolveKey = (value: string, followFinal: boolean, seen = new Set<string>()): string | undefined => {\n const normalized = key(value)\n const parts = normalized.split(\"/\").filter(Boolean)\n const base = \"/\"\n const walk = (current: string, index: number): string | undefined => {\n if (index === parts.length) return current\n const part = parts[index]\n const candidate = path.posix.join(current, part)\n const node = nodes.get(candidate)\n if (node?.type !== \"symlink\" || (!followFinal && index === parts.length - 1)) return walk(candidate, index + 1)\n if (seen.has(candidate)) return undefined\n seen.add(candidate)\n const target = path.posix.resolve(path.posix.dirname(candidate), node.target)\n return resolveKey(path.posix.join(target, ...parts.slice(index + 1)), followFinal, seen)\n }\n return walk(base, 0)\n }\n const lookup = (value: string) => nodes.get(resolveKey(value, false) ?? key(value))\n const requireParent = (value: string) => {\n const parentPath = path.posix.dirname(key(value))\n const parent = nodes.get(resolveKey(parentPath, true) ?? parentPath)\n if (!parent) throw new Error(`Parent directory does not exist: ${path.posix.dirname(value)}`)\n if (parent.type !== \"directory\") throw new Error(`Parent is not a directory: ${path.posix.dirname(value)}`)\n }\n const mkdirSync = (value: string) => {\n const target = resolveKey(value, false) ?? key(value)\n const existing = nodes.get(target)\n if (existing?.type === \"directory\") return\n if (existing) throw new Error(`Path is not a directory: ${value}`)\n const parent = path.posix.dirname(target)\n if (parent !== target) mkdirSync(parent)\n nodes.set(target, { type: \"directory\", mtimeMs: Date.now() })\n }\n const failed = (value: string, cause: unknown) => new Failed({ path: value, cause })\n const overrides: FilesImpl = {\n stat: (value) => {\n const node = lookup(value)\n return node ? Effect.succeed(info(node)) : Effect.fail(new NotFound({ path: value }))\n },\n read: (value, range) => {\n const original = lookup(value)\n if (!original) return Effect.fail(new NotFound({ path: value }))\n if (original.type === \"directory\") return Effect.fail(new WrongKind({ path: value, actual: \"directory\" }))\n const resolved = resolveKey(value, true)\n const node = resolved === undefined ? undefined : nodes.get(resolved)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"file\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const bytes = range === undefined ? node.bytes : node.bytes.subarray(range.offset, range.offset + range.length)\n return Effect.succeed({ info: info(node), bytes: bytes.slice() })\n },\n write: (value, bytes) =>\n Effect.try({\n try: () => {\n mkdirSync(path.posix.dirname(key(value)))\n const existing = lookup(value)\n if (existing?.type === \"directory\") throw new Error(`Path is a directory: ${value}`)\n const target = existing?.type === \"symlink\" ? resolveKey(value, true) : resolveKey(value, false)\n if (!target) throw new Error(`Cannot resolve symlink: ${value}`)\n requireParent(target)\n nodes.set(target, { type: \"file\", bytes: bytes.slice(), mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n list: (value) => {\n const target = resolveKey(value, true) ?? key(value)\n const node = nodes.get(target)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"directory\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const entries = [...nodes.entries()]\n .filter(([entry]) => entry !== target && path.posix.dirname(entry) === target)\n .map(([entry, child]) => ({ name: path.posix.basename(entry), type: child.type satisfies FileType }))\n .sort((a, b) => a.name.localeCompare(b.name))\n return Effect.succeed(entries)\n },\n remove: (value) =>\n Effect.sync(() => {\n const target = resolveKey(value, false) ?? key(value)\n for (const entry of nodes.keys()) {\n if (entry === target || entry.startsWith(`${target}/`)) nodes.delete(entry)\n }\n }),\n move: (from, to) => {\n const source = resolveKey(from, false) ?? key(from)\n const node = nodes.get(source)\n if (!node) return Effect.fail(new NotFound({ path: from }))\n return Effect.try({\n try: () => {\n const requested = resolveKey(to, false) ?? key(to)\n const destination =\n nodes.get(requested)?.type === \"directory\"\n ? path.posix.join(requested, path.posix.basename(source))\n : requested\n if (node.type === \"directory\" && destination.startsWith(`${source}/`)) {\n throw new Error(`Cannot move a directory into itself: ${from}`)\n }\n const existing = nodes.get(destination)\n if (node.type === \"directory\" && existing && existing.type !== \"directory\") {\n throw new Error(`Cannot overwrite a non-directory with a directory: ${to}`)\n }\n requireParent(destination)\n const moved = [...nodes.entries()].filter(([entry]) => entry === source || entry.startsWith(`${source}/`))\n for (const [entry] of moved) nodes.delete(entry)\n for (const [entry, child] of moved) nodes.set(`${destination}${entry.slice(source.length)}`, child)\n },\n catch: (cause) => failed(from, cause),\n })\n },\n mkdir: (value) => Effect.try({ try: () => mkdirSync(value), catch: (cause) => failed(value, cause) }),\n }\n\n const spawner = make((command) =>\n Effect.suspend(() => {\n const description = command._tag === \"StandardCommand\" ? command.command : \"pipeline\"\n return Effect.fail(\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"EnvironmentMemory\",\n method: \"spawn\",\n pathOrDescriptor: description,\n cause: failed(description, new Error(\"The memory driver cannot spawn processes\")),\n }),\n )\n }),\n )\n\n return {\n spawner,\n overrides,\n symlink: (target, value) =>\n Effect.try({\n try: () => {\n requireParent(value)\n nodes.set(resolveKey(value, false) ?? key(value), { type: \"symlink\", target, mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n }\n}\n\nexport * as EnvironmentMemory from \"./memory.js\"\n",
"import { CrossSpawnSpawner } from \"@opencode-ai/util/cross-spawn-spawner\"\nimport { makeLocationNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Files } from \"./files.js\"\nimport { makeFiles } from \"./index.js\"\nimport { makeLocalDriver } from \"./local.js\"\nimport { Location } from \"../location.js\"\nimport { Workspace } from \"../workspace.js\"\n\nexport interface Interface {\n readonly files: Files\n readonly spawner: ChildProcessSpawner[\"Service\"]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Environment\") {}\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n const location = yield* Location.Service\n const workspace = yield* Workspace.Service\n const driver = location.workspaceID\n ? yield* workspace.connect(location.workspaceID).pipe(\n // Environment has no error channel; an unknown or destroyed placement is a configuration defect by design.\n Effect.mapError(\n (cause) => new Error(`Failed to bind Environment to workspace ${location.workspaceID}`, { cause }),\n ),\n Effect.orDie,\n )\n : makeLocalDriver(spawner)\n return Service.of({ files: makeFiles(driver), spawner: driver.spawner })\n }),\n)\n\nexport const node = makeLocationNode({\n service: Service,\n layer,\n deps: [CrossSpawnSpawner.node, Location.node, Workspace.node],\n})\n\nexport * as EnvironmentService from \"./environment.js\"\n",
"export * as Environment from \"./index.js\"\n\nexport { type Driver } from \"./driver.js\"\nexport {\n type DirEntry,\n Failed,\n type FileInfo,\n type Files,\n type FilesImpl,\n type FileType,\n NotFound,\n typeFollowing,\n WrongKind,\n} from \"./files.js\"\nexport { execDefaults } from \"./exec-defaults.js\"\nexport { makeLocalDriver } from \"./local.js\"\nexport { makeMemoryDriver, type MemoryDriver } from \"./memory.js\"\nexport { type Interface, node, Service } from \"./environment.js\"\n\nimport type { Driver } from \"./driver.js\"\nimport { execDefaults } from \"./exec-defaults.js\"\nimport type { Files } from \"./files.js\"\n\nexport const makeFiles = (driver: Driver): Files => ({\n ...execDefaults(driver.spawner),\n ...driver.overrides,\n})\n"
],
"mappings": "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",
"debugId": "5BA6DD7497B65E9264756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/mcp/list.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n"
],
"mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,EAAG,CACrC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,SACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO",
"debugId": "89DDBA589AB204AD64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/plugin/remove.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Config } from \"../../../config\"\nimport { resolveConfigPath } from \"../mcp/add\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.remove,\n Effect.fn(\"cli.plugin.remove\")(function* (input) {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const server = yield* Effect.promise(() => removePluginConfig(configPath, input.package))\n const config = yield* Config.Service\n const info = yield* config.get()\n const tui = configured(info.plugins, input.package)\n if (tui)\n yield* config.update((draft) => {\n draft.plugins = draft.plugins?.filter((entry) => !matches(entry, input.package))\n })\n\n const removed = [server ? configPath : undefined, tui ? config.path : undefined].filter(\n (file) => file !== undefined,\n )\n process.stdout.write(\n removed.length\n ? `Plugin \"${input.package}\" removed from ${removed.join(\", \")}${EOL}`\n : `Plugin \"${input.package}\" is not configured${EOL}`,\n )\n }),\n)\n\nexport async function removePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined\n throw error\n })\n if (text === undefined) return false\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (!configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(\n text,\n [\"plugins\"],\n plugins?.filter((entry) => !matches(entry, spec)),\n {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n },\n ),\n )\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some((entry) => matches(entry, spec)) ?? false\n}\n\nfunction matches(entry: unknown, spec: string) {\n return entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec)\n}\n"
],
"mappings": ";itBAAA,cAAS,WAET,mBAAS,YAAU,eAAQ,oBAS3B,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,OAClC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAmB,EAAY,EAAM,OAAO,CAAC,EAClF,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAM,EAAW,EAAK,QAAS,EAAM,OAAO,EAClD,GAAI,EACF,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,EAAM,QAAU,EAAM,SAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,EAAM,OAAO,CAAC,EAChF,EAEH,IAAM,EAAU,CAAC,EAAS,EAAa,OAAW,EAAM,EAAO,KAAO,MAAS,EAAE,OAC/E,CAAC,IAAS,IAAS,MACrB,EACA,QAAQ,OAAO,MACb,EAAQ,OACJ,WAAW,EAAM,yBAAyB,EAAQ,KAAK,IAAI,IAAI,IAC/D,WAAW,EAAM,6BAA6B,GACpD,EACD,CACH,EAEA,eAAsB,CAAkB,CAAC,EAAoB,EAAc,CACzE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,OAC/F,MAAM,EACP,EACD,GAAI,IAAS,OAAW,MAAO,GAC/B,IAAM,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,CAAC,EAAW,EAAS,CAAI,EAAG,MAAO,GAEvC,IAAM,EAAU,EACd,EACA,EACE,EACA,CAAC,SAAS,EACV,GAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,CAAI,CAAC,EAChD,CACE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CACF,CACF,EACM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KAAK,CAAC,IAAU,EAAQ,EAAO,CAAI,CAAC,GAAK,GAG3D,SAAS,CAAO,CAAC,EAAgB,EAAc,CAC7C,OAAO,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,MAAQ,YAAa,GAAS,EAAM,UAAY",
"debugId": "AABB0F36D3B15AA864756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/commands/handlers/pair.ts"],
"sourcesContent": [
"import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n"
],
"mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH",
"debugId": "29ED20E3B659990464756E2164756E21",
"names": []
}

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

{
"version": 3,
"sources": ["../protocol/src/client.ts"],
"sourcesContent": [
"import { InvalidRequestError, SessionNotFoundError } from \"./errors.js\"\nimport { makeDefaultApi } from \"./api.js\"\nimport type { Api } from \"./api.js\"\nimport type { Context } from \"effect\"\nimport { HttpApiMiddleware } from \"effect/unstable/httpapi\"\nimport type { EventGroup } from \"./groups/event.js\"\n\nclass LocationMiddleware extends HttpApiMiddleware.Service<LocationMiddleware>()(\n \"@opencode-ai/client/LocationMiddleware\",\n) {}\n\nclass SessionLocationMiddleware extends HttpApiMiddleware.Service<SessionLocationMiddleware>()(\n \"@opencode-ai/client/SessionLocationMiddleware\",\n { error: [InvalidRequestError, SessionNotFoundError] },\n) {}\n\ntype ClientApiShape = Api<\n Context.Service.Identifier<typeof LocationMiddleware>,\n Context.Service.Shape<typeof LocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n typeof EventGroup\n>\n\nexport const ClientApi: ClientApiShape = makeDefaultApi({\n locationMiddleware: LocationMiddleware,\n // The real server uses a form-specific middleware with an undocumented `global` sentinel branch.\n // The generated client only needs a middleware identity for API typing.\n formLocationMiddleware: SessionLocationMiddleware,\n sessionLocationMiddleware: SessionLocationMiddleware,\n})\n\nexport const groupNames = {\n \"server.health\": \"health\",\n \"server.server\": \"server\",\n \"server.debug\": \"debug\",\n \"server.migration\": \"migration\",\n \"server.location\": \"location\",\n \"server.agent\": \"agent\",\n \"server.plugin\": \"plugin\",\n \"server.session\": \"session\",\n \"server.message\": \"message\",\n \"server.model\": \"model\",\n \"server.generate\": \"generate\",\n \"server.provider\": \"provider\",\n \"server.integration\": \"integration\",\n \"server.websearch\": \"websearch\",\n \"server.credential\": \"credential\",\n \"server.form\": \"form\",\n \"server.permission\": \"permission\",\n \"server.fs\": \"file\",\n \"server.command\": \"command\",\n \"server.skill\": \"skill\",\n \"server.event\": \"event\",\n \"server.pty\": \"pty\",\n \"server.shell\": \"shell\",\n \"server.mcp\": \"mcp\",\n \"server.reference\": \"reference\",\n \"server.project\": \"project\",\n \"server.worktree\": \"worktree\",\n \"server.vcs\": \"vcs\",\n \"server.config\": \"config\",\n} as const\n\nexport const promiseOmitEndpoints = new Set([\"pty.connect\"])\nexport const effectOmitEndpoints = new Set([\"fs.read\", \"pty.connect\"])\n"
],
"mappings": ";giCAOA,MAAM,UAA2B,EAAkB,QAA4B,EAC7E,wCACF,CAAE,CAAC,CAEH,MAAM,UAAkC,EAAkB,QAAmC,EAC3F,gDACA,CAAE,MAAO,CAAC,EAAqB,CAAoB,CAAE,CACvD,CAAE,CAAC,CAYI,IAAM,EAA4B,EAAe,CACtD,mBAAoB,EAGpB,uBAAwB,EACxB,0BAA2B,CAC7B,CAAC,EAEY,EAAa,CACxB,gBAAiB,SACjB,gBAAiB,SACjB,eAAgB,QAChB,mBAAoB,YACpB,kBAAmB,WACnB,eAAgB,QAChB,gBAAiB,SACjB,iBAAkB,UAClB,iBAAkB,UAClB,eAAgB,QAChB,kBAAmB,WACnB,kBAAmB,WACnB,qBAAsB,cACtB,mBAAoB,YACpB,oBAAqB,aACrB,cAAe,OACf,oBAAqB,aACrB,YAAa,OACb,iBAAkB,UAClB,eAAgB,QAChB,eAAgB,QAChB,aAAc,MACd,eAAgB,QAChB,aAAc,MACd,mBAAoB,YACpB,iBAAkB,UAClB,kBAAmB,WACnB,aAAc,MACd,gBAAiB,QACnB,EAEa,EAAuB,IAAI,IAAI,CAAC,aAAa,CAAC,EAC9C,EAAsB,IAAI,IAAI,CAAC,UAAW,aAAa,CAAC",
"debugId": "7BC06388B594A2EA64756E2164756E21",
"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(\n (yield* ServiceConfig.get(Option.getOrUndefined(input.key), Option.getOrUndefined(input.name))) + EOL,\n )\n }),\n)\n"
],
"mappings": ";02BAAA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,QAAQ,OAAO,OACZ,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,EAAG,EAAO,eAAe,EAAM,IAAI,CAAC,GAAK,CACpG,EACD,CACH",
"debugId": "214EE17A0676E5AB64756E2164756E21",
"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/auth/logout.ts"],
"sourcesContent": [
"import { autocomplete, intro, outro, spinner } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { IntegrationInfo } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { createClient, loadIntegrations, location, request, resolveIntegration } from \"./shared\"\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.logout,\n Effect.fn(\"cli.auth.logout\")((input) =>\n logout({\n target: Option.getOrUndefined(input.target),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst logout = Effect.fn(\"cli.auth.logout.run\")(function* (input: {\n target?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Remove credential\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integrations = yield* loadIntegrations(client)\n const integration = yield* chooseIntegration(integrations, input.target)\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n const environment = integration.connections\n .filter((connection) => connection.type === \"env\")\n .map((connection) => connection.name)\n if (environment.length) {\n yield* Effect.fail(\n new Error(\n `${integration.name} is authenticated through ${environment.join(\", \")}; unset the environment variable to disconnect`,\n ),\n )\n }\n yield* Effect.fail(new Error(`No stored credentials for ${integration.name}`))\n }\n const progress = spinner()\n progress.start(\"Removing credential...\")\n yield* Effect.forEach(\n credentials,\n (connection) =>\n request((signal) => client.credential.remove({ credentialID: connection.id, location }, { signal })),\n { concurrency: \"unbounded\", discard: true },\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Disconnected from ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Failed to remove credential\", 1))),\n )\n outro(\"Done\")\n})\n\nconst chooseIntegration = Effect.fn(\"cli.auth.logout.integration\")(function* (\n integrations: IntegrationInfo[],\n target?: string,\n) {\n if (target) return yield* resolveIntegration(integrations, target)\n const configured = integrations.filter((integration) =>\n integration.connections.some((connection) => connection.type === \"credential\"),\n )\n if (configured.length === 0) return yield* Effect.fail(new Error(\"No stored credentials found\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: configured.map((integration) => ({\n value: integration.id,\n label: integration.name,\n hint: integration.connections\n .filter((connection) => connection.type === \"credential\")\n .map((connection) => connection.label)\n .join(\", \"),\n })),\n }),\n )\n return yield* resolveIntegration(configured, id)\n})\n"
],
"mappings": ";2yCAQA,IAAe,IAAQ,QACrB,EAAS,SAAS,KAAK,SAAS,OAChC,EAAO,GAAG,iBAAiB,EAAE,CAAC,IAC5B,EAAO,CACL,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EAAE,KAAK,CAAkB,CAC5B,CACF,EAEM,EAAS,EAAO,GAAG,qBAAqB,EAAE,SAAU,CAAC,EAIxD,CACD,GAAI,CAAC,EAAM,OACT,MAAO,EAAmB,6EAA6E,EACzG,EAAM,mBAAmB,EACzB,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAM,OAAQ,WAAY,EAAM,UAAW,CAAC,EACnF,EAAe,MAAO,EAAiB,CAAM,EAC7C,EAAc,MAAO,EAAkB,EAAc,EAAM,MAAM,EACjE,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,IAAM,EAAc,EAAY,YAC7B,OAAO,CAAC,IAAe,EAAW,OAAS,KAAK,EAChD,IAAI,CAAC,IAAe,EAAW,IAAI,EACtC,GAAI,EAAY,OACd,MAAO,EAAO,KACR,MACF,GAAG,EAAY,iCAAiC,EAAY,KAAK,IAAI,iDACvE,CACF,EAEF,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAY,MAAM,CAAC,EAE/E,IAAM,EAAW,EAAQ,EACzB,EAAS,MAAM,wBAAwB,EACvC,MAAO,EAAO,QACZ,EACA,CAAC,IACC,EAAQ,CAAC,IAAW,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EACrG,CAAE,YAAa,YAAa,QAAS,EAAK,CAC5C,EAAE,KACA,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,qBAAqB,EAAY,MAAM,CAAC,CAAC,EAC1F,EAAO,SAAS,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,8BAA+B,CAAC,CAAC,CAAC,CAC1F,EACA,EAAM,MAAM,EACb,EAEK,EAAoB,EAAO,GAAG,6BAA6B,EAAE,SAAU,CAC3E,EACA,EACA,CACA,GAAI,EAAQ,OAAO,MAAO,EAAmB,EAAc,CAAM,EACjE,IAAM,EAAa,EAAa,OAAO,CAAC,IACtC,EAAY,YAAY,KAAK,CAAC,IAAe,EAAW,OAAS,YAAY,CAC/E,EACA,GAAI,EAAW,SAAW,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,6BAA6B,CAAC,EAC/F,IAAM,EAAK,MAAO,EAAe,IAC/B,EAAa,CACX,QAAS,qBACT,SAAU,EACV,QAAS,EAAW,IAAI,CAAC,KAAiB,CACxC,MAAO,EAAY,GACnB,MAAO,EAAY,KACnB,KAAM,EAAY,YACf,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACvD,IAAI,CAAC,IAAe,EAAW,KAAK,EACpC,KAAK,IAAI,CACd,EAAE,CACJ,CAAC,CACH,EACA,OAAO,MAAO,EAAmB,EAAY,CAAE,EAChD",
"debugId": "4B6EAF6059DE1C9364756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["../tui/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 drives the same\n// presentation commits and footer actions as the live transport. This\n// lets you test scrollback formatting, permission UI, canonical Form 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// /form [kind] → triggers a canonical Form request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, shell,\n// write, edit, patch, subagent, question, error, mix)\n//\n// Demo mode handles permission and Form replies locally, completing or failing\n// the synthetic tool parts through the same callbacks used by the live footer.\nimport path from \"path\"\nimport type { JsonValue, SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { parseSlashHead } from \"../prompt/parse\"\nimport { writeSessionOutput } from \"./stream\"\nimport { toolCommit, toolFinalPhase } from \"./stream-v2.subagent\"\nimport type {\n FooterApi,\n FooterView,\n FormCancel,\n FormReply,\n MiniFormRequest,\n MiniPermissionRequest,\n PermissionReply,\n RunPrompt,\n StreamCommit,\n} from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"shell\",\n \"write\",\n \"edit\",\n \"patch\",\n \"subagent\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"shell\", \"read\", \"subagent\", \"external\", \"doom\"] as const\nconst FORMS = [\"question\", \"external\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype FormKind = (typeof FORMS)[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 formKind(value: string | undefined): FormKind | undefined {\n const next = (value || \"question\").toLowerCase()\n return FORMS.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 call: string\n tool: string\n input: Record<string, JsonValue>\n start: number\n}\n\ntype FormRequest = {\n ref: Ref\n kind: FormKind\n request: MiniFormRequest\n}\n\ntype Perm = {\n ref: Ref\n done: {\n output: string\n metadata?: Record<string, JsonValue>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: MiniPermissionRequest[\"metadata\"]\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n footer: FooterApi\n msg: number\n part: number\n call: number\n perm: number\n form: number\n perms: Map<string, Perm>\n forms: Map<string, FormRequest>\n started: Set<string>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\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 forms: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n },\n ],\n details: {\n [input.sessionID]: {\n commits: input.commits,\n },\n },\n permissions: [],\n forms: [],\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\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction present(state: State, commits: StreamCommit[], view?: FooterView): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits,\n updates: view\n ? [\n {\n type: \"stream.patch\" as const,\n patch: { status: view.type === \"permission\" ? \"awaiting permission\" : \"awaiting form\" },\n },\n { type: \"stream.view\" as const, view },\n ]\n : undefined,\n },\n )\n}\n\nfunction clearBlocker(state: State): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits: [],\n updates: [\n { type: \"stream.patch\", patch: { status: \"\" } },\n { type: \"stream.view\", view: { type: \"prompt\" } },\n ],\n },\n )\n}\n\nfunction open(state: State): string {\n return take(state, \"msg\", \"msg\")\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 for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n present(state, [\n { kind: \"assistant\", source: \"assistant\", text: item, phase: \"progress\", messageID: msg, partID: part },\n ])\n await wait(45, signal)\n }\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 let first = true\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n if (state.thinking) {\n present(state, [\n {\n kind: \"reasoning\",\n source: \"reasoning\",\n text: first ? `Thinking: ${item.replace(/\\[REDACTED\\]/g, \"\")}` : item.replace(/\\[REDACTED\\]/g, \"\"),\n phase: \"progress\",\n messageID: msg,\n partID: part,\n },\n ])\n first = false\n }\n await wait(45, signal)\n }\n}\n\nfunction make(state: State, tool: string, input: Record<string, JsonValue>): Ref {\n return {\n msg: open(state),\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, JsonValue> = {}): SessionMessageAssistantTool {\n state.started.add(ref.call)\n const part = {\n type: \"tool\" as const,\n id: ref.call,\n name: ref.tool,\n state: { status: \"running\" as const, input: ref.input, metadata },\n time: { created: ref.start, ran: ref.start },\n }\n present(state, [toolCommit(part, ref.msg, \"start\")])\n return part\n}\n\nfunction askPermission(state: State, item: Permit): void {\n const tool = 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 present(state, [], {\n type: \"permission\",\n request: {\n id,\n sessionID: state.id,\n action: item.permission,\n resources: item.patterns,\n metadata: item.metadata ?? {},\n save: item.always,\n source: { type: \"tool\", messageID: item.ref.msg, id: item.ref.call },\n tool,\n },\n })\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n output: string\n metadata?: Record<string, JsonValue>\n },\n): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n const part: SessionMessageAssistantTool = {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n content: [{ type: \"text\", text: output.output }],\n metadata: output.metadata,\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n }\n present(state, [toolCommit(part, ref.msg, toolFinalPhase(part))])\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n present(state, [\n toolCommit(\n {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error: { type: \"unknown\", message: error },\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n },\n ref.msg,\n \"final\",\n ),\n ])\n}\n\nfunction emitError(state: State, text: string): void {\n present(state, [{ kind: \"error\", source: \"system\", text, phase: \"start\" }])\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"shell\", {\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 output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exit: 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 path: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\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 path: file,\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n file,\n status: \"modified\",\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\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 output: \"\",\n metadata: {\n files: [\n {\n status: \"modified\",\n file,\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n status: \"added\",\n file: path.join(process.cwd(), \"README-demo.md\"),\n patch: \"@@ -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, \"subagent\", {\n description: \"Scan run/* for reducer touchpoints\",\n agent: \"explore\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n sessionID: \"ses_demo_child\",\n status: \"completed\",\n output: \"\",\n },\n })\n const part = {\n type: \"tool\",\n id: \"sub_demo_call_1\",\n name: \"read\",\n state: {\n status: \"running\",\n input: {\n path: \"packages/tui/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n metadata: {},\n },\n time: { created: Date.now(), ran: Date.now() },\n } satisfies SessionMessageAssistantTool\n showSubagent(state, {\n sessionID: \"ses_demo_child\",\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\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 toolCommit(part, \"sub_demo_msg_tool\", \"start\"),\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 custom: 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 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 === \"shell\") {\n const command = \"git status --short\"\n const ref = make(state, \"shell\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"shell\",\n patterns: [command],\n always: [\"*\"],\n done: {\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exit: 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 path: 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 output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"subagent\") {\n const ref = make(state, \"subagent\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n agent: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"subagent\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n output: \"\",\n metadata: {\n sessionID: \"sub_demo_perm_1\",\n status: \"completed\",\n output: \"\",\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 path: 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 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, \"subagent\", {\n description: \"Retry the formatter after repeated failures\",\n agent: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\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 path: file,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n output: \"\",\n metadata: {\n files: [{ file, status: \"modified\", patch: diff }],\n },\n },\n })\n}\n\nfunction demoForm(kind: FormKind): { title: string; fields: MiniFormRequest[\"fields\"]; questions?: JsonValue[] } {\n if (kind === \"question\") {\n const questions: JsonValue[] = [\n {\n header: \"Layout\",\n question: \"Which footer view should be the reference for spacing checks?\",\n options: [\n { label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: true,\n },\n {\n header: \"Checks\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit an edit diff\" },\n { label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n return {\n title: \"Questions\",\n questions,\n fields: [\n {\n key: \"q0\",\n title: \"Layout\",\n description: \"Which footer view should be the reference for spacing checks?\",\n type: \"string\",\n options: [\n { value: \"Form\", label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { value: \"Prompt\", label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n custom: true,\n },\n {\n key: \"q1\",\n title: \"Checks\",\n description: \"Pick formatting previews\",\n type: \"multiselect\",\n options: [\n { value: \"Diff\", label: \"Diff\", description: \"Emit an edit diff\" },\n { value: \"Subagent\", label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n custom: true,\n },\n ],\n }\n }\n return {\n title: \"MCP authorization\",\n fields: [\n {\n key: \"authorization\",\n type: \"external\",\n url: \"https://example.com/opencode-demo\",\n title: \"Authorize demo MCP server\",\n description: \"Complete authorization in your browser\",\n },\n ],\n }\n}\n\nfunction emitForm(state: State, kind: FormKind = \"question\"): void {\n const form = demoForm(kind)\n const ref = make(state, kind === \"question\" ? \"question\" : \"mcp_demo\", {\n ...(form.questions ? { questions: form.questions } : { form: kind }),\n })\n startTool(state, ref)\n state.form++\n const request: MiniFormRequest = {\n id: `frm_demo_${state.form}`,\n sessionID: state.id,\n title: form.title,\n metadata:\n kind === \"question\"\n ? { kind: \"question\", tool: { messageID: ref.msg, id: ref.call } }\n : { kind: \"mcp\", message: `Synthetic ${kind} MCP elicitation` },\n fields: form.fields,\n }\n state.forms.set(request.id, { ref, kind, request })\n present(state, [], { type: \"form\", request })\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 === \"shell\") {\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 === \"subagent\") {\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 `- /form [kind] (${FORMS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission shell\",\n \"- /form question\",\n \"- /form external\",\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 footer: input.footer,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n form: 0,\n perms: new Map(),\n forms: new Map(),\n started: new Set(),\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 head = parseSlashHead(text)\n const list = head?.arguments.split(/\\s+/).filter(Boolean) ?? []\n const cmd = head ? `/${head.name}` : \"\"\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[0])\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 === \"/form\") {\n const kind = formKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a form kind: ${FORMS.join(\", \")}`)\n return true\n }\n\n emitForm(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[0] || \"\").toLowerCase()\n const body = list.slice(1).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 clearBlocker(state)\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 formReply = (input: FormReply): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n if (form.kind === \"question\") {\n doneTool(state, form.ref, {\n output: \"\",\n metadata: {\n answers: form.request.fields.map((field) => {\n const value = input.answer[field.key]\n if (value === undefined) return []\n return Array.isArray(value) ? [...value] : [String(value)]\n }),\n },\n })\n return true\n }\n doneTool(state, form.ref, {\n output: `Form submitted: ${Object.entries(input.answer)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\", \") : String(value)}`)\n .join(\"; \")}\\n`,\n metadata: { answer: input.answer },\n })\n return true\n }\n\n const formCancel = (input: FormCancel): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n failTool(state, form.ref, \"form cancelled\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n formReply,\n formCancel,\n }\n}\n"
],
"mappings": "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",
"debugId": "11082F80DBD16FAB64756E2164756E21",
"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/plugin/add.ts"],
"sourcesContent": [
"import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Npm } from \"@opencode-ai/util/npm\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { resolveConfigPath } from \"../mcp/add\"\nimport { Config } from \"../../../config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.add,\n Effect.fn(\"cli.plugin.add\")(function* (input) {\n if (!(yield* Effect.promise(() => Npm.isRegistryPackage(input.package))))\n return yield* Effect.fail(\n new Error(\"Plugin target must be an npm registry package name, version, tag, or semver range\"),\n )\n const npm = yield* Npm.Service\n const installed = yield* npm.add(input.package, { subpaths: [\"server\", \"\"] })\n const tui = yield* npm.resolve(input.package, { subpaths: [\"tui\"] })\n const target = configurationTarget(installed.entrypoint, tui.entrypoint)\n if (!target)\n return yield* Effect.fail(new Error(`Plugin package has no server or TUI entrypoint: ${input.package}`))\n\n if (target === \"server\") {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const changed = yield* Effect.promise(() => writePluginConfig(configPath, input.package))\n process.stdout.write(\n changed\n ? `Plugin \"${input.package}\" installed and added to ${configPath}${EOL}`\n : `Plugin \"${input.package}\" is already configured in ${configPath}${EOL}`,\n )\n return\n }\n\n const config = yield* Config.Service\n yield* config.update((draft) => {\n if (configured(draft.plugins, input.package)) return\n draft.plugins = [...(draft.plugins ?? []), input.package]\n })\n process.stdout.write(`TUI plugin \"${input.package}\" installed and added to ${config.path}${EOL}`)\n }),\n)\n\nexport function configurationTarget(server?: string, tui?: string) {\n if (server) return \"server\" as const\n if (tui) return \"tui\" as const\n}\n\nexport async function writePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(text, [\"plugins\"], [...(plugins ?? []), spec], { formattingOptions: { tabSize: 2, insertSpaces: true } }),\n )\n await mkdir(path.dirname(configPath), { recursive: true })\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some(\n (entry) =>\n entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec),\n )\n}\n"
],
"mappings": ";8tBAAA,cAAS,WACT,oBACA,gBAAS,cAAO,YAAU,eAAQ,oBAUlC,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,IAClC,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,GAAI,EAAE,MAAO,EAAO,QAAQ,IAAM,EAAI,kBAAkB,EAAM,OAAO,CAAC,GACpE,OAAO,MAAO,EAAO,KACf,MAAM,mFAAmF,CAC/F,EACF,IAAM,EAAM,MAAO,EAAI,QACjB,EAAY,MAAO,EAAI,IAAI,EAAM,QAAS,CAAE,SAAU,CAAC,SAAU,EAAE,CAAE,CAAC,EACtE,EAAM,MAAO,EAAI,QAAQ,EAAM,QAAS,CAAE,SAAU,CAAC,KAAK,CAAE,CAAC,EAC7D,EAAS,EAAoB,EAAU,WAAY,EAAI,UAAU,EACvE,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,mDAAmD,EAAM,SAAS,CAAC,EAEzG,GAAI,IAAW,SAAU,CACvB,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAY,EAAM,OAAO,CAAC,EACxF,QAAQ,OAAO,MACb,EACI,WAAW,EAAM,mCAAmC,IAAa,IACjE,WAAW,EAAM,qCAAqC,IAAa,GACzE,EACA,OAGF,IAAM,EAAS,MAAO,EAAO,QAC7B,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,GAAI,EAAW,EAAM,QAAS,EAAM,OAAO,EAAG,OAC9C,EAAM,QAAU,CAAC,GAAI,EAAM,SAAW,CAAC,EAAI,EAAM,OAAO,EACzD,EACD,QAAQ,OAAO,MAAM,eAAe,EAAM,mCAAmC,EAAO,OAAO,GAAK,EACjG,CACH,EAEO,SAAS,CAAmB,CAAC,EAAiB,EAAc,CACjE,GAAI,EAAQ,MAAO,SACnB,GAAI,EAAK,MAAO,MAGlB,eAAsB,CAAiB,CAAC,EAAoB,EAAc,CACxE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,EAAW,EAAS,CAAI,EAAG,MAAO,GAEtC,IAAM,EAAU,EACd,EACA,EAAO,EAAM,CAAC,SAAS,EAAG,CAAC,GAAI,GAAW,CAAC,EAAI,CAAI,EAAG,CAAE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CAAE,CAAC,CACjH,EACA,MAAM,EAAM,EAAK,QAAQ,CAAU,EAAG,CAAE,UAAW,EAAK,CAAC,EACzD,IAAM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KACd,CAAC,IACC,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,OAAQ,YAAa,IAAS,EAAM,UAAY,CAC9G",
"debugId": "F9822C0D465D4ECB64756E2164756E21",
"names": []
}
{
"version": 3,
"sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"],
"sourcesContent": [
"import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}",
"import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\nimport { errorMessage } from \"../../../util/error\"\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(() =>\n timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(Cause.squash(exit.cause))),\n ).pipe(Effect.ignore)\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n ...(server ? { answer: { server } } : {}),\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n"
],
"mappings": "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",
"debugId": "3D0BE8F1BB895E7264756E2164756E21",
"names": []
}

Sorry, the diff of this file is not supported yet