@opencode-ai/cli-linux-x64-baseline
Advanced tools
| { | ||
| "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": ";u9BAAA,cAAS,WAST,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,OAC/B,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,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": "6DEFD048CCA1B1C064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "A71048725C99A4F164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/restart.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,QACnC,EAAO,GAAG,qBAAqB,EAAE,SAAU,EAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "492E64B4907FCEDD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n env: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\", \"env\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\" || key === \"env\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* (input: { readonly checkVersion?: boolean } = {}) {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: input.checkVersion ? OPENCODE_VERSION : undefined,\n env: (yield* read()).env,\n command: [\n ...selfCommand(),\n \"serve\",\n \"--service\",\n ],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.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, name?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service get ${selected}`)\n switch (selected) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n case \"env\": {\n const env = (yield* read()).env ?? {}\n return name === undefined ? JSON.stringify(env, null, 2) : (env[name] ?? \"\")\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string, nestedValue?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && nestedValue !== undefined)\n throw new Error(`Usage: opencode service set ${selected} <value>`)\n switch (selected) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n case \"env\": {\n if (nestedValue === undefined) throw new Error(\"Usage: opencode service set env <key> <value>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n yield* write({ ...existing, env: { ...existing.env, [value]: nestedValue } })\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string, name?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service unset ${selected}`)\n switch (selected) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"env\": {\n if (name === undefined) throw new Error(\"Usage: opencode service unset env <key>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n const { [name]: _removed, ...env } = existing.env ?? {}\n const { env: _existingEnv, ...rest } = existing\n yield* write(Object.keys(env).length === 0 ? rest : { ...rest, env })\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C93F6BB35749EC2A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "BF968AB7198F45D464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini.ts", "src/mini-host.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\nimport { Env } from \"./env\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n paths: { home: string; state: string; log: string }\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const environment = input.server.reconnect ? Env.session() : undefined\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n environment,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n environment,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory, paths: input.paths }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "B382D54CB7A4891B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/shared.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { OpenCode, type IntegrationInfo, type IntegrationMethod, type OpenCodeClient } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../../services/server-connection\"\n\nexport const location = { directory: process.cwd() }\n\nexport const createClient = Effect.fn(\"cli.auth.client\")(function* (input: ServerConnection.Args) {\n const server = yield* ServerConnection.resolve(input)\n return OpenCode.make({ baseUrl: server.endpoint.url, headers: Service.headers(server.endpoint) })\n})\n\nexport function request<A>(run: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({ try: run, catch: (cause) => cause })\n}\n\nexport const loadIntegrations = Effect.fn(\"cli.auth.integrations\")(function* (client: OpenCodeClient) {\n // The model endpoint is the existing public readiness boundary for the initial plugin generation.\n yield* request((signal) => client.model.default({ location }, { signal }))\n return yield* request((signal) => client.integration.list({ location }, { signal })).pipe(\n Effect.map((response) => response.data),\n )\n})\n\nexport const resolveIntegration = Effect.fn(\"cli.auth.resolve-integration\")(function* (\n integrations: IntegrationInfo[],\n target: string,\n) {\n const normalized = target.replace(/\\/+$/, \"\")\n const byID = integrations.find((integration) => integration.id === normalized)\n if (byID) return byID\n const matches = integrations.filter((integration) => integration.name.toLowerCase() === normalized.toLowerCase())\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) {\n return yield* Effect.fail(\n new Error(\n `Integration name \"${target}\" is ambiguous: ${matches.map((integration) => integration.id).join(\", \")}`,\n ),\n )\n }\n return yield* Effect.fail(new Error(`Integration not found: ${target}`))\n})\n\nexport type ConnectMethod = Exclude<IntegrationMethod, { type: \"env\" }>\n\nexport function connectMethods(integration: IntegrationInfo) {\n return integration.methods\n .filter((method): method is ConnectMethod => method.type !== \"env\")\n .toSorted((a, b) => Number(a.type === \"key\") - Number(b.type === \"key\"))\n}\n\nexport const resolveMethod = Effect.fn(\"cli.auth.resolve-method\")(function* (methods: ConnectMethod[], target: string) {\n const normalized = target.toLowerCase()\n const matches = methods.filter((method) => {\n if (method.type === \"key\") return normalized === \"key\" || method.label?.toLowerCase() === normalized\n return method.id === target || method.label.toLowerCase() === normalized\n })\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) return yield* Effect.fail(new Error(`Authentication method \"${target}\" is ambiguous`))\n const available = methods.map((method) => (method.type === \"key\" ? \"key\" : method.id)).join(\", \")\n return yield* Effect.fail(\n new Error(`Authentication method not found: ${target}${available ? `. Available: ${available}` : \"\"}`),\n )\n})\n" | ||
| ], | ||
| "mappings": ";gNAKO,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAEtC,EAAe,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAA8B,CAChG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAAK,EACpD,OAAO,EAAS,KAAK,CAAE,QAAS,EAAO,SAAS,IAAK,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAAE,CAAC,EACjG,EAEM,SAAS,CAAU,CAAC,EAA0C,CACnE,OAAO,EAAO,WAAW,CAAE,IAAK,EAAK,MAAO,CAAC,IAAU,CAAM,CAAC,EAGzD,IAAM,EAAmB,EAAO,GAAG,uBAAuB,EAAE,SAAU,CAAC,EAAwB,CAGpG,OADA,MAAO,EAAQ,CAAC,IAAW,EAAO,MAAM,QAAQ,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAClE,MAAO,EAAQ,CAAC,IAAW,EAAO,YAAY,KAAK,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAAE,KACnF,EAAO,IAAI,CAAC,IAAa,EAAS,IAAI,CACxC,EACD,EAEY,EAAqB,EAAO,GAAG,8BAA8B,EAAE,SAAU,CACpF,EACA,EACA,CACA,IAAM,EAAa,EAAO,QAAQ,OAAQ,EAAE,EACtC,EAAO,EAAa,KAAK,CAAC,IAAgB,EAAY,KAAO,CAAU,EAC7E,GAAI,EAAM,OAAO,EACjB,IAAM,EAAU,EAAa,OAAO,CAAC,IAAgB,EAAY,KAAK,YAAY,IAAM,EAAW,YAAY,CAAC,EAChH,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EACnB,OAAO,MAAO,EAAO,KACf,MACF,qBAAqB,oBAAyB,EAAQ,IAAI,CAAC,IAAgB,EAAY,EAAE,EAAE,KAAK,IAAI,GACtG,CACF,EAEF,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,GAAQ,CAAC,EACxE,EAIM,SAAS,CAAc,CAAC,EAA8B,CAC3D,OAAO,EAAY,QAChB,OAAO,CAAC,IAAoC,EAAO,OAAS,KAAK,EACjE,SAAS,CAAC,EAAG,IAAM,OAAO,EAAE,OAAS,KAAK,EAAI,OAAO,EAAE,OAAS,KAAK,CAAC,EAGpE,IAAM,EAAgB,EAAO,GAAG,yBAAyB,EAAE,SAAU,CAAC,EAA0B,EAAgB,CACrH,IAAM,EAAa,EAAO,YAAY,EAChC,EAAU,EAAQ,OAAO,CAAC,IAAW,CACzC,GAAI,EAAO,OAAS,MAAO,OAAO,IAAe,OAAS,EAAO,OAAO,YAAY,IAAM,EAC1F,OAAO,EAAO,KAAO,GAAU,EAAO,MAAM,YAAY,IAAM,EAC/D,EACD,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,iBAAsB,CAAC,EAC7G,IAAM,EAAY,EAAQ,IAAI,CAAC,IAAY,EAAO,OAAS,MAAQ,MAAQ,EAAO,EAAG,EAAE,KAAK,IAAI,EAChG,OAAO,MAAO,EAAO,KACf,MAAM,oCAAoC,IAAS,EAAY,gBAAgB,IAAc,IAAI,CACvG,EACD", | ||
| "debugId": "069B500AAF7BA0BC64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "0B7583D27C1E506D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/models.ts"], | ||
| "sourcesContent": [ | ||
| "import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.models,\n Effect.fn(\"cli.models\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const response = yield* Effect.promise(() => client.model.list({ location: { directory: process.cwd() } }))\n const models = response.data\n .map((model) => `${model.providerID}/${model.id}`)\n .toSorted((a, b) => a.localeCompare(b))\n if (models.length > 0) process.stdout.write(models.join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";giCAGA,cAAS,WAKT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EAEK,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KACrB,IAAI,CAAC,IAAU,GAAG,EAAM,cAAc,EAAM,IAAI,EAChD,SAAS,CAAC,EAAG,IAAM,EAAE,cAAc,CAAC,CAAC,EACxC,GAAI,EAAO,OAAS,EAAG,QAAQ,OAAO,MAAM,EAAO,KAAK,CAAG,EAAI,CAAG,EACnE,CACH", | ||
| "debugId": "31F2745B2C28479664756E2164756E21", | ||
| "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 return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,EAAG,CACrC,IAAM,EAAU,MAAO,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,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,SACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "1375F38F2881569264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type PluginInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { Config } from \"../../../config\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { discoverTuiPlugins, tuiPluginDirectories } from \"@opencode-ai/tui/plugin/discovery\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* (input) {\n const 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 config = yield* Config.Service\n const global = yield* Global.Service\n const info = yield* config.get()\n const discovered = yield* Effect.promise(() =>\n tuiPluginDirectories(process.cwd(), global.config).then(discoverTuiPlugins),\n )\n const output = format(\n response.data,\n [\n ...(info.plugins ?? []).flatMap((entry) => {\n const target = typeof entry === \"string\" ? entry : entry.package\n return target.startsWith(\"-\") ? [] : [{ target, source: \"configured\" as const }]\n }),\n ...discovered.map((target) => ({ target, source: \"discovered\" as const })),\n ],\n input.builtin,\n )\n if (!output) {\n process.stdout.write(\"No plugins found\" + EOL)\n return\n }\n process.stdout.write(output + EOL)\n }),\n)\n\nexport function format(\n plugins: readonly PluginInfo[],\n tui: ReadonlyArray<{ readonly target: string; readonly source: \"configured\" | \"discovered\" }>,\n builtin = false,\n) {\n const server = plugins\n .filter((plugin) => builtin || plugin.source.type !== \"builtin\")\n .toSorted((a, b) => name(a).localeCompare(name(b)))\n .map((plugin) => `${name(plugin)} (${plugin.status})`)\n const advertised = plugins.flatMap((plugin) =>\n plugin.status === \"active\" && plugin.tui && plugin.source.type === \"package\"\n ? [{ target: plugin.source.package, source: \"advertised\" as const }]\n : [],\n )\n const targets = [...tui, ...advertised]\n .filter((plugin, index, all) => all.findIndex((candidate) => candidate.target === plugin.target) === index)\n .toSorted((a, b) => a.target.localeCompare(b.target))\n .map((plugin) => `${plugin.target} (${plugin.source})`)\n return [\n targets.length ? [\"TUI\", ...targets].join(EOL) : undefined,\n server.length ? [\"Server\", ...server].join(EOL) : undefined,\n ]\n .filter((section) => section !== undefined)\n .join(EOL + EOL)\n}\n\nfunction name(plugin: PluginInfo) {\n if (plugin.id) return plugin.id\n if (plugin.source.type === \"package\") return plugin.source.package\n if (plugin.source.type === \"local\") return plugin.source.path\n return plugin.source.type\n}\n" | ||
| ], | ||
| "mappings": ";o/BAAA,cAAS,WAWT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,KAClC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,IAAM,EAAU,MAAO,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,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACrG,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAa,MAAO,EAAO,QAAQ,IACvC,EAAqB,QAAQ,IAAI,EAAG,EAAO,MAAM,EAAE,KAAK,CAAkB,CAC5E,EACM,EAAS,EACb,EAAS,KACT,CACE,IAAI,EAAK,SAAW,CAAC,GAAG,QAAQ,CAAC,IAAU,CACzC,IAAM,EAAS,OAAO,IAAU,SAAW,EAAQ,EAAM,QACzD,OAAO,EAAO,WAAW,GAAG,EAAI,CAAC,EAAI,CAAC,CAAE,SAAQ,OAAQ,YAAsB,CAAC,EAChF,EACD,GAAG,EAAW,IAAI,CAAC,KAAY,CAAE,SAAQ,OAAQ,YAAsB,EAAE,CAC3E,EACA,EAAM,OACR,EACA,GAAI,CAAC,EAAQ,CACX,QAAQ,OAAO,MAAM,mBAAqB,CAAG,EAC7C,OAEF,QAAQ,OAAO,MAAM,EAAS,CAAG,EAClC,CACH,EAEO,SAAS,CAAM,CACpB,EACA,EACA,EAAU,GACV,CACA,IAAM,EAAS,EACZ,OAAO,CAAC,IAAW,GAAW,EAAO,OAAO,OAAS,SAAS,EAC9D,SAAS,CAAC,EAAG,IAAM,EAAK,CAAC,EAAE,cAAc,EAAK,CAAC,CAAC,CAAC,EACjD,IAAI,CAAC,IAAW,GAAG,EAAK,CAAM,MAAM,EAAO,SAAS,EACjD,EAAa,EAAQ,QAAQ,CAAC,IAClC,EAAO,SAAW,UAAY,EAAO,KAAO,EAAO,OAAO,OAAS,UAC/D,CAAC,CAAE,OAAQ,EAAO,OAAO,QAAS,OAAQ,YAAsB,CAAC,EACjE,CAAC,CACP,EACM,EAAU,CAAC,GAAG,EAAK,GAAG,CAAU,EACnC,OAAO,CAAC,EAAQ,EAAO,IAAQ,EAAI,UAAU,CAAC,IAAc,EAAU,SAAW,EAAO,MAAM,IAAM,CAAK,EACzG,SAAS,CAAC,EAAG,IAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC,EACnD,IAAI,CAAC,IAAW,GAAG,EAAO,WAAW,EAAO,SAAS,EACxD,MAAO,CACL,EAAQ,OAAS,CAAC,MAAO,GAAG,CAAO,EAAE,KAAK,CAAG,EAAI,OACjD,EAAO,OAAS,CAAC,SAAU,GAAG,CAAM,EAAE,KAAK,CAAG,EAAI,MACpD,EACG,OAAO,CAAC,IAAY,IAAY,MAAS,EACzC,KAAK,EAAM,CAAG,EAGnB,SAAS,CAAI,CAAC,EAAoB,CAChC,GAAI,EAAO,GAAI,OAAO,EAAO,GAC7B,GAAI,EAAO,OAAO,OAAS,UAAW,OAAO,EAAO,OAAO,QAC3D,GAAI,EAAO,OAAO,OAAS,QAAS,OAAO,EAAO,OAAO,KACzD,OAAO,EAAO,OAAO", | ||
| "debugId": "CFF612A765DD3E9E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "71A0609FD855F49E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\nimport { Env } from \"../env\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n // Bun's default five-minute deadline terminates the event stream used by long-running sessions.\n fetch: ((request: RequestInfo | URL, init?: RequestInit) =>\n fetch(request, { ...init, timeout: false } as BunFetchRequestInit)) as typeof fetch,\n })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n environment: input.server.service ? Env.session() : undefined,\n prepare: async (next) => {\n const selected =\n next.model ??\n (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n return { model, agent: next.agent }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction errorMessage(error: unknown) {\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 return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n ToolContent,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { nonEmptyToolContent, toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n metadata: Record<string, JsonValue>\n content: ToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.inbox.delivered\") {\n if (event.data.inboxID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.id), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) {\n current.metadata = event.data.metadata\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n metadata: event.data.metadata,\n content: event.data.content,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n metadata: event.data.metadata,\n content: event.data.content,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const metadata = event.data.metadata ?? current.metadata\n const content = event.data.content ?? nonEmptyToolContent(current.content)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n metadata,\n content,\n error: event.data.error,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (content && toolOutputText(current.tool, content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n metadata,\n content,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (input.compatibility === \"v1\" && event.data.error.message === \"The provider response ended unexpectedly.\") {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n partID: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n id: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (item.state.content && toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({\n ...item,\n state: {\n status: \"completed\",\n input: item.state.input,\n metadata: item.state.metadata,\n content: item.state.content,\n },\n })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, id: string) {\n return `${messageID}\\u0000${id}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; id: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n metadata: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "EF40D88F9AB7CFE564756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/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, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAcT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,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,UAAS,CAAC,CACnG,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "DD028559ED63FE4264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/remove.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Config } from \"../../../config\"\nimport { resolveConfigPath } from \"../mcp/add\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.remove,\n Effect.fn(\"cli.plugin.remove\")(function* (input) {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const server = yield* Effect.promise(() => removePluginConfig(configPath, input.package))\n const config = yield* Config.Service\n const info = yield* config.get()\n const tui = configured(info.plugins, input.package)\n if (tui)\n yield* config.update((draft) => {\n draft.plugins = draft.plugins?.filter((entry) => !matches(entry, input.package))\n })\n\n const removed = [server ? configPath : undefined, tui ? config.path : undefined].filter(\n (file) => file !== undefined,\n )\n process.stdout.write(\n removed.length\n ? `Plugin \"${input.package}\" removed from ${removed.join(\", \")}${EOL}`\n : `Plugin \"${input.package}\" is not configured${EOL}`,\n )\n }),\n)\n\nexport async function removePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined\n throw error\n })\n if (text === undefined) return false\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (!configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(\n text,\n [\"plugins\"],\n plugins?.filter((entry) => !matches(entry, spec)),\n {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n },\n ),\n )\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some((entry) => matches(entry, spec)) ?? false\n}\n\nfunction matches(entry: unknown, spec: string) {\n return entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec)\n}\n" | ||
| ], | ||
| "mappings": ";itBAAA,cAAS,WAET,mBAAS,YAAU,eAAQ,oBAS3B,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,OAClC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAmB,EAAY,EAAM,OAAO,CAAC,EAClF,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAM,EAAW,EAAK,QAAS,EAAM,OAAO,EAClD,GAAI,EACF,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,EAAM,QAAU,EAAM,SAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,EAAM,OAAO,CAAC,EAChF,EAEH,IAAM,EAAU,CAAC,EAAS,EAAa,OAAW,EAAM,EAAO,KAAO,MAAS,EAAE,OAC/E,CAAC,IAAS,IAAS,MACrB,EACA,QAAQ,OAAO,MACb,EAAQ,OACJ,WAAW,EAAM,yBAAyB,EAAQ,KAAK,IAAI,IAAI,IAC/D,WAAW,EAAM,6BAA6B,GACpD,EACD,CACH,EAEA,eAAsB,CAAkB,CAAC,EAAoB,EAAc,CACzE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,OAC/F,MAAM,EACP,EACD,GAAI,IAAS,OAAW,MAAO,GAC/B,IAAM,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,CAAC,EAAW,EAAS,CAAI,EAAG,MAAO,GAEvC,IAAM,EAAU,EACd,EACA,EACE,EACA,CAAC,SAAS,EACV,GAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,CAAI,CAAC,EAChD,CACE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CACF,CACF,EACM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KAAK,CAAC,IAAU,EAAQ,EAAO,CAAI,CAAC,GAAK,GAG3D,SAAS,CAAO,CAAC,EAAgB,EAAc,CAC7C,OAAO,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,MAAQ,YAAa,GAAS,EAAM,UAAY", | ||
| "debugId": "447A0D1EB0ED8EF464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\nimport { Global } from \"@opencode-ai/util/global\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({\n server: serverURL,\n standalone: input.standalone,\n mismatch: \"replace\",\n })\n const config = yield* Config.Service\n const global = yield* Global.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: Option.getOrUndefined(input.replay) ?? resolved.mini?.replay ?? true,\n replayLimit: Option.getOrUndefined(input.replayLimit) ?? resolved.mini?.replay_limit,\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n paths: { home: global.home, state: global.state, log: global.log },\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";qkCAQA,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAM,CAAC,IACtD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,UAAS,wBAAyB,MAAO,EAAO,QAAQ,IAAa,wCAAa,EAC1F,MAAO,EAAO,QAAQ,SAAY,EAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EACR,WAAY,EAAM,WAClB,SAAU,SACZ,CAAC,EACK,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,GAAK,EAAS,MAAM,QAAU,GACxE,YAAa,EAAO,eAAe,EAAM,WAAW,GAAK,EAAS,MAAM,aACxE,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,EACA,MAAO,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CACnE,CAAC,CACH,EACD,CACH", | ||
| "debugId": "E8FAB7796DCE11A964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "1A7C8223E4EE523164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "834D8E7EE1C2EA1064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH", | ||
| "debugId": "EAA7E8C328B41F3064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/config.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.config,\n Effect.fn(\"cli.debug.config\")(function* () {\n const 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 entries = yield* Effect.promise(() => client.config.get({ location: { directory: process.cwd() } }))\n process.stdout.write(JSON.stringify(entries, null, 2) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAU,MAAO,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,EACpF,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACzG,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAS,KAAM,CAAC,EAAI,CAAG,EAC5D,CACH", | ||
| "debugId": "55D3CA4CB8F134AC64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "D9BD21544E29916C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/import.ts"], | ||
| "sourcesContent": [ | ||
| "import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionTransfer } from \"@opencode-ai/schema/session-transfer\"\nimport { Effect, Option, Schema } from \"effect\"\nimport { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.import,\n Effect.fn(\"cli.import\")(function* (input) {\n const text = yield* Effect.tryPromise({\n try: () =>\n input.file.startsWith(\"http://\") || input.file.startsWith(\"https://\")\n ? fetch(input.file).then((response) => {\n if (!response.ok) throw new Error(`Failed to fetch session data: ${response.statusText}`)\n return response.text()\n })\n : Bun.file(input.file).text(),\n catch: (cause) =>\n new Error(`Failed to read session data: ${cause instanceof Error ? cause.message : String(cause)}`),\n })\n const data = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(SessionTransfer.Data))(text)\n const encoded = Schema.encodeSync(SessionTransfer.Data)(data)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const location = yield* Effect.promise(() =>\n client.location.get({\n location: { directory: path.resolve(Option.getOrElse(input.directory, () => process.cwd())) },\n }),\n )\n const response = yield* Effect.promise(() =>\n fetch(new URL(\"/api/session/import\", server.endpoint.url), {\n method: \"POST\",\n headers: { ...Service.headers(server.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...encoded,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n }),\n }),\n )\n if (response.status === 409) {\n process.stderr.write(`Session already exists${EOL}`)\n return\n }\n if (!response.ok) yield* Effect.fail(new Error(`Failed to import session: ${response.statusText}`))\n const imported = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ data: Session.Info })))(\n yield* Effect.promise(() => response.text()),\n )\n process.stdout.write(`Imported session: ${imported.data.id}${EOL}`)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";03CAKA,cAAS,WACT,oBAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAM,KAAK,WAAW,SAAS,GAAK,EAAM,KAAK,WAAW,UAAU,EAChE,MAAM,EAAM,IAAI,EAAE,KAAK,CAAC,IAAa,CACnC,GAAI,CAAC,EAAS,GAAI,MAAU,MAAM,iCAAiC,EAAS,YAAY,EACxF,OAAO,EAAS,KAAK,EACtB,EACD,IAAI,KAAK,EAAM,IAAI,EAAE,KAAK,EAChC,MAAO,CAAC,IACF,MAAM,gCAAgC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAAG,CACtG,CAAC,EACK,EAAO,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAgB,IAAI,CAAC,EAAE,CAAI,EAC1F,EAAU,EAAO,WAAW,EAAgB,IAAI,EAAE,CAAI,EACtD,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAW,MAAO,EAAO,QAAQ,IACrC,EAAO,SAAS,IAAI,CAClB,SAAU,CAAE,UAAW,EAAK,QAAQ,EAAO,UAAU,EAAM,UAAW,IAAM,QAAQ,IAAI,CAAC,CAAC,CAAE,CAC9F,CAAC,CACH,EACM,EAAW,MAAO,EAAO,QAAQ,IACrC,MAAM,IAAI,IAAI,sBAAuB,EAAO,SAAS,GAAG,EAAG,CACzD,OAAQ,OACR,QAAS,IAAK,EAAQ,QAAQ,EAAO,QAAQ,EAAG,eAAgB,kBAAmB,EACnF,KAAM,KAAK,UAAU,IAChB,EACH,SAAU,CAAE,UAAW,EAAS,UAAW,YAAa,EAAS,WAAY,CAC/E,CAAC,CACH,CAAC,CACH,EACA,GAAI,EAAS,SAAW,IAAK,CAC3B,QAAQ,OAAO,MAAM,yBAAyB,GAAK,EACnD,OAEF,GAAI,CAAC,EAAS,GAAI,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAS,YAAY,CAAC,EAClG,IAAM,EAAW,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAO,OAAO,CAAE,KAAM,EAAQ,IAAK,CAAC,CAAC,CAAC,EAC7G,MAAO,EAAO,QAAQ,IAAM,EAAS,KAAK,CAAC,CAC7C,EACA,QAAQ,OAAO,MAAM,qBAAqB,EAAS,KAAK,KAAK,GAAK,EACnE,CACH", | ||
| "debugId": "86107E04F287B1DE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write(\n (yield* ServiceConfig.get(Option.getOrUndefined(input.key), Option.getOrUndefined(input.name))) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";02BAAA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,QAAQ,OAAO,OACZ,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,EAAG,EAAO,eAAe,EAAM,IAAI,CAAC,GAAK,CACpG,EACD,CACH", | ||
| "debugId": "EC50ADA0955B59A364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/session.shared.ts", "../tui/src/mini/variant.shared.ts", "../tui/src/mini/theme.ts", "../tui/src/mini/mono.ts"], | ||
| "sourcesContent": [ | ||
| "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 signal?: AbortSignal,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }, ...requestOptions(signal)),\n sdk.session.get({ sessionID }, ...requestOptions(signal)),\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\nfunction requestOptions(signal?: AbortSignal): [] | [{ signal: AbortSignal }] {\n return signal ? [{ signal }] : []\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", | ||
| "// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > valid session history > saved preference.\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 { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\nimport { cycleModelVariant, normalizeModelVariant } from \"../model-preference\"\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 return cycleModelVariant(current, variants)\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 const normalized = normalizeModelVariant(value)\n return normalized && (variants.length === 0 || variants.includes(normalized)) ? normalized : undefined\n}\n\n// Picks the active variant. CLI flag wins, then valid session history, then the\n// saved preference. Saved and session values are dropped when the provider no\n// longer offers them.\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 normalizeModelVariant(input)\n }\n\n return fitVariant(session, variants) ?? fitVariant(saved, variants)\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/v1/tui\"\nimport { ansiToRgba } from \"../theme/color\"\nimport { resolveThemeColors } from \"../theme/resolve\"\nimport { terminalMode } from \"../theme/system\"\nimport type { ThemeV1Json } from \"../theme/v1\"\nimport type { EntryKind, RunTuiConfig } 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}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: 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 text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\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\">\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 colorMode(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 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: ThemeV1Json, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const resolved = resolveThemeColors(theme, pick, (code) => RGBA.fromIndex(code, ansiToRgba(code)))\n return {\n ...resolved.theme,\n thinkingOpacity: resolved.thinkingOpacity,\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\"): ThemeV1Json {\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 }\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 = colorMode(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.13 : 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 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 text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\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 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 },\n block: {\n text: seed.text,\n muted: seed.muted,\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\nfunction monoTheme(mode: \"dark\" | \"light\"): RunTheme {\n const foreground = RGBA.defaultForeground(mode === \"light\" ? \"#000000\" : \"#ffffff\")\n const background = RGBA.defaultBackground(mode === \"light\" ? \"#ffffff\" : \"#000000\")\n return {\n background,\n footer: {\n highlight: foreground,\n selected: background,\n selectedText: foreground,\n warning: foreground,\n error: foreground,\n muted: foreground,\n text: foreground,\n status: background,\n statusAccent: background,\n shade: background,\n surface: background,\n pane: background,\n border: foreground,\n line: background,\n },\n entry: {\n system: tone(foreground),\n user: tone(foreground),\n assistant: tone(foreground),\n reasoning: tone(foreground),\n tool: tone(foreground),\n error: tone(foreground),\n },\n splash: {\n left: foreground,\n right: foreground,\n leftShadow: background,\n },\n block: {\n text: foreground,\n muted: foreground,\n diffRemoved: foreground,\n diffAddedBg: background,\n diffRemovedBg: background,\n diffContextBg: background,\n diffHighlightAdded: foreground,\n diffHighlightRemoved: foreground,\n diffLineNumber: foreground,\n diffAddedLineNumberBg: background,\n diffRemovedLineNumberBg: background,\n },\n }\n}\n\nexport const RUN_THEME_MONO = monoTheme(\"dark\")\nconst RUN_THEME_MONO_LIGHT = monoTheme(\"light\")\n\nexport async function resolveRunTheme(\n renderer: CliRenderer,\n config?: RunTuiConfig[\"theme\"],\n mono = false,\n): Promise<RunTheme> {\n if (mono) {\n const mode =\n config?.mode === \"light\" || config?.mode === \"dark\"\n ? config.mode\n : (renderer.themeMode ?? (await renderer.waitForThemeMode(300)))\n return mode === \"light\" ? RUN_THEME_MONO_LIGHT : RUN_THEME_MONO\n }\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 =\n config?.mode === \"dark\" || config?.mode === \"light\"\n ? config.mode\n : (terminalMode(colors) ?? renderer.themeMode ?? colorMode(RGBA.fromHex(bg)))\n const { generateSyntax } = await import(\"../theme\")\n const indexed = indexedPalette(colors, 256)\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n return map(footerTheme, scrollbackTheme, splashTheme(scrollbackTheme, indexed), generateSyntax(syntaxTheme))\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n", | ||
| "import {\n BoxRenderable,\n CodeRenderable,\n MarkdownRenderable,\n RGBA,\n Renderable,\n StyledText,\n TextRenderable,\n TextTableRenderable,\n isStyledText,\n stringToStyledText,\n type BorderCharacters,\n type CliRendererExternalOutputEvent,\n type TreeSitterClient,\n} from \"@opentui/core\"\n\nconst prefixes: Record<number, string> = {\n 0x2192: \"->\",\n 0x2190: \"<-\",\n 0x2731: \"*\",\n 0x2699: \"*\",\n 0x2716: \"!\",\n 0x2717: \"!\",\n 0x25c8: \"*\",\n 0x25c9: \"*\",\n 0x27f3: \"*\",\n}\n\nconst markdown: Record<number, string> = {\n ...prefixes,\n 0x00a0: \" \",\n 0x00b7: \"-\",\n 0x2010: \"-\",\n 0x2011: \"-\",\n 0x2012: \"-\",\n 0x2013: \"-\",\n 0x2014: \"--\",\n 0x2018: \"'\",\n 0x2019: \"'\",\n 0x201c: '\"',\n 0x201d: '\"',\n 0x2022: \"*\",\n 0x2026: \"...\",\n 0x2191: \"up\",\n 0x2193: \"down\",\n}\n\nconst asciiBorder: BorderCharacters = {\n topLeft: \"+\",\n topRight: \"+\",\n bottomLeft: \"+\",\n bottomRight: \"+\",\n horizontal: \"-\",\n vertical: \"|\",\n topT: \"+\",\n bottomT: \"+\",\n leftT: \"+\",\n rightT: \"+\",\n cross: \"+\",\n}\n\nconst hooked = new WeakSet<Renderable>()\n\nexport const monoMarkdownTableOptions = {\n style: \"columns\" as const,\n widthMode: \"content\" as const,\n borders: false,\n}\n\nexport function monoMarkdownRenderable(renderable: MarkdownRenderable): void {\n monoRenderable(renderable)\n}\n\nfunction monoRenderable(renderable: Renderable): void {\n if (hooked.has(renderable)) return\n hooked.add(renderable)\n // Markdown reconciles nested lists and tables without calling renderNode.\n // Hook the actual tree so future descendants are transformed before layout.\n const add = renderable.add.bind(renderable)\n renderable.add = (child, index) => {\n if (child instanceof Renderable) monoRenderable(child)\n return add(child, index)\n }\n\n if (renderable instanceof BoxRenderable) renderable.customBorderChars = asciiBorder\n if (renderable instanceof CodeRenderable) monoCode(renderable)\n if (renderable instanceof TextRenderable) renderable.content = monoStyledText(renderable.content)\n if (renderable instanceof TextTableRenderable) monoTable(renderable)\n renderable.getChildren().forEach(monoRenderable)\n}\n\nfunction monoCode(renderable: CodeRenderable): void {\n const onChunks = renderable.onChunks\n renderable.onChunks = async (chunks, context) => monoChunks((await onChunks?.(chunks, context)) ?? chunks)\n renderable.treeSitterClient = monoTreeSitter(renderable.treeSitterClient)\n\n const initialDescriptor = Object.getOwnPropertyDescriptor(CodeRenderable.prototype, \"initialStyledText\")\n const contentDescriptor = Object.getOwnPropertyDescriptor(CodeRenderable.prototype, \"content\")\n if (!initialDescriptor?.set || !contentDescriptor?.get || !contentDescriptor.set) return\n const initialSetter = initialDescriptor.set.bind(renderable)\n const contentGetter = contentDescriptor.get.bind(renderable)\n const contentSetter = contentDescriptor.set.bind(renderable)\n const initial = Reflect.get(renderable, \"_initialStyledText\")\n Object.defineProperty(renderable, \"initialStyledText\", {\n configurable: true,\n set(value: StyledText | undefined) {\n initialSetter(value ? monoStyledText(value) : value)\n },\n })\n Object.defineProperty(renderable, \"content\", {\n configurable: true,\n get: contentGetter,\n set(value: string) {\n if (renderable.filetype !== \"markdown\" || !isStyledText(Reflect.get(renderable, \"_initialStyledText\"))) {\n renderable.drawUnstyledText = true\n renderable.initialStyledText = stringToStyledText(value)\n }\n contentSetter(renderable.filetype === \"markdown\" ? value : monoText(value))\n },\n })\n\n if (isStyledText(initial)) {\n renderable.initialStyledText = initial\n } else {\n renderable.drawUnstyledText = true\n renderable.initialStyledText = stringToStyledText(renderable.content)\n }\n if (!renderable.drawUnstyledText) return\n\n // Refresh the eager buffer with the transformed initial text. Highlighted\n // chunks continue through onChunks without changing the Markdown source.\n const content = renderable.content\n renderable.content = \"\"\n renderable.content = content\n}\n\nfunction monoTreeSitter(client: TreeSitterClient): TreeSitterClient {\n return new Proxy(client, {\n get(target, property) {\n if (property !== \"highlightOnce\") return Reflect.get(target, property, target)\n // Keep parser failures on the chunk path instead of OpenTUI's raw-text fallback.\n return (...args: Parameters<TreeSitterClient[\"highlightOnce\"]>) =>\n target.highlightOnce(...args).catch(() => ({ highlights: [] }))\n },\n })\n}\n\nfunction monoTable(renderable: TextTableRenderable): void {\n const descriptor = Object.getOwnPropertyDescriptor(TextTableRenderable.prototype, \"content\")\n if (!descriptor?.get || !descriptor.set) return\n const cells = new WeakMap<StyledText[\"chunks\"], StyledText[\"chunks\"]>()\n const content = renderable.content\n Object.defineProperty(renderable, \"content\", {\n configurable: true,\n get: () => descriptor.get!.call(renderable),\n set: (value: TextTableRenderable[\"content\"]) => {\n descriptor.set!.call(\n renderable,\n value.map((row) =>\n row.map((cell) => {\n if (!cell) return cell\n const cached = cells.get(cell)\n if (cached) return cached\n const next = monoChunks(cell)\n cells.set(cell, next)\n return next\n }),\n ),\n )\n },\n })\n renderable.content = content\n}\n\nfunction monoStyledText(value: StyledText): StyledText {\n return new StyledText(monoChunks(value.chunks))\n}\n\nfunction monoChunks(value: StyledText[\"chunks\"]): StyledText[\"chunks\"] {\n return value.map((chunk) => ({ ...chunk, text: monoText(chunk.text) }))\n}\n\nfunction monoText(value: string): string {\n return value.replace(/[^\\t\\n\\x20-\\x7e]/gu, (char) => markdown[char.codePointAt(0)!] ?? \"?\")\n}\n\nexport function monoSnapshot(event: CliRendererExternalOutputEvent): void {\n const buffers = event.snapshot.buffers\n const chars = buffers.char\n for (let index = 0; index < chars.length; index += 1) {\n const point = chars[index]\n if (point <= 0x7f) continue\n const offset = index * 4\n event.snapshot.setCell(\n index % event.snapshot.width,\n Math.floor(index / event.snapshot.width),\n monoCell(point),\n RGBA.fromArray(buffers.fg.subarray(offset, offset + 4)),\n RGBA.fromArray(buffers.bg.subarray(offset, offset + 4)),\n buffers.attributes[index],\n )\n }\n}\n\nfunction monoCell(point: number): string {\n const kind = point >>> 30\n if (kind === 2) return \"?\"\n if (kind === 3) return \" \"\n if (point === 0x2500) return \"-\"\n if (point === 0x2502) return \"|\"\n return markdown[point]?.[0] ?? \"?\"\n}\n\nexport function monoPrefix(value: string, mono: boolean): string {\n if (!mono) return value\n const point = value.codePointAt(0)\n if (point === undefined) return value\n const prefix = prefixes[point]\n if (!prefix) return value\n return prefix + value.slice(point > 0xffff ? 2 : 1)\n}\n\nexport function monoToolText(value: string, mono: boolean): string {\n const result = monoPrefix(value, mono)\n if (!mono) return result\n const separator = ` ${String.fromCodePoint(0xb7)} `\n const index = result.lastIndexOf(separator)\n if (index === -1) return result\n const head = result.slice(0, index)\n if (!head.includes(\" completed\") && head !== \"patch\" && !/^\\d+ questions$/.test(head)) return result\n return result.slice(0, index) + \" - \" + result.slice(index + separator.length)\n}\n\nexport function monoShortcut(value: string, mono: boolean): string {\n if (!mono) return value\n return value\n .replaceAll(String.fromCodePoint(0x2192), \"right\")\n .replaceAll(String.fromCodePoint(0x2190), \"left\")\n .replaceAll(String.fromCodePoint(0x2191), \"up\")\n .replaceAll(String.fromCodePoint(0x2193), \"down\")\n}\n\nexport function monoTruncate(value: string, width: number, mono: boolean): string {\n if (!mono || value.length <= width) return value\n if (width <= 3) return \".\".repeat(Math.max(0, width))\n return value.slice(0, width - 3) + \"...\"\n}\n\nexport function monoTruncateMiddle(value: string, width: number, mono: boolean): string {\n if (!mono || value.length <= width) return value\n if (width <= 3) return \".\".repeat(Math.max(0, width))\n const available = width - 3\n const left = Math.ceil(available / 2)\n return value.slice(0, left) + \"...\" + value.slice(value.length - (available - left))\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "26B393D4BA1360F864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/start.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,EAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "8B75BC5F9789FA7764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/@opentui+core-linux-x64@0.5.6/node_modules/@opentui/core-linux-x64/index.bun.js"], | ||
| "sourcesContent": [ | ||
| "const module = await import(\"./libopentui.so\", { with: { type: \"file\" } })\n\nexport default module.default\n" | ||
| ], | ||
| "mappings": ";oDAAA,IAAM,EAAS,KAAa,yCAAmB,CAAE,KAAM,CAAE,KAAM,MAAO,CAAE,GAEzD,IAAO", | ||
| "debugId": "D79B6AC0F23147EB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\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 ...(server ? { answer: { server } } : {}),\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\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": "9399DD36864345BC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "E1E384694C2E355C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "688F150A39C4103964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value, Option.getOrUndefined(input.nestedValue))\n }),\n)\n" | ||
| ], | ||
| "mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,MAAO,EAAO,eAAe,EAAM,WAAW,CAAC,EAC1F,CACH", | ||
| "debugId": "0417BEFB190D3DD164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/export.ts"], | ||
| "sourcesContent": [ | ||
| "import { autocomplete, cancel, intro, isCancel, log, outro } from \"@clack/prompts\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { errorMessage } from \"../../ui/prompt\"\n\nexport default Runtime.handler(\n Commands.commands.export,\n Effect.fn(\"cli.export\")((input) =>\n Effect.gen(function* () {\n const requested = Option.getOrUndefined(input.session)\n if (!requested && !process.stdin.isTTY) {\n yield* Effect.fail(new Error(\"Pass a session ID when running without an interactive terminal\"))\n }\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const sessionID = requested\n ? requested\n : yield* Effect.gen(function* () {\n intro(\"Export session\", { output: process.stderr })\n const location = yield* Effect.tryPromise({\n try: () => client.location.get({ location: { directory: process.cwd() } }),\n catch: (cause) => cause,\n })\n const page = yield* Effect.tryPromise({\n try: () =>\n client.session.list({\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n order: \"desc\",\n limit: 50,\n }),\n catch: (cause) => cause,\n })\n if (page.data.length === 0) {\n log.error(\"No sessions found\", { output: process.stderr })\n outro(\"Done\", { output: process.stderr })\n return undefined\n }\n const selected = yield* Effect.tryPromise({\n try: () =>\n autocomplete({\n message: \"Select session to export\",\n maxItems: 10,\n options: page.data.map((session) => ({\n label: session.title,\n value: session.id,\n hint: `${new Date(session.time.updated).toLocaleString()} - ${session.id.slice(-8)}`,\n })),\n output: process.stderr,\n }),\n catch: (cause) => cause,\n })\n if (isCancel(selected)) {\n cancel(\"Cancelled\", { output: process.stderr })\n process.exitCode = 130\n return undefined\n }\n outro(\"Exporting session...\", { output: process.stderr })\n return selected\n })\n if (!sessionID) return\n const data = yield* Effect.tryPromise({\n try: () => client.session.export({ sessionID, sanitize: input.sanitize }),\n catch: (cause) => cause,\n })\n process.stdout.write(JSON.stringify(data, null, 2) + EOL)\n }).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n ),\n)\n" | ||
| ], | ||
| "mappings": ";2qCAIA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,CAAC,IACvB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAY,EAAO,eAAe,EAAM,OAAO,EACrD,GAAI,CAAC,GAAa,CAAC,QAAQ,MAAM,MAC/B,MAAO,EAAO,KAAS,MAAM,gEAAgE,CAAC,EAEhG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAY,EACd,EACA,MAAO,EAAO,IAAI,SAAU,EAAG,CAC7B,EAAM,iBAAkB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAClD,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IAAM,EAAO,SAAS,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,EACzE,MAAO,CAAC,IAAU,CACpB,CAAC,EACK,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAO,QAAQ,KAAK,CAClB,UAAW,EAAS,UACpB,UAAW,EAAS,YACpB,SAAU,KACV,MAAO,OACP,MAAO,EACT,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAK,KAAK,SAAW,EAAG,CAC1B,EAAI,MAAM,oBAAqB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACzD,EAAM,OAAQ,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACxC,OAEF,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IACH,EAAa,CACX,QAAS,2BACT,SAAU,GACV,QAAS,EAAK,KAAK,IAAI,CAAC,KAAa,CACnC,MAAO,EAAQ,MACf,MAAO,EAAQ,GACf,KAAM,GAAG,IAAI,KAAK,EAAQ,KAAK,OAAO,EAAE,eAAe,OAAO,EAAQ,GAAG,MAAM,EAAE,GACnF,EAAE,EACF,OAAQ,QAAQ,MAClB,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAS,CAAQ,EAAG,CACtB,EAAO,YAAa,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAC9C,QAAQ,SAAW,IACnB,OAGF,OADA,EAAM,uBAAwB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACjD,EACR,EACL,GAAI,CAAC,EAAW,OAChB,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IAAM,EAAO,QAAQ,OAAO,CAAE,YAAW,SAAU,EAAM,QAAS,CAAC,EACxE,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAM,KAAM,CAAC,EAAI,CAAG,EACzD,EAAE,KACD,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,CACF", | ||
| "debugId": "0594932C512C104C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { autocomplete, intro, outro, spinner } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { IntegrationInfo } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { createClient, loadIntegrations, location, request, resolveIntegration } from \"./shared\"\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.logout,\n Effect.fn(\"cli.auth.logout\")((input) =>\n logout({\n target: Option.getOrUndefined(input.target),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst logout = Effect.fn(\"cli.auth.logout.run\")(function* (input: {\n target?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Remove credential\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integrations = yield* loadIntegrations(client)\n const integration = yield* chooseIntegration(integrations, input.target)\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n const environment = integration.connections\n .filter((connection) => connection.type === \"env\")\n .map((connection) => connection.name)\n if (environment.length) {\n yield* Effect.fail(\n new Error(\n `${integration.name} is authenticated through ${environment.join(\", \")}; unset the environment variable to disconnect`,\n ),\n )\n }\n yield* Effect.fail(new Error(`No stored credentials for ${integration.name}`))\n }\n const progress = spinner()\n progress.start(\"Removing credential...\")\n yield* Effect.forEach(\n credentials,\n (connection) =>\n request((signal) => client.credential.remove({ credentialID: connection.id, location }, { signal })),\n { concurrency: \"unbounded\", discard: true },\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Disconnected from ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Failed to remove credential\", 1))),\n )\n outro(\"Done\")\n})\n\nconst chooseIntegration = Effect.fn(\"cli.auth.logout.integration\")(function* (\n integrations: IntegrationInfo[],\n target?: string,\n) {\n if (target) return yield* resolveIntegration(integrations, target)\n const configured = integrations.filter((integration) =>\n integration.connections.some((connection) => connection.type === \"credential\"),\n )\n if (configured.length === 0) return yield* Effect.fail(new Error(\"No stored credentials found\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: configured.map((integration) => ({\n value: integration.id,\n label: integration.name,\n hint: integration.connections\n .filter((connection) => connection.type === \"credential\")\n .map((connection) => connection.label)\n .join(\", \"),\n })),\n }),\n )\n return yield* resolveIntegration(configured, id)\n})\n" | ||
| ], | ||
| "mappings": ";wtCAQA,IAAe,IAAQ,QACrB,EAAS,SAAS,KAAK,SAAS,OAChC,EAAO,GAAG,iBAAiB,EAAE,CAAC,IAC5B,EAAO,CACL,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EAAE,KAAK,CAAkB,CAC5B,CACF,EAEM,EAAS,EAAO,GAAG,qBAAqB,EAAE,SAAU,CAAC,EAIxD,CACD,GAAI,CAAC,EAAM,OACT,MAAO,EAAmB,6EAA6E,EACzG,EAAM,mBAAmB,EACzB,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAM,OAAQ,WAAY,EAAM,UAAW,CAAC,EACnF,EAAe,MAAO,EAAiB,CAAM,EAC7C,EAAc,MAAO,EAAkB,EAAc,EAAM,MAAM,EACjE,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,IAAM,EAAc,EAAY,YAC7B,OAAO,CAAC,IAAe,EAAW,OAAS,KAAK,EAChD,IAAI,CAAC,IAAe,EAAW,IAAI,EACtC,GAAI,EAAY,OACd,MAAO,EAAO,KACR,MACF,GAAG,EAAY,iCAAiC,EAAY,KAAK,IAAI,iDACvE,CACF,EAEF,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAY,MAAM,CAAC,EAE/E,IAAM,EAAW,EAAQ,EACzB,EAAS,MAAM,wBAAwB,EACvC,MAAO,EAAO,QACZ,EACA,CAAC,IACC,EAAQ,CAAC,IAAW,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EACrG,CAAE,YAAa,YAAa,QAAS,EAAK,CAC5C,EAAE,KACA,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,qBAAqB,EAAY,MAAM,CAAC,CAAC,EAC1F,EAAO,SAAS,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,8BAA+B,CAAC,CAAC,CAAC,CAC1F,EACA,EAAM,MAAM,EACb,EAEK,EAAoB,EAAO,GAAG,6BAA6B,EAAE,SAAU,CAC3E,EACA,EACA,CACA,GAAI,EAAQ,OAAO,MAAO,EAAmB,EAAc,CAAM,EACjE,IAAM,EAAa,EAAa,OAAO,CAAC,IACtC,EAAY,YAAY,KAAK,CAAC,IAAe,EAAW,OAAS,YAAY,CAC/E,EACA,GAAI,EAAW,SAAW,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,6BAA6B,CAAC,EAC/F,IAAM,EAAK,MAAO,EAAe,IAC/B,EAAa,CACX,QAAS,qBACT,SAAU,EACV,QAAS,EAAW,IAAI,CAAC,KAAiB,CACxC,MAAO,EAAY,GACnB,MAAO,EAAY,KACnB,KAAM,EAAY,YACf,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACvD,IAAI,CAAC,IAAe,EAAW,KAAK,EACpC,KAAK,IAAI,CACd,EAAE,CACJ,CAAC,CACH,EACA,OAAO,MAAO,EAAmB,EAAY,CAAE,EAChD", | ||
| "debugId": "90AAAFFA840EF49064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "DF25A290C849EF4764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key, Option.getOrUndefined(input.name))\n }),\n)\n" | ||
| ], | ||
| "mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,MAAO,EAAc,MAAM,EAAM,IAAK,EAAO,eAAe,EAAM,IAAI,CAAC,EACxE,CACH", | ||
| "debugId": "A1CEECC7CFEEDC6A64756E2164756E21", | ||
| "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": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAU,MAAO,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,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": "8B11EF34D882177364756E2164756E21", | ||
| "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": "39BBAE9AAA8FD6A264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "6B1E26A701BCF02E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/status.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,OACnC,EAAO,GAAG,oBAAoB,EAAE,SAAU,EAAG,CAC3C,IAAM,EAAU,MAAO,EAAc,QAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "CDAFBE7661FCD75864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const mismatch = args.mismatch ?? \"ignore\"\n const options = yield* ServiceConfig.options({ checkVersion: mismatch !== \"ignore\" })\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, mismatch),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (options: EnsureOptions, mismatch: NonNullable<Args[\"mismatch\"]>) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": ";6eAoBO,IAAM,EAAU,EAAO,GAAG,+BAA+B,EAAE,SAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAW,EAAK,UAAY,SAC5B,EAAU,MAAO,EAAc,QAAQ,CAAE,aAAc,IAAa,QAAS,CAAC,EACpF,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,CAAQ,EAC/E,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CAAC,EAAwB,EAAyC,CACnH,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC", | ||
| "debugId": "418E45C48F9CA60964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/@opentui+core@0.5.6+2240c214a0f33214/node_modules/@opentui/core/testing.bun.js"], | ||
| "sourcesContent": [ | ||
| "// @bun\nimport {\n ANSI,\n CliRenderer\n} from \"./chunk-bun-da1keqyp.js\";\nimport {\n SystemClock,\n TreeSitterClient\n} from \"./chunk-bun-9335djz2.js\";\n\n// src/testing/mock-keys.ts\nimport { Buffer as Buffer2 } from \"buffer\";\nfunction pasteBytes(text) {\n return Uint8Array.from(Buffer2.from(text));\n}\nvar KeyCodes = {\n RETURN: \"\\r\",\n LINEFEED: `\n`,\n TAB: \"\\t\",\n BACKSPACE: \"\\b\",\n DELETE: \"\\x1B[3~\",\n HOME: \"\\x1B[H\",\n END: \"\\x1B[F\",\n ESCAPE: \"\\x1B\",\n ARROW_UP: \"\\x1B[A\",\n ARROW_DOWN: \"\\x1B[B\",\n ARROW_RIGHT: \"\\x1B[C\",\n ARROW_LEFT: \"\\x1B[D\",\n F1: \"\\x1BOP\",\n F2: \"\\x1BOQ\",\n F3: \"\\x1BOR\",\n F4: \"\\x1BOS\",\n F5: \"\\x1B[15~\",\n F6: \"\\x1B[17~\",\n F7: \"\\x1B[18~\",\n F8: \"\\x1B[19~\",\n F9: \"\\x1B[20~\",\n F10: \"\\x1B[21~\",\n F11: \"\\x1B[23~\",\n F12: \"\\x1B[24~\"\n};\nvar kittyKeyCodeMap = {\n escape: 27,\n tab: 9,\n return: 13,\n backspace: 127,\n insert: 57348,\n delete: 57349,\n left: 57350,\n right: 57351,\n up: 57352,\n down: 57353,\n pageup: 57354,\n pagedown: 57355,\n home: 57356,\n end: 57357,\n f1: 57364,\n f2: 57365,\n f3: 57366,\n f4: 57367,\n f5: 57368,\n f6: 57369,\n f7: 57370,\n f8: 57371,\n f9: 57372,\n f10: 57373,\n f11: 57374,\n f12: 57375\n};\nfunction encodeKittySequence(codepoint, modifiers) {\n let modMask = 0;\n if (modifiers?.shift)\n modMask |= 1;\n if (modifiers?.meta)\n modMask |= 2;\n if (modifiers?.ctrl)\n modMask |= 4;\n if (modifiers?.super)\n modMask |= 8;\n if (modifiers?.hyper)\n modMask |= 16;\n if (modMask === 0) {\n return `\\x1B[${codepoint}u`;\n } else {\n return `\\x1B[${codepoint};${modMask + 1}u`;\n }\n}\nfunction encodeModifyOtherKeysSequence(charCode, modifiers) {\n let modMask = 0;\n if (modifiers?.shift)\n modMask |= 1;\n if (modifiers?.meta)\n modMask |= 2;\n if (modifiers?.ctrl)\n modMask |= 4;\n if (modifiers?.super)\n modMask |= 8;\n if (modifiers?.hyper)\n modMask |= 16;\n if (modMask === 0) {\n return String.fromCharCode(charCode);\n }\n return `\\x1B[27;${modMask + 1};${charCode}~`;\n}\nfunction resolveKeyInput(key) {\n let keyValue;\n let keyName;\n if (typeof key === \"string\") {\n if (key in KeyCodes) {\n keyValue = KeyCodes[key];\n keyName = key.toLowerCase();\n } else {\n keyValue = key;\n keyName = undefined;\n }\n } else {\n keyValue = KeyCodes[key];\n if (!keyValue) {\n throw new Error(`Unknown key: ${key}`);\n }\n keyName = String(key).toLowerCase();\n }\n return { keyValue, keyName };\n}\nfunction createMockKeys(renderer, options) {\n const useKittyKeyboard = options?.kittyKeyboard ?? false;\n const useOtherModifiersMode = options?.otherModifiersMode ?? false;\n const effectiveOtherModifiersMode = useOtherModifiersMode && !useKittyKeyboard;\n const pressKeys = async (keys, delayMs = 0) => {\n for (const key of keys) {\n const { keyValue: keyCode } = resolveKeyInput(key);\n renderer.stdin.emit(\"data\", Buffer2.from(keyCode));\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n };\n const pressKey = (key, modifiers) => {\n if (useKittyKeyboard) {\n let { keyValue, keyName } = resolveKeyInput(key);\n const valueToKeyNameMap = {\n \"\\b\": \"backspace\",\n \"\\r\": \"return\",\n \"\\n\": \"return\",\n \"\\t\": \"tab\",\n \"\\x1B\": \"escape\",\n \"\\x1B[A\": \"up\",\n \"\\x1B[B\": \"down\",\n \"\\x1B[C\": \"right\",\n \"\\x1B[D\": \"left\",\n \"\\x1B[H\": \"home\",\n \"\\x1B[F\": \"end\",\n \"\\x1B[3~\": \"delete\"\n };\n if (keyValue && valueToKeyNameMap[keyValue]) {\n keyName = valueToKeyNameMap[keyValue];\n }\n if (keyName && keyName.startsWith(\"arrow_\")) {\n keyName = keyName.substring(6);\n }\n if (keyName && kittyKeyCodeMap[keyName]) {\n const kittyCode = kittyKeyCodeMap[keyName];\n const sequence = encodeKittySequence(kittyCode, modifiers);\n renderer.stdin.emit(\"data\", Buffer2.from(sequence));\n return;\n }\n if (keyValue && keyValue.length === 1 && !keyValue.startsWith(\"\\x1B\")) {\n const codepoint = keyValue.codePointAt(0);\n if (codepoint) {\n const sequence = encodeKittySequence(codepoint, modifiers);\n renderer.stdin.emit(\"data\", Buffer2.from(sequence));\n return;\n }\n }\n }\n if (effectiveOtherModifiersMode && modifiers) {\n let { keyValue, keyName } = resolveKeyInput(key);\n const valueToCharCodeMap = {\n \"\\b\": 127,\n \"\\r\": 13,\n \"\\n\": 13,\n \"\\t\": 9,\n \"\\x1B\": 27,\n \" \": 32\n };\n let charCode;\n if (keyValue && valueToCharCodeMap[keyValue] !== undefined) {\n charCode = valueToCharCodeMap[keyValue];\n } else if (keyValue && keyValue.length === 1 && !keyValue.startsWith(\"\\x1B\")) {\n charCode = keyValue.charCodeAt(0);\n }\n if (charCode !== undefined) {\n const sequence = encodeModifyOtherKeysSequence(charCode, modifiers);\n renderer.stdin.emit(\"data\", Buffer2.from(sequence));\n return;\n }\n }\n let keyCode = resolveKeyInput(key).keyValue;\n if (modifiers) {\n if (keyCode.startsWith(\"\\x1B[\") && keyCode.length > 2) {\n const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.meta ? 2 : 0) + (modifiers.ctrl ? 4 : 0) + (modifiers.super ? 8 : 0) + (modifiers.hyper ? 16 : 0);\n if (modifier > 1) {\n const tildeMatch = keyCode.match(/^\\x1b\\[(\\d+)~$/);\n if (tildeMatch) {\n keyCode = `\\x1B[${tildeMatch[1]};${modifier}~`;\n } else {\n const ending = keyCode.slice(-1);\n keyCode = `\\x1B[1;${modifier}${ending}`;\n }\n }\n } else if (keyCode.length === 1) {\n let char = keyCode;\n if (char === \"\\t\" && modifiers.shift) {\n keyCode = modifiers.meta ? \"\\x1B\\x1B[Z\" : \"\\x1B[Z\";\n renderer.stdin.emit(\"data\", Buffer2.from(keyCode));\n return;\n }\n if (char === \"\\b\" && (modifiers.ctrl || modifiers.super || modifiers.hyper)) {\n const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.meta ? 2 : 0) + (modifiers.ctrl ? 4 : 0) + (modifiers.super ? 8 : 0) + (modifiers.hyper ? 16 : 0);\n keyCode = `\\x1B[27;${modifier};127~`;\n } else if (modifiers.ctrl) {\n if (char >= \"a\" && char <= \"z\") {\n keyCode = String.fromCharCode(char.charCodeAt(0) - 96);\n } else if (char >= \"A\" && char <= \"Z\") {\n keyCode = String.fromCharCode(char.charCodeAt(0) - 64);\n } else {\n const specialCtrlMap = {\n \"[\": \"\\x1B\",\n \"\\\\\": \"\\x1C\",\n \"]\": \"\\x1D\",\n \"^\": \"\\x1E\",\n _: \"\\x1F\",\n \"?\": \"\\x7F\",\n \"/\": \"\\x1F\",\n \"-\": \"\\x1F\",\n \".\": \"\\x1E\",\n \",\": \"\\x1C\",\n \"@\": \"\\x00\",\n \" \": \"\\x00\"\n };\n if (char in specialCtrlMap) {\n keyCode = specialCtrlMap[char];\n }\n }\n if (modifiers.meta) {\n keyCode = `\\x1B${keyCode}`;\n }\n } else {\n if (modifiers.shift && char >= \"a\" && char <= \"z\") {\n char = char.toUpperCase();\n }\n if (modifiers.meta) {\n keyCode = `\\x1B${char}`;\n } else {\n keyCode = char;\n }\n }\n } else if (modifiers.meta && !keyCode.startsWith(\"\\x1B\")) {\n keyCode = `\\x1B${keyCode}`;\n }\n }\n renderer.stdin.emit(\"data\", Buffer2.from(keyCode));\n };\n const typeText = async (text, delayMs = 0) => {\n const keys = text.split(\"\");\n await pressKeys(keys, delayMs);\n };\n const pressReturn = (modifiers) => {\n pressKey(KeyCodes.RETURN, modifiers);\n };\n const pressEscape = (modifiers) => {\n pressKey(KeyCodes.ESCAPE, modifiers);\n };\n const pressTab = (modifiers) => {\n pressKey(KeyCodes.TAB, modifiers);\n };\n const pressBackspace = (modifiers) => {\n pressKey(KeyCodes.BACKSPACE, modifiers);\n };\n const pressArrow = (direction, modifiers) => {\n const keyMap = {\n up: KeyCodes.ARROW_UP,\n down: KeyCodes.ARROW_DOWN,\n left: KeyCodes.ARROW_LEFT,\n right: KeyCodes.ARROW_RIGHT\n };\n pressKey(keyMap[direction], modifiers);\n };\n const pressCtrlC = () => {\n pressKey(\"c\", { ctrl: true });\n };\n const pasteBracketedText = (text) => {\n return pressKeys([ANSI.bracketedPasteStart, text, ANSI.bracketedPasteEnd]);\n };\n return {\n pressKeys,\n pressKey,\n typeText,\n pressEnter: pressReturn,\n pressEscape,\n pressTab,\n pressBackspace,\n pressArrow,\n pressCtrlC,\n pasteBracketedText\n };\n}\n\n// src/testing/mock-mouse.ts\nvar MouseButtons = {\n LEFT: 0,\n MIDDLE: 1,\n RIGHT: 2,\n WHEEL_UP: 64,\n WHEEL_DOWN: 65,\n WHEEL_LEFT: 66,\n WHEEL_RIGHT: 67\n};\nfunction createMockMouse(renderer) {\n let currentPosition = { x: 0, y: 0 };\n let buttonsPressed = new Set;\n const generateMouseEvent = (type, x, y, button = MouseButtons.LEFT, modifiers = {}) => {\n let buttonCode = button;\n if (modifiers.shift)\n buttonCode |= 4;\n if (modifiers.alt)\n buttonCode |= 8;\n if (modifiers.ctrl)\n buttonCode |= 16;\n switch (type) {\n case \"move\":\n buttonCode = 32 | 3;\n if (modifiers.shift)\n buttonCode |= 4;\n if (modifiers.alt)\n buttonCode |= 8;\n if (modifiers.ctrl)\n buttonCode |= 16;\n break;\n case \"drag\":\n buttonCode = (buttonsPressed.size > 0 ? Array.from(buttonsPressed)[0] : button) | 32;\n if (modifiers.shift)\n buttonCode |= 4;\n if (modifiers.alt)\n buttonCode |= 8;\n if (modifiers.ctrl)\n buttonCode |= 16;\n break;\n case \"scroll\":\n break;\n }\n const ansiX = x + 1;\n const ansiY = y + 1;\n let pressRelease = \"M\";\n if (type === \"up\" || type === \"move\" || type === \"drag\") {\n pressRelease = \"m\";\n }\n return `\\x1B[<${buttonCode};${ansiX};${ansiY}${pressRelease}`;\n };\n const emitMouseEvent = async (type, x, y, button = MouseButtons.LEFT, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n const eventSequence = generateMouseEvent(type, x, y, button, modifiers);\n renderer.stdin.emit(\"data\", Buffer.from(eventSequence));\n currentPosition = { x, y };\n if (type === \"down\" && button < 64) {\n buttonsPressed.add(button);\n } else if (type === \"up\") {\n buttonsPressed.delete(button);\n }\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n };\n const moveTo = async (x, y, options = {}) => {\n const { button = MouseButtons.LEFT, delayMs = 0, modifiers = {} } = options;\n if (buttonsPressed.size > 0) {\n await emitMouseEvent(\"drag\", x, y, Array.from(buttonsPressed)[0], { modifiers, delayMs });\n } else {\n await emitMouseEvent(\"move\", x, y, button, { modifiers, delayMs });\n }\n currentPosition = { x, y };\n };\n const click = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { delayMs = 10, modifiers = {} } = options;\n await emitMouseEvent(\"down\", x, y, button, { modifiers, delayMs });\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n await emitMouseEvent(\"up\", x, y, button, { modifiers, delayMs });\n };\n const doubleClick = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { delayMs = 10, modifiers = {} } = options;\n await click(x, y, button, { modifiers, delayMs });\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n await click(x, y, button, { modifiers, delayMs });\n };\n const pressDown = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n await emitMouseEvent(\"down\", x, y, button, { modifiers, delayMs });\n };\n const release = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n await emitMouseEvent(\"up\", x, y, button, { modifiers, delayMs });\n };\n const drag = async (startX, startY, endX, endY, button = MouseButtons.LEFT, options = {}) => {\n const { delayMs = 10, modifiers = {} } = options;\n await pressDown(startX, startY, button, { modifiers });\n const steps = 5;\n const dx = (endX - startX) / steps;\n const dy = (endY - startY) / steps;\n for (let i = 1;i <= steps; i++) {\n const currentX = Math.round(startX + dx * i);\n const currentY = Math.round(startY + dy * i);\n await emitMouseEvent(\"drag\", currentX, currentY, button, { modifiers, delayMs });\n }\n await release(endX, endY, button, { modifiers });\n };\n const scroll = async (x, y, direction, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n let button;\n switch (direction) {\n case \"up\":\n button = MouseButtons.WHEEL_UP;\n break;\n case \"down\":\n button = MouseButtons.WHEEL_DOWN;\n break;\n case \"left\":\n button = MouseButtons.WHEEL_LEFT;\n break;\n case \"right\":\n button = MouseButtons.WHEEL_RIGHT;\n break;\n }\n await emitMouseEvent(\"scroll\", x, y, button, { modifiers, delayMs });\n };\n const getCurrentPosition = () => {\n return { ...currentPosition };\n };\n const getPressedButtons = () => {\n return Array.from(buttonsPressed);\n };\n return {\n moveTo,\n click,\n doubleClick,\n pressDown,\n release,\n drag,\n scroll,\n getCurrentPosition,\n getPressedButtons,\n emitMouseEvent\n };\n}\n\n// src/testing/test-streams.ts\nimport { Readable, Writable } from \"stream\";\n\nclass TestWriteStream extends Writable {\n isTTY = true;\n columns;\n rows;\n constructor(columns = 80, rows = 24) {\n super();\n this.columns = columns;\n this.rows = rows;\n }\n _write(_chunk, _encoding, callback) {\n callback();\n }\n getColorDepth() {\n return 24;\n }\n}\nfunction createTestStdin() {\n return new Readable({ read() {} });\n}\nfunction createTestStdout(columns = 80, rows = 24) {\n return new TestWriteStream(columns, rows);\n}\n\n// src/testing/test-renderer.ts\nvar decoder = new TextDecoder;\nvar DEFAULT_MAX_PASSES = 20;\nvar DEFAULT_MAX_VISUAL_IDLE_FRAMES = 20;\nvar DEFAULT_QUIET_FRAMES = 1;\nasync function drainImmediateWork() {\n await Promise.resolve();\n await new Promise((resolve) => process.nextTick(resolve));\n await Promise.resolve();\n}\nfunction normalizePositiveInteger(value, fallback) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n return Math.floor(value);\n}\nfunction createWaitError(renderer, message, frame) {\n const stats = renderer.getStats();\n const scheduler = renderer.getSchedulerState();\n const details = [\n message,\n `frameId: ${renderer.frameId}`,\n `nativeFrameCount: ${stats.nativeFrameCount}`,\n `cellsUpdated: ${stats.cellsUpdated}`,\n `isRunning: ${scheduler.isRunning}`,\n `isRendering: ${scheduler.isRendering}`,\n `hasScheduledRender: ${scheduler.hasScheduledRender}`\n ];\n if (frame !== undefined) {\n details.push(`lastFrame:\n${frame}`);\n }\n return new Error(details.join(`\n`));\n}\n\nclass TestExternalOutputRecorder {\n commits = [];\n constructor(renderer) {\n renderer.on(\"external_output\" /* EXTERNAL_OUTPUT */, this.record);\n renderer.once(\"destroy\" /* DESTROY */, () => {\n renderer.off(\"external_output\" /* EXTERNAL_OUTPUT */, this.record);\n });\n }\n record = (event) => {\n const raw = decoder.decode(event.snapshot.getRealCharBytes(false));\n const rows = Array.from({ length: event.snapshot.height }, (_, index) => raw.slice(index * event.snapshot.width, (index + 1) * event.snapshot.width).trimEnd());\n this.commits.push({\n text: rows.join(`\n`),\n rows,\n width: event.snapshot.width,\n height: event.snapshot.height,\n rowColumns: event.rowColumns,\n startOnNewLine: event.startOnNewLine,\n trailingNewline: event.trailingNewline\n });\n };\n take() {\n const commits = this.commits;\n this.commits = [];\n return commits;\n }\n takeText() {\n return this.take().flatMap((commit) => commit.rows).join(`\n`);\n }\n clear() {\n this.commits = [];\n }\n}\nfunction waitForNextFrameOrIdle(renderer) {\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n let settled = false;\n const cleanup = () => {\n renderer.off(\"frame\" /* FRAME */, onFrame);\n renderer.off(\"destroy\" /* DESTROY */, onDestroy);\n };\n const finish = (event) => {\n if (settled)\n return;\n settled = true;\n cleanup();\n resolve(event);\n };\n const onFrame = (event) => {\n finish(event);\n };\n const onDestroy = () => {\n finish(null);\n };\n renderer.on(\"frame\" /* FRAME */, onFrame);\n renderer.once(\"destroy\" /* DESTROY */, onDestroy);\n if (!scheduler.isRunning) {\n renderer.idle().then(() => finish(null));\n }\n });\n}\nasync function createTestRenderer(options) {\n const useKittyKeyboard = options.kittyKeyboard ? { events: true } : options.useKittyKeyboard;\n const renderer = await setupTestRenderer({\n ...options,\n useKittyKeyboard,\n screenMode: options.screenMode ?? \"main-screen\",\n footerHeight: options.footerHeight ?? 12,\n consoleMode: options.consoleMode ?? \"disabled\",\n externalOutputMode: options.externalOutputMode ?? \"passthrough\"\n });\n const externalOutput = new TestExternalOutputRecorder(renderer);\n const mockInput = createMockKeys(renderer, {\n kittyKeyboard: options.kittyKeyboard,\n otherModifiersMode: options.otherModifiersMode\n });\n const mockMouse = createMockMouse(renderer);\n const renderOnce = async () => {\n const feed = renderer._feed;\n if (feed?.isBackpressured()) {\n await feed.idle();\n }\n await renderer.loop();\n };\n const captureCharFrame = () => {\n const currentBuffer = renderer.currentRenderBuffer;\n const frameBytes = currentBuffer.getRealCharBytes(true);\n return decoder.decode(frameBytes);\n };\n const waitForVisualIdle = async (waitOptions = {}) => {\n const maxFrames = normalizePositiveInteger(waitOptions.maxFrames, DEFAULT_MAX_VISUAL_IDLE_FRAMES);\n const quietFrames = normalizePositiveInteger(waitOptions.quietFrames, DEFAULT_QUIET_FRAMES);\n let consecutiveQuietFrames = 0;\n for (let frame = 0;frame < maxFrames; frame++) {\n await drainImmediateWork();\n const scheduler2 = renderer.getSchedulerState();\n if (!scheduler2.isRunning && !scheduler2.isRendering && !scheduler2.hasScheduledRender) {\n return;\n }\n const event = await waitForNextFrameOrIdle(renderer);\n if (!event) {\n return;\n }\n if (renderer.getNativeStats().cellsUpdated === 0) {\n consecutiveQuietFrames++;\n if (consecutiveQuietFrames >= quietFrames) {\n return;\n }\n } else {\n consecutiveQuietFrames = 0;\n }\n }\n await drainImmediateWork();\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n return;\n }\n throw createWaitError(renderer, `Timed out waiting for visual idle after ${maxFrames} frames`);\n };\n const flush = async (flushOptions = {}) => {\n await waitForVisualIdle({ maxFrames: normalizePositiveInteger(flushOptions.maxPasses, DEFAULT_MAX_PASSES) });\n };\n const waitFor = async (predicate, waitOptions = {}) => {\n const maxPasses = normalizePositiveInteger(waitOptions.maxPasses, DEFAULT_MAX_PASSES);\n for (let pass = 0;pass <= maxPasses; pass++) {\n await drainImmediateWork();\n if (await predicate()) {\n return;\n }\n if (pass === maxPasses) {\n break;\n }\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n break;\n }\n await waitForNextFrameOrIdle(renderer);\n }\n throw createWaitError(renderer, `Timed out waiting for predicate after ${maxPasses} passes`);\n };\n const waitForFrame = async (predicate, waitOptions = {}) => {\n const maxPasses = normalizePositiveInteger(waitOptions.maxPasses, DEFAULT_MAX_PASSES);\n let frame = captureCharFrame();\n for (let pass = 0;pass <= maxPasses; pass++) {\n await drainImmediateWork();\n frame = captureCharFrame();\n if (await predicate(frame)) {\n return frame;\n }\n if (pass === maxPasses) {\n break;\n }\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n break;\n }\n await waitForNextFrameOrIdle(renderer);\n }\n frame = captureCharFrame();\n throw createWaitError(renderer, `Timed out waiting for frame predicate after ${maxPasses} passes`, frame);\n };\n return {\n renderer,\n mockInput,\n mockMouse,\n renderOnce,\n flush,\n waitFor,\n waitForFrame,\n waitForVisualIdle,\n externalOutput,\n getNativeStats: () => renderer.getNativeStats(),\n captureCharFrame,\n captureSpans: () => {\n const currentBuffer = renderer.currentRenderBuffer;\n const lines = currentBuffer.getSpanLines();\n const cursorState = renderer.getCursorState();\n return {\n cols: currentBuffer.width,\n rows: currentBuffer.height,\n cursor: [cursorState.x, cursorState.y],\n lines\n };\n },\n resize: (width, height) => {\n renderer.processResize(width, height);\n }\n };\n}\nasync function setupTestRenderer(config) {\n const stdin = config.stdin || createTestStdin();\n const width = config.width || config.stdout?.columns || process.stdout.columns || 80;\n const height = config.height || config.stdout?.rows || process.stdout.rows || 24;\n const stdout = config.stdout || createTestStdout(width, height);\n return new CliRenderer(stdin, stdout, width, height, {\n ...config,\n bufferedOutput: config.bufferedOutput ?? \"memory\"\n });\n}\n// src/testing/mock-tree-sitter-client.ts\nclass MockTreeSitterClient extends TreeSitterClient {\n _highlightPromises = [];\n _mockResult = { highlights: [] };\n _autoResolveTimeout;\n _clock;\n constructor(options) {\n super({ dataPath: \"/tmp/mock\" }, { autoStartWorker: false });\n this._autoResolveTimeout = options?.autoResolveTimeout;\n this._clock = options?.clock ?? new SystemClock;\n }\n async destroy() {\n this.resolveAllHighlightOnce();\n await super.destroy();\n }\n async highlightOnce(content, filetype) {\n const { promise, resolve } = Promise.withResolvers();\n let timeout;\n if (this._autoResolveTimeout !== undefined) {\n timeout = this._clock.setTimeout(() => {\n const index = this._highlightPromises.findIndex((p) => p.promise === promise);\n if (index !== -1) {\n resolve(this._mockResult);\n this._highlightPromises.splice(index, 1);\n }\n }, this._autoResolveTimeout);\n }\n this._highlightPromises.push({ promise, resolve, timeout });\n return promise;\n }\n setMockResult(result) {\n this._mockResult = result;\n }\n resolveHighlightOnce(index = 0) {\n if (index >= 0 && index < this._highlightPromises.length) {\n const item = this._highlightPromises[index];\n if (item.timeout) {\n this._clock.clearTimeout(item.timeout);\n }\n item.resolve(this._mockResult);\n this._highlightPromises.splice(index, 1);\n }\n }\n resolveAllHighlightOnce() {\n for (const { resolve, timeout } of this._highlightPromises) {\n if (timeout) {\n this._clock.clearTimeout(timeout);\n }\n resolve(this._mockResult);\n }\n this._highlightPromises = [];\n }\n isHighlighting() {\n return this._highlightPromises.length > 0;\n }\n}\n// src/testing/terminal-capabilities.ts\nfunction createTerminalCapabilities(overrides = {}) {\n return {\n kitty_keyboard: false,\n kitty_graphics: false,\n rgb: false,\n ansi256: false,\n unicode: \"unicode\",\n sgr_pixels: false,\n color_scheme_updates: false,\n explicit_width: false,\n scaled_text: false,\n sixel: false,\n focus_tracking: false,\n sync: false,\n bracketed_paste: false,\n hyperlinks: false,\n osc52: false,\n osc52_support: \"unknown\",\n notifications: false,\n explicit_cursor_positioning: false,\n remote: false,\n multiplexer: \"none\",\n image_protocol: \"auto\",\n ...overrides,\n terminal: {\n name: \"\",\n version: \"\",\n from_xtversion: false,\n ...overrides.terminal\n }\n };\n}\nfunction setRendererCapabilities(renderer, overrides = {}) {\n const capabilities = createTerminalCapabilities(overrides);\n renderer._capabilities = capabilities;\n return capabilities;\n}\n// src/testing/spy.ts\nfunction createSpy() {\n const calls = [];\n const spy = (...args) => {\n calls.push(args);\n };\n spy.calls = calls;\n spy.callCount = () => calls.length;\n spy.calledWith = (...expected) => {\n return calls.some((call) => JSON.stringify(call) === JSON.stringify(expected));\n };\n spy.reset = () => calls.length = 0;\n return spy;\n}\n// src/testing/manual-clock.ts\nfunction compareTimers(left, right) {\n if (left.fireAt !== right.fireAt) {\n return left.fireAt - right.fireAt;\n }\n return left.order - right.order;\n}\n\nclass ManualClock {\n time = 0;\n nextId = 1;\n nextOrder = 0;\n timers = new Map;\n now() {\n return this.time;\n }\n setTime(time) {\n const targetTime = Math.floor(time);\n if (targetTime >= this.time) {\n this.advance(targetTime - this.time);\n return;\n }\n this.time = targetTime;\n }\n setTimeout(fn, delayMs) {\n return this.schedule(fn, delayMs, false);\n }\n clearTimeout(handle) {\n this.timers.delete(Number(handle));\n }\n setInterval(fn, delayMs) {\n return this.schedule(fn, delayMs, true);\n }\n clearInterval(handle) {\n this.clearTimeout(handle);\n }\n advance(delayMs) {\n const targetTime = this.time + Math.max(0, Math.floor(delayMs));\n while (true) {\n const nextTimer = this.peekNextTimer();\n if (!nextTimer || nextTimer.fireAt > targetTime) {\n break;\n }\n this.timers.delete(nextTimer.id);\n this.time = nextTimer.fireAt;\n nextTimer.fn();\n if (nextTimer.repeat && !this.timers.has(nextTimer.id)) {\n this.timers.set(nextTimer.id, {\n ...nextTimer,\n fireAt: this.time + nextTimer.delayMs,\n order: this.nextOrder++\n });\n }\n }\n this.time = targetTime;\n }\n runAll() {\n while (true) {\n const nextTimer = this.peekNextTimer();\n if (!nextTimer) {\n return;\n }\n this.advance(nextTimer.fireAt - this.time);\n }\n }\n schedule(fn, delayMs, repeat) {\n const id = this.nextId++;\n const normalizedDelay = Math.max(0, Math.floor(delayMs));\n this.timers.set(id, {\n id,\n fireAt: this.time + normalizedDelay,\n order: this.nextOrder++,\n delayMs: normalizedDelay,\n repeat,\n fn\n });\n return id;\n }\n peekNextTimer() {\n let nextTimer = null;\n for (const timer of this.timers.values()) {\n if (!nextTimer || compareTimers(timer, nextTimer) < 0) {\n nextTimer = timer;\n }\n }\n return nextTimer;\n }\n}\n// src/testing/test-recorder.ts\nclass TestRecorder {\n renderer;\n frames = [];\n recording = false;\n frameNumber = 0;\n startTime = 0;\n decoder = new TextDecoder;\n recordBuffers;\n now;\n onFrame = () => {\n if (!this.recording)\n return;\n this.captureFrame();\n };\n constructor(renderer, options) {\n this.renderer = renderer;\n this.recordBuffers = options?.recordBuffers || {};\n this.now = options?.now ?? (() => performance.now());\n }\n rec() {\n if (this.recording) {\n return;\n }\n this.recording = true;\n this.frames = [];\n this.frameNumber = 0;\n this.startTime = this.now();\n this.renderer.on(\"frame\" /* FRAME */, this.onFrame);\n }\n stop() {\n if (!this.recording) {\n return;\n }\n this.recording = false;\n this.renderer.off(\"frame\" /* FRAME */, this.onFrame);\n }\n get recordedFrames() {\n return [...this.frames];\n }\n clear() {\n this.frames = [];\n this.frameNumber = 0;\n }\n get isRecording() {\n return this.recording;\n }\n captureFrame() {\n const currentBuffer = this.renderer.currentRenderBuffer;\n const frameBytes = currentBuffer.getRealCharBytes(true);\n const frame = this.decoder.decode(frameBytes);\n const recordedFrame = {\n frame,\n timestamp: this.now() - this.startTime,\n frameNumber: this.frameNumber++\n };\n if (this.recordBuffers.fg || this.recordBuffers.bg || this.recordBuffers.attributes) {\n const buffers = currentBuffer.buffers;\n recordedFrame.buffers = {};\n if (this.recordBuffers.fg) {\n recordedFrame.buffers.fg = new Uint16Array(buffers.fg);\n }\n if (this.recordBuffers.bg) {\n recordedFrame.buffers.bg = new Uint16Array(buffers.bg);\n }\n if (this.recordBuffers.attributes) {\n recordedFrame.buffers.attributes = new Uint8Array(buffers.attributes);\n }\n }\n this.frames.push(recordedFrame);\n }\n}\nexport {\n setRendererCapabilities,\n pasteBytes,\n createTestRenderer,\n createTerminalCapabilities,\n createSpy,\n createMockMouse,\n createMockKeys,\n TestRecorder,\n MouseButtons,\n MockTreeSitterClient,\n ManualClock,\n KeyCodes\n};\n\n//# debugId=4A66EEF4E0EE595664756E2164756E21\n//# sourceMappingURL=testing.bun.js.map\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D9164FFF789B305164756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/services/service-registration.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport { Effect, Option, Redacted, Schedule } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { ServiceRegistration } from \"./services/service-registration\"\nimport { Updater } from \"./services/updater\"\nimport { WebUi } from \"./services/web-ui\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* ServiceRegistration.register({\n address,\n password,\n id: instanceID,\n file: serviceOptions.file,\n shutdown,\n })\n }),\n },\n transform,\n ).pipe(\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "export * as ServiceRegistration from \"./service-registration\"\n\nimport { Service, type Info } from \"@opencode-ai/client/effect/service\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { OPENCODE_VERSION } from \"../version\"\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nexport const register = Effect.fnUntraced(function* (options: {\n readonly address: HttpServer.Address\n readonly password: string\n readonly id: string\n readonly file: string\n readonly shutdown: Effect.Effect<void>\n}) {\n const fs = yield* FileSystem.FileSystem\n const temp = options.file + \".\" + options.id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(options.file), { recursive: true })\n const info = {\n id: options.id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(options.address),\n pid: process.pid,\n password: options.password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(options.file).pipe(Effect.flatMap(decodeInfo))\n const owns = (found: Info) =>\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, options.file)))\n yield* current.pipe(\n Effect.catchCause((cause) =>\n Effect.logWarning(\"managed service registration check failed; shutting down\", {\n cause,\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n }).pipe(Effect.andThen(Effect.failCause(cause))),\n ),\n Effect.tap((found) =>\n owns(found)\n ? Effect.void\n : Effect.logWarning(\"managed service registration replaced; shutting down\", {\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n observedServiceID: found.id,\n observedServicePID: found.pid,\n observedVersion: found.version,\n observedURL: found.url,\n }),\n ),\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(options.shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(options.file) : Effect.void)),\n Effect.ignore,\n )\n})\n", | ||
| "import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const headers = {\n \"content-type\": FSUtil.mimeType(name),\n \"cache-control\": html ? \"no-cache\" : \"public, max-age=31536000, immutable\",\n \"content-security-policy\": html\n ? cspForHtml(typeof file === \"string\" ? file : Buffer.from(file).toString())\n : csp(),\n \"x-content-type-options\": \"nosniff\",\n }\n return Effect.succeed(\n request.method === \"HEAD\" ? HttpServerResponse.empty({ headers }) : HttpServerResponse.raw(file, { headers }),\n )\n}\n\nfunction isRouteNotFound(error: unknown) {\n return error instanceof HttpServerError.HttpServerError && error.reason._tag === \"RouteNotFound\"\n}\n\nfunction csp(hash = \"\") {\n return `default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${hash ? ` 'sha256-${hash}'` : \"\"}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; media-src 'self' data:; connect-src * data: blob:`\n}\n\nfunction cspForHtml(body: string) {\n const match = body.match(\n /<script\\b(?![^>]*\\bsrc\\s*=)[^>]*\\bid=([\"'])oc-theme-preload-script\\1[^>]*>([\\s\\S]*?)<\\/script>/i,\n )\n return csp(match ? createHash(\"sha256\").update(match[2]).digest(\"base64\") : \"\")\n}\n\nexport * as WebUi from \"./web-ui\"\n", | ||
| "import { Effect, FileSystem, Option } from \"effect\"\nimport path from \"node:path\"\nimport { brotliDecompressSync } from \"node:zlib\"\nimport { OPENCODE_LOCAL } from \"./version\"\n\nexport type AssetMap = Readonly<Record<string, string | Uint8Array>>\ntype EncodedAssetMap = Readonly<Record<string, { readonly content: string; readonly encoding: \"utf8\" | \"base64\" }>>\n\nexport const load = Effect.fn(\"cli.app-assets.load\")(function* () {\n const embedded = yield* Effect.tryPromise(() => import(\"virtual:opencode-app-assets\")).pipe(Effect.option)\n if (Option.isSome(embedded) && embedded.value.default.length > 0) return decodeArchive(embedded.value.default)\n if (!OPENCODE_LOCAL) return yield* Effect.fail(new Error(\"Web UI assets are missing from the CLI build\"))\n return decode(yield* sourceAssets())\n})\n\nfunction decodeArchive(archive: string) {\n const body = brotliDecompressSync(Buffer.from(archive, \"base64\")).toString()\n return decode(JSON.parse(body) as EncodedAssetMap)\n}\n\nconst sourceAssets = Effect.fnUntraced(function* () {\n const fs = yield* FileSystem.FileSystem\n const root = path.resolve(import.meta.dirname, \"../../app/dist\")\n const files = yield* fs.readDirectory(root, { recursive: true })\n return Object.fromEntries(\n (yield* Effect.forEach(\n files.filter((file) => !file.endsWith(\".map\")),\n Effect.fnUntraced(function* (file) {\n const target = path.join(root, file)\n if ((yield* fs.stat(target)).type === \"Directory\") return\n const body = Buffer.from(yield* fs.readFile(target))\n const encoding = isText(file) ? \"utf8\" : \"base64\"\n return [file, { encoding, content: body.toString(encoding) }] as const\n }),\n { concurrency: \"unbounded\" },\n )).filter((asset) => asset !== undefined),\n )\n})\n\nfunction decode(assets: EncodedAssetMap): AssetMap {\n return Object.fromEntries(\n Object.entries(assets).map(([key, asset]) => [\n key,\n asset.encoding === \"utf8\" ? asset.content : Buffer.from(asset.content, \"base64\"),\n ]),\n )\n}\n\nfunction isText(file: string) {\n return file === \"_headers\" || /\\.(?:css|html|js|json|svg|txt|webmanifest|xml)$/.test(file)\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "517025EEE175AD9D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "FED33B07B8135A7364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "A1495427E277243E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/stop.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAMA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,KACnC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,MAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH", | ||
| "debugId": "D29D90A96BD741BB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAGA,IAAM,EAAiD,kBACjD,EAAiD,MAGhD,IAAM,EAAiB", | ||
| "debugId": "B51464E19313F95064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n" | ||
| ], | ||
| "mappings": ";wOAAA,cAAS,WACT,oBACA,mBAAS,UAAU,eAAM,oBAOzB,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,IAC/B,EAAO,GAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC", | ||
| "debugId": "EC0C90DF21EC517764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "EB8BF0274E694F6B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "1CDB5DB39C8CC17E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "CA44E85F2BF45DD364756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH", | ||
| "debugId": "10082978DDDDFD3C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/semantics.ts", "../simulation/src/frontend/actions.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "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 kittyKeyboard: Boolean(options.useKittyKeyboard),\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 type { Renderable } from \"@opentui/core\"\nimport type { SimulationProtocol } from \"../protocol\"\n\n// Semantic renderables set an explicit stable OpenTUI id so ui.state and\n// ui.snapshot expose the same identity. Hierarchy and element handles come\n// from the live render tree.\nexport type Definition = Omit<SimulationProtocol.Frontend.SemanticNode, \"id\" | \"element\" | \"parent\">\n\nconst key = Symbol.for(\"opencode.simulation.semantics\")\n\nconst bind = (definition: () => Definition) => (renderable: Renderable) => {\n Object.defineProperty(renderable, key, { value: definition, configurable: true })\n}\n\nexport const read = (renderable: Renderable) => {\n const definition: unknown = Reflect.get(renderable, key)\n return typeof definition === \"function\" ? (definition as () => Definition) : undefined\n}\n\nexport const SimulationSemantics = { bind, read }\n", | ||
| "import 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 { Effect, Schema } from \"effect\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationSemantics } from \"./semantics\"\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 const target = renderer.hitTest(x, y)\n return all(renderable).some((item) => item.num === target)\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 const renderable = harness.renderer.currentFocusedRenderable?.num\n return {\n focused: {\n ...(renderable === undefined ? {} : { renderable }),\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function snapshot(harness: Harness): SimulationProtocol.Frontend.SemanticSnapshot {\n const ids = new Set<string>()\n const visit = (renderable: Renderable, parent?: string): SimulationProtocol.Frontend.SemanticNode[] => {\n if (!renderable.visible || renderable.isDestroyed) return []\n const definition = SimulationSemantics.read(renderable)?.()\n if (definition && ids.has(renderable.id)) throw new Error(`duplicate semantic UI id: ${renderable.id}`)\n if (definition) ids.add(renderable.id)\n const node = definition\n ? [{ id: renderable.id, ...definition, ...(parent === undefined ? {} : { parent }), element: renderable.num }]\n : []\n const ancestor = definition ? renderable.id : parent\n return [...node, ...children(renderable).flatMap((child) => visit(child, ancestor))]\n }\n return Schema.decodeUnknownSync(SimulationProtocol.Frontend.SemanticSnapshot)({\n format: \"opencode-ui-snapshot-v1\",\n nodes: visit(harness.renderer.root),\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 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 const target = all(harness.renderer.root).find((item) => item.num === action.target)\n if (!target || !target.visible || target.isDestroyed)\n return yield* Effect.fail(new Error(`click target is stale or unavailable: ${action.target}`))\n if (action.semantic) {\n const current = snapshot(harness).nodes.find((node) => node.element === action.target)\n if (\n current?.id !== action.semantic.id ||\n current.instance !== action.semantic.instance ||\n current.element !== action.semantic.element\n )\n return yield* Effect.fail(new Error(`semantic click target is stale or unavailable: ${action.semantic.id}`))\n }\n if (\n !Number.isFinite(action.x) ||\n action.x < 0 ||\n action.x >= target.width ||\n !Number.isFinite(action.y) ||\n action.y < 0 ||\n action.y >= target.height\n )\n return yield* Effect.fail(new Error(\"click position must be within the target element\"))\n yield* Effect.tryPromise(() => harness.mockMouse.click(target.screenX + action.x, target.screenY + action.y))\n break\n }\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 { 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, version: string) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.snapshot\":\n return Effect.sync(() => SimulationActions.snapshot(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 semantic: request.params.semantic,\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* (\n harness: Harness,\n endpoint: string,\n version = \"unknown\",\n) {\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, version),\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, version: string) {\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(\n SimulationActions.createHarness(renderer),\n manifest.endpoints.ui,\n version,\n )\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": "9356C067B77E2FEF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/theme/system.ts"], | ||
| "sourcesContent": [ | ||
| "import { RGBA, type TerminalColors } from \"@opentui/core\"\nimport { ansiToRgba, tint } from \"./color\"\n\nexport function terminalMode(colors: TerminalColors): \"dark\" | \"light\" | undefined {\n const bg = colors.defaultBackground\n if (!bg) return\n const { r, g, b } = RGBA.fromHex(bg)\n return 0.299 * r + 0.587 * g + 0.114 * b > 0.5 ? \"light\" : \"dark\"\n}\n\nexport function generateSystem(colors: TerminalColors, mode: \"dark\" | \"light\") {\n const bg = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const transparent = RGBA.fromValues(bg.r, bg.g, bg.b, 0)\n const isDark = mode === \"dark\"\n\n const col = (index: number) => {\n const value = colors.palette[index]\n if (value) return RGBA.fromHex(value)\n return ansiToRgba(index)\n }\n\n const grays = generateGrayScale(bg, isDark)\n const textMuted = generateMutedTextColor(bg, isDark)\n const ansiColors = {\n red: col(1),\n green: col(2),\n yellow: col(3),\n blue: col(4),\n magenta: col(5),\n cyan: col(6),\n redBright: col(9),\n greenBright: col(10),\n }\n\n const diffAlpha = isDark ? 0.22 : 0.14\n const diffAddedBg = tint(bg, ansiColors.green, diffAlpha)\n const diffRemovedBg = tint(bg, ansiColors.red, diffAlpha)\n const diffContextBg = grays[2]\n const diffAddedLineNumberBg = tint(diffContextBg, ansiColors.green, diffAlpha)\n const diffRemovedLineNumberBg = tint(diffContextBg, ansiColors.red, diffAlpha)\n\n return {\n theme: {\n primary: ansiColors.cyan,\n secondary: ansiColors.magenta,\n accent: ansiColors.cyan,\n error: ansiColors.red,\n warning: ansiColors.yellow,\n success: ansiColors.green,\n info: ansiColors.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: transparent,\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansiColors.green,\n diffRemoved: ansiColors.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansiColors.greenBright,\n diffHighlightRemoved: ansiColors.redBright,\n diffAddedBg,\n diffRemovedBg,\n diffContextBg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg,\n diffRemovedLineNumberBg,\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansiColors.blue,\n markdownLinkText: ansiColors.cyan,\n markdownCode: ansiColors.green,\n markdownBlockQuote: ansiColors.yellow,\n markdownEmph: ansiColors.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansiColors.blue,\n markdownListEnumeration: ansiColors.cyan,\n markdownImage: ansiColors.blue,\n markdownImageText: ansiColors.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansiColors.magenta,\n syntaxFunction: ansiColors.blue,\n syntaxVariable: fg,\n syntaxString: ansiColors.green,\n syntaxNumber: ansiColors.yellow,\n syntaxType: ansiColors.cyan,\n syntaxOperator: ansiColors.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean): Record<number, RGBA> {\n const grays: Record<number, RGBA> = {}\n const bgR = bg.r * 255\n const bgG = bg.g * 255\n const bgB = bg.b * 255\n const luminance = 0.299 * bgR + 0.587 * bgG + 0.114 * bgB\n\n for (let i = 1; i <= 12; i++) {\n const factor = i / 12\n\n if (isDark && luminance < 10) {\n const gray = Math.floor(factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n if (!isDark && luminance > 245) {\n const gray = Math.floor(255 - factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n const next = isDark ? luminance + (255 - luminance) * factor * 0.4 : luminance * (1 - factor * 0.4)\n const ratio = next / luminance\n grays[i] = RGBA.fromInts(\n Math.floor(Math.min(Math.max(bgR * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgG * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgB * ratio, 0), 255)),\n )\n }\n\n return grays\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean): RGBA {\n const luminance = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n if (isDark) {\n const gray = luminance < 10 ? 180 : Math.min(Math.floor(160 + luminance * 0.3), 200)\n return RGBA.fromInts(gray, gray, gray)\n }\n\n const gray = luminance > 245 ? 75 : Math.max(Math.floor(100 - (255 - luminance) * 0.2), 60)\n return RGBA.fromInts(gray, gray, gray)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "370367BF651E8A6764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { createClient, loadIntegrations } from \"./shared\"\nimport { errorMessage } from \"../../../ui/prompt\"\n\nexport default Runtime.handler(Commands.commands.auth.commands.list, (input) =>\n list(input).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n)\n\nconst list = Effect.fn(\"cli.auth.list\")(function* (input) {\n const client = yield* createClient({ server: Option.getOrUndefined(input.server), standalone: input.standalone })\n const integrations = (yield* loadIntegrations(client)).filter((integration) => integration.connections.length > 0)\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify(\n integrations.map((integration) => ({\n id: integration.id,\n name: integration.name,\n connections: integration.connections,\n })),\n null,\n 2,\n ) + EOL,\n )\n return\n }\n const rows = integrations.flatMap((integration) =>\n integration.connections.map((connection) => ({\n integration: integration.name,\n source: connection.type === \"credential\" ? connection.label : connection.name,\n type: connection.type === \"credential\" ? \"stored\" : \"environment\",\n })),\n )\n if (rows.length === 0) {\n process.stdout.write(\"No authenticated integrations\" + EOL)\n return\n }\n const width = Math.max(...rows.map((row) => row.integration.length)) + 2\n process.stdout.write(\n rows.map((row) => row.integration.padEnd(width) + row.source.padEnd(28) + row.type).join(EOL) + EOL,\n )\n})\n" | ||
| ], | ||
| "mappings": ";gpCAAA,cAAS,WAOT,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAK,SAAS,KAAM,CAAC,IACpE,EAAK,CAAK,EAAE,KACV,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,EAEM,EAAO,EAAO,GAAG,eAAe,EAAE,SAAU,CAAC,EAAO,CACxD,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAO,eAAe,EAAM,MAAM,EAAG,WAAY,EAAM,UAAW,CAAC,EAC1G,GAAgB,MAAO,EAAiB,CAAM,GAAG,OAAO,CAAC,IAAgB,EAAY,YAAY,OAAS,CAAC,EACjH,GAAI,EAAM,SAAW,OAAQ,CAC3B,QAAQ,OAAO,MACb,KAAK,UACH,EAAa,IAAI,CAAC,KAAiB,CACjC,GAAI,EAAY,GAChB,KAAM,EAAY,KAClB,YAAa,EAAY,WAC3B,EAAE,EACF,KACA,CACF,EAAI,CACN,EACA,OAEF,IAAM,EAAO,EAAa,QAAQ,CAAC,IACjC,EAAY,YAAY,IAAI,CAAC,KAAgB,CAC3C,YAAa,EAAY,KACzB,OAAQ,EAAW,OAAS,aAAe,EAAW,MAAQ,EAAW,KACzE,KAAM,EAAW,OAAS,aAAe,SAAW,aACtD,EAAE,CACJ,EACA,GAAI,EAAK,SAAW,EAAG,CACrB,QAAQ,OAAO,MAAM,gCAAkC,CAAG,EAC1D,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,MAAM,CAAC,EAAI,EACvE,QAAQ,OAAO,MACb,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,OAAO,CAAK,EAAI,EAAI,OAAO,OAAO,EAAE,EAAI,EAAI,IAAI,EAAE,KAAK,CAAG,EAAI,CAClG,EACD", | ||
| "debugId": "F825ABF475B2B8E064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Npm } from \"@opencode-ai/util/npm\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { resolveConfigPath } from \"../mcp/add\"\nimport { Config } from \"../../../config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.add,\n Effect.fn(\"cli.plugin.add\")(function* (input) {\n if (!(yield* Effect.promise(() => Npm.isRegistryPackage(input.package))))\n return yield* Effect.fail(\n new Error(\"Plugin target must be an npm registry package name, version, tag, or semver range\"),\n )\n const npm = yield* Npm.Service\n const installed = yield* npm.add(input.package, { subpaths: [\"server\", \"\"] })\n const tui = yield* npm.resolve(input.package, { subpaths: [\"tui\"] })\n const target = configurationTarget(installed.entrypoint, tui.entrypoint)\n if (!target)\n return yield* Effect.fail(new Error(`Plugin package has no server or TUI entrypoint: ${input.package}`))\n\n if (target === \"server\") {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const changed = yield* Effect.promise(() => writePluginConfig(configPath, input.package))\n process.stdout.write(\n changed\n ? `Plugin \"${input.package}\" installed and added to ${configPath}${EOL}`\n : `Plugin \"${input.package}\" is already configured in ${configPath}${EOL}`,\n )\n return\n }\n\n const config = yield* Config.Service\n yield* config.update((draft) => {\n if (configured(draft.plugins, input.package)) return\n draft.plugins = [...(draft.plugins ?? []), input.package]\n })\n process.stdout.write(`TUI plugin \"${input.package}\" installed and added to ${config.path}${EOL}`)\n }),\n)\n\nexport function configurationTarget(server?: string, tui?: string) {\n if (server) return \"server\" as const\n if (tui) return \"tui\" as const\n}\n\nexport async function writePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(text, [\"plugins\"], [...(plugins ?? []), spec], { formattingOptions: { tabSize: 2, insertSpaces: true } }),\n )\n await mkdir(path.dirname(configPath), { recursive: true })\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some(\n (entry) =>\n entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec),\n )\n}\n" | ||
| ], | ||
| "mappings": ";8tBAAA,cAAS,WACT,oBACA,gBAAS,cAAO,YAAU,eAAQ,oBAUlC,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,IAClC,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,GAAI,EAAE,MAAO,EAAO,QAAQ,IAAM,EAAI,kBAAkB,EAAM,OAAO,CAAC,GACpE,OAAO,MAAO,EAAO,KACf,MAAM,mFAAmF,CAC/F,EACF,IAAM,EAAM,MAAO,EAAI,QACjB,EAAY,MAAO,EAAI,IAAI,EAAM,QAAS,CAAE,SAAU,CAAC,SAAU,EAAE,CAAE,CAAC,EACtE,EAAM,MAAO,EAAI,QAAQ,EAAM,QAAS,CAAE,SAAU,CAAC,KAAK,CAAE,CAAC,EAC7D,EAAS,EAAoB,EAAU,WAAY,EAAI,UAAU,EACvE,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,mDAAmD,EAAM,SAAS,CAAC,EAEzG,GAAI,IAAW,SAAU,CACvB,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAY,EAAM,OAAO,CAAC,EACxF,QAAQ,OAAO,MACb,EACI,WAAW,EAAM,mCAAmC,IAAa,IACjE,WAAW,EAAM,qCAAqC,IAAa,GACzE,EACA,OAGF,IAAM,EAAS,MAAO,EAAO,QAC7B,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,GAAI,EAAW,EAAM,QAAS,EAAM,OAAO,EAAG,OAC9C,EAAM,QAAU,CAAC,GAAI,EAAM,SAAW,CAAC,EAAI,EAAM,OAAO,EACzD,EACD,QAAQ,OAAO,MAAM,eAAe,EAAM,mCAAmC,EAAO,OAAO,GAAK,EACjG,CACH,EAEO,SAAS,CAAmB,CAAC,EAAiB,EAAc,CACjE,GAAI,EAAQ,MAAO,SACnB,GAAI,EAAK,MAAO,MAGlB,eAAsB,CAAiB,CAAC,EAAoB,EAAc,CACxE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,EAAW,EAAS,CAAI,EAAG,MAAO,GAEtC,IAAM,EAAU,EACd,EACA,EAAO,EAAM,CAAC,SAAS,EAAG,CAAC,GAAI,GAAW,CAAC,EAAI,CAAI,EAAG,CAAE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CAAE,CAAC,CACjH,EACA,MAAM,EAAM,EAAK,QAAQ,CAAU,EAAG,CAAE,UAAW,EAAK,CAAC,EACzD,IAAM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KACd,CAAC,IACC,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,OAAQ,YAAa,IAAS,EAAM,UAAY,CAC9G", | ||
| "debugId": "123646331763616264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/form.ts", "src/commands/handlers/auth/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { confirm, log, multiselect, password, select, text, type Option } from \"@clack/prompts\"\nimport { Effect } from \"effect\"\nimport type { FormAnswer, FormField, FormFields } from \"@opencode-ai/client\"\nimport { openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\n\nconst skip = Symbol(\"skip\")\nconst custom = Symbol(\"custom\")\n\nexport const answerForm = Effect.fn(\"cli.auth.form\")(function* (fields: FormFields | undefined) {\n if (!fields) return undefined\n yield* requireInteractive(\"Authentication form input requires an interactive terminal\")\n const answer: FormAnswer = {}\n for (const field of fields) {\n if (!active(field, answer)) continue\n const value = yield* answerField(field)\n if (value !== undefined) answer[field.key] = value\n }\n return answer\n})\n\nexport const secret = Effect.fn(\"cli.auth.secret\")(function* (message: string) {\n yield* requireInteractive(\"API key input requires an interactive terminal\")\n return yield* prompt<string>(() => password({ message, validate: (value) => (!value ? \"Required\" : undefined) }))\n})\n\nconst answerField = Effect.fn(\"cli.auth.form.field\")(function* (field: FormField) {\n const message = field.title ?? field.key\n if (field.description) log.info(field.description)\n if (field.type === \"external\") {\n log.info(field.url)\n yield* openUrl(field.url)\n const acknowledged = yield* prompt<boolean>(() =>\n confirm({ message: message || \"Continue after completing this step?\", initialValue: true }),\n )\n if (!acknowledged) return yield* Effect.fail(new Error(`${message || \"External step\"} is required`))\n return true\n }\n if (field.type === \"boolean\") {\n if (field.required) return yield* prompt<boolean>(() => confirm({ message, initialValue: field.default ?? true }))\n const options: Array<Option<boolean | typeof skip>> = [\n { value: true, label: \"Yes\" },\n { value: false, label: \"No\" },\n { value: skip, label: \"Skip\" },\n ]\n const value = yield* prompt<boolean | typeof skip>(() =>\n select<boolean | typeof skip>({\n message,\n options,\n initialValue: field.default ?? skip,\n }),\n )\n if (value === skip) return undefined\n return value\n }\n if (field.type === \"multiselect\") {\n const options: Array<Option<string | typeof custom>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type another value\" })\n const values = yield* prompt<Array<string | typeof custom>>(() =>\n multiselect<string | typeof custom>({\n message,\n options,\n initialValues: field.default,\n required: field.required || (field.minItems ?? 0) > 0,\n }),\n )\n const selected = values.filter((value): value is string => value !== custom)\n if (values.includes(custom)) {\n selected.push(yield* prompt<string>(() => text({ message: \"Enter value\", validate: required })))\n }\n if (field.minItems !== undefined && selected.length < field.minItems) {\n return yield* Effect.fail(new Error(`Select at least ${field.minItems}`))\n }\n if (field.maxItems !== undefined && selected.length > field.maxItems) {\n return yield* Effect.fail(new Error(`Select at most ${field.maxItems}`))\n }\n return selected\n }\n if (field.type === \"string\" && field.options) {\n const options: Array<Option<string | typeof custom | typeof skip>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type your own answer\" })\n if (!field.required) options.push({ value: skip, label: \"Skip\" })\n const value = yield* prompt<string | typeof custom | typeof skip>(() =>\n select<string | typeof custom | typeof skip>({ message, options, initialValue: field.default }),\n )\n if (value === skip) return undefined\n if (value !== custom) return value\n }\n const value = yield* prompt<string>(() =>\n text({\n message,\n placeholder: field.type === \"string\" ? field.placeholder : undefined,\n initialValue: field.default === undefined ? undefined : String(field.default),\n validate: (input) => validateText(field, input),\n }),\n )\n if (!value && !field.required) return undefined\n if (field.type === \"string\") return value\n return Number(value)\n})\n\nfunction active(field: FormField, answer: FormAnswer) {\n if (field.type === \"external\" || !field.when) return true\n return field.when.every((condition) => {\n const value = answer[condition.key]\n if (value === undefined) return false\n const matches = Array.isArray(value) ? value.includes(String(condition.value)) : value === condition.value\n return condition.op === \"eq\" ? matches : !matches\n })\n}\n\nfunction required(value: string | undefined) {\n return value ? undefined : \"Required\"\n}\n\nfunction validateText(field: Exclude<FormField, { type: \"boolean\" | \"external\" | \"multiselect\" }>, value?: string) {\n if (!value) return field.required ? \"Required\" : undefined\n if (field.type === \"number\" || field.type === \"integer\") {\n const number = Number(value)\n if (!Number.isFinite(number)) return \"Expected a number\"\n if (field.type === \"integer\" && !Number.isInteger(number)) return \"Expected an integer\"\n if (typeof field.minimum === \"number\" && number < field.minimum) return `Must be at least ${field.minimum}`\n if (typeof field.maximum === \"number\" && number > field.maximum) return `Must be at most ${field.maximum}`\n return undefined\n }\n if (field.minLength !== undefined && value.length < field.minLength)\n return `Must be at least ${field.minLength} characters`\n if (field.maxLength !== undefined && value.length > field.maxLength)\n return `Must be at most ${field.maxLength} characters`\n if (field.pattern) {\n try {\n if (!new RegExp(field.pattern).test(value)) return \"Invalid format\"\n } catch {\n return \"Invalid format\"\n }\n }\n if (field.format === \"uri\" && !URL.canParse(value)) return \"Expected a URL\"\n if (field.format === \"email\" && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) return \"Expected an email address\"\n if (field.format === \"date\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return \"Expected a date\"\n const date = new Date(`${value}T00:00:00.000Z`)\n if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== value) return \"Expected a date\"\n }\n if (field.format === \"date-time\" && Number.isNaN(Date.parse(value))) return \"Expected a date and time\"\n return undefined\n}\n", | ||
| "import { autocomplete, intro, log, outro, select, spinner, text } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { FormAnswer, IntegrationInfo, OpenCodeClient } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { answerForm, secret } from \"./form\"\nimport {\n createClient,\n connectMethods,\n loadIntegrations,\n location,\n request,\n resolveIntegration,\n resolveMethod,\n type ConnectMethod,\n} from \"./shared\"\n\nconst integrationPriority = new Map([\n [\"opencode\", 0],\n [\"opencode-go\", 1],\n [\"openai\", 2],\n [\"github-copilot\", 3],\n [\"google\", 4],\n [\"anthropic\", 5],\n [\"openrouter\", 6],\n [\"vercel\", 7],\n])\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.login,\n Effect.fn(\"cli.auth.login\")((input) =>\n login({\n target: Option.getOrUndefined(input.target),\n method: Option.getOrUndefined(input.method),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst login = Effect.fn(\"cli.auth.login.run\")(function* (input: {\n target?: string\n method?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Connect an integration\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integration = yield* findIntegration(client, input.target)\n const methods = connectMethods(integration)\n if (methods.length === 0) yield* Effect.fail(new Error(`${integration.name} has no interactive login methods`))\n const method = yield* chooseMethod(methods, input.method)\n const answer = method.type === \"command\" ? undefined : yield* answerForm(method.form)\n yield* authenticate(client, integration, method, answer)\n outro(\"Done\")\n})\n\nconst findIntegration = Effect.fn(\"cli.auth.login.integration\")(function* (client: OpenCodeClient, target?: string) {\n if (target && URL.canParse(target)) {\n const protocol = new URL(target).protocol\n if (protocol === \"http:\" || protocol === \"https:\") {\n const progress = spinner()\n progress.start(\"Discovering authentication provider...\")\n yield* request((signal) => client.integration.wellknown.add({ url: target, location }, { signal })).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(\"Authentication provider discovered\"))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Discovery failed\", 1))),\n )\n }\n }\n const integrations = yield* loadIntegrations(client)\n if (target) return yield* resolveIntegration(integrations, target)\n const available = integrations\n .filter((integration) => connectMethods(integration).length > 0)\n .toSorted(\n (a, b) =>\n (integrationPriority.get(a.id) ?? integrationPriority.size) -\n (integrationPriority.get(b.id) ?? integrationPriority.size) ||\n a.name.localeCompare(b.name) ||\n a.id.localeCompare(b.id),\n )\n if (available.length === 0) return yield* Effect.fail(new Error(\"No authentication integrations are available\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: available.map((integration) => {\n const option = { value: integration.id, label: integration.name, hint: integration.id }\n if (integration.connections.length > 0) return { ...option, hint: \"connected\" }\n if (integration.id === \"opencode\") return { ...option, hint: \"recommended\" }\n return option\n }),\n }),\n )\n return yield* resolveIntegration(available, id)\n})\n\nconst chooseMethod = Effect.fn(\"cli.auth.login.method\")(function* (methods: ConnectMethod[], target?: string) {\n if (target) return yield* resolveMethod(methods, target)\n if (methods.length === 1) return methods[0]\n yield* requireInteractive(\"Pass --method when running without an interactive terminal\")\n const id = yield* prompt<string>(() =>\n select({\n message: \"Select login method\",\n options: methods.map((method) => {\n if (method.type === \"key\") return { value: \"key\", label: method.label ?? \"API key\" }\n return { value: method.id, label: method.label }\n }),\n }),\n )\n return yield* resolveMethod(methods, id)\n})\n\nconst authenticate = Effect.fn(\"cli.auth.login.authenticate\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: ConnectMethod,\n answer?: FormAnswer,\n) {\n if (method.type === \"key\") return yield* keyLogin(client, integration, method, answer)\n if (method.type === \"command\") return yield* commandLogin(client, integration, method)\n return yield* oauthLogin(client, integration, method, answer)\n})\n\nconst keyLogin = Effect.fn(\"cli.auth.login.key\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"key\" }>,\n answer?: FormAnswer,\n) {\n const key = yield* secret(method.label ?? `Enter your ${integration.name} API key`)\n const progress = spinner()\n progress.start(\"Saving credential...\")\n yield* request((signal) =>\n client.integration.connect.key({ integrationID: integration.id, key, answer, location }, { signal }),\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))),\n )\n})\n\nconst oauthLogin = Effect.fn(\"cli.auth.login.oauth\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"oauth\" }>,\n answer?: FormAnswer,\n) {\n const progress = spinner()\n progress.start(\"Starting authorization...\")\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n { integrationID: integration.id, methodID: method.id, answer, location },\n { signal },\n ),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID: integration.id, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n progress.stop(\"Authorization started\")\n log.info(attempt.instructions)\n log.info(attempt.url)\n if (process.stdin.isTTY && process.stdout.isTTY) yield* openUrl(attempt.url)\n\n if (attempt.mode === \"code\") {\n yield* requireInteractive(\"This login requires an interactive terminal to enter the authorization code\")\n const code = yield* prompt<string>(() =>\n text({ message: \"Paste the authorization code\", validate: (value) => (!value ? \"Required\" : undefined) }),\n )\n const completing = spinner()\n completing.start(\"Completing authorization...\")\n yield* request((signal) =>\n client.integration.oauth.complete(\n { integrationID: integration.id, attemptID: attempt.attemptID, code, location },\n { signal },\n ),\n ).pipe(\n Effect.tap(() => Effect.sync(() => completing.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => completing.stop(\"Authentication failed\", 1))),\n )\n return\n }\n\n const waiting = spinner()\n waiting.start(\"Waiting for authorization...\")\n const status = yield* waitForOAuth(client, integration.id, attempt.attemptID).pipe(\n Effect.tapCause(() => Effect.sync(() => waiting.stop(\"Authentication failed\", 1))),\n )\n if (status.status === \"complete\") {\n waiting.stop(`Connected to ${integration.name}`)\n return\n }\n waiting.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authorization expired\"))\n})\n\nconst commandLogin = Effect.fn(\"cli.auth.login.command\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"command\" }>,\n) {\n const progress = spinner()\n progress.start(\"Starting authentication command...\")\n const started = yield* request((signal) =>\n client.integration.command.connect({ integrationID: integration.id, methodID: method.id, location }, { signal }),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel(\n {\n integrationID: integration.id,\n attemptID: started.data.attemptID,\n location,\n },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n const status = yield* waitForCommand(client, integration.id, started.data.attemptID, (message) =>\n progress.message(message.trim() || \"Waiting for authentication command...\"),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n if (status.status === \"complete\") {\n progress.stop(`Connected to ${integration.name}`)\n return\n }\n progress.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authentication expired\"))\n})\n\nconst waitForOAuth = Effect.fn(\"cli.auth.login.oauth.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nconst waitForCommand = Effect.fn(\"cli.auth.login.command.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n update: (message: string) => void,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.command.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n if (response.data.message) update(response.data.message)\n yield* Effect.sleep(500)\n }\n})\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "8D328E6E7EC08CCE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/cli-spinners@3.4.0/node_modules/cli-spinners/index.js", "../../node_modules/.bun/opentui-spinner@0.0.7+98da62875aafaa11/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+98da62875aafaa11/node_modules/opentui-spinner/dist/solid.mjs", "../tui/src/component/register-spinner.ts"], | ||
| "sourcesContent": [ | ||
| "import spinners from './spinners.json' with {type: 'json'};\n\nexport default spinners;\n\nconst spinnersList = Object.keys(spinners);\n\nexport function randomSpinner() {\n\tconst randomIndex = Math.floor(Math.random() * spinnersList.length);\n\tconst spinnerName = spinnersList[randomIndex];\n\treturn spinners[spinnerName];\n}\n", | ||
| "import{Renderable as e,parseColor as t,resolveRenderLib as n}from\"@opentui/core\";import r from\"cli-spinners\";const i=1e3/60,a=1e3;function o(e){if(!Number.isFinite(e)||e<i||e>a)throw RangeError(`Spinner interval must be a finite number between ${i}ms and ${a}ms`);return e}const s={now:()=>performance.now(),setInterval:(e,t)=>{let n=setInterval(e,t);return n.unref(),n},clearInterval:e=>clearInterval(e)},c=new class{active=new Map;heap=[];timer=null;timerDueAt=0;generation=0;lastWakeAt=-1/0;clock;constructor(e=s,t=16){this.denseTickThreshold=t,this.clock=e}setClock(e){if(this.active.size>0||this.timer!==null)throw Error(`Cannot replace the spinner scheduler clock while active`);this.clock=e}start(e,t,n){if(this.active.has(e))return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n};this.active.set(e,r),this.push(r),this.armNext()}reschedule(e,t){let n=this.active.get(e);if(!n)return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n.advance};this.active.set(e,r),this.push(r),this.compactIfNeeded(),this.armNext()}stop(e){this.active.delete(e)&&(this.compactIfNeeded(),this.armNext())}armNext(){this.discardStaleRoots();let e=this.heap[0];if(!e){this.cancelTimer(),this.lastWakeAt=-1/0;return}let t=this.clock.now(),n=Math.max(e.nextDueAt,this.lastWakeAt+i);if(this.timer!==null&&this.timerDueAt===n)return;this.cancelTimer();let r=this.generation,a=Math.max(n-t,0);this.timerDueAt=n,this.timer=this.clock.setInterval(()=>this.tick(r),a)}cancelTimer(){this.timer!==null&&(this.generation++,this.clock.clearInterval(this.timer),this.timer=null)}tick(e){if(e!==this.generation||this.timer===null)return;let t=this.timer;this.generation++,this.timer=null,this.clock.clearInterval(t);let n=this.clock.now();this.discardStaleRoots();let r=!1,i=0,a=[];for(;this.heap[0]&&this.heap[0].nextDueAt<=n;){let e=this.pop();if(!(!e||!this.isCurrent(e))){try{e.advance()}catch(e){a.push(e)}if(r=!0,this.isCurrent(e)&&(e.nextDueAt=n+e.interval,this.push(e),i++,i===this.denseTickThreshold)){let e=this.heap;this.heap=[];for(let t of e)if(this.isCurrent(t)){if(t.nextDueAt<=n){try{t.advance()}catch(e){a.push(e)}if(r=!0,!this.isCurrent(t))continue;t.nextDueAt=n+t.interval}this.heap.push(t)}this.heapify();break}}}if(r&&(this.lastWakeAt=n),this.compactIfNeeded(),this.armNext(),a.length===1)throw a[0];if(a.length>1)throw AggregateError(a,`Multiple spinner callbacks failed`)}isCurrent(e){return this.active.get(e.spinner)===e}discardStaleRoots(){for(;this.heap[0]&&!this.isCurrent(this.heap[0]);)this.pop()}compactIfNeeded(){this.heap.length<=this.active.size*2+16||(this.heap=Array.from(this.active.values()),this.heapify())}heapify(){for(let e=Math.floor(this.heap.length/2)-1;e>=0;e--)this.siftDown(e)}push(e){this.heap.push(e);let t=this.heap.length-1;for(;t>0;){let n=Math.floor((t-1)/2);if(this.heap[n].nextDueAt<=e.nextDueAt)break;this.heap[t]=this.heap[n],t=n}this.heap[t]=e}pop(){let e=this.heap[0],t=this.heap.pop();return!e||!t||this.heap.length===0?e:(this.heap[0]=t,this.siftDown(0),e)}siftDown(e){let t=this.heap[e],n=e;for(;;){let e=n*2+1;if(e>=this.heap.length)break;let r=e+1,i=r<this.heap.length&&this.heap[r].nextDueAt<this.heap[e].nextDueAt?r:e;if(this.heap[i].nextDueAt>=t.nextDueAt)break;this.heap[n]=this.heap[i],n=i}this.heap[n]=t}};function l(e,t=1){if(e.length===0)throw RangeError(`createPulse requires at least one color`);return n=>e[Math.floor(n*t)%e.length]}function u(e){if(e.length===0)throw RangeError(`createWave requires at least one color`);return(t,n,r,i)=>{let a=(n+t)%i;return e[Math.floor(a/i*e.length)]??e[0]}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=class extends e{_name;_frames;_interval;_autoplay;_backgroundColor;_parsedBackgroundColor;_color;_parsedColor;_currentFrameIndex=0;_encodedFrames={};_lib=n();_isRunning=!1;_advanceFrame=()=>{!this._isRunning||this.isDestroyed||(this._currentFrameIndex=(this._currentFrameIndex+1)%this._frames.length,this.requestRender())};_defaultOptions={name:`dots`,frames:r.dots.frames,interval:r.dots.interval,autoplay:!0,backgroundColor:`transparent`,color:`white`};constructor(e,n){super(e,n),this._name=n.name,this._frames=n.frames?.length?n.frames:this._name?r[this._name].frames:this._defaultOptions.frames,this._interval=o(n.interval??(this._name?r[this._name].interval:this._defaultOptions.interval)),this._autoplay=n.autoplay??this._defaultOptions.autoplay,this._backgroundColor=n.backgroundColor??this._defaultOptions.backgroundColor,this._parsedBackgroundColor=t(this._backgroundColor),this._color=n.color??this._defaultOptions.color,this._parsedColor=typeof this._color==`function`?t(this._defaultOptions.color):t(this._color),this.height=1,this._encodeFrames(),this._autoplay&&this.start()}_encodeFrames(){let e=0;for(let t of this._frames){if(this._encodedFrames[t])continue;let n=this._lib.encodeUnicode(t,this.ctx.widthMethod);n&&(this._encodedFrames[t]=n,e=Math.max(e,n.data.reduce((e,t)=>e+t.width,0)))}this.width=e}_freeFrames(){for(let e in this._encodedFrames)this._encodedFrames[e]&&this._lib.freeUnicode(this._encodedFrames[e]);this._encodedFrames={}}get interval(){return this._interval}set interval(e){this._interval=o(e),this._isRunning&&c.reschedule(this,this._interval)}get name(){return this._name}set name(e){let t=e?r[e].frames:this._defaultOptions.frames,n=o(e?r[e].interval:this._defaultOptions.interval),i=!d(this._frames,t),a=this._interval!==n;this._name=e,this._interval=n,i&&(this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()),this._isRunning&&a&&c.reschedule(this,n)}get frames(){return this._frames}set frames(e){let t=e.length===0?this._defaultOptions.frames:e;if(d(this._frames,t)){this._frames=t;return}this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()}get color(){return this._color}set color(e){this._color=e,typeof e!=`function`&&(this._parsedColor=t(e)),this.visible&&this.requestRender()}get backgroundColor(){return this._backgroundColor}set backgroundColor(e){this._backgroundColor=e,this._parsedBackgroundColor=t(e),this.visible&&this.requestRender()}get visible(){return super.visible}set visible(e){e!==super.visible&&(super.visible=e,this._isRunning&&(e?c.start(this,this._interval,this._advanceFrame):c.stop(this)))}get autoplay(){return this._autoplay}set autoplay(e){this._autoplay=e,e?this.start():this.stop()}start(){this._isRunning||this.isDestroyed||(this._isRunning=!0,this.visible&&c.start(this,this._interval,this._advanceFrame))}stop(){this._isRunning&&(this._isRunning=!1,c.stop(this))}renderSelf(e){if(!this.visible)return;let n=this._frames[this._currentFrameIndex];if(!n)return;let r=this._encodedFrames[n];if(!r)return;let i=this.x;for(let n=0;n<r.data.length;n++){let a=typeof this._color==`function`?t(this._color(this._currentFrameIndex,n,this._frames.length,r.data.length)):this._parsedColor;e.drawChar(r.data[n].char,i,this.y,a,this._parsedBackgroundColor),i+=r.data[n].width}}destroySelf(){this.stop(),this._freeFrames(),super.destroySelf()}};export{l as n,u as r,f as t};", | ||
| "import{t as e}from\"./src-DjeqLSfu.mjs\";import{extend as t}from\"@opentui/solid/components\";function n(){t({spinner:e})}n();export{n as registerSpinner};", | ||
| "import { getComponentCatalogue } from \"@opentui/solid/components\"\nimport { registerSpinner } from \"opentui-spinner/solid\"\n\nexport function registerOpencodeSpinner() {\n if (!getComponentCatalogue().spinner) registerSpinner()\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "7A7970717F6661B264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/theme/color.ts", "../tui/src/theme/resolve.ts"], | ||
| "sourcesContent": [ | ||
| "import { RGBA } from \"@opentui/core\"\n\nexport function ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansiColors = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansiColors[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const val = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(val(r), val(g), val(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nexport function tint(base: RGBA, overlay: RGBA, alpha: number): RGBA {\n const r = base.r + (overlay.r - base.r) * alpha\n const g = base.g + (overlay.g - base.g) * alpha\n const b = base.b + (overlay.b - base.b) * alpha\n return RGBA.fromInts(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255))\n}\n", | ||
| "import { RGBA } from \"@opentui/core\"\nimport { ansiToRgba } from \"./color\"\nimport type { ColorValue, Theme, ThemeColor, ThemeV1Json } from \"./v1\"\n\nexport function resolveThemeColors(\n theme: ThemeV1Json,\n mode: \"dark\" | \"light\",\n resolveAnsi: (code: number) => RGBA = ansiToRgba,\n) {\n const defs = theme.defs ?? {}\n function resolveColor(color: ColorValue, chain: string[] = []): RGBA {\n if (color instanceof RGBA) return color\n if (typeof color === \"string\") {\n if (color === \"transparent\" || color === \"none\") return RGBA.fromInts(0, 0, 0, 0)\n\n if (color.startsWith(\"#\")) return RGBA.fromHex(color)\n\n if (chain.includes(color)) {\n throw new Error(`Circular color reference: ${[...chain, color].join(\" -> \")}`)\n }\n\n const next = defs[color] ?? theme.theme[color as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${color}\" not found in defs or theme`)\n }\n return resolveColor(next, [...chain, color])\n }\n if (typeof color === \"number\") return resolveAnsi(color)\n return resolveColor(color[mode], chain)\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n const hasSelectedListItemText = theme.theme.selectedListItemText !== undefined\n return {\n theme: {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText: hasSelectedListItemText\n ? resolveColor(theme.theme.selectedListItemText!)\n : resolved.background!,\n backgroundMenu:\n theme.theme.backgroundMenu === undefined\n ? resolved.backgroundElement!\n : resolveColor(theme.theme.backgroundMenu),\n } satisfies Omit<Theme, \"_hasSelectedListItemText\" | \"thinkingOpacity\">,\n hasSelectedListItemText,\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAEO,SAAS,CAAU,CAAC,EAAoB,CAC7C,GAAI,EAAO,GAAI,CACb,IAAM,EAAa,CACjB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,OAAO,EAAK,QAAQ,EAAW,IAAS,SAAS,EAGnD,GAAI,EAAO,IAAK,CACd,IAAM,EAAQ,EAAO,GACf,EAAI,EAAQ,EACZ,EAAI,KAAK,MAAM,EAAQ,CAAC,EAAI,EAC5B,EAAI,KAAK,MAAM,EAAQ,EAAE,EACzB,EAAM,CAAC,IAAe,IAAM,EAAI,EAAI,EAAI,GAAK,GACnD,OAAO,EAAK,SAAS,EAAI,CAAC,EAAG,EAAI,CAAC,EAAG,EAAI,CAAC,CAAC,EAG7C,GAAI,EAAO,IAAK,CACd,IAAM,GAAQ,EAAO,KAAO,GAAK,EACjC,OAAO,EAAK,SAAS,EAAM,EAAM,CAAI,EAGvC,OAAO,EAAK,SAAS,EAAG,EAAG,CAAC,EAGvB,SAAS,CAAI,CAAC,EAAY,EAAe,EAAqB,CACnE,IAAM,EAAI,EAAK,GAAK,EAAQ,EAAI,EAAK,GAAK,EACpC,EAAI,EAAK,GAAK,EAAQ,EAAI,EAAK,GAAK,EACpC,EAAI,EAAK,GAAK,EAAQ,EAAI,EAAK,GAAK,EAC1C,OAAO,EAAK,SAAS,KAAK,MAAM,EAAI,GAAG,EAAG,KAAK,MAAM,EAAI,GAAG,EAAG,KAAK,MAAM,EAAI,GAAG,CAAC,EC1C7E,SAAS,CAAkB,CAChC,EACA,EACA,EAAsC,EACtC,CACA,IAAM,EAAO,EAAM,MAAQ,CAAC,EAC5B,SAAS,CAAY,CAAC,EAAmB,EAAkB,CAAC,EAAS,CACnE,GAAI,aAAiB,EAAM,OAAO,EAClC,GAAI,OAAO,IAAU,SAAU,CAC7B,GAAI,IAAU,eAAiB,IAAU,OAAQ,OAAO,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EAEhF,GAAI,EAAM,WAAW,GAAG,EAAG,OAAO,EAAK,QAAQ,CAAK,EAEpD,GAAI,EAAM,SAAS,CAAK,EACtB,MAAU,MAAM,6BAA6B,CAAC,GAAG,EAAO,CAAK,EAAE,KAAK,MAAM,GAAG,EAG/E,IAAM,EAAO,EAAK,IAAU,EAAM,MAAM,GACxC,GAAI,IAAS,OACX,MAAU,MAAM,oBAAoB,+BAAmC,EAEzE,OAAO,EAAa,EAAM,CAAC,GAAG,EAAO,CAAK,CAAC,EAE7C,GAAI,OAAO,IAAU,SAAU,OAAO,EAAY,CAAK,EACvD,OAAO,EAAa,EAAM,GAAO,CAAK,EAGxC,IAAM,EAAW,OAAO,YACtB,OAAO,QAAQ,EAAM,KAAK,EACvB,OAAO,EAAE,KAAS,IAAQ,wBAA0B,IAAQ,kBAAoB,IAAQ,iBAAiB,EACzG,IAAI,EAAE,EAAK,KAAW,CAAC,EAAK,EAAa,CAAmB,CAAC,CAAC,CACnE,EAEM,EAA0B,EAAM,MAAM,uBAAyB,OACrE,MAAO,CACL,MAAO,IACD,EACJ,qBAAsB,EAClB,EAAa,EAAM,MAAM,oBAAqB,EAC9C,EAAS,WACb,eACE,EAAM,MAAM,iBAAmB,OAC3B,EAAS,kBACT,EAAa,EAAM,MAAM,cAAc,CAC/C,EACA,0BACA,gBAAiB,EAAM,MAAM,iBAAmB,GAClD", | ||
| "debugId": "C2F8FAAD85A76ECB64756E2164756E21", | ||
| "names": [] | ||
| } |
+1
-1
| { | ||
| "name": "@opencode-ai/cli-linux-x64-baseline", | ||
| "version": "0.0.0-dev-17750", | ||
| "version": "0.0.0-dev-17751", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "repository": { |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Npm } from \"@opencode-ai/util/npm\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { resolveConfigPath } from \"../mcp/add\"\nimport { Config } from \"../../../config\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.add,\n Effect.fn(\"cli.plugin.add\")(function* (input) {\n if (!(yield* Effect.promise(() => Npm.isRegistryPackage(input.package))))\n return yield* Effect.fail(\n new Error(\"Plugin target must be an npm registry package name, version, tag, or semver range\"),\n )\n const npm = yield* Npm.Service\n const installed = yield* npm.add(input.package, { subpaths: [\"server\", \"\"] })\n const tui = yield* npm.resolve(input.package, { subpaths: [\"tui\"] })\n const target = configurationTarget(installed.entrypoint, tui.entrypoint)\n if (!target)\n return yield* Effect.fail(new Error(`Plugin package has no server or TUI entrypoint: ${input.package}`))\n\n if (target === \"server\") {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const changed = yield* Effect.promise(() => writePluginConfig(configPath, input.package))\n process.stdout.write(\n changed\n ? `Plugin \"${input.package}\" installed and added to ${configPath}${EOL}`\n : `Plugin \"${input.package}\" is already configured in ${configPath}${EOL}`,\n )\n return\n }\n\n const config = yield* Config.Service\n yield* config.update((draft) => {\n if (configured(draft.plugins, input.package)) return\n draft.plugins = [...(draft.plugins ?? []), input.package]\n })\n process.stdout.write(`TUI plugin \"${input.package}\" installed and added to ${config.path}${EOL}`)\n }),\n)\n\nexport function configurationTarget(server?: string, tui?: string) {\n if (server) return \"server\" as const\n if (tui) return \"tui\" as const\n}\n\nexport async function writePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(text, [\"plugins\"], [...(plugins ?? []), spec], { formattingOptions: { tabSize: 2, insertSpaces: true } }),\n )\n await mkdir(path.dirname(configPath), { recursive: true })\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some(\n (entry) =>\n entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec),\n )\n}\n" | ||
| ], | ||
| "mappings": ";8tBAAA,cAAS,WACT,oBACA,gBAAS,cAAO,YAAU,eAAQ,oBAUlC,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,IAClC,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,GAAI,EAAE,MAAO,EAAO,QAAQ,IAAM,EAAI,kBAAkB,EAAM,OAAO,CAAC,GACpE,OAAO,MAAO,EAAO,KACf,MAAM,mFAAmF,CAC/F,EACF,IAAM,EAAM,MAAO,EAAI,QACjB,EAAY,MAAO,EAAI,IAAI,EAAM,QAAS,CAAE,SAAU,CAAC,SAAU,EAAE,CAAE,CAAC,EACtE,EAAM,MAAO,EAAI,QAAQ,EAAM,QAAS,CAAE,SAAU,CAAC,KAAK,CAAE,CAAC,EAC7D,EAAS,EAAoB,EAAU,WAAY,EAAI,UAAU,EACvE,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,mDAAmD,EAAM,SAAS,CAAC,EAEzG,GAAI,IAAW,SAAU,CACvB,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAY,EAAM,OAAO,CAAC,EACxF,QAAQ,OAAO,MACb,EACI,WAAW,EAAM,mCAAmC,IAAa,IACjE,WAAW,EAAM,qCAAqC,IAAa,GACzE,EACA,OAGF,IAAM,EAAS,MAAO,EAAO,QAC7B,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,GAAI,EAAW,EAAM,QAAS,EAAM,OAAO,EAAG,OAC9C,EAAM,QAAU,CAAC,GAAI,EAAM,SAAW,CAAC,EAAI,EAAM,OAAO,EACzD,EACD,QAAQ,OAAO,MAAM,eAAe,EAAM,mCAAmC,EAAO,OAAO,GAAK,EACjG,CACH,EAEO,SAAS,CAAmB,CAAC,EAAiB,EAAc,CACjE,GAAI,EAAQ,MAAO,SACnB,GAAI,EAAK,MAAO,MAGlB,eAAsB,CAAiB,CAAC,EAAoB,EAAc,CACxE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,EAAW,EAAS,CAAI,EAAG,MAAO,GAEtC,IAAM,EAAU,EACd,EACA,EAAO,EAAM,CAAC,SAAS,EAAG,CAAC,GAAI,GAAW,CAAC,EAAI,CAAI,EAAG,CAAE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CAAE,CAAC,CACjH,EACA,MAAM,EAAM,EAAK,QAAQ,CAAU,EAAG,CAAE,UAAW,EAAK,CAAC,EACzD,IAAM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KACd,CAAC,IACC,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,OAAQ,YAAa,IAAS,EAAM,UAAY,CAC9G", | ||
| "debugId": "123646331763616264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "D59AFB82ABE7CC0464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "196F7A95EC0BAC9264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "CAE7E71C20C877BF64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/services/service-registration.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport { Effect, Option, Redacted, Schedule } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { ServiceRegistration } from \"./services/service-registration\"\nimport { Updater } from \"./services/updater\"\nimport { WebUi } from \"./services/web-ui\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* ServiceRegistration.register({\n address,\n password,\n id: instanceID,\n file: serviceOptions.file,\n shutdown,\n })\n }),\n },\n transform,\n ).pipe(\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "export * as ServiceRegistration from \"./service-registration\"\n\nimport { Service, type Info } from \"@opencode-ai/client/effect/service\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { OPENCODE_VERSION } from \"../version\"\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nexport const register = Effect.fnUntraced(function* (options: {\n readonly address: HttpServer.Address\n readonly password: string\n readonly id: string\n readonly file: string\n readonly shutdown: Effect.Effect<void>\n}) {\n const fs = yield* FileSystem.FileSystem\n const temp = options.file + \".\" + options.id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(options.file), { recursive: true })\n const info = {\n id: options.id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(options.address),\n pid: process.pid,\n password: options.password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(options.file).pipe(Effect.flatMap(decodeInfo))\n const owns = (found: Info) =>\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, options.file)))\n yield* current.pipe(\n Effect.catchCause((cause) =>\n Effect.logWarning(\"managed service registration check failed; shutting down\", {\n cause,\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n }).pipe(Effect.andThen(Effect.failCause(cause))),\n ),\n Effect.tap((found) =>\n owns(found)\n ? Effect.void\n : Effect.logWarning(\"managed service registration replaced; shutting down\", {\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n observedServiceID: found.id,\n observedServicePID: found.pid,\n observedVersion: found.version,\n observedURL: found.url,\n }),\n ),\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(options.shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(options.file) : Effect.void)),\n Effect.ignore,\n )\n})\n", | ||
| "import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const headers = {\n \"content-type\": FSUtil.mimeType(name),\n \"cache-control\": html ? \"no-cache\" : \"public, max-age=31536000, immutable\",\n \"content-security-policy\": html\n ? cspForHtml(typeof file === \"string\" ? file : Buffer.from(file).toString())\n : csp(),\n \"x-content-type-options\": \"nosniff\",\n }\n return Effect.succeed(\n request.method === \"HEAD\" ? HttpServerResponse.empty({ headers }) : HttpServerResponse.raw(file, { headers }),\n )\n}\n\nfunction isRouteNotFound(error: unknown) {\n return error instanceof HttpServerError.HttpServerError && error.reason._tag === \"RouteNotFound\"\n}\n\nfunction csp(hash = \"\") {\n return `default-src 'self'; script-src 'self' 'wasm-unsafe-eval'${hash ? ` 'sha256-${hash}'` : \"\"}; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; media-src 'self' data:; connect-src * data: blob:`\n}\n\nfunction cspForHtml(body: string) {\n const match = body.match(\n /<script\\b(?![^>]*\\bsrc\\s*=)[^>]*\\bid=([\"'])oc-theme-preload-script\\1[^>]*>([\\s\\S]*?)<\\/script>/i,\n )\n return csp(match ? createHash(\"sha256\").update(match[2]).digest(\"base64\") : \"\")\n}\n\nexport * as WebUi from \"./web-ui\"\n", | ||
| "import { Effect, FileSystem, Option } from \"effect\"\nimport path from \"node:path\"\nimport { brotliDecompressSync } from \"node:zlib\"\nimport { OPENCODE_LOCAL } from \"./version\"\n\nexport type AssetMap = Readonly<Record<string, string | Uint8Array>>\ntype EncodedAssetMap = Readonly<Record<string, { readonly content: string; readonly encoding: \"utf8\" | \"base64\" }>>\n\nexport const load = Effect.fn(\"cli.app-assets.load\")(function* () {\n const embedded = yield* Effect.tryPromise(() => import(\"virtual:opencode-app-assets\")).pipe(Effect.option)\n if (Option.isSome(embedded) && embedded.value.default.length > 0) return decodeArchive(embedded.value.default)\n if (!OPENCODE_LOCAL) return yield* Effect.fail(new Error(\"Web UI assets are missing from the CLI build\"))\n return decode(yield* sourceAssets())\n})\n\nfunction decodeArchive(archive: string) {\n const body = brotliDecompressSync(Buffer.from(archive, \"base64\")).toString()\n return decode(JSON.parse(body) as EncodedAssetMap)\n}\n\nconst sourceAssets = Effect.fnUntraced(function* () {\n const fs = yield* FileSystem.FileSystem\n const root = path.resolve(import.meta.dirname, \"../../app/dist\")\n const files = yield* fs.readDirectory(root, { recursive: true })\n return Object.fromEntries(\n (yield* Effect.forEach(\n files.filter((file) => !file.endsWith(\".map\")),\n Effect.fnUntraced(function* (file) {\n const target = path.join(root, file)\n if ((yield* fs.stat(target)).type === \"Directory\") return\n const body = Buffer.from(yield* fs.readFile(target))\n const encoding = isText(file) ? \"utf8\" : \"base64\"\n return [file, { encoding, content: body.toString(encoding) }] as const\n }),\n { concurrency: \"unbounded\" },\n )).filter((asset) => asset !== undefined),\n )\n})\n\nfunction decode(assets: EncodedAssetMap): AssetMap {\n return Object.fromEntries(\n Object.entries(assets).map(([key, asset]) => [\n key,\n asset.encoding === \"utf8\" ? asset.content : Buffer.from(asset.content, \"base64\"),\n ]),\n )\n}\n\nfunction isText(file: string) {\n return file === \"_headers\" || /\\.(?:css|html|js|json|svg|txt|webmanifest|xml)$/.test(file)\n}\n", | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerProcess } from \"../../server-process\"\n\nexport default Runtime.handler(\n Commands.commands.serve,\n Effect.fnUntraced(function* (input) {\n if (input.service && input.stdio) return yield* Effect.fail(new Error(\"--service and --stdio cannot be combined\"))\n return yield* ServerProcess.run({\n mode: input.service ? \"service\" : input.stdio ? \"stdio\" : \"default\",\n hostname: Option.getOrUndefined(input.hostname),\n port: Option.getOrUndefined(input.port),\n })\n }),\n)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "517025EEE175AD9D64756E2164756E21", | ||
| "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": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAU,MAAO,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,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": "8B11EF34D882177364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\nimport { Global } from \"@opencode-ai/util/global\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({\n server: serverURL,\n standalone: input.standalone,\n mismatch: \"replace\",\n })\n const config = yield* Config.Service\n const global = yield* Global.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: Option.getOrUndefined(input.replay) ?? resolved.mini?.replay ?? true,\n replayLimit: Option.getOrUndefined(input.replayLimit) ?? resolved.mini?.replay_limit,\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n paths: { home: global.home, state: global.state, log: global.log },\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";qkCAQA,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAM,CAAC,IACtD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,UAAS,wBAAyB,MAAO,EAAO,QAAQ,IAAa,wCAAa,EAC1F,MAAO,EAAO,QAAQ,SAAY,EAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EACR,WAAY,EAAM,WAClB,SAAU,SACZ,CAAC,EACK,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,GAAK,EAAS,MAAM,QAAU,GACxE,YAAa,EAAO,eAAe,EAAM,WAAW,GAAK,EAAS,MAAM,aACxE,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,EACA,MAAO,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CACnE,CAAC,CACH,EACD,CACH", | ||
| "debugId": "E8FAB7796DCE11A964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/get.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.get,\n Effect.fn(\"cli.service.get\")(function* (input) {\n process.stdout.write(\n (yield* ServiceConfig.get(Option.getOrUndefined(input.key), Option.getOrUndefined(input.name))) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";02BAAA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,QAAQ,OAAO,OACZ,MAAO,EAAc,IAAI,EAAO,eAAe,EAAM,GAAG,EAAG,EAAO,eAAe,EAAM,IAAI,CAAC,GAAK,CACpG,EACD,CACH", | ||
| "debugId": "EC50ADA0955B59A364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../simulation/src/recording.ts", "../simulation/src/frontend/renderer.ts", "../simulation/src/frontend/semantics.ts", "../simulation/src/frontend/actions.ts", "../simulation/src/frontend/server.ts", "../simulation/src/frontend/simulation.ts"], | ||
| "sourcesContent": [ | ||
| "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 kittyKeyboard: Boolean(options.useKittyKeyboard),\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 type { Renderable } from \"@opentui/core\"\nimport type { SimulationProtocol } from \"../protocol\"\n\n// Semantic renderables set an explicit stable OpenTUI id so ui.state and\n// ui.snapshot expose the same identity. Hierarchy and element handles come\n// from the live render tree.\nexport type Definition = Omit<SimulationProtocol.Frontend.SemanticNode, \"id\" | \"element\" | \"parent\">\n\nconst key = Symbol.for(\"opencode.simulation.semantics\")\n\nconst bind = (definition: () => Definition) => (renderable: Renderable) => {\n Object.defineProperty(renderable, key, { value: definition, configurable: true })\n}\n\nexport const read = (renderable: Renderable) => {\n const definition: unknown = Reflect.get(renderable, key)\n return typeof definition === \"function\" ? (definition as () => Definition) : undefined\n}\n\nexport const SimulationSemantics = { bind, read }\n", | ||
| "import 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 { Effect, Schema } from \"effect\"\nimport { SimulationProtocol } from \"../protocol\"\nimport { SimulationRenderer } from \"./renderer\"\nimport { SimulationSemantics } from \"./semantics\"\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 const target = renderer.hitTest(x, y)\n return all(renderable).some((item) => item.num === target)\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 const renderable = harness.renderer.currentFocusedRenderable?.num\n return {\n focused: {\n ...(renderable === undefined ? {} : { renderable }),\n editor: Boolean(harness.renderer.currentFocusedEditor),\n },\n elements: elements(harness.renderer),\n }\n}\n\nexport function snapshot(harness: Harness): SimulationProtocol.Frontend.SemanticSnapshot {\n const ids = new Set<string>()\n const visit = (renderable: Renderable, parent?: string): SimulationProtocol.Frontend.SemanticNode[] => {\n if (!renderable.visible || renderable.isDestroyed) return []\n const definition = SimulationSemantics.read(renderable)?.()\n if (definition && ids.has(renderable.id)) throw new Error(`duplicate semantic UI id: ${renderable.id}`)\n if (definition) ids.add(renderable.id)\n const node = definition\n ? [{ id: renderable.id, ...definition, ...(parent === undefined ? {} : { parent }), element: renderable.num }]\n : []\n const ancestor = definition ? renderable.id : parent\n return [...node, ...children(renderable).flatMap((child) => visit(child, ancestor))]\n }\n return Schema.decodeUnknownSync(SimulationProtocol.Frontend.SemanticSnapshot)({\n format: \"opencode-ui-snapshot-v1\",\n nodes: visit(harness.renderer.root),\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 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 const target = all(harness.renderer.root).find((item) => item.num === action.target)\n if (!target || !target.visible || target.isDestroyed)\n return yield* Effect.fail(new Error(`click target is stale or unavailable: ${action.target}`))\n if (action.semantic) {\n const current = snapshot(harness).nodes.find((node) => node.element === action.target)\n if (\n current?.id !== action.semantic.id ||\n current.instance !== action.semantic.instance ||\n current.element !== action.semantic.element\n )\n return yield* Effect.fail(new Error(`semantic click target is stale or unavailable: ${action.semantic.id}`))\n }\n if (\n !Number.isFinite(action.x) ||\n action.x < 0 ||\n action.x >= target.width ||\n !Number.isFinite(action.y) ||\n action.y < 0 ||\n action.y >= target.height\n )\n return yield* Effect.fail(new Error(\"click position must be within the target element\"))\n yield* Effect.tryPromise(() => harness.mockMouse.click(target.screenX + action.x, target.screenY + action.y))\n break\n }\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 { 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, version: string) {\n switch (request.method) {\n case \"simulation.handshake\":\n return SimulationProtocol.Handshake.dispatch(\n {\n role: \"ui\",\n server: { name: \"opencode\", version },\n capabilities: SimulationProtocol.Frontend.Capabilities,\n },\n request.params,\n )\n case \"ui.capture\":\n return SimulationActions.capture(harness)\n case \"ui.state\":\n return Effect.sync(() => SimulationActions.state(harness))\n case \"ui.snapshot\":\n return Effect.sync(() => SimulationActions.snapshot(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 semantic: request.params.semantic,\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* (\n harness: Harness,\n endpoint: string,\n version = \"unknown\",\n) {\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, version),\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, version: string) {\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(\n SimulationActions.createHarness(renderer),\n manifest.endpoints.ui,\n version,\n )\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": "9356C067B77E2FEF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "4402BD365014B56264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { autocomplete, intro, outro, spinner } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { IntegrationInfo } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { createClient, loadIntegrations, location, request, resolveIntegration } from \"./shared\"\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.logout,\n Effect.fn(\"cli.auth.logout\")((input) =>\n logout({\n target: Option.getOrUndefined(input.target),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst logout = Effect.fn(\"cli.auth.logout.run\")(function* (input: {\n target?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Remove credential\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integrations = yield* loadIntegrations(client)\n const integration = yield* chooseIntegration(integrations, input.target)\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n const environment = integration.connections\n .filter((connection) => connection.type === \"env\")\n .map((connection) => connection.name)\n if (environment.length) {\n yield* Effect.fail(\n new Error(\n `${integration.name} is authenticated through ${environment.join(\", \")}; unset the environment variable to disconnect`,\n ),\n )\n }\n yield* Effect.fail(new Error(`No stored credentials for ${integration.name}`))\n }\n const progress = spinner()\n progress.start(\"Removing credential...\")\n yield* Effect.forEach(\n credentials,\n (connection) =>\n request((signal) => client.credential.remove({ credentialID: connection.id, location }, { signal })),\n { concurrency: \"unbounded\", discard: true },\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Disconnected from ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Failed to remove credential\", 1))),\n )\n outro(\"Done\")\n})\n\nconst chooseIntegration = Effect.fn(\"cli.auth.logout.integration\")(function* (\n integrations: IntegrationInfo[],\n target?: string,\n) {\n if (target) return yield* resolveIntegration(integrations, target)\n const configured = integrations.filter((integration) =>\n integration.connections.some((connection) => connection.type === \"credential\"),\n )\n if (configured.length === 0) return yield* Effect.fail(new Error(\"No stored credentials found\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: configured.map((integration) => ({\n value: integration.id,\n label: integration.name,\n hint: integration.connections\n .filter((connection) => connection.type === \"credential\")\n .map((connection) => connection.label)\n .join(\", \"),\n })),\n }),\n )\n return yield* resolveIntegration(configured, id)\n})\n" | ||
| ], | ||
| "mappings": ";wtCAQA,IAAe,IAAQ,QACrB,EAAS,SAAS,KAAK,SAAS,OAChC,EAAO,GAAG,iBAAiB,EAAE,CAAC,IAC5B,EAAO,CACL,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EAAE,KAAK,CAAkB,CAC5B,CACF,EAEM,EAAS,EAAO,GAAG,qBAAqB,EAAE,SAAU,CAAC,EAIxD,CACD,GAAI,CAAC,EAAM,OACT,MAAO,EAAmB,6EAA6E,EACzG,EAAM,mBAAmB,EACzB,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAM,OAAQ,WAAY,EAAM,UAAW,CAAC,EACnF,EAAe,MAAO,EAAiB,CAAM,EAC7C,EAAc,MAAO,EAAkB,EAAc,EAAM,MAAM,EACjE,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,IAAM,EAAc,EAAY,YAC7B,OAAO,CAAC,IAAe,EAAW,OAAS,KAAK,EAChD,IAAI,CAAC,IAAe,EAAW,IAAI,EACtC,GAAI,EAAY,OACd,MAAO,EAAO,KACR,MACF,GAAG,EAAY,iCAAiC,EAAY,KAAK,IAAI,iDACvE,CACF,EAEF,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAY,MAAM,CAAC,EAE/E,IAAM,EAAW,EAAQ,EACzB,EAAS,MAAM,wBAAwB,EACvC,MAAO,EAAO,QACZ,EACA,CAAC,IACC,EAAQ,CAAC,IAAW,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EACrG,CAAE,YAAa,YAAa,QAAS,EAAK,CAC5C,EAAE,KACA,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,qBAAqB,EAAY,MAAM,CAAC,CAAC,EAC1F,EAAO,SAAS,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,8BAA+B,CAAC,CAAC,CAAC,CAC1F,EACA,EAAM,MAAM,EACb,EAEK,EAAoB,EAAO,GAAG,6BAA6B,EAAE,SAAU,CAC3E,EACA,EACA,CACA,GAAI,EAAQ,OAAO,MAAO,EAAmB,EAAc,CAAM,EACjE,IAAM,EAAa,EAAa,OAAO,CAAC,IACtC,EAAY,YAAY,KAAK,CAAC,IAAe,EAAW,OAAS,YAAY,CAC/E,EACA,GAAI,EAAW,SAAW,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,6BAA6B,CAAC,EAC/F,IAAM,EAAK,MAAO,EAAe,IAC/B,EAAa,CACX,QAAS,qBACT,SAAU,EACV,QAAS,EAAW,IAAI,CAAC,KAAiB,CACxC,MAAO,EAAY,GACnB,MAAO,EAAY,KACnB,KAAM,EAAY,YACf,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACvD,IAAI,CAAC,IAAe,EAAW,KAAK,EACpC,KAAK,IAAI,CACd,EAAE,CACJ,CAAC,CACH,EACA,OAAO,MAAO,EAAmB,EAAY,CAAE,EAChD", | ||
| "debugId": "90AAAFFA840EF49064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "7E709F2CB06D941364756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { createClient, loadIntegrations } from \"./shared\"\nimport { errorMessage } from \"../../../ui/prompt\"\n\nexport default Runtime.handler(Commands.commands.auth.commands.list, (input) =>\n list(input).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n)\n\nconst list = Effect.fn(\"cli.auth.list\")(function* (input) {\n const client = yield* createClient({ server: Option.getOrUndefined(input.server), standalone: input.standalone })\n const integrations = (yield* loadIntegrations(client)).filter((integration) => integration.connections.length > 0)\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify(\n integrations.map((integration) => ({\n id: integration.id,\n name: integration.name,\n connections: integration.connections,\n })),\n null,\n 2,\n ) + EOL,\n )\n return\n }\n const rows = integrations.flatMap((integration) =>\n integration.connections.map((connection) => ({\n integration: integration.name,\n source: connection.type === \"credential\" ? connection.label : connection.name,\n type: connection.type === \"credential\" ? \"stored\" : \"environment\",\n })),\n )\n if (rows.length === 0) {\n process.stdout.write(\"No authenticated integrations\" + EOL)\n return\n }\n const width = Math.max(...rows.map((row) => row.integration.length)) + 2\n process.stdout.write(\n rows.map((row) => row.integration.padEnd(width) + row.source.padEnd(28) + row.type).join(EOL) + EOL,\n )\n})\n" | ||
| ], | ||
| "mappings": ";gpCAAA,cAAS,WAOT,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAK,SAAS,KAAM,CAAC,IACpE,EAAK,CAAK,EAAE,KACV,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,EAEM,EAAO,EAAO,GAAG,eAAe,EAAE,SAAU,CAAC,EAAO,CACxD,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAO,eAAe,EAAM,MAAM,EAAG,WAAY,EAAM,UAAW,CAAC,EAC1G,GAAgB,MAAO,EAAiB,CAAM,GAAG,OAAO,CAAC,IAAgB,EAAY,YAAY,OAAS,CAAC,EACjH,GAAI,EAAM,SAAW,OAAQ,CAC3B,QAAQ,OAAO,MACb,KAAK,UACH,EAAa,IAAI,CAAC,KAAiB,CACjC,GAAI,EAAY,GAChB,KAAM,EAAY,KAClB,YAAa,EAAY,WAC3B,EAAE,EACF,KACA,CACF,EAAI,CACN,EACA,OAEF,IAAM,EAAO,EAAa,QAAQ,CAAC,IACjC,EAAY,YAAY,IAAI,CAAC,KAAgB,CAC3C,YAAa,EAAY,KACzB,OAAQ,EAAW,OAAS,aAAe,EAAW,MAAQ,EAAW,KACzE,KAAM,EAAW,OAAS,aAAe,SAAW,aACtD,EAAE,CACJ,EACA,GAAI,EAAK,SAAW,EAAG,CACrB,QAAQ,OAAO,MAAM,gCAAkC,CAAG,EAC1D,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,MAAM,CAAC,EAAI,EACvE,QAAQ,OAAO,MACb,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,OAAO,CAAK,EAAI,EAAI,OAAO,OAAO,EAAE,EAAI,EAAI,IAAI,EAAE,KAAK,CAAG,EAAI,CAClG,EACD", | ||
| "debugId": "F825ABF475B2B8E064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/version.ts"], | ||
| "sourcesContent": [ | ||
| "declare const OPENCODE_VERSION: string\ndeclare const OPENCODE_CHANNEL: string\n\nconst version = typeof OPENCODE_VERSION === \"string\" ? OPENCODE_VERSION : \"local\"\nconst channel = typeof OPENCODE_CHANNEL === \"string\" ? OPENCODE_CHANNEL : \"local\"\n\nexport { version as OPENCODE_VERSION, channel as OPENCODE_CHANNEL }\nexport const OPENCODE_LOCAL = channel === \"local\"\n" | ||
| ], | ||
| "mappings": ";AAGA,IAAM,EAAiD,kBACjD,EAAiD,MAGhD,IAAM,EAAiB", | ||
| "debugId": "A7D0494C2D7AB75D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/form.ts", "src/commands/handlers/auth/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { confirm, log, multiselect, password, select, text, type Option } from \"@clack/prompts\"\nimport { Effect } from \"effect\"\nimport type { FormAnswer, FormField, FormFields } from \"@opencode-ai/client\"\nimport { openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\n\nconst skip = Symbol(\"skip\")\nconst custom = Symbol(\"custom\")\n\nexport const answerForm = Effect.fn(\"cli.auth.form\")(function* (fields: FormFields | undefined) {\n if (!fields) return undefined\n yield* requireInteractive(\"Authentication form input requires an interactive terminal\")\n const answer: FormAnswer = {}\n for (const field of fields) {\n if (!active(field, answer)) continue\n const value = yield* answerField(field)\n if (value !== undefined) answer[field.key] = value\n }\n return answer\n})\n\nexport const secret = Effect.fn(\"cli.auth.secret\")(function* (message: string) {\n yield* requireInteractive(\"API key input requires an interactive terminal\")\n return yield* prompt<string>(() => password({ message, validate: (value) => (!value ? \"Required\" : undefined) }))\n})\n\nconst answerField = Effect.fn(\"cli.auth.form.field\")(function* (field: FormField) {\n const message = field.title ?? field.key\n if (field.description) log.info(field.description)\n if (field.type === \"external\") {\n log.info(field.url)\n yield* openUrl(field.url)\n const acknowledged = yield* prompt<boolean>(() =>\n confirm({ message: message || \"Continue after completing this step?\", initialValue: true }),\n )\n if (!acknowledged) return yield* Effect.fail(new Error(`${message || \"External step\"} is required`))\n return true\n }\n if (field.type === \"boolean\") {\n if (field.required) return yield* prompt<boolean>(() => confirm({ message, initialValue: field.default ?? true }))\n const options: Array<Option<boolean | typeof skip>> = [\n { value: true, label: \"Yes\" },\n { value: false, label: \"No\" },\n { value: skip, label: \"Skip\" },\n ]\n const value = yield* prompt<boolean | typeof skip>(() =>\n select<boolean | typeof skip>({\n message,\n options,\n initialValue: field.default ?? skip,\n }),\n )\n if (value === skip) return undefined\n return value\n }\n if (field.type === \"multiselect\") {\n const options: Array<Option<string | typeof custom>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type another value\" })\n const values = yield* prompt<Array<string | typeof custom>>(() =>\n multiselect<string | typeof custom>({\n message,\n options,\n initialValues: field.default,\n required: field.required || (field.minItems ?? 0) > 0,\n }),\n )\n const selected = values.filter((value): value is string => value !== custom)\n if (values.includes(custom)) {\n selected.push(yield* prompt<string>(() => text({ message: \"Enter value\", validate: required })))\n }\n if (field.minItems !== undefined && selected.length < field.minItems) {\n return yield* Effect.fail(new Error(`Select at least ${field.minItems}`))\n }\n if (field.maxItems !== undefined && selected.length > field.maxItems) {\n return yield* Effect.fail(new Error(`Select at most ${field.maxItems}`))\n }\n return selected\n }\n if (field.type === \"string\" && field.options) {\n const options: Array<Option<string | typeof custom | typeof skip>> = field.options.map((option) => ({\n value: option.value,\n label: option.label,\n hint: option.description,\n }))\n if (field.custom) options.push({ value: custom, label: \"Type your own answer\" })\n if (!field.required) options.push({ value: skip, label: \"Skip\" })\n const value = yield* prompt<string | typeof custom | typeof skip>(() =>\n select<string | typeof custom | typeof skip>({ message, options, initialValue: field.default }),\n )\n if (value === skip) return undefined\n if (value !== custom) return value\n }\n const value = yield* prompt<string>(() =>\n text({\n message,\n placeholder: field.type === \"string\" ? field.placeholder : undefined,\n initialValue: field.default === undefined ? undefined : String(field.default),\n validate: (input) => validateText(field, input),\n }),\n )\n if (!value && !field.required) return undefined\n if (field.type === \"string\") return value\n return Number(value)\n})\n\nfunction active(field: FormField, answer: FormAnswer) {\n if (field.type === \"external\" || !field.when) return true\n return field.when.every((condition) => {\n const value = answer[condition.key]\n if (value === undefined) return false\n const matches = Array.isArray(value) ? value.includes(String(condition.value)) : value === condition.value\n return condition.op === \"eq\" ? matches : !matches\n })\n}\n\nfunction required(value: string | undefined) {\n return value ? undefined : \"Required\"\n}\n\nfunction validateText(field: Exclude<FormField, { type: \"boolean\" | \"external\" | \"multiselect\" }>, value?: string) {\n if (!value) return field.required ? \"Required\" : undefined\n if (field.type === \"number\" || field.type === \"integer\") {\n const number = Number(value)\n if (!Number.isFinite(number)) return \"Expected a number\"\n if (field.type === \"integer\" && !Number.isInteger(number)) return \"Expected an integer\"\n if (typeof field.minimum === \"number\" && number < field.minimum) return `Must be at least ${field.minimum}`\n if (typeof field.maximum === \"number\" && number > field.maximum) return `Must be at most ${field.maximum}`\n return undefined\n }\n if (field.minLength !== undefined && value.length < field.minLength)\n return `Must be at least ${field.minLength} characters`\n if (field.maxLength !== undefined && value.length > field.maxLength)\n return `Must be at most ${field.maxLength} characters`\n if (field.pattern) {\n try {\n if (!new RegExp(field.pattern).test(value)) return \"Invalid format\"\n } catch {\n return \"Invalid format\"\n }\n }\n if (field.format === \"uri\" && !URL.canParse(value)) return \"Expected a URL\"\n if (field.format === \"email\" && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) return \"Expected an email address\"\n if (field.format === \"date\") {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return \"Expected a date\"\n const date = new Date(`${value}T00:00:00.000Z`)\n if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== value) return \"Expected a date\"\n }\n if (field.format === \"date-time\" && Number.isNaN(Date.parse(value))) return \"Expected a date and time\"\n return undefined\n}\n", | ||
| "import { autocomplete, intro, log, outro, select, spinner, text } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { FormAnswer, IntegrationInfo, OpenCodeClient } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, openUrl, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { answerForm, secret } from \"./form\"\nimport {\n createClient,\n connectMethods,\n loadIntegrations,\n location,\n request,\n resolveIntegration,\n resolveMethod,\n type ConnectMethod,\n} from \"./shared\"\n\nconst integrationPriority = new Map([\n [\"opencode\", 0],\n [\"opencode-go\", 1],\n [\"openai\", 2],\n [\"github-copilot\", 3],\n [\"google\", 4],\n [\"anthropic\", 5],\n [\"openrouter\", 6],\n [\"vercel\", 7],\n])\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.login,\n Effect.fn(\"cli.auth.login\")((input) =>\n login({\n target: Option.getOrUndefined(input.target),\n method: Option.getOrUndefined(input.method),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst login = Effect.fn(\"cli.auth.login.run\")(function* (input: {\n target?: string\n method?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Connect an integration\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integration = yield* findIntegration(client, input.target)\n const methods = connectMethods(integration)\n if (methods.length === 0) yield* Effect.fail(new Error(`${integration.name} has no interactive login methods`))\n const method = yield* chooseMethod(methods, input.method)\n const answer = method.type === \"command\" ? undefined : yield* answerForm(method.form)\n yield* authenticate(client, integration, method, answer)\n outro(\"Done\")\n})\n\nconst findIntegration = Effect.fn(\"cli.auth.login.integration\")(function* (client: OpenCodeClient, target?: string) {\n if (target && URL.canParse(target)) {\n const protocol = new URL(target).protocol\n if (protocol === \"http:\" || protocol === \"https:\") {\n const progress = spinner()\n progress.start(\"Discovering authentication provider...\")\n yield* request((signal) => client.integration.wellknown.add({ url: target, location }, { signal })).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(\"Authentication provider discovered\"))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Discovery failed\", 1))),\n )\n }\n }\n const integrations = yield* loadIntegrations(client)\n if (target) return yield* resolveIntegration(integrations, target)\n const available = integrations\n .filter((integration) => connectMethods(integration).length > 0)\n .toSorted(\n (a, b) =>\n (integrationPriority.get(a.id) ?? integrationPriority.size) -\n (integrationPriority.get(b.id) ?? integrationPriority.size) ||\n a.name.localeCompare(b.name) ||\n a.id.localeCompare(b.id),\n )\n if (available.length === 0) return yield* Effect.fail(new Error(\"No authentication integrations are available\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: available.map((integration) => {\n const option = { value: integration.id, label: integration.name, hint: integration.id }\n if (integration.connections.length > 0) return { ...option, hint: \"connected\" }\n if (integration.id === \"opencode\") return { ...option, hint: \"recommended\" }\n return option\n }),\n }),\n )\n return yield* resolveIntegration(available, id)\n})\n\nconst chooseMethod = Effect.fn(\"cli.auth.login.method\")(function* (methods: ConnectMethod[], target?: string) {\n if (target) return yield* resolveMethod(methods, target)\n if (methods.length === 1) return methods[0]\n yield* requireInteractive(\"Pass --method when running without an interactive terminal\")\n const id = yield* prompt<string>(() =>\n select({\n message: \"Select login method\",\n options: methods.map((method) => {\n if (method.type === \"key\") return { value: \"key\", label: method.label ?? \"API key\" }\n return { value: method.id, label: method.label }\n }),\n }),\n )\n return yield* resolveMethod(methods, id)\n})\n\nconst authenticate = Effect.fn(\"cli.auth.login.authenticate\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: ConnectMethod,\n answer?: FormAnswer,\n) {\n if (method.type === \"key\") return yield* keyLogin(client, integration, method, answer)\n if (method.type === \"command\") return yield* commandLogin(client, integration, method)\n return yield* oauthLogin(client, integration, method, answer)\n})\n\nconst keyLogin = Effect.fn(\"cli.auth.login.key\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"key\" }>,\n answer?: FormAnswer,\n) {\n const key = yield* secret(method.label ?? `Enter your ${integration.name} API key`)\n const progress = spinner()\n progress.start(\"Saving credential...\")\n yield* request((signal) =>\n client.integration.connect.key({ integrationID: integration.id, key, answer, location }, { signal }),\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))),\n )\n})\n\nconst oauthLogin = Effect.fn(\"cli.auth.login.oauth\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"oauth\" }>,\n answer?: FormAnswer,\n) {\n const progress = spinner()\n progress.start(\"Starting authorization...\")\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n { integrationID: integration.id, methodID: method.id, answer, location },\n { signal },\n ),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID: integration.id, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n progress.stop(\"Authorization started\")\n log.info(attempt.instructions)\n log.info(attempt.url)\n if (process.stdin.isTTY && process.stdout.isTTY) yield* openUrl(attempt.url)\n\n if (attempt.mode === \"code\") {\n yield* requireInteractive(\"This login requires an interactive terminal to enter the authorization code\")\n const code = yield* prompt<string>(() =>\n text({ message: \"Paste the authorization code\", validate: (value) => (!value ? \"Required\" : undefined) }),\n )\n const completing = spinner()\n completing.start(\"Completing authorization...\")\n yield* request((signal) =>\n client.integration.oauth.complete(\n { integrationID: integration.id, attemptID: attempt.attemptID, code, location },\n { signal },\n ),\n ).pipe(\n Effect.tap(() => Effect.sync(() => completing.stop(`Connected to ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => completing.stop(\"Authentication failed\", 1))),\n )\n return\n }\n\n const waiting = spinner()\n waiting.start(\"Waiting for authorization...\")\n const status = yield* waitForOAuth(client, integration.id, attempt.attemptID).pipe(\n Effect.tapCause(() => Effect.sync(() => waiting.stop(\"Authentication failed\", 1))),\n )\n if (status.status === \"complete\") {\n waiting.stop(`Connected to ${integration.name}`)\n return\n }\n waiting.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authorization expired\"))\n})\n\nconst commandLogin = Effect.fn(\"cli.auth.login.command\")(function* (\n client: OpenCodeClient,\n integration: IntegrationInfo,\n method: Extract<ConnectMethod, { type: \"command\" }>,\n) {\n const progress = spinner()\n progress.start(\"Starting authentication command...\")\n const started = yield* request((signal) =>\n client.integration.command.connect({ integrationID: integration.id, methodID: method.id, location }, { signal }),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.command.cancel(\n {\n integrationID: integration.id,\n attemptID: started.data.attemptID,\n location,\n },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n const status = yield* waitForCommand(client, integration.id, started.data.attemptID, (message) =>\n progress.message(message.trim() || \"Waiting for authentication command...\"),\n ).pipe(Effect.tapCause(() => Effect.sync(() => progress.stop(\"Authentication failed\", 1))))\n if (status.status === \"complete\") {\n progress.stop(`Connected to ${integration.name}`)\n return\n }\n progress.stop(\"Authentication failed\", 1)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n yield* Effect.fail(new Error(\"Authentication expired\"))\n})\n\nconst waitForOAuth = Effect.fn(\"cli.auth.login.oauth.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nconst waitForCommand = Effect.fn(\"cli.auth.login.command.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n update: (message: string) => void,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.command.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n if (response.data.message) update(response.data.message)\n yield* Effect.sleep(500)\n }\n})\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "8D328E6E7EC08CCE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "261F4249F6CD86DA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "70C5568CE50A873264756E2164756E21", | ||
| "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": ";u9BAAA,cAAS,WAST,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,OAC/B,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAU,MAAO,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": "6DEFD048CCA1B1C064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/server-connection.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint, type EnsureOptions } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, isUnauthorizedError, OpenCode } from \"@opencode-ai/client/promise\"\nimport { OPENCODE_VERSION } from \"../version\"\nimport { Effect, Redacted } from \"effect\"\nimport { Env } from \"../env\"\nimport { ServiceConfig } from \"./service-config\"\nimport { Standalone } from \"./standalone\"\n\nexport type Args = {\n readonly server?: string\n readonly standalone?: boolean\n readonly mismatch?: \"replace\" | \"ignore\" | \"error\"\n readonly onStart?: EnsureOptions[\"onStart\"]\n}\n\nexport type Resolved = {\n readonly endpoint: Endpoint\n readonly service?: ReturnType<typeof managedService>\n}\n\nexport const resolve = Effect.fn(\"cli.server-connection.resolve\")(function* (args: Args) {\n if (args.server !== undefined && args.standalone)\n return yield* Effect.fail(new Error(\"--server and --standalone cannot be combined\"))\n if (args.server !== undefined) {\n const password = yield* Env.password\n const endpoint = {\n url: args.server,\n auth: password ? { type: \"basic\" as const, username: \"opencode\", password: Redacted.value(password) } : undefined,\n } satisfies Endpoint\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const health = yield* Effect.tryPromise({\n try: () => client.health.get({ signal: AbortSignal.timeout(5_000) }),\n catch: (cause) => connectError(endpoint, cause),\n })\n if (health.version !== OPENCODE_VERSION)\n process.stderr.write(\n `Warning: Server at ${endpoint.url} has version ${health.version}; this client is ${OPENCODE_VERSION}. Continuing anyway.\\n`,\n )\n return { endpoint } satisfies Resolved\n }\n if (args.standalone) {\n return { endpoint: yield* Standalone.start() } satisfies Resolved\n }\n\n const mismatch = args.mismatch ?? \"ignore\"\n const options = yield* ServiceConfig.options({ checkVersion: mismatch !== \"ignore\" })\n return {\n endpoint: yield* resolveManaged({ ...options, onStart: args.onStart }, mismatch),\n service: managedService(options),\n } satisfies Resolved\n})\n\nfunction managedService(options: EnsureOptions) {\n const reconnectOptions = { ...options, version: undefined }\n return {\n reconnect: () => Service.ensure(reconnectOptions),\n restart: () =>\n Effect.gen(function* () {\n yield* Service.stop(options)\n yield* Service.ensure(reconnectOptions)\n }),\n }\n}\n\nconst resolveManaged = Effect.fnUntraced(function* (options: EnsureOptions, mismatch: NonNullable<Args[\"mismatch\"]>) {\n if (mismatch === \"replace\") return yield* Service.ensure(options)\n if (mismatch === \"ignore\") return yield* Service.ensure({ ...options, version: undefined })\n\n const compatible = yield* Service.discover(options)\n if (compatible !== undefined) return compatible\n const existing = yield* Service.discover({ ...options, version: undefined })\n if (existing !== undefined)\n return yield* Effect.fail(new Error(\"Background server version does not match this client\"))\n return yield* Service.ensure(options)\n})\n\nfunction connectError(endpoint: Endpoint, cause: unknown) {\n if (isUnauthorizedError(cause)) {\n return new Error(\n endpoint.auth === undefined\n ? `Server at ${endpoint.url} requires a password; set OPENCODE_PASSWORD`\n : `Server at ${endpoint.url} rejected the password`,\n { cause },\n )\n }\n if (cause instanceof ClientError && cause.reason === \"Transport\")\n return new Error(`Could not reach server at ${endpoint.url}`, { cause })\n return new Error(`Server at ${endpoint.url} did not provide a compatible V2 health response`, { cause })\n}\n\nexport * as ServerConnection from \"./server-connection\"\n" | ||
| ], | ||
| "mappings": ";6eAoBO,IAAM,EAAU,EAAO,GAAG,+BAA+B,EAAE,SAAU,CAAC,EAAY,CACvF,GAAI,EAAK,SAAW,QAAa,EAAK,WACpC,OAAO,MAAO,EAAO,KAAS,MAAM,8CAA8C,CAAC,EACrF,GAAI,EAAK,SAAW,OAAW,CAC7B,IAAM,EAAW,MAAO,EAAI,SACtB,EAAW,CACf,IAAK,EAAK,OACV,KAAM,EAAW,CAAE,KAAM,QAAkB,SAAU,WAAY,SAAU,EAAS,MAAM,CAAQ,CAAE,EAAI,MAC1G,EACM,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAS,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAO,OAAO,IAAI,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CAAC,EACnE,MAAO,CAAC,IAAU,EAAa,EAAU,CAAK,CAChD,CAAC,EACD,GAAI,EAAO,UAAY,EACrB,QAAQ,OAAO,MACb,sBAAsB,EAAS,mBAAmB,EAAO,2BAA2B;AAAA,CACtF,EACF,MAAO,CAAE,UAAS,EAEpB,GAAI,EAAK,WACP,MAAO,CAAE,SAAU,MAAO,EAAW,MAAM,CAAE,EAG/C,IAAM,EAAW,EAAK,UAAY,SAC5B,EAAU,MAAO,EAAc,QAAQ,CAAE,aAAc,IAAa,QAAS,CAAC,EACpF,MAAO,CACL,SAAU,MAAO,EAAe,IAAK,EAAS,QAAS,EAAK,OAAQ,EAAG,CAAQ,EAC/E,QAAS,EAAe,CAAO,CACjC,EACD,EAED,SAAS,CAAc,CAAC,EAAwB,CAC9C,IAAM,EAAmB,IAAK,EAAS,QAAS,MAAU,EAC1D,MAAO,CACL,UAAW,IAAM,EAAQ,OAAO,CAAgB,EAChD,QAAS,IACP,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAQ,KAAK,CAAO,EAC3B,MAAO,EAAQ,OAAO,CAAgB,EACvC,CACL,EAGF,IAAM,EAAiB,EAAO,WAAW,SAAU,CAAC,EAAwB,EAAyC,CACnH,GAAI,IAAa,UAAW,OAAO,MAAO,EAAQ,OAAO,CAAO,EAChE,GAAI,IAAa,SAAU,OAAO,MAAO,EAAQ,OAAO,IAAK,EAAS,QAAS,MAAU,CAAC,EAE1F,IAAM,EAAa,MAAO,EAAQ,SAAS,CAAO,EAClD,GAAI,IAAe,OAAW,OAAO,EAErC,IADiB,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,KAC1D,OACf,OAAO,MAAO,EAAO,KAAS,MAAM,sDAAsD,CAAC,EAC7F,OAAO,MAAO,EAAQ,OAAO,CAAO,EACrC,EAED,SAAS,CAAY,CAAC,EAAoB,EAAgB,CACxD,GAAI,EAAoB,CAAK,EAC3B,OAAW,MACT,EAAS,OAAS,OACd,aAAa,EAAS,iDACtB,aAAa,EAAS,4BAC1B,CAAE,OAAM,CACV,EAEF,GAAI,aAAiB,GAAe,EAAM,SAAW,YACnD,OAAW,MAAM,6BAA6B,EAAS,MAAO,CAAE,OAAM,CAAC,EACzE,OAAW,MAAM,aAAa,EAAS,sDAAuD,CAAE,OAAM,CAAC", | ||
| "debugId": "418E45C48F9CA60964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/theme/color.ts", "../tui/src/theme/resolve.ts"], | ||
| "sourcesContent": [ | ||
| "import { RGBA } from \"@opentui/core\"\n\nexport function ansiToRgba(code: number): RGBA {\n if (code < 16) {\n const ansiColors = [\n \"#000000\",\n \"#800000\",\n \"#008000\",\n \"#808000\",\n \"#000080\",\n \"#800080\",\n \"#008080\",\n \"#c0c0c0\",\n \"#808080\",\n \"#ff0000\",\n \"#00ff00\",\n \"#ffff00\",\n \"#0000ff\",\n \"#ff00ff\",\n \"#00ffff\",\n \"#ffffff\",\n ]\n return RGBA.fromHex(ansiColors[code] ?? \"#000000\")\n }\n\n if (code < 232) {\n const index = code - 16\n const b = index % 6\n const g = Math.floor(index / 6) % 6\n const r = Math.floor(index / 36)\n const val = (x: number) => (x === 0 ? 0 : x * 40 + 55)\n return RGBA.fromInts(val(r), val(g), val(b))\n }\n\n if (code < 256) {\n const gray = (code - 232) * 10 + 8\n return RGBA.fromInts(gray, gray, gray)\n }\n\n return RGBA.fromInts(0, 0, 0)\n}\n\nexport function tint(base: RGBA, overlay: RGBA, alpha: number): RGBA {\n const r = base.r + (overlay.r - base.r) * alpha\n const g = base.g + (overlay.g - base.g) * alpha\n const b = base.b + (overlay.b - base.b) * alpha\n return RGBA.fromInts(Math.round(r * 255), Math.round(g * 255), Math.round(b * 255))\n}\n", | ||
| "import { RGBA } from \"@opentui/core\"\nimport { ansiToRgba } from \"./color\"\nimport type { ColorValue, Theme, ThemeColor, ThemeV1Json } from \"./v1\"\n\nexport function resolveThemeColors(\n theme: ThemeV1Json,\n mode: \"dark\" | \"light\",\n resolveAnsi: (code: number) => RGBA = ansiToRgba,\n) {\n const defs = theme.defs ?? {}\n function resolveColor(color: ColorValue, chain: string[] = []): RGBA {\n if (color instanceof RGBA) return color\n if (typeof color === \"string\") {\n if (color === \"transparent\" || color === \"none\") return RGBA.fromInts(0, 0, 0, 0)\n\n if (color.startsWith(\"#\")) return RGBA.fromHex(color)\n\n if (chain.includes(color)) {\n throw new Error(`Circular color reference: ${[...chain, color].join(\" -> \")}`)\n }\n\n const next = defs[color] ?? theme.theme[color as ThemeColor]\n if (next === undefined) {\n throw new Error(`Color reference \"${color}\" not found in defs or theme`)\n }\n return resolveColor(next, [...chain, color])\n }\n if (typeof color === \"number\") return resolveAnsi(color)\n return resolveColor(color[mode], chain)\n }\n\n const resolved = Object.fromEntries(\n Object.entries(theme.theme)\n .filter(([key]) => key !== \"selectedListItemText\" && key !== \"backgroundMenu\" && key !== \"thinkingOpacity\")\n .map(([key, value]) => [key, resolveColor(value as ColorValue)]),\n ) as Partial<Record<ThemeColor, RGBA>>\n\n const hasSelectedListItemText = theme.theme.selectedListItemText !== undefined\n return {\n theme: {\n ...(resolved as Record<ThemeColor, RGBA>),\n selectedListItemText: hasSelectedListItemText\n ? resolveColor(theme.theme.selectedListItemText!)\n : resolved.background!,\n backgroundMenu:\n theme.theme.backgroundMenu === undefined\n ? resolved.backgroundElement!\n : resolveColor(theme.theme.backgroundMenu),\n } satisfies Omit<Theme, \"_hasSelectedListItemText\" | \"thinkingOpacity\">,\n hasSelectedListItemText,\n thinkingOpacity: theme.theme.thinkingOpacity ?? 0.6,\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAEO,SAAS,CAAU,CAAC,EAAoB,CAC7C,GAAI,EAAO,GAAI,CACb,IAAM,EAAa,CACjB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,OAAO,EAAK,QAAQ,EAAW,IAAS,SAAS,EAGnD,GAAI,EAAO,IAAK,CACd,IAAM,EAAQ,EAAO,GACf,EAAI,EAAQ,EACZ,EAAI,KAAK,MAAM,EAAQ,CAAC,EAAI,EAC5B,EAAI,KAAK,MAAM,EAAQ,EAAE,EACzB,EAAM,CAAC,IAAe,IAAM,EAAI,EAAI,EAAI,GAAK,GACnD,OAAO,EAAK,SAAS,EAAI,CAAC,EAAG,EAAI,CAAC,EAAG,EAAI,CAAC,CAAC,EAG7C,GAAI,EAAO,IAAK,CACd,IAAM,GAAQ,EAAO,KAAO,GAAK,EACjC,OAAO,EAAK,SAAS,EAAM,EAAM,CAAI,EAGvC,OAAO,EAAK,SAAS,EAAG,EAAG,CAAC,EAGvB,SAAS,CAAI,CAAC,EAAY,EAAe,EAAqB,CACnE,IAAM,EAAI,EAAK,GAAK,EAAQ,EAAI,EAAK,GAAK,EACpC,EAAI,EAAK,GAAK,EAAQ,EAAI,EAAK,GAAK,EACpC,EAAI,EAAK,GAAK,EAAQ,EAAI,EAAK,GAAK,EAC1C,OAAO,EAAK,SAAS,KAAK,MAAM,EAAI,GAAG,EAAG,KAAK,MAAM,EAAI,GAAG,EAAG,KAAK,MAAM,EAAI,GAAG,CAAC,EC1C7E,SAAS,CAAkB,CAChC,EACA,EACA,EAAsC,EACtC,CACA,IAAM,EAAO,EAAM,MAAQ,CAAC,EAC5B,SAAS,CAAY,CAAC,EAAmB,EAAkB,CAAC,EAAS,CACnE,GAAI,aAAiB,EAAM,OAAO,EAClC,GAAI,OAAO,IAAU,SAAU,CAC7B,GAAI,IAAU,eAAiB,IAAU,OAAQ,OAAO,EAAK,SAAS,EAAG,EAAG,EAAG,CAAC,EAEhF,GAAI,EAAM,WAAW,GAAG,EAAG,OAAO,EAAK,QAAQ,CAAK,EAEpD,GAAI,EAAM,SAAS,CAAK,EACtB,MAAU,MAAM,6BAA6B,CAAC,GAAG,EAAO,CAAK,EAAE,KAAK,MAAM,GAAG,EAG/E,IAAM,EAAO,EAAK,IAAU,EAAM,MAAM,GACxC,GAAI,IAAS,OACX,MAAU,MAAM,oBAAoB,+BAAmC,EAEzE,OAAO,EAAa,EAAM,CAAC,GAAG,EAAO,CAAK,CAAC,EAE7C,GAAI,OAAO,IAAU,SAAU,OAAO,EAAY,CAAK,EACvD,OAAO,EAAa,EAAM,GAAO,CAAK,EAGxC,IAAM,EAAW,OAAO,YACtB,OAAO,QAAQ,EAAM,KAAK,EACvB,OAAO,EAAE,KAAS,IAAQ,wBAA0B,IAAQ,kBAAoB,IAAQ,iBAAiB,EACzG,IAAI,EAAE,EAAK,KAAW,CAAC,EAAK,EAAa,CAAmB,CAAC,CAAC,CACnE,EAEM,EAA0B,EAAM,MAAM,uBAAyB,OACrE,MAAO,CACL,MAAO,IACD,EACJ,qBAAsB,EAClB,EAAa,EAAM,MAAM,oBAAqB,EAC9C,EAAS,WACb,eACE,EAAM,MAAM,iBAAmB,OAC3B,EAAS,kBACT,EAAa,EAAM,MAAM,cAAc,CAC/C,EACA,0BACA,gBAAiB,EAAM,MAAM,iBAAmB,GAClD", | ||
| "debugId": "C2F8FAAD85A76ECB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/export.ts"], | ||
| "sourcesContent": [ | ||
| "import { autocomplete, cancel, intro, isCancel, log, outro } from \"@clack/prompts\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { errorMessage } from \"../../ui/prompt\"\n\nexport default Runtime.handler(\n Commands.commands.export,\n Effect.fn(\"cli.export\")((input) =>\n Effect.gen(function* () {\n const requested = Option.getOrUndefined(input.session)\n if (!requested && !process.stdin.isTTY) {\n yield* Effect.fail(new Error(\"Pass a session ID when running without an interactive terminal\"))\n }\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const sessionID = requested\n ? requested\n : yield* Effect.gen(function* () {\n intro(\"Export session\", { output: process.stderr })\n const location = yield* Effect.tryPromise({\n try: () => client.location.get({ location: { directory: process.cwd() } }),\n catch: (cause) => cause,\n })\n const page = yield* Effect.tryPromise({\n try: () =>\n client.session.list({\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n order: \"desc\",\n limit: 50,\n }),\n catch: (cause) => cause,\n })\n if (page.data.length === 0) {\n log.error(\"No sessions found\", { output: process.stderr })\n outro(\"Done\", { output: process.stderr })\n return undefined\n }\n const selected = yield* Effect.tryPromise({\n try: () =>\n autocomplete({\n message: \"Select session to export\",\n maxItems: 10,\n options: page.data.map((session) => ({\n label: session.title,\n value: session.id,\n hint: `${new Date(session.time.updated).toLocaleString()} - ${session.id.slice(-8)}`,\n })),\n output: process.stderr,\n }),\n catch: (cause) => cause,\n })\n if (isCancel(selected)) {\n cancel(\"Cancelled\", { output: process.stderr })\n process.exitCode = 130\n return undefined\n }\n outro(\"Exporting session...\", { output: process.stderr })\n return selected\n })\n if (!sessionID) return\n const data = yield* Effect.tryPromise({\n try: () => client.session.export({ sessionID, sanitize: input.sanitize }),\n catch: (cause) => cause,\n })\n process.stdout.write(JSON.stringify(data, null, 2) + EOL)\n }).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n ),\n)\n" | ||
| ], | ||
| "mappings": ";2qCAIA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,CAAC,IACvB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAY,EAAO,eAAe,EAAM,OAAO,EACrD,GAAI,CAAC,GAAa,CAAC,QAAQ,MAAM,MAC/B,MAAO,EAAO,KAAS,MAAM,gEAAgE,CAAC,EAEhG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAY,EACd,EACA,MAAO,EAAO,IAAI,SAAU,EAAG,CAC7B,EAAM,iBAAkB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAClD,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IAAM,EAAO,SAAS,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,EACzE,MAAO,CAAC,IAAU,CACpB,CAAC,EACK,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAO,QAAQ,KAAK,CAClB,UAAW,EAAS,UACpB,UAAW,EAAS,YACpB,SAAU,KACV,MAAO,OACP,MAAO,EACT,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAK,KAAK,SAAW,EAAG,CAC1B,EAAI,MAAM,oBAAqB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACzD,EAAM,OAAQ,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACxC,OAEF,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IACH,EAAa,CACX,QAAS,2BACT,SAAU,GACV,QAAS,EAAK,KAAK,IAAI,CAAC,KAAa,CACnC,MAAO,EAAQ,MACf,MAAO,EAAQ,GACf,KAAM,GAAG,IAAI,KAAK,EAAQ,KAAK,OAAO,EAAE,eAAe,OAAO,EAAQ,GAAG,MAAM,EAAE,GACnF,EAAE,EACF,OAAQ,QAAQ,MAClB,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAS,CAAQ,EAAG,CACtB,EAAO,YAAa,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAC9C,QAAQ,SAAW,IACnB,OAGF,OADA,EAAM,uBAAwB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACjD,EACR,EACL,GAAI,CAAC,EAAW,OAChB,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IAAM,EAAO,QAAQ,OAAO,CAAE,YAAW,SAAU,EAAM,QAAS,CAAC,EACxE,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAM,KAAM,CAAC,EAAI,CAAG,EACzD,EAAE,KACD,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,CACF", | ||
| "debugId": "0594932C512C104C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "E1E384694C2E355C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "DC095DB3C814530C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/theme/system.ts"], | ||
| "sourcesContent": [ | ||
| "import { RGBA, type TerminalColors } from \"@opentui/core\"\nimport { ansiToRgba, tint } from \"./color\"\n\nexport function terminalMode(colors: TerminalColors): \"dark\" | \"light\" | undefined {\n const bg = colors.defaultBackground\n if (!bg) return\n const { r, g, b } = RGBA.fromHex(bg)\n return 0.299 * r + 0.587 * g + 0.114 * b > 0.5 ? \"light\" : \"dark\"\n}\n\nexport function generateSystem(colors: TerminalColors, mode: \"dark\" | \"light\") {\n const bg = RGBA.fromHex(colors.defaultBackground ?? colors.palette[0]!)\n const fg = RGBA.fromHex(colors.defaultForeground ?? colors.palette[7]!)\n const transparent = RGBA.fromValues(bg.r, bg.g, bg.b, 0)\n const isDark = mode === \"dark\"\n\n const col = (index: number) => {\n const value = colors.palette[index]\n if (value) return RGBA.fromHex(value)\n return ansiToRgba(index)\n }\n\n const grays = generateGrayScale(bg, isDark)\n const textMuted = generateMutedTextColor(bg, isDark)\n const ansiColors = {\n red: col(1),\n green: col(2),\n yellow: col(3),\n blue: col(4),\n magenta: col(5),\n cyan: col(6),\n redBright: col(9),\n greenBright: col(10),\n }\n\n const diffAlpha = isDark ? 0.22 : 0.14\n const diffAddedBg = tint(bg, ansiColors.green, diffAlpha)\n const diffRemovedBg = tint(bg, ansiColors.red, diffAlpha)\n const diffContextBg = grays[2]\n const diffAddedLineNumberBg = tint(diffContextBg, ansiColors.green, diffAlpha)\n const diffRemovedLineNumberBg = tint(diffContextBg, ansiColors.red, diffAlpha)\n\n return {\n theme: {\n primary: ansiColors.cyan,\n secondary: ansiColors.magenta,\n accent: ansiColors.cyan,\n error: ansiColors.red,\n warning: ansiColors.yellow,\n success: ansiColors.green,\n info: ansiColors.cyan,\n text: fg,\n textMuted,\n selectedListItemText: bg,\n background: transparent,\n backgroundPanel: grays[2],\n backgroundElement: grays[3],\n backgroundMenu: grays[3],\n borderSubtle: grays[6],\n border: grays[7],\n borderActive: grays[8],\n diffAdded: ansiColors.green,\n diffRemoved: ansiColors.red,\n diffContext: grays[7],\n diffHunkHeader: grays[7],\n diffHighlightAdded: ansiColors.greenBright,\n diffHighlightRemoved: ansiColors.redBright,\n diffAddedBg,\n diffRemovedBg,\n diffContextBg,\n diffLineNumber: textMuted,\n diffAddedLineNumberBg,\n diffRemovedLineNumberBg,\n markdownText: fg,\n markdownHeading: fg,\n markdownLink: ansiColors.blue,\n markdownLinkText: ansiColors.cyan,\n markdownCode: ansiColors.green,\n markdownBlockQuote: ansiColors.yellow,\n markdownEmph: ansiColors.yellow,\n markdownStrong: fg,\n markdownHorizontalRule: grays[7],\n markdownListItem: ansiColors.blue,\n markdownListEnumeration: ansiColors.cyan,\n markdownImage: ansiColors.blue,\n markdownImageText: ansiColors.cyan,\n markdownCodeBlock: fg,\n syntaxComment: textMuted,\n syntaxKeyword: ansiColors.magenta,\n syntaxFunction: ansiColors.blue,\n syntaxVariable: fg,\n syntaxString: ansiColors.green,\n syntaxNumber: ansiColors.yellow,\n syntaxType: ansiColors.cyan,\n syntaxOperator: ansiColors.cyan,\n syntaxPunctuation: fg,\n },\n }\n}\n\nfunction generateGrayScale(bg: RGBA, isDark: boolean): Record<number, RGBA> {\n const grays: Record<number, RGBA> = {}\n const bgR = bg.r * 255\n const bgG = bg.g * 255\n const bgB = bg.b * 255\n const luminance = 0.299 * bgR + 0.587 * bgG + 0.114 * bgB\n\n for (let i = 1; i <= 12; i++) {\n const factor = i / 12\n\n if (isDark && luminance < 10) {\n const gray = Math.floor(factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n if (!isDark && luminance > 245) {\n const gray = Math.floor(255 - factor * 0.4 * 255)\n grays[i] = RGBA.fromInts(gray, gray, gray)\n continue\n }\n\n const next = isDark ? luminance + (255 - luminance) * factor * 0.4 : luminance * (1 - factor * 0.4)\n const ratio = next / luminance\n grays[i] = RGBA.fromInts(\n Math.floor(Math.min(Math.max(bgR * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgG * ratio, 0), 255)),\n Math.floor(Math.min(Math.max(bgB * ratio, 0), 255)),\n )\n }\n\n return grays\n}\n\nfunction generateMutedTextColor(bg: RGBA, isDark: boolean): RGBA {\n const luminance = 0.299 * bg.r * 255 + 0.587 * bg.g * 255 + 0.114 * bg.b * 255\n if (isDark) {\n const gray = luminance < 10 ? 180 : Math.min(Math.floor(160 + luminance * 0.3), 200)\n return RGBA.fromInts(gray, gray, gray)\n }\n\n const gray = luminance > 245 ? 75 : Math.max(Math.floor(100 - (255 - luminance) * 0.2), 60)\n return RGBA.fromInts(gray, gray, gray)\n}\n" | ||
| ], | ||
| "mappings": ";gHAGO,SAAS,CAAY,CAAC,EAAsD,CACjF,IAAM,EAAK,EAAO,kBAClB,GAAI,CAAC,EAAI,OACT,IAAQ,IAAG,IAAG,KAAM,EAAK,QAAQ,CAAE,EACnC,MAAO,OAAQ,EAAI,MAAQ,EAAI,MAAQ,EAAI,IAAM,QAAU,OAGtD,SAAS,CAAc,CAAC,EAAwB,EAAwB,CAC7E,IAAM,EAAK,EAAK,QAAQ,EAAO,mBAAqB,EAAO,QAAQ,EAAG,EAChE,EAAK,EAAK,QAAQ,EAAO,mBAAqB,EAAO,QAAQ,EAAG,EAChE,EAAc,EAAK,WAAW,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACjD,EAAS,IAAS,OAElB,EAAM,CAAC,IAAkB,CAC7B,IAAM,EAAQ,EAAO,QAAQ,GAC7B,GAAI,EAAO,OAAO,EAAK,QAAQ,CAAK,EACpC,OAAO,EAAW,CAAK,GAGnB,EAAQ,EAAkB,EAAI,CAAM,EACpC,EAAY,EAAuB,EAAI,CAAM,EAC7C,EAAa,CACjB,IAAK,EAAI,CAAC,EACV,MAAO,EAAI,CAAC,EACZ,OAAQ,EAAI,CAAC,EACb,KAAM,EAAI,CAAC,EACX,QAAS,EAAI,CAAC,EACd,KAAM,EAAI,CAAC,EACX,UAAW,EAAI,CAAC,EAChB,YAAa,EAAI,EAAE,CACrB,EAEM,EAAY,EAAS,KAAO,KAC5B,EAAc,EAAK,EAAI,EAAW,MAAO,CAAS,EAClD,EAAgB,EAAK,EAAI,EAAW,IAAK,CAAS,EAClD,EAAgB,EAAM,GACtB,EAAwB,EAAK,EAAe,EAAW,MAAO,CAAS,EACvE,EAA0B,EAAK,EAAe,EAAW,IAAK,CAAS,EAE7E,MAAO,CACL,MAAO,CACL,QAAS,EAAW,KACpB,UAAW,EAAW,QACtB,OAAQ,EAAW,KACnB,MAAO,EAAW,IAClB,QAAS,EAAW,OACpB,QAAS,EAAW,MACpB,KAAM,EAAW,KACjB,KAAM,EACN,YACA,qBAAsB,EACtB,WAAY,EACZ,gBAAiB,EAAM,GACvB,kBAAmB,EAAM,GACzB,eAAgB,EAAM,GACtB,aAAc,EAAM,GACpB,OAAQ,EAAM,GACd,aAAc,EAAM,GACpB,UAAW,EAAW,MACtB,YAAa,EAAW,IACxB,YAAa,EAAM,GACnB,eAAgB,EAAM,GACtB,mBAAoB,EAAW,YAC/B,qBAAsB,EAAW,UACjC,cACA,gBACA,gBACA,eAAgB,EAChB,wBACA,0BACA,aAAc,EACd,gBAAiB,EACjB,aAAc,EAAW,KACzB,iBAAkB,EAAW,KAC7B,aAAc,EAAW,MACzB,mBAAoB,EAAW,OAC/B,aAAc,EAAW,OACzB,eAAgB,EAChB,uBAAwB,EAAM,GAC9B,iBAAkB,EAAW,KAC7B,wBAAyB,EAAW,KACpC,cAAe,EAAW,KAC1B,kBAAmB,EAAW,KAC9B,kBAAmB,EACnB,cAAe,EACf,cAAe,EAAW,QAC1B,eAAgB,EAAW,KAC3B,eAAgB,EAChB,aAAc,EAAW,MACzB,aAAc,EAAW,OACzB,WAAY,EAAW,KACvB,eAAgB,EAAW,KAC3B,kBAAmB,CACrB,CACF,EAGF,SAAS,CAAiB,CAAC,EAAU,EAAuC,CAC1E,IAAM,EAA8B,CAAC,EAC/B,EAAM,EAAG,EAAI,IACb,EAAM,EAAG,EAAI,IACb,EAAM,EAAG,EAAI,IACb,EAAY,MAAQ,EAAM,MAAQ,EAAM,MAAQ,EAEtD,QAAS,EAAI,EAAG,GAAK,GAAI,IAAK,CAC5B,IAAM,EAAS,EAAI,GAEnB,GAAI,GAAU,EAAY,GAAI,CAC5B,IAAM,EAAO,KAAK,MAAM,EAAS,IAAM,GAAG,EAC1C,EAAM,GAAK,EAAK,SAAS,EAAM,EAAM,CAAI,EACzC,SAGF,GAAI,CAAC,GAAU,EAAY,IAAK,CAC9B,IAAM,EAAO,KAAK,MAAM,IAAM,EAAS,IAAM,GAAG,EAChD,EAAM,GAAK,EAAK,SAAS,EAAM,EAAM,CAAI,EACzC,SAIF,IAAM,GADO,EAAS,GAAa,IAAM,GAAa,EAAS,IAAM,GAAa,EAAI,EAAS,MAC1E,EACrB,EAAM,GAAK,EAAK,SACd,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAM,EAAO,CAAC,EAAG,GAAG,CAAC,EAClD,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAM,EAAO,CAAC,EAAG,GAAG,CAAC,EAClD,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAM,EAAO,CAAC,EAAG,GAAG,CAAC,CACpD,EAGF,OAAO,EAGT,SAAS,CAAsB,CAAC,EAAU,EAAuB,CAC/D,IAAM,EAAY,MAAQ,EAAG,EAAI,IAAM,MAAQ,EAAG,EAAI,IAAM,MAAQ,EAAG,EAAI,IAC3E,GAAI,EAAQ,CACV,IAAM,EAAO,EAAY,GAAK,IAAM,KAAK,IAAI,KAAK,MAAM,IAAM,EAAY,GAAG,EAAG,GAAG,EACnF,OAAO,EAAK,SAAS,EAAM,EAAM,CAAI,EAGvC,IAAM,EAAO,EAAY,IAAM,GAAK,KAAK,IAAI,KAAK,MAAM,KAAO,IAAM,GAAa,GAAG,EAAG,EAAE,EAC1F,OAAO,EAAK,SAAS,EAAM,EAAM,CAAI", | ||
| "debugId": "370367BF651E8A6764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/@opentui+core@0.5.4+2240c214a0f33214/node_modules/@opentui/core/testing.bun.js"], | ||
| "sourcesContent": [ | ||
| "// @bun\nimport {\n ANSI,\n CliRenderer\n} from \"./chunk-bun-gvv8cwwz.js\";\nimport {\n SystemClock,\n TreeSitterClient\n} from \"./chunk-bun-1n307cze.js\";\n\n// src/testing/mock-keys.ts\nimport { Buffer as Buffer2 } from \"buffer\";\nfunction pasteBytes(text) {\n return Uint8Array.from(Buffer2.from(text));\n}\nvar KeyCodes = {\n RETURN: \"\\r\",\n LINEFEED: `\n`,\n TAB: \"\\t\",\n BACKSPACE: \"\\b\",\n DELETE: \"\\x1B[3~\",\n HOME: \"\\x1B[H\",\n END: \"\\x1B[F\",\n ESCAPE: \"\\x1B\",\n ARROW_UP: \"\\x1B[A\",\n ARROW_DOWN: \"\\x1B[B\",\n ARROW_RIGHT: \"\\x1B[C\",\n ARROW_LEFT: \"\\x1B[D\",\n F1: \"\\x1BOP\",\n F2: \"\\x1BOQ\",\n F3: \"\\x1BOR\",\n F4: \"\\x1BOS\",\n F5: \"\\x1B[15~\",\n F6: \"\\x1B[17~\",\n F7: \"\\x1B[18~\",\n F8: \"\\x1B[19~\",\n F9: \"\\x1B[20~\",\n F10: \"\\x1B[21~\",\n F11: \"\\x1B[23~\",\n F12: \"\\x1B[24~\"\n};\nvar kittyKeyCodeMap = {\n escape: 27,\n tab: 9,\n return: 13,\n backspace: 127,\n insert: 57348,\n delete: 57349,\n left: 57350,\n right: 57351,\n up: 57352,\n down: 57353,\n pageup: 57354,\n pagedown: 57355,\n home: 57356,\n end: 57357,\n f1: 57364,\n f2: 57365,\n f3: 57366,\n f4: 57367,\n f5: 57368,\n f6: 57369,\n f7: 57370,\n f8: 57371,\n f9: 57372,\n f10: 57373,\n f11: 57374,\n f12: 57375\n};\nfunction encodeKittySequence(codepoint, modifiers) {\n let modMask = 0;\n if (modifiers?.shift)\n modMask |= 1;\n if (modifiers?.meta)\n modMask |= 2;\n if (modifiers?.ctrl)\n modMask |= 4;\n if (modifiers?.super)\n modMask |= 8;\n if (modifiers?.hyper)\n modMask |= 16;\n if (modMask === 0) {\n return `\\x1B[${codepoint}u`;\n } else {\n return `\\x1B[${codepoint};${modMask + 1}u`;\n }\n}\nfunction encodeModifyOtherKeysSequence(charCode, modifiers) {\n let modMask = 0;\n if (modifiers?.shift)\n modMask |= 1;\n if (modifiers?.meta)\n modMask |= 2;\n if (modifiers?.ctrl)\n modMask |= 4;\n if (modifiers?.super)\n modMask |= 8;\n if (modifiers?.hyper)\n modMask |= 16;\n if (modMask === 0) {\n return String.fromCharCode(charCode);\n }\n return `\\x1B[27;${modMask + 1};${charCode}~`;\n}\nfunction resolveKeyInput(key) {\n let keyValue;\n let keyName;\n if (typeof key === \"string\") {\n if (key in KeyCodes) {\n keyValue = KeyCodes[key];\n keyName = key.toLowerCase();\n } else {\n keyValue = key;\n keyName = undefined;\n }\n } else {\n keyValue = KeyCodes[key];\n if (!keyValue) {\n throw new Error(`Unknown key: ${key}`);\n }\n keyName = String(key).toLowerCase();\n }\n return { keyValue, keyName };\n}\nfunction createMockKeys(renderer, options) {\n const useKittyKeyboard = options?.kittyKeyboard ?? false;\n const useOtherModifiersMode = options?.otherModifiersMode ?? false;\n const effectiveOtherModifiersMode = useOtherModifiersMode && !useKittyKeyboard;\n const pressKeys = async (keys, delayMs = 0) => {\n for (const key of keys) {\n const { keyValue: keyCode } = resolveKeyInput(key);\n renderer.stdin.emit(\"data\", Buffer2.from(keyCode));\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n };\n const pressKey = (key, modifiers) => {\n if (useKittyKeyboard) {\n let { keyValue, keyName } = resolveKeyInput(key);\n const valueToKeyNameMap = {\n \"\\b\": \"backspace\",\n \"\\r\": \"return\",\n \"\\n\": \"return\",\n \"\\t\": \"tab\",\n \"\\x1B\": \"escape\",\n \"\\x1B[A\": \"up\",\n \"\\x1B[B\": \"down\",\n \"\\x1B[C\": \"right\",\n \"\\x1B[D\": \"left\",\n \"\\x1B[H\": \"home\",\n \"\\x1B[F\": \"end\",\n \"\\x1B[3~\": \"delete\"\n };\n if (keyValue && valueToKeyNameMap[keyValue]) {\n keyName = valueToKeyNameMap[keyValue];\n }\n if (keyName && keyName.startsWith(\"arrow_\")) {\n keyName = keyName.substring(6);\n }\n if (keyName && kittyKeyCodeMap[keyName]) {\n const kittyCode = kittyKeyCodeMap[keyName];\n const sequence = encodeKittySequence(kittyCode, modifiers);\n renderer.stdin.emit(\"data\", Buffer2.from(sequence));\n return;\n }\n if (keyValue && keyValue.length === 1 && !keyValue.startsWith(\"\\x1B\")) {\n const codepoint = keyValue.codePointAt(0);\n if (codepoint) {\n const sequence = encodeKittySequence(codepoint, modifiers);\n renderer.stdin.emit(\"data\", Buffer2.from(sequence));\n return;\n }\n }\n }\n if (effectiveOtherModifiersMode && modifiers) {\n let { keyValue, keyName } = resolveKeyInput(key);\n const valueToCharCodeMap = {\n \"\\b\": 127,\n \"\\r\": 13,\n \"\\n\": 13,\n \"\\t\": 9,\n \"\\x1B\": 27,\n \" \": 32\n };\n let charCode;\n if (keyValue && valueToCharCodeMap[keyValue] !== undefined) {\n charCode = valueToCharCodeMap[keyValue];\n } else if (keyValue && keyValue.length === 1 && !keyValue.startsWith(\"\\x1B\")) {\n charCode = keyValue.charCodeAt(0);\n }\n if (charCode !== undefined) {\n const sequence = encodeModifyOtherKeysSequence(charCode, modifiers);\n renderer.stdin.emit(\"data\", Buffer2.from(sequence));\n return;\n }\n }\n let keyCode = resolveKeyInput(key).keyValue;\n if (modifiers) {\n if (keyCode.startsWith(\"\\x1B[\") && keyCode.length > 2) {\n const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.meta ? 2 : 0) + (modifiers.ctrl ? 4 : 0) + (modifiers.super ? 8 : 0) + (modifiers.hyper ? 16 : 0);\n if (modifier > 1) {\n const tildeMatch = keyCode.match(/^\\x1b\\[(\\d+)~$/);\n if (tildeMatch) {\n keyCode = `\\x1B[${tildeMatch[1]};${modifier}~`;\n } else {\n const ending = keyCode.slice(-1);\n keyCode = `\\x1B[1;${modifier}${ending}`;\n }\n }\n } else if (keyCode.length === 1) {\n let char = keyCode;\n if (char === \"\\t\" && modifiers.shift) {\n keyCode = modifiers.meta ? \"\\x1B\\x1B[Z\" : \"\\x1B[Z\";\n renderer.stdin.emit(\"data\", Buffer2.from(keyCode));\n return;\n }\n if (char === \"\\b\" && (modifiers.ctrl || modifiers.super || modifiers.hyper)) {\n const modifier = 1 + (modifiers.shift ? 1 : 0) + (modifiers.meta ? 2 : 0) + (modifiers.ctrl ? 4 : 0) + (modifiers.super ? 8 : 0) + (modifiers.hyper ? 16 : 0);\n keyCode = `\\x1B[27;${modifier};127~`;\n } else if (modifiers.ctrl) {\n if (char >= \"a\" && char <= \"z\") {\n keyCode = String.fromCharCode(char.charCodeAt(0) - 96);\n } else if (char >= \"A\" && char <= \"Z\") {\n keyCode = String.fromCharCode(char.charCodeAt(0) - 64);\n } else {\n const specialCtrlMap = {\n \"[\": \"\\x1B\",\n \"\\\\\": \"\\x1C\",\n \"]\": \"\\x1D\",\n \"^\": \"\\x1E\",\n _: \"\\x1F\",\n \"?\": \"\\x7F\",\n \"/\": \"\\x1F\",\n \"-\": \"\\x1F\",\n \".\": \"\\x1E\",\n \",\": \"\\x1C\",\n \"@\": \"\\x00\",\n \" \": \"\\x00\"\n };\n if (char in specialCtrlMap) {\n keyCode = specialCtrlMap[char];\n }\n }\n if (modifiers.meta) {\n keyCode = `\\x1B${keyCode}`;\n }\n } else {\n if (modifiers.shift && char >= \"a\" && char <= \"z\") {\n char = char.toUpperCase();\n }\n if (modifiers.meta) {\n keyCode = `\\x1B${char}`;\n } else {\n keyCode = char;\n }\n }\n } else if (modifiers.meta && !keyCode.startsWith(\"\\x1B\")) {\n keyCode = `\\x1B${keyCode}`;\n }\n }\n renderer.stdin.emit(\"data\", Buffer2.from(keyCode));\n };\n const typeText = async (text, delayMs = 0) => {\n const keys = text.split(\"\");\n await pressKeys(keys, delayMs);\n };\n const pressReturn = (modifiers) => {\n pressKey(KeyCodes.RETURN, modifiers);\n };\n const pressEscape = (modifiers) => {\n pressKey(KeyCodes.ESCAPE, modifiers);\n };\n const pressTab = (modifiers) => {\n pressKey(KeyCodes.TAB, modifiers);\n };\n const pressBackspace = (modifiers) => {\n pressKey(KeyCodes.BACKSPACE, modifiers);\n };\n const pressArrow = (direction, modifiers) => {\n const keyMap = {\n up: KeyCodes.ARROW_UP,\n down: KeyCodes.ARROW_DOWN,\n left: KeyCodes.ARROW_LEFT,\n right: KeyCodes.ARROW_RIGHT\n };\n pressKey(keyMap[direction], modifiers);\n };\n const pressCtrlC = () => {\n pressKey(\"c\", { ctrl: true });\n };\n const pasteBracketedText = (text) => {\n return pressKeys([ANSI.bracketedPasteStart, text, ANSI.bracketedPasteEnd]);\n };\n return {\n pressKeys,\n pressKey,\n typeText,\n pressEnter: pressReturn,\n pressEscape,\n pressTab,\n pressBackspace,\n pressArrow,\n pressCtrlC,\n pasteBracketedText\n };\n}\n\n// src/testing/mock-mouse.ts\nvar MouseButtons = {\n LEFT: 0,\n MIDDLE: 1,\n RIGHT: 2,\n WHEEL_UP: 64,\n WHEEL_DOWN: 65,\n WHEEL_LEFT: 66,\n WHEEL_RIGHT: 67\n};\nfunction createMockMouse(renderer) {\n let currentPosition = { x: 0, y: 0 };\n let buttonsPressed = new Set;\n const generateMouseEvent = (type, x, y, button = MouseButtons.LEFT, modifiers = {}) => {\n let buttonCode = button;\n if (modifiers.shift)\n buttonCode |= 4;\n if (modifiers.alt)\n buttonCode |= 8;\n if (modifiers.ctrl)\n buttonCode |= 16;\n switch (type) {\n case \"move\":\n buttonCode = 32 | 3;\n if (modifiers.shift)\n buttonCode |= 4;\n if (modifiers.alt)\n buttonCode |= 8;\n if (modifiers.ctrl)\n buttonCode |= 16;\n break;\n case \"drag\":\n buttonCode = (buttonsPressed.size > 0 ? Array.from(buttonsPressed)[0] : button) | 32;\n if (modifiers.shift)\n buttonCode |= 4;\n if (modifiers.alt)\n buttonCode |= 8;\n if (modifiers.ctrl)\n buttonCode |= 16;\n break;\n case \"scroll\":\n break;\n }\n const ansiX = x + 1;\n const ansiY = y + 1;\n let pressRelease = \"M\";\n if (type === \"up\" || type === \"move\" || type === \"drag\") {\n pressRelease = \"m\";\n }\n return `\\x1B[<${buttonCode};${ansiX};${ansiY}${pressRelease}`;\n };\n const emitMouseEvent = async (type, x, y, button = MouseButtons.LEFT, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n const eventSequence = generateMouseEvent(type, x, y, button, modifiers);\n renderer.stdin.emit(\"data\", Buffer.from(eventSequence));\n currentPosition = { x, y };\n if (type === \"down\" && button < 64) {\n buttonsPressed.add(button);\n } else if (type === \"up\") {\n buttonsPressed.delete(button);\n }\n if (delayMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n };\n const moveTo = async (x, y, options = {}) => {\n const { button = MouseButtons.LEFT, delayMs = 0, modifiers = {} } = options;\n if (buttonsPressed.size > 0) {\n await emitMouseEvent(\"drag\", x, y, Array.from(buttonsPressed)[0], { modifiers, delayMs });\n } else {\n await emitMouseEvent(\"move\", x, y, button, { modifiers, delayMs });\n }\n currentPosition = { x, y };\n };\n const click = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { delayMs = 10, modifiers = {} } = options;\n await emitMouseEvent(\"down\", x, y, button, { modifiers, delayMs });\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n await emitMouseEvent(\"up\", x, y, button, { modifiers, delayMs });\n };\n const doubleClick = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { delayMs = 10, modifiers = {} } = options;\n await click(x, y, button, { modifiers, delayMs });\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n await click(x, y, button, { modifiers, delayMs });\n };\n const pressDown = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n await emitMouseEvent(\"down\", x, y, button, { modifiers, delayMs });\n };\n const release = async (x, y, button = MouseButtons.LEFT, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n await emitMouseEvent(\"up\", x, y, button, { modifiers, delayMs });\n };\n const drag = async (startX, startY, endX, endY, button = MouseButtons.LEFT, options = {}) => {\n const { delayMs = 10, modifiers = {} } = options;\n await pressDown(startX, startY, button, { modifiers });\n const steps = 5;\n const dx = (endX - startX) / steps;\n const dy = (endY - startY) / steps;\n for (let i = 1;i <= steps; i++) {\n const currentX = Math.round(startX + dx * i);\n const currentY = Math.round(startY + dy * i);\n await emitMouseEvent(\"drag\", currentX, currentY, button, { modifiers, delayMs });\n }\n await release(endX, endY, button, { modifiers });\n };\n const scroll = async (x, y, direction, options = {}) => {\n const { modifiers = {}, delayMs = 0 } = options;\n let button;\n switch (direction) {\n case \"up\":\n button = MouseButtons.WHEEL_UP;\n break;\n case \"down\":\n button = MouseButtons.WHEEL_DOWN;\n break;\n case \"left\":\n button = MouseButtons.WHEEL_LEFT;\n break;\n case \"right\":\n button = MouseButtons.WHEEL_RIGHT;\n break;\n }\n await emitMouseEvent(\"scroll\", x, y, button, { modifiers, delayMs });\n };\n const getCurrentPosition = () => {\n return { ...currentPosition };\n };\n const getPressedButtons = () => {\n return Array.from(buttonsPressed);\n };\n return {\n moveTo,\n click,\n doubleClick,\n pressDown,\n release,\n drag,\n scroll,\n getCurrentPosition,\n getPressedButtons,\n emitMouseEvent\n };\n}\n\n// src/testing/test-streams.ts\nimport { Readable, Writable } from \"stream\";\n\nclass TestWriteStream extends Writable {\n isTTY = true;\n columns;\n rows;\n constructor(columns = 80, rows = 24) {\n super();\n this.columns = columns;\n this.rows = rows;\n }\n _write(_chunk, _encoding, callback) {\n callback();\n }\n getColorDepth() {\n return 24;\n }\n}\nfunction createTestStdin() {\n return new Readable({ read() {} });\n}\nfunction createTestStdout(columns = 80, rows = 24) {\n return new TestWriteStream(columns, rows);\n}\n\n// src/testing/test-renderer.ts\nvar decoder = new TextDecoder;\nvar DEFAULT_MAX_PASSES = 20;\nvar DEFAULT_MAX_VISUAL_IDLE_FRAMES = 20;\nvar DEFAULT_QUIET_FRAMES = 1;\nasync function drainImmediateWork() {\n await Promise.resolve();\n await new Promise((resolve) => process.nextTick(resolve));\n await Promise.resolve();\n}\nfunction normalizePositiveInteger(value, fallback) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n return Math.floor(value);\n}\nfunction createWaitError(renderer, message, frame) {\n const stats = renderer.getStats();\n const scheduler = renderer.getSchedulerState();\n const details = [\n message,\n `frameId: ${renderer.frameId}`,\n `nativeFrameCount: ${stats.nativeFrameCount}`,\n `cellsUpdated: ${stats.cellsUpdated}`,\n `isRunning: ${scheduler.isRunning}`,\n `isRendering: ${scheduler.isRendering}`,\n `hasScheduledRender: ${scheduler.hasScheduledRender}`\n ];\n if (frame !== undefined) {\n details.push(`lastFrame:\n${frame}`);\n }\n return new Error(details.join(`\n`));\n}\n\nclass TestExternalOutputRecorder {\n commits = [];\n constructor(renderer) {\n renderer.on(\"external_output\" /* EXTERNAL_OUTPUT */, this.record);\n renderer.once(\"destroy\" /* DESTROY */, () => {\n renderer.off(\"external_output\" /* EXTERNAL_OUTPUT */, this.record);\n });\n }\n record = (event) => {\n const raw = decoder.decode(event.snapshot.getRealCharBytes(false));\n const rows = Array.from({ length: event.snapshot.height }, (_, index) => raw.slice(index * event.snapshot.width, (index + 1) * event.snapshot.width).trimEnd());\n this.commits.push({\n text: rows.join(`\n`),\n rows,\n width: event.snapshot.width,\n height: event.snapshot.height,\n rowColumns: event.rowColumns,\n startOnNewLine: event.startOnNewLine,\n trailingNewline: event.trailingNewline\n });\n };\n take() {\n const commits = this.commits;\n this.commits = [];\n return commits;\n }\n takeText() {\n return this.take().flatMap((commit) => commit.rows).join(`\n`);\n }\n clear() {\n this.commits = [];\n }\n}\nfunction waitForNextFrameOrIdle(renderer) {\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n return Promise.resolve(null);\n }\n return new Promise((resolve) => {\n let settled = false;\n const cleanup = () => {\n renderer.off(\"frame\" /* FRAME */, onFrame);\n renderer.off(\"destroy\" /* DESTROY */, onDestroy);\n };\n const finish = (event) => {\n if (settled)\n return;\n settled = true;\n cleanup();\n resolve(event);\n };\n const onFrame = (event) => {\n finish(event);\n };\n const onDestroy = () => {\n finish(null);\n };\n renderer.on(\"frame\" /* FRAME */, onFrame);\n renderer.once(\"destroy\" /* DESTROY */, onDestroy);\n if (!scheduler.isRunning) {\n renderer.idle().then(() => finish(null));\n }\n });\n}\nasync function createTestRenderer(options) {\n const useKittyKeyboard = options.kittyKeyboard ? { events: true } : options.useKittyKeyboard;\n const renderer = await setupTestRenderer({\n ...options,\n useKittyKeyboard,\n screenMode: options.screenMode ?? \"main-screen\",\n footerHeight: options.footerHeight ?? 12,\n consoleMode: options.consoleMode ?? \"disabled\",\n externalOutputMode: options.externalOutputMode ?? \"passthrough\"\n });\n const externalOutput = new TestExternalOutputRecorder(renderer);\n const mockInput = createMockKeys(renderer, {\n kittyKeyboard: options.kittyKeyboard,\n otherModifiersMode: options.otherModifiersMode\n });\n const mockMouse = createMockMouse(renderer);\n const renderOnce = async () => {\n const feed = renderer._feed;\n if (feed?.isBackpressured()) {\n await feed.idle();\n }\n await renderer.loop();\n };\n const captureCharFrame = () => {\n const currentBuffer = renderer.currentRenderBuffer;\n const frameBytes = currentBuffer.getRealCharBytes(true);\n return decoder.decode(frameBytes);\n };\n const waitForVisualIdle = async (waitOptions = {}) => {\n const maxFrames = normalizePositiveInteger(waitOptions.maxFrames, DEFAULT_MAX_VISUAL_IDLE_FRAMES);\n const quietFrames = normalizePositiveInteger(waitOptions.quietFrames, DEFAULT_QUIET_FRAMES);\n let consecutiveQuietFrames = 0;\n for (let frame = 0;frame < maxFrames; frame++) {\n await drainImmediateWork();\n const scheduler2 = renderer.getSchedulerState();\n if (!scheduler2.isRunning && !scheduler2.isRendering && !scheduler2.hasScheduledRender) {\n return;\n }\n const event = await waitForNextFrameOrIdle(renderer);\n if (!event) {\n return;\n }\n if (renderer.getNativeStats().cellsUpdated === 0) {\n consecutiveQuietFrames++;\n if (consecutiveQuietFrames >= quietFrames) {\n return;\n }\n } else {\n consecutiveQuietFrames = 0;\n }\n }\n await drainImmediateWork();\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n return;\n }\n throw createWaitError(renderer, `Timed out waiting for visual idle after ${maxFrames} frames`);\n };\n const flush = async (flushOptions = {}) => {\n await waitForVisualIdle({ maxFrames: normalizePositiveInteger(flushOptions.maxPasses, DEFAULT_MAX_PASSES) });\n };\n const waitFor = async (predicate, waitOptions = {}) => {\n const maxPasses = normalizePositiveInteger(waitOptions.maxPasses, DEFAULT_MAX_PASSES);\n for (let pass = 0;pass <= maxPasses; pass++) {\n await drainImmediateWork();\n if (await predicate()) {\n return;\n }\n if (pass === maxPasses) {\n break;\n }\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n break;\n }\n await waitForNextFrameOrIdle(renderer);\n }\n throw createWaitError(renderer, `Timed out waiting for predicate after ${maxPasses} passes`);\n };\n const waitForFrame = async (predicate, waitOptions = {}) => {\n const maxPasses = normalizePositiveInteger(waitOptions.maxPasses, DEFAULT_MAX_PASSES);\n let frame = captureCharFrame();\n for (let pass = 0;pass <= maxPasses; pass++) {\n await drainImmediateWork();\n frame = captureCharFrame();\n if (await predicate(frame)) {\n return frame;\n }\n if (pass === maxPasses) {\n break;\n }\n const scheduler = renderer.getSchedulerState();\n if (!scheduler.isRunning && !scheduler.isRendering && !scheduler.hasScheduledRender) {\n break;\n }\n await waitForNextFrameOrIdle(renderer);\n }\n frame = captureCharFrame();\n throw createWaitError(renderer, `Timed out waiting for frame predicate after ${maxPasses} passes`, frame);\n };\n return {\n renderer,\n mockInput,\n mockMouse,\n renderOnce,\n flush,\n waitFor,\n waitForFrame,\n waitForVisualIdle,\n externalOutput,\n getNativeStats: () => renderer.getNativeStats(),\n captureCharFrame,\n captureSpans: () => {\n const currentBuffer = renderer.currentRenderBuffer;\n const lines = currentBuffer.getSpanLines();\n const cursorState = renderer.getCursorState();\n return {\n cols: currentBuffer.width,\n rows: currentBuffer.height,\n cursor: [cursorState.x, cursorState.y],\n lines\n };\n },\n resize: (width, height) => {\n renderer.processResize(width, height);\n }\n };\n}\nasync function setupTestRenderer(config) {\n const stdin = config.stdin || createTestStdin();\n const width = config.width || config.stdout?.columns || process.stdout.columns || 80;\n const height = config.height || config.stdout?.rows || process.stdout.rows || 24;\n const stdout = config.stdout || createTestStdout(width, height);\n return new CliRenderer(stdin, stdout, width, height, {\n ...config,\n bufferedOutput: config.bufferedOutput ?? \"memory\"\n });\n}\n// src/testing/mock-tree-sitter-client.ts\nclass MockTreeSitterClient extends TreeSitterClient {\n _highlightPromises = [];\n _mockResult = { highlights: [] };\n _autoResolveTimeout;\n _clock;\n constructor(options) {\n super({ dataPath: \"/tmp/mock\" }, { autoStartWorker: false });\n this._autoResolveTimeout = options?.autoResolveTimeout;\n this._clock = options?.clock ?? new SystemClock;\n }\n async destroy() {\n this.resolveAllHighlightOnce();\n await super.destroy();\n }\n async highlightOnce(content, filetype) {\n const { promise, resolve } = Promise.withResolvers();\n let timeout;\n if (this._autoResolveTimeout !== undefined) {\n timeout = this._clock.setTimeout(() => {\n const index = this._highlightPromises.findIndex((p) => p.promise === promise);\n if (index !== -1) {\n resolve(this._mockResult);\n this._highlightPromises.splice(index, 1);\n }\n }, this._autoResolveTimeout);\n }\n this._highlightPromises.push({ promise, resolve, timeout });\n return promise;\n }\n setMockResult(result) {\n this._mockResult = result;\n }\n resolveHighlightOnce(index = 0) {\n if (index >= 0 && index < this._highlightPromises.length) {\n const item = this._highlightPromises[index];\n if (item.timeout) {\n this._clock.clearTimeout(item.timeout);\n }\n item.resolve(this._mockResult);\n this._highlightPromises.splice(index, 1);\n }\n }\n resolveAllHighlightOnce() {\n for (const { resolve, timeout } of this._highlightPromises) {\n if (timeout) {\n this._clock.clearTimeout(timeout);\n }\n resolve(this._mockResult);\n }\n this._highlightPromises = [];\n }\n isHighlighting() {\n return this._highlightPromises.length > 0;\n }\n}\n// src/testing/terminal-capabilities.ts\nfunction createTerminalCapabilities(overrides = {}) {\n return {\n kitty_keyboard: false,\n kitty_graphics: false,\n rgb: false,\n ansi256: false,\n unicode: \"unicode\",\n sgr_pixels: false,\n color_scheme_updates: false,\n explicit_width: false,\n scaled_text: false,\n sixel: false,\n focus_tracking: false,\n sync: false,\n bracketed_paste: false,\n hyperlinks: false,\n osc52: false,\n osc52_support: \"unknown\",\n notifications: false,\n explicit_cursor_positioning: false,\n remote: false,\n multiplexer: \"none\",\n image_protocol: \"auto\",\n ...overrides,\n terminal: {\n name: \"\",\n version: \"\",\n from_xtversion: false,\n ...overrides.terminal\n }\n };\n}\nfunction setRendererCapabilities(renderer, overrides = {}) {\n const capabilities = createTerminalCapabilities(overrides);\n renderer._capabilities = capabilities;\n return capabilities;\n}\n// src/testing/spy.ts\nfunction createSpy() {\n const calls = [];\n const spy = (...args) => {\n calls.push(args);\n };\n spy.calls = calls;\n spy.callCount = () => calls.length;\n spy.calledWith = (...expected) => {\n return calls.some((call) => JSON.stringify(call) === JSON.stringify(expected));\n };\n spy.reset = () => calls.length = 0;\n return spy;\n}\n// src/testing/manual-clock.ts\nfunction compareTimers(left, right) {\n if (left.fireAt !== right.fireAt) {\n return left.fireAt - right.fireAt;\n }\n return left.order - right.order;\n}\n\nclass ManualClock {\n time = 0;\n nextId = 1;\n nextOrder = 0;\n timers = new Map;\n now() {\n return this.time;\n }\n setTime(time) {\n const targetTime = Math.floor(time);\n if (targetTime >= this.time) {\n this.advance(targetTime - this.time);\n return;\n }\n this.time = targetTime;\n }\n setTimeout(fn, delayMs) {\n return this.schedule(fn, delayMs, false);\n }\n clearTimeout(handle) {\n this.timers.delete(Number(handle));\n }\n setInterval(fn, delayMs) {\n return this.schedule(fn, delayMs, true);\n }\n clearInterval(handle) {\n this.clearTimeout(handle);\n }\n advance(delayMs) {\n const targetTime = this.time + Math.max(0, Math.floor(delayMs));\n while (true) {\n const nextTimer = this.peekNextTimer();\n if (!nextTimer || nextTimer.fireAt > targetTime) {\n break;\n }\n this.timers.delete(nextTimer.id);\n this.time = nextTimer.fireAt;\n nextTimer.fn();\n if (nextTimer.repeat && !this.timers.has(nextTimer.id)) {\n this.timers.set(nextTimer.id, {\n ...nextTimer,\n fireAt: this.time + nextTimer.delayMs,\n order: this.nextOrder++\n });\n }\n }\n this.time = targetTime;\n }\n runAll() {\n while (true) {\n const nextTimer = this.peekNextTimer();\n if (!nextTimer) {\n return;\n }\n this.advance(nextTimer.fireAt - this.time);\n }\n }\n schedule(fn, delayMs, repeat) {\n const id = this.nextId++;\n const normalizedDelay = Math.max(0, Math.floor(delayMs));\n this.timers.set(id, {\n id,\n fireAt: this.time + normalizedDelay,\n order: this.nextOrder++,\n delayMs: normalizedDelay,\n repeat,\n fn\n });\n return id;\n }\n peekNextTimer() {\n let nextTimer = null;\n for (const timer of this.timers.values()) {\n if (!nextTimer || compareTimers(timer, nextTimer) < 0) {\n nextTimer = timer;\n }\n }\n return nextTimer;\n }\n}\n// src/testing/test-recorder.ts\nclass TestRecorder {\n renderer;\n frames = [];\n recording = false;\n frameNumber = 0;\n startTime = 0;\n decoder = new TextDecoder;\n recordBuffers;\n now;\n onFrame = () => {\n if (!this.recording)\n return;\n this.captureFrame();\n };\n constructor(renderer, options) {\n this.renderer = renderer;\n this.recordBuffers = options?.recordBuffers || {};\n this.now = options?.now ?? (() => performance.now());\n }\n rec() {\n if (this.recording) {\n return;\n }\n this.recording = true;\n this.frames = [];\n this.frameNumber = 0;\n this.startTime = this.now();\n this.renderer.on(\"frame\" /* FRAME */, this.onFrame);\n }\n stop() {\n if (!this.recording) {\n return;\n }\n this.recording = false;\n this.renderer.off(\"frame\" /* FRAME */, this.onFrame);\n }\n get recordedFrames() {\n return [...this.frames];\n }\n clear() {\n this.frames = [];\n this.frameNumber = 0;\n }\n get isRecording() {\n return this.recording;\n }\n captureFrame() {\n const currentBuffer = this.renderer.currentRenderBuffer;\n const frameBytes = currentBuffer.getRealCharBytes(true);\n const frame = this.decoder.decode(frameBytes);\n const recordedFrame = {\n frame,\n timestamp: this.now() - this.startTime,\n frameNumber: this.frameNumber++\n };\n if (this.recordBuffers.fg || this.recordBuffers.bg || this.recordBuffers.attributes) {\n const buffers = currentBuffer.buffers;\n recordedFrame.buffers = {};\n if (this.recordBuffers.fg) {\n recordedFrame.buffers.fg = new Uint16Array(buffers.fg);\n }\n if (this.recordBuffers.bg) {\n recordedFrame.buffers.bg = new Uint16Array(buffers.bg);\n }\n if (this.recordBuffers.attributes) {\n recordedFrame.buffers.attributes = new Uint8Array(buffers.attributes);\n }\n }\n this.frames.push(recordedFrame);\n }\n}\nexport {\n setRendererCapabilities,\n pasteBytes,\n createTestRenderer,\n createTerminalCapabilities,\n createSpy,\n createMockMouse,\n createMockKeys,\n TestRecorder,\n MouseButtons,\n MockTreeSitterClient,\n ManualClock,\n KeyCodes\n};\n\n//# debugId=4A66EEF4E0EE595664756E2164756E21\n//# sourceMappingURL=testing.bun.js.map\n" | ||
| ], | ||
| "mappings": ";4EAWA,iBAAS,eA6bT,mBAAS,cAAU,eA5bnB,SAAS,EAAU,CAAC,EAAM,CACxB,OAAO,WAAW,KAAK,EAAQ,KAAK,CAAI,CAAC,EAE3C,IAAI,EAAW,CACb,OAAQ,KACR,SAAU;AAAA,EAEV,IAAK,KACL,UAAW,KACX,OAAQ,UACR,KAAM,SACN,IAAK,SACL,OAAQ,OACR,SAAU,SACV,WAAY,SACZ,YAAa,SACb,WAAY,SACZ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,SACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,GAAI,WACJ,IAAK,WACL,IAAK,WACL,IAAK,UACP,EACI,EAAkB,CACpB,OAAQ,GACR,IAAK,EACL,OAAQ,GACR,UAAW,IACX,OAAQ,MACR,OAAQ,MACR,KAAM,MACN,MAAO,MACP,GAAI,MACJ,KAAM,MACN,OAAQ,MACR,SAAU,MACV,KAAM,MACN,IAAK,MACL,GAAI,MACJ,GAAI,MACJ,GAAI,MACJ,GAAI,MACJ,GAAI,MACJ,GAAI,MACJ,GAAI,MACJ,GAAI,MACJ,GAAI,MACJ,IAAK,MACL,IAAK,MACL,IAAK,KACP,EACA,SAAS,CAAmB,CAAC,EAAW,EAAW,CACjD,IAAI,EAAU,EACd,GAAI,GAAW,MACb,GAAW,EACb,GAAI,GAAW,KACb,GAAW,EACb,GAAI,GAAW,KACb,GAAW,EACb,GAAI,GAAW,MACb,GAAW,EACb,GAAI,GAAW,MACb,GAAW,GACb,GAAI,IAAY,EACd,MAAO,QAAQ,KAEf,WAAO,QAAQ,KAAa,EAAU,KAG1C,SAAS,CAA6B,CAAC,EAAU,EAAW,CAC1D,IAAI,EAAU,EACd,GAAI,GAAW,MACb,GAAW,EACb,GAAI,GAAW,KACb,GAAW,EACb,GAAI,GAAW,KACb,GAAW,EACb,GAAI,GAAW,MACb,GAAW,EACb,GAAI,GAAW,MACb,GAAW,GACb,GAAI,IAAY,EACd,OAAO,OAAO,aAAa,CAAQ,EAErC,MAAO,WAAW,EAAU,KAAK,KAEnC,SAAS,CAAe,CAAC,EAAK,CAC5B,IAAI,EACA,EACJ,GAAI,OAAO,IAAQ,SACjB,GAAI,KAAO,EACT,EAAW,EAAS,GACpB,EAAU,EAAI,YAAY,EAE1B,OAAW,EACX,EAAU,OAEP,KAEL,GADA,EAAW,EAAS,GAChB,CAAC,EACH,MAAU,MAAM,gBAAgB,GAAK,EAEvC,EAAU,OAAO,CAAG,EAAE,YAAY,EAEpC,MAAO,CAAE,WAAU,SAAQ,EAE7B,SAAS,CAAc,CAAC,EAAU,EAAS,CACzC,IAAM,EAAmB,GAAS,eAAiB,GAE7C,GADwB,GAAS,oBAAsB,KACA,CAAC,EACxD,EAAY,MAAO,EAAM,EAAU,IAAM,CAC7C,QAAW,KAAO,EAAM,CACtB,IAAQ,SAAU,GAAY,EAAgB,CAAG,EAEjD,GADA,EAAS,MAAM,KAAK,OAAQ,EAAQ,KAAK,CAAO,CAAC,EAC7C,EAAU,EACZ,MAAM,IAAI,QAAQ,CAAC,IAAY,WAAW,EAAS,CAAO,CAAC,IAI3D,EAAW,CAAC,EAAK,IAAc,CACnC,GAAI,EAAkB,CACpB,IAAM,WAAU,WAAY,EAAgB,CAAG,EACzC,EAAoB,CACxB,KAAM,YACN,KAAM,SACN,KAAM,SACN,KAAM,MACN,OAAQ,SACR,SAAU,KACV,SAAU,OACV,SAAU,QACV,SAAU,OACV,SAAU,OACV,SAAU,MACV,UAAW,QACb,EACA,GAAI,GAAY,EAAkB,GAChC,EAAU,EAAkB,GAE9B,GAAI,GAAW,EAAQ,WAAW,QAAQ,EACxC,EAAU,EAAQ,UAAU,CAAC,EAE/B,GAAI,GAAW,EAAgB,GAAU,CACvC,IAAM,EAAY,EAAgB,GAC5B,EAAW,EAAoB,EAAW,CAAS,EACzD,EAAS,MAAM,KAAK,OAAQ,EAAQ,KAAK,CAAQ,CAAC,EAClD,OAEF,GAAI,GAAY,EAAS,SAAW,GAAK,CAAC,EAAS,WAAW,MAAM,EAAG,CACrE,IAAM,EAAY,EAAS,YAAY,CAAC,EACxC,GAAI,EAAW,CACb,IAAM,EAAW,EAAoB,EAAW,CAAS,EACzD,EAAS,MAAM,KAAK,OAAQ,EAAQ,KAAK,CAAQ,CAAC,EAClD,SAIN,GAAI,GAA+B,EAAW,CAC5C,IAAM,WAAU,WAAY,EAAgB,CAAG,EACzC,EAAqB,CACzB,KAAM,IACN,KAAM,GACN,KAAM,GACN,KAAM,EACN,OAAQ,GACR,IAAK,EACP,EACI,EACJ,GAAI,GAAY,EAAmB,KAAc,OAC/C,EAAW,EAAmB,GACzB,QAAI,GAAY,EAAS,SAAW,GAAK,CAAC,EAAS,WAAW,MAAM,EACzE,EAAW,EAAS,WAAW,CAAC,EAElC,GAAI,IAAa,OAAW,CAC1B,IAAM,EAAW,EAA8B,EAAU,CAAS,EAClE,EAAS,MAAM,KAAK,OAAQ,EAAQ,KAAK,CAAQ,CAAC,EAClD,QAGJ,IAAI,EAAU,EAAgB,CAAG,EAAE,SACnC,GAAI,GACF,GAAI,EAAQ,WAAW,OAAO,GAAK,EAAQ,OAAS,EAAG,CACrD,IAAM,EAAW,GAAK,EAAU,MAAQ,EAAI,IAAM,EAAU,KAAO,EAAI,IAAM,EAAU,KAAO,EAAI,IAAM,EAAU,MAAQ,EAAI,IAAM,EAAU,MAAQ,GAAK,GAC3J,GAAI,EAAW,EAAG,CAChB,IAAM,EAAa,EAAQ,MAAM,gBAAgB,EACjD,GAAI,EACF,EAAU,QAAQ,EAAW,MAAM,KAC9B,KACL,IAAM,EAAS,EAAQ,MAAM,EAAE,EAC/B,EAAU,UAAU,IAAW,MAG9B,QAAI,EAAQ,SAAW,EAAG,CAC/B,IAAI,EAAO,EACX,GAAI,IAAS,MAAQ,EAAU,MAAO,CACpC,EAAU,EAAU,KAAO,aAAe,SAC1C,EAAS,MAAM,KAAK,OAAQ,EAAQ,KAAK,CAAO,CAAC,EACjD,OAEF,GAAI,IAAS,OAAS,EAAU,MAAQ,EAAU,OAAS,EAAU,OAEnE,EAAU,WADO,GAAK,EAAU,MAAQ,EAAI,IAAM,EAAU,KAAO,EAAI,IAAM,EAAU,KAAO,EAAI,IAAM,EAAU,MAAQ,EAAI,IAAM,EAAU,MAAQ,GAAK,UAEtJ,QAAI,EAAU,KAAM,CACzB,GAAI,GAAQ,KAAO,GAAQ,IACzB,EAAU,OAAO,aAAa,EAAK,WAAW,CAAC,EAAI,EAAE,EAChD,QAAI,GAAQ,KAAO,GAAQ,IAChC,EAAU,OAAO,aAAa,EAAK,WAAW,CAAC,EAAI,EAAE,EAChD,KACL,IAAM,EAAiB,CACrB,IAAK,OACL,KAAM,OACN,IAAK,OACL,IAAK,OACL,EAAG,OACH,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,MACP,EACA,GAAI,KAAQ,EACV,EAAU,EAAe,GAG7B,GAAI,EAAU,KACZ,EAAU,OAAO,IAEd,KACL,GAAI,EAAU,OAAS,GAAQ,KAAO,GAAQ,IAC5C,EAAO,EAAK,YAAY,EAE1B,GAAI,EAAU,KACZ,EAAU,OAAO,IAEjB,OAAU,GAGT,QAAI,EAAU,MAAQ,CAAC,EAAQ,WAAW,MAAM,EACrD,EAAU,OAAO,IAGrB,EAAS,MAAM,KAAK,OAAQ,EAAQ,KAAK,CAAO,CAAC,GAiCnD,MAAO,CACL,YACA,WACA,SAlCe,MAAO,EAAM,EAAU,IAAM,CAC5C,IAAM,EAAO,EAAK,MAAM,EAAE,EAC1B,MAAM,EAAU,EAAM,CAAO,GAiC7B,WA/BkB,CAAC,IAAc,CACjC,EAAS,EAAS,OAAQ,CAAS,GA+BnC,YA7BkB,CAAC,IAAc,CACjC,EAAS,EAAS,OAAQ,CAAS,GA6BnC,SA3Be,CAAC,IAAc,CAC9B,EAAS,EAAS,IAAK,CAAS,GA2BhC,eAzBqB,CAAC,IAAc,CACpC,EAAS,EAAS,UAAW,CAAS,GAyBtC,WAvBiB,CAAC,EAAW,IAAc,CAC3C,IAAM,EAAS,CACb,GAAI,EAAS,SACb,KAAM,EAAS,WACf,KAAM,EAAS,WACf,MAAO,EAAS,WAClB,EACA,EAAS,EAAO,GAAY,CAAS,GAiBrC,WAfiB,IAAM,CACvB,EAAS,IAAK,CAAE,KAAM,EAAK,CAAC,GAe5B,mBAbyB,CAAC,IACnB,EAAU,CAAC,EAAK,oBAAqB,EAAM,EAAK,iBAAiB,CAAC,CAa3E,EAIF,IAAI,EAAe,CACjB,KAAM,EACN,OAAQ,EACR,MAAO,EACP,SAAU,GACV,WAAY,GACZ,WAAY,GACZ,YAAa,EACf,EACA,SAAS,CAAe,CAAC,EAAU,CACjC,IAAI,EAAkB,CAAE,EAAG,EAAG,EAAG,CAAE,EAC/B,EAAiB,IAAI,IACnB,EAAqB,CAAC,EAAM,EAAG,EAAG,EAAS,EAAa,KAAM,EAAY,CAAC,IAAM,CACrF,IAAI,EAAa,EACjB,GAAI,EAAU,MACZ,GAAc,EAChB,GAAI,EAAU,IACZ,GAAc,EAChB,GAAI,EAAU,KACZ,GAAc,GAChB,OAAQ,OACD,OAEH,GADA,EAAa,GACT,EAAU,MACZ,GAAc,EAChB,GAAI,EAAU,IACZ,GAAc,EAChB,GAAI,EAAU,KACZ,GAAc,GAChB,UACG,OAEH,GADA,GAAc,EAAe,KAAO,EAAI,MAAM,KAAK,CAAc,EAAE,GAAK,GAAU,GAC9E,EAAU,MACZ,GAAc,EAChB,GAAI,EAAU,IACZ,GAAc,EAChB,GAAI,EAAU,KACZ,GAAc,GAChB,UACG,SACH,MAEJ,IAAM,EAAQ,EAAI,EACZ,EAAQ,EAAI,EACd,EAAe,IACnB,GAAI,IAAS,MAAQ,IAAS,QAAU,IAAS,OAC/C,EAAe,IAEjB,MAAO,SAAS,KAAc,KAAS,IAAQ,KAE3C,EAAiB,MAAO,EAAM,EAAG,EAAG,EAAS,EAAa,KAAM,EAAU,CAAC,IAAM,CACrF,IAAQ,YAAY,CAAC,EAAG,UAAU,GAAM,EAClC,EAAgB,EAAmB,EAAM,EAAG,EAAG,EAAQ,CAAS,EAGtE,GAFA,EAAS,MAAM,KAAK,OAAQ,OAAO,KAAK,CAAa,CAAC,EACtD,EAAkB,CAAE,IAAG,GAAE,EACrB,IAAS,QAAU,EAAS,GAC9B,EAAe,IAAI,CAAM,EACpB,QAAI,IAAS,KAClB,EAAe,OAAO,CAAM,EAE9B,GAAI,EAAU,EACZ,MAAM,IAAI,QAAQ,CAAC,IAAY,WAAW,EAAS,CAAO,CAAC,GAGzD,EAAS,MAAO,EAAG,EAAG,EAAU,CAAC,IAAM,CAC3C,IAAQ,SAAS,EAAa,KAAM,UAAU,EAAG,YAAY,CAAC,GAAM,EACpE,GAAI,EAAe,KAAO,EACxB,MAAM,EAAe,OAAQ,EAAG,EAAG,MAAM,KAAK,CAAc,EAAE,GAAI,CAAE,YAAW,SAAQ,CAAC,EAExF,WAAM,EAAe,OAAQ,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,EAEnE,EAAkB,CAAE,IAAG,GAAE,GAErB,EAAQ,MAAO,EAAG,EAAG,EAAS,EAAa,KAAM,EAAU,CAAC,IAAM,CACtE,IAAQ,UAAU,GAAI,YAAY,CAAC,GAAM,EACzC,MAAM,EAAe,OAAQ,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,EACjE,MAAM,IAAI,QAAQ,CAAC,IAAY,WAAW,EAAS,CAAO,CAAC,EAC3D,MAAM,EAAe,KAAM,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,GAE3D,EAAc,MAAO,EAAG,EAAG,EAAS,EAAa,KAAM,EAAU,CAAC,IAAM,CAC5E,IAAQ,UAAU,GAAI,YAAY,CAAC,GAAM,EACzC,MAAM,EAAM,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,EAChD,MAAM,IAAI,QAAQ,CAAC,IAAY,WAAW,EAAS,CAAO,CAAC,EAC3D,MAAM,EAAM,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,GAE5C,EAAY,MAAO,EAAG,EAAG,EAAS,EAAa,KAAM,EAAU,CAAC,IAAM,CAC1E,IAAQ,YAAY,CAAC,EAAG,UAAU,GAAM,EACxC,MAAM,EAAe,OAAQ,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,GAE7D,EAAU,MAAO,EAAG,EAAG,EAAS,EAAa,KAAM,EAAU,CAAC,IAAM,CACxE,IAAQ,YAAY,CAAC,EAAG,UAAU,GAAM,EACxC,MAAM,EAAe,KAAM,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,GAwCjE,MAAO,CACL,SACA,QACA,cACA,YACA,UACA,KA5CW,MAAO,EAAQ,EAAQ,EAAM,EAAM,EAAS,EAAa,KAAM,EAAU,CAAC,IAAM,CAC3F,IAAQ,UAAU,GAAI,YAAY,CAAC,GAAM,EACzC,MAAM,EAAU,EAAQ,EAAQ,EAAQ,CAAE,WAAU,CAAC,EACrD,IAAM,EAAQ,EACR,GAAM,EAAO,GAAU,EACvB,GAAM,EAAO,GAAU,EAC7B,QAAS,EAAI,EAAE,GAAK,EAAO,IAAK,CAC9B,IAAM,EAAW,KAAK,MAAM,EAAS,EAAK,CAAC,EACrC,EAAW,KAAK,MAAM,EAAS,EAAK,CAAC,EAC3C,MAAM,EAAe,OAAQ,EAAU,EAAU,EAAQ,CAAE,YAAW,SAAQ,CAAC,EAEjF,MAAM,EAAQ,EAAM,EAAM,EAAQ,CAAE,WAAU,CAAC,GAkC/C,OAhCa,MAAO,EAAG,EAAG,EAAW,EAAU,CAAC,IAAM,CACtD,IAAQ,YAAY,CAAC,EAAG,UAAU,GAAM,EACpC,EACJ,OAAQ,OACD,KACH,EAAS,EAAa,SACtB,UACG,OACH,EAAS,EAAa,WACtB,UACG,OACH,EAAS,EAAa,WACtB,UACG,QACH,EAAS,EAAa,YACtB,MAEJ,MAAM,EAAe,SAAU,EAAG,EAAG,EAAQ,CAAE,YAAW,SAAQ,CAAC,GAgBnE,mBAdyB,KAClB,IAAK,CAAgB,GAc5B,kBAZwB,IACjB,MAAM,KAAK,CAAc,EAYhC,gBACF,EAMF,MAAM,UAAwB,CAAS,CACrC,MAAQ,GACR,QACA,KACA,WAAW,CAAC,EAAU,GAAI,EAAO,GAAI,CACnC,MAAM,EACN,KAAK,QAAU,EACf,KAAK,KAAO,EAEd,MAAM,CAAC,EAAQ,EAAW,EAAU,CAClC,EAAS,EAEX,aAAa,EAAG,CACd,MAAO,IAEX,CACA,SAAS,CAAe,EAAG,CACzB,OAAO,IAAI,EAAS,CAAE,IAAI,EAAG,EAAG,CAAC,EAEnC,SAAS,CAAgB,CAAC,EAAU,GAAI,EAAO,GAAI,CACjD,OAAO,IAAI,EAAgB,EAAS,CAAI,EAI1C,IAAI,EAAU,IAAI,YACd,EAAqB,GACrB,GAAiC,GACjC,GAAuB,EAC3B,eAAe,CAAkB,EAAG,CAClC,MAAM,QAAQ,QAAQ,EACtB,MAAM,IAAI,QAAQ,CAAC,IAAY,QAAQ,SAAS,CAAO,CAAC,EACxD,MAAM,QAAQ,QAAQ,EAExB,SAAS,CAAwB,CAAC,EAAO,EAAU,CACjD,GAAI,OAAO,IAAU,UAAY,CAAC,OAAO,SAAS,CAAK,GAAK,GAAS,EACnE,OAAO,EAET,OAAO,KAAK,MAAM,CAAK,EAEzB,SAAS,CAAe,CAAC,EAAU,EAAS,EAAO,CACjD,IAAM,EAAQ,EAAS,SAAS,EAC1B,EAAY,EAAS,kBAAkB,EACvC,EAAU,CACd,EACA,YAAY,EAAS,UACrB,qBAAqB,EAAM,mBAC3B,iBAAiB,EAAM,eACvB,cAAc,EAAU,YACxB,gBAAgB,EAAU,cAC1B,uBAAuB,EAAU,oBACnC,EACA,GAAI,IAAU,OACZ,EAAQ,KAAK;AAAA,EACf,GAAO,EAEP,OAAW,MAAM,EAAQ,KAAK;AAAA,CAC/B,CAAC,EAGF,MAAM,CAA2B,CAC/B,QAAU,CAAC,EACX,WAAW,CAAC,EAAU,CACpB,EAAS,GAAG,kBAAyC,KAAK,MAAM,EAChE,EAAS,KAAK,UAAyB,IAAM,CAC3C,EAAS,IAAI,kBAAyC,KAAK,MAAM,EAClE,EAEH,OAAS,CAAC,IAAU,CAClB,IAAM,EAAM,EAAQ,OAAO,EAAM,SAAS,iBAAiB,EAAK,CAAC,EAC3D,EAAO,MAAM,KAAK,CAAE,OAAQ,EAAM,SAAS,MAAO,EAAG,CAAC,EAAG,IAAU,EAAI,MAAM,EAAQ,EAAM,SAAS,OAAQ,EAAQ,GAAK,EAAM,SAAS,KAAK,EAAE,QAAQ,CAAC,EAC9J,KAAK,QAAQ,KAAK,CAChB,KAAM,EAAK,KAAK;AAAA,CACrB,EACK,OACA,MAAO,EAAM,SAAS,MACtB,OAAQ,EAAM,SAAS,OACvB,WAAY,EAAM,WAClB,eAAgB,EAAM,eACtB,gBAAiB,EAAM,eACzB,CAAC,GAEH,IAAI,EAAG,CACL,IAAM,EAAU,KAAK,QAErB,OADA,KAAK,QAAU,CAAC,EACT,EAET,QAAQ,EAAG,CACT,OAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,IAAW,EAAO,IAAI,EAAE,KAAK;AAAA,CAC5D,EAEC,KAAK,EAAG,CACN,KAAK,QAAU,CAAC,EAEpB,CACA,SAAS,CAAsB,CAAC,EAAU,CACxC,IAAM,EAAY,EAAS,kBAAkB,EAC7C,GAAI,CAAC,EAAU,WAAa,CAAC,EAAU,aAAe,CAAC,EAAU,mBAC/D,OAAO,QAAQ,QAAQ,IAAI,EAE7B,OAAO,IAAI,QAAQ,CAAC,IAAY,CAC9B,IAAI,EAAU,GACR,EAAU,IAAM,CACpB,EAAS,IAAI,QAAqB,CAAO,EACzC,EAAS,IAAI,UAAyB,CAAS,GAE3C,EAAS,CAAC,IAAU,CACxB,GAAI,EACF,OACF,EAAU,GACV,EAAQ,EACR,EAAQ,CAAK,GAET,EAAU,CAAC,IAAU,CACzB,EAAO,CAAK,GAER,EAAY,IAAM,CACtB,EAAO,IAAI,GAIb,GAFA,EAAS,GAAG,QAAqB,CAAO,EACxC,EAAS,KAAK,UAAyB,CAAS,EAC5C,CAAC,EAAU,UACb,EAAS,KAAK,EAAE,KAAK,IAAM,EAAO,IAAI,CAAC,EAE1C,EAEH,eAAe,EAAkB,CAAC,EAAS,CACzC,IAAM,EAAmB,EAAQ,cAAgB,CAAE,OAAQ,EAAK,EAAI,EAAQ,iBACtE,EAAW,MAAM,GAAkB,IACpC,EACH,mBACA,WAAY,EAAQ,YAAc,cAClC,aAAc,EAAQ,cAAgB,GACtC,YAAa,EAAQ,aAAe,WACpC,mBAAoB,EAAQ,oBAAsB,aACpD,CAAC,EACK,EAAiB,IAAI,EAA2B,CAAQ,EACxD,EAAY,EAAe,EAAU,CACzC,cAAe,EAAQ,cACvB,mBAAoB,EAAQ,kBAC9B,CAAC,EACK,EAAY,EAAgB,CAAQ,EACpC,EAAa,SAAY,CAC7B,IAAM,EAAO,EAAS,MACtB,GAAI,GAAM,gBAAgB,EACxB,MAAM,EAAK,KAAK,EAElB,MAAM,EAAS,KAAK,GAEhB,EAAmB,IAAM,CAE7B,IAAM,EADgB,EAAS,oBACE,iBAAiB,EAAI,EACtD,OAAO,EAAQ,OAAO,CAAU,GAE5B,EAAoB,MAAO,EAAc,CAAC,IAAM,CACpD,IAAM,EAAY,EAAyB,EAAY,UAAW,EAA8B,EAC1F,EAAc,EAAyB,EAAY,YAAa,EAAoB,EACtF,EAAyB,EAC7B,QAAS,EAAQ,EAAE,EAAQ,EAAW,IAAS,CAC7C,MAAM,EAAmB,EACzB,IAAM,EAAa,EAAS,kBAAkB,EAC9C,GAAI,CAAC,EAAW,WAAa,CAAC,EAAW,aAAe,CAAC,EAAW,mBAClE,OAGF,GAAI,CADU,MAAM,EAAuB,CAAQ,EAEjD,OAEF,GAAI,EAAS,eAAe,EAAE,eAAiB,GAE7C,GADA,IACI,GAA0B,EAC5B,OAGF,OAAyB,EAG7B,MAAM,EAAmB,EACzB,IAAM,EAAY,EAAS,kBAAkB,EAC7C,GAAI,CAAC,EAAU,WAAa,CAAC,EAAU,aAAe,CAAC,EAAU,mBAC/D,OAEF,MAAM,EAAgB,EAAU,2CAA2C,UAAkB,GA4C/F,MAAO,CACL,WACA,YACA,YACA,aACA,MA/CY,MAAO,EAAe,CAAC,IAAM,CACzC,MAAM,EAAkB,CAAE,UAAW,EAAyB,EAAa,UAAW,CAAkB,CAAE,CAAC,GA+C3G,QA7Cc,MAAO,EAAW,EAAc,CAAC,IAAM,CACrD,IAAM,EAAY,EAAyB,EAAY,UAAW,CAAkB,EACpF,QAAS,EAAO,EAAE,GAAQ,EAAW,IAAQ,CAE3C,GADA,MAAM,EAAmB,EACrB,MAAM,EAAU,EAClB,OAEF,GAAI,IAAS,EACX,MAEF,IAAM,EAAY,EAAS,kBAAkB,EAC7C,GAAI,CAAC,EAAU,WAAa,CAAC,EAAU,aAAe,CAAC,EAAU,mBAC/D,MAEF,MAAM,EAAuB,CAAQ,EAEvC,MAAM,EAAgB,EAAU,yCAAyC,UAAkB,GA8B3F,aA5BmB,MAAO,EAAW,EAAc,CAAC,IAAM,CAC1D,IAAM,EAAY,EAAyB,EAAY,UAAW,CAAkB,EAChF,EAAQ,EAAiB,EAC7B,QAAS,EAAO,EAAE,GAAQ,EAAW,IAAQ,CAG3C,GAFA,MAAM,EAAmB,EACzB,EAAQ,EAAiB,EACrB,MAAM,EAAU,CAAK,EACvB,OAAO,EAET,GAAI,IAAS,EACX,MAEF,IAAM,EAAY,EAAS,kBAAkB,EAC7C,GAAI,CAAC,EAAU,WAAa,CAAC,EAAU,aAAe,CAAC,EAAU,mBAC/D,MAEF,MAAM,EAAuB,CAAQ,EAGvC,MADA,EAAQ,EAAiB,EACnB,EAAgB,EAAU,+CAA+C,WAAoB,CAAK,GAUxG,oBACA,iBACA,eAAgB,IAAM,EAAS,eAAe,EAC9C,mBACA,aAAc,IAAM,CAClB,IAAM,EAAgB,EAAS,oBACzB,EAAQ,EAAc,aAAa,EACnC,EAAc,EAAS,eAAe,EAC5C,MAAO,CACL,KAAM,EAAc,MACpB,KAAM,EAAc,OACpB,OAAQ,CAAC,EAAY,EAAG,EAAY,CAAC,EACrC,OACF,GAEF,OAAQ,CAAC,EAAO,IAAW,CACzB,EAAS,cAAc,EAAO,CAAM,EAExC,EAEF,eAAe,EAAiB,CAAC,EAAQ,CACvC,IAAM,EAAQ,EAAO,OAAS,EAAgB,EACxC,EAAQ,EAAO,OAAS,EAAO,QAAQ,SAAW,QAAQ,OAAO,SAAW,GAC5E,EAAS,EAAO,QAAU,EAAO,QAAQ,MAAQ,QAAQ,OAAO,MAAQ,GACxE,EAAS,EAAO,QAAU,EAAiB,EAAO,CAAM,EAC9D,OAAO,IAAI,EAAY,EAAO,EAAQ,EAAO,EAAQ,IAChD,EACH,eAAgB,EAAO,gBAAkB,QAC3C,CAAC,EAGH,MAAM,WAA6B,CAAiB,CAClD,mBAAqB,CAAC,EACtB,YAAc,CAAE,WAAY,CAAC,CAAE,EAC/B,oBACA,OACA,WAAW,CAAC,EAAS,CACnB,MAAM,CAAE,SAAU,WAAY,EAAG,CAAE,gBAAiB,EAAM,CAAC,EAC3D,KAAK,oBAAsB,GAAS,mBACpC,KAAK,OAAS,GAAS,OAAS,IAAI,OAEhC,QAAO,EAAG,CACd,KAAK,wBAAwB,EAC7B,MAAM,MAAM,QAAQ,OAEhB,cAAa,CAAC,EAAS,EAAU,CACrC,IAAQ,UAAS,WAAY,QAAQ,cAAc,EAC/C,EACJ,GAAI,KAAK,sBAAwB,OAC/B,EAAU,KAAK,OAAO,WAAW,IAAM,CACrC,IAAM,EAAQ,KAAK,mBAAmB,UAAU,CAAC,IAAM,EAAE,UAAY,CAAO,EAC5E,GAAI,IAAU,GACZ,EAAQ,KAAK,WAAW,EACxB,KAAK,mBAAmB,OAAO,EAAO,CAAC,GAExC,KAAK,mBAAmB,EAG7B,OADA,KAAK,mBAAmB,KAAK,CAAE,UAAS,UAAS,SAAQ,CAAC,EACnD,EAET,aAAa,CAAC,EAAQ,CACpB,KAAK,YAAc,EAErB,oBAAoB,CAAC,EAAQ,EAAG,CAC9B,GAAI,GAAS,GAAK,EAAQ,KAAK,mBAAmB,OAAQ,CACxD,IAAM,EAAO,KAAK,mBAAmB,GACrC,GAAI,EAAK,QACP,KAAK,OAAO,aAAa,EAAK,OAAO,EAEvC,EAAK,QAAQ,KAAK,WAAW,EAC7B,KAAK,mBAAmB,OAAO,EAAO,CAAC,GAG3C,uBAAuB,EAAG,CACxB,QAAa,UAAS,aAAa,KAAK,mBAAoB,CAC1D,GAAI,EACF,KAAK,OAAO,aAAa,CAAO,EAElC,EAAQ,KAAK,WAAW,EAE1B,KAAK,mBAAqB,CAAC,EAE7B,cAAc,EAAG,CACf,OAAO,KAAK,mBAAmB,OAAS,EAE5C,CAEA,SAAS,EAA0B,CAAC,EAAY,CAAC,EAAG,CAClD,MAAO,CACL,eAAgB,GAChB,eAAgB,GAChB,IAAK,GACL,QAAS,GACT,QAAS,UACT,WAAY,GACZ,qBAAsB,GACtB,eAAgB,GAChB,YAAa,GACb,MAAO,GACP,eAAgB,GAChB,KAAM,GACN,gBAAiB,GACjB,WAAY,GACZ,MAAO,GACP,cAAe,UACf,cAAe,GACf,4BAA6B,GAC7B,OAAQ,GACR,YAAa,OACb,eAAgB,UACb,EACH,SAAU,CACR,KAAM,GACN,QAAS,GACT,eAAgB,MACb,EAAU,QACf,CACF,EAEF,SAAS,EAAuB,CAAC,EAAU,EAAY,CAAC,EAAG,CACzD,IAAM,EAAe,GAA2B,CAAS,EAEzD,OADA,EAAS,cAAgB,EAClB,EAGT,SAAS,EAAS,EAAG,CACnB,IAAM,EAAQ,CAAC,EACT,EAAM,IAAI,IAAS,CACvB,EAAM,KAAK,CAAI,GAQjB,OANA,EAAI,MAAQ,EACZ,EAAI,UAAY,IAAM,EAAM,OAC5B,EAAI,WAAa,IAAI,IACZ,EAAM,KAAK,CAAC,IAAS,KAAK,UAAU,CAAI,IAAM,KAAK,UAAU,CAAQ,CAAC,EAE/E,EAAI,MAAQ,IAAM,EAAM,OAAS,EAC1B,EAGT,SAAS,EAAa,CAAC,EAAM,EAAO,CAClC,GAAI,EAAK,SAAW,EAAM,OACxB,OAAO,EAAK,OAAS,EAAM,OAE7B,OAAO,EAAK,MAAQ,EAAM,MAG5B,MAAM,EAAY,CAChB,KAAO,EACP,OAAS,EACT,UAAY,EACZ,OAAS,IAAI,IACb,GAAG,EAAG,CACJ,OAAO,KAAK,KAEd,OAAO,CAAC,EAAM,CACZ,IAAM,EAAa,KAAK,MAAM,CAAI,EAClC,GAAI,GAAc,KAAK,KAAM,CAC3B,KAAK,QAAQ,EAAa,KAAK,IAAI,EACnC,OAEF,KAAK,KAAO,EAEd,UAAU,CAAC,EAAI,EAAS,CACtB,OAAO,KAAK,SAAS,EAAI,EAAS,EAAK,EAEzC,YAAY,CAAC,EAAQ,CACnB,KAAK,OAAO,OAAO,OAAO,CAAM,CAAC,EAEnC,WAAW,CAAC,EAAI,EAAS,CACvB,OAAO,KAAK,SAAS,EAAI,EAAS,EAAI,EAExC,aAAa,CAAC,EAAQ,CACpB,KAAK,aAAa,CAAM,EAE1B,OAAO,CAAC,EAAS,CACf,IAAM,EAAa,KAAK,KAAO,KAAK,IAAI,EAAG,KAAK,MAAM,CAAO,CAAC,EAC9D,MAAO,GAAM,CACX,IAAM,EAAY,KAAK,cAAc,EACrC,GAAI,CAAC,GAAa,EAAU,OAAS,EACnC,MAKF,GAHA,KAAK,OAAO,OAAO,EAAU,EAAE,EAC/B,KAAK,KAAO,EAAU,OACtB,EAAU,GAAG,EACT,EAAU,QAAU,CAAC,KAAK,OAAO,IAAI,EAAU,EAAE,EACnD,KAAK,OAAO,IAAI,EAAU,GAAI,IACzB,EACH,OAAQ,KAAK,KAAO,EAAU,QAC9B,MAAO,KAAK,WACd,CAAC,EAGL,KAAK,KAAO,EAEd,MAAM,EAAG,CACP,MAAO,GAAM,CACX,IAAM,EAAY,KAAK,cAAc,EACrC,GAAI,CAAC,EACH,OAEF,KAAK,QAAQ,EAAU,OAAS,KAAK,IAAI,GAG7C,QAAQ,CAAC,EAAI,EAAS,EAAQ,CAC5B,IAAM,EAAK,KAAK,SACV,EAAkB,KAAK,IAAI,EAAG,KAAK,MAAM,CAAO,CAAC,EASvD,OARA,KAAK,OAAO,IAAI,EAAI,CAClB,KACA,OAAQ,KAAK,KAAO,EACpB,MAAO,KAAK,YACZ,QAAS,EACT,SACA,IACF,CAAC,EACM,EAET,aAAa,EAAG,CACd,IAAI,EAAY,KAChB,QAAW,KAAS,KAAK,OAAO,OAAO,EACrC,GAAI,CAAC,GAAa,GAAc,EAAO,CAAS,EAAI,EAClD,EAAY,EAGhB,OAAO,EAEX,CAEA,MAAM,EAAa,CACjB,SACA,OAAS,CAAC,EACV,UAAY,GACZ,YAAc,EACd,UAAY,EACZ,QAAU,IAAI,YACd,cACA,IACA,QAAU,IAAM,CACd,GAAI,CAAC,KAAK,UACR,OACF,KAAK,aAAa,GAEpB,WAAW,CAAC,EAAU,EAAS,CAC7B,KAAK,SAAW,EAChB,KAAK,cAAgB,GAAS,eAAiB,CAAC,EAChD,KAAK,IAAM,GAAS,MAAQ,IAAM,YAAY,IAAI,GAEpD,GAAG,EAAG,CACJ,GAAI,KAAK,UACP,OAEF,KAAK,UAAY,GACjB,KAAK,OAAS,CAAC,EACf,KAAK,YAAc,EACnB,KAAK,UAAY,KAAK,IAAI,EAC1B,KAAK,SAAS,GAAG,QAAqB,KAAK,OAAO,EAEpD,IAAI,EAAG,CACL,GAAI,CAAC,KAAK,UACR,OAEF,KAAK,UAAY,GACjB,KAAK,SAAS,IAAI,QAAqB,KAAK,OAAO,KAEjD,eAAc,EAAG,CACnB,MAAO,CAAC,GAAG,KAAK,MAAM,EAExB,KAAK,EAAG,CACN,KAAK,OAAS,CAAC,EACf,KAAK,YAAc,KAEjB,YAAW,EAAG,CAChB,OAAO,KAAK,UAEd,YAAY,EAAG,CACb,IAAM,EAAgB,KAAK,SAAS,oBAC9B,EAAa,EAAc,iBAAiB,EAAI,EAEhD,EAAgB,CACpB,MAFY,KAAK,QAAQ,OAAO,CAAU,EAG1C,UAAW,KAAK,IAAI,EAAI,KAAK,UAC7B,YAAa,KAAK,aACpB,EACA,GAAI,KAAK,cAAc,IAAM,KAAK,cAAc,IAAM,KAAK,cAAc,WAAY,CACnF,IAAM,EAAU,EAAc,QAE9B,GADA,EAAc,QAAU,CAAC,EACrB,KAAK,cAAc,GACrB,EAAc,QAAQ,GAAK,IAAI,YAAY,EAAQ,EAAE,EAEvD,GAAI,KAAK,cAAc,GACrB,EAAc,QAAQ,GAAK,IAAI,YAAY,EAAQ,EAAE,EAEvD,GAAI,KAAK,cAAc,WACrB,EAAc,QAAQ,WAAa,IAAI,WAAW,EAAQ,UAAU,EAGxE,KAAK,OAAO,KAAK,CAAa,EAElC", | ||
| "debugId": "BD3092784EBCD40664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/status.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.status,\n Effect.fn(\"cli.service.status\")(function* () {\n const options = yield* ServiceConfig.options()\n const found = yield* Service.discover({ ...options, version: undefined })\n process.stdout.write((found?.url ?? \"stopped\") + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,OACnC,EAAO,GAAG,oBAAoB,EAAE,SAAU,EAAG,CAC3C,IAAM,EAAU,MAAO,EAAc,QAAQ,EACvC,EAAQ,MAAO,EAAQ,SAAS,IAAK,EAAS,QAAS,MAAU,CAAC,EACxE,QAAQ,OAAO,OAAO,GAAO,KAAO,WAAa,CAAG,EACrD,CACH", | ||
| "debugId": "CDAFBE7661FCD75864756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH", | ||
| "debugId": "10082978DDDDFD3C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/models.ts"], | ||
| "sourcesContent": [ | ||
| "import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.models,\n Effect.fn(\"cli.models\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const response = yield* Effect.promise(() => client.model.list({ location: { directory: process.cwd() } }))\n const models = response.data\n .map((model) => `${model.providerID}/${model.id}`)\n .toSorted((a, b) => a.localeCompare(b))\n if (models.length > 0) process.stdout.write(models.join(EOL) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";giCAGA,cAAS,WAKT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EAEK,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAClF,KACrB,IAAI,CAAC,IAAU,GAAG,EAAM,cAAc,EAAM,IAAI,EAChD,SAAS,CAAC,EAAG,IAAM,EAAE,cAAc,CAAC,CAAC,EACxC,GAAI,EAAO,OAAS,EAAG,QAAQ,OAAO,MAAM,EAAO,KAAK,CAAG,EAAI,CAAG,EACnE,CACH", | ||
| "debugId": "31F2745B2C28479664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/unset.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.unset,\n Effect.fn(\"cli.service.unset\")(function* (input) {\n yield* ServiceConfig.unset(input.key, Option.getOrUndefined(input.name))\n }),\n)\n" | ||
| ], | ||
| "mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,MAAO,EAAc,MAAM,EAAM,IAAK,EAAO,eAAe,EAAM,IAAI,CAAC,EACxE,CACH", | ||
| "debugId": "A1CEECC7CFEEDC6A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/set.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.set,\n Effect.fn(\"cli.service.set\")(function* (input) {\n yield* ServiceConfig.set(input.key, input.value, Option.getOrUndefined(input.nestedValue))\n }),\n)\n" | ||
| ], | ||
| "mappings": ";02BAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,IACnC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,MAAO,EAAc,IAAI,EAAM,IAAK,EAAM,MAAO,EAAO,eAAe,EAAM,WAAW,CAAC,EAC1F,CACH", | ||
| "debugId": "0417BEFB190D3DD164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "BF968AB7198F45D464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "73B0215D2C36AC0364756E2164756E21", | ||
| "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, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAcT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAU,MAAO,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,UAAS,CAAC,CACnG,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "DD028559ED63FE4264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "EA028DFFE927A57C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/stop.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.stop,\n Effect.fn(\"cli.service.stop\")(function* () {\n yield* Service.stop(yield* ServiceConfig.options())\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAMA,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,KACnC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,MAAO,EAAQ,KAAK,MAAO,EAAc,QAAQ,CAAC,EACnD,CACH", | ||
| "debugId": "D29D90A96BD741BB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/shared.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { OpenCode, type IntegrationInfo, type IntegrationMethod, type OpenCodeClient } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../../services/server-connection\"\n\nexport const location = { directory: process.cwd() }\n\nexport const createClient = Effect.fn(\"cli.auth.client\")(function* (input: ServerConnection.Args) {\n const server = yield* ServerConnection.resolve(input)\n return OpenCode.make({ baseUrl: server.endpoint.url, headers: Service.headers(server.endpoint) })\n})\n\nexport function request<A>(run: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({ try: run, catch: (cause) => cause })\n}\n\nexport const loadIntegrations = Effect.fn(\"cli.auth.integrations\")(function* (client: OpenCodeClient) {\n // The model endpoint is the existing public readiness boundary for the initial plugin generation.\n yield* request((signal) => client.model.default({ location }, { signal }))\n return yield* request((signal) => client.integration.list({ location }, { signal })).pipe(\n Effect.map((response) => response.data),\n )\n})\n\nexport const resolveIntegration = Effect.fn(\"cli.auth.resolve-integration\")(function* (\n integrations: IntegrationInfo[],\n target: string,\n) {\n const normalized = target.replace(/\\/+$/, \"\")\n const byID = integrations.find((integration) => integration.id === normalized)\n if (byID) return byID\n const matches = integrations.filter((integration) => integration.name.toLowerCase() === normalized.toLowerCase())\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) {\n return yield* Effect.fail(\n new Error(\n `Integration name \"${target}\" is ambiguous: ${matches.map((integration) => integration.id).join(\", \")}`,\n ),\n )\n }\n return yield* Effect.fail(new Error(`Integration not found: ${target}`))\n})\n\nexport type ConnectMethod = Exclude<IntegrationMethod, { type: \"env\" }>\n\nexport function connectMethods(integration: IntegrationInfo) {\n return integration.methods\n .filter((method): method is ConnectMethod => method.type !== \"env\")\n .toSorted((a, b) => Number(a.type === \"key\") - Number(b.type === \"key\"))\n}\n\nexport const resolveMethod = Effect.fn(\"cli.auth.resolve-method\")(function* (methods: ConnectMethod[], target: string) {\n const normalized = target.toLowerCase()\n const matches = methods.filter((method) => {\n if (method.type === \"key\") return normalized === \"key\" || method.label?.toLowerCase() === normalized\n return method.id === target || method.label.toLowerCase() === normalized\n })\n if (matches.length === 1) return matches[0]\n if (matches.length > 1) return yield* Effect.fail(new Error(`Authentication method \"${target}\" is ambiguous`))\n const available = methods.map((method) => (method.type === \"key\" ? \"key\" : method.id)).join(\", \")\n return yield* Effect.fail(\n new Error(`Authentication method not found: ${target}${available ? `. Available: ${available}` : \"\"}`),\n )\n})\n" | ||
| ], | ||
| "mappings": ";gNAKO,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAEtC,EAAe,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAA8B,CAChG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAAK,EACpD,OAAO,EAAS,KAAK,CAAE,QAAS,EAAO,SAAS,IAAK,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAAE,CAAC,EACjG,EAEM,SAAS,CAAU,CAAC,EAA0C,CACnE,OAAO,EAAO,WAAW,CAAE,IAAK,EAAK,MAAO,CAAC,IAAU,CAAM,CAAC,EAGzD,IAAM,EAAmB,EAAO,GAAG,uBAAuB,EAAE,SAAU,CAAC,EAAwB,CAGpG,OADA,MAAO,EAAQ,CAAC,IAAW,EAAO,MAAM,QAAQ,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAClE,MAAO,EAAQ,CAAC,IAAW,EAAO,YAAY,KAAK,CAAE,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAAE,KACnF,EAAO,IAAI,CAAC,IAAa,EAAS,IAAI,CACxC,EACD,EAEY,EAAqB,EAAO,GAAG,8BAA8B,EAAE,SAAU,CACpF,EACA,EACA,CACA,IAAM,EAAa,EAAO,QAAQ,OAAQ,EAAE,EACtC,EAAO,EAAa,KAAK,CAAC,IAAgB,EAAY,KAAO,CAAU,EAC7E,GAAI,EAAM,OAAO,EACjB,IAAM,EAAU,EAAa,OAAO,CAAC,IAAgB,EAAY,KAAK,YAAY,IAAM,EAAW,YAAY,CAAC,EAChH,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EACnB,OAAO,MAAO,EAAO,KACf,MACF,qBAAqB,oBAAyB,EAAQ,IAAI,CAAC,IAAgB,EAAY,EAAE,EAAE,KAAK,IAAI,GACtG,CACF,EAEF,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,GAAQ,CAAC,EACxE,EAIM,SAAS,CAAc,CAAC,EAA8B,CAC3D,OAAO,EAAY,QAChB,OAAO,CAAC,IAAoC,EAAO,OAAS,KAAK,EACjE,SAAS,CAAC,EAAG,IAAM,OAAO,EAAE,OAAS,KAAK,EAAI,OAAO,EAAE,OAAS,KAAK,CAAC,EAGpE,IAAM,EAAgB,EAAO,GAAG,yBAAyB,EAAE,SAAU,CAAC,EAA0B,EAAgB,CACrH,IAAM,EAAa,EAAO,YAAY,EAChC,EAAU,EAAQ,OAAO,CAAC,IAAW,CACzC,GAAI,EAAO,OAAS,MAAO,OAAO,IAAe,OAAS,EAAO,OAAO,YAAY,IAAM,EAC1F,OAAO,EAAO,KAAO,GAAU,EAAO,MAAM,YAAY,IAAM,EAC/D,EACD,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,GAAI,EAAQ,OAAS,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,0BAA0B,iBAAsB,CAAC,EAC7G,IAAM,EAAY,EAAQ,IAAI,CAAC,IAAY,EAAO,OAAS,MAAQ,MAAQ,EAAO,EAAG,EAAE,KAAK,IAAI,EAChG,OAAO,MAAO,EAAO,KACf,MAAM,oCAAoC,IAAS,EAAY,gBAAgB,IAAc,IAAI,CACvG,EACD", | ||
| "debugId": "069B500AAF7BA0BC64756E2164756E21", | ||
| "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 return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,EAAG,CACrC,IAAM,EAAU,MAAO,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,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,SACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "1375F38F2881569264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/import.ts"], | ||
| "sourcesContent": [ | ||
| "import { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Session } from \"@opencode-ai/schema/session\"\nimport { SessionTransfer } from \"@opencode-ai/schema/session-transfer\"\nimport { Effect, Option, Schema } from \"effect\"\nimport { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(\n Commands.commands.import,\n Effect.fn(\"cli.import\")(function* (input) {\n const text = yield* Effect.tryPromise({\n try: () =>\n input.file.startsWith(\"http://\") || input.file.startsWith(\"https://\")\n ? fetch(input.file).then((response) => {\n if (!response.ok) throw new Error(`Failed to fetch session data: ${response.statusText}`)\n return response.text()\n })\n : Bun.file(input.file).text(),\n catch: (cause) =>\n new Error(`Failed to read session data: ${cause instanceof Error ? cause.message : String(cause)}`),\n })\n const data = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(SessionTransfer.Data))(text)\n const encoded = Schema.encodeSync(SessionTransfer.Data)(data)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const location = yield* Effect.promise(() =>\n client.location.get({\n location: { directory: path.resolve(Option.getOrElse(input.directory, () => process.cwd())) },\n }),\n )\n const response = yield* Effect.promise(() =>\n fetch(new URL(\"/api/session/import\", server.endpoint.url), {\n method: \"POST\",\n headers: { ...Service.headers(server.endpoint), \"content-type\": \"application/json\" },\n body: JSON.stringify({\n ...encoded,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n }),\n }),\n )\n if (response.status === 409) {\n process.stderr.write(`Session already exists${EOL}`)\n return\n }\n if (!response.ok) yield* Effect.fail(new Error(`Failed to import session: ${response.statusText}`))\n const imported = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Struct({ data: Session.Info })))(\n yield* Effect.promise(() => response.text()),\n )\n process.stdout.write(`Imported session: ${imported.data.id}${EOL}`)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";03CAKA,cAAS,WACT,oBAKA,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,SAAU,CAAC,EAAO,CACxC,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAM,KAAK,WAAW,SAAS,GAAK,EAAM,KAAK,WAAW,UAAU,EAChE,MAAM,EAAM,IAAI,EAAE,KAAK,CAAC,IAAa,CACnC,GAAI,CAAC,EAAS,GAAI,MAAU,MAAM,iCAAiC,EAAS,YAAY,EACxF,OAAO,EAAS,KAAK,EACtB,EACD,IAAI,KAAK,EAAM,IAAI,EAAE,KAAK,EAChC,MAAO,CAAC,IACF,MAAM,gCAAgC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAAG,CACtG,CAAC,EACK,EAAO,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAgB,IAAI,CAAC,EAAE,CAAI,EAC1F,EAAU,EAAO,WAAW,EAAgB,IAAI,EAAE,CAAI,EACtD,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAW,MAAO,EAAO,QAAQ,IACrC,EAAO,SAAS,IAAI,CAClB,SAAU,CAAE,UAAW,EAAK,QAAQ,EAAO,UAAU,EAAM,UAAW,IAAM,QAAQ,IAAI,CAAC,CAAC,CAAE,CAC9F,CAAC,CACH,EACM,EAAW,MAAO,EAAO,QAAQ,IACrC,MAAM,IAAI,IAAI,sBAAuB,EAAO,SAAS,GAAG,EAAG,CACzD,OAAQ,OACR,QAAS,IAAK,EAAQ,QAAQ,EAAO,QAAQ,EAAG,eAAgB,kBAAmB,EACnF,KAAM,KAAK,UAAU,IAChB,EACH,SAAU,CAAE,UAAW,EAAS,UAAW,YAAa,EAAS,WAAY,CAC/E,CAAC,CACH,CAAC,CACH,EACA,GAAI,EAAS,SAAW,IAAK,CAC3B,QAAQ,OAAO,MAAM,yBAAyB,GAAK,EACnD,OAEF,GAAI,CAAC,EAAS,GAAI,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAS,YAAY,CAAC,EAClG,IAAM,EAAW,MAAO,EAAO,oBAAoB,EAAO,eAAe,EAAO,OAAO,CAAE,KAAM,EAAQ,IAAK,CAAC,CAAC,CAAC,EAC7G,MAAO,EAAO,QAAQ,IAAM,EAAS,KAAK,CAAC,CAC7C,EACA,QAAQ,OAAO,MAAM,qBAAqB,EAAS,KAAK,KAAK,GAAK,EACnE,CACH", | ||
| "debugId": "86107E04F287B1DE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "2F2A0F129CF65ECD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\nimport { Env } from \"../env\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n // Bun's default five-minute deadline terminates the event stream used by long-running sessions.\n fetch: ((request: RequestInfo | URL, init?: RequestInit) =>\n fetch(request, { ...init, timeout: false } as BunFetchRequestInit)) as typeof fetch,\n })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n environment: input.server.service ? Env.session() : undefined,\n prepare: async (next) => {\n const selected =\n next.model ??\n (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n return { model, agent: next.agent }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\nfunction errorMessage(error: unknown) {\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 return String(error)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n ToolContent,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { nonEmptyToolContent, toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n metadata: Record<string, JsonValue>\n content: ToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.inbox.delivered\") {\n if (event.data.inboxID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.id), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) {\n current.metadata = event.data.metadata\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n metadata: event.data.metadata,\n content: event.data.content,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n metadata: event.data.metadata,\n content: event.data.content,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const metadata = event.data.metadata ?? current.metadata\n const content = event.data.content ?? nonEmptyToolContent(current.content)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n metadata,\n content,\n error: event.data.error,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (content && toolOutputText(current.tool, content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n metadata,\n content,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (input.compatibility === \"v1\" && event.data.error.message === \"The provider response ended unexpectedly.\") {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n partID: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n id: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (item.state.content && toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({\n ...item,\n state: {\n status: \"completed\",\n input: item.state.input,\n metadata: item.state.metadata,\n content: item.state.content,\n },\n })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, id: string) {\n return `${messageID}\\u0000${id}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; id: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n metadata: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "EF40D88F9AB7CFE564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/add.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, stat, writeFile } from \"node:fs/promises\"\nimport { Effect, Option } from \"effect\"\nimport { applyEdits, modify } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.add,\n Effect.fn(\"cli.mcp.add\")(function* (input) {\n const url = Option.getOrUndefined(input.url)\n const headers = Option.getOrUndefined(input.header)\n const environment = Option.getOrUndefined(input.env)\n // The CLI framework strands `--` operands on the root command, so read the local server command\n // straight from argv after `--`. This also lets the command carry its own flags (e.g. `npx -y`).\n const dash = process.argv.indexOf(\"--\")\n const command = dash === -1 ? [...input.command] : process.argv.slice(dash + 1)\n\n const hasCommand = command.length > 0\n if (url && hasCommand)\n return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --, not both\"))\n if (!url && !hasCommand) return yield* Effect.fail(new Error(\"Provide either --url <url> or a command after --\"))\n if (url && !URL.canParse(url)) return yield* Effect.fail(new Error(`Invalid URL: ${url}`))\n if (url && environment) return yield* Effect.fail(new Error(\"--env is only valid for local MCP servers\"))\n if (hasCommand && headers) return yield* Effect.fail(new Error(\"--header is only valid for remote MCP servers\"))\n\n const server = url\n ? { type: \"remote\" as const, url, ...(headers ? { headers } : {}) }\n : { type: \"local\" as const, command, ...(environment ? { environment } : {}) }\n\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(input.global ? global.config : process.cwd()))\n yield* Effect.promise(() => write(configPath, input.name, server))\n process.stdout.write(`MCP server \"${input.name}\" added to ${configPath}` + EOL)\n }),\n)\n\nexport async function resolveConfigPath(directory: string) {\n const candidates = [\n path.join(directory, \"opencode.json\"),\n path.join(directory, \"opencode.jsonc\"),\n path.join(directory, \".opencode\", \"opencode.json\"),\n path.join(directory, \".opencode\", \"opencode.jsonc\"),\n ]\n for (const candidate of candidates) {\n if (\n await stat(candidate).then(\n (info) => info.isFile(),\n () => false,\n )\n )\n return candidate\n }\n return candidates[0]\n}\n\nasync function write(configPath: string, name: string, server: unknown) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return \"{}\"\n throw error\n })\n const edits = modify(text, [\"mcp\", \"servers\", name], server, {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n })\n await writeFile(configPath, applyEdits(text, edits))\n}\n" | ||
| ], | ||
| "mappings": ";wOAAA,cAAS,WACT,oBACA,mBAAS,UAAU,eAAM,oBAOzB,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,IAC/B,EAAO,GAAG,aAAa,EAAE,SAAU,CAAC,EAAO,CACzC,IAAM,EAAM,EAAO,eAAe,EAAM,GAAG,EACrC,EAAU,EAAO,eAAe,EAAM,MAAM,EAC5C,EAAc,EAAO,eAAe,EAAM,GAAG,EAG7C,EAAO,QAAQ,KAAK,QAAQ,IAAI,EAChC,EAAU,IAAS,GAAK,CAAC,GAAG,EAAM,OAAO,EAAI,QAAQ,KAAK,MAAM,EAAO,CAAC,EAExE,EAAa,EAAQ,OAAS,EACpC,GAAI,GAAO,EACT,OAAO,MAAO,EAAO,KAAS,MAAM,4DAA4D,CAAC,EACnG,GAAI,CAAC,GAAO,CAAC,EAAY,OAAO,MAAO,EAAO,KAAS,MAAM,kDAAkD,CAAC,EAChH,GAAI,GAAO,CAAC,IAAI,SAAS,CAAG,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,gBAAgB,GAAK,CAAC,EACzF,GAAI,GAAO,EAAa,OAAO,MAAO,EAAO,KAAS,MAAM,2CAA2C,CAAC,EACxG,GAAI,GAAc,EAAS,OAAO,MAAO,EAAO,KAAS,MAAM,+CAA+C,CAAC,EAE/G,IAAM,EAAS,EACX,CAAE,KAAM,SAAmB,SAAS,EAAU,CAAE,SAAQ,EAAI,CAAC,CAAG,EAChE,CAAE,KAAM,QAAkB,aAAa,EAAc,CAAE,aAAY,EAAI,CAAC,CAAG,EAEzE,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAM,OAAS,EAAO,OAAS,QAAQ,IAAI,CAAC,CAAC,EAC9G,MAAO,EAAO,QAAQ,IAAM,EAAM,EAAY,EAAM,KAAM,CAAM,CAAC,EACjE,QAAQ,OAAO,MAAM,eAAe,EAAM,kBAAkB,IAAe,CAAG,EAC/E,CACH,EAEA,eAAsB,CAAiB,CAAC,EAAmB,CACzD,IAAM,EAAa,CACjB,EAAK,KAAK,EAAW,eAAe,EACpC,EAAK,KAAK,EAAW,gBAAgB,EACrC,EAAK,KAAK,EAAW,YAAa,eAAe,EACjD,EAAK,KAAK,EAAW,YAAa,gBAAgB,CACpD,EACA,QAAW,KAAa,EACtB,GACE,MAAM,EAAK,CAAS,EAAE,KACpB,CAAC,IAAS,EAAK,OAAO,EACtB,IAAM,EACR,EAEA,OAAO,EAEX,OAAO,EAAW,GAGpB,eAAe,CAAK,CAAC,EAAoB,EAAc,EAAiB,CACtE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,MAAO,KACtG,MAAM,EACP,EACK,EAAQ,EAAO,EAAM,CAAC,MAAO,UAAW,CAAI,EAAG,EAAQ,CAC3D,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CAAC,EACD,MAAM,EAAU,EAAY,EAAW,EAAM,CAAK,CAAC", | ||
| "debugId": "EC0C90DF21EC517764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/session.shared.ts", "../tui/src/mini/variant.shared.ts", "../tui/src/mini/theme.ts", "../tui/src/mini/mono.ts"], | ||
| "sourcesContent": [ | ||
| "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 signal?: AbortSignal,\n limit = LIMIT,\n): Promise<RunSession> {\n const [response, session] = await Promise.all([\n sdk.message.list({ sessionID, limit, order: \"desc\" }, ...requestOptions(signal)),\n sdk.session.get({ sessionID }, ...requestOptions(signal)),\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\nfunction requestOptions(signal?: AbortSignal): [] | [{ signal: AbortSignal }] {\n return signal ? [{ signal }] : []\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", | ||
| "// Model variant resolution and persistence.\n//\n// Variants are provider-specific reasoning effort levels (e.g., \"high\", \"max\").\n// Resolution priority: CLI --variant flag > valid session history > saved preference.\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 { createSession, sessionVariant, type RunSession, type SessionMessages } from \"./session.shared\"\nimport type { RunInput, RunProvider } from \"./types\"\nimport { cycleModelVariant, normalizeModelVariant } from \"../model-preference\"\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 return cycleModelVariant(current, variants)\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 const normalized = normalizeModelVariant(value)\n return normalized && (variants.length === 0 || variants.includes(normalized)) ? normalized : undefined\n}\n\n// Picks the active variant. CLI flag wins, then valid session history, then the\n// saved preference. Saved and session values are dropped when the provider no\n// longer offers them.\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 normalizeModelVariant(input)\n }\n\n return fitVariant(session, variants) ?? fitVariant(saved, variants)\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/v1/tui\"\nimport { ansiToRgba } from \"../theme/color\"\nimport { resolveThemeColors } from \"../theme/resolve\"\nimport { terminalMode } from \"../theme/system\"\nimport type { ThemeV1Json } from \"../theme/v1\"\nimport type { EntryKind, RunTuiConfig } 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}\n\nexport type RunFooterTheme = {\n highlight: ColorInput\n selected: ColorInput\n selectedText: ColorInput\n warning: 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 text: ColorInput\n muted: ColorInput\n syntax?: SyntaxStyle\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\">\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 colorMode(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 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: ThemeV1Json, pick: \"dark\" | \"light\"): TuiThemeCurrent {\n const resolved = resolveThemeColors(theme, pick, (code) => RGBA.fromIndex(code, ansiToRgba(code)))\n return {\n ...resolved.theme,\n thinkingOpacity: resolved.thinkingOpacity,\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\"): ThemeV1Json {\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 }\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 = colorMode(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.13 : 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 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 text: scrollbackTheme.text,\n muted: scrollbackTheme.textMuted,\n syntax,\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 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 },\n block: {\n text: seed.text,\n muted: seed.muted,\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\nfunction monoTheme(mode: \"dark\" | \"light\"): RunTheme {\n const foreground = RGBA.defaultForeground(mode === \"light\" ? \"#000000\" : \"#ffffff\")\n const background = RGBA.defaultBackground(mode === \"light\" ? \"#ffffff\" : \"#000000\")\n return {\n background,\n footer: {\n highlight: foreground,\n selected: background,\n selectedText: foreground,\n warning: foreground,\n error: foreground,\n muted: foreground,\n text: foreground,\n status: background,\n statusAccent: background,\n shade: background,\n surface: background,\n pane: background,\n border: foreground,\n line: background,\n },\n entry: {\n system: tone(foreground),\n user: tone(foreground),\n assistant: tone(foreground),\n reasoning: tone(foreground),\n tool: tone(foreground),\n error: tone(foreground),\n },\n splash: {\n left: foreground,\n right: foreground,\n leftShadow: background,\n },\n block: {\n text: foreground,\n muted: foreground,\n diffRemoved: foreground,\n diffAddedBg: background,\n diffRemovedBg: background,\n diffContextBg: background,\n diffHighlightAdded: foreground,\n diffHighlightRemoved: foreground,\n diffLineNumber: foreground,\n diffAddedLineNumberBg: background,\n diffRemovedLineNumberBg: background,\n },\n }\n}\n\nexport const RUN_THEME_MONO = monoTheme(\"dark\")\nconst RUN_THEME_MONO_LIGHT = monoTheme(\"light\")\n\nexport async function resolveRunTheme(\n renderer: CliRenderer,\n config?: RunTuiConfig[\"theme\"],\n mono = false,\n): Promise<RunTheme> {\n if (mono) {\n const mode =\n config?.mode === \"light\" || config?.mode === \"dark\"\n ? config.mode\n : (renderer.themeMode ?? (await renderer.waitForThemeMode(300)))\n return mode === \"light\" ? RUN_THEME_MONO_LIGHT : RUN_THEME_MONO\n }\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 =\n config?.mode === \"dark\" || config?.mode === \"light\"\n ? config.mode\n : (terminalMode(colors) ?? renderer.themeMode ?? colorMode(RGBA.fromHex(bg)))\n const { generateSyntax } = await import(\"../theme\")\n const indexed = indexedPalette(colors, 256)\n const footerTheme = resolveTheme(generateSystem(colors, pick), pick)\n const scrollbackTheme = quantizeTheme(footerTheme, indexed)\n const syntaxTheme: SharedSyntaxTheme = {\n ...scrollbackTheme,\n _hasSelectedListItemText: true,\n }\n return map(footerTheme, scrollbackTheme, splashTheme(scrollbackTheme, indexed), generateSyntax(syntaxTheme))\n } catch {\n return RUN_THEME_FALLBACK\n }\n}\n", | ||
| "import {\n BoxRenderable,\n CodeRenderable,\n MarkdownRenderable,\n RGBA,\n Renderable,\n StyledText,\n TextRenderable,\n TextTableRenderable,\n isStyledText,\n stringToStyledText,\n type BorderCharacters,\n type CliRendererExternalOutputEvent,\n type TreeSitterClient,\n} from \"@opentui/core\"\n\nconst prefixes: Record<number, string> = {\n 0x2192: \"->\",\n 0x2190: \"<-\",\n 0x2731: \"*\",\n 0x2699: \"*\",\n 0x2716: \"!\",\n 0x2717: \"!\",\n 0x25c8: \"*\",\n 0x25c9: \"*\",\n 0x27f3: \"*\",\n}\n\nconst markdown: Record<number, string> = {\n ...prefixes,\n 0x00a0: \" \",\n 0x00b7: \"-\",\n 0x2010: \"-\",\n 0x2011: \"-\",\n 0x2012: \"-\",\n 0x2013: \"-\",\n 0x2014: \"--\",\n 0x2018: \"'\",\n 0x2019: \"'\",\n 0x201c: '\"',\n 0x201d: '\"',\n 0x2022: \"*\",\n 0x2026: \"...\",\n 0x2191: \"up\",\n 0x2193: \"down\",\n}\n\nconst asciiBorder: BorderCharacters = {\n topLeft: \"+\",\n topRight: \"+\",\n bottomLeft: \"+\",\n bottomRight: \"+\",\n horizontal: \"-\",\n vertical: \"|\",\n topT: \"+\",\n bottomT: \"+\",\n leftT: \"+\",\n rightT: \"+\",\n cross: \"+\",\n}\n\nconst hooked = new WeakSet<Renderable>()\n\nexport const monoMarkdownTableOptions = {\n style: \"columns\" as const,\n widthMode: \"content\" as const,\n borders: false,\n}\n\nexport function monoMarkdownRenderable(renderable: MarkdownRenderable): void {\n monoRenderable(renderable)\n}\n\nfunction monoRenderable(renderable: Renderable): void {\n if (hooked.has(renderable)) return\n hooked.add(renderable)\n // Markdown reconciles nested lists and tables without calling renderNode.\n // Hook the actual tree so future descendants are transformed before layout.\n const add = renderable.add.bind(renderable)\n renderable.add = (child, index) => {\n if (child instanceof Renderable) monoRenderable(child)\n return add(child, index)\n }\n\n if (renderable instanceof BoxRenderable) renderable.customBorderChars = asciiBorder\n if (renderable instanceof CodeRenderable) monoCode(renderable)\n if (renderable instanceof TextRenderable) renderable.content = monoStyledText(renderable.content)\n if (renderable instanceof TextTableRenderable) monoTable(renderable)\n renderable.getChildren().forEach(monoRenderable)\n}\n\nfunction monoCode(renderable: CodeRenderable): void {\n const onChunks = renderable.onChunks\n renderable.onChunks = async (chunks, context) => monoChunks((await onChunks?.(chunks, context)) ?? chunks)\n renderable.treeSitterClient = monoTreeSitter(renderable.treeSitterClient)\n\n const initialDescriptor = Object.getOwnPropertyDescriptor(CodeRenderable.prototype, \"initialStyledText\")\n const contentDescriptor = Object.getOwnPropertyDescriptor(CodeRenderable.prototype, \"content\")\n if (!initialDescriptor?.set || !contentDescriptor?.get || !contentDescriptor.set) return\n const initialSetter = initialDescriptor.set.bind(renderable)\n const contentGetter = contentDescriptor.get.bind(renderable)\n const contentSetter = contentDescriptor.set.bind(renderable)\n const initial = Reflect.get(renderable, \"_initialStyledText\")\n Object.defineProperty(renderable, \"initialStyledText\", {\n configurable: true,\n set(value: StyledText | undefined) {\n initialSetter(value ? monoStyledText(value) : value)\n },\n })\n Object.defineProperty(renderable, \"content\", {\n configurable: true,\n get: contentGetter,\n set(value: string) {\n if (renderable.filetype !== \"markdown\" || !isStyledText(Reflect.get(renderable, \"_initialStyledText\"))) {\n renderable.drawUnstyledText = true\n renderable.initialStyledText = stringToStyledText(value)\n }\n contentSetter(renderable.filetype === \"markdown\" ? value : monoText(value))\n },\n })\n\n if (isStyledText(initial)) {\n renderable.initialStyledText = initial\n } else {\n renderable.drawUnstyledText = true\n renderable.initialStyledText = stringToStyledText(renderable.content)\n }\n if (!renderable.drawUnstyledText) return\n\n // Refresh the eager buffer with the transformed initial text. Highlighted\n // chunks continue through onChunks without changing the Markdown source.\n const content = renderable.content\n renderable.content = \"\"\n renderable.content = content\n}\n\nfunction monoTreeSitter(client: TreeSitterClient): TreeSitterClient {\n return new Proxy(client, {\n get(target, property) {\n if (property !== \"highlightOnce\") return Reflect.get(target, property, target)\n // Keep parser failures on the chunk path instead of OpenTUI's raw-text fallback.\n return (...args: Parameters<TreeSitterClient[\"highlightOnce\"]>) =>\n target.highlightOnce(...args).catch(() => ({ highlights: [] }))\n },\n })\n}\n\nfunction monoTable(renderable: TextTableRenderable): void {\n const descriptor = Object.getOwnPropertyDescriptor(TextTableRenderable.prototype, \"content\")\n if (!descriptor?.get || !descriptor.set) return\n const cells = new WeakMap<StyledText[\"chunks\"], StyledText[\"chunks\"]>()\n const content = renderable.content\n Object.defineProperty(renderable, \"content\", {\n configurable: true,\n get: () => descriptor.get!.call(renderable),\n set: (value: TextTableRenderable[\"content\"]) => {\n descriptor.set!.call(\n renderable,\n value.map((row) =>\n row.map((cell) => {\n if (!cell) return cell\n const cached = cells.get(cell)\n if (cached) return cached\n const next = monoChunks(cell)\n cells.set(cell, next)\n return next\n }),\n ),\n )\n },\n })\n renderable.content = content\n}\n\nfunction monoStyledText(value: StyledText): StyledText {\n return new StyledText(monoChunks(value.chunks))\n}\n\nfunction monoChunks(value: StyledText[\"chunks\"]): StyledText[\"chunks\"] {\n return value.map((chunk) => ({ ...chunk, text: monoText(chunk.text) }))\n}\n\nfunction monoText(value: string): string {\n return value.replace(/[^\\t\\n\\x20-\\x7e]/gu, (char) => markdown[char.codePointAt(0)!] ?? \"?\")\n}\n\nexport function monoSnapshot(event: CliRendererExternalOutputEvent): void {\n const buffers = event.snapshot.buffers\n const chars = buffers.char\n for (let index = 0; index < chars.length; index += 1) {\n const point = chars[index]\n if (point <= 0x7f) continue\n const offset = index * 4\n event.snapshot.setCell(\n index % event.snapshot.width,\n Math.floor(index / event.snapshot.width),\n monoCell(point),\n RGBA.fromArray(buffers.fg.subarray(offset, offset + 4)),\n RGBA.fromArray(buffers.bg.subarray(offset, offset + 4)),\n buffers.attributes[index],\n )\n }\n}\n\nfunction monoCell(point: number): string {\n const kind = point >>> 30\n if (kind === 2) return \"?\"\n if (kind === 3) return \" \"\n if (point === 0x2500) return \"-\"\n if (point === 0x2502) return \"|\"\n return markdown[point]?.[0] ?? \"?\"\n}\n\nexport function monoPrefix(value: string, mono: boolean): string {\n if (!mono) return value\n const point = value.codePointAt(0)\n if (point === undefined) return value\n const prefix = prefixes[point]\n if (!prefix) return value\n return prefix + value.slice(point > 0xffff ? 2 : 1)\n}\n\nexport function monoToolText(value: string, mono: boolean): string {\n const result = monoPrefix(value, mono)\n if (!mono) return result\n const separator = ` ${String.fromCodePoint(0xb7)} `\n const index = result.lastIndexOf(separator)\n if (index === -1) return result\n const head = result.slice(0, index)\n if (!head.includes(\" completed\") && head !== \"patch\" && !/^\\d+ questions$/.test(head)) return result\n return result.slice(0, index) + \" - \" + result.slice(index + separator.length)\n}\n\nexport function monoShortcut(value: string, mono: boolean): string {\n if (!mono) return value\n return value\n .replaceAll(String.fromCodePoint(0x2192), \"right\")\n .replaceAll(String.fromCodePoint(0x2190), \"left\")\n .replaceAll(String.fromCodePoint(0x2191), \"up\")\n .replaceAll(String.fromCodePoint(0x2193), \"down\")\n}\n\nexport function monoTruncate(value: string, width: number, mono: boolean): string {\n if (!mono || value.length <= width) return value\n if (width <= 3) return \".\".repeat(Math.max(0, width))\n return value.slice(0, width - 3) + \"...\"\n}\n\nexport function monoTruncateMiddle(value: string, width: number, mono: boolean): string {\n if (!mono || value.length <= width) return value\n if (width <= 3) return \".\".repeat(Math.max(0, width))\n const available = width - 3\n const left = Math.ceil(available / 2)\n return value.slice(0, left) + \"...\" + value.slice(value.length - (available - left))\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "26B393D4BA1360F864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/cli-spinners@3.4.0/node_modules/cli-spinners/index.js", "../../node_modules/.bun/opentui-spinner@0.0.7+442fd61960092d5f/node_modules/opentui-spinner/dist/src-DjeqLSfu.mjs", "../../node_modules/.bun/opentui-spinner@0.0.7+442fd61960092d5f/node_modules/opentui-spinner/dist/solid.mjs", "../tui/src/component/register-spinner.ts"], | ||
| "sourcesContent": [ | ||
| "import spinners from './spinners.json' with {type: 'json'};\n\nexport default spinners;\n\nconst spinnersList = Object.keys(spinners);\n\nexport function randomSpinner() {\n\tconst randomIndex = Math.floor(Math.random() * spinnersList.length);\n\tconst spinnerName = spinnersList[randomIndex];\n\treturn spinners[spinnerName];\n}\n", | ||
| "import{Renderable as e,parseColor as t,resolveRenderLib as n}from\"@opentui/core\";import r from\"cli-spinners\";const i=1e3/60,a=1e3;function o(e){if(!Number.isFinite(e)||e<i||e>a)throw RangeError(`Spinner interval must be a finite number between ${i}ms and ${a}ms`);return e}const s={now:()=>performance.now(),setInterval:(e,t)=>{let n=setInterval(e,t);return n.unref(),n},clearInterval:e=>clearInterval(e)},c=new class{active=new Map;heap=[];timer=null;timerDueAt=0;generation=0;lastWakeAt=-1/0;clock;constructor(e=s,t=16){this.denseTickThreshold=t,this.clock=e}setClock(e){if(this.active.size>0||this.timer!==null)throw Error(`Cannot replace the spinner scheduler clock while active`);this.clock=e}start(e,t,n){if(this.active.has(e))return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n};this.active.set(e,r),this.push(r),this.armNext()}reschedule(e,t){let n=this.active.get(e);if(!n)return;let r={spinner:e,interval:t,nextDueAt:this.clock.now()+t,advance:n.advance};this.active.set(e,r),this.push(r),this.compactIfNeeded(),this.armNext()}stop(e){this.active.delete(e)&&(this.compactIfNeeded(),this.armNext())}armNext(){this.discardStaleRoots();let e=this.heap[0];if(!e){this.cancelTimer(),this.lastWakeAt=-1/0;return}let t=this.clock.now(),n=Math.max(e.nextDueAt,this.lastWakeAt+i);if(this.timer!==null&&this.timerDueAt===n)return;this.cancelTimer();let r=this.generation,a=Math.max(n-t,0);this.timerDueAt=n,this.timer=this.clock.setInterval(()=>this.tick(r),a)}cancelTimer(){this.timer!==null&&(this.generation++,this.clock.clearInterval(this.timer),this.timer=null)}tick(e){if(e!==this.generation||this.timer===null)return;let t=this.timer;this.generation++,this.timer=null,this.clock.clearInterval(t);let n=this.clock.now();this.discardStaleRoots();let r=!1,i=0,a=[];for(;this.heap[0]&&this.heap[0].nextDueAt<=n;){let e=this.pop();if(!(!e||!this.isCurrent(e))){try{e.advance()}catch(e){a.push(e)}if(r=!0,this.isCurrent(e)&&(e.nextDueAt=n+e.interval,this.push(e),i++,i===this.denseTickThreshold)){let e=this.heap;this.heap=[];for(let t of e)if(this.isCurrent(t)){if(t.nextDueAt<=n){try{t.advance()}catch(e){a.push(e)}if(r=!0,!this.isCurrent(t))continue;t.nextDueAt=n+t.interval}this.heap.push(t)}this.heapify();break}}}if(r&&(this.lastWakeAt=n),this.compactIfNeeded(),this.armNext(),a.length===1)throw a[0];if(a.length>1)throw AggregateError(a,`Multiple spinner callbacks failed`)}isCurrent(e){return this.active.get(e.spinner)===e}discardStaleRoots(){for(;this.heap[0]&&!this.isCurrent(this.heap[0]);)this.pop()}compactIfNeeded(){this.heap.length<=this.active.size*2+16||(this.heap=Array.from(this.active.values()),this.heapify())}heapify(){for(let e=Math.floor(this.heap.length/2)-1;e>=0;e--)this.siftDown(e)}push(e){this.heap.push(e);let t=this.heap.length-1;for(;t>0;){let n=Math.floor((t-1)/2);if(this.heap[n].nextDueAt<=e.nextDueAt)break;this.heap[t]=this.heap[n],t=n}this.heap[t]=e}pop(){let e=this.heap[0],t=this.heap.pop();return!e||!t||this.heap.length===0?e:(this.heap[0]=t,this.siftDown(0),e)}siftDown(e){let t=this.heap[e],n=e;for(;;){let e=n*2+1;if(e>=this.heap.length)break;let r=e+1,i=r<this.heap.length&&this.heap[r].nextDueAt<this.heap[e].nextDueAt?r:e;if(this.heap[i].nextDueAt>=t.nextDueAt)break;this.heap[n]=this.heap[i],n=i}this.heap[n]=t}};function l(e,t=1){if(e.length===0)throw RangeError(`createPulse requires at least one color`);return n=>e[Math.floor(n*t)%e.length]}function u(e){if(e.length===0)throw RangeError(`createWave requires at least one color`);return(t,n,r,i)=>{let a=(n+t)%i;return e[Math.floor(a/i*e.length)]??e[0]}}function d(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}var f=class extends e{_name;_frames;_interval;_autoplay;_backgroundColor;_parsedBackgroundColor;_color;_parsedColor;_currentFrameIndex=0;_encodedFrames={};_lib=n();_isRunning=!1;_advanceFrame=()=>{!this._isRunning||this.isDestroyed||(this._currentFrameIndex=(this._currentFrameIndex+1)%this._frames.length,this.requestRender())};_defaultOptions={name:`dots`,frames:r.dots.frames,interval:r.dots.interval,autoplay:!0,backgroundColor:`transparent`,color:`white`};constructor(e,n){super(e,n),this._name=n.name,this._frames=n.frames?.length?n.frames:this._name?r[this._name].frames:this._defaultOptions.frames,this._interval=o(n.interval??(this._name?r[this._name].interval:this._defaultOptions.interval)),this._autoplay=n.autoplay??this._defaultOptions.autoplay,this._backgroundColor=n.backgroundColor??this._defaultOptions.backgroundColor,this._parsedBackgroundColor=t(this._backgroundColor),this._color=n.color??this._defaultOptions.color,this._parsedColor=typeof this._color==`function`?t(this._defaultOptions.color):t(this._color),this.height=1,this._encodeFrames(),this._autoplay&&this.start()}_encodeFrames(){let e=0;for(let t of this._frames){if(this._encodedFrames[t])continue;let n=this._lib.encodeUnicode(t,this.ctx.widthMethod);n&&(this._encodedFrames[t]=n,e=Math.max(e,n.data.reduce((e,t)=>e+t.width,0)))}this.width=e}_freeFrames(){for(let e in this._encodedFrames)this._encodedFrames[e]&&this._lib.freeUnicode(this._encodedFrames[e]);this._encodedFrames={}}get interval(){return this._interval}set interval(e){this._interval=o(e),this._isRunning&&c.reschedule(this,this._interval)}get name(){return this._name}set name(e){let t=e?r[e].frames:this._defaultOptions.frames,n=o(e?r[e].interval:this._defaultOptions.interval),i=!d(this._frames,t),a=this._interval!==n;this._name=e,this._interval=n,i&&(this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()),this._isRunning&&a&&c.reschedule(this,n)}get frames(){return this._frames}set frames(e){let t=e.length===0?this._defaultOptions.frames:e;if(d(this._frames,t)){this._frames=t;return}this._freeFrames(),this._frames=t,this._currentFrameIndex=0,this._encodeFrames(),this.visible&&this.requestRender()}get color(){return this._color}set color(e){this._color=e,typeof e!=`function`&&(this._parsedColor=t(e)),this.visible&&this.requestRender()}get backgroundColor(){return this._backgroundColor}set backgroundColor(e){this._backgroundColor=e,this._parsedBackgroundColor=t(e),this.visible&&this.requestRender()}get visible(){return super.visible}set visible(e){e!==super.visible&&(super.visible=e,this._isRunning&&(e?c.start(this,this._interval,this._advanceFrame):c.stop(this)))}get autoplay(){return this._autoplay}set autoplay(e){this._autoplay=e,e?this.start():this.stop()}start(){this._isRunning||this.isDestroyed||(this._isRunning=!0,this.visible&&c.start(this,this._interval,this._advanceFrame))}stop(){this._isRunning&&(this._isRunning=!1,c.stop(this))}renderSelf(e){if(!this.visible)return;let n=this._frames[this._currentFrameIndex];if(!n)return;let r=this._encodedFrames[n];if(!r)return;let i=this.x;for(let n=0;n<r.data.length;n++){let a=typeof this._color==`function`?t(this._color(this._currentFrameIndex,n,this._frames.length,r.data.length)):this._parsedColor;e.drawChar(r.data[n].char,i,this.y,a,this._parsedBackgroundColor),i+=r.data[n].width}}destroySelf(){this.stop(),this._freeFrames(),super.destroySelf()}};export{l as n,u as r,f as t};", | ||
| "import{t as e}from\"./src-DjeqLSfu.mjs\";import{extend as t}from\"@opentui/solid/components\";function n(){t({spinner:e})}n();export{n as registerSpinner};", | ||
| "import { getComponentCatalogue } from \"@opentui/solid/components\"\nimport { registerSpinner } from \"opentui-spinner/solid\"\n\nexport function registerOpencodeSpinner() {\n if (!getComponentCatalogue().spinner) registerSpinner()\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "2462052C4785312364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/restart.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.restart,\n Effect.fn(\"cli.service.restart\")(function* () {\n const options = yield* ServiceConfig.options()\n yield* Service.stop(options)\n const transport = yield* Service.ensure(options)\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,QACnC,EAAO,GAAG,qBAAqB,EAAE,SAAU,EAAG,CAC5C,IAAM,EAAU,MAAO,EAAc,QAAQ,EAC7C,MAAO,EAAQ,KAAK,CAAO,EAC3B,IAAM,EAAY,MAAO,EAAQ,OAAO,CAAO,EAC/C,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "492E64B4907FCEDD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/mini.ts", "src/mini-host.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\nimport { Env } from \"./env\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n paths: { home: string; state: string; log: string }\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const environment = input.server.reconnect ? Env.session() : undefined\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n environment,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n environment,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory, paths: input.paths }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "B382D54CB7A4891B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type PluginInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { Config } from \"../../../config\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { discoverTuiPlugins, tuiPluginDirectories } from \"@opencode-ai/tui/plugin/discovery\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* (input) {\n const 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 config = yield* Config.Service\n const global = yield* Global.Service\n const info = yield* config.get()\n const discovered = yield* Effect.promise(() =>\n tuiPluginDirectories(process.cwd(), global.config).then(discoverTuiPlugins),\n )\n const output = format(\n response.data,\n [\n ...(info.plugins ?? []).flatMap((entry) => {\n const target = typeof entry === \"string\" ? entry : entry.package\n return target.startsWith(\"-\") ? [] : [{ target, source: \"configured\" as const }]\n }),\n ...discovered.map((target) => ({ target, source: \"discovered\" as const })),\n ],\n input.builtin,\n )\n if (!output) {\n process.stdout.write(\"No plugins found\" + EOL)\n return\n }\n process.stdout.write(output + EOL)\n }),\n)\n\nexport function format(\n plugins: readonly PluginInfo[],\n tui: ReadonlyArray<{ readonly target: string; readonly source: \"configured\" | \"discovered\" }>,\n builtin = false,\n) {\n const server = plugins\n .filter((plugin) => builtin || plugin.source.type !== \"builtin\")\n .toSorted((a, b) => name(a).localeCompare(name(b)))\n .map((plugin) => `${name(plugin)} (${plugin.status})`)\n const advertised = plugins.flatMap((plugin) =>\n plugin.status === \"active\" && plugin.tui && plugin.source.type === \"package\"\n ? [{ target: plugin.source.package, source: \"advertised\" as const }]\n : [],\n )\n const targets = [...tui, ...advertised]\n .filter((plugin, index, all) => all.findIndex((candidate) => candidate.target === plugin.target) === index)\n .toSorted((a, b) => a.target.localeCompare(b.target))\n .map((plugin) => `${plugin.target} (${plugin.source})`)\n return [\n targets.length ? [\"TUI\", ...targets].join(EOL) : undefined,\n server.length ? [\"Server\", ...server].join(EOL) : undefined,\n ]\n .filter((section) => section !== undefined)\n .join(EOL + EOL)\n}\n\nfunction name(plugin: PluginInfo) {\n if (plugin.id) return plugin.id\n if (plugin.source.type === \"package\") return plugin.source.package\n if (plugin.source.type === \"local\") return plugin.source.path\n return plugin.source.type\n}\n" | ||
| ], | ||
| "mappings": ";o/BAAA,cAAS,WAWT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,KAClC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,IAAM,EAAU,MAAO,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,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACrG,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAa,MAAO,EAAO,QAAQ,IACvC,EAAqB,QAAQ,IAAI,EAAG,EAAO,MAAM,EAAE,KAAK,CAAkB,CAC5E,EACM,EAAS,EACb,EAAS,KACT,CACE,IAAI,EAAK,SAAW,CAAC,GAAG,QAAQ,CAAC,IAAU,CACzC,IAAM,EAAS,OAAO,IAAU,SAAW,EAAQ,EAAM,QACzD,OAAO,EAAO,WAAW,GAAG,EAAI,CAAC,EAAI,CAAC,CAAE,SAAQ,OAAQ,YAAsB,CAAC,EAChF,EACD,GAAG,EAAW,IAAI,CAAC,KAAY,CAAE,SAAQ,OAAQ,YAAsB,EAAE,CAC3E,EACA,EAAM,OACR,EACA,GAAI,CAAC,EAAQ,CACX,QAAQ,OAAO,MAAM,mBAAqB,CAAG,EAC7C,OAEF,QAAQ,OAAO,MAAM,EAAS,CAAG,EAClC,CACH,EAEO,SAAS,CAAM,CACpB,EACA,EACA,EAAU,GACV,CACA,IAAM,EAAS,EACZ,OAAO,CAAC,IAAW,GAAW,EAAO,OAAO,OAAS,SAAS,EAC9D,SAAS,CAAC,EAAG,IAAM,EAAK,CAAC,EAAE,cAAc,EAAK,CAAC,CAAC,CAAC,EACjD,IAAI,CAAC,IAAW,GAAG,EAAK,CAAM,MAAM,EAAO,SAAS,EACjD,EAAa,EAAQ,QAAQ,CAAC,IAClC,EAAO,SAAW,UAAY,EAAO,KAAO,EAAO,OAAO,OAAS,UAC/D,CAAC,CAAE,OAAQ,EAAO,OAAO,QAAS,OAAQ,YAAsB,CAAC,EACjE,CAAC,CACP,EACM,EAAU,CAAC,GAAG,EAAK,GAAG,CAAU,EACnC,OAAO,CAAC,EAAQ,EAAO,IAAQ,EAAI,UAAU,CAAC,IAAc,EAAU,SAAW,EAAO,MAAM,IAAM,CAAK,EACzG,SAAS,CAAC,EAAG,IAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC,EACnD,IAAI,CAAC,IAAW,GAAG,EAAO,WAAW,EAAO,SAAS,EACxD,MAAO,CACL,EAAQ,OAAS,CAAC,MAAO,GAAG,CAAO,EAAE,KAAK,CAAG,EAAI,OACjD,EAAO,OAAS,CAAC,SAAU,GAAG,CAAM,EAAE,KAAK,CAAG,EAAI,MACpD,EACG,OAAO,CAAC,IAAY,IAAY,MAAS,EACzC,KAAK,EAAM,CAAG,EAGnB,SAAS,CAAI,CAAC,EAAoB,CAChC,GAAI,EAAO,GAAI,OAAO,EAAO,GAC7B,GAAI,EAAO,OAAO,OAAS,UAAW,OAAO,EAAO,OAAO,QAC3D,GAAI,EAAO,OAAO,OAAS,QAAS,OAAO,EAAO,OAAO,KACzD,OAAO,EAAO,OAAO", | ||
| "debugId": "CFF612A765DD3E9E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/@opentui+core-linux-x64@0.5.4/node_modules/@opentui/core-linux-x64/index.bun.js"], | ||
| "sourcesContent": [ | ||
| "const module = await import(\"./libopentui.so\", { with: { type: \"file\" } })\n\nexport default module.default\n" | ||
| ], | ||
| "mappings": ";oDAAA,IAAM,EAAS,KAAa,yCAAmB,CAAE,KAAM,CAAE,KAAM,MAAO,CAAE,GAEzD,IAAO", | ||
| "debugId": "EEF7028841012A6464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/config.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.config,\n Effect.fn(\"cli.debug.config\")(function* () {\n const 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 entries = yield* Effect.promise(() => client.config.get({ location: { directory: process.cwd() } }))\n process.stdout.write(JSON.stringify(entries, null, 2) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAU,MAAO,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,EACpF,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACzG,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAS,KAAM,CAAC,EAAI,CAAG,EAC5D,CACH", | ||
| "debugId": "55D3CA4CB8F134AC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "688F150A39C4103964756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "340E73449CF63D4964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"../version\"\nimport { Hash } from \"@opencode-ai/util/hash\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, FileSystem, Option, Schema } from \"effect\"\nimport { randomBytes } from \"crypto\"\nimport path from \"path\"\nimport { selfCommand } from \"../util/process\"\n\n// The CLI's service configuration file, plus the Service.EnsureOptions binding that\n// points the client package's service operations at this CLI: which\n// registration file (by channel), which version, and how to spawn opencode.\n\nexport const Info = Schema.Struct({\n hostname: Schema.optional(Schema.String),\n port: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1), Schema.isLessThanOrEqualTo(65_535))),\n password: Schema.optional(Schema.String),\n env: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n})\nexport type Info = typeof Info.Type\n\nconst keys = [\"hostname\", \"port\", \"password\", \"env\"] as const\ntype Key = (typeof keys)[number]\n\nconst decodeInfo = Schema.decodeUnknownEffect(Schema.fromJsonString(Info))\nconst decodeRegistration = Schema.decodeUnknownEffect(Schema.fromJsonString(Service.Info))\n\nexport function filename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return \"service.json\"\n return `service-${channel.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.json`\n}\n\nexport function defaultPort(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"dev\" || channel === \"beta\" || channel === \"next\") return 0xc0de\n if (channel === \"local\") return 0xc0df\n return 10_000 + (Number.parseInt(Hash.fast(channel).slice(0, 8), 16) % 50_000)\n}\n\nexport function legacyFilename(channel = OPENCODE_CHANNEL) {\n if (channel === \"latest\" || channel === \"local\") return\n return `service-${Hash.fast(channel)}.json`\n}\n\nexport function versionBelongsToChannel(\n version: string | undefined,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n if (version === undefined) return false\n if (version === installedVersion) return true\n const prefix = `0.0.0-${channel}-`\n if (!version.startsWith(prefix)) return false\n return /^\\d+(?:\\.\\d+)?$/.test(version.slice(prefix.length))\n}\n\nexport const migrateRegistration = Effect.fnUntraced(function* (\n legacy: string,\n file: string,\n channel = OPENCODE_CHANNEL,\n installedVersion = OPENCODE_VERSION,\n) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n const registration = yield* decodeRegistration(text.value).pipe(Effect.option)\n if (Option.isNone(registration)) return\n if (!versionBelongsToChannel(registration.value.version, channel, installedVersion)) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nexport const migrateConfig = Effect.fnUntraced(function* (legacy: string, file: string) {\n const fs = yield* FileSystem.FileSystem\n const text = yield* fs.readFileString(legacy).pipe(Effect.option)\n if (Option.isNone(text)) return\n if (Option.isNone(yield* decodeInfo(text.value).pipe(Effect.option))) return\n yield* fs.writeFileString(file, text.value, { flag: \"wx\", mode: 0o600 }).pipe(Effect.ignore)\n})\n\nfunction configKey(key: string): Key {\n if (key === \"hostname\" || key === \"port\" || key === \"password\" || key === \"env\") return key\n throw new Error(`Unknown service config key: ${key}`)\n}\n\nconst paths = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem\n const global = yield* Global.Service\n const name = filename()\n const legacy = legacyFilename()\n const file = path.join(global.state, name)\n return {\n fs,\n file,\n legacyConfigFile: legacy ? path.join(global.config, legacy) : undefined,\n legacyRegistrationFiles: [\n ...(legacy ? [path.join(global.state, legacy)] : []),\n ...(name !== \"service.json\" && OPENCODE_CHANNEL !== \"local\" ? [path.join(global.state, \"service.json\")] : []),\n ],\n configFile: path.join(global.config, name),\n }\n})\n\nexport const options = Effect.fnUntraced(function* (input: { readonly checkVersion?: boolean } = {}) {\n const { file, legacyRegistrationFiles } = yield* paths\n yield* Effect.forEach(legacyRegistrationFiles, (legacy) => migrateRegistration(legacy, file))\n return {\n file,\n version: input.checkVersion ? OPENCODE_VERSION : undefined,\n env: (yield* read()).env,\n command: [\n ...selfCommand(),\n \"serve\",\n \"--service\",\n ],\n }\n})\n\nexport const read = Effect.fn(\"cli.service-config.read\")(function* () {\n const { fs, configFile, legacyConfigFile } = yield* paths\n if (legacyConfigFile) yield* migrateConfig(legacyConfigFile, configFile)\n return yield* fs.readFileString(configFile).pipe(\n Effect.flatMap(decodeInfo),\n Effect.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, name?: string) {\n if (key === undefined) {\n const { password: _password, ...safe } = yield* read()\n return JSON.stringify(safe, null, 2)\n }\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service get ${selected}`)\n switch (selected) {\n case \"hostname\": {\n return (yield* read()).hostname ?? \"\"\n }\n case \"port\": {\n const port = (yield* read()).port\n return port === undefined ? \"\" : String(port)\n }\n case \"password\": {\n return yield* password()\n }\n case \"env\": {\n const env = (yield* read()).env ?? {}\n return name === undefined ? JSON.stringify(env, null, 2) : (env[name] ?? \"\")\n }\n }\n throw new Error(`Unknown service config key: ${key}`)\n})\n\nexport const set = Effect.fn(\"cli.service-config.set\")(function* (key: string, value: string, nestedValue?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && nestedValue !== undefined)\n throw new Error(`Usage: opencode service set ${selected} <value>`)\n switch (selected) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), hostname: value })\n return\n }\n case \"port\": {\n const port = Number(value)\n if (!Number.isInteger(port) || port < 1 || port > 65_535) throw new Error(\"Port must be between 1 and 65535\")\n yield* Service.stop(yield* options())\n yield* write({ ...(yield* read()), port })\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n yield* password(value)\n return\n }\n case \"env\": {\n if (nestedValue === undefined) throw new Error(\"Usage: opencode service set env <key> <value>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n yield* write({ ...existing, env: { ...existing.env, [value]: nestedValue } })\n return\n }\n }\n})\n\nexport const unset = Effect.fn(\"cli.service-config.unset\")(function* (key: string, name?: string) {\n const selected = configKey(key)\n if (selected !== \"env\" && name !== undefined) throw new Error(`Usage: opencode service unset ${selected}`)\n switch (selected) {\n case \"hostname\": {\n yield* Service.stop(yield* options())\n const { hostname: _hostname, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"port\": {\n yield* Service.stop(yield* options())\n const { port: _port, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"password\": {\n yield* Service.stop(yield* options())\n const { password: _password, ...next } = yield* read()\n yield* write(next)\n return\n }\n case \"env\": {\n if (name === undefined) throw new Error(\"Usage: opencode service unset env <key>\")\n yield* Service.stop(yield* options())\n const existing = yield* read()\n const { [name]: _removed, ...env } = existing.env ?? {}\n const { env: _existingEnv, ...rest } = existing\n yield* write(Object.keys(env).length === 0 ? rest : { ...rest, env })\n return\n }\n }\n})\n\nexport * as ServiceConfig from \"./service-config\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C93F6BB35749EC2A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/remove.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport path from \"node:path\"\nimport { readFile, rename, writeFile } from \"node:fs/promises\"\nimport { Effect } from \"effect\"\nimport { applyEdits, modify, parse, type ParseError } from \"jsonc-parser\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Config } from \"../../../config\"\nimport { resolveConfigPath } from \"../mcp/add\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.remove,\n Effect.fn(\"cli.plugin.remove\")(function* (input) {\n const global = yield* Global.Service\n const configPath = yield* Effect.promise(() => resolveConfigPath(global.config))\n const server = yield* Effect.promise(() => removePluginConfig(configPath, input.package))\n const config = yield* Config.Service\n const info = yield* config.get()\n const tui = configured(info.plugins, input.package)\n if (tui)\n yield* config.update((draft) => {\n draft.plugins = draft.plugins?.filter((entry) => !matches(entry, input.package))\n })\n\n const removed = [server ? configPath : undefined, tui ? config.path : undefined].filter(\n (file) => file !== undefined,\n )\n process.stdout.write(\n removed.length\n ? `Plugin \"${input.package}\" removed from ${removed.join(\", \")}${EOL}`\n : `Plugin \"${input.package}\" is not configured${EOL}`,\n )\n }),\n)\n\nexport async function removePluginConfig(configPath: string, spec: string) {\n const text = await readFile(configPath, \"utf8\").catch((error) => {\n if (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined\n throw error\n })\n if (text === undefined) return false\n const errors: ParseError[] = []\n const config: unknown = parse(text, errors, { allowTrailingComma: true })\n if (errors.length || typeof config !== \"object\" || config === null || Array.isArray(config))\n throw new Error(`Invalid global configuration: ${configPath}`)\n const plugins = \"plugins\" in config ? config.plugins : undefined\n if (plugins !== undefined && !Array.isArray(plugins)) throw new Error(`Invalid plugins configuration: ${configPath}`)\n if (!configured(plugins, spec)) return false\n\n const updated = applyEdits(\n text,\n modify(\n text,\n [\"plugins\"],\n plugins?.filter((entry) => !matches(entry, spec)),\n {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n },\n ),\n )\n const temporary = configPath + \".tmp\"\n await writeFile(temporary, updated.endsWith(\"\\n\") ? updated : updated + \"\\n\", { mode: 0o600 })\n await rename(temporary, configPath)\n return true\n}\n\nfunction configured(plugins: readonly unknown[] | undefined, spec: string) {\n return plugins?.some((entry) => matches(entry, spec)) ?? false\n}\n\nfunction matches(entry: unknown, spec: string) {\n return entry === spec || (typeof entry === \"object\" && entry !== null && \"package\" in entry && entry.package === spec)\n}\n" | ||
| ], | ||
| "mappings": ";itBAAA,cAAS,WAET,mBAAS,YAAU,eAAQ,oBAS3B,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,OAClC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,IAAM,EAAS,MAAO,EAAO,QACvB,EAAa,MAAO,EAAO,QAAQ,IAAM,EAAkB,EAAO,MAAM,CAAC,EACzE,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAmB,EAAY,EAAM,OAAO,CAAC,EAClF,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAM,EAAW,EAAK,QAAS,EAAM,OAAO,EAClD,GAAI,EACF,MAAO,EAAO,OAAO,CAAC,IAAU,CAC9B,EAAM,QAAU,EAAM,SAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,EAAM,OAAO,CAAC,EAChF,EAEH,IAAM,EAAU,CAAC,EAAS,EAAa,OAAW,EAAM,EAAO,KAAO,MAAS,EAAE,OAC/E,CAAC,IAAS,IAAS,MACrB,EACA,QAAQ,OAAO,MACb,EAAQ,OACJ,WAAW,EAAM,yBAAyB,EAAQ,KAAK,IAAI,IAAI,IAC/D,WAAW,EAAM,6BAA6B,GACpD,EACD,CACH,EAEA,eAAsB,CAAkB,CAAC,EAAoB,EAAc,CACzE,IAAM,EAAO,MAAM,EAAS,EAAY,MAAM,EAAE,MAAM,CAAC,IAAU,CAC/D,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,SAAU,GAAS,EAAM,OAAS,SAAU,OAC/F,MAAM,EACP,EACD,GAAI,IAAS,OAAW,MAAO,GAC/B,IAAM,EAAuB,CAAC,EACxB,EAAkB,EAAM,EAAM,EAAQ,CAAE,mBAAoB,EAAK,CAAC,EACxE,GAAI,EAAO,QAAU,OAAO,IAAW,UAAY,IAAW,MAAQ,MAAM,QAAQ,CAAM,EACxF,MAAU,MAAM,iCAAiC,GAAY,EAC/D,IAAM,EAAU,YAAa,EAAS,EAAO,QAAU,OACvD,GAAI,IAAY,QAAa,CAAC,MAAM,QAAQ,CAAO,EAAG,MAAU,MAAM,kCAAkC,GAAY,EACpH,GAAI,CAAC,EAAW,EAAS,CAAI,EAAG,MAAO,GAEvC,IAAM,EAAU,EACd,EACA,EACE,EACA,CAAC,SAAS,EACV,GAAS,OAAO,CAAC,IAAU,CAAC,EAAQ,EAAO,CAAI,CAAC,EAChD,CACE,kBAAmB,CAAE,QAAS,EAAG,aAAc,EAAK,CACtD,CACF,CACF,EACM,EAAY,EAAa,OAG/B,OAFA,MAAM,EAAU,EAAW,EAAQ,SAAS;AAAA,CAAI,EAAI,EAAU,EAAU;AAAA,EAAM,CAAE,KAAM,GAAM,CAAC,EAC7F,MAAM,EAAO,EAAW,CAAU,EAC3B,GAGT,SAAS,CAAU,CAAC,EAAyC,EAAc,CACzE,OAAO,GAAS,KAAK,CAAC,IAAU,EAAQ,EAAO,CAAI,CAAC,GAAK,GAG3D,SAAS,CAAO,CAAC,EAAgB,EAAc,CAC7C,OAAO,IAAU,GAAS,OAAO,IAAU,UAAY,IAAU,MAAQ,YAAa,GAAS,EAAM,UAAY", | ||
| "debugId": "447A0D1EB0ED8EF464756E2164756E21", | ||
| "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": "39BBAE9AAA8FD6A264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/service/start.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.service.commands.start,\n Effect.fn(\"cli.service.start\")(function* () {\n const transport = yield* Service.ensure(yield* ServiceConfig.options())\n process.stdout.write(transport.url + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";+2BAAA,cAAS,WAOT,IAAe,IAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,EAAG,CAC1C,IAAM,EAAY,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EACtE,QAAQ,OAAO,MAAM,EAAU,IAAM,CAAG,EACzC,CACH", | ||
| "debugId": "8B75BC5F9789FA7764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH", | ||
| "debugId": "EAA7E8C328B41F3064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "535D0D0D278002B464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\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 ...(server ? { answer: { server } } : {}),\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n\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": "9399DD36864345BC64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is not supported yet
250188092
2.43%