@opencode-ai/cli-linux-arm64
Advanced tools
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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,WAAO,OAAQ,UAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "6CCB32166631FBC064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,OAChD,MACH", | ||
| "debugId": "112215308F47398364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/editor.ts", "../tui/src/editor-zed-sqlite.bun.ts", "../tui/src/editor-zed.ts"], | ||
| "sourcesContent": [ | ||
| "import type { CliRenderer } from \"@opentui/core\"\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\"\nimport { readFile, rm, writeFile } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { spawn } from \"node:child_process\"\nimport type { Stream } from \"node:stream\"\nimport { resolveZedDbPath, resolveZedSelection } from \"./editor-zed\"\n\nexport { normalizePromptContent } from \"./prompt/content\"\n\ntype EditorStdio = \"inherit\" | \"pipe\" | \"ignore\" | number | Stream\n\nexport async function openEditor(input: { value: string; renderer: CliRenderer; cwd?: string; stdin?: EditorStdio }) {\n const editor = process.env.VISUAL || process.env.EDITOR\n if (!editor) return\n const file = path.join(os.tmpdir(), `${Date.now()}.md`)\n await writeFile(file, input.value)\n input.renderer.suspend()\n input.renderer.currentRenderBuffer.clear()\n try {\n await new Promise<void>((resolve, reject) => {\n const parts = editor.split(\" \")\n const child = spawn(parts[0]!, [...parts.slice(1), file], {\n cwd: input.cwd && existsSync(input.cwd) ? input.cwd : process.cwd(),\n stdio: [input.stdin ?? \"inherit\", \"inherit\", \"inherit\"],\n shell: process.platform === \"win32\",\n })\n child.on(\"error\", reject)\n child.on(\"exit\", (code, signal) => {\n if (code === 0) return resolve()\n reject(new Error(`Editor exited with ${signal ? `signal ${signal}` : `code ${code}`}`))\n })\n })\n return (await readFile(file, \"utf8\")) || undefined\n } finally {\n await rm(file, { force: true }).catch(() => {})\n input.renderer.currentRenderBuffer.clear()\n input.renderer.resume()\n input.renderer.requestRender()\n }\n}\n\nexport function discoverEditorConnection(directory: string) {\n const root = path.join(os.homedir(), \".claude\", \"ide\")\n const contains = (parent: string) => {\n const resolved = path.resolve(parent)\n const relative = path.relative(resolved, path.resolve(directory))\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) ? resolved.length : 0\n }\n try {\n return readdirSync(root)\n .filter((entry) => entry.endsWith(\".lock\"))\n .flatMap((entry) => {\n const file = path.join(root, entry)\n const port = Number.parseInt(path.basename(file, \".lock\"), 10)\n if (!Number.isInteger(port) || port <= 0 || port > 65535) return []\n try {\n const value = JSON.parse(readFileSync(file, \"utf8\")) as Record<string, unknown>\n if (value.transport !== undefined && value.transport !== \"ws\") return []\n const folders = Array.isArray(value.workspaceFolders)\n ? value.workspaceFolders.filter((item): item is string => typeof item === \"string\")\n : []\n const score = Math.max(0, ...folders.map(contains))\n if (!score) return []\n return [\n {\n url: `ws://127.0.0.1:${port}`,\n authToken: typeof value.authToken === \"string\" ? value.authToken : undefined,\n source: `lock:${port}`,\n score,\n mtime: statSync(file).mtimeMs,\n },\n ]\n } catch {\n return []\n }\n })\n .sort((left, right) => right.score - left.score || right.mtime - left.mtime)\n .map(({ url, authToken, source }) => ({ url, authToken, source }))[0]\n } catch {\n return undefined\n }\n}\n\nexport const editorIntegration = {\n connection: discoverEditorConnection,\n selection: (directory: string) => resolveZedSelection(resolveZedDbPath() ?? \"\", directory),\n}\n", | ||
| "export { Database } from \"bun:sqlite\"\n", | ||
| "import { Database } from \"#zed-sqlite\"\nimport { statSync } from \"node:fs\"\nimport { readFile as readFileAsync } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { Option, Schema } from \"effect\"\nimport type { EditorSelection } from \"./context/editor\"\n\nconst ZedEditorRowSchema = Schema.Struct({\n item_kind: Schema.String,\n editor_id: Schema.NullOr(Schema.Number),\n workspace_id: Schema.Number,\n workspace_paths: Schema.NullOr(Schema.String),\n timestamp: Schema.String,\n buffer_path: Schema.NullOr(Schema.String),\n})\n\nconst ZedSelectionRowSchema = Schema.Struct({\n selection_start: Schema.NullOr(Schema.Number),\n selection_end: Schema.NullOr(Schema.Number),\n})\n\nconst ZedEditorContentsSchema = Schema.Struct({\n contents: Schema.NullOr(Schema.String),\n})\n\nconst decodeZedEditorRow = Schema.decodeUnknownOption(ZedEditorRowSchema)\nconst decodeZedSelectionRow = Schema.decodeUnknownOption(ZedSelectionRowSchema)\nconst decodeZedEditorContents = Schema.decodeUnknownOption(ZedEditorContentsSchema)\n\nconst utf8 = new TextEncoder()\n\ntype ZedEditorRow = Schema.Schema.Type<typeof ZedEditorRowSchema>\ntype ZedActiveEditorRow = ZedEditorRow & { item_kind: \"Editor\"; editor_id: number }\n\nexport type ZedSelectionResult =\n | { type: \"selection\"; selection: EditorSelection }\n | { type: \"empty\" }\n | { type: \"unavailable\" }\n\nexport async function resolveZedSelection(dbPath: string, cwd = process.cwd()): Promise<ZedSelectionResult> {\n const active = queryZedActiveEditor(dbPath, cwd)\n if (active.type !== \"row\") return active\n\n const row = active.row\n if (!row.buffer_path) return { type: \"empty\" }\n\n const selections = queryZedEditorSelections(dbPath, row)\n if (selections.type !== \"selections\") return selections\n const byteRanges = selections.selections\n .flatMap((selection) => {\n if (selection.selection_start == null || selection.selection_end == null) return []\n return [\n {\n start: Math.min(selection.selection_start, selection.selection_end),\n end: Math.max(selection.selection_start, selection.selection_end),\n },\n ]\n })\n .sort((left, right) => left.start - right.start || left.end - right.end)\n if (byteRanges.length === 0) return { type: \"unavailable\" }\n\n const contents = queryZedEditorContents(dbPath, row)\n const text =\n contents.type === \"contents\" && contents.contents != null\n ? contents.contents\n : await readFileAsync(row.buffer_path, \"utf8\").catch(() => undefined)\n if (text == null) return { type: \"unavailable\" }\n\n const ranges = byteRanges.map((range) => {\n const startOffset = utf8ByteOffsetToStringIndex(text, range.start)\n const endOffset = utf8ByteOffsetToStringIndex(text, range.end)\n return {\n text: text.slice(startOffset, endOffset),\n selection: offsetsToSelection(text, startOffset, endOffset),\n }\n })\n\n return {\n type: \"selection\",\n selection: {\n filePath: row.buffer_path,\n source: \"zed\",\n ranges,\n },\n }\n}\n\nfunction queryZedActiveEditor(dbPath: string, cwd: string) {\n let db: Database | undefined\n try {\n db = new Database(dbPath, { readonly: true })\n const raw = db\n .query(\n `select\n i.kind as item_kind,\n e.item_id as editor_id,\n i.workspace_id as workspace_id,\n w.paths as workspace_paths,\n w.timestamp as timestamp,\n e.buffer_path as buffer_path\n from items i\n join panes p on p.pane_id = i.pane_id and p.workspace_id = i.workspace_id\n join workspaces w on w.workspace_id = i.workspace_id\n left join editors e on e.item_id = i.item_id and e.workspace_id = i.workspace_id\n where i.active = 1 and p.active = 1\n order by w.timestamp desc`,\n )\n .all()\n\n const rows = raw.flatMap((row) => {\n const parsed = decodeZedEditorRow(row)\n return Option.isSome(parsed) ? [parsed.value] : []\n })\n\n if (raw.length > 0 && rows.length === 0) return { type: \"unavailable\" as const }\n\n const row = rows\n .map((row) => ({ row, score: scoreZedWorkspace(row.workspace_paths, cwd) }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score || right.row.timestamp.localeCompare(left.row.timestamp))[0]?.row\n if (!row) return { type: \"empty\" as const }\n if (row.item_kind !== \"Editor\") return { type: \"unavailable\" as const }\n if (!isZedActiveEditorRow(row)) return { type: \"empty\" as const }\n return { type: \"row\" as const, row }\n } catch {\n return { type: \"unavailable\" as const }\n } finally {\n db?.close()\n }\n}\n\nfunction queryZedEditorSelections(dbPath: string, row: ZedActiveEditorRow) {\n let db: Database | undefined\n try {\n db = new Database(dbPath, { readonly: true })\n const raw = db\n .query(\n `select\n start as selection_start,\n end as selection_end\n from editor_selections\n where editor_id = $editorID and workspace_id = $workspaceID`,\n )\n .all({ $editorID: row.editor_id, $workspaceID: row.workspace_id })\n\n const selections = raw.flatMap((selection) => {\n const parsed = decodeZedSelectionRow(selection)\n return Option.isSome(parsed) ? [parsed.value] : []\n })\n\n if (raw.length > 0 && selections.length === 0) return { type: \"unavailable\" as const }\n return { type: \"selections\" as const, selections }\n } catch {\n return { type: \"unavailable\" as const }\n } finally {\n db?.close()\n }\n}\n\nfunction queryZedEditorContents(dbPath: string, row: ZedActiveEditorRow) {\n let db: Database | undefined\n try {\n db = new Database(dbPath, { readonly: true })\n const parsed = decodeZedEditorContents(\n db\n .query(\n `select contents\n from editors\n where item_id = $editorID and workspace_id = $workspaceID`,\n )\n .get({ $editorID: row.editor_id, $workspaceID: row.workspace_id }),\n )\n if (Option.isNone(parsed)) return { type: \"unavailable\" as const }\n return { type: \"contents\" as const, contents: parsed.value.contents }\n } catch {\n return { type: \"unavailable\" as const }\n } finally {\n db?.close()\n }\n}\n\nfunction isZedActiveEditorRow(row: ZedEditorRow): row is ZedActiveEditorRow {\n return row.item_kind === \"Editor\" && row.editor_id != null\n}\n\nexport function resolveZedDbPath() {\n const candidates = [\n process.env.OPENCODE_ZED_DB,\n path.join(os.homedir(), \"Library\", \"Application Support\", \"Zed\", \"db\", \"0-stable\", \"db.sqlite\"),\n path.join(os.homedir(), \".local\", \"share\", \"zed\", \"db\", \"0-stable\", \"db.sqlite\"),\n ].filter((item): item is string => Boolean(item))\n\n return candidates.find((item) => isFile(item))\n}\n\nexport function isZedTerminal() {\n return process.env.ZED_TERM === \"true\" || process.env.TERM_PROGRAM?.toLowerCase() === \"zed\"\n}\n\nfunction isFile(item: string) {\n try {\n return statSync(item).isFile()\n } catch {\n return false\n }\n}\n\nfunction scoreZedWorkspace(workspacePaths: string | null, cwd: string) {\n return zedWorkspacePaths(workspacePaths).reduce((score, item) => {\n if (pathContains(item, cwd)) return Math.max(score, path.resolve(item).length)\n return score\n }, 0)\n}\n\nfunction zedWorkspacePaths(value: string | null) {\n if (!value) return []\n const parsed = parseJson(value)\n if (Array.isArray(parsed)) return parsed.filter((item): item is string => typeof item === \"string\")\n return value.split(/\\r?\\n/).filter(Boolean)\n}\n\nexport function offsetToPosition(text: string, offset: number) {\n const stringOffset = utf8ByteOffsetToStringIndex(text, offset)\n return offsetsToSelection(text, stringOffset, stringOffset).start\n}\n\nfunction utf8ByteOffsetToStringIndex(text: string, byteOffset: number) {\n if (byteOffset <= 0) return 0\n\n let bytes = 0\n for (let index = 0; index < text.length; ) {\n const codePoint = text.codePointAt(index)\n if (codePoint === undefined) return text.length\n\n const nextIndex = index + (codePoint > 0xffff ? 2 : 1)\n bytes += utf8.encode(text.slice(index, nextIndex)).length\n if (bytes >= byteOffset) return nextIndex\n index = nextIndex\n }\n\n return text.length\n}\n\nfunction offsetsToSelection(text: string, startOffset: number, endOffset: number) {\n const start = Math.max(0, Math.min(startOffset, text.length))\n const end = Math.max(0, Math.min(endOffset, text.length))\n let line = 1\n let lineStart = 0\n let startPosition = position(line, lineStart, start)\n let endPosition = position(line, lineStart, end)\n\n for (let index = 0; index <= end; index++) {\n if (index === start) startPosition = position(line, lineStart, index)\n if (index === end) {\n endPosition = position(line, lineStart, index)\n break\n }\n if (text[index] === \"\\n\") {\n line += 1\n lineStart = index + 1\n }\n }\n\n return { start: startPosition, end: endPosition }\n}\n\nfunction position(line: number, lineStart: number, offset: number) {\n return {\n line,\n character: offset - lineStart + 1,\n }\n}\n\nfunction pathContains(parent: string, child: string) {\n const relative = path.relative(path.resolve(parent), path.resolve(child))\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n}\n\nfunction parseJson(value: string) {\n try {\n return JSON.parse(value) as unknown\n } catch {\n return\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "44C0AB133CF4859764756E2164756E21", | ||
| "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\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";+1BAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,gBAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "B701B8FAB352164664756E2164756E21", | ||
| "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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,OAAQ,WAAO,OAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "055D60FE9B7FB22264756E2164756E21", | ||
| "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(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ojCAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,OAC/D,OAAW,WAAO,OAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH", | ||
| "debugId": "D62610C27CA74EBF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/runtime.queue.ts"], | ||
| "sourcesContent": [ | ||
| "// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and queue up\n// here. The queue drains one turn at a time; ordinary prompts waiting behind\n// an active ordinary turn are exposed for edit/removal until they begin.\n//\n// The queue also handles /exit, /quit, and /new commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { ascending } from \"@opencode-ai/schema/identifier\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport { isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, FooterQueuedPrompt, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype Deferred<T = void> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (error?: unknown) => void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt) => void\n onNewSession?: () => void | Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n queued: FooterQueuedPrompt[]\n active?: RunPrompt\n ctrl?: AbortController\n closed: boolean\n}\n\nfunction defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (error?: unknown) => void\n const promise = new Promise<T>((next, fail) => {\n resolve = next\n reject = fail\n })\n\n return { promise, resolve, reject }\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn remain local and\n// are exposed by the footer for edit/removal until their turn begins.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = defer<{ type: \"closed\" }>()\n const done = defer()\n const state: State = {\n queue: [],\n queued: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const syncQueue = () => {\n const queue = state.queue.length\n emit({ type: \"queue\", queue }, { queue })\n emit(\n {\n type: \"queued.prompts\",\n prompts: [...state.queued],\n },\n { queued: state.queued.length },\n )\n }\n\n const removeLocalQueued = (queued: FooterQueuedPrompt) => {\n if (!state.queued.includes(queued)) return\n state.queued = state.queued.filter((item) => item !== queued)\n syncQueue()\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n state.queued.length = 0\n state.ctrl?.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()\n if (!prompt) {\n continue\n }\n\n const queued = state.queued.find((item) => item.prompt === prompt)\n if (queued) removeLocalQueued(queued)\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n syncQueue()\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n )\n await input.onNewSession()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? queued?.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n {\n type: \"turn.send\",\n queue: state.queue.length,\n },\n {\n phase: \"running\",\n status: \"sending prompt\",\n queue: state.queue.length,\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n state.ctrl = ctrl\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent)\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n ctrl.abort()\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n } finally {\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n {\n type: \"turn.idle\",\n queue: state.queue.length,\n },\n {\n phase: \"idle\",\n status: \"\",\n queue: state.queue.length,\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n !active.command &&\n prompt.mode !== \"shell\" &&\n !prompt.command &&\n !isNewCommand(prompt.text)\n ) {\n const queued: FooterQueuedPrompt = {\n messageID: SessionMessage.ID.create(),\n partID: \"prt_\" + ascending(),\n prompt,\n }\n state.queued = [...state.queued, queued]\n state.queue.push(prompt)\n syncQueue()\n return\n }\n\n state.queue.push(prompt)\n syncQueue()\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n const offRemoveQueued = input.footer.onQueuedRemove((messageID) => {\n const queued = state.queued.find((item) => item.messageID === messageID)\n if (!queued) return false\n state.queue = state.queue.filter((prompt) => prompt !== queued.prompt)\n removeLocalQueued(queued)\n return true\n })\n\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n offRemoveQueued()\n close()\n await draining?.catch(() => {})\n }\n}\n" | ||
| ], | ||
| "mappings": ";uMA2CA,cAAS,MAAe,OAAgB,CACtC,IAAI,EACA,EAMJ,MAAO,CAAE,QALO,IAAI,QAAW,CAAC,EAAM,IAAS,CAC7C,EAAU,EACV,EAAS,EACV,EAEiB,UAAS,QAAO,EAQpC,eAAsB,CAAc,CAAC,EAAkC,CACrE,IAAM,EAAO,EAA0B,EACjC,EAAO,EAAM,EACb,EAAe,CACnB,MAAO,CAAC,EACR,OAAQ,CAAC,EACT,OAAQ,EAAM,OAAO,QACvB,EACI,EAEE,EAAO,CAAC,EAAmB,IAAiC,CAChE,EAAM,OAAO,MAAM,WAAY,CAAG,EAClC,EAAM,OAAO,MAAM,CAAI,GAGnB,EAAY,IAAM,CACtB,IAAM,EAAQ,EAAM,MAAM,OAC1B,EAAK,CAAE,KAAM,QAAS,OAAM,EAAG,CAAE,OAAM,CAAC,EACxC,EACE,CACE,KAAM,iBACN,QAAS,CAAC,GAAG,EAAM,MAAM,CAC3B,EACA,CAAE,OAAQ,EAAM,OAAO,MAAO,CAChC,GAGI,EAAoB,CAAC,IAA+B,CACxD,GAAI,CAAC,EAAM,OAAO,SAAS,CAAM,EAAG,OACpC,EAAM,OAAS,EAAM,OAAO,OAAO,CAAC,IAAS,IAAS,CAAM,EAC5D,EAAU,GAGN,EAAS,IAAM,CACnB,GAAI,CAAC,EAAM,QAAU,EACnB,OAGF,EAAK,QAAQ,GAGT,EAAQ,IAAM,CAClB,GAAI,EAAM,OACR,OAGF,EAAM,OAAS,GACf,EAAM,MAAM,OAAS,EACrB,EAAM,OAAO,OAAS,EACtB,EAAM,MAAM,MAAM,EAClB,EAAK,QAAQ,CAAE,KAAM,QAAS,CAAC,EAC/B,EAAO,GAGH,EAAQ,IAAM,CAClB,GAAI,GAAY,EAAM,QAAU,EAAM,MAAM,SAAW,EACrD,OAGF,GAAY,SAAY,CACtB,GAAI,CACF,MAAO,CAAC,EAAM,QAAU,EAAM,MAAM,OAAS,EAAG,CAC9C,IAAM,EAAS,EAAM,MAAM,MAAM,EACjC,GAAI,CAAC,EACH,SAGF,IAAM,EAAS,EAAM,OAAO,KAAK,CAAC,IAAS,EAAK,SAAW,CAAM,EACjE,GAAI,EAAQ,EAAkB,CAAM,EAEpC,GAAI,EAAO,OAAS,SAAW,EAAa,EAAO,IAAI,EAAG,CAExD,GADA,EAAU,EACN,CAAC,EAAM,aAAc,CACvB,EACE,CACE,KAAM,eACN,MAAO,CACL,OAAQ,0BACV,CACF,EACA,CACE,OAAQ,0BACV,CACF,EACA,SAGF,EACE,CACE,KAAM,eACN,MAAO,CACL,MAAO,UACP,OAAQ,uBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,CACE,MAAO,UACP,OAAQ,uBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,MAAM,EAAM,aAAa,EACzB,SAGF,IAAM,EACJ,EAAO,OAAS,QACZ,EACA,IACK,EACH,UAAW,EAAO,WAAa,GAAQ,WAAa,EAAe,GAAG,OAAO,CAC/E,EACN,EAAM,OAAS,EAEf,EACE,CACE,KAAM,YACN,MAAO,EAAM,MAAM,MACrB,EACA,CACE,MAAO,UACP,OAAQ,iBACR,MAAO,EAAM,MAAM,MACrB,CACF,EACA,IAAM,EAAQ,KAAK,IAAI,EACjB,EAAO,IAAI,gBACjB,EAAM,KAAO,EAEb,GAAI,CAEF,GADA,MAAM,EAAM,OAAO,KAAK,EACpB,EAAM,OACR,MAGF,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EAAS,CACb,KAAM,OACN,KAAM,EAAK,KACX,MAAO,QACP,OAAQ,SACR,UAAW,EAAK,SAClB,EACA,EAAM,OAAO,MAAM,YAAa,CAAM,EACtC,EAAM,OAAO,OAAO,CAAM,EAI5B,GAFA,EAAM,SAAS,CAAI,EAEf,EAAM,OACR,MAGF,IAAM,EAAO,EAAM,IAAI,EAAM,EAAK,MAAM,EAAE,KACxC,KAAO,CAAE,KAAM,MAAgB,GAC/B,CAAC,KAAW,CAAE,KAAM,QAAkB,OAAM,EAC9C,EAEM,EAAO,MAAM,QAAQ,KAAK,CAAC,EAAM,EAAK,OAAO,CAAC,EACpD,GAAI,EAAK,OAAS,SAAU,CAC1B,EAAK,MAAM,EACX,MAGF,GAAI,EAAK,OAAS,QAChB,MAAM,EAAK,aAEb,CACA,GAAI,EAAM,OAAS,EACjB,EAAM,KAAO,OAGf,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EAAW,EAAO,SAAS,KAAK,IAAI,EAAG,KAAK,IAAI,EAAI,CAAK,CAAC,EAChE,EACE,CACE,KAAM,gBACN,UACF,EACA,CACE,UACF,CACF,EAEF,EAAM,OAAS,SAGnB,MAAO,EAAO,CACd,EAAK,OAAO,CAAK,EACjB,cACA,CACA,EAAW,OACX,EACE,CACE,KAAM,YACN,MAAO,EAAM,MAAM,MACrB,EACA,CACE,MAAO,OACP,OAAQ,GACR,MAAO,EAAM,MAAM,MACrB,CACF,EAGF,EAAO,IACN,GAGC,EAAS,CAAC,IAAsB,CACpC,GAAI,CAAC,EAAO,KAAK,KAAK,GAAK,EAAM,OAC/B,OAGF,GAAI,EAAO,OAAS,SAAW,EAAc,EAAO,IAAI,EAAG,CACzD,EAAM,OAAO,MAAM,EACnB,OAGF,IAAM,EAAS,EAAM,OACrB,GACE,GACA,EAAO,OAAS,SAChB,CAAC,EAAO,SACR,EAAO,OAAS,SAChB,CAAC,EAAO,SACR,CAAC,EAAa,EAAO,IAAI,EACzB,CACA,IAAM,EAA6B,CACjC,UAAW,EAAe,GAAG,OAAO,EACpC,OAAQ,OAAS,EAAU,EAC3B,QACF,EACA,EAAM,OAAS,CAAC,GAAG,EAAM,OAAQ,CAAM,EACvC,EAAM,MAAM,KAAK,CAAM,EACvB,EAAU,EACV,OAKF,GAFA,EAAM,MAAM,KAAK,CAAM,EACvB,EAAU,EACN,EAAO,OAAS,SAAW,EAAa,EAAO,IAAI,EAAG,CACxD,EAAM,EACN,OAGF,EACE,CACE,KAAM,QACN,MAAO,EACT,EACA,CACE,MAAO,EACT,CACF,EACA,EAAM,GAGF,EAAY,EAAM,OAAO,SAAS,CAAC,IAAW,CAClD,EAAO,CAAM,EACd,EACK,EAAW,EAAM,OAAO,QAAQ,IAAM,CAC1C,EAAM,EACP,EACK,EAAkB,EAAM,OAAO,eAAe,CAAC,IAAc,CACjE,IAAM,EAAS,EAAM,OAAO,KAAK,CAAC,IAAS,EAAK,YAAc,CAAS,EACvE,GAAI,CAAC,EAAQ,MAAO,GAGpB,OAFA,EAAM,MAAQ,EAAM,MAAM,OAAO,CAAC,IAAW,IAAW,EAAO,MAAM,EACrE,EAAkB,CAAM,EACjB,GACR,EAED,GAAI,CACF,GAAI,EAAM,OACR,OAGF,EAAO,CACL,KAAM,EAAM,cAAgB,GAC5B,MAAO,CAAC,CACV,CAAC,EACD,EAAO,EACP,MAAM,EAAK,eACX,CACA,EAAU,EACV,EAAS,EACT,EAAgB,EAChB,EAAM,EACN,MAAM,GAAU,MAAM,IAAM,EAAE", | ||
| "debugId": "33AE96E91A992ECE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/prompt.shared.ts"], | ||
| "sourcesContent": [ | ||
| "// Pure state machine for the prompt input.\n//\n// Handles history ring navigation and prompt text helpers. All functions are\n// pure -- they take state in and return new state out, with no side effects.\n//\n// The history ring (PromptHistoryState) stores past prompts and tracks\n// the current browse position. When the user arrows up at cursor offset 0,\n// the current draft is saved and history begins. Arrowing past the end\n// restores the draft.\nexport { displayCharAt, displaySlice, mentionTriggerIndex } from \"@opencode-ai/tui/prompt/display\"\nimport { stringWidth } from \"@opencode-ai/tui/util/string-width\"\nimport type { RunPrompt } from \"./types\"\n\nconst HISTORY_LIMIT = 200\n\nexport type PromptHistoryState = {\n items: RunPrompt[]\n index: number | null\n draft: string\n}\n\nexport type PromptMove = {\n state: PromptHistoryState\n text?: string\n cursor?: number\n apply: boolean\n}\n\nexport function promptCopy(prompt: RunPrompt): RunPrompt {\n return {\n text: prompt.text,\n parts: structuredClone(prompt.parts),\n ...(prompt.mode ? { mode: prompt.mode } : {}),\n ...(prompt.command ? { command: prompt.command } : {}),\n }\n}\n\nexport function promptSame(a: RunPrompt, b: RunPrompt): boolean {\n return (\n a.mode === b.mode &&\n a.text === b.text &&\n JSON.stringify(a.parts) === JSON.stringify(b.parts) &&\n JSON.stringify(a.command) === JSON.stringify(b.command)\n )\n}\n\nexport function isExitCommand(input: string): boolean {\n const text = input.trim().toLowerCase()\n return text === \"/exit\" || text === \"/quit\" || text === \":q\"\n}\n\nexport function isNewCommand(input: string): boolean {\n return input.trim().toLowerCase() === \"/new\"\n}\n\nexport function createPromptHistory(items?: RunPrompt[]): PromptHistoryState {\n const list = (items ?? []).filter((item) => item.text.trim().length > 0).map(promptCopy)\n const next: RunPrompt[] = []\n for (const item of list) {\n if (next.length > 0 && promptSame(next[next.length - 1], item)) {\n continue\n }\n\n next.push(item)\n }\n\n return {\n items: next.slice(-HISTORY_LIMIT),\n index: null,\n draft: \"\",\n }\n}\n\nexport function pushPromptHistory(state: PromptHistoryState, prompt: RunPrompt): PromptHistoryState {\n if (!prompt.text.trim()) {\n return state\n }\n\n const next = promptCopy(prompt)\n if (state.items[state.items.length - 1] && promptSame(state.items[state.items.length - 1], next)) {\n return {\n ...state,\n index: null,\n draft: \"\",\n }\n }\n\n const items = [...state.items, next].slice(-HISTORY_LIMIT)\n return {\n ...state,\n items,\n index: null,\n draft: \"\",\n }\n}\n\nexport function movePromptHistory(state: PromptHistoryState, dir: -1 | 1, text: string, cursor: number): PromptMove {\n if (state.items.length === 0) {\n return { state, apply: false }\n }\n\n if (dir === -1 && cursor !== 0) {\n return { state, apply: false }\n }\n\n if (dir === 1 && cursor !== stringWidth(text)) {\n return { state, apply: false }\n }\n\n if (state.index === null) {\n if (dir === 1) {\n return { state, apply: false }\n }\n\n const idx = state.items.length - 1\n return {\n state: {\n ...state,\n index: idx,\n draft: text,\n },\n text: state.items[idx].text,\n cursor: 0,\n apply: true,\n }\n }\n\n const idx = state.index + dir\n if (idx < 0) {\n return { state, apply: false }\n }\n\n if (idx >= state.items.length) {\n return {\n state: {\n ...state,\n index: null,\n },\n text: state.draft,\n cursor: stringWidth(state.draft),\n apply: true,\n }\n }\n\n return {\n state: {\n ...state,\n index: idx,\n },\n text: state.items[idx].text,\n cursor: dir === -1 ? 0 : stringWidth(state.items[idx].text),\n apply: true,\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAaA,IAAM,EAAgB,IAef,SAAS,CAAU,CAAC,EAA8B,CACvD,MAAO,CACL,KAAM,EAAO,KACb,MAAO,gBAAgB,EAAO,KAAK,KAC/B,EAAO,KAAO,CAAE,KAAM,EAAO,IAAK,EAAI,CAAC,KACvC,EAAO,QAAU,CAAE,QAAS,EAAO,OAAQ,EAAI,CAAC,CACtD,EAGK,SAAS,CAAU,CAAC,EAAc,EAAuB,CAC9D,OACE,EAAE,OAAS,EAAE,MACb,EAAE,OAAS,EAAE,MACb,KAAK,UAAU,EAAE,KAAK,IAAM,KAAK,UAAU,EAAE,KAAK,GAClD,KAAK,UAAU,EAAE,OAAO,IAAM,KAAK,UAAU,EAAE,OAAO,EAInD,SAAS,CAAa,CAAC,EAAwB,CACpD,IAAM,EAAO,EAAM,KAAK,EAAE,YAAY,EACtC,OAAO,IAAS,SAAW,IAAS,SAAW,IAAS,KAGnD,SAAS,CAAY,CAAC,EAAwB,CACnD,OAAO,EAAM,KAAK,EAAE,YAAY,IAAM,OAGjC,SAAS,CAAmB,CAAC,EAAyC,CAC3E,IAAM,GAAQ,GAAS,CAAC,GAAG,OAAO,CAAC,IAAS,EAAK,KAAK,KAAK,EAAE,OAAS,CAAC,EAAE,IAAI,CAAU,EACjF,EAAoB,CAAC,EAC3B,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,GAAK,EAAW,EAAK,EAAK,OAAS,GAAI,CAAI,EAC3D,SAGF,EAAK,KAAK,CAAI,EAGhB,MAAO,CACL,MAAO,EAAK,MAAM,CAAC,CAAa,EAChC,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAuC,CAClG,GAAI,CAAC,EAAO,KAAK,KAAK,EACpB,OAAO,EAGT,IAAM,EAAO,EAAW,CAAM,EAC9B,GAAI,EAAM,MAAM,EAAM,MAAM,OAAS,IAAM,EAAW,EAAM,MAAM,EAAM,MAAM,OAAS,GAAI,CAAI,EAC7F,MAAO,IACF,EACH,MAAO,KACP,MAAO,EACT,EAGF,IAAM,EAAQ,CAAC,GAAG,EAAM,MAAO,CAAI,EAAE,MAAM,CAAC,CAAa,EACzD,MAAO,IACF,EACH,QACA,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAa,EAAc,EAA4B,CAClH,GAAI,EAAM,MAAM,SAAW,EACzB,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,IAAM,IAAW,EAC3B,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,GAAK,IAAW,EAAY,CAAI,EAC1C,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,EAAM,QAAU,KAAM,CACxB,GAAI,IAAQ,EACV,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,IAAM,EAAM,EAAM,MAAM,OAAS,EACjC,MAAO,CACL,MAAO,IACF,EACH,MAAO,EACP,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,EACR,MAAO,EACT,EAGF,IAAM,EAAM,EAAM,MAAQ,EAC1B,GAAI,EAAM,EACR,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,GAAO,EAAM,MAAM,OACrB,MAAO,CACL,MAAO,IACF,EACH,MAAO,IACT,EACA,KAAM,EAAM,MACZ,OAAQ,EAAY,EAAM,KAAK,EAC/B,MAAO,EACT,EAGF,MAAO,CACL,MAAO,IACF,EACH,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,IAAQ,GAAK,EAAI,EAAY,EAAM,MAAM,GAAK,IAAI,EAC1D,MAAO,EACT", | ||
| "debugId": "018372A5C8DF826564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/session.ts", "../tui/src/logo.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ModelInfo, SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/client\"\n\nexport function isDefaultTitle(title: string) {\n return /^(New session - |Child session - )\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(title)\n}\n\nexport function lastAssistantWithUsage(messages: ReadonlyArray<SessionMessageInfo>, boundary?: string) {\n const boundaryIndex = boundary ? messages.findIndex((message) => message.id === boundary) : -1\n if (boundary && boundaryIndex === -1) return undefined\n const end = boundaryIndex === -1 ? messages.length : boundaryIndex\n const compactionIndex = messages.findLastIndex(\n (message, index) => message.type === \"compaction\" && message.status === \"completed\" && index < end,\n )\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && index > compactionIndex && index < end,\n )\n}\n\nexport function contextUsage(\n messages: ReadonlyArray<SessionMessageInfo>,\n models: ReadonlyArray<ModelInfo> | undefined,\n boundary?: string,\n) {\n const last = lastAssistantWithUsage(messages, boundary)\n if (!last) return\n const tokens =\n last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write\n if (tokens <= 0) return\n const model = models?.find((model) => model.providerID === last.model.providerID && model.id === last.model.id)\n return {\n tokens,\n percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : undefined,\n }\n}\n", | ||
| "export const logo = {\n left: [\" \", \"█▀▀█ █▀▀█ █▀▀█ █▀▀▄\", \"█__█ █__█ █^^^ █__█\", \"▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀\"],\n right: [\" ▄ \", \"█▀▀▀ █▀▀█ █▀▀█ █▀▀█\", \"█___ █__█ █__█ █^^^\", \"▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀\"],\n}\n\nexport const go = {\n left: [\" \", \"█▀▀▀\", \"█_^█\", \"▀▀▀▀\"],\n right: [\" \", \"█▀▀█\", \"█__█\", \"▀▀▀▀\"],\n}\n\nexport const marks = \"_^~,\"\n" | ||
| ], | ||
| "mappings": ";AAEO,SAAS,CAAc,CAAC,EAAe,CAC5C,MAAO,iFAAiF,KAAK,CAAK,EAG7F,SAAS,CAAsB,CAAC,EAA6C,EAAmB,CACrG,IAAM,EAAgB,EAAW,EAAS,UAAU,CAAC,IAAY,EAAQ,KAAO,CAAQ,EAAI,GAC5F,GAAI,GAAY,IAAkB,GAAI,OACtC,IAAM,EAAM,IAAkB,GAAK,EAAS,OAAS,EAC/C,EAAkB,EAAS,cAC/B,CAAC,EAAS,IAAU,EAAQ,OAAS,cAAgB,EAAQ,SAAW,aAAe,EAAQ,CACjG,EACA,OAAO,EAAS,SACd,CAAC,EAAS,IACR,EAAQ,OAAS,aAAe,EAAQ,SAAW,QAAa,EAAQ,GAAmB,EAAQ,CACvG,EAGK,SAAS,CAAY,CAC1B,EACA,EACA,EACA,CACA,IAAM,EAAO,EAAuB,EAAU,CAAQ,EACtD,GAAI,CAAC,EAAM,OACX,IAAM,EACJ,EAAK,OAAO,MAAQ,EAAK,OAAO,OAAS,EAAK,OAAO,UAAY,EAAK,OAAO,MAAM,KAAO,EAAK,OAAO,MAAM,MAC9G,GAAI,GAAU,EAAG,OACjB,IAAM,EAAQ,GAAQ,KAAK,CAAC,IAAU,EAAM,aAAe,EAAK,MAAM,YAAc,EAAM,KAAO,EAAK,MAAM,EAAE,EAC9G,MAAO,CACL,SACA,QAAS,GAAO,MAAM,QAAU,KAAK,MAAO,EAAS,EAAM,MAAM,QAAW,GAAG,EAAI,MACrF,ECjCK,IAAM,EAAO,CAClB,KAAM,CAAC,sBAAuB,sGAAsB,yDAAuB,2FAAqB,EAChG,MAAO,CAAC,2BAAsB,sGAAuB,oDAAuB,qGAAqB,CACnG,EAEa,EAAK,CAChB,KAAM,CAAC,OAAQ,2BAAO,iBAAQ,0BAAM,EACpC,MAAO,CAAC,OAAQ,2BAAO,iBAAQ,0BAAM,CACvC", | ||
| "debugId": "6CE788244A67136F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/tool.ts"], | ||
| "sourcesContent": [ | ||
| "// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, task, etc.) has a ToolRule that controls\n// five display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// permission → display info for the permission UI (icon, title, diff)\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport { LANGUAGE_EXTENSIONS } from \"@opencode-ai/tui/util/filetype\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport type { MiniToolPart, RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport type ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\nexport type ToolPhase = \"start\" | \"progress\" | \"final\"\n\nexport type ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n type?: string\n relativePath?: string\n filePath?: string\n movePath?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n path?: string\n pattern?: string\n filePath?: string\n filepath?: string\n url?: string\n query?: string\n subagent_type?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\nexport type ToolFrame = {\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n}\n\nexport type ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\nexport type ToolPermissionInfo = {\n icon: string\n title: string\n lines: string[]\n diff?: string\n file?: string\n}\n\nexport type ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolPermissionProps = {\n input: ToolInput\n metadata: ToolMetadata\n patterns: string[]\n}\n\ntype ToolPermissionCtx = {\n input: ToolDict\n meta: ToolDict\n patterns: string[]\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"task\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n | \"plan_exit\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n permission?: (props: ToolPermissionProps) => ToolPermissionInfo\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n return {}\n }\n\n return { ...v }\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction permission(ctx: ToolPermissionCtx): ToolPermissionProps {\n return {\n input: ctx.input,\n metadata: ctx.meta,\n patterns: ctx.patterns,\n }\n}\n\nfunction webSearchProviderLabel(provider: unknown) {\n if (provider === \"parallel\") return \"Parallel Web Search\"\n if (provider === \"exa\") return \"Exa Web Search\"\n return \"Web Search\"\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nfunction num(v: unknown): number | undefined {\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n return undefined\n }\n\n return v\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction info(data: ToolDict, skip: string[] = []): string {\n const list = Object.entries(data).filter(([key, val]) => {\n if (skip.includes(key)) {\n return false\n }\n\n return typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\"\n })\n\n if (list.length === 0) {\n return \"\"\n }\n\n return `[${list.map(([key, val]) => `${key}=${String(val)}`).join(\", \")}]`\n}\n\nfunction span(state: ToolDict): string {\n const time = dict(state.time)\n const start = num(time.start)\n const end = num(time.end)\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = info(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx.state)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean } = {}): string {\n if (!input) {\n return \"\"\n }\n\n const cwd = process.cwd()\n const home = os.homedir()\n const abs = path.isAbsolute(input) ? input : path.resolve(cwd, input)\n const rel = path.relative(cwd, abs)\n\n if (!rel) {\n return \".\"\n }\n\n if (!rel.startsWith(\"..\")) {\n return rel.replaceAll(\"\\\\\", \"/\")\n }\n\n if (opts.home && home && (abs === home || abs.startsWith(home + path.sep))) {\n return abs.replace(home, \"~\").replaceAll(\"\\\\\", \"/\")\n }\n\n return abs.replaceAll(\"\\\\\", \"/\")\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = text(ctx.state.title) || (Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\")\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${toolPath(dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = toolPath(p.input.filePath)\n const description = info(p.frame.input, [\"filePath\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Edit ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.subagent_type || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Task`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: `Skill \"${p.input.name ?? \"\"}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: text(p.frame.state.title) || \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: text(p.frame.state.title) || (calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\"),\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n filePath?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.filePath ? toolPath(input.filePath, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || lspTitle(p.input),\n }\n}\n\nfunction runPlanExit(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || \"Switching to build agent\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction patchTitle(file: PatchFile): string {\n const rel = file.relativePath\n const from = file.filePath\n if (file.type === \"add\") {\n return `# Created ${rel || toolPath(from)}`\n }\n if (file.type === \"delete\") {\n return `# Deleted ${rel || toolPath(from)}`\n }\n if (file.type === \"move\") {\n return `# Moved ${toolPath(from)} -> ${rel || toolPath(file.movePath)}`\n }\n\n return `# Patched ${rel || toolPath(from)}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${toolPath(file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const diff = p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${toolPath(file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.movePath || file.filePath || file.relativePath\n return [\n {\n title: patchTitle(file),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length === 0) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const desc = p.input.description\n const title = text(p.frame.state.title)\n const rows = [desc || title].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Task`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? toolPath(wd) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `# Running in ${dir}` : \"\"\n }\n\n return `# Running in ${dir}\\n$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? toolPath(wdRaw) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit ?? num(p.frame.meta.exitCode) ?? num(p.frame.meta.exit_code)\n const time = span(p.frame.state)\n if (code === undefined) {\n if (!time) {\n return \"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 = toolPath(p.input.filePath)\n const extra = info(p.frame.input, [\"filePath\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile): string {\n const type = file.type\n const rel = file.relativePath\n const from = file.filePath\n\n if (type === \"add\") {\n return `+ Created ${rel || toolPath(from)}`\n }\n\n if (type === \"delete\") {\n return `- Deleted ${rel || toolPath(from)}`\n }\n\n if (type === \"move\") {\n return `→ Moved ${toolPath(from)} → ${rel || toolPath(file.movePath)}`\n }\n\n return `~ Patched ${rel || toolPath(from)}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame.state)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const show_updates = !files.some((file) => file?.type && file.type !== \"update\")\n const shown = files.filter((file) => show_updates || file.type !== \"update\")\n const rows = shown.slice(0, 6).map(patchLine)\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const row = p.input.description || text(p.frame.state.title)\n if (!row) {\n return `# ${kind} Task`\n }\n\n return `# ${kind} Task\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame.state)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input)}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.input.name ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${toolPath(dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nfunction permEdit(p: ToolPermissionProps): ToolPermissionInfo {\n const input = p.input as { filePath?: string; filepath?: string; diff?: string }\n const file = input.filePath || input.filepath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Edit ${toolPath(file, { home: true })}`,\n lines: [],\n diff: p.metadata.diff ?? input.diff,\n file,\n }\n}\n\nfunction permRead(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Read ${toolPath(file, { home: true })}`,\n lines: file ? [`Path: ${toolPath(file, { home: true })}`] : [],\n }\n}\n\nfunction permGlob(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Glob \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permGrep(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Grep \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permList(p: ToolPermissionProps): ToolPermissionInfo {\n const dir = text(dict(p.input).path) || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `List ${toolPath(dir, { home: true })}`,\n lines: dir ? [`Path: ${toolPath(dir, { home: true })}`] : [],\n }\n}\n\nfunction permBash(p: ToolPermissionProps): ToolPermissionInfo {\n const cmd = p.input.command || \"\"\n return {\n icon: \"#\",\n title: \"Shell command\",\n lines: cmd ? [`$ ${cmd}`] : p.patterns.map((item) => `- ${item}`),\n }\n}\n\nfunction permTask(p: ToolPermissionProps): ToolPermissionInfo {\n const type = p.input.subagent_type || \"general\"\n const desc = p.input.description\n return {\n icon: \"#\",\n title: `${Locale.titlecase(type)} Task`,\n lines: desc ? [`◉ ${desc}`] : [],\n }\n}\n\nfunction permWebfetch(p: ToolPermissionProps): ToolPermissionInfo {\n const url = p.input.url || \"\"\n return {\n icon: \"%\",\n title: `WebFetch ${url}`,\n lines: url ? [`URL: ${url}`] : [],\n }\n}\n\nfunction permWebSearch(p: ToolPermissionProps): ToolPermissionInfo {\n const query = p.input.query || \"\"\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: query ? `${title} \"${query}\"` : title,\n lines: query ? [`Query: ${query}`] : [],\n }\n}\n\nfunction permLsp(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || \"\"\n const line = typeof p.input.line === \"number\" ? p.input.line : undefined\n const char = typeof p.input.character === \"number\" ? p.input.character : undefined\n const pos = line !== undefined && char !== undefined ? `${line}:${char}` : undefined\n return {\n icon: \"→\",\n title: lspTitle(p.input, { home: true }),\n lines: [\n ...(p.input.operation ? [`Operation: ${p.input.operation}`] : []),\n ...(file ? [`Path: ${toolPath(file, { home: true })}`] : []),\n ...(pos ? [`Position: ${pos}`] : []),\n ],\n }\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n 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 permission: permBash,\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n permission: permEdit,\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n task: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n permission: permTask,\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n permission: permRead,\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n permission: permGlob,\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n permission: permGrep,\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n permission: permList,\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n permission: permLsp,\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n permission: permWebfetch,\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n permission: permWebSearch,\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n plan_exit: {\n view: {\n output: true,\n final: false,\n },\n run: runPlanExit,\n scroll: {\n start: () => \"\",\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: MiniToolPart): ToolFrame {\n const state = dict(part.state)\n return {\n raw: \"\",\n name: part.tool,\n input: dict(state.input),\n meta: \"metadata\" in part.state ? dict(part.state.metadata) : {},\n state,\n status: text(state.status),\n error: text(state.error),\n }\n}\n\nexport function toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const state = dict(commit.part?.state)\n return {\n raw,\n name: commit.tool || commit.part?.tool || \"tool\",\n input: dict(state.input),\n meta: commit.part?.state && \"metadata\" in commit.part.state ? dict(commit.part.state.metadata) : {},\n state,\n status: commit.toolState ?? text(state.status),\n error: (commit.toolError ?? \"\").trim(),\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output).trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.tool).snap)\n )\n}\n\nexport function toolInlineInfo(part: MiniToolPart): ToolInline {\n const ctx = frame(part)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nexport function toolPermissionInfo(\n name: string,\n input: ToolDict,\n meta: ToolDict,\n patterns: string[],\n): ToolPermissionInfo | undefined {\n const draw = rule(name)?.permission\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(permission({ input, meta, patterns }))\n } catch {\n return undefined\n }\n}\n\nexport function toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"task\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(text(ctx.state.output))\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D0F1B0508B54434E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\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({ server: serverURL, standalone: input.standalone })\n yield* Effect.promise(() =>\n runMini({\n server,\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mkDAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,MAAC,OACxD,SAAM,OAAY,OAAO,oBAAe,OAAM,WAAM,OAC9C,OAAS,WAAO,OAAiB,aAAQ,MAAE,YAAQ,OAAW,gBAAY,OAAM,UAAW,CAAC,EAClG,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,SACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,IACd,CAAC,CACH,EACD,CACH", | ||
| "debugId": "75FA469610EC90D764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/standalone.ts", "src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Deferred, Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport { selfCommand } from \"../util/process\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const [executable, ...args] = options.command ?? [...selfCommand(), \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const readyLine = yield* Deferred.make<string, Error>()\n // Keep draining stdout after readiness so later server writes cannot hit EPIPE.\n yield* proc.stdout.pipe(\n Stream.decodeText(),\n Stream.splitLines,\n Stream.runForEach((line) => Deferred.succeed(readyLine, line)),\n Effect.ensuring(Deferred.fail(readyLine, new Error(\"Standalone server exited before reporting readiness\"))),\n Effect.forkScoped,\n )\n const output = yield* Deferred.await(readyLine)\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Endpoint & { readonly pid: number }\n },\n Effect.provide(AppNodeBuilder.build(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n", | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: 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 !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\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(options)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\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": "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", | ||
| "debugId": "EEB571FAF2C1C7F864756E2164756E21", | ||
| "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/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.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 inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F66A578E31796CBA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ojCAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "2A8C78B904C83A3564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/backend/network.ts", "../simulation/src/backend/openai.ts", "../simulation/src/backend/simulated-provider.ts", "../simulation/src/backend/index.ts"], | ||
| "sourcesContent": [ | ||
| "import { Clock, Effect, Layer, Ref } from \"effect\"\nimport { HttpClient, HttpClientResponse, type HttpMethod } from \"effect/unstable/http\"\nimport { HttpClientError, TransportError } from \"effect/unstable/http/HttpClientError\"\nimport type { HttpClientRequest } from \"effect/unstable/http\"\nimport { SimulationProtocol } from \"../protocol\"\n\n/**\n * Simulated network.\n *\n * Replaces the `HttpClient.HttpClient` platform node in simulation mode. All\n * outbound HTTP resolves against an in-memory route table; unknown\n * destinations fail loudly with a transport error so no simulation run can\n * silently reach the real network. The scripted LLM is one registered route,\n * not a separate mechanism.\n *\n * Each acquired run owns its routes and request log.\n */\n\nexport interface Route {\n /** Return a response effect to claim the request, undefined to pass. */\n readonly match: (\n request: HttpClientRequest.HttpClientRequest,\n url: URL,\n ) => Effect.Effect<HttpClientResponse.HttpClientResponse, HttpClientError> | undefined\n}\n\nexport type LogEntry = SimulationProtocol.Backend.NetworkLogEntry\n\nconst LOG_LIMIT = 1000\n\n/** Static JSON route: exact method + origin/path match answered with a fixed body. */\nexport function json(method: HttpMethod.HttpMethod, url: string, body: unknown): Route {\n return {\n match: (request, requestUrl) => {\n if (request.method !== method) return undefined\n if (requestUrl.origin + requestUrl.pathname !== url) return undefined\n return Effect.sync(() =>\n HttpClientResponse.fromWeb(\n request,\n new Response(JSON.stringify(body), { status: 200, headers: { \"content-type\": \"application/json\" } }),\n ),\n )\n },\n }\n}\n\nexport interface Run {\n readonly client: HttpClient.HttpClient\n readonly log: () => Effect.Effect<readonly LogEntry[]>\n}\n\nexport const make = Effect.fn(\"SimulationNetwork.make\")(function* (routes: readonly Route[] = []) {\n const log = yield* Ref.make<readonly LogEntry[]>([])\n const client = HttpClient.make((request, url) =>\n Effect.gen(function* () {\n let matched: Effect.Effect<HttpClientResponse.HttpClientResponse, HttpClientError> | undefined\n for (const route of routes) {\n matched = route.match(request, url)\n if (matched) break\n }\n const entry = {\n time: yield* Clock.currentTimeMillis,\n method: request.method,\n url: url.toString(),\n matched: matched !== undefined,\n }\n yield* Ref.update(log, (entries) => [...entries, entry].slice(-LOG_LIMIT))\n if (matched) return yield* matched\n return yield* Effect.fail(\n new HttpClientError({\n reason: new TransportError({\n request,\n description: `Simulation denied unregistered network destination: ${request.method} ${url}`,\n }),\n }),\n )\n }),\n )\n return { client, log: () => Ref.get(log) } satisfies Run\n})\n\nexport const layer = (routes: readonly Route[] = []) =>\n Layer.effect(HttpClient.HttpClient, make(routes).pipe(Effect.map((run) => run.client)))\n\nexport * as SimulationNetwork from \"./network\"\n", | ||
| "import { Effect, Schema, Stream } from \"effect\"\nimport { HttpClientResponse } from \"effect/unstable/http\"\nimport { HttpClientError, TransportError } from \"effect/unstable/http/HttpClientError\"\nimport { OpenAIChatEvent, DEFAULT_BASE_URL, PATH } from \"@opencode-ai/ai/protocols/openai-chat\"\nimport { SimulationNetwork } from \"./network\"\nimport { SimulatedProvider } from \"./simulated-provider\"\n\n/**\n * Driver-answered OpenAI endpoint for the simulated network.\n *\n * Claims `POST {DEFAULT_BASE_URL}{PATH}` (the real openai-chat route\n * endpoint), invokes the simulated provider, and streams the driver's events back as\n * an OpenAI Chat SSE response terminated by `[DONE]`. Everything downstream\n * of the response bytes is the real pipeline: SSE framing, the OpenAIChat\n * event schema, the protocol state machine, and Lifecycle grammar.\n */\n\nconst encodeChunk = Schema.encodeUnknownSync(OpenAIChatEvent)\n\nconst encoder = new TextEncoder()\nconst decodeBody = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Json))\n\n// The simulated model id is echoed back only in non-schema fields; the\n// protocol event schema ignores unknown fields, so id/object/model are\n// decorative wire realism.\ntype ProviderItem = Exclude<SimulatedProvider.ProviderResponseEvent, { readonly type: \"finish\" }>\ntype FinishReason = Extract<SimulatedProvider.ProviderResponseEvent, { readonly type: \"finish\" }>[\"reason\"]\n\nfunction chunkOf(item: ProviderItem): OpenAIChatEvent | unknown {\n if (item.type === \"textDelta\") return { choices: [{ delta: { content: item.text } }] }\n if (item.type === \"reasoningDelta\") return { choices: [{ delta: { reasoning_content: item.text } }] }\n if (item.type === \"toolCall\")\n return {\n choices: [\n {\n delta: {\n tool_calls: [\n {\n index: item.index,\n id: item.id,\n function: { name: item.name, arguments: JSON.stringify(item.input) },\n },\n ],\n },\n },\n ],\n }\n return item.chunk\n}\n\nconst finishReasonWire: Record<FinishReason, string> = {\n stop: \"stop\",\n \"tool-calls\": \"tool_calls\",\n length: \"length\",\n \"content-filter\": \"content_filter\",\n}\n\nfunction frame(payload: unknown): Uint8Array {\n return encoder.encode(`data: ${JSON.stringify(payload)}\\n\\n`)\n}\n\nfunction sseBody(\n events: Stream.Stream<SimulatedProvider.ProviderResponseEvent, SimulatedProvider.ProviderDisconnectedError>,\n): Stream.Stream<Uint8Array, SimulatedProvider.ProviderDisconnectedError> {\n return events.pipe(\n Stream.map((event) => {\n if (event.type === \"finish\")\n return frame(encodeChunk({ choices: [{ delta: {}, finish_reason: finishReasonWire[event.reason] }] }))\n if (event.type === \"raw\") return frame(event.chunk)\n return frame(encodeChunk(chunkOf(event)))\n }),\n Stream.concat(Stream.make(encoder.encode(\"data: [DONE]\\n\\n\"))),\n )\n}\n\nexport const route = (provider: SimulatedProvider.Interface): SimulationNetwork.Route => ({\n match: (request, url) => {\n if (request.method !== \"POST\") return undefined\n if (url.origin + url.pathname !== DEFAULT_BASE_URL + PATH) return undefined\n return Effect.gen(function* () {\n const body =\n request.body._tag === \"Uint8Array\"\n ? yield* decodeBody(new TextDecoder().decode(request.body.body)).pipe(\n Effect.mapError(\n (cause) =>\n new HttpClientError({\n reason: new TransportError({\n request,\n cause,\n description: \"Simulation received an invalid OpenAI request body\",\n }),\n }),\n ),\n )\n : {}\n return HttpClientResponse.fromWeb(\n request,\n new Response(Stream.toReadableStream(sseBody(provider.stream({ url: url.toString(), body }))), {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n }),\n )\n })\n },\n})\n\nexport * as SimulationOpenAI from \"./openai\"\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Cause, Context, Effect, Fiber, FiberSet, Layer, PubSub, Queue, Ref, Schema, Semaphore, Stream } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\n\nexport interface ProviderRequest {\n readonly url: string\n readonly body: unknown\n}\n\nexport type ProviderResponseEvent =\n | SimulationProtocol.Backend.Item\n | { readonly type: \"finish\"; readonly reason: SimulationProtocol.Backend.FinishReason }\n\nexport class ProviderDisconnectedError extends Schema.TaggedErrorClass<ProviderDisconnectedError>()(\n \"SimulatedProvider.ProviderDisconnectedError\",\n { message: Schema.String },\n) {}\n\nexport interface Interface {\n readonly stream: (request: ProviderRequest) => Stream.Stream<ProviderResponseEvent, ProviderDisconnectedError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/simulation/SimulatedProvider\") {}\n\ninterface ProviderInvocation extends ProviderRequest {\n readonly id: string\n}\n\ninterface PendingInvocation extends ProviderInvocation {\n readonly responses: Queue.Queue<ProviderResponseEvent, ProviderDisconnectedError | Cause.Done>\n}\n\ninterface State {\n readonly counter: number\n readonly pending: ReadonlyMap<string, PendingInvocation>\n}\n\ninterface Driver {\n readonly requests: Stream.Stream<ProviderInvocation>\n readonly push: (\n id: string,\n items: readonly SimulationProtocol.Backend.Item[],\n ) => Effect.Effect<void, InvocationNotFoundError>\n readonly finish: (\n id: string,\n reason: SimulationProtocol.Backend.FinishReason,\n ) => Effect.Effect<void, InvocationNotFoundError>\n readonly disconnect: (id: string) => Effect.Effect<void, InvocationNotFoundError>\n readonly pending: () => Effect.Effect<readonly ProviderInvocation[]>\n}\n\nclass InvocationNotFoundError extends Schema.TaggedErrorClass<InvocationNotFoundError>()(\n \"SimulatedProvider.InvocationNotFoundError\",\n { id: Schema.String, message: Schema.String },\n) {}\n\nclass ControllerDisconnectedError extends Schema.TaggedErrorClass<ControllerDisconnectedError>()(\n \"SimulatedProvider.ControllerDisconnectedError\",\n { message: Schema.String },\n) {}\n\ntype ControlSocket = SimulationControlServer.Socket\n\nexport const layerDrive = (options: { readonly endpoint: string }) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const state = yield* Ref.make<State>({ counter: 0, pending: new Map() })\n const opened = yield* PubSub.unbounded<ProviderInvocation>()\n const lock = yield* Semaphore.make(1)\n\n const close = (invocation: PendingInvocation) =>\n Effect.gen(function* () {\n yield* Queue.shutdown(invocation.responses)\n yield* lock.withPermit(\n Ref.update(state, (current) =>\n current.pending.get(invocation.id) === invocation ? remove(current, invocation.id) : current,\n ),\n )\n })\n\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n const current = yield* Ref.get(state)\n yield* Effect.forEach(current.pending.values(), (invocation) => Queue.shutdown(invocation.responses), {\n discard: true,\n })\n yield* PubSub.shutdown(opened)\n }),\n )\n\n const open = (request: ProviderRequest) =>\n lock.withPermit(\n Effect.gen(function* () {\n const current = yield* Ref.get(state)\n const id = `inv_${current.counter + 1}`\n const responses = yield* Queue.bounded<ProviderResponseEvent, ProviderDisconnectedError | Cause.Done>(256)\n const invocation: PendingInvocation = { id, ...request, responses }\n yield* Ref.set(state, {\n counter: current.counter + 1,\n pending: new Map(current.pending).set(id, invocation),\n })\n yield* PubSub.publish(opened, { id, ...request })\n return invocation\n }),\n )\n\n const requireInvocation = (id: string) =>\n Effect.gen(function* () {\n const current = yield* Ref.get(state)\n const invocation = current.pending.get(id)\n if (invocation) return invocation\n return yield* Effect.fail(\n new InvocationNotFoundError({\n id,\n message: `Simulated provider invocation not found or already finished: ${id}`,\n }),\n )\n })\n\n const remove = (current: State, id: string) => {\n const pending = new Map(current.pending)\n pending.delete(id)\n return { ...current, pending }\n }\n\n const driver: Driver = {\n requests: Stream.unwrap(\n lock.withPermit(\n Effect.gen(function* () {\n const subscription = yield* PubSub.subscribe(opened)\n const current = yield* Ref.get(state)\n const pending = Array.from(current.pending.values(), ({ id, url, body }) => ({ id, url, body }))\n return Stream.concat(Stream.fromIterable(pending), Stream.fromEffectRepeat(PubSub.take(subscription)))\n }),\n ),\n ),\n push: (id, items) =>\n Effect.gen(function* () {\n const invocation = yield* lock.withPermit(requireInvocation(id))\n yield* Queue.offerAll(invocation.responses, items)\n }),\n finish: (id, reason) =>\n Effect.gen(function* () {\n const invocation = yield* lock.withPermit(\n Effect.gen(function* () {\n const invocation = yield* requireInvocation(id)\n const current = yield* Ref.get(state)\n yield* Ref.set(state, remove(current, id))\n return invocation\n }),\n )\n yield* Queue.offer(invocation.responses, { type: \"finish\", reason })\n yield* Queue.end(invocation.responses)\n }),\n disconnect: (id) =>\n Effect.gen(function* () {\n const invocation = yield* lock.withPermit(\n Effect.gen(function* () {\n const invocation = yield* requireInvocation(id)\n const current = yield* Ref.get(state)\n yield* Ref.set(state, remove(current, id))\n return invocation\n }),\n )\n yield* Queue.fail(\n invocation.responses,\n new ProviderDisconnectedError({ message: \"Simulated model provider disconnected\" }),\n )\n }),\n pending: () =>\n lock.withPermit(\n Ref.get(state).pipe(\n Effect.map((current) => Array.from(current.pending.values(), ({ id, url, body }) => ({ id, url, body }))),\n ),\n ),\n }\n\n const fibers = yield* FiberSet.make<void, unknown>()\n const activeController = yield* Ref.make<Fiber.Fiber<void> | undefined>(undefined)\n const controllerLock = yield* Semaphore.make(1)\n yield* SimulationControlServer.start({\n endpoint: options.endpoint,\n label: \"opencode drive backend websocket\",\n data: () => ({}),\n decode: SimulationProtocol.Backend.decodeRequestEffect,\n handle: (socket, request) => handle(driver, fibers, activeController, controllerLock, socket, request),\n close: (socket) => releaseController(activeController, controllerLock, socket),\n })\n yield* Effect.sync(() => process.stderr.write(`opencode drive backend websocket: ${options.endpoint}\\n`))\n\n return Service.of({\n stream: (request) =>\n Stream.unwrap(\n Effect.acquireRelease(open(request), close).pipe(\n Effect.map((invocation) =>\n Stream.fromQueue(invocation.responses).pipe(Stream.takeUntil((event) => event.type === \"finish\")),\n ),\n ),\n ),\n })\n }),\n )\n\nfunction handle(\n driver: Driver,\n fibers: FiberSet.FiberSet<void, unknown>,\n activeController: Ref.Ref<Fiber.Fiber<void> | undefined>,\n controllerLock: Semaphore.Semaphore,\n socket: ControlSocket,\n request: SimulationProtocol.Backend.Request,\n) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"backend\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Backend.Capabilities,\n },\n request.params,\n )\n case \"llm.attach\":\n return controllerLock.withPermit(\n Effect.gen(function* () {\n if (socket.data.closed)\n return yield* Effect.fail(\n new ControllerDisconnectedError({ message: \"Drive controller disconnected before attachment\" }),\n )\n const previous = yield* Ref.get(activeController)\n if (previous) yield* Fiber.interrupt(previous)\n const attachment = yield* FiberSet.run(\n fibers,\n driver.requests.pipe(\n Stream.runForEach((invocation) =>\n Effect.sync(() => {\n socket.send(JSON.stringify({ jsonrpc: \"2.0\", method: \"llm.request\", params: invocation }))\n }),\n ),\n ),\n )\n if (socket.data.closed) {\n yield* Fiber.interrupt(attachment)\n return yield* Effect.fail(\n new ControllerDisconnectedError({ message: \"Drive controller disconnected during attachment\" }),\n )\n }\n socket.data.attachment = attachment\n yield* Ref.set(activeController, attachment)\n return { attached: true }\n }),\n )\n case \"llm.chunk\":\n return driver.push(request.params.id, request.params.items).pipe(Effect.as({ ok: true }))\n case \"llm.finish\":\n return driver.finish(request.params.id, request.params.reason).pipe(Effect.as({ ok: true }))\n case \"llm.disconnect\":\n return driver.disconnect(request.params.id).pipe(Effect.as({ ok: true }))\n case \"llm.pending\":\n return driver.pending().pipe(Effect.map((invocations) => ({ invocations })))\n }\n}\n\nfunction releaseController(\n activeController: Ref.Ref<Fiber.Fiber<void> | undefined>,\n controllerLock: Semaphore.Semaphore,\n socket: ControlSocket,\n) {\n return controllerLock.withPermit(\n Effect.gen(function* () {\n const attachment = socket.data.attachment\n if (!attachment) return\n yield* Fiber.interrupt(attachment)\n yield* Ref.update(activeController, (active) => (active === attachment ? undefined : active))\n }),\n )\n}\n\nexport * as SimulatedProvider from \"./simulated-provider\"\n", | ||
| "import { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { httpClient } from \"@opencode-ai/core/effect/app-node-platform\"\nimport { Config, Effect, Layer } from \"effect\"\nimport { HttpClient } from \"effect/unstable/http\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationNetwork } from \"./network\"\nimport { SimulationOpenAI } from \"./openai\"\nimport { SimulatedProvider } from \"./simulated-provider\"\n\n/**\n * Layer replacements applied when the server is built in simulation mode.\n *\n * The server merges these into the app node build when `OPENCODE_SIMULATE`\n * is enabled, via a dynamic import so this module is never loaded eagerly.\n *\n * - Network: all outbound HTTP resolves against the simulated route table;\n * unknown destinations are denied. The driver-answered OpenAI endpoint is\n * registered here as the first route.\n *\n */\n\nexport const simulationReplacements = Effect.fn(\"Simulation.replacements\")(function* () {\n // ModelsDev dies when its catalog fetch fails, so simulation answers it with\n // an empty catalog; providers come from seeded config instead.\n const models = SimulationNetwork.json(\"GET\", \"https://models.dev/api.json\", {})\n const drive = yield* Config.string(\"OPENCODE_DRIVE\").pipe(Config.withDefault(undefined))\n if (!drive) return [[httpClient, SimulationNetwork.layer([models])]] satisfies LayerNode.Replacements\n\n const manifest = yield* DriveManifest.resolve()\n const networkLayer = Layer.effect(\n HttpClient.HttpClient,\n Effect.gen(function* () {\n const provider = yield* SimulatedProvider.Service\n const network = yield* SimulationNetwork.make([SimulationOpenAI.route(provider), models])\n return network.client\n }),\n ).pipe(\n Layer.provide(\n SimulatedProvider.layerDrive({\n endpoint: manifest.endpoints.backend,\n }),\n ),\n )\n return [[httpClient, networkLayer]] satisfies LayerNode.Replacements\n})\n\nexport * as Simulation from \"./index\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E98C81B2B45D18D964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/agents.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "2E0B6318AD5EA22464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/prompt/content.ts"], | ||
| "sourcesContent": [ | ||
| "export function normalizePromptContent(content: string) {\n if (content.endsWith(\"\\r\\n\")) {\n const body = content.slice(0, -2)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n if (content.endsWith(\"\\n\")) {\n const body = content.slice(0, -1)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n return content\n}\n" | ||
| ], | ||
| "mappings": ";AAAO,SAAS,CAAsB,CAAC,EAAiB,CACtD,GAAI,EAAQ,SAAS;AAAA,CAAM,EAAG,CAC5B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,GAAI,EAAQ,SAAS;AAAA,CAAI,EAAG,CAC1B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,OAAO", | ||
| "debugId": "4A669A049BADD3BC64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const plugins = response.data.toSorted((a, b) => a.id.localeCompare(b.id))\n if (plugins.length === 0) {\n process.stdout.write(\"No plugins loaded\" + EOL)\n return\n }\n process.stdout.write(plugins.map((plugin) => plugin.id).join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,YAAO,cAAS,UAClC,OAAO,QAAG,sBAAiB,OAAE,cAAU,OAAG,MACxC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzE,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,oBAAsB,CAAG,EAC9C,OAEF,QAAQ,OAAO,MAAM,EAAQ,IAAI,CAAC,IAAW,EAAO,EAAE,EAAE,KAAK,CAAG,EAAI,CAAG,EACxE,CACH", | ||
| "debugId": "1A9AB62787655E9B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/util/process-lock-ffi.bun.ts", "../core/src/util/process-lock.ts", "src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "import { dlopen, read, type Pointer } from \"bun:ffi\"\nimport { existsSync } from \"node:fs\"\n\nexport type LockResult =\n | { readonly acquired: true }\n | { readonly acquired: false; readonly held: true }\n | { readonly acquired: false; readonly held: false; readonly code: number }\n\nconst LOCK_EX = 2\nconst LOCK_NB = 4\nconst DARWIN_EWOULDBLOCK = 35\nconst LINUX_EWOULDBLOCK = 11\n\nexport function lockDarwin(fd: number): LockResult {\n const library = dlopen(\"/usr/lib/libSystem.B.dylib\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __error: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__error())\n if (result === 0) return { acquired: true }\n if (code === DARWIN_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nexport function lockLinux(fd: number): LockResult {\n const musl = `/lib/libc.musl-${process.arch === \"arm64\" ? \"aarch64\" : \"x86_64\"}.so.1`\n const library = dlopen(existsSync(musl) ? musl : \"libc.so.6\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __errno_location: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__errno_location())\n if (result === 0) return { acquired: true }\n if (code === LINUX_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nfunction errorCode(pointer: Pointer | null) {\n if (pointer === null) throw new Error(\"Failed to read process lock error code\")\n return read.i32(pointer, 0)\n}\n", | ||
| "import { lockDarwin, lockLinux, type LockResult } from \"#process-lock-ffi\"\nimport { closeSync, mkdirSync, openSync } from \"node:fs\"\nimport { connect, createServer, type Server, type Socket } from \"node:net\"\nimport path from \"node:path\"\nimport { Effect, Schema } from \"effect\"\nimport { Hash } from \"./hash\"\n\nexport namespace ProcessLock {\n export class HeldError extends Schema.TaggedErrorClass<HeldError>()(\"ProcessLockHeldError\", {\n file: Schema.String,\n }) {\n override get message() {\n return `Process lock is already held: ${this.file}`\n }\n }\n\n export class SystemError extends Schema.TaggedErrorClass<SystemError>()(\"ProcessLockSystemError\", {\n file: Schema.String,\n operation: Schema.Literals([\"open\", \"acquire\"]),\n code: Schema.String,\n }) {\n override get message() {\n return `Process lock ${this.operation} failed for ${this.file}: ${this.code}`\n }\n }\n\n export type LockError = HeldError | SystemError\n\n const acquirePosix = Effect.fnUntraced(function* (file: string) {\n const fd = yield* Effect.try({\n try: () => {\n mkdirSync(path.dirname(file), { recursive: true })\n return openSync(file, \"a+\", 0o600)\n },\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"open\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n const result = yield* Effect.try({\n try: () => lock(fd),\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"acquire\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n }).pipe(\n Effect.tapError(() =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n ),\n )\n if (result.acquired) {\n return fd\n }\n closeSync(fd)\n return yield* result.held\n ? new HeldError({ file })\n : new SystemError({ file, operation: \"acquire\", code: String(result.code) })\n })\n\n export const acquire = Effect.fn(\"ProcessLock.acquire\")(function* (file: string) {\n if (process.platform === \"win32\") {\n yield* Effect.acquireRelease(acquireWindows(file), closeWindows)\n return\n }\n yield* Effect.acquireRelease(acquirePosix(file), (fd) =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n )\n })\n}\n\nfunction lock(fd: number): LockResult {\n if (process.platform === \"darwin\") return lockDarwin(fd)\n if (process.platform === \"linux\") return lockLinux(fd)\n throw new Error(`Unsupported process lock platform: ${process.platform}`)\n}\n\nfunction acquireWindows(file: string) {\n return Effect.callback<Server, ProcessLock.LockError>((resume) => {\n const server = createServer()\n let probe: Socket | undefined\n const pipe = `\\\\\\\\.\\\\pipe\\\\opencode-process-lock-${Hash.sha256(path.resolve(file).toLowerCase())}`\n const onError = (cause: NodeJS.ErrnoException) => {\n server.off(\"listening\", onListening)\n probe = connect(pipe)\n const onProbeError = () => {\n probe?.off(\"connect\", onConnect)\n resume(\n Effect.fail(\n new ProcessLock.SystemError({\n file,\n operation: \"acquire\",\n code: cause.code ?? cause.message,\n }),\n ),\n )\n }\n const onConnect = () => {\n probe?.off(\"error\", onProbeError)\n probe?.destroy()\n resume(Effect.fail(new ProcessLock.HeldError({ file })))\n }\n probe.once(\"connect\", onConnect)\n probe.once(\"error\", onProbeError)\n }\n const onListening = () => {\n server.off(\"error\", onError)\n resume(Effect.succeed(server))\n }\n server.once(\"error\", onError)\n server.once(\"listening\", onListening)\n server.on(\"connection\", (socket) => socket.destroy())\n server.listen(pipe)\n return Effect.sync(() => {\n probe?.destroy()\n server.close()\n })\n })\n}\n\nfunction closeWindows(server: Server) {\n return Effect.callback<void>((resume) => {\n if (!server.listening) return resume(Effect.void)\n server.close((error) => resume(error ? Effect.die(error) : Effect.void))\n })\n}\n", | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { ProcessLock } from \"@opencode-ai/core/util/process-lock\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\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(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node]))),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n if (serviceOptions !== undefined) {\n const acquired = yield* ProcessLock.acquire(serviceOptions.file + \".lock\").pipe(\n Effect.as(true),\n Effect.catchTag(\"ProcessLockHeldError\", () => Effect.succeed(false)),\n )\n if (!acquired) return yield* Effect.void\n if ((yield* Service.discover(serviceOptions)) !== undefined) return yield* Effect.void\n }\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const password =\n options.mode === \"service\"\n ? yield* ServiceConfig.password()\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start({\n hostname: options.hostname ?? config.hostname ?? \"127.0.0.1\",\n port: Option.fromNullishOr(options.port ?? config.port),\n password,\n instanceID,\n service:\n serviceOptions === undefined\n ? undefined\n : { onListen: (address) => register(address, password, instanceID, serviceOptions.file) },\n }).pipe(Effect.provide(Logger.layer([], { mergeWithExisting: false })))\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const publish = fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* publish\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const assertRegistration = Effect.gen(function* () {\n const found = yield* current\n if (\n found !== undefined &&\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n )\n return\n yield* publish\n })\n yield* Effect.addFinalizer(() =>\n current.pipe(\n Effect.flatMap((current) => (current?.id === id ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n ),\n )\n yield* assertRegistration.pipe(\n Effect.catchCause((cause) => Effect.logWarning(\"failed to reassert service registration\", { cause })),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.forkScoped,\n )\n})\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.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": "B7F3ACB60E2A637964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/migrate.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n" | ||
| ], | ||
| "mappings": ";u1BAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "8BD1BF23B2FA27B664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/resolve.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport type { OpenCodeClient } from \"@opencode-ai/client\"\n\n// Resolve through the MCP-owned integrationID rather than matching integration names: the shared\n// integration registry also holds provider/plugin integrations, whose names could collide with a server.\n// Fails when the server is unknown; returns undefined when the server has no integration (e.g. a local\n// or anonymous server), leaving that case for the caller to interpret.\nexport const resolveIntegration = (client: OpenCodeClient, name: string, location: { directory: string }) =>\n Effect.gen(function* () {\n const servers = yield* Effect.promise(() => client.mcp.list({ location }))\n const server = servers.data.find((entry) => entry.name === name)\n if (!server) return yield* Effect.fail(new Error(`MCP server not found: ${name}`))\n const integrationID = server.integrationID\n if (!integrationID) return undefined\n return yield* Effect.promise(() => client.integration.get({ integrationID, location })).pipe(\n Effect.map((result) => result.data ?? undefined),\n )\n })\n" | ||
| ], | ||
| "mappings": ";oDAOO,IAAM,EAAqB,CAAC,EAAwB,EAAc,IACvE,EAAO,IAAI,SAAU,EAAG,CAEtB,IAAM,GADU,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,UAAS,CAAC,CAAC,GAClD,KAAK,KAAK,CAAC,IAAU,EAAM,OAAS,CAAI,EAC/D,GAAI,CAAC,EAAQ,OAAO,MAAO,EAAO,KAAS,MAAM,yBAAyB,GAAM,CAAC,EACjF,IAAM,EAAgB,EAAO,cAC7B,GAAI,CAAC,EAAe,OACpB,OAAO,MAAO,EAAO,QAAQ,IAAM,EAAO,YAAY,IAAI,CAAE,gBAAe,UAAS,CAAC,CAAC,EAAE,KACtF,EAAO,IAAI,CAAC,IAAW,EAAO,MAAQ,MAAS,CACjD,EACD", | ||
| "debugId": "3BD9F6D891A1EDE164756E2164756E21", | ||
| "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/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? Global.Path.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\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": ";i4BAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,MAAC,OAAO,MACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,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": "509A4EC26D98475564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/util/io.ts", "src/mini/mini.ts", "src/mini/run.ts", "src/mini/noninteractive.ts", "src/mini/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { text } from \"node:stream/consumers\"\n\nexport function readStdin() {\n return text(process.stdin)\n}\n", | ||
| "import { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { waitForCatalogReady } from \"./catalog.shared\"\nimport { INTERACTIVE_INPUT_ERROR, resolveInteractiveStdin } from \"./runtime.stdin\"\nimport type { RunInput, RunTuiConfig } from \"./types\"\nimport { readStdin } from \"../util/io\"\nimport { setTimeout } from \"node:timers/promises\"\n\nexport type MiniCommandInput = {\n server: ServerConnection.Resolved\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: RunTuiConfig | Promise<RunTuiConfig>\n}\n\ntype Session = Awaited<ReturnType<OpenCodeClient[\"session\"][\"get\"]>>\nexport async function runMini(input: MiniCommandInput) {\n validate(input)\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const runtimeTask = import(\"./runtime\")\n const directory = localDirectory()\n\n try {\n const sdk = OpenCode.make({\n baseUrl: input.server.endpoint.url,\n headers: Service.headers(input.server.endpoint),\n })\n const model = parseModel(input.model)\n let agentTask: Promise<string | undefined> | undefined\n const resolveAgent = () => {\n agentTask ??= validateAgent(sdk, directory, input.agent)\n return agentTask\n }\n const resolveSession = async () => {\n const [agent, selected] = await Promise.all([resolveAgent(), selectSession(sdk, directory, input)])\n const readyModel =\n model ?? (selected?.model ? { providerID: selected.model.providerID, modelID: selected.model.id } : undefined)\n if (readyModel) await waitForCatalogReady({ sdk, directory, model: readyModel })\n const session = selected ?? (await createSession(sdk, directory, agent, model))\n return { id: session.id, title: session.title, resume: selected !== undefined }\n }\n const create = (\n _sdk: OpenCodeClient,\n next: { agent: string | undefined; model: RunInput[\"model\"]; variant: string | undefined },\n ) => createSession(sdk, directory, next.agent, next.model, next.variant)\n const runtime = await runtimeTask\n await runtime.runInteractiveDeferredMode({\n sdk,\n directory,\n resolveAgent,\n session: resolveSession,\n createSession: create,\n agent: input.agent,\n model,\n variant: undefined,\n files: [],\n initialInput,\n thinking: true,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n })\n } catch (error) {\n if (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR) fail(error.message)\n throw error\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n resolveInteractiveStdin().cleanup?.()\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string): RunInput[\"model\"] {\n if (!value) return\n const [providerID, ...rest] = value.split(\"/\")\n const modelID = rest.join(\"/\")\n if (!providerID || !modelID) fail(\"--model must use the format provider/model\")\n return { providerID, modelID }\n}\n\nasync function validateAgent(sdk: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline) {\n agents = await sdk.agent.list({ location: { directory } }).catch(() => undefined)\n const agent = agents?.data.find((item) => item.id === name)\n if (agent?.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n if (agent) return name\n await setTimeout(25)\n }\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nasync function selectSession(sdk: OpenCodeClient, directory: string, input: MiniCommandInput, preselected?: Session) {\n const selected =\n preselected ??\n (input.session\n ? await sdk.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await sdk.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined)\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected) return\n if (!input.fork) return selected\n return sdk.session.fork({ sessionID: selected.id })\n}\n\nasync function createSession(\n sdk: OpenCodeClient,\n directory: string,\n agent: string | undefined,\n model: RunInput[\"model\"],\n variant?: string,\n): Promise<Session> {\n if (model) await waitForCatalogReady({ sdk, directory, model })\n return sdk.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory },\n })\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { Model } from \"@opencode-ai/schema/model\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { loadRunAgents, waitForCatalogReady } from \"./catalog.shared\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { toolInlineInfo } from \"./tool\"\nimport type { MiniToolPart } from \"./types\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: 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\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return run(input).catch((error) => reportError(input, error instanceof Error ? error.message : String(error)))\n}\n\nasync function run(input: RunCommandInput) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = process.env.PWD ?? process.cwd()\n const directory = localDirectory(root)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const requestedDirectory = prepared.directory ?? (await client.location.get()).directory\n if (!requestedDirectory) fail(\"Failed to resolve server directory\")\n const session = await selectSession(client, requestedDirectory, input)\n const cwd = session?.location.directory ?? requestedDirectory\n const workspace = session?.location.workspaceID\n const explicit = parseRunModel(input.model)\n const explicitModel = explicit?.model\n const variant = explicit?.variant\n const sessionModel = session?.model ? { providerID: session.model.providerID, modelID: session.model.id } : undefined\n const defaultModel =\n !explicitModel && !sessionModel\n ? await client.model\n .default({ location: { directory: cwd, workspace } })\n .then((result) => (result.data ? { providerID: result.data.providerID, modelID: result.data.id } : undefined))\n : undefined\n const model = pickRunModel(explicitModel, variant, sessionModel, defaultModel)\n if (variant && !model) return reportError(input, \"Cannot select a variant before selecting a model\", session?.id)\n if (model) {\n await waitForCatalogReady({ sdk: client, directory: cwd, workspace, model })\n const available = await client.model.list({ location: { directory: cwd, workspace } })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.modelID))\n return reportError(input, `Model unavailable: ${model.providerID}/${model.modelID}`, session?.id)\n }\n const agent = await validateAgent(client, cwd, input.agent)\n const selected =\n session ??\n (await client.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory: cwd },\n }))\n if (!session && input.title !== undefined) {\n await client.session.rename({\n sessionID: selected.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: selected.id,\n message: prepared.message,\n files: prepared.files,\n agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: true,\n renderTool,\n renderToolError,\n }).catch((error) => reportError(input, error instanceof Error ? error.message : String(error), selected.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nexport function pickRunModel(\n explicit: { providerID: string; modelID: string } | undefined,\n variant: string | undefined,\n session: { providerID: string; modelID: string } | undefined,\n fallback: { providerID: string; modelID: string } | undefined,\n) {\n if (explicit) return explicit\n if (!variant) return\n return session ?? fallback\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n if (!value) return\n const ref = Model.Ref.parse(value)\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const agents = await loadRunAgents(client, directory).catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function selectSession(client: OpenCodeClient, directory: string, input: RunCommandInput) {\n const selected = input.session\n ? await client.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await client.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected || !input.fork) return selected\n return client.session.fork({ sessionID: selected.id })\n}\n\nasync function prepareFile(input: string, directory: string): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: MiniToolPart) {\n const info = toolInlineInfo(part)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: MiniToolPart) {\n const info = toolInlineInfo(part)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction reportError(input: RunCommandInput, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type { EventSubscribeOutput, OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { UI } from \"./ui\"\nimport type { MiniToolPart } from \"./types\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n renderTool: (part: MiniToolPart) => Promise<void>\n renderToolError: (part: MiniToolPart) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, unknown>\n raw?: string\n provider?: unknown\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let questionRejected = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let admission: AbortController | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const rejectQuestion = async (request: { id: string }) => {\n questionRejected = true\n await input.client.question.reject({ sessionID: input.sessionID, requestID: request.id }).catch(() => {})\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n formCancelled = true\n await input.client.form.cancel({ sessionID: request.sessionID, formID: request.id }).catch(() => {})\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (event.type === \"question.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await rejectQuestion(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached && event.data.form.sessionID === GLOBAL_FORM_SESSION_ID))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || questionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n tools.set(event.data.callID, {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(event.data.callID)\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.called\") {\n const current = tools.get(event.data.callID)\n tools.set(event.data.callID, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n })\n continue\n }\n if (event.type === \"session.tool.success\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: event.data.content\n .filter((item) => item.type === \"text\")\n .map((item) => item.text)\n .join(\"\\n\"),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(part)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const error = event.data.error.message\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) {\n await input.renderToolError(part)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (interrupted || permissionRejected || questionRejected || formCancelled) continue\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (!emittedError && !questionRejected && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, questions, forms] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.question.list({ sessionID: input.sessionID }).catch(() => undefined),\n Promise.all(\n (input.attached ? [input.sessionID] : [input.sessionID, GLOBAL_FORM_SESSION_ID]).map((sessionID) =>\n input.client.form.list({ sessionID }).catch(() => undefined),\n ),\n ),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(questions ?? []).map(rejectQuestion),\n ...forms.flatMap((response) => response ?? []).map(cancelForm),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, mime: file.mime, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await 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": "8B4C301C2139318264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/frontend/actions.ts", "../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "import { tmpdir } from \"node:os\"\nimport { extname, join, resolve } from \"node:path\"\nimport type { CliRenderer, Renderable } from \"@opentui/core\"\nimport {\n createMockKeys,\n createMockMouse,\n KeyCodes,\n type KeyInput,\n type MockInput,\n type MockMouse,\n} from \"@opentui/core/testing\"\nimport { Config, Effect, FileSystem } from \"effect\"\nimport type { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\n\nexport type Action = SimulationProtocol.Frontend.Action\nexport type Element = SimulationProtocol.Frontend.Element\n\nexport interface Harness {\n readonly renderer: CliRenderer\n readonly mockInput: MockInput\n readonly mockMouse: MockMouse\n readonly resize: (cols: number, rows: number) => void\n readonly renderOnce: () => Promise<void>\n readonly screen: () => string\n}\n\ntype RenderBuffer = {\n readonly width: number\n readonly height: number\n getRealCharBytes(includeAnsi?: boolean): Uint8Array\n}\n\nconst decoder = new TextDecoder()\n\nfunction isKeyCode(key: string): key is keyof typeof KeyCodes {\n return Object.hasOwn(KeyCodes, key)\n}\n\nfunction keyInput(key: string): KeyInput {\n const named = key.toUpperCase()\n return isKeyCode(named) ? named : key\n}\n\nfunction children(renderable: Renderable) {\n return renderable.getChildren().filter((child): child is Renderable => \"num\" in child)\n}\n\nfunction all(renderable: Renderable): Renderable[] {\n return [renderable, ...children(renderable).flatMap(all)]\n}\n\nfunction mouseListeners(renderable: Renderable) {\n const general = Reflect.get(renderable, \"_mouseListener\")\n const specific = Reflect.get(renderable, \"_mouseListeners\")\n return Boolean(general) || (specific && typeof specific === \"object\" && Object.keys(specific).length > 0)\n}\n\nfunction hit(renderer: CliRenderer, renderable: Renderable) {\n if (renderable.width <= 0 || renderable.height <= 0) return false\n const x = Math.floor(renderable.screenX + renderable.width / 2)\n const y = Math.floor(renderable.screenY + renderable.height / 2)\n return renderer.hitTest(x, y) === renderable.num\n}\n\n/**\n * Builds the harness the simulation server drives.\n *\n * When the renderer is the headless simulation renderer, its TestRendererSetup\n * provides the supported testing APIs. For the visible terminal renderer the\n * harness falls back to `requestRender` + `idle` and reading the private\n * `currentRenderBuffer`.\n */\nexport function createHarness(renderer: CliRenderer): Harness {\n const setup = SimulationRenderer.setupFor(renderer)\n return {\n renderer,\n mockInput: setup?.mockInput ?? createMockKeys(renderer),\n mockMouse: setup?.mockMouse ?? createMockMouse(renderer),\n resize: setup?.resize ?? ((cols, rows) => renderer.resize(cols, rows)),\n renderOnce:\n setup?.renderOnce ??\n (async () => {\n renderer.requestRender()\n await renderer.idle()\n }),\n // captureCharFrame follows the test renderer's output sink. Recording\n // redirects that sink to the timeline, so read the live render buffer\n // instead; it is also the source used by screenshots.\n screen: () => decoder.decode((Reflect.get(renderer, \"currentRenderBuffer\") as RenderBuffer).getRealCharBytes()),\n }\n}\n\nexport function elements(renderer: CliRenderer): Element[] {\n return all(renderer.root)\n .filter((renderable) => renderable.visible && !renderable.isDestroyed)\n .map((renderable) => {\n const clickable = mouseListeners(renderable) && hit(renderer, renderable)\n return {\n id: renderable.id,\n num: renderable.num,\n x: renderable.screenX,\n y: renderable.screenY,\n width: renderable.width,\n height: renderable.height,\n focusable: renderable.focusable,\n focused: renderable.focused,\n clickable,\n editor: renderer.currentFocusedEditor === renderable,\n } satisfies Element\n })\n .filter((element) => element.focusable || element.clickable || element.editor)\n}\n\nexport function state(harness: Harness) {\n return {\n focused: {\n renderable: harness.renderer.currentFocusedRenderable?.num,\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function matches(harness: Pick<Harness, \"screen\">, text: string) {\n return harness.screen().includes(text)\n}\n\nexport const capture = Effect.fn(\"SimulationActions.capture\")(function* (harness: Harness) {\n yield* Effect.tryPromise(() => harness.renderOnce())\n const buffer = harness.renderer.currentRenderBuffer\n return {\n cols: buffer.width,\n rows: buffer.height,\n cursor: [0, 0] as const,\n lines: buffer.getSpanLines().map((line) => ({\n spans: line.spans.map((span) => ({\n text: span.text,\n fg: span.fg.toInts(),\n bg: span.bg.toInts(),\n attributes: span.attributes,\n width: span.width,\n })),\n })),\n } satisfies SimulationProtocol.Frontend.CapturedFrame\n})\n\nexport const screenshot = Effect.fn(\"SimulationActions.screenshot\")(function* (harness: Harness, name?: string) {\n const filename = name ?? `screenshot-${crypto.randomUUID()}`\n if (!filename || filename.includes(\"/\") || filename.includes(\"\\\\\") || extname(filename))\n return yield* Effect.fail(new Error(\"screenshot name must not contain a path or extension\"))\n yield* Effect.tryPromise(() => harness.renderOnce())\n const { SimulationPng } = yield* Effect.promise(() => import(\"./png\"))\n const image = SimulationPng.screenshot(harness.renderer)\n const directory = resolve(\n yield* Config.string(\"OPENCODE_DRIVE_MEDIA_DIR\").pipe(\n Config.withDefault(join(tmpdir(), \"opencode-drive\", \"output\")),\n ),\n )\n const fs = yield* FileSystem.FileSystem\n yield* fs.makeDirectory(directory, { recursive: true })\n const path = join(directory, `${filename}.png`)\n yield* fs.writeFile(path, image.data)\n return path\n})\n\nexport const execute = Effect.fn(\"SimulationActions.execute\")(function* (harness: Harness, action: Action) {\n switch (action.type) {\n case \"ui.type\":\n yield* Effect.tryPromise(() => harness.mockInput.typeText(action.text))\n break\n case \"ui.press\":\n harness.mockInput.pressKey(keyInput(action.key), action.modifiers)\n break\n case \"ui.enter\":\n harness.mockInput.pressEnter()\n break\n case \"ui.arrow\":\n harness.mockInput.pressArrow(action.direction)\n break\n case \"ui.focus\":\n all(harness.renderer.root)\n .find((item) => item.num === action.target)\n ?.focus()\n break\n case \"ui.click\":\n yield* Effect.tryPromise(() => harness.mockMouse.click(action.x, action.y))\n break\n case \"ui.resize\":\n if (\n !Number.isSafeInteger(action.cols) ||\n action.cols <= 0 ||\n !Number.isSafeInteger(action.rows) ||\n action.rows <= 0\n ) {\n return yield* Effect.fail(new Error(\"resize cols and rows must be positive integers\"))\n }\n harness.resize(action.cols, action.rows)\n SimulationRenderer.recordResize(harness.renderer, action.cols, action.rows)\n break\n }\n yield* Effect.tryPromise(() => harness.renderOnce())\n return state(harness)\n})\n\nexport * as SimulationActions from \"./actions\"\n", | ||
| "import { createWriteStream, type WriteStream } from \"node:fs\"\nimport { mkdir } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { Writable } from \"node:stream\"\nimport { finished } from \"node:stream/promises\"\nimport { Schema } from \"effect\"\n\nexport const Header = Schema.Struct({\n type: Schema.Literal(\"header\"),\n version: Schema.Literal(1),\n cols: Schema.Number,\n rows: Schema.Number,\n encoding: Schema.Literal(\"base64\"),\n})\nexport interface Header extends Schema.Schema.Type<typeof Header> {}\n\nexport const Output = Schema.Struct({\n type: Schema.Literal(\"output\"),\n at_ms: Schema.Number,\n data: Schema.String,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n\nexport const Resize = Schema.Struct({\n type: Schema.Literal(\"resize\"),\n at_ms: Schema.Number,\n cols: Schema.Number,\n rows: Schema.Number,\n})\nexport interface Resize extends Schema.Schema.Type<typeof Resize> {}\n\nexport const Event = Schema.Union([Header, Output, Resize])\nexport type Event = Schema.Schema.Type<typeof Event>\n\nexport class Timeline extends Writable {\n readonly isTTY = true\n readonly path: string\n readonly columns: number\n readonly rows: number\n private readonly output: WriteStream\n private readonly started = performance.now()\n private readonly timestamps: number[] = []\n private done?: Promise<string>\n\n private constructor(path: string, cols: number, rows: number, output: WriteStream) {\n super()\n this.path = path\n this.columns = cols\n this.rows = rows\n this.output = output\n // finish() reports stream failures; keep Writable from also throwing them process-wide.\n this.on(\"error\", () => {})\n output.on(\"error\", (error) => this.destroy(error))\n }\n\n static async create(path: string, cols: number, rows: number) {\n await mkdir(dirname(path), { recursive: true })\n const output = createWriteStream(path)\n const timeline = new Timeline(path, cols, rows, output)\n await new Promise<void>((resolve, reject) => {\n output.write(\n `${JSON.stringify({ type: \"header\", version: 1, cols, rows, encoding: \"base64\" } satisfies Header)}\\n`,\n (error) => (error ? reject(error) : resolve()),\n )\n })\n return timeline\n }\n\n getColorDepth() {\n return 24\n }\n\n override write(chunk: unknown, callback?: (error?: Error | null) => void): boolean\n override write(chunk: unknown, encoding: BufferEncoding, callback?: (error?: Error | null) => void): boolean\n override write(\n chunk: unknown,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ) {\n if (!this.writableEnded) {\n this.timestamps.push(this.elapsed())\n if (typeof encoding === \"function\") return super.write(chunk, encoding)\n if (encoding === undefined) return super.write(chunk, callback)\n return super.write(chunk, encoding, callback)\n }\n const done = typeof encoding === \"function\" ? encoding : callback\n queueMicrotask(() => done?.(null))\n return true\n }\n\n override _write(chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void) {\n this.writeOutput(chunk, this.timestamps.shift() ?? this.elapsed(), callback)\n }\n\n override _final(callback: (error?: Error | null) => void) {\n this.writeOutput(Buffer.alloc(0), this.elapsed(), (error) => {\n if (error) return callback(error)\n this.output.end(callback)\n })\n }\n\n finish() {\n if (this.done) return this.done\n this.end()\n this.done = finished(this).then(() => this.path)\n return this.done\n }\n\n resize(cols: number, rows: number) {\n if (this.writableEnded) return\n const event = { type: \"resize\", at_ms: this.elapsed(), cols, rows } satisfies Resize\n this.output.write(`${JSON.stringify(event)}\\n`)\n }\n\n private elapsed() {\n return Math.max(0, Math.round(performance.now() - this.started))\n }\n\n private writeOutput(data: Buffer, at_ms: number, callback: (error?: Error | null) => void) {\n const event = {\n type: \"output\",\n at_ms,\n data: data.toString(\"base64\"),\n } satisfies Output\n this.output.write(`${JSON.stringify(event)}\\n`, callback)\n }\n}\n\nexport * as SimulationRecording from \"./recording\"\n", | ||
| "import type { CliRenderer, CliRendererConfig } from \"@opentui/core\"\nimport { createTestRenderer, type TestRendererSetup } from \"@opentui/core/testing\"\nimport { Effect } from \"effect\"\nimport { Timeline } from \"../recording\"\n\nconst setups = new WeakMap<CliRenderer, TestRendererSetup>()\nconst recordings = new WeakMap<CliRenderer, Timeline>()\n\n/**\n * Creates a headless renderer with optional recording: a real CliRenderer\n * backed by an in-memory screen buffer. The TestRendererSetup is kept\n * module-side so the harness can use supported testing APIs without app\n * code carrying it around.\n */\nexport interface Viewport {\n readonly cols: number\n readonly rows: number\n}\n\nexport const create = Effect.fn(\"SimulationRenderer.create\")(function* (\n options: CliRendererConfig,\n path?: string,\n viewport?: Viewport,\n) {\n const cols = viewport?.cols ?? 100\n const rows = viewport?.rows ?? 40\n const recording = path\n ? yield* Effect.acquireRelease(\n Effect.tryPromise(() => Timeline.create(path, cols, rows)),\n (recording) =>\n Effect.tryPromise(() => recording.finish()).pipe(\n Effect.catch((error) =>\n Effect.sync(() => process.stderr.write(`Failed to finish UI recording: ${error}\\n`)),\n ),\n ),\n )\n : undefined\n const setup = yield* Effect.acquireRelease(\n Effect.tryPromise(() =>\n createTestRenderer({\n ...options,\n width: cols,\n height: rows,\n ...(recording\n ? {\n stdout: recording as unknown as NodeJS.WriteStream,\n bufferedOutput: \"stdout\" as const,\n }\n : {}),\n }),\n ),\n (setup) =>\n Effect.sync(() => {\n if (!setup.renderer.isDestroyed) setup.renderer.destroy()\n }),\n )\n setups.set(setup.renderer, setup)\n if (recording) recordings.set(setup.renderer, recording)\n return setup.renderer\n})\n\nexport function recordResize(renderer: CliRenderer, cols: number, rows: number) {\n recordings.get(renderer)?.resize(cols, rows)\n}\n\nexport function setupFor(renderer: CliRenderer): TestRendererSetup | undefined {\n return setups.get(renderer)\n}\n\nexport function finish(renderer: CliRenderer) {\n const recording = recordings.get(renderer)\n if (!recording) return Effect.fail(new Error(\"UI recording is not available\"))\n return Effect.tryPromise(() => recording.finish())\n}\n\nexport * as SimulationRenderer from \"./renderer\"\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationActions, type Harness } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\n\nfunction handle(harness: Harness, request: SimulationProtocol.Frontend.Request) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.screenshot\":\n return SimulationActions.screenshot(harness, request.params?.name)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.matches\":\n return Effect.sync(() => SimulationActions.matches(harness, request.params.text))\n case \"ui.recording.finish\":\n return SimulationRenderer.finish(harness.renderer)\n case \"ui.type\":\n return SimulationActions.execute(harness, { type: \"ui.type\", text: request.params.text })\n case \"ui.enter\":\n return SimulationActions.execute(harness, { type: \"ui.enter\" })\n case \"ui.press\":\n return SimulationActions.execute(harness, {\n type: \"ui.press\",\n key: request.params.key,\n modifiers: request.params.modifiers,\n })\n case \"ui.arrow\":\n return SimulationActions.execute(harness, { type: \"ui.arrow\", direction: request.params.direction })\n case \"ui.focus\":\n return SimulationActions.execute(harness, { type: \"ui.focus\", target: request.params.target })\n case \"ui.click\":\n return SimulationActions.execute(harness, {\n type: \"ui.click\",\n target: request.params.target,\n x: request.params.x,\n y: request.params.y,\n })\n case \"ui.resize\":\n return SimulationActions.execute(harness, {\n type: \"ui.resize\",\n cols: request.params.cols,\n rows: request.params.rows,\n })\n }\n}\n\nexport const start = Effect.fn(\"SimulationServer.start\")(function* (harness: Harness, endpoint: string) {\n return yield* SimulationControlServer.start({\n endpoint,\n label: \"opencode drive ui websocket\",\n data: () => ({ drive: true as const }),\n decode: SimulationProtocol.Frontend.decodeRequestEffect,\n handle: (_socket, request) => handle(harness, request),\n })\n})\n\nexport * as SimulationServer from \"./server\"\n", | ||
| "import { createCliRenderer, type CliRendererConfig } from \"@opentui/core\"\nimport { Config, Effect } from \"effect\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationActions } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationServer } from \"./server\"\n\n/** Drive-mode renderer and control-server acquisition. */\nexport const create = Effect.fn(\"Drive.create\")(function* (options: CliRendererConfig) {\n const headless = (yield* Config.string(\"OPENCODE_DRIVE_RENDERER\").pipe(Config.withDefault(\"visible\"))) === \"headless\"\n const manifest = yield* DriveManifest.resolve()\n const renderer = headless\n ? yield* SimulationRenderer.create(options, manifest.recording?.timeline, manifest.viewport)\n : yield* Effect.acquireRelease(\n Effect.tryPromise(() => createCliRenderer(options)),\n (renderer) =>\n Effect.sync(() => {\n if (!renderer.isDestroyed) renderer.destroy()\n }),\n )\n if (!headless && manifest.viewport) renderer.resize(manifest.viewport.cols, manifest.viewport.rows)\n const server = yield* SimulationServer.start(SimulationActions.createHarness(renderer), manifest.endpoints.ui)\n yield* Effect.sync(() => process.stderr.write(`opencode drive ui websocket: ${server.url}\\n`))\n return renderer\n})\n\nexport * as Drive from \"./simulation\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "1BBCC566840A3BC464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "80EDB680009F457664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH", | ||
| "debugId": "07C82177AEAB925E64756E2164756E21", | ||
| "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": ";u9BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,MACH", | ||
| "debugId": "58B8C4AFD2D8AA9D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/variant.shared.ts", "src/mini/session.shared.ts", "src/mini/theme.ts"], | ||
| "sourcesContent": [ | ||
| "// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > saved preference > session history.\n//\n// The saved variant persists across sessions in ~/.local/state/opencode/model.json\n// so your last-used variant sticks. Cycling (ctrl+t) updates both the active\n// variant and the persisted file.\nimport path from \"path\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { makeGlobalNode } from \"@opencode-ai/core/effect/app-node\"\nimport { makeRuntime } from \"@opencode-ai/core/effect/runtime\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\n\nconst MODEL_FILE = path.join(Global.Path.state, \"model.json\")\n\ntype ModelState = Record<string, unknown> & {\n variant?: Record<string, string | undefined>\n}\ntype VariantService = {\n readonly resolveSavedVariant: (model: RunInput[\"model\"]) => Effect.Effect<string | undefined>\n readonly saveVariant: (model: RunInput[\"model\"], variant: string | undefined) => Effect.Effect<void>\n}\ntype VariantRuntime = {\n resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined>\n saveVariant(model: RunInput[\"model\"], variant: string | undefined): Promise<void>\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n\nclass Service extends Context.Service<Service, VariantService>()(\"@opencode/RunVariant\") {}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction variantKey(model: NonNullable<RunInput[\"model\"]>): string {\n return modelKey(model.providerID, model.modelID)\n}\n\nexport function modelInfo(providers: RunProvider[] | undefined, model: NonNullable<RunInput[\"model\"]>) {\n const provider = providers?.find((item) => item.id === model.providerID)\n return {\n provider: provider?.name ?? model.providerID,\n model: provider?.models[model.modelID]?.name ?? model.modelID,\n }\n}\n\nexport function formatModelLabel(\n model: NonNullable<RunInput[\"model\"]>,\n variant: string | undefined,\n providers?: RunProvider[],\n): string {\n const names = modelInfo(providers, model)\n const label = variant ? ` · ${variant}` : \"\"\n return `${names.model} · ${names.provider}${label}`\n}\n\nexport function cycleVariant(current: string | undefined, variants: string[]): string | undefined {\n if (variants.length === 0) {\n return undefined\n }\n\n if (!current) {\n return variants[0]\n }\n\n const idx = variants.indexOf(current)\n if (idx === -1 || idx === variants.length - 1) {\n return undefined\n }\n\n return variants[idx + 1]\n}\n\nexport function pickVariant(model: RunInput[\"model\"], input: RunSession | SessionMessages): string | undefined {\n return sessionVariant(Array.isArray(input) ? createSession(input) : input, model)\n}\n\nfunction fitVariant(value: string | undefined, variants: string[]): string | undefined {\n if (!value) {\n return undefined\n }\n\n if (variants.length === 0 || variants.includes(value)) {\n return value\n }\n\n return undefined\n}\n\n// Picks the active variant. CLI flag wins, then saved preference, then session\n// history. fitVariant() checks saved and session values against the available\n// variants list -- if the provider doesn't offer a variant, it drops.\nexport function resolveVariant(\n input: string | undefined,\n session: string | undefined,\n saved: string | undefined,\n variants: string[],\n): string | undefined {\n if (input !== undefined) {\n return input\n }\n\n const fallback = fitVariant(saved, variants)\n const current = fitVariant(session, variants)\n if (current !== undefined) {\n return current\n }\n\n return fallback\n}\n\nfunction state(value: unknown): ModelState {\n if (!isRecord(value)) {\n return {}\n }\n\n const variant = isRecord(value.variant)\n ? Object.fromEntries(\n Object.entries(value.variant).flatMap(([key, item]) => {\n if (typeof item !== \"string\") {\n return []\n }\n\n return [[key, item] as const]\n }),\n )\n : undefined\n\n return {\n ...value,\n variant,\n }\n}\n\nconst layer = Layer.fresh(\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const file = yield* FSUtil.Service\n\n const read = Effect.fn(\"RunVariant.read\")(function* () {\n return yield* file.readJson(MODEL_FILE).pipe(\n Effect.map(state),\n Effect.catchCause(() => Effect.succeed(state(undefined))),\n )\n })\n\n const resolveSavedVariant = Effect.fn(\"RunVariant.resolveSavedVariant\")(function* (model: RunInput[\"model\"]) {\n if (!model) {\n return undefined\n }\n\n return (yield* read()).variant?.[variantKey(model)]\n })\n\n const saveVariant = Effect.fn(\"RunVariant.saveVariant\")(function* (\n model: RunInput[\"model\"],\n variant: string | undefined,\n ) {\n if (!model) {\n return\n }\n\n const current = yield* read()\n const next = {\n ...current.variant,\n }\n const key = variantKey(model)\n if (variant) {\n next[key] = variant\n }\n\n if (!variant) {\n delete next[key]\n }\n\n yield* file\n .writeJson(MODEL_FILE, {\n ...current,\n variant: next,\n })\n .pipe(Effect.orElseSucceed(() => undefined))\n })\n\n return Service.of({\n resolveSavedVariant,\n saveVariant,\n })\n }),\n ),\n)\n\nconst node = makeGlobalNode({ service: Service, layer, deps: [FSUtil.node] })\n\n/** @internal Exported for testing. */\nexport function createVariantRuntime(replacements?: readonly LayerNode.Replacement[]): VariantRuntime {\n const runtime = makeRuntime(Service, AppNodeBuilder.build(node, replacements))\n return {\n resolveSavedVariant: (model) => runtime.runPromise((svc) => svc.resolveSavedVariant(model)).catch(() => undefined),\n saveVariant: (model, variant) => runtime.runPromise((svc) => svc.saveVariant(model, variant)).catch(() => {}),\n }\n}\n\nconst runtime = createVariantRuntime()\n\nexport async function resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined> {\n return runtime.resolveSavedVariant(model)\n}\n\nexport function saveVariant(model: RunInput[\"model\"], variant: string | undefined): void {\n void runtime.saveVariant(model, variant)\n}\n", | ||
| "import type { SessionMessageInfo, SessionMessageUser } from \"@opencode-ai/client/promise\"\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = SessionMessageInfo[]\n\ntype Turn = {\n prompt: RunPrompt\n provider: string | undefined\n model: string | undefined\n variant: string | undefined\n}\n\nexport type RunSession = {\n first: boolean\n turns: Turn[]\n model?: NonNullable<RunInput[\"model\"]>\n variant?: string\n}\n\nfunction messagePrompt(message: SessionMessageUser): RunPrompt {\n return {\n text: message.text,\n parts: [\n ...(message.files ?? []).map((file) => ({\n type: \"file\" as const,\n url: file.source.type === \"uri\" ? file.source.uri : `data:${file.mime};base64,${file.data}`,\n mime: file.mime,\n filename: file.name,\n source: file.mention\n ? {\n type: \"file\",\n path: file.name ?? (file.source.type === \"uri\" ? file.source.uri : \"inline attachment\"),\n text: { start: file.mention.start, end: file.mention.end, value: file.mention.text },\n }\n : undefined,\n })),\n ...(message.agents ?? []).map((agent) => ({\n type: \"agent\" as const,\n name: agent.name,\n source: agent.mention\n ? { start: agent.mention.start, end: agent.mention.end, value: agent.mention.text }\n : undefined,\n })),\n ],\n }\n}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) =>\n message.type === \"user\"\n ? [{ prompt: messagePrompt(message), provider: undefined, model: undefined, variant: undefined }]\n : [],\n ),\n }\n}\n\nexport async function resolveCurrentSession(\n sdk: RunInput[\"sdk\"],\n sessionID: string,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }),\n sdk.session.get({ sessionID }),\n ])\n const current = createSession(response.data.toReversed())\n return {\n ...current,\n turns: current.turns.map((turn) => ({\n ...turn,\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n })),\n ...(session.model && {\n model: { providerID: session.model.providerID, modelID: session.model.id },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n return session.turns\n .map((turn) => turn.prompt)\n .filter((prompt) => prompt.text.trim())\n .filter((prompt, index, prompts) => index === 0 || !promptSame(prompts[index - 1], prompt))\n .map(promptCopy)\n .slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) return\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) return session.variant\n\n return session.turns.findLast((turn) => turn.provider === model.providerID && turn.model === model.modelID)?.variant\n}\n", | ||
| "// Theme resolution for direct interactive mode.\n//\n// Derives scrollback and footer colors from the terminal's actual palette.\n// resolveRunTheme() queries the renderer for the terminal's palette,\n// detects dark/light mode, builds a small system theme locally, and maps it to\n// the run footer + scrollback color model. Falls back to a hardcoded dark-mode\n// palette if detection fails.\nimport { RGBA, SyntaxStyle, type CliRenderer, type ColorInput, type TerminalColors } from \"@opentui/core\"\nimport type { TuiThemeCurrent } from \"@opencode-ai/plugin/tui\"\nimport type { EntryKind } from \"./types\"\n\ntype Tone = {\n body: ColorInput\n start?: ColorInput\n}\n\nexport type RunEntryTheme = Record<EntryKind, Tone>\n\nexport type RunSplashTheme = {\n left: ColorInput\n right: ColorInput\n leftShadow: ColorInput\n rightShadow: ColorInput\n}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: ColorInput\n success: ColorInput\n error: ColorInput\n muted: ColorInput\n text: ColorInput\n status: ColorInput\n statusAccent: ColorInput\n shade: ColorInput\n surface: ColorInput\n pane: ColorInput\n border: ColorInput\n line: ColorInput\n}\n\nexport type RunBlockTheme = {\n highlight: ColorInput\n warning: ColorInput\n text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\n diffAdded: ColorInput\n diffRemoved: ColorInput\n diffAddedBg: ColorInput\n diffRemovedBg: ColorInput\n diffContextBg: ColorInput\n diffHighlightAdded: ColorInput\n diffHighlightRemoved: ColorInput\n diffLineNumber: ColorInput\n diffAddedLineNumberBg: ColorInput\n diffRemovedLineNumberBg: ColorInput\n}\n\nexport type RunTheme = {\n background: ColorInput\n footer: RunFooterTheme\n entry: RunEntryTheme\n splash: RunSplashTheme\n block: RunBlockTheme\n}\n\ntype ThemeColor = Exclude<keyof TuiThemeCurrent, \"thinkingOpacity\">\ntype HexColor = `#${string}`\ntype RefName = string\ntype Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\ntype ColorValue = HexColor | RefName | Variant | RGBA | number\ntype ThemeJson = {\n defs?: Record<string, HexColor | RefName>\n theme: Omit<Record<ThemeColor, ColorValue>, \"selectedListItemText\" | \"backgroundMenu\"> & {\n selectedListItemText?: ColorValue\n backgroundMenu?: ColorValue\n thinkingOpacity?: number\n }\n}\n\ntype SharedSyntaxTheme = TuiThemeCurrent & {\n _hasSelectedListItemText: boolean\n}\n\nexport const transparent = RGBA.fromValues(0, 0, 0, 0)\n\nfunction alpha(color: RGBA, value: number): RGBA {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, value)))\n}\n\nfunction rgba(hex: string, value?: number): RGBA {\n const color = RGBA.fromHex(hex)\n return value === undefined ? color : alpha(color, value)\n}\n\nfunction mode(bg: RGBA): \"dark\" | \"light\" {\n return luminance(bg) > 0.5 ? \"light\" : \"dark\"\n}\n\nfunction luminance(color: RGBA): number {\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b\n}\n\nfunction fade(color: RGBA, base: RGBA, fallback: number, scale: number, limit: number): RGBA {\n if (color.a === 0) {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, fallback)))\n }\n\n const target = Math.min(limit, color.a * scale)\n const mix = Math.min(1, target / color.a)\n\n return RGBA.fromValues(\n base.r + (color.r - base.r) * mix,\n base.g + (color.g - base.g) * mix,\n base.b + (color.b - base.b) * mix,\n color.a,\n )\n}\n\nfunction ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansi = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansi[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const value = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(value(r), value(g), value(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nfunction tint(base: RGBA, overlay: RGBA, value: number): RGBA {\n return RGBA.fromInts(\n Math.round((base.r + (overlay.r - base.r) * value) * 255),\n Math.round((base.g + (overlay.g - base.g) * value) * 255),\n Math.round((base.b + (overlay.b - base.b) * value) * 255),\n )\n}\n\nfunction chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\n}\n\nfunction indexedPalette(colors: TerminalColors, size: number = Math.max(colors.palette.length, 16)): RGBA[] {\n return Array.from({ length: size }, (_, index) => {\n const value = colors.palette[index]\n return RGBA.fromIndex(index, value ? RGBA.fromHex(value) : ansiToRgba(index))\n })\n}\n\nfunction srgbToLinear(value: number): number {\n if (value <= 0.04045) {\n return value / 12.92\n }\n\n return ((value + 0.055) / 1.055) ** 2.4\n}\n\nfunction oklab(color: RGBA) {\n const r = srgbToLinear(color.r)\n const g = srgbToLinear(color.g)\n const b = srgbToLinear(color.b)\n\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b)\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b)\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b)\n\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\nfunction nearestIndexed(indexed: RGBA[], rgba: RGBA): RGBA {\n const target = oklab(rgba)\n const hit = indexed.reduce(\n (best, item) => {\n const sample = oklab(item)\n const dl = sample.l - target.l\n const da = sample.a - target.a\n const db = sample.b - target.b\n const dist = dl * dl * 2 + da * da + db * db\n if (dist >= best.dist) return best\n return {\n dist,\n item,\n }\n },\n {\n dist: Number.POSITIVE_INFINITY,\n item: indexed[0]!,\n },\n )\n\n return RGBA.clone(hit.item)\n}\n\nfunction paletteColor(colors: TerminalColors, index: number): RGBA {\n const value = colors.palette[index]\n return value ? RGBA.fromHex(value) : ansiToRgba(index)\n}\n\nfunction splashShadow(indexed: RGBA[], base: RGBA, overlay: RGBA, value: number): RGBA {\n const mixed = tint(base, overlay, value)\n return nearestIndexed(indexed, mixed)\n}\n\nexport function resolveTheme(theme: ThemeJson, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const defs = theme.defs ?? {}\n\n const resolveColor = (value: ColorValue, chain: string[] = []): RGBA => {\n if (value instanceof RGBA) return value\n\n if (typeof value === \"number\") {\n return RGBA.fromIndex(value, ansiToRgba(value))\n }\n\n if (typeof value !== \"string\") {\n return resolveColor(value[pick], chain)\n }\n\n if (value === \"transparent\" || value === \"none\") {\n return RGBA.fromInts(0, 0, 0, 0)\n }\n\n if (value.startsWith(\"#\")) {\n return RGBA.fromHex(value)\n }\n\n if (chain.includes(value)) {\n throw new Error(`Circular color reference: ${[...chain, value].join(\" -> \")}`)\n }\n\n const next = defs[value] ?? theme.theme[value as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${value}\" not found in defs or theme`)\n }\n\n return resolveColor(next, [...chain, value])\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText:\n theme.theme.selectedListItemText === undefined\n ? resolved.background!\n : resolveColor(theme.theme.selectedListItemText),\n backgroundMenu:\n theme.theme.backgroundMenu === undefined ? resolved.backgroundElement! : resolveColor(theme.theme.backgroundMenu),\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): Record<number, RGBA> {\n const r = bg.r * 255\n const g = bg.g * 255\n const b = bg.b * 255\n const lum = 0.299 * r + 0.587 * g + 0.114 * b\n const cast = 0.25 * (1 - chroma(bg)) ** 2\n\n const gray = (level: number) => {\n const factor = level / 12\n\n if (isDark && lum < 10) {\n const value = Math.floor(factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n if (!isDark && lum > 245) {\n const value = Math.floor(255 - factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n const value = isDark ? lum + (255 - lum) * factor * 0.4 : lum * (1 - factor * 0.4)\n const tone = RGBA.fromInts(Math.floor(value), Math.floor(value), Math.floor(value))\n if (cast === 0) return map(tone)\n\n const ratio = lum === 0 ? 0 : value / lum\n return map(\n tint(\n tone,\n RGBA.fromInts(\n Math.floor(Math.max(0, Math.min(r * ratio, 255))),\n Math.floor(Math.max(0, Math.min(g * ratio, 255))),\n Math.floor(Math.max(0, Math.min(b * ratio, 255))),\n ),\n cast,\n ),\n )\n }\n\n return Object.fromEntries(Array.from({ length: 12 }, (_, index) => [index + 1, gray(index + 1)]))\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): RGBA {\n const lum = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n const gray = isDark\n ? lum < 10\n ? 180\n : Math.min(Math.floor(160 + lum * 0.3), 200)\n : lum > 245\n ? 75\n : Math.max(Math.floor(100 - (255 - lum) * 0.2), 60)\n\n return map(RGBA.fromInts(gray, gray, gray))\n}\n\nexport function generateSystem(colors: TerminalColors, pick: \"dark\" | \"light\"): ThemeJson {\n const bg_snapshot = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg_snapshot = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const bg = RGBA.defaultBackground(bg_snapshot)\n const fg = RGBA.defaultForeground(fg_snapshot)\n const isDark = pick === \"dark\"\n\n const color = (index: number) => paletteColor(colors, index)\n\n const grays = generateGrayScale(bg_snapshot, isDark, (rgba) => rgba)\n const textMuted = generateMutedTextColor(bg_snapshot, isDark, (rgba) => rgba)\n\n const ansi = {\n red: color(1),\n green: color(2),\n yellow: color(3),\n blue: color(4),\n magenta: color(5),\n cyan: color(6),\n red_bright: color(9),\n green_bright: color(10),\n }\n\n const diff_alpha = isDark ? 0.22 : 0.14\n const diff_context_bg = grays[2]\n const primary = ansi.cyan\n const secondary = ansi.magenta\n\n return {\n theme: {\n primary,\n secondary,\n accent: primary,\n error: ansi.red,\n warning: ansi.yellow,\n success: ansi.green,\n info: ansi.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: alpha(bg, 0),\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansi.green,\n diffRemoved: ansi.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansi.green_bright,\n diffHighlightRemoved: ansi.red_bright,\n diffAddedBg: tint(bg_snapshot, ansi.green, diff_alpha),\n diffRemovedBg: tint(bg_snapshot, ansi.red, diff_alpha),\n diffContextBg: diff_context_bg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg: tint(diff_context_bg, ansi.green, diff_alpha),\n diffRemovedLineNumberBg: tint(diff_context_bg, ansi.red, diff_alpha),\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansi.blue,\n markdownLinkText: ansi.cyan,\n markdownCode: ansi.green,\n markdownBlockQuote: ansi.yellow,\n markdownEmph: ansi.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansi.blue,\n markdownListEnumeration: ansi.cyan,\n markdownImage: ansi.blue,\n markdownImageText: ansi.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansi.magenta,\n syntaxFunction: ansi.blue,\n syntaxVariable: fg,\n syntaxString: ansi.green,\n syntaxNumber: ansi.yellow,\n syntaxType: ansi.cyan,\n syntaxOperator: ansi.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction quantizeColor(indexed: RGBA[], rgba: RGBA): RGBA {\n if (rgba.a === 0 || rgba.intent === \"default\" || rgba.intent === \"indexed\") {\n return RGBA.clone(rgba)\n }\n\n return nearestIndexed(indexed, rgba)\n}\n\nfunction quantizeTheme(theme: TuiThemeCurrent, indexed: RGBA[]): TuiThemeCurrent {\n const resolved = Object.fromEntries(\n Object.entries(theme)\n .filter(([key]) => key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, quantizeColor(indexed, value as RGBA)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n thinkingOpacity: theme.thinkingOpacity,\n }\n}\n\nfunction splashTheme(theme: TuiThemeCurrent, indexed: RGBA[]): RunSplashTheme {\n const left = nearestIndexed(indexed, theme.textMuted)\n const right = nearestIndexed(indexed, theme.text)\n return {\n left,\n right,\n leftShadow: splashShadow(indexed, theme.background, left, 0.14),\n rightShadow: splashShadow(indexed, theme.background, right, 0.14),\n }\n}\n\nfunction map(\n footerTheme: TuiThemeCurrent,\n scrollbackTheme: TuiThemeCurrent,\n splash: RunSplashTheme,\n syntax?: SyntaxStyle,\n): RunTheme {\n const footerBackground = alpha(footerTheme.background, 1)\n const footerMode = mode(footerBackground)\n const shade = fade(footerTheme.backgroundMenu, footerTheme.background, 0.12, 0.56, 0.72)\n const surface = fade(footerTheme.backgroundMenu, footerTheme.background, 0.18, 0.76, 0.9)\n const line = fade(footerTheme.backgroundMenu, footerTheme.background, 0.24, 0.9, 0.98)\n const statusBase = tint(footerBackground, rgba(\"#000000\"), footerMode === \"dark\" ? 0.12 : 0.06)\n const statusAccentBase =\n footerMode === \"dark\" ? tint(footerBackground, rgba(\"#ffffff\"), 0.06) : tint(statusBase, rgba(\"#000000\"), 0.04)\n const collapsedStatus = footerMode === \"dark\" && luminance(statusBase) <= 0.04\n // Pure-black backgrounds need a slight lift or the row disappears into the terminal background.\n const status = collapsedStatus ? tint(statusBase, statusAccentBase, 0.7) : statusBase\n const statusAccent = collapsedStatus ? tint(status, rgba(\"#ffffff\"), 0.06) : statusAccentBase\n\n return {\n background: footerTheme.background,\n footer: {\n highlight: footerTheme.primary,\n selected: footerTheme.backgroundElement,\n selectedText: footerTheme.selectedListItemText,\n warning: footerTheme.warning,\n success: footerTheme.success,\n error: footerTheme.error,\n muted: footerTheme.textMuted,\n text: footerTheme.text,\n status,\n statusAccent,\n shade,\n surface,\n pane: footerTheme.backgroundMenu,\n border: footerTheme.border,\n line,\n },\n entry: {\n system: {\n body: scrollbackTheme.textMuted,\n },\n user: {\n body: scrollbackTheme.primary,\n },\n assistant: {\n body: scrollbackTheme.text,\n },\n reasoning: {\n body: scrollbackTheme.textMuted,\n },\n tool: {\n body: scrollbackTheme.text,\n start: scrollbackTheme.textMuted,\n },\n error: {\n body: scrollbackTheme.error,\n },\n },\n splash,\n block: {\n highlight: scrollbackTheme.primary,\n warning: scrollbackTheme.warning,\n text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\n diffAdded: scrollbackTheme.diffAdded,\n diffRemoved: scrollbackTheme.diffRemoved,\n diffAddedBg: transparent,\n diffRemovedBg: transparent,\n diffContextBg: transparent,\n diffHighlightAdded: scrollbackTheme.diffHighlightAdded,\n diffHighlightRemoved: scrollbackTheme.diffHighlightRemoved,\n diffLineNumber: scrollbackTheme.diffLineNumber,\n diffAddedLineNumberBg: scrollbackTheme.diffAddedLineNumberBg,\n diffRemovedLineNumberBg: scrollbackTheme.diffRemovedLineNumberBg,\n },\n }\n}\n\nconst seed = {\n highlight: RGBA.fromIndex(6, rgba(\"#38bdf8\")),\n muted: RGBA.fromIndex(8, rgba(\"#64748b\")),\n text: RGBA.defaultForeground(rgba(\"#f8fafc\")),\n panel: rgba(\"#0f172a\"),\n success: RGBA.fromIndex(2, rgba(\"#22c55e\")),\n warning: RGBA.fromIndex(3, rgba(\"#f59e0b\")),\n error: RGBA.fromIndex(1, rgba(\"#ef4444\")),\n}\n\nfunction tone(body: ColorInput, start?: ColorInput): Tone {\n return {\n body,\n start,\n }\n}\n\nconst fallbackSplashIndexed = Array.from({ length: 256 }, (_, index) => RGBA.fromIndex(index))\nconst fallbackSplashLeft = RGBA.fromIndex(67)\nconst fallbackSplashRight = RGBA.fromIndex(110)\n\nexport const RUN_THEME_FALLBACK: RunTheme = {\n background: RGBA.fromValues(0, 0, 0, 0),\n footer: {\n highlight: seed.highlight,\n selected: seed.text,\n selectedText: seed.panel,\n warning: seed.warning,\n success: seed.success,\n error: seed.error,\n muted: seed.muted,\n text: seed.text,\n status: tint(seed.panel, rgba(\"#000000\"), 0.12),\n statusAccent: tint(seed.panel, rgba(\"#ffffff\"), 0.06),\n shade: alpha(seed.panel, 0.68),\n surface: alpha(seed.panel, 0.86),\n pane: seed.panel,\n border: seed.muted,\n line: alpha(seed.panel, 0.96),\n },\n entry: {\n system: tone(seed.muted),\n user: tone(seed.highlight),\n assistant: tone(seed.text),\n reasoning: tone(seed.muted),\n tool: tone(seed.text, seed.muted),\n error: tone(seed.error),\n },\n splash: {\n left: fallbackSplashLeft,\n right: fallbackSplashRight,\n leftShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashLeft, 0.14),\n rightShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashRight, 0.14),\n },\n block: {\n highlight: seed.highlight,\n warning: seed.warning,\n text: seed.text,\n muted: seed.muted,\n diffAdded: seed.success,\n diffRemoved: seed.error,\n diffAddedBg: alpha(seed.success, 0.18),\n diffRemovedBg: alpha(seed.error, 0.18),\n diffContextBg: alpha(seed.panel, 0.72),\n diffHighlightAdded: seed.success,\n diffHighlightRemoved: seed.error,\n diffLineNumber: seed.muted,\n diffAddedLineNumberBg: alpha(seed.success, 0.12),\n diffRemovedLineNumberBg: alpha(seed.error, 0.12),\n },\n}\n\nexport async function resolveRunTheme(renderer: CliRenderer): Promise<RunTheme> {\n try {\n const colors = await renderer.getPalette({\n size: 256,\n })\n const bg = colors.defaultBackground ?? colors.palette[0]\n if (!bg) {\n return RUN_THEME_FALLBACK\n }\n\n // Palette-only terminal reloads can leave renderer.themeMode stale, but\n // ANSI slot zero is not the terminal background when OSC 11 is absent.\n const pick = colors.defaultBackground\n ? mode(RGBA.fromHex(colors.defaultBackground))\n : (renderer.themeMode ?? mode(RGBA.fromHex(bg)))\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const indexed = indexedPalette(colors, 256)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const shared = await import(\"@opencode-ai/tui/context/theme\")\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n const syntax = shared.generateSyntax(syntaxTheme)\n return map(footerTheme, scrollbackTheme, splashTheme(scrollbackTheme, indexed), syntax)\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "5AF66EE33E35AA2964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write((yield* ServiceConfig.get(Option.getOrUndefined(input.key))) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";k9BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,SAAI,OAAO,oBAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "DF0AE7714548916264756E2164756E21", | ||
| "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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "861C62B6A952B1E164756E2164756E21", | ||
| "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": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "ED485526DD60927D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, 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": ";ojCAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,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": "E39C5FF42BA45E1964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts", "src/util/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n return {\n file,\n version: InstallationVersion,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n", | ||
| "import path from \"node:path\"\n\nexport function selfCommand() {\n const runtime = path.basename(process.execPath, path.extname(process.execPath)).toLowerCase()\n if (runtime !== \"bun\" && runtime !== \"node\" && runtime !== \"nodejs\") return [process.execPath]\n if (!process.argv[1]) throw new Error(\"Failed to resolve CLI entrypoint\")\n if (runtime === \"node\" || runtime === \"nodejs\") return [process.execPath, ...nodeFlags(), process.argv[1]]\n return [process.execPath, process.argv[1]]\n}\n\nfunction nodeFlags() {\n return process.execArgv.flatMap((arg, index, args) => {\n if (index > 0 && args[index - 1] === \"--conditions\") return []\n if (arg === \"--conditions\") return args[index + 1] ? [arg, args[index + 1]] : []\n if (arg.startsWith(\"--conditions=\")) return [arg]\n if (\n arg === \"--experimental-ffi\" ||\n arg === \"--use-system-ca\" ||\n arg === \"--enable-source-maps\" ||\n arg === \"--no-addons\"\n )\n return [arg]\n if (arg === \"--no-warnings\" || arg.startsWith(\"--disable-warning=\")) return [arg]\n return []\n })\n}\n" | ||
| ], | ||
| "mappings": ";sdAKA,2BAAS,oBACT,yBCNA,yBAEO,SAAS,CAAW,EAAG,CAC5B,IAAM,EAAU,EAAK,SAAS,QAAQ,SAAU,EAAK,QAAQ,QAAQ,QAAQ,CAAC,EAAE,YAAY,EAC5F,GAAI,IAAY,OAAS,IAAY,QAAU,IAAY,SAAU,MAAO,CAAC,QAAQ,QAAQ,EAC7F,GAAI,CAAC,QAAQ,KAAK,GAAI,MAAU,MAAM,kCAAkC,EACxE,GAAI,IAAY,QAAU,IAAY,SAAU,MAAO,CAAC,QAAQ,SAAU,GAAG,EAAU,EAAG,QAAQ,KAAK,EAAE,EACzG,MAAO,CAAC,QAAQ,SAAU,QAAQ,KAAK,EAAE,EAG3C,SAAS,CAAS,EAAG,CACnB,OAAO,QAAQ,SAAS,QAAQ,CAAC,EAAK,EAAO,IAAS,CACpD,GAAI,EAAQ,GAAK,EAAK,EAAQ,KAAO,eAAgB,MAAO,CAAC,EAC7D,GAAI,IAAQ,eAAgB,OAAO,EAAK,EAAQ,GAAK,CAAC,EAAK,EAAK,EAAQ,EAAE,EAAI,CAAC,EAC/E,GAAI,EAAI,WAAW,eAAe,EAAG,MAAO,CAAC,CAAG,EAChD,GACE,IAAQ,sBACR,IAAQ,mBACR,IAAQ,wBACR,IAAQ,cAER,MAAO,CAAC,CAAG,EACb,GAAI,IAAQ,iBAAmB,EAAI,WAAW,oBAAoB,EAAG,MAAO,CAAC,CAAG,EAChF,MAAO,CAAC,EACT,EDXI,IAAM,EAAO,EAAO,OAAO,CAChC,SAAU,EAAO,SAAS,EAAO,MAAM,EACvC,KAAM,EAAO,SAAS,EAAO,IAAI,MAAM,EAAO,uBAAuB,CAAC,EAAG,EAAO,oBAAoB,KAAM,CAAC,CAAC,EAC5G,SAAU,EAAO,SAAS,EAAO,MAAM,CACzC,CAAC,EAMD,IAAM,EAAa,EAAO,oBAAoB,EAAO,eAAe,CAAI,CAAC,EACnE,EAAqB,EAAO,oBAAoB,EAAO,eAAe,EAAQ,IAAI,CAAC,EAElF,SAAS,CAAQ,CAAC,EAAU,EAAqB,CACtD,GAAI,IAAY,SAAU,MAAO,eACjC,GAAI,IAAY,QAAS,MAAO,qBAChC,MAAO,WAAW,EAAK,KAAK,CAAO,SAG9B,SAAS,CAAuB,CACrC,EACA,EAAU,EACV,EAAmB,EACnB,CACA,GAAI,IAAY,OAAW,MAAO,GAClC,GAAI,IAAY,EAAkB,MAAO,GACzC,IAAM,EAAS,SAAS,KACxB,GAAI,CAAC,EAAQ,WAAW,CAAM,EAAG,MAAO,GACxC,MAAO,kBAAkB,KAAK,EAAQ,MAAM,EAAO,MAAM,CAAC,EAGrD,IAAM,EAAsB,EAAO,WAAW,SAAU,CAC7D,EACA,EACA,EAAU,EACV,EAAmB,EACnB,CACA,GAAI,IAAY,UAAY,IAAY,QAAS,OACjD,IAAM,EAAK,MAAO,EAAW,WACvB,EAAO,MAAO,EAAG,eAAe,CAAM,EAAE,KAAK,EAAO,MAAM,EAChE,GAAI,EAAO,OAAO,CAAI,EAAG,OACzB,IAAM,EAAe,MAAO,EAAmB,EAAK,KAAK,EAAE,KAAK,EAAO,MAAM,EAC7E,GAAI,EAAO,OAAO,CAAY,EAAG,OACjC,GAAI,CAAC,EAAwB,EAAa,MAAM,QAAS,EAAS,CAAgB,EAAG,OACrF,MAAO,EAAG,gBAAgB,EAAM,EAAK,MAAO,CAAE,KAAM,KAAM,KAAM,GAAM,CAAC,EAAE,KAAK,EAAO,MAAM,EAC5F,EAED,SAAS,CAAS,CAAC,EAAkB,CACnC,GAAI,IAAQ,YAAc,IAAQ,QAAU,IAAQ,WAAY,OAAO,EACvE,MAAU,MAAM,+BAA+B,GAAK,EAGtD,IAAM,EAAQ,EAAO,IAAI,SAAU,EAAG,CACpC,IAAM,EAAK,MAAO,EAAW,WACvB,EAAS,MAAO,EAAO,QACvB,EAAO,EAAS,EAChB,EAAO,EAAK,KAAK,EAAO,MAAO,CAAI,EACzC,MAAO,CACL,KACA,OACA,WAAY,EAAK,KAAK,EAAO,MAAO,cAAc,EAClD,WAAY,EAAK,KAAK,EAAO,OAAQ,CAAI,CAC3C,EACD,EAEY,EAAU,EAAO,WAAW,SAAU,EAAG,CACpD,IAAQ,OAAM,cAAe,MAAO,EAEpC,OADA,MAAO,EAAoB,EAAY,CAAI,EACpC,CACL,OACA,QAAS,EACT,QAAS,CAAC,GAAG,EAAY,EAAG,QAAS,WAAW,CAClD,EACD,EAEY,EAAO,EAAO,GAAG,yBAAyB,EAAE,SAAU,EAAG,CACpE,IAAQ,KAAI,cAAe,MAAO,EAClC,OAAO,MAAO,EAAG,eAAe,CAAU,EAAE,KAC1C,EAAO,QAAQ,CAAU,EACzB,EAAO,MAAM,IAAM,EAAO,QAAQ,CAAC,CAAS,CAAC,CAC/C,EACD,EAEK,EAAQ,EAAO,GAAG,0BAA0B,EAAE,SAAU,CAAC,EAAa,CAC1E,IAAQ,KAAI,cAAe,MAAO,EAC5B,EAAO,EAAa,OAC1B,MAAO,EAAG,cAAc,EAAK,QAAQ,CAAU,EAAG,CAAE,UAAW,EAAK,CAAC,EACrE,MAAO,EAAG,gBAAgB,EAAM,KAAK,UAAU,EAAO,KAAM,CAAC,EAAI;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EACtF,MAAO,EAAG,OAAO,EAAM,CAAU,EAClC,EAEY,EAAW,EAAO,GAAG,6BAA6B,EAAE,SAAU,CAAC,EAAgB,CAC1F,IAAM,EAAW,MAAO,EAAK,EAC7B,GAAI,IAAU,QAAa,EAAS,SAAU,OAAO,EAAS,SAC9D,IAAM,EAAO,GAAS,EAAY,EAAE,EAAE,SAAS,WAAW,EAK1D,OADA,MAAO,EAAM,IAAK,EAAU,SAAU,CAAK,CAAC,EACrC,EACR,EAEY,EAAM,EAAO,GAAG,wBAAwB,EAAE,SAAU,CAAC,EAAc,CAC9E,GAAI,IAAQ,OAAW,CACrB,IAAQ,SAAU,KAAc,GAAS,MAAO,EAAK,EACrD,OAAO,KAAK,UAAU,EAAM,KAAM,CAAC,EAErC,OAAQ,EAAU,CAAG,OACd,WACH,OAAQ,MAAO,EAAK,GAAG,UAAY,OAEhC,OAAQ,CACX,IAAM,GAAQ,MAAO,EAAK,GAAG,KAC7B,OAAO,IAAS,OAAY,GAAK,OAAO,CAAI,CAC9C,KACK,WACH,OAAO,MAAO,EAAS,EAG3B,MAAU,MAAM,+BAA+B,GAAK,EACrD,EAEY,EAAM,EAAO,GAAG,wBAAwB,EAAE,SAAU,CAAC,EAAa,EAAe,CAC5F,OAAQ,EAAU,CAAG,OACd,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,MAAO,EAAM,IAAM,MAAO,EAAK,EAAI,SAAU,CAAM,CAAC,EACpD,MACF,KACK,OAAQ,CACX,IAAM,EAAO,OAAO,CAAK,EACzB,GAAI,CAAC,OAAO,UAAU,CAAI,GAAK,EAAO,GAAK,EAAO,MAAQ,MAAU,MAAM,kCAAkC,EAC5G,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,MAAO,EAAM,IAAM,MAAO,EAAK,EAAI,MAAK,CAAC,EACzC,MACF,KACK,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,MAAO,EAAS,CAAK,EACrB,MACF,GAEH,EAEY,EAAQ,EAAO,GAAG,0BAA0B,EAAE,SAAU,CAAC,EAAa,CACjF,OAAQ,EAAU,CAAG,OACd,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,IAAQ,SAAU,KAAc,GAAS,MAAO,EAAK,EACrD,MAAO,EAAM,CAAI,EACjB,MACF,KACK,OAAQ,CACX,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,IAAQ,KAAM,KAAU,GAAS,MAAO,EAAK,EAC7C,MAAO,EAAM,CAAI,EACjB,MACF,KACK,WAAY,CACf,MAAO,EAAQ,KAAK,MAAO,EAAQ,CAAC,EACpC,IAAQ,SAAU,KAAc,GAAS,MAAO,EAAK,EACrD,MAAO,EAAM,CAAI,EACjB,MACF,GAEH", | ||
| "debugId": "BFC2BE865220A2E764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";sgCAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,OAAO,MAC9C,aAAQ,YAAO,MAAM,gBAAkB,EAAM,CAAG,EAChD,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC1F,MAAO,EAAQ,IAAM,EAAO,YAAY,UAAU,IAAI,CAAE,IAAK,EAAM,IAAK,UAAS,CAAC,CAAC,EACnF,IAAM,EAAgB,EAAM,IAAI,QAAQ,OAAQ,EAAE,EAC5C,EAAU,MAAO,EAAQ,IAC7B,EAAO,YAAY,QAAQ,QAAQ,CAAE,gBAAe,SAAU,QAAS,UAAS,CAAC,CACnF,EACA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,UAAW,EAAQ,KAAK,UAAW,UAAS,CAAC,CAClG,EAAE,KAAK,EAAO,MAAM,CACtB,EAEA,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAe,EAAQ,KAAK,SAAS,EACxE,GAAI,EAAO,SAAW,SAAU,OAAO,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EACnF,GAAI,EAAO,SAAW,UAAW,OAAO,MAAO,EAAO,KAAS,MAAM,wBAAwB,CAAC,EAC9F,QAAQ,OAAO,MAAM,YAAc,CAAG,EACvC,CACH,EAEM,EAAO,CACX,EACA,EACA,EACA,EAAQ,KAER,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CAAC,EAC/G,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,IAAM,EAAS,EAAS,KAAK,SAAS,KAAK,EAC3C,GAAI,CAAC,GAAS,EAAQ,QAAQ,OAAO,MAAM,EAAS,EAAM,CAAG,EAE7D,OADA,MAAO,EAAO,MAAM,GAAG,EAChB,MAAO,EAAK,EAAQ,EAAe,EAAW,GAAS,CAAC,CAAC,CAAM,EACvE,EAEH,SAAS,CAAU,CAAC,EAAwB,CAC1C,OAAO,EAAO,WAAW,CAAE,IAAK,EAAM,MAAO,CAAC,IAAU,CAAM,CAAC", | ||
| "debugId": "D19F7B427959B2D564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "BE527A14CCC0A0CF64756E2164756E21", | ||
| "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": "253B9B427299143064756E2164756E21", | ||
| "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(\"../../mini\"))\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,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mkDAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OACxE,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,OACxC,OAAS,WAAO,OAAiB,aAAQ,MAC7C,YAAQ,OAAO,oBAAe,OAAM,WAAM,OAC1C,gBAAY,OAAM,eACpB,MAAC,OACD,WAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH", | ||
| "debugId": "F0C2DBE22FDD681264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/installation/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare global {\n const OPENCODE_VERSION: string\n const OPENCODE_CHANNEL: string\n}\n\nexport const InstallationVersion = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nexport const InstallationChannel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\nexport const InstallationLocal = InstallationChannel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAKO,IAAM,EAA6D,mBAC7D,EAA6D,OAC7D,EAAoB", | ||
| "debugId": "AF984FD182FAB6E764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/catalog.shared.ts", "src/mini/runtime.stdin.ts"], | ||
| "sourcesContent": [ | ||
| "import type {\n AgentListOutput,\n CommandListOutput,\n ModelListOutput,\n OpenCodeClient,\n ProviderListOutput,\n SkillListOutput,\n} from \"@opencode-ai/client/promise\"\nimport type { RunAgent, RunCommand, RunProvider, RunReference } from \"./types\"\n\ntype CurrentAgent = AgentListOutput[\"data\"][number]\ntype CurrentCommand = CommandListOutput[\"data\"][number]\ntype CurrentSkill = SkillListOutput[\"data\"][number]\ntype CurrentProvider = ProviderListOutput[\"data\"][number]\ntype CurrentModel = ModelListOutput[\"data\"][number]\n\nfunction location(directory: string, workspace?: string) {\n return {\n location: {\n directory,\n workspace,\n },\n }\n}\n\nfunction defaultCost(model: CurrentModel) {\n const picked = model.cost.find((cost) => cost.tier === undefined) ?? model.cost[0]\n if (!picked) {\n return undefined\n }\n\n return {\n ...picked,\n input: model.cost.every((cost) => cost.input === 0) ? 0 : picked.input,\n }\n}\n\nexport function runAgent(input: CurrentAgent): RunAgent {\n return {\n id: input.id,\n name: input.name,\n description: input.description,\n mode: input.mode,\n hidden: input.hidden,\n }\n}\n\nexport function runCommand(input: CurrentCommand): RunCommand {\n return {\n name: input.name,\n description: input.description,\n }\n}\n\nexport function runSkill(input: CurrentSkill): RunCommand {\n return {\n name: input.id,\n description: input.description,\n source: \"skill\",\n }\n}\n\nexport function runProviders(providers: CurrentProvider[], models: CurrentModel[]): RunProvider[] {\n const grouped = new Map<string, RunProvider>()\n\n for (const provider of providers) {\n grouped.set(provider.id, {\n id: provider.id,\n name: provider.name,\n models: {},\n })\n }\n\n for (const model of models) {\n const provider = grouped.get(model.providerID) ?? {\n id: model.providerID,\n name: model.providerID,\n models: {},\n }\n provider.models[model.id] = {\n id: model.id,\n providerID: model.providerID,\n name: model.name,\n capabilities: model.capabilities,\n cost: defaultCost(model),\n limit: model.limit,\n status: model.status,\n variants: Object.fromEntries((model.variants ?? []).map((variant) => [variant.id, {}])),\n }\n grouped.set(provider.id, provider)\n }\n\n return [...grouped.values()]\n}\n\n// A location boots its plugins in a deferred background batch after the layer\n// is built, so first-turn model resolution can observe empty catalog state.\n// For explicit --model flows, wait for that exact ref to appear before prompt\n// admission. On timeout, return and let the real execution error surface.\nexport async function waitForCatalogReady(input: {\n sdk: OpenCodeClient\n directory: string\n workspace?: string\n model: { providerID: string; modelID: string }\n timeoutMs?: number\n}) {\n const deadline = Date.now() + (input.timeoutMs ?? 5_000)\n while (Date.now() < deadline) {\n const models = await input.sdk.model\n .list(location(input.directory, input.workspace))\n .then((result) => result.data)\n .catch(() => undefined)\n if (models?.some((model) => model.providerID === input.model.providerID && model.id === input.model.modelID)) return\n await new Promise((resolve) => setTimeout(resolve, 25))\n }\n}\n\nexport async function waitForDefaultModel(input: {\n sdk: OpenCodeClient\n directory: string\n timeoutMs?: number\n active?: () => boolean\n}): Promise<{ providerID: string; modelID: string } | undefined> {\n const deadline = Date.now() + (input.timeoutMs ?? 5_000)\n while (Date.now() < deadline && (input.active?.() ?? true)) {\n const model = await input.sdk.model\n .default(location(input.directory))\n .then((result) => result.data)\n .catch(() => undefined)\n if (model) return { providerID: model.providerID, modelID: model.id }\n await new Promise((resolve) => setTimeout(resolve, 25))\n }\n}\n\nexport async function loadRunAgents(sdk: OpenCodeClient, directory: string): Promise<RunAgent[]> {\n const result = await sdk.agent.list(location(directory))\n return result.data.map(runAgent)\n}\n\nexport async function loadRunCommands(sdk: OpenCodeClient, directory: string): Promise<RunCommand[]> {\n const [commands, skills] = await Promise.all([\n sdk.command.list(location(directory)),\n sdk.skill.list(location(directory)),\n ])\n return [...commands.data.map(runCommand), ...skills.data.filter((skill) => skill.slash !== false).map(runSkill)]\n}\n\nexport async function loadRunReferences(sdk: OpenCodeClient, directory: string): Promise<RunReference[]> {\n const result = await sdk.reference.list(location(directory))\n return result.data.filter((reference) => !reference.hidden)\n}\n\nexport async function loadRunProviders(sdk: OpenCodeClient, directory: string): Promise<RunProvider[]> {\n const [providers, models] = await Promise.all([\n sdk.provider.list(location(directory)),\n sdk.model.list(location(directory)),\n ])\n return runProviders([...providers.data], [...models.data])\n}\n", | ||
| "import fs from \"fs\"\nimport * as tty from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\ntype InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup?: () => void\n}\n\nfunction openTerminalStdin(path: string): NodeJS.ReadStream {\n return new tty.ReadStream(fs.openSync(path, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (path: string) => NodeJS.ReadStream = openTerminalStdin,\n platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) {\n return { stdin }\n }\n\n const file = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n\n try {\n const stream = open(file)\n return {\n stdin: stream,\n cleanup: () => {\n stream.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "675D6202C2AAB1FC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "1F3FCE81484537AA64756E2164756E21", | ||
| "names": [] | ||
| } |
+3
-3
@@ -5,7 +5,7 @@ { | ||
| "sourcesContent": [ | ||
| "#!/usr/bin/env bun\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\nimport { Commands } from \"./commands/commands\"\nimport { Runtime } from \"./framework/runtime\"\nimport { Observability } from \"@opencode-ai/core/observability\"\nimport { Updater } from \"./services/updater\"\nimport { InstallationChannel, InstallationVersion, InstallationLocal } from \"@opencode-ai/core/installation/version\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Config } from \"./config\"\nimport { Npm } from \"@opencode-ai/core/npm\"\n\nconst Handlers = Runtime.handlers(Commands, {\n $: () => import(\"./commands/handlers/default\"),\n api: () => import(\"./commands/handlers/api\"),\n auth: {\n connect: () => import(\"./commands/handlers/auth/connect\"),\n },\n debug: {\n agents: () => import(\"./commands/handlers/debug/agents\"),\n },\n console: {\n login: () => import(\"./commands/handlers/console/login\"),\n },\n mcp: {\n list: () => import(\"./commands/handlers/mcp/list\"),\n add: () => import(\"./commands/handlers/mcp/add\"),\n auth: () => import(\"./commands/handlers/mcp/auth\"),\n logout: () => import(\"./commands/handlers/mcp/logout\"),\n },\n migrate: () => import(\"./commands/handlers/migrate\"),\n mini: () => import(\"./commands/handlers/mini\"),\n run: () => import(\"./commands/handlers/run\"),\n pair: () => import(\"./commands/handlers/pair\"),\n service: {\n start: () => import(\"./commands/handlers/service/start\"),\n restart: () => import(\"./commands/handlers/service/restart\"),\n status: () => import(\"./commands/handlers/service/status\"),\n stop: () => import(\"./commands/handlers/service/stop\"),\n get: () => import(\"./commands/handlers/service/get\"),\n set: () => import(\"./commands/handlers/service/set\"),\n unset: () => import(\"./commands/handlers/service/unset\"),\n },\n serve: () => import(\"./commands/handlers/serve\"),\n})\n\nEffect.logInfo(\"cli starting\", {\n version: InstallationVersion,\n channel: InstallationChannel,\n local: InstallationLocal,\n args: process.argv.slice(2),\n}).pipe(\n Effect.flatMap(() => Runtime.run(Commands, Handlers, { version: InstallationVersion })),\n Effect.annotateLogs({ role: \"cli\" }),\n Effect.provide(Config.layer),\n Effect.provide(Updater.layer),\n Effect.provide(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node, Npm.node]))),\n Effect.provide(Observability.layer),\n Effect.provide(NodeServices.layer),\n Effect.scoped,\n Effect.tap(() => Effect.sync(() => process.exit(process.exitCode ?? 0))),\n NodeRuntime.runMain,\n)\n" | ||
| "#!/usr/bin/env bun\n\nimport { NodeRuntime, NodeServices } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\nimport { Commands } from \"./commands/commands\"\nimport { Runtime } from \"./framework/runtime\"\nimport { Observability } from \"@opencode-ai/core/observability\"\nimport { Updater } from \"./services/updater\"\nimport { InstallationChannel, InstallationVersion, InstallationLocal } from \"@opencode-ai/core/installation/version\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { Config } from \"./config\"\nimport { Npm } from \"@opencode-ai/core/npm\"\n\nconst Handlers = Runtime.handlers(Commands, {\n $: () => import(\"./commands/handlers/default\"),\n api: () => import(\"./commands/handlers/api\"),\n auth: {\n connect: () => import(\"./commands/handlers/auth/connect\"),\n },\n debug: {\n agents: () => import(\"./commands/handlers/debug/agents\"),\n },\n console: {\n login: () => import(\"./commands/handlers/console/login\"),\n },\n mcp: {\n list: () => import(\"./commands/handlers/mcp/list\"),\n add: () => import(\"./commands/handlers/mcp/add\"),\n auth: () => import(\"./commands/handlers/mcp/auth\"),\n logout: () => import(\"./commands/handlers/mcp/logout\"),\n },\n plugin: {\n list: () => import(\"./commands/handlers/plugin/list\"),\n },\n migrate: () => import(\"./commands/handlers/migrate\"),\n mini: () => import(\"./commands/handlers/mini\"),\n run: () => import(\"./commands/handlers/run\"),\n pair: () => import(\"./commands/handlers/pair\"),\n service: {\n start: () => import(\"./commands/handlers/service/start\"),\n restart: () => import(\"./commands/handlers/service/restart\"),\n status: () => import(\"./commands/handlers/service/status\"),\n stop: () => import(\"./commands/handlers/service/stop\"),\n get: () => import(\"./commands/handlers/service/get\"),\n set: () => import(\"./commands/handlers/service/set\"),\n unset: () => import(\"./commands/handlers/service/unset\"),\n },\n serve: () => import(\"./commands/handlers/serve\"),\n})\n\nEffect.logInfo(\"cli starting\", {\n version: InstallationVersion,\n channel: InstallationChannel,\n local: InstallationLocal,\n args: process.argv.slice(2),\n}).pipe(\n Effect.flatMap(() => Runtime.run(Commands, Handlers, { version: InstallationVersion })),\n Effect.annotateLogs({ role: \"cli\" }),\n Effect.provide(Config.layer),\n Effect.provide(Updater.layer),\n Effect.provide(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node, Npm.node]))),\n Effect.provide(Observability.layer),\n Effect.provide(NodeServices.layer),\n Effect.scoped,\n Effect.tap(() => Effect.sync(() => process.exit(process.exitCode ?? 0))),\n NodeRuntime.runMain,\n)\n" | ||
| ], | ||
| "mappings": ";;w+CAgBA,SAAM,OAAW,OAAQ,cAAS,OAAU,MAC1C,OAAG,SAAa,yCAChB,SAAK,SAAa,yCAClB,UAAM,MACJ,aAAS,SAAa,wCACxB,OACA,WAAO,MACL,YAAQ,SAAa,wCACvB,OACA,aAAS,MACP,WAAO,SAAa,wCACtB,OACA,SAAK,MACH,UAAM,SAAa,yCACnB,SAAK,SAAa,yCAClB,UAAM,SAAa,yCACnB,YAAQ,SAAa,wCACvB,OACA,aAAS,SAAa,yCACtB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,KAAM,IAAa,yCACnB,QAAS,CACP,MAAO,IAAa,yCACpB,QAAS,IAAa,yCACtB,OAAQ,IAAa,yCACrB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,IAAK,IAAa,yCAClB,MAAO,IAAa,wCACtB,EACA,MAAO,IAAa,wCACtB,CAAC,EAED,EAAO,QAAQ,eAAgB,CAC7B,QAAS,EACT,QAAS,EACT,MAAO,EACP,KAAM,QAAQ,KAAK,MAAM,CAAC,CAC5B,CAAC,EAAE,KACD,EAAO,QAAQ,IAAM,EAAQ,IAAI,EAAU,EAAU,CAAE,QAAS,CAAoB,CAAC,CAAC,EACtF,EAAO,aAAa,CAAE,KAAM,KAAM,CAAC,EACnC,EAAO,QAAQ,EAAO,KAAK,EAC3B,EAAO,QAAQ,EAAQ,KAAK,EAC5B,EAAO,QAAQ,EAAe,MAAM,EAAU,MAAM,CAAC,EAAO,KAAM,EAAW,KAAM,EAAI,IAAI,CAAC,CAAC,CAAC,EAC9F,EAAO,QAAQ,EAAc,KAAK,EAClC,EAAO,QAAQ,EAAa,KAAK,EACjC,EAAO,OACP,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,QAAQ,KAAK,QAAQ,UAAY,CAAC,CAAC,CAAC,EACvE,EAAY,OACd", | ||
| "debugId": "57B269D26A88A36164756E2164756E21", | ||
| "mappings": ";;w+CAgBA,SAAM,OAAW,OAAQ,cAAS,OAAU,MAC1C,OAAG,SAAa,yCAChB,SAAK,SAAa,yCAClB,UAAM,MACJ,aAAS,SAAa,wCACxB,OACA,WAAO,MACL,YAAQ,SAAa,wCACvB,OACA,aAAS,MACP,WAAO,SAAa,wCACtB,OACA,SAAK,MACH,UAAM,SAAa,yCACnB,SAAK,SAAa,yCAClB,UAAM,SAAa,yCACnB,YAAQ,SAAa,wCACvB,OACA,YAAQ,MACN,KAAM,IAAa,wCACrB,EACA,QAAS,IAAa,yCACtB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,KAAM,IAAa,yCACnB,QAAS,CACP,MAAO,IAAa,yCACpB,QAAS,IAAa,yCACtB,OAAQ,IAAa,yCACrB,KAAM,IAAa,yCACnB,IAAK,IAAa,yCAClB,IAAK,IAAa,yCAClB,MAAO,IAAa,wCACtB,EACA,MAAO,IAAa,wCACtB,CAAC,EAED,EAAO,QAAQ,eAAgB,CAC7B,QAAS,EACT,QAAS,EACT,MAAO,EACP,KAAM,QAAQ,KAAK,MAAM,CAAC,CAC5B,CAAC,EAAE,KACD,EAAO,QAAQ,IAAM,EAAQ,IAAI,EAAU,EAAU,CAAE,QAAS,CAAoB,CAAC,CAAC,EACtF,EAAO,aAAa,CAAE,KAAM,KAAM,CAAC,EACnC,EAAO,QAAQ,EAAO,KAAK,EAC3B,EAAO,QAAQ,EAAQ,KAAK,EAC5B,EAAO,QAAQ,EAAe,MAAM,EAAU,MAAM,CAAC,EAAO,KAAM,EAAW,KAAM,EAAI,IAAI,CAAC,CAAC,CAAC,EAC9F,EAAO,QAAQ,EAAc,KAAK,EAClC,EAAO,QAAQ,EAAa,KAAK,EACjC,EAAO,OACP,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,QAAQ,KAAK,QAAQ,UAAY,CAAC,CAAC,CAAC,EACvE,EAAY,OACd", | ||
| "debugId": "5C61A6DDD706BCD764756E2164756E21", | ||
| "names": [] | ||
| } |
+1
-1
| { | ||
| "name": "@opencode-ai/cli-linux-arm64", | ||
| "version": "0.0.0-next-15765", | ||
| "version": "0.0.0-next-15769", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "repository": { |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "ED485526DD60927D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n case \"needs_client_registration\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"needs_client_registration\":\n return `needs client registration: ${status.error}`\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,OAAG,MACrC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,aACA,4BACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,4BACH,MAAO,8BAA8B,EAAO,YACzC,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "80EDB680009F457664756E2164756E21", | ||
| "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(\"../../mini\"))\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,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mkDAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,SAAK,MAAC,SACrD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,0BAAsB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OACxE,OAAY,aAAQ,UAAK,aAAQ,UAAM,MAAC,OACxC,OAAS,WAAO,OAAiB,aAAQ,MAC7C,YAAQ,OAAO,oBAAe,OAAM,WAAM,OAC1C,gBAAY,OAAM,eACpB,MAAC,OACD,WAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,IAC5B,CAAC,CACH,EACD,CACH", | ||
| "debugId": "F0C2DBE22FDD681264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/prompt/content.ts"], | ||
| "sourcesContent": [ | ||
| "export function normalizePromptContent(content: string) {\n if (content.endsWith(\"\\r\\n\")) {\n const body = content.slice(0, -2)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n if (content.endsWith(\"\\n\")) {\n const body = content.slice(0, -1)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n return content\n}\n" | ||
| ], | ||
| "mappings": ";AAAO,SAAS,CAAsB,CAAC,EAAiB,CACtD,GAAI,EAAQ,SAAS;AAAA,CAAM,EAAG,CAC5B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,GAAI,EAAQ,SAAS;AAAA,CAAI,EAAG,CAC1B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,OAAO", | ||
| "debugId": "BACCAB8C205A2F1364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\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({ server: serverURL, standalone: input.standalone })\n yield* Effect.promise(() =>\n runMini({\n server,\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: input.replay,\n replayLimit: Option.getOrUndefined(input.replayLimit),\n demo: input.demo,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mkDAKA,SAAe,SAAQ,aAAQ,OAAS,cAAS,UAAM,MAAC,SACtD,OAAO,SAAI,cAAU,OAAG,MACtB,SAAQ,eAAS,6BAAyB,WAAO,OAAO,aAAQ,SAAa,wCAAa,OAC1F,WAAO,OAAO,aAAQ,cAAY,OAAqB,MAAC,OACxD,SAAM,OAAY,OAAO,oBAAe,OAAM,WAAM,OAC9C,OAAS,WAAO,OAAiB,aAAQ,MAAE,YAAQ,OAAW,gBAAY,OAAM,UAAW,CAAC,EAClG,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,SACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAM,OACd,YAAa,EAAO,eAAe,EAAM,WAAW,EACpD,KAAM,EAAM,IACd,CAAC,CACH,EACD,CACH", | ||
| "debugId": "75FA469610EC90D764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/session.ts", "../tui/src/logo.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ModelInfo, SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/client\"\n\nexport function isDefaultTitle(title: string) {\n return /^(New session - |Child session - )\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/.test(title)\n}\n\nexport function lastAssistantWithUsage(messages: ReadonlyArray<SessionMessageInfo>, boundary?: string) {\n const boundaryIndex = boundary ? messages.findIndex((message) => message.id === boundary) : -1\n if (boundary && boundaryIndex === -1) return undefined\n const end = boundaryIndex === -1 ? messages.length : boundaryIndex\n const compactionIndex = messages.findLastIndex(\n (message, index) => message.type === \"compaction\" && message.status === \"completed\" && index < end,\n )\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && index > compactionIndex && index < end,\n )\n}\n\nexport function contextUsage(\n messages: ReadonlyArray<SessionMessageInfo>,\n models: ReadonlyArray<ModelInfo> | undefined,\n boundary?: string,\n) {\n const last = lastAssistantWithUsage(messages, boundary)\n if (!last) return\n const tokens =\n last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write\n if (tokens <= 0) return\n const model = models?.find((model) => model.providerID === last.model.providerID && model.id === last.model.id)\n return {\n tokens,\n percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : undefined,\n }\n}\n", | ||
| "export const logo = {\n left: [\" \", \"█▀▀█ █▀▀█ █▀▀█ █▀▀▄\", \"█__█ █__█ █^^^ █__█\", \"▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀\"],\n right: [\" ▄ \", \"█▀▀▀ █▀▀█ █▀▀█ █▀▀█\", \"█___ █__█ █__█ █^^^\", \"▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀\"],\n}\n\nexport const go = {\n left: [\" \", \"█▀▀▀\", \"█_^█\", \"▀▀▀▀\"],\n right: [\" \", \"█▀▀█\", \"█__█\", \"▀▀▀▀\"],\n}\n\nexport const marks = \"_^~,\"\n" | ||
| ], | ||
| "mappings": ";AAEO,SAAS,CAAc,CAAC,EAAe,CAC5C,MAAO,iFAAiF,KAAK,CAAK,EAG7F,SAAS,CAAsB,CAAC,EAA6C,EAAmB,CACrG,IAAM,EAAgB,EAAW,EAAS,UAAU,CAAC,IAAY,EAAQ,KAAO,CAAQ,EAAI,GAC5F,GAAI,GAAY,IAAkB,GAAI,OACtC,IAAM,EAAM,IAAkB,GAAK,EAAS,OAAS,EAC/C,EAAkB,EAAS,cAC/B,CAAC,EAAS,IAAU,EAAQ,OAAS,cAAgB,EAAQ,SAAW,aAAe,EAAQ,CACjG,EACA,OAAO,EAAS,SACd,CAAC,EAAS,IACR,EAAQ,OAAS,aAAe,EAAQ,SAAW,QAAa,EAAQ,GAAmB,EAAQ,CACvG,EAGK,SAAS,CAAY,CAC1B,EACA,EACA,EACA,CACA,IAAM,EAAO,EAAuB,EAAU,CAAQ,EACtD,GAAI,CAAC,EAAM,OACX,IAAM,EACJ,EAAK,OAAO,MAAQ,EAAK,OAAO,OAAS,EAAK,OAAO,UAAY,EAAK,OAAO,MAAM,KAAO,EAAK,OAAO,MAAM,MAC9G,GAAI,GAAU,EAAG,OACjB,IAAM,EAAQ,GAAQ,KAAK,CAAC,IAAU,EAAM,aAAe,EAAK,MAAM,YAAc,EAAM,KAAO,EAAK,MAAM,EAAE,EAC9G,MAAO,CACL,SACA,QAAS,GAAO,MAAM,QAAU,KAAK,MAAO,EAAS,EAAM,MAAM,QAAW,GAAG,EAAI,MACrF,ECjCK,IAAM,EAAO,CAClB,KAAM,CAAC,sBAAuB,sGAAsB,yDAAuB,2FAAqB,EAChG,MAAO,CAAC,2BAAsB,sGAAuB,oDAAuB,qGAAqB,CACnG,EAEa,EAAK,CAChB,KAAM,CAAC,OAAQ,2BAAO,iBAAQ,0BAAM,EACpC,MAAO,CAAC,OAAQ,2BAAO,iBAAQ,0BAAM,CACvC", | ||
| "debugId": "B712CA8ED12A647364756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,aACnC,OAAO,QAAG,0BAAqB,OAAE,cAAU,OAAG,MAC5C,SAAM,OAAU,WAAO,OAAc,aAAQ,OAC7C,WAAO,OAAQ,UAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "6CCB32166631FBC064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,MAAC,OAAO,MAC/C,WAAO,OAAc,WAAM,OAAM,QAAG,OACrC,MACH", | ||
| "debugId": "07C82177AEAB925E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/connect.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type IntegrationCommandStatusOutput, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.connect,\n Effect.fn(\"cli.auth.connect\")(function* (input) {\n process.stdout.write(\"Connecting...\" + EOL + EOL)\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n yield* request(() => client.integration.wellknown.add({ url: input.url, location }))\n const integrationID = input.url.replace(/\\/+$/, \"\")\n const started = yield* request(() =>\n client.integration.command.connect({ integrationID, methodID: \"login\", location }),\n )\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel({ integrationID, attemptID: started.data.attemptID, location }),\n ).pipe(Effect.ignore),\n )\n\n const status = yield* wait(client, integrationID, started.data.attemptID)\n if (status.status === \"failed\") return yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") return yield* Effect.fail(new Error(\"Authentication expired\"))\n process.stdout.write(\"Connected\" + EOL)\n }),\n)\n\nconst wait = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n shown = false,\n): Effect.Effect<Exclude<IntegrationCommandStatusOutput[\"data\"], { status: \"pending\" }>, unknown> =>\n Effect.gen(function* () {\n const response = yield* request(() => client.integration.command.status({ integrationID, attemptID, location }))\n if (response.data.status !== \"pending\") return response.data\n const output = response.data.message?.trim()\n if (!shown && output) process.stdout.write(output + EOL + EOL)\n yield* Effect.sleep(500)\n return yield* wait(client, integrationID, attemptID, shown || !!output)\n })\n\nfunction request<A>(task: () => Promise<A>) {\n return Effect.tryPromise({ try: task, catch: (cause) => cause })\n}\n" | ||
| ], | ||
| "mappings": ";sgCAAA,mBAAS,gBAQT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,UAAK,cAAS,aAChC,OAAO,QAAG,uBAAkB,OAAE,cAAU,MAAC,OAAO,MAC9C,aAAQ,YAAO,MAAM,gBAAkB,EAAM,CAAG,EAChD,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAC1F,MAAO,EAAQ,IAAM,EAAO,YAAY,UAAU,IAAI,CAAE,IAAK,EAAM,IAAK,UAAS,CAAC,CAAC,EACnF,IAAM,EAAgB,EAAM,IAAI,QAAQ,OAAQ,EAAE,EAC5C,EAAU,MAAO,EAAQ,IAC7B,EAAO,YAAY,QAAQ,QAAQ,CAAE,gBAAe,SAAU,QAAS,UAAS,CAAC,CACnF,EACA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,UAAW,EAAQ,KAAK,UAAW,UAAS,CAAC,CAClG,EAAE,KAAK,EAAO,MAAM,CACtB,EAEA,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAe,EAAQ,KAAK,SAAS,EACxE,GAAI,EAAO,SAAW,SAAU,OAAO,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EACnF,GAAI,EAAO,SAAW,UAAW,OAAO,MAAO,EAAO,KAAS,MAAM,wBAAwB,CAAC,EAC9F,QAAQ,OAAO,MAAM,YAAc,CAAG,EACvC,CACH,EAEM,EAAO,CACX,EACA,EACA,EACA,EAAQ,KAER,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAQ,IAAM,EAAO,YAAY,QAAQ,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CAAC,EAC/G,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,IAAM,EAAS,EAAS,KAAK,SAAS,KAAK,EAC3C,GAAI,CAAC,GAAS,EAAQ,QAAQ,OAAO,MAAM,EAAS,EAAM,CAAG,EAE7D,OADA,MAAO,EAAO,MAAM,GAAG,EAChB,MAAO,EAAK,EAAQ,EAAe,EAAW,GAAS,CAAC,CAAC,CAAM,EACvE,EAEH,SAAS,CAAU,CAAC,EAAwB,CAC1C,OAAO,EAAO,WAAW,CAAE,IAAK,EAAM,MAAO,CAAC,IAAU,CAAM,CAAC", | ||
| "debugId": "D19F7B427959B2D564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/prompt.shared.ts"], | ||
| "sourcesContent": [ | ||
| "// Pure state machine for the prompt input.\n//\n// Handles history ring navigation and prompt text helpers. All functions are\n// pure -- they take state in and return new state out, with no side effects.\n//\n// The history ring (PromptHistoryState) stores past prompts and tracks\n// the current browse position. When the user arrows up at cursor offset 0,\n// the current draft is saved and history begins. Arrowing past the end\n// restores the draft.\nexport { displayCharAt, displaySlice, mentionTriggerIndex } from \"@opencode-ai/tui/prompt/display\"\nimport { stringWidth } from \"@opencode-ai/tui/util/string-width\"\nimport type { RunPrompt } from \"./types\"\n\nconst HISTORY_LIMIT = 200\n\nexport type PromptHistoryState = {\n items: RunPrompt[]\n index: number | null\n draft: string\n}\n\nexport type PromptMove = {\n state: PromptHistoryState\n text?: string\n cursor?: number\n apply: boolean\n}\n\nexport function promptCopy(prompt: RunPrompt): RunPrompt {\n return {\n text: prompt.text,\n parts: structuredClone(prompt.parts),\n ...(prompt.mode ? { mode: prompt.mode } : {}),\n ...(prompt.command ? { command: prompt.command } : {}),\n }\n}\n\nexport function promptSame(a: RunPrompt, b: RunPrompt): boolean {\n return (\n a.mode === b.mode &&\n a.text === b.text &&\n JSON.stringify(a.parts) === JSON.stringify(b.parts) &&\n JSON.stringify(a.command) === JSON.stringify(b.command)\n )\n}\n\nexport function isExitCommand(input: string): boolean {\n const text = input.trim().toLowerCase()\n return text === \"/exit\" || text === \"/quit\" || text === \":q\"\n}\n\nexport function isNewCommand(input: string): boolean {\n return input.trim().toLowerCase() === \"/new\"\n}\n\nexport function createPromptHistory(items?: RunPrompt[]): PromptHistoryState {\n const list = (items ?? []).filter((item) => item.text.trim().length > 0).map(promptCopy)\n const next: RunPrompt[] = []\n for (const item of list) {\n if (next.length > 0 && promptSame(next[next.length - 1], item)) {\n continue\n }\n\n next.push(item)\n }\n\n return {\n items: next.slice(-HISTORY_LIMIT),\n index: null,\n draft: \"\",\n }\n}\n\nexport function pushPromptHistory(state: PromptHistoryState, prompt: RunPrompt): PromptHistoryState {\n if (!prompt.text.trim()) {\n return state\n }\n\n const next = promptCopy(prompt)\n if (state.items[state.items.length - 1] && promptSame(state.items[state.items.length - 1], next)) {\n return {\n ...state,\n index: null,\n draft: \"\",\n }\n }\n\n const items = [...state.items, next].slice(-HISTORY_LIMIT)\n return {\n ...state,\n items,\n index: null,\n draft: \"\",\n }\n}\n\nexport function movePromptHistory(state: PromptHistoryState, dir: -1 | 1, text: string, cursor: number): PromptMove {\n if (state.items.length === 0) {\n return { state, apply: false }\n }\n\n if (dir === -1 && cursor !== 0) {\n return { state, apply: false }\n }\n\n if (dir === 1 && cursor !== stringWidth(text)) {\n return { state, apply: false }\n }\n\n if (state.index === null) {\n if (dir === 1) {\n return { state, apply: false }\n }\n\n const idx = state.items.length - 1\n return {\n state: {\n ...state,\n index: idx,\n draft: text,\n },\n text: state.items[idx].text,\n cursor: 0,\n apply: true,\n }\n }\n\n const idx = state.index + dir\n if (idx < 0) {\n return { state, apply: false }\n }\n\n if (idx >= state.items.length) {\n return {\n state: {\n ...state,\n index: null,\n },\n text: state.draft,\n cursor: stringWidth(state.draft),\n apply: true,\n }\n }\n\n return {\n state: {\n ...state,\n index: idx,\n },\n text: state.items[idx].text,\n cursor: dir === -1 ? 0 : stringWidth(state.items[idx].text),\n apply: true,\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAaA,IAAM,EAAgB,IAef,SAAS,CAAU,CAAC,EAA8B,CACvD,MAAO,CACL,KAAM,EAAO,KACb,MAAO,gBAAgB,EAAO,KAAK,KAC/B,EAAO,KAAO,CAAE,KAAM,EAAO,IAAK,EAAI,CAAC,KACvC,EAAO,QAAU,CAAE,QAAS,EAAO,OAAQ,EAAI,CAAC,CACtD,EAGK,SAAS,CAAU,CAAC,EAAc,EAAuB,CAC9D,OACE,EAAE,OAAS,EAAE,MACb,EAAE,OAAS,EAAE,MACb,KAAK,UAAU,EAAE,KAAK,IAAM,KAAK,UAAU,EAAE,KAAK,GAClD,KAAK,UAAU,EAAE,OAAO,IAAM,KAAK,UAAU,EAAE,OAAO,EAInD,SAAS,CAAa,CAAC,EAAwB,CACpD,IAAM,EAAO,EAAM,KAAK,EAAE,YAAY,EACtC,OAAO,IAAS,SAAW,IAAS,SAAW,IAAS,KAGnD,SAAS,CAAY,CAAC,EAAwB,CACnD,OAAO,EAAM,KAAK,EAAE,YAAY,IAAM,OAGjC,SAAS,CAAmB,CAAC,EAAyC,CAC3E,IAAM,GAAQ,GAAS,CAAC,GAAG,OAAO,CAAC,IAAS,EAAK,KAAK,KAAK,EAAE,OAAS,CAAC,EAAE,IAAI,CAAU,EACjF,EAAoB,CAAC,EAC3B,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,GAAK,EAAW,EAAK,EAAK,OAAS,GAAI,CAAI,EAC3D,SAGF,EAAK,KAAK,CAAI,EAGhB,MAAO,CACL,MAAO,EAAK,MAAM,CAAC,CAAa,EAChC,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAuC,CAClG,GAAI,CAAC,EAAO,KAAK,KAAK,EACpB,OAAO,EAGT,IAAM,EAAO,EAAW,CAAM,EAC9B,GAAI,EAAM,MAAM,EAAM,MAAM,OAAS,IAAM,EAAW,EAAM,MAAM,EAAM,MAAM,OAAS,GAAI,CAAI,EAC7F,MAAO,IACF,EACH,MAAO,KACP,MAAO,EACT,EAGF,IAAM,EAAQ,CAAC,GAAG,EAAM,MAAO,CAAI,EAAE,MAAM,CAAC,CAAa,EACzD,MAAO,IACF,EACH,QACA,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAa,EAAc,EAA4B,CAClH,GAAI,EAAM,MAAM,SAAW,EACzB,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,IAAM,IAAW,EAC3B,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,GAAK,IAAW,EAAY,CAAI,EAC1C,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,EAAM,QAAU,KAAM,CACxB,GAAI,IAAQ,EACV,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,IAAM,EAAM,EAAM,MAAM,OAAS,EACjC,MAAO,CACL,MAAO,IACF,EACH,MAAO,EACP,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,EACR,MAAO,EACT,EAGF,IAAM,EAAM,EAAM,MAAQ,EAC1B,GAAI,EAAM,EACR,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,GAAO,EAAM,MAAM,OACrB,MAAO,CACL,MAAO,IACF,EACH,MAAO,IACT,EACA,KAAM,EAAM,MACZ,OAAQ,EAAY,EAAM,KAAK,EAC/B,MAAO,EACT,EAGF,MAAO,CACL,MAAO,IACF,EACH,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,IAAQ,GAAK,EAAI,EAAY,EAAM,MAAM,GAAK,IAAI,EAC1D,MAAO,EACT", | ||
| "debugId": "A456270B6C85BC0864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "FCD6929A333F294364756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/installation/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare global {\n const OPENCODE_VERSION: string\n const OPENCODE_CHANNEL: string\n}\n\nexport const InstallationVersion = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nexport const InstallationChannel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\nexport const InstallationLocal = InstallationChannel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAKO,IAAM,EAA6D,mBAC7D,EAA6D,OAC7D,EAAoB", | ||
| "debugId": "6A954851E5B2EB3E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/resolve.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport type { OpenCodeClient } from \"@opencode-ai/client\"\n\n// Resolve through the MCP-owned integrationID rather than matching integration names: the shared\n// integration registry also holds provider/plugin integrations, whose names could collide with a server.\n// Fails when the server is unknown; returns undefined when the server has no integration (e.g. a local\n// or anonymous server), leaving that case for the caller to interpret.\nexport const resolveIntegration = (client: OpenCodeClient, name: string, location: { directory: string }) =>\n Effect.gen(function* () {\n const servers = yield* Effect.promise(() => client.mcp.list({ location }))\n const server = servers.data.find((entry) => entry.name === name)\n if (!server) return yield* Effect.fail(new Error(`MCP server not found: ${name}`))\n const integrationID = server.integrationID\n if (!integrationID) return undefined\n return yield* Effect.promise(() => client.integration.get({ integrationID, location })).pipe(\n Effect.map((result) => result.data ?? undefined),\n )\n })\n" | ||
| ], | ||
| "mappings": ";oDAOO,IAAM,EAAqB,CAAC,EAAwB,EAAc,IACvE,EAAO,IAAI,SAAU,EAAG,CAEtB,IAAM,GADU,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,UAAS,CAAC,CAAC,GAClD,KAAK,KAAK,CAAC,IAAU,EAAM,OAAS,CAAI,EAC/D,GAAI,CAAC,EAAQ,OAAO,MAAO,EAAO,KAAS,MAAM,yBAAyB,GAAM,CAAC,EACjF,IAAM,EAAgB,EAAO,cAC7B,GAAI,CAAC,EAAe,OACpB,OAAO,MAAO,EAAO,QAAQ,IAAM,EAAO,YAAY,IAAI,CAAE,gBAAe,UAAS,CAAC,CAAC,EAAE,KACtF,EAAO,IAAI,CAAC,IAAW,EAAO,MAAQ,MAAS,CACjD,EACD", | ||
| "debugId": "043516610FF794CF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";08BAKA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,WAAO,OAAc,SAAI,OAAM,SAAK,OAAM,UAAK,OAChD,MACH", | ||
| "debugId": "112215308F47398364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "35DE13777C5BACD564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/util/process-lock-ffi.bun.ts", "../core/src/util/process-lock.ts", "src/server-process.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "import { dlopen, read, type Pointer } from \"bun:ffi\"\nimport { existsSync } from \"node:fs\"\n\nexport type LockResult =\n | { readonly acquired: true }\n | { readonly acquired: false; readonly held: true }\n | { readonly acquired: false; readonly held: false; readonly code: number }\n\nconst LOCK_EX = 2\nconst LOCK_NB = 4\nconst DARWIN_EWOULDBLOCK = 35\nconst LINUX_EWOULDBLOCK = 11\n\nexport function lockDarwin(fd: number): LockResult {\n const library = dlopen(\"/usr/lib/libSystem.B.dylib\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __error: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__error())\n if (result === 0) return { acquired: true }\n if (code === DARWIN_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nexport function lockLinux(fd: number): LockResult {\n const musl = `/lib/libc.musl-${process.arch === \"arm64\" ? \"aarch64\" : \"x86_64\"}.so.1`\n const library = dlopen(existsSync(musl) ? musl : \"libc.so.6\", {\n flock: { args: [\"i32\", \"i32\"], returns: \"i32\" },\n __errno_location: { args: [], returns: \"ptr\" },\n })\n try {\n const result = library.symbols.flock(fd, LOCK_EX | LOCK_NB)\n const code = result === 0 ? 0 : errorCode(library.symbols.__errno_location())\n if (result === 0) return { acquired: true }\n if (code === LINUX_EWOULDBLOCK) return { acquired: false, held: true }\n return { acquired: false, held: false, code }\n } finally {\n library.close()\n }\n}\n\nfunction errorCode(pointer: Pointer | null) {\n if (pointer === null) throw new Error(\"Failed to read process lock error code\")\n return read.i32(pointer, 0)\n}\n", | ||
| "import { lockDarwin, lockLinux, type LockResult } from \"#process-lock-ffi\"\nimport { closeSync, mkdirSync, openSync } from \"node:fs\"\nimport { connect, createServer, type Server, type Socket } from \"node:net\"\nimport path from \"node:path\"\nimport { Effect, Schema } from \"effect\"\nimport { Hash } from \"./hash\"\n\nexport namespace ProcessLock {\n export class HeldError extends Schema.TaggedErrorClass<HeldError>()(\"ProcessLockHeldError\", {\n file: Schema.String,\n }) {\n override get message() {\n return `Process lock is already held: ${this.file}`\n }\n }\n\n export class SystemError extends Schema.TaggedErrorClass<SystemError>()(\"ProcessLockSystemError\", {\n file: Schema.String,\n operation: Schema.Literals([\"open\", \"acquire\"]),\n code: Schema.String,\n }) {\n override get message() {\n return `Process lock ${this.operation} failed for ${this.file}: ${this.code}`\n }\n }\n\n export type LockError = HeldError | SystemError\n\n const acquirePosix = Effect.fnUntraced(function* (file: string) {\n const fd = yield* Effect.try({\n try: () => {\n mkdirSync(path.dirname(file), { recursive: true })\n return openSync(file, \"a+\", 0o600)\n },\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"open\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n })\n const result = yield* Effect.try({\n try: () => lock(fd),\n catch: (cause) =>\n new SystemError({\n file,\n operation: \"acquire\",\n code: cause instanceof Error ? cause.message : String(cause),\n }),\n }).pipe(\n Effect.tapError(() =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n ),\n )\n if (result.acquired) {\n return fd\n }\n closeSync(fd)\n return yield* result.held\n ? new HeldError({ file })\n : new SystemError({ file, operation: \"acquire\", code: String(result.code) })\n })\n\n export const acquire = Effect.fn(\"ProcessLock.acquire\")(function* (file: string) {\n if (process.platform === \"win32\") {\n yield* Effect.acquireRelease(acquireWindows(file), closeWindows)\n return\n }\n yield* Effect.acquireRelease(acquirePosix(file), (fd) =>\n Effect.sync(() => {\n closeSync(fd)\n }),\n )\n })\n}\n\nfunction lock(fd: number): LockResult {\n if (process.platform === \"darwin\") return lockDarwin(fd)\n if (process.platform === \"linux\") return lockLinux(fd)\n throw new Error(`Unsupported process lock platform: ${process.platform}`)\n}\n\nfunction acquireWindows(file: string) {\n return Effect.callback<Server, ProcessLock.LockError>((resume) => {\n const server = createServer()\n let probe: Socket | undefined\n const pipe = `\\\\\\\\.\\\\pipe\\\\opencode-process-lock-${Hash.sha256(path.resolve(file).toLowerCase())}`\n const onError = (cause: NodeJS.ErrnoException) => {\n server.off(\"listening\", onListening)\n probe = connect(pipe)\n const onProbeError = () => {\n probe?.off(\"connect\", onConnect)\n resume(\n Effect.fail(\n new ProcessLock.SystemError({\n file,\n operation: \"acquire\",\n code: cause.code ?? cause.message,\n }),\n ),\n )\n }\n const onConnect = () => {\n probe?.off(\"error\", onProbeError)\n probe?.destroy()\n resume(Effect.fail(new ProcessLock.HeldError({ file })))\n }\n probe.once(\"connect\", onConnect)\n probe.once(\"error\", onProbeError)\n }\n const onListening = () => {\n server.off(\"error\", onError)\n resume(Effect.succeed(server))\n }\n server.once(\"error\", onError)\n server.once(\"listening\", onListening)\n server.on(\"connection\", (socket) => socket.destroy())\n server.listen(pipe)\n return Effect.sync(() => {\n probe?.destroy()\n server.close()\n })\n })\n}\n\nfunction closeWindows(server: Server) {\n return Effect.callback<void>((resume) => {\n if (!server.listening) return resume(Effect.void)\n server.close((error) => resume(error ? Effect.die(error) : Effect.void))\n })\n}\n", | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { AppProcess } from \"@opencode-ai/core/process\"\nimport { ProcessLock } from \"@opencode-ai/core/util/process-lock\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Logger, Option, Redacted, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { Updater } from \"./services/updater\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\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(AppNodeBuilder.build(LayerNode.group([Global.node, AppProcess.node]))),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(Global.Path.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n if (serviceOptions !== undefined) {\n const acquired = yield* ProcessLock.acquire(serviceOptions.file + \".lock\").pipe(\n Effect.as(true),\n Effect.catchTag(\"ProcessLockHeldError\", () => Effect.succeed(false)),\n )\n if (!acquired) return yield* Effect.void\n if ((yield* Service.discover(serviceOptions)) !== undefined) return yield* Effect.void\n }\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const password =\n options.mode === \"service\"\n ? yield* ServiceConfig.password()\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const server = yield* start({\n hostname: options.hostname ?? config.hostname ?? \"127.0.0.1\",\n port: Option.fromNullishOr(options.port ?? config.port),\n password,\n instanceID,\n service:\n serviceOptions === undefined\n ? undefined\n : { onListen: (address) => register(address, password, instanceID, serviceOptions.file) },\n }).pipe(Effect.provide(Logger.layer([], { mergeWithExisting: false })))\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (options.mode === \"default\" && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nconst register = Effect.fnUntraced(function* (\n address: HttpServer.Address,\n password: string,\n id: string,\n file: string,\n) {\n const fs = yield* FileSystem.FileSystem\n const temp = file + \".\" + id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(file), { recursive: true })\n const info = {\n id,\n version: InstallationVersion,\n url: HttpServer.formatAddress(address),\n pid: process.pid,\n password,\n }\n const encoded = yield* encodeInfo(info)\n const publish = fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, file)))\n yield* publish\n const current = fs.readFileString(file).pipe(\n Effect.flatMap(decodeInfo),\n Effect.orElseSucceed(() => undefined),\n )\n const assertRegistration = Effect.gen(function* () {\n const found = yield* current\n if (\n found !== undefined &&\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n )\n return\n yield* publish\n })\n yield* Effect.addFinalizer(() =>\n current.pipe(\n Effect.flatMap((current) => (current?.id === id ? fs.remove(file) : Effect.void)),\n Effect.ignore,\n ),\n )\n yield* assertRegistration.pipe(\n Effect.catchCause((cause) => Effect.logWarning(\"failed to reassert service registration\", { cause })),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.forkScoped,\n )\n})\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.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": "B7F3ACB60E2A637964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/frontend/actions.ts", "../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "import { tmpdir } from \"node:os\"\nimport { extname, join, resolve } from \"node:path\"\nimport type { CliRenderer, Renderable } from \"@opentui/core\"\nimport {\n createMockKeys,\n createMockMouse,\n KeyCodes,\n type KeyInput,\n type MockInput,\n type MockMouse,\n} from \"@opentui/core/testing\"\nimport { Config, Effect, FileSystem } from \"effect\"\nimport type { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\n\nexport type Action = SimulationProtocol.Frontend.Action\nexport type Element = SimulationProtocol.Frontend.Element\n\nexport interface Harness {\n readonly renderer: CliRenderer\n readonly mockInput: MockInput\n readonly mockMouse: MockMouse\n readonly resize: (cols: number, rows: number) => void\n readonly renderOnce: () => Promise<void>\n readonly screen: () => string\n}\n\ntype RenderBuffer = {\n readonly width: number\n readonly height: number\n getRealCharBytes(includeAnsi?: boolean): Uint8Array\n}\n\nconst decoder = new TextDecoder()\n\nfunction isKeyCode(key: string): key is keyof typeof KeyCodes {\n return Object.hasOwn(KeyCodes, key)\n}\n\nfunction keyInput(key: string): KeyInput {\n const named = key.toUpperCase()\n return isKeyCode(named) ? named : key\n}\n\nfunction children(renderable: Renderable) {\n return renderable.getChildren().filter((child): child is Renderable => \"num\" in child)\n}\n\nfunction all(renderable: Renderable): Renderable[] {\n return [renderable, ...children(renderable).flatMap(all)]\n}\n\nfunction mouseListeners(renderable: Renderable) {\n const general = Reflect.get(renderable, \"_mouseListener\")\n const specific = Reflect.get(renderable, \"_mouseListeners\")\n return Boolean(general) || (specific && typeof specific === \"object\" && Object.keys(specific).length > 0)\n}\n\nfunction hit(renderer: CliRenderer, renderable: Renderable) {\n if (renderable.width <= 0 || renderable.height <= 0) return false\n const x = Math.floor(renderable.screenX + renderable.width / 2)\n const y = Math.floor(renderable.screenY + renderable.height / 2)\n return renderer.hitTest(x, y) === renderable.num\n}\n\n/**\n * Builds the harness the simulation server drives.\n *\n * When the renderer is the headless simulation renderer, its TestRendererSetup\n * provides the supported testing APIs. For the visible terminal renderer the\n * harness falls back to `requestRender` + `idle` and reading the private\n * `currentRenderBuffer`.\n */\nexport function createHarness(renderer: CliRenderer): Harness {\n const setup = SimulationRenderer.setupFor(renderer)\n return {\n renderer,\n mockInput: setup?.mockInput ?? createMockKeys(renderer),\n mockMouse: setup?.mockMouse ?? createMockMouse(renderer),\n resize: setup?.resize ?? ((cols, rows) => renderer.resize(cols, rows)),\n renderOnce:\n setup?.renderOnce ??\n (async () => {\n renderer.requestRender()\n await renderer.idle()\n }),\n // captureCharFrame follows the test renderer's output sink. Recording\n // redirects that sink to the timeline, so read the live render buffer\n // instead; it is also the source used by screenshots.\n screen: () => decoder.decode((Reflect.get(renderer, \"currentRenderBuffer\") as RenderBuffer).getRealCharBytes()),\n }\n}\n\nexport function elements(renderer: CliRenderer): Element[] {\n return all(renderer.root)\n .filter((renderable) => renderable.visible && !renderable.isDestroyed)\n .map((renderable) => {\n const clickable = mouseListeners(renderable) && hit(renderer, renderable)\n return {\n id: renderable.id,\n num: renderable.num,\n x: renderable.screenX,\n y: renderable.screenY,\n width: renderable.width,\n height: renderable.height,\n focusable: renderable.focusable,\n focused: renderable.focused,\n clickable,\n editor: renderer.currentFocusedEditor === renderable,\n } satisfies Element\n })\n .filter((element) => element.focusable || element.clickable || element.editor)\n}\n\nexport function state(harness: Harness) {\n return {\n focused: {\n renderable: harness.renderer.currentFocusedRenderable?.num,\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function matches(harness: Pick<Harness, \"screen\">, text: string) {\n return harness.screen().includes(text)\n}\n\nexport const capture = Effect.fn(\"SimulationActions.capture\")(function* (harness: Harness) {\n yield* Effect.tryPromise(() => harness.renderOnce())\n const buffer = harness.renderer.currentRenderBuffer\n return {\n cols: buffer.width,\n rows: buffer.height,\n cursor: [0, 0] as const,\n lines: buffer.getSpanLines().map((line) => ({\n spans: line.spans.map((span) => ({\n text: span.text,\n fg: span.fg.toInts(),\n bg: span.bg.toInts(),\n attributes: span.attributes,\n width: span.width,\n })),\n })),\n } satisfies SimulationProtocol.Frontend.CapturedFrame\n})\n\nexport const screenshot = Effect.fn(\"SimulationActions.screenshot\")(function* (harness: Harness, name?: string) {\n const filename = name ?? `screenshot-${crypto.randomUUID()}`\n if (!filename || filename.includes(\"/\") || filename.includes(\"\\\\\") || extname(filename))\n return yield* Effect.fail(new Error(\"screenshot name must not contain a path or extension\"))\n yield* Effect.tryPromise(() => harness.renderOnce())\n const { SimulationPng } = yield* Effect.promise(() => import(\"./png\"))\n const image = SimulationPng.screenshot(harness.renderer)\n const directory = resolve(\n yield* Config.string(\"OPENCODE_DRIVE_MEDIA_DIR\").pipe(\n Config.withDefault(join(tmpdir(), \"opencode-drive\", \"output\")),\n ),\n )\n const fs = yield* FileSystem.FileSystem\n yield* fs.makeDirectory(directory, { recursive: true })\n const path = join(directory, `${filename}.png`)\n yield* fs.writeFile(path, image.data)\n return path\n})\n\nexport const execute = Effect.fn(\"SimulationActions.execute\")(function* (harness: Harness, action: Action) {\n switch (action.type) {\n case \"ui.type\":\n yield* Effect.tryPromise(() => harness.mockInput.typeText(action.text))\n break\n case \"ui.press\":\n harness.mockInput.pressKey(keyInput(action.key), action.modifiers)\n break\n case \"ui.enter\":\n harness.mockInput.pressEnter()\n break\n case \"ui.arrow\":\n harness.mockInput.pressArrow(action.direction)\n break\n case \"ui.focus\":\n all(harness.renderer.root)\n .find((item) => item.num === action.target)\n ?.focus()\n break\n case \"ui.click\":\n yield* Effect.tryPromise(() => harness.mockMouse.click(action.x, action.y))\n break\n case \"ui.resize\":\n if (\n !Number.isSafeInteger(action.cols) ||\n action.cols <= 0 ||\n !Number.isSafeInteger(action.rows) ||\n action.rows <= 0\n ) {\n return yield* Effect.fail(new Error(\"resize cols and rows must be positive integers\"))\n }\n harness.resize(action.cols, action.rows)\n SimulationRenderer.recordResize(harness.renderer, action.cols, action.rows)\n break\n }\n yield* Effect.tryPromise(() => harness.renderOnce())\n return state(harness)\n})\n\nexport * as SimulationActions from \"./actions\"\n", | ||
| "import { createWriteStream, type WriteStream } from \"node:fs\"\nimport { mkdir } from \"node:fs/promises\"\nimport { dirname } from \"node:path\"\nimport { Writable } from \"node:stream\"\nimport { finished } from \"node:stream/promises\"\nimport { Schema } from \"effect\"\n\nexport const Header = Schema.Struct({\n type: Schema.Literal(\"header\"),\n version: Schema.Literal(1),\n cols: Schema.Number,\n rows: Schema.Number,\n encoding: Schema.Literal(\"base64\"),\n})\nexport interface Header extends Schema.Schema.Type<typeof Header> {}\n\nexport const Output = Schema.Struct({\n type: Schema.Literal(\"output\"),\n at_ms: Schema.Number,\n data: Schema.String,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n\nexport const Resize = Schema.Struct({\n type: Schema.Literal(\"resize\"),\n at_ms: Schema.Number,\n cols: Schema.Number,\n rows: Schema.Number,\n})\nexport interface Resize extends Schema.Schema.Type<typeof Resize> {}\n\nexport const Event = Schema.Union([Header, Output, Resize])\nexport type Event = Schema.Schema.Type<typeof Event>\n\nexport class Timeline extends Writable {\n readonly isTTY = true\n readonly path: string\n readonly columns: number\n readonly rows: number\n private readonly output: WriteStream\n private readonly started = performance.now()\n private readonly timestamps: number[] = []\n private done?: Promise<string>\n\n private constructor(path: string, cols: number, rows: number, output: WriteStream) {\n super()\n this.path = path\n this.columns = cols\n this.rows = rows\n this.output = output\n // finish() reports stream failures; keep Writable from also throwing them process-wide.\n this.on(\"error\", () => {})\n output.on(\"error\", (error) => this.destroy(error))\n }\n\n static async create(path: string, cols: number, rows: number) {\n await mkdir(dirname(path), { recursive: true })\n const output = createWriteStream(path)\n const timeline = new Timeline(path, cols, rows, output)\n await new Promise<void>((resolve, reject) => {\n output.write(\n `${JSON.stringify({ type: \"header\", version: 1, cols, rows, encoding: \"base64\" } satisfies Header)}\\n`,\n (error) => (error ? reject(error) : resolve()),\n )\n })\n return timeline\n }\n\n getColorDepth() {\n return 24\n }\n\n override write(chunk: unknown, callback?: (error?: Error | null) => void): boolean\n override write(chunk: unknown, encoding: BufferEncoding, callback?: (error?: Error | null) => void): boolean\n override write(\n chunk: unknown,\n encoding?: BufferEncoding | ((error?: Error | null) => void),\n callback?: (error?: Error | null) => void,\n ) {\n if (!this.writableEnded) {\n this.timestamps.push(this.elapsed())\n if (typeof encoding === \"function\") return super.write(chunk, encoding)\n if (encoding === undefined) return super.write(chunk, callback)\n return super.write(chunk, encoding, callback)\n }\n const done = typeof encoding === \"function\" ? encoding : callback\n queueMicrotask(() => done?.(null))\n return true\n }\n\n override _write(chunk: Buffer, _encoding: BufferEncoding, callback: (error?: Error | null) => void) {\n this.writeOutput(chunk, this.timestamps.shift() ?? this.elapsed(), callback)\n }\n\n override _final(callback: (error?: Error | null) => void) {\n this.writeOutput(Buffer.alloc(0), this.elapsed(), (error) => {\n if (error) return callback(error)\n this.output.end(callback)\n })\n }\n\n finish() {\n if (this.done) return this.done\n this.end()\n this.done = finished(this).then(() => this.path)\n return this.done\n }\n\n resize(cols: number, rows: number) {\n if (this.writableEnded) return\n const event = { type: \"resize\", at_ms: this.elapsed(), cols, rows } satisfies Resize\n this.output.write(`${JSON.stringify(event)}\\n`)\n }\n\n private elapsed() {\n return Math.max(0, Math.round(performance.now() - this.started))\n }\n\n private writeOutput(data: Buffer, at_ms: number, callback: (error?: Error | null) => void) {\n const event = {\n type: \"output\",\n at_ms,\n data: data.toString(\"base64\"),\n } satisfies Output\n this.output.write(`${JSON.stringify(event)}\\n`, callback)\n }\n}\n\nexport * as SimulationRecording from \"./recording\"\n", | ||
| "import type { CliRenderer, CliRendererConfig } from \"@opentui/core\"\nimport { createTestRenderer, type TestRendererSetup } from \"@opentui/core/testing\"\nimport { Effect } from \"effect\"\nimport { Timeline } from \"../recording\"\n\nconst setups = new WeakMap<CliRenderer, TestRendererSetup>()\nconst recordings = new WeakMap<CliRenderer, Timeline>()\n\n/**\n * Creates a headless renderer with optional recording: a real CliRenderer\n * backed by an in-memory screen buffer. The TestRendererSetup is kept\n * module-side so the harness can use supported testing APIs without app\n * code carrying it around.\n */\nexport interface Viewport {\n readonly cols: number\n readonly rows: number\n}\n\nexport const create = Effect.fn(\"SimulationRenderer.create\")(function* (\n options: CliRendererConfig,\n path?: string,\n viewport?: Viewport,\n) {\n const cols = viewport?.cols ?? 100\n const rows = viewport?.rows ?? 40\n const recording = path\n ? yield* Effect.acquireRelease(\n Effect.tryPromise(() => Timeline.create(path, cols, rows)),\n (recording) =>\n Effect.tryPromise(() => recording.finish()).pipe(\n Effect.catch((error) =>\n Effect.sync(() => process.stderr.write(`Failed to finish UI recording: ${error}\\n`)),\n ),\n ),\n )\n : undefined\n const setup = yield* Effect.acquireRelease(\n Effect.tryPromise(() =>\n createTestRenderer({\n ...options,\n width: cols,\n height: rows,\n ...(recording\n ? {\n stdout: recording as unknown as NodeJS.WriteStream,\n bufferedOutput: \"stdout\" as const,\n }\n : {}),\n }),\n ),\n (setup) =>\n Effect.sync(() => {\n if (!setup.renderer.isDestroyed) setup.renderer.destroy()\n }),\n )\n setups.set(setup.renderer, setup)\n if (recording) recordings.set(setup.renderer, recording)\n return setup.renderer\n})\n\nexport function recordResize(renderer: CliRenderer, cols: number, rows: number) {\n recordings.get(renderer)?.resize(cols, rows)\n}\n\nexport function setupFor(renderer: CliRenderer): TestRendererSetup | undefined {\n return setups.get(renderer)\n}\n\nexport function finish(renderer: CliRenderer) {\n const recording = recordings.get(renderer)\n if (!recording) return Effect.fail(new Error(\"UI recording is not available\"))\n return Effect.tryPromise(() => recording.finish())\n}\n\nexport * as SimulationRenderer from \"./renderer\"\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationActions, type Harness } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\n\nfunction handle(harness: Harness, request: SimulationProtocol.Frontend.Request) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.screenshot\":\n return SimulationActions.screenshot(harness, request.params?.name)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.matches\":\n return Effect.sync(() => SimulationActions.matches(harness, request.params.text))\n case \"ui.recording.finish\":\n return SimulationRenderer.finish(harness.renderer)\n case \"ui.type\":\n return SimulationActions.execute(harness, { type: \"ui.type\", text: request.params.text })\n case \"ui.enter\":\n return SimulationActions.execute(harness, { type: \"ui.enter\" })\n case \"ui.press\":\n return SimulationActions.execute(harness, {\n type: \"ui.press\",\n key: request.params.key,\n modifiers: request.params.modifiers,\n })\n case \"ui.arrow\":\n return SimulationActions.execute(harness, { type: \"ui.arrow\", direction: request.params.direction })\n case \"ui.focus\":\n return SimulationActions.execute(harness, { type: \"ui.focus\", target: request.params.target })\n case \"ui.click\":\n return SimulationActions.execute(harness, {\n type: \"ui.click\",\n target: request.params.target,\n x: request.params.x,\n y: request.params.y,\n })\n case \"ui.resize\":\n return SimulationActions.execute(harness, {\n type: \"ui.resize\",\n cols: request.params.cols,\n rows: request.params.rows,\n })\n }\n}\n\nexport const start = Effect.fn(\"SimulationServer.start\")(function* (harness: Harness, endpoint: string) {\n return yield* SimulationControlServer.start({\n endpoint,\n label: \"opencode drive ui websocket\",\n data: () => ({ drive: true as const }),\n decode: SimulationProtocol.Frontend.decodeRequestEffect,\n handle: (_socket, request) => handle(harness, request),\n })\n})\n\nexport * as SimulationServer from \"./server\"\n", | ||
| "import { createCliRenderer, type CliRendererConfig } from \"@opentui/core\"\nimport { Config, Effect } from \"effect\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationActions } from \"./actions\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationServer } from \"./server\"\n\n/** Drive-mode renderer and control-server acquisition. */\nexport const create = Effect.fn(\"Drive.create\")(function* (options: CliRendererConfig) {\n const headless = (yield* Config.string(\"OPENCODE_DRIVE_RENDERER\").pipe(Config.withDefault(\"visible\"))) === \"headless\"\n const manifest = yield* DriveManifest.resolve()\n const renderer = headless\n ? yield* SimulationRenderer.create(options, manifest.recording?.timeline, manifest.viewport)\n : yield* Effect.acquireRelease(\n Effect.tryPromise(() => createCliRenderer(options)),\n (renderer) =>\n Effect.sync(() => {\n if (!renderer.isDestroyed) renderer.destroy()\n }),\n )\n if (!headless && manifest.viewport) renderer.resize(manifest.viewport.cols, manifest.viewport.rows)\n const server = yield* SimulationServer.start(SimulationActions.createHarness(renderer), manifest.endpoints.ui)\n yield* Effect.sync(() => process.stderr.write(`opencode drive ui websocket: ${server.url}\\n`))\n return renderer\n})\n\nexport * as Drive from \"./simulation\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "1BBCC566840A3BC464756E2164756E21", | ||
| "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\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";+1BAGA,SAAe,SCDf,yBACA,6BAAS,iBAIT,SAAM,OAAiB,MAAC,QAAI,QAAI,QAAI,QAAI,OAAE,OAE7B,OAAO,OAAO,SAAI,cAAU,OAAG,MACxC,gBAA4E,iCAC5E,gBAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "B701B8FAB352164664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,YACnC,OAAO,QAAG,yBAAoB,OAAE,cAAU,OAAG,MAC3C,SAAM,OAAU,WAAO,OAAc,aAAQ,OACvC,OAAQ,WAAO,OAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "055D60FE9B7FB22264756E2164756E21", | ||
| "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(\n ` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ojCAAA,mBAAS,gBAST,SAAe,SAAQ,aACrB,OAAS,cAAS,UAClB,OAAO,QAAG,eAAU,OAAE,cAAU,OAAG,MACjC,SAAM,OAAW,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,OAC/D,OAAW,WAAO,OAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MACb,kFAAkF,IAAM,GAC1F,EACD,CACH", | ||
| "debugId": "D62610C27CA74EBF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/backend/network.ts", "../simulation/src/backend/openai.ts", "../simulation/src/backend/simulated-provider.ts", "../simulation/src/backend/index.ts"], | ||
| "sourcesContent": [ | ||
| "import { Clock, Effect, Layer, Ref } from \"effect\"\nimport { HttpClient, HttpClientResponse, type HttpMethod } from \"effect/unstable/http\"\nimport { HttpClientError, TransportError } from \"effect/unstable/http/HttpClientError\"\nimport type { HttpClientRequest } from \"effect/unstable/http\"\nimport { SimulationProtocol } from \"../protocol\"\n\n/**\n * Simulated network.\n *\n * Replaces the `HttpClient.HttpClient` platform node in simulation mode. All\n * outbound HTTP resolves against an in-memory route table; unknown\n * destinations fail loudly with a transport error so no simulation run can\n * silently reach the real network. The scripted LLM is one registered route,\n * not a separate mechanism.\n *\n * Each acquired run owns its routes and request log.\n */\n\nexport interface Route {\n /** Return a response effect to claim the request, undefined to pass. */\n readonly match: (\n request: HttpClientRequest.HttpClientRequest,\n url: URL,\n ) => Effect.Effect<HttpClientResponse.HttpClientResponse, HttpClientError> | undefined\n}\n\nexport type LogEntry = SimulationProtocol.Backend.NetworkLogEntry\n\nconst LOG_LIMIT = 1000\n\n/** Static JSON route: exact method + origin/path match answered with a fixed body. */\nexport function json(method: HttpMethod.HttpMethod, url: string, body: unknown): Route {\n return {\n match: (request, requestUrl) => {\n if (request.method !== method) return undefined\n if (requestUrl.origin + requestUrl.pathname !== url) return undefined\n return Effect.sync(() =>\n HttpClientResponse.fromWeb(\n request,\n new Response(JSON.stringify(body), { status: 200, headers: { \"content-type\": \"application/json\" } }),\n ),\n )\n },\n }\n}\n\nexport interface Run {\n readonly client: HttpClient.HttpClient\n readonly log: () => Effect.Effect<readonly LogEntry[]>\n}\n\nexport const make = Effect.fn(\"SimulationNetwork.make\")(function* (routes: readonly Route[] = []) {\n const log = yield* Ref.make<readonly LogEntry[]>([])\n const client = HttpClient.make((request, url) =>\n Effect.gen(function* () {\n let matched: Effect.Effect<HttpClientResponse.HttpClientResponse, HttpClientError> | undefined\n for (const route of routes) {\n matched = route.match(request, url)\n if (matched) break\n }\n const entry = {\n time: yield* Clock.currentTimeMillis,\n method: request.method,\n url: url.toString(),\n matched: matched !== undefined,\n }\n yield* Ref.update(log, (entries) => [...entries, entry].slice(-LOG_LIMIT))\n if (matched) return yield* matched\n return yield* Effect.fail(\n new HttpClientError({\n reason: new TransportError({\n request,\n description: `Simulation denied unregistered network destination: ${request.method} ${url}`,\n }),\n }),\n )\n }),\n )\n return { client, log: () => Ref.get(log) } satisfies Run\n})\n\nexport const layer = (routes: readonly Route[] = []) =>\n Layer.effect(HttpClient.HttpClient, make(routes).pipe(Effect.map((run) => run.client)))\n\nexport * as SimulationNetwork from \"./network\"\n", | ||
| "import { Effect, Schema, Stream } from \"effect\"\nimport { HttpClientResponse } from \"effect/unstable/http\"\nimport { HttpClientError, TransportError } from \"effect/unstable/http/HttpClientError\"\nimport { OpenAIChatEvent, DEFAULT_BASE_URL, PATH } from \"@opencode-ai/ai/protocols/openai-chat\"\nimport { SimulationNetwork } from \"./network\"\nimport { SimulatedProvider } from \"./simulated-provider\"\n\n/**\n * Driver-answered OpenAI endpoint for the simulated network.\n *\n * Claims `POST {DEFAULT_BASE_URL}{PATH}` (the real openai-chat route\n * endpoint), invokes the simulated provider, and streams the driver's events back as\n * an OpenAI Chat SSE response terminated by `[DONE]`. Everything downstream\n * of the response bytes is the real pipeline: SSE framing, the OpenAIChat\n * event schema, the protocol state machine, and Lifecycle grammar.\n */\n\nconst encodeChunk = Schema.encodeUnknownSync(OpenAIChatEvent)\n\nconst encoder = new TextEncoder()\nconst decodeBody = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Json))\n\n// The simulated model id is echoed back only in non-schema fields; the\n// protocol event schema ignores unknown fields, so id/object/model are\n// decorative wire realism.\ntype ProviderItem = Exclude<SimulatedProvider.ProviderResponseEvent, { readonly type: \"finish\" }>\ntype FinishReason = Extract<SimulatedProvider.ProviderResponseEvent, { readonly type: \"finish\" }>[\"reason\"]\n\nfunction chunkOf(item: ProviderItem): OpenAIChatEvent | unknown {\n if (item.type === \"textDelta\") return { choices: [{ delta: { content: item.text } }] }\n if (item.type === \"reasoningDelta\") return { choices: [{ delta: { reasoning_content: item.text } }] }\n if (item.type === \"toolCall\")\n return {\n choices: [\n {\n delta: {\n tool_calls: [\n {\n index: item.index,\n id: item.id,\n function: { name: item.name, arguments: JSON.stringify(item.input) },\n },\n ],\n },\n },\n ],\n }\n return item.chunk\n}\n\nconst finishReasonWire: Record<FinishReason, string> = {\n stop: \"stop\",\n \"tool-calls\": \"tool_calls\",\n length: \"length\",\n \"content-filter\": \"content_filter\",\n}\n\nfunction frame(payload: unknown): Uint8Array {\n return encoder.encode(`data: ${JSON.stringify(payload)}\\n\\n`)\n}\n\nfunction sseBody(\n events: Stream.Stream<SimulatedProvider.ProviderResponseEvent, SimulatedProvider.ProviderDisconnectedError>,\n): Stream.Stream<Uint8Array, SimulatedProvider.ProviderDisconnectedError> {\n return events.pipe(\n Stream.map((event) => {\n if (event.type === \"finish\")\n return frame(encodeChunk({ choices: [{ delta: {}, finish_reason: finishReasonWire[event.reason] }] }))\n if (event.type === \"raw\") return frame(event.chunk)\n return frame(encodeChunk(chunkOf(event)))\n }),\n Stream.concat(Stream.make(encoder.encode(\"data: [DONE]\\n\\n\"))),\n )\n}\n\nexport const route = (provider: SimulatedProvider.Interface): SimulationNetwork.Route => ({\n match: (request, url) => {\n if (request.method !== \"POST\") return undefined\n if (url.origin + url.pathname !== DEFAULT_BASE_URL + PATH) return undefined\n return Effect.gen(function* () {\n const body =\n request.body._tag === \"Uint8Array\"\n ? yield* decodeBody(new TextDecoder().decode(request.body.body)).pipe(\n Effect.mapError(\n (cause) =>\n new HttpClientError({\n reason: new TransportError({\n request,\n cause,\n description: \"Simulation received an invalid OpenAI request body\",\n }),\n }),\n ),\n )\n : {}\n return HttpClientResponse.fromWeb(\n request,\n new Response(Stream.toReadableStream(sseBody(provider.stream({ url: url.toString(), body }))), {\n status: 200,\n headers: { \"content-type\": \"text/event-stream\" },\n }),\n )\n })\n },\n})\n\nexport * as SimulationOpenAI from \"./openai\"\n", | ||
| "import { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Cause, Context, Effect, Fiber, FiberSet, Layer, PubSub, Queue, Ref, Schema, Semaphore, Stream } from \"effect\"\nimport { SimulationControlServer } from \"../control-server\"\nimport { SimulationProtocol } from \"../protocol\"\n\nexport interface ProviderRequest {\n readonly url: string\n readonly body: unknown\n}\n\nexport type ProviderResponseEvent =\n | SimulationProtocol.Backend.Item\n | { readonly type: \"finish\"; readonly reason: SimulationProtocol.Backend.FinishReason }\n\nexport class ProviderDisconnectedError extends Schema.TaggedErrorClass<ProviderDisconnectedError>()(\n \"SimulatedProvider.ProviderDisconnectedError\",\n { message: Schema.String },\n) {}\n\nexport interface Interface {\n readonly stream: (request: ProviderRequest) => Stream.Stream<ProviderResponseEvent, ProviderDisconnectedError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/simulation/SimulatedProvider\") {}\n\ninterface ProviderInvocation extends ProviderRequest {\n readonly id: string\n}\n\ninterface PendingInvocation extends ProviderInvocation {\n readonly responses: Queue.Queue<ProviderResponseEvent, ProviderDisconnectedError | Cause.Done>\n}\n\ninterface State {\n readonly counter: number\n readonly pending: ReadonlyMap<string, PendingInvocation>\n}\n\ninterface Driver {\n readonly requests: Stream.Stream<ProviderInvocation>\n readonly push: (\n id: string,\n items: readonly SimulationProtocol.Backend.Item[],\n ) => Effect.Effect<void, InvocationNotFoundError>\n readonly finish: (\n id: string,\n reason: SimulationProtocol.Backend.FinishReason,\n ) => Effect.Effect<void, InvocationNotFoundError>\n readonly disconnect: (id: string) => Effect.Effect<void, InvocationNotFoundError>\n readonly pending: () => Effect.Effect<readonly ProviderInvocation[]>\n}\n\nclass InvocationNotFoundError extends Schema.TaggedErrorClass<InvocationNotFoundError>()(\n \"SimulatedProvider.InvocationNotFoundError\",\n { id: Schema.String, message: Schema.String },\n) {}\n\nclass ControllerDisconnectedError extends Schema.TaggedErrorClass<ControllerDisconnectedError>()(\n \"SimulatedProvider.ControllerDisconnectedError\",\n { message: Schema.String },\n) {}\n\ntype ControlSocket = SimulationControlServer.Socket\n\nexport const layerDrive = (options: { readonly endpoint: string }) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const state = yield* Ref.make<State>({ counter: 0, pending: new Map() })\n const opened = yield* PubSub.unbounded<ProviderInvocation>()\n const lock = yield* Semaphore.make(1)\n\n const close = (invocation: PendingInvocation) =>\n Effect.gen(function* () {\n yield* Queue.shutdown(invocation.responses)\n yield* lock.withPermit(\n Ref.update(state, (current) =>\n current.pending.get(invocation.id) === invocation ? remove(current, invocation.id) : current,\n ),\n )\n })\n\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n const current = yield* Ref.get(state)\n yield* Effect.forEach(current.pending.values(), (invocation) => Queue.shutdown(invocation.responses), {\n discard: true,\n })\n yield* PubSub.shutdown(opened)\n }),\n )\n\n const open = (request: ProviderRequest) =>\n lock.withPermit(\n Effect.gen(function* () {\n const current = yield* Ref.get(state)\n const id = `inv_${current.counter + 1}`\n const responses = yield* Queue.bounded<ProviderResponseEvent, ProviderDisconnectedError | Cause.Done>(256)\n const invocation: PendingInvocation = { id, ...request, responses }\n yield* Ref.set(state, {\n counter: current.counter + 1,\n pending: new Map(current.pending).set(id, invocation),\n })\n yield* PubSub.publish(opened, { id, ...request })\n return invocation\n }),\n )\n\n const requireInvocation = (id: string) =>\n Effect.gen(function* () {\n const current = yield* Ref.get(state)\n const invocation = current.pending.get(id)\n if (invocation) return invocation\n return yield* Effect.fail(\n new InvocationNotFoundError({\n id,\n message: `Simulated provider invocation not found or already finished: ${id}`,\n }),\n )\n })\n\n const remove = (current: State, id: string) => {\n const pending = new Map(current.pending)\n pending.delete(id)\n return { ...current, pending }\n }\n\n const driver: Driver = {\n requests: Stream.unwrap(\n lock.withPermit(\n Effect.gen(function* () {\n const subscription = yield* PubSub.subscribe(opened)\n const current = yield* Ref.get(state)\n const pending = Array.from(current.pending.values(), ({ id, url, body }) => ({ id, url, body }))\n return Stream.concat(Stream.fromIterable(pending), Stream.fromEffectRepeat(PubSub.take(subscription)))\n }),\n ),\n ),\n push: (id, items) =>\n Effect.gen(function* () {\n const invocation = yield* lock.withPermit(requireInvocation(id))\n yield* Queue.offerAll(invocation.responses, items)\n }),\n finish: (id, reason) =>\n Effect.gen(function* () {\n const invocation = yield* lock.withPermit(\n Effect.gen(function* () {\n const invocation = yield* requireInvocation(id)\n const current = yield* Ref.get(state)\n yield* Ref.set(state, remove(current, id))\n return invocation\n }),\n )\n yield* Queue.offer(invocation.responses, { type: \"finish\", reason })\n yield* Queue.end(invocation.responses)\n }),\n disconnect: (id) =>\n Effect.gen(function* () {\n const invocation = yield* lock.withPermit(\n Effect.gen(function* () {\n const invocation = yield* requireInvocation(id)\n const current = yield* Ref.get(state)\n yield* Ref.set(state, remove(current, id))\n return invocation\n }),\n )\n yield* Queue.fail(\n invocation.responses,\n new ProviderDisconnectedError({ message: \"Simulated model provider disconnected\" }),\n )\n }),\n pending: () =>\n lock.withPermit(\n Ref.get(state).pipe(\n Effect.map((current) => Array.from(current.pending.values(), ({ id, url, body }) => ({ id, url, body }))),\n ),\n ),\n }\n\n const fibers = yield* FiberSet.make<void, unknown>()\n const activeController = yield* Ref.make<Fiber.Fiber<void> | undefined>(undefined)\n const controllerLock = yield* Semaphore.make(1)\n yield* SimulationControlServer.start({\n endpoint: options.endpoint,\n label: \"opencode drive backend websocket\",\n data: () => ({}),\n decode: SimulationProtocol.Backend.decodeRequestEffect,\n handle: (socket, request) => handle(driver, fibers, activeController, controllerLock, socket, request),\n close: (socket) => releaseController(activeController, controllerLock, socket),\n })\n yield* Effect.sync(() => process.stderr.write(`opencode drive backend websocket: ${options.endpoint}\\n`))\n\n return Service.of({\n stream: (request) =>\n Stream.unwrap(\n Effect.acquireRelease(open(request), close).pipe(\n Effect.map((invocation) =>\n Stream.fromQueue(invocation.responses).pipe(Stream.takeUntil((event) => event.type === \"finish\")),\n ),\n ),\n ),\n })\n }),\n )\n\nfunction handle(\n driver: Driver,\n fibers: FiberSet.FiberSet<void, unknown>,\n activeController: Ref.Ref<Fiber.Fiber<void> | undefined>,\n controllerLock: Semaphore.Semaphore,\n socket: ControlSocket,\n request: SimulationProtocol.Backend.Request,\n) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"backend\",\n server: { name: \"opencode\", version: InstallationVersion },\n capabilities: SimulationProtocol.Backend.Capabilities,\n },\n request.params,\n )\n case \"llm.attach\":\n return controllerLock.withPermit(\n Effect.gen(function* () {\n if (socket.data.closed)\n return yield* Effect.fail(\n new ControllerDisconnectedError({ message: \"Drive controller disconnected before attachment\" }),\n )\n const previous = yield* Ref.get(activeController)\n if (previous) yield* Fiber.interrupt(previous)\n const attachment = yield* FiberSet.run(\n fibers,\n driver.requests.pipe(\n Stream.runForEach((invocation) =>\n Effect.sync(() => {\n socket.send(JSON.stringify({ jsonrpc: \"2.0\", method: \"llm.request\", params: invocation }))\n }),\n ),\n ),\n )\n if (socket.data.closed) {\n yield* Fiber.interrupt(attachment)\n return yield* Effect.fail(\n new ControllerDisconnectedError({ message: \"Drive controller disconnected during attachment\" }),\n )\n }\n socket.data.attachment = attachment\n yield* Ref.set(activeController, attachment)\n return { attached: true }\n }),\n )\n case \"llm.chunk\":\n return driver.push(request.params.id, request.params.items).pipe(Effect.as({ ok: true }))\n case \"llm.finish\":\n return driver.finish(request.params.id, request.params.reason).pipe(Effect.as({ ok: true }))\n case \"llm.disconnect\":\n return driver.disconnect(request.params.id).pipe(Effect.as({ ok: true }))\n case \"llm.pending\":\n return driver.pending().pipe(Effect.map((invocations) => ({ invocations })))\n }\n}\n\nfunction releaseController(\n activeController: Ref.Ref<Fiber.Fiber<void> | undefined>,\n controllerLock: Semaphore.Semaphore,\n socket: ControlSocket,\n) {\n return controllerLock.withPermit(\n Effect.gen(function* () {\n const attachment = socket.data.attachment\n if (!attachment) return\n yield* Fiber.interrupt(attachment)\n yield* Ref.update(activeController, (active) => (active === attachment ? undefined : active))\n }),\n )\n}\n\nexport * as SimulatedProvider from \"./simulated-provider\"\n", | ||
| "import { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { httpClient } from \"@opencode-ai/core/effect/app-node-platform\"\nimport { Config, Effect, Layer } from \"effect\"\nimport { HttpClient } from \"effect/unstable/http\"\nimport { DriveManifest } from \"../manifest\"\nimport { SimulationNetwork } from \"./network\"\nimport { SimulationOpenAI } from \"./openai\"\nimport { SimulatedProvider } from \"./simulated-provider\"\n\n/**\n * Layer replacements applied when the server is built in simulation mode.\n *\n * The server merges these into the app node build when `OPENCODE_SIMULATE`\n * is enabled, via a dynamic import so this module is never loaded eagerly.\n *\n * - Network: all outbound HTTP resolves against the simulated route table;\n * unknown destinations are denied. The driver-answered OpenAI endpoint is\n * registered here as the first route.\n *\n */\n\nexport const simulationReplacements = Effect.fn(\"Simulation.replacements\")(function* () {\n // ModelsDev dies when its catalog fetch fails, so simulation answers it with\n // an empty catalog; providers come from seeded config instead.\n const models = SimulationNetwork.json(\"GET\", \"https://models.dev/api.json\", {})\n const drive = yield* Config.string(\"OPENCODE_DRIVE\").pipe(Config.withDefault(undefined))\n if (!drive) return [[httpClient, SimulationNetwork.layer([models])]] satisfies LayerNode.Replacements\n\n const manifest = yield* DriveManifest.resolve()\n const networkLayer = Layer.effect(\n HttpClient.HttpClient,\n Effect.gen(function* () {\n const provider = yield* SimulatedProvider.Service\n const network = yield* SimulationNetwork.make([SimulationOpenAI.route(provider), models])\n return network.client\n }),\n ).pipe(\n Layer.provide(\n SimulatedProvider.layerDrive({\n endpoint: manifest.endpoints.backend,\n }),\n ),\n )\n return [[httpClient, networkLayer]] satisfies LayerNode.Replacements\n})\n\nexport * as Simulation from \"./index\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E98C81B2B45D18D964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/editor.ts", "../tui/src/editor-zed-sqlite.bun.ts", "../tui/src/editor-zed.ts"], | ||
| "sourcesContent": [ | ||
| "import type { CliRenderer } from \"@opentui/core\"\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\"\nimport { readFile, rm, writeFile } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { spawn } from \"node:child_process\"\nimport type { Stream } from \"node:stream\"\nimport { resolveZedDbPath, resolveZedSelection } from \"./editor-zed\"\n\nexport { normalizePromptContent } from \"./prompt/content\"\n\ntype EditorStdio = \"inherit\" | \"pipe\" | \"ignore\" | number | Stream\n\nexport async function openEditor(input: { value: string; renderer: CliRenderer; cwd?: string; stdin?: EditorStdio }) {\n const editor = process.env.VISUAL || process.env.EDITOR\n if (!editor) return\n const file = path.join(os.tmpdir(), `${Date.now()}.md`)\n await writeFile(file, input.value)\n input.renderer.suspend()\n input.renderer.currentRenderBuffer.clear()\n try {\n await new Promise<void>((resolve, reject) => {\n const parts = editor.split(\" \")\n const child = spawn(parts[0]!, [...parts.slice(1), file], {\n cwd: input.cwd && existsSync(input.cwd) ? input.cwd : process.cwd(),\n stdio: [input.stdin ?? \"inherit\", \"inherit\", \"inherit\"],\n shell: process.platform === \"win32\",\n })\n child.on(\"error\", reject)\n child.on(\"exit\", (code, signal) => {\n if (code === 0) return resolve()\n reject(new Error(`Editor exited with ${signal ? `signal ${signal}` : `code ${code}`}`))\n })\n })\n return (await readFile(file, \"utf8\")) || undefined\n } finally {\n await rm(file, { force: true }).catch(() => {})\n input.renderer.currentRenderBuffer.clear()\n input.renderer.resume()\n input.renderer.requestRender()\n }\n}\n\nexport function discoverEditorConnection(directory: string) {\n const root = path.join(os.homedir(), \".claude\", \"ide\")\n const contains = (parent: string) => {\n const resolved = path.resolve(parent)\n const relative = path.relative(resolved, path.resolve(directory))\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) ? resolved.length : 0\n }\n try {\n return readdirSync(root)\n .filter((entry) => entry.endsWith(\".lock\"))\n .flatMap((entry) => {\n const file = path.join(root, entry)\n const port = Number.parseInt(path.basename(file, \".lock\"), 10)\n if (!Number.isInteger(port) || port <= 0 || port > 65535) return []\n try {\n const value = JSON.parse(readFileSync(file, \"utf8\")) as Record<string, unknown>\n if (value.transport !== undefined && value.transport !== \"ws\") return []\n const folders = Array.isArray(value.workspaceFolders)\n ? value.workspaceFolders.filter((item): item is string => typeof item === \"string\")\n : []\n const score = Math.max(0, ...folders.map(contains))\n if (!score) return []\n return [\n {\n url: `ws://127.0.0.1:${port}`,\n authToken: typeof value.authToken === \"string\" ? value.authToken : undefined,\n source: `lock:${port}`,\n score,\n mtime: statSync(file).mtimeMs,\n },\n ]\n } catch {\n return []\n }\n })\n .sort((left, right) => right.score - left.score || right.mtime - left.mtime)\n .map(({ url, authToken, source }) => ({ url, authToken, source }))[0]\n } catch {\n return undefined\n }\n}\n\nexport const editorIntegration = {\n connection: discoverEditorConnection,\n selection: (directory: string) => resolveZedSelection(resolveZedDbPath() ?? \"\", directory),\n}\n", | ||
| "export { Database } from \"bun:sqlite\"\n", | ||
| "import { Database } from \"#zed-sqlite\"\nimport { statSync } from \"node:fs\"\nimport { readFile as readFileAsync } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport { Option, Schema } from \"effect\"\nimport type { EditorSelection } from \"./context/editor\"\n\nconst ZedEditorRowSchema = Schema.Struct({\n item_kind: Schema.String,\n editor_id: Schema.NullOr(Schema.Number),\n workspace_id: Schema.Number,\n workspace_paths: Schema.NullOr(Schema.String),\n timestamp: Schema.String,\n buffer_path: Schema.NullOr(Schema.String),\n})\n\nconst ZedSelectionRowSchema = Schema.Struct({\n selection_start: Schema.NullOr(Schema.Number),\n selection_end: Schema.NullOr(Schema.Number),\n})\n\nconst ZedEditorContentsSchema = Schema.Struct({\n contents: Schema.NullOr(Schema.String),\n})\n\nconst decodeZedEditorRow = Schema.decodeUnknownOption(ZedEditorRowSchema)\nconst decodeZedSelectionRow = Schema.decodeUnknownOption(ZedSelectionRowSchema)\nconst decodeZedEditorContents = Schema.decodeUnknownOption(ZedEditorContentsSchema)\n\nconst utf8 = new TextEncoder()\n\ntype ZedEditorRow = Schema.Schema.Type<typeof ZedEditorRowSchema>\ntype ZedActiveEditorRow = ZedEditorRow & { item_kind: \"Editor\"; editor_id: number }\n\nexport type ZedSelectionResult =\n | { type: \"selection\"; selection: EditorSelection }\n | { type: \"empty\" }\n | { type: \"unavailable\" }\n\nexport async function resolveZedSelection(dbPath: string, cwd = process.cwd()): Promise<ZedSelectionResult> {\n const active = queryZedActiveEditor(dbPath, cwd)\n if (active.type !== \"row\") return active\n\n const row = active.row\n if (!row.buffer_path) return { type: \"empty\" }\n\n const selections = queryZedEditorSelections(dbPath, row)\n if (selections.type !== \"selections\") return selections\n const byteRanges = selections.selections\n .flatMap((selection) => {\n if (selection.selection_start == null || selection.selection_end == null) return []\n return [\n {\n start: Math.min(selection.selection_start, selection.selection_end),\n end: Math.max(selection.selection_start, selection.selection_end),\n },\n ]\n })\n .sort((left, right) => left.start - right.start || left.end - right.end)\n if (byteRanges.length === 0) return { type: \"unavailable\" }\n\n const contents = queryZedEditorContents(dbPath, row)\n const text =\n contents.type === \"contents\" && contents.contents != null\n ? contents.contents\n : await readFileAsync(row.buffer_path, \"utf8\").catch(() => undefined)\n if (text == null) return { type: \"unavailable\" }\n\n const ranges = byteRanges.map((range) => {\n const startOffset = utf8ByteOffsetToStringIndex(text, range.start)\n const endOffset = utf8ByteOffsetToStringIndex(text, range.end)\n return {\n text: text.slice(startOffset, endOffset),\n selection: offsetsToSelection(text, startOffset, endOffset),\n }\n })\n\n return {\n type: \"selection\",\n selection: {\n filePath: row.buffer_path,\n source: \"zed\",\n ranges,\n },\n }\n}\n\nfunction queryZedActiveEditor(dbPath: string, cwd: string) {\n let db: Database | undefined\n try {\n db = new Database(dbPath, { readonly: true })\n const raw = db\n .query(\n `select\n i.kind as item_kind,\n e.item_id as editor_id,\n i.workspace_id as workspace_id,\n w.paths as workspace_paths,\n w.timestamp as timestamp,\n e.buffer_path as buffer_path\n from items i\n join panes p on p.pane_id = i.pane_id and p.workspace_id = i.workspace_id\n join workspaces w on w.workspace_id = i.workspace_id\n left join editors e on e.item_id = i.item_id and e.workspace_id = i.workspace_id\n where i.active = 1 and p.active = 1\n order by w.timestamp desc`,\n )\n .all()\n\n const rows = raw.flatMap((row) => {\n const parsed = decodeZedEditorRow(row)\n return Option.isSome(parsed) ? [parsed.value] : []\n })\n\n if (raw.length > 0 && rows.length === 0) return { type: \"unavailable\" as const }\n\n const row = rows\n .map((row) => ({ row, score: scoreZedWorkspace(row.workspace_paths, cwd) }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score || right.row.timestamp.localeCompare(left.row.timestamp))[0]?.row\n if (!row) return { type: \"empty\" as const }\n if (row.item_kind !== \"Editor\") return { type: \"unavailable\" as const }\n if (!isZedActiveEditorRow(row)) return { type: \"empty\" as const }\n return { type: \"row\" as const, row }\n } catch {\n return { type: \"unavailable\" as const }\n } finally {\n db?.close()\n }\n}\n\nfunction queryZedEditorSelections(dbPath: string, row: ZedActiveEditorRow) {\n let db: Database | undefined\n try {\n db = new Database(dbPath, { readonly: true })\n const raw = db\n .query(\n `select\n start as selection_start,\n end as selection_end\n from editor_selections\n where editor_id = $editorID and workspace_id = $workspaceID`,\n )\n .all({ $editorID: row.editor_id, $workspaceID: row.workspace_id })\n\n const selections = raw.flatMap((selection) => {\n const parsed = decodeZedSelectionRow(selection)\n return Option.isSome(parsed) ? [parsed.value] : []\n })\n\n if (raw.length > 0 && selections.length === 0) return { type: \"unavailable\" as const }\n return { type: \"selections\" as const, selections }\n } catch {\n return { type: \"unavailable\" as const }\n } finally {\n db?.close()\n }\n}\n\nfunction queryZedEditorContents(dbPath: string, row: ZedActiveEditorRow) {\n let db: Database | undefined\n try {\n db = new Database(dbPath, { readonly: true })\n const parsed = decodeZedEditorContents(\n db\n .query(\n `select contents\n from editors\n where item_id = $editorID and workspace_id = $workspaceID`,\n )\n .get({ $editorID: row.editor_id, $workspaceID: row.workspace_id }),\n )\n if (Option.isNone(parsed)) return { type: \"unavailable\" as const }\n return { type: \"contents\" as const, contents: parsed.value.contents }\n } catch {\n return { type: \"unavailable\" as const }\n } finally {\n db?.close()\n }\n}\n\nfunction isZedActiveEditorRow(row: ZedEditorRow): row is ZedActiveEditorRow {\n return row.item_kind === \"Editor\" && row.editor_id != null\n}\n\nexport function resolveZedDbPath() {\n const candidates = [\n process.env.OPENCODE_ZED_DB,\n path.join(os.homedir(), \"Library\", \"Application Support\", \"Zed\", \"db\", \"0-stable\", \"db.sqlite\"),\n path.join(os.homedir(), \".local\", \"share\", \"zed\", \"db\", \"0-stable\", \"db.sqlite\"),\n ].filter((item): item is string => Boolean(item))\n\n return candidates.find((item) => isFile(item))\n}\n\nexport function isZedTerminal() {\n return process.env.ZED_TERM === \"true\" || process.env.TERM_PROGRAM?.toLowerCase() === \"zed\"\n}\n\nfunction isFile(item: string) {\n try {\n return statSync(item).isFile()\n } catch {\n return false\n }\n}\n\nfunction scoreZedWorkspace(workspacePaths: string | null, cwd: string) {\n return zedWorkspacePaths(workspacePaths).reduce((score, item) => {\n if (pathContains(item, cwd)) return Math.max(score, path.resolve(item).length)\n return score\n }, 0)\n}\n\nfunction zedWorkspacePaths(value: string | null) {\n if (!value) return []\n const parsed = parseJson(value)\n if (Array.isArray(parsed)) return parsed.filter((item): item is string => typeof item === \"string\")\n return value.split(/\\r?\\n/).filter(Boolean)\n}\n\nexport function offsetToPosition(text: string, offset: number) {\n const stringOffset = utf8ByteOffsetToStringIndex(text, offset)\n return offsetsToSelection(text, stringOffset, stringOffset).start\n}\n\nfunction utf8ByteOffsetToStringIndex(text: string, byteOffset: number) {\n if (byteOffset <= 0) return 0\n\n let bytes = 0\n for (let index = 0; index < text.length; ) {\n const codePoint = text.codePointAt(index)\n if (codePoint === undefined) return text.length\n\n const nextIndex = index + (codePoint > 0xffff ? 2 : 1)\n bytes += utf8.encode(text.slice(index, nextIndex)).length\n if (bytes >= byteOffset) return nextIndex\n index = nextIndex\n }\n\n return text.length\n}\n\nfunction offsetsToSelection(text: string, startOffset: number, endOffset: number) {\n const start = Math.max(0, Math.min(startOffset, text.length))\n const end = Math.max(0, Math.min(endOffset, text.length))\n let line = 1\n let lineStart = 0\n let startPosition = position(line, lineStart, start)\n let endPosition = position(line, lineStart, end)\n\n for (let index = 0; index <= end; index++) {\n if (index === start) startPosition = position(line, lineStart, index)\n if (index === end) {\n endPosition = position(line, lineStart, index)\n break\n }\n if (text[index] === \"\\n\") {\n line += 1\n lineStart = index + 1\n }\n }\n\n return { start: startPosition, end: endPosition }\n}\n\nfunction position(line: number, lineStart: number, offset: number) {\n return {\n line,\n character: offset - lineStart + 1,\n }\n}\n\nfunction pathContains(parent: string, child: string) {\n const relative = path.relative(path.resolve(parent), path.resolve(child))\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n}\n\nfunction parseJson(value: string) {\n try {\n return JSON.parse(value) as unknown\n } catch {\n return\n }\n}\n" | ||
| ], | ||
| "mappings": ";4DACA,qBAAS,iBAAY,kBAAa,cAAc,WAChD,mBAAS,QAAU,eAAI,oBACvB,kBACA,oBACA,gBAAS,sBCLT,mBAAS,mBCCT,mBAAS,WACT,mBAAS,oBACT,kBACA,oBAIA,IAAM,EAAqB,EAAO,OAAO,CACvC,UAAW,EAAO,OAClB,UAAW,EAAO,OAAO,EAAO,MAAM,EACtC,aAAc,EAAO,OACrB,gBAAiB,EAAO,OAAO,EAAO,MAAM,EAC5C,UAAW,EAAO,OAClB,YAAa,EAAO,OAAO,EAAO,MAAM,CAC1C,CAAC,EAEK,EAAwB,EAAO,OAAO,CAC1C,gBAAiB,EAAO,OAAO,EAAO,MAAM,EAC5C,cAAe,EAAO,OAAO,EAAO,MAAM,CAC5C,CAAC,EAEK,EAA0B,EAAO,OAAO,CAC5C,SAAU,EAAO,OAAO,EAAO,MAAM,CACvC,CAAC,EAEK,EAAqB,EAAO,oBAAoB,CAAkB,EAClE,EAAwB,EAAO,oBAAoB,CAAqB,EACxE,EAA0B,EAAO,oBAAoB,CAAuB,EAE5E,EAAO,IAAI,YAUjB,eAAsB,CAAmB,CAAC,EAAgB,EAAM,QAAQ,IAAI,EAAgC,CAC1G,IAAM,EAAS,EAAqB,EAAQ,CAAG,EAC/C,GAAI,EAAO,OAAS,MAAO,OAAO,EAElC,IAAM,EAAM,EAAO,IACnB,GAAI,CAAC,EAAI,YAAa,MAAO,CAAE,KAAM,OAAQ,EAE7C,IAAM,EAAa,EAAyB,EAAQ,CAAG,EACvD,GAAI,EAAW,OAAS,aAAc,OAAO,EAC7C,IAAM,EAAa,EAAW,WAC3B,QAAQ,CAAC,IAAc,CACtB,GAAI,EAAU,iBAAmB,MAAQ,EAAU,eAAiB,KAAM,MAAO,CAAC,EAClF,MAAO,CACL,CACE,MAAO,KAAK,IAAI,EAAU,gBAAiB,EAAU,aAAa,EAClE,IAAK,KAAK,IAAI,EAAU,gBAAiB,EAAU,aAAa,CAClE,CACF,EACD,EACA,KAAK,CAAC,EAAM,IAAU,EAAK,MAAQ,EAAM,OAAS,EAAK,IAAM,EAAM,GAAG,EACzE,GAAI,EAAW,SAAW,EAAG,MAAO,CAAE,KAAM,aAAc,EAE1D,IAAM,EAAW,EAAuB,EAAQ,CAAG,EAC7C,EACJ,EAAS,OAAS,YAAc,EAAS,UAAY,KACjD,EAAS,SACT,MAAM,EAAc,EAAI,YAAa,MAAM,EAAE,MAAM,IAAG,CAAG,OAAS,EACxE,GAAI,GAAQ,KAAM,MAAO,CAAE,KAAM,aAAc,EAE/C,IAAM,EAAS,EAAW,IAAI,CAAC,IAAU,CACvC,IAAM,EAAc,EAA4B,EAAM,EAAM,KAAK,EAC3D,EAAY,EAA4B,EAAM,EAAM,GAAG,EAC7D,MAAO,CACL,KAAM,EAAK,MAAM,EAAa,CAAS,EACvC,UAAW,EAAmB,EAAM,EAAa,CAAS,CAC5D,EACD,EAED,MAAO,CACL,KAAM,YACN,UAAW,CACT,SAAU,EAAI,YACd,OAAQ,MACR,QACF,CACF,EAGF,SAAS,CAAoB,CAAC,EAAgB,EAAa,CACzD,IAAI,EACJ,GAAI,CACF,EAAK,IAAI,EAAS,EAAQ,CAAE,SAAU,EAAK,CAAC,EAC5C,IAAM,EAAM,EACT,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAaF,EACC,IAAI,EAED,EAAO,EAAI,QAAQ,CAAC,IAAQ,CAChC,IAAM,EAAS,EAAmB,CAAG,EACrC,OAAO,EAAO,OAAO,CAAM,EAAI,CAAC,EAAO,KAAK,EAAI,CAAC,EAClD,EAED,GAAI,EAAI,OAAS,GAAK,EAAK,SAAW,EAAG,MAAO,CAAE,KAAM,aAAuB,EAE/E,IAAM,EAAM,EACT,IAAI,CAAC,KAAS,CAAE,MAAK,MAAO,EAAkB,EAAI,gBAAiB,CAAG,CAAE,EAAE,EAC1E,OAAO,CAAC,IAAU,EAAM,MAAQ,CAAC,EACjC,KAAK,CAAC,EAAM,IAAU,EAAM,MAAQ,EAAK,OAAS,EAAM,IAAI,UAAU,cAAc,EAAK,IAAI,SAAS,CAAC,EAAE,IAAI,IAChH,GAAI,CAAC,EAAK,MAAO,CAAE,KAAM,OAAiB,EAC1C,GAAI,EAAI,YAAc,SAAU,MAAO,CAAE,KAAM,aAAuB,EACtE,GAAI,CAAC,EAAqB,CAAG,EAAG,MAAO,CAAE,KAAM,OAAiB,EAChE,MAAO,CAAE,KAAM,MAAgB,KAAI,EACnC,KAAM,CACN,MAAO,CAAE,KAAM,aAAuB,SACtC,CACA,GAAI,MAAM,GAId,SAAS,CAAwB,CAAC,EAAgB,EAAyB,CACzE,IAAI,EACJ,GAAI,CACF,EAAK,IAAI,EAAS,EAAQ,CAAE,SAAU,EAAK,CAAC,EAC5C,IAAM,EAAM,EACT,MACC;AAAA;AAAA;AAAA;AAAA,oEAKF,EACC,IAAI,CAAE,UAAW,EAAI,UAAW,aAAc,EAAI,YAAa,CAAC,EAE7D,EAAa,EAAI,QAAQ,CAAC,IAAc,CAC5C,IAAM,EAAS,EAAsB,CAAS,EAC9C,OAAO,EAAO,OAAO,CAAM,EAAI,CAAC,EAAO,KAAK,EAAI,CAAC,EAClD,EAED,GAAI,EAAI,OAAS,GAAK,EAAW,SAAW,EAAG,MAAO,CAAE,KAAM,aAAuB,EACrF,MAAO,CAAE,KAAM,aAAuB,YAAW,EACjD,KAAM,CACN,MAAO,CAAE,KAAM,aAAuB,SACtC,CACA,GAAI,MAAM,GAId,SAAS,CAAsB,CAAC,EAAgB,EAAyB,CACvE,IAAI,EACJ,GAAI,CACF,EAAK,IAAI,EAAS,EAAQ,CAAE,SAAU,EAAK,CAAC,EAC5C,IAAM,EAAS,EACb,EACG,MACC;AAAA;AAAA,kEAGF,EACC,IAAI,CAAE,UAAW,EAAI,UAAW,aAAc,EAAI,YAAa,CAAC,CACrE,EACA,GAAI,EAAO,OAAO,CAAM,EAAG,MAAO,CAAE,KAAM,aAAuB,EACjE,MAAO,CAAE,KAAM,WAAqB,SAAU,EAAO,MAAM,QAAS,EACpE,KAAM,CACN,MAAO,CAAE,KAAM,aAAuB,SACtC,CACA,GAAI,MAAM,GAId,SAAS,CAAoB,CAAC,EAA8C,CAC1E,OAAO,EAAI,YAAc,UAAY,EAAI,WAAa,KAGjD,SAAS,CAAgB,EAAG,CAOjC,MANmB,CACjB,QAAQ,IAAI,gBACZ,EAAK,KAAK,EAAG,QAAQ,EAAG,UAAW,sBAAuB,MAAO,KAAM,WAAY,WAAW,EAC9F,EAAK,KAAK,EAAG,QAAQ,EAAG,SAAU,QAAS,MAAO,KAAM,WAAY,WAAW,CACjF,EAAE,OAAO,CAAC,IAAyB,QAAQ,CAAI,CAAC,EAE9B,KAAK,CAAC,IAAS,EAAO,CAAI,CAAC,EAO/C,SAAS,CAAM,CAAC,EAAc,CAC5B,GAAI,CACF,OAAO,EAAS,CAAI,EAAE,OAAO,EAC7B,KAAM,CACN,MAAO,IAIX,SAAS,CAAiB,CAAC,EAA+B,EAAa,CACrE,OAAO,EAAkB,CAAc,EAAE,OAAO,CAAC,EAAO,IAAS,CAC/D,GAAI,EAAa,EAAM,CAAG,EAAG,OAAO,KAAK,IAAI,EAAO,EAAK,QAAQ,CAAI,EAAE,MAAM,EAC7E,OAAO,GACN,CAAC,EAGN,SAAS,CAAiB,CAAC,EAAsB,CAC/C,GAAI,CAAC,EAAO,MAAO,CAAC,EACpB,IAAM,EAAS,EAAU,CAAK,EAC9B,GAAI,MAAM,QAAQ,CAAM,EAAG,OAAO,EAAO,OAAO,CAAC,IAAyB,OAAO,IAAS,QAAQ,EAClG,OAAO,EAAM,MAAM,OAAO,EAAE,OAAO,OAAO,EAQ5C,SAAS,CAA2B,CAAC,EAAc,EAAoB,CACrE,GAAI,GAAc,EAAG,MAAO,GAE5B,IAAI,EAAQ,EACZ,QAAS,EAAQ,EAAG,EAAQ,EAAK,QAAU,CACzC,IAAM,EAAY,EAAK,YAAY,CAAK,EACxC,GAAI,IAAc,OAAW,OAAO,EAAK,OAEzC,IAAM,EAAY,GAAS,EAAY,MAAS,EAAI,GAEpD,GADA,GAAS,EAAK,OAAO,EAAK,MAAM,EAAO,CAAS,CAAC,EAAE,OAC/C,GAAS,EAAY,OAAO,EAChC,EAAQ,EAGV,OAAO,EAAK,OAGd,SAAS,CAAkB,CAAC,EAAc,EAAqB,EAAmB,CAChF,IAAM,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,EAAa,EAAK,MAAM,CAAC,EACtD,EAAM,KAAK,IAAI,EAAG,KAAK,IAAI,EAAW,EAAK,MAAM,CAAC,EACpD,EAAO,EACP,EAAY,EACZ,EAAgB,EAAS,EAAM,EAAW,CAAK,EAC/C,EAAc,EAAS,EAAM,EAAW,CAAG,EAE/C,QAAS,EAAQ,EAAG,GAAS,EAAK,IAAS,CACzC,GAAI,IAAU,EAAO,EAAgB,EAAS,EAAM,EAAW,CAAK,EACpE,GAAI,IAAU,EAAK,CACjB,EAAc,EAAS,EAAM,EAAW,CAAK,EAC7C,MAEF,GAAI,EAAK,KAAW;AAAA,EAClB,GAAQ,EACR,EAAY,EAAQ,EAIxB,MAAO,CAAE,MAAO,EAAe,IAAK,CAAY,EAGlD,SAAS,CAAQ,CAAC,EAAc,EAAmB,EAAgB,CACjE,MAAO,CACL,OACA,UAAW,EAAS,EAAY,CAClC,EAGF,SAAS,CAAY,CAAC,EAAgB,EAAe,CACnD,IAAM,EAAW,EAAK,SAAS,EAAK,QAAQ,CAAM,EAAG,EAAK,QAAQ,CAAK,CAAC,EACxE,OAAO,IAAa,IAAO,CAAC,EAAS,WAAW,IAAI,GAAK,CAAC,EAAK,WAAW,CAAQ,EAGpF,SAAS,CAAS,CAAC,EAAe,CAChC,GAAI,CACF,OAAO,KAAK,MAAM,CAAK,EACvB,KAAM,CACN,QF9QJ,eAAsB,EAAU,CAAC,EAAoF,CACnH,IAAM,EAAS,QAAQ,IAAI,QAAU,QAAQ,IAAI,OACjD,GAAI,CAAC,EAAQ,OACb,IAAM,EAAO,EAAK,KAAK,EAAG,OAAO,EAAG,GAAG,KAAK,IAAI,MAAM,EACtD,MAAM,EAAU,EAAM,EAAM,KAAK,EACjC,EAAM,SAAS,QAAQ,EACvB,EAAM,SAAS,oBAAoB,MAAM,EACzC,GAAI,CAcF,OAbA,MAAM,IAAI,QAAc,CAAC,EAAS,IAAW,CAC3C,IAAM,EAAQ,EAAO,MAAM,GAAG,EACxB,EAAQ,EAAM,EAAM,GAAK,CAAC,GAAG,EAAM,MAAM,CAAC,EAAG,CAAI,EAAG,CACxD,IAAK,EAAM,KAAO,EAAW,EAAM,GAAG,EAAI,EAAM,IAAM,QAAQ,IAAI,EAClE,MAAO,CAAC,EAAM,OAAS,UAAW,UAAW,SAAS,EACtD,MAAO,EACT,CAAC,EACD,EAAM,GAAG,QAAS,CAAM,EACxB,EAAM,GAAG,OAAQ,CAAC,EAAM,IAAW,CACjC,GAAI,IAAS,EAAG,OAAO,EAAQ,EAC/B,EAAW,MAAM,sBAAsB,EAAS,UAAU,IAAW,QAAQ,KAAQ,CAAC,EACvF,EACF,EACO,MAAM,EAAS,EAAM,MAAM,GAAM,cACzC,CACA,MAAM,EAAG,EAAM,CAAE,MAAO,EAAK,CAAC,EAAE,MAAM,IAAM,EAAE,EAC9C,EAAM,SAAS,oBAAoB,MAAM,EACzC,EAAM,SAAS,OAAO,EACtB,EAAM,SAAS,cAAc,GAI1B,SAAS,CAAwB,CAAC,EAAmB,CAC1D,IAAM,EAAO,EAAK,KAAK,EAAG,QAAQ,EAAG,UAAW,KAAK,EAC/C,EAAW,CAAC,IAAmB,CACnC,IAAM,EAAW,EAAK,QAAQ,CAAM,EAC9B,EAAW,EAAK,SAAS,EAAU,EAAK,QAAQ,CAAS,CAAC,EAChE,OAAO,IAAa,IAAO,CAAC,EAAS,WAAW,IAAI,GAAK,CAAC,EAAK,WAAW,CAAQ,EAAK,EAAS,OAAS,GAE3G,GAAI,CACF,OAAO,EAAY,CAAI,EACpB,OAAO,CAAC,IAAU,EAAM,SAAS,OAAO,CAAC,EACzC,QAAQ,CAAC,IAAU,CAClB,IAAM,EAAO,EAAK,KAAK,EAAM,CAAK,EAC5B,EAAO,OAAO,SAAS,EAAK,SAAS,EAAM,OAAO,EAAG,EAAE,EAC7D,GAAI,CAAC,OAAO,UAAU,CAAI,GAAK,GAAQ,GAAK,EAAO,MAAO,MAAO,CAAC,EAClE,GAAI,CACF,IAAM,EAAQ,KAAK,MAAM,EAAa,EAAM,MAAM,CAAC,EACnD,GAAI,EAAM,YAAc,QAAa,EAAM,YAAc,KAAM,MAAO,CAAC,EACvE,IAAM,EAAU,MAAM,QAAQ,EAAM,gBAAgB,EAChD,EAAM,iBAAiB,OAAO,CAAC,IAAyB,OAAO,IAAS,QAAQ,EAChF,CAAC,EACC,EAAQ,KAAK,IAAI,EAAG,GAAG,EAAQ,IAAI,CAAQ,CAAC,EAClD,GAAI,CAAC,EAAO,MAAO,CAAC,EACpB,MAAO,CACL,CACE,IAAK,kBAAkB,IACvB,UAAW,OAAO,EAAM,YAAc,SAAW,EAAM,UAAY,OACnE,OAAQ,QAAQ,IAChB,QACA,MAAO,EAAS,CAAI,EAAE,OACxB,CACF,EACA,KAAM,CACN,MAAO,CAAC,GAEX,EACA,KAAK,CAAC,EAAM,IAAU,EAAM,MAAQ,EAAK,OAAS,EAAM,MAAQ,EAAK,KAAK,EAC1E,IAAI,EAAG,MAAK,YAAW,aAAc,CAAE,MAAK,YAAW,QAAO,EAAE,EAAE,GACrE,KAAM,CACN,QAIG,IAAM,GAAoB,CAC/B,WAAY,EACZ,UAAW,CAAC,IAAsB,EAAoB,EAAiB,GAAK,GAAI,CAAS,CAC3F", | ||
| "debugId": "5F69A5378570C45E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/catalog.shared.ts", "src/mini/runtime.stdin.ts"], | ||
| "sourcesContent": [ | ||
| "import type {\n AgentListOutput,\n CommandListOutput,\n ModelListOutput,\n OpenCodeClient,\n ProviderListOutput,\n SkillListOutput,\n} from \"@opencode-ai/client/promise\"\nimport type { RunAgent, RunCommand, RunProvider, RunReference } from \"./types\"\n\ntype CurrentAgent = AgentListOutput[\"data\"][number]\ntype CurrentCommand = CommandListOutput[\"data\"][number]\ntype CurrentSkill = SkillListOutput[\"data\"][number]\ntype CurrentProvider = ProviderListOutput[\"data\"][number]\ntype CurrentModel = ModelListOutput[\"data\"][number]\n\nfunction location(directory: string, workspace?: string) {\n return {\n location: {\n directory,\n workspace,\n },\n }\n}\n\nfunction defaultCost(model: CurrentModel) {\n const picked = model.cost.find((cost) => cost.tier === undefined) ?? model.cost[0]\n if (!picked) {\n return undefined\n }\n\n return {\n ...picked,\n input: model.cost.every((cost) => cost.input === 0) ? 0 : picked.input,\n }\n}\n\nexport function runAgent(input: CurrentAgent): RunAgent {\n return {\n id: input.id,\n name: input.name,\n description: input.description,\n mode: input.mode,\n hidden: input.hidden,\n }\n}\n\nexport function runCommand(input: CurrentCommand): RunCommand {\n return {\n name: input.name,\n description: input.description,\n }\n}\n\nexport function runSkill(input: CurrentSkill): RunCommand {\n return {\n name: input.id,\n description: input.description,\n source: \"skill\",\n }\n}\n\nexport function runProviders(providers: CurrentProvider[], models: CurrentModel[]): RunProvider[] {\n const grouped = new Map<string, RunProvider>()\n\n for (const provider of providers) {\n grouped.set(provider.id, {\n id: provider.id,\n name: provider.name,\n models: {},\n })\n }\n\n for (const model of models) {\n const provider = grouped.get(model.providerID) ?? {\n id: model.providerID,\n name: model.providerID,\n models: {},\n }\n provider.models[model.id] = {\n id: model.id,\n providerID: model.providerID,\n name: model.name,\n capabilities: model.capabilities,\n cost: defaultCost(model),\n limit: model.limit,\n status: model.status,\n variants: Object.fromEntries((model.variants ?? []).map((variant) => [variant.id, {}])),\n }\n grouped.set(provider.id, provider)\n }\n\n return [...grouped.values()]\n}\n\n// A location boots its plugins in a deferred background batch after the layer\n// is built, so first-turn model resolution can observe empty catalog state.\n// For explicit --model flows, wait for that exact ref to appear before prompt\n// admission. On timeout, return and let the real execution error surface.\nexport async function waitForCatalogReady(input: {\n sdk: OpenCodeClient\n directory: string\n workspace?: string\n model: { providerID: string; modelID: string }\n timeoutMs?: number\n}) {\n const deadline = Date.now() + (input.timeoutMs ?? 5_000)\n while (Date.now() < deadline) {\n const models = await input.sdk.model\n .list(location(input.directory, input.workspace))\n .then((result) => result.data)\n .catch(() => undefined)\n if (models?.some((model) => model.providerID === input.model.providerID && model.id === input.model.modelID)) return\n await new Promise((resolve) => setTimeout(resolve, 25))\n }\n}\n\nexport async function waitForDefaultModel(input: {\n sdk: OpenCodeClient\n directory: string\n timeoutMs?: number\n active?: () => boolean\n}): Promise<{ providerID: string; modelID: string } | undefined> {\n const deadline = Date.now() + (input.timeoutMs ?? 5_000)\n while (Date.now() < deadline && (input.active?.() ?? true)) {\n const model = await input.sdk.model\n .default(location(input.directory))\n .then((result) => result.data)\n .catch(() => undefined)\n if (model) return { providerID: model.providerID, modelID: model.id }\n await new Promise((resolve) => setTimeout(resolve, 25))\n }\n}\n\nexport async function loadRunAgents(sdk: OpenCodeClient, directory: string): Promise<RunAgent[]> {\n const result = await sdk.agent.list(location(directory))\n return result.data.map(runAgent)\n}\n\nexport async function loadRunCommands(sdk: OpenCodeClient, directory: string): Promise<RunCommand[]> {\n const [commands, skills] = await Promise.all([\n sdk.command.list(location(directory)),\n sdk.skill.list(location(directory)),\n ])\n return [...commands.data.map(runCommand), ...skills.data.filter((skill) => skill.slash !== false).map(runSkill)]\n}\n\nexport async function loadRunReferences(sdk: OpenCodeClient, directory: string): Promise<RunReference[]> {\n const result = await sdk.reference.list(location(directory))\n return result.data.filter((reference) => !reference.hidden)\n}\n\nexport async function loadRunProviders(sdk: OpenCodeClient, directory: string): Promise<RunProvider[]> {\n const [providers, models] = await Promise.all([\n sdk.provider.list(location(directory)),\n sdk.model.list(location(directory)),\n ])\n return runProviders([...providers.data], [...models.data])\n}\n", | ||
| "import fs from \"fs\"\nimport * as tty from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\ntype InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup?: () => void\n}\n\nfunction openTerminalStdin(path: string): NodeJS.ReadStream {\n return new tty.ReadStream(fs.openSync(path, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (path: string) => NodeJS.ReadStream = openTerminalStdin,\n platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) {\n return { stdin }\n }\n\n const file = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n\n try {\n const stream = open(file)\n return {\n stdin: stream,\n cleanup: () => {\n stream.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "72C672A43298FD3664756E2164756E21", | ||
| "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 options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";sgCAAA,mBAAS,gBAQT,SAAe,SAAQ,aACrB,OAAS,cAAS,WAAM,cAAS,YACjC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,SAAM,OAAU,WAAO,OAAc,aAAQ,OAEvC,QADQ,WAAO,OAAQ,cAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "2E0B6318AD5EA22464756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/migrate.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\n\nexport default Runtime.handler(Commands.commands.migrate, (_input) => Effect.log(\"No migrations to run.\"))\n" | ||
| ], | ||
| "mappings": ";u1BAIA,SAAe,SAAQ,aAAQ,OAAS,cAAS,aAAS,MAAC,SAAW,OAAO,SAAI,4BAAuB,MAAC", | ||
| "debugId": "8BD1BF23B2FA27B664756E2164756E21", | ||
| "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": ";u9BAAA,mBAAS,gBAOT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,WACnC,OAAO,QAAG,wBAAmB,OAAE,cAAU,OAAG,MAC1C,SAAM,OAAY,WAAO,OAAQ,YAAO,WAAO,OAAc,aAAQ,MAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "861C62B6A952B1E164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write((yield* ServiceConfig.get(Option.getOrUndefined(input.key))) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";k9BAAA,mBAAS,gBAMT,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,SACnC,OAAO,QAAG,sBAAiB,OAAE,cAAU,MAAC,OAAO,MAC7C,aAAQ,YAAO,YAAO,WAAO,OAAc,SAAI,OAAO,oBAAe,EAAM,GAAG,CAAC,GAAK,CAAG,EACxF,CACH", | ||
| "debugId": "DF0AE7714548916264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";ojCAAA,mBAAS,gBAST,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,YAC/B,OAAO,QAAG,qBAAgB,OAAE,cAAU,MAAC,OAAO,MAC5C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "A73F6E98CBFA4A5164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts", "src/util/process.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/core/global\"\nimport { InstallationChannel, InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Hash } from \"@opencode-ai/core/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = InstallationChannel) {\n if (channel === \"latest\") return \"service.json\"\n if (channel === \"local\") return \"service-local.json\"\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = InstallationChannel,\n installedVersion = InstallationVersion,\n) {\n if (channel === \"latest\" || channel === \"local\") return\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyFile: path.join(global.state, \"service.json\"),\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* () {\n const { file, legacyFile } = yield* paths\n yield* migrateRegistration(legacyFile, file)\n return {\n file,\n version: InstallationVersion,\n command: [...selfCommand(), \"serve\", \"--service\"],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile } = yield* paths\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.catch(() => Effect.succeed({} as Info)),\n )\n})\n\nconst write = Effect.fn(\"cli.service-config.write\")(function* (value: Info) {\n const { fs, configFile } = yield* paths\n const temp = configFile + \".tmp\"\n yield* fs.makeDirectory(path.dirname(configFile), { recursive: true })\n yield* fs.writeFileString(temp, JSON.stringify(value, null, 2) + \"\\n\", { mode: 0o600 })\n yield* fs.rename(temp, configFile)\n})\n\nexport const password = Effect.fn(\"cli.service-config.password\")(function* (value?: string) {\n const existing = yield* read()\n if (value === undefined && existing.password) return existing.password\n const next = value ?? randomBytes(32).toString(\"base64url\")\n\n // Keep one private credential across server restarts so discovered clients\n // can reconnect without exposing a password flag or environment variable.\n yield* write({ ...existing, password: next })\n return next\n})\n\nexport const get = Effect.fn(\"cli.service-config.get\")(function* (key?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n switch (configKey(key)) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string) {\n switch (configKey(key)) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n", | ||
| "import path from \"node:path\"\n\nexport function selfCommand() {\n const runtime = path.basename(process.execPath, path.extname(process.execPath)).toLowerCase()\n if (runtime !== \"bun\" && runtime !== \"node\" && runtime !== \"nodejs\") return [process.execPath]\n if (!process.argv[1]) throw new Error(\"Failed to resolve CLI entrypoint\")\n if (runtime === \"node\" || runtime === \"nodejs\") return [process.execPath, ...nodeFlags(), process.argv[1]]\n return [process.execPath, process.argv[1]]\n}\n\nfunction nodeFlags() {\n return process.execArgv.flatMap((arg, index, args) => {\n if (index > 0 && args[index - 1] === \"--conditions\") return []\n if (arg === \"--conditions\") return args[index + 1] ? [arg, args[index + 1]] : []\n if (arg.startsWith(\"--conditions=\")) return [arg]\n if (\n arg === \"--experimental-ffi\" ||\n arg === \"--use-system-ca\" ||\n arg === \"--enable-source-maps\" ||\n arg === \"--no-addons\"\n )\n return [arg]\n if (arg === \"--no-warnings\" || arg.startsWith(\"--disable-warning=\")) return [arg]\n return []\n })\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "BFC2BE865220A2E764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/runtime.queue.ts"], | ||
| "sourcesContent": [ | ||
| "// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and queue up\n// here. The queue drains one turn at a time; ordinary prompts waiting behind\n// an active ordinary turn are exposed for edit/removal until they begin.\n//\n// The queue also handles /exit, /quit, and /new commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { ascending } from \"@opencode-ai/schema/identifier\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport { isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, FooterQueuedPrompt, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\ntype Deferred<T = void> = {\n promise: Promise<T>\n resolve: (value: T | PromiseLike<T>) => void\n reject: (error?: unknown) => void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt) => void\n onNewSession?: () => void | Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n queued: FooterQueuedPrompt[]\n active?: RunPrompt\n ctrl?: AbortController\n closed: boolean\n}\n\nfunction defer<T = void>(): Deferred<T> {\n let resolve!: (value: T | PromiseLike<T>) => void\n let reject!: (error?: unknown) => void\n const promise = new Promise<T>((next, fail) => {\n resolve = next\n reject = fail\n })\n\n return { promise, resolve, reject }\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn remain local and\n// are exposed by the footer for edit/removal until their turn begins.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = defer<{ type: \"closed\" }>()\n const done = defer()\n const state: State = {\n queue: [],\n queued: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const syncQueue = () => {\n const queue = state.queue.length\n emit({ type: \"queue\", queue }, { queue })\n emit(\n {\n type: \"queued.prompts\",\n prompts: [...state.queued],\n },\n { queued: state.queued.length },\n )\n }\n\n const removeLocalQueued = (queued: FooterQueuedPrompt) => {\n if (!state.queued.includes(queued)) return\n state.queued = state.queued.filter((item) => item !== queued)\n syncQueue()\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n state.queued.length = 0\n state.ctrl?.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()\n if (!prompt) {\n continue\n }\n\n const queued = state.queued.find((item) => item.prompt === prompt)\n if (queued) removeLocalQueued(queued)\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n syncQueue()\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n queue: state.queue.length,\n },\n )\n await input.onNewSession()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? queued?.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n {\n type: \"turn.send\",\n queue: state.queue.length,\n },\n {\n phase: \"running\",\n status: \"sending prompt\",\n queue: state.queue.length,\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n state.ctrl = ctrl\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent)\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n ctrl.abort()\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n } finally {\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n {\n type: \"turn.idle\",\n queue: state.queue.length,\n },\n {\n phase: \"idle\",\n status: \"\",\n queue: state.queue.length,\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n !active.command &&\n prompt.mode !== \"shell\" &&\n !prompt.command &&\n !isNewCommand(prompt.text)\n ) {\n const queued: FooterQueuedPrompt = {\n messageID: SessionMessage.ID.create(),\n partID: \"prt_\" + ascending(),\n prompt,\n }\n state.queued = [...state.queued, queued]\n state.queue.push(prompt)\n syncQueue()\n return\n }\n\n state.queue.push(prompt)\n syncQueue()\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n const offRemoveQueued = input.footer.onQueuedRemove((messageID) => {\n const queued = state.queued.find((item) => item.messageID === messageID)\n if (!queued) return false\n state.queue = state.queue.filter((prompt) => prompt !== queued.prompt)\n removeLocalQueued(queued)\n return true\n })\n\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n offRemoveQueued()\n close()\n await draining?.catch(() => {})\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E002F49F466B002064756E2164756E21", | ||
| "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/core/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? Global.Path.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\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": ";i4BAAA,mBAAS,gBACT,yBACA,wBAAS,eAAU,oBAAM,yBAOzB,SAAe,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,SAC/B,OAAO,QAAG,kBAAa,OAAE,cAAU,MAAC,OAAO,MACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,KAAK,OAAS,QAAQ,IAAI,CAAC,CAAC,EACnH,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,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": "509A4EC26D98475564756E2164756E21", | ||
| "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/core/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() => timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(exit.cause))).pipe(\n Effect.ignore,\n )\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.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 inputs: server ? { server } : {},\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\nfunction errorMessage(cause: Cause.Cause<unknown>) {\n const error = Cause.squash(cause)\n if (error instanceof Error) return error.message\n if (typeof error === \"object\" && error !== null && \"message\" in error && typeof error.message === \"string\") {\n return error.message\n }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F66A578E31796CBA64756E2164756E21", | ||
| "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": ";u9BAMA,SAAe,SAAQ,aACrB,OAAS,cAAS,aAAQ,cAAS,UACnC,OAAO,QAAG,uBAAkB,OAAE,cAAU,OAAG,MACzC,WAAO,OAAQ,UAAK,WAAO,OAAc,aAAQ,MAAC,OACnD,MACH", | ||
| "debugId": "58B8C4AFD2D8AA9D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/util/io.ts", "src/mini/mini.ts", "src/mini/run.ts", "src/mini/noninteractive.ts", "src/mini/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { text } from \"node:stream/consumers\"\n\nexport function readStdin() {\n return text(process.stdin)\n}\n", | ||
| "import { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { waitForCatalogReady } from \"./catalog.shared\"\nimport { INTERACTIVE_INPUT_ERROR, resolveInteractiveStdin } from \"./runtime.stdin\"\nimport type { RunInput, RunTuiConfig } from \"./types\"\nimport { readStdin } from \"../util/io\"\nimport { setTimeout } from \"node:timers/promises\"\n\nexport type MiniCommandInput = {\n server: ServerConnection.Resolved\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: RunTuiConfig | Promise<RunTuiConfig>\n}\n\ntype Session = Awaited<ReturnType<OpenCodeClient[\"session\"][\"get\"]>>\nexport async function runMini(input: MiniCommandInput) {\n validate(input)\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const runtimeTask = import(\"./runtime\")\n const directory = localDirectory()\n\n try {\n const sdk = OpenCode.make({\n baseUrl: input.server.endpoint.url,\n headers: Service.headers(input.server.endpoint),\n })\n const model = parseModel(input.model)\n let agentTask: Promise<string | undefined> | undefined\n const resolveAgent = () => {\n agentTask ??= validateAgent(sdk, directory, input.agent)\n return agentTask\n }\n const resolveSession = async () => {\n const [agent, selected] = await Promise.all([resolveAgent(), selectSession(sdk, directory, input)])\n const readyModel =\n model ?? (selected?.model ? { providerID: selected.model.providerID, modelID: selected.model.id } : undefined)\n if (readyModel) await waitForCatalogReady({ sdk, directory, model: readyModel })\n const session = selected ?? (await createSession(sdk, directory, agent, model))\n return { id: session.id, title: session.title, resume: selected !== undefined }\n }\n const create = (\n _sdk: OpenCodeClient,\n next: { agent: string | undefined; model: RunInput[\"model\"]; variant: string | undefined },\n ) => createSession(sdk, directory, next.agent, next.model, next.variant)\n const runtime = await runtimeTask\n await runtime.runInteractiveDeferredMode({\n sdk,\n directory,\n resolveAgent,\n session: resolveSession,\n createSession: create,\n agent: input.agent,\n model,\n variant: undefined,\n files: [],\n initialInput,\n thinking: true,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n })\n } catch (error) {\n if (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR) fail(error.message)\n throw error\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n resolveInteractiveStdin().cleanup?.()\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string): RunInput[\"model\"] {\n if (!value) return\n const [providerID, ...rest] = value.split(\"/\")\n const modelID = rest.join(\"/\")\n if (!providerID || !modelID) fail(\"--model must use the format provider/model\")\n return { providerID, modelID }\n}\n\nasync function validateAgent(sdk: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const deadline = Date.now() + 5_000\n let agents: Awaited<ReturnType<OpenCodeClient[\"agent\"][\"list\"]>> | undefined\n while (Date.now() < deadline) {\n agents = await sdk.agent.list({ location: { directory } }).catch(() => undefined)\n const agent = agents?.data.find((item) => item.id === name)\n if (agent?.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n if (agent) return name\n await setTimeout(25)\n }\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n}\n\nasync function selectSession(sdk: OpenCodeClient, directory: string, input: MiniCommandInput, preselected?: Session) {\n const selected =\n preselected ??\n (input.session\n ? await sdk.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await sdk.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined)\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected) return\n if (!input.fork) return selected\n return sdk.session.fork({ sessionID: selected.id })\n}\n\nasync function createSession(\n sdk: OpenCodeClient,\n directory: string,\n agent: string | undefined,\n model: RunInput[\"model\"],\n variant?: string,\n): Promise<Session> {\n if (model) await waitForCatalogReady({ sdk, directory, model })\n return sdk.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory },\n })\n}\n\nfunction warning(message: string) {\n process.stderr.write(`\\x1b[93m\\x1b[1m!\\x1b[0m ${message}\\n`)\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { Model } from \"@opencode-ai/schema/model\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { loadRunAgents, waitForCatalogReady } from \"./catalog.shared\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { toolInlineInfo } from \"./tool\"\nimport type { MiniToolPart } from \"./types\"\nimport { UI } from \"./ui\"\n\nexport type RunCommandInput = {\n server: 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\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return run(input).catch((error) => reportError(input, error instanceof Error ? error.message : String(error)))\n}\n\nasync function run(input: RunCommandInput) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = process.env.PWD ?? process.cwd()\n const directory = localDirectory(root)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint) {\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const requestedDirectory = prepared.directory ?? (await client.location.get()).directory\n if (!requestedDirectory) fail(\"Failed to resolve server directory\")\n const session = await selectSession(client, requestedDirectory, input)\n const cwd = session?.location.directory ?? requestedDirectory\n const workspace = session?.location.workspaceID\n const explicit = parseRunModel(input.model)\n const explicitModel = explicit?.model\n const variant = explicit?.variant\n const sessionModel = session?.model ? { providerID: session.model.providerID, modelID: session.model.id } : undefined\n const defaultModel =\n !explicitModel && !sessionModel\n ? await client.model\n .default({ location: { directory: cwd, workspace } })\n .then((result) => (result.data ? { providerID: result.data.providerID, modelID: result.data.id } : undefined))\n : undefined\n const model = pickRunModel(explicitModel, variant, sessionModel, defaultModel)\n if (variant && !model) return reportError(input, \"Cannot select a variant before selecting a model\", session?.id)\n if (model) {\n await waitForCatalogReady({ sdk: client, directory: cwd, workspace, model })\n const available = await client.model.list({ location: { directory: cwd, workspace } })\n if (!available.data.some((item) => item.providerID === model.providerID && item.id === model.modelID))\n return reportError(input, `Model unavailable: ${model.providerID}/${model.modelID}`, session?.id)\n }\n const agent = await validateAgent(client, cwd, input.agent)\n const selected =\n session ??\n (await client.session.create({\n agent,\n model: model ? { providerID: model.providerID, id: model.modelID, variant } : undefined,\n location: { directory: cwd },\n }))\n if (!session && input.title !== undefined) {\n await client.session.rename({\n sessionID: selected.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: selected.id,\n message: prepared.message,\n files: prepared.files,\n agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: true,\n renderTool,\n renderToolError,\n }).catch((error) => reportError(input, error instanceof Error ? error.message : String(error), selected.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nexport function pickRunModel(\n explicit: { providerID: string; modelID: string } | undefined,\n variant: string | undefined,\n session: { providerID: string; modelID: string } | undefined,\n fallback: { providerID: string; modelID: string } | undefined,\n) {\n if (explicit) return explicit\n if (!variant) return\n return session ?? fallback\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n if (!value) return\n const ref = Model.Ref.parse(value)\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function validateAgent(client: OpenCodeClient, directory: string, name?: string) {\n if (!name) return\n const agents = await loadRunAgents(client, directory).catch(() => undefined)\n if (!agents) {\n warning(\"failed to list agents. Falling back to default agent\")\n return\n }\n const agent = agents.find((item) => item.id === name)\n if (!agent) {\n warning(`agent \"${name}\" not found. Falling back to default agent`)\n return\n }\n if (agent.mode === \"subagent\") {\n warning(`agent \"${name}\" is a subagent, not a primary agent. Falling back to default agent`)\n return\n }\n return name\n}\n\nasync function selectSession(client: OpenCodeClient, directory: string, input: RunCommandInput) {\n const selected = input.session\n ? await client.session.get({ sessionID: input.session }).catch(() => undefined)\n : input.continue\n ? await client.session\n .list({ directory, parentID: null, limit: 1, order: \"desc\" })\n .then((result) => result.data[0])\n : undefined\n if (input.session && !selected) fail(\"Session not found\")\n if (!selected || !input.fork) return selected\n return client.session.fork({ sessionID: selected.id })\n}\n\nasync function prepareFile(input: string, directory: string): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: MiniToolPart) {\n const info = toolInlineInfo(part)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: MiniToolPart) {\n const info = toolInlineInfo(part)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction warning(message: string) {\n UI.println(UI.Style.TEXT_WARNING_BOLD + \"!\", UI.Style.TEXT_NORMAL, message)\n}\n\nfunction reportError(input: RunCommandInput, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type { EventSubscribeOutput, OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { UI } from \"./ui\"\nimport type { MiniToolPart } from \"./types\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n renderTool: (part: MiniToolPart) => Promise<void>\n renderToolError: (part: MiniToolPart) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, unknown>\n raw?: string\n provider?: unknown\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let questionRejected = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let admission: AbortController | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const rejectQuestion = async (request: { id: string }) => {\n questionRejected = true\n await input.client.question.reject({ sessionID: input.sessionID, requestID: request.id }).catch(() => {})\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n formCancelled = true\n await input.client.form.cancel({ sessionID: request.sessionID, formID: request.id }).catch(() => {})\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (event.type === \"question.v2.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await rejectQuestion(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached && event.data.form.sessionID === GLOBAL_FORM_SESSION_ID))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.input.promoted\") {\n if (event.data.inputID === messageID) {\n promoted = true\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || questionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n starts.set(\"text\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const started = starts.get(\"text\")\n starts.delete(\"text\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n starts.set(\"reasoning\", { id: partID(event.id), timestamp: time })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const started = starts.get(\"reasoning\")\n starts.delete(\"reasoning\")\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n if (emit(\"reasoning\", time, { part })) continue\n const text = part.text.trim()\n if (!text) continue\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) {\n process.stdout.write(line + EOL)\n continue\n }\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n tools.set(event.data.callID, {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(event.data.callID)\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.called\") {\n const current = tools.get(event.data.callID)\n tools.set(event.data.callID, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n })\n continue\n }\n if (event.type === \"session.tool.success\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: event.data.content\n .filter((item) => item.type === \"text\")\n .map((item) => item.text)\n .join(\"\\n\"),\n title: current.tool,\n metadata: {\n structured: event.data.structured,\n content: event.data.content,\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(part)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const current = tools.get(event.data.callID) ?? fallbackTool(event)\n const error = event.data.error.message\n const part: MiniToolPart = {\n id: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n callID: event.data.callID,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n result: event.data.result,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(event.data.callID)\n if (!emit(\"tool_use\", time, { part })) {\n await input.renderToolError(part)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (interrupted || permissionRejected || questionRejected || formCancelled) continue\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (!emittedError && !questionRejected && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, questions, forms] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.question.list({ sessionID: input.sessionID }).catch(() => undefined),\n Promise.all(\n (input.attached ? [input.sessionID] : [input.sessionID, GLOBAL_FORM_SESSION_ID]).map((sessionID) =>\n input.client.form.list({ sessionID }).catch(() => undefined),\n ),\n ),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(questions ?? []).map(rejectQuestion),\n ...forms.flatMap((response) => response ?? []).map(cancelForm),\n ])\n await completed\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n await stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; callID: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, mime: file.mime, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await 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": "5A1A8EEE2C6D3F8864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover(options)\n const endpoint = found ?? (yield* Service.ensure(options))\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, inputs: {}, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, 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": ";ojCAAA,mBAAS,gBAcT,SAAM,OAAW,MAAE,eAAW,aAAQ,SAAI,MAAE,OAE7B,SAAQ,aACrB,OAAS,cAAS,SAAI,cAAS,UAC/B,OAAO,QAAG,mBAAc,OAAE,cAAU,MAAC,OAAO,MAC1C,SAAM,OAAU,WAAO,EAAc,QAAQ,EAEvC,GADQ,MAAO,EAAQ,SAAS,CAAO,KAClB,MAAO,EAAQ,OAAO,CAAO,GAClD,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,OAAQ,CAAC,EAAG,UAAS,CAAC,CAC/G,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,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": "E271E616D5AE1A2C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/standalone.ts", "src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { CrossSpawnSpawner } from \"@opencode-ai/core/cross-spawn-spawner\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Deferred, Effect, Schema, Stream } from \"effect\"\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\"\nimport { randomBytes } from \"node:crypto\"\nimport { selfCommand } from \"../util/process\"\n\nconst Ready = Schema.Struct({ url: Schema.String })\nconst decodeReady = Schema.decodeUnknownPromise(Schema.fromJsonString(Ready))\n\ntype Options = {\n readonly command?: ReadonlyArray<string>\n}\n\nfunction command(password: string, options: Options) {\n const [executable, ...args] = options.command ?? [...selfCommand(), \"serve\"]\n if (!executable) throw new Error(\"Failed to resolve standalone server command\")\n return ChildProcess.make(executable, [...args, \"--stdio\", \"--port\", \"0\"], {\n cwd: process.cwd(),\n // Explicit entry wins over anything inherited, so a user-exported\n // OPENCODE_PASSWORD cannot shadow the child's lease credential.\n env: { OPENCODE_PASSWORD: password },\n extendEnv: true,\n // The server treats EOF on this pipe as the end of its ownership lease.\n // The OS closes it even when the TUI is killed before Effect finalizers run.\n stdin: \"pipe\",\n stderr: \"ignore\",\n killSignal: \"SIGTERM\",\n forceKillAfter: \"3 seconds\",\n })\n}\n\nconst makeEndpoint = Effect.fn(\"cli.standalone.endpoint\")(\n function* (options: Options) {\n const password = randomBytes(32).toString(\"base64url\")\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner\n const proc = yield* spawner.spawn(command(password, options))\n const readyLine = yield* Deferred.make<string, Error>()\n // Keep draining stdout after readiness so later server writes cannot hit EPIPE.\n yield* proc.stdout.pipe(\n Stream.decodeText(),\n Stream.splitLines,\n Stream.runForEach((line) => Deferred.succeed(readyLine, line)),\n Effect.ensuring(Deferred.fail(readyLine, new Error(\"Standalone server exited before reporting readiness\"))),\n Effect.forkScoped,\n )\n const output = yield* Deferred.await(readyLine)\n const ready = yield* Effect.tryPromise(() => decodeReady(output))\n return {\n url: ready.url,\n auth: { type: \"basic\" as const, username: \"opencode\", password },\n pid: proc.pid,\n } satisfies Endpoint & { readonly pid: number }\n },\n Effect.provide(AppNodeBuilder.build(CrossSpawnSpawner.node)),\n)\n\nexport function start(options: Options = {}) {\n return makeEndpoint(options)\n}\n\nexport * as Standalone from \"./standalone\"\n", | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { InstallationVersion } from \"@opencode-ai/core/installation/version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: 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 !== InstallationVersion)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${InstallationVersion}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const options = yield* ServiceConfig.options()\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, args.mismatch ?? \"replace\"),\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(options)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (\n options: EnsureOptions,\n mismatch: NonNullable<Args[\"mismatch\"]>,\n) {\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": "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", | ||
| "debugId": "EEB571FAF2C1C7F864756E2164756E21", | ||
| "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": "253B9B427299143064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/variant.shared.ts", "src/mini/session.shared.ts", "src/mini/theme.ts"], | ||
| "sourcesContent": [ | ||
| "// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > saved preference > session history.\n//\n// The saved variant persists across sessions in ~/.local/state/opencode/model.json\n// so your last-used variant sticks. Cycling (ctrl+t) updates both the active\n// variant and the persisted file.\nimport path from \"path\"\nimport { FSUtil } from \"@opencode-ai/core/fs-util\"\nimport { AppNodeBuilder } from \"@opencode-ai/core/effect/app-node-builder\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { LayerNode } from \"@opencode-ai/core/effect/layer-node\"\nimport { makeGlobalNode } from \"@opencode-ai/core/effect/app-node\"\nimport { makeRuntime } from \"@opencode-ai/core/effect/runtime\"\nimport { Global } from \"@opencode-ai/core/global\"\nimport { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\n\nconst MODEL_FILE = path.join(Global.Path.state, \"model.json\")\n\ntype ModelState = Record<string, unknown> & {\n variant?: Record<string, string | undefined>\n}\ntype VariantService = {\n readonly resolveSavedVariant: (model: RunInput[\"model\"]) => Effect.Effect<string | undefined>\n readonly saveVariant: (model: RunInput[\"model\"], variant: string | undefined) => Effect.Effect<void>\n}\ntype VariantRuntime = {\n resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined>\n saveVariant(model: RunInput[\"model\"], variant: string | undefined): Promise<void>\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n\nclass Service extends Context.Service<Service, VariantService>()(\"@opencode/RunVariant\") {}\n\nfunction modelKey(provider: string, model: string): string {\n return `${provider}/${model}`\n}\n\nfunction variantKey(model: NonNullable<RunInput[\"model\"]>): string {\n return modelKey(model.providerID, model.modelID)\n}\n\nexport function modelInfo(providers: RunProvider[] | undefined, model: NonNullable<RunInput[\"model\"]>) {\n const provider = providers?.find((item) => item.id === model.providerID)\n return {\n provider: provider?.name ?? model.providerID,\n model: provider?.models[model.modelID]?.name ?? model.modelID,\n }\n}\n\nexport function formatModelLabel(\n model: NonNullable<RunInput[\"model\"]>,\n variant: string | undefined,\n providers?: RunProvider[],\n): string {\n const names = modelInfo(providers, model)\n const label = variant ? ` · ${variant}` : \"\"\n return `${names.model} · ${names.provider}${label}`\n}\n\nexport function cycleVariant(current: string | undefined, variants: string[]): string | undefined {\n if (variants.length === 0) {\n return undefined\n }\n\n if (!current) {\n return variants[0]\n }\n\n const idx = variants.indexOf(current)\n if (idx === -1 || idx === variants.length - 1) {\n return undefined\n }\n\n return variants[idx + 1]\n}\n\nexport function pickVariant(model: RunInput[\"model\"], input: RunSession | SessionMessages): string | undefined {\n return sessionVariant(Array.isArray(input) ? createSession(input) : input, model)\n}\n\nfunction fitVariant(value: string | undefined, variants: string[]): string | undefined {\n if (!value) {\n return undefined\n }\n\n if (variants.length === 0 || variants.includes(value)) {\n return value\n }\n\n return undefined\n}\n\n// Picks the active variant. CLI flag wins, then saved preference, then session\n// history. fitVariant() checks saved and session values against the available\n// variants list -- if the provider doesn't offer a variant, it drops.\nexport function resolveVariant(\n input: string | undefined,\n session: string | undefined,\n saved: string | undefined,\n variants: string[],\n): string | undefined {\n if (input !== undefined) {\n return input\n }\n\n const fallback = fitVariant(saved, variants)\n const current = fitVariant(session, variants)\n if (current !== undefined) {\n return current\n }\n\n return fallback\n}\n\nfunction state(value: unknown): ModelState {\n if (!isRecord(value)) {\n return {}\n }\n\n const variant = isRecord(value.variant)\n ? Object.fromEntries(\n Object.entries(value.variant).flatMap(([key, item]) => {\n if (typeof item !== \"string\") {\n return []\n }\n\n return [[key, item] as const]\n }),\n )\n : undefined\n\n return {\n ...value,\n variant,\n }\n}\n\nconst layer = Layer.fresh(\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const file = yield* FSUtil.Service\n\n const read = Effect.fn(\"RunVariant.read\")(function* () {\n return yield* file.readJson(MODEL_FILE).pipe(\n Effect.map(state),\n Effect.catchCause(() => Effect.succeed(state(undefined))),\n )\n })\n\n const resolveSavedVariant = Effect.fn(\"RunVariant.resolveSavedVariant\")(function* (model: RunInput[\"model\"]) {\n if (!model) {\n return undefined\n }\n\n return (yield* read()).variant?.[variantKey(model)]\n })\n\n const saveVariant = Effect.fn(\"RunVariant.saveVariant\")(function* (\n model: RunInput[\"model\"],\n variant: string | undefined,\n ) {\n if (!model) {\n return\n }\n\n const current = yield* read()\n const next = {\n ...current.variant,\n }\n const key = variantKey(model)\n if (variant) {\n next[key] = variant\n }\n\n if (!variant) {\n delete next[key]\n }\n\n yield* file\n .writeJson(MODEL_FILE, {\n ...current,\n variant: next,\n })\n .pipe(Effect.orElseSucceed(() => undefined))\n })\n\n return Service.of({\n resolveSavedVariant,\n saveVariant,\n })\n }),\n ),\n)\n\nconst node = makeGlobalNode({ service: Service, layer, deps: [FSUtil.node] })\n\n/** @internal Exported for testing. */\nexport function createVariantRuntime(replacements?: readonly LayerNode.Replacement[]): VariantRuntime {\n const runtime = makeRuntime(Service, AppNodeBuilder.build(node, replacements))\n return {\n resolveSavedVariant: (model) => runtime.runPromise((svc) => svc.resolveSavedVariant(model)).catch(() => undefined),\n saveVariant: (model, variant) => runtime.runPromise((svc) => svc.saveVariant(model, variant)).catch(() => {}),\n }\n}\n\nconst runtime = createVariantRuntime()\n\nexport async function resolveSavedVariant(model: RunInput[\"model\"]): Promise<string | undefined> {\n return runtime.resolveSavedVariant(model)\n}\n\nexport function saveVariant(model: RunInput[\"model\"], variant: string | undefined): void {\n void runtime.saveVariant(model, variant)\n}\n", | ||
| "import type { SessionMessageInfo, SessionMessageUser } from \"@opencode-ai/client/promise\"\nimport { promptCopy, promptSame } from \"./prompt.shared\"\nimport type { RunInput, RunPrompt } from \"./types\"\n\nconst LIMIT = 200\n\nexport type SessionMessages = SessionMessageInfo[]\n\ntype Turn = {\n prompt: RunPrompt\n provider: string | undefined\n model: string | undefined\n variant: string | undefined\n}\n\nexport type RunSession = {\n first: boolean\n turns: Turn[]\n model?: NonNullable<RunInput[\"model\"]>\n variant?: string\n}\n\nfunction messagePrompt(message: SessionMessageUser): RunPrompt {\n return {\n text: message.text,\n parts: [\n ...(message.files ?? []).map((file) => ({\n type: \"file\" as const,\n url: file.source.type === \"uri\" ? file.source.uri : `data:${file.mime};base64,${file.data}`,\n mime: file.mime,\n filename: file.name,\n source: file.mention\n ? {\n type: \"file\",\n path: file.name ?? (file.source.type === \"uri\" ? file.source.uri : \"inline attachment\"),\n text: { start: file.mention.start, end: file.mention.end, value: file.mention.text },\n }\n : undefined,\n })),\n ...(message.agents ?? []).map((agent) => ({\n type: \"agent\" as const,\n name: agent.name,\n source: agent.mention\n ? { start: agent.mention.start, end: agent.mention.end, value: agent.mention.text }\n : undefined,\n })),\n ],\n }\n}\n\nexport function createSession(messages: SessionMessages): RunSession {\n return {\n first: messages.length === 0,\n turns: messages.flatMap((message) =>\n message.type === \"user\"\n ? [{ prompt: messagePrompt(message), provider: undefined, model: undefined, variant: undefined }]\n : [],\n ),\n }\n}\n\nexport async function resolveCurrentSession(\n sdk: RunInput[\"sdk\"],\n sessionID: string,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }),\n sdk.session.get({ sessionID }),\n ])\n const current = createSession(response.data.toReversed())\n return {\n ...current,\n turns: current.turns.map((turn) => ({\n ...turn,\n provider: session.model?.providerID,\n model: session.model?.id,\n variant: session.model?.variant,\n })),\n ...(session.model && {\n model: { providerID: session.model.providerID, modelID: session.model.id },\n variant: session.model.variant,\n }),\n }\n}\n\nexport function sessionHistory(session: RunSession, limit = LIMIT): RunPrompt[] {\n return session.turns\n .map((turn) => turn.prompt)\n .filter((prompt) => prompt.text.trim())\n .filter((prompt, index, prompts) => index === 0 || !promptSame(prompts[index - 1], prompt))\n .map(promptCopy)\n .slice(-limit)\n}\n\nexport function sessionVariant(session: RunSession, model: RunInput[\"model\"]): string | undefined {\n if (!model) return\n if (session.model?.providerID === model.providerID && session.model.modelID === model.modelID) return session.variant\n\n return session.turns.findLast((turn) => turn.provider === model.providerID && turn.model === model.modelID)?.variant\n}\n", | ||
| "// Theme resolution for direct interactive mode.\n//\n// Derives scrollback and footer colors from the terminal's actual palette.\n// resolveRunTheme() queries the renderer for the terminal's palette,\n// detects dark/light mode, builds a small system theme locally, and maps it to\n// the run footer + scrollback color model. Falls back to a hardcoded dark-mode\n// palette if detection fails.\nimport { RGBA, SyntaxStyle, type CliRenderer, type ColorInput, type TerminalColors } from \"@opentui/core\"\nimport type { TuiThemeCurrent } from \"@opencode-ai/plugin/tui\"\nimport type { EntryKind } from \"./types\"\n\ntype Tone = {\n body: ColorInput\n start?: ColorInput\n}\n\nexport type RunEntryTheme = Record<EntryKind, Tone>\n\nexport type RunSplashTheme = {\n left: ColorInput\n right: ColorInput\n leftShadow: ColorInput\n rightShadow: ColorInput\n}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: ColorInput\n success: ColorInput\n error: ColorInput\n muted: ColorInput\n text: ColorInput\n status: ColorInput\n statusAccent: ColorInput\n shade: ColorInput\n surface: ColorInput\n pane: ColorInput\n border: ColorInput\n line: ColorInput\n}\n\nexport type RunBlockTheme = {\n highlight: ColorInput\n warning: ColorInput\n text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\n diffAdded: ColorInput\n diffRemoved: ColorInput\n diffAddedBg: ColorInput\n diffRemovedBg: ColorInput\n diffContextBg: ColorInput\n diffHighlightAdded: ColorInput\n diffHighlightRemoved: ColorInput\n diffLineNumber: ColorInput\n diffAddedLineNumberBg: ColorInput\n diffRemovedLineNumberBg: ColorInput\n}\n\nexport type RunTheme = {\n background: ColorInput\n footer: RunFooterTheme\n entry: RunEntryTheme\n splash: RunSplashTheme\n block: RunBlockTheme\n}\n\ntype ThemeColor = Exclude<keyof TuiThemeCurrent, \"thinkingOpacity\">\ntype HexColor = `#${string}`\ntype RefName = string\ntype Variant = {\n dark: HexColor | RefName\n light: HexColor | RefName\n}\ntype ColorValue = HexColor | RefName | Variant | RGBA | number\ntype ThemeJson = {\n defs?: Record<string, HexColor | RefName>\n theme: Omit<Record<ThemeColor, ColorValue>, \"selectedListItemText\" | \"backgroundMenu\"> & {\n selectedListItemText?: ColorValue\n backgroundMenu?: ColorValue\n thinkingOpacity?: number\n }\n}\n\ntype SharedSyntaxTheme = TuiThemeCurrent & {\n _hasSelectedListItemText: boolean\n}\n\nexport const transparent = RGBA.fromValues(0, 0, 0, 0)\n\nfunction alpha(color: RGBA, value: number): RGBA {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, value)))\n}\n\nfunction rgba(hex: string, value?: number): RGBA {\n const color = RGBA.fromHex(hex)\n return value === undefined ? color : alpha(color, value)\n}\n\nfunction mode(bg: RGBA): \"dark\" | \"light\" {\n return luminance(bg) > 0.5 ? \"light\" : \"dark\"\n}\n\nfunction luminance(color: RGBA): number {\n return 0.299 * color.r + 0.587 * color.g + 0.114 * color.b\n}\n\nfunction fade(color: RGBA, base: RGBA, fallback: number, scale: number, limit: number): RGBA {\n if (color.a === 0) {\n return RGBA.fromValues(color.r, color.g, color.b, Math.max(0, Math.min(1, fallback)))\n }\n\n const target = Math.min(limit, color.a * scale)\n const mix = Math.min(1, target / color.a)\n\n return RGBA.fromValues(\n base.r + (color.r - base.r) * mix,\n base.g + (color.g - base.g) * mix,\n base.b + (color.b - base.b) * mix,\n color.a,\n )\n}\n\nfunction ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansi = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansi[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const value = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(value(r), value(g), value(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nfunction tint(base: RGBA, overlay: RGBA, value: number): RGBA {\n return RGBA.fromInts(\n Math.round((base.r + (overlay.r - base.r) * value) * 255),\n Math.round((base.g + (overlay.g - base.g) * value) * 255),\n Math.round((base.b + (overlay.b - base.b) * value) * 255),\n )\n}\n\nfunction chroma(color: RGBA) {\n return Math.max(color.r, color.g, color.b) - Math.min(color.r, color.g, color.b)\n}\n\nfunction indexedPalette(colors: TerminalColors, size: number = Math.max(colors.palette.length, 16)): RGBA[] {\n return Array.from({ length: size }, (_, index) => {\n const value = colors.palette[index]\n return RGBA.fromIndex(index, value ? RGBA.fromHex(value) : ansiToRgba(index))\n })\n}\n\nfunction srgbToLinear(value: number): number {\n if (value <= 0.04045) {\n return value / 12.92\n }\n\n return ((value + 0.055) / 1.055) ** 2.4\n}\n\nfunction oklab(color: RGBA) {\n const r = srgbToLinear(color.r)\n const g = srgbToLinear(color.g)\n const b = srgbToLinear(color.b)\n\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b)\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b)\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b)\n\n return {\n l: 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n a: 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n b: 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s,\n }\n}\n\nfunction nearestIndexed(indexed: RGBA[], rgba: RGBA): RGBA {\n const target = oklab(rgba)\n const hit = indexed.reduce(\n (best, item) => {\n const sample = oklab(item)\n const dl = sample.l - target.l\n const da = sample.a - target.a\n const db = sample.b - target.b\n const dist = dl * dl * 2 + da * da + db * db\n if (dist >= best.dist) return best\n return {\n dist,\n item,\n }\n },\n {\n dist: Number.POSITIVE_INFINITY,\n item: indexed[0]!,\n },\n )\n\n return RGBA.clone(hit.item)\n}\n\nfunction paletteColor(colors: TerminalColors, index: number): RGBA {\n const value = colors.palette[index]\n return value ? RGBA.fromHex(value) : ansiToRgba(index)\n}\n\nfunction splashShadow(indexed: RGBA[], base: RGBA, overlay: RGBA, value: number): RGBA {\n const mixed = tint(base, overlay, value)\n return nearestIndexed(indexed, mixed)\n}\n\nexport function resolveTheme(theme: ThemeJson, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const defs = theme.defs ?? {}\n\n const resolveColor = (value: ColorValue, chain: string[] = []): RGBA => {\n if (value instanceof RGBA) return value\n\n if (typeof value === \"number\") {\n return RGBA.fromIndex(value, ansiToRgba(value))\n }\n\n if (typeof value !== \"string\") {\n return resolveColor(value[pick], chain)\n }\n\n if (value === \"transparent\" || value === \"none\") {\n return RGBA.fromInts(0, 0, 0, 0)\n }\n\n if (value.startsWith(\"#\")) {\n return RGBA.fromHex(value)\n }\n\n if (chain.includes(value)) {\n throw new Error(`Circular color reference: ${[...chain, value].join(\" -> \")}`)\n }\n\n const next = defs[value] ?? theme.theme[value as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${value}\" not found in defs or theme`)\n }\n\n return resolveColor(next, [...chain, value])\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText:\n theme.theme.selectedListItemText === undefined\n ? resolved.background!\n : resolveColor(theme.theme.selectedListItemText),\n backgroundMenu:\n theme.theme.backgroundMenu === undefined ? resolved.backgroundElement! : resolveColor(theme.theme.backgroundMenu),\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): Record<number, RGBA> {\n const r = bg.r * 255\n const g = bg.g * 255\n const b = bg.b * 255\n const lum = 0.299 * r + 0.587 * g + 0.114 * b\n const cast = 0.25 * (1 - chroma(bg)) ** 2\n\n const gray = (level: number) => {\n const factor = level / 12\n\n if (isDark && lum < 10) {\n const value = Math.floor(factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n if (!isDark && lum > 245) {\n const value = Math.floor(255 - factor * 0.4 * 255)\n return map(RGBA.fromInts(value, value, value))\n }\n\n const value = isDark ? lum + (255 - lum) * factor * 0.4 : lum * (1 - factor * 0.4)\n const tone = RGBA.fromInts(Math.floor(value), Math.floor(value), Math.floor(value))\n if (cast === 0) return map(tone)\n\n const ratio = lum === 0 ? 0 : value / lum\n return map(\n tint(\n tone,\n RGBA.fromInts(\n Math.floor(Math.max(0, Math.min(r * ratio, 255))),\n Math.floor(Math.max(0, Math.min(g * ratio, 255))),\n Math.floor(Math.max(0, Math.min(b * ratio, 255))),\n ),\n cast,\n ),\n )\n }\n\n return Object.fromEntries(Array.from({ length: 12 }, (_, index) => [index + 1, gray(index + 1)]))\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean, map: (rgba: RGBA) => RGBA): RGBA {\n const lum = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n const gray = isDark\n ? lum < 10\n ? 180\n : Math.min(Math.floor(160 + lum * 0.3), 200)\n : lum > 245\n ? 75\n : Math.max(Math.floor(100 - (255 - lum) * 0.2), 60)\n\n return map(RGBA.fromInts(gray, gray, gray))\n}\n\nexport function generateSystem(colors: TerminalColors, pick: \"dark\" | \"light\"): ThemeJson {\n const bg_snapshot = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg_snapshot = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const bg = RGBA.defaultBackground(bg_snapshot)\n const fg = RGBA.defaultForeground(fg_snapshot)\n const isDark = pick === \"dark\"\n\n const color = (index: number) => paletteColor(colors, index)\n\n const grays = generateGrayScale(bg_snapshot, isDark, (rgba) => rgba)\n const textMuted = generateMutedTextColor(bg_snapshot, isDark, (rgba) => rgba)\n\n const ansi = {\n red: color(1),\n green: color(2),\n yellow: color(3),\n blue: color(4),\n magenta: color(5),\n cyan: color(6),\n red_bright: color(9),\n green_bright: color(10),\n }\n\n const diff_alpha = isDark ? 0.22 : 0.14\n const diff_context_bg = grays[2]\n const primary = ansi.cyan\n const secondary = ansi.magenta\n\n return {\n theme: {\n primary,\n secondary,\n accent: primary,\n error: ansi.red,\n warning: ansi.yellow,\n success: ansi.green,\n info: ansi.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: alpha(bg, 0),\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansi.green,\n diffRemoved: ansi.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansi.green_bright,\n diffHighlightRemoved: ansi.red_bright,\n diffAddedBg: tint(bg_snapshot, ansi.green, diff_alpha),\n diffRemovedBg: tint(bg_snapshot, ansi.red, diff_alpha),\n diffContextBg: diff_context_bg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg: tint(diff_context_bg, ansi.green, diff_alpha),\n diffRemovedLineNumberBg: tint(diff_context_bg, ansi.red, diff_alpha),\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansi.blue,\n markdownLinkText: ansi.cyan,\n markdownCode: ansi.green,\n markdownBlockQuote: ansi.yellow,\n markdownEmph: ansi.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansi.blue,\n markdownListEnumeration: ansi.cyan,\n markdownImage: ansi.blue,\n markdownImageText: ansi.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansi.magenta,\n syntaxFunction: ansi.blue,\n syntaxVariable: fg,\n syntaxString: ansi.green,\n syntaxNumber: ansi.yellow,\n syntaxType: ansi.cyan,\n syntaxOperator: ansi.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction quantizeColor(indexed: RGBA[], rgba: RGBA): RGBA {\n if (rgba.a === 0 || rgba.intent === \"default\" || rgba.intent === \"indexed\") {\n return RGBA.clone(rgba)\n }\n\n return nearestIndexed(indexed, rgba)\n}\n\nfunction quantizeTheme(theme: TuiThemeCurrent, indexed: RGBA[]): TuiThemeCurrent {\n const resolved = Object.fromEntries(\n Object.entries(theme)\n .filter(([key]) => key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, quantizeColor(indexed, value as RGBA)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n return {\n ...(resolved as Record<ThemeColor, RGBA>),\n thinkingOpacity: theme.thinkingOpacity,\n }\n}\n\nfunction splashTheme(theme: TuiThemeCurrent, indexed: RGBA[]): RunSplashTheme {\n const left = nearestIndexed(indexed, theme.textMuted)\n const right = nearestIndexed(indexed, theme.text)\n return {\n left,\n right,\n leftShadow: splashShadow(indexed, theme.background, left, 0.14),\n rightShadow: splashShadow(indexed, theme.background, right, 0.14),\n }\n}\n\nfunction map(\n footerTheme: TuiThemeCurrent,\n scrollbackTheme: TuiThemeCurrent,\n splash: RunSplashTheme,\n syntax?: SyntaxStyle,\n): RunTheme {\n const footerBackground = alpha(footerTheme.background, 1)\n const footerMode = mode(footerBackground)\n const shade = fade(footerTheme.backgroundMenu, footerTheme.background, 0.12, 0.56, 0.72)\n const surface = fade(footerTheme.backgroundMenu, footerTheme.background, 0.18, 0.76, 0.9)\n const line = fade(footerTheme.backgroundMenu, footerTheme.background, 0.24, 0.9, 0.98)\n const statusBase = tint(footerBackground, rgba(\"#000000\"), footerMode === \"dark\" ? 0.12 : 0.06)\n const statusAccentBase =\n footerMode === \"dark\" ? tint(footerBackground, rgba(\"#ffffff\"), 0.06) : tint(statusBase, rgba(\"#000000\"), 0.04)\n const collapsedStatus = footerMode === \"dark\" && luminance(statusBase) <= 0.04\n // Pure-black backgrounds need a slight lift or the row disappears into the terminal background.\n const status = collapsedStatus ? tint(statusBase, statusAccentBase, 0.7) : statusBase\n const statusAccent = collapsedStatus ? tint(status, rgba(\"#ffffff\"), 0.06) : statusAccentBase\n\n return {\n background: footerTheme.background,\n footer: {\n highlight: footerTheme.primary,\n selected: footerTheme.backgroundElement,\n selectedText: footerTheme.selectedListItemText,\n warning: footerTheme.warning,\n success: footerTheme.success,\n error: footerTheme.error,\n muted: footerTheme.textMuted,\n text: footerTheme.text,\n status,\n statusAccent,\n shade,\n surface,\n pane: footerTheme.backgroundMenu,\n border: footerTheme.border,\n line,\n },\n entry: {\n system: {\n body: scrollbackTheme.textMuted,\n },\n user: {\n body: scrollbackTheme.primary,\n },\n assistant: {\n body: scrollbackTheme.text,\n },\n reasoning: {\n body: scrollbackTheme.textMuted,\n },\n tool: {\n body: scrollbackTheme.text,\n start: scrollbackTheme.textMuted,\n },\n error: {\n body: scrollbackTheme.error,\n },\n },\n splash,\n block: {\n highlight: scrollbackTheme.primary,\n warning: scrollbackTheme.warning,\n text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\n diffAdded: scrollbackTheme.diffAdded,\n diffRemoved: scrollbackTheme.diffRemoved,\n diffAddedBg: transparent,\n diffRemovedBg: transparent,\n diffContextBg: transparent,\n diffHighlightAdded: scrollbackTheme.diffHighlightAdded,\n diffHighlightRemoved: scrollbackTheme.diffHighlightRemoved,\n diffLineNumber: scrollbackTheme.diffLineNumber,\n diffAddedLineNumberBg: scrollbackTheme.diffAddedLineNumberBg,\n diffRemovedLineNumberBg: scrollbackTheme.diffRemovedLineNumberBg,\n },\n }\n}\n\nconst seed = {\n highlight: RGBA.fromIndex(6, rgba(\"#38bdf8\")),\n muted: RGBA.fromIndex(8, rgba(\"#64748b\")),\n text: RGBA.defaultForeground(rgba(\"#f8fafc\")),\n panel: rgba(\"#0f172a\"),\n success: RGBA.fromIndex(2, rgba(\"#22c55e\")),\n warning: RGBA.fromIndex(3, rgba(\"#f59e0b\")),\n error: RGBA.fromIndex(1, rgba(\"#ef4444\")),\n}\n\nfunction tone(body: ColorInput, start?: ColorInput): Tone {\n return {\n body,\n start,\n }\n}\n\nconst fallbackSplashIndexed = Array.from({ length: 256 }, (_, index) => RGBA.fromIndex(index))\nconst fallbackSplashLeft = RGBA.fromIndex(67)\nconst fallbackSplashRight = RGBA.fromIndex(110)\n\nexport const RUN_THEME_FALLBACK: RunTheme = {\n background: RGBA.fromValues(0, 0, 0, 0),\n footer: {\n highlight: seed.highlight,\n selected: seed.text,\n selectedText: seed.panel,\n warning: seed.warning,\n success: seed.success,\n error: seed.error,\n muted: seed.muted,\n text: seed.text,\n status: tint(seed.panel, rgba(\"#000000\"), 0.12),\n statusAccent: tint(seed.panel, rgba(\"#ffffff\"), 0.06),\n shade: alpha(seed.panel, 0.68),\n surface: alpha(seed.panel, 0.86),\n pane: seed.panel,\n border: seed.muted,\n line: alpha(seed.panel, 0.96),\n },\n entry: {\n system: tone(seed.muted),\n user: tone(seed.highlight),\n assistant: tone(seed.text),\n reasoning: tone(seed.muted),\n tool: tone(seed.text, seed.muted),\n error: tone(seed.error),\n },\n splash: {\n left: fallbackSplashLeft,\n right: fallbackSplashRight,\n leftShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashLeft, 0.14),\n rightShadow: splashShadow(fallbackSplashIndexed, RGBA.fromValues(0, 0, 0, 0), fallbackSplashRight, 0.14),\n },\n block: {\n highlight: seed.highlight,\n warning: seed.warning,\n text: seed.text,\n muted: seed.muted,\n diffAdded: seed.success,\n diffRemoved: seed.error,\n diffAddedBg: alpha(seed.success, 0.18),\n diffRemovedBg: alpha(seed.error, 0.18),\n diffContextBg: alpha(seed.panel, 0.72),\n diffHighlightAdded: seed.success,\n diffHighlightRemoved: seed.error,\n diffLineNumber: seed.muted,\n diffAddedLineNumberBg: alpha(seed.success, 0.12),\n diffRemovedLineNumberBg: alpha(seed.error, 0.12),\n },\n}\n\nexport async function resolveRunTheme(renderer: CliRenderer): Promise<RunTheme> {\n try {\n const colors = await renderer.getPalette({\n size: 256,\n })\n const bg = colors.defaultBackground ?? colors.palette[0]\n if (!bg) {\n return RUN_THEME_FALLBACK\n }\n\n // Palette-only terminal reloads can leave renderer.themeMode stale, but\n // ANSI slot zero is not the terminal background when OSC 11 is absent.\n const pick = colors.defaultBackground\n ? mode(RGBA.fromHex(colors.defaultBackground))\n : (renderer.themeMode ?? mode(RGBA.fromHex(bg)))\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const indexed = indexedPalette(colors, 256)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const shared = await import(\"@opencode-ai/tui/context/theme\")\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n const syntax = shared.generateSyntax(syntaxTheme)\n return map(footerTheme, scrollbackTheme, splashTheme(scrollbackTheme, indexed), syntax)\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F752D34A14F4ACBA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini/tool.ts"], | ||
| "sourcesContent": [ | ||
| "// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, task, etc.) has a ToolRule that controls\n// five display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// permission → display info for the permission UI (icon, title, diff)\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport { LANGUAGE_EXTENSIONS } from \"@opencode-ai/tui/util/filetype\"\nimport { Locale } from \"@opencode-ai/tui/util/locale\"\nimport type { MiniToolPart, RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport type ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\nexport type ToolPhase = \"start\" | \"progress\" | \"final\"\n\nexport type ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n type?: string\n relativePath?: string\n filePath?: string\n movePath?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n path?: string\n pattern?: string\n filePath?: string\n filepath?: string\n url?: string\n query?: string\n subagent_type?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\nexport type ToolFrame = {\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n}\n\nexport type ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\nexport type ToolPermissionInfo = {\n icon: string\n title: string\n lines: string[]\n diff?: string\n file?: string\n}\n\nexport type ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolPermissionProps = {\n input: ToolInput\n metadata: ToolMetadata\n patterns: string[]\n}\n\ntype ToolPermissionCtx = {\n input: ToolDict\n meta: ToolDict\n patterns: string[]\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"task\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n | \"plan_exit\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n permission?: (props: ToolPermissionProps) => ToolPermissionInfo\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n return {}\n }\n\n return { ...v }\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction permission(ctx: ToolPermissionCtx): ToolPermissionProps {\n return {\n input: ctx.input,\n metadata: ctx.meta,\n patterns: ctx.patterns,\n }\n}\n\nfunction webSearchProviderLabel(provider: unknown) {\n if (provider === \"parallel\") return \"Parallel Web Search\"\n if (provider === \"exa\") return \"Exa Web Search\"\n return \"Web Search\"\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nfunction num(v: unknown): number | undefined {\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n return undefined\n }\n\n return v\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction info(data: ToolDict, skip: string[] = []): string {\n const list = Object.entries(data).filter(([key, val]) => {\n if (skip.includes(key)) {\n return false\n }\n\n return typeof val === \"string\" || typeof val === \"number\" || typeof val === \"boolean\"\n })\n\n if (list.length === 0) {\n return \"\"\n }\n\n return `[${list.map(([key, val]) => `${key}=${String(val)}`).join(\", \")}]`\n}\n\nfunction span(state: ToolDict): string {\n const time = dict(state.time)\n const start = num(time.start)\n const end = num(time.end)\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = info(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx.state)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean } = {}): string {\n if (!input) {\n return \"\"\n }\n\n const cwd = process.cwd()\n const home = os.homedir()\n const abs = path.isAbsolute(input) ? input : path.resolve(cwd, input)\n const rel = path.relative(cwd, abs)\n\n if (!rel) {\n return \".\"\n }\n\n if (!rel.startsWith(\"..\")) {\n return rel.replaceAll(\"\\\\\", \"/\")\n }\n\n if (opts.home && home && (abs === home || abs.startsWith(home + path.sep))) {\n return abs.replace(home, \"~\").replaceAll(\"\\\\\", \"/\")\n }\n\n return abs.replaceAll(\"\\\\\", \"/\")\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = text(ctx.state.title) || (Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\")\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${toolPath(root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${toolPath(dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = toolPath(p.input.filePath)\n const description = info(p.frame.input, [\"filePath\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Edit ${toolPath(p.input.filePath)}`,\n mode: \"block\",\n body: p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.subagent_type || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Task`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: `Skill \"${p.input.name ?? \"\"}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: text(p.frame.state.title) || \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: text(p.frame.state.title) || (calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\"),\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n filePath?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.filePath ? toolPath(input.filePath, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || lspTitle(p.input),\n }\n}\n\nfunction runPlanExit(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: text(p.frame.state.title) || \"Switching to build agent\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output) : undefined,\n }\n}\n\nfunction patchTitle(file: PatchFile): string {\n const rel = file.relativePath\n const from = file.filePath\n if (file.type === \"add\") {\n return `# Created ${rel || toolPath(from)}`\n }\n if (file.type === \"delete\") {\n return `# Deleted ${rel || toolPath(from)}`\n }\n if (file.type === \"move\") {\n return `# Moved ${toolPath(from)} -> ${rel || toolPath(file.movePath)}`\n }\n\n return `# Patched ${rel || toolPath(from)}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${toolPath(file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.filePath || \"\"\n const diff = p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${toolPath(file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.movePath || file.filePath || file.relativePath\n return [\n {\n title: patchTitle(file),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length === 0) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const desc = p.input.description\n const title = text(p.frame.state.title)\n const rows = [desc || title].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Task`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? toolPath(wd) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `# Running in ${dir}` : \"\"\n }\n\n return `# Running in ${dir}\\n$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? toolPath(wdRaw) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit ?? num(p.frame.meta.exitCode) ?? num(p.frame.meta.exit_code)\n const time = span(p.frame.state)\n if (code === undefined) {\n if (!time) {\n return \"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 = toolPath(p.input.filePath)\n const extra = info(p.frame.input, [\"filePath\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile): string {\n const type = file.type\n const rel = file.relativePath\n const from = file.filePath\n\n if (type === \"add\") {\n return `+ Created ${rel || toolPath(from)}`\n }\n\n if (type === \"delete\") {\n return `- Deleted ${rel || toolPath(from)}`\n }\n\n if (type === \"move\") {\n return `→ Moved ${toolPath(from)} → ${rel || toolPath(file.movePath)}`\n }\n\n return `~ Patched ${rel || toolPath(from)}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame.state)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const show_updates = !files.some((file) => file?.type && file.type !== \"update\")\n const shown = files.filter((file) => show_updates || file.type !== \"update\")\n const rows = shown.slice(0, 6).map(patchLine)\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.subagent_type || \"general\")\n const row = p.input.description || text(p.frame.state.title)\n if (!row) {\n return `# ${kind} Task`\n }\n\n return `# ${kind} Task\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame.state)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input)}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.input.name ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${toolPath(dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${toolPath(dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nfunction permEdit(p: ToolPermissionProps): ToolPermissionInfo {\n const input = p.input as { filePath?: string; filepath?: string; diff?: string }\n const file = input.filePath || input.filepath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Edit ${toolPath(file, { home: true })}`,\n lines: [],\n diff: p.metadata.diff ?? input.diff,\n file,\n }\n}\n\nfunction permRead(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `Read ${toolPath(file, { home: true })}`,\n lines: file ? [`Path: ${toolPath(file, { home: true })}`] : [],\n }\n}\n\nfunction permGlob(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Glob \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permGrep(p: ToolPermissionProps): ToolPermissionInfo {\n const pattern = p.input.pattern || p.patterns[0] || \"\"\n return {\n icon: \"✱\",\n title: `Grep \"${pattern}\"`,\n lines: pattern ? [`Pattern: ${pattern}`] : [],\n }\n}\n\nfunction permList(p: ToolPermissionProps): ToolPermissionInfo {\n const dir = text(dict(p.input).path) || p.patterns[0] || \"\"\n return {\n icon: \"→\",\n title: `List ${toolPath(dir, { home: true })}`,\n lines: dir ? [`Path: ${toolPath(dir, { home: true })}`] : [],\n }\n}\n\nfunction permBash(p: ToolPermissionProps): ToolPermissionInfo {\n const cmd = p.input.command || \"\"\n return {\n icon: \"#\",\n title: \"Shell command\",\n lines: cmd ? [`$ ${cmd}`] : p.patterns.map((item) => `- ${item}`),\n }\n}\n\nfunction permTask(p: ToolPermissionProps): ToolPermissionInfo {\n const type = p.input.subagent_type || \"general\"\n const desc = p.input.description\n return {\n icon: \"#\",\n title: `${Locale.titlecase(type)} Task`,\n lines: desc ? [`◉ ${desc}`] : [],\n }\n}\n\nfunction permWebfetch(p: ToolPermissionProps): ToolPermissionInfo {\n const url = p.input.url || \"\"\n return {\n icon: \"%\",\n title: `WebFetch ${url}`,\n lines: url ? [`URL: ${url}`] : [],\n }\n}\n\nfunction permWebSearch(p: ToolPermissionProps): ToolPermissionInfo {\n const query = p.input.query || \"\"\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: query ? `${title} \"${query}\"` : title,\n lines: query ? [`Query: ${query}`] : [],\n }\n}\n\nfunction permLsp(p: ToolPermissionProps): ToolPermissionInfo {\n const file = p.input.filePath || \"\"\n const line = typeof p.input.line === \"number\" ? p.input.line : undefined\n const char = typeof p.input.character === \"number\" ? p.input.character : undefined\n const pos = line !== undefined && char !== undefined ? `${line}:${char}` : undefined\n return {\n icon: \"→\",\n title: lspTitle(p.input, { home: true }),\n lines: [\n ...(p.input.operation ? [`Operation: ${p.input.operation}`] : []),\n ...(file ? [`Path: ${toolPath(file, { home: true })}`] : []),\n ...(pos ? [`Position: ${pos}`] : []),\n ],\n }\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n 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 permission: permBash,\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n permission: permEdit,\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n task: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n permission: permTask,\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n permission: permRead,\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n permission: permGlob,\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n permission: permGrep,\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n permission: permList,\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n permission: permLsp,\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n permission: permWebfetch,\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n permission: permWebSearch,\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n plan_exit: {\n view: {\n output: true,\n final: false,\n },\n run: runPlanExit,\n scroll: {\n start: () => \"\",\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: MiniToolPart): ToolFrame {\n const state = dict(part.state)\n return {\n raw: \"\",\n name: part.tool,\n input: dict(state.input),\n meta: \"metadata\" in part.state ? dict(part.state.metadata) : {},\n state,\n status: text(state.status),\n error: text(state.error),\n }\n}\n\nexport function toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const state = dict(commit.part?.state)\n return {\n raw,\n name: commit.tool || commit.part?.tool || \"tool\",\n input: dict(state.input),\n meta: commit.part?.state && \"metadata\" in commit.part.state ? dict(commit.part.state.metadata) : {},\n state,\n status: commit.toolState ?? text(state.status),\n error: (commit.toolError ?? \"\").trim(),\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? text(p.frame.state.output).trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.tool).snap)\n )\n}\n\nexport function toolInlineInfo(part: MiniToolPart): ToolInline {\n const ctx = frame(part)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nexport function toolPermissionInfo(\n name: string,\n input: ToolDict,\n meta: ToolDict,\n patterns: string[],\n): ToolPermissionInfo | undefined {\n const draw = rule(name)?.permission\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(permission({ input, meta, patterns }))\n } catch {\n return undefined\n }\n}\n\nexport function toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"task\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(text(ctx.state.output))\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C32ED7DAC6F1437E64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is not supported yet
257268812
0284
0.35%