@opencode-ai/cli-linux-x64
Advanced tools
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "72FB3F38C95847E764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/prompt/content.ts"], | ||
| "sourcesContent": [ | ||
| "export function normalizePromptContent(content: string) {\n if (content.endsWith(\"\\r\\n\")) {\n const body = content.slice(0, -2)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n if (content.endsWith(\"\\n\")) {\n const body = content.slice(0, -1)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n return content\n}\n" | ||
| ], | ||
| "mappings": ";AAAO,SAAS,CAAsB,CAAC,EAAiB,CACtD,GAAI,EAAQ,SAAS;AAAA,CAAM,EAAG,CAC5B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,GAAI,EAAQ,SAAS;AAAA,CAAI,EAAG,CAC1B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,OAAO", | ||
| "debugId": "A99C34BABC688B3E64756E2164756E21", | ||
| "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": "9E54B25BF669C3E664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/session.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Session from \"./session.js\"\n\nimport { Schema } from \"effect\"\nimport { Agent } from \"./agent.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionEvent } from \"./session-event.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { Money } from \"./money.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { Revert } from \"./session-revert.js\"\nimport { SessionFork } from \"./session-fork.js\"\n\nexport const ID = SessionID\nexport type ID = SessionID\n\nexport const Event = SessionEvent\n\nexport { Revert }\nexport const ForkBoundary = SessionFork.Boundary\nexport type ForkBoundary = SessionFork.Boundary\nexport const ForkRequestBoundary = SessionFork.RequestBoundary\nexport type ForkRequestBoundary = SessionFork.RequestBoundary\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n parentID: ID.pipe(optional),\n fork: Schema.Struct({\n sessionID: ID,\n boundary: ForkBoundary,\n }).pipe(optional),\n projectID: Project.ID,\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n updated: DateTimeUtcFromMillis,\n archived: DateTimeUtcFromMillis.pipe(optional),\n }),\n title: Schema.String.pipe(optional),\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n revert: Revert.pipe(optional),\n}).annotate({ identifier: \"Session.Info\" })\n\nexport const ListAnchor = Schema.Struct({\n id: ID,\n time: Schema.Finite,\n direction: Schema.Literals([\"previous\", \"next\"]),\n}).annotate({ identifier: \"Session.ListAnchor\" })\nexport interface ListAnchor extends Schema.Schema.Type<typeof ListAnchor> {}\n" | ||
| ], | ||
| "mappings": ";qjBAeO,IAAM,EAAK,EAGL,EAAQ,EAGd,IAAM,EAAe,EAAY,SAE3B,EAAsB,EAAY,gBAIlC,EAAO,EAAO,OAAO,CAChC,GAAI,EACJ,SAAU,EAAG,KAAK,CAAQ,EAC1B,KAAM,EAAO,OAAO,CAClB,UAAW,EACX,SAAU,CACZ,CAAC,EAAE,KAAK,CAAQ,EAChB,UAAW,EAAQ,GACnB,MAAO,EAAM,GAAG,KAAK,CAAQ,EAC7B,MAAO,EAAM,IAAI,KAAK,CAAQ,EAC9B,KAAM,EAAM,IACZ,OAAQ,EAAW,KACnB,KAAM,EAAO,OAAO,CAClB,QAAS,EACT,QAAS,EACT,SAAU,EAAsB,KAAK,CAAQ,CAC/C,CAAC,EACD,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,SAAU,EAAS,IACnB,QAAS,EAAa,KAAK,CAAQ,EACnC,OAAQ,EAAO,KAAK,CAAQ,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,cAAe,CAAC,EAE7B,EAAa,EAAO,OAAO,CACtC,GAAI,EACJ,KAAM,EAAO,OACb,UAAW,EAAO,SAAS,CAAC,WAAY,MAAM,CAAC,CACjD,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC", | ||
| "debugId": "9B4596223544AD8E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/persistence.ts", "../tui/src/model-preference.ts"], | ||
| "sourcesContent": [ | ||
| "import path from \"path\"\nimport { appendFile, mkdir, readFile, rename, rm, writeFile } from \"fs/promises\"\n\nexport function readText(filePath: string) {\n return readFile(filePath, \"utf8\")\n}\n\nexport async function readJson<T>(filePath: string) {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T\n}\n\nexport async function writeText(filePath: string, content: string) {\n await mkdir(path.dirname(filePath), { recursive: true })\n await writeFile(filePath, content)\n}\n\nexport async function appendText(filePath: string, content: string) {\n await mkdir(path.dirname(filePath), { recursive: true })\n await appendFile(filePath, content)\n}\n\nexport async function writeJsonAtomic(filePath: string, value: unknown) {\n await mkdir(path.dirname(filePath), { recursive: true })\n const temporary = `${filePath}.${process.pid}.${crypto.randomUUID()}.tmp`\n await writeFile(temporary, JSON.stringify(value)).catch(async (error) => {\n await rm(temporary, { force: true }).catch(() => undefined)\n throw error\n })\n await rename(temporary, filePath).catch(async (error) => {\n await rm(temporary, { force: true }).catch(() => undefined)\n throw error\n })\n}\n", | ||
| "import { readJson, writeJsonAtomic } from \"./util/persistence\"\nimport { isRecord } from \"./util/record\"\n\nexport type ModelPreferenceModel = {\n providerID: string\n modelID: string\n}\n\nexport type ModelPreference = {\n recent: ModelPreferenceModel[]\n favorite: ModelPreferenceModel[]\n variant: Record<string, string | undefined>\n}\n\nexport type ModelPreferenceDocument = Record<string, unknown> & ModelPreference\n\nfunction models(value: unknown) {\n if (!Array.isArray(value)) return []\n return value.flatMap((item): ModelPreferenceModel[] => {\n if (!isRecord(item)) return []\n if (typeof item.providerID !== \"string\" || item.providerID.length === 0) return []\n if (typeof item.modelID !== \"string\" || item.modelID.length === 0) return []\n return [{ providerID: item.providerID, modelID: item.modelID }]\n })\n}\n\nfunction variants(value: unknown) {\n if (!isRecord(value)) return {}\n return Object.fromEntries(\n Object.entries(value).flatMap(([key, item]) => {\n if (key.length === 0 || typeof item !== \"string\" || item.length === 0) return []\n const variant = normalizeModelVariant(item)\n return variant === undefined ? [] : ([[key, variant]] as const)\n }),\n )\n}\n\nexport function normalizeModelVariant(value: string | undefined) {\n return value === \"default\" ? undefined : value\n}\n\nexport function modelPreferenceKey(model: ModelPreferenceModel) {\n return `${model.providerID}/${model.modelID}`\n}\n\nexport function cycleModelVariant(current: string | undefined, variants: string[]) {\n const named = variants.filter((variant) => variant !== \"default\")\n if (named.length === 0) return undefined\n const value = normalizeModelVariant(current)\n if (value === undefined) return named[0]\n const index = named.indexOf(value)\n if (index === -1 || index === named.length - 1) return undefined\n return named[index + 1]\n}\n\nexport function decodeModelPreference(value: unknown): ModelPreferenceDocument {\n const root = isRecord(value) ? value : {}\n return {\n ...root,\n recent: models(root.recent),\n favorite: models(root.favorite),\n variant: variants(root.variant),\n }\n}\n\nfunction preference(value: ModelPreferenceDocument): ModelPreference {\n return {\n recent: value.recent,\n favorite: value.favorite,\n variant: value.variant,\n }\n}\n\nfunction patch(value: Partial<ModelPreference>) {\n return {\n ...(value.recent === undefined ? {} : { recent: models(value.recent) }),\n ...(value.favorite === undefined ? {} : { favorite: models(value.favorite) }),\n ...(value.variant === undefined ? {} : { variant: variants(value.variant) }),\n }\n}\n\nexport function createModelPreferenceRepository(filePath: string) {\n const state = {\n pending: Promise.resolve(),\n }\n const read = () =>\n readJson<unknown>(filePath)\n .then(decodeModelPreference)\n .catch(() => decodeModelPreference(undefined))\n\n function update(change: (current: ModelPreference) => Partial<ModelPreference>) {\n const result = state.pending.then(async () => {\n const current = await read()\n const next = { ...current, ...patch(change(preference(current))) }\n await writeJsonAtomic(filePath, next)\n })\n state.pending = result.catch(() => undefined)\n return result\n }\n\n function load() {\n return state.pending.then(read).then(preference)\n }\n\n return {\n load,\n patch(value: Partial<ModelPreference>) {\n return update(() => value)\n },\n async resolveVariant(model: ModelPreferenceModel) {\n return (await load()).variant[modelPreferenceKey(model)]\n },\n saveVariant(model: ModelPreferenceModel, value: string | undefined) {\n const key = modelPreferenceKey(model)\n const next = normalizeModelVariant(value)\n return update((current) => {\n const variant = { ...current.variant }\n if (next === undefined) delete variant[key]\n if (next !== undefined) variant[key] = next\n return { variant }\n })\n },\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "73BD8639A763B14B64756E2164756E21", | ||
| "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": "3B11A68527EC099464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type PluginInfo } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { Config } from \"../../../config\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { discoverTuiPlugins, tuiPluginDirectories } from \"@opencode-ai/tui/plugin/discovery\"\n\nexport default Runtime.handler(\n Commands.commands.plugin.commands.list,\n Effect.fn(\"cli.plugin.list\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.plugin.list({ location: { directory: process.cwd() } }))\n const config = yield* Config.Service\n const global = yield* Global.Service\n const info = yield* config.get()\n const discovered = yield* Effect.promise(() =>\n tuiPluginDirectories(process.cwd(), global.config).then(discoverTuiPlugins),\n )\n const output = format(\n response.data,\n [\n ...(info.plugins ?? []).flatMap((entry) => {\n const target = typeof entry === \"string\" ? entry : entry.package\n return target.startsWith(\"-\") ? [] : [{ target, source: \"configured\" as const }]\n }),\n ...discovered.map((target) => ({ target, source: \"discovered\" as const })),\n ],\n input.builtin,\n )\n if (!output) {\n process.stdout.write(\"No plugins found\" + EOL)\n return\n }\n process.stdout.write(output + EOL)\n }),\n)\n\nexport function format(\n plugins: readonly PluginInfo[],\n tui: ReadonlyArray<{ readonly target: string; readonly source: \"configured\" | \"discovered\" }>,\n builtin = false,\n) {\n const server = plugins\n .filter((plugin) => builtin || plugin.source.type !== \"builtin\")\n .toSorted((a, b) => name(a).localeCompare(name(b)))\n .map((plugin) => `${name(plugin)} (${plugin.status})`)\n const advertised = plugins.flatMap((plugin) =>\n plugin.status === \"active\" && plugin.tui && plugin.source.type === \"package\"\n ? [{ target: plugin.source.package, source: \"advertised\" as const }]\n : [],\n )\n const targets = [...tui, ...advertised]\n .filter((plugin, index, all) => all.findIndex((candidate) => candidate.target === plugin.target) === index)\n .toSorted((a, b) => a.target.localeCompare(b.target))\n .map((plugin) => `${plugin.target} (${plugin.source})`)\n return [\n targets.length ? [\"TUI\", ...targets].join(EOL) : undefined,\n server.length ? [\"Server\", ...server].join(EOL) : undefined,\n ]\n .filter((section) => section !== undefined)\n .join(EOL + EOL)\n}\n\nfunction name(plugin: PluginInfo) {\n if (plugin.id) return plugin.id\n if (plugin.source.type === \"package\") return plugin.source.package\n if (plugin.source.type === \"local\") return plugin.source.path\n return plugin.source.type\n}\n" | ||
| ], | ||
| "mappings": ";o/BAAA,cAAS,WAWT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAAO,SAAS,KAClC,EAAO,GAAG,iBAAiB,EAAE,SAAU,CAAC,EAAO,CAC7C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACrG,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAO,MAAO,EAAO,IAAI,EACzB,EAAa,MAAO,EAAO,QAAQ,IACvC,EAAqB,QAAQ,IAAI,EAAG,EAAO,MAAM,EAAE,KAAK,CAAkB,CAC5E,EACM,EAAS,EACb,EAAS,KACT,CACE,IAAI,EAAK,SAAW,CAAC,GAAG,QAAQ,CAAC,IAAU,CACzC,IAAM,EAAS,OAAO,IAAU,SAAW,EAAQ,EAAM,QACzD,OAAO,EAAO,WAAW,GAAG,EAAI,CAAC,EAAI,CAAC,CAAE,SAAQ,OAAQ,YAAsB,CAAC,EAChF,EACD,GAAG,EAAW,IAAI,CAAC,KAAY,CAAE,SAAQ,OAAQ,YAAsB,EAAE,CAC3E,EACA,EAAM,OACR,EACA,GAAI,CAAC,EAAQ,CACX,QAAQ,OAAO,MAAM,mBAAqB,CAAG,EAC7C,OAEF,QAAQ,OAAO,MAAM,EAAS,CAAG,EAClC,CACH,EAEO,SAAS,CAAM,CACpB,EACA,EACA,EAAU,GACV,CACA,IAAM,EAAS,EACZ,OAAO,CAAC,IAAW,GAAW,EAAO,OAAO,OAAS,SAAS,EAC9D,SAAS,CAAC,EAAG,IAAM,EAAK,CAAC,EAAE,cAAc,EAAK,CAAC,CAAC,CAAC,EACjD,IAAI,CAAC,IAAW,GAAG,EAAK,CAAM,MAAM,EAAO,SAAS,EACjD,EAAa,EAAQ,QAAQ,CAAC,IAClC,EAAO,SAAW,UAAY,EAAO,KAAO,EAAO,OAAO,OAAS,UAC/D,CAAC,CAAE,OAAQ,EAAO,OAAO,QAAS,OAAQ,YAAsB,CAAC,EACjE,CAAC,CACP,EACM,EAAU,CAAC,GAAG,EAAK,GAAG,CAAU,EACnC,OAAO,CAAC,EAAQ,EAAO,IAAQ,EAAI,UAAU,CAAC,IAAc,EAAU,SAAW,EAAO,MAAM,IAAM,CAAK,EACzG,SAAS,CAAC,EAAG,IAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC,EACnD,IAAI,CAAC,IAAW,GAAG,EAAO,WAAW,EAAO,SAAS,EACxD,MAAO,CACL,EAAQ,OAAS,CAAC,MAAO,GAAG,CAAO,EAAE,KAAK,CAAG,EAAI,OACjD,EAAO,OAAS,CAAC,SAAU,GAAG,CAAM,EAAE,KAAK,CAAG,EAAI,MACpD,EACG,OAAO,CAAC,IAAY,IAAY,MAAS,EACzC,KAAK,EAAM,CAAG,EAGnB,SAAS,CAAI,CAAC,EAAoB,CAChC,GAAI,EAAO,GAAI,OAAO,EAAO,GAC7B,GAAI,EAAO,OAAO,OAAS,UAAW,OAAO,EAAO,OAAO,QAC3D,GAAI,EAAO,OAAO,OAAS,QAAS,OAAO,EAAO,OAAO,KACzD,OAAO,EAAO,OAAO", | ||
| "debugId": "CECAE9849109A93A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/services/service-registration.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport { Effect, Option, Redacted, Schedule } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { ServiceRegistration } from \"./services/service-registration\"\nimport { Updater } from \"./services/updater\"\nimport { WebUi } from \"./services/web-ui\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* ServiceRegistration.register({\n address,\n password,\n id: instanceID,\n file: serviceOptions.file,\n shutdown,\n })\n }),\n },\n transform,\n ).pipe(\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "export * as ServiceRegistration from \"./service-registration\"\n\nimport { Service, type Info } from \"@opencode-ai/client/effect/service\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { OPENCODE_VERSION } from \"../version\"\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nexport const register = Effect.fnUntraced(function* (options: {\n readonly address: HttpServer.Address\n readonly password: string\n readonly id: string\n readonly file: string\n readonly shutdown: Effect.Effect<void>\n}) {\n const fs = yield* FileSystem.FileSystem\n const temp = options.file + \".\" + options.id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(options.file), { recursive: true })\n const info = {\n id: options.id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(options.address),\n pid: process.pid,\n password: options.password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(options.file).pipe(Effect.flatMap(decodeInfo))\n const owns = (found: Info) =>\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, options.file)))\n yield* current.pipe(\n Effect.catchCause((cause) =>\n Effect.logWarning(\"managed service registration check failed; shutting down\", {\n cause,\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n }).pipe(Effect.andThen(Effect.failCause(cause))),\n ),\n Effect.tap((found) =>\n owns(found)\n ? Effect.void\n : Effect.logWarning(\"managed service registration replaced; shutting down\", {\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n observedServiceID: found.id,\n observedServicePID: found.pid,\n observedVersion: found.version,\n observedURL: found.url,\n }),\n ),\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(options.shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(options.file) : Effect.void)),\n Effect.ignore,\n )\n})\n", | ||
| "import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const 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": "D65A450A875C5A9464756E2164756E21", | ||
| "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": "659A8767E157716364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "DB6DE72E3F0F791B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "22F6E9EBAECF065A64756E2164756E21", | ||
| "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": "35DD72D5FFCECBFB64756E2164756E21", | ||
| "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": "BEEBD026EA9D7BBA64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/record.ts"], | ||
| "sourcesContent": [ | ||
| "export function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n" | ||
| ], | ||
| "mappings": ";AAAO,SAAS,CAAQ,CAAC,EAAkD,CACzE,MAAO,CAAC,CAAC,GAAS,OAAO,IAAU,UAAY,CAAC,MAAM,QAAQ,CAAK", | ||
| "debugId": "F7A93B33911A308064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/image-client.ts", "../ai/src/image.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, Layer } from \"effect\"\nimport { RequestExecutor } from \"./route/executor.js\"\nimport type { ImageOptions, ImageRequest, ImageRequestFor, ImageResponse } from \"./image.js\"\nimport type { AIError } from \"./schema/index.js\"\n\nexport type Execute = RequestExecutor.Interface[\"execute\"]\n\nexport interface Interface {\n readonly generate: <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n ) => Effect.Effect<ImageResponse, AIError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/ImageClient\") {}\n\nexport const generate = <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n): Effect.Effect<ImageResponse, AIError, Service> =>\n Effect.gen(function* () {\n const client = yield* Service\n return yield* client.generate(request)\n })\n\nexport const layer: Layer.Layer<Service, never, RequestExecutor.Service> = Layer.effect(\n Service,\n Effect.gen(function* () {\n const executor = yield* RequestExecutor.Service\n return Service.of({\n generate: (request) => request.model.route.generate(request, executor.execute),\n })\n }),\n)\n\nexport const ImageClient = {\n Service,\n layer,\n generate,\n} as const\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport {\n HttpOptions,\n InvalidRequestReason,\n AIError,\n ModelID,\n ProviderID,\n ProviderMetadata,\n Usage,\n} from \"./schema/index.js\"\nimport { ImageClient, Service, type Execute as ImageExecute } from \"./image-client.js\"\n\nexport interface ImageRoute<Options extends ImageOptions = ImageOptions> {\n readonly id: string\n readonly generate: (request: ImageRequestFor<Options>, execute: ImageExecute) => Effect.Effect<ImageResponse, AIError>\n}\n\nexport type ImageOptions = Record<string, unknown>\n\nexport class ImageModel<Options extends ImageOptions = ImageOptions> {\n declare protected readonly _Options: (options: Options) => Options\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n\n constructor(input: ImageModel.Input<Options>) {\n this.id = input.id\n this.provider = input.provider\n this.route = input.route\n this.http = input.http\n }\n\n static make<Options extends ImageOptions = ImageOptions>(input: ImageModel.MakeInput<Options>) {\n return new ImageModel<Options>({\n id: ModelID.make(input.id),\n provider: ProviderID.make(input.provider),\n route: input.route,\n http: input.http,\n })\n }\n}\n\nexport namespace ImageModel {\n export interface Input<Options extends ImageOptions = ImageOptions> {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n }\n\n export interface MakeInput<Options extends ImageOptions = ImageOptions>\n extends Omit<Input<Options>, \"id\" | \"provider\"> {\n readonly id: string | ModelID\n readonly provider: string | ProviderID\n }\n}\n\nexport const ImageModelSchema = Schema.declare((value): value is ImageModel => value instanceof ImageModel, {\n expected: \"Image.Model\",\n})\n\nconst ImageBytesInput = Schema.Struct({\n type: Schema.Literal(\"bytes\"),\n data: Schema.Uint8Array,\n mediaType: Schema.String,\n})\nconst ImageUrlInput = Schema.Struct({\n type: Schema.Literal(\"url\"),\n url: Schema.String,\n})\nconst ImageFileIDInput = Schema.Struct({\n type: Schema.Literal(\"file-id\"),\n id: Schema.String,\n})\nconst ImageFileURIInput = Schema.Struct({\n type: Schema.Literal(\"file-uri\"),\n uri: Schema.String,\n mediaType: Schema.String,\n})\n\nexport const ImageInputSchema = Schema.Union([\n ImageBytesInput,\n ImageUrlInput,\n ImageFileIDInput,\n ImageFileURIInput,\n]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type ImageInput = Schema.Schema.Type<typeof ImageInputSchema>\n\nexport const ImageInput = {\n bytes: (data: Uint8Array, mediaType: string): ImageInput => ({ type: \"bytes\", data, mediaType }),\n url: (url: string): ImageInput => ({ type: \"url\", url }),\n file: (id: string): ImageInput => ({ type: \"file-id\", id }),\n fileUri: (uri: string, mediaType: string): ImageInput => ({ type: \"file-uri\", uri, mediaType }),\n} as const\n\nexport class ImageRequest extends Schema.Class<ImageRequest>(\"Image.Request\")({\n model: ImageModelSchema,\n prompt: Schema.String,\n images: Schema.optional(Schema.Array(ImageInputSchema)),\n options: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n http: Schema.optional(HttpOptions),\n}) {\n declare protected readonly _ImageRequest: void\n}\n\nexport type ImageRequestFor<Options extends ImageOptions = ImageOptions> = Omit<ImageRequest, \"model\" | \"options\"> & {\n readonly model: ImageModel<Options>\n readonly options?: Options\n}\n\nexport type ImageModelOptions<Model> = Model extends ImageModel<infer Options> ? Options : never\n\nexport type ImageRequestInput<Model extends object = ImageModel> = Omit<\n ConstructorParameters<typeof ImageRequest>[0],\n \"model\" | \"options\" | \"http\"\n> & {\n readonly model: Model\n readonly options?: NoInfer<ImageModelOptions<Model>>\n readonly http?: HttpOptions.Input\n} & (Model extends ImageModel<ImageModelOptions<Model>> ? unknown : never)\n\nexport class GeneratedImage extends Schema.Class<GeneratedImage>(\"Image.Generated\")({\n mediaType: Schema.String,\n data: Schema.Union([Schema.String, Schema.Uint8Array]),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {}\n\nexport class ImageResponse extends Schema.Class<ImageResponse>(\"Image.Response\")({\n images: Schema.Array(GeneratedImage),\n usage: Schema.optional(Usage),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {\n get image() {\n return this.images[0]\n }\n}\n\nexport function request<const Model extends object>(\n input: ImageRequestInput<Model>,\n): ImageRequestFor<ImageModelOptions<Model>>\nexport function request(input: ImageRequest): ImageRequest\nexport function request(input: ImageRequest | ImageRequestInput) {\n if (input instanceof ImageRequest) return input\n return new ImageRequest({\n ...input,\n model: input.model as unknown as ImageModel,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n}\n\nexport function generate<const Model extends object>(\n input: ImageRequestInput<Model>,\n): Effect.Effect<ImageResponse, AIError, Service>\nexport function generate(input: ImageRequest): Effect.Effect<ImageResponse, AIError, Service>\nexport function generate(input: ImageRequest | ImageRequestInput) {\n return Effect.try({\n try: () => (input instanceof ImageRequest ? input : request(input)),\n catch: (error) =>\n new AIError({\n module: \"Image\",\n method: \"generate\",\n reason: new InvalidRequestReason({ message: error instanceof Error ? error.message : String(error) }),\n }),\n }).pipe(Effect.flatMap((request) => ImageClient.generate(request as unknown as ImageRequestFor<ImageOptions>)))\n}\n\nexport const Image = {\n request,\n generate,\n} as const\n" | ||
| ], | ||
| "mappings": ";wKAaO,MAAM,UAAgB,EAAQ,QAA4B,EAAE,uBAAuB,CAAE,CAAC,CAUtF,IAAM,EAA8D,EAAM,OAC/E,EACA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAgB,QACxC,OAAO,EAAQ,GAAG,CAChB,SAAU,CAAC,IAAY,EAAQ,MAAM,MAAM,SAAS,EAAS,EAAS,OAAO,CAC/E,CAAC,EACF,CACH,ECZO,MAAM,CAAwD,CAE1D,GACA,SACA,MACA,KAET,WAAW,CAAC,EAAkC,CAC5C,KAAK,GAAK,EAAM,GAChB,KAAK,SAAW,EAAM,SACtB,KAAK,MAAQ,EAAM,MACnB,KAAK,KAAO,EAAM,WAGb,KAAiD,CAAC,EAAsC,CAC7F,OAAO,IAAI,EAAoB,CAC7B,GAAI,EAAQ,KAAK,EAAM,EAAE,EACzB,SAAU,EAAW,KAAK,EAAM,QAAQ,EACxC,MAAO,EAAM,MACb,KAAM,EAAM,IACd,CAAC,EAEL,CAiBO,IAAM,EAAmB,EAAO,QAAQ,CAAC,IAA+B,aAAiB,EAAY,CAC1G,SAAU,aACZ,CAAC,EAEK,EAAkB,EAAO,OAAO,CACpC,KAAM,EAAO,QAAQ,OAAO,EAC5B,KAAM,EAAO,WACb,UAAW,EAAO,MACpB,CAAC,EACK,EAAgB,EAAO,OAAO,CAClC,KAAM,EAAO,QAAQ,KAAK,EAC1B,IAAK,EAAO,MACd,CAAC,EACK,EAAmB,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,SAAS,EAC9B,GAAI,EAAO,MACb,CAAC,EACK,EAAoB,EAAO,OAAO,CACtC,KAAM,EAAO,QAAQ,UAAU,EAC/B,IAAK,EAAO,OACZ,UAAW,EAAO,MACpB,CAAC,EAEY,EAAmB,EAAO,MAAM,CAC3C,EACA,EACA,EACA,CACF,CAAC,EAAE,KAAK,EAAO,cAAc,MAAM,CAAC,EAU7B,MAAM,UAAqB,EAAO,MAAoB,eAAe,EAAE,CAC5E,MAAO,EACP,OAAQ,EAAO,OACf,OAAQ,EAAO,SAAS,EAAO,MAAM,CAAgB,CAAC,EACtD,QAAS,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EACrE,KAAM,EAAO,SAAS,CAAW,CACnC,CAAC,CAAE,CAEH,CAkBO,MAAM,UAAuB,EAAO,MAAsB,iBAAiB,EAAE,CAClF,UAAW,EAAO,OAClB,KAAM,EAAO,MAAM,CAAC,EAAO,OAAQ,EAAO,UAAU,CAAC,EACrD,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,CAAC,CAEG,MAAM,UAAsB,EAAO,MAAqB,gBAAgB,EAAE,CAC/E,OAAQ,EAAO,MAAM,CAAc,EACnC,MAAO,EAAO,SAAS,CAAK,EAC5B,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,IACG,MAAK,EAAG,CACV,OAAO,KAAK,OAAO,GAEvB", | ||
| "debugId": "B6AD38DEE4EE36B264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "0E9E662C4BB8059064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH", | ||
| "debugId": "5BDAB833894F487064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/plugin/discovery.ts", "../tui/src/util/config-directories.ts"], | ||
| "sourcesContent": [ | ||
| "import { readdir, stat } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { isMissingPath, localProjectDirectory, projectConfigDirectories } from \"../util/config-directories\"\n\nconst extensions = new Set([\".cjs\", \".cts\", \".js\", \".jsx\", \".mjs\", \".mts\", \".ts\", \".tsx\"])\n\nexport async function tuiPluginDirectories(cwd: string, configDirectory: string) {\n const projectDirectory = await localProjectDirectory(cwd)\n const projectConfig = path.join(projectDirectory, \".opencode\")\n const directories = [configDirectory, ...projectConfigDirectories(projectDirectory, cwd)]\n const exists = await Promise.all(\n directories.map((directory) => {\n if (directory === configDirectory || directory === projectConfig) return true\n return stat(directory).then(\n (info) => info.isDirectory(),\n (error) => (isMissingPath(error) ? false : Promise.reject(error)),\n )\n }),\n )\n return directories.filter((_, index) => exists[index]).map((directory) => path.join(directory, \"plugins\", \"tui\"))\n}\n\nexport async function discoverTuiPlugins(directories: string[]) {\n return (\n await Promise.all(\n directories.map(async (directory) => {\n const entries = await readdir(directory, { withFileTypes: true }).catch((error: unknown) => {\n if (isMissingPath(error)) return []\n return Promise.reject(error)\n })\n return entries\n .filter((entry) => (entry.isFile() || entry.isSymbolicLink()) && extensions.has(path.extname(entry.name)))\n .map((entry) => path.join(directory, entry.name))\n .sort()\n }),\n )\n ).flat()\n}\n\nexport function localSource(spec: string, directory: string) {\n if (spec.startsWith(\"file://\")) return new URL(spec)\n if (spec.startsWith(\"./\") || spec.startsWith(\"../\") || path.isAbsolute(spec))\n return pathToFileURL(path.resolve(directory, spec))\n return undefined\n}\n\n// Key local plugin imports by a numeric source version so edited sources\n// re-import fresh instead of hitting the ESM cache. Bun ignores query params\n// when caching file:// URL imports, so bust with a plain path there; Node keys\n// its cache on the full URL. Fractional versions break Bun's runtime JSX/solid\n// plugin hooks, so always truncate them.\nexport function freshSpecifier(entrypoint: string, sourceVersion: number) {\n const version = Math.trunc(sourceVersion)\n if (typeof Bun !== \"undefined\") return `${fileURLToPath(entrypoint).replaceAll(\"\\\\\", \"/\")}?mtime=${version}`\n return `${entrypoint}?mtime=${version}`\n}\n", | ||
| "import path from \"node:path\"\nimport { stat } from \"node:fs/promises\"\n\nexport function configDirectories(config: string, cwd: string) {\n return [...new Set([config, ...ancestors(cwd).map((directory) => path.join(directory, \".opencode\"))])]\n}\n\nexport function projectConfigDirectories(project: string, cwd: string) {\n const directories = ancestors(cwd)\n return directories\n .slice(directories.indexOf(path.resolve(project)))\n .map((directory) => path.join(directory, \".opencode\"))\n}\n\nexport async function localProjectDirectory(cwd: string) {\n const directories = ancestors(cwd)\n const repositories = await Promise.all(\n directories.map((directory) =>\n Promise.all(\n [\".git\", \".hg\"].map((name) =>\n stat(path.join(directory, name)).then(\n () => true,\n (error) => (isMissingPath(error) ? false : Promise.reject(error)),\n ),\n ),\n ).then((matches) => matches.some(Boolean)),\n ),\n )\n return directories.findLast((_, index) => repositories[index]) ?? path.resolve(cwd)\n}\n\nexport function isMissingPath(error: unknown) {\n if (!error || typeof error !== \"object\") return false\n const code = Reflect.get(error, \"code\")\n return code === \"ENOENT\" || code === \"ENOTDIR\"\n}\n\nfunction ancestors(cwd: string) {\n const directories: string[] = []\n for (let current = path.resolve(cwd); ; current = path.dirname(current)) {\n directories.push(current)\n if (path.dirname(current) === current) break\n }\n return directories.reverse()\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "3E83C5F174865C1464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/gemini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n} from \"../schema/index.js\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared.js\"\nimport { GeminiToolSchema } from \"./utils/gemini-tool-schema.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\n\nconst ADAPTER = \"gemini\"\n// Google documents this sentinel for replaying Gemini 3 function calls after their original signature was lost.\nconst SKIP_THOUGHT_SIGNATURE_VALIDATOR = \"skip_thought_signature_validator\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\n// Gemini 3 rejects replayed function calls without a thought signature. Google's SDKs avoid that in normal chats by\n// retaining complete model responses, but OpenCode reconstructs durable history and may encounter an unsigned call\n// from an older or external session. Model IDs are open-ended, so unknown Gemini aliases inherit current behavior.\nconst requiresThoughtSignatureFallback = (modelID: string) => {\n if (!/(^|\\/)gemini-/i.test(modelID)) return false\n if (/(^|\\/)gemini-(?:1|2)(?:[.-]|$)/i.test(modelID)) return false\n if (/(^|\\/)gemini-pro(?:-vision)?$/i.test(modelID)) return false\n return !/(^|\\/)gemini-robotics-er-1\\.5(?:[.-]|$)/i.test(modelID)\n}\n\n// Gemini 3 accepts media nested inside function responses; matched Gemini 2.5 variants reject it,\n// so their tool-result attachments lower as a separate user turn instead.\nconst routesLegacyToolMedia = (modelID: string) => /gemini-2[.-]5(?:[.-]|$)/i.test(modelID)\n\nexport interface OptionsInput {\n readonly [key: string]: unknown\n readonly cachedContent?: string\n readonly safetySettings?: ReadonlyArray<{\n readonly category:\n | \"HARM_CATEGORY_UNSPECIFIED\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\"\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_CIVIC_INTEGRITY\"\n | (string & {})\n readonly threshold:\n | \"HARM_BLOCK_THRESHOLD_UNSPECIFIED\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_ONLY_HIGH\"\n | \"BLOCK_NONE\"\n | \"OFF\"\n | (string & {})\n }>\n readonly serviceTier?: \"standard\" | \"flex\" | \"priority\" | (string & {})\n readonly thinkingConfig?: {\n readonly thinkingBudget?: number\n readonly includeThoughts?: boolean\n readonly thinkingLevel?: \"minimal\" | \"low\" | \"medium\" | \"high\" | (string & {})\n }\n}\n\nexport type ProviderOptionsInput = OptionsInput\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst GeminiTextPart = Schema.Struct({\n text: Schema.String,\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiInlineDataPart = Schema.Struct({\n inlineData: Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n})\ntype GeminiInlineDataPart = Schema.Schema.Type<typeof GeminiInlineDataPart>\n\nconst GeminiFunctionCallPart = Schema.Struct({\n functionCall: Schema.Struct({\n id: Schema.optional(Schema.String),\n name: Schema.String,\n args: Schema.optional(Schema.Unknown),\n }),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiFunctionResponsePart = Schema.Struct({\n functionResponse: Schema.Struct({\n id: Schema.optional(Schema.String),\n name: Schema.String,\n response: Schema.Unknown,\n parts: Schema.optional(Schema.Array(GeminiInlineDataPart)),\n }),\n})\n\nconst GeminiContentPart = Schema.Union([\n GeminiTextPart,\n GeminiInlineDataPart,\n GeminiFunctionCallPart,\n GeminiFunctionResponsePart,\n])\n\nconst GeminiContent = Schema.Struct({\n role: Schema.Literals([\"user\", \"model\"]),\n parts: Schema.Array(GeminiContentPart),\n})\ntype GeminiContent = Schema.Schema.Type<typeof GeminiContent>\n\nconst GeminiSystemInstruction = Schema.Struct({\n parts: Schema.Array(Schema.Struct({ text: Schema.String })),\n})\n\nconst GeminiFunctionDeclaration = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: Schema.optional(JsonObject),\n})\n\nconst GeminiTool = Schema.Struct({\n functionDeclarations: Schema.Array(GeminiFunctionDeclaration),\n})\n\nconst GeminiToolConfig = Schema.Struct({\n functionCallingConfig: Schema.Struct({\n mode: Schema.Literals([\"AUTO\", \"NONE\", \"ANY\"]),\n allowedFunctionNames: optionalArray(Schema.String),\n }),\n})\n\nconst GeminiThinkingConfig = Schema.Struct({\n thinkingBudget: Schema.optional(Schema.Number),\n includeThoughts: Schema.optional(Schema.Boolean),\n thinkingLevel: Schema.optional(Schema.String),\n})\n\nconst GeminiSafetySetting = Schema.Struct({\n category: Schema.String,\n threshold: Schema.String,\n})\n\nconst GeminiGenerationConfig = Schema.Struct({\n maxOutputTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n topK: Schema.optional(Schema.Number),\n frequencyPenalty: Schema.optional(Schema.Number),\n presencePenalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n thinkingConfig: Schema.optional(GeminiThinkingConfig),\n})\n\nconst GeminiBodyFields = {\n cachedContent: Schema.optional(Schema.String),\n contents: Schema.Array(GeminiContent),\n labels: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n safetySettings: optionalArray(GeminiSafetySetting),\n serviceTier: Schema.optional(Schema.String),\n systemInstruction: Schema.optional(GeminiSystemInstruction),\n tools: optionalArray(GeminiTool),\n toolConfig: Schema.optional(GeminiToolConfig),\n generationConfig: Schema.optional(GeminiGenerationConfig),\n}\nconst GeminiBody = Schema.Struct(GeminiBodyFields)\nexport type GeminiBody = Schema.Schema.Type<typeof GeminiBody>\n\nconst GeminiUsage = Schema.Struct({\n cachedContentTokenCount: Schema.optional(Schema.Number),\n thoughtsTokenCount: Schema.optional(Schema.Number),\n promptTokenCount: Schema.optional(Schema.Number),\n candidatesTokenCount: Schema.optional(Schema.Number),\n totalTokenCount: Schema.optional(Schema.Number),\n})\ntype GeminiUsage = Schema.Schema.Type<typeof GeminiUsage>\n\nconst GeminiCandidate = Schema.Struct({\n content: Schema.optional(GeminiContent),\n finishReason: Schema.optional(Schema.String),\n})\n\nconst GeminiPromptFeedback = Schema.StructWithRest(\n Schema.Struct({\n blockReason: Schema.optional(Schema.String),\n blockReasonMessage: Schema.optional(Schema.String),\n safetyRatings: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\ntype GeminiPromptFeedback = Schema.Schema.Type<typeof GeminiPromptFeedback>\n\nconst GeminiEvent = Schema.Struct({\n candidates: optionalArray(GeminiCandidate),\n promptFeedback: Schema.optional(GeminiPromptFeedback),\n usageMetadata: Schema.optional(GeminiUsage),\n})\ntype GeminiEvent = Schema.Schema.Type<typeof GeminiEvent>\n\ninterface ParserState {\n readonly finishReason?: string\n readonly hasToolCalls: boolean\n readonly nextToolCallId: number\n readonly promptFeedback?: GeminiPromptFeedback\n readonly usage?: Usage\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignature?: string\n}\n\n// =============================================================================\n// Tool Schema Conversion\n// =============================================================================\n// Tool-schema conversion has two distinct concerns:\n//\n// 1. Sanitize — fix common authoring mistakes Gemini rejects: integer/number\n// enums (must be strings), `required` entries that don't match a property,\n// untyped arrays (`items` must be present), and `properties`/`required`\n// keys on non-object scalars. Mirrors OpenCode's historical Gemini rules.\n//\n// 2. Project — lossy mapping from JSON Schema to Gemini's schema dialect:\n// drop empty root parameter schemas while preserving nested empty objects,\n// expand type arrays into `anyOf`, derive `nullable: true` from null members,\n// coerce `const` to `[const]` enum, recurse properties/items, and propagate\n// only an allowlisted set of keys (description, required, format, type,\n// nullable, enum, properties, items, allOf, anyOf, oneOf, minLength).\n// Anything outside the allowlist (e.g. `additionalProperties`, `$ref`) is\n// silently dropped.\n//\n// Sanitize runs first, then project. The implementation lives in\n// `utils/gemini-tool-schema` so this protocol keeps the same shape as the other\n// provider protocols.\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema) => ({\n name: tool.name,\n description: tool.description,\n parameters: GeminiToolSchema.convert(inputSchema),\n})\n\nconst lowerToolConfig = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Gemini\", toolChoice, {\n auto: () => ({ functionCallingConfig: { mode: \"AUTO\" as const } }),\n none: () => ({ functionCallingConfig: { mode: \"NONE\" as const } }),\n required: () => ({ functionCallingConfig: { mode: \"ANY\" as const } }),\n tool: (name) => ({ functionCallingConfig: { mode: \"ANY\" as const, allowedFunctionNames: [name] } }),\n })\n\nconst lowerUserPart = Effect.fn(\"Gemini.lowerUserPart\")(function* (part: TextPart | MediaPart) {\n if (part.type === \"text\") return { text: part.text }\n const media = ProviderShared.normalizeMedia(part)\n return { inlineData: { mimeType: media.mime, data: media.base64 } }\n})\n\nconst googleMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ google: metadata })\n\nconst thoughtSignature = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.thoughtSignature === \"string\"\n ? google.thoughtSignature\n : undefined\n}\n\nconst functionCallId = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.functionCallId === \"string\"\n ? google.functionCallId\n : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart) => ({\n functionCall: { id: functionCallId(part.providerMetadata), name: part.name, args: part.input },\n thoughtSignature: thoughtSignature(part.providerMetadata),\n})\n\nconst lowerMessages = Effect.fn(\"Gemini.lowerMessages\")(function* (request: LLMRequest) {\n const contents: GeminiContent[] = []\n const legacyToolMedia = routesLegacyToolMedia(request.model.id)\n let pendingMedia: GeminiInlineDataPart[] | undefined\n const flushMedia = () => {\n if (!pendingMedia) return\n contents.push({ role: \"user\", parts: [{ text: \"Attached media from tool result:\" }, ...pendingMedia] })\n pendingMedia = undefined\n }\n\n for (const message of request.messages) {\n if (message.role !== \"tool\") flushMedia()\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Gemini\", message)\n const previous = contents.at(-1)\n // Gemini rejects a continuation whose function-response turn carries extra\n // parts, so an update after a tool result starts its own user turn.\n if (previous?.role === \"user\" && !previous.parts.some((item) => \"functionResponse\" in item))\n contents[contents.length - 1] = { role: \"user\", parts: [...previous.parts, { text: part.text }] }\n else contents.push({ role: \"user\", parts: [{ text: part.text }] })\n continue\n }\n\n if (message.role === \"user\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"user\", [\"text\", \"media\"])\n parts.push(yield* lowerUserPart(part))\n }\n contents.push({ role: \"user\", parts })\n continue\n }\n\n if (message.role === \"assistant\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n // Parallel Gemini 3 calls may carry one signature on the first call; unsigned sibling calls are valid.\n let hasSignedToolCall = false\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n parts.push({ text: part.text })\n continue\n }\n if (part.type === \"reasoning\") {\n parts.push({ text: part.text, thought: true, thoughtSignature: thoughtSignature(part.providerMetadata) })\n continue\n }\n if (part.type === \"tool-call\") {\n const lowered = lowerToolCall(part)\n const signature = lowered.thoughtSignature\n parts.push({\n ...lowered,\n thoughtSignature:\n signature ??\n (requiresThoughtSignatureFallback(request.model.id) && !hasSignedToolCall\n ? SKIP_THOUGHT_SIGNATURE_VALIDATOR\n : undefined),\n })\n if (signature !== undefined) hasSignedToolCall = true\n continue\n }\n }\n contents.push({ role: \"model\", parts })\n continue\n }\n\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n parts.push({\n functionResponse: {\n id: functionCallId(part.providerMetadata),\n name: part.name,\n response: {\n name: part.name,\n content: ProviderShared.toolResultText(part),\n },\n },\n })\n continue\n }\n const content: ReadonlyArray<Tool.Content> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n const media: GeminiInlineDataPart[] = []\n for (const item of content) {\n if (item.type === \"text\") continue\n const value = ProviderShared.normalizeToolFile(item)\n media.push({ inlineData: { mimeType: value.mime, data: value.base64 } })\n }\n if (legacyToolMedia && media.length > 0) (pendingMedia ??= []).push(...media)\n parts.push({\n functionResponse: {\n id: functionCallId(part.providerMetadata),\n name: part.name,\n response: {\n name: part.name,\n content: text.join(\"\\n\"),\n },\n parts: legacyToolMedia || media.length === 0 ? undefined : media,\n },\n })\n }\n // Gemini requires every response to a parallel call batch in one user turn,\n // so consecutive tool results join the open function-response turn.\n const previous = contents.at(-1)\n if (previous?.role === \"user\" && previous.parts.some((item) => \"functionResponse\" in item))\n contents[contents.length - 1] = { role: \"user\", parts: [...previous.parts, ...parts] }\n else contents.push({ role: \"user\", parts })\n }\n\n flushMedia()\n return contents\n})\n\nconst resolveOptions = (request: LLMRequest) => {\n const input = request.providerOptions\n const value = input?.thinkingConfig\n const thinkingConfig = {\n thinkingBudget:\n ProviderShared.isRecord(value) && typeof value.thinkingBudget === \"number\" ? value.thinkingBudget : undefined,\n includeThoughts:\n ProviderShared.isRecord(value) && typeof value.includeThoughts === \"boolean\"\n ? value.includeThoughts\n : ProviderShared.isRecord(value)\n ? true\n : undefined,\n thinkingLevel:\n ProviderShared.isRecord(value) && typeof value.thinkingLevel === \"string\" ? value.thinkingLevel : undefined,\n }\n return {\n cachedContent: typeof input?.cachedContent === \"string\" ? input.cachedContent : undefined,\n safetySettings: mapSafetySettings(input?.safetySettings),\n serviceTier: typeof input?.serviceTier === \"string\" ? input.serviceTier : undefined,\n thinkingConfig: Object.values(thinkingConfig).some((item) => item !== undefined) ? thinkingConfig : undefined,\n }\n}\n\nfunction mapSafetySettings(value: unknown) {\n if (!Array.isArray(value)) return undefined\n const settings = value.flatMap((item) =>\n ProviderShared.isRecord(item) && typeof item.category === \"string\" && typeof item.threshold === \"string\"\n ? [{ category: item.category, threshold: item.threshold }]\n : [],\n )\n return settings\n}\n\nconst fromRequest = Effect.fn(\"Gemini.fromRequest\")(function* (request: LLMRequest) {\n const hasTools = request.tools.length > 0\n const generation = request.generation\n const options = resolveOptions(request)\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const generationConfig = {\n maxOutputTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n topK: generation?.topK,\n frequencyPenalty: generation?.frequencyPenalty,\n presencePenalty: generation?.presencePenalty,\n seed: generation?.seed,\n stopSequences: generation?.stop,\n thinkingConfig: options.thinkingConfig,\n }\n\n return {\n cachedContent: options.cachedContent,\n contents: yield* lowerMessages(request),\n safetySettings: options.safetySettings,\n serviceTier: options.serviceTier,\n systemInstruction:\n request.system.length === 0 ? undefined : { parts: [{ text: ProviderShared.joinText(request.system) }] },\n tools: hasTools\n ? [\n {\n functionDeclarations: request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n },\n ]\n : undefined,\n toolConfig: hasTools && request.toolChoice ? yield* lowerToolConfig(request.toolChoice) : undefined,\n generationConfig: Object.values(generationConfig).some((value) => value !== undefined)\n ? generationConfig\n : undefined,\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Gemini reports `promptTokenCount` (inclusive total) with a\n// `cachedContentTokenCount` subset. `candidatesTokenCount` is *exclusive*\n// of `thoughtsTokenCount` — visible-only, not a total — so we sum the two\n// to produce the inclusive `outputTokens` the rest of the contract expects.\nconst mapUsage = (usage: GeminiUsage | undefined) => {\n if (!usage) return undefined\n const cached = usage.cachedContentTokenCount\n const nonCached = ProviderShared.subtractTokens(usage.promptTokenCount, cached)\n // `candidatesTokenCount` is visible-only; sum with thoughts to produce the\n // inclusive `outputTokens` the contract expects. Only compute the total\n // when the visible component is reported — otherwise we'd fabricate an\n // inclusive number from a partial breakdown.\n const outputTokens =\n usage.candidatesTokenCount !== undefined ? usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0) : undefined\n return new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n })\n}\n\nconst mapFinishReason = (finishReason: string | undefined, hasToolCalls: boolean): FinishReason => {\n if (finishReason === undefined) return hasToolCalls ? \"tool-calls\" : \"unknown\"\n if (finishReason === \"STOP\") return hasToolCalls ? \"tool-calls\" : \"stop\"\n if (finishReason === \"MAX_TOKENS\") return \"length\"\n if (\n finishReason === \"IMAGE_SAFETY\" ||\n finishReason === \"RECITATION\" ||\n finishReason === \"SAFETY\" ||\n finishReason === \"BLOCKLIST\" ||\n finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\" ||\n finishReason === \"MODEL_ARMOR\" ||\n finishReason === \"IMAGE_PROHIBITED_CONTENT\" ||\n finishReason === \"IMAGE_RECITATION\" ||\n finishReason === \"LANGUAGE\"\n )\n return \"content-filter\"\n if (\n finishReason === \"MALFORMED_FUNCTION_CALL\" ||\n finishReason === \"UNEXPECTED_TOOL_CALL\" ||\n finishReason === \"NO_IMAGE\" ||\n finishReason === \"TOO_MANY_TOOL_CALLS\" ||\n finishReason === \"MISSING_THOUGHT_SIGNATURE\" ||\n finishReason === \"MALFORMED_RESPONSE\"\n )\n return \"error\"\n return \"unknown\"\n}\n\nconst finish = (state: ParserState): ReadonlyArray<LLMEvent> => {\n const promptBlockReason = state.finishReason === undefined ? state.promptFeedback?.blockReason : undefined\n const finishReason = state.finishReason ?? promptBlockReason\n if (finishReason === undefined && state.usage === undefined) return []\n\n const events: LLMEvent[] = []\n const lifecycle = state.reasoningSignature\n ? Lifecycle.reasoningEnd(\n state.lifecycle,\n events,\n \"reasoning-0\",\n googleMetadata({ thoughtSignature: state.reasoningSignature }),\n )\n : state.lifecycle\n Lifecycle.finish(lifecycle, events, {\n reason: {\n normalized:\n promptBlockReason === undefined ? mapFinishReason(finishReason, state.hasToolCalls) : \"content-filter\",\n raw: finishReason,\n },\n usage: state.usage,\n providerMetadata:\n state.promptFeedback === undefined ? undefined : googleMetadata({ promptFeedback: state.promptFeedback }),\n })\n return events\n}\n\nconst step = (state: ParserState, event: GeminiEvent) => {\n const nextState = {\n ...state,\n promptFeedback: event.promptFeedback ?? state.promptFeedback,\n usage: event.usageMetadata ? (mapUsage(event.usageMetadata) ?? state.usage) : state.usage,\n }\n const candidate = event.candidates?.[0]\n if (!candidate?.content)\n return Effect.succeed([\n { ...nextState, finishReason: candidate?.finishReason ?? nextState.finishReason },\n [],\n ] as const)\n\n const events: LLMEvent[] = []\n let hasToolCalls = nextState.hasToolCalls\n let lifecycle = nextState.lifecycle\n let nextToolCallId = nextState.nextToolCallId\n let reasoningSignature = nextState.reasoningSignature\n\n for (const part of candidate.content.parts) {\n if (\"thoughtSignature\" in part && part.thoughtSignature && \"thought\" in part && part.thought)\n reasoningSignature = part.thoughtSignature\n if (\"text\" in part && part.text.length > 0) {\n if (part.thought) {\n lifecycle = Lifecycle.reasoningDelta(\n lifecycle,\n events,\n \"reasoning-0\",\n part.text,\n part.thoughtSignature ? googleMetadata({ thoughtSignature: part.thoughtSignature }) : undefined,\n )\n continue\n }\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", part.text)\n continue\n }\n\n if (\"functionCall\" in part) {\n const input = part.functionCall.args === undefined ? {} : part.functionCall.args\n const id = `tool_${nextToolCallId++}`\n const metadata = {\n ...(part.functionCall.id === undefined ? {} : { functionCallId: part.functionCall.id }),\n ...(part.thoughtSignature === undefined ? {} : { thoughtSignature: part.thoughtSignature }),\n }\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(\n LLMEvent.toolCall({\n id,\n name: part.functionCall.name,\n input,\n providerMetadata: Object.keys(metadata).length > 0 ? googleMetadata(metadata) : undefined,\n }),\n )\n hasToolCalls = true\n }\n }\n\n return Effect.succeed([\n {\n ...nextState,\n hasToolCalls,\n lifecycle,\n nextToolCallId,\n reasoningSignature,\n finishReason: candidate.finishReason ?? nextState.finishReason,\n },\n events,\n ] as const)\n}\n\n// =============================================================================\n// Protocol And Gemini Route\n// =============================================================================\n/**\n * The Gemini protocol — request body construction, body schema, and the\n * streaming-event state machine shared by Google AI Studio and Vertex Gemini.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: GeminiBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(GeminiEvent),\n initial: () => ({ hasToolCalls: false, nextToolCallId: 0, lifecycle: Lifecycle.initial() }),\n step,\n onHalt: finish,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"google\",\n providerMetadataKey: \"google\",\n protocol,\n // Gemini's path embeds the model id and pins SSE framing at the URL level.\n endpoint: Endpoint.path(({ request }) => `/models/${request.model.id}:streamGenerateContent?alt=sse`, {\n baseURL: DEFAULT_BASE_URL,\n }),\n auth: Auth.none,\n framing: Framing.sse,\n})\n\nexport * as Gemini from \"./gemini.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "37D90C6BB5C7A24B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/anthropic-messages.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n AIError,\n LLMEvent,\n mergeJsonRecords,\n Usage,\n type CacheHint,\n type FinishReasonDetails,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type ToolCallPart,\n type ToolDefinition,\n type ToolResultPart,\n} from \"../schema/index.js\"\nimport { JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared.js\"\nimport { classifyProviderFailure } from \"../provider-error.js\"\nimport * as Cache from \"./utils/cache.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { ToolStream } from \"./utils/tool-stream.js\"\n\nconst ADAPTER = \"anthropic-messages\"\nexport const DEFAULT_BASE_URL = \"https://api.anthropic.com/v1\"\nexport const PATH = \"/messages\"\nexport const DEFAULT_MAX_TOKENS = 32_000\n\nconst SSE_EVENTS = new Set([\n \"message\",\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"content_block_start\",\n \"content_block_delta\",\n \"content_block_stop\",\n \"error\",\n])\nexport const framing = Framing.sseEvents(SSE_EVENTS)\n\nexport type ThinkingInput =\n | {\n readonly type: \"adaptive\"\n readonly display?: \"summarized\" | \"omitted\"\n }\n | {\n readonly type: \"disabled\"\n }\n | ({ readonly type: \"enabled\" } & (\n | { readonly budgetTokens: number; readonly budget_tokens?: number }\n | { readonly budgetTokens?: number; readonly budget_tokens: number }\n ))\n\nexport interface OptionsInput {\n readonly [key: string]: unknown\n readonly thinking?: ThinkingInput\n readonly effort?: string\n}\n\nexport type ProviderOptionsInput = OptionsInput\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst AnthropicCacheControl = Schema.Struct({\n type: Schema.tag(\"ephemeral\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n})\n\nconst AnthropicTextBlock = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTextBlock = Schema.Schema.Type<typeof AnthropicTextBlock>\n\nconst AnthropicImageBlock = Schema.Struct({\n type: Schema.tag(\"image\"),\n source: Schema.Struct({\n type: Schema.tag(\"base64\"),\n media_type: Schema.String,\n data: Schema.String,\n }),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicImageBlock = Schema.Schema.Type<typeof AnthropicImageBlock>\n\nconst AnthropicDocumentBlock = Schema.Struct({\n type: Schema.tag(\"document\"),\n source: Schema.Struct({\n type: Schema.tag(\"base64\"),\n media_type: Schema.Literal(\"application/pdf\"),\n data: Schema.String,\n }),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicDocumentBlock = Schema.Schema.Type<typeof AnthropicDocumentBlock>\n\nconst AnthropicThinkingBlock = Schema.Struct({\n type: Schema.tag(\"thinking\"),\n thinking: Schema.String,\n signature: Schema.optional(Schema.String),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\n// Safety-filtered thinking arrives as an opaque encrypted `data` payload with\n// no visible text. It must round-trip verbatim so multi-turn thinking + tool\n// use conversations keep their reasoning continuity.\nconst AnthropicRedactedThinkingBlock = Schema.Struct({\n type: Schema.tag(\"redacted_thinking\"),\n data: Schema.String,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicToolUseBlock = Schema.Struct({\n type: Schema.tag(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicToolUseBlock = Schema.Schema.Type<typeof AnthropicToolUseBlock>\n\nconst AnthropicServerToolUseBlock = Schema.Struct({\n type: Schema.tag(\"server_tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolUseBlock = Schema.Schema.Type<typeof AnthropicServerToolUseBlock>\n\n// Server tool result blocks: web_search_tool_result, code_execution_tool_result,\n// and web_fetch_tool_result. The provider executes the tool and inlines the\n// structured result into the assistant turn — there is no client tool_result\n// round-trip. We round-trip the structured `content` payload as opaque JSON so\n// the next request can echo it back when continuing the conversation.\nconst AnthropicServerToolResultType = Schema.Literals([\n \"web_search_tool_result\",\n \"code_execution_tool_result\",\n \"web_fetch_tool_result\",\n])\ntype AnthropicServerToolResultType = Schema.Schema.Type<typeof AnthropicServerToolResultType>\n\nconst AnthropicServerToolResultBlock = Schema.Struct({\n type: AnthropicServerToolResultType,\n tool_use_id: Schema.String,\n content: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolResultBlock = Schema.Schema.Type<typeof AnthropicServerToolResultBlock>\n\n// Anthropic accepts either a plain string or an ordered array of text, image, and\n// document blocks inside `tool_result.content`. The array form keeps media as native\n// model input instead of JSON-stringifying base64 into prompt text.\nconst AnthropicToolResultContent = Schema.Union([AnthropicTextBlock, AnthropicImageBlock, AnthropicDocumentBlock])\n\nconst AnthropicToolResultBlock = Schema.Struct({\n type: Schema.tag(\"tool_result\"),\n tool_use_id: Schema.String,\n content: Schema.Union([Schema.String, Schema.Array(AnthropicToolResultContent)]),\n is_error: Schema.optional(Schema.Boolean),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicUserBlock = Schema.Union([\n AnthropicTextBlock,\n AnthropicImageBlock,\n AnthropicDocumentBlock,\n AnthropicToolResultBlock,\n])\ntype AnthropicUserBlock = Schema.Schema.Type<typeof AnthropicUserBlock>\nconst AnthropicAssistantBlock = Schema.Union([\n AnthropicTextBlock,\n AnthropicThinkingBlock,\n AnthropicRedactedThinkingBlock,\n AnthropicToolUseBlock,\n AnthropicServerToolUseBlock,\n AnthropicServerToolResultBlock,\n])\ntype AnthropicAssistantBlock = Schema.Schema.Type<typeof AnthropicAssistantBlock>\ntype AnthropicToolResultBlock = Schema.Schema.Type<typeof AnthropicToolResultBlock>\n\nconst AnthropicMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(AnthropicUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(AnthropicAssistantBlock) }),\n Schema.Struct({ role: Schema.Literal(\"system\"), content: Schema.Array(AnthropicTextBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype AnthropicMessage = Schema.Schema.Type<typeof AnthropicMessage>\n\nconst AnthropicTool = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n input_schema: JsonObject,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTool = Schema.Schema.Type<typeof AnthropicTool>\n\nconst AnthropicToolChoice = Schema.Union([\n Schema.Struct({ type: Schema.Literals([\"auto\", \"any\", \"none\"]) }),\n Schema.Struct({ type: Schema.tag(\"tool\"), name: Schema.String }),\n])\n\nconst AnthropicThinking = Schema.Union([\n Schema.Struct({\n type: Schema.tag(\"enabled\"),\n budget_tokens: Schema.Number,\n }),\n Schema.Struct({\n type: Schema.tag(\"adaptive\"),\n display: Schema.optional(Schema.Literals([\"summarized\", \"omitted\"])),\n }),\n Schema.Struct({\n type: Schema.tag(\"disabled\"),\n }),\n])\n\nconst AnthropicOutputConfig = Schema.Struct({\n effort: Schema.optional(Schema.String),\n})\n\nconst AnthropicBodyFields = {\n model: Schema.String,\n system: optionalArray(AnthropicTextBlock),\n messages: Schema.Array(AnthropicMessage),\n tools: optionalArray(AnthropicTool),\n tool_choice: Schema.optional(AnthropicToolChoice),\n stream: Schema.Literal(true),\n max_tokens: Schema.Number,\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n top_k: Schema.optional(Schema.Number),\n stop_sequences: optionalArray(Schema.String),\n thinking: Schema.optional(AnthropicThinking),\n output_config: Schema.optional(AnthropicOutputConfig),\n}\nexport const AnthropicMessagesBody = Schema.Struct(AnthropicBodyFields)\nexport type AnthropicMessagesBody = Schema.Schema.Type<typeof AnthropicMessagesBody>\n\nconst AnthropicUsage = Schema.StructWithRest(\n Schema.Struct({\n input_tokens: optionalNull(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n cache_creation_input_tokens: optionalNull(Schema.Number),\n cache_read_input_tokens: optionalNull(Schema.Number),\n server_tool_use: optionalNull(\n Schema.StructWithRest(Schema.Struct({ web_search_requests: Schema.optional(Schema.Number) }), [\n Schema.Record(Schema.String, Schema.Unknown),\n ]),\n ),\n output_tokens_details: optionalNull(\n Schema.StructWithRest(Schema.Struct({ thinking_tokens: Schema.optional(Schema.Number) }), [\n Schema.Record(Schema.String, Schema.Unknown),\n ]),\n ),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\ntype AnthropicUsage = Schema.Schema.Type<typeof AnthropicUsage>\n\nconst AnthropicStreamBlock = Schema.Struct({\n type: Schema.String,\n id: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n // redacted_thinking blocks arrive whole in content_block_start with the\n // encrypted payload in `data`; there is no streaming delta sequence.\n data: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Unknown),\n // *_tool_result blocks arrive whole as content_block_start (no streaming\n // delta) with the structured payload in `content` and the originating\n // server_tool_use id in `tool_use_id`.\n tool_use_id: Schema.optional(Schema.String),\n content: Schema.optional(Schema.Unknown),\n})\n\nconst AnthropicStreamDelta = Schema.Struct({\n type: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n partial_json: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n stop_reason: optionalNull(Schema.String),\n stop_sequence: optionalNull(Schema.String),\n})\n\nconst AnthropicEvent = Schema.Struct({\n type: Schema.String,\n index: Schema.optional(Schema.Number),\n message: Schema.optional(Schema.Struct({ usage: Schema.optional(AnthropicUsage) })),\n content_block: Schema.optional(AnthropicStreamBlock),\n delta: Schema.optional(AnthropicStreamDelta),\n usage: Schema.optional(AnthropicUsage),\n // `type` and `message` are both required per Anthropic's spec, but\n // OpenAI-compatible proxies and gateway translations occasionally drop one\n // or the other; mark them optional so a partial payload still parses and\n // the parser can fall back to whichever field is populated.\n error: Schema.optional(\n Schema.Struct({ type: Schema.optional(Schema.String), message: Schema.optional(Schema.String) }),\n ),\n})\ntype AnthropicEvent = Schema.Schema.Type<typeof AnthropicEvent>\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n readonly reasoningSignatures: Readonly<Record<number, string>>\n readonly usage?: Usage\n readonly pendingFinish?: {\n readonly reason: FinishReasonDetails\n readonly providerMetadata?: ProviderMetadata\n }\n readonly lifecycle: Lifecycle.State\n}\n\nconst invalid = ProviderShared.invalidRequest\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Anthropic accepts at most 4 explicit cache_control breakpoints per request,\n// across `tools`, `system`, and `messages`. Beyond the cap the API returns a\n// 400 — so the lowering layer counts emitted markers and silently drops any\n// that exceed it.\nconst ANTHROPIC_BREAKPOINT_CAP = 4\n\nconst EPHEMERAL_5M = { type: \"ephemeral\" as const }\nconst EPHEMERAL_1H = { type: \"ephemeral\" as const, ttl: \"1h\" as const }\n\nconst cacheControl = (breakpoints: Cache.Breakpoints, cache: CacheHint | undefined) => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return Cache.ttlBucket(cache.ttlSeconds) === \"1h\" ? EPHEMERAL_1H : EPHEMERAL_5M\n}\n\nconst anthropicMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ anthropic: metadata })\n\nconst signatureFromMetadata = (metadata: ProviderMetadata | undefined): string | undefined => {\n const anthropic = metadata?.anthropic\n if (!ProviderShared.isRecord(anthropic)) return undefined\n return typeof anthropic.signature === \"string\" ? anthropic.signature : undefined\n}\n\nconst redactedDataFromMetadata = (metadata: ProviderMetadata | undefined): string | undefined => {\n const anthropic = metadata?.anthropic\n if (!ProviderShared.isRecord(anthropic)) return undefined\n return typeof anthropic.redactedData === \"string\" ? anthropic.redactedData : undefined\n}\n\nconst lowerTool = (breakpoints: Cache.Breakpoints, tool: ToolDefinition, inputSchema: JsonSchema): AnthropicTool => ({\n name: tool.name,\n description: tool.description,\n input_schema: inputSchema,\n cache_control: cacheControl(breakpoints, tool.cache),\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Anthropic Messages\", toolChoice, {\n auto: () => ({ type: \"auto\" as const }),\n none: () => ({ type: \"none\" as const }),\n required: () => ({ type: \"any\" as const }),\n tool: (name) => ({ type: \"tool\" as const, name }),\n })\n\nconst scrubToolCallID = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, \"_\")\n\nconst lowerToolCall = (part: ToolCallPart): AnthropicToolUseBlock => ({\n type: \"tool_use\",\n id: scrubToolCallID(part.id),\n name: part.name,\n input: part.input,\n})\n\nconst lowerServerToolCall = (part: ToolCallPart): AnthropicServerToolUseBlock => ({\n type: \"server_tool_use\",\n id: scrubToolCallID(part.id),\n name: part.name,\n input: part.input,\n})\n\n// Server tool result blocks are typed by name. Anthropic ships three today;\n// extend this list when new server tools land. The block content is the\n// structured payload returned by the provider, which we round-trip as-is.\nconst serverToolResultType = (name: string): AnthropicServerToolResultType | undefined => {\n if (name === \"web_search\") return \"web_search_tool_result\"\n if (name === \"code_execution\") return \"code_execution_tool_result\"\n if (name === \"web_fetch\") return \"web_fetch_tool_result\"\n return undefined\n}\n\nconst lowerServerToolResult = Effect.fn(\"AnthropicMessages.lowerServerToolResult\")(function* (part: ToolResultPart) {\n const wireType = serverToolResultType(part.name)\n if (!wireType)\n return yield* invalid(`Anthropic Messages does not know how to round-trip server tool result for ${part.name}`)\n // Prefer the provider-owned replay payload; fall back to the result value for\n // histories constructed directly from provider events.\n const payload = part.providerMetadata?.anthropic?.[\"result\"] ?? part.result.value\n return { type: wireType, tool_use_id: scrubToolCallID(part.id), content: payload } satisfies AnthropicServerToolResultBlock\n})\n\nconst lowerMedia = Effect.fn(\"AnthropicMessages.lowerMedia\")(function* (part: MediaPart) {\n const media = ProviderShared.normalizeMedia(part)\n if (media.mime === \"application/pdf\")\n return {\n type: \"document\" as const,\n source: {\n type: \"base64\" as const,\n media_type: \"application/pdf\" as const,\n data: media.base64,\n },\n } satisfies AnthropicDocumentBlock\n if (!media.mime.startsWith(\"image/\"))\n return yield* invalid(`Anthropic Messages does not support media type ${part.mediaType}`)\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: media.mime,\n data: media.base64,\n },\n } satisfies AnthropicImageBlock\n})\n\n// Tool results may carry structured text, images, and documents. Keep media as provider-native\n// content instead of JSON-stringifying base64 into a prompt string.\nconst lowerToolResultContentItem = Effect.fnUntraced(function* (item: Tool.Content) {\n if (item.type === \"text\") return { type: \"text\" as const, text: item.text } satisfies AnthropicTextBlock\n return yield* lowerMedia({ type: \"media\", mediaType: item.mime, data: item.uri, filename: item.name })\n})\n\nconst lowerToolResultContent = Effect.fnUntraced(function* (part: ToolResultPart) {\n // Text / json / error results stay as a string for backward compatibility\n // with existing cassettes and provider expectations.\n if (part.result.type !== \"content\") return ProviderShared.toolResultText(part)\n // Preserve the narrowed array element type when compiled through a consumer package.\n const content: ReadonlyArray<Tool.Content> = part.result.value\n return yield* Effect.forEach(content, lowerToolResultContentItem)\n})\n\n// Mid-conversation system messages became available with Opus 4.8 and version\n// 5 of the other supported Claude families. Treat later family versions as\n// compatible without assuming that every Anthropic Messages model is Claude.\nconst supportsNativeSystemUpdates = (request: LLMRequest) => {\n const match = /(?:^|[./])claude-(fable|haiku|mythos|opus|sonnet)-(\\d+)(?:[.-](\\d+))?/.exec(\n String(request.model.id).toLowerCase(),\n )\n if (!match) return false\n const major = Number(match[2])\n if (match[1] !== \"opus\") return major >= 5\n if (major !== 4) return major >= 5\n return match[3] !== undefined && match[3].length <= 2 && Number(match[3]) >= 8\n}\n\nconst endsInServerToolUse = (message: LLMRequest[\"messages\"][number]) => {\n const last = message.content.at(-1)\n return message.role === \"assistant\" && last?.type === \"tool-call\" && last.providerExecuted === true\n}\n\nconst canUseNativeSystemUpdate = (messages: LLMRequest[\"messages\"], index: number) => {\n const previous = messages[index - 1]\n const next = messages[index + 1]\n return (\n previous !== undefined &&\n previous.role !== \"system\" &&\n (previous.role === \"user\" || previous.role === \"tool\" || endsInServerToolUse(previous)) &&\n next?.role !== \"system\" &&\n (next === undefined || next.role === \"assistant\")\n )\n}\n\nconst splitsLocalToolResults = (messages: LLMRequest[\"messages\"], index: number) => {\n const pending = new Set<string>()\n for (const message of messages.slice(0, index)) {\n for (const part of message.content) {\n if (message.role === \"assistant\" && part.type === \"tool-call\" && part.providerExecuted !== true)\n pending.add(part.id)\n if (message.role === \"tool\" && part.type === \"tool-result\") pending.delete(part.id)\n }\n }\n return pending.size > 0\n}\n\nconst lowerNativeSystemUpdate = Effect.fn(\"AnthropicMessages.lowerNativeSystemUpdate\")(function* (\n message: LLMRequest[\"messages\"][number],\n breakpoints: Cache.Breakpoints,\n) {\n const content = yield* ProviderShared.systemUpdateText(\"Anthropic Messages\", message)\n return {\n role: \"system\" as const,\n content: content.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n })),\n }\n})\n\nconst lowerMessages = Effect.fn(\"AnthropicMessages.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: Cache.Breakpoints,\n) {\n const messages: AnthropicMessage[] = []\n\n for (const [index, message] of request.messages.entries()) {\n if (message.role === \"system\") {\n if (splitsLocalToolResults(request.messages, index))\n return yield* invalid(\"Anthropic Messages system updates cannot split a local tool call from its tool result\")\n if (supportsNativeSystemUpdates(request) && canUseNativeSystemUpdate(request.messages, index)) {\n messages.push(yield* lowerNativeSystemUpdate(message, breakpoints))\n continue\n }\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Anthropic Messages\", message)\n const block = { type: \"text\" as const, text: part.text, cache_control: cacheControl(breakpoints, part.cache) }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, block] }\n else messages.push({ role: \"user\", content: [block] })\n continue\n }\n\n if (message.role === \"user\") {\n const content: AnthropicUserBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerMedia(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"user\", [\"text\", \"media\"])\n }\n messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: AnthropicAssistantBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"reasoning\") {\n // Mirrors Vercel's @ai-sdk/anthropic: a signature marks visible\n // thinking; only signature-less parts carrying redactedData\n // round-trip as opaque redacted_thinking blocks.\n const signature = part.encrypted ?? signatureFromMetadata(part.providerMetadata)\n const redactedData = redactedDataFromMetadata(part.providerMetadata)\n if (signature === undefined && redactedData !== undefined) {\n content.push({ type: \"redacted_thinking\", data: redactedData })\n continue\n }\n content.push({ type: \"thinking\", thinking: part.text, signature })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(part.providerExecuted ? lowerServerToolCall(part) : lowerToolCall(part))\n continue\n }\n if (part.type === \"tool-result\" && part.providerExecuted) {\n content.push(yield* lowerServerToolResult(part))\n continue\n }\n return yield* invalid(\n `Anthropic Messages assistant messages only support text, reasoning, and tool-call content for now`,\n )\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: AnthropicToolResultBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"tool\", [\"tool-result\"])\n content.push({\n type: \"tool_result\",\n tool_use_id: scrubToolCallID(part.id),\n content: yield* lowerToolResultContent(part),\n is_error: part.result.type === \"error\" ? true : undefined,\n cache_control: cacheControl(breakpoints, part.cache),\n })\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\" && previous.content.every((block) => block.type === \"tool_result\"))\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\nconst resolveOptions = Effect.fn(\"AnthropicMessages.resolveOptions\")(function* (request: LLMRequest) {\n const input = request.providerOptions\n return {\n thinking: yield* resolveThinking(input?.thinking),\n effort: typeof input?.effort === \"string\" ? input.effort : undefined,\n }\n})\n\nconst resolveThinking = Effect.fn(\"AnthropicMessages.resolveThinking\")(function* (input: unknown) {\n if (!ProviderShared.isRecord(input)) return undefined\n if (input.type === \"adaptive\") {\n const display =\n input.display === \"summarized\"\n ? (\"summarized\" as const)\n : input.display === \"omitted\"\n ? (\"omitted\" as const)\n : undefined\n return { type: \"adaptive\" as const, ...(display === undefined ? {} : { display }) }\n }\n if (input.type === \"disabled\") return { type: \"disabled\" as const }\n if (input.type !== \"enabled\") return undefined\n const budget =\n typeof input.budgetTokens === \"number\"\n ? input.budgetTokens\n : typeof input.budget_tokens === \"number\"\n ? input.budget_tokens\n : undefined\n if (budget === undefined)\n return yield* ProviderShared.invalidRequest(\"Anthropic thinking provider option requires budgetTokens\")\n return { type: \"enabled\" as const, budget_tokens: budget }\n})\n\nconst fromRequest = Effect.fn(\"AnthropicMessages.fromRequest\")(function* (request: LLMRequest) {\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n // Allocate the 4-breakpoint budget in invalidation order: tools → system →\n // messages. Tools live highest in the cache hierarchy, so when callers\n // over-mark we keep their tool hints and shed the message-tail ones first.\n const breakpoints = Cache.newBreakpoints(ANTHROPIC_BREAKPOINT_CAP)\n const tools =\n request.tools.length === 0\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(\n breakpoints,\n tool,\n ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility),\n ),\n )\n // Anthropic rejects tool_choice when tools are absent; \"none\" is only meaningful with tools present.\n const toolChoice = tools === undefined || !request.toolChoice ? undefined : yield* lowerToolChoice(request.toolChoice)\n const system =\n request.system.length === 0\n ? undefined\n : request.system.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n }))\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Anthropic Messages: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${ANTHROPIC_BREAKPOINT_CAP} per request.`,\n )\n }\n const options = yield* resolveOptions(request)\n return {\n model: request.model.id,\n system,\n messages,\n tools,\n tool_choice: toolChoice,\n stream: true as const,\n max_tokens: generation?.maxTokens ?? DEFAULT_MAX_TOKENS,\n temperature: generation?.temperature,\n top_p: generation?.topP,\n top_k: generation?.topK,\n stop_sequences: generation?.stop,\n thinking: options.thinking,\n output_config: options.effort === undefined ? undefined : { effort: options.effort },\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\" || reason === \"pause_turn\") return \"stop\"\n if (reason === \"max_tokens\" || reason === \"model_context_window_exceeded\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"refusal\") return \"content-filter\"\n return \"unknown\"\n}\n\n// Anthropic reports the non-overlapping breakdown natively — its\n// `input_tokens` is the *non-cached* count per the Messages API docs, with\n// cache reads and writes as separate fields. We sum them to derive the\n// inclusive `inputTokens` the rest of the contract expects. Extended\n// thinking tokens are included in `output_tokens`; newer responses also\n// expose that subset through `output_tokens_details.thinking_tokens`.\nconst mapUsage = (usage: AnthropicUsage | undefined): Usage | undefined => {\n if (!usage) return undefined\n const nonCached = usage.input_tokens ?? undefined\n const cacheRead = usage.cache_read_input_tokens ?? undefined\n const cacheWrite = usage.cache_creation_input_tokens ?? undefined\n const inputTokens = ProviderShared.sumTokens(nonCached, cacheRead, cacheWrite)\n return new Usage({\n inputTokens,\n outputTokens: usage.output_tokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cacheRead,\n cacheWriteInputTokens: cacheWrite,\n reasoningTokens: usage.output_tokens_details?.thinking_tokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, usage.output_tokens, undefined),\n providerMetadata: { anthropic: usage },\n })\n}\n\n// Anthropic emits usage on `message_start` and again on `message_delta` — the\n// final delta carries the authoritative totals. Right-biased merge: each\n// field prefers `right` when defined, falls back to `left`. `inputTokens` is\n// recomputed from the merged breakdown so the inclusive total stays\n// consistent with `nonCached + cacheRead + cacheWrite`.\nconst mergeUsage = (left: Usage | undefined, right: Usage | undefined) => {\n if (!left) return right\n if (!right) return left\n const nonCachedInputTokens = right.nonCachedInputTokens ?? left.nonCachedInputTokens\n const cacheReadInputTokens = right.cacheReadInputTokens ?? left.cacheReadInputTokens\n const cacheWriteInputTokens = right.cacheWriteInputTokens ?? left.cacheWriteInputTokens\n const inputTokens = ProviderShared.sumTokens(nonCachedInputTokens, cacheReadInputTokens, cacheWriteInputTokens)\n const outputTokens = right.outputTokens ?? left.outputTokens\n const reasoningTokens = right.reasoningTokens ?? left.reasoningTokens\n return new Usage({\n inputTokens,\n outputTokens,\n nonCachedInputTokens,\n cacheReadInputTokens,\n cacheWriteInputTokens,\n reasoningTokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, outputTokens, undefined),\n providerMetadata: {\n anthropic: mergeJsonRecords(left.providerMetadata?.[\"anthropic\"], right.providerMetadata?.[\"anthropic\"]) ?? {},\n },\n })\n}\n\n// Server tool result blocks come whole in `content_block_start` (no streaming\n// delta sequence). We convert the payload to a `tool-result` event with\n// `providerExecuted: true`. The runtime appends it to the assistant message\n// for round-trip; downstream consumers can inspect `result.value` for the\n// structured payload.\nconst SERVER_TOOL_RESULT_NAMES: Record<AnthropicServerToolResultType, string> = {\n web_search_tool_result: \"web_search\",\n code_execution_tool_result: \"code_execution\",\n web_fetch_tool_result: \"web_fetch\",\n}\n\nconst isServerToolResultType = (type: string): type is AnthropicServerToolResultType => type in SERVER_TOOL_RESULT_NAMES\n\nconst serverToolResultEvent = (block: NonNullable<AnthropicEvent[\"content_block\"]>): LLMEvent | undefined => {\n if (!block.type || !isServerToolResultType(block.type)) return undefined\n const errorPayload =\n typeof block.content === \"object\" && block.content !== null && \"type\" in block.content\n ? String((block.content as Record<string, unknown>).type)\n : \"\"\n const isError = errorPayload.endsWith(\"_tool_result_error\")\n return LLMEvent.toolResult({\n id: block.tool_use_id ?? \"\",\n name: SERVER_TOOL_RESULT_NAMES[block.type],\n result: isError ? { type: \"error\", value: block.content } : { type: \"json\", value: block.content },\n providerExecuted: true,\n // The complete payload is irreducible provider replay state: subsequent\n // stateless requests must round-trip the typed result block verbatim.\n providerMetadata: anthropicMetadata({ blockType: block.type, result: block.content }),\n })\n}\n\ntype StepResult = readonly [ParserState, ReadonlyArray<LLMEvent>]\n\nconst NO_EVENTS: StepResult[\"1\"] = []\n\nconst onMessageStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mapUsage(event.message?.usage)\n return [usage ? { ...state, usage: mergeUsage(state.usage, usage) } : state, NO_EVENTS]\n}\n\nconst onContentBlockStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const block = event.content_block\n if (!block) return [state, NO_EVENTS]\n\n if ((block.type === \"tool_use\" || block.type === \"server_tool_use\") && event.index !== undefined) {\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, event.index, {\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n input:\n block.input !== undefined && (!ProviderShared.isRecord(block.input) || Object.keys(block.input).length > 0)\n ? ProviderShared.encodeJson(block.input)\n : undefined,\n providerExecuted: block.type === \"server_tool_use\",\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n providerExecuted: block.type === \"server_tool_use\" ? true : undefined,\n }),\n ],\n ]\n }\n\n if (block.type === \"text\" && block.text !== undefined) {\n const events: LLMEvent[] = []\n const id = `text-${event.index ?? 0}`\n const lifecycle = Lifecycle.textStart(state.lifecycle, events, id)\n return [\n { ...state, lifecycle: block.text ? Lifecycle.textDelta(lifecycle, events, id, block.text) : lifecycle },\n events,\n ]\n }\n\n if (block.type === \"thinking\" && block.thinking !== undefined) {\n const events: LLMEvent[] = []\n const id = `reasoning-${event.index ?? 0}`\n const providerMetadata =\n block.signature === undefined ? undefined : anthropicMetadata({ signature: block.signature })\n const lifecycle = Lifecycle.reasoningStart(state.lifecycle, events, id, providerMetadata)\n return [\n {\n ...state,\n lifecycle: block.thinking\n ? Lifecycle.reasoningDelta(lifecycle, events, id, block.thinking, providerMetadata)\n : lifecycle,\n reasoningSignatures:\n event.index === undefined || block.signature === undefined\n ? state.reasoningSignatures\n : { ...state.reasoningSignatures, [event.index]: block.signature },\n },\n events,\n ]\n }\n\n // Redacted thinking surfaces as an empty reasoning part carrying the opaque\n // payload as `redactedData` metadata (same model as Vercel's\n // @ai-sdk/anthropic). The existing content_block_stop closes the part.\n if (block.type === \"redacted_thinking\" && block.data !== undefined) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningStart(\n state.lifecycle,\n events,\n `reasoning-${event.index ?? 0}`,\n anthropicMetadata({ redactedData: block.data }),\n ),\n },\n events,\n ]\n }\n\n const result = serverToolResultEvent(block)\n if (!result) return [state, NO_EVENTS]\n const events: LLMEvent[] = []\n return [{ ...state, lifecycle: Lifecycle.stepStart(state.lifecycle, events) }, [...events, result]]\n}\n\nconst onContentBlockDelta = Effect.fn(\"AnthropicMessages.onContentBlockDelta\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n const delta = event.delta\n\n if (delta?.type === \"text_delta\" && delta.text) {\n const events: LLMEvent[] = []\n return [\n { ...state, lifecycle: Lifecycle.textDelta(state.lifecycle, events, `text-${event.index ?? 0}`, delta.text) },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"thinking_delta\" && delta.thinking) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${event.index ?? 0}`, delta.thinking),\n },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"signature_delta\" && delta.signature) {\n const index = event.index ?? 0\n return [\n {\n ...state,\n reasoningSignatures: { ...state.reasoningSignatures, [index]: delta.signature },\n },\n NO_EVENTS,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"input_json_delta\" && event.index !== undefined) {\n if (!delta.partial_json) return [state, NO_EVENTS] satisfies StepResult\n if (!state.tools[event.index]) return [state, NO_EVENTS] satisfies StepResult\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n event.index,\n delta.partial_json,\n \"Anthropic Messages tool argument delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] satisfies StepResult\n }\n\n return [state, NO_EVENTS] satisfies StepResult\n})\n\nconst onContentBlockStop = Effect.fn(\"AnthropicMessages.onContentBlockStop\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n if (event.index === undefined) return [state, NO_EVENTS] satisfies StepResult\n const result = yield* ToolStream.finish(ADAPTER, state.tools, event.index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const signature = state.reasoningSignatures[event.index]\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${event.index}`),\n events,\n `reasoning-${event.index}`,\n signature === undefined ? undefined : anthropicMetadata({ signature }),\n )\n events.push(...resultEvents)\n const reasoningSignatures = { ...state.reasoningSignatures }\n delete reasoningSignatures[event.index]\n return [{ ...state, lifecycle, tools: result.tools, reasoningSignatures }, events] satisfies StepResult\n})\n\nconst onMessageDelta = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mergeUsage(state.usage, mapUsage(event.usage))\n return [\n {\n ...state,\n usage,\n pendingFinish: {\n reason: {\n normalized: mapFinishReason(event.delta?.stop_reason),\n raw: event.delta?.stop_reason ?? undefined,\n },\n providerMetadata:\n event.delta?.stop_sequence === null || event.delta?.stop_sequence === undefined\n ? undefined\n : anthropicMetadata({ stopSequence: event.delta.stop_sequence }),\n },\n },\n NO_EVENTS,\n ]\n}\n\nconst onMessageStop = Effect.fn(\"AnthropicMessages.onMessageStop\")(function* (state: ParserState) {\n const result = yield* ToolStream.finishAll(ADAPTER, state.tools)\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n const finished = Lifecycle.finish(lifecycle, events, {\n reason: state.pendingFinish?.reason ?? {\n normalized: \"unknown\",\n raw: undefined,\n },\n usage: state.usage,\n providerMetadata: state.pendingFinish?.providerMetadata,\n })\n return [{ ...state, lifecycle: finished, tools: result.tools }, events] satisfies StepResult\n})\n\n// Prefix `error.type` so overloads, rate limits, and quota errors are visible\n// even when the provider message is generic or empty.\nconst providerErrorMessage = (event: AnthropicEvent): string => {\n const type = event.error?.type\n const message = event.error?.message\n if (type && message) return `${type}: ${message}`\n return message || type || \"Anthropic Messages stream error\"\n}\n\nconst onError = (event: AnthropicEvent) =>\n new AIError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({ message: providerErrorMessage(event), code: event.error?.type }),\n })\n\nconst step = (state: ParserState, event: AnthropicEvent) => {\n if (event.type === \"message_start\") return Effect.succeed(onMessageStart(state, event))\n if (event.type === \"content_block_start\") return Effect.succeed(onContentBlockStart(state, event))\n if (event.type === \"content_block_delta\") return onContentBlockDelta(state, event)\n if (event.type === \"content_block_stop\") return onContentBlockStop(state, event)\n if (event.type === \"message_delta\") return Effect.succeed(onMessageDelta(state, event))\n if (event.type === \"message_stop\") return onMessageStop(state)\n if (event.type === \"error\") return onError(event)\n return Effect.succeed<StepResult>([state, NO_EVENTS])\n}\n\n// =============================================================================\n// Protocol And Anthropic Route\n// =============================================================================\n/**\n * The Anthropic Messages protocol — request body construction, body schema,\n * and the streaming-event state machine shared by Anthropic-compatible and\n * Vertex-hosted Messages routes.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: AnthropicMessagesBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(AnthropicEvent),\n initial: () => ({\n tools: ToolStream.empty<number>(),\n reasoningSignatures: {},\n lifecycle: Lifecycle.initial(),\n }),\n step,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"anthropic\",\n providerMetadataKey: \"anthropic\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n framing,\n headers: () => ({ \"anthropic-version\": \"2023-06-01\" }),\n})\n\nexport * as AnthropicMessages from \"./anthropic-messages.js\"\n" | ||
| ], | ||
| "mappings": ";omBA8BA,IAAM,EAAU,qBACH,EAAmB,+BACnB,EAAO,YACP,EAAqB,MAE5B,GAAa,IAAI,IAAI,CACzB,UACA,gBACA,gBACA,eACA,sBACA,sBACA,qBACA,OACF,CAAC,EACY,EAAU,EAAQ,UAAU,EAAU,EA0B7C,EAAwB,EAAO,OAAO,CAC1C,KAAM,EAAO,IAAI,WAAW,EAC5B,IAAK,EAAO,SAAS,EAAO,SAAS,CAAC,KAAM,IAAI,CAAC,CAAC,CACpD,CAAC,EAEK,EAAqB,EAAO,OAAO,CACvC,KAAM,EAAO,IAAI,MAAM,EACvB,KAAM,EAAO,OACb,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAGK,EAAsB,EAAO,OAAO,CACxC,KAAM,EAAO,IAAI,OAAO,EACxB,OAAQ,EAAO,OAAO,CACpB,KAAM,EAAO,IAAI,QAAQ,EACzB,WAAY,EAAO,OACnB,KAAM,EAAO,MACf,CAAC,EACD,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAGK,EAAyB,EAAO,OAAO,CAC3C,KAAM,EAAO,IAAI,UAAU,EAC3B,OAAQ,EAAO,OAAO,CACpB,KAAM,EAAO,IAAI,QAAQ,EACzB,WAAY,EAAO,QAAQ,iBAAiB,EAC5C,KAAM,EAAO,MACf,CAAC,EACD,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAGK,GAAyB,EAAO,OAAO,CAC3C,KAAM,EAAO,IAAI,UAAU,EAC3B,SAAU,EAAO,OACjB,UAAW,EAAO,SAAS,EAAO,MAAM,EACxC,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAKK,GAAiC,EAAO,OAAO,CACnD,KAAM,EAAO,IAAI,mBAAmB,EACpC,KAAM,EAAO,OACb,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAEK,GAAwB,EAAO,OAAO,CAC1C,KAAM,EAAO,IAAI,UAAU,EAC3B,GAAI,EAAO,OACX,KAAM,EAAO,OACb,MAAO,EAAO,QACd,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAGK,GAA8B,EAAO,OAAO,CAChD,KAAM,EAAO,IAAI,iBAAiB,EAClC,GAAI,EAAO,OACX,KAAM,EAAO,OACb,MAAO,EAAO,QACd,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAQK,GAAgC,EAAO,SAAS,CACpD,yBACA,6BACA,uBACF,CAAC,EAGK,GAAiC,EAAO,OAAO,CACnD,KAAM,GACN,YAAa,EAAO,OACpB,QAAS,EAAO,QAChB,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAMK,GAA6B,EAAO,MAAM,CAAC,EAAoB,EAAqB,CAAsB,CAAC,EAE3G,GAA2B,EAAO,OAAO,CAC7C,KAAM,EAAO,IAAI,aAAa,EAC9B,YAAa,EAAO,OACpB,QAAS,EAAO,MAAM,CAAC,EAAO,OAAQ,EAAO,MAAM,EAA0B,CAAC,CAAC,EAC/E,SAAU,EAAO,SAAS,EAAO,OAAO,EACxC,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAEK,GAAqB,EAAO,MAAM,CACtC,EACA,EACA,EACA,EACF,CAAC,EAEK,GAA0B,EAAO,MAAM,CAC3C,EACA,GACA,GACA,GACA,GACA,EACF,CAAC,EAIK,GAAmB,EAAO,MAAM,CACpC,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,MAAM,EAAG,QAAS,EAAO,MAAM,EAAkB,CAAE,CAAC,EACzF,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,WAAW,EAAG,QAAS,EAAO,MAAM,EAAuB,CAAE,CAAC,EACnG,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,QAAQ,EAAG,QAAS,EAAO,MAAM,CAAkB,CAAE,CAAC,CAC7F,CAAC,EAAE,KAAK,EAAO,cAAc,MAAM,CAAC,EAG9B,GAAgB,EAAO,OAAO,CAClC,KAAM,EAAO,OACb,YAAa,EAAO,OACpB,aAAc,EACd,cAAe,EAAO,SAAS,CAAqB,CACtD,CAAC,EAGK,GAAsB,EAAO,MAAM,CACvC,EAAO,OAAO,CAAE,KAAM,EAAO,SAAS,CAAC,OAAQ,MAAO,MAAM,CAAC,CAAE,CAAC,EAChE,EAAO,OAAO,CAAE,KAAM,EAAO,IAAI,MAAM,EAAG,KAAM,EAAO,MAAO,CAAC,CACjE,CAAC,EAEK,GAAoB,EAAO,MAAM,CACrC,EAAO,OAAO,CACZ,KAAM,EAAO,IAAI,SAAS,EAC1B,cAAe,EAAO,MACxB,CAAC,EACD,EAAO,OAAO,CACZ,KAAM,EAAO,IAAI,UAAU,EAC3B,QAAS,EAAO,SAAS,EAAO,SAAS,CAAC,aAAc,SAAS,CAAC,CAAC,CACrE,CAAC,EACD,EAAO,OAAO,CACZ,KAAM,EAAO,IAAI,UAAU,CAC7B,CAAC,CACH,CAAC,EAEK,GAAwB,EAAO,OAAO,CAC1C,OAAQ,EAAO,SAAS,EAAO,MAAM,CACvC,CAAC,EAEK,GAAsB,CAC1B,MAAO,EAAO,OACd,OAAQ,EAAc,CAAkB,EACxC,SAAU,EAAO,MAAM,EAAgB,EACvC,MAAO,EAAc,EAAa,EAClC,YAAa,EAAO,SAAS,EAAmB,EAChD,OAAQ,EAAO,QAAQ,EAAI,EAC3B,WAAY,EAAO,OACnB,YAAa,EAAO,SAAS,EAAO,MAAM,EAC1C,MAAO,EAAO,SAAS,EAAO,MAAM,EACpC,MAAO,EAAO,SAAS,EAAO,MAAM,EACpC,eAAgB,EAAc,EAAO,MAAM,EAC3C,SAAU,EAAO,SAAS,EAAiB,EAC3C,cAAe,EAAO,SAAS,EAAqB,CACtD,EACa,EAAwB,EAAO,OAAO,EAAmB,EAGhE,EAAiB,EAAO,eAC5B,EAAO,OAAO,CACZ,aAAc,EAAa,EAAO,MAAM,EACxC,cAAe,EAAO,SAAS,EAAO,MAAM,EAC5C,4BAA6B,EAAa,EAAO,MAAM,EACvD,wBAAyB,EAAa,EAAO,MAAM,EACnD,gBAAiB,EACf,EAAO,eAAe,EAAO,OAAO,CAAE,oBAAqB,EAAO,SAAS,EAAO,MAAM,CAAE,CAAC,EAAG,CAC5F,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAC7C,CAAC,CACH,EACA,sBAAuB,EACrB,EAAO,eAAe,EAAO,OAAO,CAAE,gBAAiB,EAAO,SAAS,EAAO,MAAM,CAAE,CAAC,EAAG,CACxF,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAC7C,CAAC,CACH,CACF,CAAC,EACD,CAAC,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CAC/C,EAGM,GAAuB,EAAO,OAAO,CACzC,KAAM,EAAO,OACb,GAAI,EAAO,SAAS,EAAO,MAAM,EACjC,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,SAAU,EAAO,SAAS,EAAO,MAAM,EACvC,UAAW,EAAO,SAAS,EAAO,MAAM,EAGxC,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,MAAO,EAAO,SAAS,EAAO,OAAO,EAIrC,YAAa,EAAO,SAAS,EAAO,MAAM,EAC1C,QAAS,EAAO,SAAS,EAAO,OAAO,CACzC,CAAC,EAEK,GAAuB,EAAO,OAAO,CACzC,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,KAAM,EAAO,SAAS,EAAO,MAAM,EACnC,SAAU,EAAO,SAAS,EAAO,MAAM,EACvC,aAAc,EAAO,SAAS,EAAO,MAAM,EAC3C,UAAW,EAAO,SAAS,EAAO,MAAM,EACxC,YAAa,EAAa,EAAO,MAAM,EACvC,cAAe,EAAa,EAAO,MAAM,CAC3C,CAAC,EAEK,GAAiB,EAAO,OAAO,CACnC,KAAM,EAAO,OACb,MAAO,EAAO,SAAS,EAAO,MAAM,EACpC,QAAS,EAAO,SAAS,EAAO,OAAO,CAAE,MAAO,EAAO,SAAS,CAAc,CAAE,CAAC,CAAC,EAClF,cAAe,EAAO,SAAS,EAAoB,EACnD,MAAO,EAAO,SAAS,EAAoB,EAC3C,MAAO,EAAO,SAAS,CAAc,EAKrC,MAAO,EAAO,SACZ,EAAO,OAAO,CAAE,KAAM,EAAO,SAAS,EAAO,MAAM,EAAG,QAAS,EAAO,SAAS,EAAO,MAAM,CAAE,CAAC,CACjG,CACF,CAAC,EAcK,EAAU,EAAe,eASzB,EAA2B,EAE3B,GAAe,CAAE,KAAM,WAAqB,EAC5C,GAAe,CAAE,KAAM,YAAsB,IAAK,IAAc,EAEhE,EAAe,CAAC,EAAgC,IAAiC,CACrF,GAAI,GAAO,OAAS,aAAe,GAAO,OAAS,aAAc,OACjE,GAAI,EAAY,WAAa,EAAG,CAC9B,EAAY,SAAW,EACvB,OAGF,OADA,EAAY,WAAa,EACZ,EAAU,EAAM,UAAU,IAAM,KAAO,GAAe,IAG/D,EAAoB,CAAC,KAAyD,CAAE,UAAW,CAAS,GAEpG,GAAwB,CAAC,IAA+D,CAC5F,IAAM,EAAY,GAAU,UAC5B,GAAI,CAAC,EAAe,SAAS,CAAS,EAAG,OACzC,OAAO,OAAO,EAAU,YAAc,SAAW,EAAU,UAAY,QAGnE,GAA2B,CAAC,IAA+D,CAC/F,IAAM,EAAY,GAAU,UAC5B,GAAI,CAAC,EAAe,SAAS,CAAS,EAAG,OACzC,OAAO,OAAO,EAAU,eAAiB,SAAW,EAAU,aAAe,QAGzE,GAAY,CAAC,EAAgC,EAAsB,KAA4C,CACnH,KAAM,EAAK,KACX,YAAa,EAAK,YAClB,aAAc,EACd,cAAe,EAAa,EAAa,EAAK,KAAK,CACrD,GAEM,GAAkB,CAAC,IACvB,EAAe,gBAAgB,qBAAsB,EAAY,CAC/D,KAAM,KAAO,CAAE,KAAM,MAAgB,GACrC,KAAM,KAAO,CAAE,KAAM,MAAgB,GACrC,SAAU,KAAO,CAAE,KAAM,KAAe,GACxC,KAAM,CAAC,KAAU,CAAE,KAAM,OAAiB,MAAK,EACjD,CAAC,EAEG,EAAkB,CAAC,IAAe,EAAG,QAAQ,kBAAmB,GAAG,EAEnE,GAAgB,CAAC,KAA+C,CACpE,KAAM,WACN,GAAI,EAAgB,EAAK,EAAE,EAC3B,KAAM,EAAK,KACX,MAAO,EAAK,KACd,GAEM,GAAsB,CAAC,KAAqD,CAChF,KAAM,kBACN,GAAI,EAAgB,EAAK,EAAE,EAC3B,KAAM,EAAK,KACX,MAAO,EAAK,KACd,GAKM,GAAuB,CAAC,IAA4D,CACxF,GAAI,IAAS,aAAc,MAAO,yBAClC,GAAI,IAAS,iBAAkB,MAAO,6BACtC,GAAI,IAAS,YAAa,MAAO,wBACjC,QAGI,GAAwB,EAAO,GAAG,yCAAyC,EAAE,SAAU,CAAC,EAAsB,CAClH,IAAM,EAAW,GAAqB,EAAK,IAAI,EAC/C,GAAI,CAAC,EACH,OAAO,MAAO,EAAQ,6EAA6E,EAAK,MAAM,EAGhH,IAAM,EAAU,EAAK,kBAAkB,WAAY,QAAa,EAAK,OAAO,MAC5E,MAAO,CAAE,KAAM,EAAU,YAAa,EAAgB,EAAK,EAAE,EAAG,QAAS,CAAQ,EAClF,EAEK,EAAa,EAAO,GAAG,8BAA8B,EAAE,SAAU,CAAC,EAAiB,CACvF,IAAM,EAAQ,EAAe,eAAe,CAAI,EAChD,GAAI,EAAM,OAAS,kBACjB,MAAO,CACL,KAAM,WACN,OAAQ,CACN,KAAM,SACN,WAAY,kBACZ,KAAM,EAAM,MACd,CACF,EACF,GAAI,CAAC,EAAM,KAAK,WAAW,QAAQ,EACjC,OAAO,MAAO,EAAQ,kDAAkD,EAAK,WAAW,EAC1F,MAAO,CACL,KAAM,QACN,OAAQ,CACN,KAAM,SACN,WAAY,EAAM,KAClB,KAAM,EAAM,MACd,CACF,EACD,EAIK,GAA6B,EAAO,WAAW,SAAU,CAAC,EAAoB,CAClF,GAAI,EAAK,OAAS,OAAQ,MAAO,CAAE,KAAM,OAAiB,KAAM,EAAK,IAAK,EAC1E,OAAO,MAAO,EAAW,CAAE,KAAM,QAAS,UAAW,EAAK,KAAM,KAAM,EAAK,IAAK,SAAU,EAAK,IAAK,CAAC,EACtG,EAEK,GAAyB,EAAO,WAAW,SAAU,CAAC,EAAsB,CAGhF,GAAI,EAAK,OAAO,OAAS,UAAW,OAAO,EAAe,eAAe,CAAI,EAE7E,IAAM,EAAuC,EAAK,OAAO,MACzD,OAAO,MAAO,EAAO,QAAQ,EAAS,EAA0B,EACjE,EAKK,GAA8B,CAAC,IAAwB,CAC3D,IAAM,EAAQ,wEAAwE,KACpF,OAAO,EAAQ,MAAM,EAAE,EAAE,YAAY,CACvC,EACA,GAAI,CAAC,EAAO,MAAO,GACnB,IAAM,EAAQ,OAAO,EAAM,EAAE,EAC7B,GAAI,EAAM,KAAO,OAAQ,OAAO,GAAS,EACzC,GAAI,IAAU,EAAG,OAAO,GAAS,EACjC,OAAO,EAAM,KAAO,QAAa,EAAM,GAAG,QAAU,GAAK,OAAO,EAAM,EAAE,GAAK,GAGzE,GAAsB,CAAC,IAA4C,CACvE,IAAM,EAAO,EAAQ,QAAQ,GAAG,EAAE,EAClC,OAAO,EAAQ,OAAS,aAAe,GAAM,OAAS,aAAe,EAAK,mBAAqB,IAG3F,GAA2B,CAAC,EAAkC,IAAkB,CACpF,IAAM,EAAW,EAAS,EAAQ,GAC5B,EAAO,EAAS,EAAQ,GAC9B,OACE,IAAa,QACb,EAAS,OAAS,WACjB,EAAS,OAAS,QAAU,EAAS,OAAS,QAAU,GAAoB,CAAQ,IACrF,GAAM,OAAS,WACd,IAAS,QAAa,EAAK,OAAS,cAInC,GAAyB,CAAC,EAAkC,IAAkB,CAClF,IAAM,EAAU,IAAI,IACpB,QAAW,KAAW,EAAS,MAAM,EAAG,CAAK,EAC3C,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,EAAQ,OAAS,aAAe,EAAK,OAAS,aAAe,EAAK,mBAAqB,GACzF,EAAQ,IAAI,EAAK,EAAE,EACrB,GAAI,EAAQ,OAAS,QAAU,EAAK,OAAS,cAAe,EAAQ,OAAO,EAAK,EAAE,EAGtF,OAAO,EAAQ,KAAO,GAGlB,GAA0B,EAAO,GAAG,2CAA2C,EAAE,SAAU,CAC/F,EACA,EACA,CAEA,MAAO,CACL,KAAM,SACN,SAHc,MAAO,EAAe,iBAAiB,qBAAsB,CAAO,GAGjE,IAAI,CAAC,KAAU,CAC9B,KAAM,OACN,KAAM,EAAK,KACX,cAAe,EAAa,EAAa,EAAK,KAAK,CACrD,EAAE,CACJ,EACD,EAEK,GAAgB,EAAO,GAAG,iCAAiC,EAAE,SAAU,CAC3E,EACA,EACA,CACA,IAAM,EAA+B,CAAC,EAEtC,QAAY,EAAO,KAAY,EAAQ,SAAS,QAAQ,EAAG,CACzD,GAAI,EAAQ,OAAS,SAAU,CAC7B,GAAI,GAAuB,EAAQ,SAAU,CAAK,EAChD,OAAO,MAAO,EAAQ,uFAAuF,EAC/G,GAAI,GAA4B,CAAO,GAAK,GAAyB,EAAQ,SAAU,CAAK,EAAG,CAC7F,EAAS,KAAK,MAAO,GAAwB,EAAS,CAAW,CAAC,EAClE,SAEF,IAAM,EAAO,MAAO,EAAe,oBAAoB,qBAAsB,CAAO,EAC9E,EAAQ,CAAE,KAAM,OAAiB,KAAM,EAAK,KAAM,cAAe,EAAa,EAAa,EAAK,KAAK,CAAE,EACvG,EAAW,EAAS,GAAG,EAAE,EAC/B,GAAI,GAAU,OAAS,OACrB,EAAS,EAAS,OAAS,GAAK,CAAE,KAAM,OAAQ,QAAS,CAAC,GAAG,EAAS,QAAS,CAAK,CAAE,EACnF,OAAS,KAAK,CAAE,KAAM,OAAQ,QAAS,CAAC,CAAK,CAAE,CAAC,EACrD,SAGF,GAAI,EAAQ,OAAS,OAAQ,CAC3B,IAAM,EAAgC,CAAC,EACvC,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,EAAK,OAAS,OAAQ,CACxB,EAAQ,KAAK,CAAE,KAAM,OAAQ,KAAM,EAAK,KAAM,cAAe,EAAa,EAAa,EAAK,KAAK,CAAE,CAAC,EACpG,SAEF,GAAI,EAAK,OAAS,QAAS,CACzB,EAAQ,KAAK,MAAO,EAAW,CAAI,CAAC,EACpC,SAEF,OAAO,MAAO,EAAe,mBAAmB,qBAAsB,OAAQ,CAAC,OAAQ,OAAO,CAAC,EAEjG,EAAS,KAAK,CAAE,KAAM,OAAQ,SAAQ,CAAC,EACvC,SAGF,GAAI,EAAQ,OAAS,YAAa,CAChC,IAAM,EAAqC,CAAC,EAC5C,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,EAAK,OAAS,OAAQ,CACxB,EAAQ,KAAK,CAAE,KAAM,OAAQ,KAAM,EAAK,KAAM,cAAe,EAAa,EAAa,EAAK,KAAK,CAAE,CAAC,EACpG,SAEF,GAAI,EAAK,OAAS,YAAa,CAI7B,IAAM,EAAY,EAAK,WAAa,GAAsB,EAAK,gBAAgB,EACzE,EAAe,GAAyB,EAAK,gBAAgB,EACnE,GAAI,IAAc,QAAa,IAAiB,OAAW,CACzD,EAAQ,KAAK,CAAE,KAAM,oBAAqB,KAAM,CAAa,CAAC,EAC9D,SAEF,EAAQ,KAAK,CAAE,KAAM,WAAY,SAAU,EAAK,KAAM,WAAU,CAAC,EACjE,SAEF,GAAI,EAAK,OAAS,YAAa,CAC7B,EAAQ,KAAK,EAAK,iBAAmB,GAAoB,CAAI,EAAI,GAAc,CAAI,CAAC,EACpF,SAEF,GAAI,EAAK,OAAS,eAAiB,EAAK,iBAAkB,CACxD,EAAQ,KAAK,MAAO,GAAsB,CAAI,CAAC,EAC/C,SAEF,OAAO,MAAO,EACZ,mGACF,EAEF,EAAS,KAAK,CAAE,KAAM,YAAa,SAAQ,CAAC,EAC5C,SAGF,IAAM,EAAsC,CAAC,EAC7C,QAAW,KAAQ,EAAQ,QAAS,CAClC,GAAI,CAAC,EAAe,gBAAgB,EAAM,CAAC,aAAa,CAAC,EACvD,OAAO,MAAO,EAAe,mBAAmB,qBAAsB,OAAQ,CAAC,aAAa,CAAC,EAC/F,EAAQ,KAAK,CACX,KAAM,cACN,YAAa,EAAgB,EAAK,EAAE,EACpC,QAAS,MAAO,GAAuB,CAAI,EAC3C,SAAU,EAAK,OAAO,OAAS,QAAU,GAAO,OAChD,cAAe,EAAa,EAAa,EAAK,KAAK,CACrD,CAAC,EAEH,IAAM,EAAW,EAAS,GAAG,EAAE,EAC/B,GAAI,GAAU,OAAS,QAAU,EAAS,QAAQ,MAAM,CAAC,IAAU,EAAM,OAAS,aAAa,EAC7F,EAAS,EAAS,OAAS,GAAK,CAAE,KAAM,OAAQ,QAAS,CAAC,GAAG,EAAS,QAAS,GAAG,CAAO,CAAE,EACxF,OAAS,KAAK,CAAE,KAAM,OAAQ,SAAQ,CAAC,EAG9C,OAAO,EACR,EAEK,GAAiB,EAAO,GAAG,kCAAkC,EAAE,SAAU,CAAC,EAAqB,CACnG,IAAM,EAAQ,EAAQ,gBACtB,MAAO,CACL,SAAU,MAAO,GAAgB,GAAO,QAAQ,EAChD,OAAQ,OAAO,GAAO,SAAW,SAAW,EAAM,OAAS,MAC7D,EACD,EAEK,GAAkB,EAAO,GAAG,mCAAmC,EAAE,SAAU,CAAC,EAAgB,CAChG,GAAI,CAAC,EAAe,SAAS,CAAK,EAAG,OACrC,GAAI,EAAM,OAAS,WAAY,CAC7B,IAAM,EACJ,EAAM,UAAY,aACb,aACD,EAAM,UAAY,UACf,UACD,OACR,MAAO,CAAE,KAAM,cAAyB,IAAY,OAAY,CAAC,EAAI,CAAE,SAAQ,CAAG,EAEpF,GAAI,EAAM,OAAS,WAAY,MAAO,CAAE,KAAM,UAAoB,EAClE,GAAI,EAAM,OAAS,UAAW,OAC9B,IAAM,EACJ,OAAO,EAAM,eAAiB,SAC1B,EAAM,aACN,OAAO,EAAM,gBAAkB,SAC7B,EAAM,cACN,OACR,GAAI,IAAW,OACb,OAAO,MAAO,EAAe,eAAe,0DAA0D,EACxG,MAAO,CAAE,KAAM,UAAoB,cAAe,CAAO,EAC1D,EAEK,GAAc,EAAO,GAAG,+BAA+B,EAAE,SAAU,CAAC,EAAqB,CAC7F,IAAM,EAAa,EAAQ,WACrB,EAA0B,EAAQ,MAAM,eAAe,WAIvD,EAAoB,EAAe,CAAwB,EAC3D,EACJ,EAAQ,MAAM,SAAW,EACrB,OACA,EAAQ,MAAM,IAAI,CAAC,IACjB,GACE,EACA,EACA,EAAqB,mBAAmB,EAAK,YAAa,CAAuB,CACnF,CACF,EAEA,EAAa,IAAU,QAAa,CAAC,EAAQ,WAAa,OAAY,MAAO,GAAgB,EAAQ,UAAU,EAC/G,EACJ,EAAQ,OAAO,SAAW,EACtB,OACA,EAAQ,OAAO,IAAI,CAAC,KAAU,CAC5B,KAAM,OACN,KAAM,EAAK,KACX,cAAe,EAAa,EAAa,EAAK,KAAK,CACrD,EAAE,EACF,EAAW,MAAO,GAAc,EAAS,CAAW,EAC1D,GAAI,EAAY,QAAU,EACxB,MAAO,EAAO,WACZ,+BAA+B,EAAY,uDAAuD,gBACpG,EAEF,IAAM,EAAU,MAAO,GAAe,CAAO,EAC7C,MAAO,CACL,MAAO,EAAQ,MAAM,GACrB,SACA,WACA,QACA,YAAa,EACb,OAAQ,GACR,WAAY,GAAY,WAAa,EACrC,YAAa,GAAY,YACzB,MAAO,GAAY,KACnB,MAAO,GAAY,KACnB,eAAgB,GAAY,KAC5B,SAAU,EAAQ,SAClB,cAAe,EAAQ,SAAW,OAAY,OAAY,CAAE,OAAQ,EAAQ,MAAO,CACrF,EACD,EAKK,GAAkB,CAAC,IAAoD,CAC3E,GAAI,IAAW,YAAc,IAAW,iBAAmB,IAAW,aAAc,MAAO,OAC3F,GAAI,IAAW,cAAgB,IAAW,gCAAiC,MAAO,SAClF,GAAI,IAAW,WAAY,MAAO,aAClC,GAAI,IAAW,UAAW,MAAO,iBACjC,MAAO,WASH,EAAW,CAAC,IAAyD,CACzE,GAAI,CAAC,EAAO,OACZ,IAAM,EAAY,EAAM,cAAgB,OAClC,EAAY,EAAM,yBAA2B,OAC7C,EAAa,EAAM,6BAA+B,OAClD,EAAc,EAAe,UAAU,EAAW,EAAW,CAAU,EAC7E,OAAO,IAAI,EAAM,CACf,cACA,aAAc,EAAM,cACpB,qBAAsB,EACtB,qBAAsB,EACtB,sBAAuB,EACvB,gBAAiB,EAAM,uBAAuB,gBAC9C,YAAa,EAAe,YAAY,EAAa,EAAM,cAAe,MAAS,EACnF,iBAAkB,CAAE,UAAW,CAAM,CACvC,CAAC,GAQG,EAAa,CAAC,EAAyB,IAA6B,CACxE,GAAI,CAAC,EAAM,OAAO,EAClB,GAAI,CAAC,EAAO,OAAO,EACnB,IAAM,EAAuB,EAAM,sBAAwB,EAAK,qBAC1D,EAAuB,EAAM,sBAAwB,EAAK,qBAC1D,EAAwB,EAAM,uBAAyB,EAAK,sBAC5D,EAAc,EAAe,UAAU,EAAsB,EAAsB,CAAqB,EACxG,EAAe,EAAM,cAAgB,EAAK,aAC1C,EAAkB,EAAM,iBAAmB,EAAK,gBACtD,OAAO,IAAI,EAAM,CACf,cACA,eACA,uBACA,uBACA,wBACA,kBACA,YAAa,EAAe,YAAY,EAAa,EAAc,MAAS,EAC5E,iBAAkB,CAChB,UAAW,EAAiB,EAAK,kBAAmB,UAAc,EAAM,kBAAmB,SAAY,GAAK,CAAC,CAC/G,CACF,CAAC,GAQG,GAA0E,CAC9E,uBAAwB,aACxB,2BAA4B,iBAC5B,sBAAuB,WACzB,EAEM,GAAyB,CAAC,KAAwD,KAAQ,IAE1F,GAAwB,CAAC,IAA8E,CAC3G,GAAI,CAAC,EAAM,MAAQ,CAAC,GAAuB,EAAM,IAAI,EAAG,OAKxD,IAAM,GAHJ,OAAO,EAAM,UAAY,UAAY,EAAM,UAAY,MAAQ,SAAU,EAAM,QAC3E,OAAQ,EAAM,QAAoC,IAAI,EACtD,IACuB,SAAS,oBAAoB,EAC1D,OAAO,EAAS,WAAW,CACzB,GAAI,EAAM,aAAe,GACzB,KAAM,GAAyB,EAAM,MACrC,OAAQ,EAAU,CAAE,KAAM,QAAS,MAAO,EAAM,OAAQ,EAAI,CAAE,KAAM,OAAQ,MAAO,EAAM,OAAQ,EACjG,iBAAkB,GAGlB,iBAAkB,EAAkB,CAAE,UAAW,EAAM,KAAM,OAAQ,EAAM,OAAQ,CAAC,CACtF,CAAC,GAKG,EAA6B,CAAC,EAE9B,GAAiB,CAAC,EAAoB,IAAsC,CAChF,IAAM,EAAQ,EAAS,EAAM,SAAS,KAAK,EAC3C,MAAO,CAAC,EAAQ,IAAK,EAAO,MAAO,EAAW,EAAM,MAAO,CAAK,CAAE,EAAI,EAAO,CAAS,GAGlF,GAAsB,CAAC,EAAoB,IAAsC,CACrF,IAAM,EAAQ,EAAM,cACpB,GAAI,CAAC,EAAO,MAAO,CAAC,EAAO,CAAS,EAEpC,IAAK,EAAM,OAAS,YAAc,EAAM,OAAS,oBAAsB,EAAM,QAAU,OAAW,CAChG,IAAM,EAAqB,CAAC,EACtB,EAAY,EAAU,UAAU,EAAM,UAAW,CAAM,EAC7D,MAAO,CACL,IACK,EACH,YACA,MAAO,EAAW,MAAM,EAAM,MAAO,EAAM,MAAO,CAChD,GAAI,EAAM,IAAM,OAAO,EAAM,KAAK,EAClC,KAAM,EAAM,MAAQ,GACpB,MACE,EAAM,QAAU,SAAc,CAAC,EAAe,SAAS,EAAM,KAAK,GAAK,OAAO,KAAK,EAAM,KAAK,EAAE,OAAS,GACrG,EAAe,WAAW,EAAM,KAAK,EACrC,OACN,iBAAkB,EAAM,OAAS,iBACnC,CAAC,CACH,EACA,CACE,GAAG,EACH,EAAS,eAAe,CACtB,GAAI,EAAM,IAAM,OAAO,EAAM,KAAK,EAClC,KAAM,EAAM,MAAQ,GACpB,iBAAkB,EAAM,OAAS,kBAAoB,GAAO,MAC9D,CAAC,CACH,CACF,EAGF,GAAI,EAAM,OAAS,QAAU,EAAM,OAAS,OAAW,CACrD,IAAM,EAAqB,CAAC,EACtB,EAAK,QAAQ,EAAM,OAAS,IAC5B,EAAY,EAAU,UAAU,EAAM,UAAW,EAAQ,CAAE,EACjE,MAAO,CACL,IAAK,EAAO,UAAW,EAAM,KAAO,EAAU,UAAU,EAAW,EAAQ,EAAI,EAAM,IAAI,EAAI,CAAU,EACvG,CACF,EAGF,GAAI,EAAM,OAAS,YAAc,EAAM,WAAa,OAAW,CAC7D,IAAM,EAAqB,CAAC,EACtB,EAAK,aAAa,EAAM,OAAS,IACjC,EACJ,EAAM,YAAc,OAAY,OAAY,EAAkB,CAAE,UAAW,EAAM,SAAU,CAAC,EACxF,EAAY,EAAU,eAAe,EAAM,UAAW,EAAQ,EAAI,CAAgB,EACxF,MAAO,CACL,IACK,EACH,UAAW,EAAM,SACb,EAAU,eAAe,EAAW,EAAQ,EAAI,EAAM,SAAU,CAAgB,EAChF,EACJ,oBACE,EAAM,QAAU,QAAa,EAAM,YAAc,OAC7C,EAAM,oBACN,IAAK,EAAM,qBAAsB,EAAM,OAAQ,EAAM,SAAU,CACvE,EACA,CACF,EAMF,GAAI,EAAM,OAAS,qBAAuB,EAAM,OAAS,OAAW,CAClE,IAAM,EAAqB,CAAC,EAC5B,MAAO,CACL,IACK,EACH,UAAW,EAAU,eACnB,EAAM,UACN,EACA,aAAa,EAAM,OAAS,IAC5B,EAAkB,CAAE,aAAc,EAAM,IAAK,CAAC,CAChD,CACF,EACA,CACF,EAGF,IAAM,EAAS,GAAsB,CAAK,EAC1C,GAAI,CAAC,EAAQ,MAAO,CAAC,EAAO,CAAS,EACrC,IAAM,EAAqB,CAAC,EAC5B,MAAO,CAAC,IAAK,EAAO,UAAW,EAAU,UAAU,EAAM,UAAW,CAAM,CAAE,EAAG,CAAC,GAAG,EAAQ,CAAM,CAAC,GAG9F,GAAsB,EAAO,GAAG,uCAAuC,EAAE,SAAU,CACvF,EACA,EACA,CACA,IAAM,EAAQ,EAAM,MAEpB,GAAI,GAAO,OAAS,cAAgB,EAAM,KAAM,CAC9C,IAAM,EAAqB,CAAC,EAC5B,MAAO,CACL,IAAK,EAAO,UAAW,EAAU,UAAU,EAAM,UAAW,EAAQ,QAAQ,EAAM,OAAS,IAAK,EAAM,IAAI,CAAE,EAC5G,CACF,EAGF,GAAI,GAAO,OAAS,kBAAoB,EAAM,SAAU,CACtD,IAAM,EAAqB,CAAC,EAC5B,MAAO,CACL,IACK,EACH,UAAW,EAAU,eAAe,EAAM,UAAW,EAAQ,aAAa,EAAM,OAAS,IAAK,EAAM,QAAQ,CAC9G,EACA,CACF,EAGF,GAAI,GAAO,OAAS,mBAAqB,EAAM,UAAW,CACxD,IAAM,EAAQ,EAAM,OAAS,EAC7B,MAAO,CACL,IACK,EACH,oBAAqB,IAAK,EAAM,qBAAsB,GAAQ,EAAM,SAAU,CAChF,EACA,CACF,EAGF,GAAI,GAAO,OAAS,oBAAsB,EAAM,QAAU,OAAW,CACnE,GAAI,CAAC,EAAM,aAAc,MAAO,CAAC,EAAO,CAAS,EACjD,GAAI,CAAC,EAAM,MAAM,EAAM,OAAQ,MAAO,CAAC,EAAO,CAAS,EACvD,IAAM,EAAS,EAAW,eACxB,EACA,EAAM,MACN,EAAM,MACN,EAAM,aACN,iEACF,EACA,GAAI,EAAW,QAAQ,CAAM,EAAG,OAAO,MAAO,EAC9C,IAAM,EAAqB,CAAC,EACtB,EAAY,EAAO,OAAO,OAAS,EAAU,UAAU,EAAM,UAAW,CAAM,EAAI,EAAM,UAE9F,OADA,EAAO,KAAK,GAAG,EAAO,MAAM,EACrB,CAAC,IAAK,EAAO,YAAW,MAAO,EAAO,KAAM,EAAG,CAAM,EAG9D,MAAO,CAAC,EAAO,CAAS,EACzB,EAEK,GAAqB,EAAO,GAAG,sCAAsC,EAAE,SAAU,CACrF,EACA,EACA,CACA,GAAI,EAAM,QAAU,OAAW,MAAO,CAAC,EAAO,CAAS,EACvD,IAAM,EAAS,MAAO,EAAW,OAAO,EAAS,EAAM,MAAO,EAAM,KAAK,EACnE,EAAqB,CAAC,EACtB,EAAe,EAAO,QAAU,CAAC,EACjC,EAAY,EAAM,oBAAoB,EAAM,OAC5C,EAAY,EAAa,OAC3B,EAAU,UAAU,EAAM,UAAW,CAAM,EAC3C,EAAU,aACR,EAAU,QAAQ,EAAM,UAAW,EAAQ,QAAQ,EAAM,OAAO,EAChE,EACA,aAAa,EAAM,QACnB,IAAc,OAAY,OAAY,EAAkB,CAAE,WAAU,CAAC,CACvE,EACJ,EAAO,KAAK,GAAG,CAAY,EAC3B,IAAM,EAAsB,IAAK,EAAM,mBAAoB,EAE3D,OADA,OAAO,EAAoB,EAAM,OAC1B,CAAC,IAAK,EAAO,YAAW,MAAO,EAAO,MAAO,qBAAoB,EAAG,CAAM,EAClF,EAEK,GAAiB,CAAC,EAAoB,IAAsC,CAChF,IAAM,EAAQ,EAAW,EAAM,MAAO,EAAS,EAAM,KAAK,CAAC,EAC3D,MAAO,CACL,IACK,EACH,QACA,cAAe,CACb,OAAQ,CACN,WAAY,GAAgB,EAAM,OAAO,WAAW,EACpD,IAAK,EAAM,OAAO,aAAe,MACnC,EACA,iBACE,EAAM,OAAO,gBAAkB,MAAQ,EAAM,OAAO,gBAAkB,OAClE,OACA,EAAkB,CAAE,aAAc,EAAM,MAAM,aAAc,CAAC,CACrE,CACF,EACA,CACF,GAGI,GAAgB,EAAO,GAAG,iCAAiC,EAAE,SAAU,CAAC,EAAoB,CAChG,IAAM,EAAS,MAAO,EAAW,UAAU,EAAS,EAAM,KAAK,EACzD,EAAqB,CAAC,EACtB,EAAY,EAAO,OAAO,OAAS,EAAU,UAAU,EAAM,UAAW,CAAM,EAAI,EAAM,UAC9F,EAAO,KAAK,GAAG,EAAO,MAAM,EAC5B,IAAM,EAAW,EAAU,OAAO,EAAW,EAAQ,CACnD,OAAQ,EAAM,eAAe,QAAU,CACrC,WAAY,UACZ,IAAK,MACP,EACA,MAAO,EAAM,MACb,iBAAkB,EAAM,eAAe,gBACzC,CAAC,EACD,MAAO,CAAC,IAAK,EAAO,UAAW,EAAU,MAAO,EAAO,KAAM,EAAG,CAAM,EACvE,EAIK,GAAuB,CAAC,IAAkC,CAC9D,IAAM,EAAO,EAAM,OAAO,KACpB,EAAU,EAAM,OAAO,QAC7B,GAAI,GAAQ,EAAS,MAAO,GAAG,MAAS,IACxC,OAAO,GAAW,GAAQ,mCAGtB,GAAU,CAAC,IACf,IAAI,EAAQ,CACV,OAAQ,EACR,OAAQ,SACR,OAAQ,EAAwB,CAAE,QAAS,GAAqB,CAAK,EAAG,KAAM,EAAM,OAAO,IAAK,CAAC,CACnG,CAAC,EAEG,GAAO,CAAC,EAAoB,IAA0B,CAC1D,GAAI,EAAM,OAAS,gBAAiB,OAAO,EAAO,QAAQ,GAAe,EAAO,CAAK,CAAC,EACtF,GAAI,EAAM,OAAS,sBAAuB,OAAO,EAAO,QAAQ,GAAoB,EAAO,CAAK,CAAC,EACjG,GAAI,EAAM,OAAS,sBAAuB,OAAO,GAAoB,EAAO,CAAK,EACjF,GAAI,EAAM,OAAS,qBAAsB,OAAO,GAAmB,EAAO,CAAK,EAC/E,GAAI,EAAM,OAAS,gBAAiB,OAAO,EAAO,QAAQ,GAAe,EAAO,CAAK,CAAC,EACtF,GAAI,EAAM,OAAS,eAAgB,OAAO,GAAc,CAAK,EAC7D,GAAI,EAAM,OAAS,QAAS,OAAO,GAAQ,CAAK,EAChD,OAAO,EAAO,QAAoB,CAAC,EAAO,CAAS,CAAC,GAWzC,GAAW,EAAS,KAAK,CACpC,GAAI,EACJ,KAAM,CACJ,OAAQ,EACR,KAAM,EACR,EACA,OAAQ,CACN,MAAO,EAAS,UAAU,EAAc,EACxC,QAAS,KAAO,CACd,MAAO,EAAW,MAAc,EAChC,oBAAqB,CAAC,EACtB,UAAW,EAAU,QAAQ,CAC/B,GACA,OACF,CACF,CAAC,EAEY,GAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,SAAU,YACV,oBAAqB,YACrB,YACA,SAAU,EAAS,KAAK,EAAM,CAAE,QAAS,CAAiB,CAAC,EAC3D,KAAM,EAAK,KACX,UACA,QAAS,KAAO,CAAE,oBAAqB,YAAa,EACtD,CAAC", | ||
| "debugId": "E2F7E556908E00E264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/prompt.shared.ts"], | ||
| "sourcesContent": [ | ||
| "// Pure state machine for the prompt input.\n//\n// Handles history ring navigation and prompt text helpers. All functions are\n// pure -- they take state in and return new state out, with no side effects.\n//\n// The history ring (PromptHistoryState) stores past prompts and tracks\n// the current browse position. When the user arrows up at cursor offset 0,\n// the current draft is saved and history begins. Arrowing past the end\n// restores the draft.\nexport { displayCharAt, displaySlice, mentionTriggerIndex, slashTriggerIndex } from \"../prompt/display\"\nimport { stringWidth } from \"../util/string-width\"\nimport type { RunPrompt } from \"./types\"\n\nconst HISTORY_LIMIT = 200\n\nexport type PromptHistoryState = {\n items: RunPrompt[]\n index: number | null\n draft: string\n}\n\nexport type PromptMove = {\n state: PromptHistoryState\n text?: string\n cursor?: number\n apply: boolean\n}\n\nexport function promptCopy(prompt: RunPrompt): RunPrompt {\n return {\n text: prompt.text,\n parts: structuredClone(prompt.parts),\n ...(prompt.mode ? { mode: prompt.mode } : {}),\n ...(prompt.command ? { command: prompt.command } : {}),\n }\n}\n\nexport function promptSame(a: RunPrompt, b: RunPrompt): boolean {\n return (\n a.mode === b.mode &&\n a.text === b.text &&\n JSON.stringify(a.parts) === JSON.stringify(b.parts) &&\n JSON.stringify(a.command) === JSON.stringify(b.command)\n )\n}\n\nexport function isExitCommand(input: string): boolean {\n const text = input.trim().toLowerCase()\n return text === \"/exit\" || text === \"/quit\" || text === \":q\"\n}\n\nexport function isNewCommand(input: string): boolean {\n return input.trim().toLowerCase() === \"/new\"\n}\n\nexport function isCompactCommand(input: string): boolean {\n return input.trim().toLowerCase() === \"/compact\"\n}\n\nexport function createPromptHistory(items?: RunPrompt[]): PromptHistoryState {\n const list = (items ?? []).filter((item) => item.text.trim().length > 0).map(promptCopy)\n const next: RunPrompt[] = []\n for (const item of list) {\n if (next.length > 0 && promptSame(next[next.length - 1], item)) {\n continue\n }\n\n next.push(item)\n }\n\n return {\n items: next.slice(-HISTORY_LIMIT),\n index: null,\n draft: \"\",\n }\n}\n\nexport function pushPromptHistory(state: PromptHistoryState, prompt: RunPrompt): PromptHistoryState {\n if (!prompt.text.trim()) {\n return state\n }\n\n const next = promptCopy(prompt)\n if (state.items[state.items.length - 1] && promptSame(state.items[state.items.length - 1], next)) {\n return {\n ...state,\n index: null,\n draft: \"\",\n }\n }\n\n const items = [...state.items, next].slice(-HISTORY_LIMIT)\n return {\n ...state,\n items,\n index: null,\n draft: \"\",\n }\n}\n\nexport function movePromptHistory(state: PromptHistoryState, dir: -1 | 1, text: string, cursor: number): PromptMove {\n if (state.items.length === 0) {\n return { state, apply: false }\n }\n\n if (dir === -1 && cursor !== 0) {\n return { state, apply: false }\n }\n\n if (dir === 1 && cursor !== stringWidth(text)) {\n return { state, apply: false }\n }\n\n if (state.index === null) {\n if (dir === 1) {\n return { state, apply: false }\n }\n\n const idx = state.items.length - 1\n return {\n state: {\n ...state,\n index: idx,\n draft: text,\n },\n text: state.items[idx].text,\n cursor: 0,\n apply: true,\n }\n }\n\n const idx = state.index + dir\n if (idx < 0) {\n return { state, apply: false }\n }\n\n if (idx >= state.items.length) {\n return {\n state: {\n ...state,\n index: null,\n },\n text: state.draft,\n cursor: stringWidth(state.draft),\n apply: true,\n }\n }\n\n return {\n state: {\n ...state,\n index: idx,\n },\n text: state.items[idx].text,\n cursor: dir === -1 ? 0 : stringWidth(state.items[idx].text),\n apply: true,\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAaA,IAAM,EAAgB,IAef,SAAS,CAAU,CAAC,EAA8B,CACvD,MAAO,CACL,KAAM,EAAO,KACb,MAAO,gBAAgB,EAAO,KAAK,KAC/B,EAAO,KAAO,CAAE,KAAM,EAAO,IAAK,EAAI,CAAC,KACvC,EAAO,QAAU,CAAE,QAAS,EAAO,OAAQ,EAAI,CAAC,CACtD,EAGK,SAAS,CAAU,CAAC,EAAc,EAAuB,CAC9D,OACE,EAAE,OAAS,EAAE,MACb,EAAE,OAAS,EAAE,MACb,KAAK,UAAU,EAAE,KAAK,IAAM,KAAK,UAAU,EAAE,KAAK,GAClD,KAAK,UAAU,EAAE,OAAO,IAAM,KAAK,UAAU,EAAE,OAAO,EAInD,SAAS,CAAa,CAAC,EAAwB,CACpD,IAAM,EAAO,EAAM,KAAK,EAAE,YAAY,EACtC,OAAO,IAAS,SAAW,IAAS,SAAW,IAAS,KAGnD,SAAS,CAAY,CAAC,EAAwB,CACnD,OAAO,EAAM,KAAK,EAAE,YAAY,IAAM,OAGjC,SAAS,CAAgB,CAAC,EAAwB,CACvD,OAAO,EAAM,KAAK,EAAE,YAAY,IAAM,WAGjC,SAAS,CAAmB,CAAC,EAAyC,CAC3E,IAAM,GAAQ,GAAS,CAAC,GAAG,OAAO,CAAC,IAAS,EAAK,KAAK,KAAK,EAAE,OAAS,CAAC,EAAE,IAAI,CAAU,EACjF,EAAoB,CAAC,EAC3B,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,GAAK,EAAW,EAAK,EAAK,OAAS,GAAI,CAAI,EAC3D,SAGF,EAAK,KAAK,CAAI,EAGhB,MAAO,CACL,MAAO,EAAK,MAAM,CAAC,CAAa,EAChC,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAuC,CAClG,GAAI,CAAC,EAAO,KAAK,KAAK,EACpB,OAAO,EAGT,IAAM,EAAO,EAAW,CAAM,EAC9B,GAAI,EAAM,MAAM,EAAM,MAAM,OAAS,IAAM,EAAW,EAAM,MAAM,EAAM,MAAM,OAAS,GAAI,CAAI,EAC7F,MAAO,IACF,EACH,MAAO,KACP,MAAO,EACT,EAGF,IAAM,EAAQ,CAAC,GAAG,EAAM,MAAO,CAAI,EAAE,MAAM,CAAC,CAAa,EACzD,MAAO,IACF,EACH,QACA,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAa,EAAc,EAA4B,CAClH,GAAI,EAAM,MAAM,SAAW,EACzB,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,IAAM,IAAW,EAC3B,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,GAAK,IAAW,EAAY,CAAI,EAC1C,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,EAAM,QAAU,KAAM,CACxB,GAAI,IAAQ,EACV,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,IAAM,EAAM,EAAM,MAAM,OAAS,EACjC,MAAO,CACL,MAAO,IACF,EACH,MAAO,EACP,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,EACR,MAAO,EACT,EAGF,IAAM,EAAM,EAAM,MAAQ,EAC1B,GAAI,EAAM,EACR,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,GAAO,EAAM,MAAM,OACrB,MAAO,CACL,MAAO,IACF,EACH,MAAO,IACT,EACA,KAAM,EAAM,MACZ,OAAQ,EAAY,EAAM,KAAK,EAC/B,MAAO,EACT,EAGF,MAAO,CACL,MAAO,IACF,EACH,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,IAAQ,GAAK,EAAI,EAAY,EAAM,MAAM,GAAK,IAAI,EAC1D,MAAO,EACT", | ||
| "debugId": "E3C0B15A595DEA5064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/azure.ts"], | ||
| "sourcesContent": [ | ||
| "import { Headers } from \"effect/unstable/http\"\nimport { Auth } from \"../route/auth.js\"\nimport { type AtLeastOne, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport * as OpenAIResponses from \"../protocols/openai-responses.js\"\nimport { ProviderShared } from \"../protocols/shared.js\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"azure\")\nconst routeAuth = Auth.remove(\"authorization\")\nconst RESPONSES_WEBSOCKET_ROTATE_AFTER_MS = 55 * 60 * 1000\n\n// Azure needs the customer's resource URL; supply either `resourceName`\n// (helper builds the URL) or `baseURL` directly.\ntype AzureURL = AtLeastOne<{ readonly resourceName: string; readonly baseURL: string }>\n\nexport type LanguageModelOptions = AzureURL &\n RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly apiVersion?: string\n readonly queryParams?: Record<string, string>\n readonly useDeploymentBasedUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\nexport type Config = LanguageModelOptions\n\nexport type Settings = ProviderPackage.Settings &\n AzureURL & {\n readonly apiKey?: string\n readonly apiVersion?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly useDeploymentBasedUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nconst resourceBaseURL = (resourceName: string) => `https://${resourceName.trim()}.openai.azure.com/openai`\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"azure-openai-responses\",\n provider: id,\n auth: routeAuth,\n transport: OpenAIResponses.channelTransport({\n id: \"azure-openai-responses\",\n name: \"Azure OpenAI Responses\",\n rotateAfterMs: RESPONSES_WEBSOCKET_ROTATE_AFTER_MS,\n enabled: (value) => {\n const url = new URL(value)\n return (\n url.protocol === \"https:\" &&\n url.hostname.endsWith(\".openai.azure.com\") &&\n url.pathname.endsWith(\"/openai/v1/responses\") &&\n url.searchParams.get(\"api-version\") === \"v1\"\n )\n },\n url: (value) => {\n const url = new URL(value)\n url.searchParams.delete(\"api-version\")\n return url.toString()\n },\n headers: (headers) => {\n const apiKey = headers[\"api-key\"]\n if (!apiKey) return headers\n return Headers.remove(Headers.set(headers, \"authorization\", `Bearer ${apiKey}`), \"api-key\")\n },\n }),\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"azure-openai-chat\",\n provider: id,\n auth: routeAuth,\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst defaults = (input: Config) => {\n const {\n apiKey: _,\n apiVersion: _apiVersion,\n resourceName: _resourceName,\n useDeploymentBasedUrls: _useDeploymentBasedUrls,\n baseURL: _baseURL,\n queryParams: _queryParams,\n ...rest\n } = input\n if (\"auth\" in rest) {\n const { auth: _, ...withoutAuth } = rest\n return withoutAuth\n }\n return rest\n}\n\nconst auth = (input: Config) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.remove(\"authorization\").andThen(\n Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"AZURE_OPENAI_API_KEY\"))\n .pipe(Auth.header(\"api-key\")),\n )\n}\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config, modelID: string | ModelID) =>\n route.with({\n auth: auth(input),\n endpoint: endpoint(input, modelID),\n })\n\nfunction endpoint(input: Config, modelID: string | ModelID) {\n const baseURL = ProviderShared.trimBaseUrl(input.baseURL ?? resourceBaseURL(input.resourceName!))\n const query = { \"api-version\": input.apiVersion ?? \"v1\", ...input.queryParams }\n\n if (input.useDeploymentBasedUrls) return { baseURL: `${baseURL}/deployments/${modelID}`, query }\n if (input.baseURL !== undefined && !new URL(input.baseURL).hostname.endsWith(\".openai.azure.com\")) {\n return { baseURL, query: input.queryParams }\n }\n return { baseURL: `${baseURL}/v1`, query }\n}\n\nexport const configure = (input: Config) => {\n const modelDefaults = defaults(input)\n\n const responses = (modelID: string | ModelID) =>\n configuredRoute(responsesRoute, input, modelID)\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n\n const chat = (modelID: string | ModelID) =>\n configuredRoute(chatRoute, input, modelID)\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n\n return {\n id,\n model: responses,\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nconst config = (settings: Settings): Config => {\n const common = {\n apiKey: settings.apiKey,\n apiVersion: settings.apiVersion,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n useDeploymentBasedUrls: settings.useDeploymentBasedUrls,\n }\n if (settings.baseURL !== undefined) return { ...common, baseURL: settings.baseURL }\n if (settings.resourceName !== undefined) return { ...common, resourceName: settings.resourceName }\n throw new Error(\"Azure requires resourceName or baseURL\")\n}\n\nexport const responsesModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).responses(modelID)\nexport const chatModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).chat(modelID)\nexport const model = responsesModel\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E190E87FA5C1CEAD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/durable-event-manifest.ts"], | ||
| "sourcesContent": [ | ||
| "export * as DurableEventManifest from \"./durable-event-manifest.js\"\n\nimport { Event } from \"./event.js\"\nimport { Worktree } from \"./worktree.js\"\nimport { SessionEvent } from \"./session-event.js\"\n\nexport const Durable = Event.durableMap([...SessionEvent.DurableDefinitions, Worktree.Event.Resolved])\n" | ||
| ], | ||
| "mappings": ";4JAMO,IAAM,EAAU,EAAM,WAAW,CAAC,GAAG,EAAa,mBAAoB,EAAS,MAAM,QAAQ,CAAC", | ||
| "debugId": "3D58FD9843F012AF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, type McpServer } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.list,\n Effect.fn(\"cli.mcp.list\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.mcp.list({ location: { directory: process.cwd() } }))\n const servers = response.data.toSorted((a, b) => a.name.localeCompare(b.name))\n if (servers.length === 0) {\n process.stdout.write(\"No MCP servers configured\" + EOL)\n return\n }\n const width = Math.max(...servers.map((server) => server.name.length))\n const lines = servers.map(\n (server) => `${icon(server.status)} ${server.name.padEnd(width)} ${describe(server.status)}`,\n )\n process.stdout.write(lines.join(EOL) + EOL)\n }),\n)\n\nfunction icon(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"connected\":\n return \"✓\"\n case \"needs_auth\":\n return \"⚠\"\n case \"failed\":\n return \"✗\"\n default:\n return \"○\"\n }\n}\n\nfunction describe(status: McpServer[\"status\"]) {\n switch (status.status) {\n case \"needs_auth\":\n return \"needs authentication\"\n case \"failed\":\n return `failed: ${status.error}`\n default:\n return status.status\n }\n}\n" | ||
| ], | ||
| "mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,EAAG,CACrC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,GADW,MAAO,EAAO,QAAQ,IAAM,EAAO,IAAI,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,GAC/E,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC7E,GAAI,EAAQ,SAAW,EAAG,CACxB,QAAQ,OAAO,MAAM,4BAA8B,CAAG,EACtD,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAQ,IAAI,CAAC,IAAW,EAAO,KAAK,MAAM,CAAC,EAC/D,EAAQ,EAAQ,IACpB,CAAC,IAAW,GAAG,EAAK,EAAO,MAAM,KAAK,EAAO,KAAK,OAAO,CAAK,MAAM,EAAS,EAAO,MAAM,GAC5F,EACA,QAAQ,OAAO,MAAM,EAAM,KAAK,CAAG,EAAI,CAAG,EAC3C,CACH,EAEA,SAAS,CAAI,CAAC,EAA6B,CACzC,OAAQ,EAAO,YACR,YACH,MAAO,aACJ,aACH,MAAO,aACJ,SACH,MAAO,iBAEP,MAAO,UAIb,SAAS,CAAQ,CAAC,EAA6B,CAC7C,OAAQ,EAAO,YACR,aACH,MAAO,2BACJ,SACH,MAAO,WAAW,EAAO,gBAEzB,OAAO,EAAO", | ||
| "debugId": "1DD422768CE75DBE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/bedrock-auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { AwsV4Signer } from \"aws4fetch\"\nimport { Effect } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Auth, type AuthInput } from \"../../route/auth.js\"\nimport { ProviderShared } from \"../shared.js\"\n\n/**\n * AWS credentials for SigV4 signing. Bedrock also supports Bearer API key auth,\n * which provider facades configure as route auth instead of SigV4. STS-vended\n * credentials should be refreshed by the consumer (rebuild the model) before\n * they expire; the route does not refresh.\n */\nexport interface Credentials {\n readonly region: string\n readonly accessKeyId: string\n readonly secretAccessKey: string\n readonly sessionToken?: string\n}\n\nconst signRequest = (input: {\n readonly url: string\n readonly body: string\n readonly headers: Headers.Headers\n readonly credentials: Credentials\n readonly service: string\n readonly name: string\n}) =>\n Effect.tryPromise({\n try: async () => {\n const signed = await new AwsV4Signer({\n url: input.url,\n method: \"POST\",\n headers: Object.entries(input.headers),\n body: input.body,\n region: input.credentials.region,\n accessKeyId: input.credentials.accessKeyId,\n secretAccessKey: input.credentials.secretAccessKey,\n sessionToken: input.credentials.sessionToken,\n service: input.service,\n }).sign()\n return Object.fromEntries(signed.headers.entries())\n },\n catch: (error) =>\n ProviderShared.invalidRequest(\n `${input.name} SigV4 signing failed: ${error instanceof Error ? error.message : String(error)}`,\n ),\n })\n\n/** Sign the exact JSON bytes with SigV4 using credentials configured on the route. */\nexport const sigV4 = (\n credentials: Credentials | undefined,\n options: { readonly service?: string; readonly name?: string } = {},\n) =>\n Auth.custom((input: AuthInput) => {\n return Effect.gen(function* () {\n if (!credentials) {\n return yield* ProviderShared.invalidRequest(\n `${options.name ?? \"Bedrock Converse\"} requires either route bearer auth or AWS credentials configured on the route`,\n )\n }\n const headersForSigning = Headers.set(input.headers, \"content-type\", \"application/json\")\n const signed = yield* signRequest({\n url: input.url,\n body: input.body,\n headers: headersForSigning,\n credentials,\n service: options.service ?? \"bedrock\",\n name: options.name ?? \"Bedrock Converse\",\n })\n return Headers.setAll(headersForSigning, signed)\n })\n })\n\n/** Bedrock route auth defaults to SigV4 and expects credentials from route configuration. */\nexport const auth = sigV4(undefined)\n\nexport * as BedrockAuth from \"./bedrock-auth.js\"\n" | ||
| ], | ||
| "mappings": ";qUAmBA,IAAM,EAAc,CAAC,IAQnB,EAAO,WAAW,CAChB,IAAK,SAAY,CACf,IAAM,EAAS,MAAM,IAAI,EAAY,CACnC,IAAK,EAAM,IACX,OAAQ,OACR,QAAS,OAAO,QAAQ,EAAM,OAAO,EACrC,KAAM,EAAM,KACZ,OAAQ,EAAM,YAAY,OAC1B,YAAa,EAAM,YAAY,YAC/B,gBAAiB,EAAM,YAAY,gBACnC,aAAc,EAAM,YAAY,aAChC,QAAS,EAAM,OACjB,CAAC,EAAE,KAAK,EACR,OAAO,OAAO,YAAY,EAAO,QAAQ,QAAQ,CAAC,GAEpD,MAAO,CAAC,IACN,EAAe,eACb,GAAG,EAAM,8BAA8B,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAC9F,CACJ,CAAC,EAGU,EAAQ,CACnB,EACA,EAAiE,CAAC,IAElE,EAAK,OAAO,CAAC,IACJ,EAAO,IAAI,SAAU,EAAG,CAC7B,GAAI,CAAC,EACH,OAAO,MAAO,EAAe,eAC3B,GAAG,EAAQ,MAAQ,iGACrB,EAEF,IAAM,EAAoB,EAAQ,IAAI,EAAM,QAAS,eAAgB,kBAAkB,EACjF,EAAS,MAAO,EAAY,CAChC,IAAK,EAAM,IACX,KAAM,EAAM,KACZ,QAAS,EACT,cACA,QAAS,EAAQ,SAAW,UAC5B,KAAM,EAAQ,MAAQ,kBACxB,CAAC,EACD,OAAO,EAAQ,OAAO,EAAmB,CAAM,EAChD,CACF,EAGU,EAAO,EAAM,MAAS", | ||
| "debugId": "7773E0A9E5FEB01664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-options.ts"], | ||
| "sourcesContent": [ | ||
| "import { mergeProviderOptions, type ProviderOptions } from \"../schema/index.js\"\nimport type { OpenResponsesOptionsInput } from \"./open-responses-options.js\"\n\nexport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options.js\"\n\nexport type OpenAIOptionsInput = OpenResponsesOptionsInput\n\nexport type OpenAIProviderOptionsInput = OpenAIOptionsInput\n\nconst definedEntries = (input: Record<string, unknown>) =>\n Object.entries(input).filter((entry) => entry[1] !== undefined)\n\nconst openAIProviderOptions = (options: OpenAIOptionsInput | undefined): ProviderOptions | undefined => {\n const result = Object.fromEntries(\n definedEntries({\n store: options?.store,\n reasoningEffort: options?.reasoningEffort,\n reasoningSummary: options?.reasoningSummary,\n include: options?.include,\n textVerbosity: options?.textVerbosity,\n serviceTier: options?.serviceTier,\n }),\n )\n if (Object.keys(result).length === 0) return undefined\n return result\n}\n\nexport const gpt5DefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined => {\n const id = modelID.toLowerCase()\n if (!id.includes(\"gpt-5\") || id.includes(\"gpt-5-chat\") || id.includes(\"gpt-5-pro\")) return undefined\n return openAIProviderOptions({\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n // GPT-5 reasoning models are configured stateless (`store: false`) by\n // `openAIDefaultOptions` below, so the only way a follow-up turn can\n // carry reasoning state is via the encrypted reasoning include. Without\n // this, callers using the default model facade get reasoning summaries\n // they cannot replay statelessly.\n include: [\"reasoning.encrypted_content\"],\n textVerbosity:\n options.textVerbosity === true && id.includes(\"gpt-5.\") && !id.includes(\"codex\") && !id.includes(\"-chat\")\n ? \"low\"\n : undefined,\n })\n}\n\nexport const openAIDefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined =>\n mergeProviderOptions(openAIProviderOptions({ store: false }), gpt5DefaultOptions(modelID, options))\n\nexport const withOpenAIOptions = <Options extends { readonly providerOptions?: OpenAIProviderOptionsInput }>(\n modelID: string,\n options: Options,\n defaults: { readonly textVerbosity?: boolean } = {},\n): Omit<Options, \"providerOptions\"> & { readonly providerOptions?: ProviderOptions } => {\n return {\n ...options,\n providerOptions: mergeProviderOptions(openAIDefaultOptions(modelID, defaults), options.providerOptions),\n }\n}\n\nexport * as OpenAIProviderOptions from \"./openai-options.js\"\n" | ||
| ], | ||
| "mappings": ";oDASA,IAAM,EAAiB,CAAC,IACtB,OAAO,QAAQ,CAAK,EAAE,OAAO,CAAC,IAAU,EAAM,KAAO,MAAS,EAE1D,EAAwB,CAAC,IAAyE,CACtG,IAAM,EAAS,OAAO,YACpB,EAAe,CACb,MAAO,GAAS,MAChB,gBAAiB,GAAS,gBAC1B,iBAAkB,GAAS,iBAC3B,QAAS,GAAS,QAClB,cAAe,GAAS,cACxB,YAAa,GAAS,WACxB,CAAC,CACH,EACA,GAAI,OAAO,KAAK,CAAM,EAAE,SAAW,EAAG,OACtC,OAAO,GAGI,EAAqB,CAChC,EACA,EAAgD,CAAC,IACjB,CAChC,IAAM,EAAK,EAAQ,YAAY,EAC/B,GAAI,CAAC,EAAG,SAAS,OAAO,GAAK,EAAG,SAAS,YAAY,GAAK,EAAG,SAAS,WAAW,EAAG,OACpF,OAAO,EAAsB,CAC3B,gBAAiB,SACjB,iBAAkB,OAMlB,QAAS,CAAC,6BAA6B,EACvC,cACE,EAAQ,gBAAkB,IAAQ,EAAG,SAAS,QAAQ,GAAK,CAAC,EAAG,SAAS,OAAO,GAAK,CAAC,EAAG,SAAS,OAAO,EACpG,MACA,MACR,CAAC,GAGU,EAAuB,CAClC,EACA,EAAgD,CAAC,IAEjD,EAAqB,EAAsB,CAAE,MAAO,EAAM,CAAC,EAAG,EAAmB,EAAS,CAAO,CAAC,EAEvF,EAAoB,CAC/B,EACA,EACA,EAAiD,CAAC,KAE3C,IACF,EACH,gBAAiB,EAAqB,EAAqB,EAAS,CAAQ,EAAG,EAAQ,eAAe,CACxG", | ||
| "debugId": "134FAB1D74B6E21E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { autocomplete, intro, outro, spinner } from \"@clack/prompts\"\nimport { Effect, Option } from \"effect\"\nimport type { IntegrationInfo } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { handlePromptErrors, prompt, requireInteractive } from \"../../../ui/prompt\"\nimport { createClient, loadIntegrations, location, request, resolveIntegration } from \"./shared\"\n\nexport default Runtime.handler(\n Commands.commands.auth.commands.logout,\n Effect.fn(\"cli.auth.logout\")((input) =>\n logout({\n target: Option.getOrUndefined(input.target),\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n }).pipe(handlePromptErrors),\n ),\n)\n\nconst logout = Effect.fn(\"cli.auth.logout.run\")(function* (input: {\n target?: string\n server?: string\n standalone: boolean\n}) {\n if (!input.target)\n yield* requireInteractive(\"Pass an integration ID or name when running without an interactive terminal\")\n intro(\"Remove credential\")\n const client = yield* createClient({ server: input.server, standalone: input.standalone })\n const integrations = yield* loadIntegrations(client)\n const integration = yield* chooseIntegration(integrations, input.target)\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n const environment = integration.connections\n .filter((connection) => connection.type === \"env\")\n .map((connection) => connection.name)\n if (environment.length) {\n yield* Effect.fail(\n new Error(\n `${integration.name} is authenticated through ${environment.join(\", \")}; unset the environment variable to disconnect`,\n ),\n )\n }\n yield* Effect.fail(new Error(`No stored credentials for ${integration.name}`))\n }\n const progress = spinner()\n progress.start(\"Removing credential...\")\n yield* Effect.forEach(\n credentials,\n (connection) =>\n request((signal) => client.credential.remove({ credentialID: connection.id, location }, { signal })),\n { concurrency: \"unbounded\", discard: true },\n ).pipe(\n Effect.tap(() => Effect.sync(() => progress.stop(`Disconnected from ${integration.name}`))),\n Effect.tapCause(() => Effect.sync(() => progress.stop(\"Failed to remove credential\", 1))),\n )\n outro(\"Done\")\n})\n\nconst chooseIntegration = Effect.fn(\"cli.auth.logout.integration\")(function* (\n integrations: IntegrationInfo[],\n target?: string,\n) {\n if (target) return yield* resolveIntegration(integrations, target)\n const configured = integrations.filter((integration) =>\n integration.connections.some((connection) => connection.type === \"credential\"),\n )\n if (configured.length === 0) return yield* Effect.fail(new Error(\"No stored credentials found\"))\n const id = yield* prompt<string>(() =>\n autocomplete({\n message: \"Select integration\",\n maxItems: 8,\n options: configured.map((integration) => ({\n value: integration.id,\n label: integration.name,\n hint: integration.connections\n .filter((connection) => connection.type === \"credential\")\n .map((connection) => connection.label)\n .join(\", \"),\n })),\n }),\n )\n return yield* resolveIntegration(configured, id)\n})\n" | ||
| ], | ||
| "mappings": ";2yCAQA,IAAe,IAAQ,QACrB,EAAS,SAAS,KAAK,SAAS,OAChC,EAAO,GAAG,iBAAiB,EAAE,CAAC,IAC5B,EAAO,CACL,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EAAE,KAAK,CAAkB,CAC5B,CACF,EAEM,EAAS,EAAO,GAAG,qBAAqB,EAAE,SAAU,CAAC,EAIxD,CACD,GAAI,CAAC,EAAM,OACT,MAAO,EAAmB,6EAA6E,EACzG,EAAM,mBAAmB,EACzB,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAM,OAAQ,WAAY,EAAM,UAAW,CAAC,EACnF,EAAe,MAAO,EAAiB,CAAM,EAC7C,EAAc,MAAO,EAAkB,EAAc,EAAM,MAAM,EACjE,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,IAAM,EAAc,EAAY,YAC7B,OAAO,CAAC,IAAe,EAAW,OAAS,KAAK,EAChD,IAAI,CAAC,IAAe,EAAW,IAAI,EACtC,GAAI,EAAY,OACd,MAAO,EAAO,KACR,MACF,GAAG,EAAY,iCAAiC,EAAY,KAAK,IAAI,iDACvE,CACF,EAEF,MAAO,EAAO,KAAS,MAAM,6BAA6B,EAAY,MAAM,CAAC,EAE/E,IAAM,EAAW,EAAQ,EACzB,EAAS,MAAM,wBAAwB,EACvC,MAAO,EAAO,QACZ,EACA,CAAC,IACC,EAAQ,CAAC,IAAW,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EACrG,CAAE,YAAa,YAAa,QAAS,EAAK,CAC5C,EAAE,KACA,EAAO,IAAI,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,qBAAqB,EAAY,MAAM,CAAC,CAAC,EAC1F,EAAO,SAAS,IAAM,EAAO,KAAK,IAAM,EAAS,KAAK,8BAA+B,CAAC,CAAC,CAAC,CAC1F,EACA,EAAM,MAAM,EACb,EAEK,EAAoB,EAAO,GAAG,6BAA6B,EAAE,SAAU,CAC3E,EACA,EACA,CACA,GAAI,EAAQ,OAAO,MAAO,EAAmB,EAAc,CAAM,EACjE,IAAM,EAAa,EAAa,OAAO,CAAC,IACtC,EAAY,YAAY,KAAK,CAAC,IAAe,EAAW,OAAS,YAAY,CAC/E,EACA,GAAI,EAAW,SAAW,EAAG,OAAO,MAAO,EAAO,KAAS,MAAM,6BAA6B,CAAC,EAC/F,IAAM,EAAK,MAAO,EAAe,IAC/B,EAAa,CACX,QAAS,qBACT,SAAU,EACV,QAAS,EAAW,IAAI,CAAC,KAAiB,CACxC,MAAO,EAAY,GACnB,MAAO,EAAY,KACnB,KAAM,EAAY,YACf,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACvD,IAAI,CAAC,IAAe,EAAW,KAAK,EACpC,KAAK,IAAI,CACd,EAAE,CACJ,CAAC,CACH,EACA,OAAO,MAAO,EAAmB,EAAY,CAAE,EAChD", | ||
| "debugId": "903108E0BBF5FAA364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/image-input.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding } from \"effect\"\nimport type { ImageInput } from \"../../image.js\"\nimport { InvalidRequestReason, AIError } from \"../../schema/index.js\"\n\nconst invalid = (module: string, message: string) =>\n new AIError({\n module,\n method: \"generate\",\n reason: new InvalidRequestReason({ message }),\n })\n\nexport const dataUrl = (input: Extract<ImageInput, { readonly type: \"bytes\" }>) =>\n `data:${input.mediaType};base64,${Encoding.encodeBase64(input.data)}`\n\nexport const decodeDataUrl = (\n url: string,\n module: string,\n): Effect.Effect<{ readonly mediaType: string; readonly data: Uint8Array } | undefined, AIError> => {\n if (!url.startsWith(\"data:\")) return Effect.succeed(undefined)\n const match = /^data:([^;,]+);base64,(.*)$/s.exec(url)\n if (!match) return Effect.fail(invalid(module, \"Image data URLs must contain a MIME type and base64 data\"))\n return Effect.fromResult(Encoding.decodeBase64(match[2])).pipe(\n Effect.mapError(() => invalid(module, \"Image data URL contains invalid base64 data\")),\n Effect.map((data) => ({ mediaType: match[1], data })),\n )\n}\n\nexport const invalidImageInput = invalid\n\nexport const ImageInputs = {\n dataUrl,\n decodeDataUrl,\n invalid: invalidImageInput,\n} as const\n" | ||
| ], | ||
| "mappings": ";wHAIA,IAAM,EAAU,CAAC,EAAgB,IAC/B,IAAI,EAAQ,CACV,SACA,OAAQ,WACR,OAAQ,IAAI,EAAqB,CAAE,SAAQ,CAAC,CAC9C,CAAC,EAEU,EAAU,CAAC,IACtB,QAAQ,EAAM,oBAAoB,EAAS,aAAa,EAAM,IAAI,IAEvD,EAAgB,CAC3B,EACA,IACkG,CAClG,GAAI,CAAC,EAAI,WAAW,OAAO,EAAG,OAAO,EAAO,QAAQ,MAAS,EAC7D,IAAM,EAAQ,+BAA+B,KAAK,CAAG,EACrD,GAAI,CAAC,EAAO,OAAO,EAAO,KAAK,EAAQ,EAAQ,0DAA0D,CAAC,EAC1G,OAAO,EAAO,WAAW,EAAS,aAAa,EAAM,EAAE,CAAC,EAAE,KACxD,EAAO,SAAS,IAAM,EAAQ,EAAQ,6CAA6C,CAAC,EACpF,EAAO,IAAI,CAAC,KAAU,CAAE,UAAW,EAAM,GAAI,MAAK,EAAE,CACtD,GAGW,EAAoB,EAEpB,EAAc,CACzB,UACA,gBACA,QAAS,CACX", | ||
| "debugId": "E008D5C3186D3D3264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH", | ||
| "debugId": "D3CC4EBF23AB082564756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/mini.ts", "src/mini-host.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ClientError, OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { setTimeout } from \"node:timers/promises\"\nimport { readStdin } from \"./util/io\"\nimport { createMiniHost, INTERACTIVE_INPUT_ERROR, usingInteractiveStdin } from \"./mini-host\"\nimport { parseSessionTargetModel, resolveSessionTarget, type SessionTargetPreparation } from \"./session-target\"\nimport { Env } from \"./env\"\n\nexport type MiniCommandInput = {\n server: {\n endpoint: Endpoint\n reconnect?: (signal: AbortSignal) => Promise<Endpoint>\n }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n prompt?: string\n replay?: boolean\n replayLimit?: number\n demo?: boolean\n tuiConfig?: MiniFrontendInput[\"tuiConfig\"]\n config?: MiniFrontendInput[\"config\"]\n paths: { home: string; state: string; log: string }\n}\n\ntype Model = MiniFrontendInput[\"model\"]\n\nclass MiniInputError extends Error {}\n\nexport async function runMini(input: MiniCommandInput) {\n try {\n validate(input)\n const result = await usingInteractiveStdin(async (terminal) => {\n const initialInput = mergeInput(process.stdin.isTTY ? undefined : await readStdin(), input.prompt)\n const frontendTask = import(\"@opencode-ai/tui/mini\")\n const directory = localDirectory()\n const connection = createMiniConnection(input.server)\n const sdk = connection.sdk\n const environment = input.server.reconnect ? Env.session() : undefined\n const requested = parseModel(input.model)\n const model = requested ? { providerID: requested.providerID, modelID: requested.id } : undefined\n const prepare = prepareTarget(input.agent)\n const resolveTarget = async (initial: OpenCodeClient, signal: AbortSignal) => {\n const resolved = await resolveMiniTarget({\n sdk: initial,\n reconnect: connection.reconnect,\n signal,\n resolve: (client) =>\n resolveSessionTarget({\n client,\n location: { directory },\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: requested,\n agent: input.agent,\n environment,\n prepare,\n signal,\n }).catch((error) => {\n if (error instanceof Error && error.message === \"Session not found\")\n throw new MiniInputError(error.message)\n throw error\n }),\n })\n const target = resolved.value\n return {\n sdk: resolved.sdk,\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: target.resume,\n }\n }\n const create = (\n client: OpenCodeClient,\n next: {\n location: { directory: string; workspaceID?: string }\n agent: string | undefined\n model: Model\n variant: string | undefined\n },\n signal?: AbortSignal,\n ) =>\n resolveSessionTarget({\n client,\n location: { directory: next.location.directory, workspace: next.location.workspaceID },\n agent: next.agent,\n environment,\n model: next.model\n ? { providerID: next.model.providerID, id: next.model.modelID, variant: next.variant }\n : undefined,\n prepare,\n signal,\n }).then((target) => ({\n sessionID: target.session.id,\n sessionTitle: target.session.title,\n location: target.location,\n model: target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined,\n variant: target.model?.variant,\n agent: target.agent,\n resume: false,\n }))\n const frontend = await frontendTask\n return frontend.runMiniFrontend({\n host: createMiniHost({ terminal, directory, paths: input.paths }),\n sdk,\n directory,\n target: resolveTarget,\n reconnect: connection.reconnect,\n createSession: create,\n agent: input.agent,\n model,\n variant: requested?.variant,\n files: [],\n initialInput,\n replay: input.replay ?? true,\n replayLimit: input.replayLimit,\n demo: input.demo,\n tuiConfig: input.tuiConfig,\n config: input.config,\n })\n })\n if (result.exitCode !== 0) process.exit(result.exitCode)\n } catch (error) {\n if (error instanceof MiniInputError || (error instanceof Error && error.message === INTERACTIVE_INPUT_ERROR))\n fail(error.message)\n throw error\n }\n}\n\n/** @internal Exported for CLI boundary tests. */\nexport function createMiniConnection(input: MiniCommandInput[\"server\"]) {\n const make = (endpoint: Endpoint) =>\n OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n })\n const reconnect = input.reconnect\n return {\n sdk: make(input.endpoint),\n reconnect: reconnect\n ? async (signal: AbortSignal) => {\n const endpoint = await reconnect(signal)\n return make(endpoint)\n }\n : undefined,\n }\n}\n\n/** @internal Exported for reconnect lifecycle tests. */\nexport async function resolveMiniTarget<A>(input: {\n sdk: OpenCodeClient\n reconnect?: (signal: AbortSignal) => Promise<OpenCodeClient>\n signal: AbortSignal\n resolve: (sdk: OpenCodeClient) => Promise<A>\n}) {\n let sdk = input.sdk\n while (true) {\n try {\n return { sdk, value: await input.resolve(sdk) }\n } catch (error) {\n if (!input.reconnect || !(error instanceof ClientError) || error.reason !== \"Transport\") throw error\n while (true) {\n try {\n sdk = await input.reconnect(input.signal)\n break\n } catch (resolveError) {\n if (input.signal.aborted) throw resolveError\n await setTimeout(250, undefined, { signal: input.signal })\n }\n }\n }\n }\n}\n\nexport function validateMiniTerminal() {\n if (!process.stdout.isTTY) fail(\"opencode mini requires a TTY stdout\")\n}\n\n/** @internal Exported for testing. */\nexport function mergeInput(piped: string | undefined, prompt: string | undefined) {\n if (!prompt) return piped || undefined\n if (!piped) return prompt\n return piped + \"\\n\" + prompt\n}\n\nfunction validate(input: MiniCommandInput) {\n validateMiniTerminal()\n if (input.replayLimit !== undefined && (!Number.isInteger(input.replayLimit) || input.replayLimit <= 0)) {\n fail(\"--replay-limit must be a positive integer\")\n }\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n}\n\nfunction localDirectory(): string {\n const root = process.env.PWD ?? process.cwd()\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n throw new MiniInputError(`Failed to change directory to ${root}`)\n }\n}\n\nfunction parseModel(value?: string) {\n try {\n return parseSessionTargetModel(value)\n } catch {\n throw new MiniInputError(\"--model must use the format provider/model[#variant]\")\n }\n}\n\nfunction prepareTarget(requestedAgent?: string): SessionTargetPreparation {\n return async (input) => ({ model: input.model, agent: requestedAgent ?? input.agent })\n}\n\nfunction fail(message: string): never {\n process.stderr.write(`\\x1b[91m\\x1b[1mError: \\x1b[0m${message}\\n`)\n process.exit(1)\n}\n", | ||
| "import type { MiniFrontendInput } from \"@opencode-ai/tui/mini\"\nimport { createModelPreferenceRepository } from \"@opencode-ai/tui/model-preference\"\nimport fs from \"node:fs\"\nimport { readFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { ReadStream } from \"node:tty\"\n\nexport const INTERACTIVE_INPUT_ERROR = \"opencode mini requires a controlling terminal for input\"\n\nexport type InteractiveStdin = {\n stdin: NodeJS.ReadStream\n cleanup(): void\n}\n\ntype MiniHost = MiniFrontendInput[\"host\"]\n\nfunction preferences(statePath: string): MiniHost[\"preferences\"] {\n const repository = createModelPreferenceRepository(path.join(statePath, \"model.json\"))\n return {\n async resolveVariant(model) {\n if (!model) return\n return repository.resolveVariant(model)\n },\n async saveVariant(model, variant) {\n if (!model) return\n await repository.saveVariant(model, variant).catch(() => undefined)\n },\n }\n}\n\nfunction signal(name: \"SIGINT\" | \"SIGUSR2\"): MiniHost[\"signals\"][\"sigint\"] {\n return {\n subscribe(listener) {\n let subscribed = true\n process.on(name, listener)\n return () => {\n if (!subscribed) return\n subscribed = false\n process.off(name, listener)\n }\n },\n }\n}\n\nfunction createTrace(\n logPath: string,\n diagnostics: { pid: number; cwd: string; argv: string[] },\n): MiniHost[\"diagnostics\"][\"trace\"] {\n if (!process.env.OPENCODE_DIRECT_TRACE) return\n const stamp = new Date()\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d+Z$/, \"Z\")\n const target = path.join(logPath, \"direct\", `${stamp}-${diagnostics.pid}.jsonl`)\n const text = (data: unknown) =>\n JSON.stringify(data, (_key, value) => (typeof value === \"bigint\" ? String(value) : value), 0)\n fs.mkdirSync(path.dirname(target), { recursive: true })\n fs.writeFileSync(\n path.join(logPath, \"direct\", \"latest.json\"),\n text({\n time: new Date().toISOString(),\n ...diagnostics,\n path: target,\n }) + \"\\n\",\n )\n const trace = {\n write(type: string, data?: unknown) {\n fs.appendFileSync(\n target,\n text({\n time: new Date().toISOString(),\n pid: diagnostics.pid,\n type,\n data,\n }) + \"\\n\",\n )\n },\n }\n trace.write(\"trace.start\", {\n argv: diagnostics.argv,\n cwd: diagnostics.cwd,\n path: target,\n })\n return trace\n}\n\nfunction openTerminalStdin(target: string): NodeJS.ReadStream {\n return new ReadStream(fs.openSync(target, \"r\"))\n}\n\nexport function resolveInteractiveStdin(\n stdin: NodeJS.ReadStream = process.stdin,\n open: (target: string) => NodeJS.ReadStream = openTerminalStdin,\n platform: NodeJS.Platform = process.platform,\n): InteractiveStdin {\n if (stdin.isTTY) return { stdin, cleanup() {} }\n const target = platform === \"win32\" ? \"CONIN$\" : \"/dev/tty\"\n try {\n const source = open(target)\n let cleaned = false\n return {\n stdin: source,\n cleanup() {\n if (cleaned) return\n cleaned = true\n source.destroy()\n },\n }\n } catch (error) {\n throw new Error(INTERACTIVE_INPUT_ERROR, { cause: error })\n }\n}\n\n/** @internal Exported for owner-local resource cleanup tests. */\nexport async function usingInteractiveStdin<T>(\n run: (terminal: InteractiveStdin) => Promise<T>,\n resolve: () => InteractiveStdin = resolveInteractiveStdin,\n) {\n const terminal = resolve()\n try {\n return await run(terminal)\n } finally {\n terminal.cleanup()\n }\n}\n\n/** @internal Exported for owner-local host capability tests. */\nexport function createMiniHost(input: {\n terminal: InteractiveStdin\n directory: string\n paths: { home: string; state: string; log: string }\n}): MiniHost {\n const paths = input.paths\n const diagnostics = {\n pid: process.pid,\n cwd: input.directory,\n argv: process.argv.slice(2),\n }\n return {\n terminal: { stdin: input.terminal.stdin },\n platform: process.platform,\n stdout: {\n write(value) {\n process.stdout.write(value)\n },\n },\n files: {\n readText: (url) => readFile(new URL(url), \"utf8\"),\n },\n editor: {\n async open(options) {\n const { openEditor } = await import(\"@opencode-ai/tui/editor\")\n return openEditor(options)\n },\n },\n paths: { home: paths.home },\n signals: {\n sigint: signal(\"SIGINT\"),\n sigusr2: signal(\"SIGUSR2\"),\n },\n startup: {\n showTiming: [\"1\", \"true\"].includes(process.env.OPENCODE_SHOW_TTFD?.toLowerCase() ?? \"\"),\n now: () => performance.now(),\n },\n diagnostics: {\n trace: createTrace(paths.log, diagnostics),\n },\n preferences: preferences(paths.state),\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0257DD1F9D23EED064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-compatible-responses.ts", "../ai/src/providers/google-vertex-responses.ts"], | ||
| "sourcesContent": [ | ||
| "import { Route, type RouteRoutedLanguageModelInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { OpenResponses } from \"./open-responses.js\"\n\nconst ADAPTER = \"openai-compatible-responses\"\n\nexport type OpenAICompatibleResponsesLanguageModelInput = RouteRoutedLanguageModelInput\n\n/**\n * Deployment adapter for providers that expose an Open Responses-compatible\n * `/responses` endpoint. Provider helpers configure identity, endpoint, and\n * auth while the semantic protocol remains provider-neutral.\n */\nexport const route = Route.make({\n id: ADAPTER,\n providerMetadataKey: \"openresponses\",\n protocol: OpenResponses.protocol,\n endpoint: Endpoint.path(OpenResponses.PATH),\n transport: OpenResponses.httpTransport,\n})\n\nexport * as OpenAICompatibleResponses from \"./openai-compatible-responses.js\"\n", | ||
| "import type { ProviderPackage } from \"../provider-package.js\"\nimport { OpenAICompatibleResponses } from \"../protocols/openai-compatible-responses.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\nimport type { OpenResponsesProviderOptionsInput } from \"./open-responses-options.js\"\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.OAuthOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenResponsesProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly accessToken?: string\n readonly apiKey?: never\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenResponsesProviderOptionsInput\n}\n\nconst route = OpenAICompatibleResponses.route.with({\n id: \"google-vertex-responses\",\n provider: id,\n providerOptions: { store: false },\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config) => {\n if (\"apiKey\" in input && input.apiKey !== undefined)\n throw new Error(\"Google Vertex Responses does not support API keys\")\n const {\n accessToken: _accessToken,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const location = GoogleVertexShared.location(inputLocation, \"global\")\n const project = GoogleVertexShared.project(inputProject)\n return route.with({\n ...rest,\n endpoint: {\n baseURL:\n baseURL ??\n `https://aiplatform.googleapis.com/v1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}/endpoints/openapi`,\n },\n auth: GoogleVertexShared.oauth(input, project),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<OpenResponsesProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenResponsesProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined) throw new Error(\"Google Vertex Responses does not support API keys\")\n return configure({\n accessToken: settings.accessToken,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";2nBAIA,IAAM,EAAU,8BASH,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,oBAAqB,gBACrB,SAAU,EAAc,SACxB,SAAU,EAAS,KAAK,EAAc,IAAI,EAC1C,UAAW,EAAc,aAC3B,CAAC,ECZM,IAAM,EAAK,EAAW,KAAK,eAAe,EAmB3C,EAAQ,EAA0B,MAAM,KAAK,CACjD,GAAI,0BACJ,SAAU,EACV,gBAAiB,CAAE,MAAO,EAAM,CAClC,CAAC,EAID,IAAM,EAAkB,CAAC,IAAkB,CACzC,GAAI,WAAY,GAAS,EAAM,SAAW,OACxC,MAAU,MAAM,mDAAmD,EACrE,IACE,YAAa,EACb,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAW,EAAmB,SAAS,EAAe,QAAQ,EAC9D,EAAU,EAAmB,QAAQ,CAAY,EACvD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CACR,QACE,GACA,iDAAiD,EAAmB,eAAe,CAAO,eAAe,qBAC7G,EACA,KAAM,EAAmB,MAAM,EAAO,CAAO,CAC/C,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAAyC,CAAE,GAAI,CAAQ,CAAC,EACpG,WACF,GAQK,IAAM,EAA0F,CACrG,EACA,IACG,CACH,GAAI,EAAS,SAAW,OAAW,MAAU,MAAM,mDAAmD,EACtG,OAAO,EAAU,CACf,YAAa,EAAS,YACtB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "D4A35BD4140D6C6C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/config.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.config,\n Effect.fn(\"cli.debug.config\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const entries = yield* Effect.promise(() => client.config.get({ location: { directory: process.cwd() } }))\n process.stdout.write(JSON.stringify(entries, null, 2) + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAU,MAAO,EAAO,QAAQ,IAAM,EAAO,OAAO,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EACzG,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAS,KAAM,CAAC,EAAI,CAAG,EAC5D,CACH", | ||
| "debugId": "0937AFC94221D63364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/worktree.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Worktree from \"./worktree.js\"\n\nimport { Schema } from \"effect\"\nimport { durable, ephemeral, inventory } from \"./event.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { AbsolutePath, optional } from \"./schema.js\"\nimport { Project } from \"./project.js\"\n\nexport const StrategyID = Schema.Trim.pipe(Schema.check(Schema.isNonEmpty()), Schema.brand(\"Worktree.StrategyID\"))\nexport type StrategyID = typeof StrategyID.Type\n\nexport const CreateInput = Schema.Struct({\n projectID: ProjectID,\n strategy: StrategyID,\n from: optional(AbsolutePath),\n directory: AbsolutePath,\n name: optional(Schema.String),\n}).annotate({ identifier: \"Worktree.CreateInput\" })\nexport interface CreateInput extends Schema.Schema.Type<typeof CreateInput> {}\n\nexport const RemoveInput = Schema.Struct({\n projectID: ProjectID,\n directory: AbsolutePath,\n force: Schema.Boolean,\n}).annotate({ identifier: \"Worktree.RemoveInput\" })\nexport interface RemoveInput extends Schema.Schema.Type<typeof RemoveInput> {}\n\nexport const Info = Schema.Struct({\n directory: AbsolutePath,\n}).annotate({ identifier: \"Worktree.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const Directory = Schema.Struct({\n directory: AbsolutePath,\n strategy: optional(Schema.String),\n}).annotate({ identifier: \"Worktree.Directory\" })\nexport interface Directory extends Schema.Schema.Type<typeof Directory> {}\n\nexport const ListInput = Schema.Struct({\n projectID: ProjectID,\n}).annotate({ identifier: \"Worktree.ListInput\" })\nexport interface ListInput extends Schema.Schema.Type<typeof ListInput> {}\n\nexport const List = Schema.Array(Directory).annotate({ identifier: \"Worktree.List\" })\nexport type List = typeof List.Type\n\nconst Updated = ephemeral({\n type: \"worktree.updated\",\n schema: { projectID: Project.ID },\n})\n\nconst Resolved = durable({\n type: \"worktree.resolved\",\n durable: { aggregate: \"projectID\", version: 1 },\n schema: {\n projectID: Project.ID,\n directory: AbsolutePath,\n previous: Project.ID,\n },\n})\n\nexport const Event = { Updated, Resolved, Definitions: inventory(Updated, Resolved) }\n\nexport function adopt(\n session: { readonly projectID: string; readonly directory: string },\n event: { readonly projectID: string; readonly directory: string; readonly previous: string },\n) {\n if (session.projectID !== event.previous && session.projectID !== Project.ID.global) return\n if (session.projectID === event.projectID) return\n const inside =\n session.directory === event.directory ||\n session.directory.startsWith(event.directory + \"/\") ||\n session.directory.startsWith(event.directory + \"\\\\\")\n if (!inside) return\n return {\n projectID: event.projectID,\n subpath:\n session.directory === event.directory\n ? undefined\n : session.directory.slice(event.directory.length + 1).replaceAll(\"\\\\\", \"/\"),\n }\n}\n" | ||
| ], | ||
| "mappings": ";scAQO,IAAM,EAAa,EAAO,KAAK,KAAK,EAAO,MAAM,EAAO,WAAW,CAAC,EAAG,EAAO,MAAM,qBAAqB,CAAC,EAGpG,EAAc,EAAO,OAAO,CACvC,UAAW,EACX,SAAU,EACV,KAAM,EAAS,CAAY,EAC3B,UAAW,EACX,KAAM,EAAS,EAAO,MAAM,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC,EAGrC,EAAc,EAAO,OAAO,CACvC,UAAW,EACX,UAAW,EACX,MAAO,EAAO,OAChB,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC,EAGrC,EAAO,EAAO,OAAO,CAChC,UAAW,CACb,CAAC,EAAE,SAAS,CAAE,WAAY,eAAgB,CAAC,EAG9B,EAAY,EAAO,OAAO,CACrC,UAAW,EACX,SAAU,EAAS,EAAO,MAAM,CAClC,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,EAAY,EAAO,OAAO,CACrC,UAAW,CACb,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,EAAO,EAAO,MAAM,CAAS,EAAE,SAAS,CAAE,WAAY,eAAgB,CAAC,EAG9E,EAAU,EAAU,CACxB,KAAM,mBACN,OAAQ,CAAE,UAAW,EAAQ,EAAG,CAClC,CAAC,EAEK,EAAW,EAAQ,CACvB,KAAM,oBACN,QAAS,CAAE,UAAW,YAAa,QAAS,CAAE,EAC9C,OAAQ,CACN,UAAW,EAAQ,GACnB,UAAW,EACX,SAAU,EAAQ,EACpB,CACF,CAAC,EAEY,EAAQ,CAAE,UAAS,WAAU,YAAa,EAAU,EAAS,CAAQ,CAAE,EAE7E,SAAS,CAAK,CACnB,EACA,EACA,CACA,GAAI,EAAQ,YAAc,EAAM,UAAY,EAAQ,YAAc,EAAQ,GAAG,OAAQ,OACrF,GAAI,EAAQ,YAAc,EAAM,UAAW,OAK3C,GAAI,EAHF,EAAQ,YAAc,EAAM,WAC5B,EAAQ,UAAU,WAAW,EAAM,UAAY,GAAG,GAClD,EAAQ,UAAU,WAAW,EAAM,UAAY,IAAI,GACxC,OACb,MAAO,CACL,UAAW,EAAM,UACjB,QACE,EAAQ,YAAc,EAAM,UACxB,OACA,EAAQ,UAAU,MAAM,EAAM,UAAU,OAAS,CAAC,EAAE,WAAW,KAAM,GAAG,CAChF", | ||
| "debugId": "302A1657EF36BF6564756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-images.ts", "../ai/src/providers/openai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest, HttpClientResponse } from \"effect/unstable/http\"\nimport {\n ImageModel,\n GeneratedImage,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema/index.js\"\nimport { ProviderShared } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\nimport { OpenAIImage } from \"./utils/openai-image.js\"\n\nconst ADAPTER = \"openai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/images/generations\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type OpenAIImageString<Known extends string> = Known | (string & {})\n\nexport type OpenAIImageOptions = {\n readonly mask?: ImageInput\n readonly n?: number\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly moderation?: OpenAIImageString<\"auto\" | \"low\">\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly outputCompression?: number\n} & Record<string, unknown>\n\nexport type OpenAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\n\nconst OpenAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: Schema.optional(Schema.String),\n url: Schema.optional(Schema.String),\n revised_prompt: Schema.optional(Schema.String),\n }),\n ),\n output_format: Schema.optional(Schema.String),\n usage: Schema.optional(\n Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n total_tokens: Schema.optional(Schema.Number),\n input_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n output_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n }),\n ),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly http?: HttpOptions\n}\n\nconst nativeOptions = (options: OpenAIImageOptions | undefined) => {\n if (!options) return undefined\n const { mask: _, outputFormat, outputCompression, ...native } = options\n return {\n output_format: outputFormat,\n output_compression: outputCompression,\n ...native,\n }\n}\n\nconst invalidOutput = (message: string) =>\n new AIError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<OpenAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"OpenAIImages.generate\")(function* (request: ImageRequestFor<OpenAIImageOptions>, execute) {\n const mask = request.options?.mask\n if (mask !== undefined && (request.images?.length ?? 0) === 0)\n return yield* ImageInputs.invalid(ADAPTER, \"An OpenAI image mask requires at least one input image\")\n const http = mergeHttpOptions(request.model.http, request.http)\n const sourceImages = request.images ?? []\n const multipartImages = yield* Effect.forEach(sourceImages, (image) => {\n if (image.type === \"bytes\") return Effect.succeed({ data: image.data, mediaType: image.mediaType })\n if (image.type === \"url\") return ImageInputs.decodeDataUrl(image.url, ADAPTER)\n return Effect.succeed(undefined)\n })\n const multipartMask =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { data: mask.data, mediaType: mask.mediaType }\n : mask.type === \"url\"\n ? yield* ImageInputs.decodeDataUrl(mask.url, ADAPTER)\n : undefined\n const useMultipart =\n sourceImages.length > 0 &&\n multipartImages.every((image) => image !== undefined) &&\n (mask === undefined || multipartMask !== undefined)\n const path = sourceImages.length === 0 ? PATH : EDIT_PATH\n const url = applyQuery(`${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${path}`, http?.query)\n\n if (useMultipart) {\n const form = new FormData()\n form.append(\"model\", request.model.id)\n form.append(\"prompt\", request.prompt)\n Object.entries(mergeJsonRecords(nativeOptions(request.options), http?.body) ?? {}).forEach(([key, value]) => {\n if ([\"model\", \"prompt\", \"image\", \"image[]\", \"images\", \"mask\"].includes(key)) return\n form.append(key, typeof value === \"string\" ? value : ProviderShared.encodeJson(value))\n })\n multipartImages.forEach((image, index) => {\n if (image === undefined) return\n form.append(\"image[]\", imageBlob(image.data, image.mediaType), `image-${index}`)\n })\n if (multipartMask !== undefined)\n form.append(\"mask\", imageBlob(multipartMask.data, multipartMask.mediaType), \"mask\")\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: \"[multipart/form-data]\",\n headers: Headers.remove(Headers.fromInput({ ...input.headers, ...http?.headers }), \"content-type\"),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(HttpClientRequest.setHeaders(headers), HttpClientRequest.bodyFormData(form)),\n )\n return yield* parseResponse(response, request.options, http?.body)\n }\n\n const references = sourceImages.map((image) => {\n if (image.type === \"bytes\") return { image_url: ImageInputs.dataUrl(image) }\n if (image.type === \"url\") return { image_url: image.url }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (references.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const maskReference =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { image_url: ImageInputs.dataUrl(mask) }\n : mask.type === \"url\"\n ? { image_url: mask.url }\n : mask.type === \"file-id\"\n ? { file_id: mask.id }\n : undefined\n if (mask !== undefined && maskReference === undefined)\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts masks as URLs, data URLs, bytes, or file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n images: references.length === 0 ? undefined : references,\n mask: maskReference,\n },\n nativeOptions(request.options),\n http?.body,\n ) as OpenAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n return yield* parseResponse(response, request.options, http?.body)\n }),\n }\n return ImageModel.make<OpenAIImageOptions>({ id: input.id, provider: \"openai\", route, http: input.http })\n}\n\nconst parseResponse = Effect.fn(\"OpenAIImages.parseResponse\")(function* (\n response: HttpClientResponse.HttpClientResponse,\n options: OpenAIImageOptions | undefined,\n overlay: Record<string, unknown> | undefined,\n) {\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the OpenAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(OpenAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"OpenAI Images returned an invalid response\")),\n )\n const requestBody = mergeJsonRecords(nativeOptions(options), overlay)\n const format =\n decoded.output_format ?? (typeof requestBody?.output_format === \"string\" ? requestBody.output_format : \"png\")\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`OpenAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: `image/${format}`,\n data,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType: `image/${format}`,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`OpenAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"OpenAI Images returned no images\")\n return new ImageResponse({\n images,\n usage:\n decoded.usage === undefined\n ? undefined\n : new Usage({\n inputTokens: decoded.usage.input_tokens,\n outputTokens: decoded.usage.output_tokens,\n totalTokens: decoded.usage.total_tokens,\n providerMetadata: { openai: decoded.usage },\n }),\n providerMetadata: { openai: { outputFormat: format } },\n })\n})\n\nconst imageBlob = (data: Uint8Array, mediaType: string) => {\n const buffer = new ArrayBuffer(data.byteLength)\n new Uint8Array(buffer).set(data)\n return new Blob([buffer], { type: mediaType })\n}\n\nexport const OpenAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { Route, RouteDefaultsInput } from \"../route/client.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { HttpOptions, ProviderID, ToolDefinition, mergeHttpOptions, type ModelID } from \"../schema/index.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport * as OpenAIResponses from \"../protocols/openai-responses.js\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options.js\"\nimport { OpenAIImages, type OpenAIImageString } from \"../protocols/openai-images.js\"\n\nexport type { OpenAIOptionsInput, OpenAIResponseIncludable } from \"./openai-options.js\"\nexport type { OpenAIImageOptions } from \"../protocols/openai-images.js\"\n\nexport const id = ProviderID.make(\"openai\")\n\nexport const routes = [OpenAIResponses.route, OpenAIChat.route]\n\n// This provider facade wraps the lower-level Responses and Chat model factories\n// with OpenAI-specific conveniences: typed options, API-key sugar, env fallback,\n// and default option normalization.\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly queryParams?: Record<string, string>\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport interface ImageGenerationOptions {\n readonly action?: OpenAIImageString<\"auto\" | \"generate\" | \"edit\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly inputFidelity?: OpenAIImageString<\"low\" | \"high\">\n readonly outputCompression?: number\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly partialImages?: number\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\n}\n\nexport const imageGeneration = (options: ImageGenerationOptions = {}) =>\n ToolDefinition.make({\n name: \"image_generation\",\n description: \"Generate or edit an image using OpenAI's hosted image generation tool.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n native: {\n openai: {\n type: \"image_generation\",\n action: options.action,\n background: options.background,\n input_fidelity: options.inputFidelity,\n output_compression: options.outputCompression,\n output_format: options.outputFormat,\n partial_images: options.partialImages,\n quality: options.quality,\n size: options.size,\n },\n },\n })\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly organization?: string\n readonly project?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"OPENAI_API_KEY\")\n\nconst defaults = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL: _baseURL, queryParams: _queryParams, ...rest } = input\n return rest\n}\n\nconst configuredRoute = <Body, Prepared>(route: Route<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: { baseURL: input.baseURL, query: input.queryParams },\n })\n\nexport const configure = (input: Config = {}) => {\n const responsesRoute = configuredRoute(OpenAIResponses.route, input)\n const chatRoute = configuredRoute(OpenAIChat.route, input)\n const modelDefaults = defaults(input)\n const responses = (id: string | ModelID) =>\n responsesRoute\n .with(withOpenAIOptions(id, modelDefaults, { textVerbosity: true }))\n .model<OpenAIProviderOptionsInput>({ id })\n const chat = (id: string | ModelID) =>\n chatRoute.with(withOpenAIOptions(id, modelDefaults)).model<OpenAIProviderOptionsInput>({ id })\n const image = (modelID: string | ModelID) =>\n OpenAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n http: mergeHttpOptions(\n input.http === undefined ? undefined : HttpOptions.make(input.http),\n input.queryParams === undefined ? undefined : new HttpOptions({ query: input.queryParams }),\n ),\n })\n\n return {\n id,\n model: responses,\n responses,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\n\nconst config = (settings: Settings): Config => {\n const headers = {\n ...(settings.organization === undefined ? {} : { \"OpenAI-Organization\": settings.organization }),\n ...(settings.project === undefined ? {} : { \"OpenAI-Project\": settings.project }),\n ...settings.headers,\n }\n return {\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: Object.keys(headers).length === 0 ? undefined : headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (modelID, settings) => {\n return configure(config(settings)).responses(modelID)\n}\n\nexport const chatModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).chat(modelID)\nexport const responses = provider.responses\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "09FDF879940EE07064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/debug/agents.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.debug.commands.agents,\n Effect.fn(\"cli.debug.agents\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const response = yield* Effect.promise(() => client.agent.list({ location: { directory: process.cwd() } }))\n process.stdout.write(\n JSON.stringify(\n response.data.toSorted((a, b) => a.id.localeCompare(b.id)),\n null,\n 2,\n ) + EOL,\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";m6BAAA,cAAS,WAQT,IAAe,IAAQ,QACrB,EAAS,SAAS,MAAM,SAAS,OACjC,EAAO,GAAG,kBAAkB,EAAE,SAAU,EAAG,CACzC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAW,MAAO,EAAO,QAAQ,IAAM,EAAO,MAAM,KAAK,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,CAAC,EAC1G,QAAQ,OAAO,MACb,KAAK,UACH,EAAS,KAAK,SAAS,CAAC,EAAG,IAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACzD,KACA,CACF,EAAI,CACN,EACD,CACH", | ||
| "debugId": "32569DF03802D78C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "C1F885E1DC99CD2064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": "5FCEF0CAD9E8443F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "BF19D71C8F0E14B764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/bedrock-event-stream.ts", "../ai/src/protocols/utils/bedrock-cache.ts", "../ai/src/protocols/utils/bedrock-media.ts", "../ai/src/protocols/bedrock-converse.ts", "../ai/src/providers/amazon-bedrock.ts"], | ||
| "sourcesContent": [ | ||
| "import { EventStreamCodec } from \"@smithy/eventstream-codec\"\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\"\nimport { Effect, Stream } from \"effect\"\nimport { Framing } from \"../route/framing.js\"\nimport { ProviderShared } from \"./shared.js\"\n\n// Bedrock streams responses using the AWS event stream binary protocol — each\n// frame is `[length:4][headers-length:4][prelude-crc:4][headers][payload][crc:4]`.\n// We use `@smithy/eventstream-codec` to validate framing and CRCs, then\n// reconstruct the JSON wrapping by `:event-type` so the chunk schema can match.\nconst eventCodec = new EventStreamCodec(toUtf8, fromUtf8)\nconst utf8 = new TextDecoder()\n\n// Cursor-tracking buffer state. Bytes accumulate in `buffer`; `offset` is the\n// read position. Reading by `subarray` is zero-copy. We only allocate a fresh\n// buffer when a new network chunk arrives and we need to append.\ninterface FrameBufferState {\n readonly buffer: Uint8Array\n readonly offset: number\n}\n\nconst initialFrameBuffer: FrameBufferState = { buffer: new Uint8Array(0), offset: 0 }\n\nconst appendChunk = (state: FrameBufferState, chunk: Uint8Array): FrameBufferState => {\n const remaining = state.buffer.length - state.offset\n // Compact: drop the consumed prefix and append the new chunk in one alloc.\n // This bounds buffer growth to at most one network chunk past the live\n // window, regardless of stream length.\n const next = new Uint8Array(remaining + chunk.length)\n next.set(state.buffer.subarray(state.offset), 0)\n next.set(chunk, remaining)\n return { buffer: next, offset: 0 }\n}\n\nconst consumeFrames = (route: string) => (state: FrameBufferState, chunk: Uint8Array) =>\n Effect.gen(function* () {\n let cursor = appendChunk(state, chunk)\n const out: object[] = []\n while (cursor.buffer.length - cursor.offset >= 4) {\n const view = cursor.buffer.subarray(cursor.offset)\n const totalLength = new DataView(view.buffer, view.byteOffset, view.byteLength).getUint32(0, false)\n if (view.length < totalLength) break\n\n const decoded = yield* Effect.try({\n try: () => eventCodec.decode(view.subarray(0, totalLength)),\n catch: (error) =>\n ProviderShared.eventError(\n route,\n `Failed to decode Bedrock Converse event-stream frame: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n })\n cursor = { buffer: cursor.buffer, offset: cursor.offset + totalLength }\n\n const messageType = decoded.headers[\":message-type\"]?.value\n if (messageType === \"error\") {\n const code = decoded.headers[\":error-code\"]?.value\n const message = decoded.headers[\":error-message\"]?.value\n return yield* ProviderShared.eventError(\n route,\n [code, message].filter((value): value is string => typeof value === \"string\").join(\": \") ||\n \"Bedrock Converse event-stream error\",\n )\n }\n const eventType =\n messageType === \"event\"\n ? decoded.headers[\":event-type\"]?.value\n : messageType === \"exception\"\n ? decoded.headers[\":exception-type\"]?.value\n : undefined\n if (typeof eventType !== \"string\") continue\n const payload = utf8.decode(decoded.body)\n if (!payload) continue\n // The AWS event stream pads short payloads with a `p` field. Drop it\n // before handing the object to the chunk schema. JSON decode goes\n // through the shared Schema-driven codec to satisfy the package rule\n // against ad-hoc `JSON.parse` calls.\n const parsed = (yield* ProviderShared.parseJson(\n route,\n payload,\n \"Failed to parse Bedrock Converse event-stream payload\",\n )) as Record<string, unknown>\n delete parsed.p\n out.push({ [eventType]: parsed })\n }\n return [cursor, out] as const\n })\n\n/**\n * AWS event-stream framing for Bedrock Converse. Each frame is decoded by\n * `@smithy/eventstream-codec` (length + header + payload + CRC) and rewrapped\n * under its `:event-type` header so the chunk schema can match the JSON\n * payload directly.\n */\nexport const framing = (route: string): Framing.Definition<object> => ({\n id: \"aws-event-stream\",\n frame: (bytes) => bytes.pipe(Stream.mapAccumEffect(() => initialFrameBuffer, consumeFrames(route))),\n})\n\nexport * as BedrockEventStream from \"./bedrock-event-stream.js\"\n", | ||
| "import { Schema } from \"effect\"\nimport type { CacheHint } from \"../../schema/index.js\"\nimport { newBreakpoints, ttlBucket, type Breakpoints } from \"./cache.js\"\n\n// Bedrock cache markers are positional: emit a `cachePoint` block immediately\n// after the content the caller wants treated as a cacheable prefix. Bedrock\n// accepts optional `ttl: \"5m\" | \"1h\"` on cachePoint.\nexport const CachePointBlock = Schema.Struct({\n cachePoint: Schema.Struct({\n type: Schema.tag(\"default\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n }),\n})\nexport type CachePointBlock = Schema.Schema.Type<typeof CachePointBlock>\n\n// Callers pass a shared counter through every `block()` call site so the\n// four-breakpoint budget is respected across `system`, `messages`, and `tools`.\nexport const BEDROCK_BREAKPOINT_CAP = 4\n\nexport type { Breakpoints } from \"./cache.js\"\nexport const breakpoints = () => newBreakpoints(BEDROCK_BREAKPOINT_CAP)\n\nconst DEFAULT_5M: CachePointBlock = { cachePoint: { type: \"default\" } }\nconst DEFAULT_1H: CachePointBlock = { cachePoint: { type: \"default\", ttl: \"1h\" } }\n\nexport const block = (breakpoints: Breakpoints, cache: CacheHint | undefined): CachePointBlock | undefined => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return ttlBucket(cache.ttlSeconds) === \"1h\" ? DEFAULT_1H : DEFAULT_5M\n}\n\nexport * as BedrockCache from \"./bedrock-cache.js\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport type { MediaPart } from \"../../schema/index.js\"\nimport { ProviderShared } from \"../shared.js\"\n\n// Bedrock Converse accepts image `format` as the file extension and\n// `source.bytes` as base64 in the JSON wire format.\nexport const ImageFormat = Schema.Literals([\"png\", \"jpeg\", \"gif\", \"webp\"])\nexport type ImageFormat = Schema.Schema.Type<typeof ImageFormat>\n\nexport const ImageBlock = Schema.Struct({\n image: Schema.Struct({\n format: ImageFormat,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type ImageBlock = Schema.Schema.Type<typeof ImageBlock>\n\n// Bedrock document blocks require a user-facing name so the model can refer to\n// the uploaded document.\nexport const DocumentFormat = Schema.Literals([\"pdf\", \"csv\", \"doc\", \"docx\", \"xls\", \"xlsx\", \"html\", \"txt\", \"md\"])\nexport type DocumentFormat = Schema.Schema.Type<typeof DocumentFormat>\n\nexport const DocumentBlock = Schema.Struct({\n document: Schema.Struct({\n format: DocumentFormat,\n name: Schema.String,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type DocumentBlock = Schema.Schema.Type<typeof DocumentBlock>\n\nconst IMAGE_FORMATS = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpeg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n} as const satisfies Record<string, ImageFormat>\n\nconst DOCUMENT_FORMATS = {\n \"application/pdf\": \"pdf\",\n \"text/csv\": \"csv\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"text/html\": \"html\",\n \"text/plain\": \"txt\",\n \"text/markdown\": \"md\",\n} as const satisfies Record<string, DocumentFormat>\n\nconst documentBlock = (name: string, format: DocumentFormat, bytes: string): DocumentBlock => ({\n document: {\n format,\n name,\n source: { bytes },\n },\n})\n\n// Route by MIME. Known image/document formats lower into a typed block; anything\n// else fails with a clear error instead of silently degrading to a malformed\n// document block. Image MIME types not in `IMAGE_FORMATS` (e.g. `image/svg+xml`)\n// get an image-specific error so the caller knows it's a format-support issue,\n// not a kind-detection issue.\nexport const lower = Effect.fn(\"BedrockMedia.lower\")(function* (part: MediaPart) {\n const mime = part.mediaType.toLowerCase()\n const imageFormat = IMAGE_FORMATS[mime as keyof typeof IMAGE_FORMATS]\n if (imageFormat) {\n const media = ProviderShared.normalizeMedia(part)\n return { image: { format: imageFormat, source: { bytes: media.base64 } } } satisfies ImageBlock\n }\n if (mime.startsWith(\"image/\"))\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support image media type ${part.mediaType}`)\n const documentFormat = DOCUMENT_FORMATS[mime as keyof typeof DOCUMENT_FORMATS]\n if (documentFormat) {\n if (!part.filename)\n return yield* ProviderShared.invalidRequest(\"Bedrock Converse document media requires a filename\")\n const media = ProviderShared.normalizeMedia(part)\n return documentBlock(part.filename, documentFormat, media.base64)\n }\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support media type ${part.mediaType}`)\n})\n\nexport * as BedrockMedia from \"./bedrock-media.js\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n AIError,\n LLMEvent,\n Usage,\n type CacheHint,\n type FinishReason,\n type FinishReasonDetails,\n type JsonSchema,\n type LLMRequest,\n type LanguageModelToolSchemaCompatibility,\n type ProviderMetadata,\n type ReasoningPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolResultPart,\n} from \"../schema/index.js\"\nimport { BedrockEventStream } from \"./bedrock-event-stream.js\"\nimport { classifyProviderFailure } from \"../provider-error.js\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared.js\"\nimport { BedrockAuth } from \"./utils/bedrock-auth.js\"\nimport { BedrockCache } from \"./utils/bedrock-cache.js\"\nimport { BedrockMedia } from \"./utils/bedrock-media.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { ToolStream } from \"./utils/tool-stream.js\"\n\nconst ADAPTER = \"bedrock-converse\"\n\nexport type { Credentials as BedrockCredentials } from \"./utils/bedrock-auth.js\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst BedrockTextBlock = Schema.Struct({\n text: Schema.String,\n})\ntype BedrockTextBlock = Schema.Schema.Type<typeof BedrockTextBlock>\n\nconst BedrockToolUseBlock = Schema.Struct({\n toolUse: Schema.Struct({\n toolUseId: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n }),\n})\ntype BedrockToolUseBlock = Schema.Schema.Type<typeof BedrockToolUseBlock>\n\nconst BedrockToolResultContentItem = Schema.Union([\n Schema.Struct({ text: Schema.String }),\n Schema.Struct({ json: Schema.Unknown }),\n BedrockMedia.ImageBlock,\n BedrockMedia.DocumentBlock,\n])\n\nconst BedrockToolResultBlock = Schema.Struct({\n toolResult: Schema.Struct({\n toolUseId: Schema.String,\n content: Schema.Array(BedrockToolResultContentItem),\n status: Schema.optional(Schema.Literals([\"success\", \"error\"])),\n }),\n})\ntype BedrockToolResultBlock = Schema.Schema.Type<typeof BedrockToolResultBlock>\n\nconst BedrockReasoningBlock = Schema.Struct({\n reasoningContent: Schema.Union([\n Schema.Struct({\n reasoningText: Schema.Struct({\n text: Schema.String,\n signature: Schema.optional(Schema.String),\n }),\n }),\n Schema.Struct({ redactedContent: Schema.String }),\n ]),\n})\n\nconst BedrockUserBlock = Schema.Union([\n BedrockTextBlock,\n BedrockMedia.ImageBlock,\n BedrockMedia.DocumentBlock,\n BedrockToolResultBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockUserBlock = Schema.Schema.Type<typeof BedrockUserBlock>\n\nconst BedrockAssistantBlock = Schema.Union([\n BedrockTextBlock,\n BedrockReasoningBlock,\n BedrockToolUseBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockAssistantBlock = Schema.Schema.Type<typeof BedrockAssistantBlock>\n\nconst BedrockMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(BedrockUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(BedrockAssistantBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype BedrockMessage = Schema.Schema.Type<typeof BedrockMessage>\n\nconst BedrockSystemBlock = Schema.Union([BedrockTextBlock, BedrockCache.CachePointBlock])\ntype BedrockSystemBlock = Schema.Schema.Type<typeof BedrockSystemBlock>\n\nconst BedrockToolSpec = Schema.Struct({\n toolSpec: Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n inputSchema: Schema.Struct({\n json: JsonObject,\n }),\n }),\n})\ntype BedrockToolSpec = Schema.Schema.Type<typeof BedrockToolSpec>\n\nconst BedrockTool = Schema.Union([BedrockToolSpec, BedrockCache.CachePointBlock])\ntype BedrockTool = Schema.Schema.Type<typeof BedrockTool>\n\nconst BedrockToolChoice = Schema.Union([\n Schema.Struct({ auto: Schema.Struct({}) }),\n Schema.Struct({ any: Schema.Struct({}) }),\n Schema.Struct({ tool: Schema.Struct({ name: Schema.String }) }),\n])\n\nconst BedrockBodyFields = {\n modelId: Schema.String,\n messages: Schema.Array(BedrockMessage),\n system: optionalArray(BedrockSystemBlock),\n inferenceConfig: Schema.optional(\n Schema.Struct({\n maxTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n }),\n ),\n toolConfig: Schema.optional(\n Schema.Struct({\n tools: Schema.Array(BedrockTool),\n toolChoice: Schema.optional(BedrockToolChoice),\n }),\n ),\n additionalModelRequestFields: Schema.optional(JsonObject),\n}\nconst BedrockConverseBody = Schema.Struct(BedrockBodyFields)\nexport type BedrockConverseBody = Schema.Schema.Type<typeof BedrockConverseBody>\n\nconst BedrockUsageSchema = Schema.Struct({\n inputTokens: Schema.optional(Schema.Number),\n outputTokens: Schema.optional(Schema.Number),\n totalTokens: Schema.optional(Schema.Number),\n cacheReadInputTokens: Schema.optional(Schema.Number),\n cacheWriteInputTokens: Schema.optional(Schema.Number),\n})\ntype BedrockUsageSchema = Schema.Schema.Type<typeof BedrockUsageSchema>\n\nconst BedrockStreamException = Schema.Struct({\n message: Schema.optional(Schema.String),\n originalMessage: Schema.optional(Schema.String),\n originalStatusCode: Schema.optional(Schema.Number),\n})\n\n// Streaming event shape — the AWS event stream wraps each JSON payload by its\n// `:event-type` header (e.g. `messageStart`, `contentBlockDelta`). We\n// reconstruct that wrapping in `decodeFrames` below so the event schema can\n// stay a plain discriminated record.\nconst BedrockEvent = Schema.Struct({\n messageStart: Schema.optional(Schema.Struct({ role: Schema.String })),\n contentBlockStart: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n start: Schema.optional(\n Schema.Struct({\n toolUse: Schema.optional(Schema.Struct({ toolUseId: Schema.String, name: Schema.String })),\n }),\n ),\n }),\n ),\n contentBlockDelta: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n delta: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n toolUse: Schema.optional(Schema.Struct({ input: Schema.String })),\n reasoningContent: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n // Blob fields in Bedrock's JSON event stream are base64 strings.\n redactedContent: Schema.optional(Schema.String),\n // Vercel's Bedrock provider exposes the same delta under\n // Anthropic's shorter `data` spelling.\n data: Schema.optional(Schema.String),\n }),\n ),\n }),\n ),\n }),\n ),\n contentBlockStop: Schema.optional(Schema.Struct({ contentBlockIndex: Schema.Number })),\n messageStop: Schema.optional(\n Schema.Struct({\n stopReason: Schema.String,\n additionalModelResponseFields: Schema.optional(Schema.Unknown),\n }),\n ),\n metadata: Schema.optional(\n Schema.Struct({\n usage: Schema.optional(BedrockUsageSchema),\n metrics: Schema.optional(Schema.Unknown),\n }),\n ),\n internalServerException: Schema.optional(BedrockStreamException),\n modelStreamErrorException: Schema.optional(BedrockStreamException),\n validationException: Schema.optional(BedrockStreamException),\n throttlingException: Schema.optional(BedrockStreamException),\n serviceUnavailableException: Schema.optional(BedrockStreamException),\n})\ntype BedrockEvent = Schema.Schema.Type<typeof BedrockEvent>\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerToolSpec = (tool: ToolDefinition, inputSchema: JsonSchema): BedrockToolSpec => ({\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: inputSchema },\n },\n})\n\nconst lowerTools = (\n compatibility: LanguageModelToolSchemaCompatibility | undefined,\n breakpoints: BedrockCache.Breakpoints,\n tools: ReadonlyArray<ToolDefinition>,\n): BedrockTool[] => {\n const result: BedrockTool[] = []\n for (const tool of tools) {\n result.push(lowerToolSpec(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, compatibility)))\n const cachePoint = BedrockCache.block(breakpoints, tool.cache)\n if (cachePoint) result.push(cachePoint)\n }\n return result\n}\n\nconst textWithCache = (\n breakpoints: BedrockCache.Breakpoints,\n text: string,\n cache: CacheHint | undefined,\n): Array<BedrockTextBlock | BedrockCache.CachePointBlock> => {\n const cachePoint = BedrockCache.block(breakpoints, cache)\n return cachePoint ? [{ text }, cachePoint] : [{ text }]\n}\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Bedrock Converse\", toolChoice, {\n auto: () => ({ auto: {} }) as const,\n none: () => undefined,\n required: () => ({ any: {} }) as const,\n tool: (name) => ({ tool: { name } }) as const,\n })\n\nconst bedrockMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ bedrock: metadata })\n\nconst reasoningSignature = (part: ReasoningPart) => {\n const bedrock = part.providerMetadata?.bedrock\n return (\n part.encrypted ??\n (ProviderShared.isRecord(bedrock) && typeof bedrock.signature === \"string\" ? bedrock.signature : undefined)\n )\n}\n\nconst reasoningRedactedData = (part: ReasoningPart) => {\n const bedrock = part.providerMetadata?.bedrock\n return ProviderShared.isRecord(bedrock) && typeof bedrock.redactedData === \"string\" ? bedrock.redactedData : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart): BedrockToolUseBlock => ({\n toolUse: {\n toolUseId: part.id,\n name: part.name,\n input: part.input,\n },\n})\n\nconst lowerToolResultContent = Effect.fn(\"BedrockConverse.lowerToolResultContent\")(function* (part: ToolResultPart) {\n if (part.result.type === \"text\" || part.result.type === \"error\")\n return [{ text: ProviderShared.toolResultText(part) }]\n if (part.result.type === \"json\") return [{ json: part.result.value }]\n\n const content: Array<Schema.Schema.Type<typeof BedrockToolResultContentItem>> = []\n for (const item of part.result.value) {\n if (item.type === \"text\") {\n content.push({ text: item.text })\n continue\n }\n const media = yield* BedrockMedia.lower({\n type: \"media\",\n mediaType: item.mime,\n data: item.uri,\n filename: item.name,\n })\n content.push(media)\n }\n return content\n})\n\nconst lowerToolResult = Effect.fn(\"BedrockConverse.lowerToolResult\")(function* (part: ToolResultPart) {\n return {\n toolResult: {\n toolUseId: part.id,\n content: yield* lowerToolResultContent(part),\n status: part.result.type === \"error\" ? \"error\" : \"success\",\n },\n } satisfies BedrockToolResultBlock\n})\n\nconst lowerMessages = Effect.fn(\"BedrockConverse.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: BedrockCache.Breakpoints,\n) {\n const messages: BedrockMessage[] = []\n\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Bedrock Converse\", message)\n const content = textWithCache(breakpoints, part.text, part.cache)\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"user\") {\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"user\", [\"text\", \"media\"])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* BedrockMedia.lower(part))\n continue\n }\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: BedrockAssistantBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"assistant\", [\n \"text\",\n \"reasoning\",\n \"tool-call\",\n ])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"reasoning\") {\n const signature = reasoningSignature(part)\n const redactedData = reasoningRedactedData(part)\n if (signature === undefined && redactedData !== undefined) {\n content.push({ reasoningContent: { redactedContent: redactedData } })\n continue\n }\n content.push({ reasoningContent: { reasoningText: { text: part.text, signature } } })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(lowerToolCall(part))\n continue\n }\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"tool\", [\"tool-result\"])\n content.push(yield* lowerToolResult(part))\n const cachePoint = BedrockCache.block(breakpoints, part.cache)\n if (cachePoint) content.push(cachePoint)\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\n// System prompts share the cache-point convention: emit the text block, then\n// optionally a positional `cachePoint` marker.\nconst lowerSystem = (\n breakpoints: BedrockCache.Breakpoints,\n system: ReadonlyArray<LLMRequest[\"system\"][number]>,\n): BedrockSystemBlock[] => system.flatMap((part) => textWithCache(breakpoints, part.text, part.cache))\n\nconst fromRequest = Effect.fn(\"BedrockConverse.fromRequest\")(function* (request: LLMRequest) {\n const toolChoice = request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined\n const generation = request.generation\n // Bedrock-Claude shares Anthropic's 4-breakpoint cap. Spend the budget in\n // tools → system → messages order to favour the highest-impact prefixes.\n const breakpoints = BedrockCache.breakpoints()\n const toolConfig =\n request.tools.length > 0\n ? {\n tools: lowerTools(request.model.compatibility?.toolSchema, breakpoints, request.tools),\n // Converse has no native \"none\". Keep definitions stable for prompt\n // caching and omit only the unsupported choice.\n toolChoice,\n }\n : undefined\n const system = request.system.length === 0 ? undefined : lowerSystem(breakpoints, request.system)\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Bedrock Converse: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${BedrockCache.BEDROCK_BREAKPOINT_CAP} per request.`,\n )\n }\n return {\n modelId: request.model.id,\n messages,\n system,\n inferenceConfig:\n generation?.maxTokens === undefined &&\n generation?.temperature === undefined &&\n generation?.topP === undefined &&\n (generation?.stop === undefined || generation.stop.length === 0)\n ? undefined\n : {\n maxTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n stopSequences: generation?.stop,\n },\n toolConfig,\n // Converse's base inferenceConfig has no topK; Anthropic/Nova accept it\n // as a model-specific field, so it goes through additionalModelRequestFields.\n additionalModelRequestFields: generation?.topK === undefined ? undefined : { top_k: generation.topK },\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\") return \"stop\"\n if (reason === \"max_tokens\" || reason === \"model_context_window_exceeded\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"content_filtered\" || reason === \"guardrail_intervened\") return \"content-filter\"\n if (reason === \"malformed_model_output\" || reason === \"malformed_tool_use\") return \"error\"\n return \"unknown\"\n}\n\n// AWS reports inputTokens separately from cache reads and writes.\n// Bedrock does not break reasoning out of outputTokens for current models.\nconst mapUsage = (usage: BedrockUsageSchema | undefined): Usage | undefined => {\n if (!usage) return undefined\n const inputTokens = ProviderShared.sumTokens(\n usage.inputTokens,\n usage.cacheReadInputTokens,\n usage.cacheWriteInputTokens,\n )\n return new Usage({\n inputTokens,\n outputTokens: usage.outputTokens,\n nonCachedInputTokens: usage.inputTokens,\n cacheReadInputTokens: usage.cacheReadInputTokens,\n cacheWriteInputTokens: usage.cacheWriteInputTokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, usage.outputTokens, usage.totalTokens),\n providerMetadata: { bedrock: usage },\n })\n}\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n // Bedrock splits the finish into `messageStop` (carries `stopReason`) and\n // `metadata` (carries usage). Hold the terminal event in state so `onHalt`\n // can emit exactly one finish after both chunks have had a chance to arrive.\n readonly pendingFinish: { readonly reason: FinishReasonDetails; readonly usage?: Usage } | undefined\n readonly hasToolCalls: boolean\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignatures: Readonly<Record<number, string>>\n}\n\nconst step = (state: ParserState, event: BedrockEvent) =>\n Effect.gen(function* () {\n if (event.contentBlockStart?.start?.toolUse) {\n const index = event.contentBlockStart.contentBlockIndex\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, index, {\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n ],\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.text) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.textDelta(\n state.lifecycle,\n events,\n `text-${event.contentBlockDelta.contentBlockIndex}`,\n event.contentBlockDelta.delta.text,\n ),\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.reasoningContent) {\n const index = event.contentBlockDelta.contentBlockIndex\n const reasoning = event.contentBlockDelta.delta.reasoningContent\n const events: LLMEvent[] = []\n const redactedData = reasoning.redactedContent ?? reasoning.data\n const providerMetadata = reasoning.signature\n ? bedrockMetadata({ signature: reasoning.signature })\n : redactedData !== undefined\n ? bedrockMetadata({ redactedData })\n : undefined\n const lifecycle =\n reasoning.text !== undefined || providerMetadata !== undefined\n ? Lifecycle.reasoningDelta(\n state.lifecycle,\n events,\n `reasoning-${index}`,\n reasoning.text ?? \"\",\n providerMetadata,\n )\n : state.lifecycle\n return [\n {\n ...state,\n lifecycle,\n reasoningSignatures: reasoning.signature\n ? { ...state.reasoningSignatures, [index]: reasoning.signature }\n : state.reasoningSignatures,\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.toolUse) {\n const index = event.contentBlockDelta.contentBlockIndex\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n index,\n event.contentBlockDelta.delta.toolUse.input,\n \"Bedrock Converse tool delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] as const\n }\n\n if (event.contentBlockStop) {\n const index = event.contentBlockStop.contentBlockIndex\n const result = yield* ToolStream.finish(ADAPTER, state.tools, index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${index}`),\n events,\n `reasoning-${index}`,\n state.reasoningSignatures[index]\n ? bedrockMetadata({ signature: state.reasoningSignatures[index] })\n : undefined,\n )\n events.push(...resultEvents)\n return [\n {\n ...state,\n hasToolCalls:\n resultEvents.some((event) => LLMEvent.is.toolCall(event) || LLMEvent.is.toolInputError(event)) ||\n state.hasToolCalls,\n lifecycle,\n tools: result.tools,\n reasoningSignatures: Object.fromEntries(\n Object.entries(state.reasoningSignatures).filter(([key]) => key !== String(index)),\n ),\n },\n events,\n ] as const\n }\n\n if (event.messageStop) {\n return [\n {\n ...state,\n pendingFinish: {\n reason: {\n normalized: mapFinishReason(event.messageStop.stopReason),\n raw: event.messageStop.stopReason,\n },\n usage: state.pendingFinish?.usage,\n },\n },\n [],\n ] as const\n }\n\n if (event.metadata) {\n const usage = mapUsage(event.metadata.usage) ?? state.pendingFinish?.usage\n return [\n {\n ...state,\n pendingFinish: {\n reason: state.pendingFinish?.reason ?? { normalized: \"stop\" },\n usage,\n },\n },\n [],\n ] as const\n }\n\n const exception = (\n [\n [\"internalServerException\", event.internalServerException],\n [\"modelStreamErrorException\", event.modelStreamErrorException],\n [\"serviceUnavailableException\", event.serviceUnavailableException],\n [\"throttlingException\", event.throttlingException],\n [\"validationException\", event.validationException],\n ] as const\n ).find((entry) => entry[1] !== undefined)\n if (exception) {\n return yield* new AIError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({\n message: exception[1]?.message ?? exception[1]?.originalMessage ?? \"Bedrock Converse stream error\",\n code: exception[0],\n }),\n })\n }\n\n return [state, []] as const\n })\n\nconst framing = BedrockEventStream.framing(ADAPTER)\n\nconst onHalt = (state: ParserState): ReadonlyArray<LLMEvent> =>\n state.pendingFinish\n ? (() => {\n const events: LLMEvent[] = []\n Lifecycle.finish(state.lifecycle, events, {\n reason: {\n ...state.pendingFinish.reason,\n normalized:\n state.pendingFinish.reason.normalized === \"stop\" && state.hasToolCalls\n ? \"tool-calls\"\n : state.pendingFinish.reason.normalized,\n },\n usage: state.pendingFinish.usage,\n })\n return events\n })()\n : []\n\n// =============================================================================\n// Protocol And Bedrock Route\n// =============================================================================\n/**\n * The Bedrock Converse protocol — request body construction, body schema, and\n * the streaming-event state machine.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: BedrockConverseBody,\n from: fromRequest,\n },\n stream: {\n event: BedrockEvent,\n initial: () => ({\n tools: ToolStream.empty<number>(),\n pendingFinish: undefined,\n hasToolCalls: false,\n lifecycle: Lifecycle.initial(),\n reasoningSignatures: {},\n }),\n step,\n onHalt,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"bedrock\",\n providerMetadataKey: \"bedrock\",\n protocol,\n // Bedrock's URL embeds the region in the route endpoint host and the\n // validated modelId in the path. We read the validated body so the URL\n // matches the body that gets signed.\n endpoint: Endpoint.path<BedrockConverseBody>(\n ({ body }) => `/model/${encodeURIComponent(body.modelId)}/converse-stream`,\n ),\n auth: BedrockAuth.auth,\n framing,\n})\n\nexport const sigV4Auth = BedrockAuth.sigV4\n\nexport * as BedrockConverse from \"./bedrock-converse.js\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as BedrockConverse from \"../protocols/bedrock-converse.js\"\nimport type { BedrockCredentials } from \"../protocols/bedrock-converse.js\"\n\nexport const id = ProviderID.make(\"amazon-bedrock\")\n\nexport type Config = RouteDefaultsInput & {\n readonly apiKey?: string\n readonly headers?: Record<string, string>\n readonly credentials?: BedrockCredentials\n /** AWS region. Defaults to `us-east-1` when neither this nor `credentials.region` is set. */\n readonly region?: string\n /** Override the computed `https://bedrock-runtime.<region>.amazonaws.com` URL. */\n readonly baseURL?: string\n}\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly auth?: \"bearer\" | \"sigv4\"\n readonly baseURL?: string\n readonly credentials?: BedrockCredentials\n readonly region?: string\n readonly topP?: number\n}\nexport const routes = [BedrockConverse.route]\n\nconst bedrockBaseURL = (region: string) => `https://bedrock-runtime.${region}.amazonaws.com`\n\nconst configuredRoute = (input: Config) => {\n const { apiKey, credentials, region, baseURL, ...rest } = input\n const resolvedRegion = region ?? credentials?.region ?? \"us-east-1\"\n return BedrockConverse.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? bedrockBaseURL(resolvedRegion) },\n auth: apiKey === undefined ? BedrockConverse.sigV4Auth(credentials) : Auth.bearer(apiKey),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.auth === \"bearer\" && settings.apiKey === undefined)\n throw new Error(\"Amazon Bedrock bearer auth requires apiKey\")\n if (settings.auth === \"sigv4\" && settings.apiKey !== undefined)\n throw new Error(\"Amazon Bedrock SigV4 auth does not accept apiKey\")\n return configure({\n apiKey: settings.auth === \"sigv4\" ? undefined : settings.apiKey,\n baseURL: settings.baseURL,\n credentials: settings.credentials,\n generation: settings.topP === undefined ? undefined : { topP: settings.topP },\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n region: settings.region,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "738F4DBDF481657464756E2164756E21", | ||
| "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": ["../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": "CCBAD2B6A38D899B64756E2164756E21", | ||
| "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": ";23/BAEA,IAAe,IAET,EAAe,OAAO,KAAK,CAAQ,ECJoE,IAAM,EAAE,mBAAO,EAAE,KAAI,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,WAAW,oDAAoD,WAAW,KAAK,EAAE,OAAO,EAAE,IAAM,EAAE,CAAC,IAAI,IAAI,YAAY,IAAI,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,cAAc,KAAG,cAAc,CAAC,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,EAAE,MAAM,KAAK,WAAW,EAAE,WAAW,EAAE,WAAW,KAAK,MAAM,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,KAAK,mBAAmB,EAAE,KAAK,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,KAAK,GAAG,KAAK,QAAQ,KAAK,MAAM,MAAM,yDAAyD,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,MAAM,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,KAAK,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,MAAM,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,IAAI,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,KAAK,gBAAgB,EAAE,KAAK,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,OAAO,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,KAAK,QAAQ,GAAG,OAAO,EAAE,CAAC,KAAK,kBAAkB,EAAE,IAAI,EAAE,KAAK,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,KAAK,YAAY,EAAE,KAAK,WAAW,KAAK,OAAO,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE,UAAU,KAAK,WAAW,CAAC,EAAE,GAAG,KAAK,QAAQ,MAAM,KAAK,aAAa,EAAE,OAAO,KAAK,YAAY,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,KAAK,MAAM,YAAY,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,QAAQ,OAAO,KAAK,aAAa,KAAK,MAAM,cAAc,KAAK,KAAK,EAAE,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,YAAY,KAAK,QAAQ,KAAK,OAAO,IAAI,EAAE,KAAK,MAAM,KAAK,aAAa,KAAK,MAAM,KAAK,KAAK,MAAM,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,kBAAkB,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,GAAG,WAAW,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,SAAS,KAAK,KAAK,CAAC,EAAE,IAAI,IAAI,KAAK,oBAAoB,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE,QAAQ,KAAK,EAAE,GAAG,KAAK,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,SAAS,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,QAAQ,EAAE,QAAQ,GAAG,IAAI,KAAK,WAAW,GAAG,KAAK,gBAAgB,EAAE,KAAK,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,eAAe,EAAE,mCAAmC,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,KAAK,OAAO,IAAI,EAAE,OAAO,IAAI,EAAE,iBAAiB,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,KAAK,UAAU,KAAK,KAAK,EAAE,GAAG,KAAK,IAAI,EAAE,eAAe,EAAE,CAAC,KAAK,KAAK,QAAQ,KAAK,OAAO,KAAK,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,MAAM,KAAK,KAAK,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,KAAK,GAAG,WAAW,EAAE,UAAU,MAAM,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,SAAS,EAAE,GAAG,KAAK,KAAK,GAAG,EAAE,KAAK,SAAS,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,KAAK,KAAK,OAAO,MAAM,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,KAAK,QAAQ,KAAK,KAAK,GAAG,UAAU,KAAK,KAAK,GAAG,UAAU,EAAE,EAAE,GAAG,KAAK,KAAK,GAAG,WAAW,EAAE,UAAU,MAAM,KAAK,KAAK,GAAG,KAAK,KAAK,GAAG,EAAE,EAAE,KAAK,KAAK,GAAG,EAAE,EAAyS,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,MAAM,QAAQ,UAAU,UAAU,iBAAiB,uBAAuB,OAAO,aAAa,mBAAmB,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,GAAG,cAAc,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,cAAc,KAAK,oBAAoB,KAAK,mBAAmB,GAAG,KAAK,QAAQ,OAAO,KAAK,cAAc,IAAI,gBAAgB,CAAC,KAAK,OAAO,OAAO,EAAE,KAAK,OAAO,SAAS,EAAE,KAAK,SAAS,SAAS,GAAG,gBAAgB,cAAc,MAAM,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,KAAK,MAAM,EAAE,KAAK,OAAO,OAAO,KAAK,gBAAgB,OAAO,KAAK,UAAU,EAAE,EAAE,WAAW,KAAK,MAAM,EAAE,KAAK,OAAO,SAAS,KAAK,gBAAgB,SAAS,EAAE,KAAK,UAAU,EAAE,UAAU,KAAK,gBAAgB,SAAS,KAAK,iBAAiB,EAAE,iBAAiB,KAAK,gBAAgB,gBAAgB,KAAK,uBAAuB,EAAE,KAAK,gBAAgB,EAAE,KAAK,OAAO,EAAE,OAAO,KAAK,gBAAgB,MAAM,KAAK,aAAa,OAAO,KAAK,QAAQ,WAAW,EAAE,KAAK,gBAAgB,KAAK,EAAE,EAAE,KAAK,MAAM,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,KAAK,MAAM,EAAE,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,KAAK,KAAK,QAAQ,CAAC,GAAG,KAAK,eAAe,GAAG,SAAS,IAAI,EAAE,KAAK,KAAK,cAAc,EAAE,KAAK,IAAI,WAAW,EAAE,IAAI,KAAK,eAAe,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,KAAK,MAAM,EAAE,WAAW,EAAE,CAAC,QAAQ,KAAK,KAAK,eAAe,KAAK,eAAe,IAAI,KAAK,KAAK,YAAY,KAAK,eAAe,EAAE,EAAE,KAAK,eAAe,CAAC,KAAM,SAAQ,EAAE,CAAC,OAAO,KAAK,aAAc,SAAQ,CAAC,EAAE,CAAC,KAAK,UAAU,EAAE,CAAC,EAAE,KAAK,YAAY,EAAE,WAAW,KAAK,KAAK,SAAS,KAAM,KAAI,EAAE,CAAC,OAAO,KAAK,SAAU,KAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,KAAK,gBAAgB,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,SAAS,KAAK,gBAAgB,QAAQ,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,IAAI,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,KAAK,cAAc,GAAG,KAAK,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC,KAAM,OAAM,EAAE,CAAC,OAAO,KAAK,WAAY,OAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,gBAAgB,OAAO,EAAE,GAAG,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,KAAK,QAAQ,EAAE,OAAO,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,mBAAmB,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,KAAK,cAAc,KAAM,MAAK,EAAE,CAAC,OAAO,KAAK,UAAW,MAAK,CAAC,EAAE,CAAC,KAAK,OAAO,EAAE,OAAO,GAAG,aAAa,KAAK,aAAa,EAAE,CAAC,GAAG,KAAK,SAAS,KAAK,cAAc,KAAM,gBAAe,EAAE,CAAC,OAAO,KAAK,oBAAqB,gBAAe,CAAC,EAAE,CAAC,KAAK,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,CAAC,EAAE,KAAK,SAAS,KAAK,cAAc,KAAM,QAAO,EAAE,CAAC,OAAO,MAAM,WAAY,QAAO,CAAC,EAAE,CAAC,IAAI,MAAM,UAAU,MAAM,QAAQ,EAAE,KAAK,aAAa,EAAE,EAAE,MAAM,KAAK,KAAK,UAAU,KAAK,aAAa,EAAE,EAAE,KAAK,IAAI,OAAQ,SAAQ,EAAE,CAAC,OAAO,KAAK,aAAc,SAAQ,CAAC,EAAE,CAAC,KAAK,UAAU,EAAE,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,YAAY,KAAK,cAAc,KAAK,WAAW,GAAG,KAAK,SAAS,EAAE,MAAM,KAAK,KAAK,UAAU,KAAK,aAAa,GAAG,IAAI,EAAE,CAAC,KAAK,aAAa,KAAK,WAAW,GAAG,EAAE,KAAK,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,KAAK,QAAQ,KAAK,oBAAoB,GAAG,CAAC,EAAE,OAAO,IAAI,EAAE,KAAK,eAAe,GAAG,GAAG,CAAC,EAAE,OAAO,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,WAAW,EAAE,KAAK,OAAO,KAAK,mBAAmB,EAAE,KAAK,QAAQ,OAAO,EAAE,KAAK,MAAM,CAAC,EAAE,KAAK,aAAa,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,sBAAsB,EAAE,GAAG,EAAE,KAAK,GAAG,OAAO,WAAW,EAAE,CAAC,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,EAAE,ECA11N,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,ECGjH,SAAS,CAAuB,EAAG,CACxC,GAAI,CAAC,EAAsB,EAAE,QAAS,EAAgB", | ||
| "debugId": "09D56334DAD92E1A64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/mcp.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Mcp from \"./mcp.js\"\n\nimport { Schema } from \"effect\"\nimport { optional, PositiveInt } from \"./schema.js\"\nimport { IntegrationID } from \"./integration-id.js\"\n\nexport class TimeoutConfig extends Schema.Class<TimeoutConfig>(\"Mcp.TimeoutConfig\")({\n startup: PositiveInt.pipe(optional).annotate({\n description: \"Maximum time in milliseconds to establish and initialize the MCP server.\",\n }),\n catalog: PositiveInt.pipe(optional).annotate({\n description: \"Maximum time in milliseconds to wait for MCP discovery requests such as tools/list and prompts/list.\",\n }),\n execution: PositiveInt.pipe(optional).annotate({\n description: \"Maximum time in milliseconds to wait for MCP tool and prompt execution.\",\n }),\n}) {}\n\nexport class LocalConfig extends Schema.Class<LocalConfig>(\"Mcp.LocalConfig\")({\n type: Schema.Literal(\"local\"),\n command: Schema.String.pipe(Schema.Array),\n cwd: Schema.String.pipe(optional).annotate({\n description: \"Working directory for the MCP server process. Relative paths resolve from the workspace directory.\",\n }),\n environment: Schema.Record(Schema.String, Schema.String).pipe(optional),\n disabled: Schema.Boolean.pipe(optional),\n codemode: Schema.Boolean.pipe(optional).annotate({\n description: \"Expose this server's tools through Code Mode. Defaults to true.\",\n }),\n timeout: TimeoutConfig.pipe(optional),\n}) {}\n\nexport class OAuthConfig extends Schema.Class<OAuthConfig>(\"Mcp.OAuthConfig\")({\n client_id: Schema.String.pipe(optional),\n client_secret: Schema.String.pipe(optional),\n scope: Schema.String.pipe(optional),\n callback_port: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65535 })).pipe(optional),\n redirect_uri: Schema.String.pipe(optional),\n}) {}\n\nexport class RemoteConfig extends Schema.Class<RemoteConfig>(\"Mcp.RemoteConfig\")({\n type: Schema.Literal(\"remote\"),\n url: Schema.String,\n headers: Schema.Record(Schema.String, Schema.String).pipe(optional),\n oauth: Schema.Union([OAuthConfig, Schema.Literal(false)]).pipe(optional),\n disabled: Schema.Boolean.pipe(optional),\n codemode: Schema.Boolean.pipe(optional).annotate({\n description: \"Expose this server's tools through Code Mode. Defaults to true.\",\n }),\n timeout: TimeoutConfig.pipe(optional),\n}) {}\n\nexport const ServerConfig = Schema.Union([LocalConfig, RemoteConfig]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type ServerConfig = typeof ServerConfig.Type\n\nconst Connected = Schema.Struct({ status: Schema.Literal(\"connected\") }).annotate({\n identifier: \"Mcp.Status.Connected\",\n})\nconst Pending = Schema.Struct({ status: Schema.Literal(\"pending\") }).annotate({\n identifier: \"Mcp.Status.Pending\",\n})\nconst Disabled = Schema.Struct({ status: Schema.Literal(\"disabled\") }).annotate({\n identifier: \"Mcp.Status.Disabled\",\n})\nconst Failed = Schema.Struct({ status: Schema.Literal(\"failed\"), error: Schema.String }).annotate({\n identifier: \"Mcp.Status.Failed\",\n})\nconst NeedsAuth = Schema.Struct({ status: Schema.Literal(\"needs_auth\") }).annotate({\n identifier: \"Mcp.Status.NeedsAuth\",\n})\n\nexport type Status = typeof Status.Type\nexport const Status = Schema.Union([Connected, Pending, Disabled, Failed, NeedsAuth]).pipe(\n Schema.toTaggedUnion(\"status\"),\n)\n\nexport interface Server extends Schema.Schema.Type<typeof Server> {}\nexport const Server = Schema.Struct({\n name: Schema.String,\n status: Status,\n // Set for remote servers registered as OAuth integrations; lets clients act on the right integration\n // without matching by name, which could collide with provider or plugin integrations.\n integrationID: optional(IntegrationID),\n}).annotate({ identifier: \"Mcp.Server\" })\n\nexport interface Resource extends Schema.Schema.Type<typeof Resource> {}\nexport const Resource = Schema.Struct({\n server: Schema.String,\n name: Schema.String,\n uri: Schema.String,\n description: optional(Schema.String),\n mimeType: optional(Schema.String),\n}).annotate({ identifier: \"Mcp.Resource\" })\n\nexport interface ResourceTemplate extends Schema.Schema.Type<typeof ResourceTemplate> {}\nexport const ResourceTemplate = Schema.Struct({\n server: Schema.String,\n name: Schema.String,\n uriTemplate: Schema.String,\n description: optional(Schema.String),\n mimeType: optional(Schema.String),\n}).annotate({ identifier: \"Mcp.ResourceTemplate\" })\n\nexport interface ResourceCatalog extends Schema.Schema.Type<typeof ResourceCatalog> {}\nexport const ResourceCatalog = Schema.Struct({\n resources: Schema.Array(Resource),\n templates: Schema.Array(ResourceTemplate),\n}).annotate({ identifier: \"Mcp.ResourceCatalog\" })\n\nexport const ResourceContentPart = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"text\"),\n uri: Schema.String,\n text: Schema.String,\n mimeType: optional(Schema.String),\n }),\n Schema.Struct({\n type: Schema.Literal(\"blob\"),\n uri: Schema.String,\n blob: Schema.String,\n mimeType: optional(Schema.String),\n }),\n]).pipe(Schema.toTaggedUnion(\"type\"), Schema.annotate({ identifier: \"Mcp.ResourceContentPart\" }))\nexport type ResourceContentPart = typeof ResourceContentPart.Type\n\nexport interface ResourceContent extends Schema.Schema.Type<typeof ResourceContent> {}\nexport const ResourceContent = Schema.Struct({\n server: Schema.String,\n uri: Schema.String,\n contents: Schema.Array(ResourceContentPart),\n}).annotate({ identifier: \"Mcp.ResourceContent\" })\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E0657137D560DE4E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/filesystem.ts"], | ||
| "sourcesContent": [ | ||
| "export * as FileSystem from \"./filesystem.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { NonNegativeInt, PositiveInt, RelativePath } from \"./schema.js\"\n\nconst Changed = ephemeral({\n type: \"filesystem.changed\",\n schema: {\n file: Schema.String,\n event: Schema.Literals([\"add\", \"change\", \"unlink\"]),\n },\n})\nexport const Event = { Changed, Definitions: inventory(Changed) }\n\nexport interface Entry extends Schema.Schema.Type<typeof Entry> {}\nexport const Entry = Schema.Struct({\n path: RelativePath,\n type: Schema.Literals([\"file\", \"directory\"]),\n}).annotate({ identifier: \"FileSystem.Entry\" })\n\nexport interface Submatch extends Schema.Schema.Type<typeof Submatch> {}\nexport const Submatch = Schema.Struct({\n text: Schema.String,\n start: NonNegativeInt,\n end: NonNegativeInt,\n}).annotate({ identifier: \"FileSystem.Submatch\" })\n\nexport interface Match extends Schema.Schema.Type<typeof Match> {}\nexport const Match = Schema.Struct({\n entry: Entry,\n line: PositiveInt,\n offset: NonNegativeInt,\n text: Schema.String,\n submatches: Schema.Array(Submatch),\n}).annotate({ identifier: \"FileSystem.Match\" })\n\nexport class FindInput extends Schema.Class<FindInput>(\"FileSystem.FindInput\")({\n query: Schema.String,\n type: Schema.Literals([\"file\", \"directory\"]).pipe(optional),\n limit: PositiveInt.pipe(optional),\n}) {}\n" | ||
| ], | ||
| "mappings": ";oVAOA,IAAM,EAAU,EAAU,CACxB,KAAM,qBACN,OAAQ,CACN,KAAM,EAAO,OACb,MAAO,EAAO,SAAS,CAAC,MAAO,SAAU,QAAQ,CAAC,CACpD,CACF,CAAC,EACY,EAAQ,CAAE,UAAS,YAAa,EAAU,CAAO,CAAE,EAGnD,EAAQ,EAAO,OAAO,CACjC,KAAM,EACN,KAAM,EAAO,SAAS,CAAC,OAAQ,WAAW,CAAC,CAC7C,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAW,EAAO,OAAO,CACpC,KAAM,EAAO,OACb,MAAO,EACP,IAAK,CACP,CAAC,EAAE,SAAS,CAAE,WAAY,qBAAsB,CAAC,EAGpC,EAAQ,EAAO,OAAO,CACjC,MAAO,EACP,KAAM,EACN,OAAQ,EACR,KAAM,EAAO,OACb,WAAY,EAAO,MAAM,CAAQ,CACnC,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEvC,MAAM,UAAkB,EAAO,MAAiB,sBAAsB,EAAE,CAC7E,MAAO,EAAO,OACd,KAAM,EAAO,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,KAAK,CAAQ,EAC1D,MAAO,EAAY,KAAK,CAAQ,CAClC,CAAC,CAAE,CAAC", | ||
| "debugId": "F159596FE782599E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../util/src/session-title-fallback.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SessionTitleFallback from \"./session-title-fallback.js\"\n\nconst pattern = /^(New session|Child session) - \\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/\n\ninterface Info {\n readonly title?: string\n readonly parentID?: string\n readonly time: {\n readonly created: number\n }\n}\n\n/** Supplies the timestamped title required by compatibility surfaces. */\nexport function withTimestampedFallback(info: Info) {\n return info.title ?? fallback(info)\n}\n\n/** Supplies a compact human label and collapses historical timestamped fallbacks. */\nexport function displayLabel(info: Pick<Info, \"title\" | \"parentID\">) {\n if (!info.title) return info.parentID ? \"Child session\" : \"New session\"\n return info.title.match(pattern)?.[1] ?? info.title\n}\n\n/** Recognizes missing and historical root or child fallback titles. */\nexport function isFallbackTitle(title?: string) {\n return title === undefined || pattern.test(title)\n}\n\n/** Recognizes a missing title or the exact root fallback for this session. */\nexport function isExactRootFallback(info: Pick<Info, \"title\" | \"time\">) {\n return info.title === undefined || info.title === fallback({ time: info.time })\n}\n\nfunction fallback(info: Pick<Info, \"parentID\" | \"time\">) {\n return `${info.parentID ? \"Child\" : \"New\"} session - ${new Date(info.time.created).toISOString()}`\n}\n" | ||
| ], | ||
| "mappings": ";AAEA,IAAM,EAAU,8EAWT,SAAS,CAAuB,CAAC,EAAY,CAClD,OAAO,EAAK,OAAS,EAAS,CAAI,EAU7B,SAAS,CAAe,CAAC,EAAgB,CAC9C,OAAO,IAAU,QAAa,EAAQ,KAAK,CAAK,EAI3C,SAAS,CAAmB,CAAC,EAAoC,CACtE,OAAO,EAAK,QAAU,QAAa,EAAK,QAAU,EAAS,CAAE,KAAM,EAAK,IAAK,CAAC,EAGhF,SAAS,CAAQ,CAAC,EAAuC,CACvD,MAAO,GAAG,EAAK,SAAW,QAAU,mBAAmB,IAAI,KAAK,EAAK,KAAK,OAAO,EAAE,YAAY", | ||
| "debugId": "B63FCE4E2AE0361864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/anthropic-compatible.ts", "../ai/src/providers/anthropic.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package.js\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\n\nexport type AnthropicOptionsInput = AnthropicMessages.OptionsInput\nexport type AnthropicProviderOptionsInput = AnthropicMessages.ProviderOptionsInput\nexport type AnthropicThinkingInput = AnthropicMessages.ThinkingInput\n\nexport const id = ProviderID.make(\"anthropic-compatible\")\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL: string\n readonly provider?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport const routes = [AnthropicMessages.route]\n\nconst auth = (input: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\").pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config) => {\n if (!input.baseURL) throw new Error(\"Anthropic-compatible providers require a baseURL\")\n const provider = input.provider ?? \"anthropic-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = AnthropicMessages.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: auth(input),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model<AnthropicMessages.ProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, AnthropicMessages.ProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic-compatible apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n provider: settings.provider,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n\nexport * as AnthropicCompatible from \"./anthropic-compatible.js\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages.js\"\nimport { AnthropicCompatible } from \"./anthropic-compatible.js\"\n\nexport type AnthropicOptionsInput = AnthropicMessages.OptionsInput\nexport type AnthropicProviderOptionsInput = AnthropicMessages.ProviderOptionsInput\nexport type AnthropicThinkingInput = AnthropicMessages.ThinkingInput\n\nexport const id = ProviderID.make(\"anthropic\")\n\nexport const routes = [AnthropicMessages.route]\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"ANTHROPIC_API_KEY\"))\n .pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config = {}) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n const compatible = AnthropicCompatible.configure({\n ...rest,\n auth: auth(input),\n baseURL: baseURL ?? AnthropicMessages.DEFAULT_BASE_URL,\n provider: id,\n })\n return {\n id,\n model: (modelID: string | ModelID) => compatible.model(modelID),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, AnthropicMessages.ProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";8mBAWO,IAAM,EAAK,EAAW,KAAK,sBAAsB,EAmB3C,EAAS,CAAC,EAAkB,KAAK,EAExC,EAAO,CAAC,IAA0C,CACtD,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EAAE,KAAK,EAAK,OAAO,WAAW,CAAC,GAG/F,EAAY,CAAC,IAAkB,CAC1C,GAAI,CAAC,EAAM,QAAS,MAAU,MAAM,kDAAkD,EACtF,IAAM,EAAW,EAAM,UAAY,wBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAAQ,EAAkB,MAAM,KAAK,IACtC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAK,CAAK,CAClB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAA8C,CAAE,GAAI,CAAQ,CAAC,EACzG,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEa,EAA+F,CAC1G,EACA,IACG,CACH,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,+DAA+D,EACjF,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO,GC5DX,IAAM,EAAK,EAAW,KAAK,WAAW,EAEhC,EAAS,CAAC,EAAkB,KAAK,EAiBxC,EAAO,CAAC,IAA4C,CACxD,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAO,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,EAC5E,OAAO,EAAK,OAAO,mBAAmB,CAAC,EACvC,KAAK,EAAK,OAAO,WAAW,CAAC,GAGrB,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EAC/C,EAAa,EAAoB,UAAU,IAC5C,EACH,KAAM,EAAK,CAAK,EAChB,QAAS,GAAW,EAAkB,iBACtC,SAAU,CACZ,CAAC,EACD,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAW,MAAM,CAAO,EAC9D,WACF,GAGW,EAAW,EAAU,EACrB,EAA+F,CAC1G,EACA,IACG,CACH,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,oDAAoD,EACtE,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "79A769C3410120FC64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openrouter.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport { ProviderID, type CacheHint, type ModelID } from \"../schema/index.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport { newBreakpoints, ttlBucket } from \"../protocols/utils/cache.js\"\nimport { isRecord } from \"../protocols/shared.js\"\n\nexport const profile = OpenAICompatibleProfiles.profiles.openrouter\nexport const id = ProviderID.make(profile.provider)\nconst ADAPTER = \"openrouter\"\n\ntype OpenRouterString<Known extends string> = Known | (string & {})\n\nexport interface OpenRouterProviderRouting {\n readonly [key: string]: unknown\n readonly order?: ReadonlyArray<string>\n readonly allow_fallbacks?: boolean\n readonly require_parameters?: boolean\n readonly data_collection?: OpenRouterString<\"allow\" | \"deny\">\n readonly only?: ReadonlyArray<string>\n readonly ignore?: ReadonlyArray<string>\n readonly quantizations?: ReadonlyArray<string>\n readonly sort?: OpenRouterString<\"price\" | \"throughput\" | \"latency\">\n readonly max_price?: Readonly<{\n prompt?: number | string\n completion?: number | string\n image?: number | string\n audio?: number | string\n request?: number | string\n }>\n readonly zdr?: boolean\n}\n\nexport type OpenRouterPlugin =\n | Readonly<{\n id: \"web\"\n max_results?: number\n search_prompt?: string\n engine?: OpenRouterString<\"native\" | \"exa\">\n }>\n | Readonly<{ id: \"file-parser\"; max_files?: number; pdf?: { engine?: string } }>\n | Readonly<{ id: \"moderation\" }>\n | Readonly<{ id: \"response-healing\" }>\n | Readonly<{ id: \"auto-router\"; allowed_models?: ReadonlyArray<string> }>\n | Readonly<{ id: string & {}; [key: string]: unknown }>\n\nexport interface OpenRouterOptions {\n readonly [key: string]: unknown\n readonly debug?: Readonly<{ echo_upstream_body?: boolean }>\n readonly models?: ReadonlyArray<string>\n readonly plugins?: ReadonlyArray<OpenRouterPlugin>\n readonly provider?: OpenRouterProviderRouting\n readonly reasoning?: Readonly<{\n enabled?: boolean\n exclude?: boolean\n effort?: OpenRouterString<\"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\">\n max_tokens?: number\n }>\n readonly usage?: boolean | Readonly<{ include: boolean }>\n readonly user?: string\n readonly web_search_options?: Readonly<{\n max_results?: number\n search_prompt?: string\n engine?: OpenRouterString<\"native\" | \"exa\">\n }>\n}\n\nexport type OpenRouterProviderOptionsInput = OpenRouterOptions\n\nexport type LanguageModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: OpenRouterProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: OpenRouterProviderOptionsInput\n}\n\nconst OpenRouterBody = Schema.StructWithRest(Schema.Struct(OpenAIChat.bodyFields), [\n Schema.Record(Schema.String, Schema.Any),\n])\nexport type OpenRouterBody = Schema.Schema.Type<typeof OpenRouterBody>\n\nexport const protocol = Protocol.make({\n id: \"openrouter-chat\",\n body: {\n schema: OpenRouterBody,\n from: (request) =>\n OpenAIChat.fromRequest(request, { cacheControl: cacheControl() }).pipe(\n Effect.map((body) => {\n const sourceAssistants = request.messages.filter((message) => message.role === \"assistant\")\n let assistantIndex = 0\n const messages = body.messages.map((message) => {\n if (message.role !== \"assistant\") return message\n const source = sourceAssistants[assistantIndex++]\n const reasoning = source?.content\n .filter((part) => part.type === \"reasoning\")\n .map((part) => part.text)\n .join(\"\")\n const reasoningDetails = Array.isArray(message.reasoning_details) ? message.reasoning_details : undefined\n return {\n ...message,\n reasoning_content: undefined,\n reasoning_text: undefined,\n reasoning: reasoning && reasoningDetails && reasoningDetails.length > 0 ? reasoning : undefined,\n reasoning_details: reasoningDetails,\n }\n })\n return {\n ...body,\n messages,\n ...bodyOptions(request.providerOptions),\n ...(request.promptCacheKey ? { prompt_cache_key: request.promptCacheKey } : {}),\n } as OpenRouterBody\n }),\n ),\n },\n stream: OpenAIChat.protocol.stream,\n})\n\nconst cacheControl = () => {\n const breakpoints = newBreakpoints(4)\n return (cache: CacheHint | undefined) => {\n if (cache === undefined || breakpoints.remaining === 0) return undefined\n breakpoints.remaining -= 1\n return {\n type: \"ephemeral\" as const,\n ...(ttlBucket(cache.ttlSeconds) === \"1h\" ? { ttl: \"1h\" } : {}),\n }\n }\n}\n\nconst bodyOptions = (input: unknown) => {\n const openrouter = isRecord(input) ? input : {}\n const { usage, models, provider, plugins, web_search_options, debug, user, reasoning, promptCacheKey, ...options } =\n openrouter\n return {\n ...options,\n ...(usage === undefined || usage === true\n ? { usage: { include: true } }\n : usage === false\n ? { usage: { include: false } }\n : isRecord(usage)\n ? { usage }\n : {}),\n ...(Array.isArray(models) ? { models } : {}),\n ...(isRecord(provider) ? { provider } : {}),\n ...(Array.isArray(plugins) ? { plugins } : {}),\n ...(isRecord(web_search_options) ? { web_search_options } : {}),\n ...(isRecord(debug) ? { debug } : {}),\n ...(typeof user === \"string\" ? { user } : {}),\n ...(isRecord(reasoning) ? { reasoning } : {}),\n }\n}\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: profile.provider,\n protocol,\n endpoint: Endpoint.path(\"/chat/completions\", { baseURL: profile.baseURL }),\n framing: Framing.sse,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: LanguageModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return route.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? profile.baseURL },\n auth: AuthOptions.bearer(input, \"OPENROUTER_API_KEY\"),\n })\n}\n\nexport const configure = (input: LanguageModelOptions = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<OpenRouterProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, OpenRouterProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "3C2E1E2D376C4D5064756E2164756E21", | ||
| "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": "CAB82E072995FE1C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/string-width.bun.ts", "../tui/src/util/locale.ts"], | ||
| "sourcesContent": [ | ||
| "export const stringWidth = Bun.stringWidth\n", | ||
| "import { stringWidth } from \"./string-width\"\n\nexport function titlecase(str: string) {\n return str.replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport function time(input: number): string {\n const date = new Date(input)\n return date.toLocaleTimeString(undefined, { timeStyle: \"short\" })\n}\n\nexport function datetime(input: number): string {\n const date = new Date(input)\n const localTime = time(input)\n const localDate = date.toLocaleDateString()\n return `${localTime} · ${localDate}`\n}\n\nexport function number(num: number): string {\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + \"M\"\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + \"K\"\n }\n return num.toString()\n}\n\nexport function duration(input: number) {\n if (input < 1000) {\n return `${input}ms`\n }\n if (input < 60000) {\n return `${(input / 1000).toFixed(1)}s`\n }\n if (input < 3600000) {\n const minutes = Math.floor(input / 60000)\n const seconds = Math.floor((input % 60000) / 1000)\n return `${minutes}m ${seconds}s`\n }\n if (input < 86400000) {\n const hours = Math.floor(input / 3600000)\n const minutes = Math.floor((input % 3600000) / 60000)\n return `${hours}h ${minutes}m`\n }\n const days = Math.floor(input / 86400000)\n const hours = Math.floor((input % 86400000) / 3600000)\n return `${days}d ${hours}h`\n}\n\nexport function truncate(str: string, len: number): string {\n if (str.length <= len) return str\n return str.slice(0, len - 1) + \"…\"\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n\nexport function graphemes(str: string) {\n return Array.from(graphemeSegmenter.segment(str), (item) => item.segment)\n}\n\nexport function takeWidth(str: string, width: number) {\n if (width <= 0) return \"\"\n if (stringWidth(str) <= width) return str\n\n const result: string[] = []\n let used = 0\n for (const segment of graphemes(str)) {\n const next = stringWidth(segment)\n if (used + next > width) break\n result.push(segment)\n used += next\n }\n return result.join(\"\")\n}\n\nexport function truncateWidth(str: string, width: number): string {\n if (width <= 0) return \"\"\n if (stringWidth(str) <= width) return str\n if (width === 1) return \"…\"\n return takeWidth(str, width - 1) + \"…\"\n}\n\nexport function truncateLeft(str: string, len: number): string {\n if (str.length <= len) return str\n return \"…\" + str.slice(-(len - 1))\n}\n\nexport function truncateMiddle(str: string, maxLength: number = 35): string {\n if (str.length <= maxLength) return str\n\n const ellipsis = \"…\"\n const keepStart = Math.ceil((maxLength - ellipsis.length) / 2)\n const keepEnd = Math.floor((maxLength - ellipsis.length) / 2)\n\n return str.slice(0, keepStart) + ellipsis + str.slice(-keepEnd)\n}\n\nexport * as Locale from \"./locale\"\n" | ||
| ], | ||
| "mappings": ";kQAAO,IAAM,EAAc,IAAI,YCExB,SAAS,CAAS,CAAC,EAAa,CACrC,OAAO,EAAI,QAAQ,QAAS,CAAC,IAAM,EAAE,YAAY,CAAC,EAG7C,SAAS,CAAI,CAAC,EAAuB,CAE1C,OADa,IAAI,KAAK,CAAK,EACf,mBAAmB,OAAW,CAAE,UAAW,OAAQ,CAAC,EAG3D,SAAS,CAAQ,CAAC,EAAuB,CAC9C,IAAM,EAAO,IAAI,KAAK,CAAK,EACrB,EAAY,EAAK,CAAK,EACtB,EAAY,EAAK,mBAAmB,EAC1C,MAAO,GAAG,UAAe,IAGpB,SAAS,CAAM,CAAC,EAAqB,CAC1C,GAAI,GAAO,IACT,OAAQ,EAAM,KAAS,QAAQ,CAAC,EAAI,IAC/B,QAAI,GAAO,KAChB,OAAQ,EAAM,MAAM,QAAQ,CAAC,EAAI,IAEnC,OAAO,EAAI,SAAS,EAGf,SAAS,CAAQ,CAAC,EAAe,CACtC,GAAI,EAAQ,KACV,MAAO,GAAG,MAEZ,GAAI,EAAQ,MACV,MAAO,IAAI,EAAQ,MAAM,QAAQ,CAAC,KAEpC,GAAI,EAAQ,QAAS,CACnB,IAAM,EAAU,KAAK,MAAM,EAAQ,KAAK,EAClC,EAAU,KAAK,MAAO,EAAQ,MAAS,IAAI,EACjD,MAAO,GAAG,MAAY,KAExB,GAAI,EAAQ,SAAU,CACpB,IAAM,EAAQ,KAAK,MAAM,EAAQ,OAAO,EAClC,EAAU,KAAK,MAAO,EAAQ,QAAW,KAAK,EACpD,MAAO,GAAG,MAAU,KAEtB,IAAM,EAAO,KAAK,MAAM,EAAQ,QAAQ,EAClC,EAAQ,KAAK,MAAO,EAAQ,SAAY,OAAO,EACrD,MAAO,GAAG,MAAS,KAGd,SAAS,CAAQ,CAAC,EAAa,EAAqB,CACzD,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,OAAO,EAAI,MAAM,EAAG,EAAM,CAAC,EAAI,SAGjC,IAAM,EAAoB,IAAI,KAAK,UAAU,OAAW,CAAE,YAAa,UAAW,CAAC,EAE5E,SAAS,CAAS,CAAC,EAAa,CACrC,OAAO,MAAM,KAAK,EAAkB,QAAQ,CAAG,EAAG,CAAC,IAAS,EAAK,OAAO,EAGnE,SAAS,CAAS,CAAC,EAAa,EAAe,CACpD,GAAI,GAAS,EAAG,MAAO,GACvB,GAAI,EAAY,CAAG,GAAK,EAAO,OAAO,EAEtC,IAAM,EAAmB,CAAC,EACtB,EAAO,EACX,QAAW,KAAW,EAAU,CAAG,EAAG,CACpC,IAAM,EAAO,EAAY,CAAO,EAChC,GAAI,EAAO,EAAO,EAAO,MACzB,EAAO,KAAK,CAAO,EACnB,GAAQ,EAEV,OAAO,EAAO,KAAK,EAAE,EAGhB,SAAS,CAAa,CAAC,EAAa,EAAuB,CAChE,GAAI,GAAS,EAAG,MAAO,GACvB,GAAI,EAAY,CAAG,GAAK,EAAO,OAAO,EACtC,GAAI,IAAU,EAAG,MAAO,SACxB,OAAO,EAAU,EAAK,EAAQ,CAAC,EAAI,SAG9B,SAAS,CAAY,CAAC,EAAa,EAAqB,CAC7D,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,MAAO,SAAM,EAAI,MAAM,EAAE,EAAM,EAAE,EAG5B,SAAS,CAAc,CAAC,EAAa,EAAoB,GAAY,CAC1E,GAAI,EAAI,QAAU,EAAW,OAAO,EAEpC,IAAM,EAAW,SACX,EAAY,KAAK,MAAM,EAAY,EAAS,QAAU,CAAC,EACvD,EAAU,KAAK,OAAO,EAAY,EAAS,QAAU,CAAC,EAE5D,OAAO,EAAI,MAAM,EAAG,CAAS,EAAI,EAAW,EAAI,MAAM,CAAC,CAAO", | ||
| "debugId": "B10A9CAB070A7DB864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/tool.ts", "../schema/src/llm.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Tool from \"./tool.js\"\n\nimport { Effect, JsonSchema, Schema } from \"effect\"\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from \"@standard-schema/spec\"\nimport type { Agent } from \"./agent.js\"\nimport type { Session } from \"./session.js\"\nimport type { SessionMessage } from \"./session-message.js\"\n\nexport type Metadata = Readonly<Record<string, any>>\n\nexport const CallID = Schema.String.pipe(Schema.brand(\"Tool.CallID\"))\nexport type CallID = typeof CallID.Type\n\nexport interface Context {\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly id: CallID\n readonly progress: (update: Metadata) => Effect.Effect<void>\n}\n\ninterface BaseOptions {\n readonly namespace?: string\n readonly permission?: string\n}\n\nexport type Options = BaseOptions &\n (\n | {\n readonly codemode?: true\n readonly pinned?: boolean\n }\n | {\n readonly codemode: boolean\n readonly pinned?: never\n }\n )\n\nexport type ValueSchema<A = unknown> =\n | Schema.Codec<A, any>\n | (StandardSchemaV1<any, A> & StandardJSONSchemaV1<any, A>)\n | JsonSchema.JsonSchema\n\ntype InputValue<S> = 0 extends 1 & S\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : unknown\ntype OutputValue<S> = S extends undefined\n ? never\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<infer A, any>\n ? A\n : any\n\nexport class Error extends Schema.TaggedError<Error>()(\"Tool.Error\", {\n message: Schema.String,\n error: Schema.optional(Schema.Defect()),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport interface TextContent extends Schema.Schema.Type<typeof TextContent> {}\nexport const TextContent = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n}).annotate({ identifier: \"Tool.TextContent\" })\n\nexport interface FileContent extends Schema.Schema.Type<typeof FileContent> {}\nexport const FileContent = Schema.Struct({\n type: Schema.Literal(\"file\"),\n uri: Schema.String,\n mime: Schema.String,\n name: Schema.optional(Schema.String),\n}).annotate({ identifier: \"Tool.FileContent\" })\n\nexport const Content = Schema.Union([TextContent, FileContent])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Tool.Content\" })\nexport type Content = Schema.Schema.Type<typeof Content>\n\nexport interface Result<Output extends ValueSchema<any> | undefined = ValueSchema<any> | undefined> {\n readonly output?: OutputValue<Output>\n readonly content?: string | ReadonlyArray<Content>\n readonly metadata?: Metadata\n}\n\nexport type Info<\n Input extends ValueSchema<any> = ValueSchema<any>,\n Output extends ValueSchema<any> | undefined = ValueSchema<any> | undefined,\n> = {\n readonly name: string\n readonly input: Input\n readonly description: string\n readonly execute: (input: InputValue<Input>, context: Context) => Effect.Effect<Result<Output>, Error>\n readonly output?: Output\n readonly options?: Options\n}\n", | ||
| "export * as LLM from \"./llm.js\"\n\nimport { Schema } from \"effect\"\n\nexport const FinishReason = Schema.Literals([\"stop\", \"length\", \"tool-calls\", \"content-filter\", \"error\", \"unknown\"])\nexport type FinishReason = typeof FinishReason.Type\n" | ||
| ], | ||
| "mappings": ";8MAUO,IAAM,EAAS,EAAO,OAAO,KAAK,EAAO,MAAM,aAAa,CAAC,EAgD7D,MAAM,UAAc,EAAO,YAAmB,EAAE,aAAc,CACnE,QAAS,EAAO,OAChB,MAAO,EAAO,SAAS,EAAO,OAAO,CAAC,EACtC,SAAU,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CACxE,CAAC,CAAE,CAAC,CAGG,IAAM,EAAc,EAAO,OAAO,CACvC,KAAM,EAAO,QAAQ,MAAM,EAC3B,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAc,EAAO,OAAO,CACvC,KAAM,EAAO,QAAQ,MAAM,EAC3B,IAAK,EAAO,OACZ,KAAM,EAAO,OACb,KAAM,EAAO,SAAS,EAAO,MAAM,CACrC,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEjC,EAAU,EAAO,MAAM,CAAC,EAAa,CAAW,CAAC,EAC3D,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,cAAe,CAAC,+CC5EnC,IAAM,EAAe,EAAO,SAAS,CAAC,OAAQ,SAAU,aAAc,iBAAkB,QAAS,SAAS,CAAC", | ||
| "debugId": "ECD73F973C136C4564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/session-transfer.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SessionTransfer from \"./session-transfer.js\"\n\nimport { Schema } from \"effect\"\nimport { Session } from \"./session.js\"\nimport { SessionMessage } from \"./session-message.js\"\n\nexport interface Data extends Schema.Schema.Type<typeof Data> {}\nexport const Data = Schema.Struct({\n info: Session.Info,\n messages: Schema.Array(SessionMessage.Info),\n}).annotate({ identifier: \"SessionTransfer.Data\" })\n" | ||
| ], | ||
| "mappings": ";iQAOO,IAAM,EAAO,EAAO,OAAO,CAChC,KAAM,EAAQ,KACd,SAAU,EAAO,MAAM,EAAe,IAAI,CAC5C,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC", | ||
| "debugId": "A13C36E37D6595E964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/util/io.ts", "src/session-target.ts"], | ||
| "sourcesContent": [ | ||
| "import { text } from \"node:stream/consumers\"\n\nexport function readStdin() {\n return text(process.stdin)\n}\n", | ||
| "import type { LocationGetOutput, ModelRef, OpenCodeClient, SessionInfo } from \"@opencode-ai/client/promise\"\nimport { Model } from \"@opencode-ai/schema/model\"\n\nconst SESSION_PAGE_LIMIT = 50\n\nexport type SessionTarget = {\n session: SessionInfo\n location: LocationGetOutput\n model: ModelRef | undefined\n agent: string | undefined\n resume: boolean\n}\n\nexport type SessionTargetPreparation = (input: {\n client: OpenCodeClient\n location: LocationGetOutput\n session: SessionInfo | undefined\n model: ModelRef | undefined\n agent: string | undefined\n signal?: AbortSignal\n}) => Promise<{ model: ModelRef | undefined; agent: string | undefined }>\n\nexport class SessionTargetMutationError extends Error {\n override readonly name = \"SessionTargetMutationError\"\n\n constructor(cause: unknown) {\n super(cause instanceof Error ? cause.message : \"Session target mutation failed\", { cause })\n }\n}\n\nexport async function resolveSessionTarget(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: ModelRef\n agent?: string\n environment?: Readonly<Record<string, string>>\n prepare: SessionTargetPreparation\n signal?: AbortSignal\n}): Promise<SessionTarget> {\n const selection = await selectSession(input)\n const selected = selection.session\n const location =\n selection.location ??\n (await resolveLocation(\n input.client,\n selected ? { directory: selected.location.directory, workspace: selected.location.workspaceID } : input.location,\n input.signal,\n ))\n const prepared = await input.prepare({\n client: input.client,\n location,\n session: selected,\n model: input.model ?? selected?.model,\n agent: input.agent ?? selected?.agent,\n signal: input.signal,\n })\n const session =\n selected ??\n (await input.client.session\n .create(\n {\n agent: prepared.agent,\n model: prepared.model,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n },\n ...requestOptions(input.signal),\n )\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n }))\n if (input.environment !== undefined && location.workspaceID === undefined)\n await input.client.session\n .environment({ sessionID: session.id, variables: input.environment }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n return {\n session,\n location,\n model: prepared.model,\n agent: prepared.agent ?? session.agent,\n resume: selected !== undefined,\n }\n}\n\nexport function parseSessionTargetModel(value?: string): ModelRef | undefined {\n if (!value) return\n const model = Model.Ref.parse(value)\n return { providerID: model.providerID, id: model.id, variant: model.variant }\n}\n\nasync function selectSession(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n signal?: AbortSignal\n}) {\n const explicit = input.session\n ? await input.client.session.get({ sessionID: input.session }, ...requestOptions(input.signal)).catch((error) => {\n if (error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"SessionNotFoundError\")\n return undefined\n throw error\n })\n : undefined\n if (input.session && !explicit) throw new Error(\"Session not found\")\n if (explicit)\n return {\n session: input.fork\n ? await input.client.session\n .fork({ sessionID: explicit.id, boundary: { type: \"through\" } }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : explicit,\n }\n if (!input.continue) return { session: undefined }\n\n const location = await resolveLocation(input.client, input.location, input.signal)\n const selected = await latestSession(input.client, location, undefined, input.signal)\n if (!selected) return { session: undefined, location }\n return {\n session: input.fork\n ? await input.client.session\n .fork({ sessionID: selected.id, boundary: { type: \"through\" } }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : selected,\n }\n}\n\nasync function latestSession(\n client: OpenCodeClient,\n location: LocationGetOutput,\n cursor?: string,\n signal?: AbortSignal,\n): Promise<SessionInfo | undefined> {\n const page = await client.session.list(\n {\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n limit: SESSION_PAGE_LIMIT,\n order: \"desc\",\n ...(cursor ? { cursor } : {}),\n },\n ...requestOptions(signal),\n )\n const selected = page.data.find(\n (session) =>\n session.location.directory === location.directory && session.location.workspaceID === location.workspaceID,\n )\n if (selected) return selected\n if (!page.cursor.next || page.data.length === 0) return\n return latestSession(client, location, page.cursor.next, signal)\n}\n\nfunction resolveLocation(\n client: OpenCodeClient,\n location?: { directory?: string; workspace?: string },\n signal?: AbortSignal,\n) {\n if (!location && !signal) return client.location.get()\n if (!location) return client.location.get(undefined, { signal })\n return client.location.get({ location }, ...requestOptions(signal))\n}\n\nfunction requestOptions(signal?: AbortSignal): [] | [{ signal: AbortSignal }] {\n return signal ? [{ signal }] : []\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "FEF70382707F3E0264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/prompt/display.ts"], | ||
| "sourcesContent": [ | ||
| "import { stringWidth } from \"../util/string-width\"\n\nconst graphemes = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n\nexport function promptOffsetWidth(value: string) {\n let width = 0\n for (const part of graphemes.segment(value)) {\n // Textarea offsets count newlines as one position; terminal width counts them as zero.\n width += part.segment === \"\\n\" ? 1 : stringWidth(part.segment)\n }\n return width\n}\n\nfunction displayOffsetIndex(value: string, offset: number) {\n if (offset <= 0) return 0\n\n let width = 0\n for (const part of graphemes.segment(value)) {\n const next = width + promptOffsetWidth(part.segment)\n if (next > offset) return part.index\n width = next\n }\n\n return value.length\n}\n\nexport function displaySlice(value: string, start = 0, end = promptOffsetWidth(value)) {\n return value.slice(displayOffsetIndex(value, start), displayOffsetIndex(value, end))\n}\n\nexport function displayCharAt(value: string, offset: number) {\n let width = 0\n for (const part of graphemes.segment(value)) {\n const next = width + promptOffsetWidth(part.segment)\n if (offset === width || offset < next) return part.segment\n width = next\n }\n}\n\nexport function mentionTriggerIndex(value: string, offset = promptOffsetWidth(value)) {\n const text = displaySlice(value, 0, offset)\n const index = text.lastIndexOf(\"@\")\n if (index === -1) return\n\n const before = index === 0 ? undefined : text[index - 1]\n const query = text.slice(index)\n if ((before === undefined || /\\s/.test(before)) && !/\\s/.test(query)) {\n return promptOffsetWidth(text.slice(0, index))\n }\n}\n\nexport function slashTriggerIndex(value: string, offset = promptOffsetWidth(value)) {\n const text = displaySlice(value, 0, offset)\n for (let index = text.lastIndexOf(\"/\"); index >= 0; index = text.lastIndexOf(\"/\", index - 1)) {\n const before = index === 0 ? undefined : text[index - 1]\n const query = text.slice(index)\n if (before !== undefined && !/\\s/.test(before)) continue\n if (/\\s/.test(query) || query.slice(1).includes(\"/\")) return\n return promptOffsetWidth(text.slice(0, index))\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAEA,IAAM,EAAY,IAAI,KAAK,UAAU,OAAW,CAAE,YAAa,UAAW,CAAC,EAEpE,SAAS,CAAiB,CAAC,EAAe,CAC/C,IAAI,EAAQ,EACZ,QAAW,KAAQ,EAAU,QAAQ,CAAK,EAExC,GAAS,EAAK,UAAY;AAAA,EAAO,EAAI,EAAY,EAAK,OAAO,EAE/D,OAAO,EAGT,SAAS,CAAkB,CAAC,EAAe,EAAgB,CACzD,GAAI,GAAU,EAAG,MAAO,GAExB,IAAI,EAAQ,EACZ,QAAW,KAAQ,EAAU,QAAQ,CAAK,EAAG,CAC3C,IAAM,EAAO,EAAQ,EAAkB,EAAK,OAAO,EACnD,GAAI,EAAO,EAAQ,OAAO,EAAK,MAC/B,EAAQ,EAGV,OAAO,EAAM,OAGR,SAAS,CAAY,CAAC,EAAe,EAAQ,EAAG,EAAM,EAAkB,CAAK,EAAG,CACrF,OAAO,EAAM,MAAM,EAAmB,EAAO,CAAK,EAAG,EAAmB,EAAO,CAAG,CAAC,EAG9E,SAAS,CAAa,CAAC,EAAe,EAAgB,CAC3D,IAAI,EAAQ,EACZ,QAAW,KAAQ,EAAU,QAAQ,CAAK,EAAG,CAC3C,IAAM,EAAO,EAAQ,EAAkB,EAAK,OAAO,EACnD,GAAI,IAAW,GAAS,EAAS,EAAM,OAAO,EAAK,QACnD,EAAQ,GAIL,SAAS,CAAmB,CAAC,EAAe,EAAS,EAAkB,CAAK,EAAG,CACpF,IAAM,EAAO,EAAa,EAAO,EAAG,CAAM,EACpC,EAAQ,EAAK,YAAY,GAAG,EAClC,GAAI,IAAU,GAAI,OAElB,IAAM,EAAS,IAAU,EAAI,OAAY,EAAK,EAAQ,GAChD,EAAQ,EAAK,MAAM,CAAK,EAC9B,IAAK,IAAW,QAAa,KAAK,KAAK,CAAM,IAAM,CAAC,KAAK,KAAK,CAAK,EACjE,OAAO,EAAkB,EAAK,MAAM,EAAG,CAAK,CAAC,EAI1C,SAAS,CAAiB,CAAC,EAAe,EAAS,EAAkB,CAAK,EAAG,CAClF,IAAM,EAAO,EAAa,EAAO,EAAG,CAAM,EAC1C,QAAS,EAAQ,EAAK,YAAY,GAAG,EAAG,GAAS,EAAG,EAAQ,EAAK,YAAY,IAAK,EAAQ,CAAC,EAAG,CAC5F,IAAM,EAAS,IAAU,EAAI,OAAY,EAAK,EAAQ,GAChD,EAAQ,EAAK,MAAM,CAAK,EAC9B,GAAI,IAAW,QAAa,CAAC,KAAK,KAAK,CAAM,EAAG,SAChD,GAAI,KAAK,KAAK,CAAK,GAAK,EAAM,MAAM,CAAC,EAAE,SAAS,GAAG,EAAG,OACtD,OAAO,EAAkB,EAAK,MAAM,EAAG,CAAK,CAAC", | ||
| "debugId": "709B8C3D24E2052B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/export.ts"], | ||
| "sourcesContent": [ | ||
| "import { autocomplete, cancel, intro, isCancel, log, outro } from \"@clack/prompts\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { Effect, Option } from \"effect\"\nimport { EOL } from \"node:os\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { errorMessage } from \"../../util/error\"\n\nexport default Runtime.handler(\n Commands.commands.export,\n Effect.fn(\"cli.export\")((input) =>\n Effect.gen(function* () {\n const requested = Option.getOrUndefined(input.session)\n if (!requested && !process.stdin.isTTY) {\n yield* Effect.fail(new Error(\"Pass a session ID when running without an interactive terminal\"))\n }\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n const client = OpenCode.make({\n baseUrl: server.endpoint.url,\n headers: Service.headers(server.endpoint),\n })\n const sessionID = requested\n ? requested\n : yield* Effect.gen(function* () {\n intro(\"Export session\", { output: process.stderr })\n const location = yield* Effect.tryPromise({\n try: () => client.location.get({ location: { directory: process.cwd() } }),\n catch: (cause) => cause,\n })\n const page = yield* Effect.tryPromise({\n try: () =>\n client.session.list({\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n order: \"desc\",\n limit: 50,\n }),\n catch: (cause) => cause,\n })\n if (page.data.length === 0) {\n log.error(\"No sessions found\", { output: process.stderr })\n outro(\"Done\", { output: process.stderr })\n return undefined\n }\n const selected = yield* Effect.tryPromise({\n try: () =>\n autocomplete({\n message: \"Select session to export\",\n maxItems: 10,\n options: page.data.map((session) => ({\n label: session.title,\n value: session.id,\n hint: `${new Date(session.time.updated).toLocaleString()} - ${session.id.slice(-8)}`,\n })),\n output: process.stderr,\n }),\n catch: (cause) => cause,\n })\n if (isCancel(selected)) {\n cancel(\"Cancelled\", { output: process.stderr })\n process.exitCode = 130\n return undefined\n }\n outro(\"Exporting session...\", { output: process.stderr })\n return selected\n })\n if (!sessionID) return\n const data = yield* Effect.tryPromise({\n try: () => client.session.export({ sessionID, sanitize: input.sanitize }),\n catch: (cause) => cause,\n })\n process.stdout.write(JSON.stringify(data, null, 2) + EOL)\n }).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n ),\n)\n" | ||
| ], | ||
| "mappings": ";utCAIA,cAAS,WAMT,IAAe,IAAQ,QACrB,EAAS,SAAS,OAClB,EAAO,GAAG,YAAY,EAAE,CAAC,IACvB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAY,EAAO,eAAe,EAAM,OAAO,EACrD,GAAI,CAAC,GAAa,CAAC,QAAQ,MAAM,MAC/B,MAAO,EAAO,KAAS,MAAM,gEAAgE,CAAC,EAEhG,IAAM,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACK,EAAS,EAAS,KAAK,CAC3B,QAAS,EAAO,SAAS,IACzB,QAAS,EAAQ,QAAQ,EAAO,QAAQ,CAC1C,CAAC,EACK,EAAY,EACd,EACA,MAAO,EAAO,IAAI,SAAU,EAAG,CAC7B,EAAM,iBAAkB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAClD,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IAAM,EAAO,SAAS,IAAI,CAAE,SAAU,CAAE,UAAW,QAAQ,IAAI,CAAE,CAAE,CAAC,EACzE,MAAO,CAAC,IAAU,CACpB,CAAC,EACK,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IACH,EAAO,QAAQ,KAAK,CAClB,UAAW,EAAS,UACpB,UAAW,EAAS,YACpB,SAAU,KACV,MAAO,OACP,MAAO,EACT,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAK,KAAK,SAAW,EAAG,CAC1B,EAAI,MAAM,oBAAqB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACzD,EAAM,OAAQ,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACxC,OAEF,IAAM,EAAW,MAAO,EAAO,WAAW,CACxC,IAAK,IACH,EAAa,CACX,QAAS,2BACT,SAAU,GACV,QAAS,EAAK,KAAK,IAAI,CAAC,KAAa,CACnC,MAAO,EAAQ,MACf,MAAO,EAAQ,GACf,KAAM,GAAG,IAAI,KAAK,EAAQ,KAAK,OAAO,EAAE,eAAe,OAAO,EAAQ,GAAG,MAAM,EAAE,GACnF,EAAE,EACF,OAAQ,QAAQ,MAClB,CAAC,EACH,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,GAAI,EAAS,CAAQ,EAAG,CACtB,EAAO,YAAa,CAAE,OAAQ,QAAQ,MAAO,CAAC,EAC9C,QAAQ,SAAW,IACnB,OAGF,OADA,EAAM,uBAAwB,CAAE,OAAQ,QAAQ,MAAO,CAAC,EACjD,EACR,EACL,GAAI,CAAC,EAAW,OAChB,IAAM,EAAO,MAAO,EAAO,WAAW,CACpC,IAAK,IAAM,EAAO,QAAQ,OAAO,CAAE,YAAW,SAAU,EAAM,QAAS,CAAC,EACxE,MAAO,CAAC,IAAU,CACpB,CAAC,EACD,QAAQ,OAAO,MAAM,KAAK,UAAU,EAAM,KAAM,CAAC,EAAI,CAAG,EACzD,EAAE,KACD,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,CACF", | ||
| "debugId": "01D08756EBCDE32064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, FileSystem, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\nimport { Config } from \"../../config\"\nimport { resolve } from \"@opencode-ai/tui/config\"\nimport { Global } from \"@opencode-ai/util/global\"\n\nexport default Runtime.handler(Commands.commands.mini, (input) =>\n Effect.gen(function* () {\n const { runMini, validateMiniTerminal } = yield* Effect.promise(() => import(\"../../mini\"))\n yield* Effect.promise(async () => validateMiniTerminal())\n const serverURL = Option.getOrUndefined(input.server)\n const server = yield* ServerConnection.resolve({\n server: serverURL,\n standalone: input.standalone,\n mismatch: \"replace\",\n })\n const config = yield* Config.Service\n const global = yield* Global.Service\n const resolved = resolve(yield* config.get(), { terminalSuspend: process.platform !== \"win32\" })\n const fileSystem = yield* FileSystem.FileSystem\n const runServicePromise = Effect.runPromiseWith(Context.make(FileSystem.FileSystem, fileSystem))\n const service = server.service\n yield* Effect.promise(() =>\n runMini({\n server: {\n endpoint: server.endpoint,\n reconnect: service ? (signal) => runServicePromise(service.reconnect(), { signal }) : undefined,\n },\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n prompt: Option.getOrUndefined(input.prompt),\n replay: Option.getOrUndefined(input.replay) ?? resolved.mini?.replay ?? true,\n replayLimit: Option.getOrUndefined(input.replayLimit) ?? resolved.mini?.replay_limit,\n demo: input.demo,\n tuiConfig: resolved,\n config: {\n update: (update) => runServicePromise(config.update(update)),\n },\n paths: { home: global.home, state: global.state, log: global.log },\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";qkCAQA,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAM,CAAC,IACtD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,UAAS,wBAAyB,MAAO,EAAO,QAAQ,IAAa,wCAAa,EAC1F,MAAO,EAAO,QAAQ,SAAY,EAAqB,CAAC,EACxD,IAAM,EAAY,EAAO,eAAe,EAAM,MAAM,EAC9C,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EACR,WAAY,EAAM,WAClB,SAAU,SACZ,CAAC,EACK,EAAS,MAAO,EAAO,QACvB,EAAS,MAAO,EAAO,QACvB,EAAW,EAAQ,MAAO,EAAO,IAAI,EAAG,CAAE,gBAAiB,EAA6B,CAAC,EACzF,EAAa,MAAO,EAAW,WAC/B,EAAoB,EAAO,eAAe,EAAQ,KAAK,EAAW,WAAY,CAAU,CAAC,EACzF,EAAU,EAAO,QACvB,MAAO,EAAO,QAAQ,IACpB,EAAQ,CACN,OAAQ,CACN,SAAU,EAAO,SACjB,UAAW,EAAU,CAAC,IAAW,EAAkB,EAAQ,UAAU,EAAG,CAAE,QAAO,CAAC,EAAI,MACxF,EACA,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,OAAQ,EAAO,eAAe,EAAM,MAAM,GAAK,EAAS,MAAM,QAAU,GACxE,YAAa,EAAO,eAAe,EAAM,WAAW,GAAK,EAAS,MAAM,aACxE,KAAM,EAAM,KACZ,UAAW,EACX,OAAQ,CACN,OAAQ,CAAC,IAAW,EAAkB,EAAO,OAAO,CAAM,CAAC,CAC7D,EACA,MAAO,CAAE,KAAM,EAAO,KAAM,MAAO,EAAO,MAAO,IAAK,EAAO,GAAI,CACnE,CAAC,CACH,EACD,CACH", | ||
| "debugId": "75560BA09CCF8FD764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/workspace-event.ts"], | ||
| "sourcesContent": [ | ||
| "export * as WorkspaceEvent from \"./workspace-event.js\"\n\nimport { Schema } from \"effect\"\nimport { Event } from \"./event.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport const ConnectionStatus = Schema.Struct({\n workspaceID: WorkspaceID,\n status: Schema.Literals([\"connected\", \"connecting\", \"disconnected\", \"error\"]),\n}).annotate({ identifier: \"WorkspaceEvent.ConnectionStatus\" })\nexport interface ConnectionStatus extends Schema.Schema.Type<typeof ConnectionStatus> {}\n\nexport const Ready = Event.ephemeral({\n type: \"workspace.ready\",\n schema: {\n name: Schema.String,\n },\n})\n\nexport const Failed = Event.ephemeral({\n type: \"workspace.failed\",\n schema: {\n message: Schema.String,\n },\n})\n\nexport const Status = Event.ephemeral({\n type: \"workspace.status\",\n schema: ConnectionStatus.fields,\n})\n\nexport const Definitions = Event.inventory(Ready, Failed, Status)\n" | ||
| ], | ||
| "mappings": ";wRAMO,IAAM,EAAmB,EAAO,OAAO,CAC5C,YAAa,EACb,OAAQ,EAAO,SAAS,CAAC,YAAa,aAAc,eAAgB,OAAO,CAAC,CAC9E,CAAC,EAAE,SAAS,CAAE,WAAY,iCAAkC,CAAC,EAGhD,EAAQ,EAAM,UAAU,CACnC,KAAM,kBACN,OAAQ,CACN,KAAM,EAAO,MACf,CACF,CAAC,EAEY,EAAS,EAAM,UAAU,CACpC,KAAM,mBACN,OAAQ,CACN,QAAS,EAAO,MAClB,CACF,CAAC,EAEY,EAAS,EAAM,UAAU,CACpC,KAAM,mBACN,OAAQ,EAAiB,MAC3B,CAAC,EAEY,EAAc,EAAM,UAAU,EAAO,EAAQ,CAAM", | ||
| "debugId": "3220540AB2661FDF64756E2164756E21", | ||
| "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": "947F8B4D6B6F937464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/amazon-bedrock-mantle.ts"], | ||
| "sourcesContent": [ | ||
| "import { Auth } from \"../route/auth.js\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { OpenAIChat } from \"../protocols/openai-chat.js\"\nimport { OpenAIResponses } from \"../protocols/openai-responses.js\"\nimport { BedrockAuth, type Credentials } from \"../protocols/utils/bedrock-auth.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"amazon-bedrock\")\n\nexport type Config = RouteDefaultsInput & {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly credentials?: Credentials\n readonly region?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly auth?: \"bearer\" | \"sigv4\"\n readonly baseURL?: string\n readonly credentials?: Credentials\n readonly region?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"bedrock-mantle-responses\",\n provider: id,\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"bedrock-mantle-chat\",\n provider: id,\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config) => {\n const region = input.region ?? input.credentials?.region ?? \"us-east-1\"\n const credentials = input.credentials === undefined ? undefined : { ...input.credentials, region }\n return route.with({\n endpoint: { baseURL: input.baseURL ?? `https://bedrock-mantle.${region}.api.aws/v1` },\n auth:\n input.apiKey === undefined\n ? BedrockAuth.sigV4(credentials, { service: \"bedrock-mantle\", name: \"Bedrock Mantle\" })\n : Auth.bearer(input.apiKey),\n })\n}\n\nconst defaults = (input: Config) => {\n const { apiKey: _, baseURL: _baseURL, credentials: _credentials, region: _region, ...rest } = input\n return rest\n}\n\nexport const configure = (input: Config = {}) => {\n const configuredResponsesRoute = configuredRoute(responsesRoute, input)\n const configuredChatRoute = configuredRoute(chatRoute, input)\n const modelDefaults = defaults(input)\n const responses = (modelID: string | ModelID) =>\n configuredResponsesRoute\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n const chat = (modelID: string | ModelID) =>\n configuredChatRoute\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n\n return {\n id,\n model: chat,\n chat,\n responses,\n configure,\n }\n}\n\nexport const provider = configure()\n\nconst config = (settings: Settings): Config => {\n if (settings.auth === \"bearer\" && settings.apiKey === undefined)\n throw new Error(\"Amazon Bedrock Mantle bearer auth requires apiKey\")\n if (settings.auth === \"sigv4\" && settings.apiKey !== undefined)\n throw new Error(\"Amazon Bedrock Mantle SigV4 auth does not accept apiKey\")\n return {\n apiKey: settings.auth === \"sigv4\" ? undefined : settings.apiKey,\n baseURL: settings.baseURL,\n credentials: settings.credentials,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n region: settings.region,\n }\n}\n\nexport const chatModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).chat(modelID)\nexport const responsesModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).responses(modelID)\nexport const model = chatModel\n" | ||
| ], | ||
| "mappings": ";4QASO,IAAM,EAAK,EAAW,KAAK,gBAAgB,EAmB5C,EAAiB,EAAgB,MAAM,KAAK,CAChD,GAAI,2BACJ,SAAU,CACZ,CAAC,EAEK,EAAY,EAAW,MAAM,KAAK,CACtC,GAAI,sBACJ,SAAU,CACZ,CAAC,EAID,IAAM,EAAkB,CAAiB,EAAiC,IAAkB,CAC1F,IAAM,EAAS,EAAM,QAAU,EAAM,aAAa,QAAU,YACtD,EAAc,EAAM,cAAgB,OAAY,OAAY,IAAK,EAAM,YAAa,QAAO,EACjG,OAAO,EAAM,KAAK,CAChB,SAAU,CAAE,QAAS,EAAM,SAAW,0BAA0B,cAAoB,EACpF,KACE,EAAM,SAAW,OACb,EAAY,MAAM,EAAa,CAAE,QAAS,iBAAkB,KAAM,gBAAiB,CAAC,EACpF,EAAK,OAAO,EAAM,MAAM,CAChC,CAAC,GAGG,EAAW,CAAC,IAAkB,CAClC,IAAQ,OAAQ,EAAG,QAAS,EAAU,YAAa,EAAc,OAAQ,KAAY,GAAS,EAC9F,OAAO,GAGI,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAA2B,EAAgB,EAAgB,CAAK,EAChE,EAAsB,EAAgB,EAAW,CAAK,EACtD,EAAgB,EAAS,CAAK,EAC9B,EAAY,CAAC,IACjB,EACG,KAAK,EAAkB,EAAS,CAAa,CAAC,EAC9C,MAAkC,CAAE,GAAI,CAAQ,CAAC,EAChD,EAAO,CAAC,IACZ,EACG,KAAK,EAAkB,EAAS,CAAa,CAAC,EAC9C,MAAkC,CAAE,GAAI,CAAQ,CAAC,EAEtD,MAAO,CACL,KACA,MAAO,EACP,OACA,YACA,WACF,GAGW,EAAW,EAAU,EAE5B,EAAS,CAAC,IAA+B,CAC7C,GAAI,EAAS,OAAS,UAAY,EAAS,SAAW,OACpD,MAAU,MAAM,mDAAmD,EACrE,GAAI,EAAS,OAAS,SAAW,EAAS,SAAW,OACnD,MAAU,MAAM,yDAAyD,EAC3E,MAAO,CACL,OAAQ,EAAS,OAAS,QAAU,OAAY,EAAS,OACzD,QAAS,EAAS,QAClB,YAAa,EAAS,YACtB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,gBAAiB,EAAS,gBAC1B,OAAQ,EAAS,MACnB,GAGW,EAAuF,CAClG,EACA,IACG,EAAU,EAAO,CAAQ,CAAC,EAAE,KAAK,CAAO,EAChC,EAA4F,CACvG,EACA,IACG,EAAU,EAAO,CAAQ,CAAC,EAAE,UAAU,CAAO", | ||
| "debugId": "3C6D022C98E820A764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "530167B1DF4586B064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex-messages.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema, Struct } from \"effect\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\n\nexport type AnthropicOptionsInput = AnthropicMessages.OptionsInput\nexport type AnthropicProviderOptionsInput = AnthropicMessages.ProviderOptionsInput\nexport type AnthropicThinkingInput = AnthropicMessages.ThinkingInput\n\nconst VERSION = \"vertex-2023-10-16\" as const\nconst HEADER_VERSION = \"2023-06-01\" as const\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.OAuthOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly accessToken?: string\n readonly apiKey?: never\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n}\n\nconst route = Route.make({\n id: \"google-vertex-messages\",\n provider: id,\n providerMetadataKey: \"anthropic\",\n protocol: Protocol.make({\n id: AnthropicMessages.protocol.id,\n body: {\n schema: Schema.Struct({\n ...Struct.omit(AnthropicMessages.AnthropicMessagesBody.fields, [\"model\"]),\n anthropic_version: Schema.Literal(VERSION),\n }),\n from: (request) =>\n AnthropicMessages.protocol.body.from(request).pipe(\n Effect.map((body) => ({\n ...Struct.omit(body, [\"model\"]),\n anthropic_version: VERSION,\n })),\n ),\n },\n stream: AnthropicMessages.protocol.stream,\n }),\n endpoint: Endpoint.path(({ request }) => `/${request.model.id}:streamRawPredict`),\n auth: Auth.none,\n framing: AnthropicMessages.framing,\n headers: () => ({ \"anthropic-version\": HEADER_VERSION }),\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config) => {\n if (\"apiKey\" in input && input.apiKey !== undefined)\n throw new Error(\"Google Vertex Messages does not support API keys\")\n const {\n accessToken: _accessToken,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const location = GoogleVertexShared.location(inputLocation, \"global\")\n const project = GoogleVertexShared.project(inputProject)\n return route.with({\n ...rest,\n endpoint: {\n baseURL:\n baseURL ??\n `https://${GoogleVertexShared.host(location)}/v1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}/publishers/anthropic/models`,\n },\n auth: GoogleVertexShared.oauth(input, project),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<AnthropicMessages.ProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, AnthropicMessages.ProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined) throw new Error(\"Google Vertex Messages does not support API keys\")\n return configure({\n accessToken: settings.accessToken,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";+lBAcA,IAAM,EAAU,oBACV,EAAiB,aAEV,EAAK,EAAW,KAAK,eAAe,EAmB3C,EAAQ,EAAM,KAAK,CACvB,GAAI,yBACJ,SAAU,EACV,oBAAqB,YACrB,SAAU,EAAS,KAAK,CACtB,GAAI,EAAkB,SAAS,GAC/B,KAAM,CACJ,OAAQ,EAAO,OAAO,IACjB,EAAO,KAAK,EAAkB,sBAAsB,OAAQ,CAAC,OAAO,CAAC,EACxE,kBAAmB,EAAO,QAAQ,CAAO,CAC3C,CAAC,EACD,KAAM,CAAC,IACL,EAAkB,SAAS,KAAK,KAAK,CAAO,EAAE,KAC5C,EAAO,IAAI,CAAC,KAAU,IACjB,EAAO,KAAK,EAAM,CAAC,OAAO,CAAC,EAC9B,kBAAmB,CACrB,EAAE,CACJ,CACJ,EACA,OAAQ,EAAkB,SAAS,MACrC,CAAC,EACD,SAAU,EAAS,KAAK,EAAG,aAAc,IAAI,EAAQ,MAAM,qBAAqB,EAChF,KAAM,EAAK,KACX,QAAS,EAAkB,QAC3B,QAAS,KAAO,CAAE,oBAAqB,CAAe,EACxD,CAAC,EAID,IAAM,EAAkB,CAAC,IAAkB,CACzC,GAAI,WAAY,GAAS,EAAM,SAAW,OACxC,MAAU,MAAM,kDAAkD,EACpE,IACE,YAAa,EACb,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAW,EAAmB,SAAS,EAAe,QAAQ,EAC9D,EAAU,EAAmB,QAAQ,CAAY,EACvD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CACR,QACE,GACA,WAAW,EAAmB,KAAK,CAAQ,iBAAiB,EAAmB,eAAe,CAAO,eAAe,+BACxH,EACA,KAAM,EAAmB,MAAM,EAAO,CAAO,CAC/C,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAA8C,CAAE,GAAI,CAAQ,CAAC,EACzG,WACF,GAQK,IAAM,EAA+F,CAC1G,EACA,IACG,CACH,GAAI,EAAS,SAAW,OAAW,MAAU,MAAM,kDAAkD,EACrG,OAAO,EAAU,CACf,YAAa,EAAS,YACtB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "1B8EC96010D19BAE64756E2164756E21", | ||
| "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": "825BFB86D856CF2664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/file-diff.ts", "../schema/src/session-revert.ts", "../schema/src/session-fork.ts", "../schema/src/instruction.ts", "../schema/src/session-inbox.ts", "../schema/src/session-event.ts"], | ||
| "sourcesContent": [ | ||
| "export * as FileDiff from \"./file-diff.js\"\n\nimport { Schema } from \"effect\"\nimport { NonNegativeInt, optional } from \"./schema.js\"\n\nexport const Info = Schema.Struct({\n file: Schema.String,\n patch: Schema.String,\n additions: NonNegativeInt,\n deletions: NonNegativeInt,\n status: Schema.Literals([\"added\", \"deleted\", \"modified\"]),\n}).annotate({ identifier: \"FileDiff.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\n/** V1 snapshot and persisted session diff shape. */\nexport const LegacyInfo = Schema.Struct({\n file: Schema.String.pipe(optional),\n patch: Schema.String.pipe(optional),\n additions: Schema.Finite,\n deletions: Schema.Finite,\n status: Schema.Literals([\"added\", \"deleted\", \"modified\"]).pipe(optional),\n}).annotate({ identifier: \"FileDiff.LegacyInfo\" })\nexport interface LegacyInfo extends Schema.Schema.Type<typeof LegacyInfo> {}\n", | ||
| "import { Schema, SchemaTransformation } from \"effect\"\nimport { FileDiff } from \"./file-diff.js\"\nimport { optional } from \"./schema.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Snapshot } from \"./snapshot.js\"\n\nexport interface Revert extends Schema.Schema.Type<typeof Revert> {}\nexport const Revert = Schema.Struct({\n messageID: SessionMessage.ID,\n /** Legacy V1 compatibility state. */\n partID: Schema.String.pipe(optional),\n snapshot: Snapshot.ID.pipe(optional),\n files: Schema.Array(FileDiff.Info).pipe(optional),\n}).annotate({ identifier: \"Session.Revert\" })\n\nconst FileDiffV1 = Schema.Struct({\n path: Schema.String,\n status: Schema.Literals([\"added\", \"modified\", \"deleted\"]),\n additions: Schema.Finite,\n deletions: Schema.Finite,\n patch: Schema.String,\n})\n\nexport interface RevertV1 extends Schema.Schema.Type<typeof RevertV1> {}\nexport const RevertV1 = Schema.Struct({\n messageID: SessionMessage.ID,\n partID: Schema.String.pipe(optional),\n snapshot: Schema.String.pipe(optional),\n diff: Schema.String.pipe(optional),\n files: Schema.Array(FileDiffV1).pipe(optional),\n}).annotate({ identifier: \"Session.RevertV1\" })\n\nconst PersistedCurrent = Revert.pipe(\n Schema.decodeTo(\n Schema.Struct({ source: Schema.tag(\"current\"), revert: Schema.toType(Revert) }),\n SchemaTransformation.transform({\n decode: (revert): { readonly source: \"current\"; readonly revert: Revert } => ({\n source: \"current\",\n revert,\n }),\n encode: (value) => value.revert,\n }),\n ),\n)\nconst PersistedLegacy = RevertV1.pipe(\n Schema.decodeTo(\n Schema.Struct({ source: Schema.tag(\"legacy\"), revert: Schema.toType(RevertV1) }),\n SchemaTransformation.transform({\n decode: (revert): { readonly source: \"legacy\"; readonly revert: RevertV1 } => ({\n source: \"legacy\",\n revert,\n }),\n encode: (value) => value.revert,\n }),\n ),\n)\n\n/** Storage decoder for revert state written before FileDiff became canonical. */\nexport const PersistedRevert = Schema.Union([PersistedCurrent, PersistedLegacy]).pipe(\n Schema.toTaggedUnion(\"source\"),\n Schema.decodeTo(\n Schema.toType(Revert),\n SchemaTransformation.transform({\n decode: (persisted): Revert => {\n if (persisted.source === \"current\") return persisted.revert\n return Revert.make({\n messageID: persisted.revert.messageID,\n partID: persisted.revert.partID,\n snapshot: persisted.revert.snapshot ? Snapshot.ID.make(persisted.revert.snapshot) : undefined,\n files: persisted.revert.files?.map((file) => ({\n file: file.path,\n status: file.status,\n additions: file.additions,\n deletions: file.deletions,\n patch: file.patch,\n })),\n })\n },\n encode: (revert): { readonly source: \"current\"; readonly revert: Revert } => ({\n source: \"current\",\n revert,\n }),\n }),\n ),\n Schema.annotate({ identifier: \"Session.Revert.Persisted\" }),\n)\n", | ||
| "export * as SessionFork from \"./session-fork.js\"\n\nimport { Schema } from \"effect\"\nimport { SessionMessage } from \"./session-message.js\"\n\nexport const Boundary = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"before\"), messageID: SessionMessage.ID }),\n Schema.Struct({ type: Schema.Literal(\"through\"), messageID: SessionMessage.ID }),\n]).annotate({ identifier: \"Session.ForkBoundary\" })\nexport type Boundary = typeof Boundary.Type\n\nexport const RequestBoundary = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"before\"), messageID: SessionMessage.ID }),\n Schema.Struct({ type: Schema.Literal(\"through\") }),\n]).annotate({ identifier: \"Session.ForkRequestBoundary\" })\nexport type RequestBoundary = typeof RequestBoundary.Type\n", | ||
| "export * as Instruction from \"./instruction.js\"\n\nimport { Schema } from \"effect\"\n\nexport const Key = Schema.String.check(Schema.isPattern(/^[a-z0-9][a-z0-9._-]*\\/[a-z0-9][a-z0-9._/-]*$/)).pipe(\n Schema.brand(\"Instruction.Key\"),\n)\nexport type Key = typeof Key.Type\n\nexport const Hash = Schema.String.check(Schema.isPattern(/^[a-f0-9]{64}$/)).pipe(Schema.brand(\"Instruction.Hash\"))\nexport type Hash = typeof Hash.Type\n\nexport const Values = Schema.Record(Key, Hash)\nexport type Values = Readonly<Record<string, Hash>>\n\nexport const Removed = Schema.Literal(\"removed\")\nexport type Removed = typeof Removed.Type\nexport const removed = Removed.make(\"removed\")\n\nexport const Delta = Schema.Record(Schema.String, Schema.Union([Hash, Removed]))\nexport type Delta = typeof Delta.Type\n", | ||
| "export * as SessionInbox from \"./session-inbox.js\"\n\nimport { Schema } from \"effect\"\nimport { Location } from \"./location.js\"\nimport { Project } from \"./project.js\"\nimport { Prompt } from \"./prompt.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { SessionMessage } from \"./session-message.js\"\n\nexport const Delivery = Schema.Literals([\"steer\", \"queue\"]).annotate({ identifier: \"Session.Inbox.Delivery\" })\nexport type Delivery = typeof Delivery.Type\n\nexport interface UserPayload extends Schema.Schema.Type<typeof UserPayload> {}\nexport const UserPayload = Schema.Struct({\n ...Prompt.fields,\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n}).annotate({ identifier: \"Session.Inbox.UserPayload\" })\n\nexport interface SyntheticPayload extends Schema.Schema.Type<typeof SyntheticPayload> {}\nexport const SyntheticPayload = Schema.Struct({\n text: Schema.String,\n description: Schema.String.pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n}).annotate({ identifier: \"Session.Inbox.SyntheticPayload\" })\n\nexport interface CompactionPayload extends Schema.Schema.Type<typeof CompactionPayload> {}\nexport const CompactionPayload = Schema.Struct({}).annotate({ identifier: \"Session.Inbox.CompactionPayload\" })\n\nexport interface MovePayload extends Schema.Schema.Type<typeof MovePayload> {}\nexport const MovePayload = Schema.Struct({\n location: Location.Ref,\n projectID: Project.ID,\n subpath: RelativePath.pipe(optional),\n}).annotate({ identifier: \"Session.Inbox.MovePayload\" })\n\nconst UserItem = Schema.Struct({ type: Schema.tag(\"user\"), payload: UserPayload, delivery: Delivery })\nconst SyntheticItem = Schema.Struct({ type: Schema.tag(\"synthetic\"), payload: SyntheticPayload, delivery: Delivery })\nconst CompactionItem = Schema.Struct({\n type: Schema.tag(\"compaction\"),\n payload: CompactionPayload,\n delivery: Delivery,\n})\nconst MoveItem = Schema.Struct({ type: Schema.tag(\"move\"), payload: MovePayload, delivery: Delivery })\n\nexport const Item = Schema.Union([UserItem, SyntheticItem, CompactionItem, MoveItem]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Session.Inbox.Item\" }),\n)\nexport type Item = typeof Item.Type\n\nconst Enqueued = {\n id: SessionMessage.ID,\n sessionID: SessionID,\n timeCreated: DateTimeUtcFromMillis,\n}\n\nexport interface User extends Schema.Schema.Type<typeof User> {}\nexport const User = Schema.Struct({ ...Enqueued, ...UserItem.fields }).annotate({ identifier: \"Session.Inbox.User\" })\n\nexport interface Synthetic extends Schema.Schema.Type<typeof Synthetic> {}\nexport const Synthetic = Schema.Struct({ ...Enqueued, ...SyntheticItem.fields }).annotate({\n identifier: \"Session.Inbox.Synthetic\",\n})\n\nexport interface Compaction extends Schema.Schema.Type<typeof Compaction> {}\nexport const Compaction = Schema.Struct({ ...Enqueued, ...CompactionItem.fields }).annotate({\n identifier: \"Session.Inbox.Compaction\",\n})\n\nexport interface Move extends Schema.Schema.Type<typeof Move> {}\nexport const Move = Schema.Struct({ ...Enqueued, ...MoveItem.fields }).annotate({ identifier: \"Session.Inbox.Move\" })\n\nexport const Info = Schema.Union([User, Synthetic, Compaction, Move]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Session.Inbox.Info\" }),\n)\nexport type Info = typeof Info.Type\n", | ||
| "export * as SessionEvent from \"./session-event.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { Event } from \"./event.js\"\nimport { FinishReason } from \"./llm.js\"\nimport { Content } from \"./tool.js\"\nimport { Model } from \"./model.js\"\nimport { NonNegativeInt, PositiveInt, RelativePath } from \"./schema.js\"\nimport { FileAttachment } from \"./prompt.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { Location } from \"./location.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Revert } from \"./session-revert.js\"\nimport { Shell as ShellSchema } from \"./shell.js\"\nimport { SessionError } from \"./session-error.js\"\nimport { Instruction } from \"./instruction.js\"\nimport { Agent } from \"./agent.js\"\nimport { Skill as SkillSchema } from \"./skill.js\"\nimport { Money } from \"./money.js\"\nimport { Snapshot } from \"./snapshot.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { SessionInbox } from \"./session-inbox.js\"\nimport { Project } from \"./project.js\"\nimport { SessionFork } from \"./session-fork.js\"\n\nexport { FileAttachment }\n\nexport const Source = Schema.Struct({\n start: NonNegativeInt,\n end: NonNegativeInt,\n text: Schema.String,\n}).annotate({\n identifier: \"Session.Event.Source\",\n})\nexport interface Source extends Schema.Schema.Type<typeof Source> {}\n\nconst Base = {\n sessionID: SessionID,\n}\n\nconst options = {\n durable: {\n aggregate: \"sessionID\",\n version: 1,\n },\n} as const\nexport const Created = Event.durable({\n type: \"session.created\",\n ...options,\n schema: {\n ...Base,\n projectID: Project.ID,\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n parentID: SessionID.pipe(optional),\n slug: Schema.String,\n title: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n version: Schema.String,\n },\n})\nexport type Created = typeof Created.Type\n\nexport const AgentSelected = Event.durable({\n type: \"session.agent.selected\",\n ...options,\n schema: {\n ...Base,\n agent: Agent.ID,\n previous: Agent.ID.pipe(optional),\n },\n})\nexport type AgentSelected = typeof AgentSelected.Type\n\nexport const ModelSelected = Event.durable({\n type: \"session.model.selected\",\n ...options,\n schema: {\n ...Base,\n model: Model.Ref,\n previous: Model.Ref.pipe(optional),\n },\n})\nexport type ModelSelected = typeof ModelSelected.Type\n\nexport const Moved = Event.durable({\n type: \"session.moved\",\n ...options,\n schema: {\n ...Base,\n ...SessionInbox.MovePayload.fields,\n },\n})\nexport type Moved = typeof Moved.Type\n\nexport const Renamed = Event.durable({\n type: \"session.renamed\",\n ...options,\n schema: {\n ...Base,\n title: Schema.String,\n },\n})\nexport type Renamed = typeof Renamed.Type\n\nexport const UsageRecorded = Event.durable({\n type: \"session.usage.recorded\",\n ...options,\n schema: {\n ...Base,\n source: Schema.Literals([\"title\", \"compaction\"]),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n },\n})\nexport type UsageRecorded = typeof UsageRecorded.Type\n\nexport const UsageUpdated = Event.ephemeral({\n type: \"session.usage.updated\",\n schema: {\n ...Base,\n cost: Money.USD,\n tokens: TokenUsage.Info,\n },\n})\nexport type UsageUpdated = typeof UsageUpdated.Type\n\nexport const Deleted = Event.durable({\n type: \"session.deleted\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: Base,\n})\nexport type Deleted = typeof Deleted.Type\n\nexport const Forked = Event.durable({\n type: \"session.forked\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...Base,\n parentID: SessionID,\n boundary: SessionFork.Boundary,\n instructions: Instruction.Values.pipe(optional),\n },\n})\nexport type Forked = typeof Forked.Type\n\nconst InboxRef = {\n ...Base,\n inboxID: SessionMessage.ID,\n}\n\nexport const InboxDelivered = Event.durable({\n type: \"session.inbox.delivered\",\n ...options,\n schema: InboxRef,\n})\nexport type InboxDelivered = typeof InboxDelivered.Type\n\nexport const InboxEnqueued = Event.durable({\n type: \"session.inbox.enqueued\",\n ...options,\n schema: {\n ...InboxRef,\n item: SessionInbox.Item,\n },\n})\nexport type InboxEnqueued = typeof InboxEnqueued.Type\n\nexport const InboxCancelled = Event.durable({\n type: \"session.inbox.cancelled\",\n ...options,\n schema: InboxRef,\n})\nexport type InboxCancelled = typeof InboxCancelled.Type\n\nexport const InboxDeliveryChanged = Event.durable({\n type: \"session.inbox.delivery.changed\",\n ...options,\n schema: { ...InboxRef, delivery: SessionInbox.Delivery },\n})\nexport type InboxDeliveryChanged = typeof InboxDeliveryChanged.Type\n\nexport namespace Execution {\n export const Started = Event.durable({ type: \"session.execution.started\", ...options, schema: Base })\n export type Started = typeof Started.Type\n\n export const Succeeded = Event.durable({ type: \"session.execution.succeeded\", ...options, schema: Base })\n export type Succeeded = typeof Succeeded.Type\n\n export const Failed = Event.durable({\n type: \"session.execution.failed\",\n ...options,\n schema: { ...Base, error: SessionError.Error },\n })\n export type Failed = typeof Failed.Type\n\n export const Interrupted = Event.durable({\n type: \"session.execution.interrupted\",\n ...options,\n schema: { ...Base, reason: Schema.Literals([\"user\", \"shutdown\", \"superseded\"]) },\n })\n export type Interrupted = typeof Interrupted.Type\n}\n\nexport const InstructionsUpdated = Event.durable({\n type: \"session.instructions.updated\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...Base,\n delta: Instruction.Delta,\n /**\n * The rendered chronological update shown to the model, frozen at emit time.\n * Absent for the initial baseline observation and for deltas that render empty.\n */\n text: Schema.String.pipe(optional),\n },\n})\nexport type InstructionsUpdated = typeof InstructionsUpdated.Type\n\nexport const Synthetic = Event.durable({\n type: \"session.synthetic\",\n ...options,\n schema: {\n ...Base,\n text: Schema.String,\n description: Schema.String.pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n },\n})\nexport type Synthetic = typeof Synthetic.Type\n\nexport namespace Skill {\n export const Activated = Event.durable({\n type: \"session.skill.activated\",\n ...options,\n schema: {\n ...Base,\n id: SkillSchema.ID,\n name: SkillSchema.Name,\n text: Schema.String,\n },\n })\n export type Activated = typeof Activated.Type\n}\n\nexport namespace Shell {\n export const Started = Event.durable({\n type: \"session.shell.started\",\n ...options,\n schema: {\n ...Base,\n shell: ShellSchema.Info,\n },\n })\n export type Started = typeof Started.Type\n\n export const Ended = Event.durable({\n type: \"session.shell.ended\",\n ...options,\n schema: {\n ...Base,\n shell: ShellSchema.Info,\n output: ShellSchema.Output,\n },\n })\n export type Ended = typeof Ended.Type\n}\n\nexport namespace Step {\n export const Started = Event.durable({\n type: \"session.step.started\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n agent: Agent.ID,\n model: Model.Ref,\n snapshot: Snapshot.ID.pipe(optional),\n },\n })\n export type Started = typeof Started.Type\n\n export const Ended = Event.durable({\n type: \"session.step.ended\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n finish: FinishReason,\n rawFinish: Schema.String.pipe(optional),\n providerState: SessionMessage.ProviderState.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n snapshot: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n },\n })\n export type Ended = typeof Ended.Type\n\n export const Failed = Event.durable({\n type: \"session.step.failed\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n error: SessionError.Error,\n finish: Schema.Literals([\"content-filter\"]).pipe(optional),\n rawFinish: Schema.String.pipe(optional),\n providerState: SessionMessage.ProviderState.pipe(optional),\n cost: Money.USD.pipe(optional),\n tokens: TokenUsage.Info.pipe(optional),\n snapshot: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n },\n })\n export type Failed = typeof Failed.Type\n}\n\nexport namespace Text {\n export const Started = Event.durable({\n type: \"session.text.started\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n },\n })\n export type Started = typeof Started.Type\n\n // Stream fragments are live-only; Text.Ended is the replayable full-value boundary.\n export const Delta = Event.ephemeral({\n type: \"session.text.delta\",\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n delta: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.text.ended\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n text: Schema.String,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Ended = typeof Ended.Type\n}\n\nexport namespace Reasoning {\n export const Started = Event.durable({\n type: \"session.reasoning.started\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Started = typeof Started.Type\n\n // Stream fragments are live-only; Reasoning.Ended is the replayable full-value boundary.\n export const Delta = Event.ephemeral({\n type: \"session.reasoning.delta\",\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n delta: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.reasoning.ended\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n text: Schema.String,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Ended = typeof Ended.Type\n}\n\nexport namespace Tool {\n const ToolBase = {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n id: Schema.String,\n }\n\n export namespace Input {\n export const Started = Event.durable({\n type: \"session.tool.input.started\",\n ...options,\n schema: {\n ...ToolBase,\n name: Schema.String,\n },\n })\n export type Started = typeof Started.Type\n\n // Stream fragments are live-only; Input.Ended is the replayable raw-input boundary.\n export const Delta = Event.ephemeral({\n type: \"session.tool.input.delta\",\n schema: {\n ...ToolBase,\n delta: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.tool.input.ended\",\n ...options,\n schema: {\n ...ToolBase,\n text: Schema.String,\n },\n })\n export type Ended = typeof Ended.Type\n }\n\n export const Called = Event.durable({\n type: \"session.tool.called\",\n ...options,\n schema: {\n ...ToolBase,\n input: Schema.Record(Schema.String, Schema.Unknown),\n executed: Schema.Boolean,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Called = typeof Called.Type\n\n /** Live replacement metadata for a running tool. */\n export const Progress = Event.ephemeral({\n type: \"session.tool.progress\",\n schema: {\n ...ToolBase,\n metadata: Schema.Record(Schema.String, Schema.Json),\n },\n })\n export type Progress = typeof Progress.Type\n\n /** Canonical terminal success: one non-empty model representation plus optional UI metadata. */\n export const Success = Event.durable({\n type: \"session.tool.success\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...ToolBase,\n content: Schema.NonEmptyArray(Content),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n executed: Schema.Boolean,\n resultState: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Success = typeof Success.Type\n\n /**\n * Canonical terminal failure: one error plus the final bounded snapshot of\n * partial progress. The event is self-contained; projection never reaches\n * into ephemeral progress history.\n */\n export const Failed = Event.durable({\n type: \"session.tool.failed\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...ToolBase,\n error: SessionError.Error,\n content: Schema.NonEmptyArray(Content).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n executed: Schema.Boolean,\n resultState: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Failed = typeof Failed.Type\n}\n\nexport const RetryScheduled = Event.durable({\n type: \"session.retry.scheduled\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n attempt: PositiveInt,\n at: NonNegativeInt,\n error: SessionError.Error,\n },\n})\nexport type RetryScheduled = typeof RetryScheduled.Type\n\nexport namespace Compaction {\n export const Started = Event.durable({\n type: \"session.compaction.started\",\n ...options,\n schema: {\n ...Base,\n reason: Schema.Literals([\"auto\", \"manual\"]),\n recent: Schema.String,\n inputID: SessionMessage.ID.pipe(optional),\n },\n })\n export type Started = typeof Started.Type\n\n export const Delta = Event.ephemeral({\n type: \"session.compaction.delta\",\n schema: {\n ...Base,\n text: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.compaction.ended\",\n ...options,\n schema: {\n ...Base,\n reason: Started.data.fields.reason,\n text: Schema.String,\n recent: Schema.String,\n },\n })\n export type Ended = typeof Ended.Type\n\n export const Failed = Event.durable({\n type: \"session.compaction.failed\",\n ...options,\n schema: {\n ...Base,\n reason: Started.data.fields.reason,\n error: SessionError.Error,\n inputID: SessionMessage.ID.pipe(optional),\n },\n })\n export type Failed = typeof Failed.Type\n}\n\nexport namespace RevertEvent {\n export const Staged = Event.durable({\n type: \"session.revert.staged\",\n ...options,\n schema: { ...Base, revert: Revert },\n })\n export const Cleared = Event.durable({ type: \"session.revert.cleared\", ...options, schema: Base })\n export const Committed = Event.durable({\n type: \"session.revert.committed\",\n ...options,\n schema: { ...Base, to: SessionMessage.ID },\n })\n}\n\nexport const Definitions = Event.inventory(\n Created,\n AgentSelected,\n ModelSelected,\n Moved,\n Renamed,\n UsageUpdated,\n Deleted,\n Forked,\n InboxDelivered,\n InboxEnqueued,\n InboxCancelled,\n InboxDeliveryChanged,\n Execution.Started,\n Execution.Succeeded,\n Execution.Failed,\n Execution.Interrupted,\n InstructionsUpdated,\n Synthetic,\n Skill.Activated,\n Shell.Started,\n Shell.Ended,\n Step.Started,\n Step.Ended,\n Step.Failed,\n Text.Started,\n Text.Delta,\n Text.Ended,\n Reasoning.Started,\n Reasoning.Delta,\n Reasoning.Ended,\n Tool.Input.Started,\n Tool.Input.Delta,\n Tool.Input.Ended,\n Tool.Called,\n Tool.Progress,\n Tool.Success,\n Tool.Failed,\n RetryScheduled,\n Compaction.Started,\n Compaction.Delta,\n Compaction.Ended,\n Compaction.Failed,\n RevertEvent.Staged,\n RevertEvent.Cleared,\n RevertEvent.Committed,\n)\n\n// UsageRecorded is durable but internal: excluded from Definitions so it never reaches the public manifest.\nexport const DurableDefinitions = Event.inventory(\n ...Definitions.filter((definition) => definition.durability === \"durable\"),\n UsageRecorded,\n)\nexport const EphemeralDefinitions = Event.inventory(\n ...Definitions.filter((definition) => definition.durability === \"ephemeral\"),\n)\n\nexport const Durable = Schema.Union(DurableDefinitions, { mode: \"oneOf\" })\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Session.Event.Durable\" })\nexport type DurableEvent = typeof Durable.Type\n\nexport const All = Schema.Union([Durable, ...EphemeralDefinitions], { mode: \"oneOf\" }).pipe(\n Schema.toTaggedUnion(\"type\"),\n)\nexport type Event = typeof All.Type\nexport type Type = Event[\"type\"]\n" | ||
| ], | ||
| "mappings": ";8jBAKO,IAAM,GAAO,EAAO,OAAO,CAChC,KAAM,EAAO,OACb,MAAO,EAAO,OACd,UAAW,EACX,UAAW,EACX,OAAQ,EAAO,SAAS,CAAC,QAAS,UAAW,UAAU,CAAC,CAC1D,CAAC,EAAE,SAAS,CAAE,WAAY,eAAgB,CAAC,EAI9B,GAAa,EAAO,OAAO,CACtC,KAAM,EAAO,OAAO,KAAK,CAAQ,EACjC,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,UAAW,EAAO,OAClB,UAAW,EAAO,OAClB,OAAQ,EAAO,SAAS,CAAC,QAAS,UAAW,UAAU,CAAC,EAAE,KAAK,CAAQ,CACzE,CAAC,EAAE,SAAS,CAAE,WAAY,qBAAsB,CAAC,ECd1C,IAAM,EAAS,EAAO,OAAO,CAClC,UAAW,EAAe,GAE1B,OAAQ,EAAO,OAAO,KAAK,CAAQ,EACnC,SAAU,EAAS,GAAG,KAAK,CAAQ,EACnC,MAAO,EAAO,MAAM,EAAS,IAAI,EAAE,KAAK,CAAQ,CAClD,CAAC,EAAE,SAAS,CAAE,WAAY,gBAAiB,CAAC,EAEtC,GAAa,EAAO,OAAO,CAC/B,KAAM,EAAO,OACb,OAAQ,EAAO,SAAS,CAAC,QAAS,WAAY,SAAS,CAAC,EACxD,UAAW,EAAO,OAClB,UAAW,EAAO,OAClB,MAAO,EAAO,MAChB,CAAC,EAGY,GAAW,EAAO,OAAO,CACpC,UAAW,EAAe,GAC1B,OAAQ,EAAO,OAAO,KAAK,CAAQ,EACnC,SAAU,EAAO,OAAO,KAAK,CAAQ,EACrC,KAAM,EAAO,OAAO,KAAK,CAAQ,EACjC,MAAO,EAAO,MAAM,EAAU,EAAE,KAAK,CAAQ,CAC/C,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAExC,GAAmB,EAAO,KAC9B,EAAO,SACL,EAAO,OAAO,CAAE,OAAQ,EAAO,IAAI,SAAS,EAAG,OAAQ,EAAO,OAAO,CAAM,CAAE,CAAC,EAC9E,EAAqB,UAAU,CAC7B,OAAQ,CAAC,KAAqE,CAC5E,OAAQ,UACR,QACF,GACA,OAAQ,CAAC,IAAU,EAAM,MAC3B,CAAC,CACH,CACF,EACM,GAAkB,GAAS,KAC/B,EAAO,SACL,EAAO,OAAO,CAAE,OAAQ,EAAO,IAAI,QAAQ,EAAG,OAAQ,EAAO,OAAO,EAAQ,CAAE,CAAC,EAC/E,EAAqB,UAAU,CAC7B,OAAQ,CAAC,KAAsE,CAC7E,OAAQ,SACR,QACF,GACA,OAAQ,CAAC,IAAU,EAAM,MAC3B,CAAC,CACH,CACF,EAGa,GAAkB,EAAO,MAAM,CAAC,GAAkB,EAAe,CAAC,EAAE,KAC/E,EAAO,cAAc,QAAQ,EAC7B,EAAO,SACL,EAAO,OAAO,CAAM,EACpB,EAAqB,UAAU,CAC7B,OAAQ,CAAC,IAAsB,CAC7B,GAAI,EAAU,SAAW,UAAW,OAAO,EAAU,OACrD,OAAO,EAAO,KAAK,CACjB,UAAW,EAAU,OAAO,UAC5B,OAAQ,EAAU,OAAO,OACzB,SAAU,EAAU,OAAO,SAAW,EAAS,GAAG,KAAK,EAAU,OAAO,QAAQ,EAAI,OACpF,MAAO,EAAU,OAAO,OAAO,IAAI,CAAC,KAAU,CAC5C,KAAM,EAAK,KACX,OAAQ,EAAK,OACb,UAAW,EAAK,UAChB,UAAW,EAAK,UAChB,MAAO,EAAK,KACd,EAAE,CACJ,CAAC,GAEH,OAAQ,CAAC,KAAqE,CAC5E,OAAQ,UACR,QACF,EACF,CAAC,CACH,EACA,EAAO,SAAS,CAAE,WAAY,0BAA2B,CAAC,CAC5D,2EChFO,IAAM,GAAW,EAAO,MAAM,CACnC,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,QAAQ,EAAG,UAAW,EAAe,EAAG,CAAC,EAC9E,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,SAAS,EAAG,UAAW,EAAe,EAAG,CAAC,CACjF,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC,EAGrC,GAAkB,EAAO,MAAM,CAC1C,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,QAAQ,EAAG,UAAW,EAAe,EAAG,CAAC,EAC9E,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,SAAS,CAAE,CAAC,CACnD,CAAC,EAAE,SAAS,CAAE,WAAY,6BAA8B,CAAC,qtBCVlD,IAAM,GAAM,EAAO,OAAO,MAAM,EAAO,UAAU,+CAA+C,CAAC,EAAE,KACxG,EAAO,MAAM,iBAAiB,CAChC,EAGa,EAAO,EAAO,OAAO,MAAM,EAAO,UAAU,gBAAgB,CAAC,EAAE,KAAK,EAAO,MAAM,kBAAkB,CAAC,EAGpG,GAAS,EAAO,OAAO,GAAK,CAAI,EAGhC,EAAU,EAAO,QAAQ,SAAS,EAElC,GAAU,EAAQ,KAAK,SAAS,EAEhC,GAAQ,EAAO,OAAO,EAAO,OAAQ,EAAO,MAAM,CAAC,EAAM,CAAO,CAAC,CAAC,8NCTxE,IAAM,EAAW,EAAO,SAAS,CAAC,QAAS,OAAO,CAAC,EAAE,SAAS,CAAE,WAAY,wBAAyB,CAAC,EAIhG,GAAc,EAAO,OAAO,IACpC,GAAO,OACV,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAE,KAAK,CAAQ,CACtE,CAAC,EAAE,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAG1C,GAAmB,EAAO,OAAO,CAC5C,KAAM,EAAO,OACb,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAE,KAAK,CAAQ,CACtE,CAAC,EAAE,SAAS,CAAE,WAAY,gCAAiC,CAAC,EAG/C,GAAoB,EAAO,OAAO,CAAC,CAAC,EAAE,SAAS,CAAE,WAAY,iCAAkC,CAAC,EAGhG,GAAc,EAAO,OAAO,CACvC,SAAU,EAAS,IACnB,UAAW,EAAQ,GACnB,QAAS,EAAa,KAAK,CAAQ,CACrC,CAAC,EAAE,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAEjD,GAAW,EAAO,OAAO,CAAE,KAAM,EAAO,IAAI,MAAM,EAAG,QAAS,GAAa,SAAU,CAAS,CAAC,EAC/F,GAAgB,EAAO,OAAO,CAAE,KAAM,EAAO,IAAI,WAAW,EAAG,QAAS,GAAkB,SAAU,CAAS,CAAC,EAC9G,GAAiB,EAAO,OAAO,CACnC,KAAM,EAAO,IAAI,YAAY,EAC7B,QAAS,GACT,SAAU,CACZ,CAAC,EACK,GAAW,EAAO,OAAO,CAAE,KAAM,EAAO,IAAI,MAAM,EAAG,QAAS,GAAa,SAAU,CAAS,CAAC,EAExF,GAAO,EAAO,MAAM,CAAC,GAAU,GAAe,GAAgB,EAAQ,CAAC,EAAE,KACpF,EAAO,cAAc,MAAM,EAC3B,EAAO,SAAS,CAAE,WAAY,oBAAqB,CAAC,CACtD,EAGM,EAAW,CACf,GAAI,EAAe,GACnB,UAAW,EACX,YAAa,EACf,EAGa,GAAO,EAAO,OAAO,IAAK,KAAa,GAAS,MAAO,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGvG,GAAY,EAAO,OAAO,IAAK,KAAa,GAAc,MAAO,CAAC,EAAE,SAAS,CACxF,WAAY,yBACd,CAAC,EAGY,GAAa,EAAO,OAAO,IAAK,KAAa,GAAe,MAAO,CAAC,EAAE,SAAS,CAC1F,WAAY,0BACd,CAAC,EAGY,GAAO,EAAO,OAAO,IAAK,KAAa,GAAS,MAAO,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAEvG,GAAO,EAAO,MAAM,CAAC,GAAM,GAAW,GAAY,EAAI,CAAC,EAAE,KACpE,EAAO,cAAc,MAAM,EAC3B,EAAO,SAAS,CAAE,WAAY,oBAAqB,CAAC,CACtD,EChDO,IAAM,GAAS,EAAO,OAAO,CAClC,MAAO,EACP,IAAK,EACL,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CACV,WAAY,sBACd,CAAC,EAGK,EAAO,CACX,UAAW,CACb,EAEM,EAAU,CACd,QAAS,CACP,UAAW,YACX,QAAS,CACX,CACF,EACa,GAAU,EAAM,QAAQ,CACnC,KAAM,qBACH,EACH,OAAQ,IACH,EACH,UAAW,EAAQ,GACnB,SAAU,EAAS,IACnB,QAAS,EAAa,KAAK,CAAQ,EACnC,SAAU,EAAU,KAAK,CAAQ,EACjC,KAAM,EAAO,OACb,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,MAAO,EAAM,GAAG,KAAK,CAAQ,EAC7B,MAAO,EAAM,IAAI,KAAK,CAAQ,EAC9B,QAAS,EAAO,MAClB,CACF,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,MAAO,EAAM,GACb,SAAU,EAAM,GAAG,KAAK,CAAQ,CAClC,CACF,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,MAAO,EAAM,IACb,SAAU,EAAM,IAAI,KAAK,CAAQ,CACnC,CACF,CAAC,EAGY,GAAQ,EAAM,QAAQ,CACjC,KAAM,mBACH,EACH,OAAQ,IACH,KACA,EAAa,YAAY,MAC9B,CACF,CAAC,EAGY,GAAU,EAAM,QAAQ,CACnC,KAAM,qBACH,EACH,OAAQ,IACH,EACH,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,OAAQ,EAAO,SAAS,CAAC,QAAS,YAAY,CAAC,EAC/C,KAAM,EAAM,IACZ,OAAQ,EAAW,IACrB,CACF,CAAC,EAGY,GAAe,EAAM,UAAU,CAC1C,KAAM,wBACN,OAAQ,IACH,EACH,KAAM,EAAM,IACZ,OAAQ,EAAW,IACrB,CACF,CAAC,EAGY,GAAU,EAAM,QAAQ,CACnC,KAAM,kBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,CACV,CAAC,EAGY,GAAS,EAAM,QAAQ,CAClC,KAAM,iBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,SAAU,EACV,SAAU,EAAY,SACtB,aAAc,EAAY,OAAO,KAAK,CAAQ,CAChD,CACF,CAAC,EAGK,EAAW,IACZ,EACH,QAAS,EAAe,EAC1B,EAEa,GAAiB,EAAM,QAAQ,CAC1C,KAAM,6BACH,EACH,OAAQ,CACV,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,KAAM,EAAa,IACrB,CACF,CAAC,EAGY,GAAiB,EAAM,QAAQ,CAC1C,KAAM,6BACH,EACH,OAAQ,CACV,CAAC,EAGY,GAAuB,EAAM,QAAQ,CAChD,KAAM,oCACH,EACH,OAAQ,IAAK,EAAU,SAAU,EAAa,QAAS,CACzD,CAAC,EAGgB,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CAAE,KAAM,+BAAgC,EAAS,OAAQ,CAAK,CAAC,EAGvF,YAAY,EAAM,QAAQ,CAAE,KAAM,iCAAkC,EAAS,OAAQ,CAAK,CAAC,EAG3F,SAAS,EAAM,QAAQ,CAClC,KAAM,8BACH,EACH,OAAQ,IAAK,EAAM,MAAO,EAAa,KAAM,CAC/C,CAAC,EAGY,cAAc,EAAM,QAAQ,CACvC,KAAM,mCACH,EACH,OAAQ,IAAK,EAAM,OAAQ,EAAO,SAAS,CAAC,OAAQ,WAAY,YAAY,CAAC,CAAE,CACjF,CAAC,IAlBc,QAsBV,IAAM,GAAsB,EAAM,QAAQ,CAC/C,KAAM,+BACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,MAAO,EAAY,MAKnB,KAAM,EAAO,OAAO,KAAK,CAAQ,CACnC,CACF,CAAC,EAGY,GAAY,EAAM,QAAQ,CACrC,KAAM,uBACH,EACH,OAAQ,IACH,EACH,KAAM,EAAO,OACb,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAE,KAAK,CAAQ,CACtE,CACF,CAAC,EAGgB,GAAV,CAAU,KACF,aAAY,EAAM,QAAQ,CACrC,KAAM,6BACH,EACH,OAAQ,IACH,EACH,GAAI,EAAY,GAChB,KAAM,EAAY,KAClB,KAAM,EAAO,MACf,CACF,CAAC,GAVc,QAcV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,2BACH,EACH,OAAQ,IACH,EACH,MAAO,EAAY,IACrB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,yBACH,EACH,OAAQ,IACH,EACH,MAAO,EAAY,KACnB,OAAQ,EAAY,MACtB,CACF,CAAC,IAnBc,QAuBV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,0BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,MAAO,EAAM,GACb,MAAO,EAAM,IACb,SAAU,EAAS,GAAG,KAAK,CAAQ,CACrC,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,wBACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,OAAQ,GACR,UAAW,EAAO,OAAO,KAAK,CAAQ,EACtC,cAAe,EAAe,cAAc,KAAK,CAAQ,EACzD,KAAM,EAAM,IACZ,OAAQ,EAAW,KACnB,SAAU,EAAS,GAAG,KAAK,CAAQ,EACnC,MAAO,EAAO,MAAM,CAAY,EAAE,KAAK,CAAQ,CACjD,CACF,CAAC,EAGY,SAAS,EAAM,QAAQ,CAClC,KAAM,yBACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,MAAO,EAAa,MACpB,OAAQ,EAAO,SAAS,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAQ,EACzD,UAAW,EAAO,OAAO,KAAK,CAAQ,EACtC,cAAe,EAAe,cAAc,KAAK,CAAQ,EACzD,KAAM,EAAM,IAAI,KAAK,CAAQ,EAC7B,OAAQ,EAAW,KAAK,KAAK,CAAQ,EACrC,SAAU,EAAS,GAAG,KAAK,CAAQ,EACnC,MAAO,EAAO,MAAM,CAAY,EAAE,KAAK,CAAQ,CACjD,CACF,CAAC,IA9Cc,QAkDV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,0BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,CACX,CACF,CAAC,EAIY,QAAQ,EAAM,UAAU,CACnC,KAAM,qBACN,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,wBACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,KAAM,EAAO,OACb,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,IAlCc,QAsCV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,+BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,EAIY,QAAQ,EAAM,UAAU,CACnC,KAAM,0BACN,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,6BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,KAAM,EAAO,OACb,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,IAnCc,QAuCV,IAAU,GAAV,CAAU,IAAV,CACL,IAAM,EAAW,IACZ,EACH,mBAAoB,EAAe,GACnC,GAAI,EAAO,MACb,EAEiB,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,gCACH,EACH,OAAQ,IACH,EACH,KAAM,EAAO,MACf,CACF,CAAC,EAIY,QAAQ,EAAM,UAAU,CACnC,KAAM,2BACN,OAAQ,IACH,EACH,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,8BACH,EACH,OAAQ,IACH,EACH,KAAM,EAAO,MACf,CACF,CAAC,IA5Bc,gBAgCJ,SAAS,EAAM,QAAQ,CAClC,KAAM,yBACH,EACH,OAAQ,IACH,EACH,MAAO,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAClD,SAAU,EAAO,QACjB,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,EAIY,WAAW,EAAM,UAAU,CACtC,KAAM,wBACN,OAAQ,IACH,EACH,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,CACpD,CACF,CAAC,EAIY,UAAU,EAAM,QAAQ,CACnC,KAAM,uBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,QAAS,EAAO,cAAc,CAAO,EACrC,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAAE,KAAK,CAAQ,EACjE,SAAU,EAAO,QACjB,YAAa,EAAe,cAAc,KAAK,CAAQ,CACzD,CACF,CAAC,EAQY,SAAS,EAAM,QAAQ,CAClC,KAAM,sBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,MAAO,EAAa,MACpB,QAAS,EAAO,cAAc,CAAO,EAAE,KAAK,CAAQ,EACpD,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAAE,KAAK,CAAQ,EACjE,SAAU,EAAO,QACjB,YAAa,EAAe,cAAc,KAAK,CAAQ,CACzD,CACF,CAAC,IAjGc,QAqGV,IAAM,GAAiB,EAAM,QAAQ,CAC1C,KAAM,6BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,GACT,GAAI,EACJ,MAAO,EAAa,KACtB,CACF,CAAC,EAGgB,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,gCACH,EACH,OAAQ,IACH,EACH,OAAQ,EAAO,SAAS,CAAC,OAAQ,QAAQ,CAAC,EAC1C,OAAQ,EAAO,OACf,QAAS,EAAe,GAAG,KAAK,CAAQ,CAC1C,CACF,CAAC,EAGY,QAAQ,EAAM,UAAU,CACnC,KAAM,2BACN,OAAQ,IACH,EACH,KAAM,EAAO,MACf,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,8BACH,EACH,OAAQ,IACH,EACH,OAAQ,UAAQ,KAAK,OAAO,OAC5B,KAAM,EAAO,OACb,OAAQ,EAAO,MACjB,CACF,CAAC,EAGY,SAAS,EAAM,QAAQ,CAClC,KAAM,+BACH,EACH,OAAQ,IACH,EACH,OAAQ,UAAQ,KAAK,OAAO,OAC5B,MAAO,EAAa,MACpB,QAAS,EAAe,GAAG,KAAK,CAAQ,CAC1C,CACF,CAAC,IA3Cc,QA+CV,IAAU,GAAV,CAAU,KACF,SAAS,EAAM,QAAQ,CAClC,KAAM,2BACH,EACH,OAAQ,IAAK,EAAM,OAAQ,CAAO,CACpC,CAAC,EACY,UAAU,EAAM,QAAQ,CAAE,KAAM,4BAA6B,EAAS,OAAQ,CAAK,CAAC,EACpF,YAAY,EAAM,QAAQ,CACrC,KAAM,8BACH,EACH,OAAQ,IAAK,EAAM,GAAI,EAAe,EAAG,CAC3C,CAAC,IAXc,QAcV,IAAM,GAAc,EAAM,UAC/B,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EAAU,QACV,EAAU,UACV,EAAU,OACV,EAAU,YACV,GACA,GACA,EAAM,UACN,EAAM,QACN,EAAM,MACN,EAAK,QACL,EAAK,MACL,EAAK,OACL,EAAK,QACL,EAAK,MACL,EAAK,MACL,EAAU,QACV,EAAU,MACV,EAAU,MACV,EAAK,MAAM,QACX,EAAK,MAAM,MACX,EAAK,MAAM,MACX,EAAK,OACL,EAAK,SACL,EAAK,QACL,EAAK,OACL,GACA,EAAW,QACX,EAAW,MACX,EAAW,MACX,EAAW,OACX,EAAY,OACZ,EAAY,QACZ,EAAY,SACd,EAGa,GAAqB,EAAM,UACtC,GAAG,GAAY,OAAO,CAAC,IAAe,EAAW,aAAe,SAAS,EACzE,EACF,EACa,GAAuB,EAAM,UACxC,GAAG,GAAY,OAAO,CAAC,IAAe,EAAW,aAAe,WAAW,CAC7E,EAEa,GAAU,EAAO,MAAM,GAAoB,CAAE,KAAM,OAAQ,CAAC,EACtE,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,uBAAwB,CAAC,EAGtC,GAAM,EAAO,MAAM,CAAC,GAAS,GAAG,EAAoB,EAAG,CAAE,KAAM,OAAQ,CAAC,EAAE,KACrF,EAAO,cAAc,MAAM,CAC7B", | ||
| "debugId": "D91B9AA6B26B64B064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package.js\"\nimport { OpenAICompatibleChat } from \"../protocols/openai-compatible-chat.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\nimport type { OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.OAuthOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly accessToken?: string\n readonly apiKey?: never\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst route = OpenAICompatibleChat.route.with({\n id: \"google-vertex-chat\",\n provider: id,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config) => {\n if (\"apiKey\" in input && input.apiKey !== undefined) throw new Error(\"Google Vertex Chat does not support API keys\")\n const {\n accessToken: _accessToken,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const location = GoogleVertexShared.location(inputLocation, \"global\")\n const project = GoogleVertexShared.project(inputProject)\n return route.with({\n ...rest,\n endpoint: {\n baseURL:\n baseURL ??\n `https://aiplatform.googleapis.com/v1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}/endpoints/openapi`,\n },\n auth: GoogleVertexShared.oauth(input, project),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<OpenAIProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined) throw new Error(\"Google Vertex Chat does not support API keys\")\n return configure({\n accessToken: settings.accessToken,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";ykBAOO,IAAM,EAAK,EAAW,KAAK,eAAe,EAmB3C,EAAQ,EAAqB,MAAM,KAAK,CAC5C,GAAI,qBACJ,SAAU,CACZ,CAAC,EAID,IAAM,EAAkB,CAAC,IAAkB,CACzC,GAAI,WAAY,GAAS,EAAM,SAAW,OAAW,MAAU,MAAM,8CAA8C,EACnH,IACE,YAAa,EACb,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAW,EAAmB,SAAS,EAAe,QAAQ,EAC9D,EAAU,EAAmB,QAAQ,CAAY,EACvD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CACR,QACE,GACA,iDAAiD,EAAmB,eAAe,CAAO,eAAe,qBAC7G,EACA,KAAM,EAAmB,MAAM,EAAO,CAAO,CAC/C,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAAkC,CAAE,GAAI,CAAQ,CAAC,EAC7F,WACF,GAQK,IAAM,EAAmF,CAAC,EAAS,IAAa,CACrH,GAAI,EAAS,SAAW,OAAW,MAAU,MAAM,8CAA8C,EACjG,OAAO,EAAU,CACf,YAAa,EAAS,YACtB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "10B6B206EA0F365164756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "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": "1145349747E28AB964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/openai-image.ts", "../ai/src/protocols/open-responses-channel.ts", "../ai/src/protocols/openai-responses-channel.ts", "../ai/src/protocols/openai-responses.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\n\nconst dimensions = (value: string) => {\n const match = /^(\\d+)x(\\d+)$/.exec(value)\n if (!match) return undefined\n return { width: Number(match[1]), height: Number(match[2]) }\n}\n\nexport const Size = Schema.String.check(\n Schema.makeFilter((value) => {\n if (value === \"auto\") return undefined\n const parsed = dimensions(value)\n if (!parsed) return \"image size must be `auto` or `{width}x{height}`\"\n return parsed.width > 0 && parsed.height > 0 ? undefined : \"image dimensions must be positive integers\"\n }),\n)\n\nexport const OpenAIImage = {\n Size,\n} as const\n", | ||
| "import { Effect, Schema, Stream } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Framing } from \"../route/framing.js\"\nimport {\n HttpTransport,\n WebSocketTransport,\n type Transport,\n type WebSocketChannelDriver,\n type WebSocketChannelExchange,\n} from \"../route/transport/index.js\"\nimport * as ProviderShared from \"./shared.js\"\nimport { OpenResponses } from \"./open-responses.js\"\n\nconst WebSocketResponseCreate = Schema.StructWithRest(Schema.Struct({ type: Schema.tag(\"response.create\") }), [\n Schema.Record(Schema.String, Schema.Unknown),\n])\nconst decodeMessage = ProviderShared.validateWith(Schema.decodeUnknownEffect(WebSocketResponseCreate))\nconst encodeMessage = Schema.encodeSync(Schema.fromJsonString(WebSocketResponseCreate))\nconst decodeEvent = Schema.decodeUnknownEffect(OpenResponses.protocol.stream.event)\n\nexport interface Options {\n readonly id: string\n readonly name: string\n readonly rotateAfterMs?: number\n readonly enabled?: (url: string) => boolean\n readonly url?: (url: string) => string\n readonly headers?: (headers: Headers.Headers) => Headers.Headers\n readonly driver?: (input: {\n readonly request: Readonly<Record<string, unknown>>\n readonly message: string\n readonly base: WebSocketChannelDriver\n }) => WebSocketChannelDriver\n}\n\nexport interface Prepared {\n readonly http: HttpTransport.HttpPrepared<string>\n readonly channel?: {\n readonly url: string\n readonly headers: Headers.Headers\n readonly rotateAfterMs?: number\n readonly driver: WebSocketChannelDriver\n }\n}\n\nconst message = (body: unknown) =>\n Effect.gen(function* () {\n if (!ProviderShared.isRecord(body))\n return yield* ProviderShared.invalidRequest(\"Open Responses WebSocket body must be a JSON object\")\n const { stream: _stream, stream_options: _streamOptions, background: _background, ...request } = body\n const decoded = yield* decodeMessage({ ...request, type: \"response.create\" })\n return { request: decoded, message: encodeMessage(decoded) }\n })\n\nconst driver = (options: Options, body: string): WebSocketChannelDriver => {\n let responseID: string | undefined\n let terminal = false\n return {\n create: () =>\n Effect.sync(() => {\n responseID = undefined\n terminal = false\n return { message: body, mode: \"full\" }\n }),\n observe: (_create, frame) =>\n Effect.gen(function* () {\n const event = yield* decodeEvent(frame).pipe(\n Effect.mapError(() =>\n ProviderShared.eventError(options.id, `Invalid ${options.name} WebSocket event`, frame),\n ),\n )\n if (terminal)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} emitted ${event.type} after a terminal event`,\n frame,\n )\n if (event.type === \"error\") {\n terminal = true\n yield* OpenResponses.decodeKnownErrorEvent(event).pipe(\n Effect.mapError(() =>\n ProviderShared.eventError(options.id, `${options.name} returned a malformed error event`, frame),\n ),\n )\n return {\n type: \"provider-failure\",\n error: OpenResponses.providerFailure(options.id, event, `${options.name} stream error`),\n }\n }\n if (event.type === \"response.failed\") {\n terminal = true\n if (responseID && event.response?.id && event.response.id !== responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} response ID changed during execution`,\n frame,\n )\n return {\n type: \"provider-failure\",\n error: OpenResponses.providerFailure(options.id, event, `${options.name} response failed`),\n }\n }\n if (event.type === \"response.created\") {\n const created = event.response?.id\n if (responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} emitted duplicate response.created`,\n frame,\n )\n if (!created)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} response.created is missing response.id`,\n frame,\n )\n responseID = created\n return { type: \"frame\", frame }\n }\n if (!responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} emitted ${event.type} before response.created`,\n frame,\n )\n if (event.response?.id && event.response.id !== responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} response ID changed during execution`,\n frame,\n )\n if (event.type === \"response.completed\") {\n terminal = true\n return { type: \"completed\", frame }\n }\n if (event.type === \"response.incomplete\") {\n terminal = true\n return { type: \"incomplete\", frame }\n }\n return { type: \"frame\", frame }\n }),\n }\n}\n\nexport const transport = <Body>(options: Options): Transport<Body, Prepared, string> => {\n const http = HttpTransport.sseJson.with<Body>()\n return {\n id: http.id,\n prepare: (input) =>\n Effect.gen(function* () {\n const parts = yield* HttpTransport.jsonRequestParts(input)\n const headers = Headers.remove(options.headers?.(parts.headers) ?? parts.headers, \"content-length\")\n const channel =\n input.webSocket && (options.enabled?.(parts.url) ?? true)\n ? yield* Effect.gen(function* () {\n const create = yield* message(parts.jsonBody)\n const base = driver(options, create.message)\n return {\n url: yield* WebSocketTransport.toWebSocketUrl(options.url?.(parts.url) ?? parts.url),\n headers,\n rotateAfterMs: options.rotateAfterMs,\n driver: options.driver?.({ request: create.request, message: create.message, base }) ?? base,\n }\n })\n : undefined\n return {\n http: {\n request: ProviderShared.jsonPost({ url: parts.url, body: parts.bodyText, headers: parts.headers }),\n framing: Framing.sse,\n middleware: input.middleware,\n },\n channel,\n }\n }),\n execute: (prepared, request, runtime, executeOptions) => {\n if (!executeOptions?.webSocket || !prepared.channel) return http.execute(prepared.http, request, runtime)\n const exchange: WebSocketChannelExchange = {\n id: request.id ?? \"request\",\n connect: {\n url: prepared.channel.url,\n headers: prepared.channel.headers,\n rotateAfterMs: prepared.channel.rotateAfterMs,\n },\n fallback: () =>\n Stream.unwrap(\n http.execute(prepared.http, request, runtime).pipe(Effect.map((execution) => execution.frames)),\n ),\n driver: prepared.channel.driver,\n }\n return executeOptions.webSocket.execute(exchange)\n },\n }\n}\n\nexport const OpenResponsesChannel = { transport } as const\n", | ||
| "import { AIError, TransportReason } from \"../schema/index.js\"\nimport type { ChannelCheckpoint, ChannelObservation, WebSocketChannelDriver } from \"../route/transport/index.js\"\nimport { Effect, Option, Schema } from \"effect\"\nimport * as ProviderShared from \"./shared.js\"\nimport { OpenResponses } from \"./open-responses.js\"\n\nconst PROTOCOL = \"openai-responses.websocket.v1\"\nconst VERSION = 1\nconst decodeEvent = Schema.decodeUnknownEffect(OpenResponses.protocol.stream.event)\n\ninterface CheckpointValue {\n readonly version: typeof VERSION\n readonly responseID: string\n readonly request: Readonly<Record<string, unknown>>\n readonly output: ReadonlyArray<unknown>\n}\n\nexport interface DriverInput {\n readonly id: string\n readonly name: string\n readonly request: Readonly<Record<string, unknown>>\n readonly message: string\n readonly base: WebSocketChannelDriver\n}\n\nconst checkpointValue = (checkpoint: ChannelCheckpoint | undefined): CheckpointValue | undefined => {\n if (checkpoint?.protocol !== PROTOCOL || !ProviderShared.isRecord(checkpoint.value)) return undefined\n if (checkpoint.value.version !== VERSION) return undefined\n if (typeof checkpoint.value.responseID !== \"string\" || checkpoint.value.responseID.trim().length === 0)\n return undefined\n if (!ProviderShared.isRecord(checkpoint.value.request) || !Array.isArray(checkpoint.value.output)) return undefined\n return {\n version: VERSION,\n responseID: checkpoint.value.responseID,\n request: checkpoint.value.request,\n output: checkpoint.value.output,\n }\n}\n\nconst canonical = (value: unknown): string => {\n if (value === undefined) return \"undefined\"\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`\n if (!ProviderShared.isRecord(value)) return ProviderShared.encodeJson(value)\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${ProviderShared.encodeJson(key)}:${canonical(value[key])}`)\n .join(\",\")}}`\n}\n\nconst json = (value: unknown) => {\n if (typeof value !== \"string\") return value\n return Option.getOrElse(Schema.decodeUnknownOption(ProviderShared.Json)(value), () => value)\n}\n\nconst comparable = (value: unknown) => {\n if (!ProviderShared.isRecord(value)) return value\n if (value.type === \"message\" && value.role === \"assistant\")\n return {\n role: \"assistant\",\n content: value.content,\n ...(value.phase === undefined ? {} : { phase: value.phase }),\n }\n if (value.type === \"function_call\")\n return {\n type: value.type,\n call_id: value.call_id,\n name: value.name,\n arguments: json(value.arguments),\n }\n if (value.type === \"reasoning\")\n return {\n type: value.type,\n summary: value.summary,\n encrypted_content: value.encrypted_content,\n }\n return value\n}\n\nconst invariant = (request: Readonly<Record<string, unknown>>) => {\n const { type: _type, input: _input, previous_response_id: _previousResponseID, ...rest } = request\n return rest\n}\n\nconst incremental = (\n request: Readonly<Record<string, unknown>>,\n checkpoint: CheckpointValue,\n): ReadonlyArray<unknown> | undefined => {\n const input = request.input\n const previousInput = checkpoint.request.input\n if (!Array.isArray(input) || !Array.isArray(previousInput)) return undefined\n if (canonical(invariant(request)) !== canonical(invariant(checkpoint.request))) return undefined\n const baseline = [...previousInput, ...checkpoint.output]\n if (input.length <= baseline.length) return undefined\n if (!baseline.every((item, index) => canonical(comparable(item)) === canonical(comparable(input[index]))))\n return undefined\n return input.slice(baseline.length)\n}\n\nconst code = (event: OpenResponses.Event) => event.code || event.error?.code || event.response?.error?.code || undefined\n\nconst rejected = (\n input: DriverInput,\n observation: Extract<ChannelObservation, { readonly type: \"provider-failure\" }>,\n recovery: \"retry-full\" | \"rotate-and-retry-full\",\n): ChannelObservation => ({\n type: \"rejected\",\n recovery,\n error: new AIError({\n module: input.id,\n method: \"stream\",\n reason: new TransportReason({\n message: observation.error.message,\n transport: \"websocket\",\n operation: \"read\",\n phase: \"receive\",\n delivery: \"rejected\",\n recovery,\n }),\n }),\n})\n\nexport const driver = (input: DriverInput): WebSocketChannelDriver => {\n const { previous_response_id: _previousResponseID, ...request } = input.request\n let output: unknown[] = []\n return {\n create: (checkpoint) =>\n Effect.sync(() => {\n output = []\n const previous = checkpointValue(checkpoint)\n const delta = previous ? incremental(request, previous) : undefined\n if (!previous || !delta) return { message: ProviderShared.encodeJson(request), mode: \"full\" as const }\n return {\n message: ProviderShared.encodeJson({ ...request, input: delta, previous_response_id: previous.responseID }),\n mode: \"incremental\" as const,\n }\n }),\n observe: (create, frame) =>\n Effect.gen(function* () {\n const event = yield* decodeEvent(frame).pipe(\n Effect.mapError(() => ProviderShared.eventError(input.id, `Invalid ${input.name} WebSocket event`, frame)),\n )\n const observation = yield* input.base.observe(create, frame)\n if (event.type === \"response.output_item.done\" && event.item) output.push(event.item)\n if (observation.type === \"provider-failure\") {\n const rejection = code(event)\n if (rejection === \"previous_response_not_found\") return rejected(input, observation, \"retry-full\")\n if (rejection === \"websocket_connection_limit_reached\")\n return rejected(input, observation, \"rotate-and-retry-full\")\n }\n if (observation.type !== \"completed\") return observation\n const responseID = event.response?.id\n if (!responseID || responseID.trim().length === 0) return observation\n return {\n ...observation,\n checkpoint: {\n protocol: PROTOCOL,\n value: { version: VERSION, responseID, request, output: output.slice() } satisfies CheckpointValue,\n },\n }\n }),\n }\n}\n\nexport const OpenAIResponsesChannel = { driver } as const\n", | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport { HttpTransport } from \"../route/transport/index.js\"\nimport { LLMEvent, LLMRequest, type JsonSchema, type ToolDefinition } from \"../schema/index.js\"\nimport { OpenResponses } from \"./open-responses.js\"\nimport { optionalArray, ProviderShared } from \"./shared.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { OpenAIImage } from \"./utils/openai-image.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { OpenResponsesChannel, type Options } from \"./open-responses-channel.js\"\nimport { OpenAIResponsesChannel } from \"./openai-responses-channel.js\"\n\nconst ADAPTER = \"openai-responses\"\nconst NAME = \"OpenAI Responses\"\nconst WEBSOCKET_PROTOCOL_HEADER = \"responses_websockets=2026-02-06\"\nconst WEBSOCKET_ROTATE_AFTER_MS = 55 * 60 * 1000\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = OpenResponses.PATH\n\nconst OpenAIResponsesImageGenerationTool = Schema.Struct({\n type: Schema.tag(\"image_generation\"),\n action: Schema.optional(Schema.Literals([\"auto\", \"generate\", \"edit\"])),\n background: Schema.optional(Schema.Literals([\"auto\", \"opaque\", \"transparent\"])),\n input_fidelity: Schema.optional(Schema.Literals([\"low\", \"high\"])),\n output_compression: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 100 }))),\n output_format: Schema.optional(Schema.Literals([\"png\", \"jpeg\", \"webp\"])),\n partial_images: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))),\n quality: Schema.optional(Schema.Literals([\"auto\", \"low\", \"medium\", \"high\"])),\n size: Schema.optional(OpenAIImage.Size),\n})\n\nconst OpenAIResponsesTools = Schema.Union([OpenResponses.Tool, OpenAIResponsesImageGenerationTool])\n\nconst OpenAIResponsesToolChoice = Schema.Union([\n OpenResponses.ToolChoice,\n Schema.Struct({ type: Schema.tag(\"image_generation\") }),\n])\n\nconst OpenAIResponsesInputItem = Schema.Union([\n Schema.Struct({\n type: Schema.tag(\"message\"),\n id: Schema.optionalKey(Schema.String),\n role: Schema.tag(\"assistant\"),\n content: Schema.Array(Schema.Struct({ type: Schema.tag(\"output_text\"), text: Schema.String })),\n phase: Schema.optionalKey(Schema.NullOr(OpenResponses.MessagePhase)),\n }),\n OpenResponses.InputItem,\n])\n\nconst OpenAIResponsesCoreFields = {\n ...OpenResponses.coreFields,\n input: Schema.Array(OpenAIResponsesInputItem),\n tools: optionalArray(OpenAIResponsesTools),\n tool_choice: Schema.optional(OpenAIResponsesToolChoice),\n}\n\nconst OpenAIResponsesBody = Schema.Struct({\n ...OpenAIResponsesCoreFields,\n stream: Schema.Literal(true),\n})\nexport type OpenAIResponsesBody = Schema.Schema.Type<typeof OpenAIResponsesBody>\n\nconst extension = {\n id: ADAPTER,\n name: NAME,\n messagePhase: (value: unknown) => (value === null ? null : undefined),\n lowerMedia: ({ part, media, request }) => {\n if (request.model.provider !== \"xai\" || media.mime !== \"application/pdf\") return undefined\n return {\n type: \"input_file\",\n filename: part.filename ?? \"document.pdf\",\n file_data: media.base64,\n mime_type: media.mime,\n }\n },\n} satisfies OpenResponses.Extension\n\nconst nativeImageToolInput = (tool: ToolDefinition) => {\n const native = tool.native?.openai\n return ProviderShared.isRecord(native) && native.type === \"image_generation\" ? native : undefined\n}\n\nconst nativeImageTool = (tool: ToolDefinition) => {\n const native = nativeImageToolInput(tool)\n return Schema.is(OpenAIResponsesImageGenerationTool)(native) ? native : undefined\n}\n\nconst lowerTool = Effect.fn(\"OpenAIResponses.lowerTool\")(function* (tool: ToolDefinition, inputSchema: JsonSchema) {\n const native = nativeImageToolInput(tool)\n if (native !== undefined) {\n if (Schema.is(OpenAIResponsesImageGenerationTool)(native)) return native\n return yield* ProviderShared.invalidRequest(\"OpenAI Responses image generation tool options are invalid\")\n }\n return yield* OpenResponses.lowerTool(NAME, tool, inputSchema)\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>, tools: ReadonlyArray<ToolDefinition>) =>\n ProviderShared.matchToolChoice(NAME, toolChoice, {\n auto: () => \"auto\" as const,\n none: () => \"none\" as const,\n required: () => \"required\" as const,\n tool: (name) =>\n tools.some((tool) => tool.name === name && nativeImageTool(tool) !== undefined)\n ? ({ type: \"image_generation\" } as const)\n : { type: \"function\" as const, name },\n })\n\nconst fromRequest = Effect.fn(\"OpenAIResponses.fromRequest\")(function* (request: LLMRequest) {\n const body = yield* OpenResponses.fromRequestWithExtension(\n LLMRequest.update(request, { tools: [], toolChoice: undefined }),\n extension,\n )\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n return {\n ...body,\n tools:\n request.tools.length === 0\n ? undefined\n : yield* Effect.forEach(request.tools, (tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n tool_choice:\n body.tool_choice ?? (request.toolChoice ? yield* lowerToolChoice(request.toolChoice, request.tools) : undefined),\n } satisfies OpenAIResponsesBody\n})\n\ntype HostedToolData = OpenResponses.StreamItem & {\n readonly id: string\n readonly status?: string\n readonly action?: unknown\n readonly queries?: unknown\n readonly results?: unknown\n readonly code?: string\n readonly container_id?: string\n readonly outputs?: unknown\n readonly server_label?: string\n readonly output?: unknown\n readonly result?: string\n readonly output_format?: \"png\" | \"jpeg\" | \"webp\"\n readonly error?: unknown\n}\n\nconst HOSTED_TOOLS = {\n web_search_call: { name: \"web_search\", input: (item) => item.action ?? {} },\n web_search_preview_call: { name: \"web_search_preview\", input: (item) => item.action ?? {} },\n file_search_call: { name: \"file_search\", input: (item) => ({ queries: item.queries ?? [] }) },\n code_interpreter_call: {\n name: \"code_interpreter\",\n input: (item) => ({ code: item.code, container_id: item.container_id }),\n },\n computer_use_call: { name: \"computer_use\", input: (item) => item.action ?? {} },\n image_generation_call: { name: \"image_generation\", input: () => ({}) },\n mcp_call: {\n name: \"mcp\",\n input: (item) => ({ server_label: item.server_label, name: item.name, arguments: item.arguments }),\n },\n local_shell_call: { name: \"local_shell\", input: (item) => item.action ?? {} },\n} as const satisfies Record<string, { readonly name: string; readonly input: (item: HostedToolData) => unknown }>\n\ntype HostedToolType = keyof typeof HOSTED_TOOLS\ntype HostedToolItem = HostedToolData & { readonly type: HostedToolType }\n\nconst isHostedToolItem = (item: OpenResponses.StreamItem): item is HostedToolItem =>\n item.type in HOSTED_TOOLS && typeof item.id === \"string\" && item.id.length > 0\n\nconst hostedToolResult = Effect.fn(\"OpenAIResponses.hostedToolResult\")(function* (item: HostedToolItem) {\n const isError = item.error !== undefined && item.error !== null\n if (item.type === \"image_generation_call\" && item.result) {\n yield* Effect.fromResult(Encoding.decodeBase64(item.result)).pipe(\n Effect.mapError(() => ProviderShared.eventError(ADAPTER, \"OpenAI Responses returned invalid image base64\")),\n )\n const format = item.output_format ?? \"png\"\n return {\n type: \"content\" as const,\n value: [\n {\n type: \"file\" as const,\n uri: `data:image/${format};base64,${item.result}`,\n mime: `image/${format}`,\n },\n ],\n }\n }\n return isError ? { type: \"error\" as const, value: item.error } : { type: \"json\" as const, value: item }\n})\n\nconst onHostedToolDone = Effect.fn(\"OpenAIResponses.onHostedToolDone\")(function* (\n state: OpenResponses.ParserState,\n item: HostedToolItem,\n) {\n const tool = HOSTED_TOOLS[item.type]\n const providerMetadata = OpenResponses.providerMetadata(state, { itemId: item.id })\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n events.push(\n LLMEvent.toolCall({\n id: item.id,\n name: tool.name,\n input: tool.input(item),\n providerExecuted: true,\n providerMetadata,\n }),\n LLMEvent.toolResult({\n id: item.id,\n name: tool.name,\n result: yield* hostedToolResult(item),\n providerExecuted: true,\n providerMetadata,\n }),\n )\n return [{ ...state, lifecycle }, events] satisfies OpenResponses.StepResult\n})\n\nconst step = (state: OpenResponses.ParserState, event: OpenResponses.Event) => {\n if (event.type === \"response.reasoning_text.delta\" || event.type === \"response.reasoning_summary.delta\")\n return event.item_id\n ? Effect.succeed(OpenResponses.onReasoningDelta(state, event, event.item_id))\n : ProviderShared.eventError(ADAPTER, `${event.type} is missing item_id`)\n if (event.type === \"response.reasoning_text.done\" || event.type === \"response.reasoning_summary.done\")\n return event.item_id\n ? Effect.succeed(OpenResponses.onReasoningDone(state, event))\n : ProviderShared.eventError(ADAPTER, `${event.type} is missing item_id`)\n if (event.type === \"response.output_item.done\" && event.item && isHostedToolItem(event.item))\n return onHostedToolDone(state, event.item)\n return OpenResponses.step(state, event)\n}\n\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: OpenAIResponsesBody,\n from: fromRequest,\n },\n stream: {\n event: OpenResponses.protocol.stream.event,\n initial: (request) => OpenResponses.initial(request, extension),\n step,\n terminal: OpenResponses.terminal,\n },\n})\n\nconst endpoint = Endpoint.path<OpenAIResponsesBody>(PATH, { baseURL: DEFAULT_BASE_URL })\nconst auth = Auth.none\n\nexport const httpTransport = HttpTransport.sseJson.with<OpenAIResponsesBody>()\nexport const channelTransport = (options: Omit<Options, \"driver\">) =>\n OpenResponsesChannel.transport<OpenAIResponsesBody>({\n ...options,\n driver: (input) => OpenAIResponsesChannel.driver({ id: options.id, name: options.name, ...input }),\n })\nexport const transport = channelTransport({\n id: ADAPTER,\n name: NAME,\n rotateAfterMs: WEBSOCKET_ROTATE_AFTER_MS,\n headers: (headers) => Headers.set(headers, \"openai-beta\", headers[\"openai-beta\"] ?? WEBSOCKET_PROTOCOL_HEADER),\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"openai\",\n providerMetadataKey: \"openai\",\n protocol,\n endpoint,\n auth,\n transport,\n defaults: { providerOptions: { store: false } },\n})\n\nexport * as OpenAIResponses from \"./openai-responses.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F2A9415FB88BF60464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/openai-options.ts", "../ai/src/protocols/openai-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { OpenResponsesOptions } from \"./open-responses-options.js\"\n\nexport const OpenAIReasoningEfforts = OpenResponsesOptions.ReasoningEfforts\nexport type OpenAIReasoningEffort = OpenResponsesOptions.ReasoningEffort\nexport const OpenAITextVerbosities = OpenResponsesOptions.TextVerbosities\nexport type OpenAITextVerbosity = OpenResponsesOptions.TextVerbosity\n\n// Mirrors OpenAI's `ResponseIncludable` union from the official SDK. Keep this\n// in lockstep with `openai-node/src/resources/responses/responses.ts`.\nexport const OpenAIResponseIncludables = OpenResponsesOptions.ResponseIncludables\nexport type OpenAIResponseIncludable = OpenResponsesOptions.ResponseIncludable\nexport const OpenAIServiceTiers = OpenResponsesOptions.ServiceTiers\nexport type OpenAIServiceTier = OpenResponsesOptions.ServiceTier\n\nexport const OpenAIReasoningEffort = OpenResponsesOptions.ReasoningEffort\nexport const OpenAITextVerbosity = OpenResponsesOptions.TextVerbosity\nexport const OpenAIResponseIncludable = OpenResponsesOptions.ResponseIncludableSchema\nexport const OpenAIServiceTier = OpenResponsesOptions.ServiceTierSchema\n\nexport const isReasoningEffort = (effort: unknown): effort is OpenAIReasoningEffort => typeof effort === \"string\"\n\nexport const resolve = OpenResponsesOptions.resolve\n\nexport * as OpenAIOptions from \"./openai-options.js\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { HttpTransport } from \"../route/transport/index.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n AIError,\n LLMEvent,\n Usage,\n type FinishReason,\n type FinishReasonDetails,\n type CacheHint,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ReasoningPart,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n} from \"../schema/index.js\"\nimport { classifyProviderFailure } from \"../provider-error.js\"\nimport { isRecord, JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared.js\"\nimport { OpenAIOptions } from \"./utils/openai-options.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { ToolStream } from \"./utils/tool-stream.js\"\n\nconst ADAPTER = \"openai-chat\"\nconst RESERVED_REASONING_FIELDS = new Set([\"role\", \"content\", \"refusal\", \"tool_calls\"])\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/chat/completions\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\n// The body schema is the provider-native JSON body. `fromRequest` below builds\n// this shape from the common `LLMRequest`, then `Route.make` validates and\n// JSON-encodes it before transport.\nconst OpenAIChatCacheControl = Schema.Struct({\n type: Schema.Literal(\"ephemeral\"),\n ttl: Schema.optional(Schema.String),\n})\n\nconst OpenAIChatFunction = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: JsonObject,\n})\n\nconst OpenAIChatTool = Schema.Struct({\n type: Schema.tag(\"function\"),\n function: OpenAIChatFunction,\n cache_control: Schema.optional(OpenAIChatCacheControl),\n})\ntype OpenAIChatTool = Schema.Schema.Type<typeof OpenAIChatTool>\n\nconst OpenAIChatAssistantToolCall = Schema.Struct({\n id: Schema.String,\n type: Schema.tag(\"function\"),\n function: Schema.Struct({\n name: Schema.String,\n arguments: Schema.String,\n }),\n})\ntype OpenAIChatAssistantToolCall = Schema.Schema.Type<typeof OpenAIChatAssistantToolCall>\n\n// Intentionally omit Gemini's provider-specific `extra_content.google.thought_signature`\n// extension until direct Google OpenAI-compatible routing is supported here:\n// https://github.com/vercel/ai/issues/11590\n// https://github.com/vercel/ai/pull/11745\n// https://ai.google.dev/gemini-api/docs/thought-signatures#openai\n\nconst OpenAIChatUserContent = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(OpenAIChatCacheControl),\n }),\n Schema.Struct({\n type: Schema.Literal(\"image_url\"),\n image_url: Schema.Struct({ url: Schema.String }),\n }),\n])\n\nconst OpenAIChatMessage = Schema.Union([\n Schema.Struct({\n role: Schema.Literal(\"system\"),\n content: Schema.Union([Schema.String, Schema.Array(OpenAIChatUserContent)]),\n }),\n Schema.Struct({\n role: Schema.Literal(\"user\"),\n content: Schema.Union([Schema.String, Schema.Array(OpenAIChatUserContent)]),\n }),\n Schema.StructWithRest(\n Schema.Struct({\n role: Schema.Literal(\"assistant\"),\n content: Schema.NullOr(Schema.String),\n tool_calls: optionalArray(OpenAIChatAssistantToolCall),\n reasoning_content: Schema.optional(Schema.String),\n reasoning: Schema.optional(Schema.String),\n reasoning_text: Schema.optional(Schema.String),\n reasoning_details: Schema.optional(Schema.Unknown),\n cache_control: Schema.optional(OpenAIChatCacheControl),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n ),\n Schema.Struct({\n role: Schema.Literal(\"tool\"),\n tool_call_id: Schema.String,\n content: Schema.String,\n cache_control: Schema.optional(OpenAIChatCacheControl),\n }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype OpenAIChatMessage = Schema.Schema.Type<typeof OpenAIChatMessage>\n\nconst OpenAIChatToolChoice = Schema.Union([\n Schema.Literals([\"auto\", \"none\", \"required\"]),\n Schema.Struct({\n type: Schema.tag(\"function\"),\n function: Schema.Struct({ name: Schema.String }),\n }),\n])\n\nexport const bodyFields = {\n model: Schema.String,\n messages: Schema.Array(OpenAIChatMessage),\n tools: optionalArray(OpenAIChatTool),\n tool_choice: Schema.optional(OpenAIChatToolChoice),\n stream: Schema.Literal(true),\n stream_options: Schema.optional(Schema.Struct({ include_usage: Schema.Boolean })),\n store: Schema.optional(Schema.Boolean),\n prompt_cache_key: Schema.optional(Schema.String),\n reasoning_effort: Schema.optional(OpenAIOptions.OpenAIReasoningEffort),\n max_completion_tokens: Schema.optional(Schema.Number),\n max_tokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n frequency_penalty: Schema.optional(Schema.Number),\n presence_penalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stop: optionalArray(Schema.String),\n}\nconst OpenAIChatBody = Schema.Struct(bodyFields)\nexport type OpenAIChatBody = Schema.Schema.Type<typeof OpenAIChatBody>\n\n// =============================================================================\n// Streaming Event Schema\n// =============================================================================\n// The event schema is one decoded SSE `data:` payload. `Framing.sse` splits the\n// byte stream into strings, then `Protocol.jsonEvent` decodes each string into\n// this provider-native event shape.\nconst OpenAIChatUsage = Schema.StructWithRest(\n Schema.Struct({\n prompt_tokens: optionalNull(Schema.Number),\n completion_tokens: optionalNull(Schema.Number),\n total_tokens: optionalNull(Schema.Number),\n prompt_tokens_details: optionalNull(\n Schema.StructWithRest(\n Schema.Struct({\n cached_tokens: optionalNull(Schema.Number),\n cache_write_tokens: optionalNull(Schema.Number),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n ),\n ),\n completion_tokens_details: optionalNull(\n Schema.StructWithRest(\n Schema.Struct({\n reasoning_tokens: optionalNull(Schema.Number),\n accepted_prediction_tokens: optionalNull(Schema.Number),\n rejected_prediction_tokens: optionalNull(Schema.Number),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n ),\n ),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst OpenAIChatToolCallDeltaFunction = Schema.Struct({\n name: optionalNull(Schema.String),\n arguments: optionalNull(Schema.String),\n})\n\nconst OpenAIChatToolCallDelta = Schema.Struct({\n index: optionalNull(Schema.Number),\n id: optionalNull(Schema.String),\n function: optionalNull(OpenAIChatToolCallDeltaFunction),\n})\ntype OpenAIChatToolCallDelta = Schema.Schema.Type<typeof OpenAIChatToolCallDelta>\n\nconst OpenAIChatDelta = Schema.StructWithRest(\n Schema.Struct({\n content: optionalNull(Schema.String),\n refusal: optionalNull(Schema.String),\n reasoning_content: optionalNull(Schema.String),\n reasoning: optionalNull(Schema.String),\n reasoning_text: optionalNull(Schema.String),\n reasoning_details: optionalNull(Schema.Unknown),\n tool_calls: optionalNull(Schema.Array(OpenAIChatToolCallDelta)),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst OpenAIChatChoice = Schema.Struct({\n delta: optionalNull(OpenAIChatDelta),\n finish_reason: optionalNull(Schema.String),\n native_finish_reason: optionalNull(Schema.String),\n})\n\nconst OpenAIChatError = Schema.Struct({\n code: optionalNull(Schema.Union([Schema.String, Schema.Number])),\n message: Schema.String,\n})\n\nexport const OpenAIChatEvent = Schema.Struct({\n choices: optionalNull(Schema.Array(OpenAIChatChoice)),\n usage: optionalNull(OpenAIChatUsage),\n error: optionalNull(OpenAIChatError),\n})\nexport type OpenAIChatEvent = Schema.Schema.Type<typeof OpenAIChatEvent>\ntype OpenAIChatRequestMessage = LLMRequest[\"messages\"][number]\n\ninterface PendingToolDelta {\n readonly id?: string\n readonly name?: string\n readonly input: string\n}\n\nexport interface ParserState {\n readonly tools: ToolStream.State<number>\n readonly pendingTools: Partial<Record<number, PendingToolDelta>>\n readonly toolCallEvents: ReadonlyArray<LLMEvent>\n readonly usage?: Usage\n readonly finishReason?: FinishReasonDetails\n readonly lifecycle: Lifecycle.State\n readonly reasoningField?: string\n readonly reasoningDetails: Array<unknown>\n readonly reasoningDetailsObserved: boolean\n readonly reasoningEmitted: boolean\n readonly latestToolIndex?: number\n readonly nextToolIndex: number\n}\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Lowering is the only place that knows how common LLM messages map onto the\n// OpenAI Chat wire format. Keep provider quirks here instead of leaking native\n// fields into `LLMRequest`.\ninterface LoweringOptions {\n readonly cacheControl?: (\n cache: CacheHint | undefined,\n ) => Schema.Schema.Type<typeof OpenAIChatCacheControl> | undefined\n}\n\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema, options: LoweringOptions): OpenAIChatTool => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: ToolSchemaProjection.openAI(inputSchema),\n },\n cache_control: options.cacheControl?.(tool.cache),\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"OpenAI Chat\", toolChoice, {\n auto: () => \"auto\" as const,\n none: () => \"none\" as const,\n required: () => \"required\" as const,\n tool: (name) => ({ type: \"function\" as const, function: { name } }),\n })\n\nconst lowerToolCall = (part: ToolCallPart): OpenAIChatAssistantToolCall => ({\n id: part.id,\n type: \"function\",\n function: {\n name: part.name,\n arguments: ProviderShared.encodeJson(part.input),\n },\n})\n\nconst lowerMedia = Effect.fn(\"OpenAIChat.lowerMedia\")(function* (part: MediaPart) {\n const media = ProviderShared.normalizeMedia(part)\n if (!media.mime.startsWith(\"image/\"))\n return yield* ProviderShared.invalidRequest(`OpenAI Chat does not support media type ${part.mediaType}`)\n return { type: \"image_url\" as const, image_url: { url: media.dataUrl } }\n})\n\nconst openAICompatibleReasoningContent = (native: unknown) =>\n isRecord(native) && typeof native.reasoning_content === \"string\" ? native.reasoning_content : undefined\n\nconst reasoningField = (part: ReasoningPart) => {\n const field = part.providerMetadata?.openai?.reasoningField\n return typeof field === \"string\" ? field : undefined\n}\n\nconst reasoningDetails = (parts: ReadonlyArray<ReasoningPart>, native: unknown) => {\n const observed = parts.flatMap((part) => {\n const details = part.providerMetadata?.openai?.reasoningDetails\n return Array.isArray(details) ? details : []\n })\n if (parts.some((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))) return observed\n if (isRecord(native) && Array.isArray(native.reasoning_details)) return native.reasoning_details\n}\n\nconst lowerUserMessage = Effect.fn(\"OpenAIChat.lowerUserMessage\")(function* (\n message: OpenAIChatRequestMessage,\n options: LoweringOptions,\n) {\n const content: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: options.cacheControl?.(part.cache) })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerMedia(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"user\", [\"text\", \"media\"])\n }\n if (content.every((part) => part.type === \"text\" && part.cache_control === undefined))\n return {\n role: \"user\" as const,\n content: content.map((part) => (part.type === \"text\" ? part.text : \"\")).join(\"\"),\n }\n return { role: \"user\" as const, content }\n})\n\nconst lowerAssistantMessage = Effect.fn(\"OpenAIChat.lowerAssistantMessage\")(function* (\n message: OpenAIChatRequestMessage,\n configuredField?: string,\n options: LoweringOptions = {},\n) {\n const content: TextPart[] = []\n const reasoning: ReasoningPart[] = []\n const toolCalls: OpenAIChatAssistantToolCall[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n content.push(part)\n continue\n }\n if (part.type === \"reasoning\") {\n reasoning.push(part)\n continue\n }\n if (part.type === \"tool-call\") {\n toolCalls.push(lowerToolCall(part))\n continue\n }\n }\n const text = reasoning.map((part) => part.text).join(\"\")\n const details = reasoningDetails(reasoning, message.native?.openaiCompatible)\n const observedField = reasoning.map(reasoningField).find((value) => value !== undefined)\n const nativeReasoning = openAICompatibleReasoningContent(message.native?.openaiCompatible)\n const fullyStructured = reasoning.every((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))\n const field = (() => {\n if (configuredField !== undefined) return configuredField\n if (reasoning.length === 0) return undefined\n if (observedField !== undefined) return observedField\n if (nativeReasoning !== undefined) return \"reasoning_content\"\n if (!fullyStructured) return \"reasoning_content\"\n })()\n const reasoningText = (() => {\n if (configuredField !== undefined) return reasoning.length === 0 ? (nativeReasoning ?? \"\") : text\n if (reasoning.length === 0) return nativeReasoning\n return text\n })()\n const cached = message.content.findLast((part) => \"cache\" in part && part.cache !== undefined)\n const cacheControl = options.cacheControl?.(cached && \"cache\" in cached ? cached.cache : undefined)\n const result = {\n role: \"assistant\" as const,\n content: content.length > 0 ? content.map((part) => part.text).join(\"\") : toolCalls.length > 0 ? null : \"\",\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n ...(details !== undefined ? { reasoning_details: details } : {}),\n ...(cacheControl !== undefined ? { cache_control: cacheControl } : {}),\n }\n if (field === undefined || reasoningText === undefined) return result\n return { ...result, [field]: reasoningText }\n})\n\nconst lowerToolMessages = Effect.fn(\"OpenAIChat.lowerToolMessages\")(function* (\n message: OpenAIChatRequestMessage,\n options: LoweringOptions,\n) {\n const messages: OpenAIChatMessage[] = []\n const images: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n messages.push({\n role: \"tool\",\n tool_call_id: part.id,\n content: ProviderShared.toolResultText(part),\n cache_control: options.cacheControl?.(part.cache),\n })\n continue\n }\n const content: ReadonlyArray<Tool.Content> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n messages.push({\n role: \"tool\",\n tool_call_id: part.id,\n content: text.join(\"\\n\"),\n cache_control: options.cacheControl?.(part.cache),\n })\n const files = content.filter((item) => item.type === \"file\")\n images.push(\n ...(yield* Effect.forEach(files, (item) =>\n lowerMedia({ type: \"media\", mediaType: item.mime, data: item.uri, filename: item.name }),\n )),\n )\n }\n return { messages, images }\n})\n\nconst lowerMessage = Effect.fn(\"OpenAIChat.lowerMessage\")(function* (\n message: OpenAIChatRequestMessage,\n reasoningField?: string,\n options: LoweringOptions = {},\n) {\n if (message.role === \"user\") return [yield* lowerUserMessage(message, options)]\n if (message.role === \"assistant\") return [yield* lowerAssistantMessage(message, reasoningField, options)]\n return (yield* lowerToolMessages(message, options)).messages\n})\n\nconst lowerMessages = Effect.fn(\"OpenAIChat.lowerMessages\")(function* (request: LLMRequest, options: LoweringOptions) {\n const system: OpenAIChatMessage[] =\n request.system.length === 0\n ? []\n : request.system.some((part) => part.cache !== undefined) && options.cacheControl !== undefined\n ? [\n {\n role: \"system\",\n content: request.system.map((part) => ({\n type: \"text\",\n text: part.text,\n cache_control: options.cacheControl?.(part.cache),\n })),\n },\n ]\n : [{ role: \"system\", content: ProviderShared.joinText(request.system) }]\n const messages = [...system]\n const pendingImages: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n const flushImages = () => {\n if (pendingImages.length === 0) return\n messages.push({ role: \"user\", content: pendingImages.splice(0) })\n }\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"OpenAI Chat\", message)\n if (pendingImages.length > 0) {\n messages.push({\n role: \"user\",\n content: [\n ...pendingImages.splice(0),\n { type: \"text\", text: part.text, cache_control: options.cacheControl?.(part.cache) },\n ],\n })\n continue\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\" && typeof previous.content === \"string\")\n messages[messages.length - 1] = options.cacheControl?.(part.cache)\n ? {\n role: \"user\",\n content: [\n { type: \"text\", text: previous.content },\n { type: \"text\", text: part.text, cache_control: options.cacheControl(part.cache) },\n ],\n }\n : { role: \"user\", content: `${previous.content}\\n${part.text}` }\n else if (previous?.role === \"user\" && Array.isArray(previous.content))\n messages[messages.length - 1] = {\n role: \"user\",\n content: [\n ...previous.content,\n { type: \"text\", text: part.text, cache_control: options.cacheControl?.(part.cache) },\n ],\n }\n else\n messages.push(\n options.cacheControl?.(part.cache)\n ? {\n role: \"user\",\n content: [{ type: \"text\", text: part.text, cache_control: options.cacheControl(part.cache) }],\n }\n : { role: \"user\", content: part.text },\n )\n continue\n }\n if (message.role === \"tool\") {\n const lowered = yield* lowerToolMessages(message, options)\n messages.push(...lowered.messages)\n pendingImages.push(...lowered.images)\n continue\n }\n flushImages()\n messages.push(...(yield* lowerMessage(message, request.model.compatibility?.reasoningField, options)))\n }\n flushImages()\n return messages\n})\n\nconst lowerOptions = (request: LLMRequest) => {\n const options = OpenAIOptions.resolve(request)\n return {\n ...(options.store !== undefined ? { store: options.store } : {}),\n ...(request.promptCacheKey ? { prompt_cache_key: request.promptCacheKey } : {}),\n ...(options.reasoningEffort ? { reasoning_effort: options.reasoningEffort } : {}),\n }\n}\n\nexport const fromRequest = Effect.fn(\"OpenAIChat.fromRequest\")(function* (\n request: LLMRequest,\n options: LoweringOptions = {},\n) {\n // `fromRequest` returns the provider body only. Endpoint, auth, framing,\n // validation, and HTTP execution are composed by `Route.make`.\n const reasoningField = request.model.compatibility?.reasoningField\n if (reasoningField && RESERVED_REASONING_FIELDS.has(reasoningField))\n return yield* ProviderShared.invalidRequest(\n `OpenAI Chat reasoning field conflicts with reserved field ${reasoningField}`,\n )\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const maxTokensField = request.model.compatibility?.maxTokensField ?? \"max_tokens\"\n return {\n model: request.model.id,\n messages: yield* lowerMessages(request, options),\n tools:\n request.tools.length === 0\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(\n tool,\n ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility),\n options,\n ),\n ),\n tool_choice: request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined,\n stream: true as const,\n stream_options: { include_usage: true },\n ...(maxTokensField === \"max_completion_tokens\"\n ? { max_completion_tokens: generation?.maxTokens }\n : { max_tokens: generation?.maxTokens }),\n temperature: generation?.temperature,\n top_p: generation?.topP,\n frequency_penalty: generation?.frequencyPenalty,\n presence_penalty: generation?.presencePenalty,\n seed: generation?.seed,\n stop: generation?.stop,\n ...lowerOptions(request),\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Streaming parsers are small state machines: every event returns a new state\n// plus the common `LLMEvent`s produced by that event. Tool calls are accumulated\n// because OpenAI streams JSON arguments across multiple deltas.\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"stop\") return \"stop\"\n if (reason === \"length\") return \"length\"\n if (reason === \"content_filter\") return \"content-filter\"\n if (reason === \"function_call\" || reason === \"tool_calls\") return \"tool-calls\"\n if (reason === \"error\") return \"error\"\n return \"unknown\"\n}\n\n// OpenAI Chat reports `prompt_tokens` (inclusive total) with a\n// cached-read and cache-write subsets, and `completion_tokens` (inclusive\n// total) with a `reasoning_tokens` subset. We pass the inclusive totals\n// through and derive the non-cached breakdown so the `AI.Usage` contract is\n// satisfied on both sides.\nconst mapUsage = (usage: OpenAIChatEvent[\"usage\"]): Usage | undefined => {\n if (!usage) return undefined\n const input = usage.prompt_tokens ?? undefined\n const output = usage.completion_tokens ?? undefined\n const cached = usage.prompt_tokens_details?.cached_tokens ?? undefined\n const cacheWrite = usage.prompt_tokens_details?.cache_write_tokens ?? undefined\n const reasoning = usage.completion_tokens_details?.reasoning_tokens ?? undefined\n const nonCached = ProviderShared.subtractTokens(input, ProviderShared.sumTokens(cached, cacheWrite))\n return new Usage({\n inputTokens: input,\n outputTokens: output,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n cacheWriteInputTokens: cacheWrite,\n reasoningTokens: reasoning,\n totalTokens: ProviderShared.totalTokens(input, output, usage.total_tokens ?? undefined),\n providerMetadata: { openai: usage },\n })\n}\n\nconst toolIndexByID = (\n tools: ParserState[\"tools\"],\n pendingTools: ParserState[\"pendingTools\"],\n id: string | undefined,\n) => {\n if (!id) return undefined\n const entry = Object.entries({ ...pendingTools, ...tools }).find(([, tool]) => tool?.id === id)\n return entry ? Number(entry[0]) : undefined\n}\n\nconst reasoningDelta = (\n delta: Schema.Schema.Type<typeof OpenAIChatDelta> | null | undefined,\n configuredField?: string,\n) => {\n if (!delta) return undefined\n const fields = new Set([configuredField, \"reasoning_content\", \"reasoning\", \"reasoning_text\"])\n for (const field of fields) {\n if (field === undefined) continue\n const text = delta[field]\n if (typeof text === \"string\" && text.length > 0) return { field, text }\n }\n return undefined\n}\n\nconst detailText = (details: ReadonlyArray<unknown>) => {\n const text = details.flatMap((detail) => {\n if (!isRecord(detail)) return []\n if (detail.type === \"reasoning.text\" && typeof detail.text === \"string\" && detail.text) return [detail.text]\n if (detail.type === \"reasoning.summary\" && typeof detail.summary === \"string\" && detail.summary)\n return [detail.summary]\n return []\n })\n if (text.length > 0) return text.join(\"\")\n}\n\nconst appendReasoningDetails = (result: Array<unknown>, details: ReadonlyArray<unknown>) => {\n for (const detail of details) {\n const previous = result.at(-1)\n if (\n !isRecord(previous) ||\n previous.type !== \"reasoning.text\" ||\n !isRecord(detail) ||\n detail.type !== \"reasoning.text\" ||\n conflictingReasoningTextDetails(previous, detail)\n ) {\n result.push(detail)\n continue\n }\n result[result.length - 1] = {\n ...previous,\n ...Object.fromEntries(Object.entries(detail).filter((entry) => entry[1] !== undefined)),\n text: `${typeof previous.text === \"string\" ? previous.text : \"\"}${typeof detail.text === \"string\" ? detail.text : \"\"}`,\n signature: mergeDetailValue(previous.signature, detail.signature),\n format: mergeDetailValue(previous.format, detail.format),\n }\n }\n}\n\nconst mergeDetailValue = (previous: unknown, current: unknown) =>\n previous || current || (previous !== undefined ? previous : current)\n\nconst conflictingReasoningTextDetails = (previous: Record<string, unknown>, current: Record<string, unknown>) =>\n conflictingDetailValue(previous.id, current.id) ||\n conflictingDetailValue(previous.index, current.index) ||\n conflictingDetailValue(previous.format, current.format) ||\n (Boolean(previous.signature) && Boolean(current.signature) && previous.signature !== current.signature)\n\nconst conflictingDetailValue = (previous: unknown, current: unknown) =>\n previous !== undefined && previous !== null && current !== undefined && current !== null && previous !== current\n\nconst reasoningMetadata = (field: ParserState[\"reasoningField\"], details?: ReadonlyArray<unknown>) => ({\n openai: {\n ...(field ? { reasoningField: field } : {}),\n ...(details ? { reasoningDetails: details } : {}),\n },\n})\n\nconst step = (state: ParserState, event: OpenAIChatEvent) =>\n Effect.gen(function* () {\n if (event.error)\n return yield* new AIError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({\n message: event.error.message,\n code: event.error.code === undefined || event.error.code === null ? undefined : String(event.error.code),\n status: typeof event.error.code === \"number\" ? event.error.code : undefined,\n }),\n })\n const events: LLMEvent[] = []\n const usage = mapUsage(event.usage) ?? state.usage\n const choice = event.choices?.[0]\n const rawFinishReason = choice?.finish_reason\n const finishReason =\n rawFinishReason !== undefined && rawFinishReason !== null\n ? { normalized: mapFinishReason(rawFinishReason), raw: choice?.native_finish_reason ?? rawFinishReason }\n : state.finishReason\n const delta = choice?.delta\n const toolDeltas = delta?.tool_calls ?? []\n let tools = state.tools\n let pendingTools = state.pendingTools\n let latestToolIndex = state.latestToolIndex\n let nextToolIndex = state.nextToolIndex\n\n let lifecycle = state.lifecycle\n\n const reasoning = reasoningDelta(delta, state.reasoningField)\n const hasLateContent =\n Boolean(delta?.content) ||\n Boolean(delta?.refusal) ||\n reasoning !== undefined ||\n (Array.isArray(delta?.reasoning_details) && delta.reasoning_details.length > 0) ||\n toolDeltas.some((tool) => Boolean(tool.id) || Boolean(tool.function?.name) || Boolean(tool.function?.arguments))\n if (state.finishReason !== undefined) {\n if (hasLateContent)\n return yield* ProviderShared.eventError(ADAPTER, \"OpenAI Chat received content after the finish reason\")\n return [{ ...state, usage }, events] as const\n }\n\n const reasoningField = state.reasoningField ?? reasoning?.field\n const detailDelta = Array.isArray(delta?.reasoning_details) ? delta.reasoning_details : undefined\n if (detailDelta !== undefined) appendReasoningDetails(state.reasoningDetails, detailDelta)\n const reasoningDetailsObserved = state.reasoningDetailsObserved || detailDelta !== undefined\n const deltaMetadata = reasoningMetadata(reasoningField)\n const text = detailDelta?.length ? (detailText(detailDelta) ?? reasoning?.text) : reasoning?.text\n if (text !== undefined) lifecycle = Lifecycle.reasoningDelta(lifecycle, events, \"reasoning-0\", text, deltaMetadata)\n else if (\n reasoningDetailsObserved &&\n !lifecycle.reasoning.has(\"reasoning-0\") &&\n (Boolean(delta?.content) || Boolean(delta?.refusal) || toolDeltas.length > 0)\n )\n lifecycle = Lifecycle.reasoningStart(lifecycle, events, \"reasoning-0\", deltaMetadata)\n const reasoningEmitted = state.reasoningEmitted || lifecycle.reasoning.has(\"reasoning-0\")\n\n if (delta?.content) {\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningMetadata(reasoningField, reasoningDetailsObserved ? state.reasoningDetails : undefined),\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.content)\n }\n\n if (delta?.refusal) {\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningMetadata(reasoningField, reasoningDetailsObserved ? state.reasoningDetails : undefined),\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.refusal)\n }\n\n // Compatible providers may omit indexes. Prefer durable identity, then use\n // batch position for parallel deltas or the latest call for sparse chunks.\n for (const [position, tool] of toolDeltas.entries()) {\n const matched = toolIndexByID(tools, pendingTools, tool.id || undefined)\n const fallback = toolDeltas.length > 1 ? position : (latestToolIndex ?? position)\n const fallbackTool = tools[fallback] ?? pendingTools[fallback]\n const index =\n tool.index ?? matched ?? (tool.id && fallbackTool?.id && fallbackTool.id !== tool.id ? nextToolIndex : fallback)\n const current = tools[index]\n const pending = pendingTools[index]\n const id = current?.id ?? pending?.id ?? (tool.id || undefined)\n const name = current?.name ?? pending?.name ?? (tool.function?.name || undefined)\n const text = `${pending?.input ?? \"\"}${tool.function?.arguments ?? \"\"}`\n latestToolIndex = index\n nextToolIndex = Math.max(nextToolIndex, index + 1)\n if (!current && (!id || !name)) {\n pendingTools = {\n ...pendingTools,\n [index]: { id: id || undefined, name: name || undefined, input: text },\n }\n continue\n }\n if (pending) {\n pendingTools = { ...pendingTools }\n delete pendingTools[index]\n }\n const result = ToolStream.appendOrStart(\n ADAPTER,\n tools,\n index,\n { id: id || undefined, name: name || undefined, text },\n \"OpenAI Chat tool call delta is missing id or name\",\n )\n if (ToolStream.isError(result)) return yield* result\n tools = result.tools\n if (result.events.length) lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(...result.events)\n }\n\n if (finishReason !== undefined && state.finishReason === undefined && Object.keys(pendingTools).length > 0)\n return yield* ProviderShared.eventError(ADAPTER, \"OpenAI Chat tool call delta is missing id or name\")\n\n // Finalize accumulated tool inputs eagerly when finish_reason arrives so\n // valid calls and malformed local calls settle independently.\n const finished =\n finishReason !== undefined && state.finishReason === undefined && Object.keys(tools).length > 0\n ? yield* ToolStream.finishAll(ADAPTER, tools)\n : undefined\n\n return [\n {\n tools: finished?.tools ?? tools,\n pendingTools,\n toolCallEvents: finished?.events ?? state.toolCallEvents,\n usage,\n finishReason,\n lifecycle,\n reasoningField,\n reasoningDetails: state.reasoningDetails,\n reasoningDetailsObserved,\n reasoningEmitted,\n latestToolIndex,\n nextToolIndex,\n },\n events,\n ] as const\n })\n\nconst finishEvents = (state: ParserState): ReadonlyArray<LLMEvent> => {\n const events: LLMEvent[] = []\n const toolCallEvents =\n state.finishReason === undefined && Object.keys(state.tools).length > 0\n ? Effect.runSync(ToolStream.finishAll(ADAPTER, state.tools)).events\n : state.toolCallEvents\n const hasToolCalls = toolCallEvents.length > 0\n const reason = state.finishReason\n ? {\n ...state.finishReason,\n normalized:\n state.finishReason.normalized === \"stop\" && hasToolCalls ? \"tool-calls\" : state.finishReason.normalized,\n }\n : { normalized: hasToolCalls ? (\"tool-calls\" as const) : (\"unknown\" as const) }\n const metadata = reasoningMetadata(\n state.reasoningField,\n state.reasoningDetailsObserved ? state.reasoningDetails : undefined,\n )\n const started =\n state.reasoningDetailsObserved && !state.reasoningEmitted\n ? Lifecycle.reasoningStart(state.lifecycle, events, \"reasoning-0\", reasoningMetadata(state.reasoningField))\n : state.lifecycle\n const ended = Lifecycle.reasoningEnd(started, events, \"reasoning-0\", metadata)\n const lifecycle = toolCallEvents.length ? Lifecycle.stepStart(ended, events) : ended\n events.push(...toolCallEvents)\n Lifecycle.finish(lifecycle, events, { reason, usage: state.usage })\n return events\n}\n\n// =============================================================================\n// Protocol And OpenAI Route\n// =============================================================================\n/**\n * The OpenAI Chat protocol — request body construction, body schema, and the\n * streaming-event state machine. Reused by every route that speaks OpenAI Chat\n * over HTTP+SSE: native OpenAI, DeepSeek, TogetherAI, Cerebras, Baseten,\n * Fireworks, DeepInfra, and (once added) Azure OpenAI Chat.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: OpenAIChatBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(OpenAIChatEvent),\n initial: (request) => ({\n tools: ToolStream.empty<number>(),\n pendingTools: {},\n toolCallEvents: [],\n lifecycle: Lifecycle.initial(),\n reasoningField: request.model.compatibility?.reasoningField,\n reasoningDetails: [],\n reasoningDetailsObserved: false,\n reasoningEmitted: false,\n nextToolIndex: 0,\n }),\n step,\n onHalt: finishEvents,\n },\n})\n\nexport const httpTransport = HttpTransport.sseJson.with<OpenAIChatBody>()\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"openai\",\n providerMetadataKey: \"openai\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n transport: httpTransport,\n})\n\nexport * as OpenAIChat from \"./openai-chat.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C4A28CFF9DEFDD7664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\nimport { errorMessage } from \"../../../util/error\"\n\nconst integrationID = \"opencode\"\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.console.commands.login,\n Effect.fn(\"cli.console.login\")(function* (input) {\n const timeline = yield* Effect.acquireRelease(\n Effect.promise(() => createTimelineHost()),\n (value) => request(() => value.close()).pipe(Effect.ignore),\n )\n const exit = yield* login(timeline, Option.getOrUndefined(input.url)).pipe(\n Effect.raceFirst(AppProcess.waitForAbort(timeline.signal)),\n Effect.exit,\n )\n if (Exit.isSuccess(exit)) return\n\n const cancelled = timeline.signal.aborted\n yield* request(() =>\n timeline.failure(cancelled ? \"Authorization cancelled\" : errorMessage(Cause.squash(exit.cause))),\n ).pipe(Effect.ignore)\n process.exitCode = cancelled ? 130 : 1\n }),\n)\n\nconst login = Effect.fn(\"cli.console.login.run\")(function* (timeline: TimelineHost, server?: string) {\n yield* request(() => timeline.intro(\"Log in\"))\n yield* request(() => timeline.pending(\"Connecting to OpenCode...\"))\n\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n const found = yield* request((signal) => client.integration.get({ integrationID, location }, { signal }))\n const integration = yield* required(found.data, \"OpenCode Console integration is unavailable\")\n const method = yield* required(\n integration.methods.find((candidate) => candidate.type === \"oauth\"),\n \"OpenCode Console login is unavailable\",\n )\n\n yield* request(() => timeline.pending(\"Starting authorization...\"))\n const started = yield* request((signal) =>\n client.integration.oauth.connect(\n {\n integrationID,\n methodID: method.id,\n ...(server ? { answer: { server } } : {}),\n location,\n },\n { signal },\n ),\n )\n const attempt = started.data\n yield* Effect.addFinalizer(() =>\n request(() =>\n client.integration.oauth.cancel(\n { integrationID, attemptID: attempt.attemptID, location },\n { signal: AbortSignal.timeout(5_000) },\n ),\n ).pipe(Effect.ignore),\n )\n if (attempt.mode !== \"auto\") yield* Effect.fail(new Error(\"OpenCode Console requires a device login\"))\n\n yield* request(() => timeline.item(`Go to: ${attempt.url}`))\n yield* request(() => timeline.item(attempt.instructions))\n yield* request(async () => {\n const { default: open } = await import(\"open\")\n await open(attempt.url)\n }).pipe(Effect.ignore)\n yield* request(() => timeline.pending(\"Waiting for authorization...\"))\n\n const status = yield* waitForConsoleLogin(client, integrationID, attempt.attemptID)\n if (status.status === \"failed\") yield* Effect.fail(new Error(status.message))\n if (status.status === \"expired\") yield* Effect.fail(new Error(\"Device code expired\"))\n\n yield* request(() => timeline.success(\"Connected to OpenCode Console\"))\n yield* request(() => timeline.outro(\"Done\"))\n})\n\nconst waitForConsoleLogin = Effect.fn(\"cli.console.login.wait\")(function* (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n) {\n while (true) {\n const response = yield* request((signal) =>\n client.integration.oauth.status({ integrationID, attemptID, location }, { signal }),\n )\n if (response.data.status !== \"pending\") return response.data\n yield* Effect.sleep(500)\n }\n})\n\nfunction request<A>(task: (signal: AbortSignal) => Promise<A>) {\n return Effect.tryPromise({\n try: task,\n catch: (cause) => cause,\n })\n}\n\nfunction required<A>(value: A | null | undefined, message: string) {\n return value === null || value === undefined ? Effect.fail(new Error(message)) : Effect.succeed(value)\n}\n" | ||
| ], | ||
| "mappings": ";wrCAYA,EAAwB,EACxB,IAAM,GAAiB,CAAC,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,SAAK,QAAG,EAClE,GAAe,KACf,EAAS,CACb,OAAQ,EAAK,UAAU,CAAC,EACxB,MAAO,EAAK,UAAU,CAAC,EACvB,WAAY,EAAK,kBAAkB,EACnC,MAAO,EAAK,UAAU,CAAC,EACvB,QAAS,EAAK,UAAU,CAAC,CAC3B,EACM,EAAO,CACX,MAAO,CACL,OAAQ,SACR,MAAO,EAAO,MACd,UAAW,EACb,EACA,KAAM,CACJ,OAAQ,SACR,MAAO,EAAO,OACd,UAAW,EACb,EACA,QAAS,CACP,OAAQ,SACR,MAAO,EAAO,QACd,UAAW,EACb,EACA,QAAS,CACP,OAAQ,SACR,MAAO,EAAO,MACd,UAAW,EACb,EACA,MAAO,CACL,OAAQ,SACR,MAAO,EAAO,MACd,UAAW,EACb,CACF,EACA,SAAS,EAAG,CAAC,EAAM,EAAO,CACxB,IAAM,EAAQ,EAAK,GACnB,OAAO,EAAuB,KAAO,IAAM,CACzC,IAAI,EAAO,EAAgB,KAAK,EAC9B,EAAQ,EAAgB,KAAK,EAC7B,EAAQ,EAAgB,MAAM,EAC9B,EAAQ,EAAgB,MAAM,EAoChC,OAnCA,EAAa,EAAM,CAAK,EACxB,EAAU,EAAM,QAAS,MAAM,EAC/B,EAAU,EAAM,YAAa,CAAC,EAC9B,EAAU,EAAM,gBAAiB,QAAQ,EACzC,EAAa,EAAO,CAAK,EACzB,EAAa,EAAO,CAAK,EACzB,EAAU,EAAO,QAAS,MAAM,EAChC,EAAU,EAAO,YAAa,CAAC,EAC/B,EAAU,EAAO,gBAAiB,KAAK,EACvC,EAAU,EAAO,MAAO,CAAC,EACzB,EAAU,EAAO,aAAc,CAAC,EAChC,EAAS,EAAO,IAAM,EAAM,MAAM,EAClC,EAAU,EAAO,WAAY,MAAM,EACnC,EAAS,EAAO,CAAK,EACrB,EAAS,EAAM,EAAkB,EAAM,IACjC,KAAI,EAAG,CACT,OAAO,EAAM,cAEX,SAAQ,EAAG,CACb,IAAI,EAAQ,EAAgB,MAAM,EAGlC,OAFA,EAAa,EAAO,EAAiB,QAAG,CAAC,EACzC,EAAS,KAAO,EAAU,EAAO,KAAM,EAAO,MAAO,CAAG,CAAC,EAClD,EAEX,CAAC,EAAG,IAAI,EACR,EAAS,KAAO,CACd,IAAI,EAAM,EAAM,MACd,EAAO,EAAO,WAGhB,OAFA,IAAQ,EAAI,IAAM,EAAI,EAAI,EAAU,EAAO,KAAM,EAAK,EAAI,CAAC,GAC3D,IAAS,EAAI,IAAM,EAAI,EAAI,EAAU,EAAO,KAAM,EAAM,EAAI,CAAC,GACtD,GACN,CACD,EAAG,OACH,EAAG,MACL,CAAC,EACM,IACN,EAAG,CACJ,eAAgB,GAChB,gBAAiB,CAAC,EAAM,SAC1B,CAAC,EAEH,SAAS,EAAc,CAAC,EAAO,CAM7B,OALA,EAAY,KAAS,CACnB,GAAI,EAAM,OAAS,UAAY,EAAE,EAAM,MAAQ,EAAM,OAAS,KAAM,OACpE,EAAM,eAAe,EACrB,EAAM,OAAO,EACd,GACO,IAAM,CACZ,IAAI,EAAQ,EAAgB,KAAK,EAwBjC,OAvBA,EAAU,EAAO,QAAS,MAAM,EAChC,EAAU,EAAO,SAAU,CAAC,EAC5B,EAAU,EAAO,gBAAiB,KAAK,EACvC,EAAU,EAAO,MAAO,CAAC,EACzB,EAAS,EAAO,EAAkB,EAAM,IAClC,KAAI,EAAG,CACT,OAAO,EAAM,QAAQ,GAEvB,SAAU,KAAQ,EAAE,IAAM,CACxB,IAAI,EAAQ,EAAgB,SAAS,EAIrC,OAHA,EAAU,EAAO,SAAU,EAAc,EACzC,EAAU,EAAO,WAAY,EAAE,EAC/B,EAAS,KAAO,EAAU,EAAO,QAAS,EAAO,OAAQ,CAAG,CAAC,EACtD,IACN,GAAI,IAAM,CACX,IAAI,EAAQ,EAAgB,MAAM,EAKlC,OAJA,EAAU,EAAO,WAAY,MAAM,EACnC,EAAU,EAAO,WAAY,EAAI,EACjC,EAAS,EAAO,CAAI,EACpB,EAAS,KAAO,EAAU,EAAO,KAAM,EAAO,WAAY,CAAG,CAAC,EACvD,IACN,CAAC,CACN,CAAC,CAAC,EACK,IACN,EAEL,SAAS,CAAO,CAAC,EAAM,CACrB,OAAO,IAAI,QAAQ,KAAW,CAC5B,IAAM,EAAQ,WAAW,EAAS,EAAY,EAC9C,EAAM,MAAM,EACZ,IAAM,EAAS,IAAM,CACnB,aAAa,CAAK,EAClB,EAAQ,GAEL,EAAK,KAAK,EAAQ,CAAM,EAC9B,EAEH,eAAe,CAAQ,CAAC,EAAU,CAChC,MAAM,EAAQ,EAAS,KAAK,CAAC,EAC7B,GAAI,CACF,EAAS,mBAAqB,qBAC9B,CACA,GAAI,CACF,EAAS,WAAa,qBACtB,CACA,GAAI,CAAC,EAAS,YAAa,EAAS,QAAQ,IAIlD,eAAsB,CAAkB,EAAG,CACzC,IAAM,EAAS,QAAQ,OACjB,EAAa,IAAI,gBACjB,EAAU,CAAC,SAAU,SAAU,SAAS,EACxC,EAAS,IAAM,CACnB,GAAI,CAAC,EAAW,OAAO,QAAS,EAAW,MAAM,GAGnD,GADA,EAAQ,QAAQ,KAAU,QAAQ,GAAG,EAAQ,CAAM,CAAC,EAChD,CAAC,EAAO,OAAS,CAAC,QAAQ,MAAM,MAAO,CACzC,IAAI,EAAS,GACT,EAAU,GACV,EACA,EACE,EAAQ,MAAO,EAAM,IAAS,CAClC,GAAI,EAAQ,MAAU,MAAM,iBAAiB,EAC7C,GAAI,EAAS,MAAU,MAAM,oCAAoC,EACjE,EAAU,GACV,GAAI,CACF,IAAM,EAAQ,IAAS,UAAY,OAAY,EAAK,GAC9C,EAAS,IAAS,UAAY,IAAM,EAAK,GAAM,OAC/C,EAAY,GAAO,UAAY;AAAA,EAAQ,GAC7C,EAAS,IAAI,QAAQ,CAAC,EAAS,KAAW,CACxC,EAAO,MAAM,GAAG,KAAU;AAAA,EAAS,IAAa,KAAS,EAAQ,GAAO,CAAK,EAAI,EAAQ,CAAC,EAC3F,EACD,MAAM,SACN,CACA,EAAU,GACV,EAAS,SAGP,EAAQ,IAAM,CAClB,GAAI,EAAW,OAAO,EAMtB,OALA,EAAS,GACT,GAAa,SAAY,CACvB,MAAM,GAAQ,MAAM,IAAM,EAAE,EAC5B,EAAQ,QAAQ,KAAU,QAAQ,IAAI,EAAQ,CAAM,CAAC,IACpD,EACI,GAET,MAAO,CACL,OAAQ,EAAW,OACnB,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,KAAM,KAAQ,EAAM,OAAQ,CAAI,EAChC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,OACF,EAEF,IAAI,EACJ,GAAI,CAGF,QAAQ,OAAO,MAAM;AAAA,CAAI,EACzB,EAAW,MAAM,EAAkB,CACjC,MAAO,QAAQ,MACf,SAAU,GACV,UAAW,GACX,mBAAoB,GACpB,YAAa,GACb,YAAa,CAAC,EACd,WAAY,eACZ,aAAc,EACd,mBAAoB,iBACpB,YAAa,WACb,gBAAiB,EACnB,CAAC,EACD,IAAM,EAAiB,GAChB,EAAS,GAAc,EAAa,EACrC,EAAa,EAAO,IAAM,EAAkB,GAAgB,CAChE,QAAS,EACT,OAAQ,CACV,CAAC,EAAG,CAAc,EACb,EAAW,MAAM,CAAM,EAC5B,MAAM,EAAQ,EAAe,KAAK,CAAC,EACnC,IAAI,EAAS,GACT,EAAU,GACV,EACA,EACE,EAAQ,CAAC,EAAM,IAAS,CAC5B,GAAI,EAAQ,OAAO,QAAQ,OAAW,MAAM,iBAAiB,CAAC,EAC9D,GAAI,EAAS,OAAO,QAAQ,OAAW,MAAM,oCAAoC,CAAC,EAgBlF,OAfA,EAAU,GACV,GAAU,SAAY,CACpB,GAAI,IAAS,UACX,EAAW,CAAI,EACf,EAAe,cAAc,EACxB,KACL,GAAI,IAAS,WAAa,IAAS,WAAa,IAAS,QAAS,EAAW,MAAS,EACtF,EAAe,kBAAkB,GAAI,EAAM,CAAI,CAAC,EAChD,EAAe,cAAc,EAE/B,MAAM,EAAQ,EAAe,KAAK,CAAC,IAClC,EAAE,QAAQ,IAAM,CACjB,EAAU,GACV,EAAS,OACV,EACM,GAEH,EAAQ,IAAM,CAClB,GAAI,EAAW,OAAO,EAWtB,OAVA,EAAS,GACT,GAAa,SAAY,CACvB,MAAM,GAAQ,MAAM,IAAM,EAAE,EAC5B,GAAI,CACF,MAAM,EAAS,CAAc,EAC7B,MAAM,EAAQ,CAAU,SACxB,CACA,EAAQ,QAAQ,KAAU,QAAQ,IAAI,EAAQ,CAAM,CAAC,KAEtD,EACI,GAET,MAAO,CACL,OAAQ,EAAW,OACnB,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,KAAM,KAAQ,EAAM,OAAQ,CAAI,EAChC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,QAAS,KAAQ,EAAM,UAAW,CAAI,EACtC,MAAO,KAAQ,EAAM,QAAS,CAAI,EAClC,OACF,EACA,MAAO,EAAO,CACd,GAAI,CACF,GAAI,EAAU,MAAM,EAAS,CAAQ,SACrC,CACA,EAAQ,QAAQ,KAAU,QAAQ,IAAI,EAAQ,CAAM,CAAC,EAEvD,MAAM,GClRV,IAAM,EAAgB,WAChB,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,KAAQ,QACrB,EAAS,SAAS,QAAQ,SAAS,MACnC,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAO,CAC/C,IAAM,EAAW,MAAO,EAAO,eAC7B,EAAO,QAAQ,IAAM,EAAmB,CAAC,EACzC,CAAC,IAAU,EAAQ,IAAM,EAAM,MAAM,CAAC,EAAE,KAAK,EAAO,MAAM,CAC5D,EACM,EAAO,MAAO,GAAM,EAAU,EAAO,eAAe,EAAM,GAAG,CAAC,EAAE,KACpE,EAAO,UAAU,EAAW,aAAa,EAAS,MAAM,CAAC,EACzD,EAAO,IACT,EACA,GAAI,EAAK,UAAU,CAAI,EAAG,OAE1B,IAAM,EAAY,EAAS,OAAO,QAClC,MAAO,EAAQ,IACb,EAAS,QAAQ,EAAY,0BAA4B,EAAa,EAAM,OAAO,EAAK,KAAK,CAAC,CAAC,CACjG,EAAE,KAAK,EAAO,MAAM,EACpB,QAAQ,SAAW,EAAY,IAAM,EACtC,CACH,EAEM,GAAQ,EAAO,GAAG,uBAAuB,EAAE,SAAU,CAAC,EAAwB,EAAiB,CACnG,MAAO,EAAQ,IAAM,EAAS,MAAM,QAAQ,CAAC,EAC7C,MAAO,EAAQ,IAAM,EAAS,QAAQ,2BAA2B,CAAC,EAElE,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EACpF,EAAQ,MAAO,EAAQ,CAAC,IAAW,EAAO,YAAY,IAAI,CAAE,gBAAe,UAAS,EAAG,CAAE,QAAO,CAAC,CAAC,EAClG,EAAc,MAAO,EAAS,EAAM,KAAM,6CAA6C,EACvF,EAAS,MAAO,EACpB,EAAY,QAAQ,KAAK,CAAC,IAAc,EAAU,OAAS,OAAO,EAClE,uCACF,EAEA,MAAO,EAAQ,IAAM,EAAS,QAAQ,2BAA2B,CAAC,EAYlE,IAAM,GAXU,MAAO,EAAQ,CAAC,IAC9B,EAAO,YAAY,MAAM,QACvB,CACE,gBACA,SAAU,EAAO,MACb,EAAS,CAAE,OAAQ,CAAE,QAAO,CAAE,EAAI,CAAC,EACvC,UACF,EACA,CAAE,QAAO,CACX,CACF,GACwB,KASxB,GARA,MAAO,EAAO,aAAa,IACzB,EAAQ,IACN,EAAO,YAAY,MAAM,OACvB,CAAE,gBAAe,UAAW,EAAQ,UAAW,UAAS,EACxD,CAAE,OAAQ,YAAY,QAAQ,IAAK,CAAE,CACvC,CACF,EAAE,KAAK,EAAO,MAAM,CACtB,EACI,EAAQ,OAAS,OAAQ,MAAO,EAAO,KAAS,MAAM,0CAA0C,CAAC,EAErG,MAAO,EAAQ,IAAM,EAAS,KAAK,UAAU,EAAQ,KAAK,CAAC,EAC3D,MAAO,EAAQ,IAAM,EAAS,KAAK,EAAQ,YAAY,CAAC,EACxD,MAAO,EAAQ,SAAY,CACzB,IAAQ,QAAS,GAAS,KAAa,0CACvC,MAAM,EAAK,EAAQ,GAAG,EACvB,EAAE,KAAK,EAAO,MAAM,EACrB,MAAO,EAAQ,IAAM,EAAS,QAAQ,8BAA8B,CAAC,EAErE,IAAM,EAAS,MAAO,GAAoB,EAAQ,EAAe,EAAQ,SAAS,EAClF,GAAI,EAAO,SAAW,SAAU,MAAO,EAAO,KAAS,MAAM,EAAO,OAAO,CAAC,EAC5E,GAAI,EAAO,SAAW,UAAW,MAAO,EAAO,KAAS,MAAM,qBAAqB,CAAC,EAEpF,MAAO,EAAQ,IAAM,EAAS,QAAQ,+BAA+B,CAAC,EACtE,MAAO,EAAQ,IAAM,EAAS,MAAM,MAAM,CAAC,EAC5C,EAEK,GAAsB,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACxE,EACA,EACA,EACA,CACA,MAAO,GAAM,CACX,IAAM,EAAW,MAAO,EAAQ,CAAC,IAC/B,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,EAAG,CAAE,QAAO,CAAC,CACpF,EACA,GAAI,EAAS,KAAK,SAAW,UAAW,OAAO,EAAS,KACxD,MAAO,EAAO,MAAM,GAAG,GAE1B,EAED,SAAS,CAAU,CAAC,EAA2C,CAC7D,OAAO,EAAO,WAAW,CACvB,IAAK,EACL,MAAO,CAAC,IAAU,CACpB,CAAC,EAGH,SAAS,CAAW,CAAC,EAA6B,EAAiB,CACjE,OAAO,IAAU,MAAQ,IAAU,OAAY,EAAO,KAAS,MAAM,CAAO,CAAC,EAAI,EAAO,QAAQ,CAAK", | ||
| "debugId": "543E391B291461DC64756E2164756E21", | ||
| "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": "71F0C45AEE33513C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "235810AC52924FC664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/run/run.ts", "src/run/noninteractive.ts", "src/run/ui.ts"], | ||
| "sourcesContent": [ | ||
| "import { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient, type SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { open } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { readStdin } from \"../util/io\"\nimport { ServerConnection } from \"../services/server-connection\"\nimport { parseSessionTargetModel, resolveSessionTarget } from \"../session-target\"\nimport { toolInlineInfo } from \"@opencode-ai/tui/mini/tool\"\nimport { runNonInteractivePrompt } from \"./noninteractive\"\nimport { UI } from \"./ui\"\nimport { Env } from \"../env\"\nimport { errorMessage } from \"../util/error\"\n\nexport type RunCommandInput = {\n server: ServerConnection.Resolved\n message: string[]\n continue?: boolean\n session?: string\n fork?: boolean\n model?: string\n agent?: string\n format: \"default\" | \"json\"\n file: string[]\n title?: string\n thinking?: boolean\n auto?: boolean\n}\n\ntype FilePart = {\n url: string\n filename: string\n mime: string\n}\n\ntype Prepared = {\n directory?: string\n message: string\n files: FilePart[]\n}\n\ntype ExecutionOptions = {\n root?: string\n directory?: string\n useServerDirectory?: boolean\n variant?: string\n attached?: boolean\n compatibility?: \"v1\"\n}\n\nclass RunTargetError extends Error {\n constructor(\n message: string,\n readonly sessionID?: string,\n ) {\n super(message)\n }\n}\n\nconst ATTACH_FILE_MAX_BYTES = 10 * 1024 * 1024\n\nexport function runNonInteractive(input: RunCommandInput) {\n return runNonInteractiveWithOptions(input, {})\n}\n\n/** @internal Used only by the V1 command boundary. */\nexport function runNonInteractiveWithOptions(input: RunCommandInput, options: ExecutionOptions) {\n return run(input, options).catch((error) => reportRunError(input, errorMessage(error)))\n}\n\nasync function run(input: RunCommandInput, options: ExecutionOptions) {\n if (input.fork && !input.continue && !input.session) fail(\"--fork requires --continue or --session\")\n const root = options.root ?? process.env.PWD ?? process.cwd()\n const local = localDirectory(root)\n const directory = options.useServerDirectory ? undefined : (options.directory ?? local)\n const message = mergeInput(formatMessage(input.message), process.stdin.isTTY ? undefined : await readStdin())\n if (!message?.trim()) fail(\"You must provide a message\")\n const files = await Promise.all(input.file.map((file) => prepareFile(file, root, options)))\n const prepared = { directory, message, files }\n return execute(input, prepared, input.server.endpoint, options)\n}\n\nasync function execute(input: RunCommandInput, prepared: Prepared, endpoint: Endpoint, options: ExecutionOptions) {\n const client = OpenCode.make({\n baseUrl: endpoint.url,\n headers: Service.headers(endpoint),\n // Bun's default five-minute deadline terminates the event stream used by long-running sessions.\n fetch: ((request: RequestInfo | URL, init?: RequestInit) =>\n fetch(request, { ...init, timeout: false } as BunFetchRequestInit)) as typeof fetch,\n })\n const explicit = parseRunModel(input.model)\n const target = await resolveSessionTarget({\n client,\n location: prepared.directory ? { directory: prepared.directory } : undefined,\n continue: input.continue,\n session: input.session,\n fork: input.fork,\n model: explicit\n ? { providerID: explicit.model.providerID, id: explicit.model.modelID, variant: explicit.variant }\n : undefined,\n agent: input.agent,\n environment: input.server.service ? Env.session() : undefined,\n prepare: async (next) => {\n const selected =\n next.model ??\n (options.variant\n ? await client.model\n .default({ location: { directory: next.location.directory, workspace: next.location.workspaceID } })\n .then((result) => result.data)\n : undefined)\n const model = selected\n ? {\n providerID: selected.providerID,\n id: selected.id,\n variant: options.variant ?? (\"variant\" in selected ? selected.variant : undefined),\n }\n : undefined\n if ((options.variant ?? explicit?.variant) && !model)\n throw new RunTargetError(\"Cannot select a variant before selecting a model\", next.session?.id)\n return { model, agent: next.agent }\n },\n }).catch((error) => {\n if (!(error instanceof RunTargetError)) throw error\n reportRunError(input, error.message, error.sessionID)\n return undefined\n })\n if (!target) return\n const model = target.model ? { providerID: target.model.providerID, modelID: target.model.id } : undefined\n const variant = target.model?.variant\n if (!target.resume && input.title !== undefined) {\n await client.session.rename({\n sessionID: target.session.id,\n title: input.title || prepared.message.slice(0, 50) + (prepared.message.length > 50 ? \"...\" : \"\"),\n })\n }\n\n await runNonInteractivePrompt({\n client,\n sessionID: target.session.id,\n location: target.location,\n message: prepared.message,\n files: prepared.files,\n agent: target.agent,\n model,\n variant,\n thinking: input.thinking ?? false,\n format: input.format,\n auto: input.auto ?? false,\n attached: options.attached ?? true,\n compatibility: options.compatibility,\n renderTool: (part) => renderTool(part, target.location.directory),\n renderToolError: (part) => renderToolError(part, target.location.directory),\n }).catch((error) => reportRunError(input, errorMessage(error), target.session.id))\n}\n\nexport function mergeInput(message: string | undefined, piped: string | undefined) {\n if (!message) return piped || undefined\n if (!piped) return message\n return message + \"\\n\" + piped\n}\n\nfunction formatMessage(message: string[]) {\n const value = message.map((part) => (part.includes(\" \") ? `\"${part.replace(/\"/g, '\\\\\"')}\"` : part)).join(\" \")\n return value || undefined\n}\n\nfunction localDirectory(root: string) {\n try {\n process.chdir(root)\n return process.cwd()\n } catch {\n fail(`Failed to change directory to ${root}`)\n }\n}\n\nexport function parseRunModel(value?: string) {\n const ref = parseSessionTargetModel(value)\n if (!ref) return\n return {\n model: { providerID: ref.providerID, modelID: ref.id },\n variant: ref.variant,\n }\n}\n\nasync function prepareFile(input: string, directory: string, options: ExecutionOptions): Promise<FilePart> {\n const file = path.resolve(directory, input)\n const handle = await open(file, \"r\").catch(() => fail(`File not found: ${input}`))\n try {\n const stat = await handle.stat()\n if (options.compatibility === \"v1\" && options.attached && stat.isDirectory())\n fail(`Cannot attach local directory without a shared filesystem: ${input}`)\n if (!stat.isFile() || stat.size > ATTACH_FILE_MAX_BYTES)\n fail(`Cannot attach a directory, special file, or file larger than 10 MiB: ${input}`)\n const content = Buffer.alloc(Number(stat.size))\n let offset = 0\n while (offset < content.length) {\n const read = await handle.read(content, offset, content.length - offset, offset)\n if (read.bytesRead === 0) break\n offset += read.bytesRead\n }\n const bytes = content.subarray(0, offset)\n const detected = FSUtil.mimeType(file)\n const text = bytes.toString(\"utf8\")\n const mime =\n detected.startsWith(\"image/\") || detected === \"application/pdf\"\n ? detected\n : !isBinaryContent(bytes) && Buffer.from(text, \"utf8\").equals(bytes)\n ? \"text/plain\"\n : detected\n return {\n url: `data:${mime};base64,${bytes.toString(\"base64\")}`,\n filename: path.basename(file),\n mime,\n }\n } finally {\n await handle.close()\n }\n}\n\nfunction isBinaryContent(bytes: Uint8Array) {\n if (bytes.length === 0) return false\n if (bytes.includes(0)) return true\n return bytes.reduce((count, byte) => count + Number(byte < 9 || (byte > 13 && byte < 32)), 0) / bytes.length > 0.3\n}\n\nasync function renderTool(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n if (info.mode === \"block\") {\n UI.empty()\n UI.println(UI.Style.TEXT_NORMAL + info.icon, UI.Style.TEXT_NORMAL + info.title)\n if (info.body?.trim()) UI.println(info.body)\n UI.empty()\n return\n }\n UI.println(\n UI.Style.TEXT_NORMAL + info.icon,\n UI.Style.TEXT_NORMAL + info.title,\n info.description ? UI.Style.TEXT_DIM + info.description + UI.Style.TEXT_NORMAL : \"\",\n )\n}\n\nasync function renderToolError(part: SessionMessageAssistantTool, directory: string) {\n const info = toolInlineInfo(part, directory)\n UI.println(UI.Style.TEXT_NORMAL + \"✗\", UI.Style.TEXT_NORMAL + `${info.title} failed`)\n}\n\n/** @internal Used by the V1 command boundary before a Session exists. */\nexport function reportRunError(input: Pick<RunCommandInput, \"format\">, message: string, sessionID?: string) {\n process.exitCode = 1\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify({\n type: \"error\",\n timestamp: Date.now(),\n sessionID: sessionID ?? \"\",\n error: { type: \"unknown\", message },\n }) + \"\\n\",\n )\n return\n }\n UI.error(message)\n}\n\nfunction fail(message: string): never {\n throw new Error(message)\n}\n", | ||
| "import type {\n EventSubscribeOutput,\n JsonValue,\n LocationRef,\n OpenCodeClient,\n SessionMessageAssistantTool,\n SessionMessageInfo,\n ToolContent,\n} from \"@opencode-ai/client/promise\"\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { EOL } from \"node:os\"\nimport { readFile } from \"node:fs/promises\"\nimport { nonEmptyToolContent, toolOutputText, type MiniToolPart } from \"@opencode-ai/tui/mini/tool\"\nimport { UI } from \"./ui\"\n\ntype Model = {\n providerID: string\n modelID: string\n}\n\ntype File = {\n url: string\n filename: string\n mime: string\n}\n\ntype Input = {\n client: OpenCodeClient\n sessionID: string\n location: LocationRef\n message: string\n files: File[]\n agent?: string\n model?: Model\n variant?: string\n thinking: boolean\n format: \"default\" | \"json\"\n auto: boolean\n /** True when the client is attached to a shared server rather than an exclusive in-process one. */\n attached: boolean\n compatibility?: \"v1\"\n renderTool: (part: SessionMessageAssistantTool) => Promise<void>\n renderToolError: (part: SessionMessageAssistantTool) => Promise<void>\n}\n\ntype StartedPart = {\n id: string\n timestamp: number\n}\n\ntype ToolState = StartedPart & {\n assistantMessageID: string\n tool: string\n input: Record<string, JsonValue>\n raw?: string\n provider?: unknown\n providerState?: SessionMessageAssistantTool[\"providerState\"]\n metadata: Record<string, JsonValue>\n content: ToolContent[]\n}\n\ntype V2Event = EventSubscribeOutput\ntype FormRequest = Extract<V2Event, { type: \"form.created\" }>[\"data\"][\"form\"]\n\n// MCP elicitations are temporarily owned by the \"global\" sentinel instead of a real\n// session. An exclusive local process may treat them as this run's blockers; an\n// attached client must not cancel input that may belong to another session.\nconst GLOBAL_FORM_SESSION_ID = \"global\"\n\nexport async function runNonInteractivePrompt(input: Input) {\n const controller = new AbortController()\n const stream = input.client.event.subscribe({ signal: controller.signal })[Symbol.asyncIterator]()\n const connected = await stream.next()\n if (connected.done) throw new Error(\"Event stream disconnected before prompt admission\")\n\n const messageID = SessionMessage.ID.create()\n const starts = new Map<string, StartedPart>()\n const tools = new Map<string, ToolState>()\n const renderedText = new Map<string, string>()\n const renderedReasoning = new Map<string, string>()\n const renderedTools = new Set<string>()\n let submitted = false\n let promoted = false\n let emittedError = false\n let permissionRejected = false\n let formCancelled = false\n let interrupted = false\n let v1InvalidOutput = false\n let prePromotionError: { message: string; [key: string]: unknown } | undefined\n let finalizing = false\n let admission: AbortController | undefined\n let pendingStep: { timestamp: number; part: Record<string, unknown>; label: string } | undefined\n\n const emit = (type: string, timestamp: number, data: Record<string, unknown>) => {\n if (input.format !== \"json\") return false\n process.stdout.write(JSON.stringify({ type, timestamp, sessionID: input.sessionID, ...data }) + EOL)\n return true\n }\n\n const writeText = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"text\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n if (!process.stdout.isTTY) {\n process.stdout.write(text + EOL)\n return\n }\n UI.empty()\n UI.println(text)\n UI.empty()\n }\n\n const writeReasoning = (part: { text: string; [key: string]: unknown }, timestamp: number) => {\n if (emit(\"reasoning\", timestamp, { part })) return\n const text = part.text.trim()\n if (!text) return\n const line = `Thinking: ${text}`\n if (!process.stdout.isTTY) return void process.stdout.write(line + EOL)\n UI.empty()\n UI.println(`${UI.Style.TEXT_DIM}\\u001b[3m${line}\\u001b[0m${UI.Style.TEXT_NORMAL}`)\n UI.empty()\n }\n\n const flushStep = () => {\n if (!pendingStep) return\n const value = pendingStep\n pendingStep = undefined\n if (!emit(\"step_start\", value.timestamp, { part: value.part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(value.label)\n UI.empty()\n }\n }\n\n const replyPermission = async (request: { id: string; action: string; resources: ReadonlyArray<string> }) => {\n if (!input.auto) {\n permissionRejected = true\n UI.println(\n UI.Style.TEXT_WARNING_BOLD + \"!\",\n UI.Style.TEXT_NORMAL +\n `permission requested: ${request.action} (${request.resources.join(\", \")}); auto-rejecting`,\n )\n }\n await input.client.permission\n .reply({\n sessionID: input.sessionID,\n requestID: request.id,\n reply: input.auto ? \"once\" : \"reject\",\n })\n .catch(() => {})\n if (!input.auto) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n }\n\n const cancelForm = async (request: Pick<FormRequest, \"id\" | \"sessionID\">) => {\n try {\n await input.client.form.cancel(\n { sessionID: request.sessionID, formID: request.id },\n ...formRequestOptions(request.sessionID === GLOBAL_FORM_SESSION_ID ? input.location : undefined),\n )\n } catch (error) {\n if (!formAlreadySettled(error)) throw error\n }\n formCancelled = true\n }\n\n const consume = async () => {\n while (!controller.signal.aborted) {\n const next = await stream.next().catch((error) => {\n if (!emittedError) throw error\n return { done: true as const, value: undefined }\n })\n if (next.done) {\n if (emittedError) return\n throw new Error(\"Event stream disconnected during prompt execution\")\n }\n const event = next.value\n\n if (event.type === \"permission.asked\" && submitted && event.data.sessionID === input.sessionID) {\n await replyPermission(event.data)\n continue\n }\n if (\n event.type === \"form.created\" &&\n submitted &&\n (event.data.form.sessionID === input.sessionID ||\n (!input.attached &&\n event.data.form.sessionID === GLOBAL_FORM_SESSION_ID &&\n sameLocation(event.location, input.location)))\n ) {\n await cancelForm(event.data.form)\n continue\n }\n if (!(\"sessionID\" in event.data) || event.data.sessionID !== input.sessionID) continue\n const time = toMillis(\"created\" in event ? event.created : undefined)\n\n if (event.type === \"session.inbox.delivered\") {\n if (event.data.inboxID === messageID) {\n promoted = true\n prePromotionError = undefined\n continue\n }\n }\n if (\n event.type === \"session.execution.interrupted\" &&\n event.data.reason === \"user\" &&\n (interrupted || permissionRejected || formCancelled)\n ) {\n return\n }\n if (!promoted && event.type === \"session.execution.failed\") {\n prePromotionError = event.data.error\n if (finalizing) return\n continue\n }\n if (\n !promoted &&\n finalizing &&\n (event.type === \"session.execution.succeeded\" || event.type === \"session.execution.interrupted\")\n )\n return\n if (!promoted) continue\n if (finalizing && !event.type.startsWith(\"session.execution.\")) continue\n\n if (event.type === \"session.step.started\") {\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-start\",\n snapshot: event.data.snapshot,\n }\n if (input.compatibility === \"v1\") {\n pendingStep = {\n timestamp: time,\n part,\n label: `> ${event.data.agent} · ${event.data.model.id}`,\n }\n continue\n }\n if (!emit(\"step_start\", time, { part }) && input.format !== \"json\") {\n UI.empty()\n UI.println(`> ${event.data.agent} · ${event.data.model.id}`)\n UI.empty()\n }\n continue\n }\n\n if (event.type === \"session.text.started\") {\n flushStep()\n starts.set(`text\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.text.ended\") {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`text\\u0000${key}`)\n starts.delete(`text\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"text\",\n text: event.data.text,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedText.set(key, event.data.text)\n writeText(part, time)\n continue\n }\n\n if (event.type === \"session.reasoning.started\") {\n flushStep()\n starts.set(`reasoning\\u0000${contentKey(event.data.assistantMessageID, event.data.ordinal)}`, {\n id: partID(event.id),\n timestamp: time,\n })\n continue\n }\n if (event.type === \"session.reasoning.ended\" && input.thinking) {\n const key = contentKey(event.data.assistantMessageID, event.data.ordinal)\n const started = starts.get(`reasoning\\u0000${key}`)\n starts.delete(`reasoning\\u0000${key}`)\n const part = {\n id: started?.id ?? partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"reasoning\",\n text: event.data.text,\n metadata: event.data.state,\n time: { start: started?.timestamp ?? time, end: time },\n }\n renderedReasoning.set(key, event.data.text)\n writeReasoning(part, time)\n continue\n }\n\n if (event.type === \"session.tool.input.started\") {\n flushStep()\n tools.set(toolKey(event.data.assistantMessageID, event.data.id), {\n id: partID(event.id),\n timestamp: time,\n assistantMessageID: event.data.assistantMessageID,\n tool: event.data.name,\n input: {},\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.input.ended\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = event.data.text\n continue\n }\n if (event.type === \"session.tool.input.delta\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) current.raw = (current.raw ?? \"\") + event.data.delta\n continue\n }\n if (event.type === \"session.tool.called\") {\n flushStep()\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key)\n tools.set(key, {\n id: current?.id ?? partID(event.id),\n timestamp: current?.timestamp ?? time,\n assistantMessageID: event.data.assistantMessageID,\n tool: current?.tool ?? \"tool\",\n input: event.data.input,\n raw: current?.raw,\n provider: { executed: event.data.executed, state: event.data.state },\n providerState: event.data.state,\n metadata: {},\n content: [],\n })\n continue\n }\n if (event.type === \"session.tool.progress\") {\n const current = tools.get(toolKey(event.data.assistantMessageID, event.data.id))\n if (current) {\n current.metadata = event.data.metadata\n }\n continue\n }\n if (event.type === \"session.tool.success\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"completed\",\n input: current.input,\n metadata: event.data.metadata,\n content: event.data.content,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"completed\",\n input: current.input,\n output: toolOutputText(current.tool, event.data.content),\n title: current.tool,\n metadata: {\n metadata: event.data.metadata,\n content: event.data.content,\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (!emit(\"tool_use\", time, { part })) await input.renderTool(tool)\n continue\n }\n if (event.type === \"session.tool.failed\") {\n const key = toolKey(event.data.assistantMessageID, event.data.id)\n const current = tools.get(key) ?? fallbackTool(event)\n const error = event.data.error.message\n const metadata = event.data.metadata ?? current.metadata\n const content = event.data.content ?? nonEmptyToolContent(current.content)\n const tool: SessionMessageAssistantTool = {\n type: \"tool\",\n id: event.data.id,\n name: current.tool,\n executed: event.data.executed,\n providerState: current.providerState,\n providerResultState: event.data.resultState,\n state: {\n status: \"error\",\n input: current.input,\n metadata,\n content,\n error: event.data.error,\n },\n time: { created: current.timestamp, ran: current.timestamp, completed: time },\n }\n const part: MiniToolPart = {\n partID: current.id,\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"tool\",\n id: event.data.id,\n tool: current.tool,\n state: {\n status: \"error\",\n input: current.input,\n error,\n metadata: {\n providerCall: current.provider,\n providerResult: { executed: event.data.executed, state: event.data.resultState },\n rawInput: current.raw,\n },\n time: { start: current.timestamp, end: time },\n },\n }\n tools.delete(key)\n renderedTools.add(key)\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) continue\n if (!emit(\"tool_use\", time, { part })) {\n if (content && toolOutputText(current.tool, content).trim())\n await input.renderTool({\n ...tool,\n state: {\n status: \"completed\",\n input: current.input,\n metadata,\n content,\n },\n })\n await input.renderToolError(tool)\n UI.error(error)\n }\n continue\n }\n\n if (event.type === \"session.step.ended\") {\n flushStep()\n const part = {\n id: partID(event.id),\n sessionID: input.sessionID,\n messageID: event.data.assistantMessageID,\n type: \"step-finish\",\n reason: event.data.finish,\n snapshot: event.data.snapshot,\n cost: event.data.cost,\n tokens: event.data.tokens,\n }\n emit(\"step_finish\", time, { part })\n continue\n }\n if (event.type === \"session.step.failed\") {\n if (input.compatibility === \"v1\" && event.data.error.message === \"The provider response ended unexpectedly.\") {\n pendingStep = undefined\n v1InvalidOutput = true\n continue\n }\n if (interrupted || permissionRejected || formCancelled) continue\n flushStep()\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n continue\n }\n if (event.type === \"session.execution.failed\") {\n if (input.compatibility === \"v1\" && (v1InvalidOutput || permissionRejected || formCancelled)) return\n flushStep()\n if (!emittedError && !formCancelled) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", time, { error: event.data.error })) UI.error(event.data.error.message)\n }\n return\n }\n if (event.type === \"session.execution.interrupted\") {\n if (input.compatibility === \"v1\" && (permissionRejected || formCancelled)) return\n if (event.data.reason === \"user\" && interrupted) process.exitCode = 130\n if (event.data.reason !== \"user\" && !emittedError) {\n emittedError = true\n process.exitCode = 1\n const error = { type: \"aborted\" as const, message: `Session interrupted: ${event.data.reason}` }\n if (!emit(\"error\", time, { error })) UI.error(error.message)\n }\n return\n }\n if (event.type === \"session.execution.succeeded\") return\n }\n }\n\n const projectedMessages = async () => {\n const messages: SessionMessageInfo[] = []\n let cursor: string | undefined\n while (true) {\n const page = await input.client.message.list(\n cursor\n ? { sessionID: input.sessionID, limit: 200, cursor }\n : { sessionID: input.sessionID, limit: 200, order: \"desc\" },\n )\n for (const message of page.data) {\n if (message.id === messageID) return { found: true, messages: messages.toReversed() }\n messages.push(message)\n }\n cursor = page.cursor.next ?? undefined\n if (!cursor) return { found: false, messages: [] }\n }\n }\n\n const reconcile = async () => {\n const projected = await projectedMessages()\n for (const message of projected.messages) {\n if (message.type !== \"assistant\") continue\n const timestamp = message.time.completed ?? message.time.created\n let textOrdinal = 0\n let reasoningOrdinal = 0\n for (const item of message.content) {\n if (item.type === \"text\") {\n const ordinal = textOrdinal++\n const key = contentKey(message.id, ordinal)\n const rendered = renderedText.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n writeText(\n {\n id: projectedPartID(message.id, `text-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"text\",\n text,\n time: { start: message.time.created, end: timestamp },\n },\n timestamp,\n )\n renderedText.set(key, item.text)\n continue\n }\n if (item.type === \"reasoning\") {\n const ordinal = reasoningOrdinal++\n if (!input.thinking) continue\n const key = contentKey(message.id, ordinal)\n const rendered = renderedReasoning.get(key) ?? \"\"\n if (rendered === item.text || !item.text.startsWith(rendered)) continue\n const text = item.text.slice(rendered.length)\n const part = {\n id: projectedPartID(message.id, `reasoning-${ordinal}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"reasoning\",\n text,\n metadata: item.state,\n time: { start: message.time.created, end: timestamp },\n }\n renderedReasoning.set(key, item.text)\n writeReasoning(part, timestamp)\n continue\n }\n\n const key = toolKey(message.id, item.id)\n if (renderedTools.has(key) || item.state.status === \"streaming\" || item.state.status === \"running\") continue\n const part: MiniToolPart = {\n partID: projectedPartID(message.id, `tool-${item.id}`),\n sessionID: input.sessionID,\n messageID: message.id,\n type: \"tool\",\n id: item.id,\n tool: item.name,\n state:\n item.state.status === \"completed\"\n ? {\n status: \"completed\",\n input: item.state.input,\n output: toolOutputText(item.name, item.state.content),\n title: item.name,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n }\n : {\n status: \"error\",\n input: item.state.input,\n error: item.state.error.message,\n metadata: { metadata: item.state.metadata, content: item.state.content },\n time: { start: item.time.ran ?? item.time.created, end: item.time.completed ?? timestamp },\n },\n }\n renderedTools.add(key)\n if (emit(\"tool_use\", timestamp, { part })) continue\n if (item.state.status === \"completed\") {\n await input.renderTool(item)\n continue\n }\n if (item.state.content && toolOutputText(item.name, item.state.content).trim()) {\n await input.renderTool({\n ...item,\n state: {\n status: \"completed\",\n input: item.state.input,\n metadata: item.state.metadata,\n content: item.state.content,\n },\n })\n }\n await input.renderToolError(item)\n UI.error(item.state.error.message)\n }\n\n if (message.error && !emittedError) {\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", timestamp, { error: message.error })) UI.error(message.error.message)\n }\n }\n return {\n found: projected.found,\n responded: projected.messages.some((message) => message.type === \"assistant\"),\n }\n }\n\n const interrupt = () => {\n if (interrupted) process.exit(130)\n interrupted = true\n process.exitCode = 130\n admission?.abort()\n void input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n process.on(\"SIGINT\", interrupt)\n\n let completed: Promise<void> | undefined\n try {\n if (input.agent) {\n await input.client.session.switchAgent({ sessionID: input.sessionID, agent: input.agent })\n }\n const selected = input.model\n ? { providerID: input.model.providerID, id: input.model.modelID, variant: input.variant }\n : input.variant\n ? await input.client.session\n .get({ sessionID: input.sessionID })\n .then((result) => result.model)\n .then(async (model) => {\n if (model) return { ...model, variant: input.variant }\n const result = await input.client.model.default()\n const fallback = result.data\n return fallback ? { providerID: fallback.providerID, id: fallback.id, variant: input.variant } : undefined\n })\n : undefined\n if (input.variant && !selected) throw new Error(\"Cannot select a variant before selecting a model\")\n if (selected) {\n await input.client.session.switchModel({ sessionID: input.sessionID, model: selected })\n }\n\n const prepared = await Promise.all(input.files.map(prepareFile))\n if (interrupted) return\n submitted = true\n completed = consume()\n admission = new AbortController()\n const response = await input.client.session\n .prompt(\n {\n sessionID: input.sessionID,\n id: messageID,\n text: [input.message, ...prepared.flatMap((file) => (file.text ? [file.text] : []))].join(\"\\n\\n\"),\n files: prepared.flatMap((file) => (file.attachment ? [file.attachment] : [])),\n delivery: \"steer\",\n },\n { signal: admission.signal },\n )\n .catch(async (error) => {\n if (interrupted) {\n await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n }\n controller.abort()\n await completed?.catch(() => {})\n if (interrupted || emittedError) return undefined\n throw error\n })\n admission = undefined\n if (!response) return\n if (interrupted) await input.client.session.interrupt({ sessionID: input.sessionID }).catch(() => {})\n\n const [permissions, forms, globals] = await Promise.all([\n input.client.permission.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.client.form.list({ sessionID: input.sessionID }).catch(() => undefined),\n input.attached\n ? Promise.resolve(undefined)\n : input.client.form.request\n .list({\n location: { directory: input.location.directory, workspace: input.location.workspaceID },\n })\n .catch(() => undefined),\n ])\n await Promise.all([\n ...(permissions ?? []).map(replyPermission),\n ...(forms ?? []).map(cancelForm),\n ...(globals && sameLocation(globals.location, input.location)\n ? globals.data.filter((form) => form.sessionID === GLOBAL_FORM_SESSION_ID).map(cancelForm)\n : []),\n ])\n if (input.compatibility === \"v1\") {\n await completed\n return\n }\n\n const waiting = input.client.session.wait({ sessionID: input.sessionID })\n await Promise.race([waiting, completed.then(() => waiting)])\n finalizing = true\n const projected = await reconcile()\n if (\n !projected.responded &&\n !interrupted &&\n !permissionRejected &&\n !formCancelled &&\n !emittedError &&\n !prePromotionError\n ) {\n await completed\n }\n if (!projected.found && !interrupted && !permissionRejected && !formCancelled && !emittedError) {\n const error = prePromotionError ?? { type: \"unknown\", message: \"Prompt was not promoted\" }\n emittedError = true\n process.exitCode = 1\n if (!emit(\"error\", Date.now(), { error })) UI.error(error.message)\n }\n } finally {\n process.off(\"SIGINT\", interrupt)\n controller.abort()\n if (input.compatibility === \"v1\") await stream.return?.(undefined).catch(() => {})\n else void stream.return?.(undefined).catch(() => {})\n }\n}\n\nfunction sameLocation(left: LocationRef | undefined, right: LocationRef) {\n return !!left && left.directory === right.directory && left.workspaceID === right.workspaceID\n}\n\nfunction formRequestOptions(location: LocationRef | undefined): [] | [{ headers: Record<string, string> }] {\n if (!location) return []\n return [\n {\n headers: {\n \"x-opencode-directory\": encodeURIComponent(location.directory),\n ...(location.workspaceID ? { \"x-opencode-workspace\": location.workspaceID } : {}),\n },\n },\n ]\n}\n\nfunction formAlreadySettled(error: unknown) {\n return !!error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"FormAlreadySettledError\"\n}\n\nfunction partID(eventID: string) {\n return `prt_${eventID.replace(/^evt_/, \"\")}`\n}\n\nfunction toolKey(messageID: string, id: string) {\n return `${messageID}\\u0000${id}`\n}\n\nfunction contentKey(messageID: string, ordinal: number) {\n return `${messageID}\\u0000${ordinal}`\n}\n\nfunction projectedPartID(messageID: string, part: string) {\n return `prt_${messageID.replace(/^msg_/, \"\")}_${part}`\n}\n\nfunction fallbackTool(event: {\n id: string\n created: number\n data: { assistantMessageID: string; id: string }\n}): ToolState {\n return {\n id: partID(event.id),\n timestamp: toMillis(event.created),\n assistantMessageID: event.data.assistantMessageID,\n tool: \"tool\",\n input: {},\n metadata: {},\n content: [],\n }\n}\n\nfunction toMillis(value: unknown) {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\") return new Date(value).getTime()\n return Date.now()\n}\n\nasync function prepareFile(file: File) {\n if (file.mime !== \"text/plain\") {\n const uri = file.url.startsWith(\"data:\")\n ? file.url\n : `data:${file.mime};base64,${(await readFile(new URL(file.url))).toString(\"base64\")}`\n return { attachment: { uri, name: file.filename } }\n }\n const content = file.url.startsWith(\"data:\")\n ? Buffer.from(file.url.slice(file.url.indexOf(\",\") + 1), \"base64\").toString(\"utf8\")\n : await readFile(new URL(file.url), \"utf8\")\n return { text: `<file name=\"${file.filename}\">\\n${content}\\n</file>` }\n}\n", | ||
| "import { EOL } from \"node:os\"\n\nexport const Style = {\n TEXT_DIM: \"\\x1b[90m\",\n TEXT_NORMAL: \"\\x1b[0m\",\n TEXT_WARNING_BOLD: \"\\x1b[93m\\x1b[1m\",\n TEXT_DANGER_BOLD: \"\\x1b[91m\\x1b[1m\",\n}\n\nexport function println(...message: string[]) {\n process.stderr.write(message.join(\" \") + EOL)\n}\n\nlet blank = false\n\nexport function empty() {\n if (blank) return\n println(Style.TEXT_NORMAL)\n blank = true\n}\n\nexport function error(message: string) {\n if (message.startsWith(\"Error: \")) message = message.slice(\"Error: \".length)\n println(Style.TEXT_DANGER_BOLD + \"Error: \" + Style.TEXT_NORMAL + message)\n}\n\nexport * as UI from \"./ui\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "1415266F27E0F4B464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-compatible-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { Route, type RouteRoutedLanguageModelInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport * as OpenAIChat from \"./openai-chat.js\"\n\nconst ADAPTER = \"openai-compatible-chat\"\n\nexport type OpenAICompatibleChatLanguageModelInput = RouteRoutedLanguageModelInput\n\n/**\n * Route for non-OpenAI providers that expose an OpenAI Chat-compatible\n * `/chat/completions` endpoint. Reuses `OpenAIChat.protocol` end-to-end and\n * overrides only the route id so providers can be resolved per-family without\n * colliding with native OpenAI. Provider helpers configure the route endpoint\n * before model selection.\n */\nexport const route = Route.make({\n id: ADAPTER,\n providerMetadataKey: \"openai\",\n protocol: OpenAIChat.protocol,\n endpoint: Endpoint.path(\"/chat/completions\"),\n framing: Framing.sse,\n})\n\nexport * as OpenAICompatibleChat from \"./openai-compatible-chat.js\"\n" | ||
| ], | ||
| "mappings": ";mOAKA,IAAM,EAAU,yBAWH,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,oBAAqB,SACrB,SAAqB,EACrB,SAAU,EAAS,KAAK,mBAAmB,EAC3C,QAAS,EAAQ,GACnB,CAAC", | ||
| "debugId": "95AC09E649ECC60564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { Gemini } from \"../protocols/gemini.js\"\nimport { ProviderShared } from \"../protocols/shared.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { ProviderID, type LLMRequest, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\n\nexport interface GeminiOptionsInput extends Gemini.OptionsInput {\n readonly labels?: Readonly<Record<string, string>>\n}\n\nexport type GeminiProviderOptionsInput = GeminiOptionsInput\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.ApiKeyOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: GeminiProviderOptionsInput\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly accessToken?: string; readonly apiKey?: never }\n | { readonly accessToken?: never; readonly apiKey?: string }\n ) & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: GeminiProviderOptionsInput\n }\n\nconst fromRequest = Effect.fn(\"GoogleVertex.fromRequest\")(function* (request: LLMRequest) {\n const body = yield* Gemini.protocol.body.from(request)\n const value = request.providerOptions?.labels\n const labels = ProviderShared.isRecord(value)\n ? Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === \"string\"),\n )\n : undefined\n return { ...body, labels }\n})\n\nconst protocol = {\n ...Gemini.protocol,\n body: {\n ...Gemini.protocol.body,\n from: fromRequest,\n },\n}\n\nconst route = Route.make({\n id: \"google-vertex-gemini\",\n provider: id,\n providerMetadataKey: \"google\",\n protocol,\n endpoint: Endpoint.path(({ request }) => {\n const model = String(request.model.id)\n return `/${model.startsWith(\"endpoints/\") ? model : `models/${model}`}:streamGenerateContent?alt=sse`\n }),\n auth: Auth.none,\n framing: Framing.sse,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config, modelID: string | ModelID) => {\n const {\n accessToken: _accessToken,\n apiKey: _apiKey,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const apiKey = GoogleVertexShared.apiKey(input)\n const endpointModel = String(modelID).startsWith(\"endpoints/\")\n if (apiKey !== undefined && endpointModel)\n throw new Error(\"Google Vertex tuned models do not support Express Mode API keys\")\n const location = GoogleVertexShared.location(inputLocation, \"us-central1\")\n const project = GoogleVertexShared.project(inputProject)\n const endpoint =\n baseURL ??\n (apiKey\n ? \"https://aiplatform.googleapis.com/v1/publishers/google\"\n : `https://${GoogleVertexShared.host(location)}/v1beta1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}${endpointModel ? \"\" : \"/publishers/google\"}`)\n return route.with({\n ...rest,\n endpoint: { baseURL: endpoint },\n auth: apiKey === undefined ? GoogleVertexShared.oauth(input, project) : Auth.header(\"x-goog-api-key\", apiKey),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n return {\n id,\n model: (modelID: string | ModelID) =>\n configuredRoute(input, modelID).model<GeminiProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\nexport const model: ProviderPackage.Definition<Settings, GeminiProviderOptionsInput>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.accessToken !== undefined)\n throw new Error(\"Google Vertex apiKey cannot be combined with accessToken or auth\")\n return configure({\n ...(settings.apiKey === undefined ? { accessToken: settings.accessToken } : { apiKey: settings.apiKey }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";wPAiBO,IAAM,EAAK,EAAW,KAAK,eAAe,EAqB3C,EAAc,EAAO,GAAG,0BAA0B,EAAE,SAAU,CAAC,EAAqB,CACxF,IAAM,EAAO,MAAO,EAAO,SAAS,KAAK,KAAK,CAAO,EAC/C,EAAQ,EAAQ,iBAAiB,OACjC,EAAS,EAAe,SAAS,CAAK,EACxC,OAAO,YACL,OAAO,QAAQ,CAAK,EAAE,OAAO,CAAC,IAAqC,OAAO,EAAM,KAAO,QAAQ,CACjG,EACA,OACJ,MAAO,IAAK,EAAM,QAAO,EAC1B,EAEK,EAAW,IACZ,EAAO,SACV,KAAM,IACD,EAAO,SAAS,KACnB,KAAM,CACR,CACF,EAEM,EAAQ,EAAM,KAAK,CACvB,GAAI,uBACJ,SAAU,EACV,oBAAqB,SACrB,WACA,SAAU,EAAS,KAAK,EAAG,aAAc,CACvC,IAAM,EAAQ,OAAO,EAAQ,MAAM,EAAE,EACrC,MAAO,IAAI,EAAM,WAAW,YAAY,EAAI,EAAQ,UAAU,oCAC/D,EACD,KAAM,EAAK,KACX,QAAS,EAAQ,GACnB,CAAC,EAEY,EAAS,CAAC,CAAK,EAEtB,EAAkB,CAAC,EAAe,IAA8B,CACpE,IACE,YAAa,EACb,OAAQ,EACR,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAS,EAAmB,OAAO,CAAK,EACxC,EAAgB,OAAO,CAAO,EAAE,WAAW,YAAY,EAC7D,GAAI,IAAW,QAAa,EAC1B,MAAU,MAAM,iEAAiE,EACnF,IAAM,EAAW,EAAmB,SAAS,EAAe,aAAa,EACnE,EAAU,EAAmB,QAAQ,CAAY,EACjD,EACJ,IACC,EACG,yDACA,WAAW,EAAmB,KAAK,CAAQ,sBAAsB,EAAmB,eAAe,CAAO,eAAe,IAAW,EAAgB,GAAK,wBAC/J,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CAAE,QAAS,CAAS,EAC9B,KAAM,IAAW,OAAY,EAAmB,MAAM,EAAO,CAAO,EAAI,EAAK,OAAO,iBAAkB,CAAM,CAC9G,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,KAClC,CACL,KACA,MAAO,CAAC,IACN,EAAgB,EAAO,CAAO,EAAE,MAAkC,CAAE,GAAI,CAAQ,CAAC,EACnF,WACF,GAGW,EAAW,CACtB,KACA,WACF,EACa,EAAmF,CAAC,EAAS,IAAa,CACrH,GAAI,EAAS,SAAW,QAAa,EAAS,cAAgB,OAC5D,MAAU,MAAM,kEAAkE,EACpF,OAAO,EAAU,IACX,EAAS,SAAW,OAAY,CAAE,YAAa,EAAS,WAAY,EAAI,CAAE,OAAQ,EAAS,MAAO,EACtG,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "F625C9D39147203864756E2164756E21", | ||
| "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": "686DA092DEA17A1264756E2164756E21", | ||
| "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": "22F496C5ED92A0D864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/command.ts", "../schema/src/websearch.ts", "../schema/src/reference.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Command from \"./command.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Agent } from \"./agent.js\"\n\nconst Updated = ephemeral({ type: \"command.updated\", schema: {} })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n name: Schema.String,\n template: Schema.String,\n description: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n subtask: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Command.Info\" })\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as WebSearch from \"./websearch.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"WebSearch.ID\"))\nexport type ID = typeof ID.Type\n\nexport interface Provider extends Schema.Schema.Type<typeof Provider> {}\nexport const Provider = Schema.Struct({\n id: ID,\n name: Schema.String,\n}).annotate({ identifier: \"WebSearch.Provider\" })\n\nexport interface Input extends Schema.Schema.Type<typeof Input> {}\nexport const Input = Schema.Struct({\n query: Schema.String,\n providerID: ID.pipe(optional),\n}).annotate({ identifier: \"WebSearch.Input\" })\nexport type ProviderInput = Pick<Input, \"query\">\n\nexport interface Result extends Schema.Schema.Type<typeof Result> {}\nexport const Result = Schema.Struct({\n url: Schema.String,\n title: Schema.String.pipe(optional),\n content: Schema.String.pipe(optional),\n time: Schema.Struct({\n published: Schema.Finite.pipe(optional),\n }),\n}).annotate({ identifier: \"WebSearch.Result\" })\n\nexport class Response extends Schema.Class<Response>(\"WebSearch.Response\")({\n providerID: ID,\n results: Schema.Array(Result),\n}) {}\n\nconst Updated = ephemeral({\n type: \"websearch.updated\",\n schema: {},\n})\nexport const Event = { Updated, Definitions: inventory(Updated) }\n", | ||
| "export * as Reference from \"./reference.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"reference.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface LocalSource extends Schema.Schema.Type<typeof LocalSource> {}\nexport const LocalSource = Schema.Struct({\n type: Schema.Literal(\"local\"),\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.LocalSource\" })\n\nexport interface GitSource extends Schema.Schema.Type<typeof GitSource> {}\nexport const GitSource = Schema.Struct({\n type: Schema.Literal(\"git\"),\n repository: Schema.String,\n branch: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.GitSource\" })\n\nexport const Source = Schema.Union([LocalSource, GitSource])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Reference.Source\" })\nexport type Source = typeof Source.Type\n\nexport const Info = Schema.Struct({\n name: Schema.String,\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n source: Source,\n}).annotate({ identifier: \"Reference.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": ";6XAQA,IAAM,EAAU,EAAU,CAAE,KAAM,kBAAmB,OAAQ,CAAC,CAAE,CAAC,EAGpD,EAAO,EAAO,OAAO,CAChC,KAAM,EAAO,OACb,SAAU,EAAO,OACjB,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,MAAO,EAAM,GAAG,KAAK,CAAQ,EAC7B,MAAO,EAAM,IAAI,KAAK,CAAQ,EAC9B,QAAS,EAAO,QAAQ,KAAK,CAAQ,CACvC,CAAC,EAAE,SAAS,CAAE,WAAY,cAAe,CAAC,EAE7B,EAAQ,CACnB,UACA,YAAa,EAAU,CAAO,CAChC,8GCjBO,IAAM,EAAK,EAAO,OAAO,KAAK,EAAO,MAAM,cAAc,CAAC,EAIpD,EAAW,EAAO,OAAO,CACpC,GAAI,EACJ,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,EAAQ,EAAO,OAAO,CACjC,MAAO,EAAO,OACd,WAAY,EAAG,KAAK,CAAQ,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,iBAAkB,CAAC,EAIhC,EAAS,EAAO,OAAO,CAClC,IAAK,EAAO,OACZ,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,QAAS,EAAO,OAAO,KAAK,CAAQ,EACpC,KAAM,EAAO,OAAO,CAClB,UAAW,EAAO,OAAO,KAAK,CAAQ,CACxC,CAAC,CACH,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEvC,MAAM,UAAiB,EAAO,MAAgB,oBAAoB,EAAE,CACzE,WAAY,EACZ,QAAS,EAAO,MAAM,CAAM,CAC9B,CAAC,CAAE,CAAC,CAEJ,IAAM,EAAU,EAAU,CACxB,KAAM,oBACN,OAAQ,CAAC,CACX,CAAC,EACY,EAAQ,CAAE,UAAS,YAAa,EAAU,CAAO,CAAE,wGClChE,IAAM,EAAU,EAAU,CAAE,KAAM,oBAAqB,OAAQ,CAAC,CAAE,CAAC,EACtD,EAAQ,CAAE,UAAS,YAAa,EAAU,CAAO,CAAE,EAGnD,EAAc,EAAO,OAAO,CACvC,KAAM,EAAO,QAAQ,OAAO,EAC5B,KAAM,EACN,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,OAAQ,EAAO,QAAQ,KAAK,CAAQ,CACtC,CAAC,EAAE,SAAS,CAAE,WAAY,uBAAwB,CAAC,EAGtC,EAAY,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,KAAK,EAC1B,WAAY,EAAO,OACnB,OAAQ,EAAO,OAAO,KAAK,CAAQ,EACnC,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,OAAQ,EAAO,QAAQ,KAAK,CAAQ,CACtC,CAAC,EAAE,SAAS,CAAE,WAAY,qBAAsB,CAAC,EAEpC,EAAS,EAAO,MAAM,CAAC,EAAa,CAAS,CAAC,EACxD,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAO,EAAO,OAAO,CAChC,KAAM,EAAO,OACb,KAAM,EACN,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,OAAQ,EAAO,QAAQ,KAAK,CAAQ,EACpC,OAAQ,CACV,CAAC,EAAE,SAAS,CAAE,WAAY,gBAAiB,CAAC", | ||
| "debugId": "0E5319DA04BB503564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"], | ||
| "sourcesContent": [ | ||
| "// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n", | ||
| "import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem.js\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image.js\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";kgCAGA,IAAe,ICDf,oBACA,wBAAS,YAIT,IAAM,EAAiB,CAAC,GAAI,GAAI,GAAI,GAAI,EAAE,EAE7B,EAAO,EAAO,IAAI,SAAU,EAAG,CACxC,WAA4E,4BAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "343DFC03223B477C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/demo.ts"], | ||
| "sourcesContent": [ | ||
| "// Demo mode for testing direct interactive mode without a real SDK.\n//\n// Enabled with `--demo`. Intercepts prompt submissions and drives the same\n// presentation commits and footer actions as the live transport. This\n// lets you test scrollback formatting, permission UI, canonical Form UI, and tool\n// snapshots without making actual model calls. Pass a demo slash command as\n// the initial interactive message to trigger a preview immediately.\n//\n// Slash commands:\n// /permission [kind] → triggers a permission request variant\n// /form [kind] → triggers a canonical Form request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, shell,\n// write, edit, patch, subagent, question, error, mix)\n//\n// Demo mode handles permission and Form replies locally, completing or failing\n// the synthetic tool parts through the same callbacks used by the live footer.\nimport path from \"path\"\nimport type { JsonValue, SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { parseSlashHead } from \"../prompt/parse\"\nimport { writeSessionOutput } from \"./stream\"\nimport { toolCommit, toolFinalPhase } from \"./stream-v2.subagent\"\nimport type {\n FooterApi,\n FooterView,\n FormCancel,\n FormReply,\n MiniFormRequest,\n MiniPermissionRequest,\n PermissionReply,\n RunPrompt,\n StreamCommit,\n} from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"shell\",\n \"write\",\n \"edit\",\n \"patch\",\n \"subagent\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"shell\", \"read\", \"subagent\", \"external\", \"doom\"] as const\nconst FORMS = [\"question\", \"external\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype FormKind = (typeof FORMS)[number]\n\nfunction permissionKind(value: string | undefined): PermissionKind | undefined {\n const next = (value || \"edit\").toLowerCase()\n return PERMISSIONS.find((item) => item === next)\n}\n\nfunction formKind(value: string | undefined): FormKind | undefined {\n const next = (value || \"question\").toLowerCase()\n return FORMS.find((item) => item === next)\n}\n\nconst SAMPLE_MARKDOWN = [\n \"# Direct Mode Demo\",\n \"\",\n \"This is a realistic assistant response for direct-mode formatting checks.\",\n \"It mixes **bold**, _italic_, `inline code`, links, code fences, and tables in one streamed reply.\",\n \"\",\n \"## Summary\",\n \"\",\n \"- Restored the final markdown flush so the last block is committed on idle.\",\n \"- Switched markdown scrollback commits back to top-level block boundaries.\",\n \"- Added footer-level regression coverage for split-footer rendering.\",\n \"\",\n \"## Status\",\n \"\",\n \"| Area | Before | After | Notes |\",\n \"| --- | --- | --- | --- |\",\n \"| Direct mode | Missing final rows | Stable | Final markdown block now flushes on idle |\",\n \"| Tables | Dropped in streaming mode | Visible | Block-based commits match the working OpenTUI demo |\",\n \"| Tests | Partial coverage | Broader coverage | Includes a footer-level split render capture |\",\n \"\",\n \"> This sample intentionally includes a wide table so you can spot wrapping and commit bugs quickly.\",\n \"\",\n \"```ts\",\n \"const result = { markdown: true, tables: 2, stable: true }\",\n \"```\",\n \"\",\n \"## Files\",\n \"\",\n \"| File | Change |\",\n \"| --- | --- |\",\n \"| `scrollback.surface.ts` | Align markdown commit logic with the split-footer demo |\",\n \"| `footer.ts` | Keep active surfaces across footer-height-only resizes |\",\n \"| `footer.test.ts` | Capture real split-footer markdown payloads during idle completion |\",\n \"\",\n \"Next step: run `/fmt table` if you want a tighter table-only sample.\",\n].join(\"\\n\")\n\nconst SAMPLE_TABLE = [\n \"# Table Sample\",\n \"\",\n \"| Kind | Example | Notes |\",\n \"| --- | --- | --- |\",\n \"| Pipe | `A\\\\|B` | Escaped pipes should stay in one cell |\",\n \"| Unicode | `漢字` | Wide characters should remain aligned |\",\n \"| Wrap | `LongTokenWithoutNaturalBreaks_1234567890` | Useful for width stress |\",\n \"| Status | done | Final row should still appear after idle |\",\n].join(\"\\n\")\n\ntype Ref = {\n msg: string\n call: string\n tool: string\n input: Record<string, JsonValue>\n start: number\n}\n\ntype FormRequest = {\n ref: Ref\n kind: FormKind\n request: MiniFormRequest\n}\n\ntype Perm = {\n ref: Ref\n done: {\n output: string\n metadata?: Record<string, JsonValue>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: MiniPermissionRequest[\"metadata\"]\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n footer: FooterApi\n msg: number\n part: number\n call: number\n perm: number\n form: number\n perms: Map<string, Perm>\n forms: Map<string, FormRequest>\n started: Set<string>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\n footer: FooterApi\n}\n\nfunction note(footer: FooterApi, text: string): void {\n footer.append({\n kind: \"system\",\n text,\n phase: \"start\",\n source: \"system\",\n })\n}\n\nfunction clearSubagent(footer: FooterApi): void {\n footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [],\n details: {},\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n },\n ],\n details: {\n [input.sessionID]: {\n commits: input.commits,\n },\n },\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (!signal) {\n setTimeout(resolve, ms)\n return\n }\n\n if (signal.aborted) {\n resolve()\n return\n }\n\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", done)\n resolve()\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", done)\n resolve()\n }, ms)\n\n signal.addEventListener(\"abort\", done, { once: true })\n })\n}\n\nfunction split(text: string): string[] {\n if (text.length <= 48) {\n return [text]\n }\n\n const size = Math.ceil(text.length / 3)\n return [text.slice(0, size), text.slice(size, size * 2), text.slice(size * 2)]\n}\n\nfunction take(state: State, key: \"msg\" | \"part\" | \"call\" | \"perm\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction present(state: State, commits: StreamCommit[], view?: FooterView): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits,\n updates: view\n ? [\n {\n type: \"stream.patch\" as const,\n patch: { status: view.type === \"permission\" ? \"awaiting permission\" : \"awaiting form\" },\n },\n { type: \"stream.view\" as const, view },\n ]\n : undefined,\n },\n )\n}\n\nfunction clearBlocker(state: State): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits: [],\n updates: [\n { type: \"stream.patch\", patch: { status: \"\" } },\n { type: \"stream.view\", view: { type: \"prompt\" } },\n ],\n },\n )\n}\n\nfunction open(state: State): string {\n return take(state, \"msg\", \"msg\")\n}\n\nasync function emitText(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n present(state, [\n { kind: \"assistant\", source: \"assistant\", text: item, phase: \"progress\", messageID: msg, partID: part },\n ])\n await wait(45, signal)\n }\n}\n\nasync function emitReasoning(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n let first = true\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n if (state.thinking) {\n present(state, [\n {\n kind: \"reasoning\",\n source: \"reasoning\",\n text: first ? `Thinking: ${item.replace(/\\[REDACTED\\]/g, \"\")}` : item.replace(/\\[REDACTED\\]/g, \"\"),\n phase: \"progress\",\n messageID: msg,\n partID: part,\n },\n ])\n first = false\n }\n await wait(45, signal)\n }\n}\n\nfunction make(state: State, tool: string, input: Record<string, JsonValue>): Ref {\n return {\n msg: open(state),\n call: take(state, \"call\", \"call\"),\n tool,\n input,\n start: Date.now(),\n }\n}\n\nfunction startTool(state: State, ref: Ref, metadata: Record<string, JsonValue> = {}): SessionMessageAssistantTool {\n state.started.add(ref.call)\n const part = {\n type: \"tool\" as const,\n id: ref.call,\n name: ref.tool,\n state: { status: \"running\" as const, input: ref.input, metadata },\n time: { created: ref.start, ran: ref.start },\n }\n present(state, [toolCommit(part, ref.msg, \"start\")])\n return part\n}\n\nfunction askPermission(state: State, item: Permit): void {\n const tool = startTool(state, item.ref)\n\n const id = take(state, \"perm\", \"perm\")\n state.perms.set(id, {\n ref: item.ref,\n done: item.done,\n })\n\n present(state, [], {\n type: \"permission\",\n request: {\n id,\n sessionID: state.id,\n action: item.permission,\n resources: item.patterns,\n metadata: item.metadata ?? {},\n save: item.always,\n source: { type: \"tool\", messageID: item.ref.msg, id: item.ref.call },\n tool,\n },\n })\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n output: string\n metadata?: Record<string, JsonValue>\n },\n): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n const part: SessionMessageAssistantTool = {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n content: [{ type: \"text\", text: output.output }],\n metadata: output.metadata,\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n }\n present(state, [toolCommit(part, ref.msg, toolFinalPhase(part))])\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n present(state, [\n toolCommit(\n {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error: { type: \"unknown\", message: error },\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n },\n ref.msg,\n \"final\",\n ),\n ])\n}\n\nfunction emitError(state: State, text: string): void {\n present(state, [{ kind: \"error\", source: \"system\", text, phase: \"start\" }])\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"shell\", {\n command: \"git status\",\n workdir: process.cwd(),\n description: \"Show git status\",\n })\n startTool(state, ref)\n await wait(70, signal)\n doneTool(state, ref, {\n output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exit: 0,\n },\n })\n}\n\nfunction emitWrite(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"write\", {\n path: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {},\n })\n}\n\nfunction emitEdit(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"edit\", {\n path: file,\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n file,\n status: \"modified\",\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\n ],\n },\n })\n}\n\nfunction emitPatch(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"patch\", {\n patchText: \"*** Begin Patch\\n*** End Patch\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n status: \"modified\",\n file,\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n status: \"added\",\n file: path.join(process.cwd(), \"README-demo.md\"),\n patch: \"@@ -0,0 +1,4 @@\\n+# Demo\\n+This is a generated preview file.\\n\",\n deletions: 0,\n },\n ],\n },\n })\n}\n\nfunction emitTask(state: State): void {\n const ref = make(state, \"subagent\", {\n description: \"Scan run/* for reducer touchpoints\",\n agent: \"explore\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n sessionID: \"ses_demo_child\",\n status: \"completed\",\n output: \"\",\n },\n })\n const part = {\n type: \"tool\",\n id: \"sub_demo_call_1\",\n name: \"read\",\n state: {\n status: \"running\",\n input: {\n path: \"packages/tui/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n metadata: {},\n },\n time: { created: Date.now(), ran: Date.now() },\n } satisfies SessionMessageAssistantTool\n showSubagent(state, {\n sessionID: \"ses_demo_child\",\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\n commits: [\n {\n kind: \"user\",\n text: \"Scan run/* for reducer touchpoints\",\n phase: \"start\",\n source: \"system\",\n },\n {\n kind: \"reasoning\",\n text: \"Thinking: tracing reducer and footer boundaries\",\n phase: \"progress\",\n source: \"reasoning\",\n messageID: \"sub_demo_msg_reasoning\",\n partID: \"sub_demo_reasoning_1\",\n },\n toolCommit(part, \"sub_demo_msg_tool\", \"start\"),\n {\n kind: \"assistant\",\n text: \"Footer updates flow through stream.ts into RunFooter\",\n phase: \"progress\",\n source: \"assistant\",\n messageID: \"sub_demo_msg_text\",\n partID: \"sub_demo_text_1\",\n },\n ],\n })\n}\n\nfunction emitQuestionTool(state: State): void {\n const ref = make(state, \"question\", {\n questions: [\n {\n header: \"Style\",\n question: \"Which output style do you want to inspect?\",\n options: [\n { label: \"Diff\", description: \"Show diff block\" },\n { label: \"Code\", description: \"Show code block\" },\n ],\n multiple: false,\n custom: false,\n },\n {\n header: \"Extras\",\n question: \"Pick extra rows\",\n options: [\n { label: \"Usage\", description: \"Add usage row\" },\n { label: \"Duration\", description: \"Add duration row\" },\n ],\n multiple: true,\n custom: true,\n },\n ],\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n answers: [[\"Diff\"], [\"Usage\", \"custom-note\"]],\n },\n })\n}\n\nfunction emitPermission(state: State, kind: PermissionKind = \"edit\"): void {\n const root = process.cwd()\n const file = path.join(root, \"src\", \"demo-format.ts\")\n\n if (kind === \"shell\") {\n const command = \"git status --short\"\n const ref = make(state, \"shell\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"shell\",\n patterns: [command],\n always: [\"*\"],\n done: {\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exit: 0,\n },\n },\n })\n return\n }\n\n if (kind === \"read\") {\n const target = path.join(root, \"package.json\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 80,\n })\n askPermission(state, {\n ref,\n permission: \"read\",\n patterns: [target],\n always: [target],\n done: {\n output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"subagent\") {\n const ref = make(state, \"subagent\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n agent: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"subagent\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n output: \"\",\n metadata: {\n sessionID: \"sub_demo_perm_1\",\n status: \"completed\",\n output: \"\",\n },\n },\n })\n return\n }\n\n if (kind === \"external\") {\n const dir = path.join(path.dirname(root), \"demo-shared\")\n const target = path.join(dir, \"README.md\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 40,\n })\n askPermission(state, {\n ref,\n permission: \"external_directory\",\n patterns: [`${dir}/**`],\n metadata: {\n parentDir: dir,\n filepath: target,\n },\n always: [`${dir}/**`],\n done: {\n output: `1: # External demo\\n2: Shared preview file\\nPath: ${target}`,\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"doom\") {\n const ref = make(state, \"subagent\", {\n description: \"Retry the formatter after repeated failures\",\n agent: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\n output: \"Continuing after repeated failures.\\n\",\n metadata: {},\n },\n })\n return\n }\n\n const diff = \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\"\n const ref = make(state, \"edit\", {\n path: file,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n output: \"\",\n metadata: {\n files: [{ file, status: \"modified\", patch: diff }],\n },\n },\n })\n}\n\nfunction demoForm(kind: FormKind): { title: string; fields: MiniFormRequest[\"fields\"]; questions?: JsonValue[] } {\n if (kind === \"question\") {\n const questions: JsonValue[] = [\n {\n header: \"Layout\",\n question: \"Which footer view should be the reference for spacing checks?\",\n options: [\n { label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: true,\n },\n {\n header: \"Checks\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit an edit diff\" },\n { label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n return {\n title: \"Questions\",\n questions,\n fields: [\n {\n key: \"q0\",\n title: \"Layout\",\n description: \"Which footer view should be the reference for spacing checks?\",\n type: \"string\",\n options: [\n { value: \"Form\", label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { value: \"Prompt\", label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n custom: true,\n },\n {\n key: \"q1\",\n title: \"Checks\",\n description: \"Pick formatting previews\",\n type: \"multiselect\",\n options: [\n { value: \"Diff\", label: \"Diff\", description: \"Emit an edit diff\" },\n { value: \"Subagent\", label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n custom: true,\n },\n ],\n }\n }\n return {\n title: \"MCP authorization\",\n fields: [\n {\n key: \"authorization\",\n type: \"external\",\n url: \"https://example.com/opencode-demo\",\n title: \"Authorize demo MCP server\",\n description: \"Complete authorization in your browser\",\n },\n ],\n }\n}\n\nfunction emitForm(state: State, kind: FormKind = \"question\"): void {\n const form = demoForm(kind)\n const ref = make(state, kind === \"question\" ? \"question\" : \"mcp_demo\", {\n ...(form.questions ? { questions: form.questions } : { form: kind }),\n })\n startTool(state, ref)\n state.form++\n const request: MiniFormRequest = {\n id: `frm_demo_${state.form}`,\n sessionID: state.id,\n title: form.title,\n metadata:\n kind === \"question\"\n ? { kind: \"question\", tool: { messageID: ref.msg, id: ref.call } }\n : { kind: \"mcp\", message: `Synthetic ${kind} MCP elicitation` },\n fields: form.fields,\n }\n state.forms.set(request.id, { ref, kind, request })\n present(state, [], { type: \"form\", request })\n}\n\nasync function emitFmt(state: State, kind: string, body: string, signal?: AbortSignal): Promise<boolean> {\n if (kind === \"text\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"markdown\" || kind === \"md\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"table\") {\n await emitText(state, body || SAMPLE_TABLE, signal)\n return true\n }\n\n if (kind === \"reasoning\") {\n await emitReasoning(state, body || \"Planning next steps [REDACTED] while preserving reducer ordering.\", signal)\n return true\n }\n\n if (kind === \"shell\") {\n await emitBash(state, signal)\n return true\n }\n\n if (kind === \"write\") {\n emitWrite(state)\n return true\n }\n\n if (kind === \"edit\") {\n emitEdit(state)\n return true\n }\n\n if (kind === \"patch\") {\n emitPatch(state)\n return true\n }\n\n if (kind === \"subagent\") {\n emitTask(state)\n return true\n }\n\n if (kind === \"question\") {\n emitQuestionTool(state)\n return true\n }\n\n if (kind === \"error\") {\n emitError(state, body || \"demo error event\")\n return true\n }\n\n if (kind === \"mix\") {\n await emitText(state, SAMPLE_MARKDOWN, signal)\n await wait(50, signal)\n await emitReasoning(state, \"Thinking through formatter edge cases [REDACTED].\", signal)\n await wait(50, signal)\n await emitBash(state, signal)\n emitWrite(state)\n emitEdit(state)\n emitPatch(state)\n emitTask(state)\n emitQuestionTool(state)\n emitError(state, \"demo mixed scenario error\")\n return true\n }\n\n return false\n}\n\nfunction intro(state: State): void {\n note(\n state.footer,\n [\n \"Demo slash commands enabled for interactive mode.\",\n `- /permission [kind] (${PERMISSIONS.join(\", \")})`,\n `- /form [kind] (${FORMS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission shell\",\n \"- /form question\",\n \"- /form external\",\n \"- /fmt markdown\",\n \"- /fmt table\",\n \"- /fmt text your custom text\",\n ].join(\"\\n\"),\n )\n}\n\nexport function createRunDemo(input: Input) {\n const state: State = {\n id: input.sessionID,\n thinking: input.thinking,\n footer: input.footer,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n form: 0,\n perms: new Map(),\n forms: new Map(),\n started: new Set(),\n }\n\n const start = async (): Promise<void> => {\n intro(state)\n }\n\n const prompt = async (line: RunPrompt, signal?: AbortSignal): Promise<boolean> => {\n const text = line.text.trim()\n const head = parseSlashHead(text)\n const list = head?.arguments.split(/\\s+/).filter(Boolean) ?? []\n const cmd = head ? `/${head.name}` : \"\"\n\n clearSubagent(state.footer)\n\n if (cmd === \"/help\") {\n intro(state)\n return true\n }\n\n if (cmd === \"/permission\") {\n const kind = permissionKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a permission kind: ${PERMISSIONS.join(\", \")}`)\n return true\n }\n\n emitPermission(state, kind)\n return true\n }\n\n if (cmd === \"/form\") {\n const kind = formKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a form kind: ${FORMS.join(\", \")}`)\n return true\n }\n\n emitForm(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[0] || \"\").toLowerCase()\n const body = list.slice(1).join(\" \")\n if (!kind) {\n note(state.footer, `Pick a kind: ${KINDS.join(\", \")}`)\n return true\n }\n\n const ok = await emitFmt(state, kind, body, signal)\n if (ok) {\n return true\n }\n\n note(state.footer, `Unknown kind \"${kind}\". Use: ${KINDS.join(\", \")}`)\n return true\n }\n\n return false\n }\n\n const permission = (input: PermissionReply): boolean => {\n const item = state.perms.get(input.requestID)\n if (!item || !input.reply) {\n return false\n }\n\n state.perms.delete(input.requestID)\n clearBlocker(state)\n\n if (input.reply === \"reject\") {\n failTool(state, item.ref, input.message || \"permission rejected\")\n return true\n }\n\n doneTool(state, item.ref, item.done)\n return true\n }\n\n const formReply = (input: FormReply): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n if (form.kind === \"question\") {\n doneTool(state, form.ref, {\n output: \"\",\n metadata: {\n answers: form.request.fields.map((field) => {\n const value = input.answer[field.key]\n if (value === undefined) return []\n return Array.isArray(value) ? [...value] : [String(value)]\n }),\n },\n })\n return true\n }\n doneTool(state, form.ref, {\n output: `Form submitted: ${Object.entries(input.answer)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\", \") : String(value)}`)\n .join(\"; \")}\\n`,\n metadata: { answer: input.answer },\n })\n return true\n }\n\n const formCancel = (input: FormCancel): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n failTool(state, form.ref, \"form cancelled\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n formReply,\n formCancel,\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "CC9558C95677DC1264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/workspace/driver.ts", "../core/src/workspace/sql.ts", "../core/src/workspace.ts", "../core/src/environment/files.ts", "../core/src/environment/exec-defaults.ts", "../core/src/environment/local.ts", "../core/src/environment/memory.ts", "../core/src/environment/environment.ts", "../core/src/environment/index.ts"], | ||
| "sourcesContent": [ | ||
| "export * as WorkspaceDriver from \"./driver.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport type { Scope } from \"effect\"\nimport type { Driver as EnvironmentDriver } from \"../environment/driver.js\"\n\n/**\n * Smallest provider-owned JSON value required to reconnect to the same\n * provider resource. Core stores it opaquely and hands it back; only the\n * owning driver reads inside.\n */\nexport const Binding = Schema.Record(Schema.String, Schema.Json)\nexport type Binding = typeof Binding.Type\n\nexport class Error extends Schema.TaggedError<Error>()(\"WorkspaceDriver.Error\", {\n message: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {}\n\nexport class ProviderNotFound extends Schema.TaggedError<ProviderNotFound>()(\"WorkspaceDriver.ProviderNotFound\", {\n provider: Schema.String,\n}) {}\n\nexport interface Interface {\n readonly create: (input: {\n readonly workspaceID: Workspace.ID\n }) => Effect.Effect<{ readonly binding: Binding }, Error>\n readonly connect: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<EnvironmentDriver, Error, Scope.Scope>\n readonly suspendForIdle: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<void, Error>\n readonly destroy: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n }) => Effect.Effect<void, Error>\n}\n\nexport const make = (driver: Interface) => driver\n\nexport interface Registry {\n readonly get: (provider: string) => Effect.Effect<Interface, ProviderNotFound>\n}\n\nexport class RegistryService extends Context.Service<RegistryService, Registry>()(\n \"@opencode/WorkspaceDriverRegistry\",\n) {}\n\nexport const registry = (drivers: Readonly<Record<string, Interface>>): Registry => ({\n get: (provider) => {\n const driver = Object.hasOwn(drivers, provider) ? drivers[provider] : undefined\n return driver ? Effect.succeed(driver) : Effect.fail(new ProviderNotFound({ provider }))\n },\n})\n\nexport const registryNode = (drivers: Readonly<Record<string, Interface>>) =>\n makeGlobalNode({\n service: RegistryService,\n layer: Layer.succeed(RegistryService, RegistryService.of(registry(drivers))),\n deps: [],\n })\n\nexport const node = registryNode({})\n", | ||
| "import { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\"\nimport type { WorkspaceDriver } from \"./driver.js\"\n\nexport const WorkspaceTable = sqliteTable(\"workspace\", {\n id: text().$type<Workspace.ID>().primaryKey(),\n provider: text().notNull(),\n binding: text({ mode: \"json\" }).$type<WorkspaceDriver.Binding>().notNull(),\n created_at: integer().notNull(),\n last_used_at: integer().notNull(),\n})\n", | ||
| "export * as Workspace from \"./workspace.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { eq } from \"drizzle-orm\"\nimport { Clock, Context, Duration, Effect, Exit, Layer, Ref, Schedule, Schema, Scope } from \"effect\"\nimport { systemError } from \"effect/PlatformError\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver as EnvironmentDriver } from \"./environment/driver.js\"\nimport { Database } from \"./database/database.js\"\nimport { KeyedMutex } from \"./effect/keyed-mutex.js\"\nimport { WorkspaceDriver } from \"./workspace/driver.js\"\nimport { WorkspaceTable } from \"./workspace/sql.js\"\n\nexport const ID = Workspace.ID\nexport type ID = Workspace.ID\n\nexport class Info extends Schema.Class<Info>(\"Workspace.Info\")({\n id: ID,\n provider: Schema.String,\n binding: WorkspaceDriver.Binding,\n createdAt: Schema.Number,\n lastUsedAt: Schema.Number,\n}) {}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Workspace.NotFound\", { workspaceID: ID }) {}\n\nexport interface Interface {\n readonly create: (provider: string) => Effect.Effect<Info, WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly connect: (\n workspaceID: ID,\n ) => Effect.Effect<EnvironmentDriver, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly destroy: (\n workspaceID: ID,\n ) => Effect.Effect<void, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n}\n\nexport interface Options {\n readonly idleThreshold?: Duration.Input\n readonly pollInterval?: Duration.Input\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Workspace\") {}\n\ninterface Connection {\n readonly driver: WorkspaceDriver.Interface\n readonly environment: EnvironmentDriver\n readonly saveBinding: (binding: WorkspaceDriver.Binding) => Effect.Effect<void>\n readonly lastActivity: Ref.Ref<number>\n readonly active: Ref.Ref<number>\n readonly scope: Scope.Closeable\n}\n\nexport const configured = (options: Options = {}) =>\n makeGlobalNode({\n service: Service,\n layer: layer(options),\n deps: [Database.node, WorkspaceDriver.node],\n })\n\nconst layer = (options: Options) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const db = (yield* Database.Service).db\n const registry = yield* WorkspaceDriver.RegistryService\n const lifetime = yield* Scope.Scope\n const connections = new Map<ID, Connection>()\n const locks = KeyedMutex.makeUnsafe<ID>()\n const idleThreshold = Duration.toMillis(options.idleThreshold ?? Duration.minutes(20))\n\n const load = Effect.fn(\"Workspace.load\")(function* (workspaceID: ID) {\n const row = yield* db\n .select()\n .from(WorkspaceTable)\n .where(eq(WorkspaceTable.id, workspaceID))\n .get()\n .pipe(Effect.orDie)\n if (!row) return yield* new NotFound({ workspaceID })\n return row\n })\n\n const open = Effect.fn(\"Workspace.open\")(function* (workspaceID: ID) {\n const existing = connections.get(workspaceID)\n if (existing) return existing\n\n const row = yield* load(workspaceID)\n const driver = yield* registry.get(row.provider)\n const saveBinding = (value: WorkspaceDriver.Binding) =>\n db\n .update(WorkspaceTable)\n .set({ binding: value })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n const scope = yield* Scope.fork(lifetime)\n const environment = yield* driver.connect({ workspaceID, binding: row.binding, saveBinding }).pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n )\n const now = yield* Clock.currentTimeMillis\n const connection: Connection = {\n driver,\n environment,\n saveBinding,\n lastActivity: yield* Ref.make(now),\n active: yield* Ref.make(0),\n scope,\n }\n connections.set(workspaceID, connection)\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: now })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n return connection\n })\n\n yield* Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis\n yield* Effect.forEach(\n [...connections.entries()],\n ([workspaceID, expected]) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = connections.get(workspaceID)\n if (connection !== expected || (yield* Ref.get(connection.active)) > 0) return\n const lastActivity = yield* Ref.get(connection.lastActivity)\n if (now - lastActivity < idleThreshold) return\n const row = yield* load(workspaceID)\n // Deliberate: a racing spawn blocks, then wakes cleanly. Unlocking mid-suspend could reattach a sandbox being terminated.\n yield* connection.driver.suspendForIdle({\n workspaceID,\n binding: row.binding,\n saveBinding: connection.saveBinding,\n })\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: lastActivity })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n connections.delete(workspaceID)\n yield* Scope.close(connection.scope, Exit.void)\n }).pipe(Effect.catchCause((cause) => Effect.logError(\"workspace idle suspension failed\", cause))),\n ),\n { concurrency: \"unbounded\", discard: true },\n )\n }).pipe(Effect.repeat(Schedule.spaced(options.pollInterval ?? Duration.minutes(1))), Effect.forkScoped)\n\n return Service.of({\n create: Effect.fn(\"Workspace.create\")(function* (provider) {\n const driver = yield* registry.get(provider)\n const workspaceID = ID.create()\n const result = yield* driver.create({ workspaceID })\n const now = yield* Clock.currentTimeMillis\n yield* db\n .insert(WorkspaceTable)\n .values({ id: workspaceID, provider, binding: result.binding, created_at: now, last_used_at: now })\n .run()\n .pipe(Effect.orDie)\n return new Info({ id: workspaceID, provider, binding: result.binding, createdAt: now, lastUsedAt: now })\n }),\n connect: Effect.fn(\"Workspace.connect\")(function* (workspaceID) {\n const spawner = make((command) =>\n Effect.acquireRelease(\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = yield* open(workspaceID).pipe(\n Effect.mapError((cause) =>\n systemError({\n _tag: \"Unknown\",\n module: \"Workspace\",\n method: \"spawn\",\n description: `Failed to wake workspace ${workspaceID}`,\n cause,\n }),\n ),\n )\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n yield* Ref.update(connection.active, (active) => active + 1)\n return connection\n }),\n ),\n (connection) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n yield* Ref.update(connection.active, (active) => active - 1)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n }),\n ),\n ).pipe(Effect.flatMap((connection) => connection.environment.spawner.spawn(command))),\n )\n // Overrides are connection-bound; per-spawn routing is required before any driver ships them, so they are deliberately omitted.\n return { spawner }\n }),\n destroy: Effect.fn(\"Workspace.destroy\")(function* (workspaceID) {\n yield* locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* load(workspaceID)\n const connection = connections.get(workspaceID)\n connections.delete(workspaceID)\n if (connection) yield* Scope.close(connection.scope, Exit.void)\n const driver = yield* registry.get(row.provider)\n yield* driver.destroy({ workspaceID, binding: row.binding })\n yield* db.delete(WorkspaceTable).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n }),\n )\n }),\n })\n }),\n )\n\nexport const node = configured()\n\n// TODO(workspace-plan): add the boot janitor and ~23h safety snapshot rotation in a later PR.\n// TODO(workspace-plan): make cold wake interruptible with a re-pin loop against janitor races.\n// TODO(workspace-plan): consider RcMap at end-of-series consolidation; idle suspend and destroy need distinct finalizers.\n", | ||
| "import { Effect, Schema } from \"effect\"\n\nexport const FileType = Schema.Literals([\"file\", \"directory\", \"symlink\", \"other\"])\nexport type FileType = typeof FileType.Type\n\nexport interface FileInfo {\n readonly type: FileType\n readonly size: number\n readonly mtimeMs: number\n}\n\nexport interface DirEntry {\n readonly name: string\n readonly type: FileType\n}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Environment.NotFound\", {\n path: Schema.String,\n}) {}\n\nexport class WrongKind extends Schema.TaggedError<WrongKind>()(\"Environment.WrongKind\", {\n path: Schema.String,\n actual: FileType,\n}) {}\n\nexport class Failed extends Schema.TaggedError<Failed>()(\"Environment.Failed\", {\n path: Schema.String,\n cause: Schema.Defect(),\n}) {}\n\nexport interface FilesImpl {\n /**\n * Content operations (`read`, `list`) follow final symlinks; metadata operations (`stat` and entry\n * tags returned by `list`) do not. `info` describes the target file whose bytes are returned.\n * The process-backed default caps collected output at 64 MiB; larger whole-file reads fail with\n * `Failed`, so callers must use ranges for larger files.\n */\n readonly read: (\n path: string,\n range?: { readonly offset: number; readonly length: number },\n ) => Effect.Effect<{ readonly info: FileInfo; readonly bytes: Uint8Array }, NotFound | WrongKind | Failed>\n readonly write: (path: string, bytes: Uint8Array) => Effect.Effect<void, Failed>\n /** Describes the path entry itself, so a final symlink is reported as `symlink` rather than followed. */\n readonly stat: (path: string) => Effect.Effect<FileInfo, NotFound | Failed>\n /** Follows a final symlink to the listed directory while preserving each returned entry's own type. */\n readonly list: (path: string) => Effect.Effect<ReadonlyArray<DirEntry>, NotFound | WrongKind | Failed>\n readonly remove: (path: string) => Effect.Effect<void, Failed>\n readonly move: (from: string, to: string) => Effect.Effect<void, NotFound | Failed>\n readonly mkdir: (path: string) => Effect.Effect<void, Failed>\n}\n\nexport interface Files extends FilesImpl {}\n\n/**\n * Derives a follow-stat kind from the lstat-like Files contract. A dangling\n * symlink fails with `NotFound`.\n */\nexport const typeFollowing = (files: Files, path: string) =>\n files.stat(path).pipe(\n Effect.flatMap((info) =>\n info.type === \"symlink\"\n ? files.read(path, { offset: 0, length: 0 }).pipe(\n Effect.map((result) => result.info.type),\n Effect.catchTag(\"Environment.WrongKind\", (error) => Effect.succeed(error.actual)),\n )\n : Effect.succeed(info.type),\n ),\n )\n\nexport * as EnvironmentFiles from \"./files.js\"\n", | ||
| "import { Effect, Stream } from \"effect\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { collectStream } from \"@opencode-ai/util/process\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FileType, type FilesImpl } from \"./files.js\"\n\n/**\n * Files derived from spawning processes: one process per intent, \"$1\" is\n * always the target path. Scripts report classification through an exit-code\n * protocol (44/45/46) so failures never require parsing localized error text;\n * LC_ALL=C pins the one stderr match that remains. Requires GNU coreutils and\n * findutils in the target image — BSD and busybox userlands will not work.\n * Malformed output from these scripts is our own bug and dies as a defect.\n */\n\nconst MAX_DATA_BYTES = 64 * 1024 * 1024\nconst MAX_ERROR_BYTES = 64 * 1024\nconst NOT_FOUND = 44\nconst WRONG_KIND = 45\nconst FAILED = 46\nconst TAB = \"\\t\"\n\nconst loadMetadata = (flags = \"\") => `\nmetadata=$(stat ${flags} -c '%F${TAB}%s${TAB}%Y' -- \"$1\" 2>&1) || {\n case \"$metadata\" in\n *'No such file or directory'*|*'Not a directory'*) exit ${NOT_FOUND} ;;\n *) printf '%s' \"$metadata\" >&2; exit ${FAILED} ;;\n esac\n}\n`\n\nconst statScript = `\n${loadMetadata()}\nprintf '%s\\n' \"$metadata\"\n`\n\nconst readScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != 'regular file' ] && [ \"$kind\" != 'regular empty file' ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nprintf '%s\\n' \"$metadata\"\nif [ \"$2\" = range ]; then\n dd if=\"$1\" iflag=skip_bytes,count_bytes skip=\"$3\" count=\"$4\" status=none\nelse\n cat -- \"$1\"\nfi\n`\n\nconst listScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != directory ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nfind -H \"$1\" -mindepth 1 -maxdepth 1 -printf '%y\\\\0%f\\\\0'\n`\n\nconst moveScript = `\n${loadMetadata()}\nmv -- \"$1\" \"$2\"\n`\n\ninterface Result {\n readonly exitCode: number\n readonly stdout: Uint8Array\n readonly stderr: Uint8Array\n}\n\nexport const execDefaults = (spawner: ChildProcessSpawner[\"Service\"]): FilesImpl => {\n const run = (\n path: string,\n script: string,\n args: ReadonlyArray<string> = [],\n stdin?: Uint8Array,\n ): Effect.Effect<Result, Failed> =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\"sh\", [\"-c\", script, \"sh\", path, ...args], {\n env: { LC_ALL: \"C\" },\n extendEnv: true,\n stdin: stdin === undefined ? undefined : Stream.make(stdin),\n })\n const handle = yield* spawner.spawn(command).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, MAX_DATA_BYTES),\n collectStream(handle.stderr, MAX_ERROR_BYTES),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n if (stdout.truncated || stderr.truncated) {\n return yield* new Failed({ path, cause: new Error(\"Process output exceeded its collection limit\") })\n }\n return { exitCode, stdout: stdout.buffer, stderr: stderr.buffer }\n }),\n )\n\n const classify = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n ): Effect.Effect<A, NotFound | WrongKind | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n if (result.exitCode === WRONG_KIND) {\n return Effect.fail(new WrongKind({ path, actual: parseType(new TextDecoder().decode(result.stderr)) }))\n }\n return Effect.fail(processFailure(path, result))\n }\n\n const complete = (path: string, result: Result) =>\n result.exitCode === 0 ? Effect.void : Effect.fail(processFailure(path, result))\n\n return {\n stat: (path) => run(path, statScript).pipe(Effect.flatMap((result) => classifyPlain(path, result, parseInfo))),\n read: (path, range) =>\n run(\n path,\n readScript,\n range === undefined ? [\"whole\"] : [\"range\", String(range.offset), String(range.length)],\n ).pipe(\n Effect.flatMap((result) =>\n classify(path, result, (stdout) => {\n const newline = stdout.indexOf(10)\n if (newline < 0) throw new Error(\"Missing read metadata header\")\n return {\n info: parseInfo(stdout.slice(0, newline)),\n bytes: stdout.slice(newline + 1),\n }\n }),\n ),\n ),\n write: (path, bytes) =>\n run(path, `mkdir -p \"$(dirname \"$1\")\" && cat > \"$1\"`, [], bytes).pipe(\n Effect.flatMap((result) => complete(path, result)),\n ),\n list: (path) => run(path, listScript).pipe(Effect.flatMap((result) => classify(path, result, parseList))),\n remove: (path) => run(path, `rm -rf -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n move: (from, to) =>\n run(from, moveScript, [to]).pipe(Effect.flatMap((result) => classifyPlain(from, result, () => undefined))),\n mkdir: (path) => run(path, `mkdir -p -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n }\n}\n\n/** `classify` for scripts whose protocol never reports WrongKind. */\nconst classifyPlain = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n): Effect.Effect<A, NotFound | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n return Effect.fail(processFailure(path, result))\n}\n\nconst processFailure = (path: string, result: Result) =>\n new Failed({\n path,\n cause: new Error(new TextDecoder().decode(result.stderr).trim() || `Process exited with code ${result.exitCode}`),\n })\n\nconst parseInfo = (bytes: Uint8Array): FileInfo => {\n const [rawType, rawSize, rawMtime] = new TextDecoder().decode(bytes).trim().split(TAB)\n const size = Number(rawSize)\n const mtimeMs = Number(rawMtime) * 1_000\n if (!rawType || !Number.isFinite(size) || !Number.isFinite(mtimeMs)) throw new Error(\"Invalid stat output\")\n return { type: parseType(rawType), size, mtimeMs }\n}\n\nconst parseType = (value: string): FileType => {\n if (value === \"regular file\" || value === \"regular empty file\" || value === \"f\") return \"file\"\n if (value === \"directory\" || value === \"d\") return \"directory\"\n if (value === \"symbolic link\" || value === \"l\") return \"symlink\"\n return \"other\"\n}\n\nconst parseList = (bytes: Uint8Array) => {\n const fields = new TextDecoder().decode(bytes).split(\"\\0\")\n fields.pop()\n if (fields.length % 2 !== 0) throw new Error(\"Invalid find output\")\n return Array.from({ length: fields.length / 2 }, (_, index) => ({\n name: fields[index * 2 + 1],\n type: parseType(fields[index * 2]),\n }))\n}\n\nexport * as EnvironmentExecDefaults from \"./exec-defaults.js\"\n", | ||
| "import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Effect } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\n/**\n * The host filesystem binding. Deliberately raw node:fs rather than effect's\n * FileSystem service or FSUtil: the contract needs lstat semantics (stat\n * reports \"symlink\") and typed directory entries, and effect's node\n * FileSystem provides neither — its stat always follows symlinks and\n * readDirectory returns names only. FSUtil hits the same gap and its\n * readDirectoryEntries already bypasses to raw node readdir internally.\n * Nothing above the environment seam touches node:fs.\n */\nexport const makeLocalDriver = (spawner: ChildProcessSpawner[\"Service\"]): Driver => {\n const overrides: FilesImpl = {\n read: (value, range) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"file\") return yield* new WrongKind({ path: value, actual: info.type })\n if (range === undefined) {\n const bytes = yield* attempt(value, () => fs.readFile(value), true)\n return { info, bytes }\n }\n const bytes = yield* attempt(\n value,\n async () => {\n const handle = await fs.open(value, \"r\")\n try {\n const buffer = new Uint8Array(range.length)\n const result = await handle.read(buffer, 0, range.length, range.offset)\n return buffer.subarray(0, result.bytesRead)\n } finally {\n await handle.close()\n }\n },\n true,\n )\n return { info, bytes }\n }),\n stat: (value) => stat(value, false),\n list: (value) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"directory\") return yield* new WrongKind({ path: value, actual: info.type })\n const entries = yield* attempt(value, () => fs.readdir(value, { withFileTypes: true }), true)\n return entries.map((entry) => ({ name: entry.name, type: fileType(entry) }))\n }),\n write: (value, bytes) =>\n attempt(value, async () => {\n await fs.mkdir(path.dirname(value), { recursive: true })\n await fs.writeFile(value, bytes)\n }),\n remove: (value) => attempt(value, () => fs.rm(value, { recursive: true, force: true })),\n move: (from, to) =>\n Effect.gen(function* () {\n yield* stat(from, false)\n const destination = yield* stat(to, false).pipe(\n Effect.map((info) => (info.type === \"directory\" ? path.join(to, path.basename(from)) : to)),\n Effect.catchIf(\n (error) => error instanceof NotFound,\n () => Effect.succeed(to),\n ),\n )\n yield* attempt(from, () => fs.rename(from, destination))\n }),\n mkdir: (value) => attempt(value, () => fs.mkdir(value, { recursive: true }).then(() => undefined)),\n }\n\n return { spawner, overrides }\n}\n\nconst stat = (value: string, follow: boolean) =>\n attempt(value, () => (follow ? fs.stat(value) : fs.lstat(value)), true).pipe(\n Effect.map((stats): FileInfo => ({ type: fileType(stats), size: stats.size, mtimeMs: stats.mtimeMs })),\n )\n\nconst fileType = (entry: { isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean }): FileType => {\n if (entry.isFile()) return \"file\"\n if (entry.isDirectory()) return \"directory\"\n if (entry.isSymbolicLink()) return \"symlink\"\n return \"other\"\n}\n\nfunction attempt<A>(value: string, run: () => Promise<A>): Effect.Effect<A, Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing: true): Effect.Effect<A, NotFound | Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing = false) {\n return Effect.tryPromise({\n try: run,\n catch: (cause) =>\n missing && isMissing(cause) ? new NotFound({ path: value }) : new Failed({ path: value, cause }),\n })\n}\n\nconst isMissing = (cause: unknown) =>\n cause !== null &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\")\n\nexport * as EnvironmentLocal from \"./local.js\"\n", | ||
| "import path from \"node:path\"\nimport { Effect, PlatformError } from \"effect\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\ntype Node =\n | { readonly type: \"file\"; readonly bytes: Uint8Array; readonly mtimeMs: number }\n | { readonly type: \"directory\"; readonly mtimeMs: number }\n | { readonly type: \"symlink\"; readonly target: string; readonly mtimeMs: number }\n\nexport interface MemoryDriver extends Driver {\n readonly symlink: (target: string, path: string) => Effect.Effect<void, Failed>\n}\n\nexport const makeMemoryDriver = (): MemoryDriver => {\n const nodes = new Map<string, Node>([[\"/\", { type: \"directory\", mtimeMs: Date.now() }]])\n const key = (value: string) => path.posix.resolve(\"/\", value)\n const info = (node: Node): FileInfo => ({\n type: node.type,\n size:\n node.type === \"file\"\n ? node.bytes.length\n : node.type === \"symlink\"\n ? new TextEncoder().encode(node.target).length\n : 0,\n mtimeMs: node.mtimeMs,\n })\n const resolveKey = (value: string, followFinal: boolean, seen = new Set<string>()): string | undefined => {\n const normalized = key(value)\n const parts = normalized.split(\"/\").filter(Boolean)\n const base = \"/\"\n const walk = (current: string, index: number): string | undefined => {\n if (index === parts.length) return current\n const part = parts[index]\n const candidate = path.posix.join(current, part)\n const node = nodes.get(candidate)\n if (node?.type !== \"symlink\" || (!followFinal && index === parts.length - 1)) return walk(candidate, index + 1)\n if (seen.has(candidate)) return undefined\n seen.add(candidate)\n const target = path.posix.resolve(path.posix.dirname(candidate), node.target)\n return resolveKey(path.posix.join(target, ...parts.slice(index + 1)), followFinal, seen)\n }\n return walk(base, 0)\n }\n const lookup = (value: string) => nodes.get(resolveKey(value, false) ?? key(value))\n const requireParent = (value: string) => {\n const parentPath = path.posix.dirname(key(value))\n const parent = nodes.get(resolveKey(parentPath, true) ?? parentPath)\n if (!parent) throw new Error(`Parent directory does not exist: ${path.posix.dirname(value)}`)\n if (parent.type !== \"directory\") throw new Error(`Parent is not a directory: ${path.posix.dirname(value)}`)\n }\n const mkdirSync = (value: string) => {\n const target = resolveKey(value, false) ?? key(value)\n const existing = nodes.get(target)\n if (existing?.type === \"directory\") return\n if (existing) throw new Error(`Path is not a directory: ${value}`)\n const parent = path.posix.dirname(target)\n if (parent !== target) mkdirSync(parent)\n nodes.set(target, { type: \"directory\", mtimeMs: Date.now() })\n }\n const failed = (value: string, cause: unknown) => new Failed({ path: value, cause })\n const overrides: FilesImpl = {\n stat: (value) => {\n const node = lookup(value)\n return node ? Effect.succeed(info(node)) : Effect.fail(new NotFound({ path: value }))\n },\n read: (value, range) => {\n const original = lookup(value)\n if (!original) return Effect.fail(new NotFound({ path: value }))\n if (original.type === \"directory\") return Effect.fail(new WrongKind({ path: value, actual: \"directory\" }))\n const resolved = resolveKey(value, true)\n const node = resolved === undefined ? undefined : nodes.get(resolved)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"file\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const bytes = range === undefined ? node.bytes : node.bytes.subarray(range.offset, range.offset + range.length)\n return Effect.succeed({ info: info(node), bytes: bytes.slice() })\n },\n write: (value, bytes) =>\n Effect.try({\n try: () => {\n mkdirSync(path.posix.dirname(key(value)))\n const existing = lookup(value)\n if (existing?.type === \"directory\") throw new Error(`Path is a directory: ${value}`)\n const target = existing?.type === \"symlink\" ? resolveKey(value, true) : resolveKey(value, false)\n if (!target) throw new Error(`Cannot resolve symlink: ${value}`)\n requireParent(target)\n nodes.set(target, { type: \"file\", bytes: bytes.slice(), mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n list: (value) => {\n const target = resolveKey(value, true) ?? key(value)\n const node = nodes.get(target)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"directory\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const entries = [...nodes.entries()]\n .filter(([entry]) => entry !== target && path.posix.dirname(entry) === target)\n .map(([entry, child]) => ({ name: path.posix.basename(entry), type: child.type satisfies FileType }))\n .sort((a, b) => a.name.localeCompare(b.name))\n return Effect.succeed(entries)\n },\n remove: (value) =>\n Effect.sync(() => {\n const target = resolveKey(value, false) ?? key(value)\n for (const entry of nodes.keys()) {\n if (entry === target || entry.startsWith(`${target}/`)) nodes.delete(entry)\n }\n }),\n move: (from, to) => {\n const source = resolveKey(from, false) ?? key(from)\n const node = nodes.get(source)\n if (!node) return Effect.fail(new NotFound({ path: from }))\n return Effect.try({\n try: () => {\n const requested = resolveKey(to, false) ?? key(to)\n const destination =\n nodes.get(requested)?.type === \"directory\"\n ? path.posix.join(requested, path.posix.basename(source))\n : requested\n if (node.type === \"directory\" && destination.startsWith(`${source}/`)) {\n throw new Error(`Cannot move a directory into itself: ${from}`)\n }\n const existing = nodes.get(destination)\n if (node.type === \"directory\" && existing && existing.type !== \"directory\") {\n throw new Error(`Cannot overwrite a non-directory with a directory: ${to}`)\n }\n requireParent(destination)\n const moved = [...nodes.entries()].filter(([entry]) => entry === source || entry.startsWith(`${source}/`))\n for (const [entry] of moved) nodes.delete(entry)\n for (const [entry, child] of moved) nodes.set(`${destination}${entry.slice(source.length)}`, child)\n },\n catch: (cause) => failed(from, cause),\n })\n },\n mkdir: (value) => Effect.try({ try: () => mkdirSync(value), catch: (cause) => failed(value, cause) }),\n }\n\n const spawner = make((command) =>\n Effect.suspend(() => {\n const description = command._tag === \"StandardCommand\" ? command.command : \"pipeline\"\n return Effect.fail(\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"EnvironmentMemory\",\n method: \"spawn\",\n pathOrDescriptor: description,\n cause: failed(description, new Error(\"The memory driver cannot spawn processes\")),\n }),\n )\n }),\n )\n\n return {\n spawner,\n overrides,\n symlink: (target, value) =>\n Effect.try({\n try: () => {\n requireParent(value)\n nodes.set(resolveKey(value, false) ?? key(value), { type: \"symlink\", target, mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n }\n}\n\nexport * as EnvironmentMemory from \"./memory.js\"\n", | ||
| "import { CrossSpawnSpawner } from \"@opencode-ai/util/cross-spawn-spawner\"\nimport { makeLocationNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Files } from \"./files.js\"\nimport { makeFiles } from \"./index.js\"\nimport { makeLocalDriver } from \"./local.js\"\nimport { Location } from \"../location.js\"\nimport { Workspace } from \"../workspace.js\"\n\nexport interface Interface {\n readonly files: Files\n readonly spawner: ChildProcessSpawner[\"Service\"]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Environment\") {}\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n const location = yield* Location.Service\n const workspace = yield* Workspace.Service\n const driver = location.workspaceID\n ? yield* workspace.connect(location.workspaceID).pipe(\n // Environment has no error channel; an unknown or destroyed placement is a configuration defect by design.\n Effect.mapError(\n (cause) => new Error(`Failed to bind Environment to workspace ${location.workspaceID}`, { cause }),\n ),\n Effect.orDie,\n )\n : makeLocalDriver(spawner)\n return Service.of({ files: makeFiles(driver), spawner: driver.spawner })\n }),\n)\n\nexport const node = makeLocationNode({\n service: Service,\n layer,\n deps: [CrossSpawnSpawner.node, Location.node, Workspace.node],\n})\n\nexport * as EnvironmentService from \"./environment.js\"\n", | ||
| "export * as Environment from \"./index.js\"\n\nexport { type Driver } from \"./driver.js\"\nexport {\n type DirEntry,\n Failed,\n type FileInfo,\n type Files,\n type FilesImpl,\n type FileType,\n NotFound,\n typeFollowing,\n WrongKind,\n} from \"./files.js\"\nexport { execDefaults } from \"./exec-defaults.js\"\nexport { makeLocalDriver } from \"./local.js\"\nexport { makeMemoryDriver, type MemoryDriver } from \"./memory.js\"\nexport { type Interface, node, Service } from \"./environment.js\"\n\nimport type { Driver } from \"./driver.js\"\nimport { execDefaults } from \"./exec-defaults.js\"\nimport type { Files } from \"./files.js\"\n\nexport const makeFiles = (driver: Driver): Files => ({\n ...execDefaults(driver.spawner),\n ...driver.overrides,\n})\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "B8652C3F022CBC7064756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/connection.ts", "../schema/src/integration.ts", "../schema/src/money.ts", "../schema/src/provider.ts", "../schema/src/model.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Connection from \"./connection.js\"\n\nimport { Schema } from \"effect\"\nimport { Credential } from \"./credential.js\"\n\nexport interface CredentialInfo extends Schema.Schema.Type<typeof CredentialInfo> {}\nexport const CredentialInfo = Schema.Struct({\n type: Schema.Literal(\"credential\"),\n id: Credential.ID,\n label: Schema.String,\n}).annotate({ identifier: \"Connection.CredentialInfo\" })\n\nexport interface EnvInfo extends Schema.Schema.Type<typeof EnvInfo> {}\nexport const EnvInfo = Schema.Struct({\n type: Schema.Literal(\"env\"),\n name: Schema.String,\n}).annotate({ identifier: \"Connection.EnvInfo\" })\n\nexport const Info = Schema.Union([CredentialInfo, EnvInfo])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Connection.Info\" })\nexport type Info = typeof Info.Type\n", | ||
| "export * as Integration from \"./integration.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { Connection } from \"./connection.js\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\nimport { IntegrationID, IntegrationMethodID } from \"./integration-id.js\"\nimport { Form } from \"./form.js\"\n\nexport const ID = IntegrationID\nexport type ID = typeof ID.Type\n\nexport const MethodID = IntegrationMethodID\nexport type MethodID = typeof MethodID.Type\n\nexport interface OAuthMethod extends Schema.Schema.Type<typeof OAuthMethod> {}\nexport const OAuthMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"oauth\"),\n label: Schema.String,\n form: optional(Form.Fields),\n}).annotate({ identifier: \"Integration.OAuthMethod\" })\n\nexport interface CommandMethod extends Schema.Schema.Type<typeof CommandMethod> {}\nexport const CommandMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"command\"),\n label: Schema.String,\n command: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.CommandMethod\" })\n\nexport interface KeyMethod extends Schema.Schema.Type<typeof KeyMethod> {}\nexport const KeyMethod = Schema.Struct({\n type: Schema.Literal(\"key\"),\n label: optional(Schema.String),\n form: optional(Form.Fields),\n}).annotate({ identifier: \"Integration.KeyMethod\" })\n\nexport interface EnvMethod extends Schema.Schema.Type<typeof EnvMethod> {}\nexport const EnvMethod = Schema.Struct({\n type: Schema.Literal(\"env\"),\n names: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.EnvMethod\" })\n\nexport const Method = Schema.Union([OAuthMethod, CommandMethod, KeyMethod, EnvMethod])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Integration.Method\" })\nexport type Method = typeof Method.Type\n\nconst Updated = ephemeral({\n type: \"integration.updated\",\n schema: {},\n})\nconst ConnectionUpdated = ephemeral({\n type: \"integration.connection.updated\",\n schema: { integrationID: ID },\n})\nexport const Event = { Updated, ConnectionUpdated, Definitions: inventory(Updated, ConnectionUpdated) }\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n id: ID,\n name: Schema.String,\n}).annotate({ identifier: \"Integration.Ref\" })\n\nexport const Info = Schema.Struct({\n id: ID,\n name: Schema.String,\n methods: Schema.Array(Method),\n connections: Schema.Array(Connection.Info),\n}).annotate({ identifier: \"Integration.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const AttemptID = Schema.String.pipe(\n Schema.brand(\"Integration.AttemptID\"),\n statics((schema) => ({ create: () => schema.make(\"con_\" + ascending()) })),\n)\nexport type AttemptID = typeof AttemptID.Type\n\nconst AttemptTime = Schema.Struct({\n created: Schema.Number,\n expires: Schema.Number,\n})\n\nexport class Attempt extends Schema.Class<Attempt>(\"Integration.Attempt\")({\n attemptID: AttemptID,\n url: Schema.String,\n instructions: Schema.String,\n mode: Schema.Literals([\"auto\", \"code\"]),\n time: AttemptTime,\n}) {}\n\nexport const AttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.AttemptStatus\" })\nexport type AttemptStatus = typeof AttemptStatus.Type\n\nexport interface CommandAttempt extends Schema.Schema.Type<typeof CommandAttempt> {}\nexport const CommandAttempt = Schema.Struct({\n attemptID: AttemptID,\n time: AttemptTime,\n}).annotate({ identifier: \"Integration.CommandAttempt\" })\n\nexport const CommandAttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), message: optional(Schema.String), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.CommandAttemptStatus\" })\nexport type CommandAttemptStatus = typeof CommandAttemptStatus.Type\n", | ||
| "export * as Money from \"./money.js\"\n\nimport { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const USD = Schema.Finite.pipe(\n Schema.brand(\"Money.USD\"),\n Schema.annotate({ identifier: \"Money.USD\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USD = typeof USD.Type\n\nexport const USDPerMillionTokens = Schema.Finite.pipe(\n Schema.brand(\"Money.USDPerMillionTokens\"),\n Schema.annotate({ identifier: \"Money.USDPerMillionTokens\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USDPerMillionTokens = typeof USDPerMillionTokens.Type\n", | ||
| "export * as Provider from \"./provider.js\"\n\nimport { Effect, Schema } from \"effect\"\nimport { Integration } from \"./integration.js\"\nimport { optional, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"Provider.ID\"),\n statics((schema) => ({\n opencode: schema.make(\"opencode\"),\n anthropic: schema.make(\"anthropic\"),\n openai: schema.make(\"openai\"),\n google: schema.make(\"google\"),\n googleVertex: schema.make(\"google-vertex\"),\n githubCopilot: schema.make(\"github-copilot\"),\n amazonBedrock: schema.make(\"amazon-bedrock\"),\n azure: schema.make(\"azure\"),\n openrouter: schema.make(\"openrouter\"),\n mistral: schema.make(\"mistral\"),\n gitlab: schema.make(\"gitlab\"),\n })),\n)\nexport type ID = typeof ID.Type\n\nexport const Package = Schema.String\nexport type Package = typeof Package.Type\n\nexport const Activation = Schema.Literals([\"auto\", \"enabled\", \"disabled\"])\nexport type Activation = typeof Activation.Type\n\nexport const Overlays = {\n settings: Schema.Record(Schema.String, Schema.Any).pipe(optional),\n headers: Schema.Record(Schema.String, Schema.String).pipe(optional),\n body: Schema.Record(Schema.String, Schema.Any).pipe(optional),\n}\n\nexport const Settings = Schema.Record(Schema.String, Schema.Any).annotate({ identifier: \"Provider.Settings\" })\nexport type Settings = typeof Settings.Type\n\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\nexport const Request = Schema.Struct({\n settings: Settings.pipe(Schema.withConstructorDefault(Effect.succeed({}))),\n headers: Schema.Record(Schema.String, Schema.String),\n body: Schema.Record(Schema.String, Schema.Any),\n}).annotate({ identifier: \"Provider.Request\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n integrationID: Integration.ID.pipe(optional),\n name: Schema.String,\n activation: Activation,\n package: Package,\n ...Overlays,\n})\n .annotate({ identifier: \"Provider.Info\" })\n .pipe(\n statics(() => ({\n empty: (id: ID): Info => ({ id, name: id, activation: \"auto\", package: \"\" }),\n })),\n )\n", | ||
| "export * as Model from \"./model.js\"\n\nimport { Schema } from \"effect\"\nimport { optional, statics } from \"./schema.js\"\nimport { Provider } from \"./provider.js\"\nimport { Money } from \"./money.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Model.ID\"))\nexport type ID = typeof ID.Type\n\nexport const VariantID = Schema.String.pipe(Schema.brand(\"Model.VariantID\"))\nexport type VariantID = typeof VariantID.Type\n\nexport const Ref = Schema.Struct({\n id: ID,\n providerID: Provider.ID,\n variant: VariantID.pipe(optional),\n})\n .annotate({ identifier: \"Model.Ref\" })\n .pipe(\n statics((schema) => ({\n parse: (input: string) => {\n const providerEnd = input.indexOf(\"/\")\n if (providerEnd <= 0) throw new Error(`Invalid model reference: ${input}`)\n const providerID = input.slice(0, providerEnd)\n const variantStart = input.indexOf(\"#\", providerEnd + 1)\n const id = input.slice(providerEnd + 1, variantStart === -1 ? undefined : variantStart)\n const variant = variantStart === -1 ? undefined : input.slice(variantStart + 1)\n if (!id || providerID.includes(\"#\") || (variant !== undefined && (!variant || variant.includes(\"#\"))))\n throw new Error(`Invalid model reference: ${input}`)\n return schema.make({\n providerID: Provider.ID.make(providerID),\n id: ID.make(id),\n ...(variant ? { variant: VariantID.make(variant) } : {}),\n })\n },\n })),\n )\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\n\nexport const Family = Schema.String.pipe(Schema.brand(\"Model.Family\"))\nexport type Family = typeof Family.Type\n\nexport type ReasoningField = \"reasoning\" | \"reasoning_content\" | \"reasoning_text\" | (string & {})\nexport const ReasoningField: Schema.Codec<ReasoningField> = Schema.Union([\n Schema.Literals([\"reasoning\", \"reasoning_content\", \"reasoning_text\"]),\n Schema.String,\n]).annotate({ identifier: \"Model.ReasoningField\" })\n\nexport const MaxTokensField = Schema.Literals([\"max_completion_tokens\", \"max_tokens\"]).annotate({\n identifier: \"Model.MaxTokensField\",\n})\nexport type MaxTokensField = typeof MaxTokensField.Type\n\nexport interface Compatibility extends Schema.Schema.Type<typeof Compatibility> {}\nexport const Compatibility = Schema.Struct({\n reasoningField: ReasoningField.pipe(optional),\n maxTokensField: MaxTokensField.pipe(optional),\n requireFinishReason: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Model.Compatibility\" })\n\nexport interface Capabilities extends Schema.Schema.Type<typeof Capabilities> {}\nexport const Capabilities = Schema.Struct({\n tools: Schema.Boolean,\n input: Schema.Array(Schema.String),\n output: Schema.Array(Schema.String),\n responsesWebsockets: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Model.Capabilities\" })\n\nexport interface Cost extends Schema.Schema.Type<typeof Cost> {}\nexport const Cost = Schema.Struct({\n tier: Schema.Struct({\n type: Schema.tag(\"context\"),\n size: Schema.Int,\n }).pipe(optional),\n input: Money.USDPerMillionTokens,\n output: Money.USDPerMillionTokens,\n cache: Schema.Struct({\n read: Money.USDPerMillionTokens,\n write: Money.USDPerMillionTokens,\n }),\n}).annotate({ identifier: \"Model.Cost\" })\n\nexport interface Variant extends Schema.Schema.Type<typeof Variant> {}\nexport const Variant = Schema.Struct({\n id: VariantID,\n ...Provider.Overlays,\n}).annotate({ identifier: \"Model.Variant\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n modelID: ID,\n providerID: Provider.ID,\n family: Family.pipe(optional),\n name: Schema.String,\n compatibility: Compatibility.pipe(optional),\n package: Provider.Package.pipe(optional),\n ...Provider.Overlays,\n capabilities: Capabilities,\n variants: Schema.Array(Variant),\n time: Schema.Struct({\n released: Schema.Finite,\n }),\n cost: Schema.Array(Cost),\n status: Schema.Literals([\"alpha\", \"beta\", \"deprecated\", \"active\"]),\n enabled: Schema.Boolean,\n limit: Schema.Struct({\n context: Schema.Int,\n input: Schema.Int.pipe(optional),\n output: Schema.Int,\n }),\n})\n .annotate({ identifier: \"Model.Info\" })\n .pipe(\n statics(() => ({\n default: (providerID: Provider.ID, id: ID) =>\n ({\n id,\n modelID: id,\n providerID,\n name: id,\n capabilities: { tools: true, input: [\"text\", \"image\"], output: [\"text\"] },\n variants: [],\n time: { released: 0 },\n cost: [],\n status: \"active\",\n enabled: true,\n limit: { context: 200_000, output: 32_000 },\n }) satisfies Info,\n })),\n )\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "6DE765BDBCDDC45164756E2164756E21", | ||
| "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": "8E4FC81E4020BC5364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/prompt.ts"], | ||
| "sourcesContent": [ | ||
| "import { cancel, isCancel, log, outro } from \"@clack/prompts\"\nimport { Effect } from \"effect\"\nimport { errorMessage } from \"../util/error\"\n\nconst cancelled = Symbol(\"cancelled\")\n\nexport function prompt<A>(run: () => Promise<A | symbol>) {\n return Effect.tryPromise({ try: run, catch: (cause) => cause }).pipe(\n Effect.flatMap((value) => (isCancel(value) ? Effect.fail(cancelled) : Effect.succeed(value))),\n )\n}\n\nexport function requireInteractive(message: string) {\n if (process.stdin.isTTY && process.stdout.isTTY) return Effect.void\n return Effect.fail(new Error(message))\n}\n\nexport const openUrl = Effect.fn(\"cli.prompt.open-url\")(function* (url: string) {\n const { default: open } = yield* Effect.promise(() => import(\"open\"))\n yield* Effect.promise(() => open(url)).pipe(Effect.ignore)\n})\n\nexport function handlePromptErrors<A, E, R>(effect: Effect.Effect<A, E, R>) {\n return effect.pipe(\n Effect.catchIf(\n (error) => error === cancelled,\n () =>\n Effect.sync(() => {\n cancel(\"Cancelled\")\n process.exitCode = 130\n }),\n ),\n Effect.catch((error) =>\n Effect.sync(() => {\n log.error(errorMessage(error))\n outro(\"Failed\")\n process.exitCode = 1\n }),\n ),\n )\n}\n" | ||
| ], | ||
| "mappings": ";wOAIA,IAAM,EAAY,OAAO,WAAW,EAE7B,SAAS,CAAS,CAAC,EAAgC,CACxD,OAAO,EAAO,WAAW,CAAE,IAAK,EAAK,MAAO,CAAC,IAAU,CAAM,CAAC,EAAE,KAC9D,EAAO,QAAQ,CAAC,IAAW,EAAS,CAAK,EAAI,EAAO,KAAK,CAAS,EAAI,EAAO,QAAQ,CAAK,CAAE,CAC9F,EAGK,SAAS,CAAkB,CAAC,EAAiB,CAClD,GAAI,QAAQ,MAAM,OAAS,QAAQ,OAAO,MAAO,OAAO,EAAO,KAC/D,OAAO,EAAO,KAAS,MAAM,CAAO,CAAC,EAGhC,IAAM,EAAU,EAAO,GAAG,qBAAqB,EAAE,SAAU,CAAC,EAAa,CAC9E,IAAQ,QAAS,GAAS,MAAO,EAAO,QAAQ,IAAa,wCAAO,EACpE,MAAO,EAAO,QAAQ,IAAM,EAAK,CAAG,CAAC,EAAE,KAAK,EAAO,MAAM,EAC1D,EAEM,SAAS,CAA2B,CAAC,EAAgC,CAC1E,OAAO,EAAO,KACZ,EAAO,QACL,CAAC,IAAU,IAAU,EACrB,IACE,EAAO,KAAK,IAAM,CAChB,EAAO,WAAW,EAClB,QAAQ,SAAW,IACpB,CACL,EACA,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,EAAI,MAAM,EAAa,CAAK,CAAC,EAC7B,EAAM,QAAQ,EACd,QAAQ,SAAW,EACpB,CACH,CACF", | ||
| "debugId": "91CAE9A1EE80F28E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../protocol/src/client.ts"], | ||
| "sourcesContent": [ | ||
| "import { InvalidRequestError, SessionNotFoundError } from \"./errors.js\"\nimport { makeDefaultApi } from \"./api.js\"\nimport type { Api } from \"./api.js\"\nimport type { Context } from \"effect\"\nimport { HttpApiMiddleware } from \"effect/unstable/httpapi\"\nimport type { EventGroup } from \"./groups/event.js\"\n\nclass LocationMiddleware extends HttpApiMiddleware.Service<LocationMiddleware>()(\n \"@opencode-ai/client/LocationMiddleware\",\n) {}\n\nclass SessionLocationMiddleware extends HttpApiMiddleware.Service<SessionLocationMiddleware>()(\n \"@opencode-ai/client/SessionLocationMiddleware\",\n { error: [InvalidRequestError, SessionNotFoundError] },\n) {}\n\ntype ClientApiShape = Api<\n Context.Service.Identifier<typeof LocationMiddleware>,\n Context.Service.Shape<typeof LocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n typeof EventGroup\n>\n\nexport const ClientApi: ClientApiShape = makeDefaultApi({\n locationMiddleware: LocationMiddleware,\n // The real server uses a form-specific middleware with an undocumented `global` sentinel branch.\n // The generated client only needs a middleware identity for API typing.\n formLocationMiddleware: SessionLocationMiddleware,\n sessionLocationMiddleware: SessionLocationMiddleware,\n})\n\nexport const groupNames = {\n \"server.health\": \"health\",\n \"server.server\": \"server\",\n \"server.debug\": \"debug\",\n \"server.migration\": \"migration\",\n \"server.location\": \"location\",\n \"server.agent\": \"agent\",\n \"server.plugin\": \"plugin\",\n \"server.session\": \"session\",\n \"server.message\": \"message\",\n \"server.model\": \"model\",\n \"server.generate\": \"generate\",\n \"server.provider\": \"provider\",\n \"server.integration\": \"integration\",\n \"server.websearch\": \"websearch\",\n \"server.credential\": \"credential\",\n \"server.form\": \"form\",\n \"server.permission\": \"permission\",\n \"server.fs\": \"file\",\n \"server.command\": \"command\",\n \"server.skill\": \"skill\",\n \"server.event\": \"event\",\n \"server.pty\": \"pty\",\n \"server.shell\": \"shell\",\n \"server.mcp\": \"mcp\",\n \"server.reference\": \"reference\",\n \"server.project\": \"project\",\n \"server.worktree\": \"worktree\",\n \"server.vcs\": \"vcs\",\n \"server.config\": \"config\",\n} as const\n\nexport const promiseOmitEndpoints = new Set([\"pty.connect\"])\nexport const effectOmitEndpoints = new Set([\"fs.read\", \"pty.connect\"])\n" | ||
| ], | ||
| "mappings": ";giCAOA,MAAM,UAA2B,EAAkB,QAA4B,EAC7E,wCACF,CAAE,CAAC,CAEH,MAAM,UAAkC,EAAkB,QAAmC,EAC3F,gDACA,CAAE,MAAO,CAAC,EAAqB,CAAoB,CAAE,CACvD,CAAE,CAAC,CAYI,IAAM,EAA4B,EAAe,CACtD,mBAAoB,EAGpB,uBAAwB,EACxB,0BAA2B,CAC7B,CAAC,EAEY,EAAa,CACxB,gBAAiB,SACjB,gBAAiB,SACjB,eAAgB,QAChB,mBAAoB,YACpB,kBAAmB,WACnB,eAAgB,QAChB,gBAAiB,SACjB,iBAAkB,UAClB,iBAAkB,UAClB,eAAgB,QAChB,kBAAmB,WACnB,kBAAmB,WACnB,qBAAsB,cACtB,mBAAoB,YACpB,oBAAqB,aACrB,cAAe,OACf,oBAAqB,aACrB,YAAa,OACb,iBAAkB,UAClB,eAAgB,QAChB,eAAgB,QAChB,aAAc,MACd,eAAgB,QAChB,aAAc,MACd,mBAAoB,YACpB,iBAAkB,UAClB,kBAAmB,WACnB,aAAc,MACd,gBAAiB,QACnB,EAEa,EAAuB,IAAI,IAAI,CAAC,aAAa,CAAC,EAC9C,EAAsB,IAAI,IAAI,CAAC,UAAW,aAAa,CAAC", | ||
| "debugId": "967C9B19F4CEF24664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/session.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ModelInfo, SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/client\"\nimport { Locale } from \"./locale\"\n\ntype SessionNode = {\n id: string\n parentID?: string | null\n}\n\nexport function sessionFamily<T extends SessionNode>(sessions: readonly T[], sessionID: string) {\n const byID = new Map(sessions.map((session) => [session.id, session]))\n const current = byID.get(sessionID)\n if (!current) return []\n\n const children = new Map<string, T[]>()\n sessions.forEach((session) => {\n if (!session.parentID) return\n const group = children.get(session.parentID)\n if (group) group.push(session)\n else children.set(session.parentID, [session])\n })\n\n function root(session: T): T {\n const parent = session.parentID ? byID.get(session.parentID) : undefined\n return parent ? root(parent) : session\n }\n\n function walk(parentID: string, ancestors: boolean[]): Array<{ session: T; prefix: string }> {\n const group = children.get(parentID) ?? []\n return group.flatMap((session, index) => {\n const last = index === group.length - 1\n const prefix =\n ancestors.length === 0\n ? \"\"\n : ancestors\n .slice(1)\n .map((ancestor) => (ancestor ? \" \" : \"│ \"))\n .join(\"\") + (last ? \"└─ \" : \"├─ \")\n return [{ session, prefix }, ...walk(session.id, [...ancestors, last])]\n })\n }\n\n return walk(root(current).id, [])\n}\n\nexport function lastAssistantWithUsage(messages: ReadonlyArray<SessionMessageInfo>, boundary?: string) {\n const boundaryIndex = boundary ? messages.findIndex((message) => message.id === boundary) : -1\n if (boundary && boundaryIndex === -1) return undefined\n const end = boundaryIndex === -1 ? messages.length : boundaryIndex\n const compactionIndex = messages.findLastIndex(\n (message, index) => message.type === \"compaction\" && message.status === \"completed\" && index < end,\n )\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && index > compactionIndex && index < end,\n )\n}\n\nexport function contextUsage(\n messages: ReadonlyArray<SessionMessageInfo>,\n models: ReadonlyArray<ModelInfo> | undefined,\n boundary?: string,\n) {\n const last = lastAssistantWithUsage(messages, boundary)\n if (!last) return\n const tokens =\n last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write\n if (tokens <= 0) return\n const model = models?.find((model) => model.providerID === last.model.providerID && model.id === last.model.id)\n return {\n tokens,\n percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : undefined,\n }\n}\n\nexport function formatContextUsage(tokens: number, percent?: number) {\n const value = Locale.number(tokens)\n return percent === undefined ? value : `${value} (${percent}%)`\n}\n" | ||
| ], | ||
| "mappings": ";oDAQO,SAAS,CAAoC,CAAC,EAAwB,EAAmB,CAC9F,IAAM,EAAO,IAAI,IAAI,EAAS,IAAI,CAAC,IAAY,CAAC,EAAQ,GAAI,CAAO,CAAC,CAAC,EAC/D,EAAU,EAAK,IAAI,CAAS,EAClC,GAAI,CAAC,EAAS,MAAO,CAAC,EAEtB,IAAM,EAAW,IAAI,IACrB,EAAS,QAAQ,CAAC,IAAY,CAC5B,GAAI,CAAC,EAAQ,SAAU,OACvB,IAAM,EAAQ,EAAS,IAAI,EAAQ,QAAQ,EAC3C,GAAI,EAAO,EAAM,KAAK,CAAO,EACxB,OAAS,IAAI,EAAQ,SAAU,CAAC,CAAO,CAAC,EAC9C,EAED,SAAS,CAAI,CAAC,EAAe,CAC3B,IAAM,EAAS,EAAQ,SAAW,EAAK,IAAI,EAAQ,QAAQ,EAAI,OAC/D,OAAO,EAAS,EAAK,CAAM,EAAI,EAGjC,SAAS,CAAI,CAAC,EAAkB,EAA6D,CAC3F,IAAM,EAAQ,EAAS,IAAI,CAAQ,GAAK,CAAC,EACzC,OAAO,EAAM,QAAQ,CAAC,EAAS,IAAU,CACvC,IAAM,EAAO,IAAU,EAAM,OAAS,EAChC,EACJ,EAAU,SAAW,EACjB,GACA,EACG,MAAM,CAAC,EACP,IAAI,CAAC,IAAc,EAAW,MAAQ,UAAM,EAC5C,KAAK,EAAE,GAAK,EAAO,gBAAQ,iBACpC,MAAO,CAAC,CAAE,UAAS,QAAO,EAAG,GAAG,EAAK,EAAQ,GAAI,CAAC,GAAG,EAAW,CAAI,CAAC,CAAC,EACvE,EAGH,OAAO,EAAK,EAAK,CAAO,EAAE,GAAI,CAAC,CAAC,EAG3B,SAAS,CAAsB,CAAC,EAA6C,EAAmB,CACrG,IAAM,EAAgB,EAAW,EAAS,UAAU,CAAC,IAAY,EAAQ,KAAO,CAAQ,EAAI,GAC5F,GAAI,GAAY,IAAkB,GAAI,OACtC,IAAM,EAAM,IAAkB,GAAK,EAAS,OAAS,EAC/C,EAAkB,EAAS,cAC/B,CAAC,EAAS,IAAU,EAAQ,OAAS,cAAgB,EAAQ,SAAW,aAAe,EAAQ,CACjG,EACA,OAAO,EAAS,SACd,CAAC,EAAS,IACR,EAAQ,OAAS,aAAe,EAAQ,SAAW,QAAa,EAAQ,GAAmB,EAAQ,CACvG,EAGK,SAAS,CAAY,CAC1B,EACA,EACA,EACA,CACA,IAAM,EAAO,EAAuB,EAAU,CAAQ,EACtD,GAAI,CAAC,EAAM,OACX,IAAM,EACJ,EAAK,OAAO,MAAQ,EAAK,OAAO,OAAS,EAAK,OAAO,UAAY,EAAK,OAAO,MAAM,KAAO,EAAK,OAAO,MAAM,MAC9G,GAAI,GAAU,EAAG,OACjB,IAAM,EAAQ,GAAQ,KAAK,CAAC,IAAU,EAAM,aAAe,EAAK,MAAM,YAAc,EAAM,KAAO,EAAK,MAAM,EAAE,EAC9G,MAAO,CACL,SACA,QAAS,GAAO,MAAM,QAAU,KAAK,MAAO,EAAS,EAAM,MAAM,QAAW,GAAG,EAAI,MACrF,EAGK,SAAS,CAAkB,CAAC,EAAgB,EAAkB,CACnE,IAAM,EAAQ,EAAO,OAAO,CAAM,EAClC,OAAO,IAAY,OAAY,EAAQ,GAAG,MAAU", | ||
| "debugId": "9AB3FDE146BC97EA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex-shared.ts"], | ||
| "sourcesContent": [ | ||
| "import type { AnyAuthClient } from \"google-auth-library\"\nimport { Effect, Redacted } from \"effect\"\nimport { Auth, MissingCredentialError } from \"../route/auth.js\"\n\nconst SCOPE = \"https://www.googleapis.com/auth/cloud-platform\"\n\nexport type OAuthOptions =\n | { readonly accessToken?: string; readonly auth?: never }\n | { readonly accessToken?: never; readonly auth?: Auth.Definition }\n\nexport type ApiKeyOptions =\n | (OAuthOptions & { readonly apiKey?: never })\n | { readonly accessToken?: never; readonly apiKey?: string; readonly auth?: never }\n\nexport const project = (value?: string) =>\n value ??\n process.env.GOOGLE_VERTEX_PROJECT ??\n process.env.GOOGLE_CLOUD_PROJECT ??\n process.env.GCP_PROJECT ??\n process.env.GCLOUD_PROJECT\n\nexport const location = (value: string | undefined, fallback: string) =>\n value ??\n process.env.GOOGLE_VERTEX_LOCATION ??\n process.env.GOOGLE_CLOUD_LOCATION ??\n process.env.VERTEX_LOCATION ??\n fallback\n\nexport const host = (location: string) => {\n if (location === \"global\") return \"aiplatform.googleapis.com\"\n // Jurisdictional multi-regions use Regional Endpoint Platform domains.\n if (location === \"eu\" || location === \"us\") return `aiplatform.${location}.rep.googleapis.com`\n return `${location}-aiplatform.googleapis.com`\n}\n\nexport const requireProject = (value: string | undefined) => {\n if (value) return value\n throw new Error(\"Google Vertex requires a project when baseURL is not configured\")\n}\n\nexport const apiKey = (input: ApiKeyOptions) => {\n if (input.apiKey !== undefined && (input.accessToken !== undefined || input.auth !== undefined))\n throw new Error(\"Google Vertex apiKey cannot be combined with accessToken or auth\")\n if (input.accessToken !== undefined || input.auth !== undefined) return undefined\n return input.apiKey ?? process.env.GOOGLE_VERTEX_API_KEY\n}\n\nconst adc = (project?: string) => {\n let client: Promise<AnyAuthClient> | undefined\n const loadClient = () => {\n if (client) return client\n client = import(\"google-auth-library\").then(({ GoogleAuth }) =>\n new GoogleAuth({ projectId: project, scopes: [SCOPE] }).getClient(),\n )\n return client\n }\n return Auth.effect(\n Effect.tryPromise({\n try: async () => {\n const token = await (await loadClient()).getAccessToken()\n if (!token.token) throw new Error(\"Google ADC returned an empty access token\")\n return Redacted.make(token.token)\n },\n catch: () => new MissingCredentialError(\"Google Application Default Credentials\"),\n }),\n ).bearer()\n}\n\nexport const oauth = (input: OAuthOptions, project?: string) => {\n if (input.accessToken !== undefined && input.auth !== undefined)\n throw new Error(\"Google Vertex accessToken cannot be combined with auth\")\n if (input.auth) return input.auth\n if (input.accessToken !== undefined) return Auth.bearer(input.accessToken)\n return adc(project)\n}\n\nexport * as GoogleVertexShared from \"./google-vertex-shared.js\"\n" | ||
| ], | ||
| "mappings": ";2TAIA,IAAM,EAAQ,iDAUD,EAAU,CAAC,IACtB,GACA,QAAQ,IAAI,uBACZ,QAAQ,IAAI,sBACZ,QAAQ,IAAI,aACZ,QAAQ,IAAI,eAED,EAAW,CAAC,EAA2B,IAClD,GACA,QAAQ,IAAI,wBACZ,QAAQ,IAAI,uBACZ,QAAQ,IAAI,iBACZ,EAEW,EAAO,CAAC,IAAqB,CACxC,GAAI,IAAa,SAAU,MAAO,4BAElC,GAAI,IAAa,MAAQ,IAAa,KAAM,MAAO,cAAc,uBACjE,MAAO,GAAG,+BAGC,EAAiB,CAAC,IAA8B,CAC3D,GAAI,EAAO,OAAO,EAClB,MAAU,MAAM,iEAAiE,GAGtE,EAAS,CAAC,IAAyB,CAC9C,GAAI,EAAM,SAAW,SAAc,EAAM,cAAgB,QAAa,EAAM,OAAS,QACnF,MAAU,MAAM,kEAAkE,EACpF,GAAI,EAAM,cAAgB,QAAa,EAAM,OAAS,OAAW,OACjE,OAAO,EAAM,QAAU,QAAQ,IAAI,uBAG/B,EAAM,CAAC,IAAqB,CAChC,IAAI,EACE,EAAa,IAAM,CACvB,GAAI,EAAQ,OAAO,EAInB,OAHA,EAAgB,mEAAuB,KAAK,EAAG,gBAC7C,IAAI,EAAW,CAAE,UAAW,EAAS,OAAQ,CAAC,CAAK,CAAE,CAAC,EAAE,UAAU,CACpE,EACO,GAET,OAAO,EAAK,OACV,EAAO,WAAW,CAChB,IAAK,SAAY,CACf,IAAM,EAAQ,MAAO,MAAM,EAAW,GAAG,eAAe,EACxD,GAAI,CAAC,EAAM,MAAO,MAAU,MAAM,2CAA2C,EAC7E,OAAO,EAAS,KAAK,EAAM,KAAK,GAElC,MAAO,IAAM,IAAI,EAAuB,wCAAwC,CAClF,CAAC,CACH,EAAE,OAAO,GAGE,EAAQ,CAAC,EAAqB,IAAqB,CAC9D,GAAI,EAAM,cAAgB,QAAa,EAAM,OAAS,OACpD,MAAU,MAAM,wDAAwD,EAC1E,GAAI,EAAM,KAAM,OAAO,EAAM,KAC7B,GAAI,EAAM,cAAgB,OAAW,OAAO,EAAK,OAAO,EAAM,WAAW,EACzE,OAAO,EAAI,CAAO", | ||
| "debugId": "B8D10528E7ED2FF664756E2164756E21", | ||
| "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": "87253A0497F5495164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/config/mcp.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ConfigMCP from \"./mcp.js\"\n\nimport { Schema } from \"effect\"\nimport { Mcp } from \"../mcp.js\"\nimport { optional } from \"../schema.js\"\n\nexport const Timeout = Mcp.TimeoutConfig\nexport type Timeout = Mcp.TimeoutConfig\nexport const Local = Mcp.LocalConfig\nexport type Local = Mcp.LocalConfig\nexport const OAuth = Mcp.OAuthConfig\nexport type OAuth = Mcp.OAuthConfig\nexport const Remote = Mcp.RemoteConfig\nexport type Remote = Mcp.RemoteConfig\nexport const Server = Mcp.ServerConfig\n\nexport class Info extends Schema.Class<Info>(\"Config.MCP\")({\n timeout: Timeout.pipe(optional),\n servers: Schema.Record(Schema.String, Server).pipe(optional),\n}) {}\n" | ||
| ], | ||
| "mappings": ";2TAMO,IAAM,EAAU,EAAI,cAEd,EAAQ,EAAI,YAEZ,EAAQ,EAAI,YAEZ,EAAS,EAAI,aAEb,EAAS,EAAI,aAEnB,MAAM,UAAa,EAAO,MAAY,YAAY,EAAE,CACzD,QAAS,EAAQ,KAAK,CAAQ,EAC9B,QAAS,EAAO,OAAO,EAAO,OAAQ,CAAM,EAAE,KAAK,CAAQ,CAC7D,CAAC,CAAE,CAAC", | ||
| "debugId": "74C0E71E547EDCDA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "12157D5C26D8A95F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "D4B9650F19E0FE5C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/tool.ts"], | ||
| "sourcesContent": [ | ||
| "// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, subagent, etc.) has a ToolRule that controls\n// four display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { LANGUAGE_EXTENSIONS } from \"../util/filetype\"\nimport { Locale } from \"../util/locale\"\nimport {\n canonicalToolName,\n finiteNumber,\n primitiveInputSummary,\n toolDisplayContent,\n toolDisplayMetadata,\n webSearchProviderLabel,\n} from \"../util/tool-display\"\nimport { formatPath } from \"../util/path-format\"\nimport { isRecord } from \"../util/record\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport { canonicalToolName } from \"../util/tool-display\"\n\ntype ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\ntype ToolPhase = \"start\" | \"progress\" | \"final\"\n\ntype ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n status?: string\n file?: string\n from?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n id?: string\n path?: string\n pattern?: string\n url?: string\n query?: string\n agent?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n name?: string\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\ntype ToolFrame = {\n directory?: string\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n output: string\n time: {\n start?: number\n end?: number\n }\n}\n\ntype ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\ntype ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"subagent\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n return isRecord(v) ? { ...v } : {}\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nexport function toolOutputText(name: string, content: ReadonlyArray<{ type: string; text?: string }> | undefined) {\n if (!content) return \"\"\n // V2 shell content appends model-only status after the user-visible command output.\n if (canonicalToolName(name) === \"shell\") return content.find((item) => item.type === \"text\")?.text ?? \"\"\n const joined = content.flatMap((item) => (item.type === \"text\" && item.text ? [item.text] : [])).join(\"\\n\")\n if (canonicalToolName(name) === \"read\") return readDisplayText(joined) ?? joined\n return joined\n}\n\n/** Read's model content is a JSON page envelope; unwrap the human-facing text. */\nexport function readDisplayText(text: string): string | undefined {\n if (!text.startsWith(\"{\")) return undefined\n const parsed = (() => {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n })()\n const envelope = dict(parsed)\n if (typeof envelope.content === \"string\" && (envelope.type === \"text-page\" || envelope.encoding === \"utf8\"))\n return envelope.content\n if (!Array.isArray(envelope.entries)) return undefined\n return envelope.entries\n .flatMap((entry): string[] => {\n if (typeof entry === \"string\") return [entry]\n const path = dict(entry).path\n return typeof path === \"string\" ? [path] : []\n })\n .join(\"\\n\")\n}\n\nfunction normalizeInput(name: string, value: unknown) {\n const input = dict(value)\n const path = typeof input.path === \"string\" ? input.path : text(input.filePath)\n const agent = typeof input.agent === \"string\" ? input.agent : text(input.subagent_type)\n return {\n ...input,\n ...([\"read\", \"write\", \"edit\", \"lsp\"].includes(name) && path ? { path } : {}),\n ...(name === \"subagent\" && agent ? { agent } : {}),\n }\n}\n\nfunction normalizeFile(value: unknown): PatchFile | undefined {\n const file = dict(value)\n const name = text(file.file) || text(file.relativePath) || text(file.filePath)\n if (!name) return\n const legacy = text(file.type)\n const status =\n text(file.status) ||\n (legacy === \"add\"\n ? \"added\"\n : legacy === \"delete\"\n ? \"deleted\"\n : legacy === \"update\"\n ? \"modified\"\n : legacy === \"move\"\n ? \"moved\"\n : legacy)\n const patch = typeof file.patch === \"string\" ? file.patch : undefined\n const deletions = finiteNumber(file.deletions)\n return {\n ...file,\n file: name,\n ...(status === \"moved\" && text(file.filePath) ? { from: text(file.filePath) } : {}),\n ...(status ? { status } : {}),\n ...(patch === undefined ? {} : { patch }),\n ...(deletions === undefined ? {} : { deletions }),\n }\n}\n\nfunction normalizeMetadata(name: string, value: unknown) {\n const metadata = dict(value)\n const files = list(metadata.files).flatMap((item) => {\n const file = normalizeFile(item)\n return file ? [file] : []\n })\n const sessionID = text(metadata.sessionID) || text(metadata.sessionId)\n return {\n ...metadata,\n ...([\"edit\", \"patch\"].includes(name) && Array.isArray(metadata.files) ? { files } : {}),\n ...(name === \"subagent\" && sessionID ? { sessionID } : {}),\n }\n}\n\nexport function normalizeTool(tool: SessionMessageAssistantTool): SessionMessageAssistantTool {\n const name = canonicalToolName(tool.name)\n if (tool.state.status === \"streaming\") return { ...tool, name }\n return {\n ...tool,\n name,\n state: {\n ...tool.state,\n input: normalizeInput(name, tool.state.input),\n metadata: normalizeMetadata(name, toolDisplayMetadata(tool.state)),\n },\n } as SessionMessageAssistantTool\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction span(frame: ToolFrame): string {\n const start = frame.time.start\n const end = frame.time.end\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = primitiveInputSummary(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean; directory?: string } = {}): string {\n return formatPath(input, {\n base: opts.directory ?? process.cwd(),\n home: opts.home ? os.homedir() : undefined,\n forwardSlashes: true,\n })\n}\n\nfunction displayPath(p: ToolProps, input?: string, opts: { home?: boolean } = {}) {\n return toolPath(input, { ...opts, directory: p.frame.directory })\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\"\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${displayPath(p, dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = displayPath(p, p.input.path)\n const description = primitiveInputSummary(p.frame.input, [\"path\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n const file = list<PatchFile>(p.metadata.files)[0]\n return {\n icon: \"←\",\n title: `Edit ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: file?.patch ?? p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.agent || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Subagent`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n const name = p.metadata.name ?? p.input.id ?? \"\"\n return {\n icon: \"→\",\n title: `Skill \"${name}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n path?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean; directory?: string } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.path ? toolPath(input.path, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: lspTitle(p.input, { directory: p.frame.directory }),\n }\n}\n\nfunction patchTitle(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `# Created ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"deleted\") {\n return `# Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `# Moved ${toolPath(file.from, { directory })} -> ${toolPath(file.file, { directory })}`\n }\n\n return `# Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.path || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${displayPath(p, file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const item = list<PatchFile>(p.metadata.files)[0]\n const file = item?.file || p.input.path || \"\"\n const diff = item?.patch || p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${displayPath(p, file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.file\n return [\n {\n title: patchTitle(file, p.frame.directory),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length !== files.length) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const desc = p.input.description\n const rows = [desc].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Subagent`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? displayPath(p, wd, { home: true }) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `${dir}$` : \"\"\n }\n\n return `${dir}$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? displayPath(p, wdRaw, { home: true }) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit\n const time = span(p.frame)\n if (code === undefined) {\n if (!time) {\n return \"shell completed\"\n }\n\n return `shell completed · ${time}`\n }\n\n return `shell completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = displayPath(p, p.input.path)\n const extra = primitiveInputSummary(p.frame.input, [\"path\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `+ Created ${toolPath(file.file, { directory })}`\n }\n\n if (file.status === \"deleted\") {\n return `- Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `→ Moved ${toolPath(file.from, { directory })} → ${toolPath(file.file, { directory })}`\n }\n\n return `~ Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const showModified = !files.some((file) => file?.status && file.status !== \"modified\")\n const shown = files.filter((file) => showModified || file.status !== \"modified\")\n const rows = shown.slice(0, 6).map((file) => patchLine(file, p.frame.directory))\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!, p.frame.directory)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const row = p.input.description\n if (!row) {\n return `# ${kind} Subagent`\n }\n\n return `# ${kind} Subagent\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input, { directory: p.frame.directory })}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.metadata.name ?? p.input.id ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${displayPath(p, dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n shell: {\n view: {\n output: true,\n final: false,\n },\n run: runShell,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollShellFinal,\n },\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n subagent: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: SessionMessageAssistantTool, directory?: string): ToolFrame {\n const tool = normalizeTool(part)\n if (tool.state.status === \"streaming\")\n return {\n directory,\n raw: tool.state.input,\n name: tool.name,\n input: {},\n meta: {},\n state: dict(tool.state),\n status: tool.state.status,\n error: \"\",\n output: \"\",\n time: { start: tool.time.created },\n }\n const output = toolOutputText(tool.name, toolDisplayContent(tool.state))\n return {\n directory,\n raw: output,\n name: tool.name,\n input: normalizeInput(tool.name, tool.state.input),\n meta: normalizeMetadata(tool.name, tool.state.metadata),\n state: dict(tool.state),\n status: tool.state.status,\n error: tool.state.status === \"error\" ? tool.state.error.message : \"\",\n output,\n time: {\n start: tool.time.ran ?? tool.time.created,\n end: tool.time.completed,\n },\n }\n}\n\nfunction toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const current = commit.part ? frame(commit.part, commit.directory) : undefined\n return {\n directory: commit.directory,\n raw,\n name: canonicalToolName(commit.tool || current?.name || \"tool\"),\n input: current?.input ?? {},\n meta: current?.meta ?? {},\n state: current?.state ?? {},\n status: commit.toolState ?? current?.status ?? \"\",\n error: (commit.toolError ?? current?.error ?? \"\").trim(),\n output: current?.output ?? raw,\n time: current?.time ?? {},\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output.trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name ? canonicalToolName(name) : undefined)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.name).snap)\n )\n}\n\nexport function toolInlineInfo(part: SessionMessageAssistantTool, directory?: string): ToolInline {\n const ctx = frame(part, directory)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nfunction toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nconst STRUCTURED_FALLBACK_LENGTH = 4_096\n\nfunction structuredFallback(value: ToolDict): RunEntryBody | undefined {\n if (Object.keys(value).length === 0) return\n const content = JSON.stringify(value, null, 2)\n if (!content) return\n const suffix = \"\\n... [truncated]\"\n return {\n type: \"code\",\n content:\n content.length <= STRUCTURED_FALLBACK_LENGTH\n ? content\n : content.slice(0, STRUCTURED_FALLBACK_LENGTH - suffix.length) + suffix,\n filetype: \"json\",\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(\n commit: StreamCommit,\n raw: string,\n options?: { shellOutput?: boolean },\n): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"shell\" && commit.phase === \"progress\" && options?.shellOutput === false) return undefined\n\n if (ctx.name === \"subagent\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(ctx.output)\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n\n if (!rule(ctx.name) && !ctx.output.trim()) {\n return structuredFallback(ctx.meta) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E6E7FF1FDD89815064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { createClient, loadIntegrations } from \"./shared\"\nimport { errorMessage } from \"../../../util/error\"\n\nexport default Runtime.handler(Commands.commands.auth.commands.list, (input) =>\n list(input).pipe(\n Effect.catch((error) =>\n Effect.sync(() => {\n process.stderr.write(errorMessage(error) + EOL)\n process.exitCode = 1\n }),\n ),\n ),\n)\n\nconst list = Effect.fn(\"cli.auth.list\")(function* (input) {\n const client = yield* createClient({ server: Option.getOrUndefined(input.server), standalone: input.standalone })\n const integrations = (yield* loadIntegrations(client)).filter((integration) => integration.connections.length > 0)\n if (input.format === \"json\") {\n process.stdout.write(\n JSON.stringify(\n integrations.map((integration) => ({\n id: integration.id,\n name: integration.name,\n connections: integration.connections,\n })),\n null,\n 2,\n ) + EOL,\n )\n return\n }\n const rows = integrations.flatMap((integration) =>\n integration.connections.map((connection) => ({\n integration: integration.name,\n source: connection.type === \"credential\" ? connection.label : connection.name,\n type: connection.type === \"credential\" ? \"stored\" : \"environment\",\n })),\n )\n if (rows.length === 0) {\n process.stdout.write(\"No authenticated integrations\" + EOL)\n return\n }\n const width = Math.max(...rows.map((row) => row.integration.length)) + 2\n process.stdout.write(\n rows.map((row) => row.integration.padEnd(width) + row.source.padEnd(28) + row.type).join(EOL) + EOL,\n )\n})\n" | ||
| ], | ||
| "mappings": ";ymCAAA,cAAS,WAOT,IAAe,IAAQ,QAAQ,EAAS,SAAS,KAAK,SAAS,KAAM,CAAC,IACpE,EAAK,CAAK,EAAE,KACV,EAAO,MAAM,CAAC,IACZ,EAAO,KAAK,IAAM,CAChB,QAAQ,OAAO,MAAM,EAAa,CAAK,EAAI,CAAG,EAC9C,QAAQ,SAAW,EACpB,CACH,CACF,CACF,EAEM,EAAO,EAAO,GAAG,eAAe,EAAE,SAAU,CAAC,EAAO,CACxD,IAAM,EAAS,MAAO,EAAa,CAAE,OAAQ,EAAO,eAAe,EAAM,MAAM,EAAG,WAAY,EAAM,UAAW,CAAC,EAC1G,GAAgB,MAAO,EAAiB,CAAM,GAAG,OAAO,CAAC,IAAgB,EAAY,YAAY,OAAS,CAAC,EACjH,GAAI,EAAM,SAAW,OAAQ,CAC3B,QAAQ,OAAO,MACb,KAAK,UACH,EAAa,IAAI,CAAC,KAAiB,CACjC,GAAI,EAAY,GAChB,KAAM,EAAY,KAClB,YAAa,EAAY,WAC3B,EAAE,EACF,KACA,CACF,EAAI,CACN,EACA,OAEF,IAAM,EAAO,EAAa,QAAQ,CAAC,IACjC,EAAY,YAAY,IAAI,CAAC,KAAgB,CAC3C,YAAa,EAAY,KACzB,OAAQ,EAAW,OAAS,aAAe,EAAW,MAAQ,EAAW,KACzE,KAAM,EAAW,OAAS,aAAe,SAAW,aACtD,EAAE,CACJ,EACA,GAAI,EAAK,SAAW,EAAG,CACrB,QAAQ,OAAO,MAAM,gCAAkC,CAAG,EAC1D,OAEF,IAAM,EAAQ,KAAK,IAAI,GAAG,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,MAAM,CAAC,EAAI,EACvE,QAAQ,OAAO,MACb,EAAK,IAAI,CAAC,IAAQ,EAAI,YAAY,OAAO,CAAK,EAAI,EAAI,OAAO,OAAO,EAAE,EAAI,EAAI,IAAI,EAAE,KAAK,CAAG,EAAI,CAClG,EACD", | ||
| "debugId": "8DDB90D1F596ED3964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/util/error.ts"], | ||
| "sourcesContent": [ | ||
| "export function 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 }\n return String(error)\n}\n" | ||
| ], | ||
| "mappings": ";AAAO,SAAS,CAAY,CAAC,EAAgB,CAC3C,GAAI,aAAiB,MAAO,OAAO,EAAM,QACzC,GAAI,OAAO,IAAU,UAAY,IAAU,MAAQ,YAAa,GAAS,OAAO,EAAM,UAAY,SAChG,OAAO,EAAM,QAEf,OAAO,OAAO,CAAK", | ||
| "debugId": "9A484D3B26A08F4E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/tool-stream.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { AIError, LLMEvent, type ProviderMetadata, type ToolCall, type ToolInputError } from \"../../schema/index.js\"\nimport { eventError, parseToolInput, type ToolAccumulator } from \"../shared.js\"\n\ntype StreamKey = string | number\n\n/**\n * One pending streamed tool call. Providers emit the tool identity and JSON\n * argument text across separate chunks; `input` is the raw JSON string collected\n * so far, not the parsed object.\n */\nexport interface PendingTool extends ToolAccumulator {\n readonly providerExecuted?: boolean\n readonly providerMetadata?: ProviderMetadata\n}\n\n/**\n * Sparse parser state keyed by the provider's stream-local tool identifier.\n *\n * This key is not the final tool-call id (`call_...`). It is the id/index the\n * provider uses while streaming a partial call: OpenAI Chat / Anthropic /\n * Bedrock use numeric content indexes, while OpenAI Responses uses string\n * `item_id`s. The generic keeps each protocol internally consistent.\n */\nexport type State<K extends StreamKey> = Partial<Record<K, PendingTool>>\n\n/**\n * Result of adding argument text to one pending tool call. It returns both the\n * next `tools` state and the updated `tool` because parsers often need the\n * current id/name immediately. `events` contains lifecycle and delta events\n * produced by the append; metadata-only deltas update identity without output.\n */\nexport interface AppendOutcome<K extends StreamKey> {\n readonly tools: State<K>\n readonly tool: PendingTool\n readonly events: ReadonlyArray<LLMEvent>\n}\n\n/** Create empty accumulator state for one provider stream. */\nexport const empty = <K extends StreamKey>(): State<K> => ({})\n\nconst withTool = <K extends StreamKey>(tools: State<K>, key: K, tool: PendingTool): State<K> => {\n return { ...tools, [key]: tool }\n}\n\nconst withoutTool = <K extends StreamKey>(tools: State<K>, key: K): State<K> => {\n const next = { ...tools }\n delete next[key]\n return next\n}\n\nconst inputStart = (tool: PendingTool) =>\n LLMEvent.toolInputStart({\n id: tool.id,\n name: tool.name,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n })\n\nconst inputDelta = (tool: PendingTool, text: string) =>\n LLMEvent.toolInputDelta({\n id: tool.id,\n name: tool.name,\n text,\n })\n\nconst toolCall = (route: string, tool: PendingTool, inputOverride?: string) => {\n const raw = inputOverride ?? tool.input\n return parseToolInput(route, tool.name, raw).pipe(\n Effect.map((input): ToolCall | ToolInputError =>\n LLMEvent.toolCall({\n id: tool.id,\n name: tool.name,\n input,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n }),\n ),\n Effect.catch((error) =>\n tool.providerExecuted\n ? Effect.fail(error)\n : Effect.succeed(\n LLMEvent.toolInputError({\n id: tool.id,\n name: tool.name,\n raw,\n }),\n ),\n ),\n )\n}\n\nconst finishEvents = (tool: PendingTool, event: ToolCall | ToolInputError): ReadonlyArray<LLMEvent> =>\n event.type === \"tool-input-error\"\n ? [event]\n : [LLMEvent.toolInputEnd({ id: tool.id, name: tool.name, providerMetadata: tool.providerMetadata }), event]\n\n/** Store the updated tool and produce the optional public delta event. */\nconst appendTool = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: PendingTool,\n text: string,\n): AppendOutcome<K> => {\n const events: LLMEvent[] = []\n if (!tools[key]) events.push(inputStart(tool))\n if (text.length > 0) events.push(inputDelta(tool, text))\n return {\n tools: withTool(tools, key, tool),\n tool,\n events,\n }\n}\n\nexport const isError = <K extends StreamKey>(result: AppendOutcome<K> | AIError): result is AIError =>\n result instanceof AIError\n\n/**\n * Register a tool call whose start event arrived before any argument deltas.\n * Used by Anthropic `content_block_start`, Bedrock `contentBlockStart`, and\n * OpenAI Responses `response.output_item.added`.\n */\nexport const start = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: Omit<PendingTool, \"input\"> & { readonly input?: string },\n) => withTool(tools, key, { ...tool, input: tool.input ?? \"\" })\n\n/**\n * Append a streamed argument delta, starting the tool if this provider encodes\n * identity on the first delta instead of a separate start event. OpenAI Chat has\n * this shape: `tool_calls[].index` is the stream key, and `id` / `name` may only\n * appear on the first delta for that index.\n */\nexport const appendOrStart = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n delta: { readonly id?: string; readonly name?: string; readonly text: string },\n missingToolMessage: string,\n): AppendOutcome<K> | AIError => {\n const current = tools[key]\n const id = current?.id ?? delta.id\n const name = current?.name ?? delta.name\n if (!id || !name) return eventError(route, missingToolMessage)\n\n const tool = {\n id,\n name,\n input: `${current?.input ?? \"\"}${delta.text}`,\n providerExecuted: current?.providerExecuted,\n providerMetadata: current?.providerMetadata,\n }\n if (current && delta.text.length === 0 && current.id === id && current.name === name)\n return { tools, tool: current, events: [] }\n return appendTool(tools, key, tool, delta.text)\n}\n\n/**\n * Append argument text to a tool that must already have been started. This keeps\n * protocols honest when their stream grammar promises a start event before any\n * argument delta.\n */\nexport const appendExisting = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n text: string,\n missingToolMessage: string,\n): AppendOutcome<K> | AIError => {\n const current = tools[key]\n if (!current) return eventError(route, missingToolMessage)\n if (text.length === 0) return { tools, tool: current, events: [] }\n return appendTool(tools, key, { ...current, input: `${current.input}${text}` }, text)\n}\n\n/**\n * Finalize one pending tool call: parse the accumulated raw JSON, remove it\n * from state, and return either a call or a non-executable local input error.\n * Missing keys are a no-op because some providers emit stop events for\n * non-tool content blocks.\n */\nexport const finish = <K extends StreamKey>(route: string, tools: State<K>, key: K) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool)),\n }\n })\n\n/**\n * Finalize one pending tool call with an authoritative final input string.\n * OpenAI Responses can send accumulated deltas and then repeat the completed\n * arguments on `response.output_item.done`; the final value wins.\n */\nexport const finishWithInput = <K extends StreamKey>(route: string, tools: State<K>, key: K, input: string) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool, input)),\n }\n })\n\n/**\n * Finalize every pending tool call at once. OpenAI Chat has this shape: it does\n * not emit per-tool stop events, so all accumulated calls finish independently\n * when the choice receives a terminal `finish_reason`.\n */\nexport const finishAll = <K extends StreamKey>(route: string, tools: State<K>) =>\n Effect.gen(function* () {\n const pending = Object.values<PendingTool | undefined>(tools).filter(\n (tool): tool is PendingTool => tool !== undefined,\n )\n return {\n tools: empty<K>(),\n events: yield* Effect.forEach(pending, (tool) =>\n toolCall(route, tool).pipe(Effect.map((event) => finishEvents(tool, event))),\n ).pipe(Effect.map((events) => events.flat())),\n }\n })\n\nexport * as ToolStream from \"./tool-stream.js\"\n" | ||
| ], | ||
| "mappings": ";uVAuCO,IAAM,EAAQ,KAAsC,CAAC,GAEtD,EAAW,CAAsB,EAAiB,EAAQ,KACvD,IAAK,GAAQ,GAAM,CAAK,GAG3B,EAAc,CAAsB,EAAiB,IAAqB,CAC9E,IAAM,EAAO,IAAK,CAAM,EAExB,OADA,OAAO,EAAK,GACL,GAGH,EAAa,CAAC,IAClB,EAAS,eAAe,CACtB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,iBAAkB,EAAK,iBAAmB,GAAO,OACjD,iBAAkB,EAAK,gBACzB,CAAC,EAEG,EAAa,CAAC,EAAmB,IACrC,EAAS,eAAe,CACtB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,MACF,CAAC,EAEG,EAAW,CAAC,EAAe,EAAmB,IAA2B,CAC7E,IAAM,EAAM,GAAiB,EAAK,MAClC,OAAO,EAAe,EAAO,EAAK,KAAM,CAAG,EAAE,KAC3C,EAAO,IAAI,CAAC,IACV,EAAS,SAAS,CAChB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,QACA,iBAAkB,EAAK,iBAAmB,GAAO,OACjD,iBAAkB,EAAK,gBACzB,CAAC,CACH,EACA,EAAO,MAAM,CAAC,IACZ,EAAK,iBACD,EAAO,KAAK,CAAK,EACjB,EAAO,QACL,EAAS,eAAe,CACtB,GAAI,EAAK,GACT,KAAM,EAAK,KACX,KACF,CAAC,CACH,CACN,CACF,GAGI,EAAe,CAAC,EAAmB,IACvC,EAAM,OAAS,mBACX,CAAC,CAAK,EACN,CAAC,EAAS,aAAa,CAAE,GAAI,EAAK,GAAI,KAAM,EAAK,KAAM,iBAAkB,EAAK,gBAAiB,CAAC,EAAG,CAAK,EAGxG,EAAa,CACjB,EACA,EACA,EACA,IACqB,CACrB,IAAM,EAAqB,CAAC,EAC5B,GAAI,CAAC,EAAM,GAAM,EAAO,KAAK,EAAW,CAAI,CAAC,EAC7C,GAAI,EAAK,OAAS,EAAG,EAAO,KAAK,EAAW,EAAM,CAAI,CAAC,EACvD,MAAO,CACL,MAAO,EAAS,EAAO,EAAK,CAAI,EAChC,OACA,QACF,GAGW,EAAU,CAAsB,IAC3C,aAAkB,EAOP,EAAQ,CACnB,EACA,EACA,IACG,EAAS,EAAO,EAAK,IAAK,EAAM,MAAO,EAAK,OAAS,EAAG,CAAC,EAQjD,EAAgB,CAC3B,EACA,EACA,EACA,EACA,IAC+B,CAC/B,IAAM,EAAU,EAAM,GAChB,EAAK,GAAS,IAAM,EAAM,GAC1B,EAAO,GAAS,MAAQ,EAAM,KACpC,GAAI,CAAC,GAAM,CAAC,EAAM,OAAO,EAAW,EAAO,CAAkB,EAE7D,IAAM,EAAO,CACX,KACA,OACA,MAAO,GAAG,GAAS,OAAS,KAAK,EAAM,OACvC,iBAAkB,GAAS,iBAC3B,iBAAkB,GAAS,gBAC7B,EACA,GAAI,GAAW,EAAM,KAAK,SAAW,GAAK,EAAQ,KAAO,GAAM,EAAQ,OAAS,EAC9E,MAAO,CAAE,QAAO,KAAM,EAAS,OAAQ,CAAC,CAAE,EAC5C,OAAO,EAAW,EAAO,EAAK,EAAM,EAAM,IAAI,GAQnC,EAAiB,CAC5B,EACA,EACA,EACA,EACA,IAC+B,CAC/B,IAAM,EAAU,EAAM,GACtB,GAAI,CAAC,EAAS,OAAO,EAAW,EAAO,CAAkB,EACzD,GAAI,EAAK,SAAW,EAAG,MAAO,CAAE,QAAO,KAAM,EAAS,OAAQ,CAAC,CAAE,EACjE,OAAO,EAAW,EAAO,EAAK,IAAK,EAAS,MAAO,GAAG,EAAQ,QAAQ,GAAO,EAAG,CAAI,GASzE,EAAS,CAAsB,EAAe,EAAiB,IAC1E,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAO,EAAM,GACnB,GAAI,CAAC,EAAM,MAAO,CAAE,OAAM,EAC1B,MAAO,CACL,MAAO,EAAY,EAAO,CAAG,EAC7B,OAAQ,EAAa,EAAM,MAAO,EAAS,EAAO,CAAI,CAAC,CACzD,EACD,EAOU,EAAkB,CAAsB,EAAe,EAAiB,EAAQ,IAC3F,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAO,EAAM,GACnB,GAAI,CAAC,EAAM,MAAO,CAAE,OAAM,EAC1B,MAAO,CACL,MAAO,EAAY,EAAO,CAAG,EAC7B,OAAQ,EAAa,EAAM,MAAO,EAAS,EAAO,EAAM,CAAK,CAAC,CAChE,EACD,EAOU,EAAY,CAAsB,EAAe,IAC5D,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAU,OAAO,OAAgC,CAAK,EAAE,OAC5D,CAAC,IAA8B,IAAS,MAC1C,EACA,MAAO,CACL,MAAO,EAAS,EAChB,OAAQ,MAAO,EAAO,QAAQ,EAAS,CAAC,IACtC,EAAS,EAAO,CAAI,EAAE,KAAK,EAAO,IAAI,CAAC,IAAU,EAAa,EAAM,CAAK,CAAC,CAAC,CAC7E,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,KAAK,CAAC,CAAC,CAC9C,EACD", | ||
| "debugId": "38C2AF1EC46C865B64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport {\n OpenCode,\n type IntegrationAttemptStatus,\n type IntegrationOAuthMethod,\n type OpenCodeClient,\n} from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.auth,\n Effect.fn(\"cli.mcp.auth\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n const method = integration.methods.find(\n (candidate): candidate is IntegrationOAuthMethod => candidate.type === \"oauth\",\n )\n if (!method)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" is not an OAuth-capable remote server`))\n\n const started = yield* Effect.promise(() =>\n client.integration.oauth.connect({ integrationID: integration.id, methodID: method.id, location }),\n )\n const attempt = started.data\n if (attempt.mode === \"code\")\n return yield* Effect.fail(new Error(\"This server requires manual code entry, which the CLI does not support\"))\n\n process.stdout.write(attempt.instructions + EOL + attempt.url + EOL)\n\n const result = yield* poll(client, integration.id, attempt.attemptID)\n if (result.status === \"complete\") {\n process.stdout.write(`Authenticated with ${input.name}` + EOL)\n return\n }\n const reason = result.status === \"failed\" ? `: ${result.message}` : \"\"\n return yield* Effect.fail(new Error(`Authentication ${result.status}${reason}`))\n }),\n)\n\nconst poll = (\n client: OpenCodeClient,\n integrationID: string,\n attemptID: string,\n): Effect.Effect<Exclude<IntegrationAttemptStatus, { status: \"pending\" }>> =>\n Effect.gen(function* () {\n const status = yield* Effect.promise(() =>\n client.integration.oauth.status({ integrationID, attemptID, location }),\n ).pipe(Effect.map((result) => result.data))\n if (status.status === \"pending\") {\n yield* Effect.sleep(\"1 second\")\n return yield* poll(client, integrationID, attemptID)\n }\n return status\n })\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAcT,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,KAC/B,EAAO,GAAG,cAAc,EAAE,SAAU,CAAC,EAAO,CAC1C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EACzG,IAAM,EAAS,EAAY,QAAQ,KACjC,CAAC,IAAmD,EAAU,OAAS,OACzE,EACA,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,6CAA6C,CAAC,EAKzG,IAAM,GAHU,MAAO,EAAO,QAAQ,IACpC,EAAO,YAAY,MAAM,QAAQ,CAAE,cAAe,EAAY,GAAI,SAAU,EAAO,GAAI,UAAS,CAAC,CACnG,GACwB,KACxB,GAAI,EAAQ,OAAS,OACnB,OAAO,MAAO,EAAO,KAAS,MAAM,wEAAwE,CAAC,EAE/G,QAAQ,OAAO,MAAM,EAAQ,aAAe,EAAM,EAAQ,IAAM,CAAG,EAEnE,IAAM,EAAS,MAAO,EAAK,EAAQ,EAAY,GAAI,EAAQ,SAAS,EACpE,GAAI,EAAO,SAAW,WAAY,CAChC,QAAQ,OAAO,MAAM,sBAAsB,EAAM,OAAS,CAAG,EAC7D,OAEF,IAAM,EAAS,EAAO,SAAW,SAAW,KAAK,EAAO,UAAY,GACpE,OAAO,MAAO,EAAO,KAAS,MAAM,kBAAkB,EAAO,SAAS,GAAQ,CAAC,EAChF,CACH,EAEM,EAAO,CACX,EACA,EACA,IAEA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAS,MAAO,EAAO,QAAQ,IACnC,EAAO,YAAY,MAAM,OAAO,CAAE,gBAAe,YAAW,UAAS,CAAC,CACxE,EAAE,KAAK,EAAO,IAAI,CAAC,IAAW,EAAO,IAAI,CAAC,EAC1C,GAAI,EAAO,SAAW,UAEpB,OADA,MAAO,EAAO,MAAM,UAAU,EACvB,MAAO,EAAK,EAAQ,EAAe,CAAS,EAErD,OAAO,EACR", | ||
| "debugId": "F344E2CFCEBF146564756E2164756E21", | ||
| "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": "19FBFFC170FDBEFD64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/tool-display.ts", "../tui/src/util/path-format.ts", "../tui/src/util/filetype.ts", "../../node_modules/.bun/ansi-regex@6.2.2/node_modules/ansi-regex/index.js", "../../node_modules/.bun/strip-ansi@7.1.2/node_modules/strip-ansi/index.js"], | ||
| "sourcesContent": [ | ||
| "export function canonicalToolName(name: string) {\n if (name === \"bash\") return \"shell\"\n if (name === \"task\") return \"subagent\"\n if (name === \"apply_patch\") return \"patch\"\n return name\n}\n\nexport function finiteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return\n return value\n}\n\nexport function primitiveInputSummary(input: Record<string, unknown>, omit: readonly string[] = []) {\n const entries = Object.entries(input).filter(([key, value]) => {\n if (omit.includes(key)) return false\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n })\n if (entries.length === 0) return \"\"\n return `[${entries.map(([key, value]) => `${key}=${String(value)}`).join(\", \")}]`\n}\n\nexport function webSearchProviderLabel(provider: unknown) {\n if (typeof provider !== \"string\" || !provider) return \"Web Search\"\n return `Web Search via ${provider[0].toUpperCase()}${provider.slice(1)}`\n}\n\nexport function toolDisplayMetadata(state: unknown): Record<string, unknown> {\n if (!state || typeof state !== \"object\" || Array.isArray(state)) return {}\n if (!(\"status\" in state) || state.status === \"streaming\") return {}\n if (!(\"metadata\" in state) || !state.metadata || typeof state.metadata !== \"object\") return {}\n if (Array.isArray(state.metadata)) return {}\n return state.metadata as Record<string, unknown>\n}\n\nexport function toolDisplayContent(state: SessionMessageAssistantTool[\"state\"]) {\n if (state.status === \"streaming\" || state.status === \"running\") return []\n return state.content ?? []\n}\n\nexport function nonEmptyToolContent<T>(content: ReadonlyArray<T> | undefined): [T, ...T[]] | undefined {\n if (!content) return undefined\n const [first, ...rest] = content\n return first === undefined ? undefined : [first, ...rest]\n}\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\n", | ||
| "import path from \"path\"\n\nexport function abbreviateHome(input: string, home: string) {\n if (!home) return input\n const paths = windowsPath(home) ? path.win32 : path.posix\n const relative = paths.relative(home, input)\n if (!relative) return \"~\"\n if (relative === \"..\" || relative.startsWith(\"..\" + paths.sep) || paths.isAbsolute(relative)) return input\n return \"~/\" + relative.split(paths.sep).join(\"/\")\n}\n\nexport function formatPath(\n input: string | undefined,\n options: { base: string; home?: string; forwardSlashes?: boolean },\n) {\n if (!input) return \"\"\n const windows = windowsPath(options.base)\n if (!windows && windowsPath(input)) {\n return options.forwardSlashes ? input.replaceAll(\"\\\\\", \"/\") : input\n }\n\n const paths = windows ? path.win32 : path.posix\n const absolute = paths.isAbsolute(input) ? input : paths.resolve(options.base, input)\n const relative = paths.relative(options.base, absolute)\n const formatted = !relative\n ? \".\"\n : relative !== \"..\" && !relative.startsWith(\"..\" + paths.sep) && !paths.isAbsolute(relative)\n ? relative\n : options.home\n ? abbreviateHome(absolute, options.home)\n : absolute\n return options.forwardSlashes ? formatted.replaceAll(\"\\\\\", \"/\") : formatted\n}\n\nfunction windowsPath(input: string) {\n return /^[A-Za-z]:[\\\\/]/.test(input) || input.startsWith(\"\\\\\\\\\")\n}\n", | ||
| "import path from \"node:path\"\n\nexport const LANGUAGE_EXTENSIONS: Record<string, string> = {\n \".abap\": \"abap\",\n \".bat\": \"bat\",\n \".bib\": \"bibtex\",\n \".bibtex\": \"bibtex\",\n \".clj\": \"clojure\",\n \".cljs\": \"clojure\",\n \".cljc\": \"clojure\",\n \".edn\": \"clojure\",\n \".coffee\": \"coffeescript\",\n \".c\": \"c\",\n \".cpp\": \"cpp\",\n \".cxx\": \"cpp\",\n \".cc\": \"cpp\",\n \".c++\": \"cpp\",\n \".cs\": \"csharp\",\n \".csx\": \"csharp\",\n \".css\": \"css\",\n \".d\": \"d\",\n \".pas\": \"pascal\",\n \".pascal\": \"pascal\",\n \".diff\": \"diff\",\n \".patch\": \"diff\",\n \".dart\": \"dart\",\n \".dockerfile\": \"dockerfile\",\n \".ex\": \"elixir\",\n \".exs\": \"elixir\",\n \".erl\": \"erlang\",\n \".ets\": \"typescript\",\n \".hrl\": \"erlang\",\n \".fs\": \"fsharp\",\n \".fsi\": \"fsharp\",\n \".fsx\": \"fsharp\",\n \".fsscript\": \"fsharp\",\n \".gitcommit\": \"git-commit\",\n \".gitrebase\": \"git-rebase\",\n \".go\": \"go\",\n \".groovy\": \"groovy\",\n \".gleam\": \"gleam\",\n \".hbs\": \"handlebars\",\n \".handlebars\": \"handlebars\",\n \".hs\": \"haskell\",\n \".lhs\": \"haskell\",\n \".html\": \"html\",\n \".htm\": \"html\",\n \".ini\": \"ini\",\n \".java\": \"java\",\n \".jl\": \"julia\",\n \".js\": \"javascript\",\n \".kt\": \"kotlin\",\n \".kts\": \"kotlin\",\n \".jsx\": \"javascriptreact\",\n \".json\": \"json\",\n \".tex\": \"latex\",\n \".latex\": \"latex\",\n \".less\": \"less\",\n \".lua\": \"lua\",\n \".makefile\": \"makefile\",\n makefile: \"makefile\",\n \".md\": \"markdown\",\n \".markdown\": \"markdown\",\n \".m\": \"objective-c\",\n \".mm\": \"objective-cpp\",\n \".pl\": \"perl\",\n \".pm\": \"perl\",\n \".pm6\": \"perl6\",\n \".php\": \"php\",\n \".ps1\": \"powershell\",\n \".psm1\": \"powershell\",\n \".pug\": \"jade\",\n \".jade\": \"jade\",\n \".py\": \"python\",\n \".r\": \"r\",\n \".cshtml\": \"razor\",\n \".razor\": \"razor\",\n \".rb\": \"ruby\",\n \".rake\": \"ruby\",\n \".gemspec\": \"ruby\",\n \".ru\": \"ruby\",\n \".erb\": \"erb\",\n \".html.erb\": \"erb\",\n \".js.erb\": \"erb\",\n \".css.erb\": \"erb\",\n \".json.erb\": \"erb\",\n \".rs\": \"rust\",\n \".scss\": \"scss\",\n \".sass\": \"sass\",\n \".scala\": \"scala\",\n \".shader\": \"shaderlab\",\n \".sh\": \"shellscript\",\n \".bash\": \"shellscript\",\n \".zsh\": \"shellscript\",\n \".ksh\": \"shellscript\",\n \".sql\": \"sql\",\n \".svelte\": \"svelte\",\n \".swift\": \"swift\",\n \".ts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".mtsx\": \"typescriptreact\",\n \".ctsx\": \"typescriptreact\",\n \".xml\": \"xml\",\n \".xsl\": \"xsl\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".vue\": \"vue\",\n \".zig\": \"zig\",\n \".zon\": \"zig\",\n \".astro\": \"astro\",\n \".ml\": \"ocaml\",\n \".mli\": \"ocaml\",\n \".tf\": \"terraform\",\n \".tfvars\": \"terraform-vars\",\n \".hcl\": \"hcl\",\n \".nix\": \"nix\",\n \".typ\": \"typst\",\n \".typc\": \"typst\",\n}\n\nexport function filetype(input?: string) {\n if (!input) return \"none\"\n const language = LANGUAGE_EXTENSIONS[path.extname(input)]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(language)) return \"typescript\"\n return language\n}\n", | ||
| "export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n", | ||
| "import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "749D8DD789ED3DFA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../util/src/bom.ts", "../util/src/patch.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Bom from \"./bom.js\"\n\nimport { Effect } from \"effect\"\nimport { FSUtil } from \"./fs-util.js\"\n\nconst code = 0xfeff\nconst value = String.fromCharCode(code)\n\nexport function split(text: string) {\n const stripped = text.replace(/^\\uFEFF+/, \"\")\n return { bom: stripped.length !== text.length, text: stripped }\n}\n\nexport function join(text: string, bom: boolean) {\n const stripped = split(text).text\n return bom ? value + stripped : stripped\n}\n\nexport function has(content: Uint8Array) {\n return content[0] === 0xef && content[1] === 0xbb && content[2] === 0xbf\n}\n\nexport function decodeBytes(content: Uint8Array) {\n return split(decode(content))\n}\n\nexport function syncBytes(content: Uint8Array, bom: boolean) {\n const decoded = decode(content)\n const current = split(decoded)\n const canonical = join(current.text, bom)\n return { text: current.text, bytes: decoded === canonical ? undefined : new TextEncoder().encode(canonical) }\n}\n\nexport const readFile = Effect.fn(\"Bom.readFile\")(function* (fs: FSUtil.Interface, filepath: string) {\n return decodeBytes(yield* fs.readFile(filepath))\n})\n\nexport const syncFile = Effect.fn(\"Bom.syncFile\")(function* (fs: FSUtil.Interface, filepath: string, bom: boolean) {\n const synced = syncBytes(yield* fs.readFile(filepath), bom)\n if (synced.bytes) yield* fs.writeWithDirs(filepath, synced.bytes)\n return synced.text\n})\n\nfunction decode(content: Uint8Array) {\n return new TextDecoder(\"utf-8\", { ignoreBOM: true }).decode(content)\n}\n", | ||
| "export * as Patch from \"./patch.js\"\n\nimport { Result, Schema } from \"effect\"\nimport { Bom } from \"./bom.js\"\n\nexport class BoundaryError extends Schema.TaggedError<BoundaryError>()(\"Patch.BoundaryError\", {\n boundary: Schema.Literals([\"first\", \"last\"]),\n}) {\n override get message() {\n return `The ${this.boundary} line of the patch must be '${this.boundary === \"first\" ? \"*** Begin Patch\" : \"*** End Patch\"}'`\n }\n}\n\nexport class InvalidHunkError extends Schema.TaggedError<InvalidHunkError>()(\"Patch.InvalidHunkError\", {\n line: Schema.String,\n lineNumber: Schema.Number,\n reason: Schema.optional(Schema.String),\n}) {\n override get message() {\n if (this.reason) return `Invalid hunk at line ${this.lineNumber}: ${this.reason}`\n return `Invalid hunk at line ${this.lineNumber}: '${this.line}' is not a valid hunk header. Valid hunk headers: '*** Add File: {path}', '*** Delete File: {path}', '*** Update File: {path}'`\n }\n}\n\nexport type ParseError = BoundaryError | InvalidHunkError\n\nexport type Hunk =\n | { readonly type: \"add\"; readonly path: string; readonly contents: string }\n | { readonly type: \"delete\"; readonly path: string }\n | {\n readonly type: \"update\"\n readonly path: string\n readonly movePath?: string\n readonly chunks: ReadonlyArray<UpdateFileChunk>\n }\n\nexport interface UpdateFileChunk {\n readonly oldLines: ReadonlyArray<string>\n readonly newLines: ReadonlyArray<string>\n readonly changeContext?: string\n readonly endOfFile?: boolean\n}\n\nexport interface FileUpdate {\n readonly content: string\n readonly bom: boolean\n}\n\nexport function parse(patchText: string): Result.Result<ReadonlyArray<Hunk>, ParseError> {\n const lines = stripHeredoc(patchText.trim())\n .split(\"\\n\")\n .map((line) => (line.endsWith(\"\\r\") ? line.slice(0, -1) : line))\n const begin = lines[0]?.trim() === \"*** Begin Patch\" ? 0 : -1\n const end = lines.at(-1)?.trim() === \"*** End Patch\" ? lines.length - 1 : -1\n if (begin === -1) return Result.fail(new BoundaryError({ boundary: \"first\" }))\n if (end === -1 || begin >= end) return Result.fail(new BoundaryError({ boundary: \"last\" }))\n\n const hunks: Hunk[] = []\n let index = begin + 1\n while (index < end) {\n const line = lines[index]!\n const header = line.trim()\n if (\n index === begin + 1 &&\n header.startsWith(\"*** Environment ID:\") &&\n header.slice(\"*** Environment ID:\".length).trim()\n ) {\n index++\n continue\n }\n if (header.startsWith(\"*** Add File: \")) {\n const path = header.slice(\"*** Add File: \".length).trim()\n const parsed = parseAdd(lines, index + 1, end, path)\n if (\"error\" in parsed) return Result.fail(parsed.error)\n hunks.push({ type: \"add\", path, contents: parsed.content })\n index = parsed.next\n continue\n }\n if (header.startsWith(\"*** Delete File: \")) {\n const path = header.slice(\"*** Delete File: \".length).trim()\n const next = lines[index + 1]?.trim()\n if (index + 1 < end && next !== undefined && !isBoundary(next)) {\n if (next.startsWith(\"*** \")) {\n return Result.fail(new InvalidHunkError({ line: next, lineNumber: index + 2 }))\n }\n return Result.fail(\n new InvalidHunkError({\n line: next,\n lineNumber: index + 2,\n reason: `Unexpected line after Delete File '${path}': '${next}'. Delete hunks do not contain body lines`,\n }),\n )\n }\n hunks.push({ type: \"delete\", path })\n index++\n continue\n }\n if (header.startsWith(\"*** Update File: \")) {\n const path = header.slice(\"*** Update File: \".length).trim()\n let next = index + 1\n let movePath: string | undefined\n while (lines[next]?.trimEnd() === \"*** End of File\") next++\n const move = lines[next]?.trimEnd()\n if (move === \"*** Move to:\" || move?.startsWith(\"*** Move to: \")) {\n movePath = move.slice(\"*** Move to: \".length).trim()\n if (!movePath) {\n return Result.fail(\n new InvalidHunkError({\n line: lines[next]!.trim(),\n lineNumber: next + 1,\n reason: `Move destination for '${path}' must not be empty`,\n }),\n )\n }\n next++\n }\n const parsed = parseUpdate(lines, next, end, path, index)\n if (\"error\" in parsed) return Result.fail(parsed.error)\n hunks.push({ type: \"update\", path, movePath, chunks: parsed.chunks })\n index = parsed.next\n continue\n }\n return Result.fail(new InvalidHunkError({ line: header, lineNumber: index + 1 }))\n }\n return Result.succeed(hunks)\n}\n\nexport function derive(path: string, chunks: ReadonlyArray<UpdateFileChunk>, original: string): FileUpdate {\n const source = Bom.split(original)\n const lines = source.text.split(\"\\n\")\n if (lines.at(-1) === \"\") lines.pop()\n const replacements = computeReplacements(lines, path, chunks)\n const updated = [...lines]\n for (const [start, remove, insert] of replacements.toReversed()) updated.splice(start, remove, ...insert)\n if (updated.at(-1) !== \"\") updated.push(\"\")\n const next = Bom.split(updated.join(\"\\n\"))\n return { content: next.text, bom: source.bom || next.bom }\n}\n\nexport function joinBom(text: string, bom: boolean) {\n return Bom.join(text, bom)\n}\n\nfunction parseAdd(\n lines: ReadonlyArray<string>,\n start: number,\n end: number,\n path: string,\n): { content: string; next: number } | { error: InvalidHunkError } {\n const content: string[] = []\n let index = start\n while (index < end && !isBoundary(lines[index]!.trim())) {\n if (!lines[index]!.startsWith(\"+\")) {\n const line = lines[index]!.trim()\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: `Invalid Add File line for '${path}': expected a line starting with '+', got '${line}'`,\n }),\n }\n }\n content.push(lines[index]!.slice(1))\n index++\n }\n return { content: content.join(\"\\n\"), next: index }\n}\n\nfunction parseUpdate(\n lines: ReadonlyArray<string>,\n start: number,\n end: number,\n path: string,\n hunk: number,\n): { chunks: ReadonlyArray<UpdateFileChunk>; next: number } | { error: InvalidHunkError } {\n const chunks: Array<{\n oldLines: string[]\n newLines: string[]\n changeContext?: string\n endOfFile?: boolean\n }> = []\n let index = start\n let afterEndOfFile = false\n while (index < end) {\n const line = lines[index]!\n const updateLine = line.trimEnd()\n if (afterEndOfFile) {\n if (updateLine === \"\") {\n index++\n continue\n }\n if (updateLine === \"@@\" || updateLine.startsWith(\"@@ \")) afterEndOfFile = false\n else if (isBoundary(updateLine)) break\n else {\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: `Expected update hunk to start with a @@ context marker, got: '${line}'`,\n }),\n }\n }\n }\n if (updateLine === \"*** End of File\") {\n const chunk = chunks.at(-1)\n if (chunk && chunk.oldLines.length === 0 && chunk.newLines.length === 0) {\n return {\n error: new InvalidHunkError({\n line: updateLine,\n lineNumber: index + 1,\n reason: \"Update hunk does not contain any lines\",\n }),\n }\n }\n if (chunk) {\n chunk.endOfFile = true\n afterEndOfFile = true\n }\n index++\n continue\n }\n if (isBoundary(updateLine)) break\n if (updateLine === \"@@\" || updateLine.startsWith(\"@@ \")) {\n const previous = chunks.at(-1)\n if (previous && previous.oldLines.length === 0 && previous.newLines.length === 0) {\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n }),\n }\n }\n chunks.push({\n oldLines: [],\n newLines: [],\n changeContext: updateLine === \"@@\" ? undefined : updateLine.slice(\"@@ \".length),\n })\n index++\n continue\n }\n if (chunks.length === 0) chunks.push({ oldLines: [], newLines: [] })\n const chunk = chunks.at(-1)!\n if (line === \"\") {\n chunk.oldLines.push(\"\")\n chunk.newLines.push(\"\")\n index++\n continue\n }\n if (line.startsWith(\" \")) {\n chunk.oldLines.push(line.slice(1))\n chunk.newLines.push(line.slice(1))\n index++\n continue\n }\n if (line.startsWith(\"-\")) {\n chunk.oldLines.push(line.slice(1))\n index++\n continue\n }\n if (line.startsWith(\"+\")) {\n chunk.newLines.push(line.slice(1))\n index++\n continue\n }\n const populated = chunk.oldLines.length > 0 || chunk.newLines.length > 0\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: populated\n ? `Expected update hunk to start with a @@ context marker, got: '${line}'`\n : `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n }),\n }\n }\n if (chunks.length === 0) {\n return {\n error: new InvalidHunkError({\n line: lines[hunk]!.trim(),\n lineNumber: hunk + 1,\n reason: `Update file hunk for path '${path}' is empty`,\n }),\n }\n }\n const last = chunks.at(-1)!\n if (last.oldLines.length === 0 && last.newLines.length === 0) {\n const line = lines[index]!.trim()\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason:\n line === \"*** End Patch\"\n ? \"Update hunk does not contain any lines\"\n : `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n }),\n }\n }\n return { chunks, next: index }\n}\n\nfunction isBoundary(line: string) {\n return (\n line === \"*** End Patch\" ||\n line.startsWith(\"*** Add File: \") ||\n line.startsWith(\"*** Delete File: \") ||\n line.startsWith(\"*** Update File: \")\n )\n}\n\nfunction computeReplacements(lines: ReadonlyArray<string>, path: string, chunks: ReadonlyArray<UpdateFileChunk>) {\n const replacements: Array<readonly [start: number, remove: number, insert: ReadonlyArray<string>]> = []\n let lineIndex = 0\n for (const chunk of chunks) {\n if (chunk.changeContext) {\n const context = seek(lines, [chunk.changeContext], lineIndex)\n if (context === -1) throw new Error(`Failed to find context '${chunk.changeContext}' in ${path}`)\n lineIndex = context + 1\n }\n if (chunk.oldLines.length === 0) {\n replacements.push([lines.length, 0, chunk.newLines])\n continue\n }\n let oldLines = chunk.oldLines\n let newLines = chunk.newLines\n let found = seek(lines, oldLines, lineIndex, chunk.endOfFile)\n if (found === -1 && oldLines.at(-1) === \"\") {\n oldLines = oldLines.slice(0, -1)\n if (newLines.at(-1) === \"\") newLines = newLines.slice(0, -1)\n found = seek(lines, oldLines, lineIndex, chunk.endOfFile)\n }\n if (found === -1 && chunk.oldLines.every((line) => line === \"\")) {\n const expected =\n chunk.oldLines.length === 1 ? \"an expected blank line\" : `${chunk.oldLines.length} consecutive blank lines`\n throw new Error(`Failed to find ${expected} in ${path}`)\n }\n if (found === -1) throw new Error(`Failed to find expected lines in ${path}:\\n${chunk.oldLines.join(\"\\n\")}`)\n replacements.push([found, oldLines.length, newLines])\n lineIndex = found + oldLines.length\n }\n return replacements.toSorted((left, right) => left[0] - right[0])\n}\n\nfunction seek(lines: ReadonlyArray<string>, pattern: ReadonlyArray<string>, start: number, eof = false) {\n if (pattern.length === 0) return -1\n if (eof) {\n const offset = lines.length - pattern.length\n if (offset < start) return -1\n for (const compare of [exact, rstrip, trim, normalized]) {\n if (matches(lines, pattern, offset, compare)) return offset\n }\n return -1\n }\n for (const compare of [exact, rstrip, trim, normalized]) {\n for (let offset = start; offset <= lines.length - pattern.length; offset++) {\n if (matches(lines, pattern, offset, compare)) return offset\n }\n }\n return -1\n}\n\nfunction matches(\n lines: ReadonlyArray<string>,\n pattern: ReadonlyArray<string>,\n offset: number,\n compare: (left: string, right: string) => boolean,\n) {\n return pattern.every((line, index) => compare(lines[offset + index]!, line))\n}\n\nconst exact = (left: string, right: string) => left === right\nconst rstrip = (left: string, right: string) => left.trimEnd() === right.trimEnd()\nconst trim = (left: string, right: string) => left.trim() === right.trim()\nconst normalized = (left: string, right: string) => normalize(left.trim()) === normalize(right.trim())\nconst normalize = (value: string) =>\n value\n .replace(/[‘’‚‛]/g, \"'\")\n .replace(/[“”„‟]/g, '\"')\n .replace(/[‐‑‒–—―−]/g, \"-\")\n .replace(/[\\u00A0\\u2002-\\u200A\\u202F\\u205F\\u3000]/g, \" \")\nconst stripHeredoc = (input: string) => input.match(/^(?:cat\\s+)?<<(['\"]?)(\\w+)\\1\\s*\\n([\\s\\S]*?)\\n\\2\\s*$/)?.[3] ?? input\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "48E6260C4A1AFA0D64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/xai-images.ts", "../ai/src/providers/xai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport { GeneratedImage, ImageModel, ImageResponse, type ImageRequestFor, type ImageRoute } from \"../image.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema/index.js\"\nimport { ProviderShared, optionalNull } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\n\nconst ADAPTER = \"xai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.x.ai/v1\"\nexport const PATH = \"/images/generations\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type XAIImageString<Known extends string> = Known | (string & {})\n\nexport type XAIImageOptions = {\n readonly n?: number\n readonly aspectRatio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly aspect_ratio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly resolution?: XAIImageString<\"1k\" | \"2k\">\n readonly responseFormat?: XAIImageString<\"url\" | \"b64_json\">\n readonly response_format?: XAIImageString<\"url\" | \"b64_json\">\n} & Record<string, unknown>\n\ntype XAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\n\nconst XAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: optionalNull(Schema.String),\n url: optionalNull(Schema.String),\n revised_prompt: optionalNull(Schema.String),\n mime_type: optionalNull(Schema.String),\n }),\n ),\n usage: Schema.optional(Schema.Unknown),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly http?: HttpOptions\n}\n\nconst nativeOptions = (options: XAIImageOptions | undefined) => {\n if (!options) return undefined\n const { aspectRatio, responseFormat, ...native } = options\n return {\n aspect_ratio: aspectRatio,\n response_format: responseFormat,\n ...native,\n }\n}\n\nconst invalidOutput = (message: string) =>\n new AIError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<XAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"XAIImages.generate\")(function* (request: ImageRequestFor<XAIImageOptions>, execute) {\n const http = mergeHttpOptions(request.model.http, request.http)\n const imageReferences = (request.images ?? []).map((image) => {\n if (image.type === \"bytes\") return { url: ImageInputs.dataUrl(image), type: \"image_url\" as const }\n if (image.type === \"url\") return { url: image.url, type: \"image_url\" as const }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (imageReferences.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"xAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n image: imageReferences.length === 1 ? imageReferences[0] : undefined,\n images: imageReferences.length > 1 ? imageReferences : undefined,\n },\n nativeOptions(request.options),\n http?.body,\n ) as XAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${imageReferences.length === 0 ? PATH : EDIT_PATH}`,\n http?.query,\n )\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the xAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(XAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"xAI Images returned an invalid response\")),\n )\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n const mediaType = item.mime_type ?? \"application/octet-stream\"\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`xAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType,\n data,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`xAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"xAI Images returned no images\")\n const usage = ProviderShared.isRecord(decoded.usage) ? decoded.usage : undefined\n return new ImageResponse({\n images,\n usage: usage === undefined ? undefined : new Usage({ providerMetadata: { xai: usage } }),\n providerMetadata: usage === undefined ? undefined : { xai: { usage } },\n })\n }),\n }\n return ImageModel.make<XAIImageOptions>({ id: input.id, provider: \"xai\", route, http: input.http })\n}\n\nexport const XAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { HttpOptions, ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile.js\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport * as OpenAIResponses from \"../protocols/openai-responses.js\"\nimport { XAIImages } from \"../protocols/xai-images.js\"\nimport type { OpenAIOptionsInput } from \"./openai-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\n\nexport const id = ProviderID.make(\"xai\")\n\nexport type XAIProviderOptionsInput = OpenAIOptionsInput\n\nexport type LanguageModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: XAIProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: XAIProviderOptionsInput\n}\n\nexport type { XAIImageOptions } from \"../protocols/xai-images.js\"\n\nconst RESPONSES_WEBSOCKET_ROTATE_AFTER_MS = 24 * 60 * 1000\n\nconst responsesRoute = Route.make({\n id: \"openai-responses\",\n provider: id,\n providerMetadataKey: \"xai\",\n protocol: OpenAIResponses.protocol,\n endpoint: Endpoint.path(\"/responses\", { baseURL: OpenAICompatibleProfiles.profiles.xai.baseURL }),\n transport: OpenAIResponses.channelTransport({\n id: \"openai-responses\",\n name: \"xAI Responses\",\n rotateAfterMs: RESPONSES_WEBSOCKET_ROTATE_AFTER_MS,\n }),\n defaults: { providerOptions: { store: false } },\n})\n\nconst chatRoute = Route.make({\n id: \"openai-compatible-chat\",\n provider: id,\n providerMetadataKey: \"xai\",\n protocol: OpenAIChat.protocol,\n endpoint: Endpoint.path(\"/chat/completions\", { baseURL: OpenAICompatibleProfiles.profiles.xai.baseURL }),\n transport: OpenAICompatibleChat.route.transport,\n headers: ({ request }): Record<string, string> =>\n request.promptCacheKey ? { \"x-grok-conv-id\": request.promptCacheKey } : {},\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"XAI_API_KEY\")\n\nconst configuredResponsesRoute = (input: LanguageModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return responsesRoute.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nconst configuredChatRoute = (input: LanguageModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return chatRoute.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nexport const configure = (input: LanguageModelOptions = {}) => {\n const responsesRoute = configuredResponsesRoute(input)\n const chatRoute = configuredChatRoute(input)\n const responses = (modelID: string | ModelID) => responsesRoute.model<XAIProviderOptionsInput>({ id: modelID })\n const chat = (modelID: string | ModelID) => chatRoute.model<XAIProviderOptionsInput>({ id: modelID })\n const image = (modelID: string | ModelID) =>\n XAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL,\n headers: input.headers,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n return {\n id,\n model: responses,\n responses,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, XAIProviderOptionsInput>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\nexport const responses = provider.responses\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "97360C433BD324BD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/google-images.ts", "../ai/src/providers/google.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport {\n GeneratedImage,\n ImageModel,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n type ProviderMetadata,\n} from \"../schema/index.js\"\nimport { ProviderShared } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\n\nconst ADAPTER = \"google-images\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\nexport type GoogleImageString<Known extends string> = Known | (string & {})\n\nexport type GoogleImageOptions = {\n readonly aspectRatio?: GoogleImageString<\n \"1:1\" | \"2:3\" | \"3:2\" | \"3:4\" | \"4:3\" | \"4:5\" | \"5:4\" | \"9:16\" | \"16:9\" | \"21:9\"\n >\n readonly imageSize?: GoogleImageString<\"1K\" | \"2K\" | \"4K\">\n readonly seed?: number\n readonly thinkingLevel?: GoogleImageString<\"MINIMAL\" | \"LOW\" | \"MEDIUM\" | \"HIGH\">\n readonly includeThoughts?: boolean\n} & Record<string, unknown>\n\nexport type GoogleImageBody = Record<string, unknown> & {\n readonly contents: ReadonlyArray<{\n readonly role: \"user\"\n readonly parts: ReadonlyArray<Record<string, unknown>>\n }>\n readonly generationConfig: Record<string, unknown>\n}\n\nconst GoogleUsage = Schema.StructWithRest(\n Schema.Struct({\n cachedContentTokenCount: Schema.optional(Schema.Number),\n thoughtsTokenCount: Schema.optional(Schema.Number),\n promptTokenCount: Schema.optional(Schema.Number),\n candidatesTokenCount: Schema.optional(Schema.Number),\n totalTokenCount: Schema.optional(Schema.Number),\n promptTokensDetails: Schema.optional(Schema.Unknown),\n candidatesTokensDetails: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst GoogleImageResponse = Schema.Struct({\n candidates: Schema.optional(\n Schema.Array(\n Schema.Struct({\n index: Schema.optional(Schema.Number),\n content: Schema.optional(\n Schema.Struct({\n parts: Schema.Array(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n inlineData: Schema.optional(\n Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n ),\n }),\n ),\n }),\n ),\n finishReason: Schema.optional(Schema.String),\n finishMessage: Schema.optional(Schema.String),\n safetyRatings: Schema.optional(Schema.Unknown),\n citationMetadata: Schema.optional(Schema.Unknown),\n groundingMetadata: Schema.optional(Schema.Unknown),\n }),\n ),\n ),\n usageMetadata: Schema.optional(GoogleUsage),\n modelVersion: Schema.optional(Schema.String),\n responseId: Schema.optional(Schema.String),\n promptFeedback: Schema.optional(Schema.Unknown),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly http?: HttpOptions\n}\n\nconst nativeOptions = (options: GoogleImageOptions | undefined) => {\n const { aspectRatio, imageSize, seed, thinkingLevel, includeThoughts, ...native } = options ?? {}\n const image = {\n aspectRatio,\n imageSize,\n }\n const thinkingConfig = {\n thinkingLevel,\n includeThoughts,\n }\n return (\n mergeJsonRecords(\n {\n responseModalities: [\"IMAGE\"],\n imageConfig: Object.values(image).some((value) => value !== undefined) ? image : undefined,\n seed,\n thinkingConfig: Object.values(thinkingConfig).some((value) => value !== undefined) ? thinkingConfig : undefined,\n },\n native,\n ) ?? { responseModalities: [\"IMAGE\"] }\n )\n}\n\nconst invalidOutput = (message: string, providerMetadata?: ProviderMetadata) =>\n new AIError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER, providerMetadata }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<GoogleImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"GoogleImages.generate\")(function* (request: ImageRequestFor<GoogleImageOptions>, execute) {\n const imageParts = yield* Effect.forEach(request.images ?? [], googleImagePart)\n const http = mergeHttpOptions(request.model.http, request.http)\n const requestBody = mergeJsonRecords(\n {\n contents: [{ role: \"user\", parts: [{ text: request.prompt }, ...imageParts] }],\n generationConfig: nativeOptions(request.options),\n },\n http?.body,\n ) as GoogleImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}/models/${request.model.id}:generateContent`,\n http?.query,\n )\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the Google Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(GoogleImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"Google Images returned an invalid response\")),\n )\n const candidates = decoded.candidates ?? []\n const candidateMetadata = candidates.map((candidate, candidateIndex) => ({\n index: candidate.index ?? candidateIndex,\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n groundingMetadata: candidate.groundingMetadata,\n parts: (candidate.content?.parts ?? []).map((part) =>\n part.inlineData === undefined\n ? {\n type: \"text\",\n text: part.text,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n }\n : {\n type: \"inlineData\",\n mediaType: part.inlineData.mimeType,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n },\n ),\n }))\n const encoded = candidates.flatMap((candidate, candidateIndex) =>\n (candidate.content?.parts ?? []).flatMap((part, partIndex) =>\n part.inlineData === undefined || part.thought === true\n ? []\n : [{ candidate, candidateIndex, partIndex, inlineData: part.inlineData }],\n ),\n )\n const images = yield* Effect.forEach(encoded, (item) =>\n Effect.fromResult(Encoding.decodeBase64(item.inlineData.data)).pipe(\n Effect.mapError(() =>\n invalidOutput(\n `Google Images candidate ${item.candidateIndex} part ${item.partIndex} contains invalid base64 data`,\n ),\n ),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: item.inlineData.mimeType,\n data,\n providerMetadata: {\n google: {\n candidateIndex: item.candidate.index ?? item.candidateIndex,\n partIndex: item.partIndex,\n finishReason: item.candidate.finishReason,\n safetyRatings: item.candidate.safetyRatings,\n citationMetadata: item.candidate.citationMetadata,\n groundingMetadata: item.candidate.groundingMetadata,\n thoughtSignature: item.candidate.content?.parts[item.partIndex]?.thoughtSignature,\n },\n },\n }),\n ),\n ),\n )\n if (images.length === 0) {\n const finishReasons = candidates.flatMap((candidate) =>\n candidate.finishReason === undefined ? [] : [candidate.finishReason],\n )\n return yield* invalidOutput(\n `Google Images returned no final images${\n finishReasons.length === 0 ? \"\" : ` (finish reasons: ${finishReasons.join(\", \")})`\n }; inspect reason.providerMetadata.google for prompt feedback and candidate details`,\n {\n google: {\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n )\n }\n const usage = decoded.usageMetadata\n const outputTokens =\n usage?.candidatesTokenCount === undefined\n ? undefined\n : usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0)\n return new ImageResponse({\n images,\n usage:\n usage === undefined\n ? undefined\n : new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: ProviderShared.subtractTokens(\n usage.promptTokenCount,\n usage.cachedContentTokenCount,\n ),\n cacheReadInputTokens: usage.cachedContentTokenCount,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n }),\n providerMetadata: {\n google: {\n modelVersion: decoded.modelVersion,\n responseId: decoded.responseId,\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n })\n }),\n }\n return ImageModel.make<GoogleImageOptions>({ id: input.id, provider: \"google\", route, http: input.http })\n}\n\nconst googleImagePart = (image: ImageInput): Effect.Effect<Record<string, unknown>, AIError> => {\n if (image.type === \"bytes\")\n return Effect.succeed({ inlineData: { mimeType: image.mediaType, data: Encoding.encodeBase64(image.data) } })\n if (image.type === \"file-uri\") return Effect.succeed({ fileData: { mimeType: image.mediaType, fileUri: image.uri } })\n if (image.type === \"url\")\n return ImageInputs.decodeDataUrl(image.url, ADAPTER).pipe(\n Effect.flatMap((decoded) => {\n if (decoded === undefined)\n return Effect.fail(\n ImageInputs.invalid(\n ADAPTER,\n \"Google generateContent does not fetch public image URLs; use bytes, a data URL, or a Gemini file URI\",\n ),\n )\n return Effect.succeed({\n inlineData: { mimeType: decoded.mediaType, data: Encoding.encodeBase64(decoded.data) },\n })\n }),\n )\n return Effect.fail(\n ImageInputs.invalid(ADAPTER, \"Google generateContent requires Gemini file URIs rather than provider file IDs\"),\n )\n}\n\nexport const GoogleImages = {\n model,\n} as const\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { HttpOptions, ProviderID, mergeHttpOptions, type ModelID } from \"../schema/index.js\"\nimport { Gemini } from \"../protocols/gemini.js\"\nimport { GoogleImages } from \"../protocols/google-images.js\"\n\nexport type { GoogleImageOptions } from \"../protocols/google-images.js\"\nexport type GeminiOptionsInput = Gemini.OptionsInput\nexport type GeminiProviderOptionsInput = Gemini.ProviderOptionsInput\n\nexport const id = ProviderID.make(\"google\")\n\nexport const routes = [Gemini.route]\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: Gemini.ProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: Gemini.ProviderOptionsInput\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"GOOGLE_GENERATIVE_AI_API_KEY\"))\n .pipe(Auth.header(\"x-goog-api-key\"))\n}\n\nconst configuredRoute = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return Gemini.route.with({ ...rest, endpoint: { baseURL }, auth: auth(input) })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n const image = (modelID: string | ModelID) =>\n GoogleImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n http: mergeHttpOptions(input.http === undefined ? undefined : HttpOptions.make(input.http)),\n })\n return {\n id,\n model: (modelID: string | ModelID) => route.model<Gemini.ProviderOptionsInput>({ id: modelID }),\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, Gemini.ProviderOptionsInput>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\n\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "328545AAC903F72464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "688F150A39C4103964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "2A4BDAD01D83722964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "E1545D92A784174364756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/project-id.ts", "../schema/src/identifier.ts", "../schema/src/workspace-id.ts", "../schema/src/location.ts", "../schema/src/event.ts", "../schema/src/integration-id.ts", "../schema/src/form.ts", "../schema/src/credential.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const ProjectID = Schema.String.pipe(\n Schema.brand(\"Project.ID\"),\n statics((schema) => ({ global: schema.make(\"global\") })),\n)\nexport type ProjectID = typeof ProjectID.Type\n", | ||
| "const length = 26\nconst chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nlet lastTimestamp = 0\nlet counter = 0\n\nexport function ascending() {\n return create(false)\n}\n\nexport function descending() {\n return create(true)\n}\n\nexport function create(descending: boolean, timestamp = Date.now()) {\n if (timestamp !== lastTimestamp) {\n lastTimestamp = timestamp\n counter = 0\n }\n counter++\n\n const current = BigInt(timestamp) * 0x1000n + BigInt(counter)\n const value = descending ? ~current : current\n const time = Array.from({ length: 6 }, (_, index) =>\n Number((value >> BigInt(40 - 8 * index)) & 0xffn)\n .toString(16)\n .padStart(2, \"0\"),\n ).join(\"\")\n const bytes = crypto.getRandomValues(new Uint8Array(length - 12))\n return time + Array.from(bytes, (byte) => chars[byte % 62]).join(\"\")\n}\n", | ||
| "import { Schema } from \"effect\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const WorkspaceID = Schema.String.check(Schema.isStartsWith(\"wrk\")).pipe(\n Schema.brand(\"Workspace.ID\"),\n statics((schema) => {\n const create = () => schema.make(\"wrk_\" + ascending())\n return {\n ascending: (id?: string) => {\n if (!id) return create()\n if (!id.startsWith(\"wrk\")) throw new Error(`ID ${id} does not start with wrk`)\n return schema.make(id)\n },\n create,\n }\n }),\n)\nexport type WorkspaceID = typeof WorkspaceID.Type\n", | ||
| "export * as Location from \"./location.js\"\n\nimport { Schema } from \"effect\"\nimport { AbsolutePath, optional } from \"./schema.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n}).annotate({ identifier: \"Location.Ref\" })\n\nexport class Info extends Schema.Class<Info>(\"Location.Info\")({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n project: Schema.Struct({\n id: ProjectID,\n directory: AbsolutePath,\n canonical: AbsolutePath,\n }),\n}) {}\n\nexport function response<S extends Schema.Top>(data: S) {\n return Schema.Struct({ location: Info, data })\n}\n", | ||
| "export * as Event from \"./event.js\"\n\nimport { Schema, SchemaTransformation } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Location } from \"./location.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"evt_\")).pipe(\n Schema.brand(\"Event.ID\"),\n statics((schema) => ({ create: () => schema.make(\"evt_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\n/**\n * Position in one aggregate's durable log. Values originate from the durable\n * event envelope and synced markers;\n * `after` cursors accept only values that came from those sources.\n */\nexport const Seq = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(Schema.brand(\"Event.Seq\"))\nexport type Seq = typeof Seq.Type\n\n/** Durable schema version of one event type, from the event definition that committed it. */\nexport const Version = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).pipe(Schema.brand(\"Event.Version\"))\nexport type Version = typeof Version.Type\n\nconst DurableEnvelope = Schema.Struct({ aggregateID: Schema.String, seq: Seq, version: Version })\nexport type DurableEnvelope = typeof DurableEnvelope.Type\n\nexport type DurableDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"durable\"\n readonly durable: {\n readonly version: number\n readonly aggregate: string\n }\n readonly data: DataSchema\n}\n\nexport type EphemeralDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"ephemeral\"\n readonly durable?: never\n readonly data: DataSchema\n}\n\nexport type Definition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = DurableDefinition<Type, DataSchema> | EphemeralDefinition<Type, DataSchema>\n\nexport type Data<D extends Definition> = Schema.Schema.Type<D[\"data\"]>\n\ntype PayloadBase<D extends Definition> = {\n readonly id: ID\n readonly type: D[\"type\"]\n readonly created: number\n readonly data: Data<D>\n readonly location?: Location.Ref\n readonly metadata?: Record<string, unknown>\n}\n\nexport type Payload<D extends Definition = Definition> = D extends DurableDefinition\n ? PayloadBase<D> & { readonly durable: DurableEnvelope }\n : PayloadBase<D> & { readonly durable?: never }\n\ntype Input<Type extends string, Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>> = {\n readonly type: Type\n readonly identifier?: string\n readonly durable?: {\n readonly version: number\n readonly aggregate: string\n }\n readonly schema: Fields\n}\n\nexport function durable<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Input<Type, Fields> & { readonly durable: NonNullable<Input<Type, Fields>[\"durable\"]> }) {\n const data = Schema.Struct(input.schema)\n const durable = Schema.Struct({\n aggregateID: DurableEnvelope.fields.aggregateID,\n seq: DurableEnvelope.fields.seq,\n version: Schema.Literal(input.durable.version).pipe(\n Schema.decodeTo(\n Schema.toType(Version),\n SchemaTransformation.transform({\n decode: () => Version.make(input.durable.version),\n encode: () => input.durable.version,\n }),\n ),\n ),\n })\n return Schema.Struct({\n id: ID,\n created: Schema.Finite,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n durable,\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"durable\" as const,\n durable: input.durable,\n data,\n })),\n ) satisfies DurableDefinition<Type, typeof data>\n}\n\nexport function ephemeral<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Omit<Input<Type, Fields>, \"durable\">) {\n const data = Schema.Struct(input.schema)\n return Schema.Struct({\n id: ID,\n created: Schema.Finite,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"ephemeral\" as const,\n durable: undefined,\n data,\n })),\n ) satisfies EphemeralDefinition<Type, typeof data>\n}\n\nexport function inventory<const Definitions extends ReadonlyArray<Definition>>(...definitions: Definitions) {\n return Object.freeze(definitions)\n}\n\nexport function latest(definitions: ReadonlyArray<Definition>) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n const existing = result.get(definition.type)\n if (!existing) {\n result.set(definition.type, definition)\n return result\n }\n if (definition.durable && existing.durable && definition.durable.version !== existing.durable.version) {\n if (definition.durable.version > existing.durable.version) result.set(definition.type, definition)\n return result\n }\n if (definition !== existing) throw new Error(`Duplicate latest event definition for ${definition.type}`)\n return result\n }, new Map<string, Definition>()),\n )\n}\n\nexport function versionedType(type: string, version: number) {\n return `${type}.${version}`\n}\n\nexport function durableMap<const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n if (definition.durability !== \"durable\") return result\n const key = versionedType(definition.type, definition.durable.version)\n if (result.has(key)) throw new Error(`Duplicate durable event definition for ${key}`)\n result.set(key, definition)\n return result\n }, new Map<string, DurableDefinition>()),\n )\n}\n\nfunction readonlyMap<Key, Value>(map: Map<Key, Value>): ReadonlyMap<Key, Value> {\n const result: ReadonlyMap<Key, Value> = Object.freeze({\n get size() {\n return map.size\n },\n entries: () => map.entries(),\n forEach: (callback: (value: Value, key: Key, map: ReadonlyMap<Key, Value>) => void, thisArg?: unknown) =>\n map.forEach((value, key) => callback.call(thisArg, value, key, result)),\n get: (key: Key) => map.get(key),\n has: (key: Key) => map.has(key),\n keys: () => map.keys(),\n values: () => map.values(),\n [Symbol.iterator]: () => map[Symbol.iterator](),\n })\n return result\n}\n", | ||
| "import { Schema } from \"effect\"\n\nexport const IntegrationID = Schema.String.pipe(Schema.brand(\"Integration.ID\"))\nexport type IntegrationID = typeof IntegrationID.Type\n\nexport const IntegrationMethodID = Schema.String.pipe(Schema.brand(\"Integration.MethodID\"))\nexport type IntegrationMethodID = typeof IntegrationMethodID.Type\n", | ||
| "export * as Form from \"./form.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, optional, statics } from \"./schema.js\"\n\nconst IDSchema = Schema.String.check(Schema.isStartsWith(\"frm_\")).pipe(Schema.brand(\"Form.ID\"))\n\nexport const ID = IDSchema.pipe(\n statics((schema: typeof IDSchema) => ({ create: (id?: string) => schema.make(id ?? \"frm_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Metadata = Schema.Record(Schema.String, Schema.Unknown).annotate({ identifier: \"Form.Metadata\" })\nexport type Metadata = typeof Metadata.Type\n\nexport const Option = Schema.Struct({\n value: Schema.String,\n label: Schema.String,\n description: Schema.String.pipe(optional),\n}).annotate({ identifier: \"Form.Option\" })\nexport interface Option extends Schema.Schema.Type<typeof Option> {}\n\n// One visibility condition on a field. A field's `when` is a list of conditions that must all\n// hold (AND) against the current answers for the field to be active. Semantics:\n// - `value` must match the referenced field's type; against a multiselect answer, `eq` means\n// \"selection includes value\" and `neq` means \"selection does not include value\".\n// - An unanswered referenced field makes the condition false for both ops.\n// - `key` must reference a field defined earlier in the form's field list.\n// Inactive fields are neither required nor answerable.\nexport const When = Schema.Struct({\n key: Schema.String,\n op: Schema.Literals([\"eq\", \"neq\"]),\n value: Schema.Union([Schema.String, Schema.Number, Schema.Boolean]),\n}).annotate({ identifier: \"Form.When\" })\nexport interface When extends Schema.Schema.Type<typeof When> {}\n\nconst FieldBase = {\n key: Schema.String,\n title: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n required: Schema.Boolean.pipe(optional),\n when: Schema.Array(When).pipe(optional),\n}\n\nexport const StringField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"string\"),\n format: Schema.Literals([\"email\", \"uri\", \"date\", \"date-time\"]).pipe(optional),\n minLength: NonNegativeInt.pipe(optional),\n maxLength: NonNegativeInt.pipe(optional),\n pattern: Schema.String.pipe(optional),\n placeholder: Schema.String.pipe(optional),\n default: Schema.String.pipe(optional),\n options: Schema.Array(Option).pipe(optional),\n custom: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Form.StringField\" })\nexport interface StringField extends Schema.Schema.Type<typeof StringField> {}\n\nexport const NumberField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"number\"),\n minimum: Schema.Number.pipe(optional),\n maximum: Schema.Number.pipe(optional),\n default: Schema.Number.pipe(optional),\n}).annotate({ identifier: \"Form.NumberField\" })\nexport interface NumberField extends Schema.Schema.Type<typeof NumberField> {}\n\nexport const IntegerField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"integer\"),\n minimum: Schema.Number.pipe(optional),\n maximum: Schema.Number.pipe(optional),\n default: Schema.Number.pipe(optional),\n}).annotate({ identifier: \"Form.IntegerField\" })\nexport interface IntegerField extends Schema.Schema.Type<typeof IntegerField> {}\n\nexport const BooleanField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"boolean\"),\n default: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Form.BooleanField\" })\nexport interface BooleanField extends Schema.Schema.Type<typeof BooleanField> {}\n\nexport const MultiselectField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"multiselect\"),\n options: Schema.Array(Option),\n minItems: NonNegativeInt.pipe(optional),\n maxItems: NonNegativeInt.pipe(optional),\n custom: Schema.Boolean.pipe(optional),\n default: Schema.Array(Schema.String).pipe(optional),\n}).annotate({ identifier: \"Form.MultiselectField\" })\nexport interface MultiselectField extends Schema.Schema.Type<typeof MultiselectField> {}\n\nexport const ExternalField = Schema.Struct({\n key: Schema.String,\n type: Schema.Literal(\"external\"),\n url: Schema.String,\n title: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n}).annotate({ identifier: \"Form.ExternalField\" })\nexport interface ExternalField extends Schema.Schema.Type<typeof ExternalField> {}\n\nexport const Field = Schema.Union([\n StringField,\n NumberField,\n IntegerField,\n BooleanField,\n MultiselectField,\n ExternalField,\n]).pipe(Schema.toTaggedUnion(\"type\"), Schema.annotate({ identifier: \"Form.Field\" }))\nexport type Field = StringField | NumberField | IntegerField | BooleanField | MultiselectField | ExternalField\n\nexport const Fields = Schema.NonEmptyArray(Field).annotate({ identifier: \"Form.Fields\" })\nexport type Fields = typeof Fields.Type\n\nconst InfoBase = {\n id: ID,\n // This should be typed as SessionID. It is a plain string only because MCP elicitation\n // temporarily needs the `\"global\"` sentinel owner, which is not a real session. Once\n // elicitations can be attributed to real sessions, revert this to SessionID. Do not rely\n // on non-session owners anywhere else.\n sessionID: Schema.String,\n title: Schema.String,\n metadata: Metadata.pipe(optional),\n}\n\nexport const Info = Schema.Struct({\n ...InfoBase,\n fields: Fields,\n}).annotate({ identifier: \"Form.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const Value = Schema.Union([Schema.String, Schema.Number, Schema.Boolean, Schema.Array(Schema.String)]).annotate(\n {\n identifier: \"Form.Value\",\n },\n)\nexport type Value = typeof Value.Type\n\nexport const Answer = Schema.Record(Schema.String, Value).annotate({ identifier: \"Form.Answer\" })\nexport type Answer = typeof Answer.Type\n\nexport const State = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\") }),\n Schema.Struct({ status: Schema.Literal(\"answered\"), answer: Answer }),\n Schema.Struct({ status: Schema.Literal(\"cancelled\") }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Form.State\" })\nexport type State = typeof State.Type\n\nexport const Reply = Schema.Struct({\n answer: Answer,\n}).annotate({ identifier: \"Form.Reply\" })\nexport interface Reply extends Schema.Schema.Type<typeof Reply> {}\n\nconst Created = ephemeral({ type: \"form.created\", schema: { form: Info } })\nconst Replied = ephemeral({ type: \"form.replied\", schema: { id: ID, sessionID: Schema.String, answer: Answer } })\nconst Cancelled = ephemeral({ type: \"form.cancelled\", schema: { id: ID, sessionID: Schema.String } })\n\nexport const Event = { Created, Replied, Cancelled, Definitions: inventory(Created, Replied, Cancelled) }\n", | ||
| "export * as Credential from \"./credential.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { IntegrationMethodID } from \"./integration-id.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\nimport { Form } from \"./form.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"Credential.ID\"),\n statics((schema) => ({ create: () => schema.make(\"cred_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport interface OAuth extends Schema.Schema.Type<typeof OAuth> {}\nexport const OAuth = Schema.Struct({\n type: Schema.Literal(\"oauth\"),\n methodID: IntegrationMethodID,\n refresh: Schema.String,\n access: Schema.String,\n expires: NonNegativeInt,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n}).annotate({ identifier: \"Credential.OAuth\" })\n\nexport interface Key extends Schema.Schema.Type<typeof Key> {}\nexport const Key = Schema.Struct({\n type: Schema.Literal(\"key\"),\n key: Schema.String,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n configuration: optional(Form.Answer),\n}).annotate({ identifier: \"Credential.Key\" })\n\nexport const Value = Schema.Union([OAuth, Key])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Credential.Value\" })\nexport type Value = Schema.Schema.Type<typeof Value>\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "47D30E5591A99AD064756E2164756E21", | ||
| "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": "AB5B21F1B9A0CE0F64756E2164756E21", | ||
| "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": "3FA8C5F3946E4B9664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/picocolors@1.1.1/node_modules/picocolors/picocolors.js"], | ||
| "sourcesContent": [ | ||
| "let p = process || {}, argv = p.argv || [], env = p.env || {}\nlet isColorSupported =\n\t!(!!env.NO_COLOR || argv.includes(\"--no-color\")) &&\n\t(!!env.FORCE_COLOR || argv.includes(\"--color\") || p.platform === \"win32\" || ((p.stdout || {}).isTTY && env.TERM !== \"dumb\") || !!env.CI)\n\nlet formatter = (open, close, replace = open) =>\n\tinput => {\n\t\tlet string = \"\" + input, index = string.indexOf(close, open.length)\n\t\treturn ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close\n\t}\n\nlet replaceClose = (string, close, replace, index) => {\n\tlet result = \"\", cursor = 0\n\tdo {\n\t\tresult += string.substring(cursor, index) + replace\n\t\tcursor = index + close.length\n\t\tindex = string.indexOf(close, cursor)\n\t} while (~index)\n\treturn result + string.substring(cursor)\n}\n\nlet createColors = (enabled = isColorSupported) => {\n\tlet f = enabled ? formatter : () => String\n\treturn {\n\t\tisColorSupported: enabled,\n\t\treset: f(\"\\x1b[0m\", \"\\x1b[0m\"),\n\t\tbold: f(\"\\x1b[1m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[1m\"),\n\t\tdim: f(\"\\x1b[2m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"),\n\t\titalic: f(\"\\x1b[3m\", \"\\x1b[23m\"),\n\t\tunderline: f(\"\\x1b[4m\", \"\\x1b[24m\"),\n\t\tinverse: f(\"\\x1b[7m\", \"\\x1b[27m\"),\n\t\thidden: f(\"\\x1b[8m\", \"\\x1b[28m\"),\n\t\tstrikethrough: f(\"\\x1b[9m\", \"\\x1b[29m\"),\n\n\t\tblack: f(\"\\x1b[30m\", \"\\x1b[39m\"),\n\t\tred: f(\"\\x1b[31m\", \"\\x1b[39m\"),\n\t\tgreen: f(\"\\x1b[32m\", \"\\x1b[39m\"),\n\t\tyellow: f(\"\\x1b[33m\", \"\\x1b[39m\"),\n\t\tblue: f(\"\\x1b[34m\", \"\\x1b[39m\"),\n\t\tmagenta: f(\"\\x1b[35m\", \"\\x1b[39m\"),\n\t\tcyan: f(\"\\x1b[36m\", \"\\x1b[39m\"),\n\t\twhite: f(\"\\x1b[37m\", \"\\x1b[39m\"),\n\t\tgray: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\n\t\tbgBlack: f(\"\\x1b[40m\", \"\\x1b[49m\"),\n\t\tbgRed: f(\"\\x1b[41m\", \"\\x1b[49m\"),\n\t\tbgGreen: f(\"\\x1b[42m\", \"\\x1b[49m\"),\n\t\tbgYellow: f(\"\\x1b[43m\", \"\\x1b[49m\"),\n\t\tbgBlue: f(\"\\x1b[44m\", \"\\x1b[49m\"),\n\t\tbgMagenta: f(\"\\x1b[45m\", \"\\x1b[49m\"),\n\t\tbgCyan: f(\"\\x1b[46m\", \"\\x1b[49m\"),\n\t\tbgWhite: f(\"\\x1b[47m\", \"\\x1b[49m\"),\n\n\t\tblackBright: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\t\tredBright: f(\"\\x1b[91m\", \"\\x1b[39m\"),\n\t\tgreenBright: f(\"\\x1b[92m\", \"\\x1b[39m\"),\n\t\tyellowBright: f(\"\\x1b[93m\", \"\\x1b[39m\"),\n\t\tblueBright: f(\"\\x1b[94m\", \"\\x1b[39m\"),\n\t\tmagentaBright: f(\"\\x1b[95m\", \"\\x1b[39m\"),\n\t\tcyanBright: f(\"\\x1b[96m\", \"\\x1b[39m\"),\n\t\twhiteBright: f(\"\\x1b[97m\", \"\\x1b[39m\"),\n\n\t\tbgBlackBright: f(\"\\x1b[100m\", \"\\x1b[49m\"),\n\t\tbgRedBright: f(\"\\x1b[101m\", \"\\x1b[49m\"),\n\t\tbgGreenBright: f(\"\\x1b[102m\", \"\\x1b[49m\"),\n\t\tbgYellowBright: f(\"\\x1b[103m\", \"\\x1b[49m\"),\n\t\tbgBlueBright: f(\"\\x1b[104m\", \"\\x1b[49m\"),\n\t\tbgMagentaBright: f(\"\\x1b[105m\", \"\\x1b[49m\"),\n\t\tbgCyanBright: f(\"\\x1b[106m\", \"\\x1b[49m\"),\n\t\tbgWhiteBright: f(\"\\x1b[107m\", \"\\x1b[49m\"),\n\t}\n}\n\nmodule.exports = createColors()\nmodule.exports.createColors = createColors\n" | ||
| ], | ||
| "mappings": ";0EAAA,IAAI,EAAI,SAAW,CAAC,EAAG,EAAO,EAAE,MAAQ,CAAC,EAAG,EAAM,EAAE,KAAO,CAAC,EACxD,EACH,EAAE,CAAC,CAAC,EAAI,UAAY,EAAK,SAAS,YAAY,KAC7C,CAAC,CAAC,EAAI,aAAe,EAAK,SAAS,SAAS,GAAK,EAAE,WAAa,UAAa,EAAE,QAAU,CAAC,GAAG,OAAS,EAAI,OAAS,QAAW,CAAC,CAAC,EAAI,IAElI,EAAY,CAAC,EAAM,EAAO,EAAU,IACvC,KAAS,CACR,IAAI,EAAS,GAAK,EAAO,EAAQ,EAAO,QAAQ,EAAO,EAAK,MAAM,EAClE,MAAO,CAAC,EAAQ,EAAO,EAAa,EAAQ,EAAO,EAAS,CAAK,EAAI,EAAQ,EAAO,EAAS,GAG3F,EAAe,CAAC,EAAQ,EAAO,EAAS,IAAU,CACrD,IAAI,EAAS,GAAI,EAAS,EAC1B,GACC,GAAU,EAAO,UAAU,EAAQ,CAAK,EAAI,EAC5C,EAAS,EAAQ,EAAM,OACvB,EAAQ,EAAO,QAAQ,EAAO,CAAM,QAC5B,CAAC,GACV,OAAO,EAAS,EAAO,UAAU,CAAM,GAGpC,EAAe,CAAC,EAAU,IAAqB,CAClD,IAAI,EAAI,EAAU,EAAY,IAAM,OACpC,MAAO,CACN,iBAAkB,EAClB,MAAO,EAAE,UAAW,SAAS,EAC7B,KAAM,EAAE,UAAW,WAAY,iBAAiB,EAChD,IAAK,EAAE,UAAW,WAAY,iBAAiB,EAC/C,OAAQ,EAAE,UAAW,UAAU,EAC/B,UAAW,EAAE,UAAW,UAAU,EAClC,QAAS,EAAE,UAAW,UAAU,EAChC,OAAQ,EAAE,UAAW,UAAU,EAC/B,cAAe,EAAE,UAAW,UAAU,EAEtC,MAAO,EAAE,WAAY,UAAU,EAC/B,IAAK,EAAE,WAAY,UAAU,EAC7B,MAAO,EAAE,WAAY,UAAU,EAC/B,OAAQ,EAAE,WAAY,UAAU,EAChC,KAAM,EAAE,WAAY,UAAU,EAC9B,QAAS,EAAE,WAAY,UAAU,EACjC,KAAM,EAAE,WAAY,UAAU,EAC9B,MAAO,EAAE,WAAY,UAAU,EAC/B,KAAM,EAAE,WAAY,UAAU,EAE9B,QAAS,EAAE,WAAY,UAAU,EACjC,MAAO,EAAE,WAAY,UAAU,EAC/B,QAAS,EAAE,WAAY,UAAU,EACjC,SAAU,EAAE,WAAY,UAAU,EAClC,OAAQ,EAAE,WAAY,UAAU,EAChC,UAAW,EAAE,WAAY,UAAU,EACnC,OAAQ,EAAE,WAAY,UAAU,EAChC,QAAS,EAAE,WAAY,UAAU,EAEjC,YAAa,EAAE,WAAY,UAAU,EACrC,UAAW,EAAE,WAAY,UAAU,EACnC,YAAa,EAAE,WAAY,UAAU,EACrC,aAAc,EAAE,WAAY,UAAU,EACtC,WAAY,EAAE,WAAY,UAAU,EACpC,cAAe,EAAE,WAAY,UAAU,EACvC,WAAY,EAAE,WAAY,UAAU,EACpC,YAAa,EAAE,WAAY,UAAU,EAErC,cAAe,EAAE,YAAa,UAAU,EACxC,YAAa,EAAE,YAAa,UAAU,EACtC,cAAe,EAAE,YAAa,UAAU,EACxC,eAAgB,EAAE,YAAa,UAAU,EACzC,aAAc,EAAE,YAAa,UAAU,EACvC,gBAAiB,EAAE,YAAa,UAAU,EAC1C,aAAc,EAAE,YAAa,UAAU,EACvC,cAAe,EAAE,YAAa,UAAU,CACzC,GAGD,EAAO,QAAU,EAAa,EAC9B,EAAO,QAAQ,aAAe", | ||
| "debugId": "64A6DD55ACFFA5F264756E2164756E21", | ||
| "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": "530789E7A655E2C364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/route/auth-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { Config, Redacted } from \"effect\"\nimport { Auth } from \"./auth.js\"\n\nexport type ApiKeyMode = \"optional\" | \"required\"\n\nexport type AuthOverride = {\n readonly auth: Auth.Definition\n readonly apiKey?: never\n}\n\nexport type OptionalApiKeyAuth = {\n readonly apiKey?: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type RequiredApiKeyAuth = {\n readonly apiKey: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type ProviderAuthOption<Mode extends ApiKeyMode> =\n | AuthOverride\n | (Mode extends \"optional\" ? OptionalApiKeyAuth : RequiredApiKeyAuth)\n\nexport type LanguageModelOptions<Base, Mode extends ApiKeyMode> = Omit<Base, \"apiKey\" | \"auth\"> &\n ProviderAuthOption<Mode>\n\nexport type LanguageModelArgs<Base, Mode extends ApiKeyMode> = Mode extends \"optional\"\n ? readonly [options?: LanguageModelOptions<Base, Mode>]\n : readonly [options: LanguageModelOptions<Base, Mode>]\n\nexport type LanguageModelFactory<Base, Mode extends ApiKeyMode, LanguageModel> = (\n id: string,\n ...args: LanguageModelArgs<Base, Mode>\n) => LanguageModel\n\n/**\n * Require at least one of the keys in `T`. Use for option shapes where any\n * subset of fields is acceptable but at least one must be present (e.g. Azure\n * accepts `resourceName` or `baseURL`).\n */\nexport type AtLeastOne<T> = {\n [K in keyof T]: Required<Pick<T, K>> & Partial<Omit<T, K>>\n}[keyof T]\n\n/**\n * Standard bearer-auth resolution for providers: honor an explicit `auth`\n * override, otherwise resolve `apiKey` (option > config var) and apply it as\n * a bearer token.\n */\nexport const bearer = (\n options: ProviderAuthOption<\"optional\">,\n envVar: string | ReadonlyArray<string>,\n): Auth.Definition => {\n if (\"auth\" in options && options.auth) return options.auth\n return (Array.isArray(envVar) ? envVar : [envVar])\n .reduce(\n (auth, name) => auth.orElse(Auth.config(name)),\n Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\"),\n )\n .bearer()\n}\n\nexport * as AuthOptions from \"./auth-options.js\"\n" | ||
| ], | ||
| "mappings": ";uJAkDO,IAAM,EAAS,CACpB,EACA,IACoB,CACpB,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAQ,MAAM,QAAQ,CAAM,EAAI,EAAS,CAAC,CAAM,GAC7C,OACC,CAAC,EAAM,IAAS,EAAK,OAAO,EAAK,OAAO,CAAI,CAAC,EAC7C,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,CAC1E,EACC,OAAO", | ||
| "debugId": "01C639A9A848B0DF64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "A3931305A97396FD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/permission-saved.ts"], | ||
| "sourcesContent": [ | ||
| "export * as PermissionSaved from \"./permission-saved.js\"\n\nimport { Schema } from \"effect\"\nimport { ascending } from \"./identifier.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"PermissionSaved.ID\"),\n statics((schema) => ({ create: () => schema.make(\"psv_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Info = Schema.Struct({\n id: ID,\n projectID: ProjectID,\n action: Schema.String,\n resource: Schema.String,\n}).annotate({ identifier: \"PermissionSaved.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": ";kRAOO,IAAM,EAAK,EAAO,OAAO,KAC9B,EAAO,MAAM,oBAAoB,EACjC,EAAQ,CAAC,KAAY,CAAE,OAAQ,IAAM,EAAO,KAAK,OAAS,EAAU,CAAC,CAAE,EAAE,CAC3E,EAGa,EAAO,EAAO,OAAO,CAChC,GAAI,EACJ,UAAW,EACX,OAAQ,EAAO,OACf,SAAU,EAAO,MACnB,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC", | ||
| "debugId": "EB61FA4D3358C03C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/mcp/oauth.ts"], | ||
| "sourcesContent": [ | ||
| "export * as MCPOAuth from \"./oauth.js\"\n\nimport { auth, type OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\"\nimport type { OAuthClientInformationMixed, OAuthTokens } from \"@modelcontextprotocol/sdk/shared/auth.js\"\nimport { Deferred, Effect } from \"effect\"\nimport { Credential } from \"@opencode-ai/schema/credential\"\nimport { ConfigMCP } from \"@opencode-ai/schema/config/mcp\"\nimport { OauthCallbackPage } from \"../oauth/page.js\"\nimport type { Integration } from \"../integration.js\"\n\n/** Persists the OAuth artifacts for one MCP server session: DCR client info, PKCE verifier, and tokens. */\nexport interface Store {\n readonly tokens: () => Promise<OAuthTokens | undefined>\n readonly saveTokens: (tokens: OAuthTokens) => Promise<void>\n readonly clientInformation: () => Promise<OAuthClientInformationMixed | undefined>\n readonly saveClientInformation: (info: OAuthClientInformationMixed) => Promise<void>\n readonly codeVerifier: () => Promise<string | undefined>\n readonly saveCodeVerifier: (verifier: string) => Promise<void>\n}\n\nexport interface Options {\n /** Loopback URL the authorization server redirects back to after the user approves. */\n readonly redirectUrl: string\n /** Space-delimited OAuth scopes to request when the server requires specific ones. */\n readonly scope?: string\n /** CSRF state embedded in the authorization request; required by the spec and enforced by some servers.\n * The caller is responsible for validating the value echoed back to the redirect. */\n readonly state?: string\n /** Statically pre-registered client credentials from config; when set, the SDK skips dynamic registration. */\n readonly client?: { readonly id: string; readonly secret?: string }\n /** Invoked by the SDK to drop credentials it has determined are invalid (e.g. a rejected refresh token). */\n readonly invalidate?: (scope: \"all\" | \"client\" | \"tokens\" | \"verifier\" | \"discovery\") => void | Promise<void>\n /** Receives the authorization URL so the caller can open a browser and capture the eventual code. */\n readonly onRedirect: (url: URL) => void | Promise<void>\n readonly store: Store\n}\n\n/**\n * Builds the MCP SDK's OAuthClientProvider. The SDK drives dynamic client registration, PKCE, and\n * token refresh through these callbacks; we only persist whatever it hands back via `store`.\n */\nexport const provider = (options: Options): OAuthClientProvider => {\n const state = options.state\n const client = options.client\n return {\n redirectUrl: options.redirectUrl,\n clientMetadata: {\n redirect_uris: [options.redirectUrl],\n client_name: \"opencode\",\n client_uri: \"https://opencode.ai\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: client?.secret ? \"client_secret_post\" : \"none\",\n ...(options.scope ? { scope: options.scope } : {}),\n },\n // Only advertise state when the caller supplied one (the interactive flow); the connect-time\n // provider has no redirect to validate, so it omits it.\n ...(state !== undefined ? { state: () => state } : {}),\n // Static client config short-circuits dynamic registration; otherwise the SDK registers and we persist.\n clientInformation: () =>\n client ? { client_id: client.id, client_secret: client.secret } : options.store.clientInformation(),\n saveClientInformation: (info) => options.store.saveClientInformation(info),\n tokens: () => options.store.tokens(),\n saveTokens: (tokens) => options.store.saveTokens(tokens),\n redirectToAuthorization: (url) => options.onRedirect(url),\n ...(options.invalidate ? { invalidateCredentials: options.invalidate } : {}),\n saveCodeVerifier: (verifier) => options.store.saveCodeVerifier(verifier),\n // The SDK only reads the verifier back after saving one earlier in the same flow; a miss means\n // the flow was resumed without its session state, which the SDK surfaces as an auth failure.\n codeVerifier: async () => {\n const verifier = await options.store.codeVerifier()\n if (!verifier) throw new Error(\"Missing PKCE code verifier for MCP OAuth flow\")\n return verifier\n },\n }\n}\n\n/** A Store that keeps OAuth artifacts in memory for the duration of one interactive login attempt. */\nexport const memoryStore = (): Store => {\n let tokens: OAuthTokens | undefined\n let client: OAuthClientInformationMixed | undefined\n let verifier: string | undefined\n return {\n tokens: async () => tokens,\n saveTokens: async (value) => {\n tokens = value\n },\n clientInformation: async () => client,\n saveClientInformation: async (value) => {\n client = value\n },\n codeVerifier: async () => verifier,\n saveCodeVerifier: async (value) => {\n verifier = value\n },\n }\n}\n\n/** Reads the dynamically-registered client info we stash in a credential's metadata, for token refresh. */\nexport const clientFromCredential = (credential: Credential.OAuth) =>\n credential.metadata?.client as OAuthClientInformationMixed | undefined\n\n/** Folds SDK tokens (plus DCR client info and the server URL) into a storable credential. */\nexport const toCredential = (input: {\n readonly methodID: Integration.MethodID\n readonly serverUrl: string\n readonly tokens: OAuthTokens\n readonly client: OAuthClientInformationMixed | undefined\n}) =>\n Credential.OAuth.make({\n type: \"oauth\",\n methodID: input.methodID,\n access: input.tokens.access_token,\n refresh: input.tokens.refresh_token ?? \"\",\n // 0 marks an unknown/non-expiring token; toTokens then omits expires_in so the SDK won't force a refresh.\n expires: input.tokens.expires_in ? Date.now() + input.tokens.expires_in * 1000 : 0,\n metadata: {\n serverUrl: input.serverUrl,\n tokenType: input.tokens.token_type,\n ...(input.tokens.scope ? { scope: input.tokens.scope } : {}),\n ...(input.client ? { client: input.client } : {}),\n },\n })\n\n/** Reconstructs SDK tokens from a stored credential so the connect-time provider can present them. */\nexport const toTokens = (credential: Credential.OAuth): OAuthTokens => {\n const metadata = credential.metadata ?? {}\n return {\n access_token: credential.access,\n token_type: typeof metadata.tokenType === \"string\" ? metadata.tokenType : \"Bearer\",\n ...(credential.refresh ? { refresh_token: credential.refresh } : {}),\n ...(credential.expires ? { expires_in: Math.max(0, Math.floor((credential.expires - Date.now()) / 1000)) } : {}),\n ...(typeof metadata.scope === \"string\" ? { scope: metadata.scope } : {}),\n }\n}\n\n/**\n * Runs the interactive OAuth login for one remote MCP server. Stands up a loopback callback server,\n * lets the SDK drive DCR + PKCE to produce an authorization URL, and returns an attempt whose callback\n * exchanges the redirect code for a storable credential. Scoped: the callback server closes with the scope.\n */\nexport const authorize = (input: {\n readonly name: string\n readonly config: typeof ConfigMCP.Remote.Type\n readonly methodID: Integration.MethodID\n}) =>\n Effect.gen(function* () {\n const oauth = input.config.oauth || undefined\n const store = memoryStore()\n const code = yield* Deferred.make<string, Error>()\n const redirect = oauth?.redirect_uri ? new URL(oauth.redirect_uri) : undefined\n const redirectPath = redirect?.pathname ?? \"/callback\"\n const state = Buffer.from(crypto.getRandomValues(new Uint8Array(32))).toString(\"base64url\")\n\n // Lazy so runtimes without a loopback listener (workerd) never evaluate node:http.\n const { createServer } = yield* Effect.promise(() => import(\"node:http\"))\n const server = createServer((request, response) => {\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\")\n if (url.pathname !== redirectPath) {\n response.writeHead(404).end(\"Not found\")\n return\n }\n const fail = (reason: string) => {\n Effect.runFork(Deferred.fail(code, new Error(reason)))\n response\n .writeHead(400, { \"Content-Type\": \"text/html\" })\n .end(OauthCallbackPage.error(reason, { provider: input.name }))\n }\n const error = url.searchParams.get(\"error_description\") ?? url.searchParams.get(\"error\")\n if (error) return fail(error)\n // Reject a redirect whose state does not match what we issued: this is the CSRF defense the\n // state parameter exists for, so an attacker can't inject their own authorization code.\n if (url.searchParams.get(\"state\") !== state) return fail(\"OAuth state mismatch\")\n const value = url.searchParams.get(\"code\")\n if (!value) return fail(\"Missing authorization code\")\n Effect.runFork(Deferred.succeed(code, value))\n response.writeHead(200, { \"Content-Type\": \"text/html\" }).end(OauthCallbackPage.success({ provider: input.name }))\n })\n\n // Bind the port the redirect will actually arrive on: an explicit callback_port wins, else the port\n // pinned by redirect_uri, else an ephemeral port. Binding ephemerally while redirect_uri names a fixed\n // port would send the browser somewhere nothing is listening, hanging the attempt until it expires.\n const redirectPort = Number(redirect?.port) || undefined\n const port = yield* Effect.callback<number, Error>((resume) => {\n server.once(\"error\", (error) => resume(Effect.fail(error)))\n server.listen(oauth?.callback_port ?? redirectPort ?? 0, \"127.0.0.1\", () => {\n const address = server.address()\n resume(\n address && typeof address === \"object\"\n ? Effect.succeed(address.port)\n : Effect.fail(new Error(\"Could not determine MCP OAuth callback port\")),\n )\n })\n })\n yield* Effect.addFinalizer(() => Effect.sync(() => server.close()))\n\n let authorizationUrl: URL | undefined\n const oauthProvider = provider({\n redirectUrl: oauth?.redirect_uri ?? `http://127.0.0.1:${port}${redirectPath}`,\n scope: oauth?.scope,\n state,\n client: oauth?.client_id ? { id: oauth.client_id, secret: oauth.client_secret } : undefined,\n onRedirect: (url) => {\n authorizationUrl = url\n },\n store,\n })\n\n const finalize = Effect.gen(function* () {\n const tokens = yield* Effect.promise(() => store.tokens())\n if (!tokens) return yield* Effect.fail(new Error(`MCP server \"${input.name}\" did not return OAuth tokens`))\n const client = yield* Effect.promise(() => store.clientInformation())\n return toCredential({ methodID: input.methodID, serverUrl: input.config.url, tokens, client })\n })\n\n const result = yield* Effect.tryPromise({\n try: () => auth(oauthProvider, { serverUrl: input.config.url, scope: oauth?.scope }),\n catch: (error) => (error instanceof Error ? error : new Error(String(error))),\n })\n\n // The provider may already hold valid tokens (e.g. a re-auth), in which case there is no browser step.\n if (result === \"AUTHORIZED\") {\n return {\n url: input.config.url,\n instructions: `Connected to ${input.name}.`,\n mode: \"auto\" as const,\n callback: finalize,\n }\n }\n if (!authorizationUrl)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" did not provide an authorization URL`))\n\n return {\n url: authorizationUrl.toString(),\n instructions: `Authorize ${input.name} in your browser. This window will close automatically.`,\n mode: \"auto\" as const,\n callback: Deferred.await(code).pipe(\n Effect.flatMap((value) =>\n Effect.tryPromise({\n try: () =>\n auth(oauthProvider, { serverUrl: input.config.url, authorizationCode: value, scope: oauth?.scope }),\n catch: (error) => (error instanceof Error ? error : new Error(String(error))),\n }),\n ),\n Effect.flatMap(() => finalize),\n ),\n }\n })\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "6A7DD787BF88BD7C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/mcp/logout.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode } from \"@opencode-ai/client\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { resolveIntegration } from \"./resolve\"\n\nconst location = { directory: process.cwd() }\n\nexport default Runtime.handler(\n Commands.commands.mcp.commands.logout,\n Effect.fn(\"cli.mcp.logout\")(function* (input) {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const client = OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) })\n\n const integration = yield* resolveIntegration(client, input.name, location)\n if (!integration) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n const credentials = integration.connections.filter((connection) => connection.type === \"credential\")\n if (credentials.length === 0) {\n process.stdout.write(`No stored credentials for ${input.name}` + EOL)\n return\n }\n\n yield* Effect.forEach(\n credentials,\n (connection) => Effect.promise(() => client.credential.remove({ credentialID: connection.id, location })),\n { discard: true },\n )\n process.stdout.write(`Removed OAuth credentials for ${input.name}` + EOL)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAST,IAAM,EAAW,CAAE,UAAW,QAAQ,IAAI,CAAE,EAE7B,IAAQ,QACrB,EAAS,SAAS,IAAI,SAAS,OAC/B,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAO,CAC5C,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAS,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAEpF,EAAc,MAAO,EAAmB,EAAQ,EAAM,KAAM,CAAQ,EAC1E,GAAI,CAAC,EAAa,CAChB,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,IAAM,EAAc,EAAY,YAAY,OAAO,CAAC,IAAe,EAAW,OAAS,YAAY,EACnG,GAAI,EAAY,SAAW,EAAG,CAC5B,QAAQ,OAAO,MAAM,6BAA6B,EAAM,OAAS,CAAG,EACpE,OAGF,MAAO,EAAO,QACZ,EACA,CAAC,IAAe,EAAO,QAAQ,IAAM,EAAO,WAAW,OAAO,CAAE,aAAc,EAAW,GAAI,UAAS,CAAC,CAAC,EACxG,CAAE,QAAS,EAAK,CAClB,EACA,QAAQ,OAAO,MAAM,iCAAiC,EAAM,OAAS,CAAG,EACzE,CACH", | ||
| "debugId": "5FF7CB31E58F590D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/runtime.queue.ts"], | ||
| "sourcesContent": [ | ||
| "// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and local\n// operations drain one at a time. Ordinary prompts submitted during an active\n// ordinary turn are admitted immediately to the server's durable queue.\n//\n// The queue also handles local session commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"../util/locale\"\nimport { isCompactCommand, isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, RunDelivery, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt, delivery: RunDelivery) => void\n onAdmissionError?: (prompt: RunPrompt, error: unknown) => void | Promise<void>\n onNewSession?: () => void | Promise<void>\n onCompact?: () => void | Promise<void>\n admit: (prompt: RunPrompt, delivery: RunDelivery, signal: AbortSignal) => Promise<void>\n settle: () => Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal, admitted: () => void) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n active?: RunPrompt\n admission?: Promise<void>\n ctrl?: AbortController\n closed: boolean\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn are admitted as\n// durable queued work instead of remaining editable process-local state.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = Promise.withResolvers<{ type: \"closed\" }>()\n const done = Promise.withResolvers<void>()\n const state: State = {\n queue: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n let admissions = Promise.resolve()\n let admissionVersion = 0\n const admissionController = new AbortController()\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n // Ordinary turn signals map to session.interrupt; exiting should only detach the TUI.\n if (state.active?.mode === \"shell\") state.ctrl?.abort()\n admissionController.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()!\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n },\n )\n await input.onNewSession()\n continue\n }\n\n if (prompt.mode !== \"shell\" && isCompactCommand(prompt.text)) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"compacting session\",\n },\n },\n {\n phase: \"running\",\n status: \"compacting session\",\n },\n )\n await input.onCompact?.()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n { type: \"turn.send\" },\n {\n phase: \"running\",\n status: \"sending prompt\",\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n const admission = Promise.withResolvers<void>()\n const version = admissionVersion\n state.ctrl = ctrl\n state.admission = admission.promise\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent, sent.delivery ?? \"steer\")\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal, admission.resolve).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n if (sent.mode !== \"shell\" && admissionVersion !== version) {\n do {\n const current = admissionVersion\n await admissions\n if (state.closed) break\n await input.settle()\n if (current === admissionVersion) break\n } while (!state.closed)\n }\n } finally {\n admission.resolve()\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n if (state.admission === admission.promise) state.admission = undefined\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n { type: \"turn.idle\" },\n {\n phase: \"idle\",\n status: \"\",\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n prompt.mode !== \"shell\" &&\n prompt.command?.source !== \"skill\" &&\n !isNewCommand(prompt.text) &&\n !isCompactCommand(prompt.text) &&\n !state.queue.some((item) => item.mode !== \"shell\" && (isNewCommand(item.text) || isCompactCommand(item.text)))\n ) {\n const sent = { ...prompt, messageID: SessionMessage.ID.create() }\n const admission = state.admission\n admissionVersion += 1\n const delivery = prompt.delivery ?? \"queue\"\n input.onSend?.(sent, delivery)\n admissions = admissions\n .then(() => admission)\n .then(() => input.admit(sent, delivery, admissionController.signal))\n .catch((error) => (state.closed ? undefined : input.onAdmissionError?.(sent, error)))\n return\n }\n\n state.queue.push(prompt)\n if (prompt.mode !== \"shell\" && (isNewCommand(prompt.text) || isCompactCommand(prompt.text))) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n close()\n await draining?.catch(() => {})\n await admissions\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E6BA4DADE617CE8664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/lifecycle.ts", "../ai/src/protocols/utils/gemini-tool-schema.ts", "../ai/src/protocols/utils/tool-schema.ts"], | ||
| "sourcesContent": [ | ||
| "import { LLMEvent, type FinishReasonDetails, type ProviderMetadata, type Usage } from \"../../schema/index.js\"\n\nexport interface State {\n readonly stepStarted: boolean\n readonly text: ReadonlySet<string>\n readonly reasoning: ReadonlySet<string>\n}\n\nexport const initial = (): State => ({ stepStarted: false, text: new Set(), reasoning: new Set() })\n\nexport const stepStart = (state: State, events: LLMEvent[]): State => {\n if (state.stepStarted) return state\n events.push(LLMEvent.stepStart({ index: 0 }))\n return { ...state, stepStarted: true }\n}\n\nexport const textStart = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textStart({ id, providerMetadata }))\n return { ...stepped, text: new Set([...stepped.text, id]) }\n}\n\nexport const textDelta = (state: State, events: LLMEvent[], id: string, text: string): State => {\n const started = textStart(state, events, id)\n events.push(LLMEvent.textDelta({ id, text }))\n return started\n}\n\nexport const reasoningStart = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningStart({ id, providerMetadata }))\n return { ...stepped, reasoning: new Set([...stepped.reasoning, id]) }\n}\n\nexport const reasoningDelta = (\n state: State,\n events: LLMEvent[],\n id: string,\n text: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n const started = reasoningStart(state, events, id, providerMetadata)\n events.push(LLMEvent.reasoningDelta({ id, text, providerMetadata }))\n return started\n}\n\nexport const reasoningEnd = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (!state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningEnd({ id, providerMetadata }))\n const reasoning = new Set(stepped.reasoning)\n reasoning.delete(id)\n return { ...stepped, reasoning }\n}\n\nexport const textEnd = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (!state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textEnd({ id, providerMetadata }))\n const text = new Set(stepped.text)\n text.delete(id)\n return { ...stepped, text }\n}\n\nconst closeOpenBlocks = (state: State, events: LLMEvent[]): State => {\n for (const id of state.reasoning) events.push(LLMEvent.reasoningEnd({ id }))\n for (const id of state.text) events.push(LLMEvent.textEnd({ id }))\n return { ...state, text: new Set(), reasoning: new Set() }\n}\n\nexport const finish = (\n state: State,\n events: LLMEvent[],\n input: {\n readonly reason: FinishReasonDetails\n readonly usage?: Usage\n readonly providerMetadata?: ProviderMetadata\n },\n): State => {\n const stepped = closeOpenBlocks(stepStart(state, events), events)\n events.push(\n LLMEvent.stepFinish({\n index: 0,\n reason: input.reason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n }),\n LLMEvent.finish(input),\n )\n return { ...stepped, stepStarted: false }\n}\n\nexport * as Lifecycle from \"./lifecycle.js\"\n", | ||
| "import { isRecord } from \"../../utils/record.js\"\n\n// Gemini accepts a JSON Schema-like dialect for tool parameters, but rejects a\n// handful of common JSON Schema shapes. Keep this projection isolated so the\n// Gemini protocol file still reads like the other protocol modules.\nconst SCHEMA_INTENT_KEYS = [\n \"type\",\n \"properties\",\n \"items\",\n \"prefixItems\",\n \"enum\",\n \"const\",\n \"$ref\",\n \"additionalProperties\",\n \"patternProperties\",\n \"required\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n]\n\nconst hasCombiner = (schema: unknown) =>\n isRecord(schema) && (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf) || Array.isArray(schema.allOf))\n\nconst hasSchemaIntent = (schema: unknown) =>\n isRecord(schema) && (hasCombiner(schema) || SCHEMA_INTENT_KEYS.some((key) => key in schema))\n\nconst sanitizeNode = (schema: unknown): unknown => {\n if (!isRecord(schema)) return Array.isArray(schema) ? schema.map(sanitizeNode) : schema\n\n const result: Record<string, unknown> = Object.fromEntries(\n Object.entries(schema).map(([key, value]) => [\n key,\n key === \"enum\" && Array.isArray(value) ? value.map(String) : sanitizeNode(value),\n ]),\n )\n\n if (Array.isArray(result.enum) && (result.type === \"integer\" || result.type === \"number\")) result.type = \"string\"\n\n const properties = result.properties\n if (result.type === \"object\" && isRecord(properties) && Array.isArray(result.required)) {\n result.required = result.required.filter((field) => typeof field === \"string\" && field in properties)\n }\n\n if (result.type === \"array\" && !hasCombiner(result)) {\n result.items = result.items ?? {}\n if (isRecord(result.items) && !hasSchemaIntent(result.items)) result.items = { ...result.items, type: \"string\" }\n }\n\n if (typeof result.type === \"string\" && result.type !== \"object\" && !hasCombiner(result)) {\n delete result.properties\n delete result.required\n }\n\n return result\n}\n\nconst emptyObjectSchema = (schema: Record<string, unknown>) =>\n schema.type === \"object\" &&\n (!isRecord(schema.properties) || Object.keys(schema.properties).length === 0) &&\n !schema.additionalProperties\n\nconst projectNode = (schema: unknown, nested = false): Record<string, unknown> | undefined => {\n if (!isRecord(schema)) return undefined\n if (!nested && emptyObjectSchema(schema)) return undefined\n const types = Array.isArray(schema.type) ? schema.type.filter((type) => type !== \"null\") : undefined\n const anyOf = Array.isArray(schema.anyOf) ? schema.anyOf : undefined\n const hasNullAnyOf = anyOf?.some((item) => isRecord(item) && item.type === \"null\") ?? false\n const anyOfTypes = hasNullAnyOf ? anyOf?.filter((item) => !isRecord(item) || item.type !== \"null\") : anyOf\n const flattenedAnyOf = hasNullAnyOf && anyOfTypes?.length === 1 ? projectNode(anyOfTypes[0], true) : undefined\n const result = Object.fromEntries(\n [\n [\"description\", schema.description],\n [\"required\", schema.required],\n [\"format\", schema.format],\n [\"type\", types ? (types.length === 0 ? \"null\" : undefined) : schema.type],\n [\n \"nullable\",\n (Array.isArray(schema.type) && schema.type.includes(\"null\") && types && types.length > 0) || hasNullAnyOf\n ? true\n : undefined,\n ],\n [\"enum\", schema.const !== undefined ? [schema.const] : schema.enum],\n [\n \"properties\",\n isRecord(schema.properties)\n ? Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => [key, projectNode(value, true)]))\n : undefined,\n ],\n [\n \"items\",\n Array.isArray(schema.items)\n ? schema.items.map((item) => projectNode(item, true))\n : schema.items === undefined\n ? undefined\n : projectNode(schema.items, true),\n ],\n [\"allOf\", Array.isArray(schema.allOf) ? schema.allOf.map((item) => projectNode(item, true)) : undefined],\n [\n \"anyOf\",\n anyOfTypes\n ? hasNullAnyOf && anyOfTypes.length === 1\n ? undefined\n : anyOfTypes.map((item) => projectNode(item, true))\n : types && types.length > 0\n ? types.map((type) => ({ type }))\n : undefined,\n ],\n [\"oneOf\", Array.isArray(schema.oneOf) ? schema.oneOf.map((item) => projectNode(item, true)) : undefined],\n [\"minLength\", schema.minLength],\n ].filter((entry) => entry[1] !== undefined),\n )\n return flattenedAnyOf ? { ...result, ...flattenedAnyOf } : result\n}\n\nexport const convert = (schema: unknown) => projectNode(sanitizeNode(schema))\n\nexport * as GeminiToolSchema from \"./gemini-tool-schema.js\"\n", | ||
| "import type { JsonSchema, LanguageModelToolSchemaCompatibility } from \"../../schema/index.js\"\nimport { isRecord } from \"../../utils/record.js\"\nimport { GeminiToolSchema } from \"./gemini-tool-schema.js\"\n\nconst removeNullSchemas = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(removeNullSchemas)\n if (!isRecord(value)) return value\n const fields = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"anyOf\")\n .map(([key, field]) => [key, removeNullSchemas(field)]),\n )\n if (!Array.isArray(value.anyOf)) return fields\n const variants = value.anyOf.filter((variant) => !isRecord(variant) || variant.type !== \"null\").map(removeNullSchemas)\n if (variants.length === 1 && isRecord(variants[0])) return { ...fields, ...variants[0] }\n return { ...fields, anyOf: variants }\n}\n\nconst tupleItemsSchema = (items: ReadonlyArray<unknown>) => {\n const projected = items.map(moonshotNode)\n if (projected.length === 0) return {}\n if (projected.length === 1) return projected[0]\n return { anyOf: projected }\n}\n\nconst moonshotNode = (schema: unknown): unknown => {\n if (Array.isArray(schema)) return schema.map(moonshotNode)\n if (!isRecord(schema)) return schema\n if (typeof schema.$ref === \"string\") return { $ref: schema.$ref }\n return Object.fromEntries(\n Object.entries(schema).flatMap(([key, value]) => {\n if (key === \"items\" && Array.isArray(value)) return [[key, tupleItemsSchema(value)]]\n if (key === \"prefixItems\") {\n if (\"items\" in schema) return []\n return [[\"items\", tupleItemsSchema(Array.isArray(value) ? value : [])]]\n }\n if (key === \"unevaluatedItems\") return []\n return [[key, moonshotNode(value)]]\n }),\n )\n}\n\nconst moonshot = (schema: JsonSchema): JsonSchema => {\n const projected = moonshotNode(schema)\n return isRecord(projected) ? projected : {}\n}\n\nconst openAI = (schema: JsonSchema): JsonSchema => {\n const variants = Array.isArray(schema.anyOf) ? schema.anyOf.filter(isRecord) : []\n const flattened =\n variants.length === 0\n ? { ...schema, type: \"object\" }\n : {\n ...Object.fromEntries(Object.entries(schema).filter(([key]) => key !== \"anyOf\")),\n type: \"object\",\n properties: variants.reduce(\n (properties, variant) => ({ ...(isRecord(variant.properties) ? variant.properties : {}), ...properties }),\n {},\n ),\n additionalProperties: false,\n }\n const normalized = removeNullSchemas(flattened)\n return isRecord(normalized) ? normalized : { type: \"object\" }\n}\n\nconst responses = openAI\n\nconst gemini = (schema: JsonSchema): JsonSchema => GeminiToolSchema.convert(schema) ?? {}\n\nconst modelCompatibility = (\n schema: JsonSchema,\n compatibility: LanguageModelToolSchemaCompatibility | undefined,\n): JsonSchema => {\n if (compatibility === undefined) return schema\n switch (compatibility) {\n case \"gemini\":\n return gemini(schema)\n case \"moonshot\":\n return moonshot(schema)\n }\n}\n\nexport const ToolSchemaProjection = {\n gemini,\n modelCompatibility,\n moonshot,\n openAI,\n responses,\n} as const\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "423A2D528F6CFF1D64756E2164756E21", | ||
| "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": "F523C985C328F89464756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-compatible.ts"], | ||
| "sourcesContent": [ | ||
| "import { ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { profiles, type OpenAICompatibleProfile } from \"./openai-compatible-profile.js\"\nimport type { OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"openai-compatible\")\n\ntype GenericModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL: string\n readonly provider?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nexport type FamilyModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport const routes = [OpenAICompatibleChat.route]\n\nexport const configure = (input: GenericModelOptions) => {\n const provider = input.provider ?? \"openai-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = OpenAICompatibleChat.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: AuthOptions.bearer(input, []),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) =>\n route.model<OpenAIProviderOptionsInput>({ id: modelID, provider: ProviderID.make(provider) }),\n configure,\n }\n}\n\nconst define = (profile: OpenAICompatibleProfile) => {\n const configureProfile = (input: FamilyModelOptions = {}) => {\n const facade = configure({\n ...input,\n baseURL: input.baseURL ?? profile.baseURL,\n provider: profile.provider,\n })\n return {\n id: ProviderID.make(profile.provider),\n model: facade.model,\n configure: configureProfile,\n }\n }\n return configureProfile()\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n provider: settings.provider,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n\nexport const baseten = define(profiles.baseten)\nexport const cerebras = define(profiles.cerebras)\nexport const deepinfra = define(profiles.deepinfra)\nexport const deepseek = define(profiles.deepseek)\nexport const fireworks = define(profiles.fireworks)\nexport const groq = define(profiles.groq)\nexport const togetherai = define(profiles.togetherai)\n" | ||
| ], | ||
| "mappings": ";6nBAQO,IAAM,EAAK,EAAW,KAAK,mBAAmB,EAsBxC,EAAS,CAAsB,CAAK,EAEpC,EAAY,CAAC,IAA+B,CACvD,IAAM,EAAW,EAAM,UAAY,qBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAA6B,EAAM,KAAK,IACzC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAY,OAAO,EAAO,CAAC,CAAC,CACpC,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IACN,EAAM,MAAkC,CAAE,GAAI,EAAS,SAAU,EAAW,KAAK,CAAQ,CAAE,CAAC,EAC9F,WACF,GAGI,EAAS,CAAC,IAAqC,CACnD,IAAM,EAAmB,CAAC,EAA4B,CAAC,IAAM,CAC3D,IAAM,EAAS,EAAU,IACpB,EACH,QAAS,EAAM,SAAW,EAAQ,QAClC,SAAU,EAAQ,QACpB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,EAAQ,QAAQ,EACpC,MAAO,EAAO,MACd,UAAW,CACb,GAEF,OAAO,EAAiB,GAGb,EAAW,CACtB,KACA,WACF,EAEa,EAAmF,CAAC,EAAS,IACxG,EAAU,CACR,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO,EAEL,EAAU,EAAO,EAAS,OAAO,EACjC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAO,EAAO,EAAS,IAAI,EAC3B,EAAa,EAAO,EAAS,UAAU", | ||
| "debugId": "88D2E4735828D76664756E2164756E21", | ||
| "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": "F29A04682ED1BC3E64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/workspace.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Workspace from \"./workspace.js\"\n\nimport { WorkspaceEvent } from \"./workspace-event.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport const ID = WorkspaceID\nexport type ID = WorkspaceID\n\nexport const Event = WorkspaceEvent\n" | ||
| ], | ||
| "mappings": ";iNAKO,IAAM,EAAK,EAGL,EAAQ", | ||
| "debugId": "BA18647B43C4017464756E2164756E21", | ||
| "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": ["../schema/src/project.ts", "../schema/src/skill.ts", "../schema/src/prompt.ts", "../schema/src/shell.ts", "../schema/src/session-error.ts", "../schema/src/session-id.ts", "../schema/src/permission.ts", "../schema/src/agent.ts", "../schema/src/snapshot.ts", "../schema/src/token-usage.ts", "../schema/src/session-message.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Project from \"./project.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath, NonNegativeInt, optional } from \"./schema.js\"\nimport { ProjectID } from \"./project-id.js\"\n\nexport const ID = ProjectID\nexport type ID = typeof ID.Type\n\nexport const Vcs = Schema.Literals([\"git\", \"hg\"]).annotate({ identifier: \"Project.Vcs\" })\nexport const Current = Schema.Struct({\n id: ID,\n directory: AbsolutePath,\n canonical: AbsolutePath,\n}).annotate({ identifier: \"Project.Current\" })\nexport interface Current extends Schema.Schema.Type<typeof Current> {}\nexport const Icon = Schema.Struct({\n url: optional(Schema.String),\n override: optional(Schema.String),\n color: optional(Schema.String),\n}).annotate({ identifier: \"Project.Icon\" })\nexport interface Icon extends Schema.Schema.Type<typeof Icon> {}\nexport const Commands = Schema.Struct({\n start: optional(\n Schema.String.annotate({ description: \"Startup script to run when creating a new workspace (worktree)\" }),\n ),\n}).annotate({ identifier: \"Project.Commands\" })\nexport interface Commands extends Schema.Schema.Type<typeof Commands> {}\nexport const Time = Schema.Struct({\n created: NonNegativeInt,\n updated: NonNegativeInt,\n initialized: optional(NonNegativeInt),\n}).annotate({ identifier: \"Project.Time\" })\nexport interface Time extends Schema.Schema.Type<typeof Time> {}\n\nexport const Info = Schema.Struct({\n id: ID,\n canonical: AbsolutePath,\n vcs: optional(Vcs),\n name: optional(Schema.String),\n icon: optional(Icon),\n commands: optional(Commands),\n time: Time,\n sandboxes: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Project\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nconst Updated = ephemeral({ type: \"project.updated\", schema: Info.fields })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n", | ||
| "export * as Skill from \"./skill.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { AbsolutePath } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Skill.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Skill.Name\"))\nexport type Name = typeof Name.Type\n\nexport interface DirectorySource extends Schema.Schema.Type<typeof DirectorySource> {}\nexport const DirectorySource = Schema.Struct({\n type: Schema.tag(\"directory\"),\n path: AbsolutePath,\n}).annotate({ identifier: \"Skill.DirectorySource\" })\n\nexport interface UrlSource extends Schema.Schema.Type<typeof UrlSource> {}\nexport const UrlSource = Schema.Struct({\n type: Schema.tag(\"url\"),\n url: Schema.String,\n}).annotate({ identifier: \"Skill.UrlSource\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n description: Schema.String.pipe(optional),\n slash: Schema.Boolean.pipe(optional),\n autoinvoke: Schema.Boolean.pipe(optional),\n location: AbsolutePath,\n content: Schema.String,\n}).annotate({ identifier: \"Skill.Info\" })\n\nconst Updated = ephemeral({ type: \"skill.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface EmbeddedSource extends Schema.Schema.Type<typeof EmbeddedSource> {}\nexport const EmbeddedSource = Schema.Struct({\n type: Schema.tag(\"embedded\"),\n skill: Schema.suspend(() => Info),\n}).annotate({ identifier: \"Skill.EmbeddedSource\" })\n\nexport type Source = DirectorySource | UrlSource | EmbeddedSource\nexport const Source = Object.assign(\n Schema.Union([DirectorySource, UrlSource, EmbeddedSource]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Skill.Source\" }),\n ),\n {\n equals: (a: Source, b: Source) => {\n if (a.type !== b.type) return false\n if (a.type === \"directory\" && b.type === \"directory\") return a.path === b.path\n if (a.type === \"url\" && b.type === \"url\") return a.url === b.url\n if (a.type === \"embedded\" && b.type === \"embedded\") return a.skill.id === b.skill.id\n return false\n },\n key: (source: Source) =>\n source.type === \"directory\"\n ? `directory:${source.path}`\n : source.type === \"url\"\n ? `url:${source.url}`\n : `embedded:${source.skill.id}`,\n },\n)\n", | ||
| "import { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { statics } from \"./schema.js\"\nimport { Skill } from \"./skill.js\"\n\nexport interface PromptMention extends Schema.Schema.Type<typeof PromptMention> {}\nexport const PromptMention = Schema.Struct({\n start: Schema.Finite,\n end: Schema.Finite,\n text: Schema.String,\n}).annotate({ identifier: \"Prompt.Mention\" })\n\nexport const FileSource = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"inline\") }),\n Schema.Struct({ type: Schema.Literal(\"uri\"), uri: Schema.String }),\n])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Prompt.FileSource\" })\nexport type FileSource = typeof FileSource.Type\n\nexport const Base64 = Schema.String.check(\n Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/),\n).annotate({ identifier: \"Prompt.Base64\" })\nexport type Base64 = typeof Base64.Type\n\nexport interface FileAttachment extends Schema.Schema.Type<typeof FileAttachment> {}\nexport const FileAttachment = Schema.Struct({\n data: Base64,\n mime: Schema.String,\n source: FileSource,\n name: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mention: PromptMention.pipe(optional),\n})\n .annotate({ identifier: \"Prompt.FileAttachment\" })\n .pipe(\n statics((schema) => ({\n create: (input: FileAttachment) =>\n schema.make({\n data: input.data,\n mime: input.mime,\n source: input.source,\n name: input.name,\n description: input.description,\n mention: input.mention,\n }),\n })),\n )\n\nexport interface AgentAttachment extends Schema.Schema.Type<typeof AgentAttachment> {}\nexport const AgentAttachment = Schema.Struct({\n name: Schema.String,\n mention: PromptMention.pipe(optional),\n}).annotate({ identifier: \"Prompt.AgentAttachment\" })\n\nexport interface SkillAttachment extends Schema.Schema.Type<typeof SkillAttachment> {}\nexport const SkillAttachment = Schema.Struct({\n id: Skill.ID,\n name: Skill.Name,\n mention: PromptMention.pipe(optional),\n}).annotate({ identifier: \"Prompt.SkillAttachment\" })\n\nexport interface Prompt extends Schema.Schema.Type<typeof Prompt> {}\nexport const Prompt = Schema.Struct({\n text: Schema.String,\n files: Schema.Array(FileAttachment).pipe(optional),\n agents: Schema.Array(AgentAttachment).pipe(optional),\n skills: Schema.Array(SkillAttachment).pipe(optional),\n})\n .annotate({ identifier: \"Prompt\" })\n .pipe(\n statics((schema) => ({\n equivalence: Schema.toEquivalence(schema),\n fromUserMessage: (input: Pick<Prompt, \"text\" | \"files\" | \"agents\" | \"skills\">) =>\n schema.make({\n text: input.text,\n ...(input.files === undefined ? {} : { files: input.files }),\n ...(input.agents === undefined ? {} : { agents: input.agents }),\n ...(input.skills === undefined ? {} : { skills: input.skills }),\n }),\n })),\n )\n", | ||
| "export * as Shell from \"./shell.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\n\nconst IDSchema = Schema.String.check(Schema.isStartsWith(\"sh_\")).pipe(Schema.brand(\"Shell.ID\"))\n\nexport const ID = IDSchema.pipe(\n statics((schema: typeof IDSchema) => {\n const create = () => schema.make(\"sh_\" + ascending())\n return {\n create,\n ascending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type ID = typeof ID.Type\n\nexport const Status = Schema.Literals([\"running\", \"exited\", \"timeout\", \"killed\"])\nexport type Status = typeof Status.Type\n\nexport const Time = Schema.Struct({\n started: Schema.Finite,\n completed: optional(Schema.Finite),\n})\nexport interface Time extends Schema.Schema.Type<typeof Time> {}\n\n// Opaque caller-supplied tags echoed back on Info and events. The Shell service never interprets\n// these; callers (e.g. ShellTool stores the originating session ID) use them to filter or correlate.\nexport const Metadata = Schema.Record(Schema.String, Schema.Unknown)\nexport type Metadata = typeof Metadata.Type\n\nexport const Info = Schema.Struct({\n id: ID,\n status: Status,\n command: Schema.String,\n cwd: Schema.String,\n shell: Schema.String,\n // Absolute path of the file capturing combined stdout/stderr. Page through it via `output`.\n file: Schema.String,\n pid: optional(NonNegativeInt),\n exit: optional(Schema.Finite),\n // Always present; defaults to an empty object when the creator supplies no metadata.\n metadata: Metadata,\n time: Time,\n}).annotate({ identifier: \"Shell.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nconst Created = ephemeral({ type: \"shell.created\", schema: { info: Info } })\nconst Exited = ephemeral({ type: \"shell.exited\", schema: { id: ID, exit: optional(Schema.Finite), status: Status } })\nconst Deleted = ephemeral({ type: \"shell.deleted\", schema: { id: ID } })\nexport const Event = { Created, Exited, Deleted, Definitions: inventory(Created, Exited, Deleted) }\n\nexport const CreateInput = Schema.Struct({\n command: Schema.String,\n cwd: optional(Schema.String),\n timeout: NonNegativeInt,\n metadata: optional(Metadata),\n})\nexport interface CreateInput extends Schema.Schema.Type<typeof CreateInput> {}\n\nexport const OutputInput = Schema.Struct({\n cursor: optional(NonNegativeInt),\n limit: optional(NonNegativeInt),\n})\nexport interface OutputInput extends Schema.Schema.Type<typeof OutputInput> {}\n\nexport const Output = Schema.Struct({\n output: Schema.String,\n // Absolute cursor after this page. Equals `size` once fully caught up.\n cursor: NonNegativeInt,\n // Total bytes captured so far. A consumer has more to page while `cursor < size`.\n size: NonNegativeInt,\n truncated: Schema.Boolean,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n", | ||
| "export * as SessionError from \"./session-error.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\n\nexport interface Error extends Schema.Schema.Type<typeof Error> {}\nexport const Error = Schema.Struct({\n type: Schema.String,\n message: Schema.String,\n status: Schema.Int.check(Schema.isBetween({ minimum: 100, maximum: 599 })).pipe(optional),\n}).annotate({ identifier: \"Session.StructuredError\" })\n", | ||
| "import { Schema } from \"effect\"\nimport { descending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const SessionID = Schema.String.check(Schema.isStartsWith(\"ses\")).pipe(\n Schema.brand(\"SessionID\"),\n statics((schema) => {\n const create = () => schema.make(\"ses_\" + descending())\n return {\n create,\n descending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type SessionID = typeof SessionID.Type\n", | ||
| "export * as Permission from \"./permission.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"per\")).pipe(\n Schema.brand(\"Permission.ID\"),\n statics((schema) => ({ create: (id?: string) => schema.make(id ?? \"per_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Source = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"tool\"),\n messageID: Schema.String,\n id: Schema.String,\n }),\n]).annotate({ identifier: \"Permission.Source\" })\nexport type Source = typeof Source.Type\n\nconst RequestFields = {\n sessionID: SessionID,\n action: Schema.String,\n resources: Schema.Array(Schema.String),\n save: Schema.Array(Schema.String).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n source: Source.pipe(optional),\n}\n\nexport const Request = Schema.Struct({\n id: ID,\n ...RequestFields,\n}).annotate({ identifier: \"Permission.Request\" })\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\n\nexport const Reply = Schema.Literals([\"once\", \"always\", \"reject\"]).annotate({ identifier: \"Permission.Reply\" })\nexport type Reply = typeof Reply.Type\n\nconst Asked = ephemeral({ type: \"permission.asked\", schema: Request.fields })\nconst Replied = ephemeral({\n type: \"permission.replied\",\n schema: {\n sessionID: SessionID,\n requestID: ID,\n reply: Reply,\n },\n})\nexport const Event = { Asked, Replied, Definitions: inventory(Asked, Replied) }\n\nexport const Effect = Schema.Literals([\"allow\", \"deny\", \"ask\"]).annotate({ identifier: \"Permission.Effect\" })\nexport type Effect = typeof Effect.Type\n\nexport interface Rule extends Schema.Schema.Type<typeof Rule> {}\nexport const Rule = Schema.Struct({\n action: Schema.String,\n resource: Schema.String,\n effect: Effect,\n}).annotate({ identifier: \"Permission.Rule\" })\n\nexport const Ruleset = Schema.Array(Rule).annotate({ identifier: \"Permission.Ruleset\" })\nexport type Ruleset = typeof Ruleset.Type\n", | ||
| "export * as Agent from \"./agent.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Permission } from \"./permission.js\"\nimport { Provider } from \"./provider.js\"\nimport { PositiveInt, statics } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"agent.updated\", schema: {} })\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Agent.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Agent.Name\"))\nexport type Name = typeof Name.Type\n\nexport const Color = Schema.String.annotate({ identifier: \"Agent.Color\" })\nexport type Color = typeof Color.Type\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n model: Model.Ref.pipe(optional),\n request: Provider.Request,\n system: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mode: Schema.Literals([\"subagent\", \"primary\", \"all\"]),\n hidden: Schema.Boolean,\n color: Color.pipe(optional),\n steps: PositiveInt.pipe(optional),\n permissions: Permission.Ruleset,\n})\n .annotate({ identifier: \"Agent.Info\" })\n .pipe(\n statics(() => ({\n default: (id: ID) =>\n ({\n id,\n name: Name.make(id),\n request: { settings: {}, headers: {}, body: {} },\n mode: \"primary\",\n hidden: false,\n permissions: [\n { action: \"*\", resource: \"*\", effect: \"allow\" },\n { action: \"external_directory\", resource: \"*\", effect: \"ask\" },\n { action: \"read\", resource: \"*.env\", effect: \"ask\" },\n { action: \"read\", resource: \"*.env.*\", effect: \"ask\" },\n { action: \"read\", resource: \"*.env.example\", effect: \"allow\" },\n ],\n }) satisfies Info,\n })),\n )\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Snapshot from \"./snapshot.js\"\n\nimport { Schema } from \"effect\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Snapshot.ID\"))\nexport type ID = typeof ID.Type\n", | ||
| "export * as TokenUsage from \"./token-usage.js\"\n\nimport { Schema } from \"effect\"\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n input: Schema.Finite,\n output: Schema.Finite,\n reasoning: Schema.Finite,\n cache: Schema.Struct({\n read: Schema.Finite,\n write: Schema.Finite,\n }),\n}).annotate({ identifier: \"TokenUsage.Info\" })\n", | ||
| "export * as SessionMessage from \"./session-message.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { Content } from \"./tool.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { Prompt } from \"./prompt.js\"\nimport { DateTimeUtcFromMillis, PositiveInt, RelativePath, statics } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Event } from \"./event.js\"\nimport { Shell as ShellSchema } from \"./shell.js\"\nimport { FinishReason } from \"./llm.js\"\nimport { SessionError } from \"./session-error.js\"\nimport { Agent } from \"./agent.js\"\nimport { Skill as SkillSchema } from \"./skill.js\"\nimport { Money } from \"./money.js\"\nimport { Snapshot } from \"./snapshot.js\"\nimport { TokenUsage } from \"./token-usage.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"msg_\")).pipe(\n Schema.brand(\"Session.Message.ID\"),\n statics((schema) => ({\n create: () => schema.make(\"msg_\" + ascending()),\n fromEvent: (eventID: Event.ID) => schema.make(eventID.replace(/^evt_/, \"msg_\")),\n })),\n)\nexport type ID = typeof ID.Type\n\nconst Base = {\n id: ID,\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n time: Schema.Struct({ created: DateTimeUtcFromMillis }),\n}\n\nexport const ProviderState = Schema.Record(Schema.String, Schema.Unknown).annotate({\n identifier: \"Session.Message.ProviderState\",\n})\nexport type ProviderState = typeof ProviderState.Type\n\nexport interface AgentSelected extends Schema.Schema.Type<typeof AgentSelected> {}\nexport const AgentSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"agent-switched\"),\n agent: Agent.ID,\n previous: Agent.ID.pipe(optional),\n}).annotate({ identifier: \"Session.Message.AgentSelected\" })\n\nexport interface ModelSelected extends Schema.Schema.Type<typeof ModelSelected> {}\nexport const ModelSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"model-switched\"),\n model: Model.Ref,\n previous: Model.Ref.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ModelSelected\" })\n\nexport interface LocationSwitched extends Schema.Schema.Type<typeof LocationSwitched> {}\nexport const LocationSwitched = Schema.Struct({\n ...Base,\n type: Schema.tag(\"location-switched\"),\n location: Location.Ref,\n projectID: Project.ID.pipe(optional),\n subpath: RelativePath.pipe(optional),\n previous: Schema.Struct({\n location: Location.Ref,\n projectID: Project.ID.pipe(optional),\n subpath: RelativePath.pipe(optional),\n }).pipe(optional),\n}).annotate({ identifier: \"Session.Message.LocationSwitched\" })\n\nexport interface User extends Schema.Schema.Type<typeof User> {}\nexport const User = Schema.Struct({\n ...Base,\n text: Prompt.fields.text,\n files: Prompt.fields.files,\n agents: Prompt.fields.agents,\n skills: Prompt.fields.skills,\n type: Schema.tag(\"user\"),\n}).annotate({ identifier: \"Session.Message.User\" })\n\nexport interface Synthetic extends Schema.Schema.Type<typeof Synthetic> {}\nexport const Synthetic = Schema.Struct({\n ...Base,\n text: Schema.String,\n description: Schema.String.pipe(optional),\n type: Schema.tag(\"synthetic\"),\n}).annotate({ identifier: \"Session.Message.Synthetic\" })\n\nexport interface System extends Schema.Schema.Type<typeof System> {}\nexport const System = Schema.Struct({\n ...Base,\n type: Schema.tag(\"system\"),\n /** The model-facing update text, frozen at emit time. */\n text: Schema.String,\n /** A short human-readable summary for transcript display. */\n description: Schema.String.pipe(optional),\n}).annotate({ identifier: \"Session.Message.System\" })\n\nexport interface Skill extends Schema.Schema.Type<typeof Skill> {}\nexport const Skill = Schema.Struct({\n ...Base,\n type: Schema.tag(\"skill\"),\n skill: SkillSchema.ID,\n name: SkillSchema.Name,\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.Skill\" })\n\nexport interface Shell extends Schema.Schema.Type<typeof Shell> {}\nexport const Shell = Schema.Struct({\n ...Base,\n type: Schema.tag(\"shell\"),\n shellID: ShellSchema.ID,\n command: Schema.String,\n status: ShellSchema.Status,\n exit: Schema.Number.pipe(optional),\n output: ShellSchema.Output.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Shell\" })\n\nexport interface ToolStateStreaming extends Schema.Schema.Type<typeof ToolStateStreaming> {}\nexport const ToolStateStreaming = Schema.Struct({\n status: Schema.tag(\"streaming\"),\n input: Schema.String,\n}).annotate({ identifier: \"Session.Message.ToolState.Streaming\" })\n\nexport interface ToolStateRunning extends Schema.Schema.Type<typeof ToolStateRunning> {}\nexport const ToolStateRunning = Schema.Struct({\n status: Schema.tag(\"running\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n metadata: Schema.Record(Schema.String, Schema.Json),\n}).annotate({ identifier: \"Session.Message.ToolState.Running\" })\n\nexport interface ToolStateCompleted extends Schema.Schema.Type<typeof ToolStateCompleted> {}\nexport const ToolStateCompleted = Schema.Struct({\n status: Schema.tag(\"completed\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n content: Schema.NonEmptyArray(Content),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Completed\" })\n\nexport interface ToolStateError extends Schema.Schema.Type<typeof ToolStateError> {}\nexport const ToolStateError = Schema.Struct({\n status: Schema.tag(\"error\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n error: SessionError.Error,\n content: Schema.NonEmptyArray(Content).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Error\" })\n\nexport const ToolState = Schema.Union([ToolStateStreaming, ToolStateRunning, ToolStateCompleted, ToolStateError]).pipe(\n Schema.toTaggedUnion(\"status\"),\n)\nexport type ToolState = ToolStateStreaming | ToolStateRunning | ToolStateCompleted | ToolStateError\n\nexport interface AssistantTool extends Schema.Schema.Type<typeof AssistantTool> {}\nexport const AssistantTool = Schema.Struct({\n type: Schema.tag(\"tool\"),\n id: Schema.String,\n name: Schema.String,\n executed: Schema.Boolean.pipe(optional),\n providerState: ProviderState.pipe(optional),\n providerResultState: ProviderState.pipe(optional),\n state: ToolState,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n ran: DateTimeUtcFromMillis.pipe(optional),\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant.Tool\" })\n\nexport interface AssistantText extends Schema.Schema.Type<typeof AssistantText> {}\nexport const AssistantText = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n state: ProviderState.pipe(optional),\n}).annotate({ identifier: \"Session.Message.Assistant.Text\" })\n\nexport interface AssistantReasoning extends Schema.Schema.Type<typeof AssistantReasoning> {}\nexport const AssistantReasoning = Schema.Struct({\n type: Schema.tag(\"reasoning\"),\n text: Schema.String,\n state: ProviderState.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }).pipe(optional),\n}).annotate({ identifier: \"Session.Message.Assistant.Reasoning\" })\n\nexport const AssistantContent = Schema.Union([AssistantText, AssistantReasoning, AssistantTool]).pipe(\n Schema.toTaggedUnion(\"type\"),\n)\nexport type AssistantContent = AssistantText | AssistantReasoning | AssistantTool\n\nexport interface AssistantRetry extends Schema.Schema.Type<typeof AssistantRetry> {}\nexport const AssistantRetry = Schema.Struct({\n attempt: PositiveInt,\n at: DateTimeUtcFromMillis,\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Assistant.Retry\" })\n\nexport interface Assistant extends Schema.Schema.Type<typeof Assistant> {}\nexport const Assistant = Schema.Struct({\n ...Base,\n type: Schema.tag(\"assistant\"),\n agent: Agent.ID,\n model: Model.Ref,\n content: AssistantContent.pipe(Schema.Array),\n snapshot: Schema.Struct({\n start: Snapshot.ID.pipe(optional),\n end: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n }).pipe(optional),\n finish: FinishReason.pipe(optional),\n rawFinish: Schema.String.pipe(optional),\n providerState: ProviderState.pipe(optional),\n cost: Money.USD.pipe(optional),\n tokens: TokenUsage.Info.pipe(optional),\n error: SessionError.Error.pipe(optional),\n retry: AssistantRetry.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant\" })\n\nconst CompactionBase = { type: Schema.tag(\"compaction\"), ...Base }\n\nexport interface CompactionRunning extends Schema.Schema.Type<typeof CompactionRunning> {}\nexport const CompactionRunning = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"running\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Running\" })\n\nexport interface CompactionCompleted extends Schema.Schema.Type<typeof CompactionCompleted> {}\nexport const CompactionCompleted = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"completed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Completed\" })\n\nexport interface CompactionFailed extends Schema.Schema.Type<typeof CompactionFailed> {}\nexport const CompactionFailed = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"failed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Compaction.Failed\" })\n\nexport const Compaction = Schema.Union([CompactionRunning, CompactionCompleted, CompactionFailed]).pipe(\n Schema.toTaggedUnion(\"status\"),\n Schema.annotate({ identifier: \"Session.Message.Compaction\" }),\n)\nexport type Compaction = CompactionRunning | CompactionCompleted | CompactionFailed\n\nexport const Info = Schema.Union([\n AgentSelected,\n ModelSelected,\n LocationSwitched,\n User,\n Synthetic,\n System,\n Skill,\n Shell,\n Assistant,\n Compaction,\n]).annotate({ identifier: \"Session.Message.Info\" })\nexport type Info =\n | AgentSelected\n | ModelSelected\n | LocationSwitched\n | User\n | Synthetic\n | System\n | Skill\n | Shell\n | Assistant\n | Compaction\nexport type Type = Info[\"type\"]\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "ECFC75BC560840D364756E2164756E21", | ||
| "names": [] | ||
| } |
+1
-1
| { | ||
| "name": "@opencode-ai/cli-linux-x64", | ||
| "version": "0.0.0-dev-17844", | ||
| "version": "0.0.0-dev-17852", | ||
| "license": "MIT", | ||
@@ -5,0 +5,0 @@ "repository": { |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/xai-images.ts", "../ai/src/providers/xai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport { GeneratedImage, ImageModel, ImageResponse, type ImageRequestFor, type ImageRoute } from \"../image.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema/index.js\"\nimport { ProviderShared, optionalNull } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\n\nconst ADAPTER = \"xai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.x.ai/v1\"\nexport const PATH = \"/images/generations\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type XAIImageString<Known extends string> = Known | (string & {})\n\nexport type XAIImageOptions = {\n readonly n?: number\n readonly aspectRatio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly aspect_ratio?: XAIImageString<\n | \"1:1\"\n | \"3:4\"\n | \"4:3\"\n | \"9:16\"\n | \"16:9\"\n | \"2:3\"\n | \"3:2\"\n | \"9:19.5\"\n | \"19.5:9\"\n | \"9:20\"\n | \"20:9\"\n | \"1:2\"\n | \"2:1\"\n | \"auto\"\n >\n readonly resolution?: XAIImageString<\"1k\" | \"2k\">\n readonly responseFormat?: XAIImageString<\"url\" | \"b64_json\">\n readonly response_format?: XAIImageString<\"url\" | \"b64_json\">\n} & Record<string, unknown>\n\ntype XAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\n\nconst XAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: optionalNull(Schema.String),\n url: optionalNull(Schema.String),\n revised_prompt: optionalNull(Schema.String),\n mime_type: optionalNull(Schema.String),\n }),\n ),\n usage: Schema.optional(Schema.Unknown),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly http?: HttpOptions\n}\n\nconst nativeOptions = (options: XAIImageOptions | undefined) => {\n if (!options) return undefined\n const { aspectRatio, responseFormat, ...native } = options\n return {\n aspect_ratio: aspectRatio,\n response_format: responseFormat,\n ...native,\n }\n}\n\nconst invalidOutput = (message: string) =>\n new AIError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<XAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"XAIImages.generate\")(function* (request: ImageRequestFor<XAIImageOptions>, execute) {\n const http = mergeHttpOptions(request.model.http, request.http)\n const imageReferences = (request.images ?? []).map((image) => {\n if (image.type === \"bytes\") return { url: ImageInputs.dataUrl(image), type: \"image_url\" as const }\n if (image.type === \"url\") return { url: image.url, type: \"image_url\" as const }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (imageReferences.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"xAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n image: imageReferences.length === 1 ? imageReferences[0] : undefined,\n images: imageReferences.length > 1 ? imageReferences : undefined,\n },\n nativeOptions(request.options),\n http?.body,\n ) as XAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${imageReferences.length === 0 ? PATH : EDIT_PATH}`,\n http?.query,\n )\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the xAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(XAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"xAI Images returned an invalid response\")),\n )\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n const mediaType = item.mime_type ?? \"application/octet-stream\"\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`xAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType,\n data,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined || item.revised_prompt === null\n ? undefined\n : { xai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`xAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"xAI Images returned no images\")\n const usage = ProviderShared.isRecord(decoded.usage) ? decoded.usage : undefined\n return new ImageResponse({\n images,\n usage: usage === undefined ? undefined : new Usage({ providerMetadata: { xai: usage } }),\n providerMetadata: usage === undefined ? undefined : { xai: { usage } },\n })\n }),\n }\n return ImageModel.make<XAIImageOptions>({ id: input.id, provider: \"xai\", route, http: input.http })\n}\n\nexport const XAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { HttpOptions, ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile.js\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport * as OpenAIResponses from \"../protocols/openai-responses.js\"\nimport { XAIImages } from \"../protocols/xai-images.js\"\nimport type { OpenAIOptionsInput } from \"./openai-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\n\nexport const id = ProviderID.make(\"xai\")\n\nexport type XAIProviderOptionsInput = OpenAIOptionsInput\n\nexport type LanguageModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: XAIProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: XAIProviderOptionsInput\n}\n\nexport type { XAIImageOptions } from \"../protocols/xai-images.js\"\n\nconst RESPONSES_WEBSOCKET_ROTATE_AFTER_MS = 24 * 60 * 1000\n\nconst responsesRoute = Route.make({\n id: \"openai-responses\",\n provider: id,\n providerMetadataKey: \"xai\",\n protocol: OpenAIResponses.protocol,\n endpoint: Endpoint.path(\"/responses\", { baseURL: OpenAICompatibleProfiles.profiles.xai.baseURL }),\n transport: OpenAIResponses.channelTransport({\n id: \"openai-responses\",\n name: \"xAI Responses\",\n rotateAfterMs: RESPONSES_WEBSOCKET_ROTATE_AFTER_MS,\n }),\n defaults: { providerOptions: { store: false } },\n})\n\nconst chatRoute = Route.make({\n id: \"openai-compatible-chat\",\n provider: id,\n providerMetadataKey: \"xai\",\n protocol: OpenAIChat.protocol,\n endpoint: Endpoint.path(\"/chat/completions\", { baseURL: OpenAICompatibleProfiles.profiles.xai.baseURL }),\n transport: OpenAICompatibleChat.route.transport,\n headers: ({ request }): Record<string, string> =>\n request.promptCacheKey ? { \"x-grok-conv-id\": request.promptCacheKey } : {},\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"XAI_API_KEY\")\n\nconst configuredResponsesRoute = (input: LanguageModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return responsesRoute.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nconst configuredChatRoute = (input: LanguageModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return chatRoute.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL },\n auth: auth(input),\n })\n}\n\nexport const configure = (input: LanguageModelOptions = {}) => {\n const responsesRoute = configuredResponsesRoute(input)\n const chatRoute = configuredChatRoute(input)\n const responses = (modelID: string | ModelID) => responsesRoute.model<XAIProviderOptionsInput>({ id: modelID })\n const chat = (modelID: string | ModelID) => chatRoute.model<XAIProviderOptionsInput>({ id: modelID })\n const image = (modelID: string | ModelID) =>\n XAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL ?? OpenAICompatibleProfiles.profiles.xai.baseURL,\n headers: input.headers,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n return {\n id,\n model: responses,\n responses,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, XAIProviderOptionsInput>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\nexport const responses = provider.responses\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "97360C433BD324BD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/tool-display.ts", "../tui/src/util/path-format.ts", "../tui/src/util/filetype.ts", "../../node_modules/.bun/ansi-regex@6.2.2/node_modules/ansi-regex/index.js", "../../node_modules/.bun/strip-ansi@7.1.2/node_modules/strip-ansi/index.js"], | ||
| "sourcesContent": [ | ||
| "export function canonicalToolName(name: string) {\n if (name === \"bash\") return \"shell\"\n if (name === \"task\") return \"subagent\"\n if (name === \"apply_patch\") return \"patch\"\n return name\n}\n\nexport function finiteNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return\n return value\n}\n\nexport function primitiveInputSummary(input: Record<string, unknown>, omit: readonly string[] = []) {\n const entries = Object.entries(input).filter(([key, value]) => {\n if (omit.includes(key)) return false\n return typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n })\n if (entries.length === 0) return \"\"\n return `[${entries.map(([key, value]) => `${key}=${String(value)}`).join(\", \")}]`\n}\n\nexport function webSearchProviderLabel(provider: unknown) {\n if (typeof provider !== \"string\" || !provider) return \"Web Search\"\n return `Web Search via ${provider[0].toUpperCase()}${provider.slice(1)}`\n}\n\nexport function toolDisplayMetadata(state: unknown): Record<string, unknown> {\n if (!state || typeof state !== \"object\" || Array.isArray(state)) return {}\n if (!(\"status\" in state) || state.status === \"streaming\") return {}\n if (!(\"metadata\" in state) || !state.metadata || typeof state.metadata !== \"object\") return {}\n if (Array.isArray(state.metadata)) return {}\n return state.metadata as Record<string, unknown>\n}\n\nexport function toolDisplayContent(state: SessionMessageAssistantTool[\"state\"]) {\n if (state.status === \"streaming\" || state.status === \"running\") return []\n return state.content ?? []\n}\n\nexport function nonEmptyToolContent<T>(content: ReadonlyArray<T> | undefined): [T, ...T[]] | undefined {\n if (!content) return undefined\n const [first, ...rest] = content\n return first === undefined ? undefined : [first, ...rest]\n}\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\n", | ||
| "import path from \"path\"\n\nexport function abbreviateHome(input: string, home: string) {\n if (!home) return input\n const paths = windowsPath(home) ? path.win32 : path.posix\n const relative = paths.relative(home, input)\n if (!relative) return \"~\"\n if (relative === \"..\" || relative.startsWith(\"..\" + paths.sep) || paths.isAbsolute(relative)) return input\n return \"~/\" + relative.split(paths.sep).join(\"/\")\n}\n\nexport function formatPath(\n input: string | undefined,\n options: { base: string; home?: string; forwardSlashes?: boolean },\n) {\n if (!input) return \"\"\n const windows = windowsPath(options.base)\n if (!windows && windowsPath(input)) {\n return options.forwardSlashes ? input.replaceAll(\"\\\\\", \"/\") : input\n }\n\n const paths = windows ? path.win32 : path.posix\n const absolute = paths.isAbsolute(input) ? input : paths.resolve(options.base, input)\n const relative = paths.relative(options.base, absolute)\n const formatted = !relative\n ? \".\"\n : relative !== \"..\" && !relative.startsWith(\"..\" + paths.sep) && !paths.isAbsolute(relative)\n ? relative\n : options.home\n ? abbreviateHome(absolute, options.home)\n : absolute\n return options.forwardSlashes ? formatted.replaceAll(\"\\\\\", \"/\") : formatted\n}\n\nfunction windowsPath(input: string) {\n return /^[A-Za-z]:[\\\\/]/.test(input) || input.startsWith(\"\\\\\\\\\")\n}\n", | ||
| "import path from \"node:path\"\n\nexport const LANGUAGE_EXTENSIONS: Record<string, string> = {\n \".abap\": \"abap\",\n \".bat\": \"bat\",\n \".bib\": \"bibtex\",\n \".bibtex\": \"bibtex\",\n \".clj\": \"clojure\",\n \".cljs\": \"clojure\",\n \".cljc\": \"clojure\",\n \".edn\": \"clojure\",\n \".coffee\": \"coffeescript\",\n \".c\": \"c\",\n \".cpp\": \"cpp\",\n \".cxx\": \"cpp\",\n \".cc\": \"cpp\",\n \".c++\": \"cpp\",\n \".cs\": \"csharp\",\n \".csx\": \"csharp\",\n \".css\": \"css\",\n \".d\": \"d\",\n \".pas\": \"pascal\",\n \".pascal\": \"pascal\",\n \".diff\": \"diff\",\n \".patch\": \"diff\",\n \".dart\": \"dart\",\n \".dockerfile\": \"dockerfile\",\n \".ex\": \"elixir\",\n \".exs\": \"elixir\",\n \".erl\": \"erlang\",\n \".ets\": \"typescript\",\n \".hrl\": \"erlang\",\n \".fs\": \"fsharp\",\n \".fsi\": \"fsharp\",\n \".fsx\": \"fsharp\",\n \".fsscript\": \"fsharp\",\n \".gitcommit\": \"git-commit\",\n \".gitrebase\": \"git-rebase\",\n \".go\": \"go\",\n \".groovy\": \"groovy\",\n \".gleam\": \"gleam\",\n \".hbs\": \"handlebars\",\n \".handlebars\": \"handlebars\",\n \".hs\": \"haskell\",\n \".lhs\": \"haskell\",\n \".html\": \"html\",\n \".htm\": \"html\",\n \".ini\": \"ini\",\n \".java\": \"java\",\n \".jl\": \"julia\",\n \".js\": \"javascript\",\n \".kt\": \"kotlin\",\n \".kts\": \"kotlin\",\n \".jsx\": \"javascriptreact\",\n \".json\": \"json\",\n \".tex\": \"latex\",\n \".latex\": \"latex\",\n \".less\": \"less\",\n \".lua\": \"lua\",\n \".makefile\": \"makefile\",\n makefile: \"makefile\",\n \".md\": \"markdown\",\n \".markdown\": \"markdown\",\n \".m\": \"objective-c\",\n \".mm\": \"objective-cpp\",\n \".pl\": \"perl\",\n \".pm\": \"perl\",\n \".pm6\": \"perl6\",\n \".php\": \"php\",\n \".ps1\": \"powershell\",\n \".psm1\": \"powershell\",\n \".pug\": \"jade\",\n \".jade\": \"jade\",\n \".py\": \"python\",\n \".r\": \"r\",\n \".cshtml\": \"razor\",\n \".razor\": \"razor\",\n \".rb\": \"ruby\",\n \".rake\": \"ruby\",\n \".gemspec\": \"ruby\",\n \".ru\": \"ruby\",\n \".erb\": \"erb\",\n \".html.erb\": \"erb\",\n \".js.erb\": \"erb\",\n \".css.erb\": \"erb\",\n \".json.erb\": \"erb\",\n \".rs\": \"rust\",\n \".scss\": \"scss\",\n \".sass\": \"sass\",\n \".scala\": \"scala\",\n \".shader\": \"shaderlab\",\n \".sh\": \"shellscript\",\n \".bash\": \"shellscript\",\n \".zsh\": \"shellscript\",\n \".ksh\": \"shellscript\",\n \".sql\": \"sql\",\n \".svelte\": \"svelte\",\n \".swift\": \"swift\",\n \".ts\": \"typescript\",\n \".tsx\": \"typescriptreact\",\n \".mts\": \"typescript\",\n \".cts\": \"typescript\",\n \".mtsx\": \"typescriptreact\",\n \".ctsx\": \"typescriptreact\",\n \".xml\": \"xml\",\n \".xsl\": \"xsl\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".mjs\": \"javascript\",\n \".cjs\": \"javascript\",\n \".vue\": \"vue\",\n \".zig\": \"zig\",\n \".zon\": \"zig\",\n \".astro\": \"astro\",\n \".ml\": \"ocaml\",\n \".mli\": \"ocaml\",\n \".tf\": \"terraform\",\n \".tfvars\": \"terraform-vars\",\n \".hcl\": \"hcl\",\n \".nix\": \"nix\",\n \".typ\": \"typst\",\n \".typc\": \"typst\",\n}\n\nexport function filetype(input?: string) {\n if (!input) return \"none\"\n const language = LANGUAGE_EXTENSIONS[path.extname(input)]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(language)) return \"typescript\"\n return language\n}\n", | ||
| "export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n", | ||
| "import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "8DE7D9D6B9A48A6B64756E2164756E21", | ||
| "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": "AF4F3087C51A9C9E64756E2164756E21", | ||
| "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": "9E54B25BF669C3E664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package.js\"\nimport { OpenAICompatibleChat } from \"../protocols/openai-compatible-chat.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\nimport type { OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.OAuthOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly accessToken?: string\n readonly apiKey?: never\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst route = OpenAICompatibleChat.route.with({\n id: \"google-vertex-chat\",\n provider: id,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config) => {\n if (\"apiKey\" in input && input.apiKey !== undefined) throw new Error(\"Google Vertex Chat does not support API keys\")\n const {\n accessToken: _accessToken,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const location = GoogleVertexShared.location(inputLocation, \"global\")\n const project = GoogleVertexShared.project(inputProject)\n return route.with({\n ...rest,\n endpoint: {\n baseURL:\n baseURL ??\n `https://aiplatform.googleapis.com/v1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}/endpoints/openapi`,\n },\n auth: GoogleVertexShared.oauth(input, project),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<OpenAIProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined) throw new Error(\"Google Vertex Chat does not support API keys\")\n return configure({\n accessToken: settings.accessToken,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";ykBAOO,IAAM,EAAK,EAAW,KAAK,eAAe,EAmB3C,EAAQ,EAAqB,MAAM,KAAK,CAC5C,GAAI,qBACJ,SAAU,CACZ,CAAC,EAID,IAAM,EAAkB,CAAC,IAAkB,CACzC,GAAI,WAAY,GAAS,EAAM,SAAW,OAAW,MAAU,MAAM,8CAA8C,EACnH,IACE,YAAa,EACb,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAW,EAAmB,SAAS,EAAe,QAAQ,EAC9D,EAAU,EAAmB,QAAQ,CAAY,EACvD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CACR,QACE,GACA,iDAAiD,EAAmB,eAAe,CAAO,eAAe,qBAC7G,EACA,KAAM,EAAmB,MAAM,EAAO,CAAO,CAC/C,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAAkC,CAAE,GAAI,CAAQ,CAAC,EAC7F,WACF,GAQK,IAAM,EAAmF,CAAC,EAAS,IAAa,CACrH,GAAI,EAAS,SAAW,OAAW,MAAU,MAAM,8CAA8C,EACjG,OAAO,EAAU,CACf,YAAa,EAAS,YACtB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "10B6B206EA0F365164756E2164756E21", | ||
| "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": "BC009BA6A707DB1264756E2164756E21", | ||
| "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": "F5D15EF6B19F474764756E2164756E21", | ||
| "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": "75560BA09CCF8FD764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/lifecycle.ts", "../ai/src/protocols/utils/gemini-tool-schema.ts", "../ai/src/protocols/utils/tool-schema.ts"], | ||
| "sourcesContent": [ | ||
| "import { LLMEvent, type FinishReasonDetails, type ProviderMetadata, type Usage } from \"../../schema/index.js\"\n\nexport interface State {\n readonly stepStarted: boolean\n readonly text: ReadonlySet<string>\n readonly reasoning: ReadonlySet<string>\n}\n\nexport const initial = (): State => ({ stepStarted: false, text: new Set(), reasoning: new Set() })\n\nexport const stepStart = (state: State, events: LLMEvent[]): State => {\n if (state.stepStarted) return state\n events.push(LLMEvent.stepStart({ index: 0 }))\n return { ...state, stepStarted: true }\n}\n\nexport const textStart = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textStart({ id, providerMetadata }))\n return { ...stepped, text: new Set([...stepped.text, id]) }\n}\n\nexport const textDelta = (state: State, events: LLMEvent[], id: string, text: string): State => {\n const started = textStart(state, events, id)\n events.push(LLMEvent.textDelta({ id, text }))\n return started\n}\n\nexport const reasoningStart = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningStart({ id, providerMetadata }))\n return { ...stepped, reasoning: new Set([...stepped.reasoning, id]) }\n}\n\nexport const reasoningDelta = (\n state: State,\n events: LLMEvent[],\n id: string,\n text: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n const started = reasoningStart(state, events, id, providerMetadata)\n events.push(LLMEvent.reasoningDelta({ id, text, providerMetadata }))\n return started\n}\n\nexport const reasoningEnd = (\n state: State,\n events: LLMEvent[],\n id: string,\n providerMetadata?: ProviderMetadata,\n): State => {\n if (!state.reasoning.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.reasoningEnd({ id, providerMetadata }))\n const reasoning = new Set(stepped.reasoning)\n reasoning.delete(id)\n return { ...stepped, reasoning }\n}\n\nexport const textEnd = (state: State, events: LLMEvent[], id: string, providerMetadata?: ProviderMetadata): State => {\n if (!state.text.has(id)) return state\n const stepped = stepStart(state, events)\n events.push(LLMEvent.textEnd({ id, providerMetadata }))\n const text = new Set(stepped.text)\n text.delete(id)\n return { ...stepped, text }\n}\n\nconst closeOpenBlocks = (state: State, events: LLMEvent[]): State => {\n for (const id of state.reasoning) events.push(LLMEvent.reasoningEnd({ id }))\n for (const id of state.text) events.push(LLMEvent.textEnd({ id }))\n return { ...state, text: new Set(), reasoning: new Set() }\n}\n\nexport const finish = (\n state: State,\n events: LLMEvent[],\n input: {\n readonly reason: FinishReasonDetails\n readonly usage?: Usage\n readonly providerMetadata?: ProviderMetadata\n },\n): State => {\n const stepped = closeOpenBlocks(stepStart(state, events), events)\n events.push(\n LLMEvent.stepFinish({\n index: 0,\n reason: input.reason,\n usage: input.usage,\n providerMetadata: input.providerMetadata,\n }),\n LLMEvent.finish(input),\n )\n return { ...stepped, stepStarted: false }\n}\n\nexport * as Lifecycle from \"./lifecycle.js\"\n", | ||
| "import { isRecord } from \"../../utils/record.js\"\n\n// Gemini accepts a JSON Schema-like dialect for tool parameters, but rejects a\n// handful of common JSON Schema shapes. Keep this projection isolated so the\n// Gemini protocol file still reads like the other protocol modules.\nconst SCHEMA_INTENT_KEYS = [\n \"type\",\n \"properties\",\n \"items\",\n \"prefixItems\",\n \"enum\",\n \"const\",\n \"$ref\",\n \"additionalProperties\",\n \"patternProperties\",\n \"required\",\n \"not\",\n \"if\",\n \"then\",\n \"else\",\n]\n\nconst hasCombiner = (schema: unknown) =>\n isRecord(schema) && (Array.isArray(schema.anyOf) || Array.isArray(schema.oneOf) || Array.isArray(schema.allOf))\n\nconst hasSchemaIntent = (schema: unknown) =>\n isRecord(schema) && (hasCombiner(schema) || SCHEMA_INTENT_KEYS.some((key) => key in schema))\n\nconst sanitizeNode = (schema: unknown): unknown => {\n if (!isRecord(schema)) return Array.isArray(schema) ? schema.map(sanitizeNode) : schema\n\n const result: Record<string, unknown> = Object.fromEntries(\n Object.entries(schema).map(([key, value]) => [\n key,\n key === \"enum\" && Array.isArray(value) ? value.map(String) : sanitizeNode(value),\n ]),\n )\n\n if (Array.isArray(result.enum) && (result.type === \"integer\" || result.type === \"number\")) result.type = \"string\"\n\n const properties = result.properties\n if (result.type === \"object\" && isRecord(properties) && Array.isArray(result.required)) {\n result.required = result.required.filter((field) => typeof field === \"string\" && field in properties)\n }\n\n if (result.type === \"array\" && !hasCombiner(result)) {\n result.items = result.items ?? {}\n if (isRecord(result.items) && !hasSchemaIntent(result.items)) result.items = { ...result.items, type: \"string\" }\n }\n\n if (typeof result.type === \"string\" && result.type !== \"object\" && !hasCombiner(result)) {\n delete result.properties\n delete result.required\n }\n\n return result\n}\n\nconst emptyObjectSchema = (schema: Record<string, unknown>) =>\n schema.type === \"object\" &&\n (!isRecord(schema.properties) || Object.keys(schema.properties).length === 0) &&\n !schema.additionalProperties\n\nconst projectNode = (schema: unknown, nested = false): Record<string, unknown> | undefined => {\n if (!isRecord(schema)) return undefined\n if (!nested && emptyObjectSchema(schema)) return undefined\n const types = Array.isArray(schema.type) ? schema.type.filter((type) => type !== \"null\") : undefined\n const anyOf = Array.isArray(schema.anyOf) ? schema.anyOf : undefined\n const hasNullAnyOf = anyOf?.some((item) => isRecord(item) && item.type === \"null\") ?? false\n const anyOfTypes = hasNullAnyOf ? anyOf?.filter((item) => !isRecord(item) || item.type !== \"null\") : anyOf\n const flattenedAnyOf = hasNullAnyOf && anyOfTypes?.length === 1 ? projectNode(anyOfTypes[0], true) : undefined\n const result = Object.fromEntries(\n [\n [\"description\", schema.description],\n [\"required\", schema.required],\n [\"format\", schema.format],\n [\"type\", types ? (types.length === 0 ? \"null\" : undefined) : schema.type],\n [\n \"nullable\",\n (Array.isArray(schema.type) && schema.type.includes(\"null\") && types && types.length > 0) || hasNullAnyOf\n ? true\n : undefined,\n ],\n [\"enum\", schema.const !== undefined ? [schema.const] : schema.enum],\n [\n \"properties\",\n isRecord(schema.properties)\n ? Object.fromEntries(Object.entries(schema.properties).map(([key, value]) => [key, projectNode(value, true)]))\n : undefined,\n ],\n [\n \"items\",\n Array.isArray(schema.items)\n ? schema.items.map((item) => projectNode(item, true))\n : schema.items === undefined\n ? undefined\n : projectNode(schema.items, true),\n ],\n [\"allOf\", Array.isArray(schema.allOf) ? schema.allOf.map((item) => projectNode(item, true)) : undefined],\n [\n \"anyOf\",\n anyOfTypes\n ? hasNullAnyOf && anyOfTypes.length === 1\n ? undefined\n : anyOfTypes.map((item) => projectNode(item, true))\n : types && types.length > 0\n ? types.map((type) => ({ type }))\n : undefined,\n ],\n [\"oneOf\", Array.isArray(schema.oneOf) ? schema.oneOf.map((item) => projectNode(item, true)) : undefined],\n [\"minLength\", schema.minLength],\n ].filter((entry) => entry[1] !== undefined),\n )\n return flattenedAnyOf ? { ...result, ...flattenedAnyOf } : result\n}\n\nexport const convert = (schema: unknown) => projectNode(sanitizeNode(schema))\n\nexport * as GeminiToolSchema from \"./gemini-tool-schema.js\"\n", | ||
| "import type { JsonSchema, LanguageModelToolSchemaCompatibility } from \"../../schema/index.js\"\nimport { isRecord } from \"../../utils/record.js\"\nimport { GeminiToolSchema } from \"./gemini-tool-schema.js\"\n\nconst removeNullSchemas = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(removeNullSchemas)\n if (!isRecord(value)) return value\n const fields = Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => key !== \"anyOf\")\n .map(([key, field]) => [key, removeNullSchemas(field)]),\n )\n if (!Array.isArray(value.anyOf)) return fields\n const variants = value.anyOf.filter((variant) => !isRecord(variant) || variant.type !== \"null\").map(removeNullSchemas)\n if (variants.length === 1 && isRecord(variants[0])) return { ...fields, ...variants[0] }\n return { ...fields, anyOf: variants }\n}\n\nconst tupleItemsSchema = (items: ReadonlyArray<unknown>) => {\n const projected = items.map(moonshotNode)\n if (projected.length === 0) return {}\n if (projected.length === 1) return projected[0]\n return { anyOf: projected }\n}\n\nconst moonshotNode = (schema: unknown): unknown => {\n if (Array.isArray(schema)) return schema.map(moonshotNode)\n if (!isRecord(schema)) return schema\n if (typeof schema.$ref === \"string\") return { $ref: schema.$ref }\n return Object.fromEntries(\n Object.entries(schema).flatMap(([key, value]) => {\n if (key === \"items\" && Array.isArray(value)) return [[key, tupleItemsSchema(value)]]\n if (key === \"prefixItems\") {\n if (\"items\" in schema) return []\n return [[\"items\", tupleItemsSchema(Array.isArray(value) ? value : [])]]\n }\n if (key === \"unevaluatedItems\") return []\n return [[key, moonshotNode(value)]]\n }),\n )\n}\n\nconst moonshot = (schema: JsonSchema): JsonSchema => {\n const projected = moonshotNode(schema)\n return isRecord(projected) ? projected : {}\n}\n\nconst openAI = (schema: JsonSchema): JsonSchema => {\n const variants = Array.isArray(schema.anyOf) ? schema.anyOf.filter(isRecord) : []\n const flattened =\n variants.length === 0\n ? { ...schema, type: \"object\" }\n : {\n ...Object.fromEntries(Object.entries(schema).filter(([key]) => key !== \"anyOf\")),\n type: \"object\",\n properties: variants.reduce(\n (properties, variant) => ({ ...(isRecord(variant.properties) ? variant.properties : {}), ...properties }),\n {},\n ),\n additionalProperties: false,\n }\n const normalized = removeNullSchemas(flattened)\n return isRecord(normalized) ? normalized : { type: \"object\" }\n}\n\nconst responses = openAI\n\nconst gemini = (schema: JsonSchema): JsonSchema => GeminiToolSchema.convert(schema) ?? {}\n\nconst modelCompatibility = (\n schema: JsonSchema,\n compatibility: LanguageModelToolSchemaCompatibility | undefined,\n): JsonSchema => {\n if (compatibility === undefined) return schema\n switch (compatibility) {\n case \"gemini\":\n return gemini(schema)\n case \"moonshot\":\n return moonshot(schema)\n }\n}\n\nexport const ToolSchemaProjection = {\n gemini,\n modelCompatibility,\n moonshot,\n openAI,\n responses,\n} as const\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "423A2D528F6CFF1D64756E2164756E21", | ||
| "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": "AB5B21F1B9A0CE0F64756E2164756E21", | ||
| "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": "686DA092DEA17A1264756E2164756E21", | ||
| "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": "07121B9465A755E264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/session.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Session from \"./session.js\"\n\nimport { Schema } from \"effect\"\nimport { Agent } from \"./agent.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionEvent } from \"./session-event.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { Money } from \"./money.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { Revert } from \"./session-revert.js\"\nimport { SessionFork } from \"./session-fork.js\"\n\nexport const ID = SessionID\nexport type ID = SessionID\n\nexport const Event = SessionEvent\n\nexport { Revert }\nexport const ForkBoundary = SessionFork.Boundary\nexport type ForkBoundary = SessionFork.Boundary\nexport const ForkRequestBoundary = SessionFork.RequestBoundary\nexport type ForkRequestBoundary = SessionFork.RequestBoundary\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n parentID: ID.pipe(optional),\n fork: Schema.Struct({\n sessionID: ID,\n boundary: ForkBoundary,\n }).pipe(optional),\n projectID: Project.ID,\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n updated: DateTimeUtcFromMillis,\n archived: DateTimeUtcFromMillis.pipe(optional),\n }),\n title: Schema.String.pipe(optional),\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n revert: Revert.pipe(optional),\n}).annotate({ identifier: \"Session.Info\" })\n\nexport const ListAnchor = Schema.Struct({\n id: ID,\n time: Schema.Finite,\n direction: Schema.Literals([\"previous\", \"next\"]),\n}).annotate({ identifier: \"Session.ListAnchor\" })\nexport interface ListAnchor extends Schema.Schema.Type<typeof ListAnchor> {}\n" | ||
| ], | ||
| "mappings": ";qjBAeO,IAAM,EAAK,EAGL,EAAQ,EAGd,IAAM,EAAe,EAAY,SAE3B,EAAsB,EAAY,gBAIlC,EAAO,EAAO,OAAO,CAChC,GAAI,EACJ,SAAU,EAAG,KAAK,CAAQ,EAC1B,KAAM,EAAO,OAAO,CAClB,UAAW,EACX,SAAU,CACZ,CAAC,EAAE,KAAK,CAAQ,EAChB,UAAW,EAAQ,GACnB,MAAO,EAAM,GAAG,KAAK,CAAQ,EAC7B,MAAO,EAAM,IAAI,KAAK,CAAQ,EAC9B,KAAM,EAAM,IACZ,OAAQ,EAAW,KACnB,KAAM,EAAO,OAAO,CAClB,QAAS,EACT,QAAS,EACT,SAAU,EAAsB,KAAK,CAAQ,CAC/C,CAAC,EACD,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,SAAU,EAAS,IACnB,QAAS,EAAa,KAAK,CAAQ,EACnC,OAAQ,EAAO,KAAK,CAAQ,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,cAAe,CAAC,EAE7B,EAAa,EAAO,OAAO,CACtC,GAAI,EACJ,KAAM,EAAO,OACb,UAAW,EAAO,SAAS,CAAC,WAAY,MAAM,CAAC,CACjD,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC", | ||
| "debugId": "B9345FF1DB15836564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/prompt.shared.ts"], | ||
| "sourcesContent": [ | ||
| "// Pure state machine for the prompt input.\n//\n// Handles history ring navigation and prompt text helpers. All functions are\n// pure -- they take state in and return new state out, with no side effects.\n//\n// The history ring (PromptHistoryState) stores past prompts and tracks\n// the current browse position. When the user arrows up at cursor offset 0,\n// the current draft is saved and history begins. Arrowing past the end\n// restores the draft.\nexport { displayCharAt, displaySlice, mentionTriggerIndex, slashTriggerIndex } from \"../prompt/display\"\nimport { stringWidth } from \"../util/string-width\"\nimport type { RunPrompt } from \"./types\"\n\nconst HISTORY_LIMIT = 200\n\nexport type PromptHistoryState = {\n items: RunPrompt[]\n index: number | null\n draft: string\n}\n\nexport type PromptMove = {\n state: PromptHistoryState\n text?: string\n cursor?: number\n apply: boolean\n}\n\nexport function promptCopy(prompt: RunPrompt): RunPrompt {\n return {\n text: prompt.text,\n parts: structuredClone(prompt.parts),\n ...(prompt.mode ? { mode: prompt.mode } : {}),\n ...(prompt.command ? { command: prompt.command } : {}),\n }\n}\n\nexport function promptSame(a: RunPrompt, b: RunPrompt): boolean {\n return (\n a.mode === b.mode &&\n a.text === b.text &&\n JSON.stringify(a.parts) === JSON.stringify(b.parts) &&\n JSON.stringify(a.command) === JSON.stringify(b.command)\n )\n}\n\nexport function isExitCommand(input: string): boolean {\n const text = input.trim().toLowerCase()\n return text === \"/exit\" || text === \"/quit\" || text === \":q\"\n}\n\nexport function isNewCommand(input: string): boolean {\n return input.trim().toLowerCase() === \"/new\"\n}\n\nexport function isCompactCommand(input: string): boolean {\n return input.trim().toLowerCase() === \"/compact\"\n}\n\nexport function createPromptHistory(items?: RunPrompt[]): PromptHistoryState {\n const list = (items ?? []).filter((item) => item.text.trim().length > 0).map(promptCopy)\n const next: RunPrompt[] = []\n for (const item of list) {\n if (next.length > 0 && promptSame(next[next.length - 1], item)) {\n continue\n }\n\n next.push(item)\n }\n\n return {\n items: next.slice(-HISTORY_LIMIT),\n index: null,\n draft: \"\",\n }\n}\n\nexport function pushPromptHistory(state: PromptHistoryState, prompt: RunPrompt): PromptHistoryState {\n if (!prompt.text.trim()) {\n return state\n }\n\n const next = promptCopy(prompt)\n if (state.items[state.items.length - 1] && promptSame(state.items[state.items.length - 1], next)) {\n return {\n ...state,\n index: null,\n draft: \"\",\n }\n }\n\n const items = [...state.items, next].slice(-HISTORY_LIMIT)\n return {\n ...state,\n items,\n index: null,\n draft: \"\",\n }\n}\n\nexport function movePromptHistory(state: PromptHistoryState, dir: -1 | 1, text: string, cursor: number): PromptMove {\n if (state.items.length === 0) {\n return { state, apply: false }\n }\n\n if (dir === -1 && cursor !== 0) {\n return { state, apply: false }\n }\n\n if (dir === 1 && cursor !== stringWidth(text)) {\n return { state, apply: false }\n }\n\n if (state.index === null) {\n if (dir === 1) {\n return { state, apply: false }\n }\n\n const idx = state.items.length - 1\n return {\n state: {\n ...state,\n index: idx,\n draft: text,\n },\n text: state.items[idx].text,\n cursor: 0,\n apply: true,\n }\n }\n\n const idx = state.index + dir\n if (idx < 0) {\n return { state, apply: false }\n }\n\n if (idx >= state.items.length) {\n return {\n state: {\n ...state,\n index: null,\n },\n text: state.draft,\n cursor: stringWidth(state.draft),\n apply: true,\n }\n }\n\n return {\n state: {\n ...state,\n index: idx,\n },\n text: state.items[idx].text,\n cursor: dir === -1 ? 0 : stringWidth(state.items[idx].text),\n apply: true,\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAaA,IAAM,EAAgB,IAef,SAAS,CAAU,CAAC,EAA8B,CACvD,MAAO,CACL,KAAM,EAAO,KACb,MAAO,gBAAgB,EAAO,KAAK,KAC/B,EAAO,KAAO,CAAE,KAAM,EAAO,IAAK,EAAI,CAAC,KACvC,EAAO,QAAU,CAAE,QAAS,EAAO,OAAQ,EAAI,CAAC,CACtD,EAGK,SAAS,CAAU,CAAC,EAAc,EAAuB,CAC9D,OACE,EAAE,OAAS,EAAE,MACb,EAAE,OAAS,EAAE,MACb,KAAK,UAAU,EAAE,KAAK,IAAM,KAAK,UAAU,EAAE,KAAK,GAClD,KAAK,UAAU,EAAE,OAAO,IAAM,KAAK,UAAU,EAAE,OAAO,EAInD,SAAS,CAAa,CAAC,EAAwB,CACpD,IAAM,EAAO,EAAM,KAAK,EAAE,YAAY,EACtC,OAAO,IAAS,SAAW,IAAS,SAAW,IAAS,KAGnD,SAAS,CAAY,CAAC,EAAwB,CACnD,OAAO,EAAM,KAAK,EAAE,YAAY,IAAM,OAGjC,SAAS,CAAgB,CAAC,EAAwB,CACvD,OAAO,EAAM,KAAK,EAAE,YAAY,IAAM,WAGjC,SAAS,CAAmB,CAAC,EAAyC,CAC3E,IAAM,GAAQ,GAAS,CAAC,GAAG,OAAO,CAAC,IAAS,EAAK,KAAK,KAAK,EAAE,OAAS,CAAC,EAAE,IAAI,CAAU,EACjF,EAAoB,CAAC,EAC3B,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,GAAK,EAAW,EAAK,EAAK,OAAS,GAAI,CAAI,EAC3D,SAGF,EAAK,KAAK,CAAI,EAGhB,MAAO,CACL,MAAO,EAAK,MAAM,CAAC,CAAa,EAChC,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAuC,CAClG,GAAI,CAAC,EAAO,KAAK,KAAK,EACpB,OAAO,EAGT,IAAM,EAAO,EAAW,CAAM,EAC9B,GAAI,EAAM,MAAM,EAAM,MAAM,OAAS,IAAM,EAAW,EAAM,MAAM,EAAM,MAAM,OAAS,GAAI,CAAI,EAC7F,MAAO,IACF,EACH,MAAO,KACP,MAAO,EACT,EAGF,IAAM,EAAQ,CAAC,GAAG,EAAM,MAAO,CAAI,EAAE,MAAM,CAAC,CAAa,EACzD,MAAO,IACF,EACH,QACA,MAAO,KACP,MAAO,EACT,EAGK,SAAS,CAAiB,CAAC,EAA2B,EAAa,EAAc,EAA4B,CAClH,GAAI,EAAM,MAAM,SAAW,EACzB,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,IAAM,IAAW,EAC3B,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,IAAQ,GAAK,IAAW,EAAY,CAAI,EAC1C,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,EAAM,QAAU,KAAM,CACxB,GAAI,IAAQ,EACV,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,IAAM,EAAM,EAAM,MAAM,OAAS,EACjC,MAAO,CACL,MAAO,IACF,EACH,MAAO,EACP,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,EACR,MAAO,EACT,EAGF,IAAM,EAAM,EAAM,MAAQ,EAC1B,GAAI,EAAM,EACR,MAAO,CAAE,QAAO,MAAO,EAAM,EAG/B,GAAI,GAAO,EAAM,MAAM,OACrB,MAAO,CACL,MAAO,IACF,EACH,MAAO,IACT,EACA,KAAM,EAAM,MACZ,OAAQ,EAAY,EAAM,KAAK,EAC/B,MAAO,EACT,EAGF,MAAO,CACL,MAAO,IACF,EACH,MAAO,CACT,EACA,KAAM,EAAM,MAAM,GAAK,KACvB,OAAQ,IAAQ,GAAK,EAAI,EAAY,EAAM,MAAM,GAAK,IAAI,EAC1D,MAAO,EACT", | ||
| "debugId": "A27A9A5C2ECB7D1764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/connection.ts", "../schema/src/integration.ts", "../schema/src/money.ts", "../schema/src/provider.ts", "../schema/src/model.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Connection from \"./connection.js\"\n\nimport { Schema } from \"effect\"\nimport { Credential } from \"./credential.js\"\n\nexport interface CredentialInfo extends Schema.Schema.Type<typeof CredentialInfo> {}\nexport const CredentialInfo = Schema.Struct({\n type: Schema.Literal(\"credential\"),\n id: Credential.ID,\n label: Schema.String,\n}).annotate({ identifier: \"Connection.CredentialInfo\" })\n\nexport interface EnvInfo extends Schema.Schema.Type<typeof EnvInfo> {}\nexport const EnvInfo = Schema.Struct({\n type: Schema.Literal(\"env\"),\n name: Schema.String,\n}).annotate({ identifier: \"Connection.EnvInfo\" })\n\nexport const Info = Schema.Union([CredentialInfo, EnvInfo])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Connection.Info\" })\nexport type Info = typeof Info.Type\n", | ||
| "export * as Integration from \"./integration.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { Connection } from \"./connection.js\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\nimport { IntegrationID, IntegrationMethodID } from \"./integration-id.js\"\nimport { Form } from \"./form.js\"\n\nexport const ID = IntegrationID\nexport type ID = typeof ID.Type\n\nexport const MethodID = IntegrationMethodID\nexport type MethodID = typeof MethodID.Type\n\nexport interface OAuthMethod extends Schema.Schema.Type<typeof OAuthMethod> {}\nexport const OAuthMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"oauth\"),\n label: Schema.String,\n form: optional(Form.Fields),\n}).annotate({ identifier: \"Integration.OAuthMethod\" })\n\nexport interface CommandMethod extends Schema.Schema.Type<typeof CommandMethod> {}\nexport const CommandMethod = Schema.Struct({\n id: MethodID,\n type: Schema.Literal(\"command\"),\n label: Schema.String,\n command: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.CommandMethod\" })\n\nexport interface KeyMethod extends Schema.Schema.Type<typeof KeyMethod> {}\nexport const KeyMethod = Schema.Struct({\n type: Schema.Literal(\"key\"),\n label: optional(Schema.String),\n form: optional(Form.Fields),\n}).annotate({ identifier: \"Integration.KeyMethod\" })\n\nexport interface EnvMethod extends Schema.Schema.Type<typeof EnvMethod> {}\nexport const EnvMethod = Schema.Struct({\n type: Schema.Literal(\"env\"),\n names: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Integration.EnvMethod\" })\n\nexport const Method = Schema.Union([OAuthMethod, CommandMethod, KeyMethod, EnvMethod])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Integration.Method\" })\nexport type Method = typeof Method.Type\n\nconst Updated = ephemeral({\n type: \"integration.updated\",\n schema: {},\n})\nconst ConnectionUpdated = ephemeral({\n type: \"integration.connection.updated\",\n schema: { integrationID: ID },\n})\nexport const Event = { Updated, ConnectionUpdated, Definitions: inventory(Updated, ConnectionUpdated) }\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n id: ID,\n name: Schema.String,\n}).annotate({ identifier: \"Integration.Ref\" })\n\nexport const Info = Schema.Struct({\n id: ID,\n name: Schema.String,\n methods: Schema.Array(Method),\n connections: Schema.Array(Connection.Info),\n}).annotate({ identifier: \"Integration.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const AttemptID = Schema.String.pipe(\n Schema.brand(\"Integration.AttemptID\"),\n statics((schema) => ({ create: () => schema.make(\"con_\" + ascending()) })),\n)\nexport type AttemptID = typeof AttemptID.Type\n\nconst AttemptTime = Schema.Struct({\n created: Schema.Number,\n expires: Schema.Number,\n})\n\nexport class Attempt extends Schema.Class<Attempt>(\"Integration.Attempt\")({\n attemptID: AttemptID,\n url: Schema.String,\n instructions: Schema.String,\n mode: Schema.Literals([\"auto\", \"code\"]),\n time: AttemptTime,\n}) {}\n\nexport const AttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.AttemptStatus\" })\nexport type AttemptStatus = typeof AttemptStatus.Type\n\nexport interface CommandAttempt extends Schema.Schema.Type<typeof CommandAttempt> {}\nexport const CommandAttempt = Schema.Struct({\n attemptID: AttemptID,\n time: AttemptTime,\n}).annotate({ identifier: \"Integration.CommandAttempt\" })\n\nexport const CommandAttemptStatus = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\"), message: optional(Schema.String), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"complete\"), time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"failed\"), message: Schema.String, time: AttemptTime }),\n Schema.Struct({ status: Schema.Literal(\"expired\"), time: AttemptTime }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Integration.CommandAttemptStatus\" })\nexport type CommandAttemptStatus = typeof CommandAttemptStatus.Type\n", | ||
| "export * as Money from \"./money.js\"\n\nimport { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const USD = Schema.Finite.pipe(\n Schema.brand(\"Money.USD\"),\n Schema.annotate({ identifier: \"Money.USD\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USD = typeof USD.Type\n\nexport const USDPerMillionTokens = Schema.Finite.pipe(\n Schema.brand(\"Money.USDPerMillionTokens\"),\n Schema.annotate({ identifier: \"Money.USDPerMillionTokens\" }),\n statics((schema) => ({ zero: schema.make(0) })),\n)\nexport type USDPerMillionTokens = typeof USDPerMillionTokens.Type\n", | ||
| "export * as Provider from \"./provider.js\"\n\nimport { Effect, Schema } from \"effect\"\nimport { Integration } from \"./integration.js\"\nimport { optional, statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"Provider.ID\"),\n statics((schema) => ({\n opencode: schema.make(\"opencode\"),\n anthropic: schema.make(\"anthropic\"),\n openai: schema.make(\"openai\"),\n google: schema.make(\"google\"),\n googleVertex: schema.make(\"google-vertex\"),\n githubCopilot: schema.make(\"github-copilot\"),\n amazonBedrock: schema.make(\"amazon-bedrock\"),\n azure: schema.make(\"azure\"),\n openrouter: schema.make(\"openrouter\"),\n mistral: schema.make(\"mistral\"),\n gitlab: schema.make(\"gitlab\"),\n })),\n)\nexport type ID = typeof ID.Type\n\nexport const Package = Schema.String\nexport type Package = typeof Package.Type\n\nexport const Activation = Schema.Literals([\"auto\", \"enabled\", \"disabled\"])\nexport type Activation = typeof Activation.Type\n\nexport const Overlays = {\n settings: Schema.Record(Schema.String, Schema.Any).pipe(optional),\n headers: Schema.Record(Schema.String, Schema.String).pipe(optional),\n body: Schema.Record(Schema.String, Schema.Any).pipe(optional),\n}\n\nexport const Settings = Schema.Record(Schema.String, Schema.Any).annotate({ identifier: \"Provider.Settings\" })\nexport type Settings = typeof Settings.Type\n\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\nexport const Request = Schema.Struct({\n settings: Settings.pipe(Schema.withConstructorDefault(Effect.succeed({}))),\n headers: Schema.Record(Schema.String, Schema.String),\n body: Schema.Record(Schema.String, Schema.Any),\n}).annotate({ identifier: \"Provider.Request\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n integrationID: Integration.ID.pipe(optional),\n name: Schema.String,\n activation: Activation,\n package: Package,\n ...Overlays,\n})\n .annotate({ identifier: \"Provider.Info\" })\n .pipe(\n statics(() => ({\n empty: (id: ID): Info => ({ id, name: id, activation: \"auto\", package: \"\" }),\n })),\n )\n", | ||
| "export * as Model from \"./model.js\"\n\nimport { Schema } from \"effect\"\nimport { optional, statics } from \"./schema.js\"\nimport { Provider } from \"./provider.js\"\nimport { Money } from \"./money.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Model.ID\"))\nexport type ID = typeof ID.Type\n\nexport const VariantID = Schema.String.pipe(Schema.brand(\"Model.VariantID\"))\nexport type VariantID = typeof VariantID.Type\n\nexport const Ref = Schema.Struct({\n id: ID,\n providerID: Provider.ID,\n variant: VariantID.pipe(optional),\n})\n .annotate({ identifier: \"Model.Ref\" })\n .pipe(\n statics((schema) => ({\n parse: (input: string) => {\n const providerEnd = input.indexOf(\"/\")\n if (providerEnd <= 0) throw new Error(`Invalid model reference: ${input}`)\n const providerID = input.slice(0, providerEnd)\n const variantStart = input.indexOf(\"#\", providerEnd + 1)\n const id = input.slice(providerEnd + 1, variantStart === -1 ? undefined : variantStart)\n const variant = variantStart === -1 ? undefined : input.slice(variantStart + 1)\n if (!id || providerID.includes(\"#\") || (variant !== undefined && (!variant || variant.includes(\"#\"))))\n throw new Error(`Invalid model reference: ${input}`)\n return schema.make({\n providerID: Provider.ID.make(providerID),\n id: ID.make(id),\n ...(variant ? { variant: VariantID.make(variant) } : {}),\n })\n },\n })),\n )\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\n\nexport const Family = Schema.String.pipe(Schema.brand(\"Model.Family\"))\nexport type Family = typeof Family.Type\n\nexport type ReasoningField = \"reasoning\" | \"reasoning_content\" | \"reasoning_text\" | (string & {})\nexport const ReasoningField: Schema.Codec<ReasoningField> = Schema.Union([\n Schema.Literals([\"reasoning\", \"reasoning_content\", \"reasoning_text\"]),\n Schema.String,\n]).annotate({ identifier: \"Model.ReasoningField\" })\n\nexport const MaxTokensField = Schema.Literals([\"max_completion_tokens\", \"max_tokens\"]).annotate({\n identifier: \"Model.MaxTokensField\",\n})\nexport type MaxTokensField = typeof MaxTokensField.Type\n\nexport interface Compatibility extends Schema.Schema.Type<typeof Compatibility> {}\nexport const Compatibility = Schema.Struct({\n reasoningField: ReasoningField.pipe(optional),\n maxTokensField: MaxTokensField.pipe(optional),\n requireFinishReason: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Model.Compatibility\" })\n\nexport interface Capabilities extends Schema.Schema.Type<typeof Capabilities> {}\nexport const Capabilities = Schema.Struct({\n tools: Schema.Boolean,\n input: Schema.Array(Schema.String),\n output: Schema.Array(Schema.String),\n responsesWebsockets: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Model.Capabilities\" })\n\nexport interface Cost extends Schema.Schema.Type<typeof Cost> {}\nexport const Cost = Schema.Struct({\n tier: Schema.Struct({\n type: Schema.tag(\"context\"),\n size: Schema.Int,\n }).pipe(optional),\n input: Money.USDPerMillionTokens,\n output: Money.USDPerMillionTokens,\n cache: Schema.Struct({\n read: Money.USDPerMillionTokens,\n write: Money.USDPerMillionTokens,\n }),\n}).annotate({ identifier: \"Model.Cost\" })\n\nexport interface Variant extends Schema.Schema.Type<typeof Variant> {}\nexport const Variant = Schema.Struct({\n id: VariantID,\n ...Provider.Overlays,\n}).annotate({ identifier: \"Model.Variant\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n modelID: ID,\n providerID: Provider.ID,\n family: Family.pipe(optional),\n name: Schema.String,\n compatibility: Compatibility.pipe(optional),\n package: Provider.Package.pipe(optional),\n ...Provider.Overlays,\n capabilities: Capabilities,\n variants: Schema.Array(Variant),\n time: Schema.Struct({\n released: Schema.Finite,\n }),\n cost: Schema.Array(Cost),\n status: Schema.Literals([\"alpha\", \"beta\", \"deprecated\", \"active\"]),\n enabled: Schema.Boolean,\n limit: Schema.Struct({\n context: Schema.Int,\n input: Schema.Int.pipe(optional),\n output: Schema.Int,\n }),\n})\n .annotate({ identifier: \"Model.Info\" })\n .pipe(\n statics(() => ({\n default: (providerID: Provider.ID, id: ID) =>\n ({\n id,\n modelID: id,\n providerID,\n name: id,\n capabilities: { tools: true, input: [\"text\", \"image\"], output: [\"text\"] },\n variants: [],\n time: { released: 0 },\n cost: [],\n status: \"active\",\n enabled: true,\n limit: { context: 200_000, output: 32_000 },\n }) satisfies Info,\n })),\n )\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "241B9F8A27D9F70264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/image-input.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding } from \"effect\"\nimport type { ImageInput } from \"../../image.js\"\nimport { InvalidRequestReason, AIError } from \"../../schema/index.js\"\n\nconst invalid = (module: string, message: string) =>\n new AIError({\n module,\n method: \"generate\",\n reason: new InvalidRequestReason({ message }),\n })\n\nexport const dataUrl = (input: Extract<ImageInput, { readonly type: \"bytes\" }>) =>\n `data:${input.mediaType};base64,${Encoding.encodeBase64(input.data)}`\n\nexport const decodeDataUrl = (\n url: string,\n module: string,\n): Effect.Effect<{ readonly mediaType: string; readonly data: Uint8Array } | undefined, AIError> => {\n if (!url.startsWith(\"data:\")) return Effect.succeed(undefined)\n const match = /^data:([^;,]+);base64,(.*)$/s.exec(url)\n if (!match) return Effect.fail(invalid(module, \"Image data URLs must contain a MIME type and base64 data\"))\n return Effect.fromResult(Encoding.decodeBase64(match[2])).pipe(\n Effect.mapError(() => invalid(module, \"Image data URL contains invalid base64 data\")),\n Effect.map((data) => ({ mediaType: match[1], data })),\n )\n}\n\nexport const invalidImageInput = invalid\n\nexport const ImageInputs = {\n dataUrl,\n decodeDataUrl,\n invalid: invalidImageInput,\n} as const\n" | ||
| ], | ||
| "mappings": ";wHAIA,IAAM,EAAU,CAAC,EAAgB,IAC/B,IAAI,EAAQ,CACV,SACA,OAAQ,WACR,OAAQ,IAAI,EAAqB,CAAE,SAAQ,CAAC,CAC9C,CAAC,EAEU,EAAU,CAAC,IACtB,QAAQ,EAAM,oBAAoB,EAAS,aAAa,EAAM,IAAI,IAEvD,EAAgB,CAC3B,EACA,IACkG,CAClG,GAAI,CAAC,EAAI,WAAW,OAAO,EAAG,OAAO,EAAO,QAAQ,MAAS,EAC7D,IAAM,EAAQ,+BAA+B,KAAK,CAAG,EACrD,GAAI,CAAC,EAAO,OAAO,EAAO,KAAK,EAAQ,EAAQ,0DAA0D,CAAC,EAC1G,OAAO,EAAO,WAAW,EAAS,aAAa,EAAM,EAAE,CAAC,EAAE,KACxD,EAAO,SAAS,IAAM,EAAQ,EAAQ,6CAA6C,CAAC,EACpF,EAAO,IAAI,CAAC,KAAU,CAAE,UAAW,EAAM,GAAI,MAAK,EAAE,CACtD,GAGW,EAAoB,EAEpB,EAAc,CACzB,UACA,gBACA,QAAS,CACX", | ||
| "debugId": "E008D5C3186D3D3264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex-messages.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema, Struct } from \"effect\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\n\nexport type AnthropicOptionsInput = AnthropicMessages.OptionsInput\nexport type AnthropicProviderOptionsInput = AnthropicMessages.ProviderOptionsInput\nexport type AnthropicThinkingInput = AnthropicMessages.ThinkingInput\n\nconst VERSION = \"vertex-2023-10-16\" as const\nconst HEADER_VERSION = \"2023-06-01\" as const\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.OAuthOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly accessToken?: string\n readonly apiKey?: never\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n}\n\nconst route = Route.make({\n id: \"google-vertex-messages\",\n provider: id,\n providerMetadataKey: \"anthropic\",\n protocol: Protocol.make({\n id: AnthropicMessages.protocol.id,\n body: {\n schema: Schema.Struct({\n ...Struct.omit(AnthropicMessages.AnthropicMessagesBody.fields, [\"model\"]),\n anthropic_version: Schema.Literal(VERSION),\n }),\n from: (request) =>\n AnthropicMessages.protocol.body.from(request).pipe(\n Effect.map((body) => ({\n ...Struct.omit(body, [\"model\"]),\n anthropic_version: VERSION,\n })),\n ),\n },\n stream: AnthropicMessages.protocol.stream,\n }),\n endpoint: Endpoint.path(({ request }) => `/${request.model.id}:streamRawPredict`),\n auth: Auth.none,\n framing: AnthropicMessages.framing,\n headers: () => ({ \"anthropic-version\": HEADER_VERSION }),\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config) => {\n if (\"apiKey\" in input && input.apiKey !== undefined)\n throw new Error(\"Google Vertex Messages does not support API keys\")\n const {\n accessToken: _accessToken,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const location = GoogleVertexShared.location(inputLocation, \"global\")\n const project = GoogleVertexShared.project(inputProject)\n return route.with({\n ...rest,\n endpoint: {\n baseURL:\n baseURL ??\n `https://${GoogleVertexShared.host(location)}/v1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}/publishers/anthropic/models`,\n },\n auth: GoogleVertexShared.oauth(input, project),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<AnthropicMessages.ProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, AnthropicMessages.ProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined) throw new Error(\"Google Vertex Messages does not support API keys\")\n return configure({\n accessToken: settings.accessToken,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";+lBAcA,IAAM,EAAU,oBACV,EAAiB,aAEV,EAAK,EAAW,KAAK,eAAe,EAmB3C,EAAQ,EAAM,KAAK,CACvB,GAAI,yBACJ,SAAU,EACV,oBAAqB,YACrB,SAAU,EAAS,KAAK,CACtB,GAAI,EAAkB,SAAS,GAC/B,KAAM,CACJ,OAAQ,EAAO,OAAO,IACjB,EAAO,KAAK,EAAkB,sBAAsB,OAAQ,CAAC,OAAO,CAAC,EACxE,kBAAmB,EAAO,QAAQ,CAAO,CAC3C,CAAC,EACD,KAAM,CAAC,IACL,EAAkB,SAAS,KAAK,KAAK,CAAO,EAAE,KAC5C,EAAO,IAAI,CAAC,KAAU,IACjB,EAAO,KAAK,EAAM,CAAC,OAAO,CAAC,EAC9B,kBAAmB,CACrB,EAAE,CACJ,CACJ,EACA,OAAQ,EAAkB,SAAS,MACrC,CAAC,EACD,SAAU,EAAS,KAAK,EAAG,aAAc,IAAI,EAAQ,MAAM,qBAAqB,EAChF,KAAM,EAAK,KACX,QAAS,EAAkB,QAC3B,QAAS,KAAO,CAAE,oBAAqB,CAAe,EACxD,CAAC,EAID,IAAM,EAAkB,CAAC,IAAkB,CACzC,GAAI,WAAY,GAAS,EAAM,SAAW,OACxC,MAAU,MAAM,kDAAkD,EACpE,IACE,YAAa,EACb,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAW,EAAmB,SAAS,EAAe,QAAQ,EAC9D,EAAU,EAAmB,QAAQ,CAAY,EACvD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CACR,QACE,GACA,WAAW,EAAmB,KAAK,CAAQ,iBAAiB,EAAmB,eAAe,CAAO,eAAe,+BACxH,EACA,KAAM,EAAmB,MAAM,EAAO,CAAO,CAC/C,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAA8C,CAAE,GAAI,CAAQ,CAAC,EACzG,WACF,GAQK,IAAM,EAA+F,CAC1G,EACA,IACG,CACH,GAAI,EAAS,SAAW,OAAW,MAAU,MAAM,kDAAkD,EACrG,OAAO,EAAU,CACf,YAAa,EAAS,YACtB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "1B8EC96010D19BAE64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-compatible-responses.ts", "../ai/src/providers/google-vertex-responses.ts"], | ||
| "sourcesContent": [ | ||
| "import { Route, type RouteRoutedLanguageModelInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { OpenResponses } from \"./open-responses.js\"\n\nconst ADAPTER = \"openai-compatible-responses\"\n\nexport type OpenAICompatibleResponsesLanguageModelInput = RouteRoutedLanguageModelInput\n\n/**\n * Deployment adapter for providers that expose an Open Responses-compatible\n * `/responses` endpoint. Provider helpers configure identity, endpoint, and\n * auth while the semantic protocol remains provider-neutral.\n */\nexport const route = Route.make({\n id: ADAPTER,\n providerMetadataKey: \"openresponses\",\n protocol: OpenResponses.protocol,\n endpoint: Endpoint.path(OpenResponses.PATH),\n transport: OpenResponses.httpTransport,\n})\n\nexport * as OpenAICompatibleResponses from \"./openai-compatible-responses.js\"\n", | ||
| "import type { ProviderPackage } from \"../provider-package.js\"\nimport { OpenAICompatibleResponses } from \"../protocols/openai-compatible-responses.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\nimport type { OpenResponsesProviderOptionsInput } from \"./open-responses-options.js\"\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.OAuthOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenResponsesProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly accessToken?: string\n readonly apiKey?: never\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: OpenResponsesProviderOptionsInput\n}\n\nconst route = OpenAICompatibleResponses.route.with({\n id: \"google-vertex-responses\",\n provider: id,\n providerOptions: { store: false },\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config) => {\n if (\"apiKey\" in input && input.apiKey !== undefined)\n throw new Error(\"Google Vertex Responses does not support API keys\")\n const {\n accessToken: _accessToken,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const location = GoogleVertexShared.location(inputLocation, \"global\")\n const project = GoogleVertexShared.project(inputProject)\n return route.with({\n ...rest,\n endpoint: {\n baseURL:\n baseURL ??\n `https://aiplatform.googleapis.com/v1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}/endpoints/openapi`,\n },\n auth: GoogleVertexShared.oauth(input, project),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<OpenResponsesProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenResponsesProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined) throw new Error(\"Google Vertex Responses does not support API keys\")\n return configure({\n accessToken: settings.accessToken,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";2nBAIA,IAAM,EAAU,8BASH,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,oBAAqB,gBACrB,SAAU,EAAc,SACxB,SAAU,EAAS,KAAK,EAAc,IAAI,EAC1C,UAAW,EAAc,aAC3B,CAAC,ECZM,IAAM,EAAK,EAAW,KAAK,eAAe,EAmB3C,EAAQ,EAA0B,MAAM,KAAK,CACjD,GAAI,0BACJ,SAAU,EACV,gBAAiB,CAAE,MAAO,EAAM,CAClC,CAAC,EAID,IAAM,EAAkB,CAAC,IAAkB,CACzC,GAAI,WAAY,GAAS,EAAM,SAAW,OACxC,MAAU,MAAM,mDAAmD,EACrE,IACE,YAAa,EACb,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAW,EAAmB,SAAS,EAAe,QAAQ,EAC9D,EAAU,EAAmB,QAAQ,CAAY,EACvD,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CACR,QACE,GACA,iDAAiD,EAAmB,eAAe,CAAO,eAAe,qBAC7G,EACA,KAAM,EAAmB,MAAM,EAAO,CAAO,CAC/C,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAAQ,EAAgB,CAAK,EACnC,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAM,MAAyC,CAAE,GAAI,CAAQ,CAAC,EACpG,WACF,GAQK,IAAM,EAA0F,CACrG,EACA,IACG,CACH,GAAI,EAAS,SAAW,OAAW,MAAU,MAAM,mDAAmD,EACtG,OAAO,EAAU,CACf,YAAa,EAAS,YACtB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "D4A35BD4140D6C6C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/plugin/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect } from \"effect\"\nimport { OpenCode, 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": "1F07D74B127FF05C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/tool.ts", "../schema/src/llm.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Tool from \"./tool.js\"\n\nimport { Effect, JsonSchema, Schema } from \"effect\"\nimport type { StandardJSONSchemaV1, StandardSchemaV1 } from \"@standard-schema/spec\"\nimport type { Agent } from \"./agent.js\"\nimport type { Session } from \"./session.js\"\nimport type { SessionMessage } from \"./session-message.js\"\n\nexport type Metadata = Readonly<Record<string, any>>\n\nexport const CallID = Schema.String.pipe(Schema.brand(\"Tool.CallID\"))\nexport type CallID = typeof CallID.Type\n\nexport interface Context {\n readonly sessionID: Session.ID\n readonly agent: Agent.ID\n readonly messageID: SessionMessage.ID\n readonly id: CallID\n readonly progress: (update: Metadata) => Effect.Effect<void>\n}\n\ninterface BaseOptions {\n readonly namespace?: string\n readonly permission?: string\n}\n\nexport type Options = BaseOptions &\n (\n | {\n readonly codemode?: true\n readonly pinned?: boolean\n }\n | {\n readonly codemode: boolean\n readonly pinned?: never\n }\n )\n\nexport type ValueSchema<A = unknown> =\n | Schema.Codec<A, any>\n | (StandardSchemaV1<any, A> & StandardJSONSchemaV1<any, A>)\n | JsonSchema.JsonSchema\n\ntype InputValue<S> = 0 extends 1 & S\n ? any\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<any, infer A>\n ? A\n : unknown\ntype OutputValue<S> = S extends undefined\n ? never\n : S extends Schema.Codec<infer A, any>\n ? A\n : S extends StandardSchemaV1<infer A, any>\n ? A\n : any\n\nexport class Error extends Schema.TaggedError<Error>()(\"Tool.Error\", {\n message: Schema.String,\n error: Schema.optional(Schema.Defect()),\n metadata: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n}) {}\n\nexport interface TextContent extends Schema.Schema.Type<typeof TextContent> {}\nexport const TextContent = Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n}).annotate({ identifier: \"Tool.TextContent\" })\n\nexport interface FileContent extends Schema.Schema.Type<typeof FileContent> {}\nexport const FileContent = Schema.Struct({\n type: Schema.Literal(\"file\"),\n uri: Schema.String,\n mime: Schema.String,\n name: Schema.optional(Schema.String),\n}).annotate({ identifier: \"Tool.FileContent\" })\n\nexport const Content = Schema.Union([TextContent, FileContent])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Tool.Content\" })\nexport type Content = Schema.Schema.Type<typeof Content>\n\nexport interface Result<Output extends ValueSchema<any> | undefined = ValueSchema<any> | undefined> {\n readonly output?: OutputValue<Output>\n readonly content?: string | ReadonlyArray<Content>\n readonly metadata?: Metadata\n}\n\nexport type Info<\n Input extends ValueSchema<any> = ValueSchema<any>,\n Output extends ValueSchema<any> | undefined = ValueSchema<any> | undefined,\n> = {\n readonly name: string\n readonly input: Input\n readonly description: string\n readonly execute: (input: InputValue<Input>, context: Context) => Effect.Effect<Result<Output>, Error>\n readonly output?: Output\n readonly options?: Options\n}\n", | ||
| "export * as LLM from \"./llm.js\"\n\nimport { Schema } from \"effect\"\n\nexport const FinishReason = Schema.Literals([\"stop\", \"length\", \"tool-calls\", \"content-filter\", \"error\", \"unknown\"])\nexport type FinishReason = typeof FinishReason.Type\n" | ||
| ], | ||
| "mappings": ";8MAUO,IAAM,EAAS,EAAO,OAAO,KAAK,EAAO,MAAM,aAAa,CAAC,EAgD7D,MAAM,UAAc,EAAO,YAAmB,EAAE,aAAc,CACnE,QAAS,EAAO,OAChB,MAAO,EAAO,SAAS,EAAO,OAAO,CAAC,EACtC,SAAU,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,CACxE,CAAC,CAAE,CAAC,CAGG,IAAM,EAAc,EAAO,OAAO,CACvC,KAAM,EAAO,QAAQ,MAAM,EAC3B,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAc,EAAO,OAAO,CACvC,KAAM,EAAO,QAAQ,MAAM,EAC3B,IAAK,EAAO,OACZ,KAAM,EAAO,OACb,KAAM,EAAO,SAAS,EAAO,MAAM,CACrC,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEjC,EAAU,EAAO,MAAM,CAAC,EAAa,CAAW,CAAC,EAC3D,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,cAAe,CAAC,+CC5EnC,IAAM,EAAe,EAAO,SAAS,CAAC,OAAQ,SAAU,aAAc,iBAAkB,QAAS,SAAS,CAAC", | ||
| "debugId": "AAEC3F540913DB7D64756E2164756E21", | ||
| "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": "947F8B4D6B6F937464756E2164756E21", | ||
| "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": "19FBFFC170FDBEFD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/project-id.ts", "../schema/src/identifier.ts", "../schema/src/workspace-id.ts", "../schema/src/location.ts", "../schema/src/event.ts", "../schema/src/integration-id.ts", "../schema/src/form.ts", "../schema/src/credential.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\nimport { statics } from \"./schema.js\"\n\nexport const ProjectID = Schema.String.pipe(\n Schema.brand(\"Project.ID\"),\n statics((schema) => ({ global: schema.make(\"global\") })),\n)\nexport type ProjectID = typeof ProjectID.Type\n", | ||
| "const length = 26\nconst chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\nlet lastTimestamp = 0\nlet counter = 0\n\nexport function ascending() {\n return create(false)\n}\n\nexport function descending() {\n return create(true)\n}\n\nexport function create(descending: boolean, timestamp = Date.now()) {\n if (timestamp !== lastTimestamp) {\n lastTimestamp = timestamp\n counter = 0\n }\n counter++\n\n const current = BigInt(timestamp) * 0x1000n + BigInt(counter)\n const value = descending ? ~current : current\n const time = Array.from({ length: 6 }, (_, index) =>\n Number((value >> BigInt(40 - 8 * index)) & 0xffn)\n .toString(16)\n .padStart(2, \"0\"),\n ).join(\"\")\n const bytes = crypto.getRandomValues(new Uint8Array(length - 12))\n return time + Array.from(bytes, (byte) => chars[byte % 62]).join(\"\")\n}\n", | ||
| "import { Schema } from \"effect\"\nimport { ascending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const WorkspaceID = Schema.String.check(Schema.isStartsWith(\"wrk\")).pipe(\n Schema.brand(\"Workspace.ID\"),\n statics((schema) => {\n const create = () => schema.make(\"wrk_\" + ascending())\n return {\n ascending: (id?: string) => {\n if (!id) return create()\n if (!id.startsWith(\"wrk\")) throw new Error(`ID ${id} does not start with wrk`)\n return schema.make(id)\n },\n create,\n }\n }),\n)\nexport type WorkspaceID = typeof WorkspaceID.Type\n", | ||
| "export * as Location from \"./location.js\"\n\nimport { Schema } from \"effect\"\nimport { AbsolutePath, optional } from \"./schema.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport interface Ref extends Schema.Schema.Type<typeof Ref> {}\nexport const Ref = Schema.Struct({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n}).annotate({ identifier: \"Location.Ref\" })\n\nexport class Info extends Schema.Class<Info>(\"Location.Info\")({\n directory: AbsolutePath,\n workspaceID: optional(WorkspaceID),\n project: Schema.Struct({\n id: ProjectID,\n directory: AbsolutePath,\n canonical: AbsolutePath,\n }),\n}) {}\n\nexport function response<S extends Schema.Top>(data: S) {\n return Schema.Struct({ location: Info, data })\n}\n", | ||
| "export * as Event from \"./event.js\"\n\nimport { Schema, SchemaTransformation } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Location } from \"./location.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"evt_\")).pipe(\n Schema.brand(\"Event.ID\"),\n statics((schema) => ({ create: () => schema.make(\"evt_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\n/**\n * Position in one aggregate's durable log. Values originate from the durable\n * event envelope and synced markers;\n * `after` cursors accept only values that came from those sources.\n */\nexport const Seq = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)).pipe(Schema.brand(\"Event.Seq\"))\nexport type Seq = typeof Seq.Type\n\n/** Durable schema version of one event type, from the event definition that committed it. */\nexport const Version = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1)).pipe(Schema.brand(\"Event.Version\"))\nexport type Version = typeof Version.Type\n\nconst DurableEnvelope = Schema.Struct({ aggregateID: Schema.String, seq: Seq, version: Version })\nexport type DurableEnvelope = typeof DurableEnvelope.Type\n\nexport type DurableDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"durable\"\n readonly durable: {\n readonly version: number\n readonly aggregate: string\n }\n readonly data: DataSchema\n}\n\nexport type EphemeralDefinition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = Schema.Top & {\n readonly type: Type\n readonly durability: \"ephemeral\"\n readonly durable?: never\n readonly data: DataSchema\n}\n\nexport type Definition<\n Type extends string = string,\n DataSchema extends Schema.Codec<unknown, unknown> = Schema.Codec<unknown, unknown>,\n> = DurableDefinition<Type, DataSchema> | EphemeralDefinition<Type, DataSchema>\n\nexport type Data<D extends Definition> = Schema.Schema.Type<D[\"data\"]>\n\ntype PayloadBase<D extends Definition> = {\n readonly id: ID\n readonly type: D[\"type\"]\n readonly created: number\n readonly data: Data<D>\n readonly location?: Location.Ref\n readonly metadata?: Record<string, unknown>\n}\n\nexport type Payload<D extends Definition = Definition> = D extends DurableDefinition\n ? PayloadBase<D> & { readonly durable: DurableEnvelope }\n : PayloadBase<D> & { readonly durable?: never }\n\ntype Input<Type extends string, Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>> = {\n readonly type: Type\n readonly identifier?: string\n readonly durable?: {\n readonly version: number\n readonly aggregate: string\n }\n readonly schema: Fields\n}\n\nexport function durable<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Input<Type, Fields> & { readonly durable: NonNullable<Input<Type, Fields>[\"durable\"]> }) {\n const data = Schema.Struct(input.schema)\n const durable = Schema.Struct({\n aggregateID: DurableEnvelope.fields.aggregateID,\n seq: DurableEnvelope.fields.seq,\n version: Schema.Literal(input.durable.version).pipe(\n Schema.decodeTo(\n Schema.toType(Version),\n SchemaTransformation.transform({\n decode: () => Version.make(input.durable.version),\n encode: () => input.durable.version,\n }),\n ),\n ),\n })\n return Schema.Struct({\n id: ID,\n created: Schema.Finite,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n durable,\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"durable\" as const,\n durable: input.durable,\n data,\n })),\n ) satisfies DurableDefinition<Type, typeof data>\n}\n\nexport function ephemeral<\n const Type extends string,\n const Fields extends Readonly<Record<PropertyKey, Schema.Codec<unknown, unknown>>>,\n>(input: Omit<Input<Type, Fields>, \"durable\">) {\n const data = Schema.Struct(input.schema)\n return Schema.Struct({\n id: ID,\n created: Schema.Finite,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n type: Schema.Literal(input.type),\n location: optional(Location.Ref),\n data,\n })\n .annotate({ identifier: input.identifier ?? input.type })\n .pipe(\n statics(() => ({\n type: input.type,\n durability: \"ephemeral\" as const,\n durable: undefined,\n data,\n })),\n ) satisfies EphemeralDefinition<Type, typeof data>\n}\n\nexport function inventory<const Definitions extends ReadonlyArray<Definition>>(...definitions: Definitions) {\n return Object.freeze(definitions)\n}\n\nexport function latest(definitions: ReadonlyArray<Definition>) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n const existing = result.get(definition.type)\n if (!existing) {\n result.set(definition.type, definition)\n return result\n }\n if (definition.durable && existing.durable && definition.durable.version !== existing.durable.version) {\n if (definition.durable.version > existing.durable.version) result.set(definition.type, definition)\n return result\n }\n if (definition !== existing) throw new Error(`Duplicate latest event definition for ${definition.type}`)\n return result\n }, new Map<string, Definition>()),\n )\n}\n\nexport function versionedType(type: string, version: number) {\n return `${type}.${version}`\n}\n\nexport function durableMap<const Definitions extends ReadonlyArray<Definition>>(definitions: Definitions) {\n return readonlyMap(\n definitions.reduce((result, definition) => {\n if (definition.durability !== \"durable\") return result\n const key = versionedType(definition.type, definition.durable.version)\n if (result.has(key)) throw new Error(`Duplicate durable event definition for ${key}`)\n result.set(key, definition)\n return result\n }, new Map<string, DurableDefinition>()),\n )\n}\n\nfunction readonlyMap<Key, Value>(map: Map<Key, Value>): ReadonlyMap<Key, Value> {\n const result: ReadonlyMap<Key, Value> = Object.freeze({\n get size() {\n return map.size\n },\n entries: () => map.entries(),\n forEach: (callback: (value: Value, key: Key, map: ReadonlyMap<Key, Value>) => void, thisArg?: unknown) =>\n map.forEach((value, key) => callback.call(thisArg, value, key, result)),\n get: (key: Key) => map.get(key),\n has: (key: Key) => map.has(key),\n keys: () => map.keys(),\n values: () => map.values(),\n [Symbol.iterator]: () => map[Symbol.iterator](),\n })\n return result\n}\n", | ||
| "import { Schema } from \"effect\"\n\nexport const IntegrationID = Schema.String.pipe(Schema.brand(\"Integration.ID\"))\nexport type IntegrationID = typeof IntegrationID.Type\n\nexport const IntegrationMethodID = Schema.String.pipe(Schema.brand(\"Integration.MethodID\"))\nexport type IntegrationMethodID = typeof IntegrationMethodID.Type\n", | ||
| "export * as Form from \"./form.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, optional, statics } from \"./schema.js\"\n\nconst IDSchema = Schema.String.check(Schema.isStartsWith(\"frm_\")).pipe(Schema.brand(\"Form.ID\"))\n\nexport const ID = IDSchema.pipe(\n statics((schema: typeof IDSchema) => ({ create: (id?: string) => schema.make(id ?? \"frm_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Metadata = Schema.Record(Schema.String, Schema.Unknown).annotate({ identifier: \"Form.Metadata\" })\nexport type Metadata = typeof Metadata.Type\n\nexport const Option = Schema.Struct({\n value: Schema.String,\n label: Schema.String,\n description: Schema.String.pipe(optional),\n}).annotate({ identifier: \"Form.Option\" })\nexport interface Option extends Schema.Schema.Type<typeof Option> {}\n\n// One visibility condition on a field. A field's `when` is a list of conditions that must all\n// hold (AND) against the current answers for the field to be active. Semantics:\n// - `value` must match the referenced field's type; against a multiselect answer, `eq` means\n// \"selection includes value\" and `neq` means \"selection does not include value\".\n// - An unanswered referenced field makes the condition false for both ops.\n// - `key` must reference a field defined earlier in the form's field list.\n// Inactive fields are neither required nor answerable.\nexport const When = Schema.Struct({\n key: Schema.String,\n op: Schema.Literals([\"eq\", \"neq\"]),\n value: Schema.Union([Schema.String, Schema.Number, Schema.Boolean]),\n}).annotate({ identifier: \"Form.When\" })\nexport interface When extends Schema.Schema.Type<typeof When> {}\n\nconst FieldBase = {\n key: Schema.String,\n title: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n required: Schema.Boolean.pipe(optional),\n when: Schema.Array(When).pipe(optional),\n}\n\nexport const StringField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"string\"),\n format: Schema.Literals([\"email\", \"uri\", \"date\", \"date-time\"]).pipe(optional),\n minLength: NonNegativeInt.pipe(optional),\n maxLength: NonNegativeInt.pipe(optional),\n pattern: Schema.String.pipe(optional),\n placeholder: Schema.String.pipe(optional),\n default: Schema.String.pipe(optional),\n options: Schema.Array(Option).pipe(optional),\n custom: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Form.StringField\" })\nexport interface StringField extends Schema.Schema.Type<typeof StringField> {}\n\nexport const NumberField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"number\"),\n minimum: Schema.Number.pipe(optional),\n maximum: Schema.Number.pipe(optional),\n default: Schema.Number.pipe(optional),\n}).annotate({ identifier: \"Form.NumberField\" })\nexport interface NumberField extends Schema.Schema.Type<typeof NumberField> {}\n\nexport const IntegerField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"integer\"),\n minimum: Schema.Number.pipe(optional),\n maximum: Schema.Number.pipe(optional),\n default: Schema.Number.pipe(optional),\n}).annotate({ identifier: \"Form.IntegerField\" })\nexport interface IntegerField extends Schema.Schema.Type<typeof IntegerField> {}\n\nexport const BooleanField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"boolean\"),\n default: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Form.BooleanField\" })\nexport interface BooleanField extends Schema.Schema.Type<typeof BooleanField> {}\n\nexport const MultiselectField = Schema.Struct({\n ...FieldBase,\n type: Schema.Literal(\"multiselect\"),\n options: Schema.Array(Option),\n minItems: NonNegativeInt.pipe(optional),\n maxItems: NonNegativeInt.pipe(optional),\n custom: Schema.Boolean.pipe(optional),\n default: Schema.Array(Schema.String).pipe(optional),\n}).annotate({ identifier: \"Form.MultiselectField\" })\nexport interface MultiselectField extends Schema.Schema.Type<typeof MultiselectField> {}\n\nexport const ExternalField = Schema.Struct({\n key: Schema.String,\n type: Schema.Literal(\"external\"),\n url: Schema.String,\n title: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n}).annotate({ identifier: \"Form.ExternalField\" })\nexport interface ExternalField extends Schema.Schema.Type<typeof ExternalField> {}\n\nexport const Field = Schema.Union([\n StringField,\n NumberField,\n IntegerField,\n BooleanField,\n MultiselectField,\n ExternalField,\n]).pipe(Schema.toTaggedUnion(\"type\"), Schema.annotate({ identifier: \"Form.Field\" }))\nexport type Field = StringField | NumberField | IntegerField | BooleanField | MultiselectField | ExternalField\n\nexport const Fields = Schema.NonEmptyArray(Field).annotate({ identifier: \"Form.Fields\" })\nexport type Fields = typeof Fields.Type\n\nconst InfoBase = {\n id: ID,\n // This should be typed as SessionID. It is a plain string only because MCP elicitation\n // temporarily needs the `\"global\"` sentinel owner, which is not a real session. Once\n // elicitations can be attributed to real sessions, revert this to SessionID. Do not rely\n // on non-session owners anywhere else.\n sessionID: Schema.String,\n title: Schema.String,\n metadata: Metadata.pipe(optional),\n}\n\nexport const Info = Schema.Struct({\n ...InfoBase,\n fields: Fields,\n}).annotate({ identifier: \"Form.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const Value = Schema.Union([Schema.String, Schema.Number, Schema.Boolean, Schema.Array(Schema.String)]).annotate(\n {\n identifier: \"Form.Value\",\n },\n)\nexport type Value = typeof Value.Type\n\nexport const Answer = Schema.Record(Schema.String, Value).annotate({ identifier: \"Form.Answer\" })\nexport type Answer = typeof Answer.Type\n\nexport const State = Schema.Union([\n Schema.Struct({ status: Schema.Literal(\"pending\") }),\n Schema.Struct({ status: Schema.Literal(\"answered\"), answer: Answer }),\n Schema.Struct({ status: Schema.Literal(\"cancelled\") }),\n])\n .pipe(Schema.toTaggedUnion(\"status\"))\n .annotate({ identifier: \"Form.State\" })\nexport type State = typeof State.Type\n\nexport const Reply = Schema.Struct({\n answer: Answer,\n}).annotate({ identifier: \"Form.Reply\" })\nexport interface Reply extends Schema.Schema.Type<typeof Reply> {}\n\nconst Created = ephemeral({ type: \"form.created\", schema: { form: Info } })\nconst Replied = ephemeral({ type: \"form.replied\", schema: { id: ID, sessionID: Schema.String, answer: Answer } })\nconst Cancelled = ephemeral({ type: \"form.cancelled\", schema: { id: ID, sessionID: Schema.String } })\n\nexport const Event = { Created, Replied, Cancelled, Definitions: inventory(Created, Replied, Cancelled) }\n", | ||
| "export * as Credential from \"./credential.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { IntegrationMethodID } from \"./integration-id.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\nimport { Form } from \"./form.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"Credential.ID\"),\n statics((schema) => ({ create: () => schema.make(\"cred_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport interface OAuth extends Schema.Schema.Type<typeof OAuth> {}\nexport const OAuth = Schema.Struct({\n type: Schema.Literal(\"oauth\"),\n methodID: IntegrationMethodID,\n refresh: Schema.String,\n access: Schema.String,\n expires: NonNegativeInt,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n}).annotate({ identifier: \"Credential.OAuth\" })\n\nexport interface Key extends Schema.Schema.Type<typeof Key> {}\nexport const Key = Schema.Struct({\n type: Schema.Literal(\"key\"),\n key: Schema.String,\n metadata: optional(Schema.Record(Schema.String, Schema.Unknown)),\n configuration: optional(Form.Answer),\n}).annotate({ identifier: \"Credential.Key\" })\n\nexport const Value = Schema.Union([OAuth, Key])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Credential.Value\" })\nexport type Value = Schema.Schema.Type<typeof Value>\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D2A825E6FF3EDD6264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-options.ts"], | ||
| "sourcesContent": [ | ||
| "import { mergeProviderOptions, type ProviderOptions } from \"../schema/index.js\"\nimport type { OpenResponsesOptionsInput } from \"./open-responses-options.js\"\n\nexport type { OpenAIResponseIncludable, OpenAIServiceTier } from \"../protocols/utils/openai-options.js\"\n\nexport type OpenAIOptionsInput = OpenResponsesOptionsInput\n\nexport type OpenAIProviderOptionsInput = OpenAIOptionsInput\n\nconst definedEntries = (input: Record<string, unknown>) =>\n Object.entries(input).filter((entry) => entry[1] !== undefined)\n\nconst openAIProviderOptions = (options: OpenAIOptionsInput | undefined): ProviderOptions | undefined => {\n const result = Object.fromEntries(\n definedEntries({\n store: options?.store,\n reasoningEffort: options?.reasoningEffort,\n reasoningSummary: options?.reasoningSummary,\n include: options?.include,\n textVerbosity: options?.textVerbosity,\n serviceTier: options?.serviceTier,\n }),\n )\n if (Object.keys(result).length === 0) return undefined\n return result\n}\n\nexport const gpt5DefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined => {\n const id = modelID.toLowerCase()\n if (!id.includes(\"gpt-5\") || id.includes(\"gpt-5-chat\") || id.includes(\"gpt-5-pro\")) return undefined\n return openAIProviderOptions({\n reasoningEffort: \"medium\",\n reasoningSummary: \"auto\",\n // GPT-5 reasoning models are configured stateless (`store: false`) by\n // `openAIDefaultOptions` below, so the only way a follow-up turn can\n // carry reasoning state is via the encrypted reasoning include. Without\n // this, callers using the default model facade get reasoning summaries\n // they cannot replay statelessly.\n include: [\"reasoning.encrypted_content\"],\n textVerbosity:\n options.textVerbosity === true && id.includes(\"gpt-5.\") && !id.includes(\"codex\") && !id.includes(\"-chat\")\n ? \"low\"\n : undefined,\n })\n}\n\nexport const openAIDefaultOptions = (\n modelID: string,\n options: { readonly textVerbosity?: boolean } = {},\n): ProviderOptions | undefined =>\n mergeProviderOptions(openAIProviderOptions({ store: false }), gpt5DefaultOptions(modelID, options))\n\nexport const withOpenAIOptions = <Options extends { readonly providerOptions?: OpenAIProviderOptionsInput }>(\n modelID: string,\n options: Options,\n defaults: { readonly textVerbosity?: boolean } = {},\n): Omit<Options, \"providerOptions\"> & { readonly providerOptions?: ProviderOptions } => {\n return {\n ...options,\n providerOptions: mergeProviderOptions(openAIDefaultOptions(modelID, defaults), options.providerOptions),\n }\n}\n\nexport * as OpenAIProviderOptions from \"./openai-options.js\"\n" | ||
| ], | ||
| "mappings": ";oDASA,IAAM,EAAiB,CAAC,IACtB,OAAO,QAAQ,CAAK,EAAE,OAAO,CAAC,IAAU,EAAM,KAAO,MAAS,EAE1D,EAAwB,CAAC,IAAyE,CACtG,IAAM,EAAS,OAAO,YACpB,EAAe,CACb,MAAO,GAAS,MAChB,gBAAiB,GAAS,gBAC1B,iBAAkB,GAAS,iBAC3B,QAAS,GAAS,QAClB,cAAe,GAAS,cACxB,YAAa,GAAS,WACxB,CAAC,CACH,EACA,GAAI,OAAO,KAAK,CAAM,EAAE,SAAW,EAAG,OACtC,OAAO,GAGI,EAAqB,CAChC,EACA,EAAgD,CAAC,IACjB,CAChC,IAAM,EAAK,EAAQ,YAAY,EAC/B,GAAI,CAAC,EAAG,SAAS,OAAO,GAAK,EAAG,SAAS,YAAY,GAAK,EAAG,SAAS,WAAW,EAAG,OACpF,OAAO,EAAsB,CAC3B,gBAAiB,SACjB,iBAAkB,OAMlB,QAAS,CAAC,6BAA6B,EACvC,cACE,EAAQ,gBAAkB,IAAQ,EAAG,SAAS,QAAQ,GAAK,CAAC,EAAG,SAAS,OAAO,GAAK,CAAC,EAAG,SAAS,OAAO,EACpG,MACA,MACR,CAAC,GAGU,EAAuB,CAClC,EACA,EAAgD,CAAC,IAEjD,EAAqB,EAAsB,CAAE,MAAO,EAAM,CAAC,EAAG,EAAmB,EAAS,CAAO,CAAC,EAEvF,EAAoB,CAC/B,EACA,EACA,EAAiD,CAAC,KAE3C,IACF,EACH,gBAAiB,EAAqB,EAAqB,EAAS,CAAQ,EAAG,EAAQ,eAAe,CACxG", | ||
| "debugId": "134FAB1D74B6E21E64756E2164756E21", | ||
| "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": "1145349747E28AB964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "0E9E662C4BB8059064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/image/photon-wasm.bun.ts", "../core/src/image/photon.ts"], | ||
| "sourcesContent": [ | ||
| "// @ts-ignore Bun embeds static file imports when compiling the CLI.\nimport photonWasm from \"@silvia-odwyer/photon-node/photon_rs_bg.wasm\" with { type: \"file\" }\n\nexport default photonWasm\n", | ||
| "import photonWasm from \"#photon-wasm\"\nimport { Effect } from \"effect\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { FileSystem } from \"../filesystem.js\"\nimport { DecodeError, ResizerUnavailableError, SizeError } from \"../image.js\"\n\nconst JPEG_QUALITIES = [80, 85, 70, 55, 40]\n\nexport const make = Effect.gen(function* () {\n ;(globalThis as typeof globalThis & { __OPENCODE_PHOTON_WASM_PATH?: string }).__OPENCODE_PHOTON_WASM_PATH =\n path.isAbsolute(photonWasm) ? photonWasm : fileURLToPath(new URL(photonWasm, import.meta.url))\n const loadPhoton = yield* Effect.cached(\n Effect.tryPromise({\n try: () => import(\"@silvia-odwyer/photon-node\"),\n catch: () => new ResizerUnavailableError(),\n }),\n )\n return Effect.fn(\"Image.Photon.normalize\")(function* (\n resource: string,\n content: FileSystem.Content & { readonly encoding: \"base64\" },\n limits: {\n readonly autoResize: boolean\n readonly maxWidth: number\n readonly maxHeight: number\n readonly maxBase64Bytes: number\n },\n ) {\n const photon = yield* loadPhoton\n const decoded = yield* Effect.try({\n try: () => photon.PhotonImage.new_from_byteslice(Buffer.from(content.content, \"base64\")),\n catch: () => new DecodeError({ resource }),\n })\n try {\n const width = decoded.get_width()\n const height = decoded.get_height()\n const bytes = Buffer.byteLength(content.content, \"utf-8\")\n if (width <= limits.maxWidth && height <= limits.maxHeight && bytes <= limits.maxBase64Bytes) return content\n if (!limits.autoResize)\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n const scale = Math.min(1, limits.maxWidth / width, limits.maxHeight / height)\n const sizes = Array.from({ length: 32 }).reduce<Array<{ width: number; height: number }>>((acc) => {\n const previous = acc.at(-1) ?? {\n width: Math.max(1, Math.round(width * scale)),\n height: Math.max(1, Math.round(height * scale)),\n }\n const next =\n acc.length === 0\n ? previous\n : {\n width: previous.width === 1 ? 1 : Math.max(1, Math.floor(previous.width * 0.75)),\n height: previous.height === 1 ? 1 : Math.max(1, Math.floor(previous.height * 0.75)),\n }\n return acc.some((item) => item.width === next.width && item.height === next.height) ? acc : [...acc, next]\n }, [])\n for (const size of sizes) {\n const resized = photon.resize(decoded, size.width, size.height, photon.SamplingFilter.Lanczos3)\n try {\n const encoders: Array<readonly [mime: string, encode: () => Uint8Array]> = [\n [\"image/png\", () => resized.get_bytes()],\n ...JPEG_QUALITIES.map((quality) => [\"image/jpeg\", () => resized.get_bytes_jpeg(quality)] as const),\n ]\n for (const [mime, encode] of encoders) {\n const candidate = Buffer.from(encode()).toString(\"base64\")\n if (Buffer.byteLength(candidate, \"utf-8\") <= limits.maxBase64Bytes)\n return { ...content, content: candidate, encoding: \"base64\" as const, mime }\n }\n } finally {\n resized.free()\n }\n }\n return yield* new SizeError({\n resource,\n width,\n height,\n bytes,\n maxWidth: limits.maxWidth,\n maxHeight: limits.maxHeight,\n maxBytes: limits.maxBase64Bytes,\n })\n } finally {\n decoded.free()\n }\n })\n})\n" | ||
| ], | ||
| "mappings": ";kgCAGA,IAAe,ICDf,oBACA,wBAAS,YAIT,IAAM,EAAiB,CAAC,GAAI,GAAI,GAAI,GAAI,EAAE,EAE7B,EAAO,EAAO,IAAI,SAAU,EAAG,CACxC,WAA4E,4BAC5E,EAAK,WAAW,CAAU,EAAI,EAAa,EAAc,IAAI,IAAI,EAAY,YAAY,GAAG,CAAC,EAC/F,IAAM,EAAa,MAAO,EAAO,OAC/B,EAAO,WAAW,CAChB,IAAK,IAAa,yCAClB,MAAO,IAAM,IAAI,CACnB,CAAC,CACH,EACA,OAAO,EAAO,GAAG,wBAAwB,EAAE,SAAU,CACnD,EACA,EACA,EAMA,CACA,IAAM,EAAS,MAAO,EAChB,EAAU,MAAO,EAAO,IAAI,CAChC,IAAK,IAAM,EAAO,YAAY,mBAAmB,OAAO,KAAK,EAAQ,QAAS,QAAQ,CAAC,EACvF,MAAO,IAAM,IAAI,EAAY,CAAE,UAAS,CAAC,CAC3C,CAAC,EACD,GAAI,CACF,IAAM,EAAQ,EAAQ,UAAU,EAC1B,EAAS,EAAQ,WAAW,EAC5B,EAAQ,OAAO,WAAW,EAAQ,QAAS,OAAO,EACxD,GAAI,GAAS,EAAO,UAAY,GAAU,EAAO,WAAa,GAAS,EAAO,eAAgB,OAAO,EACrG,GAAI,CAAC,EAAO,WACV,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,EACH,IAAM,EAAQ,KAAK,IAAI,EAAG,EAAO,SAAW,EAAO,EAAO,UAAY,CAAM,EACtE,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAAE,OAAiD,CAAC,IAAQ,CACjG,IAAM,EAAW,EAAI,GAAG,EAAE,GAAK,CAC7B,MAAO,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,CAAK,CAAC,EAC5C,OAAQ,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,CAAK,CAAC,CAChD,EACM,EACJ,EAAI,SAAW,EACX,EACA,CACE,MAAO,EAAS,QAAU,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,MAAQ,IAAI,CAAC,EAC/E,OAAQ,EAAS,SAAW,EAAI,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,OAAS,IAAI,CAAC,CACpF,EACN,OAAO,EAAI,KAAK,CAAC,IAAS,EAAK,QAAU,EAAK,OAAS,EAAK,SAAW,EAAK,MAAM,EAAI,EAAM,CAAC,GAAG,EAAK,CAAI,GACxG,CAAC,CAAC,EACL,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAU,EAAO,OAAO,EAAS,EAAK,MAAO,EAAK,OAAQ,EAAO,eAAe,QAAQ,EAC9F,GAAI,CACF,IAAM,EAAqE,CACzE,CAAC,YAAa,IAAM,EAAQ,UAAU,CAAC,EACvC,GAAG,EAAe,IAAI,CAAC,IAAY,CAAC,aAAc,IAAM,EAAQ,eAAe,CAAO,CAAC,CAAU,CACnG,EACA,QAAY,EAAM,KAAW,EAAU,CACrC,IAAM,EAAY,OAAO,KAAK,EAAO,CAAC,EAAE,SAAS,QAAQ,EACzD,GAAI,OAAO,WAAW,EAAW,OAAO,GAAK,EAAO,eAClD,MAAO,IAAK,EAAS,QAAS,EAAW,SAAU,SAAmB,MAAK,UAE/E,CACA,EAAQ,KAAK,GAGjB,OAAO,MAAO,IAAI,EAAU,CAC1B,WACA,QACA,SACA,QACA,SAAU,EAAO,SACjB,UAAW,EAAO,UAClB,SAAU,EAAO,cACnB,CAAC,SACD,CACA,EAAQ,KAAK,GAEhB,EACF", | ||
| "debugId": "343DFC03223B477C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/google-images.ts", "../ai/src/providers/google.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest } from \"effect/unstable/http\"\nimport {\n GeneratedImage,\n ImageModel,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n type ProviderMetadata,\n} from \"../schema/index.js\"\nimport { ProviderShared } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\n\nconst ADAPTER = \"google-images\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\nexport type GoogleImageString<Known extends string> = Known | (string & {})\n\nexport type GoogleImageOptions = {\n readonly aspectRatio?: GoogleImageString<\n \"1:1\" | \"2:3\" | \"3:2\" | \"3:4\" | \"4:3\" | \"4:5\" | \"5:4\" | \"9:16\" | \"16:9\" | \"21:9\"\n >\n readonly imageSize?: GoogleImageString<\"1K\" | \"2K\" | \"4K\">\n readonly seed?: number\n readonly thinkingLevel?: GoogleImageString<\"MINIMAL\" | \"LOW\" | \"MEDIUM\" | \"HIGH\">\n readonly includeThoughts?: boolean\n} & Record<string, unknown>\n\nexport type GoogleImageBody = Record<string, unknown> & {\n readonly contents: ReadonlyArray<{\n readonly role: \"user\"\n readonly parts: ReadonlyArray<Record<string, unknown>>\n }>\n readonly generationConfig: Record<string, unknown>\n}\n\nconst GoogleUsage = Schema.StructWithRest(\n Schema.Struct({\n cachedContentTokenCount: Schema.optional(Schema.Number),\n thoughtsTokenCount: Schema.optional(Schema.Number),\n promptTokenCount: Schema.optional(Schema.Number),\n candidatesTokenCount: Schema.optional(Schema.Number),\n totalTokenCount: Schema.optional(Schema.Number),\n promptTokensDetails: Schema.optional(Schema.Unknown),\n candidatesTokensDetails: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst GoogleImageResponse = Schema.Struct({\n candidates: Schema.optional(\n Schema.Array(\n Schema.Struct({\n index: Schema.optional(Schema.Number),\n content: Schema.optional(\n Schema.Struct({\n parts: Schema.Array(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n inlineData: Schema.optional(\n Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n ),\n }),\n ),\n }),\n ),\n finishReason: Schema.optional(Schema.String),\n finishMessage: Schema.optional(Schema.String),\n safetyRatings: Schema.optional(Schema.Unknown),\n citationMetadata: Schema.optional(Schema.Unknown),\n groundingMetadata: Schema.optional(Schema.Unknown),\n }),\n ),\n ),\n usageMetadata: Schema.optional(GoogleUsage),\n modelVersion: Schema.optional(Schema.String),\n responseId: Schema.optional(Schema.String),\n promptFeedback: Schema.optional(Schema.Unknown),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly http?: HttpOptions\n}\n\nconst nativeOptions = (options: GoogleImageOptions | undefined) => {\n const { aspectRatio, imageSize, seed, thinkingLevel, includeThoughts, ...native } = options ?? {}\n const image = {\n aspectRatio,\n imageSize,\n }\n const thinkingConfig = {\n thinkingLevel,\n includeThoughts,\n }\n return (\n mergeJsonRecords(\n {\n responseModalities: [\"IMAGE\"],\n imageConfig: Object.values(image).some((value) => value !== undefined) ? image : undefined,\n seed,\n thinkingConfig: Object.values(thinkingConfig).some((value) => value !== undefined) ? thinkingConfig : undefined,\n },\n native,\n ) ?? { responseModalities: [\"IMAGE\"] }\n )\n}\n\nconst invalidOutput = (message: string, providerMetadata?: ProviderMetadata) =>\n new AIError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER, providerMetadata }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<GoogleImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"GoogleImages.generate\")(function* (request: ImageRequestFor<GoogleImageOptions>, execute) {\n const imageParts = yield* Effect.forEach(request.images ?? [], googleImagePart)\n const http = mergeHttpOptions(request.model.http, request.http)\n const requestBody = mergeJsonRecords(\n {\n contents: [{ role: \"user\", parts: [{ text: request.prompt }, ...imageParts] }],\n generationConfig: nativeOptions(request.options),\n },\n http?.body,\n ) as GoogleImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const url = applyQuery(\n `${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}/models/${request.model.id}:generateContent`,\n http?.query,\n )\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the Google Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(GoogleImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"Google Images returned an invalid response\")),\n )\n const candidates = decoded.candidates ?? []\n const candidateMetadata = candidates.map((candidate, candidateIndex) => ({\n index: candidate.index ?? candidateIndex,\n finishReason: candidate.finishReason,\n finishMessage: candidate.finishMessage,\n safetyRatings: candidate.safetyRatings,\n citationMetadata: candidate.citationMetadata,\n groundingMetadata: candidate.groundingMetadata,\n parts: (candidate.content?.parts ?? []).map((part) =>\n part.inlineData === undefined\n ? {\n type: \"text\",\n text: part.text,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n }\n : {\n type: \"inlineData\",\n mediaType: part.inlineData.mimeType,\n thought: part.thought,\n thoughtSignature: part.thoughtSignature,\n },\n ),\n }))\n const encoded = candidates.flatMap((candidate, candidateIndex) =>\n (candidate.content?.parts ?? []).flatMap((part, partIndex) =>\n part.inlineData === undefined || part.thought === true\n ? []\n : [{ candidate, candidateIndex, partIndex, inlineData: part.inlineData }],\n ),\n )\n const images = yield* Effect.forEach(encoded, (item) =>\n Effect.fromResult(Encoding.decodeBase64(item.inlineData.data)).pipe(\n Effect.mapError(() =>\n invalidOutput(\n `Google Images candidate ${item.candidateIndex} part ${item.partIndex} contains invalid base64 data`,\n ),\n ),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: item.inlineData.mimeType,\n data,\n providerMetadata: {\n google: {\n candidateIndex: item.candidate.index ?? item.candidateIndex,\n partIndex: item.partIndex,\n finishReason: item.candidate.finishReason,\n safetyRatings: item.candidate.safetyRatings,\n citationMetadata: item.candidate.citationMetadata,\n groundingMetadata: item.candidate.groundingMetadata,\n thoughtSignature: item.candidate.content?.parts[item.partIndex]?.thoughtSignature,\n },\n },\n }),\n ),\n ),\n )\n if (images.length === 0) {\n const finishReasons = candidates.flatMap((candidate) =>\n candidate.finishReason === undefined ? [] : [candidate.finishReason],\n )\n return yield* invalidOutput(\n `Google Images returned no final images${\n finishReasons.length === 0 ? \"\" : ` (finish reasons: ${finishReasons.join(\", \")})`\n }; inspect reason.providerMetadata.google for prompt feedback and candidate details`,\n {\n google: {\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n )\n }\n const usage = decoded.usageMetadata\n const outputTokens =\n usage?.candidatesTokenCount === undefined\n ? undefined\n : usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0)\n return new ImageResponse({\n images,\n usage:\n usage === undefined\n ? undefined\n : new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: ProviderShared.subtractTokens(\n usage.promptTokenCount,\n usage.cachedContentTokenCount,\n ),\n cacheReadInputTokens: usage.cachedContentTokenCount,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n }),\n providerMetadata: {\n google: {\n modelVersion: decoded.modelVersion,\n responseId: decoded.responseId,\n promptFeedback: decoded.promptFeedback,\n candidates: candidateMetadata,\n },\n },\n })\n }),\n }\n return ImageModel.make<GoogleImageOptions>({ id: input.id, provider: \"google\", route, http: input.http })\n}\n\nconst googleImagePart = (image: ImageInput): Effect.Effect<Record<string, unknown>, AIError> => {\n if (image.type === \"bytes\")\n return Effect.succeed({ inlineData: { mimeType: image.mediaType, data: Encoding.encodeBase64(image.data) } })\n if (image.type === \"file-uri\") return Effect.succeed({ fileData: { mimeType: image.mediaType, fileUri: image.uri } })\n if (image.type === \"url\")\n return ImageInputs.decodeDataUrl(image.url, ADAPTER).pipe(\n Effect.flatMap((decoded) => {\n if (decoded === undefined)\n return Effect.fail(\n ImageInputs.invalid(\n ADAPTER,\n \"Google generateContent does not fetch public image URLs; use bytes, a data URL, or a Gemini file URI\",\n ),\n )\n return Effect.succeed({\n inlineData: { mimeType: decoded.mediaType, data: Encoding.encodeBase64(decoded.data) },\n })\n }),\n )\n return Effect.fail(\n ImageInputs.invalid(ADAPTER, \"Google generateContent requires Gemini file URIs rather than provider file IDs\"),\n )\n}\n\nexport const GoogleImages = {\n model,\n} as const\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { HttpOptions, ProviderID, mergeHttpOptions, type ModelID } from \"../schema/index.js\"\nimport { Gemini } from \"../protocols/gemini.js\"\nimport { GoogleImages } from \"../protocols/google-images.js\"\n\nexport type { GoogleImageOptions } from \"../protocols/google-images.js\"\nexport type GeminiOptionsInput = Gemini.OptionsInput\nexport type GeminiProviderOptionsInput = Gemini.ProviderOptionsInput\n\nexport const id = ProviderID.make(\"google\")\n\nexport const routes = [Gemini.route]\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: Gemini.ProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: Gemini.ProviderOptionsInput\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"GOOGLE_GENERATIVE_AI_API_KEY\"))\n .pipe(Auth.header(\"x-goog-api-key\"))\n}\n\nconst configuredRoute = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return Gemini.route.with({ ...rest, endpoint: { baseURL }, auth: auth(input) })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n const image = (modelID: string | ModelID) =>\n GoogleImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n http: mergeHttpOptions(input.http === undefined ? undefined : HttpOptions.make(input.http)),\n })\n return {\n id,\n model: (modelID: string | ModelID) => route.model<Gemini.ProviderOptionsInput>({ id: modelID }),\n image,\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, Gemini.ProviderOptionsInput>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\n\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "328545AAC903F72464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/worktree.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Worktree from \"./worktree.js\"\n\nimport { Schema } from \"effect\"\nimport { durable, ephemeral, inventory } from \"./event.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { AbsolutePath, optional } from \"./schema.js\"\nimport { Project } from \"./project.js\"\n\nexport const StrategyID = Schema.Trim.pipe(Schema.check(Schema.isNonEmpty()), Schema.brand(\"Worktree.StrategyID\"))\nexport type StrategyID = typeof StrategyID.Type\n\nexport const CreateInput = Schema.Struct({\n projectID: ProjectID,\n strategy: StrategyID,\n from: optional(AbsolutePath),\n directory: AbsolutePath,\n name: optional(Schema.String),\n}).annotate({ identifier: \"Worktree.CreateInput\" })\nexport interface CreateInput extends Schema.Schema.Type<typeof CreateInput> {}\n\nexport const RemoveInput = Schema.Struct({\n projectID: ProjectID,\n directory: AbsolutePath,\n force: Schema.Boolean,\n}).annotate({ identifier: \"Worktree.RemoveInput\" })\nexport interface RemoveInput extends Schema.Schema.Type<typeof RemoveInput> {}\n\nexport const Info = Schema.Struct({\n directory: AbsolutePath,\n}).annotate({ identifier: \"Worktree.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nexport const Directory = Schema.Struct({\n directory: AbsolutePath,\n strategy: optional(Schema.String),\n}).annotate({ identifier: \"Worktree.Directory\" })\nexport interface Directory extends Schema.Schema.Type<typeof Directory> {}\n\nexport const ListInput = Schema.Struct({\n projectID: ProjectID,\n}).annotate({ identifier: \"Worktree.ListInput\" })\nexport interface ListInput extends Schema.Schema.Type<typeof ListInput> {}\n\nexport const List = Schema.Array(Directory).annotate({ identifier: \"Worktree.List\" })\nexport type List = typeof List.Type\n\nconst Updated = ephemeral({\n type: \"worktree.updated\",\n schema: { projectID: Project.ID },\n})\n\nconst Resolved = durable({\n type: \"worktree.resolved\",\n durable: { aggregate: \"projectID\", version: 1 },\n schema: {\n projectID: Project.ID,\n directory: AbsolutePath,\n previous: Project.ID,\n },\n})\n\nexport const Event = { Updated, Resolved, Definitions: inventory(Updated, Resolved) }\n\nexport function adopt(\n session: { readonly projectID: string; readonly directory: string },\n event: { readonly projectID: string; readonly directory: string; readonly previous: string },\n) {\n if (session.projectID !== event.previous && session.projectID !== Project.ID.global) return\n if (session.projectID === event.projectID) return\n const inside =\n session.directory === event.directory ||\n session.directory.startsWith(event.directory + \"/\") ||\n session.directory.startsWith(event.directory + \"\\\\\")\n if (!inside) return\n return {\n projectID: event.projectID,\n subpath:\n session.directory === event.directory\n ? undefined\n : session.directory.slice(event.directory.length + 1).replaceAll(\"\\\\\", \"/\"),\n }\n}\n" | ||
| ], | ||
| "mappings": ";scAQO,IAAM,EAAa,EAAO,KAAK,KAAK,EAAO,MAAM,EAAO,WAAW,CAAC,EAAG,EAAO,MAAM,qBAAqB,CAAC,EAGpG,EAAc,EAAO,OAAO,CACvC,UAAW,EACX,SAAU,EACV,KAAM,EAAS,CAAY,EAC3B,UAAW,EACX,KAAM,EAAS,EAAO,MAAM,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC,EAGrC,EAAc,EAAO,OAAO,CACvC,UAAW,EACX,UAAW,EACX,MAAO,EAAO,OAChB,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC,EAGrC,EAAO,EAAO,OAAO,CAChC,UAAW,CACb,CAAC,EAAE,SAAS,CAAE,WAAY,eAAgB,CAAC,EAG9B,EAAY,EAAO,OAAO,CACrC,UAAW,EACX,SAAU,EAAS,EAAO,MAAM,CAClC,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,EAAY,EAAO,OAAO,CACrC,UAAW,CACb,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,EAAO,EAAO,MAAM,CAAS,EAAE,SAAS,CAAE,WAAY,eAAgB,CAAC,EAG9E,EAAU,EAAU,CACxB,KAAM,mBACN,OAAQ,CAAE,UAAW,EAAQ,EAAG,CAClC,CAAC,EAEK,EAAW,EAAQ,CACvB,KAAM,oBACN,QAAS,CAAE,UAAW,YAAa,QAAS,CAAE,EAC9C,OAAQ,CACN,UAAW,EAAQ,GACnB,UAAW,EACX,SAAU,EAAQ,EACpB,CACF,CAAC,EAEY,EAAQ,CAAE,UAAS,WAAU,YAAa,EAAU,EAAS,CAAQ,CAAE,EAE7E,SAAS,CAAK,CACnB,EACA,EACA,CACA,GAAI,EAAQ,YAAc,EAAM,UAAY,EAAQ,YAAc,EAAQ,GAAG,OAAQ,OACrF,GAAI,EAAQ,YAAc,EAAM,UAAW,OAK3C,GAAI,EAHF,EAAQ,YAAc,EAAM,WAC5B,EAAQ,UAAU,WAAW,EAAM,UAAY,GAAG,GAClD,EAAQ,UAAU,WAAW,EAAM,UAAY,IAAI,GACxC,OACb,MAAO,CACL,UAAW,EAAM,UACjB,QACE,EAAQ,YAAc,EAAM,UACxB,OACA,EAAQ,UAAU,MAAM,EAAM,UAAU,OAAS,CAAC,EAAE,WAAW,KAAM,GAAG,CAChF", | ||
| "debugId": "688ECE517CB5DDCE64756E2164756E21", | ||
| "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": "8E4FC81E4020BC5364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../../node_modules/.bun/picocolors@1.1.1/node_modules/picocolors/picocolors.js"], | ||
| "sourcesContent": [ | ||
| "let p = process || {}, argv = p.argv || [], env = p.env || {}\nlet isColorSupported =\n\t!(!!env.NO_COLOR || argv.includes(\"--no-color\")) &&\n\t(!!env.FORCE_COLOR || argv.includes(\"--color\") || p.platform === \"win32\" || ((p.stdout || {}).isTTY && env.TERM !== \"dumb\") || !!env.CI)\n\nlet formatter = (open, close, replace = open) =>\n\tinput => {\n\t\tlet string = \"\" + input, index = string.indexOf(close, open.length)\n\t\treturn ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close\n\t}\n\nlet replaceClose = (string, close, replace, index) => {\n\tlet result = \"\", cursor = 0\n\tdo {\n\t\tresult += string.substring(cursor, index) + replace\n\t\tcursor = index + close.length\n\t\tindex = string.indexOf(close, cursor)\n\t} while (~index)\n\treturn result + string.substring(cursor)\n}\n\nlet createColors = (enabled = isColorSupported) => {\n\tlet f = enabled ? formatter : () => String\n\treturn {\n\t\tisColorSupported: enabled,\n\t\treset: f(\"\\x1b[0m\", \"\\x1b[0m\"),\n\t\tbold: f(\"\\x1b[1m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[1m\"),\n\t\tdim: f(\"\\x1b[2m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"),\n\t\titalic: f(\"\\x1b[3m\", \"\\x1b[23m\"),\n\t\tunderline: f(\"\\x1b[4m\", \"\\x1b[24m\"),\n\t\tinverse: f(\"\\x1b[7m\", \"\\x1b[27m\"),\n\t\thidden: f(\"\\x1b[8m\", \"\\x1b[28m\"),\n\t\tstrikethrough: f(\"\\x1b[9m\", \"\\x1b[29m\"),\n\n\t\tblack: f(\"\\x1b[30m\", \"\\x1b[39m\"),\n\t\tred: f(\"\\x1b[31m\", \"\\x1b[39m\"),\n\t\tgreen: f(\"\\x1b[32m\", \"\\x1b[39m\"),\n\t\tyellow: f(\"\\x1b[33m\", \"\\x1b[39m\"),\n\t\tblue: f(\"\\x1b[34m\", \"\\x1b[39m\"),\n\t\tmagenta: f(\"\\x1b[35m\", \"\\x1b[39m\"),\n\t\tcyan: f(\"\\x1b[36m\", \"\\x1b[39m\"),\n\t\twhite: f(\"\\x1b[37m\", \"\\x1b[39m\"),\n\t\tgray: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\n\t\tbgBlack: f(\"\\x1b[40m\", \"\\x1b[49m\"),\n\t\tbgRed: f(\"\\x1b[41m\", \"\\x1b[49m\"),\n\t\tbgGreen: f(\"\\x1b[42m\", \"\\x1b[49m\"),\n\t\tbgYellow: f(\"\\x1b[43m\", \"\\x1b[49m\"),\n\t\tbgBlue: f(\"\\x1b[44m\", \"\\x1b[49m\"),\n\t\tbgMagenta: f(\"\\x1b[45m\", \"\\x1b[49m\"),\n\t\tbgCyan: f(\"\\x1b[46m\", \"\\x1b[49m\"),\n\t\tbgWhite: f(\"\\x1b[47m\", \"\\x1b[49m\"),\n\n\t\tblackBright: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\t\tredBright: f(\"\\x1b[91m\", \"\\x1b[39m\"),\n\t\tgreenBright: f(\"\\x1b[92m\", \"\\x1b[39m\"),\n\t\tyellowBright: f(\"\\x1b[93m\", \"\\x1b[39m\"),\n\t\tblueBright: f(\"\\x1b[94m\", \"\\x1b[39m\"),\n\t\tmagentaBright: f(\"\\x1b[95m\", \"\\x1b[39m\"),\n\t\tcyanBright: f(\"\\x1b[96m\", \"\\x1b[39m\"),\n\t\twhiteBright: f(\"\\x1b[97m\", \"\\x1b[39m\"),\n\n\t\tbgBlackBright: f(\"\\x1b[100m\", \"\\x1b[49m\"),\n\t\tbgRedBright: f(\"\\x1b[101m\", \"\\x1b[49m\"),\n\t\tbgGreenBright: f(\"\\x1b[102m\", \"\\x1b[49m\"),\n\t\tbgYellowBright: f(\"\\x1b[103m\", \"\\x1b[49m\"),\n\t\tbgBlueBright: f(\"\\x1b[104m\", \"\\x1b[49m\"),\n\t\tbgMagentaBright: f(\"\\x1b[105m\", \"\\x1b[49m\"),\n\t\tbgCyanBright: f(\"\\x1b[106m\", \"\\x1b[49m\"),\n\t\tbgWhiteBright: f(\"\\x1b[107m\", \"\\x1b[49m\"),\n\t}\n}\n\nmodule.exports = createColors()\nmodule.exports.createColors = createColors\n" | ||
| ], | ||
| "mappings": ";0EAAA,IAAI,EAAI,SAAW,CAAC,EAAG,EAAO,EAAE,MAAQ,CAAC,EAAG,EAAM,EAAE,KAAO,CAAC,EACxD,EACH,EAAE,CAAC,CAAC,EAAI,UAAY,EAAK,SAAS,YAAY,KAC7C,CAAC,CAAC,EAAI,aAAe,EAAK,SAAS,SAAS,GAAK,EAAE,WAAa,UAAa,EAAE,QAAU,CAAC,GAAG,OAAS,EAAI,OAAS,QAAW,CAAC,CAAC,EAAI,IAElI,EAAY,CAAC,EAAM,EAAO,EAAU,IACvC,KAAS,CACR,IAAI,EAAS,GAAK,EAAO,EAAQ,EAAO,QAAQ,EAAO,EAAK,MAAM,EAClE,MAAO,CAAC,EAAQ,EAAO,EAAa,EAAQ,EAAO,EAAS,CAAK,EAAI,EAAQ,EAAO,EAAS,GAG3F,EAAe,CAAC,EAAQ,EAAO,EAAS,IAAU,CACrD,IAAI,EAAS,GAAI,EAAS,EAC1B,GACC,GAAU,EAAO,UAAU,EAAQ,CAAK,EAAI,EAC5C,EAAS,EAAQ,EAAM,OACvB,EAAQ,EAAO,QAAQ,EAAO,CAAM,QAC5B,CAAC,GACV,OAAO,EAAS,EAAO,UAAU,CAAM,GAGpC,EAAe,CAAC,EAAU,IAAqB,CAClD,IAAI,EAAI,EAAU,EAAY,IAAM,OACpC,MAAO,CACN,iBAAkB,EAClB,MAAO,EAAE,UAAW,SAAS,EAC7B,KAAM,EAAE,UAAW,WAAY,iBAAiB,EAChD,IAAK,EAAE,UAAW,WAAY,iBAAiB,EAC/C,OAAQ,EAAE,UAAW,UAAU,EAC/B,UAAW,EAAE,UAAW,UAAU,EAClC,QAAS,EAAE,UAAW,UAAU,EAChC,OAAQ,EAAE,UAAW,UAAU,EAC/B,cAAe,EAAE,UAAW,UAAU,EAEtC,MAAO,EAAE,WAAY,UAAU,EAC/B,IAAK,EAAE,WAAY,UAAU,EAC7B,MAAO,EAAE,WAAY,UAAU,EAC/B,OAAQ,EAAE,WAAY,UAAU,EAChC,KAAM,EAAE,WAAY,UAAU,EAC9B,QAAS,EAAE,WAAY,UAAU,EACjC,KAAM,EAAE,WAAY,UAAU,EAC9B,MAAO,EAAE,WAAY,UAAU,EAC/B,KAAM,EAAE,WAAY,UAAU,EAE9B,QAAS,EAAE,WAAY,UAAU,EACjC,MAAO,EAAE,WAAY,UAAU,EAC/B,QAAS,EAAE,WAAY,UAAU,EACjC,SAAU,EAAE,WAAY,UAAU,EAClC,OAAQ,EAAE,WAAY,UAAU,EAChC,UAAW,EAAE,WAAY,UAAU,EACnC,OAAQ,EAAE,WAAY,UAAU,EAChC,QAAS,EAAE,WAAY,UAAU,EAEjC,YAAa,EAAE,WAAY,UAAU,EACrC,UAAW,EAAE,WAAY,UAAU,EACnC,YAAa,EAAE,WAAY,UAAU,EACrC,aAAc,EAAE,WAAY,UAAU,EACtC,WAAY,EAAE,WAAY,UAAU,EACpC,cAAe,EAAE,WAAY,UAAU,EACvC,WAAY,EAAE,WAAY,UAAU,EACpC,YAAa,EAAE,WAAY,UAAU,EAErC,cAAe,EAAE,YAAa,UAAU,EACxC,YAAa,EAAE,YAAa,UAAU,EACtC,cAAe,EAAE,YAAa,UAAU,EACxC,eAAgB,EAAE,YAAa,UAAU,EACzC,aAAc,EAAE,YAAa,UAAU,EACvC,gBAAiB,EAAE,YAAa,UAAU,EAC1C,aAAc,EAAE,YAAa,UAAU,EACvC,cAAe,EAAE,YAAa,UAAU,CACzC,GAGD,EAAO,QAAU,EAAa,EAC9B,EAAO,QAAQ,aAAe", | ||
| "debugId": "A60AC87BBC281F2364756E2164756E21", | ||
| "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": "546502887140E6B664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/workspace.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Workspace from \"./workspace.js\"\n\nimport { WorkspaceEvent } from \"./workspace-event.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport const ID = WorkspaceID\nexport type ID = WorkspaceID\n\nexport const Event = WorkspaceEvent\n" | ||
| ], | ||
| "mappings": ";iNAKO,IAAM,EAAK,EAGL,EAAQ", | ||
| "debugId": "D6AF6C09F8AACF2564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/filesystem.ts"], | ||
| "sourcesContent": [ | ||
| "export * as FileSystem from \"./filesystem.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { NonNegativeInt, PositiveInt, RelativePath } from \"./schema.js\"\n\nconst Changed = ephemeral({\n type: \"filesystem.changed\",\n schema: {\n file: Schema.String,\n event: Schema.Literals([\"add\", \"change\", \"unlink\"]),\n },\n})\nexport const Event = { Changed, Definitions: inventory(Changed) }\n\nexport interface Entry extends Schema.Schema.Type<typeof Entry> {}\nexport const Entry = Schema.Struct({\n path: RelativePath,\n type: Schema.Literals([\"file\", \"directory\"]),\n}).annotate({ identifier: \"FileSystem.Entry\" })\n\nexport interface Submatch extends Schema.Schema.Type<typeof Submatch> {}\nexport const Submatch = Schema.Struct({\n text: Schema.String,\n start: NonNegativeInt,\n end: NonNegativeInt,\n}).annotate({ identifier: \"FileSystem.Submatch\" })\n\nexport interface Match extends Schema.Schema.Type<typeof Match> {}\nexport const Match = Schema.Struct({\n entry: Entry,\n line: PositiveInt,\n offset: NonNegativeInt,\n text: Schema.String,\n submatches: Schema.Array(Submatch),\n}).annotate({ identifier: \"FileSystem.Match\" })\n\nexport class FindInput extends Schema.Class<FindInput>(\"FileSystem.FindInput\")({\n query: Schema.String,\n type: Schema.Literals([\"file\", \"directory\"]).pipe(optional),\n limit: PositiveInt.pipe(optional),\n}) {}\n" | ||
| ], | ||
| "mappings": ";oVAOA,IAAM,EAAU,EAAU,CACxB,KAAM,qBACN,OAAQ,CACN,KAAM,EAAO,OACb,MAAO,EAAO,SAAS,CAAC,MAAO,SAAU,QAAQ,CAAC,CACpD,CACF,CAAC,EACY,EAAQ,CAAE,UAAS,YAAa,EAAU,CAAO,CAAE,EAGnD,EAAQ,EAAO,OAAO,CACjC,KAAM,EACN,KAAM,EAAO,SAAS,CAAC,OAAQ,WAAW,CAAC,CAC7C,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAW,EAAO,OAAO,CACpC,KAAM,EAAO,OACb,MAAO,EACP,IAAK,CACP,CAAC,EAAE,SAAS,CAAE,WAAY,qBAAsB,CAAC,EAGpC,EAAQ,EAAO,OAAO,CACjC,MAAO,EACP,KAAM,EACN,OAAQ,EACR,KAAM,EAAO,OACb,WAAY,EAAO,MAAM,CAAQ,CACnC,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEvC,MAAM,UAAkB,EAAO,MAAiB,sBAAsB,EAAE,CAC7E,MAAO,EAAO,OACd,KAAM,EAAO,SAAS,CAAC,OAAQ,WAAW,CAAC,EAAE,KAAK,CAAQ,EAC1D,MAAO,EAAY,KAAK,CAAQ,CAClC,CAAC,CAAE,CAAC", | ||
| "debugId": "572F1E1ABDC3A6B664756E2164756E21", | ||
| "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": ["../schema/src/session-transfer.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SessionTransfer from \"./session-transfer.js\"\n\nimport { Schema } from \"effect\"\nimport { Session } from \"./session.js\"\nimport { SessionMessage } from \"./session-message.js\"\n\nexport interface Data extends Schema.Schema.Type<typeof Data> {}\nexport const Data = Schema.Struct({\n info: Session.Info,\n messages: Schema.Array(SessionMessage.Info),\n}).annotate({ identifier: \"SessionTransfer.Data\" })\n" | ||
| ], | ||
| "mappings": ";iQAOO,IAAM,EAAO,EAAO,OAAO,CAChC,KAAM,EAAQ,KACd,SAAU,EAAO,MAAM,EAAe,IAAI,CAC5C,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC", | ||
| "debugId": "D40A8328A4AC119364756E2164756E21", | ||
| "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": "71F0C45AEE33513C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/gemini.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n LLMEvent,\n Usage,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n} from \"../schema/index.js\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared.js\"\nimport { GeminiToolSchema } from \"./utils/gemini-tool-schema.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\n\nconst ADAPTER = \"gemini\"\n// Google documents this sentinel for replaying Gemini 3 function calls after their original signature was lost.\nconst SKIP_THOUGHT_SIGNATURE_VALIDATOR = \"skip_thought_signature_validator\"\nexport const DEFAULT_BASE_URL = \"https://generativelanguage.googleapis.com/v1beta\"\n\n// Gemini 3 rejects replayed function calls without a thought signature. Google's SDKs avoid that in normal chats by\n// retaining complete model responses, but OpenCode reconstructs durable history and may encounter an unsigned call\n// from an older or external session. Model IDs are open-ended, so unknown Gemini aliases inherit current behavior.\nconst requiresThoughtSignatureFallback = (modelID: string) => {\n if (!/(^|\\/)gemini-/i.test(modelID)) return false\n if (/(^|\\/)gemini-(?:1|2)(?:[.-]|$)/i.test(modelID)) return false\n if (/(^|\\/)gemini-pro(?:-vision)?$/i.test(modelID)) return false\n return !/(^|\\/)gemini-robotics-er-1\\.5(?:[.-]|$)/i.test(modelID)\n}\n\n// Gemini 3 accepts media nested inside function responses; matched Gemini 2.5 variants reject it,\n// so their tool-result attachments lower as a separate user turn instead.\nconst routesLegacyToolMedia = (modelID: string) => /gemini-2[.-]5(?:[.-]|$)/i.test(modelID)\n\nexport interface OptionsInput {\n readonly [key: string]: unknown\n readonly cachedContent?: string\n readonly safetySettings?: ReadonlyArray<{\n readonly category:\n | \"HARM_CATEGORY_UNSPECIFIED\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\"\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_CIVIC_INTEGRITY\"\n | (string & {})\n readonly threshold:\n | \"HARM_BLOCK_THRESHOLD_UNSPECIFIED\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_ONLY_HIGH\"\n | \"BLOCK_NONE\"\n | \"OFF\"\n | (string & {})\n }>\n readonly serviceTier?: \"standard\" | \"flex\" | \"priority\" | (string & {})\n readonly thinkingConfig?: {\n readonly thinkingBudget?: number\n readonly includeThoughts?: boolean\n readonly thinkingLevel?: \"minimal\" | \"low\" | \"medium\" | \"high\" | (string & {})\n }\n}\n\nexport type ProviderOptionsInput = OptionsInput\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst GeminiTextPart = Schema.Struct({\n text: Schema.String,\n thought: Schema.optional(Schema.Boolean),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiInlineDataPart = Schema.Struct({\n inlineData: Schema.Struct({\n mimeType: Schema.String,\n data: Schema.String,\n }),\n})\ntype GeminiInlineDataPart = Schema.Schema.Type<typeof GeminiInlineDataPart>\n\nconst GeminiFunctionCallPart = Schema.Struct({\n functionCall: Schema.Struct({\n id: Schema.optional(Schema.String),\n name: Schema.String,\n args: Schema.optional(Schema.Unknown),\n }),\n thoughtSignature: Schema.optional(Schema.String),\n})\n\nconst GeminiFunctionResponsePart = Schema.Struct({\n functionResponse: Schema.Struct({\n id: Schema.optional(Schema.String),\n name: Schema.String,\n response: Schema.Unknown,\n parts: Schema.optional(Schema.Array(GeminiInlineDataPart)),\n }),\n})\n\nconst GeminiContentPart = Schema.Union([\n GeminiTextPart,\n GeminiInlineDataPart,\n GeminiFunctionCallPart,\n GeminiFunctionResponsePart,\n])\n\nconst GeminiContent = Schema.Struct({\n role: Schema.Literals([\"user\", \"model\"]),\n parts: Schema.Array(GeminiContentPart),\n})\ntype GeminiContent = Schema.Schema.Type<typeof GeminiContent>\n\nconst GeminiSystemInstruction = Schema.Struct({\n parts: Schema.Array(Schema.Struct({ text: Schema.String })),\n})\n\nconst GeminiFunctionDeclaration = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: Schema.optional(JsonObject),\n})\n\nconst GeminiTool = Schema.Struct({\n functionDeclarations: Schema.Array(GeminiFunctionDeclaration),\n})\n\nconst GeminiToolConfig = Schema.Struct({\n functionCallingConfig: Schema.Struct({\n mode: Schema.Literals([\"AUTO\", \"NONE\", \"ANY\"]),\n allowedFunctionNames: optionalArray(Schema.String),\n }),\n})\n\nconst GeminiThinkingConfig = Schema.Struct({\n thinkingBudget: Schema.optional(Schema.Number),\n includeThoughts: Schema.optional(Schema.Boolean),\n thinkingLevel: Schema.optional(Schema.String),\n})\n\nconst GeminiSafetySetting = Schema.Struct({\n category: Schema.String,\n threshold: Schema.String,\n})\n\nconst GeminiGenerationConfig = Schema.Struct({\n maxOutputTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n topK: Schema.optional(Schema.Number),\n frequencyPenalty: Schema.optional(Schema.Number),\n presencePenalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n thinkingConfig: Schema.optional(GeminiThinkingConfig),\n})\n\nconst GeminiBodyFields = {\n cachedContent: Schema.optional(Schema.String),\n contents: Schema.Array(GeminiContent),\n labels: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n safetySettings: optionalArray(GeminiSafetySetting),\n serviceTier: Schema.optional(Schema.String),\n systemInstruction: Schema.optional(GeminiSystemInstruction),\n tools: optionalArray(GeminiTool),\n toolConfig: Schema.optional(GeminiToolConfig),\n generationConfig: Schema.optional(GeminiGenerationConfig),\n}\nconst GeminiBody = Schema.Struct(GeminiBodyFields)\nexport type GeminiBody = Schema.Schema.Type<typeof GeminiBody>\n\nconst GeminiUsage = Schema.Struct({\n cachedContentTokenCount: Schema.optional(Schema.Number),\n thoughtsTokenCount: Schema.optional(Schema.Number),\n promptTokenCount: Schema.optional(Schema.Number),\n candidatesTokenCount: Schema.optional(Schema.Number),\n totalTokenCount: Schema.optional(Schema.Number),\n})\ntype GeminiUsage = Schema.Schema.Type<typeof GeminiUsage>\n\nconst GeminiCandidate = Schema.Struct({\n content: Schema.optional(GeminiContent),\n finishReason: Schema.optional(Schema.String),\n})\n\nconst GeminiPromptFeedback = Schema.StructWithRest(\n Schema.Struct({\n blockReason: Schema.optional(Schema.String),\n blockReasonMessage: Schema.optional(Schema.String),\n safetyRatings: Schema.optional(Schema.Unknown),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\ntype GeminiPromptFeedback = Schema.Schema.Type<typeof GeminiPromptFeedback>\n\nconst GeminiEvent = Schema.Struct({\n candidates: optionalArray(GeminiCandidate),\n promptFeedback: Schema.optional(GeminiPromptFeedback),\n usageMetadata: Schema.optional(GeminiUsage),\n})\ntype GeminiEvent = Schema.Schema.Type<typeof GeminiEvent>\n\ninterface ParserState {\n readonly finishReason?: string\n readonly hasToolCalls: boolean\n readonly nextToolCallId: number\n readonly promptFeedback?: GeminiPromptFeedback\n readonly usage?: Usage\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignature?: string\n}\n\n// =============================================================================\n// Tool Schema Conversion\n// =============================================================================\n// Tool-schema conversion has two distinct concerns:\n//\n// 1. Sanitize — fix common authoring mistakes Gemini rejects: integer/number\n// enums (must be strings), `required` entries that don't match a property,\n// untyped arrays (`items` must be present), and `properties`/`required`\n// keys on non-object scalars. Mirrors OpenCode's historical Gemini rules.\n//\n// 2. Project — lossy mapping from JSON Schema to Gemini's schema dialect:\n// drop empty root parameter schemas while preserving nested empty objects,\n// expand type arrays into `anyOf`, derive `nullable: true` from null members,\n// coerce `const` to `[const]` enum, recurse properties/items, and propagate\n// only an allowlisted set of keys (description, required, format, type,\n// nullable, enum, properties, items, allOf, anyOf, oneOf, minLength).\n// Anything outside the allowlist (e.g. `additionalProperties`, `$ref`) is\n// silently dropped.\n//\n// Sanitize runs first, then project. The implementation lives in\n// `utils/gemini-tool-schema` so this protocol keeps the same shape as the other\n// provider protocols.\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema) => ({\n name: tool.name,\n description: tool.description,\n parameters: GeminiToolSchema.convert(inputSchema),\n})\n\nconst lowerToolConfig = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Gemini\", toolChoice, {\n auto: () => ({ functionCallingConfig: { mode: \"AUTO\" as const } }),\n none: () => ({ functionCallingConfig: { mode: \"NONE\" as const } }),\n required: () => ({ functionCallingConfig: { mode: \"ANY\" as const } }),\n tool: (name) => ({ functionCallingConfig: { mode: \"ANY\" as const, allowedFunctionNames: [name] } }),\n })\n\nconst lowerUserPart = Effect.fn(\"Gemini.lowerUserPart\")(function* (part: TextPart | MediaPart) {\n if (part.type === \"text\") return { text: part.text }\n const media = ProviderShared.normalizeMedia(part)\n return { inlineData: { mimeType: media.mime, data: media.base64 } }\n})\n\nconst googleMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ google: metadata })\n\nconst thoughtSignature = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.thoughtSignature === \"string\"\n ? google.thoughtSignature\n : undefined\n}\n\nconst functionCallId = (providerMetadata: ProviderMetadata | undefined) => {\n const google = providerMetadata?.google\n return ProviderShared.isRecord(google) && typeof google.functionCallId === \"string\"\n ? google.functionCallId\n : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart) => ({\n functionCall: { id: functionCallId(part.providerMetadata), name: part.name, args: part.input },\n thoughtSignature: thoughtSignature(part.providerMetadata),\n})\n\nconst lowerMessages = Effect.fn(\"Gemini.lowerMessages\")(function* (request: LLMRequest) {\n const contents: GeminiContent[] = []\n const legacyToolMedia = routesLegacyToolMedia(request.model.id)\n let pendingMedia: GeminiInlineDataPart[] | undefined\n const flushMedia = () => {\n if (!pendingMedia) return\n contents.push({ role: \"user\", parts: [{ text: \"Attached media from tool result:\" }, ...pendingMedia] })\n pendingMedia = undefined\n }\n\n for (const message of request.messages) {\n if (message.role !== \"tool\") flushMedia()\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Gemini\", message)\n const previous = contents.at(-1)\n // Gemini rejects a continuation whose function-response turn carries extra\n // parts, so an update after a tool result starts its own user turn.\n if (previous?.role === \"user\" && !previous.parts.some((item) => \"functionResponse\" in item))\n contents[contents.length - 1] = { role: \"user\", parts: [...previous.parts, { text: part.text }] }\n else contents.push({ role: \"user\", parts: [{ text: part.text }] })\n continue\n }\n\n if (message.role === \"user\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"user\", [\"text\", \"media\"])\n parts.push(yield* lowerUserPart(part))\n }\n contents.push({ role: \"user\", parts })\n continue\n }\n\n if (message.role === \"assistant\") {\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n // Parallel Gemini 3 calls may carry one signature on the first call; unsigned sibling calls are valid.\n let hasSignedToolCall = false\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n parts.push({ text: part.text })\n continue\n }\n if (part.type === \"reasoning\") {\n parts.push({ text: part.text, thought: true, thoughtSignature: thoughtSignature(part.providerMetadata) })\n continue\n }\n if (part.type === \"tool-call\") {\n const lowered = lowerToolCall(part)\n const signature = lowered.thoughtSignature\n parts.push({\n ...lowered,\n thoughtSignature:\n signature ??\n (requiresThoughtSignatureFallback(request.model.id) && !hasSignedToolCall\n ? SKIP_THOUGHT_SIGNATURE_VALIDATOR\n : undefined),\n })\n if (signature !== undefined) hasSignedToolCall = true\n continue\n }\n }\n contents.push({ role: \"model\", parts })\n continue\n }\n\n const parts: Array<Schema.Schema.Type<typeof GeminiContentPart>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Gemini\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n parts.push({\n functionResponse: {\n id: functionCallId(part.providerMetadata),\n name: part.name,\n response: {\n name: part.name,\n content: ProviderShared.toolResultText(part),\n },\n },\n })\n continue\n }\n const content: ReadonlyArray<Tool.Content> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n const media: GeminiInlineDataPart[] = []\n for (const item of content) {\n if (item.type === \"text\") continue\n const value = ProviderShared.normalizeToolFile(item)\n media.push({ inlineData: { mimeType: value.mime, data: value.base64 } })\n }\n if (legacyToolMedia && media.length > 0) (pendingMedia ??= []).push(...media)\n parts.push({\n functionResponse: {\n id: functionCallId(part.providerMetadata),\n name: part.name,\n response: {\n name: part.name,\n content: text.join(\"\\n\"),\n },\n parts: legacyToolMedia || media.length === 0 ? undefined : media,\n },\n })\n }\n // Gemini requires every response to a parallel call batch in one user turn,\n // so consecutive tool results join the open function-response turn.\n const previous = contents.at(-1)\n if (previous?.role === \"user\" && previous.parts.some((item) => \"functionResponse\" in item))\n contents[contents.length - 1] = { role: \"user\", parts: [...previous.parts, ...parts] }\n else contents.push({ role: \"user\", parts })\n }\n\n flushMedia()\n return contents\n})\n\nconst resolveOptions = (request: LLMRequest) => {\n const input = request.providerOptions\n const value = input?.thinkingConfig\n const thinkingConfig = {\n thinkingBudget:\n ProviderShared.isRecord(value) && typeof value.thinkingBudget === \"number\" ? value.thinkingBudget : undefined,\n includeThoughts:\n ProviderShared.isRecord(value) && typeof value.includeThoughts === \"boolean\"\n ? value.includeThoughts\n : ProviderShared.isRecord(value)\n ? true\n : undefined,\n thinkingLevel:\n ProviderShared.isRecord(value) && typeof value.thinkingLevel === \"string\" ? value.thinkingLevel : undefined,\n }\n return {\n cachedContent: typeof input?.cachedContent === \"string\" ? input.cachedContent : undefined,\n safetySettings: mapSafetySettings(input?.safetySettings),\n serviceTier: typeof input?.serviceTier === \"string\" ? input.serviceTier : undefined,\n thinkingConfig: Object.values(thinkingConfig).some((item) => item !== undefined) ? thinkingConfig : undefined,\n }\n}\n\nfunction mapSafetySettings(value: unknown) {\n if (!Array.isArray(value)) return undefined\n const settings = value.flatMap((item) =>\n ProviderShared.isRecord(item) && typeof item.category === \"string\" && typeof item.threshold === \"string\"\n ? [{ category: item.category, threshold: item.threshold }]\n : [],\n )\n return settings\n}\n\nconst fromRequest = Effect.fn(\"Gemini.fromRequest\")(function* (request: LLMRequest) {\n const hasTools = request.tools.length > 0\n const generation = request.generation\n const options = resolveOptions(request)\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const generationConfig = {\n maxOutputTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n topK: generation?.topK,\n frequencyPenalty: generation?.frequencyPenalty,\n presencePenalty: generation?.presencePenalty,\n seed: generation?.seed,\n stopSequences: generation?.stop,\n thinkingConfig: options.thinkingConfig,\n }\n\n return {\n cachedContent: options.cachedContent,\n contents: yield* lowerMessages(request),\n safetySettings: options.safetySettings,\n serviceTier: options.serviceTier,\n systemInstruction:\n request.system.length === 0 ? undefined : { parts: [{ text: ProviderShared.joinText(request.system) }] },\n tools: hasTools\n ? [\n {\n functionDeclarations: request.tools.map((tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n },\n ]\n : undefined,\n toolConfig: hasTools && request.toolChoice ? yield* lowerToolConfig(request.toolChoice) : undefined,\n generationConfig: Object.values(generationConfig).some((value) => value !== undefined)\n ? generationConfig\n : undefined,\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Gemini reports `promptTokenCount` (inclusive total) with a\n// `cachedContentTokenCount` subset. `candidatesTokenCount` is *exclusive*\n// of `thoughtsTokenCount` — visible-only, not a total — so we sum the two\n// to produce the inclusive `outputTokens` the rest of the contract expects.\nconst mapUsage = (usage: GeminiUsage | undefined) => {\n if (!usage) return undefined\n const cached = usage.cachedContentTokenCount\n const nonCached = ProviderShared.subtractTokens(usage.promptTokenCount, cached)\n // `candidatesTokenCount` is visible-only; sum with thoughts to produce the\n // inclusive `outputTokens` the contract expects. Only compute the total\n // when the visible component is reported — otherwise we'd fabricate an\n // inclusive number from a partial breakdown.\n const outputTokens =\n usage.candidatesTokenCount !== undefined ? usage.candidatesTokenCount + (usage.thoughtsTokenCount ?? 0) : undefined\n return new Usage({\n inputTokens: usage.promptTokenCount,\n outputTokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n reasoningTokens: usage.thoughtsTokenCount,\n totalTokens: ProviderShared.totalTokens(usage.promptTokenCount, outputTokens, usage.totalTokenCount),\n providerMetadata: { google: usage },\n })\n}\n\nconst mapFinishReason = (finishReason: string | undefined, hasToolCalls: boolean): FinishReason => {\n if (finishReason === undefined) return hasToolCalls ? \"tool-calls\" : \"unknown\"\n if (finishReason === \"STOP\") return hasToolCalls ? \"tool-calls\" : \"stop\"\n if (finishReason === \"MAX_TOKENS\") return \"length\"\n if (\n finishReason === \"IMAGE_SAFETY\" ||\n finishReason === \"RECITATION\" ||\n finishReason === \"SAFETY\" ||\n finishReason === \"BLOCKLIST\" ||\n finishReason === \"PROHIBITED_CONTENT\" ||\n finishReason === \"SPII\" ||\n finishReason === \"MODEL_ARMOR\" ||\n finishReason === \"IMAGE_PROHIBITED_CONTENT\" ||\n finishReason === \"IMAGE_RECITATION\" ||\n finishReason === \"LANGUAGE\"\n )\n return \"content-filter\"\n if (\n finishReason === \"MALFORMED_FUNCTION_CALL\" ||\n finishReason === \"UNEXPECTED_TOOL_CALL\" ||\n finishReason === \"NO_IMAGE\" ||\n finishReason === \"TOO_MANY_TOOL_CALLS\" ||\n finishReason === \"MISSING_THOUGHT_SIGNATURE\" ||\n finishReason === \"MALFORMED_RESPONSE\"\n )\n return \"error\"\n return \"unknown\"\n}\n\nconst finish = (state: ParserState): ReadonlyArray<LLMEvent> => {\n const promptBlockReason = state.finishReason === undefined ? state.promptFeedback?.blockReason : undefined\n const finishReason = state.finishReason ?? promptBlockReason\n if (finishReason === undefined && state.usage === undefined) return []\n\n const events: LLMEvent[] = []\n const lifecycle = state.reasoningSignature\n ? Lifecycle.reasoningEnd(\n state.lifecycle,\n events,\n \"reasoning-0\",\n googleMetadata({ thoughtSignature: state.reasoningSignature }),\n )\n : state.lifecycle\n Lifecycle.finish(lifecycle, events, {\n reason: {\n normalized:\n promptBlockReason === undefined ? mapFinishReason(finishReason, state.hasToolCalls) : \"content-filter\",\n raw: finishReason,\n },\n usage: state.usage,\n providerMetadata:\n state.promptFeedback === undefined ? undefined : googleMetadata({ promptFeedback: state.promptFeedback }),\n })\n return events\n}\n\nconst step = (state: ParserState, event: GeminiEvent) => {\n const nextState = {\n ...state,\n promptFeedback: event.promptFeedback ?? state.promptFeedback,\n usage: event.usageMetadata ? (mapUsage(event.usageMetadata) ?? state.usage) : state.usage,\n }\n const candidate = event.candidates?.[0]\n if (!candidate?.content)\n return Effect.succeed([\n { ...nextState, finishReason: candidate?.finishReason ?? nextState.finishReason },\n [],\n ] as const)\n\n const events: LLMEvent[] = []\n let hasToolCalls = nextState.hasToolCalls\n let lifecycle = nextState.lifecycle\n let nextToolCallId = nextState.nextToolCallId\n let reasoningSignature = nextState.reasoningSignature\n\n for (const part of candidate.content.parts) {\n if (\"thoughtSignature\" in part && part.thoughtSignature && \"thought\" in part && part.thought)\n reasoningSignature = part.thoughtSignature\n if (\"text\" in part && part.text.length > 0) {\n if (part.thought) {\n lifecycle = Lifecycle.reasoningDelta(\n lifecycle,\n events,\n \"reasoning-0\",\n part.text,\n part.thoughtSignature ? googleMetadata({ thoughtSignature: part.thoughtSignature }) : undefined,\n )\n continue\n }\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", part.text)\n continue\n }\n\n if (\"functionCall\" in part) {\n const input = part.functionCall.args === undefined ? {} : part.functionCall.args\n const id = `tool_${nextToolCallId++}`\n const metadata = {\n ...(part.functionCall.id === undefined ? {} : { functionCallId: part.functionCall.id }),\n ...(part.thoughtSignature === undefined ? {} : { thoughtSignature: part.thoughtSignature }),\n }\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningSignature ? googleMetadata({ thoughtSignature: reasoningSignature }) : undefined,\n )\n lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(\n LLMEvent.toolCall({\n id,\n name: part.functionCall.name,\n input,\n providerMetadata: Object.keys(metadata).length > 0 ? googleMetadata(metadata) : undefined,\n }),\n )\n hasToolCalls = true\n }\n }\n\n return Effect.succeed([\n {\n ...nextState,\n hasToolCalls,\n lifecycle,\n nextToolCallId,\n reasoningSignature,\n finishReason: candidate.finishReason ?? nextState.finishReason,\n },\n events,\n ] as const)\n}\n\n// =============================================================================\n// Protocol And Gemini Route\n// =============================================================================\n/**\n * The Gemini protocol — request body construction, body schema, and the\n * streaming-event state machine shared by Google AI Studio and Vertex Gemini.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: GeminiBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(GeminiEvent),\n initial: () => ({ hasToolCalls: false, nextToolCallId: 0, lifecycle: Lifecycle.initial() }),\n step,\n onHalt: finish,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"google\",\n providerMetadataKey: \"google\",\n protocol,\n // Gemini's path embeds the model id and pins SSE framing at the URL level.\n endpoint: Endpoint.path(({ request }) => `/models/${request.model.id}:streamGenerateContent?alt=sse`, {\n baseURL: DEFAULT_BASE_URL,\n }),\n auth: Auth.none,\n framing: Framing.sse,\n})\n\nexport * as Gemini from \"./gemini.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "37D90C6BB5C7A24B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/image-client.ts", "../ai/src/image.ts"], | ||
| "sourcesContent": [ | ||
| "import { Context, Effect, Layer } from \"effect\"\nimport { RequestExecutor } from \"./route/executor.js\"\nimport type { ImageOptions, ImageRequest, ImageRequestFor, ImageResponse } from \"./image.js\"\nimport type { AIError } from \"./schema/index.js\"\n\nexport type Execute = RequestExecutor.Interface[\"execute\"]\n\nexport interface Interface {\n readonly generate: <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n ) => Effect.Effect<ImageResponse, AIError>\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/ImageClient\") {}\n\nexport const generate = <Options extends ImageOptions>(\n request: ImageRequestFor<Options>,\n): Effect.Effect<ImageResponse, AIError, Service> =>\n Effect.gen(function* () {\n const client = yield* Service\n return yield* client.generate(request)\n })\n\nexport const layer: Layer.Layer<Service, never, RequestExecutor.Service> = Layer.effect(\n Service,\n Effect.gen(function* () {\n const executor = yield* RequestExecutor.Service\n return Service.of({\n generate: (request) => request.model.route.generate(request, executor.execute),\n })\n }),\n)\n\nexport const ImageClient = {\n Service,\n layer,\n generate,\n} as const\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport {\n HttpOptions,\n InvalidRequestReason,\n AIError,\n ModelID,\n ProviderID,\n ProviderMetadata,\n Usage,\n} from \"./schema/index.js\"\nimport { ImageClient, Service, type Execute as ImageExecute } from \"./image-client.js\"\n\nexport interface ImageRoute<Options extends ImageOptions = ImageOptions> {\n readonly id: string\n readonly generate: (request: ImageRequestFor<Options>, execute: ImageExecute) => Effect.Effect<ImageResponse, AIError>\n}\n\nexport type ImageOptions = Record<string, unknown>\n\nexport class ImageModel<Options extends ImageOptions = ImageOptions> {\n declare protected readonly _Options: (options: Options) => Options\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n\n constructor(input: ImageModel.Input<Options>) {\n this.id = input.id\n this.provider = input.provider\n this.route = input.route\n this.http = input.http\n }\n\n static make<Options extends ImageOptions = ImageOptions>(input: ImageModel.MakeInput<Options>) {\n return new ImageModel<Options>({\n id: ModelID.make(input.id),\n provider: ProviderID.make(input.provider),\n route: input.route,\n http: input.http,\n })\n }\n}\n\nexport namespace ImageModel {\n export interface Input<Options extends ImageOptions = ImageOptions> {\n readonly id: ModelID\n readonly provider: ProviderID\n readonly route: ImageRoute<Options>\n readonly http?: HttpOptions\n }\n\n export interface MakeInput<Options extends ImageOptions = ImageOptions>\n extends Omit<Input<Options>, \"id\" | \"provider\"> {\n readonly id: string | ModelID\n readonly provider: string | ProviderID\n }\n}\n\nexport const ImageModelSchema = Schema.declare((value): value is ImageModel => value instanceof ImageModel, {\n expected: \"Image.Model\",\n})\n\nconst ImageBytesInput = Schema.Struct({\n type: Schema.Literal(\"bytes\"),\n data: Schema.Uint8Array,\n mediaType: Schema.String,\n})\nconst ImageUrlInput = Schema.Struct({\n type: Schema.Literal(\"url\"),\n url: Schema.String,\n})\nconst ImageFileIDInput = Schema.Struct({\n type: Schema.Literal(\"file-id\"),\n id: Schema.String,\n})\nconst ImageFileURIInput = Schema.Struct({\n type: Schema.Literal(\"file-uri\"),\n uri: Schema.String,\n mediaType: Schema.String,\n})\n\nexport const ImageInputSchema = Schema.Union([\n ImageBytesInput,\n ImageUrlInput,\n ImageFileIDInput,\n ImageFileURIInput,\n]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type ImageInput = Schema.Schema.Type<typeof ImageInputSchema>\n\nexport const ImageInput = {\n bytes: (data: Uint8Array, mediaType: string): ImageInput => ({ type: \"bytes\", data, mediaType }),\n url: (url: string): ImageInput => ({ type: \"url\", url }),\n file: (id: string): ImageInput => ({ type: \"file-id\", id }),\n fileUri: (uri: string, mediaType: string): ImageInput => ({ type: \"file-uri\", uri, mediaType }),\n} as const\n\nexport class ImageRequest extends Schema.Class<ImageRequest>(\"Image.Request\")({\n model: ImageModelSchema,\n prompt: Schema.String,\n images: Schema.optional(Schema.Array(ImageInputSchema)),\n options: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n http: Schema.optional(HttpOptions),\n}) {\n declare protected readonly _ImageRequest: void\n}\n\nexport type ImageRequestFor<Options extends ImageOptions = ImageOptions> = Omit<ImageRequest, \"model\" | \"options\"> & {\n readonly model: ImageModel<Options>\n readonly options?: Options\n}\n\nexport type ImageModelOptions<Model> = Model extends ImageModel<infer Options> ? Options : never\n\nexport type ImageRequestInput<Model extends object = ImageModel> = Omit<\n ConstructorParameters<typeof ImageRequest>[0],\n \"model\" | \"options\" | \"http\"\n> & {\n readonly model: Model\n readonly options?: NoInfer<ImageModelOptions<Model>>\n readonly http?: HttpOptions.Input\n} & (Model extends ImageModel<ImageModelOptions<Model>> ? unknown : never)\n\nexport class GeneratedImage extends Schema.Class<GeneratedImage>(\"Image.Generated\")({\n mediaType: Schema.String,\n data: Schema.Union([Schema.String, Schema.Uint8Array]),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {}\n\nexport class ImageResponse extends Schema.Class<ImageResponse>(\"Image.Response\")({\n images: Schema.Array(GeneratedImage),\n usage: Schema.optional(Usage),\n providerMetadata: Schema.optional(ProviderMetadata),\n}) {\n get image() {\n return this.images[0]\n }\n}\n\nexport function request<const Model extends object>(\n input: ImageRequestInput<Model>,\n): ImageRequestFor<ImageModelOptions<Model>>\nexport function request(input: ImageRequest): ImageRequest\nexport function request(input: ImageRequest | ImageRequestInput) {\n if (input instanceof ImageRequest) return input\n return new ImageRequest({\n ...input,\n model: input.model as unknown as ImageModel,\n http: input.http === undefined ? undefined : HttpOptions.make(input.http),\n })\n}\n\nexport function generate<const Model extends object>(\n input: ImageRequestInput<Model>,\n): Effect.Effect<ImageResponse, AIError, Service>\nexport function generate(input: ImageRequest): Effect.Effect<ImageResponse, AIError, Service>\nexport function generate(input: ImageRequest | ImageRequestInput) {\n return Effect.try({\n try: () => (input instanceof ImageRequest ? input : request(input)),\n catch: (error) =>\n new AIError({\n module: \"Image\",\n method: \"generate\",\n reason: new InvalidRequestReason({ message: error instanceof Error ? error.message : String(error) }),\n }),\n }).pipe(Effect.flatMap((request) => ImageClient.generate(request as unknown as ImageRequestFor<ImageOptions>)))\n}\n\nexport const Image = {\n request,\n generate,\n} as const\n" | ||
| ], | ||
| "mappings": ";wKAaO,MAAM,UAAgB,EAAQ,QAA4B,EAAE,uBAAuB,CAAE,CAAC,CAUtF,IAAM,EAA8D,EAAM,OAC/E,EACA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAW,MAAO,EAAgB,QACxC,OAAO,EAAQ,GAAG,CAChB,SAAU,CAAC,IAAY,EAAQ,MAAM,MAAM,SAAS,EAAS,EAAS,OAAO,CAC/E,CAAC,EACF,CACH,ECZO,MAAM,CAAwD,CAE1D,GACA,SACA,MACA,KAET,WAAW,CAAC,EAAkC,CAC5C,KAAK,GAAK,EAAM,GAChB,KAAK,SAAW,EAAM,SACtB,KAAK,MAAQ,EAAM,MACnB,KAAK,KAAO,EAAM,WAGb,KAAiD,CAAC,EAAsC,CAC7F,OAAO,IAAI,EAAoB,CAC7B,GAAI,EAAQ,KAAK,EAAM,EAAE,EACzB,SAAU,EAAW,KAAK,EAAM,QAAQ,EACxC,MAAO,EAAM,MACb,KAAM,EAAM,IACd,CAAC,EAEL,CAiBO,IAAM,EAAmB,EAAO,QAAQ,CAAC,IAA+B,aAAiB,EAAY,CAC1G,SAAU,aACZ,CAAC,EAEK,EAAkB,EAAO,OAAO,CACpC,KAAM,EAAO,QAAQ,OAAO,EAC5B,KAAM,EAAO,WACb,UAAW,EAAO,MACpB,CAAC,EACK,EAAgB,EAAO,OAAO,CAClC,KAAM,EAAO,QAAQ,KAAK,EAC1B,IAAK,EAAO,MACd,CAAC,EACK,EAAmB,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,SAAS,EAC9B,GAAI,EAAO,MACb,CAAC,EACK,EAAoB,EAAO,OAAO,CACtC,KAAM,EAAO,QAAQ,UAAU,EAC/B,IAAK,EAAO,OACZ,UAAW,EAAO,MACpB,CAAC,EAEY,EAAmB,EAAO,MAAM,CAC3C,EACA,EACA,EACA,CACF,CAAC,EAAE,KAAK,EAAO,cAAc,MAAM,CAAC,EAU7B,MAAM,UAAqB,EAAO,MAAoB,eAAe,EAAE,CAC5E,MAAO,EACP,OAAQ,EAAO,OACf,OAAQ,EAAO,SAAS,EAAO,MAAM,CAAgB,CAAC,EACtD,QAAS,EAAO,SAAS,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,CAAC,EACrE,KAAM,EAAO,SAAS,CAAW,CACnC,CAAC,CAAE,CAEH,CAkBO,MAAM,UAAuB,EAAO,MAAsB,iBAAiB,EAAE,CAClF,UAAW,EAAO,OAClB,KAAM,EAAO,MAAM,CAAC,EAAO,OAAQ,EAAO,UAAU,CAAC,EACrD,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,CAAC,CAEG,MAAM,UAAsB,EAAO,MAAqB,gBAAgB,EAAE,CAC/E,OAAQ,EAAO,MAAM,CAAc,EACnC,MAAO,EAAO,SAAS,CAAK,EAC5B,iBAAkB,EAAO,SAAS,CAAgB,CACpD,CAAC,CAAE,IACG,MAAK,EAAG,CACV,OAAO,KAAK,OAAO,GAEvB", | ||
| "debugId": "B6AD38DEE4EE36B264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/api.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { Service, type Endpoint } from \"@opencode-ai/client/effect/service\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nconst methods = new Set([\"delete\", \"get\", \"head\", \"options\", \"patch\", \"post\", \"put\"])\n\ntype Operation = {\n operationId?: string\n}\n\ntype OpenApi = {\n paths?: Record<string, Record<string, Operation>>\n}\n\nexport default Runtime.handler(\n Commands.commands.api,\n Effect.fn(\"cli.api\")(function* (input) {\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n mismatch: \"ignore\",\n })\n const endpoint = server.endpoint\n const params = Option.getOrElse(input.param, () => ({}))\n const request = yield* resolveRequest(endpoint, input.request, params)\n const headers = new Headers(Service.headers(endpoint))\n for (const header of input.header) {\n const index = header.indexOf(\":\")\n if (index < 1) return yield* Effect.fail(new Error(`Invalid header, expected name:value: ${header}`))\n headers.set(header.slice(0, index).trim(), header.slice(index + 1).trim())\n }\n const body = Option.getOrUndefined(input.data)\n if (body !== undefined && !headers.has(\"content-type\")) headers.set(\"content-type\", \"application/json\")\n\n const response = yield* Effect.tryPromise(() =>\n fetch(new URL(request.path, endpoint.url), {\n method: request.method,\n headers,\n body,\n }),\n )\n const output = yield* Effect.promise(() => response.text())\n if (output) process.stdout.write(output + (output.endsWith(EOL) ? \"\" : EOL))\n }),\n)\n\nexport function resolveOperation(spec: OpenApi, operationID: string, params: Record<string, string>) {\n for (const [path, operations] of Object.entries(spec.paths ?? {})) {\n for (const [method, operation] of Object.entries(operations)) {\n if (!methods.has(method) || operation.operationId !== operationID) continue\n return { method: method.toUpperCase(), path: interpolate(path, params) }\n }\n }\n throw new Error(`Operation not found: ${operationID}`)\n}\n\nexport function rawRequest(input: readonly string[]) {\n if (input.length !== 2 || !methods.has(input[0].toLowerCase()) || !input[1].startsWith(\"/\")) return\n return { method: input[0].toUpperCase(), path: input[1] }\n}\n\nfunction resolveRequest(endpoint: Endpoint, input: readonly string[], params: Record<string, string>) {\n const raw = rawRequest(input)\n if (raw) return Effect.succeed(raw)\n if (input.length !== 1) return Effect.fail(new Error(\"Expected an operation name or an HTTP method and path\"))\n return Effect.tryPromise(async () => {\n const response = await fetch(new URL(\"/openapi.json\", endpoint.url), { headers: Service.headers(endpoint) })\n if (!response.ok) throw new Error(`Failed to load OpenAPI document: HTTP ${response.status}`)\n return resolveOperation((await response.json()) as OpenApi, input[0], params)\n })\n}\n\nfunction interpolate(path: string, params: Record<string, string>) {\n const used = new Set<string>()\n const pathname = path.replaceAll(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = params[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n used.add(name)\n return encodeURIComponent(value)\n })\n const query = new URLSearchParams(Object.entries(params).filter(([name]) => !used.has(name))).toString()\n return query ? `${pathname}?${query}` : pathname\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F29A04682ED1BC3E64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "E1E384694C2E355C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "DB6DE72E3F0F791B64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-images.ts", "../ai/src/providers/openai.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers, HttpClientRequest, HttpClientResponse } from \"effect/unstable/http\"\nimport {\n ImageModel,\n GeneratedImage,\n ImageResponse,\n type ImageInput,\n type ImageRequestFor,\n type ImageRoute,\n} from \"../image.js\"\nimport { Auth, type Definition as AuthDefinition } from \"../route/auth.js\"\nimport {\n InvalidProviderOutputReason,\n AIError,\n Usage,\n mergeHttpOptions,\n mergeJsonRecords,\n type HttpOptions,\n} from \"../schema/index.js\"\nimport { ProviderShared } from \"./shared.js\"\nimport { ImageInputs } from \"./utils/image-input.js\"\nimport { OpenAIImage } from \"./utils/openai-image.js\"\n\nconst ADAPTER = \"openai-images\"\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/images/generations\"\nexport const EDIT_PATH = \"/images/edits\"\n\nexport type OpenAIImageString<Known extends string> = Known | (string & {})\n\nexport type OpenAIImageOptions = {\n readonly mask?: ImageInput\n readonly n?: number\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly moderation?: OpenAIImageString<\"auto\" | \"low\">\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly outputCompression?: number\n} & Record<string, unknown>\n\nexport type OpenAIImageBody = Record<string, unknown> & {\n readonly model: string\n readonly prompt: string\n}\n\nconst OpenAIImageResponse = Schema.Struct({\n data: Schema.Array(\n Schema.Struct({\n b64_json: Schema.optional(Schema.String),\n url: Schema.optional(Schema.String),\n revised_prompt: Schema.optional(Schema.String),\n }),\n ),\n output_format: Schema.optional(Schema.String),\n usage: Schema.optional(\n Schema.Struct({\n input_tokens: Schema.optional(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n total_tokens: Schema.optional(Schema.Number),\n input_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n output_tokens_details: Schema.optional(Schema.Record(Schema.String, Schema.Unknown)),\n }),\n ),\n})\n\nexport interface ModelInput {\n readonly id: string\n readonly auth: AuthDefinition\n readonly baseURL?: string\n readonly headers?: Record<string, string>\n readonly http?: HttpOptions\n}\n\nconst nativeOptions = (options: OpenAIImageOptions | undefined) => {\n if (!options) return undefined\n const { mask: _, outputFormat, outputCompression, ...native } = options\n return {\n output_format: outputFormat,\n output_compression: outputCompression,\n ...native,\n }\n}\n\nconst invalidOutput = (message: string) =>\n new AIError({\n module: ADAPTER,\n method: \"generate\",\n reason: new InvalidProviderOutputReason({ message, route: ADAPTER }),\n })\n\nconst applyQuery = (url: string, query: Record<string, string> | undefined) => {\n if (!query) return url\n const next = new URL(url)\n Object.entries(query).forEach(([key, value]) => next.searchParams.set(key, value))\n return next.toString()\n}\n\nexport const model = (input: ModelInput) => {\n const route: ImageRoute<OpenAIImageOptions> = {\n id: ADAPTER,\n generate: Effect.fn(\"OpenAIImages.generate\")(function* (request: ImageRequestFor<OpenAIImageOptions>, execute) {\n const mask = request.options?.mask\n if (mask !== undefined && (request.images?.length ?? 0) === 0)\n return yield* ImageInputs.invalid(ADAPTER, \"An OpenAI image mask requires at least one input image\")\n const http = mergeHttpOptions(request.model.http, request.http)\n const sourceImages = request.images ?? []\n const multipartImages = yield* Effect.forEach(sourceImages, (image) => {\n if (image.type === \"bytes\") return Effect.succeed({ data: image.data, mediaType: image.mediaType })\n if (image.type === \"url\") return ImageInputs.decodeDataUrl(image.url, ADAPTER)\n return Effect.succeed(undefined)\n })\n const multipartMask =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { data: mask.data, mediaType: mask.mediaType }\n : mask.type === \"url\"\n ? yield* ImageInputs.decodeDataUrl(mask.url, ADAPTER)\n : undefined\n const useMultipart =\n sourceImages.length > 0 &&\n multipartImages.every((image) => image !== undefined) &&\n (mask === undefined || multipartMask !== undefined)\n const path = sourceImages.length === 0 ? PATH : EDIT_PATH\n const url = applyQuery(`${(input.baseURL ?? DEFAULT_BASE_URL).replace(/\\/$/, \"\")}${path}`, http?.query)\n\n if (useMultipart) {\n const form = new FormData()\n form.append(\"model\", request.model.id)\n form.append(\"prompt\", request.prompt)\n Object.entries(mergeJsonRecords(nativeOptions(request.options), http?.body) ?? {}).forEach(([key, value]) => {\n if ([\"model\", \"prompt\", \"image\", \"image[]\", \"images\", \"mask\"].includes(key)) return\n form.append(key, typeof value === \"string\" ? value : ProviderShared.encodeJson(value))\n })\n multipartImages.forEach((image, index) => {\n if (image === undefined) return\n form.append(\"image[]\", imageBlob(image.data, image.mediaType), `image-${index}`)\n })\n if (multipartMask !== undefined)\n form.append(\"mask\", imageBlob(multipartMask.data, multipartMask.mediaType), \"mask\")\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: \"[multipart/form-data]\",\n headers: Headers.remove(Headers.fromInput({ ...input.headers, ...http?.headers }), \"content-type\"),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(HttpClientRequest.setHeaders(headers), HttpClientRequest.bodyFormData(form)),\n )\n return yield* parseResponse(response, request.options, http?.body)\n }\n\n const references = sourceImages.map((image) => {\n if (image.type === \"bytes\") return { image_url: ImageInputs.dataUrl(image) }\n if (image.type === \"url\") return { image_url: image.url }\n if (image.type === \"file-id\") return { file_id: image.id }\n return undefined\n })\n if (references.some((image) => image === undefined))\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts image URLs, data URLs, bytes, and file IDs\")\n const maskReference =\n mask === undefined\n ? undefined\n : mask.type === \"bytes\"\n ? { image_url: ImageInputs.dataUrl(mask) }\n : mask.type === \"url\"\n ? { image_url: mask.url }\n : mask.type === \"file-id\"\n ? { file_id: mask.id }\n : undefined\n if (mask !== undefined && maskReference === undefined)\n return yield* ImageInputs.invalid(ADAPTER, \"OpenAI Images accepts masks as URLs, data URLs, bytes, or file IDs\")\n const requestBody = mergeJsonRecords(\n {\n model: request.model.id,\n prompt: request.prompt,\n images: references.length === 0 ? undefined : references,\n mask: maskReference,\n },\n nativeOptions(request.options),\n http?.body,\n ) as OpenAIImageBody\n const text = ProviderShared.encodeJson(requestBody)\n const headers = yield* Auth.toEffect(input.auth)({\n request,\n method: \"POST\",\n url,\n body: text,\n headers: Headers.fromInput({ ...input.headers, ...http?.headers }),\n })\n const response = yield* execute(\n HttpClientRequest.post(url).pipe(\n HttpClientRequest.setHeaders(headers),\n HttpClientRequest.bodyText(text, \"application/json\"),\n ),\n )\n return yield* parseResponse(response, request.options, http?.body)\n }),\n }\n return ImageModel.make<OpenAIImageOptions>({ id: input.id, provider: \"openai\", route, http: input.http })\n}\n\nconst parseResponse = Effect.fn(\"OpenAIImages.parseResponse\")(function* (\n response: HttpClientResponse.HttpClientResponse,\n options: OpenAIImageOptions | undefined,\n overlay: Record<string, unknown> | undefined,\n) {\n const payload = yield* response.json.pipe(\n Effect.mapError(() => invalidOutput(\"Failed to read the OpenAI Images response\")),\n )\n const decoded = yield* Schema.decodeUnknownEffect(OpenAIImageResponse)(payload).pipe(\n Effect.mapError(() => invalidOutput(\"OpenAI Images returned an invalid response\")),\n )\n const requestBody = mergeJsonRecords(nativeOptions(options), overlay)\n const format =\n decoded.output_format ?? (typeof requestBody?.output_format === \"string\" ? requestBody.output_format : \"png\")\n const images = yield* Effect.forEach(decoded.data, (item, index) => {\n if (item.b64_json)\n return Effect.fromResult(Encoding.decodeBase64(item.b64_json)).pipe(\n Effect.mapError(() => invalidOutput(`OpenAI Images result ${index} contains invalid base64 data`)),\n Effect.map(\n (data) =>\n new GeneratedImage({\n mediaType: `image/${format}`,\n data,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n ),\n )\n if (item.url)\n return Effect.succeed(\n new GeneratedImage({\n mediaType: `image/${format}`,\n data: item.url,\n providerMetadata:\n item.revised_prompt === undefined ? undefined : { openai: { revisedPrompt: item.revised_prompt } },\n }),\n )\n return Effect.fail(invalidOutput(`OpenAI Images result ${index} has neither image data nor a URL`))\n })\n if (images.length === 0) return yield* invalidOutput(\"OpenAI Images returned no images\")\n return new ImageResponse({\n images,\n usage:\n decoded.usage === undefined\n ? undefined\n : new Usage({\n inputTokens: decoded.usage.input_tokens,\n outputTokens: decoded.usage.output_tokens,\n totalTokens: decoded.usage.total_tokens,\n providerMetadata: { openai: decoded.usage },\n }),\n providerMetadata: { openai: { outputFormat: format } },\n })\n})\n\nconst imageBlob = (data: Uint8Array, mediaType: string) => {\n const buffer = new ArrayBuffer(data.byteLength)\n new Uint8Array(buffer).set(data)\n return new Blob([buffer], { type: mediaType })\n}\n\nexport const OpenAIImages = {\n model,\n} as const\n", | ||
| "import { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { Route, RouteDefaultsInput } from \"../route/client.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { HttpOptions, ProviderID, ToolDefinition, mergeHttpOptions, type ModelID } from \"../schema/index.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport * as OpenAIResponses from \"../protocols/openai-responses.js\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options.js\"\nimport { OpenAIImages, type OpenAIImageString } from \"../protocols/openai-images.js\"\n\nexport type { OpenAIOptionsInput, OpenAIResponseIncludable } from \"./openai-options.js\"\nexport type { OpenAIImageOptions } from \"../protocols/openai-images.js\"\n\nexport const id = ProviderID.make(\"openai\")\n\nexport const routes = [OpenAIResponses.route, OpenAIChat.route]\n\n// This provider facade wraps the lower-level Responses and Chat model factories\n// with OpenAI-specific conveniences: typed options, API-key sugar, env fallback,\n// and default option normalization.\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly queryParams?: Record<string, string>\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport interface ImageGenerationOptions {\n readonly action?: OpenAIImageString<\"auto\" | \"generate\" | \"edit\">\n readonly background?: OpenAIImageString<\"auto\" | \"opaque\" | \"transparent\">\n readonly inputFidelity?: OpenAIImageString<\"low\" | \"high\">\n readonly outputCompression?: number\n readonly outputFormat?: OpenAIImageString<\"png\" | \"jpeg\" | \"webp\">\n readonly partialImages?: number\n readonly quality?: OpenAIImageString<\"auto\" | \"low\" | \"medium\" | \"high\" | \"standard\" | \"hd\">\n readonly size?: OpenAIImageString<\n \"auto\" | \"256x256\" | \"512x512\" | \"1024x1024\" | \"1536x1024\" | \"1024x1536\" | \"1792x1024\" | \"1024x1792\"\n >\n}\n\nexport const imageGeneration = (options: ImageGenerationOptions = {}) =>\n ToolDefinition.make({\n name: \"image_generation\",\n description: \"Generate or edit an image using OpenAI's hosted image generation tool.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n native: {\n openai: {\n type: \"image_generation\",\n action: options.action,\n background: options.background,\n input_fidelity: options.inputFidelity,\n output_compression: options.outputCompression,\n output_format: options.outputFormat,\n partial_images: options.partialImages,\n quality: options.quality,\n size: options.size,\n },\n },\n })\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly organization?: string\n readonly project?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => AuthOptions.bearer(options, \"OPENAI_API_KEY\")\n\nconst defaults = (input: Config) => {\n const { apiKey: _, auth: _auth, baseURL: _baseURL, queryParams: _queryParams, ...rest } = input\n return rest\n}\n\nconst configuredRoute = <Body, Prepared>(route: Route<Body, Prepared>, input: Config) =>\n route.with({\n auth: auth(input),\n endpoint: { baseURL: input.baseURL, query: input.queryParams },\n })\n\nexport const configure = (input: Config = {}) => {\n const responsesRoute = configuredRoute(OpenAIResponses.route, input)\n const chatRoute = configuredRoute(OpenAIChat.route, input)\n const modelDefaults = defaults(input)\n const responses = (id: string | ModelID) =>\n responsesRoute\n .with(withOpenAIOptions(id, modelDefaults, { textVerbosity: true }))\n .model<OpenAIProviderOptionsInput>({ id })\n const chat = (id: string | ModelID) =>\n chatRoute.with(withOpenAIOptions(id, modelDefaults)).model<OpenAIProviderOptionsInput>({ id })\n const image = (modelID: string | ModelID) =>\n OpenAIImages.model({\n id: modelID,\n auth: auth(input),\n baseURL: input.baseURL,\n headers: input.headers,\n http: mergeHttpOptions(\n input.http === undefined ? undefined : HttpOptions.make(input.http),\n input.queryParams === undefined ? undefined : new HttpOptions({ query: input.queryParams }),\n ),\n })\n\n return {\n id,\n model: responses,\n responses,\n chat,\n image,\n configure,\n }\n}\n\nexport const provider = configure()\n\nconst config = (settings: Settings): Config => {\n const headers = {\n ...(settings.organization === undefined ? {} : { \"OpenAI-Organization\": settings.organization }),\n ...(settings.project === undefined ? {} : { \"OpenAI-Project\": settings.project }),\n ...settings.headers,\n }\n return {\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: Object.keys(headers).length === 0 ? undefined : headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n }\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (modelID, settings) => {\n return configure(config(settings)).responses(modelID)\n}\n\nexport const chatModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).chat(modelID)\nexport const responses = provider.responses\nexport const chat = provider.chat\nexport const image = provider.image\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "09FDF879940EE07064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "22F6E9EBAECF065A64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/ui/timeline.tsx", "src/commands/handlers/console/login.ts"], | ||
| "sourcesContent": [ | ||
| "import { createComponent as _$createComponent } from \"@opentui/solid\";\nimport { effect as _$effect } from \"@opentui/solid\";\nimport { createTextNode as _$createTextNode } from \"@opentui/solid\";\nimport { insertNode as _$insertNode } from \"@opentui/solid\";\nimport { insert as _$insert } from \"@opentui/solid\";\nimport { setProp as _$setProp } from \"@opentui/solid\";\nimport { createElement as _$createElement } from \"@opentui/solid\";\n/** @jsxImportSource @opentui/solid */\nimport { createCliRenderer, RGBA } from \"@opentui/core\";\nimport { createScrollbackWriter, render, useKeyboard } from \"@opentui/solid\";\nimport { registerOpencodeSpinner } from \"@opencode-ai/tui/component/register-spinner\";\nimport { Show, createSignal } from \"solid-js\";\nregisterOpencodeSpinner();\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst IDLE_TIMEOUT = 1_000;\nconst COLORS = {\n accent: RGBA.fromIndex(6),\n error: RGBA.fromIndex(1),\n foreground: RGBA.defaultForeground(),\n muted: RGBA.fromIndex(8),\n success: RGBA.fromIndex(2)\n};\nconst ROWS = {\n intro: {\n marker: \"┌\",\n color: COLORS.muted,\n connector: true\n },\n item: {\n marker: \"●\",\n color: COLORS.accent,\n connector: true\n },\n success: {\n marker: \"◇\",\n color: COLORS.success,\n connector: true\n },\n failure: {\n marker: \"■\",\n color: COLORS.error,\n connector: false\n },\n outro: {\n marker: \"└\",\n color: COLORS.muted,\n connector: false\n }\n};\nfunction row(kind, value) {\n const style = ROWS[kind];\n return createScrollbackWriter(() => (() => {\n var _el$ = _$createElement(\"box\"),\n _el$2 = _$createElement(\"box\"),\n _el$3 = _$createElement(\"text\"),\n _el$4 = _$createElement(\"text\");\n _$insertNode(_el$, _el$2);\n _$setProp(_el$, \"width\", \"100%\");\n _$setProp(_el$, \"minHeight\", 1);\n _$setProp(_el$, \"flexDirection\", \"column\");\n _$insertNode(_el$2, _el$3);\n _$insertNode(_el$2, _el$4);\n _$setProp(_el$2, \"width\", \"100%\");\n _$setProp(_el$2, \"minHeight\", 1);\n _$setProp(_el$2, \"flexDirection\", \"row\");\n _$setProp(_el$2, \"gap\", 1);\n _$setProp(_el$3, \"flexShrink\", 0);\n _$insert(_el$3, () => style.marker);\n _$setProp(_el$4, \"wrapMode\", \"word\");\n _$insert(_el$4, value);\n _$insert(_el$, _$createComponent(Show, {\n get when() {\n return style.connector;\n },\n get children() {\n var _el$5 = _$createElement(\"text\");\n _$insertNode(_el$5, _$createTextNode(`│`));\n _$effect(_$p => _$setProp(_el$5, \"fg\", COLORS.muted, _$p));\n return _el$5;\n }\n }), null);\n _$effect(_p$ => {\n var _v$ = style.color,\n _v$2 = COLORS.foreground;\n _v$ !== _p$.e && (_p$.e = _$setProp(_el$3, \"fg\", _v$, _p$.e));\n _v$2 !== _p$.t && (_p$.t = _$setProp(_el$4, \"fg\", _v$2, _p$.t));\n return _p$;\n }, {\n e: undefined,\n t: undefined\n });\n return _el$;\n })(), {\n startOnNewLine: true,\n trailingNewline: !style.connector\n });\n}\nfunction TimelineFooter(props) {\n useKeyboard(event => {\n if (event.name !== \"escape\" && !(event.ctrl && event.name === \"c\")) return;\n event.preventDefault();\n props.cancel();\n });\n return (() => {\n var _el$7 = _$createElement(\"box\");\n _$setProp(_el$7, \"width\", \"100%\");\n _$setProp(_el$7, \"height\", 1);\n _$setProp(_el$7, \"flexDirection\", \"row\");\n _$setProp(_el$7, \"gap\", 1);\n _$insert(_el$7, _$createComponent(Show, {\n get when() {\n return props.pending();\n },\n children: text => [(() => {\n var _el$8 = _$createElement(\"spinner\");\n _$setProp(_el$8, \"frames\", SPINNER_FRAMES);\n _$setProp(_el$8, \"interval\", 80);\n _$effect(_$p => _$setProp(_el$8, \"color\", COLORS.accent, _$p));\n return _el$8;\n })(), (() => {\n var _el$9 = _$createElement(\"text\");\n _$setProp(_el$9, \"wrapMode\", \"none\");\n _$setProp(_el$9, \"truncate\", true);\n _$insert(_el$9, text);\n _$effect(_$p => _$setProp(_el$9, \"fg\", COLORS.foreground, _$p));\n return _el$9;\n })()]\n }));\n return _el$7;\n })();\n}\nfunction bounded(task) {\n return new Promise(resolve => {\n const timer = setTimeout(resolve, IDLE_TIMEOUT);\n timer.unref();\n const finish = () => {\n clearTimeout(timer);\n resolve();\n };\n void task.then(finish, finish);\n });\n}\nasync function shutdown(renderer) {\n await bounded(renderer.idle());\n try {\n renderer.externalOutputMode = \"passthrough\";\n } finally {\n try {\n renderer.screenMode = \"main-screen\";\n } finally {\n if (!renderer.isDestroyed) renderer.destroy();\n }\n }\n}\nexport async function createTimelineHost() {\n const stdout = process.stdout;\n const controller = new AbortController();\n const signals = [\"SIGINT\", \"SIGHUP\", \"SIGQUIT\"];\n const cancel = () => {\n if (!controller.signal.aborted) controller.abort();\n };\n signals.forEach(signal => process.on(signal, cancel));\n if (!stdout.isTTY || !process.stdin.isTTY) {\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = async (kind, text) => {\n if (closed) throw new Error(\"timeline closed\");\n if (writing) throw new Error(\"timeline write already in progress\");\n writing = true;\n try {\n const style = kind === \"pending\" ? undefined : ROWS[kind];\n const marker = kind === \"pending\" ? \".\" : ROWS[kind].marker;\n const connector = style?.connector ? \"│\\n\" : \"\";\n active = new Promise((resolve, reject) => {\n stdout.write(`${marker} ${text}\\n${connector}`, error => error ? reject(error) : resolve());\n });\n await active;\n } finally {\n writing = false;\n active = undefined;\n }\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n signals.forEach(signal => process.off(signal, cancel));\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n }\n let renderer;\n try {\n // Start on a fresh row so delayed SSH cursor reports cannot make\n // split-footer overwrite the shell command.\n process.stdout.write(\"\\n\");\n renderer = await createCliRenderer({\n stdin: process.stdin,\n useMouse: false,\n autoFocus: false,\n openConsoleOnError: false,\n exitOnCtrlC: false,\n exitSignals: [],\n screenMode: \"split-footer\",\n footerHeight: 1,\n externalOutputMode: \"capture-stdout\",\n consoleMode: \"disabled\",\n clearOnShutdown: false\n });\n const activeRenderer = renderer;\n const [pending, setPending] = createSignal();\n const renderTask = render(() => _$createComponent(TimelineFooter, {\n pending: pending,\n cancel: cancel\n }), activeRenderer);\n void renderTask.catch(cancel);\n await bounded(activeRenderer.idle());\n let closed = false;\n let writing = false;\n let active;\n let closeTask;\n const write = (kind, text) => {\n if (closed) return Promise.reject(new Error(\"timeline closed\"));\n if (writing) return Promise.reject(new Error(\"timeline write already in progress\"));\n writing = true;\n active = (async () => {\n if (kind === \"pending\") {\n setPending(text);\n activeRenderer.requestRender();\n } else {\n if (kind === \"success\" || kind === \"failure\" || kind === \"outro\") setPending(undefined);\n activeRenderer.writeToScrollback(row(kind, text));\n activeRenderer.requestRender();\n }\n await bounded(activeRenderer.idle());\n })().finally(() => {\n writing = false;\n active = undefined;\n });\n return active;\n };\n const close = () => {\n if (closeTask) return closeTask;\n closed = true;\n closeTask = (async () => {\n await active?.catch(() => {});\n try {\n await shutdown(activeRenderer);\n await bounded(renderTask);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n })();\n return closeTask;\n };\n return {\n signal: controller.signal,\n intro: text => write(\"intro\", text),\n item: text => write(\"item\", text),\n pending: text => write(\"pending\", text),\n success: text => write(\"success\", text),\n failure: text => write(\"failure\", text),\n outro: text => write(\"outro\", text),\n close\n };\n } catch (error) {\n try {\n if (renderer) await shutdown(renderer);\n } finally {\n signals.forEach(signal => process.off(signal, cancel));\n }\n throw error;\n }\n}", | ||
| "import { Cause, Effect, Exit, Option } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode, type OpenCodeClient } from \"@opencode-ai/client/promise\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { ServiceConfig } from \"../../../services/service-config\"\nimport { createTimelineHost, type TimelineHost } from \"../../../ui/timeline\"\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": "77DCBA00A2BE659F64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/file-diff.ts", "../schema/src/session-revert.ts", "../schema/src/session-fork.ts", "../schema/src/instruction.ts", "../schema/src/session-inbox.ts", "../schema/src/session-event.ts"], | ||
| "sourcesContent": [ | ||
| "export * as FileDiff from \"./file-diff.js\"\n\nimport { Schema } from \"effect\"\nimport { NonNegativeInt, optional } from \"./schema.js\"\n\nexport const Info = Schema.Struct({\n file: Schema.String,\n patch: Schema.String,\n additions: NonNegativeInt,\n deletions: NonNegativeInt,\n status: Schema.Literals([\"added\", \"deleted\", \"modified\"]),\n}).annotate({ identifier: \"FileDiff.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\n/** V1 snapshot and persisted session diff shape. */\nexport const LegacyInfo = Schema.Struct({\n file: Schema.String.pipe(optional),\n patch: Schema.String.pipe(optional),\n additions: Schema.Finite,\n deletions: Schema.Finite,\n status: Schema.Literals([\"added\", \"deleted\", \"modified\"]).pipe(optional),\n}).annotate({ identifier: \"FileDiff.LegacyInfo\" })\nexport interface LegacyInfo extends Schema.Schema.Type<typeof LegacyInfo> {}\n", | ||
| "import { Schema, SchemaTransformation } from \"effect\"\nimport { FileDiff } from \"./file-diff.js\"\nimport { optional } from \"./schema.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Snapshot } from \"./snapshot.js\"\n\nexport interface Revert extends Schema.Schema.Type<typeof Revert> {}\nexport const Revert = Schema.Struct({\n messageID: SessionMessage.ID,\n /** Legacy V1 compatibility state. */\n partID: Schema.String.pipe(optional),\n snapshot: Snapshot.ID.pipe(optional),\n files: Schema.Array(FileDiff.Info).pipe(optional),\n}).annotate({ identifier: \"Session.Revert\" })\n\nconst FileDiffV1 = Schema.Struct({\n path: Schema.String,\n status: Schema.Literals([\"added\", \"modified\", \"deleted\"]),\n additions: Schema.Finite,\n deletions: Schema.Finite,\n patch: Schema.String,\n})\n\nexport interface RevertV1 extends Schema.Schema.Type<typeof RevertV1> {}\nexport const RevertV1 = Schema.Struct({\n messageID: SessionMessage.ID,\n partID: Schema.String.pipe(optional),\n snapshot: Schema.String.pipe(optional),\n diff: Schema.String.pipe(optional),\n files: Schema.Array(FileDiffV1).pipe(optional),\n}).annotate({ identifier: \"Session.RevertV1\" })\n\nconst PersistedCurrent = Revert.pipe(\n Schema.decodeTo(\n Schema.Struct({ source: Schema.tag(\"current\"), revert: Schema.toType(Revert) }),\n SchemaTransformation.transform({\n decode: (revert): { readonly source: \"current\"; readonly revert: Revert } => ({\n source: \"current\",\n revert,\n }),\n encode: (value) => value.revert,\n }),\n ),\n)\nconst PersistedLegacy = RevertV1.pipe(\n Schema.decodeTo(\n Schema.Struct({ source: Schema.tag(\"legacy\"), revert: Schema.toType(RevertV1) }),\n SchemaTransformation.transform({\n decode: (revert): { readonly source: \"legacy\"; readonly revert: RevertV1 } => ({\n source: \"legacy\",\n revert,\n }),\n encode: (value) => value.revert,\n }),\n ),\n)\n\n/** Storage decoder for revert state written before FileDiff became canonical. */\nexport const PersistedRevert = Schema.Union([PersistedCurrent, PersistedLegacy]).pipe(\n Schema.toTaggedUnion(\"source\"),\n Schema.decodeTo(\n Schema.toType(Revert),\n SchemaTransformation.transform({\n decode: (persisted): Revert => {\n if (persisted.source === \"current\") return persisted.revert\n return Revert.make({\n messageID: persisted.revert.messageID,\n partID: persisted.revert.partID,\n snapshot: persisted.revert.snapshot ? Snapshot.ID.make(persisted.revert.snapshot) : undefined,\n files: persisted.revert.files?.map((file) => ({\n file: file.path,\n status: file.status,\n additions: file.additions,\n deletions: file.deletions,\n patch: file.patch,\n })),\n })\n },\n encode: (revert): { readonly source: \"current\"; readonly revert: Revert } => ({\n source: \"current\",\n revert,\n }),\n }),\n ),\n Schema.annotate({ identifier: \"Session.Revert.Persisted\" }),\n)\n", | ||
| "export * as SessionFork from \"./session-fork.js\"\n\nimport { Schema } from \"effect\"\nimport { SessionMessage } from \"./session-message.js\"\n\nexport const Boundary = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"before\"), messageID: SessionMessage.ID }),\n Schema.Struct({ type: Schema.Literal(\"through\"), messageID: SessionMessage.ID }),\n]).annotate({ identifier: \"Session.ForkBoundary\" })\nexport type Boundary = typeof Boundary.Type\n\nexport const RequestBoundary = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"before\"), messageID: SessionMessage.ID }),\n Schema.Struct({ type: Schema.Literal(\"through\") }),\n]).annotate({ identifier: \"Session.ForkRequestBoundary\" })\nexport type RequestBoundary = typeof RequestBoundary.Type\n", | ||
| "export * as Instruction from \"./instruction.js\"\n\nimport { Schema } from \"effect\"\n\nexport const Key = Schema.String.check(Schema.isPattern(/^[a-z0-9][a-z0-9._-]*\\/[a-z0-9][a-z0-9._/-]*$/)).pipe(\n Schema.brand(\"Instruction.Key\"),\n)\nexport type Key = typeof Key.Type\n\nexport const Hash = Schema.String.check(Schema.isPattern(/^[a-f0-9]{64}$/)).pipe(Schema.brand(\"Instruction.Hash\"))\nexport type Hash = typeof Hash.Type\n\nexport const Values = Schema.Record(Key, Hash)\nexport type Values = Readonly<Record<string, Hash>>\n\nexport const Removed = Schema.Literal(\"removed\")\nexport type Removed = typeof Removed.Type\nexport const removed = Removed.make(\"removed\")\n\nexport const Delta = Schema.Record(Schema.String, Schema.Union([Hash, Removed]))\nexport type Delta = typeof Delta.Type\n", | ||
| "export * as SessionInbox from \"./session-inbox.js\"\n\nimport { Schema } from \"effect\"\nimport { Location } from \"./location.js\"\nimport { Project } from \"./project.js\"\nimport { Prompt } from \"./prompt.js\"\nimport { DateTimeUtcFromMillis, optional, RelativePath } from \"./schema.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { SessionMessage } from \"./session-message.js\"\n\nexport const Delivery = Schema.Literals([\"steer\", \"queue\"]).annotate({ identifier: \"Session.Inbox.Delivery\" })\nexport type Delivery = typeof Delivery.Type\n\nexport interface UserPayload extends Schema.Schema.Type<typeof UserPayload> {}\nexport const UserPayload = Schema.Struct({\n ...Prompt.fields,\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n}).annotate({ identifier: \"Session.Inbox.UserPayload\" })\n\nexport interface SyntheticPayload extends Schema.Schema.Type<typeof SyntheticPayload> {}\nexport const SyntheticPayload = Schema.Struct({\n text: Schema.String,\n description: Schema.String.pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n}).annotate({ identifier: \"Session.Inbox.SyntheticPayload\" })\n\nexport interface CompactionPayload extends Schema.Schema.Type<typeof CompactionPayload> {}\nexport const CompactionPayload = Schema.Struct({}).annotate({ identifier: \"Session.Inbox.CompactionPayload\" })\n\nexport interface MovePayload extends Schema.Schema.Type<typeof MovePayload> {}\nexport const MovePayload = Schema.Struct({\n location: Location.Ref,\n projectID: Project.ID,\n subpath: RelativePath.pipe(optional),\n}).annotate({ identifier: \"Session.Inbox.MovePayload\" })\n\nconst UserItem = Schema.Struct({ type: Schema.tag(\"user\"), payload: UserPayload, delivery: Delivery })\nconst SyntheticItem = Schema.Struct({ type: Schema.tag(\"synthetic\"), payload: SyntheticPayload, delivery: Delivery })\nconst CompactionItem = Schema.Struct({\n type: Schema.tag(\"compaction\"),\n payload: CompactionPayload,\n delivery: Delivery,\n})\nconst MoveItem = Schema.Struct({ type: Schema.tag(\"move\"), payload: MovePayload, delivery: Delivery })\n\nexport const Item = Schema.Union([UserItem, SyntheticItem, CompactionItem, MoveItem]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Session.Inbox.Item\" }),\n)\nexport type Item = typeof Item.Type\n\nconst Enqueued = {\n id: SessionMessage.ID,\n sessionID: SessionID,\n timeCreated: DateTimeUtcFromMillis,\n}\n\nexport interface User extends Schema.Schema.Type<typeof User> {}\nexport const User = Schema.Struct({ ...Enqueued, ...UserItem.fields }).annotate({ identifier: \"Session.Inbox.User\" })\n\nexport interface Synthetic extends Schema.Schema.Type<typeof Synthetic> {}\nexport const Synthetic = Schema.Struct({ ...Enqueued, ...SyntheticItem.fields }).annotate({\n identifier: \"Session.Inbox.Synthetic\",\n})\n\nexport interface Compaction extends Schema.Schema.Type<typeof Compaction> {}\nexport const Compaction = Schema.Struct({ ...Enqueued, ...CompactionItem.fields }).annotate({\n identifier: \"Session.Inbox.Compaction\",\n})\n\nexport interface Move extends Schema.Schema.Type<typeof Move> {}\nexport const Move = Schema.Struct({ ...Enqueued, ...MoveItem.fields }).annotate({ identifier: \"Session.Inbox.Move\" })\n\nexport const Info = Schema.Union([User, Synthetic, Compaction, Move]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Session.Inbox.Info\" }),\n)\nexport type Info = typeof Info.Type\n", | ||
| "export * as SessionEvent from \"./session-event.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { Event } from \"./event.js\"\nimport { FinishReason } from \"./llm.js\"\nimport { Content } from \"./tool.js\"\nimport { Model } from \"./model.js\"\nimport { NonNegativeInt, PositiveInt, RelativePath } from \"./schema.js\"\nimport { FileAttachment } from \"./prompt.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { Location } from \"./location.js\"\nimport { SessionMessage } from \"./session-message.js\"\nimport { Revert } from \"./session-revert.js\"\nimport { Shell as ShellSchema } from \"./shell.js\"\nimport { SessionError } from \"./session-error.js\"\nimport { Instruction } from \"./instruction.js\"\nimport { Agent } from \"./agent.js\"\nimport { Skill as SkillSchema } from \"./skill.js\"\nimport { Money } from \"./money.js\"\nimport { Snapshot } from \"./snapshot.js\"\nimport { TokenUsage } from \"./token-usage.js\"\nimport { SessionInbox } from \"./session-inbox.js\"\nimport { Project } from \"./project.js\"\nimport { SessionFork } from \"./session-fork.js\"\n\nexport { FileAttachment }\n\nexport const Source = Schema.Struct({\n start: NonNegativeInt,\n end: NonNegativeInt,\n text: Schema.String,\n}).annotate({\n identifier: \"Session.Event.Source\",\n})\nexport interface Source extends Schema.Schema.Type<typeof Source> {}\n\nconst Base = {\n sessionID: SessionID,\n}\n\nconst options = {\n durable: {\n aggregate: \"sessionID\",\n version: 1,\n },\n} as const\nexport const Created = Event.durable({\n type: \"session.created\",\n ...options,\n schema: {\n ...Base,\n projectID: Project.ID,\n location: Location.Ref,\n subpath: RelativePath.pipe(optional),\n parentID: SessionID.pipe(optional),\n slug: Schema.String,\n title: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n version: Schema.String,\n },\n})\nexport type Created = typeof Created.Type\n\nexport const AgentSelected = Event.durable({\n type: \"session.agent.selected\",\n ...options,\n schema: {\n ...Base,\n agent: Agent.ID,\n previous: Agent.ID.pipe(optional),\n },\n})\nexport type AgentSelected = typeof AgentSelected.Type\n\nexport const ModelSelected = Event.durable({\n type: \"session.model.selected\",\n ...options,\n schema: {\n ...Base,\n model: Model.Ref,\n previous: Model.Ref.pipe(optional),\n },\n})\nexport type ModelSelected = typeof ModelSelected.Type\n\nexport const Moved = Event.durable({\n type: \"session.moved\",\n ...options,\n schema: {\n ...Base,\n ...SessionInbox.MovePayload.fields,\n },\n})\nexport type Moved = typeof Moved.Type\n\nexport const Renamed = Event.durable({\n type: \"session.renamed\",\n ...options,\n schema: {\n ...Base,\n title: Schema.String,\n },\n})\nexport type Renamed = typeof Renamed.Type\n\nexport const UsageRecorded = Event.durable({\n type: \"session.usage.recorded\",\n ...options,\n schema: {\n ...Base,\n source: Schema.Literals([\"title\", \"compaction\"]),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n },\n})\nexport type UsageRecorded = typeof UsageRecorded.Type\n\nexport const UsageUpdated = Event.ephemeral({\n type: \"session.usage.updated\",\n schema: {\n ...Base,\n cost: Money.USD,\n tokens: TokenUsage.Info,\n },\n})\nexport type UsageUpdated = typeof UsageUpdated.Type\n\nexport const Deleted = Event.durable({\n type: \"session.deleted\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: Base,\n})\nexport type Deleted = typeof Deleted.Type\n\nexport const Forked = Event.durable({\n type: \"session.forked\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...Base,\n parentID: SessionID,\n boundary: SessionFork.Boundary,\n instructions: Instruction.Values.pipe(optional),\n },\n})\nexport type Forked = typeof Forked.Type\n\nconst InboxRef = {\n ...Base,\n inboxID: SessionMessage.ID,\n}\n\nexport const InboxDelivered = Event.durable({\n type: \"session.inbox.delivered\",\n ...options,\n schema: InboxRef,\n})\nexport type InboxDelivered = typeof InboxDelivered.Type\n\nexport const InboxEnqueued = Event.durable({\n type: \"session.inbox.enqueued\",\n ...options,\n schema: {\n ...InboxRef,\n item: SessionInbox.Item,\n },\n})\nexport type InboxEnqueued = typeof InboxEnqueued.Type\n\nexport const InboxCancelled = Event.durable({\n type: \"session.inbox.cancelled\",\n ...options,\n schema: InboxRef,\n})\nexport type InboxCancelled = typeof InboxCancelled.Type\n\nexport const InboxDeliveryChanged = Event.durable({\n type: \"session.inbox.delivery.changed\",\n ...options,\n schema: { ...InboxRef, delivery: SessionInbox.Delivery },\n})\nexport type InboxDeliveryChanged = typeof InboxDeliveryChanged.Type\n\nexport namespace Execution {\n export const Started = Event.durable({ type: \"session.execution.started\", ...options, schema: Base })\n export type Started = typeof Started.Type\n\n export const Succeeded = Event.durable({ type: \"session.execution.succeeded\", ...options, schema: Base })\n export type Succeeded = typeof Succeeded.Type\n\n export const Failed = Event.durable({\n type: \"session.execution.failed\",\n ...options,\n schema: { ...Base, error: SessionError.Error },\n })\n export type Failed = typeof Failed.Type\n\n export const Interrupted = Event.durable({\n type: \"session.execution.interrupted\",\n ...options,\n schema: { ...Base, reason: Schema.Literals([\"user\", \"shutdown\", \"superseded\"]) },\n })\n export type Interrupted = typeof Interrupted.Type\n}\n\nexport const InstructionsUpdated = Event.durable({\n type: \"session.instructions.updated\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...Base,\n delta: Instruction.Delta,\n /**\n * The rendered chronological update shown to the model, frozen at emit time.\n * Absent for the initial baseline observation and for deltas that render empty.\n */\n text: Schema.String.pipe(optional),\n },\n})\nexport type InstructionsUpdated = typeof InstructionsUpdated.Type\n\nexport const Synthetic = Event.durable({\n type: \"session.synthetic\",\n ...options,\n schema: {\n ...Base,\n text: Schema.String,\n description: Schema.String.pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n },\n})\nexport type Synthetic = typeof Synthetic.Type\n\nexport namespace Skill {\n export const Activated = Event.durable({\n type: \"session.skill.activated\",\n ...options,\n schema: {\n ...Base,\n id: SkillSchema.ID,\n name: SkillSchema.Name,\n text: Schema.String,\n },\n })\n export type Activated = typeof Activated.Type\n}\n\nexport namespace Shell {\n export const Started = Event.durable({\n type: \"session.shell.started\",\n ...options,\n schema: {\n ...Base,\n shell: ShellSchema.Info,\n },\n })\n export type Started = typeof Started.Type\n\n export const Ended = Event.durable({\n type: \"session.shell.ended\",\n ...options,\n schema: {\n ...Base,\n shell: ShellSchema.Info,\n output: ShellSchema.Output,\n },\n })\n export type Ended = typeof Ended.Type\n}\n\nexport namespace Step {\n export const Started = Event.durable({\n type: \"session.step.started\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n agent: Agent.ID,\n model: Model.Ref,\n snapshot: Snapshot.ID.pipe(optional),\n },\n })\n export type Started = typeof Started.Type\n\n export const Ended = Event.durable({\n type: \"session.step.ended\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n finish: FinishReason,\n rawFinish: Schema.String.pipe(optional),\n providerState: SessionMessage.ProviderState.pipe(optional),\n cost: Money.USD,\n tokens: TokenUsage.Info,\n snapshot: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n },\n })\n export type Ended = typeof Ended.Type\n\n export const Failed = Event.durable({\n type: \"session.step.failed\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n error: SessionError.Error,\n finish: Schema.Literals([\"content-filter\"]).pipe(optional),\n rawFinish: Schema.String.pipe(optional),\n providerState: SessionMessage.ProviderState.pipe(optional),\n cost: Money.USD.pipe(optional),\n tokens: TokenUsage.Info.pipe(optional),\n snapshot: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n },\n })\n export type Failed = typeof Failed.Type\n}\n\nexport namespace Text {\n export const Started = Event.durable({\n type: \"session.text.started\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n },\n })\n export type Started = typeof Started.Type\n\n // Stream fragments are live-only; Text.Ended is the replayable full-value boundary.\n export const Delta = Event.ephemeral({\n type: \"session.text.delta\",\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n delta: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.text.ended\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n text: Schema.String,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Ended = typeof Ended.Type\n}\n\nexport namespace Reasoning {\n export const Started = Event.durable({\n type: \"session.reasoning.started\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Started = typeof Started.Type\n\n // Stream fragments are live-only; Reasoning.Ended is the replayable full-value boundary.\n export const Delta = Event.ephemeral({\n type: \"session.reasoning.delta\",\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n delta: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.reasoning.ended\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n ordinal: NonNegativeInt,\n text: Schema.String,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Ended = typeof Ended.Type\n}\n\nexport namespace Tool {\n const ToolBase = {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n id: Schema.String,\n }\n\n export namespace Input {\n export const Started = Event.durable({\n type: \"session.tool.input.started\",\n ...options,\n schema: {\n ...ToolBase,\n name: Schema.String,\n },\n })\n export type Started = typeof Started.Type\n\n // Stream fragments are live-only; Input.Ended is the replayable raw-input boundary.\n export const Delta = Event.ephemeral({\n type: \"session.tool.input.delta\",\n schema: {\n ...ToolBase,\n delta: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.tool.input.ended\",\n ...options,\n schema: {\n ...ToolBase,\n text: Schema.String,\n },\n })\n export type Ended = typeof Ended.Type\n }\n\n export const Called = Event.durable({\n type: \"session.tool.called\",\n ...options,\n schema: {\n ...ToolBase,\n input: Schema.Record(Schema.String, Schema.Unknown),\n executed: Schema.Boolean,\n state: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Called = typeof Called.Type\n\n /** Live replacement metadata for a running tool. */\n export const Progress = Event.ephemeral({\n type: \"session.tool.progress\",\n schema: {\n ...ToolBase,\n metadata: Schema.Record(Schema.String, Schema.Json),\n },\n })\n export type Progress = typeof Progress.Type\n\n /** Canonical terminal success: one non-empty model representation plus optional UI metadata. */\n export const Success = Event.durable({\n type: \"session.tool.success\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...ToolBase,\n content: Schema.NonEmptyArray(Content),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n executed: Schema.Boolean,\n resultState: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Success = typeof Success.Type\n\n /**\n * Canonical terminal failure: one error plus the final bounded snapshot of\n * partial progress. The event is self-contained; projection never reaches\n * into ephemeral progress history.\n */\n export const Failed = Event.durable({\n type: \"session.tool.failed\",\n durable: {\n aggregate: \"sessionID\",\n version: 2,\n },\n schema: {\n ...ToolBase,\n error: SessionError.Error,\n content: Schema.NonEmptyArray(Content).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n executed: Schema.Boolean,\n resultState: SessionMessage.ProviderState.pipe(optional),\n },\n })\n export type Failed = typeof Failed.Type\n}\n\nexport const RetryScheduled = Event.durable({\n type: \"session.retry.scheduled\",\n ...options,\n schema: {\n ...Base,\n assistantMessageID: SessionMessage.ID,\n attempt: PositiveInt,\n at: NonNegativeInt,\n error: SessionError.Error,\n },\n})\nexport type RetryScheduled = typeof RetryScheduled.Type\n\nexport namespace Compaction {\n export const Started = Event.durable({\n type: \"session.compaction.started\",\n ...options,\n schema: {\n ...Base,\n reason: Schema.Literals([\"auto\", \"manual\"]),\n recent: Schema.String,\n inputID: SessionMessage.ID.pipe(optional),\n },\n })\n export type Started = typeof Started.Type\n\n export const Delta = Event.ephemeral({\n type: \"session.compaction.delta\",\n schema: {\n ...Base,\n text: Schema.String,\n },\n })\n export type Delta = typeof Delta.Type\n\n export const Ended = Event.durable({\n type: \"session.compaction.ended\",\n ...options,\n schema: {\n ...Base,\n reason: Started.data.fields.reason,\n text: Schema.String,\n recent: Schema.String,\n },\n })\n export type Ended = typeof Ended.Type\n\n export const Failed = Event.durable({\n type: \"session.compaction.failed\",\n ...options,\n schema: {\n ...Base,\n reason: Started.data.fields.reason,\n error: SessionError.Error,\n inputID: SessionMessage.ID.pipe(optional),\n },\n })\n export type Failed = typeof Failed.Type\n}\n\nexport namespace RevertEvent {\n export const Staged = Event.durable({\n type: \"session.revert.staged\",\n ...options,\n schema: { ...Base, revert: Revert },\n })\n export const Cleared = Event.durable({ type: \"session.revert.cleared\", ...options, schema: Base })\n export const Committed = Event.durable({\n type: \"session.revert.committed\",\n ...options,\n schema: { ...Base, to: SessionMessage.ID },\n })\n}\n\nexport const Definitions = Event.inventory(\n Created,\n AgentSelected,\n ModelSelected,\n Moved,\n Renamed,\n UsageUpdated,\n Deleted,\n Forked,\n InboxDelivered,\n InboxEnqueued,\n InboxCancelled,\n InboxDeliveryChanged,\n Execution.Started,\n Execution.Succeeded,\n Execution.Failed,\n Execution.Interrupted,\n InstructionsUpdated,\n Synthetic,\n Skill.Activated,\n Shell.Started,\n Shell.Ended,\n Step.Started,\n Step.Ended,\n Step.Failed,\n Text.Started,\n Text.Delta,\n Text.Ended,\n Reasoning.Started,\n Reasoning.Delta,\n Reasoning.Ended,\n Tool.Input.Started,\n Tool.Input.Delta,\n Tool.Input.Ended,\n Tool.Called,\n Tool.Progress,\n Tool.Success,\n Tool.Failed,\n RetryScheduled,\n Compaction.Started,\n Compaction.Delta,\n Compaction.Ended,\n Compaction.Failed,\n RevertEvent.Staged,\n RevertEvent.Cleared,\n RevertEvent.Committed,\n)\n\n// UsageRecorded is durable but internal: excluded from Definitions so it never reaches the public manifest.\nexport const DurableDefinitions = Event.inventory(\n ...Definitions.filter((definition) => definition.durability === \"durable\"),\n UsageRecorded,\n)\nexport const EphemeralDefinitions = Event.inventory(\n ...Definitions.filter((definition) => definition.durability === \"ephemeral\"),\n)\n\nexport const Durable = Schema.Union(DurableDefinitions, { mode: \"oneOf\" })\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Session.Event.Durable\" })\nexport type DurableEvent = typeof Durable.Type\n\nexport const All = Schema.Union([Durable, ...EphemeralDefinitions], { mode: \"oneOf\" }).pipe(\n Schema.toTaggedUnion(\"type\"),\n)\nexport type Event = typeof All.Type\nexport type Type = Event[\"type\"]\n" | ||
| ], | ||
| "mappings": ";8jBAKO,IAAM,GAAO,EAAO,OAAO,CAChC,KAAM,EAAO,OACb,MAAO,EAAO,OACd,UAAW,EACX,UAAW,EACX,OAAQ,EAAO,SAAS,CAAC,QAAS,UAAW,UAAU,CAAC,CAC1D,CAAC,EAAE,SAAS,CAAE,WAAY,eAAgB,CAAC,EAI9B,GAAa,EAAO,OAAO,CACtC,KAAM,EAAO,OAAO,KAAK,CAAQ,EACjC,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,UAAW,EAAO,OAClB,UAAW,EAAO,OAClB,OAAQ,EAAO,SAAS,CAAC,QAAS,UAAW,UAAU,CAAC,EAAE,KAAK,CAAQ,CACzE,CAAC,EAAE,SAAS,CAAE,WAAY,qBAAsB,CAAC,ECd1C,IAAM,EAAS,EAAO,OAAO,CAClC,UAAW,EAAe,GAE1B,OAAQ,EAAO,OAAO,KAAK,CAAQ,EACnC,SAAU,EAAS,GAAG,KAAK,CAAQ,EACnC,MAAO,EAAO,MAAM,EAAS,IAAI,EAAE,KAAK,CAAQ,CAClD,CAAC,EAAE,SAAS,CAAE,WAAY,gBAAiB,CAAC,EAEtC,GAAa,EAAO,OAAO,CAC/B,KAAM,EAAO,OACb,OAAQ,EAAO,SAAS,CAAC,QAAS,WAAY,SAAS,CAAC,EACxD,UAAW,EAAO,OAClB,UAAW,EAAO,OAClB,MAAO,EAAO,MAChB,CAAC,EAGY,GAAW,EAAO,OAAO,CACpC,UAAW,EAAe,GAC1B,OAAQ,EAAO,OAAO,KAAK,CAAQ,EACnC,SAAU,EAAO,OAAO,KAAK,CAAQ,EACrC,KAAM,EAAO,OAAO,KAAK,CAAQ,EACjC,MAAO,EAAO,MAAM,EAAU,EAAE,KAAK,CAAQ,CAC/C,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAExC,GAAmB,EAAO,KAC9B,EAAO,SACL,EAAO,OAAO,CAAE,OAAQ,EAAO,IAAI,SAAS,EAAG,OAAQ,EAAO,OAAO,CAAM,CAAE,CAAC,EAC9E,EAAqB,UAAU,CAC7B,OAAQ,CAAC,KAAqE,CAC5E,OAAQ,UACR,QACF,GACA,OAAQ,CAAC,IAAU,EAAM,MAC3B,CAAC,CACH,CACF,EACM,GAAkB,GAAS,KAC/B,EAAO,SACL,EAAO,OAAO,CAAE,OAAQ,EAAO,IAAI,QAAQ,EAAG,OAAQ,EAAO,OAAO,EAAQ,CAAE,CAAC,EAC/E,EAAqB,UAAU,CAC7B,OAAQ,CAAC,KAAsE,CAC7E,OAAQ,SACR,QACF,GACA,OAAQ,CAAC,IAAU,EAAM,MAC3B,CAAC,CACH,CACF,EAGa,GAAkB,EAAO,MAAM,CAAC,GAAkB,EAAe,CAAC,EAAE,KAC/E,EAAO,cAAc,QAAQ,EAC7B,EAAO,SACL,EAAO,OAAO,CAAM,EACpB,EAAqB,UAAU,CAC7B,OAAQ,CAAC,IAAsB,CAC7B,GAAI,EAAU,SAAW,UAAW,OAAO,EAAU,OACrD,OAAO,EAAO,KAAK,CACjB,UAAW,EAAU,OAAO,UAC5B,OAAQ,EAAU,OAAO,OACzB,SAAU,EAAU,OAAO,SAAW,EAAS,GAAG,KAAK,EAAU,OAAO,QAAQ,EAAI,OACpF,MAAO,EAAU,OAAO,OAAO,IAAI,CAAC,KAAU,CAC5C,KAAM,EAAK,KACX,OAAQ,EAAK,OACb,UAAW,EAAK,UAChB,UAAW,EAAK,UAChB,MAAO,EAAK,KACd,EAAE,CACJ,CAAC,GAEH,OAAQ,CAAC,KAAqE,CAC5E,OAAQ,UACR,QACF,EACF,CAAC,CACH,EACA,EAAO,SAAS,CAAE,WAAY,0BAA2B,CAAC,CAC5D,2EChFO,IAAM,GAAW,EAAO,MAAM,CACnC,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,QAAQ,EAAG,UAAW,EAAe,EAAG,CAAC,EAC9E,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,SAAS,EAAG,UAAW,EAAe,EAAG,CAAC,CACjF,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC,EAGrC,GAAkB,EAAO,MAAM,CAC1C,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,QAAQ,EAAG,UAAW,EAAe,EAAG,CAAC,EAC9E,EAAO,OAAO,CAAE,KAAM,EAAO,QAAQ,SAAS,CAAE,CAAC,CACnD,CAAC,EAAE,SAAS,CAAE,WAAY,6BAA8B,CAAC,qtBCVlD,IAAM,GAAM,EAAO,OAAO,MAAM,EAAO,UAAU,+CAA+C,CAAC,EAAE,KACxG,EAAO,MAAM,iBAAiB,CAChC,EAGa,EAAO,EAAO,OAAO,MAAM,EAAO,UAAU,gBAAgB,CAAC,EAAE,KAAK,EAAO,MAAM,kBAAkB,CAAC,EAGpG,GAAS,EAAO,OAAO,GAAK,CAAI,EAGhC,EAAU,EAAO,QAAQ,SAAS,EAElC,GAAU,EAAQ,KAAK,SAAS,EAEhC,GAAQ,EAAO,OAAO,EAAO,OAAQ,EAAO,MAAM,CAAC,EAAM,CAAO,CAAC,CAAC,8NCTxE,IAAM,EAAW,EAAO,SAAS,CAAC,QAAS,OAAO,CAAC,EAAE,SAAS,CAAE,WAAY,wBAAyB,CAAC,EAIhG,GAAc,EAAO,OAAO,IACpC,GAAO,OACV,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAE,KAAK,CAAQ,CACtE,CAAC,EAAE,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAG1C,GAAmB,EAAO,OAAO,CAC5C,KAAM,EAAO,OACb,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAE,KAAK,CAAQ,CACtE,CAAC,EAAE,SAAS,CAAE,WAAY,gCAAiC,CAAC,EAG/C,GAAoB,EAAO,OAAO,CAAC,CAAC,EAAE,SAAS,CAAE,WAAY,iCAAkC,CAAC,EAGhG,GAAc,EAAO,OAAO,CACvC,SAAU,EAAS,IACnB,UAAW,EAAQ,GACnB,QAAS,EAAa,KAAK,CAAQ,CACrC,CAAC,EAAE,SAAS,CAAE,WAAY,2BAA4B,CAAC,EAEjD,GAAW,EAAO,OAAO,CAAE,KAAM,EAAO,IAAI,MAAM,EAAG,QAAS,GAAa,SAAU,CAAS,CAAC,EAC/F,GAAgB,EAAO,OAAO,CAAE,KAAM,EAAO,IAAI,WAAW,EAAG,QAAS,GAAkB,SAAU,CAAS,CAAC,EAC9G,GAAiB,EAAO,OAAO,CACnC,KAAM,EAAO,IAAI,YAAY,EAC7B,QAAS,GACT,SAAU,CACZ,CAAC,EACK,GAAW,EAAO,OAAO,CAAE,KAAM,EAAO,IAAI,MAAM,EAAG,QAAS,GAAa,SAAU,CAAS,CAAC,EAExF,GAAO,EAAO,MAAM,CAAC,GAAU,GAAe,GAAgB,EAAQ,CAAC,EAAE,KACpF,EAAO,cAAc,MAAM,EAC3B,EAAO,SAAS,CAAE,WAAY,oBAAqB,CAAC,CACtD,EAGM,EAAW,CACf,GAAI,EAAe,GACnB,UAAW,EACX,YAAa,EACf,EAGa,GAAO,EAAO,OAAO,IAAK,KAAa,GAAS,MAAO,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGvG,GAAY,EAAO,OAAO,IAAK,KAAa,GAAc,MAAO,CAAC,EAAE,SAAS,CACxF,WAAY,yBACd,CAAC,EAGY,GAAa,EAAO,OAAO,IAAK,KAAa,GAAe,MAAO,CAAC,EAAE,SAAS,CAC1F,WAAY,0BACd,CAAC,EAGY,GAAO,EAAO,OAAO,IAAK,KAAa,GAAS,MAAO,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAEvG,GAAO,EAAO,MAAM,CAAC,GAAM,GAAW,GAAY,EAAI,CAAC,EAAE,KACpE,EAAO,cAAc,MAAM,EAC3B,EAAO,SAAS,CAAE,WAAY,oBAAqB,CAAC,CACtD,EChDO,IAAM,GAAS,EAAO,OAAO,CAClC,MAAO,EACP,IAAK,EACL,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CACV,WAAY,sBACd,CAAC,EAGK,EAAO,CACX,UAAW,CACb,EAEM,EAAU,CACd,QAAS,CACP,UAAW,YACX,QAAS,CACX,CACF,EACa,GAAU,EAAM,QAAQ,CACnC,KAAM,qBACH,EACH,OAAQ,IACH,EACH,UAAW,EAAQ,GACnB,SAAU,EAAS,IACnB,QAAS,EAAa,KAAK,CAAQ,EACnC,SAAU,EAAU,KAAK,CAAQ,EACjC,KAAM,EAAO,OACb,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,MAAO,EAAM,GAAG,KAAK,CAAQ,EAC7B,MAAO,EAAM,IAAI,KAAK,CAAQ,EAC9B,QAAS,EAAO,MAClB,CACF,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,MAAO,EAAM,GACb,SAAU,EAAM,GAAG,KAAK,CAAQ,CAClC,CACF,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,MAAO,EAAM,IACb,SAAU,EAAM,IAAI,KAAK,CAAQ,CACnC,CACF,CAAC,EAGY,GAAQ,EAAM,QAAQ,CACjC,KAAM,mBACH,EACH,OAAQ,IACH,KACA,EAAa,YAAY,MAC9B,CACF,CAAC,EAGY,GAAU,EAAM,QAAQ,CACnC,KAAM,qBACH,EACH,OAAQ,IACH,EACH,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,OAAQ,EAAO,SAAS,CAAC,QAAS,YAAY,CAAC,EAC/C,KAAM,EAAM,IACZ,OAAQ,EAAW,IACrB,CACF,CAAC,EAGY,GAAe,EAAM,UAAU,CAC1C,KAAM,wBACN,OAAQ,IACH,EACH,KAAM,EAAM,IACZ,OAAQ,EAAW,IACrB,CACF,CAAC,EAGY,GAAU,EAAM,QAAQ,CACnC,KAAM,kBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,CACV,CAAC,EAGY,GAAS,EAAM,QAAQ,CAClC,KAAM,iBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,SAAU,EACV,SAAU,EAAY,SACtB,aAAc,EAAY,OAAO,KAAK,CAAQ,CAChD,CACF,CAAC,EAGK,EAAW,IACZ,EACH,QAAS,EAAe,EAC1B,EAEa,GAAiB,EAAM,QAAQ,CAC1C,KAAM,6BACH,EACH,OAAQ,CACV,CAAC,EAGY,GAAgB,EAAM,QAAQ,CACzC,KAAM,4BACH,EACH,OAAQ,IACH,EACH,KAAM,EAAa,IACrB,CACF,CAAC,EAGY,GAAiB,EAAM,QAAQ,CAC1C,KAAM,6BACH,EACH,OAAQ,CACV,CAAC,EAGY,GAAuB,EAAM,QAAQ,CAChD,KAAM,oCACH,EACH,OAAQ,IAAK,EAAU,SAAU,EAAa,QAAS,CACzD,CAAC,EAGgB,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CAAE,KAAM,+BAAgC,EAAS,OAAQ,CAAK,CAAC,EAGvF,YAAY,EAAM,QAAQ,CAAE,KAAM,iCAAkC,EAAS,OAAQ,CAAK,CAAC,EAG3F,SAAS,EAAM,QAAQ,CAClC,KAAM,8BACH,EACH,OAAQ,IAAK,EAAM,MAAO,EAAa,KAAM,CAC/C,CAAC,EAGY,cAAc,EAAM,QAAQ,CACvC,KAAM,mCACH,EACH,OAAQ,IAAK,EAAM,OAAQ,EAAO,SAAS,CAAC,OAAQ,WAAY,YAAY,CAAC,CAAE,CACjF,CAAC,IAlBc,QAsBV,IAAM,GAAsB,EAAM,QAAQ,CAC/C,KAAM,+BACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,MAAO,EAAY,MAKnB,KAAM,EAAO,OAAO,KAAK,CAAQ,CACnC,CACF,CAAC,EAGY,GAAY,EAAM,QAAQ,CACrC,KAAM,uBACH,EACH,OAAQ,IACH,EACH,KAAM,EAAO,OACb,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAAE,KAAK,CAAQ,CACtE,CACF,CAAC,EAGgB,GAAV,CAAU,KACF,aAAY,EAAM,QAAQ,CACrC,KAAM,6BACH,EACH,OAAQ,IACH,EACH,GAAI,EAAY,GAChB,KAAM,EAAY,KAClB,KAAM,EAAO,MACf,CACF,CAAC,GAVc,QAcV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,2BACH,EACH,OAAQ,IACH,EACH,MAAO,EAAY,IACrB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,yBACH,EACH,OAAQ,IACH,EACH,MAAO,EAAY,KACnB,OAAQ,EAAY,MACtB,CACF,CAAC,IAnBc,QAuBV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,0BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,MAAO,EAAM,GACb,MAAO,EAAM,IACb,SAAU,EAAS,GAAG,KAAK,CAAQ,CACrC,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,wBACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,OAAQ,GACR,UAAW,EAAO,OAAO,KAAK,CAAQ,EACtC,cAAe,EAAe,cAAc,KAAK,CAAQ,EACzD,KAAM,EAAM,IACZ,OAAQ,EAAW,KACnB,SAAU,EAAS,GAAG,KAAK,CAAQ,EACnC,MAAO,EAAO,MAAM,CAAY,EAAE,KAAK,CAAQ,CACjD,CACF,CAAC,EAGY,SAAS,EAAM,QAAQ,CAClC,KAAM,yBACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,MAAO,EAAa,MACpB,OAAQ,EAAO,SAAS,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAQ,EACzD,UAAW,EAAO,OAAO,KAAK,CAAQ,EACtC,cAAe,EAAe,cAAc,KAAK,CAAQ,EACzD,KAAM,EAAM,IAAI,KAAK,CAAQ,EAC7B,OAAQ,EAAW,KAAK,KAAK,CAAQ,EACrC,SAAU,EAAS,GAAG,KAAK,CAAQ,EACnC,MAAO,EAAO,MAAM,CAAY,EAAE,KAAK,CAAQ,CACjD,CACF,CAAC,IA9Cc,QAkDV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,0BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,CACX,CACF,CAAC,EAIY,QAAQ,EAAM,UAAU,CACnC,KAAM,qBACN,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,wBACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,KAAM,EAAO,OACb,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,IAlCc,QAsCV,IAAU,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,+BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,EAIY,QAAQ,EAAM,UAAU,CACnC,KAAM,0BACN,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,6BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,EACT,KAAM,EAAO,OACb,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,IAnCc,QAuCV,IAAU,GAAV,CAAU,IAAV,CACL,IAAM,EAAW,IACZ,EACH,mBAAoB,EAAe,GACnC,GAAI,EAAO,MACb,EAEiB,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,gCACH,EACH,OAAQ,IACH,EACH,KAAM,EAAO,MACf,CACF,CAAC,EAIY,QAAQ,EAAM,UAAU,CACnC,KAAM,2BACN,OAAQ,IACH,EACH,MAAO,EAAO,MAChB,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,8BACH,EACH,OAAQ,IACH,EACH,KAAM,EAAO,MACf,CACF,CAAC,IA5Bc,gBAgCJ,SAAS,EAAM,QAAQ,CAClC,KAAM,yBACH,EACH,OAAQ,IACH,EACH,MAAO,EAAO,OAAO,EAAO,OAAQ,EAAO,OAAO,EAClD,SAAU,EAAO,QACjB,MAAO,EAAe,cAAc,KAAK,CAAQ,CACnD,CACF,CAAC,EAIY,WAAW,EAAM,UAAU,CACtC,KAAM,wBACN,OAAQ,IACH,EACH,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,CACpD,CACF,CAAC,EAIY,UAAU,EAAM,QAAQ,CACnC,KAAM,uBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,QAAS,EAAO,cAAc,CAAO,EACrC,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAAE,KAAK,CAAQ,EACjE,SAAU,EAAO,QACjB,YAAa,EAAe,cAAc,KAAK,CAAQ,CACzD,CACF,CAAC,EAQY,SAAS,EAAM,QAAQ,CAClC,KAAM,sBACN,QAAS,CACP,UAAW,YACX,QAAS,CACX,EACA,OAAQ,IACH,EACH,MAAO,EAAa,MACpB,QAAS,EAAO,cAAc,CAAO,EAAE,KAAK,CAAQ,EACpD,SAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAAE,KAAK,CAAQ,EACjE,SAAU,EAAO,QACjB,YAAa,EAAe,cAAc,KAAK,CAAQ,CACzD,CACF,CAAC,IAjGc,QAqGV,IAAM,GAAiB,EAAM,QAAQ,CAC1C,KAAM,6BACH,EACH,OAAQ,IACH,EACH,mBAAoB,EAAe,GACnC,QAAS,GACT,GAAI,EACJ,MAAO,EAAa,KACtB,CACF,CAAC,EAGgB,GAAV,CAAU,KACF,UAAU,EAAM,QAAQ,CACnC,KAAM,gCACH,EACH,OAAQ,IACH,EACH,OAAQ,EAAO,SAAS,CAAC,OAAQ,QAAQ,CAAC,EAC1C,OAAQ,EAAO,OACf,QAAS,EAAe,GAAG,KAAK,CAAQ,CAC1C,CACF,CAAC,EAGY,QAAQ,EAAM,UAAU,CACnC,KAAM,2BACN,OAAQ,IACH,EACH,KAAM,EAAO,MACf,CACF,CAAC,EAGY,QAAQ,EAAM,QAAQ,CACjC,KAAM,8BACH,EACH,OAAQ,IACH,EACH,OAAQ,UAAQ,KAAK,OAAO,OAC5B,KAAM,EAAO,OACb,OAAQ,EAAO,MACjB,CACF,CAAC,EAGY,SAAS,EAAM,QAAQ,CAClC,KAAM,+BACH,EACH,OAAQ,IACH,EACH,OAAQ,UAAQ,KAAK,OAAO,OAC5B,MAAO,EAAa,MACpB,QAAS,EAAe,GAAG,KAAK,CAAQ,CAC1C,CACF,CAAC,IA3Cc,QA+CV,IAAU,GAAV,CAAU,KACF,SAAS,EAAM,QAAQ,CAClC,KAAM,2BACH,EACH,OAAQ,IAAK,EAAM,OAAQ,CAAO,CACpC,CAAC,EACY,UAAU,EAAM,QAAQ,CAAE,KAAM,4BAA6B,EAAS,OAAQ,CAAK,CAAC,EACpF,YAAY,EAAM,QAAQ,CACrC,KAAM,8BACH,EACH,OAAQ,IAAK,EAAM,GAAI,EAAe,EAAG,CAC3C,CAAC,IAXc,QAcV,IAAM,GAAc,EAAM,UAC/B,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EAAU,QACV,EAAU,UACV,EAAU,OACV,EAAU,YACV,GACA,GACA,EAAM,UACN,EAAM,QACN,EAAM,MACN,EAAK,QACL,EAAK,MACL,EAAK,OACL,EAAK,QACL,EAAK,MACL,EAAK,MACL,EAAU,QACV,EAAU,MACV,EAAU,MACV,EAAK,MAAM,QACX,EAAK,MAAM,MACX,EAAK,MAAM,MACX,EAAK,OACL,EAAK,SACL,EAAK,QACL,EAAK,OACL,GACA,EAAW,QACX,EAAW,MACX,EAAW,MACX,EAAW,OACX,EAAY,OACZ,EAAY,QACZ,EAAY,SACd,EAGa,GAAqB,EAAM,UACtC,GAAG,GAAY,OAAO,CAAC,IAAe,EAAW,aAAe,SAAS,EACzE,EACF,EACa,GAAuB,EAAM,UACxC,GAAG,GAAY,OAAO,CAAC,IAAe,EAAW,aAAe,WAAW,CAC7E,EAEa,GAAU,EAAO,MAAM,GAAoB,CAAE,KAAM,OAAQ,CAAC,EACtE,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,uBAAwB,CAAC,EAGtC,GAAM,EAAO,MAAM,CAAC,GAAS,GAAG,EAAoB,EAAG,CAAE,KAAM,OAAQ,CAAC,EAAE,KACrF,EAAO,cAAc,MAAM,CAC7B", | ||
| "debugId": "A9C3205298896A0264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/durable-event-manifest.ts"], | ||
| "sourcesContent": [ | ||
| "export * as DurableEventManifest from \"./durable-event-manifest.js\"\n\nimport { Event } from \"./event.js\"\nimport { Worktree } from \"./worktree.js\"\nimport { SessionEvent } from \"./session-event.js\"\n\nexport const Durable = Event.durableMap([...SessionEvent.DurableDefinitions, Worktree.Event.Resolved])\n" | ||
| ], | ||
| "mappings": ";4JAMO,IAAM,EAAU,EAAM,WAAW,CAAC,GAAG,EAAa,mBAAoB,EAAS,MAAM,QAAQ,CAAC", | ||
| "debugId": "1B7F603E489AD76C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "84CC11323E660DCD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { Gemini } from \"../protocols/gemini.js\"\nimport { ProviderShared } from \"../protocols/shared.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { ProviderID, type LLMRequest, type ModelID } from \"../schema/index.js\"\nimport { GoogleVertexShared } from \"./google-vertex-shared.js\"\n\nexport interface GeminiOptionsInput extends Gemini.OptionsInput {\n readonly labels?: Readonly<Record<string, string>>\n}\n\nexport type GeminiProviderOptionsInput = GeminiOptionsInput\n\nexport const id = ProviderID.make(\"google-vertex\")\n\nexport type Config = RouteDefaultsInput &\n GoogleVertexShared.ApiKeyOptions & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: GeminiProviderOptionsInput\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly accessToken?: string; readonly apiKey?: never }\n | { readonly accessToken?: never; readonly apiKey?: string }\n ) & {\n readonly baseURL?: string\n readonly location?: string\n readonly project?: string\n readonly providerOptions?: GeminiProviderOptionsInput\n }\n\nconst fromRequest = Effect.fn(\"GoogleVertex.fromRequest\")(function* (request: LLMRequest) {\n const body = yield* Gemini.protocol.body.from(request)\n const value = request.providerOptions?.labels\n const labels = ProviderShared.isRecord(value)\n ? Object.fromEntries(\n Object.entries(value).filter((entry): entry is [string, string] => typeof entry[1] === \"string\"),\n )\n : undefined\n return { ...body, labels }\n})\n\nconst protocol = {\n ...Gemini.protocol,\n body: {\n ...Gemini.protocol.body,\n from: fromRequest,\n },\n}\n\nconst route = Route.make({\n id: \"google-vertex-gemini\",\n provider: id,\n providerMetadataKey: \"google\",\n protocol,\n endpoint: Endpoint.path(({ request }) => {\n const model = String(request.model.id)\n return `/${model.startsWith(\"endpoints/\") ? model : `models/${model}`}:streamGenerateContent?alt=sse`\n }),\n auth: Auth.none,\n framing: Framing.sse,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: Config, modelID: string | ModelID) => {\n const {\n accessToken: _accessToken,\n apiKey: _apiKey,\n auth: _auth,\n baseURL,\n location: inputLocation,\n project: inputProject,\n ...rest\n } = input\n const apiKey = GoogleVertexShared.apiKey(input)\n const endpointModel = String(modelID).startsWith(\"endpoints/\")\n if (apiKey !== undefined && endpointModel)\n throw new Error(\"Google Vertex tuned models do not support Express Mode API keys\")\n const location = GoogleVertexShared.location(inputLocation, \"us-central1\")\n const project = GoogleVertexShared.project(inputProject)\n const endpoint =\n baseURL ??\n (apiKey\n ? \"https://aiplatform.googleapis.com/v1/publishers/google\"\n : `https://${GoogleVertexShared.host(location)}/v1beta1/projects/${GoogleVertexShared.requireProject(project)}/locations/${location}${endpointModel ? \"\" : \"/publishers/google\"}`)\n return route.with({\n ...rest,\n endpoint: { baseURL: endpoint },\n auth: apiKey === undefined ? GoogleVertexShared.oauth(input, project) : Auth.header(\"x-goog-api-key\", apiKey),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n return {\n id,\n model: (modelID: string | ModelID) =>\n configuredRoute(input, modelID).model<GeminiProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\nexport const model: ProviderPackage.Definition<Settings, GeminiProviderOptionsInput>[\"model\"] = (modelID, settings) => {\n if (settings.apiKey !== undefined && settings.accessToken !== undefined)\n throw new Error(\"Google Vertex apiKey cannot be combined with accessToken or auth\")\n return configure({\n ...(settings.apiKey === undefined ? { accessToken: settings.accessToken } : { apiKey: settings.apiKey }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n location: settings.location,\n project: settings.project,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";wPAiBO,IAAM,EAAK,EAAW,KAAK,eAAe,EAqB3C,EAAc,EAAO,GAAG,0BAA0B,EAAE,SAAU,CAAC,EAAqB,CACxF,IAAM,EAAO,MAAO,EAAO,SAAS,KAAK,KAAK,CAAO,EAC/C,EAAQ,EAAQ,iBAAiB,OACjC,EAAS,EAAe,SAAS,CAAK,EACxC,OAAO,YACL,OAAO,QAAQ,CAAK,EAAE,OAAO,CAAC,IAAqC,OAAO,EAAM,KAAO,QAAQ,CACjG,EACA,OACJ,MAAO,IAAK,EAAM,QAAO,EAC1B,EAEK,EAAW,IACZ,EAAO,SACV,KAAM,IACD,EAAO,SAAS,KACnB,KAAM,CACR,CACF,EAEM,EAAQ,EAAM,KAAK,CACvB,GAAI,uBACJ,SAAU,EACV,oBAAqB,SACrB,WACA,SAAU,EAAS,KAAK,EAAG,aAAc,CACvC,IAAM,EAAQ,OAAO,EAAQ,MAAM,EAAE,EACrC,MAAO,IAAI,EAAM,WAAW,YAAY,EAAI,EAAQ,UAAU,oCAC/D,EACD,KAAM,EAAK,KACX,QAAS,EAAQ,GACnB,CAAC,EAEY,EAAS,CAAC,CAAK,EAEtB,EAAkB,CAAC,EAAe,IAA8B,CACpE,IACE,YAAa,EACb,OAAQ,EACR,KAAM,EACN,UACA,SAAU,EACV,QAAS,KACN,GACD,EACE,EAAS,EAAmB,OAAO,CAAK,EACxC,EAAgB,OAAO,CAAO,EAAE,WAAW,YAAY,EAC7D,GAAI,IAAW,QAAa,EAC1B,MAAU,MAAM,iEAAiE,EACnF,IAAM,EAAW,EAAmB,SAAS,EAAe,aAAa,EACnE,EAAU,EAAmB,QAAQ,CAAY,EACjD,EACJ,IACC,EACG,yDACA,WAAW,EAAmB,KAAK,CAAQ,sBAAsB,EAAmB,eAAe,CAAO,eAAe,IAAW,EAAgB,GAAK,wBAC/J,OAAO,EAAM,KAAK,IACb,EACH,SAAU,CAAE,QAAS,CAAS,EAC9B,KAAM,IAAW,OAAY,EAAmB,MAAM,EAAO,CAAO,EAAI,EAAK,OAAO,iBAAkB,CAAM,CAC9G,CAAC,GAGU,EAAY,CAAC,EAAgB,CAAC,KAClC,CACL,KACA,MAAO,CAAC,IACN,EAAgB,EAAO,CAAO,EAAE,MAAkC,CAAE,GAAI,CAAQ,CAAC,EACnF,WACF,GAGW,EAAW,CACtB,KACA,WACF,EACa,EAAmF,CAAC,EAAS,IAAa,CACrH,GAAI,EAAS,SAAW,QAAa,EAAS,cAAgB,OAC5D,MAAU,MAAM,kEAAkE,EACpF,OAAO,EAAU,IACX,EAAS,SAAW,OAAY,CAAE,YAAa,EAAS,WAAY,EAAI,CAAE,OAAQ,EAAS,MAAO,EACtG,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,QAAS,EAAS,QAClB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "F625C9D39147203864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/anthropic-compatible.ts", "../ai/src/providers/anthropic.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ProviderPackage } from \"../provider-package.js\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\n\nexport type AnthropicOptionsInput = AnthropicMessages.OptionsInput\nexport type AnthropicProviderOptionsInput = AnthropicMessages.ProviderOptionsInput\nexport type AnthropicThinkingInput = AnthropicMessages.ThinkingInput\n\nexport const id = ProviderID.make(\"anthropic-compatible\")\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL: string\n readonly provider?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport const routes = [AnthropicMessages.route]\n\nconst auth = (input: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\").pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config) => {\n if (!input.baseURL) throw new Error(\"Anthropic-compatible providers require a baseURL\")\n const provider = input.provider ?? \"anthropic-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = AnthropicMessages.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: auth(input),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) => route.model<AnthropicMessages.ProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, AnthropicMessages.ProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic-compatible apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n provider: settings.provider,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n\nexport * as AnthropicCompatible from \"./anthropic-compatible.js\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { AnthropicMessages } from \"../protocols/anthropic-messages.js\"\nimport { AnthropicCompatible } from \"./anthropic-compatible.js\"\n\nexport type AnthropicOptionsInput = AnthropicMessages.OptionsInput\nexport type AnthropicProviderOptionsInput = AnthropicMessages.ProviderOptionsInput\nexport type AnthropicThinkingInput = AnthropicMessages.ThinkingInput\n\nexport const id = ProviderID.make(\"anthropic\")\n\nexport const routes = [AnthropicMessages.route]\n\nexport type Config = RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nexport type Settings = ProviderPackage.Settings &\n (\n | { readonly apiKey?: string; readonly authToken?: never }\n | { readonly apiKey?: never; readonly authToken?: string }\n ) & {\n readonly baseURL?: string\n readonly providerOptions?: AnthropicMessages.ProviderOptionsInput\n }\n\nconst auth = (options: ProviderAuthOption<\"optional\">) => {\n if (\"auth\" in options && options.auth) return options.auth\n return Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"ANTHROPIC_API_KEY\"))\n .pipe(Auth.header(\"x-api-key\"))\n}\n\nexport const configure = (input: Config = {}) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n const compatible = AnthropicCompatible.configure({\n ...rest,\n auth: auth(input),\n baseURL: baseURL ?? AnthropicMessages.DEFAULT_BASE_URL,\n provider: id,\n })\n return {\n id,\n model: (modelID: string | ModelID) => compatible.model(modelID),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, AnthropicMessages.ProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => {\n if (settings.apiKey !== undefined && settings.authToken !== undefined)\n throw new Error(\"Anthropic apiKey cannot be combined with authToken\")\n return configure({\n ...(settings.authToken === undefined ? { apiKey: settings.apiKey } : { auth: Auth.bearer(settings.authToken) }),\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": ";8mBAWO,IAAM,EAAK,EAAW,KAAK,sBAAsB,EAmB3C,EAAS,CAAC,EAAkB,KAAK,EAExC,EAAO,CAAC,IAA0C,CACtD,GAAI,SAAU,GAAS,EAAM,KAAM,OAAO,EAAM,KAChD,OAAO,EAAK,SAAS,WAAY,EAAQ,EAAM,OAAS,OAAW,QAAQ,EAAE,KAAK,EAAK,OAAO,WAAW,CAAC,GAG/F,EAAY,CAAC,IAAkB,CAC1C,GAAI,CAAC,EAAM,QAAS,MAAU,MAAM,kDAAkD,EACtF,IAAM,EAAW,EAAM,UAAY,wBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAAQ,EAAkB,MAAM,KAAK,IACtC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAK,CAAK,CAClB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IAA8B,EAAM,MAA8C,CAAE,GAAI,CAAQ,CAAC,EACzG,WACF,GAGW,EAAW,CACtB,KACA,WACF,EAEa,EAA+F,CAC1G,EACA,IACG,CACH,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,+DAA+D,EACjF,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO,GC5DX,IAAM,EAAK,EAAW,KAAK,WAAW,EAEhC,EAAS,CAAC,EAAkB,KAAK,EAiBxC,EAAO,CAAC,IAA4C,CACxD,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAO,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,EAC5E,OAAO,EAAK,OAAO,mBAAmB,CAAC,EACvC,KAAK,EAAK,OAAO,WAAW,CAAC,GAGrB,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAQ,OAAQ,EAAG,KAAM,EAAO,aAAY,GAAS,EAC/C,EAAa,EAAoB,UAAU,IAC5C,EACH,KAAM,EAAK,CAAK,EAChB,QAAS,GAAW,EAAkB,iBACtC,SAAU,CACZ,CAAC,EACD,MAAO,CACL,KACA,MAAO,CAAC,IAA8B,EAAW,MAAM,CAAO,EAC9D,WACF,GAGW,EAAW,EAAU,EACrB,EAA+F,CAC1G,EACA,IACG,CACH,GAAI,EAAS,SAAW,QAAa,EAAS,YAAc,OAC1D,MAAU,MAAM,oDAAoD,EACtE,OAAO,EAAU,IACX,EAAS,YAAc,OAAY,CAAE,OAAQ,EAAS,MAAO,EAAI,CAAE,KAAM,EAAK,OAAO,EAAS,SAAS,CAAE,EAC7G,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO", | ||
| "debugId": "79A769C3410120FC64756E2164756E21", | ||
| "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": "1F4753E53E164B6164756E2164756E21", | ||
| "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": "AA64CFD1F276EAF364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/plugin/discovery.ts", "../tui/src/util/config-directories.ts"], | ||
| "sourcesContent": [ | ||
| "import { readdir, stat } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { isMissingPath, localProjectDirectory, projectConfigDirectories } from \"../util/config-directories\"\n\nconst extensions = new Set([\".cjs\", \".cts\", \".js\", \".jsx\", \".mjs\", \".mts\", \".ts\", \".tsx\"])\n\nexport async function tuiPluginDirectories(cwd: string, configDirectory: string) {\n const projectDirectory = await localProjectDirectory(cwd)\n const projectConfig = path.join(projectDirectory, \".opencode\")\n const directories = [configDirectory, ...projectConfigDirectories(projectDirectory, cwd)]\n const exists = await Promise.all(\n directories.map((directory) => {\n if (directory === configDirectory || directory === projectConfig) return true\n return stat(directory).then(\n (info) => info.isDirectory(),\n (error) => (isMissingPath(error) ? false : Promise.reject(error)),\n )\n }),\n )\n return directories.filter((_, index) => exists[index]).map((directory) => path.join(directory, \"plugins\", \"tui\"))\n}\n\nexport async function discoverTuiPlugins(directories: string[]) {\n return (\n await Promise.all(\n directories.map(async (directory) => {\n const entries = await readdir(directory, { withFileTypes: true }).catch((error: unknown) => {\n if (isMissingPath(error)) return []\n return Promise.reject(error)\n })\n return entries\n .filter((entry) => (entry.isFile() || entry.isSymbolicLink()) && extensions.has(path.extname(entry.name)))\n .map((entry) => path.join(directory, entry.name))\n .sort()\n }),\n )\n ).flat()\n}\n\nexport function localSource(spec: string, directory: string) {\n if (spec.startsWith(\"file://\")) return new URL(spec)\n if (spec.startsWith(\"./\") || spec.startsWith(\"../\") || path.isAbsolute(spec))\n return pathToFileURL(path.resolve(directory, spec))\n return undefined\n}\n\n// Key local plugin imports by a numeric source version so edited sources\n// re-import fresh instead of hitting the ESM cache. Bun ignores query params\n// when caching file:// URL imports, so bust with a plain path there; Node keys\n// its cache on the full URL. Fractional versions break Bun's runtime JSX/solid\n// plugin hooks, so always truncate them.\nexport function freshSpecifier(entrypoint: string, sourceVersion: number) {\n const version = Math.trunc(sourceVersion)\n if (typeof Bun !== \"undefined\") return `${fileURLToPath(entrypoint).replaceAll(\"\\\\\", \"/\")}?mtime=${version}`\n return `${entrypoint}?mtime=${version}`\n}\n", | ||
| "import path from \"node:path\"\nimport { stat } from \"node:fs/promises\"\n\nexport function configDirectories(config: string, cwd: string) {\n return [...new Set([config, ...ancestors(cwd).map((directory) => path.join(directory, \".opencode\"))])]\n}\n\nexport function projectConfigDirectories(project: string, cwd: string) {\n const directories = ancestors(cwd)\n return directories\n .slice(directories.indexOf(path.resolve(project)))\n .map((directory) => path.join(directory, \".opencode\"))\n}\n\nexport async function localProjectDirectory(cwd: string) {\n const directories = ancestors(cwd)\n const repositories = await Promise.all(\n directories.map((directory) =>\n Promise.all(\n [\".git\", \".hg\"].map((name) =>\n stat(path.join(directory, name)).then(\n () => true,\n (error) => (isMissingPath(error) ? false : Promise.reject(error)),\n ),\n ),\n ).then((matches) => matches.some(Boolean)),\n ),\n )\n return directories.findLast((_, index) => repositories[index]) ?? path.resolve(cwd)\n}\n\nexport function isMissingPath(error: unknown) {\n if (!error || typeof error !== \"object\") return false\n const code = Reflect.get(error, \"code\")\n return code === \"ENOENT\" || code === \"ENOTDIR\"\n}\n\nfunction ancestors(cwd: string) {\n const directories: string[] = []\n for (let current = path.resolve(cwd); ; current = path.dirname(current)) {\n directories.push(current)\n if (path.dirname(current) === current) break\n }\n return directories.reverse()\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0E927AF81A416EAD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "2A4BDAD01D83722964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "688F150A39C4103964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "C1F885E1DC99CD2064756E2164756E21", | ||
| "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": "6A39C4A54E5E776364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../protocol/src/client.ts"], | ||
| "sourcesContent": [ | ||
| "import { InvalidRequestError, SessionNotFoundError } from \"./errors.js\"\nimport { makeDefaultApi } from \"./api.js\"\nimport type { Api } from \"./api.js\"\nimport type { Context } from \"effect\"\nimport { HttpApiMiddleware } from \"effect/unstable/httpapi\"\nimport type { EventGroup } from \"./groups/event.js\"\n\nclass LocationMiddleware extends HttpApiMiddleware.Service<LocationMiddleware>()(\n \"@opencode-ai/client/LocationMiddleware\",\n) {}\n\nclass SessionLocationMiddleware extends HttpApiMiddleware.Service<SessionLocationMiddleware>()(\n \"@opencode-ai/client/SessionLocationMiddleware\",\n { error: [InvalidRequestError, SessionNotFoundError] },\n) {}\n\ntype ClientApiShape = Api<\n Context.Service.Identifier<typeof LocationMiddleware>,\n Context.Service.Shape<typeof LocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n Context.Service.Identifier<typeof SessionLocationMiddleware>,\n Context.Service.Shape<typeof SessionLocationMiddleware>,\n typeof EventGroup\n>\n\nexport const ClientApi: ClientApiShape = makeDefaultApi({\n locationMiddleware: LocationMiddleware,\n // The real server uses a form-specific middleware with an undocumented `global` sentinel branch.\n // The generated client only needs a middleware identity for API typing.\n formLocationMiddleware: SessionLocationMiddleware,\n sessionLocationMiddleware: SessionLocationMiddleware,\n})\n\nexport const groupNames = {\n \"server.health\": \"health\",\n \"server.server\": \"server\",\n \"server.debug\": \"debug\",\n \"server.migration\": \"migration\",\n \"server.location\": \"location\",\n \"server.agent\": \"agent\",\n \"server.plugin\": \"plugin\",\n \"server.session\": \"session\",\n \"server.message\": \"message\",\n \"server.model\": \"model\",\n \"server.generate\": \"generate\",\n \"server.provider\": \"provider\",\n \"server.integration\": \"integration\",\n \"server.websearch\": \"websearch\",\n \"server.credential\": \"credential\",\n \"server.form\": \"form\",\n \"server.permission\": \"permission\",\n \"server.fs\": \"file\",\n \"server.command\": \"command\",\n \"server.skill\": \"skill\",\n \"server.event\": \"event\",\n \"server.pty\": \"pty\",\n \"server.shell\": \"shell\",\n \"server.mcp\": \"mcp\",\n \"server.reference\": \"reference\",\n \"server.project\": \"project\",\n \"server.worktree\": \"worktree\",\n \"server.vcs\": \"vcs\",\n \"server.config\": \"config\",\n} as const\n\nexport const promiseOmitEndpoints = new Set([\"pty.connect\"])\nexport const effectOmitEndpoints = new Set([\"fs.read\", \"pty.connect\"])\n" | ||
| ], | ||
| "mappings": ";giCAOA,MAAM,UAA2B,EAAkB,QAA4B,EAC7E,wCACF,CAAE,CAAC,CAEH,MAAM,UAAkC,EAAkB,QAAmC,EAC3F,gDACA,CAAE,MAAO,CAAC,EAAqB,CAAoB,CAAE,CACvD,CAAE,CAAC,CAYI,IAAM,EAA4B,EAAe,CACtD,mBAAoB,EAGpB,uBAAwB,EACxB,0BAA2B,CAC7B,CAAC,EAEY,EAAa,CACxB,gBAAiB,SACjB,gBAAiB,SACjB,eAAgB,QAChB,mBAAoB,YACpB,kBAAmB,WACnB,eAAgB,QAChB,gBAAiB,SACjB,iBAAkB,UAClB,iBAAkB,UAClB,eAAgB,QAChB,kBAAmB,WACnB,kBAAmB,WACnB,qBAAsB,cACtB,mBAAoB,YACpB,oBAAqB,aACrB,cAAe,OACf,oBAAqB,aACrB,YAAa,OACb,iBAAkB,UAClB,eAAgB,QAChB,eAAgB,QAChB,aAAc,MACd,eAAgB,QAChB,aAAc,MACd,mBAAoB,YACpB,iBAAkB,UAClB,kBAAmB,WACnB,aAAc,MACd,gBAAiB,QACnB,EAEa,EAAuB,IAAI,IAAI,CAAC,aAAa,CAAC,EAC9C,EAAsB,IAAI,IAAI,CAAC,UAAW,aAAa,CAAC", | ||
| "debugId": "967C9B19F4CEF24664756E2164756E21", | ||
| "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": "35DD72D5FFCECBFB64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/permission-saved.ts"], | ||
| "sourcesContent": [ | ||
| "export * as PermissionSaved from \"./permission-saved.js\"\n\nimport { Schema } from \"effect\"\nimport { ascending } from \"./identifier.js\"\nimport { ProjectID } from \"./project-id.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(\n Schema.brand(\"PermissionSaved.ID\"),\n statics((schema) => ({ create: () => schema.make(\"psv_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Info = Schema.Struct({\n id: ID,\n projectID: ProjectID,\n action: Schema.String,\n resource: Schema.String,\n}).annotate({ identifier: \"PermissionSaved.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": ";kRAOO,IAAM,EAAK,EAAO,OAAO,KAC9B,EAAO,MAAM,oBAAoB,EACjC,EAAQ,CAAC,KAAY,CAAE,OAAQ,IAAM,EAAO,KAAK,OAAS,EAAU,CAAC,CAAE,EAAE,CAC3E,EAGa,EAAO,EAAO,OAAO,CAChC,GAAI,EACJ,UAAW,EACX,OAAQ,EAAO,OACf,SAAU,EAAO,MACnB,CAAC,EAAE,SAAS,CAAE,WAAY,sBAAuB,CAAC", | ||
| "debugId": "04826F0EEA1B745764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/persistence.ts", "../tui/src/util/record.ts", "../tui/src/model-preference.ts"], | ||
| "sourcesContent": [ | ||
| "import path from \"path\"\nimport { appendFile, mkdir, readFile, rename, rm, writeFile } from \"fs/promises\"\n\nexport function readText(filePath: string) {\n return readFile(filePath, \"utf8\")\n}\n\nexport async function readJson<T>(filePath: string) {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T\n}\n\nexport async function writeText(filePath: string, content: string) {\n await mkdir(path.dirname(filePath), { recursive: true })\n await writeFile(filePath, content)\n}\n\nexport async function appendText(filePath: string, content: string) {\n await mkdir(path.dirname(filePath), { recursive: true })\n await appendFile(filePath, content)\n}\n\nexport async function writeJsonAtomic(filePath: string, value: unknown) {\n await mkdir(path.dirname(filePath), { recursive: true })\n const temporary = `${filePath}.${process.pid}.${crypto.randomUUID()}.tmp`\n await writeFile(temporary, JSON.stringify(value)).catch(async (error) => {\n await rm(temporary, { force: true }).catch(() => undefined)\n throw error\n })\n await rename(temporary, filePath).catch(async (error) => {\n await rm(temporary, { force: true }).catch(() => undefined)\n throw error\n })\n}\n", | ||
| "export function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value)\n}\n", | ||
| "import { readJson, writeJsonAtomic } from \"./util/persistence\"\nimport { isRecord } from \"./util/record\"\n\nexport type ModelPreferenceModel = {\n providerID: string\n modelID: string\n}\n\nexport type ModelPreference = {\n recent: ModelPreferenceModel[]\n favorite: ModelPreferenceModel[]\n variant: Record<string, string | undefined>\n}\n\nexport type ModelPreferenceDocument = Record<string, unknown> & ModelPreference\n\nfunction models(value: unknown) {\n if (!Array.isArray(value)) return []\n return value.flatMap((item): ModelPreferenceModel[] => {\n if (!isRecord(item)) return []\n if (typeof item.providerID !== \"string\" || item.providerID.length === 0) return []\n if (typeof item.modelID !== \"string\" || item.modelID.length === 0) return []\n return [{ providerID: item.providerID, modelID: item.modelID }]\n })\n}\n\nfunction variants(value: unknown) {\n if (!isRecord(value)) return {}\n return Object.fromEntries(\n Object.entries(value).flatMap(([key, item]) => {\n if (key.length === 0 || typeof item !== \"string\" || item.length === 0) return []\n const variant = normalizeModelVariant(item)\n return variant === undefined ? [] : ([[key, variant]] as const)\n }),\n )\n}\n\nexport function normalizeModelVariant(value: string | undefined) {\n return value === \"default\" ? undefined : value\n}\n\nexport function modelPreferenceKey(model: ModelPreferenceModel) {\n return `${model.providerID}/${model.modelID}`\n}\n\nexport function cycleModelVariant(current: string | undefined, variants: string[]) {\n const named = variants.filter((variant) => variant !== \"default\")\n if (named.length === 0) return undefined\n const value = normalizeModelVariant(current)\n if (value === undefined) return named[0]\n const index = named.indexOf(value)\n if (index === -1 || index === named.length - 1) return undefined\n return named[index + 1]\n}\n\nexport function decodeModelPreference(value: unknown): ModelPreferenceDocument {\n const root = isRecord(value) ? value : {}\n return {\n ...root,\n recent: models(root.recent),\n favorite: models(root.favorite),\n variant: variants(root.variant),\n }\n}\n\nfunction preference(value: ModelPreferenceDocument): ModelPreference {\n return {\n recent: value.recent,\n favorite: value.favorite,\n variant: value.variant,\n }\n}\n\nfunction patch(value: Partial<ModelPreference>) {\n return {\n ...(value.recent === undefined ? {} : { recent: models(value.recent) }),\n ...(value.favorite === undefined ? {} : { favorite: models(value.favorite) }),\n ...(value.variant === undefined ? {} : { variant: variants(value.variant) }),\n }\n}\n\nexport function createModelPreferenceRepository(filePath: string) {\n const state = {\n pending: Promise.resolve(),\n }\n const read = () =>\n readJson<unknown>(filePath)\n .then(decodeModelPreference)\n .catch(() => decodeModelPreference(undefined))\n\n function update(change: (current: ModelPreference) => Partial<ModelPreference>) {\n const result = state.pending.then(async () => {\n const current = await read()\n const next = { ...current, ...patch(change(preference(current))) }\n await writeJsonAtomic(filePath, next)\n })\n state.pending = result.catch(() => undefined)\n return result\n }\n\n function load() {\n return state.pending.then(read).then(preference)\n }\n\n return {\n load,\n patch(value: Partial<ModelPreference>) {\n return update(() => value)\n },\n async resolveVariant(model: ModelPreferenceModel) {\n return (await load()).variant[modelPreferenceKey(model)]\n },\n saveVariant(model: ModelPreferenceModel, value: string | undefined) {\n const key = modelPreferenceKey(model)\n const next = normalizeModelVariant(value)\n return update((current) => {\n const variant = { ...current.variant }\n if (next === undefined) delete variant[key]\n if (next !== undefined) variant[key] = next\n return { variant }\n })\n },\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "7191DEBCB95CABDC64756E2164756E21", | ||
| "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": "530789E7A655E2C364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/session.ts"], | ||
| "sourcesContent": [ | ||
| "import type { ModelInfo, SessionMessageAssistant, SessionMessageInfo } from \"@opencode-ai/client\"\nimport { Locale } from \"./locale\"\n\ntype SessionNode = {\n id: string\n parentID?: string | null\n}\n\nexport function sessionFamily<T extends SessionNode>(sessions: readonly T[], sessionID: string) {\n const byID = new Map(sessions.map((session) => [session.id, session]))\n const current = byID.get(sessionID)\n if (!current) return []\n\n const children = new Map<string, T[]>()\n sessions.forEach((session) => {\n if (!session.parentID) return\n const group = children.get(session.parentID)\n if (group) group.push(session)\n else children.set(session.parentID, [session])\n })\n\n function root(session: T): T {\n const parent = session.parentID ? byID.get(session.parentID) : undefined\n return parent ? root(parent) : session\n }\n\n function walk(parentID: string, ancestors: boolean[]): Array<{ session: T; prefix: string }> {\n const group = children.get(parentID) ?? []\n return group.flatMap((session, index) => {\n const last = index === group.length - 1\n const prefix =\n ancestors.length === 0\n ? \"\"\n : ancestors\n .slice(1)\n .map((ancestor) => (ancestor ? \" \" : \"│ \"))\n .join(\"\") + (last ? \"└─ \" : \"├─ \")\n return [{ session, prefix }, ...walk(session.id, [...ancestors, last])]\n })\n }\n\n return walk(root(current).id, [])\n}\n\nexport function lastAssistantWithUsage(messages: ReadonlyArray<SessionMessageInfo>, boundary?: string) {\n const boundaryIndex = boundary ? messages.findIndex((message) => message.id === boundary) : -1\n if (boundary && boundaryIndex === -1) return undefined\n const end = boundaryIndex === -1 ? messages.length : boundaryIndex\n const compactionIndex = messages.findLastIndex(\n (message, index) => message.type === \"compaction\" && message.status === \"completed\" && index < end,\n )\n return messages.findLast(\n (message, index): message is SessionMessageAssistant & { tokens: NonNullable<SessionMessageAssistant[\"tokens\"]> } =>\n message.type === \"assistant\" && message.tokens !== undefined && index > compactionIndex && index < end,\n )\n}\n\nexport function contextUsage(\n messages: ReadonlyArray<SessionMessageInfo>,\n models: ReadonlyArray<ModelInfo> | undefined,\n boundary?: string,\n) {\n const last = lastAssistantWithUsage(messages, boundary)\n if (!last) return\n const tokens =\n last.tokens.input + last.tokens.output + last.tokens.reasoning + last.tokens.cache.read + last.tokens.cache.write\n if (tokens <= 0) return\n const model = models?.find((model) => model.providerID === last.model.providerID && model.id === last.model.id)\n return {\n tokens,\n percent: model?.limit.context ? Math.round((tokens / model.limit.context) * 100) : undefined,\n }\n}\n\nexport function formatContextUsage(tokens: number, percent?: number) {\n const value = Locale.number(tokens)\n return percent === undefined ? value : `${value} (${percent}%)`\n}\n" | ||
| ], | ||
| "mappings": ";oDAQO,SAAS,CAAoC,CAAC,EAAwB,EAAmB,CAC9F,IAAM,EAAO,IAAI,IAAI,EAAS,IAAI,CAAC,IAAY,CAAC,EAAQ,GAAI,CAAO,CAAC,CAAC,EAC/D,EAAU,EAAK,IAAI,CAAS,EAClC,GAAI,CAAC,EAAS,MAAO,CAAC,EAEtB,IAAM,EAAW,IAAI,IACrB,EAAS,QAAQ,CAAC,IAAY,CAC5B,GAAI,CAAC,EAAQ,SAAU,OACvB,IAAM,EAAQ,EAAS,IAAI,EAAQ,QAAQ,EAC3C,GAAI,EAAO,EAAM,KAAK,CAAO,EACxB,OAAS,IAAI,EAAQ,SAAU,CAAC,CAAO,CAAC,EAC9C,EAED,SAAS,CAAI,CAAC,EAAe,CAC3B,IAAM,EAAS,EAAQ,SAAW,EAAK,IAAI,EAAQ,QAAQ,EAAI,OAC/D,OAAO,EAAS,EAAK,CAAM,EAAI,EAGjC,SAAS,CAAI,CAAC,EAAkB,EAA6D,CAC3F,IAAM,EAAQ,EAAS,IAAI,CAAQ,GAAK,CAAC,EACzC,OAAO,EAAM,QAAQ,CAAC,EAAS,IAAU,CACvC,IAAM,EAAO,IAAU,EAAM,OAAS,EAChC,EACJ,EAAU,SAAW,EACjB,GACA,EACG,MAAM,CAAC,EACP,IAAI,CAAC,IAAc,EAAW,MAAQ,UAAM,EAC5C,KAAK,EAAE,GAAK,EAAO,gBAAQ,iBACpC,MAAO,CAAC,CAAE,UAAS,QAAO,EAAG,GAAG,EAAK,EAAQ,GAAI,CAAC,GAAG,EAAW,CAAI,CAAC,CAAC,EACvE,EAGH,OAAO,EAAK,EAAK,CAAO,EAAE,GAAI,CAAC,CAAC,EAG3B,SAAS,CAAsB,CAAC,EAA6C,EAAmB,CACrG,IAAM,EAAgB,EAAW,EAAS,UAAU,CAAC,IAAY,EAAQ,KAAO,CAAQ,EAAI,GAC5F,GAAI,GAAY,IAAkB,GAAI,OACtC,IAAM,EAAM,IAAkB,GAAK,EAAS,OAAS,EAC/C,EAAkB,EAAS,cAC/B,CAAC,EAAS,IAAU,EAAQ,OAAS,cAAgB,EAAQ,SAAW,aAAe,EAAQ,CACjG,EACA,OAAO,EAAS,SACd,CAAC,EAAS,IACR,EAAQ,OAAS,aAAe,EAAQ,SAAW,QAAa,EAAQ,GAAmB,EAAQ,CACvG,EAGK,SAAS,CAAY,CAC1B,EACA,EACA,EACA,CACA,IAAM,EAAO,EAAuB,EAAU,CAAQ,EACtD,GAAI,CAAC,EAAM,OACX,IAAM,EACJ,EAAK,OAAO,MAAQ,EAAK,OAAO,OAAS,EAAK,OAAO,UAAY,EAAK,OAAO,MAAM,KAAO,EAAK,OAAO,MAAM,MAC9G,GAAI,GAAU,EAAG,OACjB,IAAM,EAAQ,GAAQ,KAAK,CAAC,IAAU,EAAM,aAAe,EAAK,MAAM,YAAc,EAAM,KAAO,EAAK,MAAM,EAAE,EAC9G,MAAO,CACL,SACA,QAAS,GAAO,MAAM,QAAU,KAAK,MAAO,EAAS,EAAM,MAAM,QAAW,GAAG,EAAI,MACrF,EAGK,SAAS,CAAkB,CAAC,EAAgB,EAAkB,CACnE,IAAM,EAAQ,EAAO,OAAO,CAAM,EAClC,OAAO,IAAY,OAAY,EAAQ,GAAG,MAAU", | ||
| "debugId": "771B12581117C15C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/prompt/display.ts"], | ||
| "sourcesContent": [ | ||
| "import { stringWidth } from \"../util/string-width\"\n\nconst graphemes = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n\nexport function promptOffsetWidth(value: string) {\n let width = 0\n for (const part of graphemes.segment(value)) {\n // Textarea offsets count newlines as one position; terminal width counts them as zero.\n width += part.segment === \"\\n\" ? 1 : stringWidth(part.segment)\n }\n return width\n}\n\nfunction displayOffsetIndex(value: string, offset: number) {\n if (offset <= 0) return 0\n\n let width = 0\n for (const part of graphemes.segment(value)) {\n const next = width + promptOffsetWidth(part.segment)\n if (next > offset) return part.index\n width = next\n }\n\n return value.length\n}\n\nexport function displaySlice(value: string, start = 0, end = promptOffsetWidth(value)) {\n return value.slice(displayOffsetIndex(value, start), displayOffsetIndex(value, end))\n}\n\nexport function displayCharAt(value: string, offset: number) {\n let width = 0\n for (const part of graphemes.segment(value)) {\n const next = width + promptOffsetWidth(part.segment)\n if (offset === width || offset < next) return part.segment\n width = next\n }\n}\n\nexport function mentionTriggerIndex(value: string, offset = promptOffsetWidth(value)) {\n const text = displaySlice(value, 0, offset)\n const index = text.lastIndexOf(\"@\")\n if (index === -1) return\n\n const before = index === 0 ? undefined : text[index - 1]\n const query = text.slice(index)\n if ((before === undefined || /\\s/.test(before)) && !/\\s/.test(query)) {\n return promptOffsetWidth(text.slice(0, index))\n }\n}\n\nexport function slashTriggerIndex(value: string, offset = promptOffsetWidth(value)) {\n const text = displaySlice(value, 0, offset)\n for (let index = text.lastIndexOf(\"/\"); index >= 0; index = text.lastIndexOf(\"/\", index - 1)) {\n const before = index === 0 ? undefined : text[index - 1]\n const query = text.slice(index)\n if (before !== undefined && !/\\s/.test(before)) continue\n if (/\\s/.test(query) || query.slice(1).includes(\"/\")) return\n return promptOffsetWidth(text.slice(0, index))\n }\n}\n" | ||
| ], | ||
| "mappings": ";oDAEA,IAAM,EAAY,IAAI,KAAK,UAAU,OAAW,CAAE,YAAa,UAAW,CAAC,EAEpE,SAAS,CAAiB,CAAC,EAAe,CAC/C,IAAI,EAAQ,EACZ,QAAW,KAAQ,EAAU,QAAQ,CAAK,EAExC,GAAS,EAAK,UAAY;AAAA,EAAO,EAAI,EAAY,EAAK,OAAO,EAE/D,OAAO,EAGT,SAAS,CAAkB,CAAC,EAAe,EAAgB,CACzD,GAAI,GAAU,EAAG,MAAO,GAExB,IAAI,EAAQ,EACZ,QAAW,KAAQ,EAAU,QAAQ,CAAK,EAAG,CAC3C,IAAM,EAAO,EAAQ,EAAkB,EAAK,OAAO,EACnD,GAAI,EAAO,EAAQ,OAAO,EAAK,MAC/B,EAAQ,EAGV,OAAO,EAAM,OAGR,SAAS,CAAY,CAAC,EAAe,EAAQ,EAAG,EAAM,EAAkB,CAAK,EAAG,CACrF,OAAO,EAAM,MAAM,EAAmB,EAAO,CAAK,EAAG,EAAmB,EAAO,CAAG,CAAC,EAG9E,SAAS,CAAa,CAAC,EAAe,EAAgB,CAC3D,IAAI,EAAQ,EACZ,QAAW,KAAQ,EAAU,QAAQ,CAAK,EAAG,CAC3C,IAAM,EAAO,EAAQ,EAAkB,EAAK,OAAO,EACnD,GAAI,IAAW,GAAS,EAAS,EAAM,OAAO,EAAK,QACnD,EAAQ,GAIL,SAAS,CAAmB,CAAC,EAAe,EAAS,EAAkB,CAAK,EAAG,CACpF,IAAM,EAAO,EAAa,EAAO,EAAG,CAAM,EACpC,EAAQ,EAAK,YAAY,GAAG,EAClC,GAAI,IAAU,GAAI,OAElB,IAAM,EAAS,IAAU,EAAI,OAAY,EAAK,EAAQ,GAChD,EAAQ,EAAK,MAAM,CAAK,EAC9B,IAAK,IAAW,QAAa,KAAK,KAAK,CAAM,IAAM,CAAC,KAAK,KAAK,CAAK,EACjE,OAAO,EAAkB,EAAK,MAAM,EAAG,CAAK,CAAC,EAI1C,SAAS,CAAiB,CAAC,EAAe,EAAS,EAAkB,CAAK,EAAG,CAClF,IAAM,EAAO,EAAa,EAAO,EAAG,CAAM,EAC1C,QAAS,EAAQ,EAAK,YAAY,GAAG,EAAG,GAAS,EAAG,EAAQ,EAAK,YAAY,IAAK,EAAQ,CAAC,EAAG,CAC5F,IAAM,EAAS,IAAU,EAAI,OAAY,EAAK,EAAQ,GAChD,EAAQ,EAAK,MAAM,CAAK,EAC9B,GAAI,IAAW,QAAa,CAAC,KAAK,KAAK,CAAM,EAAG,SAChD,GAAI,KAAK,KAAK,CAAK,GAAK,EAAM,MAAM,CAAC,EAAE,SAAS,GAAG,EAAG,OACtD,OAAO,EAAkB,EAAK,MAAM,EAAG,CAAK,CAAC", | ||
| "debugId": "23EA4B671FC6D61964756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/openai-options.ts", "../ai/src/protocols/openai-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { OpenResponsesOptions } from \"./open-responses-options.js\"\n\nexport const OpenAIReasoningEfforts = OpenResponsesOptions.ReasoningEfforts\nexport type OpenAIReasoningEffort = OpenResponsesOptions.ReasoningEffort\nexport const OpenAITextVerbosities = OpenResponsesOptions.TextVerbosities\nexport type OpenAITextVerbosity = OpenResponsesOptions.TextVerbosity\n\n// Mirrors OpenAI's `ResponseIncludable` union from the official SDK. Keep this\n// in lockstep with `openai-node/src/resources/responses/responses.ts`.\nexport const OpenAIResponseIncludables = OpenResponsesOptions.ResponseIncludables\nexport type OpenAIResponseIncludable = OpenResponsesOptions.ResponseIncludable\nexport const OpenAIServiceTiers = OpenResponsesOptions.ServiceTiers\nexport type OpenAIServiceTier = OpenResponsesOptions.ServiceTier\n\nexport const OpenAIReasoningEffort = OpenResponsesOptions.ReasoningEffort\nexport const OpenAITextVerbosity = OpenResponsesOptions.TextVerbosity\nexport const OpenAIResponseIncludable = OpenResponsesOptions.ResponseIncludableSchema\nexport const OpenAIServiceTier = OpenResponsesOptions.ServiceTierSchema\n\nexport const isReasoningEffort = (effort: unknown): effort is OpenAIReasoningEffort => typeof effort === \"string\"\n\nexport const resolve = OpenResponsesOptions.resolve\n\nexport * as OpenAIOptions from \"./openai-options.js\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { HttpTransport } from \"../route/transport/index.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n AIError,\n LLMEvent,\n Usage,\n type FinishReason,\n type FinishReasonDetails,\n type CacheHint,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ReasoningPart,\n type TextPart,\n type ToolCallPart,\n type ToolDefinition,\n} from \"../schema/index.js\"\nimport { classifyProviderFailure } from \"../provider-error.js\"\nimport { isRecord, JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared.js\"\nimport { OpenAIOptions } from \"./utils/openai-options.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { ToolStream } from \"./utils/tool-stream.js\"\n\nconst ADAPTER = \"openai-chat\"\nconst RESERVED_REASONING_FIELDS = new Set([\"role\", \"content\", \"refusal\", \"tool_calls\"])\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = \"/chat/completions\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\n// The body schema is the provider-native JSON body. `fromRequest` below builds\n// this shape from the common `LLMRequest`, then `Route.make` validates and\n// JSON-encodes it before transport.\nconst OpenAIChatCacheControl = Schema.Struct({\n type: Schema.Literal(\"ephemeral\"),\n ttl: Schema.optional(Schema.String),\n})\n\nconst OpenAIChatFunction = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n parameters: JsonObject,\n})\n\nconst OpenAIChatTool = Schema.Struct({\n type: Schema.tag(\"function\"),\n function: OpenAIChatFunction,\n cache_control: Schema.optional(OpenAIChatCacheControl),\n})\ntype OpenAIChatTool = Schema.Schema.Type<typeof OpenAIChatTool>\n\nconst OpenAIChatAssistantToolCall = Schema.Struct({\n id: Schema.String,\n type: Schema.tag(\"function\"),\n function: Schema.Struct({\n name: Schema.String,\n arguments: Schema.String,\n }),\n})\ntype OpenAIChatAssistantToolCall = Schema.Schema.Type<typeof OpenAIChatAssistantToolCall>\n\n// Intentionally omit Gemini's provider-specific `extra_content.google.thought_signature`\n// extension until direct Google OpenAI-compatible routing is supported here:\n// https://github.com/vercel/ai/issues/11590\n// https://github.com/vercel/ai/pull/11745\n// https://ai.google.dev/gemini-api/docs/thought-signatures#openai\n\nconst OpenAIChatUserContent = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(OpenAIChatCacheControl),\n }),\n Schema.Struct({\n type: Schema.Literal(\"image_url\"),\n image_url: Schema.Struct({ url: Schema.String }),\n }),\n])\n\nconst OpenAIChatMessage = Schema.Union([\n Schema.Struct({\n role: Schema.Literal(\"system\"),\n content: Schema.Union([Schema.String, Schema.Array(OpenAIChatUserContent)]),\n }),\n Schema.Struct({\n role: Schema.Literal(\"user\"),\n content: Schema.Union([Schema.String, Schema.Array(OpenAIChatUserContent)]),\n }),\n Schema.StructWithRest(\n Schema.Struct({\n role: Schema.Literal(\"assistant\"),\n content: Schema.NullOr(Schema.String),\n tool_calls: optionalArray(OpenAIChatAssistantToolCall),\n reasoning_content: Schema.optional(Schema.String),\n reasoning: Schema.optional(Schema.String),\n reasoning_text: Schema.optional(Schema.String),\n reasoning_details: Schema.optional(Schema.Unknown),\n cache_control: Schema.optional(OpenAIChatCacheControl),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n ),\n Schema.Struct({\n role: Schema.Literal(\"tool\"),\n tool_call_id: Schema.String,\n content: Schema.String,\n cache_control: Schema.optional(OpenAIChatCacheControl),\n }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype OpenAIChatMessage = Schema.Schema.Type<typeof OpenAIChatMessage>\n\nconst OpenAIChatToolChoice = Schema.Union([\n Schema.Literals([\"auto\", \"none\", \"required\"]),\n Schema.Struct({\n type: Schema.tag(\"function\"),\n function: Schema.Struct({ name: Schema.String }),\n }),\n])\n\nexport const bodyFields = {\n model: Schema.String,\n messages: Schema.Array(OpenAIChatMessage),\n tools: optionalArray(OpenAIChatTool),\n tool_choice: Schema.optional(OpenAIChatToolChoice),\n stream: Schema.Literal(true),\n stream_options: Schema.optional(Schema.Struct({ include_usage: Schema.Boolean })),\n store: Schema.optional(Schema.Boolean),\n prompt_cache_key: Schema.optional(Schema.String),\n reasoning_effort: Schema.optional(OpenAIOptions.OpenAIReasoningEffort),\n max_completion_tokens: Schema.optional(Schema.Number),\n max_tokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n frequency_penalty: Schema.optional(Schema.Number),\n presence_penalty: Schema.optional(Schema.Number),\n seed: Schema.optional(Schema.Number),\n stop: optionalArray(Schema.String),\n}\nconst OpenAIChatBody = Schema.Struct(bodyFields)\nexport type OpenAIChatBody = Schema.Schema.Type<typeof OpenAIChatBody>\n\n// =============================================================================\n// Streaming Event Schema\n// =============================================================================\n// The event schema is one decoded SSE `data:` payload. `Framing.sse` splits the\n// byte stream into strings, then `Protocol.jsonEvent` decodes each string into\n// this provider-native event shape.\nconst OpenAIChatUsage = Schema.StructWithRest(\n Schema.Struct({\n prompt_tokens: optionalNull(Schema.Number),\n completion_tokens: optionalNull(Schema.Number),\n total_tokens: optionalNull(Schema.Number),\n prompt_tokens_details: optionalNull(\n Schema.StructWithRest(\n Schema.Struct({\n cached_tokens: optionalNull(Schema.Number),\n cache_write_tokens: optionalNull(Schema.Number),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n ),\n ),\n completion_tokens_details: optionalNull(\n Schema.StructWithRest(\n Schema.Struct({\n reasoning_tokens: optionalNull(Schema.Number),\n accepted_prediction_tokens: optionalNull(Schema.Number),\n rejected_prediction_tokens: optionalNull(Schema.Number),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n ),\n ),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst OpenAIChatToolCallDeltaFunction = Schema.Struct({\n name: optionalNull(Schema.String),\n arguments: optionalNull(Schema.String),\n})\n\nconst OpenAIChatToolCallDelta = Schema.Struct({\n index: optionalNull(Schema.Number),\n id: optionalNull(Schema.String),\n function: optionalNull(OpenAIChatToolCallDeltaFunction),\n})\ntype OpenAIChatToolCallDelta = Schema.Schema.Type<typeof OpenAIChatToolCallDelta>\n\nconst OpenAIChatDelta = Schema.StructWithRest(\n Schema.Struct({\n content: optionalNull(Schema.String),\n refusal: optionalNull(Schema.String),\n reasoning_content: optionalNull(Schema.String),\n reasoning: optionalNull(Schema.String),\n reasoning_text: optionalNull(Schema.String),\n reasoning_details: optionalNull(Schema.Unknown),\n tool_calls: optionalNull(Schema.Array(OpenAIChatToolCallDelta)),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\n\nconst OpenAIChatChoice = Schema.Struct({\n delta: optionalNull(OpenAIChatDelta),\n finish_reason: optionalNull(Schema.String),\n native_finish_reason: optionalNull(Schema.String),\n})\n\nconst OpenAIChatError = Schema.Struct({\n code: optionalNull(Schema.Union([Schema.String, Schema.Number])),\n message: Schema.String,\n})\n\nexport const OpenAIChatEvent = Schema.Struct({\n choices: optionalNull(Schema.Array(OpenAIChatChoice)),\n usage: optionalNull(OpenAIChatUsage),\n error: optionalNull(OpenAIChatError),\n})\nexport type OpenAIChatEvent = Schema.Schema.Type<typeof OpenAIChatEvent>\ntype OpenAIChatRequestMessage = LLMRequest[\"messages\"][number]\n\ninterface PendingToolDelta {\n readonly id?: string\n readonly name?: string\n readonly input: string\n}\n\nexport interface ParserState {\n readonly tools: ToolStream.State<number>\n readonly pendingTools: Partial<Record<number, PendingToolDelta>>\n readonly toolCallEvents: ReadonlyArray<LLMEvent>\n readonly usage?: Usage\n readonly finishReason?: FinishReasonDetails\n readonly lifecycle: Lifecycle.State\n readonly reasoningField?: string\n readonly reasoningDetails: Array<unknown>\n readonly reasoningDetailsObserved: boolean\n readonly reasoningEmitted: boolean\n readonly latestToolIndex?: number\n readonly nextToolIndex: number\n}\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Lowering is the only place that knows how common LLM messages map onto the\n// OpenAI Chat wire format. Keep provider quirks here instead of leaking native\n// fields into `LLMRequest`.\ninterface LoweringOptions {\n readonly cacheControl?: (\n cache: CacheHint | undefined,\n ) => Schema.Schema.Type<typeof OpenAIChatCacheControl> | undefined\n}\n\nconst lowerTool = (tool: ToolDefinition, inputSchema: JsonSchema, options: LoweringOptions): OpenAIChatTool => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: ToolSchemaProjection.openAI(inputSchema),\n },\n cache_control: options.cacheControl?.(tool.cache),\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"OpenAI Chat\", toolChoice, {\n auto: () => \"auto\" as const,\n none: () => \"none\" as const,\n required: () => \"required\" as const,\n tool: (name) => ({ type: \"function\" as const, function: { name } }),\n })\n\nconst lowerToolCall = (part: ToolCallPart): OpenAIChatAssistantToolCall => ({\n id: part.id,\n type: \"function\",\n function: {\n name: part.name,\n arguments: ProviderShared.encodeJson(part.input),\n },\n})\n\nconst lowerMedia = Effect.fn(\"OpenAIChat.lowerMedia\")(function* (part: MediaPart) {\n const media = ProviderShared.normalizeMedia(part)\n if (!media.mime.startsWith(\"image/\"))\n return yield* ProviderShared.invalidRequest(`OpenAI Chat does not support media type ${part.mediaType}`)\n return { type: \"image_url\" as const, image_url: { url: media.dataUrl } }\n})\n\nconst openAICompatibleReasoningContent = (native: unknown) =>\n isRecord(native) && typeof native.reasoning_content === \"string\" ? native.reasoning_content : undefined\n\nconst reasoningField = (part: ReasoningPart) => {\n const field = part.providerMetadata?.openai?.reasoningField\n return typeof field === \"string\" ? field : undefined\n}\n\nconst reasoningDetails = (parts: ReadonlyArray<ReasoningPart>, native: unknown) => {\n const observed = parts.flatMap((part) => {\n const details = part.providerMetadata?.openai?.reasoningDetails\n return Array.isArray(details) ? details : []\n })\n if (parts.some((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))) return observed\n if (isRecord(native) && Array.isArray(native.reasoning_details)) return native.reasoning_details\n}\n\nconst lowerUserMessage = Effect.fn(\"OpenAIChat.lowerUserMessage\")(function* (\n message: OpenAIChatRequestMessage,\n options: LoweringOptions,\n) {\n const content: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: options.cacheControl?.(part.cache) })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerMedia(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"user\", [\"text\", \"media\"])\n }\n if (content.every((part) => part.type === \"text\" && part.cache_control === undefined))\n return {\n role: \"user\" as const,\n content: content.map((part) => (part.type === \"text\" ? part.text : \"\")).join(\"\"),\n }\n return { role: \"user\" as const, content }\n})\n\nconst lowerAssistantMessage = Effect.fn(\"OpenAIChat.lowerAssistantMessage\")(function* (\n message: OpenAIChatRequestMessage,\n configuredField?: string,\n options: LoweringOptions = {},\n) {\n const content: TextPart[] = []\n const reasoning: ReasoningPart[] = []\n const toolCalls: OpenAIChatAssistantToolCall[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"assistant\", [\"text\", \"reasoning\", \"tool-call\"])\n if (part.type === \"text\") {\n content.push(part)\n continue\n }\n if (part.type === \"reasoning\") {\n reasoning.push(part)\n continue\n }\n if (part.type === \"tool-call\") {\n toolCalls.push(lowerToolCall(part))\n continue\n }\n }\n const text = reasoning.map((part) => part.text).join(\"\")\n const details = reasoningDetails(reasoning, message.native?.openaiCompatible)\n const observedField = reasoning.map(reasoningField).find((value) => value !== undefined)\n const nativeReasoning = openAICompatibleReasoningContent(message.native?.openaiCompatible)\n const fullyStructured = reasoning.every((part) => Array.isArray(part.providerMetadata?.openai?.reasoningDetails))\n const field = (() => {\n if (configuredField !== undefined) return configuredField\n if (reasoning.length === 0) return undefined\n if (observedField !== undefined) return observedField\n if (nativeReasoning !== undefined) return \"reasoning_content\"\n if (!fullyStructured) return \"reasoning_content\"\n })()\n const reasoningText = (() => {\n if (configuredField !== undefined) return reasoning.length === 0 ? (nativeReasoning ?? \"\") : text\n if (reasoning.length === 0) return nativeReasoning\n return text\n })()\n const cached = message.content.findLast((part) => \"cache\" in part && part.cache !== undefined)\n const cacheControl = options.cacheControl?.(cached && \"cache\" in cached ? cached.cache : undefined)\n const result = {\n role: \"assistant\" as const,\n content: content.length > 0 ? content.map((part) => part.text).join(\"\") : toolCalls.length > 0 ? null : \"\",\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n ...(details !== undefined ? { reasoning_details: details } : {}),\n ...(cacheControl !== undefined ? { cache_control: cacheControl } : {}),\n }\n if (field === undefined || reasoningText === undefined) return result\n return { ...result, [field]: reasoningText }\n})\n\nconst lowerToolMessages = Effect.fn(\"OpenAIChat.lowerToolMessages\")(function* (\n message: OpenAIChatRequestMessage,\n options: LoweringOptions,\n) {\n const messages: OpenAIChatMessage[] = []\n const images: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"OpenAI Chat\", \"tool\", [\"tool-result\"])\n if (part.result.type !== \"content\") {\n messages.push({\n role: \"tool\",\n tool_call_id: part.id,\n content: ProviderShared.toolResultText(part),\n cache_control: options.cacheControl?.(part.cache),\n })\n continue\n }\n const content: ReadonlyArray<Tool.Content> = part.result.value\n const text = content.filter((item) => item.type === \"text\").map((item) => item.text)\n messages.push({\n role: \"tool\",\n tool_call_id: part.id,\n content: text.join(\"\\n\"),\n cache_control: options.cacheControl?.(part.cache),\n })\n const files = content.filter((item) => item.type === \"file\")\n images.push(\n ...(yield* Effect.forEach(files, (item) =>\n lowerMedia({ type: \"media\", mediaType: item.mime, data: item.uri, filename: item.name }),\n )),\n )\n }\n return { messages, images }\n})\n\nconst lowerMessage = Effect.fn(\"OpenAIChat.lowerMessage\")(function* (\n message: OpenAIChatRequestMessage,\n reasoningField?: string,\n options: LoweringOptions = {},\n) {\n if (message.role === \"user\") return [yield* lowerUserMessage(message, options)]\n if (message.role === \"assistant\") return [yield* lowerAssistantMessage(message, reasoningField, options)]\n return (yield* lowerToolMessages(message, options)).messages\n})\n\nconst lowerMessages = Effect.fn(\"OpenAIChat.lowerMessages\")(function* (request: LLMRequest, options: LoweringOptions) {\n const system: OpenAIChatMessage[] =\n request.system.length === 0\n ? []\n : request.system.some((part) => part.cache !== undefined) && options.cacheControl !== undefined\n ? [\n {\n role: \"system\",\n content: request.system.map((part) => ({\n type: \"text\",\n text: part.text,\n cache_control: options.cacheControl?.(part.cache),\n })),\n },\n ]\n : [{ role: \"system\", content: ProviderShared.joinText(request.system) }]\n const messages = [...system]\n const pendingImages: Array<Schema.Schema.Type<typeof OpenAIChatUserContent>> = []\n const flushImages = () => {\n if (pendingImages.length === 0) return\n messages.push({ role: \"user\", content: pendingImages.splice(0) })\n }\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"OpenAI Chat\", message)\n if (pendingImages.length > 0) {\n messages.push({\n role: \"user\",\n content: [\n ...pendingImages.splice(0),\n { type: \"text\", text: part.text, cache_control: options.cacheControl?.(part.cache) },\n ],\n })\n continue\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\" && typeof previous.content === \"string\")\n messages[messages.length - 1] = options.cacheControl?.(part.cache)\n ? {\n role: \"user\",\n content: [\n { type: \"text\", text: previous.content },\n { type: \"text\", text: part.text, cache_control: options.cacheControl(part.cache) },\n ],\n }\n : { role: \"user\", content: `${previous.content}\\n${part.text}` }\n else if (previous?.role === \"user\" && Array.isArray(previous.content))\n messages[messages.length - 1] = {\n role: \"user\",\n content: [\n ...previous.content,\n { type: \"text\", text: part.text, cache_control: options.cacheControl?.(part.cache) },\n ],\n }\n else\n messages.push(\n options.cacheControl?.(part.cache)\n ? {\n role: \"user\",\n content: [{ type: \"text\", text: part.text, cache_control: options.cacheControl(part.cache) }],\n }\n : { role: \"user\", content: part.text },\n )\n continue\n }\n if (message.role === \"tool\") {\n const lowered = yield* lowerToolMessages(message, options)\n messages.push(...lowered.messages)\n pendingImages.push(...lowered.images)\n continue\n }\n flushImages()\n messages.push(...(yield* lowerMessage(message, request.model.compatibility?.reasoningField, options)))\n }\n flushImages()\n return messages\n})\n\nconst lowerOptions = (request: LLMRequest) => {\n const options = OpenAIOptions.resolve(request)\n return {\n ...(options.store !== undefined ? { store: options.store } : {}),\n ...(request.promptCacheKey ? { prompt_cache_key: request.promptCacheKey } : {}),\n ...(options.reasoningEffort ? { reasoning_effort: options.reasoningEffort } : {}),\n }\n}\n\nexport const fromRequest = Effect.fn(\"OpenAIChat.fromRequest\")(function* (\n request: LLMRequest,\n options: LoweringOptions = {},\n) {\n // `fromRequest` returns the provider body only. Endpoint, auth, framing,\n // validation, and HTTP execution are composed by `Route.make`.\n const reasoningField = request.model.compatibility?.reasoningField\n if (reasoningField && RESERVED_REASONING_FIELDS.has(reasoningField))\n return yield* ProviderShared.invalidRequest(\n `OpenAI Chat reasoning field conflicts with reserved field ${reasoningField}`,\n )\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n const maxTokensField = request.model.compatibility?.maxTokensField ?? \"max_tokens\"\n return {\n model: request.model.id,\n messages: yield* lowerMessages(request, options),\n tools:\n request.tools.length === 0\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(\n tool,\n ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility),\n options,\n ),\n ),\n tool_choice: request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined,\n stream: true as const,\n stream_options: { include_usage: true },\n ...(maxTokensField === \"max_completion_tokens\"\n ? { max_completion_tokens: generation?.maxTokens }\n : { max_tokens: generation?.maxTokens }),\n temperature: generation?.temperature,\n top_p: generation?.topP,\n frequency_penalty: generation?.frequencyPenalty,\n presence_penalty: generation?.presencePenalty,\n seed: generation?.seed,\n stop: generation?.stop,\n ...lowerOptions(request),\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\n// Streaming parsers are small state machines: every event returns a new state\n// plus the common `LLMEvent`s produced by that event. Tool calls are accumulated\n// because OpenAI streams JSON arguments across multiple deltas.\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"stop\") return \"stop\"\n if (reason === \"length\") return \"length\"\n if (reason === \"content_filter\") return \"content-filter\"\n if (reason === \"function_call\" || reason === \"tool_calls\") return \"tool-calls\"\n if (reason === \"error\") return \"error\"\n return \"unknown\"\n}\n\n// OpenAI Chat reports `prompt_tokens` (inclusive total) with a\n// cached-read and cache-write subsets, and `completion_tokens` (inclusive\n// total) with a `reasoning_tokens` subset. We pass the inclusive totals\n// through and derive the non-cached breakdown so the `AI.Usage` contract is\n// satisfied on both sides.\nconst mapUsage = (usage: OpenAIChatEvent[\"usage\"]): Usage | undefined => {\n if (!usage) return undefined\n const input = usage.prompt_tokens ?? undefined\n const output = usage.completion_tokens ?? undefined\n const cached = usage.prompt_tokens_details?.cached_tokens ?? undefined\n const cacheWrite = usage.prompt_tokens_details?.cache_write_tokens ?? undefined\n const reasoning = usage.completion_tokens_details?.reasoning_tokens ?? undefined\n const nonCached = ProviderShared.subtractTokens(input, ProviderShared.sumTokens(cached, cacheWrite))\n return new Usage({\n inputTokens: input,\n outputTokens: output,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cached,\n cacheWriteInputTokens: cacheWrite,\n reasoningTokens: reasoning,\n totalTokens: ProviderShared.totalTokens(input, output, usage.total_tokens ?? undefined),\n providerMetadata: { openai: usage },\n })\n}\n\nconst toolIndexByID = (\n tools: ParserState[\"tools\"],\n pendingTools: ParserState[\"pendingTools\"],\n id: string | undefined,\n) => {\n if (!id) return undefined\n const entry = Object.entries({ ...pendingTools, ...tools }).find(([, tool]) => tool?.id === id)\n return entry ? Number(entry[0]) : undefined\n}\n\nconst reasoningDelta = (\n delta: Schema.Schema.Type<typeof OpenAIChatDelta> | null | undefined,\n configuredField?: string,\n) => {\n if (!delta) return undefined\n const fields = new Set([configuredField, \"reasoning_content\", \"reasoning\", \"reasoning_text\"])\n for (const field of fields) {\n if (field === undefined) continue\n const text = delta[field]\n if (typeof text === \"string\" && text.length > 0) return { field, text }\n }\n return undefined\n}\n\nconst detailText = (details: ReadonlyArray<unknown>) => {\n const text = details.flatMap((detail) => {\n if (!isRecord(detail)) return []\n if (detail.type === \"reasoning.text\" && typeof detail.text === \"string\" && detail.text) return [detail.text]\n if (detail.type === \"reasoning.summary\" && typeof detail.summary === \"string\" && detail.summary)\n return [detail.summary]\n return []\n })\n if (text.length > 0) return text.join(\"\")\n}\n\nconst appendReasoningDetails = (result: Array<unknown>, details: ReadonlyArray<unknown>) => {\n for (const detail of details) {\n const previous = result.at(-1)\n if (\n !isRecord(previous) ||\n previous.type !== \"reasoning.text\" ||\n !isRecord(detail) ||\n detail.type !== \"reasoning.text\" ||\n conflictingReasoningTextDetails(previous, detail)\n ) {\n result.push(detail)\n continue\n }\n result[result.length - 1] = {\n ...previous,\n ...Object.fromEntries(Object.entries(detail).filter((entry) => entry[1] !== undefined)),\n text: `${typeof previous.text === \"string\" ? previous.text : \"\"}${typeof detail.text === \"string\" ? detail.text : \"\"}`,\n signature: mergeDetailValue(previous.signature, detail.signature),\n format: mergeDetailValue(previous.format, detail.format),\n }\n }\n}\n\nconst mergeDetailValue = (previous: unknown, current: unknown) =>\n previous || current || (previous !== undefined ? previous : current)\n\nconst conflictingReasoningTextDetails = (previous: Record<string, unknown>, current: Record<string, unknown>) =>\n conflictingDetailValue(previous.id, current.id) ||\n conflictingDetailValue(previous.index, current.index) ||\n conflictingDetailValue(previous.format, current.format) ||\n (Boolean(previous.signature) && Boolean(current.signature) && previous.signature !== current.signature)\n\nconst conflictingDetailValue = (previous: unknown, current: unknown) =>\n previous !== undefined && previous !== null && current !== undefined && current !== null && previous !== current\n\nconst reasoningMetadata = (field: ParserState[\"reasoningField\"], details?: ReadonlyArray<unknown>) => ({\n openai: {\n ...(field ? { reasoningField: field } : {}),\n ...(details ? { reasoningDetails: details } : {}),\n },\n})\n\nconst step = (state: ParserState, event: OpenAIChatEvent) =>\n Effect.gen(function* () {\n if (event.error)\n return yield* new AIError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({\n message: event.error.message,\n code: event.error.code === undefined || event.error.code === null ? undefined : String(event.error.code),\n status: typeof event.error.code === \"number\" ? event.error.code : undefined,\n }),\n })\n const events: LLMEvent[] = []\n const usage = mapUsage(event.usage) ?? state.usage\n const choice = event.choices?.[0]\n const rawFinishReason = choice?.finish_reason\n const finishReason =\n rawFinishReason !== undefined && rawFinishReason !== null\n ? { normalized: mapFinishReason(rawFinishReason), raw: choice?.native_finish_reason ?? rawFinishReason }\n : state.finishReason\n const delta = choice?.delta\n const toolDeltas = delta?.tool_calls ?? []\n let tools = state.tools\n let pendingTools = state.pendingTools\n let latestToolIndex = state.latestToolIndex\n let nextToolIndex = state.nextToolIndex\n\n let lifecycle = state.lifecycle\n\n const reasoning = reasoningDelta(delta, state.reasoningField)\n const hasLateContent =\n Boolean(delta?.content) ||\n Boolean(delta?.refusal) ||\n reasoning !== undefined ||\n (Array.isArray(delta?.reasoning_details) && delta.reasoning_details.length > 0) ||\n toolDeltas.some((tool) => Boolean(tool.id) || Boolean(tool.function?.name) || Boolean(tool.function?.arguments))\n if (state.finishReason !== undefined) {\n if (hasLateContent)\n return yield* ProviderShared.eventError(ADAPTER, \"OpenAI Chat received content after the finish reason\")\n return [{ ...state, usage }, events] as const\n }\n\n const reasoningField = state.reasoningField ?? reasoning?.field\n const detailDelta = Array.isArray(delta?.reasoning_details) ? delta.reasoning_details : undefined\n if (detailDelta !== undefined) appendReasoningDetails(state.reasoningDetails, detailDelta)\n const reasoningDetailsObserved = state.reasoningDetailsObserved || detailDelta !== undefined\n const deltaMetadata = reasoningMetadata(reasoningField)\n const text = detailDelta?.length ? (detailText(detailDelta) ?? reasoning?.text) : reasoning?.text\n if (text !== undefined) lifecycle = Lifecycle.reasoningDelta(lifecycle, events, \"reasoning-0\", text, deltaMetadata)\n else if (\n reasoningDetailsObserved &&\n !lifecycle.reasoning.has(\"reasoning-0\") &&\n (Boolean(delta?.content) || Boolean(delta?.refusal) || toolDeltas.length > 0)\n )\n lifecycle = Lifecycle.reasoningStart(lifecycle, events, \"reasoning-0\", deltaMetadata)\n const reasoningEmitted = state.reasoningEmitted || lifecycle.reasoning.has(\"reasoning-0\")\n\n if (delta?.content) {\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningMetadata(reasoningField, reasoningDetailsObserved ? state.reasoningDetails : undefined),\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.content)\n }\n\n if (delta?.refusal) {\n lifecycle = Lifecycle.reasoningEnd(\n lifecycle,\n events,\n \"reasoning-0\",\n reasoningMetadata(reasoningField, reasoningDetailsObserved ? state.reasoningDetails : undefined),\n )\n lifecycle = Lifecycle.textDelta(lifecycle, events, \"text-0\", delta.refusal)\n }\n\n // Compatible providers may omit indexes. Prefer durable identity, then use\n // batch position for parallel deltas or the latest call for sparse chunks.\n for (const [position, tool] of toolDeltas.entries()) {\n const matched = toolIndexByID(tools, pendingTools, tool.id || undefined)\n const fallback = toolDeltas.length > 1 ? position : (latestToolIndex ?? position)\n const fallbackTool = tools[fallback] ?? pendingTools[fallback]\n const index =\n tool.index ?? matched ?? (tool.id && fallbackTool?.id && fallbackTool.id !== tool.id ? nextToolIndex : fallback)\n const current = tools[index]\n const pending = pendingTools[index]\n const id = current?.id ?? pending?.id ?? (tool.id || undefined)\n const name = current?.name ?? pending?.name ?? (tool.function?.name || undefined)\n const text = `${pending?.input ?? \"\"}${tool.function?.arguments ?? \"\"}`\n latestToolIndex = index\n nextToolIndex = Math.max(nextToolIndex, index + 1)\n if (!current && (!id || !name)) {\n pendingTools = {\n ...pendingTools,\n [index]: { id: id || undefined, name: name || undefined, input: text },\n }\n continue\n }\n if (pending) {\n pendingTools = { ...pendingTools }\n delete pendingTools[index]\n }\n const result = ToolStream.appendOrStart(\n ADAPTER,\n tools,\n index,\n { id: id || undefined, name: name || undefined, text },\n \"OpenAI Chat tool call delta is missing id or name\",\n )\n if (ToolStream.isError(result)) return yield* result\n tools = result.tools\n if (result.events.length) lifecycle = Lifecycle.stepStart(lifecycle, events)\n events.push(...result.events)\n }\n\n if (finishReason !== undefined && state.finishReason === undefined && Object.keys(pendingTools).length > 0)\n return yield* ProviderShared.eventError(ADAPTER, \"OpenAI Chat tool call delta is missing id or name\")\n\n // Finalize accumulated tool inputs eagerly when finish_reason arrives so\n // valid calls and malformed local calls settle independently.\n const finished =\n finishReason !== undefined && state.finishReason === undefined && Object.keys(tools).length > 0\n ? yield* ToolStream.finishAll(ADAPTER, tools)\n : undefined\n\n return [\n {\n tools: finished?.tools ?? tools,\n pendingTools,\n toolCallEvents: finished?.events ?? state.toolCallEvents,\n usage,\n finishReason,\n lifecycle,\n reasoningField,\n reasoningDetails: state.reasoningDetails,\n reasoningDetailsObserved,\n reasoningEmitted,\n latestToolIndex,\n nextToolIndex,\n },\n events,\n ] as const\n })\n\nconst finishEvents = (state: ParserState): ReadonlyArray<LLMEvent> => {\n const events: LLMEvent[] = []\n const toolCallEvents =\n state.finishReason === undefined && Object.keys(state.tools).length > 0\n ? Effect.runSync(ToolStream.finishAll(ADAPTER, state.tools)).events\n : state.toolCallEvents\n const hasToolCalls = toolCallEvents.length > 0\n const reason = state.finishReason\n ? {\n ...state.finishReason,\n normalized:\n state.finishReason.normalized === \"stop\" && hasToolCalls ? \"tool-calls\" : state.finishReason.normalized,\n }\n : { normalized: hasToolCalls ? (\"tool-calls\" as const) : (\"unknown\" as const) }\n const metadata = reasoningMetadata(\n state.reasoningField,\n state.reasoningDetailsObserved ? state.reasoningDetails : undefined,\n )\n const started =\n state.reasoningDetailsObserved && !state.reasoningEmitted\n ? Lifecycle.reasoningStart(state.lifecycle, events, \"reasoning-0\", reasoningMetadata(state.reasoningField))\n : state.lifecycle\n const ended = Lifecycle.reasoningEnd(started, events, \"reasoning-0\", metadata)\n const lifecycle = toolCallEvents.length ? Lifecycle.stepStart(ended, events) : ended\n events.push(...toolCallEvents)\n Lifecycle.finish(lifecycle, events, { reason, usage: state.usage })\n return events\n}\n\n// =============================================================================\n// Protocol And OpenAI Route\n// =============================================================================\n/**\n * The OpenAI Chat protocol — request body construction, body schema, and the\n * streaming-event state machine. Reused by every route that speaks OpenAI Chat\n * over HTTP+SSE: native OpenAI, DeepSeek, TogetherAI, Cerebras, Baseten,\n * Fireworks, DeepInfra, and (once added) Azure OpenAI Chat.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: OpenAIChatBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(OpenAIChatEvent),\n initial: (request) => ({\n tools: ToolStream.empty<number>(),\n pendingTools: {},\n toolCallEvents: [],\n lifecycle: Lifecycle.initial(),\n reasoningField: request.model.compatibility?.reasoningField,\n reasoningDetails: [],\n reasoningDetailsObserved: false,\n reasoningEmitted: false,\n nextToolIndex: 0,\n }),\n step,\n onHalt: finishEvents,\n },\n})\n\nexport const httpTransport = HttpTransport.sseJson.with<OpenAIChatBody>()\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"openai\",\n providerMetadataKey: \"openai\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n transport: httpTransport,\n})\n\nexport * as OpenAIChat from \"./openai-chat.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "C4A28CFF9DEFDD7664756E2164756E21", | ||
| "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": "3FA8C5F3946E4B9664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/anthropic-messages.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Tool } from \"@opencode-ai/schema/tool\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n AIError,\n LLMEvent,\n mergeJsonRecords,\n Usage,\n type CacheHint,\n type FinishReasonDetails,\n type FinishReason,\n type JsonSchema,\n type LLMRequest,\n type MediaPart,\n type ProviderMetadata,\n type ToolCallPart,\n type ToolDefinition,\n type ToolResultPart,\n} from \"../schema/index.js\"\nimport { JsonObject, optionalArray, optionalNull, ProviderShared } from \"./shared.js\"\nimport { classifyProviderFailure } from \"../provider-error.js\"\nimport * as Cache from \"./utils/cache.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { ToolStream } from \"./utils/tool-stream.js\"\n\nconst ADAPTER = \"anthropic-messages\"\nexport const DEFAULT_BASE_URL = \"https://api.anthropic.com/v1\"\nexport const PATH = \"/messages\"\nexport const DEFAULT_MAX_TOKENS = 32_000\n\nconst SSE_EVENTS = new Set([\n \"message\",\n \"message_start\",\n \"message_delta\",\n \"message_stop\",\n \"content_block_start\",\n \"content_block_delta\",\n \"content_block_stop\",\n \"error\",\n])\nexport const framing = Framing.sseEvents(SSE_EVENTS)\n\nexport type ThinkingInput =\n | {\n readonly type: \"adaptive\"\n readonly display?: \"summarized\" | \"omitted\"\n }\n | {\n readonly type: \"disabled\"\n }\n | ({ readonly type: \"enabled\" } & (\n | { readonly budgetTokens: number; readonly budget_tokens?: number }\n | { readonly budgetTokens?: number; readonly budget_tokens: number }\n ))\n\nexport interface OptionsInput {\n readonly [key: string]: unknown\n readonly thinking?: ThinkingInput\n readonly effort?: string\n}\n\nexport type ProviderOptionsInput = OptionsInput\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst AnthropicCacheControl = Schema.Struct({\n type: Schema.tag(\"ephemeral\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n})\n\nconst AnthropicTextBlock = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTextBlock = Schema.Schema.Type<typeof AnthropicTextBlock>\n\nconst AnthropicImageBlock = Schema.Struct({\n type: Schema.tag(\"image\"),\n source: Schema.Struct({\n type: Schema.tag(\"base64\"),\n media_type: Schema.String,\n data: Schema.String,\n }),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicImageBlock = Schema.Schema.Type<typeof AnthropicImageBlock>\n\nconst AnthropicDocumentBlock = Schema.Struct({\n type: Schema.tag(\"document\"),\n source: Schema.Struct({\n type: Schema.tag(\"base64\"),\n media_type: Schema.Literal(\"application/pdf\"),\n data: Schema.String,\n }),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicDocumentBlock = Schema.Schema.Type<typeof AnthropicDocumentBlock>\n\nconst AnthropicThinkingBlock = Schema.Struct({\n type: Schema.tag(\"thinking\"),\n thinking: Schema.String,\n signature: Schema.optional(Schema.String),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\n// Safety-filtered thinking arrives as an opaque encrypted `data` payload with\n// no visible text. It must round-trip verbatim so multi-turn thinking + tool\n// use conversations keep their reasoning continuity.\nconst AnthropicRedactedThinkingBlock = Schema.Struct({\n type: Schema.tag(\"redacted_thinking\"),\n data: Schema.String,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicToolUseBlock = Schema.Struct({\n type: Schema.tag(\"tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicToolUseBlock = Schema.Schema.Type<typeof AnthropicToolUseBlock>\n\nconst AnthropicServerToolUseBlock = Schema.Struct({\n type: Schema.tag(\"server_tool_use\"),\n id: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolUseBlock = Schema.Schema.Type<typeof AnthropicServerToolUseBlock>\n\n// Server tool result blocks: web_search_tool_result, code_execution_tool_result,\n// and web_fetch_tool_result. The provider executes the tool and inlines the\n// structured result into the assistant turn — there is no client tool_result\n// round-trip. We round-trip the structured `content` payload as opaque JSON so\n// the next request can echo it back when continuing the conversation.\nconst AnthropicServerToolResultType = Schema.Literals([\n \"web_search_tool_result\",\n \"code_execution_tool_result\",\n \"web_fetch_tool_result\",\n])\ntype AnthropicServerToolResultType = Schema.Schema.Type<typeof AnthropicServerToolResultType>\n\nconst AnthropicServerToolResultBlock = Schema.Struct({\n type: AnthropicServerToolResultType,\n tool_use_id: Schema.String,\n content: Schema.Unknown,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicServerToolResultBlock = Schema.Schema.Type<typeof AnthropicServerToolResultBlock>\n\n// Anthropic accepts either a plain string or an ordered array of text, image, and\n// document blocks inside `tool_result.content`. The array form keeps media as native\n// model input instead of JSON-stringifying base64 into prompt text.\nconst AnthropicToolResultContent = Schema.Union([AnthropicTextBlock, AnthropicImageBlock, AnthropicDocumentBlock])\n\nconst AnthropicToolResultBlock = Schema.Struct({\n type: Schema.tag(\"tool_result\"),\n tool_use_id: Schema.String,\n content: Schema.Union([Schema.String, Schema.Array(AnthropicToolResultContent)]),\n is_error: Schema.optional(Schema.Boolean),\n cache_control: Schema.optional(AnthropicCacheControl),\n})\n\nconst AnthropicUserBlock = Schema.Union([\n AnthropicTextBlock,\n AnthropicImageBlock,\n AnthropicDocumentBlock,\n AnthropicToolResultBlock,\n])\ntype AnthropicUserBlock = Schema.Schema.Type<typeof AnthropicUserBlock>\nconst AnthropicAssistantBlock = Schema.Union([\n AnthropicTextBlock,\n AnthropicThinkingBlock,\n AnthropicRedactedThinkingBlock,\n AnthropicToolUseBlock,\n AnthropicServerToolUseBlock,\n AnthropicServerToolResultBlock,\n])\ntype AnthropicAssistantBlock = Schema.Schema.Type<typeof AnthropicAssistantBlock>\ntype AnthropicToolResultBlock = Schema.Schema.Type<typeof AnthropicToolResultBlock>\n\nconst AnthropicMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(AnthropicUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(AnthropicAssistantBlock) }),\n Schema.Struct({ role: Schema.Literal(\"system\"), content: Schema.Array(AnthropicTextBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype AnthropicMessage = Schema.Schema.Type<typeof AnthropicMessage>\n\nconst AnthropicTool = Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n input_schema: JsonObject,\n cache_control: Schema.optional(AnthropicCacheControl),\n})\ntype AnthropicTool = Schema.Schema.Type<typeof AnthropicTool>\n\nconst AnthropicToolChoice = Schema.Union([\n Schema.Struct({ type: Schema.Literals([\"auto\", \"any\", \"none\"]) }),\n Schema.Struct({ type: Schema.tag(\"tool\"), name: Schema.String }),\n])\n\nconst AnthropicThinking = Schema.Union([\n Schema.Struct({\n type: Schema.tag(\"enabled\"),\n budget_tokens: Schema.Number,\n }),\n Schema.Struct({\n type: Schema.tag(\"adaptive\"),\n display: Schema.optional(Schema.Literals([\"summarized\", \"omitted\"])),\n }),\n Schema.Struct({\n type: Schema.tag(\"disabled\"),\n }),\n])\n\nconst AnthropicOutputConfig = Schema.Struct({\n effort: Schema.optional(Schema.String),\n})\n\nconst AnthropicBodyFields = {\n model: Schema.String,\n system: optionalArray(AnthropicTextBlock),\n messages: Schema.Array(AnthropicMessage),\n tools: optionalArray(AnthropicTool),\n tool_choice: Schema.optional(AnthropicToolChoice),\n stream: Schema.Literal(true),\n max_tokens: Schema.Number,\n temperature: Schema.optional(Schema.Number),\n top_p: Schema.optional(Schema.Number),\n top_k: Schema.optional(Schema.Number),\n stop_sequences: optionalArray(Schema.String),\n thinking: Schema.optional(AnthropicThinking),\n output_config: Schema.optional(AnthropicOutputConfig),\n}\nexport const AnthropicMessagesBody = Schema.Struct(AnthropicBodyFields)\nexport type AnthropicMessagesBody = Schema.Schema.Type<typeof AnthropicMessagesBody>\n\nconst AnthropicUsage = Schema.StructWithRest(\n Schema.Struct({\n input_tokens: optionalNull(Schema.Number),\n output_tokens: Schema.optional(Schema.Number),\n cache_creation_input_tokens: optionalNull(Schema.Number),\n cache_read_input_tokens: optionalNull(Schema.Number),\n server_tool_use: optionalNull(\n Schema.StructWithRest(Schema.Struct({ web_search_requests: Schema.optional(Schema.Number) }), [\n Schema.Record(Schema.String, Schema.Unknown),\n ]),\n ),\n output_tokens_details: optionalNull(\n Schema.StructWithRest(Schema.Struct({ thinking_tokens: Schema.optional(Schema.Number) }), [\n Schema.Record(Schema.String, Schema.Unknown),\n ]),\n ),\n }),\n [Schema.Record(Schema.String, Schema.Unknown)],\n)\ntype AnthropicUsage = Schema.Schema.Type<typeof AnthropicUsage>\n\nconst AnthropicStreamBlock = Schema.Struct({\n type: Schema.String,\n id: Schema.optional(Schema.String),\n name: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n // redacted_thinking blocks arrive whole in content_block_start with the\n // encrypted payload in `data`; there is no streaming delta sequence.\n data: Schema.optional(Schema.String),\n input: Schema.optional(Schema.Unknown),\n // *_tool_result blocks arrive whole as content_block_start (no streaming\n // delta) with the structured payload in `content` and the originating\n // server_tool_use id in `tool_use_id`.\n tool_use_id: Schema.optional(Schema.String),\n content: Schema.optional(Schema.Unknown),\n})\n\nconst AnthropicStreamDelta = Schema.Struct({\n type: Schema.optional(Schema.String),\n text: Schema.optional(Schema.String),\n thinking: Schema.optional(Schema.String),\n partial_json: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n stop_reason: optionalNull(Schema.String),\n stop_sequence: optionalNull(Schema.String),\n})\n\nconst AnthropicEvent = Schema.Struct({\n type: Schema.String,\n index: Schema.optional(Schema.Number),\n message: Schema.optional(Schema.Struct({ usage: Schema.optional(AnthropicUsage) })),\n content_block: Schema.optional(AnthropicStreamBlock),\n delta: Schema.optional(AnthropicStreamDelta),\n usage: Schema.optional(AnthropicUsage),\n // `type` and `message` are both required per Anthropic's spec, but\n // OpenAI-compatible proxies and gateway translations occasionally drop one\n // or the other; mark them optional so a partial payload still parses and\n // the parser can fall back to whichever field is populated.\n error: Schema.optional(\n Schema.Struct({ type: Schema.optional(Schema.String), message: Schema.optional(Schema.String) }),\n ),\n})\ntype AnthropicEvent = Schema.Schema.Type<typeof AnthropicEvent>\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n readonly reasoningSignatures: Readonly<Record<number, string>>\n readonly usage?: Usage\n readonly pendingFinish?: {\n readonly reason: FinishReasonDetails\n readonly providerMetadata?: ProviderMetadata\n }\n readonly lifecycle: Lifecycle.State\n}\n\nconst invalid = ProviderShared.invalidRequest\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\n// Anthropic accepts at most 4 explicit cache_control breakpoints per request,\n// across `tools`, `system`, and `messages`. Beyond the cap the API returns a\n// 400 — so the lowering layer counts emitted markers and silently drops any\n// that exceed it.\nconst ANTHROPIC_BREAKPOINT_CAP = 4\n\nconst EPHEMERAL_5M = { type: \"ephemeral\" as const }\nconst EPHEMERAL_1H = { type: \"ephemeral\" as const, ttl: \"1h\" as const }\n\nconst cacheControl = (breakpoints: Cache.Breakpoints, cache: CacheHint | undefined) => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return Cache.ttlBucket(cache.ttlSeconds) === \"1h\" ? EPHEMERAL_1H : EPHEMERAL_5M\n}\n\nconst anthropicMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ anthropic: metadata })\n\nconst signatureFromMetadata = (metadata: ProviderMetadata | undefined): string | undefined => {\n const anthropic = metadata?.anthropic\n if (!ProviderShared.isRecord(anthropic)) return undefined\n return typeof anthropic.signature === \"string\" ? anthropic.signature : undefined\n}\n\nconst redactedDataFromMetadata = (metadata: ProviderMetadata | undefined): string | undefined => {\n const anthropic = metadata?.anthropic\n if (!ProviderShared.isRecord(anthropic)) return undefined\n return typeof anthropic.redactedData === \"string\" ? anthropic.redactedData : undefined\n}\n\nconst lowerTool = (breakpoints: Cache.Breakpoints, tool: ToolDefinition, inputSchema: JsonSchema): AnthropicTool => ({\n name: tool.name,\n description: tool.description,\n input_schema: inputSchema,\n cache_control: cacheControl(breakpoints, tool.cache),\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Anthropic Messages\", toolChoice, {\n auto: () => ({ type: \"auto\" as const }),\n none: () => ({ type: \"none\" as const }),\n required: () => ({ type: \"any\" as const }),\n tool: (name) => ({ type: \"tool\" as const, name }),\n })\n\nconst scrubToolCallID = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, \"_\")\n\nconst lowerToolCall = (part: ToolCallPart): AnthropicToolUseBlock => ({\n type: \"tool_use\",\n id: scrubToolCallID(part.id),\n name: part.name,\n input: part.input,\n})\n\nconst lowerServerToolCall = (part: ToolCallPart): AnthropicServerToolUseBlock => ({\n type: \"server_tool_use\",\n id: scrubToolCallID(part.id),\n name: part.name,\n input: part.input,\n})\n\n// Server tool result blocks are typed by name. Anthropic ships three today;\n// extend this list when new server tools land. The block content is the\n// structured payload returned by the provider, which we round-trip as-is.\nconst serverToolResultType = (name: string): AnthropicServerToolResultType | undefined => {\n if (name === \"web_search\") return \"web_search_tool_result\"\n if (name === \"code_execution\") return \"code_execution_tool_result\"\n if (name === \"web_fetch\") return \"web_fetch_tool_result\"\n return undefined\n}\n\nconst lowerServerToolResult = Effect.fn(\"AnthropicMessages.lowerServerToolResult\")(function* (part: ToolResultPart) {\n const wireType = serverToolResultType(part.name)\n if (!wireType)\n return yield* invalid(`Anthropic Messages does not know how to round-trip server tool result for ${part.name}`)\n // Prefer the provider-owned replay payload; fall back to the result value for\n // histories constructed directly from provider events.\n const payload = part.providerMetadata?.anthropic?.[\"result\"] ?? part.result.value\n return { type: wireType, tool_use_id: scrubToolCallID(part.id), content: payload } satisfies AnthropicServerToolResultBlock\n})\n\nconst lowerMedia = Effect.fn(\"AnthropicMessages.lowerMedia\")(function* (part: MediaPart) {\n const media = ProviderShared.normalizeMedia(part)\n if (media.mime === \"application/pdf\")\n return {\n type: \"document\" as const,\n source: {\n type: \"base64\" as const,\n media_type: \"application/pdf\" as const,\n data: media.base64,\n },\n } satisfies AnthropicDocumentBlock\n if (!media.mime.startsWith(\"image/\"))\n return yield* invalid(`Anthropic Messages does not support media type ${part.mediaType}`)\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: media.mime,\n data: media.base64,\n },\n } satisfies AnthropicImageBlock\n})\n\n// Tool results may carry structured text, images, and documents. Keep media as provider-native\n// content instead of JSON-stringifying base64 into a prompt string.\nconst lowerToolResultContentItem = Effect.fnUntraced(function* (item: Tool.Content) {\n if (item.type === \"text\") return { type: \"text\" as const, text: item.text } satisfies AnthropicTextBlock\n return yield* lowerMedia({ type: \"media\", mediaType: item.mime, data: item.uri, filename: item.name })\n})\n\nconst lowerToolResultContent = Effect.fnUntraced(function* (part: ToolResultPart) {\n // Text / json / error results stay as a string for backward compatibility\n // with existing cassettes and provider expectations.\n if (part.result.type !== \"content\") return ProviderShared.toolResultText(part)\n // Preserve the narrowed array element type when compiled through a consumer package.\n const content: ReadonlyArray<Tool.Content> = part.result.value\n return yield* Effect.forEach(content, lowerToolResultContentItem)\n})\n\n// Mid-conversation system messages became available with Opus 4.8 and version\n// 5 of the other supported Claude families. Treat later family versions as\n// compatible without assuming that every Anthropic Messages model is Claude.\nconst supportsNativeSystemUpdates = (request: LLMRequest) => {\n const match = /(?:^|[./])claude-(fable|haiku|mythos|opus|sonnet)-(\\d+)(?:[.-](\\d+))?/.exec(\n String(request.model.id).toLowerCase(),\n )\n if (!match) return false\n const major = Number(match[2])\n if (match[1] !== \"opus\") return major >= 5\n if (major !== 4) return major >= 5\n return match[3] !== undefined && match[3].length <= 2 && Number(match[3]) >= 8\n}\n\nconst endsInServerToolUse = (message: LLMRequest[\"messages\"][number]) => {\n const last = message.content.at(-1)\n return message.role === \"assistant\" && last?.type === \"tool-call\" && last.providerExecuted === true\n}\n\nconst canUseNativeSystemUpdate = (messages: LLMRequest[\"messages\"], index: number) => {\n const previous = messages[index - 1]\n const next = messages[index + 1]\n return (\n previous !== undefined &&\n previous.role !== \"system\" &&\n (previous.role === \"user\" || previous.role === \"tool\" || endsInServerToolUse(previous)) &&\n next?.role !== \"system\" &&\n (next === undefined || next.role === \"assistant\")\n )\n}\n\nconst splitsLocalToolResults = (messages: LLMRequest[\"messages\"], index: number) => {\n const pending = new Set<string>()\n for (const message of messages.slice(0, index)) {\n for (const part of message.content) {\n if (message.role === \"assistant\" && part.type === \"tool-call\" && part.providerExecuted !== true)\n pending.add(part.id)\n if (message.role === \"tool\" && part.type === \"tool-result\") pending.delete(part.id)\n }\n }\n return pending.size > 0\n}\n\nconst lowerNativeSystemUpdate = Effect.fn(\"AnthropicMessages.lowerNativeSystemUpdate\")(function* (\n message: LLMRequest[\"messages\"][number],\n breakpoints: Cache.Breakpoints,\n) {\n const content = yield* ProviderShared.systemUpdateText(\"Anthropic Messages\", message)\n return {\n role: \"system\" as const,\n content: content.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n })),\n }\n})\n\nconst lowerMessages = Effect.fn(\"AnthropicMessages.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: Cache.Breakpoints,\n) {\n const messages: AnthropicMessage[] = []\n\n for (const [index, message] of request.messages.entries()) {\n if (message.role === \"system\") {\n if (splitsLocalToolResults(request.messages, index))\n return yield* invalid(\"Anthropic Messages system updates cannot split a local tool call from its tool result\")\n if (supportsNativeSystemUpdates(request) && canUseNativeSystemUpdate(request.messages, index)) {\n messages.push(yield* lowerNativeSystemUpdate(message, breakpoints))\n continue\n }\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Anthropic Messages\", message)\n const block = { type: \"text\" as const, text: part.text, cache_control: cacheControl(breakpoints, part.cache) }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, block] }\n else messages.push({ role: \"user\", content: [block] })\n continue\n }\n\n if (message.role === \"user\") {\n const content: AnthropicUserBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* lowerMedia(part))\n continue\n }\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"user\", [\"text\", \"media\"])\n }\n messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: AnthropicAssistantBlock[] = []\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text, cache_control: cacheControl(breakpoints, part.cache) })\n continue\n }\n if (part.type === \"reasoning\") {\n // Mirrors Vercel's @ai-sdk/anthropic: a signature marks visible\n // thinking; only signature-less parts carrying redactedData\n // round-trip as opaque redacted_thinking blocks.\n const signature = part.encrypted ?? signatureFromMetadata(part.providerMetadata)\n const redactedData = redactedDataFromMetadata(part.providerMetadata)\n if (signature === undefined && redactedData !== undefined) {\n content.push({ type: \"redacted_thinking\", data: redactedData })\n continue\n }\n content.push({ type: \"thinking\", thinking: part.text, signature })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(part.providerExecuted ? lowerServerToolCall(part) : lowerToolCall(part))\n continue\n }\n if (part.type === \"tool-result\" && part.providerExecuted) {\n content.push(yield* lowerServerToolResult(part))\n continue\n }\n return yield* invalid(\n `Anthropic Messages assistant messages only support text, reasoning, and tool-call content for now`,\n )\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: AnthropicToolResultBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Anthropic Messages\", \"tool\", [\"tool-result\"])\n content.push({\n type: \"tool_result\",\n tool_use_id: scrubToolCallID(part.id),\n content: yield* lowerToolResultContent(part),\n is_error: part.result.type === \"error\" ? true : undefined,\n cache_control: cacheControl(breakpoints, part.cache),\n })\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\" && previous.content.every((block) => block.type === \"tool_result\"))\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\nconst resolveOptions = Effect.fn(\"AnthropicMessages.resolveOptions\")(function* (request: LLMRequest) {\n const input = request.providerOptions\n return {\n thinking: yield* resolveThinking(input?.thinking),\n effort: typeof input?.effort === \"string\" ? input.effort : undefined,\n }\n})\n\nconst resolveThinking = Effect.fn(\"AnthropicMessages.resolveThinking\")(function* (input: unknown) {\n if (!ProviderShared.isRecord(input)) return undefined\n if (input.type === \"adaptive\") {\n const display =\n input.display === \"summarized\"\n ? (\"summarized\" as const)\n : input.display === \"omitted\"\n ? (\"omitted\" as const)\n : undefined\n return { type: \"adaptive\" as const, ...(display === undefined ? {} : { display }) }\n }\n if (input.type === \"disabled\") return { type: \"disabled\" as const }\n if (input.type !== \"enabled\") return undefined\n const budget =\n typeof input.budgetTokens === \"number\"\n ? input.budgetTokens\n : typeof input.budget_tokens === \"number\"\n ? input.budget_tokens\n : undefined\n if (budget === undefined)\n return yield* ProviderShared.invalidRequest(\"Anthropic thinking provider option requires budgetTokens\")\n return { type: \"enabled\" as const, budget_tokens: budget }\n})\n\nconst fromRequest = Effect.fn(\"AnthropicMessages.fromRequest\")(function* (request: LLMRequest) {\n const generation = request.generation\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n // Allocate the 4-breakpoint budget in invalidation order: tools → system →\n // messages. Tools live highest in the cache hierarchy, so when callers\n // over-mark we keep their tool hints and shed the message-tail ones first.\n const breakpoints = Cache.newBreakpoints(ANTHROPIC_BREAKPOINT_CAP)\n const tools =\n request.tools.length === 0\n ? undefined\n : request.tools.map((tool) =>\n lowerTool(\n breakpoints,\n tool,\n ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility),\n ),\n )\n // Anthropic rejects tool_choice when tools are absent; \"none\" is only meaningful with tools present.\n const toolChoice = tools === undefined || !request.toolChoice ? undefined : yield* lowerToolChoice(request.toolChoice)\n const system =\n request.system.length === 0\n ? undefined\n : request.system.map((part) => ({\n type: \"text\" as const,\n text: part.text,\n cache_control: cacheControl(breakpoints, part.cache),\n }))\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Anthropic Messages: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${ANTHROPIC_BREAKPOINT_CAP} per request.`,\n )\n }\n const options = yield* resolveOptions(request)\n return {\n model: request.model.id,\n system,\n messages,\n tools,\n tool_choice: toolChoice,\n stream: true as const,\n max_tokens: generation?.maxTokens ?? DEFAULT_MAX_TOKENS,\n temperature: generation?.temperature,\n top_p: generation?.topP,\n top_k: generation?.topK,\n stop_sequences: generation?.stop,\n thinking: options.thinking,\n output_config: options.effort === undefined ? undefined : { effort: options.effort },\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string | null | undefined): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\" || reason === \"pause_turn\") return \"stop\"\n if (reason === \"max_tokens\" || reason === \"model_context_window_exceeded\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"refusal\") return \"content-filter\"\n return \"unknown\"\n}\n\n// Anthropic reports the non-overlapping breakdown natively — its\n// `input_tokens` is the *non-cached* count per the Messages API docs, with\n// cache reads and writes as separate fields. We sum them to derive the\n// inclusive `inputTokens` the rest of the contract expects. Extended\n// thinking tokens are included in `output_tokens`; newer responses also\n// expose that subset through `output_tokens_details.thinking_tokens`.\nconst mapUsage = (usage: AnthropicUsage | undefined): Usage | undefined => {\n if (!usage) return undefined\n const nonCached = usage.input_tokens ?? undefined\n const cacheRead = usage.cache_read_input_tokens ?? undefined\n const cacheWrite = usage.cache_creation_input_tokens ?? undefined\n const inputTokens = ProviderShared.sumTokens(nonCached, cacheRead, cacheWrite)\n return new Usage({\n inputTokens,\n outputTokens: usage.output_tokens,\n nonCachedInputTokens: nonCached,\n cacheReadInputTokens: cacheRead,\n cacheWriteInputTokens: cacheWrite,\n reasoningTokens: usage.output_tokens_details?.thinking_tokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, usage.output_tokens, undefined),\n providerMetadata: { anthropic: usage },\n })\n}\n\n// Anthropic emits usage on `message_start` and again on `message_delta` — the\n// final delta carries the authoritative totals. Right-biased merge: each\n// field prefers `right` when defined, falls back to `left`. `inputTokens` is\n// recomputed from the merged breakdown so the inclusive total stays\n// consistent with `nonCached + cacheRead + cacheWrite`.\nconst mergeUsage = (left: Usage | undefined, right: Usage | undefined) => {\n if (!left) return right\n if (!right) return left\n const nonCachedInputTokens = right.nonCachedInputTokens ?? left.nonCachedInputTokens\n const cacheReadInputTokens = right.cacheReadInputTokens ?? left.cacheReadInputTokens\n const cacheWriteInputTokens = right.cacheWriteInputTokens ?? left.cacheWriteInputTokens\n const inputTokens = ProviderShared.sumTokens(nonCachedInputTokens, cacheReadInputTokens, cacheWriteInputTokens)\n const outputTokens = right.outputTokens ?? left.outputTokens\n const reasoningTokens = right.reasoningTokens ?? left.reasoningTokens\n return new Usage({\n inputTokens,\n outputTokens,\n nonCachedInputTokens,\n cacheReadInputTokens,\n cacheWriteInputTokens,\n reasoningTokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, outputTokens, undefined),\n providerMetadata: {\n anthropic: mergeJsonRecords(left.providerMetadata?.[\"anthropic\"], right.providerMetadata?.[\"anthropic\"]) ?? {},\n },\n })\n}\n\n// Server tool result blocks come whole in `content_block_start` (no streaming\n// delta sequence). We convert the payload to a `tool-result` event with\n// `providerExecuted: true`. The runtime appends it to the assistant message\n// for round-trip; downstream consumers can inspect `result.value` for the\n// structured payload.\nconst SERVER_TOOL_RESULT_NAMES: Record<AnthropicServerToolResultType, string> = {\n web_search_tool_result: \"web_search\",\n code_execution_tool_result: \"code_execution\",\n web_fetch_tool_result: \"web_fetch\",\n}\n\nconst isServerToolResultType = (type: string): type is AnthropicServerToolResultType => type in SERVER_TOOL_RESULT_NAMES\n\nconst serverToolResultEvent = (block: NonNullable<AnthropicEvent[\"content_block\"]>): LLMEvent | undefined => {\n if (!block.type || !isServerToolResultType(block.type)) return undefined\n const errorPayload =\n typeof block.content === \"object\" && block.content !== null && \"type\" in block.content\n ? String((block.content as Record<string, unknown>).type)\n : \"\"\n const isError = errorPayload.endsWith(\"_tool_result_error\")\n return LLMEvent.toolResult({\n id: block.tool_use_id ?? \"\",\n name: SERVER_TOOL_RESULT_NAMES[block.type],\n result: isError ? { type: \"error\", value: block.content } : { type: \"json\", value: block.content },\n providerExecuted: true,\n // The complete payload is irreducible provider replay state: subsequent\n // stateless requests must round-trip the typed result block verbatim.\n providerMetadata: anthropicMetadata({ blockType: block.type, result: block.content }),\n })\n}\n\ntype StepResult = readonly [ParserState, ReadonlyArray<LLMEvent>]\n\nconst NO_EVENTS: StepResult[\"1\"] = []\n\nconst onMessageStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mapUsage(event.message?.usage)\n return [usage ? { ...state, usage: mergeUsage(state.usage, usage) } : state, NO_EVENTS]\n}\n\nconst onContentBlockStart = (state: ParserState, event: AnthropicEvent): StepResult => {\n const block = event.content_block\n if (!block) return [state, NO_EVENTS]\n\n if ((block.type === \"tool_use\" || block.type === \"server_tool_use\") && event.index !== undefined) {\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, event.index, {\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n input:\n block.input !== undefined && (!ProviderShared.isRecord(block.input) || Object.keys(block.input).length > 0)\n ? ProviderShared.encodeJson(block.input)\n : undefined,\n providerExecuted: block.type === \"server_tool_use\",\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: block.id ?? String(event.index),\n name: block.name ?? \"\",\n providerExecuted: block.type === \"server_tool_use\" ? true : undefined,\n }),\n ],\n ]\n }\n\n if (block.type === \"text\" && block.text !== undefined) {\n const events: LLMEvent[] = []\n const id = `text-${event.index ?? 0}`\n const lifecycle = Lifecycle.textStart(state.lifecycle, events, id)\n return [\n { ...state, lifecycle: block.text ? Lifecycle.textDelta(lifecycle, events, id, block.text) : lifecycle },\n events,\n ]\n }\n\n if (block.type === \"thinking\" && block.thinking !== undefined) {\n const events: LLMEvent[] = []\n const id = `reasoning-${event.index ?? 0}`\n const providerMetadata =\n block.signature === undefined ? undefined : anthropicMetadata({ signature: block.signature })\n const lifecycle = Lifecycle.reasoningStart(state.lifecycle, events, id, providerMetadata)\n return [\n {\n ...state,\n lifecycle: block.thinking\n ? Lifecycle.reasoningDelta(lifecycle, events, id, block.thinking, providerMetadata)\n : lifecycle,\n reasoningSignatures:\n event.index === undefined || block.signature === undefined\n ? state.reasoningSignatures\n : { ...state.reasoningSignatures, [event.index]: block.signature },\n },\n events,\n ]\n }\n\n // Redacted thinking surfaces as an empty reasoning part carrying the opaque\n // payload as `redactedData` metadata (same model as Vercel's\n // @ai-sdk/anthropic). The existing content_block_stop closes the part.\n if (block.type === \"redacted_thinking\" && block.data !== undefined) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningStart(\n state.lifecycle,\n events,\n `reasoning-${event.index ?? 0}`,\n anthropicMetadata({ redactedData: block.data }),\n ),\n },\n events,\n ]\n }\n\n const result = serverToolResultEvent(block)\n if (!result) return [state, NO_EVENTS]\n const events: LLMEvent[] = []\n return [{ ...state, lifecycle: Lifecycle.stepStart(state.lifecycle, events) }, [...events, result]]\n}\n\nconst onContentBlockDelta = Effect.fn(\"AnthropicMessages.onContentBlockDelta\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n const delta = event.delta\n\n if (delta?.type === \"text_delta\" && delta.text) {\n const events: LLMEvent[] = []\n return [\n { ...state, lifecycle: Lifecycle.textDelta(state.lifecycle, events, `text-${event.index ?? 0}`, delta.text) },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"thinking_delta\" && delta.thinking) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.reasoningDelta(state.lifecycle, events, `reasoning-${event.index ?? 0}`, delta.thinking),\n },\n events,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"signature_delta\" && delta.signature) {\n const index = event.index ?? 0\n return [\n {\n ...state,\n reasoningSignatures: { ...state.reasoningSignatures, [index]: delta.signature },\n },\n NO_EVENTS,\n ] satisfies StepResult\n }\n\n if (delta?.type === \"input_json_delta\" && event.index !== undefined) {\n if (!delta.partial_json) return [state, NO_EVENTS] satisfies StepResult\n if (!state.tools[event.index]) return [state, NO_EVENTS] satisfies StepResult\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n event.index,\n delta.partial_json,\n \"Anthropic Messages tool argument delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] satisfies StepResult\n }\n\n return [state, NO_EVENTS] satisfies StepResult\n})\n\nconst onContentBlockStop = Effect.fn(\"AnthropicMessages.onContentBlockStop\")(function* (\n state: ParserState,\n event: AnthropicEvent,\n) {\n if (event.index === undefined) return [state, NO_EVENTS] satisfies StepResult\n const result = yield* ToolStream.finish(ADAPTER, state.tools, event.index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const signature = state.reasoningSignatures[event.index]\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${event.index}`),\n events,\n `reasoning-${event.index}`,\n signature === undefined ? undefined : anthropicMetadata({ signature }),\n )\n events.push(...resultEvents)\n const reasoningSignatures = { ...state.reasoningSignatures }\n delete reasoningSignatures[event.index]\n return [{ ...state, lifecycle, tools: result.tools, reasoningSignatures }, events] satisfies StepResult\n})\n\nconst onMessageDelta = (state: ParserState, event: AnthropicEvent): StepResult => {\n const usage = mergeUsage(state.usage, mapUsage(event.usage))\n return [\n {\n ...state,\n usage,\n pendingFinish: {\n reason: {\n normalized: mapFinishReason(event.delta?.stop_reason),\n raw: event.delta?.stop_reason ?? undefined,\n },\n providerMetadata:\n event.delta?.stop_sequence === null || event.delta?.stop_sequence === undefined\n ? undefined\n : anthropicMetadata({ stopSequence: event.delta.stop_sequence }),\n },\n },\n NO_EVENTS,\n ]\n}\n\nconst onMessageStop = Effect.fn(\"AnthropicMessages.onMessageStop\")(function* (state: ParserState) {\n const result = yield* ToolStream.finishAll(ADAPTER, state.tools)\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n const finished = Lifecycle.finish(lifecycle, events, {\n reason: state.pendingFinish?.reason ?? {\n normalized: \"unknown\",\n raw: undefined,\n },\n usage: state.usage,\n providerMetadata: state.pendingFinish?.providerMetadata,\n })\n return [{ ...state, lifecycle: finished, tools: result.tools }, events] satisfies StepResult\n})\n\n// Prefix `error.type` so overloads, rate limits, and quota errors are visible\n// even when the provider message is generic or empty.\nconst providerErrorMessage = (event: AnthropicEvent): string => {\n const type = event.error?.type\n const message = event.error?.message\n if (type && message) return `${type}: ${message}`\n return message || type || \"Anthropic Messages stream error\"\n}\n\nconst onError = (event: AnthropicEvent) =>\n new AIError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({ message: providerErrorMessage(event), code: event.error?.type }),\n })\n\nconst step = (state: ParserState, event: AnthropicEvent) => {\n if (event.type === \"message_start\") return Effect.succeed(onMessageStart(state, event))\n if (event.type === \"content_block_start\") return Effect.succeed(onContentBlockStart(state, event))\n if (event.type === \"content_block_delta\") return onContentBlockDelta(state, event)\n if (event.type === \"content_block_stop\") return onContentBlockStop(state, event)\n if (event.type === \"message_delta\") return Effect.succeed(onMessageDelta(state, event))\n if (event.type === \"message_stop\") return onMessageStop(state)\n if (event.type === \"error\") return onError(event)\n return Effect.succeed<StepResult>([state, NO_EVENTS])\n}\n\n// =============================================================================\n// Protocol And Anthropic Route\n// =============================================================================\n/**\n * The Anthropic Messages protocol — request body construction, body schema,\n * and the streaming-event state machine shared by Anthropic-compatible and\n * Vertex-hosted Messages routes.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: AnthropicMessagesBody,\n from: fromRequest,\n },\n stream: {\n event: Protocol.jsonEvent(AnthropicEvent),\n initial: () => ({\n tools: ToolStream.empty<number>(),\n reasoningSignatures: {},\n lifecycle: Lifecycle.initial(),\n }),\n step,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"anthropic\",\n providerMetadataKey: \"anthropic\",\n protocol,\n endpoint: Endpoint.path(PATH, { baseURL: DEFAULT_BASE_URL }),\n auth: Auth.none,\n framing,\n headers: () => ({ \"anthropic-version\": \"2023-06-01\" }),\n})\n\nexport * as AnthropicMessages from \"./anthropic-messages.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E2F7E556908E00E264756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/config/mcp.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ConfigMCP from \"./mcp.js\"\n\nimport { Schema } from \"effect\"\nimport { Mcp } from \"../mcp.js\"\nimport { optional } from \"../schema.js\"\n\nexport const Timeout = Mcp.TimeoutConfig\nexport type Timeout = Mcp.TimeoutConfig\nexport const Local = Mcp.LocalConfig\nexport type Local = Mcp.LocalConfig\nexport const OAuth = Mcp.OAuthConfig\nexport type OAuth = Mcp.OAuthConfig\nexport const Remote = Mcp.RemoteConfig\nexport type Remote = Mcp.RemoteConfig\nexport const Server = Mcp.ServerConfig\n\nexport class Info extends Schema.Class<Info>(\"Config.MCP\")({\n timeout: Timeout.pipe(optional),\n servers: Schema.Record(Schema.String, Server).pipe(optional),\n}) {}\n" | ||
| ], | ||
| "mappings": ";2TAMO,IAAM,EAAU,EAAI,cAEd,EAAQ,EAAI,YAEZ,EAAQ,EAAI,YAEZ,EAAS,EAAI,aAEb,EAAS,EAAI,aAEnB,MAAM,UAAa,EAAO,MAAY,YAAY,EAAE,CACzD,QAAS,EAAQ,KAAK,CAAQ,EAC9B,QAAS,EAAO,OAAO,EAAO,OAAQ,CAAM,EAAE,KAAK,CAAQ,CAC7D,CAAC,CAAE,CAAC", | ||
| "debugId": "74C0E71E547EDCDA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../util/src/bom.ts", "../util/src/patch.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Bom from \"./bom.js\"\n\nimport { Effect } from \"effect\"\nimport { FSUtil } from \"./fs-util.js\"\n\nconst code = 0xfeff\nconst value = String.fromCharCode(code)\n\nexport function split(text: string) {\n const stripped = text.replace(/^\\uFEFF+/, \"\")\n return { bom: stripped.length !== text.length, text: stripped }\n}\n\nexport function join(text: string, bom: boolean) {\n const stripped = split(text).text\n return bom ? value + stripped : stripped\n}\n\nexport function has(content: Uint8Array) {\n return content[0] === 0xef && content[1] === 0xbb && content[2] === 0xbf\n}\n\nexport function decodeBytes(content: Uint8Array) {\n return split(decode(content))\n}\n\nexport function syncBytes(content: Uint8Array, bom: boolean) {\n const decoded = decode(content)\n const current = split(decoded)\n const canonical = join(current.text, bom)\n return { text: current.text, bytes: decoded === canonical ? undefined : new TextEncoder().encode(canonical) }\n}\n\nexport const readFile = Effect.fn(\"Bom.readFile\")(function* (fs: FSUtil.Interface, filepath: string) {\n return decodeBytes(yield* fs.readFile(filepath))\n})\n\nexport const syncFile = Effect.fn(\"Bom.syncFile\")(function* (fs: FSUtil.Interface, filepath: string, bom: boolean) {\n const synced = syncBytes(yield* fs.readFile(filepath), bom)\n if (synced.bytes) yield* fs.writeWithDirs(filepath, synced.bytes)\n return synced.text\n})\n\nfunction decode(content: Uint8Array) {\n return new TextDecoder(\"utf-8\", { ignoreBOM: true }).decode(content)\n}\n", | ||
| "export * as Patch from \"./patch.js\"\n\nimport { Result, Schema } from \"effect\"\nimport { Bom } from \"./bom.js\"\n\nexport class BoundaryError extends Schema.TaggedError<BoundaryError>()(\"Patch.BoundaryError\", {\n boundary: Schema.Literals([\"first\", \"last\"]),\n}) {\n override get message() {\n return `The ${this.boundary} line of the patch must be '${this.boundary === \"first\" ? \"*** Begin Patch\" : \"*** End Patch\"}'`\n }\n}\n\nexport class InvalidHunkError extends Schema.TaggedError<InvalidHunkError>()(\"Patch.InvalidHunkError\", {\n line: Schema.String,\n lineNumber: Schema.Number,\n reason: Schema.optional(Schema.String),\n}) {\n override get message() {\n if (this.reason) return `Invalid hunk at line ${this.lineNumber}: ${this.reason}`\n return `Invalid hunk at line ${this.lineNumber}: '${this.line}' is not a valid hunk header. Valid hunk headers: '*** Add File: {path}', '*** Delete File: {path}', '*** Update File: {path}'`\n }\n}\n\nexport type ParseError = BoundaryError | InvalidHunkError\n\nexport type Hunk =\n | { readonly type: \"add\"; readonly path: string; readonly contents: string }\n | { readonly type: \"delete\"; readonly path: string }\n | {\n readonly type: \"update\"\n readonly path: string\n readonly movePath?: string\n readonly chunks: ReadonlyArray<UpdateFileChunk>\n }\n\nexport interface UpdateFileChunk {\n readonly oldLines: ReadonlyArray<string>\n readonly newLines: ReadonlyArray<string>\n readonly changeContext?: string\n readonly endOfFile?: boolean\n}\n\nexport interface FileUpdate {\n readonly content: string\n readonly bom: boolean\n}\n\nexport function parse(patchText: string): Result.Result<ReadonlyArray<Hunk>, ParseError> {\n const lines = stripHeredoc(patchText.trim())\n .split(\"\\n\")\n .map((line) => (line.endsWith(\"\\r\") ? line.slice(0, -1) : line))\n const begin = lines[0]?.trim() === \"*** Begin Patch\" ? 0 : -1\n const end = lines.at(-1)?.trim() === \"*** End Patch\" ? lines.length - 1 : -1\n if (begin === -1) return Result.fail(new BoundaryError({ boundary: \"first\" }))\n if (end === -1 || begin >= end) return Result.fail(new BoundaryError({ boundary: \"last\" }))\n\n const hunks: Hunk[] = []\n let index = begin + 1\n while (index < end) {\n const line = lines[index]!\n const header = line.trim()\n if (\n index === begin + 1 &&\n header.startsWith(\"*** Environment ID:\") &&\n header.slice(\"*** Environment ID:\".length).trim()\n ) {\n index++\n continue\n }\n if (header.startsWith(\"*** Add File: \")) {\n const path = header.slice(\"*** Add File: \".length).trim()\n const parsed = parseAdd(lines, index + 1, end, path)\n if (\"error\" in parsed) return Result.fail(parsed.error)\n hunks.push({ type: \"add\", path, contents: parsed.content })\n index = parsed.next\n continue\n }\n if (header.startsWith(\"*** Delete File: \")) {\n const path = header.slice(\"*** Delete File: \".length).trim()\n const next = lines[index + 1]?.trim()\n if (index + 1 < end && next !== undefined && !isBoundary(next)) {\n if (next.startsWith(\"*** \")) {\n return Result.fail(new InvalidHunkError({ line: next, lineNumber: index + 2 }))\n }\n return Result.fail(\n new InvalidHunkError({\n line: next,\n lineNumber: index + 2,\n reason: `Unexpected line after Delete File '${path}': '${next}'. Delete hunks do not contain body lines`,\n }),\n )\n }\n hunks.push({ type: \"delete\", path })\n index++\n continue\n }\n if (header.startsWith(\"*** Update File: \")) {\n const path = header.slice(\"*** Update File: \".length).trim()\n let next = index + 1\n let movePath: string | undefined\n while (lines[next]?.trimEnd() === \"*** End of File\") next++\n const move = lines[next]?.trimEnd()\n if (move === \"*** Move to:\" || move?.startsWith(\"*** Move to: \")) {\n movePath = move.slice(\"*** Move to: \".length).trim()\n if (!movePath) {\n return Result.fail(\n new InvalidHunkError({\n line: lines[next]!.trim(),\n lineNumber: next + 1,\n reason: `Move destination for '${path}' must not be empty`,\n }),\n )\n }\n next++\n }\n const parsed = parseUpdate(lines, next, end, path, index)\n if (\"error\" in parsed) return Result.fail(parsed.error)\n hunks.push({ type: \"update\", path, movePath, chunks: parsed.chunks })\n index = parsed.next\n continue\n }\n return Result.fail(new InvalidHunkError({ line: header, lineNumber: index + 1 }))\n }\n return Result.succeed(hunks)\n}\n\nexport function derive(path: string, chunks: ReadonlyArray<UpdateFileChunk>, original: string): FileUpdate {\n const source = Bom.split(original)\n const lines = source.text.split(\"\\n\")\n if (lines.at(-1) === \"\") lines.pop()\n const replacements = computeReplacements(lines, path, chunks)\n const updated = [...lines]\n for (const [start, remove, insert] of replacements.toReversed()) updated.splice(start, remove, ...insert)\n if (updated.at(-1) !== \"\") updated.push(\"\")\n const next = Bom.split(updated.join(\"\\n\"))\n return { content: next.text, bom: source.bom || next.bom }\n}\n\nexport function joinBom(text: string, bom: boolean) {\n return Bom.join(text, bom)\n}\n\nfunction parseAdd(\n lines: ReadonlyArray<string>,\n start: number,\n end: number,\n path: string,\n): { content: string; next: number } | { error: InvalidHunkError } {\n const content: string[] = []\n let index = start\n while (index < end && !isBoundary(lines[index]!.trim())) {\n if (!lines[index]!.startsWith(\"+\")) {\n const line = lines[index]!.trim()\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: `Invalid Add File line for '${path}': expected a line starting with '+', got '${line}'`,\n }),\n }\n }\n content.push(lines[index]!.slice(1))\n index++\n }\n return { content: content.join(\"\\n\"), next: index }\n}\n\nfunction parseUpdate(\n lines: ReadonlyArray<string>,\n start: number,\n end: number,\n path: string,\n hunk: number,\n): { chunks: ReadonlyArray<UpdateFileChunk>; next: number } | { error: InvalidHunkError } {\n const chunks: Array<{\n oldLines: string[]\n newLines: string[]\n changeContext?: string\n endOfFile?: boolean\n }> = []\n let index = start\n let afterEndOfFile = false\n while (index < end) {\n const line = lines[index]!\n const updateLine = line.trimEnd()\n if (afterEndOfFile) {\n if (updateLine === \"\") {\n index++\n continue\n }\n if (updateLine === \"@@\" || updateLine.startsWith(\"@@ \")) afterEndOfFile = false\n else if (isBoundary(updateLine)) break\n else {\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: `Expected update hunk to start with a @@ context marker, got: '${line}'`,\n }),\n }\n }\n }\n if (updateLine === \"*** End of File\") {\n const chunk = chunks.at(-1)\n if (chunk && chunk.oldLines.length === 0 && chunk.newLines.length === 0) {\n return {\n error: new InvalidHunkError({\n line: updateLine,\n lineNumber: index + 1,\n reason: \"Update hunk does not contain any lines\",\n }),\n }\n }\n if (chunk) {\n chunk.endOfFile = true\n afterEndOfFile = true\n }\n index++\n continue\n }\n if (isBoundary(updateLine)) break\n if (updateLine === \"@@\" || updateLine.startsWith(\"@@ \")) {\n const previous = chunks.at(-1)\n if (previous && previous.oldLines.length === 0 && previous.newLines.length === 0) {\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n }),\n }\n }\n chunks.push({\n oldLines: [],\n newLines: [],\n changeContext: updateLine === \"@@\" ? undefined : updateLine.slice(\"@@ \".length),\n })\n index++\n continue\n }\n if (chunks.length === 0) chunks.push({ oldLines: [], newLines: [] })\n const chunk = chunks.at(-1)!\n if (line === \"\") {\n chunk.oldLines.push(\"\")\n chunk.newLines.push(\"\")\n index++\n continue\n }\n if (line.startsWith(\" \")) {\n chunk.oldLines.push(line.slice(1))\n chunk.newLines.push(line.slice(1))\n index++\n continue\n }\n if (line.startsWith(\"-\")) {\n chunk.oldLines.push(line.slice(1))\n index++\n continue\n }\n if (line.startsWith(\"+\")) {\n chunk.newLines.push(line.slice(1))\n index++\n continue\n }\n const populated = chunk.oldLines.length > 0 || chunk.newLines.length > 0\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason: populated\n ? `Expected update hunk to start with a @@ context marker, got: '${line}'`\n : `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n }),\n }\n }\n if (chunks.length === 0) {\n return {\n error: new InvalidHunkError({\n line: lines[hunk]!.trim(),\n lineNumber: hunk + 1,\n reason: `Update file hunk for path '${path}' is empty`,\n }),\n }\n }\n const last = chunks.at(-1)!\n if (last.oldLines.length === 0 && last.newLines.length === 0) {\n const line = lines[index]!.trim()\n return {\n error: new InvalidHunkError({\n line,\n lineNumber: index + 1,\n reason:\n line === \"*** End Patch\"\n ? \"Update hunk does not contain any lines\"\n : `Unexpected line found in update hunk: '${line}'. Every line should start with ' ' (context line), '+' (added line), or '-' (removed line)`,\n }),\n }\n }\n return { chunks, next: index }\n}\n\nfunction isBoundary(line: string) {\n return (\n line === \"*** End Patch\" ||\n line.startsWith(\"*** Add File: \") ||\n line.startsWith(\"*** Delete File: \") ||\n line.startsWith(\"*** Update File: \")\n )\n}\n\nfunction computeReplacements(lines: ReadonlyArray<string>, path: string, chunks: ReadonlyArray<UpdateFileChunk>) {\n const replacements: Array<readonly [start: number, remove: number, insert: ReadonlyArray<string>]> = []\n let lineIndex = 0\n for (const chunk of chunks) {\n if (chunk.changeContext) {\n const context = seek(lines, [chunk.changeContext], lineIndex)\n if (context === -1) throw new Error(`Failed to find context '${chunk.changeContext}' in ${path}`)\n lineIndex = context + 1\n }\n if (chunk.oldLines.length === 0) {\n replacements.push([lines.length, 0, chunk.newLines])\n continue\n }\n let oldLines = chunk.oldLines\n let newLines = chunk.newLines\n let found = seek(lines, oldLines, lineIndex, chunk.endOfFile)\n if (found === -1 && oldLines.at(-1) === \"\") {\n oldLines = oldLines.slice(0, -1)\n if (newLines.at(-1) === \"\") newLines = newLines.slice(0, -1)\n found = seek(lines, oldLines, lineIndex, chunk.endOfFile)\n }\n if (found === -1 && chunk.oldLines.every((line) => line === \"\")) {\n const expected =\n chunk.oldLines.length === 1 ? \"an expected blank line\" : `${chunk.oldLines.length} consecutive blank lines`\n throw new Error(`Failed to find ${expected} in ${path}`)\n }\n if (found === -1) throw new Error(`Failed to find expected lines in ${path}:\\n${chunk.oldLines.join(\"\\n\")}`)\n replacements.push([found, oldLines.length, newLines])\n lineIndex = found + oldLines.length\n }\n return replacements.toSorted((left, right) => left[0] - right[0])\n}\n\nfunction seek(lines: ReadonlyArray<string>, pattern: ReadonlyArray<string>, start: number, eof = false) {\n if (pattern.length === 0) return -1\n if (eof) {\n const offset = lines.length - pattern.length\n if (offset < start) return -1\n for (const compare of [exact, rstrip, trim, normalized]) {\n if (matches(lines, pattern, offset, compare)) return offset\n }\n return -1\n }\n for (const compare of [exact, rstrip, trim, normalized]) {\n for (let offset = start; offset <= lines.length - pattern.length; offset++) {\n if (matches(lines, pattern, offset, compare)) return offset\n }\n }\n return -1\n}\n\nfunction matches(\n lines: ReadonlyArray<string>,\n pattern: ReadonlyArray<string>,\n offset: number,\n compare: (left: string, right: string) => boolean,\n) {\n return pattern.every((line, index) => compare(lines[offset + index]!, line))\n}\n\nconst exact = (left: string, right: string) => left === right\nconst rstrip = (left: string, right: string) => left.trimEnd() === right.trimEnd()\nconst trim = (left: string, right: string) => left.trim() === right.trim()\nconst normalized = (left: string, right: string) => normalize(left.trim()) === normalize(right.trim())\nconst normalize = (value: string) =>\n value\n .replace(/[‘’‚‛]/g, \"'\")\n .replace(/[“”„‟]/g, '\"')\n .replace(/[‐‑‒–—―−]/g, \"-\")\n .replace(/[\\u00A0\\u2002-\\u200A\\u202F\\u205F\\u3000]/g, \" \")\nconst stripHeredoc = (input: string) => input.match(/^(?:cat\\s+)?<<(['\"]?)(\\w+)\\1\\s*\\n([\\s\\S]*?)\\n\\2\\s*$/)?.[3] ?? input\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "81686354BD4963C164756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["../util/src/session-title-fallback.ts"], | ||
| "sourcesContent": [ | ||
| "export * as SessionTitleFallback from \"./session-title-fallback.js\"\n\nconst pattern = /^(New session|Child session) - \\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/\n\ninterface Info {\n readonly title?: string\n readonly parentID?: string\n readonly time: {\n readonly created: number\n }\n}\n\n/** Supplies the timestamped title required by compatibility surfaces. */\nexport function withTimestampedFallback(info: Info) {\n return info.title ?? fallback(info)\n}\n\n/** Supplies a compact human label and collapses historical timestamped fallbacks. */\nexport function displayLabel(info: Pick<Info, \"title\" | \"parentID\">) {\n if (!info.title) return info.parentID ? \"Child session\" : \"New session\"\n return info.title.match(pattern)?.[1] ?? info.title\n}\n\n/** Recognizes missing and historical root or child fallback titles. */\nexport function isFallbackTitle(title?: string) {\n return title === undefined || pattern.test(title)\n}\n\n/** Recognizes a missing title or the exact root fallback for this session. */\nexport function isExactRootFallback(info: Pick<Info, \"title\" | \"time\">) {\n return info.title === undefined || info.title === fallback({ time: info.time })\n}\n\nfunction fallback(info: Pick<Info, \"parentID\" | \"time\">) {\n return `${info.parentID ? \"Child\" : \"New\"} session - ${new Date(info.time.created).toISOString()}`\n}\n" | ||
| ], | ||
| "mappings": ";AAEA,IAAM,EAAU,8EAWT,SAAS,CAAuB,CAAC,EAAY,CAClD,OAAO,EAAK,OAAS,EAAS,CAAI,EAU7B,SAAS,CAAe,CAAC,EAAgB,CAC9C,OAAO,IAAU,QAAa,EAAQ,KAAK,CAAK,EAI3C,SAAS,CAAmB,CAAC,EAAoC,CACtE,OAAO,EAAK,QAAU,QAAa,EAAK,QAAU,EAAS,CAAE,KAAM,EAAK,IAAK,CAAC,EAGhF,SAAS,CAAQ,CAAC,EAAuC,CACvD,MAAO,GAAG,EAAK,SAAW,QAAU,mBAAmB,IAAI,KAAK,EAAK,KAAK,OAAO,EAAE,YAAY", | ||
| "debugId": "577682F9CE7F0C3064756E2164756E21", | ||
| "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": "FC10E28344FB428764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "BF19D71C8F0E14B764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/bedrock-auth.ts"], | ||
| "sourcesContent": [ | ||
| "import { AwsV4Signer } from \"aws4fetch\"\nimport { Effect } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Auth, type AuthInput } from \"../../route/auth.js\"\nimport { ProviderShared } from \"../shared.js\"\n\n/**\n * AWS credentials for SigV4 signing. Bedrock also supports Bearer API key auth,\n * which provider facades configure as route auth instead of SigV4. STS-vended\n * credentials should be refreshed by the consumer (rebuild the model) before\n * they expire; the route does not refresh.\n */\nexport interface Credentials {\n readonly region: string\n readonly accessKeyId: string\n readonly secretAccessKey: string\n readonly sessionToken?: string\n}\n\nconst signRequest = (input: {\n readonly url: string\n readonly body: string\n readonly headers: Headers.Headers\n readonly credentials: Credentials\n readonly service: string\n readonly name: string\n}) =>\n Effect.tryPromise({\n try: async () => {\n const signed = await new AwsV4Signer({\n url: input.url,\n method: \"POST\",\n headers: Object.entries(input.headers),\n body: input.body,\n region: input.credentials.region,\n accessKeyId: input.credentials.accessKeyId,\n secretAccessKey: input.credentials.secretAccessKey,\n sessionToken: input.credentials.sessionToken,\n service: input.service,\n }).sign()\n return Object.fromEntries(signed.headers.entries())\n },\n catch: (error) =>\n ProviderShared.invalidRequest(\n `${input.name} SigV4 signing failed: ${error instanceof Error ? error.message : String(error)}`,\n ),\n })\n\n/** Sign the exact JSON bytes with SigV4 using credentials configured on the route. */\nexport const sigV4 = (\n credentials: Credentials | undefined,\n options: { readonly service?: string; readonly name?: string } = {},\n) =>\n Auth.custom((input: AuthInput) => {\n return Effect.gen(function* () {\n if (!credentials) {\n return yield* ProviderShared.invalidRequest(\n `${options.name ?? \"Bedrock Converse\"} requires either route bearer auth or AWS credentials configured on the route`,\n )\n }\n const headersForSigning = Headers.set(input.headers, \"content-type\", \"application/json\")\n const signed = yield* signRequest({\n url: input.url,\n body: input.body,\n headers: headersForSigning,\n credentials,\n service: options.service ?? \"bedrock\",\n name: options.name ?? \"Bedrock Converse\",\n })\n return Headers.setAll(headersForSigning, signed)\n })\n })\n\n/** Bedrock route auth defaults to SigV4 and expects credentials from route configuration. */\nexport const auth = sigV4(undefined)\n\nexport * as BedrockAuth from \"./bedrock-auth.js\"\n" | ||
| ], | ||
| "mappings": ";qUAmBA,IAAM,EAAc,CAAC,IAQnB,EAAO,WAAW,CAChB,IAAK,SAAY,CACf,IAAM,EAAS,MAAM,IAAI,EAAY,CACnC,IAAK,EAAM,IACX,OAAQ,OACR,QAAS,OAAO,QAAQ,EAAM,OAAO,EACrC,KAAM,EAAM,KACZ,OAAQ,EAAM,YAAY,OAC1B,YAAa,EAAM,YAAY,YAC/B,gBAAiB,EAAM,YAAY,gBACnC,aAAc,EAAM,YAAY,aAChC,QAAS,EAAM,OACjB,CAAC,EAAE,KAAK,EACR,OAAO,OAAO,YAAY,EAAO,QAAQ,QAAQ,CAAC,GAEpD,MAAO,CAAC,IACN,EAAe,eACb,GAAG,EAAM,8BAA8B,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,GAC9F,CACJ,CAAC,EAGU,EAAQ,CACnB,EACA,EAAiE,CAAC,IAElE,EAAK,OAAO,CAAC,IACJ,EAAO,IAAI,SAAU,EAAG,CAC7B,GAAI,CAAC,EACH,OAAO,MAAO,EAAe,eAC3B,GAAG,EAAQ,MAAQ,iGACrB,EAEF,IAAM,EAAoB,EAAQ,IAAI,EAAM,QAAS,eAAgB,kBAAkB,EACjF,EAAS,MAAO,EAAY,CAChC,IAAK,EAAM,IACX,KAAM,EAAM,KACZ,QAAS,EACT,cACA,QAAS,EAAQ,SAAW,UAC5B,KAAM,EAAQ,MAAQ,kBACxB,CAAC,EACD,OAAO,EAAQ,OAAO,EAAmB,CAAM,EAChD,CACF,EAGU,EAAO,EAAM,MAAS", | ||
| "debugId": "7773E0A9E5FEB01664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/openai-image.ts", "../ai/src/protocols/open-responses-channel.ts", "../ai/src/protocols/openai-responses-channel.ts", "../ai/src/protocols/openai-responses.ts"], | ||
| "sourcesContent": [ | ||
| "import { Schema } from \"effect\"\n\nconst dimensions = (value: string) => {\n const match = /^(\\d+)x(\\d+)$/.exec(value)\n if (!match) return undefined\n return { width: Number(match[1]), height: Number(match[2]) }\n}\n\nexport const Size = Schema.String.check(\n Schema.makeFilter((value) => {\n if (value === \"auto\") return undefined\n const parsed = dimensions(value)\n if (!parsed) return \"image size must be `auto` or `{width}x{height}`\"\n return parsed.width > 0 && parsed.height > 0 ? undefined : \"image dimensions must be positive integers\"\n }),\n)\n\nexport const OpenAIImage = {\n Size,\n} as const\n", | ||
| "import { Effect, Schema, Stream } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Framing } from \"../route/framing.js\"\nimport {\n HttpTransport,\n WebSocketTransport,\n type Transport,\n type WebSocketChannelDriver,\n type WebSocketChannelExchange,\n} from \"../route/transport/index.js\"\nimport * as ProviderShared from \"./shared.js\"\nimport { OpenResponses } from \"./open-responses.js\"\n\nconst WebSocketResponseCreate = Schema.StructWithRest(Schema.Struct({ type: Schema.tag(\"response.create\") }), [\n Schema.Record(Schema.String, Schema.Unknown),\n])\nconst decodeMessage = ProviderShared.validateWith(Schema.decodeUnknownEffect(WebSocketResponseCreate))\nconst encodeMessage = Schema.encodeSync(Schema.fromJsonString(WebSocketResponseCreate))\nconst decodeEvent = Schema.decodeUnknownEffect(OpenResponses.protocol.stream.event)\n\nexport interface Options {\n readonly id: string\n readonly name: string\n readonly rotateAfterMs?: number\n readonly enabled?: (url: string) => boolean\n readonly url?: (url: string) => string\n readonly headers?: (headers: Headers.Headers) => Headers.Headers\n readonly driver?: (input: {\n readonly request: Readonly<Record<string, unknown>>\n readonly message: string\n readonly base: WebSocketChannelDriver\n }) => WebSocketChannelDriver\n}\n\nexport interface Prepared {\n readonly http: HttpTransport.HttpPrepared<string>\n readonly channel?: {\n readonly url: string\n readonly headers: Headers.Headers\n readonly rotateAfterMs?: number\n readonly driver: WebSocketChannelDriver\n }\n}\n\nconst message = (body: unknown) =>\n Effect.gen(function* () {\n if (!ProviderShared.isRecord(body))\n return yield* ProviderShared.invalidRequest(\"Open Responses WebSocket body must be a JSON object\")\n const { stream: _stream, stream_options: _streamOptions, background: _background, ...request } = body\n const decoded = yield* decodeMessage({ ...request, type: \"response.create\" })\n return { request: decoded, message: encodeMessage(decoded) }\n })\n\nconst driver = (options: Options, body: string): WebSocketChannelDriver => {\n let responseID: string | undefined\n let terminal = false\n return {\n create: () =>\n Effect.sync(() => {\n responseID = undefined\n terminal = false\n return { message: body, mode: \"full\" }\n }),\n observe: (_create, frame) =>\n Effect.gen(function* () {\n const event = yield* decodeEvent(frame).pipe(\n Effect.mapError(() =>\n ProviderShared.eventError(options.id, `Invalid ${options.name} WebSocket event`, frame),\n ),\n )\n if (terminal)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} emitted ${event.type} after a terminal event`,\n frame,\n )\n if (event.type === \"error\") {\n terminal = true\n yield* OpenResponses.decodeKnownErrorEvent(event).pipe(\n Effect.mapError(() =>\n ProviderShared.eventError(options.id, `${options.name} returned a malformed error event`, frame),\n ),\n )\n return {\n type: \"provider-failure\",\n error: OpenResponses.providerFailure(options.id, event, `${options.name} stream error`),\n }\n }\n if (event.type === \"response.failed\") {\n terminal = true\n if (responseID && event.response?.id && event.response.id !== responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} response ID changed during execution`,\n frame,\n )\n return {\n type: \"provider-failure\",\n error: OpenResponses.providerFailure(options.id, event, `${options.name} response failed`),\n }\n }\n if (event.type === \"response.created\") {\n const created = event.response?.id\n if (responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} emitted duplicate response.created`,\n frame,\n )\n if (!created)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} response.created is missing response.id`,\n frame,\n )\n responseID = created\n return { type: \"frame\", frame }\n }\n if (!responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} emitted ${event.type} before response.created`,\n frame,\n )\n if (event.response?.id && event.response.id !== responseID)\n return yield* ProviderShared.eventError(\n options.id,\n `${options.name} response ID changed during execution`,\n frame,\n )\n if (event.type === \"response.completed\") {\n terminal = true\n return { type: \"completed\", frame }\n }\n if (event.type === \"response.incomplete\") {\n terminal = true\n return { type: \"incomplete\", frame }\n }\n return { type: \"frame\", frame }\n }),\n }\n}\n\nexport const transport = <Body>(options: Options): Transport<Body, Prepared, string> => {\n const http = HttpTransport.sseJson.with<Body>()\n return {\n id: http.id,\n prepare: (input) =>\n Effect.gen(function* () {\n const parts = yield* HttpTransport.jsonRequestParts(input)\n const headers = Headers.remove(options.headers?.(parts.headers) ?? parts.headers, \"content-length\")\n const channel =\n input.webSocket && (options.enabled?.(parts.url) ?? true)\n ? yield* Effect.gen(function* () {\n const create = yield* message(parts.jsonBody)\n const base = driver(options, create.message)\n return {\n url: yield* WebSocketTransport.toWebSocketUrl(options.url?.(parts.url) ?? parts.url),\n headers,\n rotateAfterMs: options.rotateAfterMs,\n driver: options.driver?.({ request: create.request, message: create.message, base }) ?? base,\n }\n })\n : undefined\n return {\n http: {\n request: ProviderShared.jsonPost({ url: parts.url, body: parts.bodyText, headers: parts.headers }),\n framing: Framing.sse,\n middleware: input.middleware,\n },\n channel,\n }\n }),\n execute: (prepared, request, runtime, executeOptions) => {\n if (!executeOptions?.webSocket || !prepared.channel) return http.execute(prepared.http, request, runtime)\n const exchange: WebSocketChannelExchange = {\n id: request.id ?? \"request\",\n connect: {\n url: prepared.channel.url,\n headers: prepared.channel.headers,\n rotateAfterMs: prepared.channel.rotateAfterMs,\n },\n fallback: () =>\n Stream.unwrap(\n http.execute(prepared.http, request, runtime).pipe(Effect.map((execution) => execution.frames)),\n ),\n driver: prepared.channel.driver,\n }\n return executeOptions.webSocket.execute(exchange)\n },\n }\n}\n\nexport const OpenResponsesChannel = { transport } as const\n", | ||
| "import { AIError, TransportReason } from \"../schema/index.js\"\nimport type { ChannelCheckpoint, ChannelObservation, WebSocketChannelDriver } from \"../route/transport/index.js\"\nimport { Effect, Option, Schema } from \"effect\"\nimport * as ProviderShared from \"./shared.js\"\nimport { OpenResponses } from \"./open-responses.js\"\n\nconst PROTOCOL = \"openai-responses.websocket.v1\"\nconst VERSION = 1\nconst decodeEvent = Schema.decodeUnknownEffect(OpenResponses.protocol.stream.event)\n\ninterface CheckpointValue {\n readonly version: typeof VERSION\n readonly responseID: string\n readonly request: Readonly<Record<string, unknown>>\n readonly output: ReadonlyArray<unknown>\n}\n\nexport interface DriverInput {\n readonly id: string\n readonly name: string\n readonly request: Readonly<Record<string, unknown>>\n readonly message: string\n readonly base: WebSocketChannelDriver\n}\n\nconst checkpointValue = (checkpoint: ChannelCheckpoint | undefined): CheckpointValue | undefined => {\n if (checkpoint?.protocol !== PROTOCOL || !ProviderShared.isRecord(checkpoint.value)) return undefined\n if (checkpoint.value.version !== VERSION) return undefined\n if (typeof checkpoint.value.responseID !== \"string\" || checkpoint.value.responseID.trim().length === 0)\n return undefined\n if (!ProviderShared.isRecord(checkpoint.value.request) || !Array.isArray(checkpoint.value.output)) return undefined\n return {\n version: VERSION,\n responseID: checkpoint.value.responseID,\n request: checkpoint.value.request,\n output: checkpoint.value.output,\n }\n}\n\nconst canonical = (value: unknown): string => {\n if (value === undefined) return \"undefined\"\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`\n if (!ProviderShared.isRecord(value)) return ProviderShared.encodeJson(value)\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${ProviderShared.encodeJson(key)}:${canonical(value[key])}`)\n .join(\",\")}}`\n}\n\nconst json = (value: unknown) => {\n if (typeof value !== \"string\") return value\n return Option.getOrElse(Schema.decodeUnknownOption(ProviderShared.Json)(value), () => value)\n}\n\nconst comparable = (value: unknown) => {\n if (!ProviderShared.isRecord(value)) return value\n if (value.type === \"message\" && value.role === \"assistant\")\n return {\n role: \"assistant\",\n content: value.content,\n ...(value.phase === undefined ? {} : { phase: value.phase }),\n }\n if (value.type === \"function_call\")\n return {\n type: value.type,\n call_id: value.call_id,\n name: value.name,\n arguments: json(value.arguments),\n }\n if (value.type === \"reasoning\")\n return {\n type: value.type,\n summary: value.summary,\n encrypted_content: value.encrypted_content,\n }\n return value\n}\n\nconst invariant = (request: Readonly<Record<string, unknown>>) => {\n const { type: _type, input: _input, previous_response_id: _previousResponseID, ...rest } = request\n return rest\n}\n\nconst incremental = (\n request: Readonly<Record<string, unknown>>,\n checkpoint: CheckpointValue,\n): ReadonlyArray<unknown> | undefined => {\n const input = request.input\n const previousInput = checkpoint.request.input\n if (!Array.isArray(input) || !Array.isArray(previousInput)) return undefined\n if (canonical(invariant(request)) !== canonical(invariant(checkpoint.request))) return undefined\n const baseline = [...previousInput, ...checkpoint.output]\n if (input.length <= baseline.length) return undefined\n if (!baseline.every((item, index) => canonical(comparable(item)) === canonical(comparable(input[index]))))\n return undefined\n return input.slice(baseline.length)\n}\n\nconst code = (event: OpenResponses.Event) => event.code || event.error?.code || event.response?.error?.code || undefined\n\nconst rejected = (\n input: DriverInput,\n observation: Extract<ChannelObservation, { readonly type: \"provider-failure\" }>,\n recovery: \"retry-full\" | \"rotate-and-retry-full\",\n): ChannelObservation => ({\n type: \"rejected\",\n recovery,\n error: new AIError({\n module: input.id,\n method: \"stream\",\n reason: new TransportReason({\n message: observation.error.message,\n transport: \"websocket\",\n operation: \"read\",\n phase: \"receive\",\n delivery: \"rejected\",\n recovery,\n }),\n }),\n})\n\nexport const driver = (input: DriverInput): WebSocketChannelDriver => {\n const { previous_response_id: _previousResponseID, ...request } = input.request\n let output: unknown[] = []\n return {\n create: (checkpoint) =>\n Effect.sync(() => {\n output = []\n const previous = checkpointValue(checkpoint)\n const delta = previous ? incremental(request, previous) : undefined\n if (!previous || !delta) return { message: ProviderShared.encodeJson(request), mode: \"full\" as const }\n return {\n message: ProviderShared.encodeJson({ ...request, input: delta, previous_response_id: previous.responseID }),\n mode: \"incremental\" as const,\n }\n }),\n observe: (create, frame) =>\n Effect.gen(function* () {\n const event = yield* decodeEvent(frame).pipe(\n Effect.mapError(() => ProviderShared.eventError(input.id, `Invalid ${input.name} WebSocket event`, frame)),\n )\n const observation = yield* input.base.observe(create, frame)\n if (event.type === \"response.output_item.done\" && event.item) output.push(event.item)\n if (observation.type === \"provider-failure\") {\n const rejection = code(event)\n if (rejection === \"previous_response_not_found\") return rejected(input, observation, \"retry-full\")\n if (rejection === \"websocket_connection_limit_reached\")\n return rejected(input, observation, \"rotate-and-retry-full\")\n }\n if (observation.type !== \"completed\") return observation\n const responseID = event.response?.id\n if (!responseID || responseID.trim().length === 0) return observation\n return {\n ...observation,\n checkpoint: {\n protocol: PROTOCOL,\n value: { version: VERSION, responseID, request, output: output.slice() } satisfies CheckpointValue,\n },\n }\n }),\n }\n}\n\nexport const OpenAIResponsesChannel = { driver } as const\n", | ||
| "import { Effect, Encoding, Schema } from \"effect\"\nimport { Headers } from \"effect/unstable/http\"\nimport { Route } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport { HttpTransport } from \"../route/transport/index.js\"\nimport { LLMEvent, LLMRequest, type JsonSchema, type ToolDefinition } from \"../schema/index.js\"\nimport { OpenResponses } from \"./open-responses.js\"\nimport { optionalArray, ProviderShared } from \"./shared.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { OpenAIImage } from \"./utils/openai-image.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { OpenResponsesChannel, type Options } from \"./open-responses-channel.js\"\nimport { OpenAIResponsesChannel } from \"./openai-responses-channel.js\"\n\nconst ADAPTER = \"openai-responses\"\nconst NAME = \"OpenAI Responses\"\nconst WEBSOCKET_PROTOCOL_HEADER = \"responses_websockets=2026-02-06\"\nconst WEBSOCKET_ROTATE_AFTER_MS = 55 * 60 * 1000\nexport const DEFAULT_BASE_URL = \"https://api.openai.com/v1\"\nexport const PATH = OpenResponses.PATH\n\nconst OpenAIResponsesImageGenerationTool = Schema.Struct({\n type: Schema.tag(\"image_generation\"),\n action: Schema.optional(Schema.Literals([\"auto\", \"generate\", \"edit\"])),\n background: Schema.optional(Schema.Literals([\"auto\", \"opaque\", \"transparent\"])),\n input_fidelity: Schema.optional(Schema.Literals([\"low\", \"high\"])),\n output_compression: Schema.optional(Schema.Int.check(Schema.isBetween({ minimum: 0, maximum: 100 }))),\n output_format: Schema.optional(Schema.Literals([\"png\", \"jpeg\", \"webp\"])),\n partial_images: Schema.optional(Schema.Int.check(Schema.isGreaterThanOrEqualTo(0))),\n quality: Schema.optional(Schema.Literals([\"auto\", \"low\", \"medium\", \"high\"])),\n size: Schema.optional(OpenAIImage.Size),\n})\n\nconst OpenAIResponsesTools = Schema.Union([OpenResponses.Tool, OpenAIResponsesImageGenerationTool])\n\nconst OpenAIResponsesToolChoice = Schema.Union([\n OpenResponses.ToolChoice,\n Schema.Struct({ type: Schema.tag(\"image_generation\") }),\n])\n\nconst OpenAIResponsesInputItem = Schema.Union([\n Schema.Struct({\n type: Schema.tag(\"message\"),\n id: Schema.optionalKey(Schema.String),\n role: Schema.tag(\"assistant\"),\n content: Schema.Array(Schema.Struct({ type: Schema.tag(\"output_text\"), text: Schema.String })),\n phase: Schema.optionalKey(Schema.NullOr(OpenResponses.MessagePhase)),\n }),\n OpenResponses.InputItem,\n])\n\nconst OpenAIResponsesCoreFields = {\n ...OpenResponses.coreFields,\n input: Schema.Array(OpenAIResponsesInputItem),\n tools: optionalArray(OpenAIResponsesTools),\n tool_choice: Schema.optional(OpenAIResponsesToolChoice),\n}\n\nconst OpenAIResponsesBody = Schema.Struct({\n ...OpenAIResponsesCoreFields,\n stream: Schema.Literal(true),\n})\nexport type OpenAIResponsesBody = Schema.Schema.Type<typeof OpenAIResponsesBody>\n\nconst extension = {\n id: ADAPTER,\n name: NAME,\n messagePhase: (value: unknown) => (value === null ? null : undefined),\n lowerMedia: ({ part, media, request }) => {\n if (request.model.provider !== \"xai\" || media.mime !== \"application/pdf\") return undefined\n return {\n type: \"input_file\",\n filename: part.filename ?? \"document.pdf\",\n file_data: media.base64,\n mime_type: media.mime,\n }\n },\n} satisfies OpenResponses.Extension\n\nconst nativeImageToolInput = (tool: ToolDefinition) => {\n const native = tool.native?.openai\n return ProviderShared.isRecord(native) && native.type === \"image_generation\" ? native : undefined\n}\n\nconst nativeImageTool = (tool: ToolDefinition) => {\n const native = nativeImageToolInput(tool)\n return Schema.is(OpenAIResponsesImageGenerationTool)(native) ? native : undefined\n}\n\nconst lowerTool = Effect.fn(\"OpenAIResponses.lowerTool\")(function* (tool: ToolDefinition, inputSchema: JsonSchema) {\n const native = nativeImageToolInput(tool)\n if (native !== undefined) {\n if (Schema.is(OpenAIResponsesImageGenerationTool)(native)) return native\n return yield* ProviderShared.invalidRequest(\"OpenAI Responses image generation tool options are invalid\")\n }\n return yield* OpenResponses.lowerTool(NAME, tool, inputSchema)\n})\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>, tools: ReadonlyArray<ToolDefinition>) =>\n ProviderShared.matchToolChoice(NAME, toolChoice, {\n auto: () => \"auto\" as const,\n none: () => \"none\" as const,\n required: () => \"required\" as const,\n tool: (name) =>\n tools.some((tool) => tool.name === name && nativeImageTool(tool) !== undefined)\n ? ({ type: \"image_generation\" } as const)\n : { type: \"function\" as const, name },\n })\n\nconst fromRequest = Effect.fn(\"OpenAIResponses.fromRequest\")(function* (request: LLMRequest) {\n const body = yield* OpenResponses.fromRequestWithExtension(\n LLMRequest.update(request, { tools: [], toolChoice: undefined }),\n extension,\n )\n const toolSchemaCompatibility = request.model.compatibility?.toolSchema\n return {\n ...body,\n tools:\n request.tools.length === 0\n ? undefined\n : yield* Effect.forEach(request.tools, (tool) =>\n lowerTool(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, toolSchemaCompatibility)),\n ),\n tool_choice:\n body.tool_choice ?? (request.toolChoice ? yield* lowerToolChoice(request.toolChoice, request.tools) : undefined),\n } satisfies OpenAIResponsesBody\n})\n\ntype HostedToolData = OpenResponses.StreamItem & {\n readonly id: string\n readonly status?: string\n readonly action?: unknown\n readonly queries?: unknown\n readonly results?: unknown\n readonly code?: string\n readonly container_id?: string\n readonly outputs?: unknown\n readonly server_label?: string\n readonly output?: unknown\n readonly result?: string\n readonly output_format?: \"png\" | \"jpeg\" | \"webp\"\n readonly error?: unknown\n}\n\nconst HOSTED_TOOLS = {\n web_search_call: { name: \"web_search\", input: (item) => item.action ?? {} },\n web_search_preview_call: { name: \"web_search_preview\", input: (item) => item.action ?? {} },\n file_search_call: { name: \"file_search\", input: (item) => ({ queries: item.queries ?? [] }) },\n code_interpreter_call: {\n name: \"code_interpreter\",\n input: (item) => ({ code: item.code, container_id: item.container_id }),\n },\n computer_use_call: { name: \"computer_use\", input: (item) => item.action ?? {} },\n image_generation_call: { name: \"image_generation\", input: () => ({}) },\n mcp_call: {\n name: \"mcp\",\n input: (item) => ({ server_label: item.server_label, name: item.name, arguments: item.arguments }),\n },\n local_shell_call: { name: \"local_shell\", input: (item) => item.action ?? {} },\n} as const satisfies Record<string, { readonly name: string; readonly input: (item: HostedToolData) => unknown }>\n\ntype HostedToolType = keyof typeof HOSTED_TOOLS\ntype HostedToolItem = HostedToolData & { readonly type: HostedToolType }\n\nconst isHostedToolItem = (item: OpenResponses.StreamItem): item is HostedToolItem =>\n item.type in HOSTED_TOOLS && typeof item.id === \"string\" && item.id.length > 0\n\nconst hostedToolResult = Effect.fn(\"OpenAIResponses.hostedToolResult\")(function* (item: HostedToolItem) {\n const isError = item.error !== undefined && item.error !== null\n if (item.type === \"image_generation_call\" && item.result) {\n yield* Effect.fromResult(Encoding.decodeBase64(item.result)).pipe(\n Effect.mapError(() => ProviderShared.eventError(ADAPTER, \"OpenAI Responses returned invalid image base64\")),\n )\n const format = item.output_format ?? \"png\"\n return {\n type: \"content\" as const,\n value: [\n {\n type: \"file\" as const,\n uri: `data:image/${format};base64,${item.result}`,\n mime: `image/${format}`,\n },\n ],\n }\n }\n return isError ? { type: \"error\" as const, value: item.error } : { type: \"json\" as const, value: item }\n})\n\nconst onHostedToolDone = Effect.fn(\"OpenAIResponses.onHostedToolDone\")(function* (\n state: OpenResponses.ParserState,\n item: HostedToolItem,\n) {\n const tool = HOSTED_TOOLS[item.type]\n const providerMetadata = OpenResponses.providerMetadata(state, { itemId: item.id })\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n events.push(\n LLMEvent.toolCall({\n id: item.id,\n name: tool.name,\n input: tool.input(item),\n providerExecuted: true,\n providerMetadata,\n }),\n LLMEvent.toolResult({\n id: item.id,\n name: tool.name,\n result: yield* hostedToolResult(item),\n providerExecuted: true,\n providerMetadata,\n }),\n )\n return [{ ...state, lifecycle }, events] satisfies OpenResponses.StepResult\n})\n\nconst step = (state: OpenResponses.ParserState, event: OpenResponses.Event) => {\n if (event.type === \"response.reasoning_text.delta\" || event.type === \"response.reasoning_summary.delta\")\n return event.item_id\n ? Effect.succeed(OpenResponses.onReasoningDelta(state, event, event.item_id))\n : ProviderShared.eventError(ADAPTER, `${event.type} is missing item_id`)\n if (event.type === \"response.reasoning_text.done\" || event.type === \"response.reasoning_summary.done\")\n return event.item_id\n ? Effect.succeed(OpenResponses.onReasoningDone(state, event))\n : ProviderShared.eventError(ADAPTER, `${event.type} is missing item_id`)\n if (event.type === \"response.output_item.done\" && event.item && isHostedToolItem(event.item))\n return onHostedToolDone(state, event.item)\n return OpenResponses.step(state, event)\n}\n\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: OpenAIResponsesBody,\n from: fromRequest,\n },\n stream: {\n event: OpenResponses.protocol.stream.event,\n initial: (request) => OpenResponses.initial(request, extension),\n step,\n terminal: OpenResponses.terminal,\n },\n})\n\nconst endpoint = Endpoint.path<OpenAIResponsesBody>(PATH, { baseURL: DEFAULT_BASE_URL })\nconst auth = Auth.none\n\nexport const httpTransport = HttpTransport.sseJson.with<OpenAIResponsesBody>()\nexport const channelTransport = (options: Omit<Options, \"driver\">) =>\n OpenResponsesChannel.transport<OpenAIResponsesBody>({\n ...options,\n driver: (input) => OpenAIResponsesChannel.driver({ id: options.id, name: options.name, ...input }),\n })\nexport const transport = channelTransport({\n id: ADAPTER,\n name: NAME,\n rotateAfterMs: WEBSOCKET_ROTATE_AFTER_MS,\n headers: (headers) => Headers.set(headers, \"openai-beta\", headers[\"openai-beta\"] ?? WEBSOCKET_PROTOCOL_HEADER),\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"openai\",\n providerMetadataKey: \"openai\",\n protocol,\n endpoint,\n auth,\n transport,\n defaults: { providerOptions: { store: false } },\n})\n\nexport * as OpenAIResponses from \"./openai-responses.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "F2A9415FB88BF60464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/project.ts", "../schema/src/skill.ts", "../schema/src/prompt.ts", "../schema/src/shell.ts", "../schema/src/session-error.ts", "../schema/src/session-id.ts", "../schema/src/permission.ts", "../schema/src/agent.ts", "../schema/src/snapshot.ts", "../schema/src/token-usage.ts", "../schema/src/session-message.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Project from \"./project.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath, NonNegativeInt, optional } from \"./schema.js\"\nimport { ProjectID } from \"./project-id.js\"\n\nexport const ID = ProjectID\nexport type ID = typeof ID.Type\n\nexport const Vcs = Schema.Literals([\"git\", \"hg\"]).annotate({ identifier: \"Project.Vcs\" })\nexport const Current = Schema.Struct({\n id: ID,\n directory: AbsolutePath,\n canonical: AbsolutePath,\n}).annotate({ identifier: \"Project.Current\" })\nexport interface Current extends Schema.Schema.Type<typeof Current> {}\nexport const Icon = Schema.Struct({\n url: optional(Schema.String),\n override: optional(Schema.String),\n color: optional(Schema.String),\n}).annotate({ identifier: \"Project.Icon\" })\nexport interface Icon extends Schema.Schema.Type<typeof Icon> {}\nexport const Commands = Schema.Struct({\n start: optional(\n Schema.String.annotate({ description: \"Startup script to run when creating a new workspace (worktree)\" }),\n ),\n}).annotate({ identifier: \"Project.Commands\" })\nexport interface Commands extends Schema.Schema.Type<typeof Commands> {}\nexport const Time = Schema.Struct({\n created: NonNegativeInt,\n updated: NonNegativeInt,\n initialized: optional(NonNegativeInt),\n}).annotate({ identifier: \"Project.Time\" })\nexport interface Time extends Schema.Schema.Type<typeof Time> {}\n\nexport const Info = Schema.Struct({\n id: ID,\n canonical: AbsolutePath,\n vcs: optional(Vcs),\n name: optional(Schema.String),\n icon: optional(Icon),\n commands: optional(Commands),\n time: Time,\n sandboxes: Schema.Array(Schema.String),\n}).annotate({ identifier: \"Project\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nconst Updated = ephemeral({ type: \"project.updated\", schema: Info.fields })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n", | ||
| "export * as Skill from \"./skill.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { AbsolutePath } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Skill.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Skill.Name\"))\nexport type Name = typeof Name.Type\n\nexport interface DirectorySource extends Schema.Schema.Type<typeof DirectorySource> {}\nexport const DirectorySource = Schema.Struct({\n type: Schema.tag(\"directory\"),\n path: AbsolutePath,\n}).annotate({ identifier: \"Skill.DirectorySource\" })\n\nexport interface UrlSource extends Schema.Schema.Type<typeof UrlSource> {}\nexport const UrlSource = Schema.Struct({\n type: Schema.tag(\"url\"),\n url: Schema.String,\n}).annotate({ identifier: \"Skill.UrlSource\" })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n description: Schema.String.pipe(optional),\n slash: Schema.Boolean.pipe(optional),\n autoinvoke: Schema.Boolean.pipe(optional),\n location: AbsolutePath,\n content: Schema.String,\n}).annotate({ identifier: \"Skill.Info\" })\n\nconst Updated = ephemeral({ type: \"skill.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface EmbeddedSource extends Schema.Schema.Type<typeof EmbeddedSource> {}\nexport const EmbeddedSource = Schema.Struct({\n type: Schema.tag(\"embedded\"),\n skill: Schema.suspend(() => Info),\n}).annotate({ identifier: \"Skill.EmbeddedSource\" })\n\nexport type Source = DirectorySource | UrlSource | EmbeddedSource\nexport const Source = Object.assign(\n Schema.Union([DirectorySource, UrlSource, EmbeddedSource]).pipe(\n Schema.toTaggedUnion(\"type\"),\n Schema.annotate({ identifier: \"Skill.Source\" }),\n ),\n {\n equals: (a: Source, b: Source) => {\n if (a.type !== b.type) return false\n if (a.type === \"directory\" && b.type === \"directory\") return a.path === b.path\n if (a.type === \"url\" && b.type === \"url\") return a.url === b.url\n if (a.type === \"embedded\" && b.type === \"embedded\") return a.skill.id === b.skill.id\n return false\n },\n key: (source: Source) =>\n source.type === \"directory\"\n ? `directory:${source.path}`\n : source.type === \"url\"\n ? `url:${source.url}`\n : `embedded:${source.skill.id}`,\n },\n)\n", | ||
| "import { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { statics } from \"./schema.js\"\nimport { Skill } from \"./skill.js\"\n\nexport interface PromptMention extends Schema.Schema.Type<typeof PromptMention> {}\nexport const PromptMention = Schema.Struct({\n start: Schema.Finite,\n end: Schema.Finite,\n text: Schema.String,\n}).annotate({ identifier: \"Prompt.Mention\" })\n\nexport const FileSource = Schema.Union([\n Schema.Struct({ type: Schema.Literal(\"inline\") }),\n Schema.Struct({ type: Schema.Literal(\"uri\"), uri: Schema.String }),\n])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Prompt.FileSource\" })\nexport type FileSource = typeof FileSource.Type\n\nexport const Base64 = Schema.String.check(\n Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/),\n).annotate({ identifier: \"Prompt.Base64\" })\nexport type Base64 = typeof Base64.Type\n\nexport interface FileAttachment extends Schema.Schema.Type<typeof FileAttachment> {}\nexport const FileAttachment = Schema.Struct({\n data: Base64,\n mime: Schema.String,\n source: FileSource,\n name: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mention: PromptMention.pipe(optional),\n})\n .annotate({ identifier: \"Prompt.FileAttachment\" })\n .pipe(\n statics((schema) => ({\n create: (input: FileAttachment) =>\n schema.make({\n data: input.data,\n mime: input.mime,\n source: input.source,\n name: input.name,\n description: input.description,\n mention: input.mention,\n }),\n })),\n )\n\nexport interface AgentAttachment extends Schema.Schema.Type<typeof AgentAttachment> {}\nexport const AgentAttachment = Schema.Struct({\n name: Schema.String,\n mention: PromptMention.pipe(optional),\n}).annotate({ identifier: \"Prompt.AgentAttachment\" })\n\nexport interface SkillAttachment extends Schema.Schema.Type<typeof SkillAttachment> {}\nexport const SkillAttachment = Schema.Struct({\n id: Skill.ID,\n name: Skill.Name,\n mention: PromptMention.pipe(optional),\n}).annotate({ identifier: \"Prompt.SkillAttachment\" })\n\nexport interface Prompt extends Schema.Schema.Type<typeof Prompt> {}\nexport const Prompt = Schema.Struct({\n text: Schema.String,\n files: Schema.Array(FileAttachment).pipe(optional),\n agents: Schema.Array(AgentAttachment).pipe(optional),\n skills: Schema.Array(SkillAttachment).pipe(optional),\n})\n .annotate({ identifier: \"Prompt\" })\n .pipe(\n statics((schema) => ({\n equivalence: Schema.toEquivalence(schema),\n fromUserMessage: (input: Pick<Prompt, \"text\" | \"files\" | \"agents\" | \"skills\">) =>\n schema.make({\n text: input.text,\n ...(input.files === undefined ? {} : { files: input.files }),\n ...(input.agents === undefined ? {} : { agents: input.agents }),\n ...(input.skills === undefined ? {} : { skills: input.skills }),\n }),\n })),\n )\n", | ||
| "export * as Shell from \"./shell.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { NonNegativeInt, statics } from \"./schema.js\"\n\nconst IDSchema = Schema.String.check(Schema.isStartsWith(\"sh_\")).pipe(Schema.brand(\"Shell.ID\"))\n\nexport const ID = IDSchema.pipe(\n statics((schema: typeof IDSchema) => {\n const create = () => schema.make(\"sh_\" + ascending())\n return {\n create,\n ascending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type ID = typeof ID.Type\n\nexport const Status = Schema.Literals([\"running\", \"exited\", \"timeout\", \"killed\"])\nexport type Status = typeof Status.Type\n\nexport const Time = Schema.Struct({\n started: Schema.Finite,\n completed: optional(Schema.Finite),\n})\nexport interface Time extends Schema.Schema.Type<typeof Time> {}\n\n// Opaque caller-supplied tags echoed back on Info and events. The Shell service never interprets\n// these; callers (e.g. ShellTool stores the originating session ID) use them to filter or correlate.\nexport const Metadata = Schema.Record(Schema.String, Schema.Unknown)\nexport type Metadata = typeof Metadata.Type\n\nexport const Info = Schema.Struct({\n id: ID,\n status: Status,\n command: Schema.String,\n cwd: Schema.String,\n shell: Schema.String,\n // Absolute path of the file capturing combined stdout/stderr. Page through it via `output`.\n file: Schema.String,\n pid: optional(NonNegativeInt),\n exit: optional(Schema.Finite),\n // Always present; defaults to an empty object when the creator supplies no metadata.\n metadata: Metadata,\n time: Time,\n}).annotate({ identifier: \"Shell.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n\nconst Created = ephemeral({ type: \"shell.created\", schema: { info: Info } })\nconst Exited = ephemeral({ type: \"shell.exited\", schema: { id: ID, exit: optional(Schema.Finite), status: Status } })\nconst Deleted = ephemeral({ type: \"shell.deleted\", schema: { id: ID } })\nexport const Event = { Created, Exited, Deleted, Definitions: inventory(Created, Exited, Deleted) }\n\nexport const CreateInput = Schema.Struct({\n command: Schema.String,\n cwd: optional(Schema.String),\n timeout: NonNegativeInt,\n metadata: optional(Metadata),\n})\nexport interface CreateInput extends Schema.Schema.Type<typeof CreateInput> {}\n\nexport const OutputInput = Schema.Struct({\n cursor: optional(NonNegativeInt),\n limit: optional(NonNegativeInt),\n})\nexport interface OutputInput extends Schema.Schema.Type<typeof OutputInput> {}\n\nexport const Output = Schema.Struct({\n output: Schema.String,\n // Absolute cursor after this page. Equals `size` once fully caught up.\n cursor: NonNegativeInt,\n // Total bytes captured so far. A consumer has more to page while `cursor < size`.\n size: NonNegativeInt,\n truncated: Schema.Boolean,\n})\nexport interface Output extends Schema.Schema.Type<typeof Output> {}\n", | ||
| "export * as SessionError from \"./session-error.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\n\nexport interface Error extends Schema.Schema.Type<typeof Error> {}\nexport const Error = Schema.Struct({\n type: Schema.String,\n message: Schema.String,\n status: Schema.Int.check(Schema.isBetween({ minimum: 100, maximum: 599 })).pipe(optional),\n}).annotate({ identifier: \"Session.StructuredError\" })\n", | ||
| "import { Schema } from \"effect\"\nimport { descending } from \"./identifier.js\"\nimport { statics } from \"./schema.js\"\n\nexport const SessionID = Schema.String.check(Schema.isStartsWith(\"ses\")).pipe(\n Schema.brand(\"SessionID\"),\n statics((schema) => {\n const create = () => schema.make(\"ses_\" + descending())\n return {\n create,\n descending: (id?: string) => (id === undefined ? create() : schema.make(id)),\n }\n }),\n)\nexport type SessionID = typeof SessionID.Type\n", | ||
| "export * as Permission from \"./permission.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { ascending } from \"./identifier.js\"\nimport { SessionID } from \"./session-id.js\"\nimport { statics } from \"./schema.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"per\")).pipe(\n Schema.brand(\"Permission.ID\"),\n statics((schema) => ({ create: (id?: string) => schema.make(id ?? \"per_\" + ascending()) })),\n)\nexport type ID = typeof ID.Type\n\nexport const Source = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"tool\"),\n messageID: Schema.String,\n id: Schema.String,\n }),\n]).annotate({ identifier: \"Permission.Source\" })\nexport type Source = typeof Source.Type\n\nconst RequestFields = {\n sessionID: SessionID,\n action: Schema.String,\n resources: Schema.Array(Schema.String),\n save: Schema.Array(Schema.String).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n source: Source.pipe(optional),\n}\n\nexport const Request = Schema.Struct({\n id: ID,\n ...RequestFields,\n}).annotate({ identifier: \"Permission.Request\" })\nexport interface Request extends Schema.Schema.Type<typeof Request> {}\n\nexport const Reply = Schema.Literals([\"once\", \"always\", \"reject\"]).annotate({ identifier: \"Permission.Reply\" })\nexport type Reply = typeof Reply.Type\n\nconst Asked = ephemeral({ type: \"permission.asked\", schema: Request.fields })\nconst Replied = ephemeral({\n type: \"permission.replied\",\n schema: {\n sessionID: SessionID,\n requestID: ID,\n reply: Reply,\n },\n})\nexport const Event = { Asked, Replied, Definitions: inventory(Asked, Replied) }\n\nexport const Effect = Schema.Literals([\"allow\", \"deny\", \"ask\"]).annotate({ identifier: \"Permission.Effect\" })\nexport type Effect = typeof Effect.Type\n\nexport interface Rule extends Schema.Schema.Type<typeof Rule> {}\nexport const Rule = Schema.Struct({\n action: Schema.String,\n resource: Schema.String,\n effect: Effect,\n}).annotate({ identifier: \"Permission.Rule\" })\n\nexport const Ruleset = Schema.Array(Rule).annotate({ identifier: \"Permission.Ruleset\" })\nexport type Ruleset = typeof Ruleset.Type\n", | ||
| "export * as Agent from \"./agent.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Permission } from \"./permission.js\"\nimport { Provider } from \"./provider.js\"\nimport { PositiveInt, statics } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"agent.updated\", schema: {} })\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Agent.ID\"))\nexport type ID = typeof ID.Type\n\nexport const Name = Schema.String.pipe(Schema.brand(\"Agent.Name\"))\nexport type Name = typeof Name.Type\n\nexport const Color = Schema.String.annotate({ identifier: \"Agent.Color\" })\nexport type Color = typeof Color.Type\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n id: ID,\n name: Name,\n model: Model.Ref.pipe(optional),\n request: Provider.Request,\n system: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n mode: Schema.Literals([\"subagent\", \"primary\", \"all\"]),\n hidden: Schema.Boolean,\n color: Color.pipe(optional),\n steps: PositiveInt.pipe(optional),\n permissions: Permission.Ruleset,\n})\n .annotate({ identifier: \"Agent.Info\" })\n .pipe(\n statics(() => ({\n default: (id: ID) =>\n ({\n id,\n name: Name.make(id),\n request: { settings: {}, headers: {}, body: {} },\n mode: \"primary\",\n hidden: false,\n permissions: [\n { action: \"*\", resource: \"*\", effect: \"allow\" },\n { action: \"external_directory\", resource: \"*\", effect: \"ask\" },\n { action: \"read\", resource: \"*.env\", effect: \"ask\" },\n { action: \"read\", resource: \"*.env.*\", effect: \"ask\" },\n { action: \"read\", resource: \"*.env.example\", effect: \"allow\" },\n ],\n }) satisfies Info,\n })),\n )\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as Snapshot from \"./snapshot.js\"\n\nimport { Schema } from \"effect\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"Snapshot.ID\"))\nexport type ID = typeof ID.Type\n", | ||
| "export * as TokenUsage from \"./token-usage.js\"\n\nimport { Schema } from \"effect\"\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n input: Schema.Finite,\n output: Schema.Finite,\n reasoning: Schema.Finite,\n cache: Schema.Struct({\n read: Schema.Finite,\n write: Schema.Finite,\n }),\n}).annotate({ identifier: \"TokenUsage.Info\" })\n", | ||
| "export * as SessionMessage from \"./session-message.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { Content } from \"./tool.js\"\nimport { Location } from \"./location.js\"\nimport { Model } from \"./model.js\"\nimport { Project } from \"./project.js\"\nimport { Prompt } from \"./prompt.js\"\nimport { DateTimeUtcFromMillis, PositiveInt, RelativePath, statics } from \"./schema.js\"\nimport { ascending } from \"./identifier.js\"\nimport { Event } from \"./event.js\"\nimport { Shell as ShellSchema } from \"./shell.js\"\nimport { FinishReason } from \"./llm.js\"\nimport { SessionError } from \"./session-error.js\"\nimport { Agent } from \"./agent.js\"\nimport { Skill as SkillSchema } from \"./skill.js\"\nimport { Money } from \"./money.js\"\nimport { Snapshot } from \"./snapshot.js\"\nimport { TokenUsage } from \"./token-usage.js\"\n\nexport const ID = Schema.String.check(Schema.isStartsWith(\"msg_\")).pipe(\n Schema.brand(\"Session.Message.ID\"),\n statics((schema) => ({\n create: () => schema.make(\"msg_\" + ascending()),\n fromEvent: (eventID: Event.ID) => schema.make(eventID.replace(/^evt_/, \"msg_\")),\n })),\n)\nexport type ID = typeof ID.Type\n\nconst Base = {\n id: ID,\n metadata: Schema.Record(Schema.String, Schema.Unknown).pipe(optional),\n time: Schema.Struct({ created: DateTimeUtcFromMillis }),\n}\n\nexport const ProviderState = Schema.Record(Schema.String, Schema.Unknown).annotate({\n identifier: \"Session.Message.ProviderState\",\n})\nexport type ProviderState = typeof ProviderState.Type\n\nexport interface AgentSelected extends Schema.Schema.Type<typeof AgentSelected> {}\nexport const AgentSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"agent-switched\"),\n agent: Agent.ID,\n previous: Agent.ID.pipe(optional),\n}).annotate({ identifier: \"Session.Message.AgentSelected\" })\n\nexport interface ModelSelected extends Schema.Schema.Type<typeof ModelSelected> {}\nexport const ModelSelected = Schema.Struct({\n ...Base,\n type: Schema.tag(\"model-switched\"),\n model: Model.Ref,\n previous: Model.Ref.pipe(optional),\n}).annotate({ identifier: \"Session.Message.ModelSelected\" })\n\nexport interface LocationSwitched extends Schema.Schema.Type<typeof LocationSwitched> {}\nexport const LocationSwitched = Schema.Struct({\n ...Base,\n type: Schema.tag(\"location-switched\"),\n location: Location.Ref,\n projectID: Project.ID.pipe(optional),\n subpath: RelativePath.pipe(optional),\n previous: Schema.Struct({\n location: Location.Ref,\n projectID: Project.ID.pipe(optional),\n subpath: RelativePath.pipe(optional),\n }).pipe(optional),\n}).annotate({ identifier: \"Session.Message.LocationSwitched\" })\n\nexport interface User extends Schema.Schema.Type<typeof User> {}\nexport const User = Schema.Struct({\n ...Base,\n text: Prompt.fields.text,\n files: Prompt.fields.files,\n agents: Prompt.fields.agents,\n skills: Prompt.fields.skills,\n type: Schema.tag(\"user\"),\n}).annotate({ identifier: \"Session.Message.User\" })\n\nexport interface Synthetic extends Schema.Schema.Type<typeof Synthetic> {}\nexport const Synthetic = Schema.Struct({\n ...Base,\n text: Schema.String,\n description: Schema.String.pipe(optional),\n type: Schema.tag(\"synthetic\"),\n}).annotate({ identifier: \"Session.Message.Synthetic\" })\n\nexport interface System extends Schema.Schema.Type<typeof System> {}\nexport const System = Schema.Struct({\n ...Base,\n type: Schema.tag(\"system\"),\n /** The model-facing update text, frozen at emit time. */\n text: Schema.String,\n /** A short human-readable summary for transcript display. */\n description: Schema.String.pipe(optional),\n}).annotate({ identifier: \"Session.Message.System\" })\n\nexport interface Skill extends Schema.Schema.Type<typeof Skill> {}\nexport const Skill = Schema.Struct({\n ...Base,\n type: Schema.tag(\"skill\"),\n skill: SkillSchema.ID,\n name: SkillSchema.Name,\n text: Schema.String,\n}).annotate({ identifier: \"Session.Message.Skill\" })\n\nexport interface Shell extends Schema.Schema.Type<typeof Shell> {}\nexport const Shell = Schema.Struct({\n ...Base,\n type: Schema.tag(\"shell\"),\n shellID: ShellSchema.ID,\n command: Schema.String,\n status: ShellSchema.Status,\n exit: Schema.Number.pipe(optional),\n output: ShellSchema.Output.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Shell\" })\n\nexport interface ToolStateStreaming extends Schema.Schema.Type<typeof ToolStateStreaming> {}\nexport const ToolStateStreaming = Schema.Struct({\n status: Schema.tag(\"streaming\"),\n input: Schema.String,\n}).annotate({ identifier: \"Session.Message.ToolState.Streaming\" })\n\nexport interface ToolStateRunning extends Schema.Schema.Type<typeof ToolStateRunning> {}\nexport const ToolStateRunning = Schema.Struct({\n status: Schema.tag(\"running\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n metadata: Schema.Record(Schema.String, Schema.Json),\n}).annotate({ identifier: \"Session.Message.ToolState.Running\" })\n\nexport interface ToolStateCompleted extends Schema.Schema.Type<typeof ToolStateCompleted> {}\nexport const ToolStateCompleted = Schema.Struct({\n status: Schema.tag(\"completed\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n content: Schema.NonEmptyArray(Content),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Completed\" })\n\nexport interface ToolStateError extends Schema.Schema.Type<typeof ToolStateError> {}\nexport const ToolStateError = Schema.Struct({\n status: Schema.tag(\"error\"),\n input: Schema.Record(Schema.String, Schema.Unknown),\n error: SessionError.Error,\n content: Schema.NonEmptyArray(Content).pipe(optional),\n metadata: Schema.Record(Schema.String, Schema.Json).pipe(optional),\n}).annotate({ identifier: \"Session.Message.ToolState.Error\" })\n\nexport const ToolState = Schema.Union([ToolStateStreaming, ToolStateRunning, ToolStateCompleted, ToolStateError]).pipe(\n Schema.toTaggedUnion(\"status\"),\n)\nexport type ToolState = ToolStateStreaming | ToolStateRunning | ToolStateCompleted | ToolStateError\n\nexport interface AssistantTool extends Schema.Schema.Type<typeof AssistantTool> {}\nexport const AssistantTool = Schema.Struct({\n type: Schema.tag(\"tool\"),\n id: Schema.String,\n name: Schema.String,\n executed: Schema.Boolean.pipe(optional),\n providerState: ProviderState.pipe(optional),\n providerResultState: ProviderState.pipe(optional),\n state: ToolState,\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n ran: DateTimeUtcFromMillis.pipe(optional),\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant.Tool\" })\n\nexport interface AssistantText extends Schema.Schema.Type<typeof AssistantText> {}\nexport const AssistantText = Schema.Struct({\n type: Schema.tag(\"text\"),\n text: Schema.String,\n state: ProviderState.pipe(optional),\n}).annotate({ identifier: \"Session.Message.Assistant.Text\" })\n\nexport interface AssistantReasoning extends Schema.Schema.Type<typeof AssistantReasoning> {}\nexport const AssistantReasoning = Schema.Struct({\n type: Schema.tag(\"reasoning\"),\n text: Schema.String,\n state: ProviderState.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }).pipe(optional),\n}).annotate({ identifier: \"Session.Message.Assistant.Reasoning\" })\n\nexport const AssistantContent = Schema.Union([AssistantText, AssistantReasoning, AssistantTool]).pipe(\n Schema.toTaggedUnion(\"type\"),\n)\nexport type AssistantContent = AssistantText | AssistantReasoning | AssistantTool\n\nexport interface AssistantRetry extends Schema.Schema.Type<typeof AssistantRetry> {}\nexport const AssistantRetry = Schema.Struct({\n attempt: PositiveInt,\n at: DateTimeUtcFromMillis,\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Assistant.Retry\" })\n\nexport interface Assistant extends Schema.Schema.Type<typeof Assistant> {}\nexport const Assistant = Schema.Struct({\n ...Base,\n type: Schema.tag(\"assistant\"),\n agent: Agent.ID,\n model: Model.Ref,\n content: AssistantContent.pipe(Schema.Array),\n snapshot: Schema.Struct({\n start: Snapshot.ID.pipe(optional),\n end: Snapshot.ID.pipe(optional),\n files: Schema.Array(RelativePath).pipe(optional),\n }).pipe(optional),\n finish: FinishReason.pipe(optional),\n rawFinish: Schema.String.pipe(optional),\n providerState: ProviderState.pipe(optional),\n cost: Money.USD.pipe(optional),\n tokens: TokenUsage.Info.pipe(optional),\n error: SessionError.Error.pipe(optional),\n retry: AssistantRetry.pipe(optional),\n time: Schema.Struct({\n created: DateTimeUtcFromMillis,\n completed: DateTimeUtcFromMillis.pipe(optional),\n }),\n}).annotate({ identifier: \"Session.Message.Assistant\" })\n\nconst CompactionBase = { type: Schema.tag(\"compaction\"), ...Base }\n\nexport interface CompactionRunning extends Schema.Schema.Type<typeof CompactionRunning> {}\nexport const CompactionRunning = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"running\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Running\" })\n\nexport interface CompactionCompleted extends Schema.Schema.Type<typeof CompactionCompleted> {}\nexport const CompactionCompleted = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"completed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n summary: Schema.String,\n recent: Schema.String,\n}).annotate({ identifier: \"Session.Message.Compaction.Completed\" })\n\nexport interface CompactionFailed extends Schema.Schema.Type<typeof CompactionFailed> {}\nexport const CompactionFailed = Schema.Struct({\n ...CompactionBase,\n status: Schema.tag(\"failed\"),\n reason: Schema.Literals([\"auto\", \"manual\"]),\n error: SessionError.Error,\n}).annotate({ identifier: \"Session.Message.Compaction.Failed\" })\n\nexport const Compaction = Schema.Union([CompactionRunning, CompactionCompleted, CompactionFailed]).pipe(\n Schema.toTaggedUnion(\"status\"),\n Schema.annotate({ identifier: \"Session.Message.Compaction\" }),\n)\nexport type Compaction = CompactionRunning | CompactionCompleted | CompactionFailed\n\nexport const Info = Schema.Union([\n AgentSelected,\n ModelSelected,\n LocationSwitched,\n User,\n Synthetic,\n System,\n Skill,\n Shell,\n Assistant,\n Compaction,\n]).annotate({ identifier: \"Session.Message.Info\" })\nexport type Info =\n | AgentSelected\n | ModelSelected\n | LocationSwitched\n | User\n | Synthetic\n | System\n | Skill\n | Shell\n | Assistant\n | Compaction\nexport type Type = Info[\"type\"]\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "0B95E68F8426EC6564756E2164756E21", | ||
| "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": "27CBE90C857B9DBD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/azure.ts"], | ||
| "sourcesContent": [ | ||
| "import { Headers } from \"effect/unstable/http\"\nimport { Auth } from \"../route/auth.js\"\nimport { type AtLeastOne, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport * as OpenAIResponses from \"../protocols/openai-responses.js\"\nimport { ProviderShared } from \"../protocols/shared.js\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"azure\")\nconst routeAuth = Auth.remove(\"authorization\")\nconst RESPONSES_WEBSOCKET_ROTATE_AFTER_MS = 55 * 60 * 1000\n\n// Azure needs the customer's resource URL; supply either `resourceName`\n// (helper builds the URL) or `baseURL` directly.\ntype AzureURL = AtLeastOne<{ readonly resourceName: string; readonly baseURL: string }>\n\nexport type LanguageModelOptions = AzureURL &\n RouteDefaultsInput &\n ProviderAuthOption<\"optional\"> & {\n readonly apiVersion?: string\n readonly queryParams?: Record<string, string>\n readonly useDeploymentBasedUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\nexport type Config = LanguageModelOptions\n\nexport type Settings = ProviderPackage.Settings &\n AzureURL & {\n readonly apiKey?: string\n readonly apiVersion?: string\n readonly queryParams?: Readonly<Record<string, string>>\n readonly useDeploymentBasedUrls?: boolean\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nconst resourceBaseURL = (resourceName: string) => `https://${resourceName.trim()}.openai.azure.com/openai`\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"azure-openai-responses\",\n provider: id,\n auth: routeAuth,\n transport: OpenAIResponses.channelTransport({\n id: \"azure-openai-responses\",\n name: \"Azure OpenAI Responses\",\n rotateAfterMs: RESPONSES_WEBSOCKET_ROTATE_AFTER_MS,\n enabled: (value) => {\n const url = new URL(value)\n return (\n url.protocol === \"https:\" &&\n url.hostname.endsWith(\".openai.azure.com\") &&\n url.pathname.endsWith(\"/openai/v1/responses\") &&\n url.searchParams.get(\"api-version\") === \"v1\"\n )\n },\n url: (value) => {\n const url = new URL(value)\n url.searchParams.delete(\"api-version\")\n return url.toString()\n },\n headers: (headers) => {\n const apiKey = headers[\"api-key\"]\n if (!apiKey) return headers\n return Headers.remove(Headers.set(headers, \"authorization\", `Bearer ${apiKey}`), \"api-key\")\n },\n }),\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"azure-openai-chat\",\n provider: id,\n auth: routeAuth,\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst defaults = (input: Config) => {\n const {\n apiKey: _,\n apiVersion: _apiVersion,\n resourceName: _resourceName,\n useDeploymentBasedUrls: _useDeploymentBasedUrls,\n baseURL: _baseURL,\n queryParams: _queryParams,\n ...rest\n } = input\n if (\"auth\" in rest) {\n const { auth: _, ...withoutAuth } = rest\n return withoutAuth\n }\n return rest\n}\n\nconst auth = (input: Config) => {\n if (\"auth\" in input && input.auth) return input.auth\n return Auth.remove(\"authorization\").andThen(\n Auth.optional(\"apiKey\" in input ? input.apiKey : undefined, \"apiKey\")\n .orElse(Auth.config(\"AZURE_OPENAI_API_KEY\"))\n .pipe(Auth.header(\"api-key\")),\n )\n}\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config, modelID: string | ModelID) =>\n route.with({\n auth: auth(input),\n endpoint: endpoint(input, modelID),\n })\n\nfunction endpoint(input: Config, modelID: string | ModelID) {\n const baseURL = ProviderShared.trimBaseUrl(input.baseURL ?? resourceBaseURL(input.resourceName!))\n const query = { \"api-version\": input.apiVersion ?? \"v1\", ...input.queryParams }\n\n if (input.useDeploymentBasedUrls) return { baseURL: `${baseURL}/deployments/${modelID}`, query }\n if (input.baseURL !== undefined && !new URL(input.baseURL).hostname.endsWith(\".openai.azure.com\")) {\n return { baseURL, query: input.queryParams }\n }\n return { baseURL: `${baseURL}/v1`, query }\n}\n\nexport const configure = (input: Config) => {\n const modelDefaults = defaults(input)\n\n const responses = (modelID: string | ModelID) =>\n configuredRoute(responsesRoute, input, modelID)\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n\n const chat = (modelID: string | ModelID) =>\n configuredRoute(chatRoute, input, modelID)\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n\n return {\n id,\n model: responses,\n responses,\n chat,\n configure,\n }\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nconst config = (settings: Settings): Config => {\n const common = {\n apiKey: settings.apiKey,\n apiVersion: settings.apiVersion,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n queryParams: settings.queryParams === undefined ? undefined : { ...settings.queryParams },\n useDeploymentBasedUrls: settings.useDeploymentBasedUrls,\n }\n if (settings.baseURL !== undefined) return { ...common, baseURL: settings.baseURL }\n if (settings.resourceName !== undefined) return { ...common, resourceName: settings.resourceName }\n throw new Error(\"Azure requires resourceName or baseURL\")\n}\n\nexport const responsesModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).responses(modelID)\nexport const chatModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).chat(modelID)\nexport const model = responsesModel\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "E190E87FA5C1CEAD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/amazon-bedrock-mantle.ts"], | ||
| "sourcesContent": [ | ||
| "import { Auth } from \"../route/auth.js\"\nimport type { Route as RouteDef, RouteDefaultsInput } from \"../route/client.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { OpenAIChat } from \"../protocols/openai-chat.js\"\nimport { OpenAIResponses } from \"../protocols/openai-responses.js\"\nimport { BedrockAuth, type Credentials } from \"../protocols/utils/bedrock-auth.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport { withOpenAIOptions, type OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"amazon-bedrock\")\n\nexport type Config = RouteDefaultsInput & {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly credentials?: Credentials\n readonly region?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly auth?: \"bearer\" | \"sigv4\"\n readonly baseURL?: string\n readonly credentials?: Credentials\n readonly region?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nconst responsesRoute = OpenAIResponses.route.with({\n id: \"bedrock-mantle-responses\",\n provider: id,\n})\n\nconst chatRoute = OpenAIChat.route.with({\n id: \"bedrock-mantle-chat\",\n provider: id,\n})\n\nexport const routes = [responsesRoute, chatRoute]\n\nconst configuredRoute = <Body, Prepared>(route: RouteDef<Body, Prepared>, input: Config) => {\n const region = input.region ?? input.credentials?.region ?? \"us-east-1\"\n const credentials = input.credentials === undefined ? undefined : { ...input.credentials, region }\n return route.with({\n endpoint: { baseURL: input.baseURL ?? `https://bedrock-mantle.${region}.api.aws/v1` },\n auth:\n input.apiKey === undefined\n ? BedrockAuth.sigV4(credentials, { service: \"bedrock-mantle\", name: \"Bedrock Mantle\" })\n : Auth.bearer(input.apiKey),\n })\n}\n\nconst defaults = (input: Config) => {\n const { apiKey: _, baseURL: _baseURL, credentials: _credentials, region: _region, ...rest } = input\n return rest\n}\n\nexport const configure = (input: Config = {}) => {\n const configuredResponsesRoute = configuredRoute(responsesRoute, input)\n const configuredChatRoute = configuredRoute(chatRoute, input)\n const modelDefaults = defaults(input)\n const responses = (modelID: string | ModelID) =>\n configuredResponsesRoute\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n const chat = (modelID: string | ModelID) =>\n configuredChatRoute\n .with(withOpenAIOptions(modelID, modelDefaults))\n .model<OpenAIProviderOptionsInput>({ id: modelID })\n\n return {\n id,\n model: chat,\n chat,\n responses,\n configure,\n }\n}\n\nexport const provider = configure()\n\nconst config = (settings: Settings): Config => {\n if (settings.auth === \"bearer\" && settings.apiKey === undefined)\n throw new Error(\"Amazon Bedrock Mantle bearer auth requires apiKey\")\n if (settings.auth === \"sigv4\" && settings.apiKey !== undefined)\n throw new Error(\"Amazon Bedrock Mantle SigV4 auth does not accept apiKey\")\n return {\n apiKey: settings.auth === \"sigv4\" ? undefined : settings.apiKey,\n baseURL: settings.baseURL,\n credentials: settings.credentials,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n region: settings.region,\n }\n}\n\nexport const chatModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).chat(modelID)\nexport const responsesModel: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) => configure(config(settings)).responses(modelID)\nexport const model = chatModel\n" | ||
| ], | ||
| "mappings": ";4QASO,IAAM,EAAK,EAAW,KAAK,gBAAgB,EAmB5C,EAAiB,EAAgB,MAAM,KAAK,CAChD,GAAI,2BACJ,SAAU,CACZ,CAAC,EAEK,EAAY,EAAW,MAAM,KAAK,CACtC,GAAI,sBACJ,SAAU,CACZ,CAAC,EAID,IAAM,EAAkB,CAAiB,EAAiC,IAAkB,CAC1F,IAAM,EAAS,EAAM,QAAU,EAAM,aAAa,QAAU,YACtD,EAAc,EAAM,cAAgB,OAAY,OAAY,IAAK,EAAM,YAAa,QAAO,EACjG,OAAO,EAAM,KAAK,CAChB,SAAU,CAAE,QAAS,EAAM,SAAW,0BAA0B,cAAoB,EACpF,KACE,EAAM,SAAW,OACb,EAAY,MAAM,EAAa,CAAE,QAAS,iBAAkB,KAAM,gBAAiB,CAAC,EACpF,EAAK,OAAO,EAAM,MAAM,CAChC,CAAC,GAGG,EAAW,CAAC,IAAkB,CAClC,IAAQ,OAAQ,EAAG,QAAS,EAAU,YAAa,EAAc,OAAQ,KAAY,GAAS,EAC9F,OAAO,GAGI,EAAY,CAAC,EAAgB,CAAC,IAAM,CAC/C,IAAM,EAA2B,EAAgB,EAAgB,CAAK,EAChE,EAAsB,EAAgB,EAAW,CAAK,EACtD,EAAgB,EAAS,CAAK,EAC9B,EAAY,CAAC,IACjB,EACG,KAAK,EAAkB,EAAS,CAAa,CAAC,EAC9C,MAAkC,CAAE,GAAI,CAAQ,CAAC,EAChD,EAAO,CAAC,IACZ,EACG,KAAK,EAAkB,EAAS,CAAa,CAAC,EAC9C,MAAkC,CAAE,GAAI,CAAQ,CAAC,EAEtD,MAAO,CACL,KACA,MAAO,EACP,OACA,YACA,WACF,GAGW,EAAW,EAAU,EAE5B,EAAS,CAAC,IAA+B,CAC7C,GAAI,EAAS,OAAS,UAAY,EAAS,SAAW,OACpD,MAAU,MAAM,mDAAmD,EACrE,GAAI,EAAS,OAAS,SAAW,EAAS,SAAW,OACnD,MAAU,MAAM,yDAAyD,EAC3E,MAAO,CACL,OAAQ,EAAS,OAAS,QAAU,OAAY,EAAS,OACzD,QAAS,EAAS,QAClB,YAAa,EAAS,YACtB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,gBAAiB,EAAS,gBAC1B,OAAQ,EAAS,MACnB,GAGW,EAAuF,CAClG,EACA,IACG,EAAU,EAAO,CAAQ,CAAC,EAAE,KAAK,CAAO,EAChC,EAA4F,CACvG,EACA,IACG,EAAU,EAAO,CAAQ,CAAC,EAAE,UAAU,CAAO", | ||
| "debugId": "3C6D022C98E820A764756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "E5731F9C867FDD7664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openrouter.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route, type RouteDefaultsInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport { ProviderID, type CacheHint, type ModelID } from \"../schema/index.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport * as OpenAICompatibleProfiles from \"./openai-compatible-profile.js\"\nimport * as OpenAIChat from \"../protocols/openai-chat.js\"\nimport { newBreakpoints, ttlBucket } from \"../protocols/utils/cache.js\"\nimport { isRecord } from \"../protocols/shared.js\"\n\nexport const profile = OpenAICompatibleProfiles.profiles.openrouter\nexport const id = ProviderID.make(profile.provider)\nconst ADAPTER = \"openrouter\"\n\ntype OpenRouterString<Known extends string> = Known | (string & {})\n\nexport interface OpenRouterProviderRouting {\n readonly [key: string]: unknown\n readonly order?: ReadonlyArray<string>\n readonly allow_fallbacks?: boolean\n readonly require_parameters?: boolean\n readonly data_collection?: OpenRouterString<\"allow\" | \"deny\">\n readonly only?: ReadonlyArray<string>\n readonly ignore?: ReadonlyArray<string>\n readonly quantizations?: ReadonlyArray<string>\n readonly sort?: OpenRouterString<\"price\" | \"throughput\" | \"latency\">\n readonly max_price?: Readonly<{\n prompt?: number | string\n completion?: number | string\n image?: number | string\n audio?: number | string\n request?: number | string\n }>\n readonly zdr?: boolean\n}\n\nexport type OpenRouterPlugin =\n | Readonly<{\n id: \"web\"\n max_results?: number\n search_prompt?: string\n engine?: OpenRouterString<\"native\" | \"exa\">\n }>\n | Readonly<{ id: \"file-parser\"; max_files?: number; pdf?: { engine?: string } }>\n | Readonly<{ id: \"moderation\" }>\n | Readonly<{ id: \"response-healing\" }>\n | Readonly<{ id: \"auto-router\"; allowed_models?: ReadonlyArray<string> }>\n | Readonly<{ id: string & {}; [key: string]: unknown }>\n\nexport interface OpenRouterOptions {\n readonly [key: string]: unknown\n readonly debug?: Readonly<{ echo_upstream_body?: boolean }>\n readonly models?: ReadonlyArray<string>\n readonly plugins?: ReadonlyArray<OpenRouterPlugin>\n readonly provider?: OpenRouterProviderRouting\n readonly reasoning?: Readonly<{\n enabled?: boolean\n exclude?: boolean\n effort?: OpenRouterString<\"none\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\">\n max_tokens?: number\n }>\n readonly usage?: boolean | Readonly<{ include: boolean }>\n readonly user?: string\n readonly web_search_options?: Readonly<{\n max_results?: number\n search_prompt?: string\n engine?: OpenRouterString<\"native\" | \"exa\">\n }>\n}\n\nexport type OpenRouterProviderOptionsInput = OpenRouterOptions\n\nexport type LanguageModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: OpenRouterProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL?: string\n readonly providerOptions?: OpenRouterProviderOptionsInput\n}\n\nconst OpenRouterBody = Schema.StructWithRest(Schema.Struct(OpenAIChat.bodyFields), [\n Schema.Record(Schema.String, Schema.Any),\n])\nexport type OpenRouterBody = Schema.Schema.Type<typeof OpenRouterBody>\n\nexport const protocol = Protocol.make({\n id: \"openrouter-chat\",\n body: {\n schema: OpenRouterBody,\n from: (request) =>\n OpenAIChat.fromRequest(request, { cacheControl: cacheControl() }).pipe(\n Effect.map((body) => {\n const sourceAssistants = request.messages.filter((message) => message.role === \"assistant\")\n let assistantIndex = 0\n const messages = body.messages.map((message) => {\n if (message.role !== \"assistant\") return message\n const source = sourceAssistants[assistantIndex++]\n const reasoning = source?.content\n .filter((part) => part.type === \"reasoning\")\n .map((part) => part.text)\n .join(\"\")\n const reasoningDetails = Array.isArray(message.reasoning_details) ? message.reasoning_details : undefined\n return {\n ...message,\n reasoning_content: undefined,\n reasoning_text: undefined,\n reasoning: reasoning && reasoningDetails && reasoningDetails.length > 0 ? reasoning : undefined,\n reasoning_details: reasoningDetails,\n }\n })\n return {\n ...body,\n messages,\n ...bodyOptions(request.providerOptions),\n ...(request.promptCacheKey ? { prompt_cache_key: request.promptCacheKey } : {}),\n } as OpenRouterBody\n }),\n ),\n },\n stream: OpenAIChat.protocol.stream,\n})\n\nconst cacheControl = () => {\n const breakpoints = newBreakpoints(4)\n return (cache: CacheHint | undefined) => {\n if (cache === undefined || breakpoints.remaining === 0) return undefined\n breakpoints.remaining -= 1\n return {\n type: \"ephemeral\" as const,\n ...(ttlBucket(cache.ttlSeconds) === \"1h\" ? { ttl: \"1h\" } : {}),\n }\n }\n}\n\nconst bodyOptions = (input: unknown) => {\n const openrouter = isRecord(input) ? input : {}\n const { usage, models, provider, plugins, web_search_options, debug, user, reasoning, promptCacheKey, ...options } =\n openrouter\n return {\n ...options,\n ...(usage === undefined || usage === true\n ? { usage: { include: true } }\n : usage === false\n ? { usage: { include: false } }\n : isRecord(usage)\n ? { usage }\n : {}),\n ...(Array.isArray(models) ? { models } : {}),\n ...(isRecord(provider) ? { provider } : {}),\n ...(Array.isArray(plugins) ? { plugins } : {}),\n ...(isRecord(web_search_options) ? { web_search_options } : {}),\n ...(isRecord(debug) ? { debug } : {}),\n ...(typeof user === \"string\" ? { user } : {}),\n ...(isRecord(reasoning) ? { reasoning } : {}),\n }\n}\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: profile.provider,\n protocol,\n endpoint: Endpoint.path(\"/chat/completions\", { baseURL: profile.baseURL }),\n framing: Framing.sse,\n})\n\nexport const routes = [route]\n\nconst configuredRoute = (input: LanguageModelOptions) => {\n const { apiKey: _, auth: _auth, baseURL, ...rest } = input\n return route.with({\n ...rest,\n endpoint: { baseURL: baseURL ?? profile.baseURL },\n auth: AuthOptions.bearer(input, \"OPENROUTER_API_KEY\"),\n })\n}\n\nexport const configure = (input: LanguageModelOptions = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model<OpenRouterProviderOptionsInput>({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings, OpenRouterProviderOptionsInput>[\"model\"] = (\n modelID,\n settings,\n) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers,\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n providerOptions: settings.providerOptions,\n }).model(modelID)\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "3C2E1E2D376C4D5064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "235810AC52924FC664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "E1545D92A784174364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/runtime.queue.ts"], | ||
| "sourcesContent": [ | ||
| "// Serial prompt queue for direct interactive mode.\n//\n// Prompts arrive from the footer (user types and hits enter) and local\n// operations drain one at a time. Ordinary prompts submitted during an active\n// ordinary turn are admitted immediately to the server's durable queue.\n//\n// The queue also handles local session commands, empty-prompt rejection,\n// and tracks per-turn wall-clock duration for the footer status line.\n//\n// Resolves when the footer closes and all in-flight work finishes.\nimport { SessionMessage } from \"@opencode-ai/schema/session-message\"\nimport { Locale } from \"../util/locale\"\nimport { isCompactCommand, isExitCommand, isNewCommand } from \"./prompt.shared\"\nimport type { FooterApi, FooterEvent, RunDelivery, RunPrompt } from \"./types\"\n\ntype Trace = {\n write(type: string, data?: unknown): void\n}\n\nexport type QueueInput = {\n footer: FooterApi\n initialInput?: string\n trace?: Trace\n onSend?: (prompt: RunPrompt, delivery: RunDelivery) => void\n onAdmissionError?: (prompt: RunPrompt, error: unknown) => void | Promise<void>\n onNewSession?: () => void | Promise<void>\n onCompact?: () => void | Promise<void>\n admit: (prompt: RunPrompt, delivery: RunDelivery, signal: AbortSignal) => Promise<void>\n settle: () => Promise<void>\n run: (prompt: RunPrompt, signal: AbortSignal, admitted: () => void) => Promise<void>\n}\n\ntype State = {\n queue: RunPrompt[]\n active?: RunPrompt\n admission?: Promise<void>\n ctrl?: AbortController\n closed: boolean\n}\n\n// Runs the prompt queue until the footer closes.\n//\n// Subscribes to footer prompt events and drains operations through input.run().\n// Ordinary prompts submitted during an ordinary active turn are admitted as\n// durable queued work instead of remaining editable process-local state.\nexport async function runPromptQueue(input: QueueInput): Promise<void> {\n const stop = Promise.withResolvers<{ type: \"closed\" }>()\n const done = Promise.withResolvers<void>()\n const state: State = {\n queue: [],\n closed: input.footer.isClosed,\n }\n let draining: Promise<void> | undefined\n let admissions = Promise.resolve()\n let admissionVersion = 0\n const admissionController = new AbortController()\n\n const emit = (next: FooterEvent, row: Record<string, unknown>) => {\n input.trace?.write(\"ui.patch\", row)\n input.footer.event(next)\n }\n\n const finish = () => {\n if (!state.closed || draining) {\n return\n }\n\n done.resolve()\n }\n\n const close = () => {\n if (state.closed) {\n return\n }\n\n state.closed = true\n state.queue.length = 0\n // Ordinary turn signals map to session.interrupt; exiting should only detach the TUI.\n if (state.active?.mode === \"shell\") state.ctrl?.abort()\n admissionController.abort()\n stop.resolve({ type: \"closed\" })\n finish()\n }\n\n const drain = () => {\n if (draining || state.closed || state.queue.length === 0) {\n return\n }\n\n draining = (async () => {\n try {\n while (!state.closed && state.queue.length > 0) {\n const prompt = state.queue.shift()!\n\n if (prompt.mode !== \"shell\" && isNewCommand(prompt.text)) {\n if (!input.onNewSession) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n status: \"new sessions unavailable\",\n },\n },\n {\n status: \"new sessions unavailable\",\n },\n )\n continue\n }\n\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"starting new session\",\n },\n },\n {\n phase: \"running\",\n status: \"starting new session\",\n },\n )\n await input.onNewSession()\n continue\n }\n\n if (prompt.mode !== \"shell\" && isCompactCommand(prompt.text)) {\n emit(\n {\n type: \"stream.patch\",\n patch: {\n phase: \"running\",\n status: \"compacting session\",\n },\n },\n {\n phase: \"running\",\n status: \"compacting session\",\n },\n )\n await input.onCompact?.()\n continue\n }\n\n const sent =\n prompt.mode === \"shell\"\n ? prompt\n : {\n ...prompt,\n messageID: prompt.messageID ?? SessionMessage.ID.create(),\n }\n state.active = sent\n\n emit(\n { type: \"turn.send\" },\n {\n phase: \"running\",\n status: \"sending prompt\",\n },\n )\n const start = Date.now()\n const ctrl = new AbortController()\n const admission = Promise.withResolvers<void>()\n const version = admissionVersion\n state.ctrl = ctrl\n state.admission = admission.promise\n\n try {\n await input.footer.idle()\n if (state.closed) {\n break\n }\n\n if (sent.mode !== \"shell\") {\n const commit = {\n kind: \"user\",\n text: sent.text,\n phase: \"start\",\n source: \"system\",\n messageID: sent.messageID,\n } as const\n input.trace?.write(\"ui.commit\", commit)\n input.footer.append(commit)\n }\n input.onSend?.(sent, sent.delivery ?? \"steer\")\n\n if (state.closed) {\n break\n }\n\n const task = input.run(sent, ctrl.signal, admission.resolve).then(\n () => ({ type: \"done\" as const }),\n (error) => ({ type: \"error\" as const, error }),\n )\n\n const next = await Promise.race([task, stop.promise])\n if (next.type === \"closed\") {\n break\n }\n\n if (next.type === \"error\") {\n throw next.error\n }\n if (sent.mode !== \"shell\" && admissionVersion !== version) {\n do {\n const current = admissionVersion\n await admissions\n if (state.closed) break\n await input.settle()\n if (current === admissionVersion) break\n } while (!state.closed)\n }\n } finally {\n admission.resolve()\n if (state.ctrl === ctrl) {\n state.ctrl = undefined\n }\n if (state.admission === admission.promise) state.admission = undefined\n\n if (sent.mode !== \"shell\") {\n const duration = Locale.duration(Math.max(0, Date.now() - start))\n emit(\n {\n type: \"turn.duration\",\n duration,\n },\n {\n duration,\n },\n )\n }\n state.active = undefined\n }\n }\n } catch (error) {\n done.reject(error)\n return\n } finally {\n draining = undefined\n emit(\n { type: \"turn.idle\" },\n {\n phase: \"idle\",\n status: \"\",\n },\n )\n }\n\n finish()\n })()\n }\n\n const submit = (prompt: RunPrompt) => {\n if (!prompt.text.trim() || state.closed) {\n return\n }\n\n if (prompt.mode !== \"shell\" && isExitCommand(prompt.text)) {\n input.footer.close()\n return\n }\n\n const active = state.active\n if (\n active &&\n active.mode !== \"shell\" &&\n prompt.mode !== \"shell\" &&\n prompt.command?.source !== \"skill\" &&\n !isNewCommand(prompt.text) &&\n !isCompactCommand(prompt.text) &&\n !state.queue.some((item) => item.mode !== \"shell\" && (isNewCommand(item.text) || isCompactCommand(item.text)))\n ) {\n const sent = { ...prompt, messageID: SessionMessage.ID.create() }\n const admission = state.admission\n admissionVersion += 1\n const delivery = prompt.delivery ?? \"queue\"\n input.onSend?.(sent, delivery)\n admissions = admissions\n .then(() => admission)\n .then(() => input.admit(sent, delivery, admissionController.signal))\n .catch((error) => (state.closed ? undefined : input.onAdmissionError?.(sent, error)))\n return\n }\n\n state.queue.push(prompt)\n if (prompt.mode !== \"shell\" && (isNewCommand(prompt.text) || isCompactCommand(prompt.text))) {\n drain()\n return\n }\n\n emit(\n {\n type: \"first\",\n first: false,\n },\n {\n first: false,\n },\n )\n drain()\n }\n\n const offPrompt = input.footer.onPrompt((prompt) => {\n submit(prompt)\n })\n const offClose = input.footer.onClose(() => {\n close()\n })\n try {\n if (state.closed) {\n return\n }\n\n submit({\n text: input.initialInput ?? \"\",\n parts: [],\n })\n finish()\n await done.promise\n } finally {\n offPrompt()\n offClose()\n close()\n await draining?.catch(() => {})\n await admissions\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "D4030DD72F0F041B64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": ["src/services/service-config.ts"], | ||
| "sourcesContent": [ | ||
| "import { Global } from \"@opencode-ai/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": "659A8767E157716364756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/openai-compatible.ts"], | ||
| "sourcesContent": [ | ||
| "import { ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as OpenAICompatibleChat from \"../protocols/openai-compatible-chat.js\"\nimport type { RouteDefaultsInput } from \"../route/client.js\"\nimport { AuthOptions, type ProviderAuthOption } from \"../route/auth-options.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { profiles, type OpenAICompatibleProfile } from \"./openai-compatible-profile.js\"\nimport type { OpenAIProviderOptionsInput } from \"./openai-options.js\"\n\nexport const id = ProviderID.make(\"openai-compatible\")\n\ntype GenericModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly provider?: string\n readonly baseURL: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly baseURL: string\n readonly provider?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n}\n\nexport type FamilyModelOptions = Omit<RouteDefaultsInput, \"providerOptions\"> &\n ProviderAuthOption<\"optional\"> & {\n readonly baseURL?: string\n readonly providerOptions?: OpenAIProviderOptionsInput\n }\n\nexport const routes = [OpenAICompatibleChat.route]\n\nexport const configure = (input: GenericModelOptions) => {\n const provider = input.provider ?? \"openai-compatible\"\n const { provider: _, baseURL, apiKey: _apiKey, auth: _auth, ...rest } = input\n const route = OpenAICompatibleChat.route.with({\n ...rest,\n provider,\n endpoint: { baseURL },\n auth: AuthOptions.bearer(input, []),\n })\n return {\n id: ProviderID.make(provider),\n model: (modelID: string | ModelID) =>\n route.model<OpenAIProviderOptionsInput>({ id: modelID, provider: ProviderID.make(provider) }),\n configure,\n }\n}\n\nconst define = (profile: OpenAICompatibleProfile) => {\n const configureProfile = (input: FamilyModelOptions = {}) => {\n const facade = configure({\n ...input,\n baseURL: input.baseURL ?? profile.baseURL,\n provider: profile.provider,\n })\n return {\n id: ProviderID.make(profile.provider),\n model: facade.model,\n configure: configureProfile,\n }\n }\n return configureProfile()\n}\n\nexport const provider = {\n id,\n configure,\n}\n\nexport const model: ProviderPackage.Definition<Settings, OpenAIProviderOptionsInput>[\"model\"] = (modelID, settings) =>\n configure({\n apiKey: settings.apiKey,\n baseURL: settings.baseURL,\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n provider: settings.provider,\n providerOptions: settings.providerOptions,\n }).model(modelID)\n\nexport const baseten = define(profiles.baseten)\nexport const cerebras = define(profiles.cerebras)\nexport const deepinfra = define(profiles.deepinfra)\nexport const deepseek = define(profiles.deepseek)\nexport const fireworks = define(profiles.fireworks)\nexport const groq = define(profiles.groq)\nexport const togetherai = define(profiles.togetherai)\n" | ||
| ], | ||
| "mappings": ";6nBAQO,IAAM,EAAK,EAAW,KAAK,mBAAmB,EAsBxC,EAAS,CAAsB,CAAK,EAEpC,EAAY,CAAC,IAA+B,CACvD,IAAM,EAAW,EAAM,UAAY,qBAC3B,SAAU,EAAG,UAAS,OAAQ,EAAS,KAAM,KAAU,GAAS,EAClE,EAA6B,EAAM,KAAK,IACzC,EACH,WACA,SAAU,CAAE,SAAQ,EACpB,KAAM,EAAY,OAAO,EAAO,CAAC,CAAC,CACpC,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,CAAQ,EAC5B,MAAO,CAAC,IACN,EAAM,MAAkC,CAAE,GAAI,EAAS,SAAU,EAAW,KAAK,CAAQ,CAAE,CAAC,EAC9F,WACF,GAGI,EAAS,CAAC,IAAqC,CACnD,IAAM,EAAmB,CAAC,EAA4B,CAAC,IAAM,CAC3D,IAAM,EAAS,EAAU,IACpB,EACH,QAAS,EAAM,SAAW,EAAQ,QAClC,SAAU,EAAQ,QACpB,CAAC,EACD,MAAO,CACL,GAAI,EAAW,KAAK,EAAQ,QAAQ,EACpC,MAAO,EAAO,MACd,UAAW,CACb,GAEF,OAAO,EAAiB,GAGb,EAAW,CACtB,KACA,WACF,EAEa,EAAmF,CAAC,EAAS,IACxG,EAAU,CACR,OAAQ,EAAS,OACjB,QAAS,EAAS,QAClB,QAAS,EAAS,UAAY,OAAY,OAAY,IAAK,EAAS,OAAQ,EAC5E,KAAM,EAAS,OAAS,OAAY,OAAY,CAAE,KAAM,IAAK,EAAS,IAAK,CAAE,EAC7E,SAAU,EAAS,SACnB,gBAAiB,EAAS,eAC5B,CAAC,EAAE,MAAM,CAAO,EAEL,EAAU,EAAO,EAAS,OAAO,EACjC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAW,EAAO,EAAS,QAAQ,EACnC,EAAY,EAAO,EAAS,SAAS,EACrC,EAAO,EAAO,EAAS,IAAI,EAC3B,EAAa,EAAO,EAAS,UAAU", | ||
| "debugId": "88D2E4735828D76664756E2164756E21", | ||
| "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": "F3D6BB57CEDAADC664756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "A3931305A97396FD64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/server-process.ts", "src/services/service-registration.ts", "src/services/web-ui.ts", "src/app-assets.ts", "src/commands/handlers/serve.ts"], | ||
| "sourcesContent": [ | ||
| "export * as ServerProcess from \"./server-process\"\n\nimport { NodeServices } from \"@effect/platform-node\"\nimport { Service, type DiscoverOptions } from \"@opencode-ai/client/effect/service\"\nimport { LayerNode } from \"@opencode-ai/util/effect/layer-node\"\nimport { Global } from \"@opencode-ai/util/global\"\nimport { OPENCODE_CHANNEL, OPENCODE_VERSION } from \"./version\"\nimport { AppProcess } from \"@opencode-ai/util/process\"\nimport { randomBytes, randomUUID } from \"node:crypto\"\nimport { Effect, Option, Redacted, Schedule } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { Env } from \"./env\"\nimport { ServiceConfig } from \"./services/service-config\"\nimport { ServiceRegistration } from \"./services/service-registration\"\nimport { Updater } from \"./services/updater\"\nimport { WebUi } from \"./services/web-ui\"\n\nexport type Mode = \"default\" | \"service\" | \"stdio\"\n\nexport type Options = {\n readonly mode: Mode\n readonly hostname?: string\n readonly port?: number\n}\n\n// The process effect lives until server shutdown; tracing it would parent every request to one process-lifetime trace.\nexport const run = Effect.fnUntraced(function* (options: Options) {\n return yield* processEffect(options).pipe(\n Effect.provide(Updater.layer),\n Effect.provide(\n LayerNode.compile(LayerNode.group([Global.node, AppProcess.node]), [\n [\n Global.node,\n Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),\n ],\n ]),\n ),\n Effect.provide(NodeServices.layer),\n )\n})\n\nconst processEffect = Effect.fnUntraced(function* (options: Options) {\n const global = yield* Global.Service\n if (options.mode === \"service\") yield* Effect.sync(() => process.chdir(global.home))\n return yield* Effect.scoped(\n Effect.gen(function* () {\n const foreground = options.mode === \"default\"\n const serviceOptions = options.mode === \"service\" ? yield* ServiceConfig.options() : undefined\n const config = options.mode === \"service\" ? yield* ServiceConfig.read() : {}\n const hostname = options.hostname ?? config.hostname ?? \"127.0.0.1\"\n const port = options.port ?? config.port ?? (options.mode === \"service\" ? ServiceConfig.defaultPort() : undefined)\n const incumbent =\n serviceOptions !== undefined && port !== undefined\n ? yield* Service.incumbent({ ...serviceOptions, url: serviceURL(hostname, port) })\n : undefined\n if (incumbent !== undefined) return\n const { start } = yield* Effect.promise(() => import(\"@opencode-ai/server/process\"))\n const environmentPassword = yield* Env.password\n // Keep the lease credential out of the environment inherited by tools.\n if (options.mode === \"stdio\") {\n delete process.env.OPENCODE_PASSWORD\n delete process.env.OPENCODE_SERVER_PASSWORD\n }\n const password =\n options.mode === \"service\"\n ? config.password || randomBytes(32).toString(\"base64url\")\n : environmentPassword\n ? Redacted.value(environmentPassword)\n : randomBytes(32).toString(\"base64url\")\n if (!password) return yield* Effect.fail(new Error(\"Missing server password\"))\n const instanceID = randomUUID()\n const transform = yield* WebUi.handler()\n const server = yield* start(\n {\n app: {\n name: process.env.OPENCODE_CLIENT ?? \"cli\",\n version: OPENCODE_VERSION,\n channel: OPENCODE_CHANNEL,\n },\n hostname,\n port,\n password,\n simulation: truthy(process.env.OPENCODE_SIMULATE),\n database: {\n path:\n process.env.OPENCODE_DB ??\n ([\"latest\", \"dev\", \"beta\", \"next\", \"prod\"].includes(OPENCODE_CHANNEL) ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"1\" ||\n process.env.OPENCODE_DISABLE_CHANNEL_DB === \"true\"\n ? \"opencode.db\"\n : `opencode-${OPENCODE_CHANNEL.replace(/[^a-zA-Z0-9._-]/g, \"-\")}.db`),\n },\n models: {\n url: process.env.OPENCODE_MODELS_URL,\n file: process.env.OPENCODE_MODELS_PATH,\n fetch: !truthy(process.env.OPENCODE_DISABLE_MODELS_FETCH),\n },\n config: {\n directory: process.env.OPENCODE_CONFIG_DIR,\n project: !truthy(\n process.env.OPENCODE_CONFIG_PROJECT_DISABLE ?? process.env.OPENCODE_DISABLE_PROJECT_CONFIG,\n ),\n file: process.env.OPENCODE_CONFIG,\n content: process.env.OPENCODE_CONFIG_CONTENT,\n },\n windows: {\n gitbash: process.env.OPENCODE_GIT_BASH_PATH,\n },\n fs: {\n filewatcher: !truthy(process.env.OPENCODE_FILEWATCHER_DISABLE ?? process.env.OPENCODE_DISABLE_FILEWATCHER),\n fff:\n process.env.OPENCODE_DISABLE_FFF === undefined\n ? process.platform !== \"win32\"\n : !truthy(process.env.OPENCODE_DISABLE_FFF),\n },\n },\n serviceOptions === undefined\n ? undefined\n : {\n onListen: (address, shutdown) =>\n Effect.gen(function* () {\n if (!config.password) yield* ServiceConfig.password(password)\n return yield* ServiceRegistration.register({\n address,\n password,\n id: instanceID,\n file: serviceOptions.file,\n shutdown,\n })\n }),\n },\n transform,\n ).pipe(\n Effect.catch((error) => {\n if (serviceOptions === undefined || port === undefined || !addressInUse(error)) return Effect.fail(error)\n return recognizeIncumbent(serviceOptions, hostname, port).pipe(\n Effect.flatMap((found) =>\n found\n ? Effect.void\n : Effect.fail(\n new Error(\n `Managed service port ${port} on ${hostname} is already in use by another process. ` +\n \"Configure another port with `opencode service set port <port>` and start the service again.\",\n { cause: error },\n ),\n ),\n ),\n )\n }),\n )\n if (server === undefined) return\n const url = HttpServer.formatAddress(server.address)\n console.log(options.mode === \"stdio\" ? JSON.stringify({ url }) : `server listening on ${url}`)\n if (foreground && !environmentPassword) console.log(`server password ${password}`)\n const updater = yield* Updater.Service\n yield* updater.check().pipe(Effect.schedule(Schedule.spaced(\"10 minutes\")), Effect.forkScoped)\n return yield* options.mode === \"service\"\n ? server.shutdown\n : options.mode === \"stdio\"\n ? waitForStdinClose()\n : Effect.never\n }).pipe(Effect.annotateLogs({ role: \"server\" })),\n )\n})\n\nconst recognizeIncumbent = Effect.fnUntraced(function* (options: DiscoverOptions, hostname: string, port: number) {\n const found = yield* Service.incumbent({ ...options, url: serviceURL(hostname, port) }).pipe(\n Effect.filterOrFail((value) => value !== undefined),\n Effect.retry(Schedule.spaced(\"100 millis\")),\n Effect.timeoutOption(\"15 seconds\"),\n )\n return Option.isSome(found)\n})\n\nfunction serviceURL(hostname: string, port: number) {\n return `http://${hostname.includes(\":\") ? `[${hostname}]` : hostname}:${port}`\n}\n\nfunction truthy(value?: string) {\n return value === \"1\" || value?.toLowerCase() === \"true\"\n}\n\nfunction addressInUse(error: unknown): boolean {\n if (typeof error !== \"object\" || error === null) return false\n if (\"code\" in error && error.code === \"EADDRINUSE\") return true\n return \"cause\" in error && addressInUse(error.cause)\n}\n\nfunction waitForStdinClose() {\n return Effect.callback<void>((resume) => {\n const close = () => resume(Effect.void)\n process.stdin.once(\"end\", close)\n process.stdin.once(\"close\", close)\n process.stdin.resume()\n if (process.stdin.readableEnded || process.stdin.destroyed) close()\n return Effect.sync(() => {\n process.stdin.off(\"end\", close)\n process.stdin.off(\"close\", close)\n process.stdin.pause()\n })\n })\n}\n", | ||
| "export * as ServiceRegistration from \"./service-registration\"\n\nimport { Service, type Info } from \"@opencode-ai/client/effect/service\"\nimport path from \"node:path\"\nimport { Effect, FileSystem, Schedule, Schema } from \"effect\"\nimport { HttpServer } from \"effect/unstable/http\"\nimport { OPENCODE_VERSION } from \"../version\"\n\nconst infoJson = Schema.fromJsonString(Service.Info)\nconst encodeInfo = Schema.encodeEffect(infoJson)\nconst decodeInfo = Schema.decodeUnknownEffect(infoJson)\n\nexport const register = Effect.fnUntraced(function* (options: {\n readonly address: HttpServer.Address\n readonly password: string\n readonly id: string\n readonly file: string\n readonly shutdown: Effect.Effect<void>\n}) {\n const fs = yield* FileSystem.FileSystem\n const temp = options.file + \".\" + options.id + \".tmp\"\n yield* fs.makeDirectory(path.dirname(options.file), { recursive: true })\n const info = {\n id: options.id,\n version: OPENCODE_VERSION,\n url: HttpServer.formatAddress(options.address),\n pid: process.pid,\n password: options.password,\n }\n const encoded = yield* encodeInfo(info)\n const current = fs.readFileString(options.file).pipe(Effect.flatMap(decodeInfo))\n const owns = (found: Info) =>\n found.id === info.id &&\n found.version === info.version &&\n found.url === info.url &&\n found.pid === info.pid &&\n found.password === info.password\n yield* fs.writeFileString(temp, encoded, { mode: 0o600 }).pipe(Effect.andThen(fs.rename(temp, options.file)))\n yield* current.pipe(\n Effect.catchCause((cause) =>\n Effect.logWarning(\"managed service registration check failed; shutting down\", {\n cause,\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n }).pipe(Effect.andThen(Effect.failCause(cause))),\n ),\n Effect.tap((found) =>\n owns(found)\n ? Effect.void\n : Effect.logWarning(\"managed service registration replaced; shutting down\", {\n serviceID: options.id,\n servicePID: process.pid,\n registration: options.file,\n observedServiceID: found.id,\n observedServicePID: found.pid,\n observedVersion: found.version,\n observedURL: found.url,\n }),\n ),\n Effect.filterOrFail(owns),\n Effect.repeat(Schedule.spaced(\"5 seconds\")),\n Effect.ignore,\n Effect.andThen(options.shutdown),\n Effect.forkScoped,\n )\n return current.pipe(\n Effect.flatMap((found) => (owns(found) ? fs.remove(options.file) : Effect.void)),\n Effect.ignore,\n )\n})\n", | ||
| "import { FSUtil } from \"@opencode-ai/util/fs-util\"\nimport { Effect, FileSystem } from \"effect\"\nimport { HttpServerError, HttpServerRequest, HttpServerResponse } from \"effect/unstable/http\"\nimport { createHash } from \"node:crypto\"\nimport { load, type AssetMap } from \"../app-assets\"\n\nexport const handler = Effect.fn(\"cli.web-ui.handler\")(function* (options?: { readonly assets?: AssetMap }) {\n const fileSystem = yield* FileSystem.FileSystem\n const assets = options?.assets\n ? Effect.succeed(options.assets)\n : yield* Effect.cached(load().pipe(Effect.provideService(FileSystem.FileSystem, fileSystem)))\n return <E, R>(api: Effect.Effect<HttpServerResponse.HttpServerResponse, E, R>) =>\n api.pipe(\n Effect.catchIf(isRouteNotFound, () =>\n HttpServerRequest.HttpServerRequest.pipe(\n Effect.flatMap((request) => {\n const url = new URL(request.url, \"http://localhost\")\n if (url.pathname === \"/api\" || url.pathname.startsWith(\"/api/\"))\n return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n return assets.pipe(Effect.flatMap((files) => serveUI(request, url, files)))\n }),\n ),\n ),\n )\n})\n\nfunction serveUI(request: HttpServerRequest.HttpServerRequest, url: URL, assets: AssetMap) {\n const key = url.pathname.replace(/^\\//, \"\")\n const name = assets[key] !== undefined ? key : \"index.html\"\n const file = assets[name]\n if (!file) return Effect.succeed(HttpServerResponse.empty({ status: 404 }))\n if (request.method !== \"GET\" && request.method !== \"HEAD\")\n return Effect.succeed(HttpServerResponse.empty({ status: 405 }))\n const html = name === \"index.html\"\n const 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": "D65A450A875C5A9464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/pair.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"os\"\nimport { Effect } from \"effect\"\nimport { Service } from \"@opencode-ai/client/effect/service\"\nimport { OpenCode } from \"@opencode-ai/client/promise\"\nimport { renderUnicodeCompact } from \"uqr\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServiceConfig } from \"../../services/service-config\"\n\nexport default Runtime.handler(\n Commands.commands.pair,\n Effect.fn(\"cli.pair\")(function* () {\n const endpoint = yield* Service.ensure(yield* ServiceConfig.options())\n const password = yield* ServiceConfig.password()\n const server = yield* Effect.tryPromise(() =>\n OpenCode.make({ baseUrl: endpoint.url, headers: Service.headers(endpoint) }).server.get(),\n )\n const info = { urls: server.urls, username: \"opencode\", password }\n process.stdout.write(\n [\n \"\",\n ` URLs ${info.urls[0] ?? \"(none)\"}`,\n ...info.urls.slice(1).map((url) => ` ${url}`),\n ` Username ${info.username}`,\n ` Password ${info.password}`,\n \"\",\n \" Scan to pair\",\n \"\",\n renderUnicodeCompact(JSON.stringify(info), { border: 2 })\n .split(EOL)\n .map((line) => \" \" + line)\n .join(EOL),\n \"\",\n ].join(EOL) + EOL,\n )\n\n const hostname = new URL(endpoint.url).hostname\n if (![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)) return\n process.stderr.write(` Run \\`opencode service set hostname 0.0.0.0\\` to access the service remotely.${EOL}${EOL}`)\n }),\n)\n" | ||
| ], | ||
| "mappings": ";u9BAAA,cAAS,WAST,IAAe,IAAQ,QACrB,EAAS,SAAS,KAClB,EAAO,GAAG,UAAU,EAAE,SAAU,EAAG,CACjC,IAAM,EAAW,MAAO,EAAQ,OAAO,MAAO,EAAc,QAAQ,CAAC,EAC/D,EAAW,MAAO,EAAc,SAAS,EAIzC,EAAO,CAAE,MAHA,MAAO,EAAO,WAAW,IACtC,EAAS,KAAK,CAAE,QAAS,EAAS,IAAK,QAAS,EAAQ,QAAQ,CAAQ,CAAE,CAAC,EAAE,OAAO,IAAI,CAC1F,GAC4B,KAAM,SAAU,WAAY,UAAS,EACjE,QAAQ,OAAO,MACb,CACE,GACA,eAAe,EAAK,KAAK,IAAM,WAC/B,GAAG,EAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAQ,eAAe,GAAK,EACvD,eAAe,EAAK,WACpB,eAAe,EAAK,WACpB,GACA,iBACA,GACA,EAAqB,KAAK,UAAU,CAAI,EAAG,CAAE,OAAQ,CAAE,CAAC,EACrD,MAAM,CAAG,EACT,IAAI,CAAC,IAAS,KAAO,CAAI,EACzB,KAAK,CAAG,EACX,EACF,EAAE,KAAK,CAAG,EAAI,CAChB,EAEA,IAAM,EAAW,IAAI,IAAI,EAAS,GAAG,EAAE,SACvC,GAAI,CAAC,CAAC,YAAa,YAAa,OAAO,EAAE,SAAS,CAAQ,EAAG,OAC7D,QAAQ,OAAO,MAAM,kFAAkF,IAAM,GAAK,EACnH,CACH", | ||
| "debugId": "D3CC4EBF23AB082564756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/bedrock-event-stream.ts", "../ai/src/protocols/utils/bedrock-cache.ts", "../ai/src/protocols/utils/bedrock-media.ts", "../ai/src/protocols/bedrock-converse.ts", "../ai/src/providers/amazon-bedrock.ts"], | ||
| "sourcesContent": [ | ||
| "import { EventStreamCodec } from \"@smithy/eventstream-codec\"\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\"\nimport { Effect, Stream } from \"effect\"\nimport { Framing } from \"../route/framing.js\"\nimport { ProviderShared } from \"./shared.js\"\n\n// Bedrock streams responses using the AWS event stream binary protocol — each\n// frame is `[length:4][headers-length:4][prelude-crc:4][headers][payload][crc:4]`.\n// We use `@smithy/eventstream-codec` to validate framing and CRCs, then\n// reconstruct the JSON wrapping by `:event-type` so the chunk schema can match.\nconst eventCodec = new EventStreamCodec(toUtf8, fromUtf8)\nconst utf8 = new TextDecoder()\n\n// Cursor-tracking buffer state. Bytes accumulate in `buffer`; `offset` is the\n// read position. Reading by `subarray` is zero-copy. We only allocate a fresh\n// buffer when a new network chunk arrives and we need to append.\ninterface FrameBufferState {\n readonly buffer: Uint8Array\n readonly offset: number\n}\n\nconst initialFrameBuffer: FrameBufferState = { buffer: new Uint8Array(0), offset: 0 }\n\nconst appendChunk = (state: FrameBufferState, chunk: Uint8Array): FrameBufferState => {\n const remaining = state.buffer.length - state.offset\n // Compact: drop the consumed prefix and append the new chunk in one alloc.\n // This bounds buffer growth to at most one network chunk past the live\n // window, regardless of stream length.\n const next = new Uint8Array(remaining + chunk.length)\n next.set(state.buffer.subarray(state.offset), 0)\n next.set(chunk, remaining)\n return { buffer: next, offset: 0 }\n}\n\nconst consumeFrames = (route: string) => (state: FrameBufferState, chunk: Uint8Array) =>\n Effect.gen(function* () {\n let cursor = appendChunk(state, chunk)\n const out: object[] = []\n while (cursor.buffer.length - cursor.offset >= 4) {\n const view = cursor.buffer.subarray(cursor.offset)\n const totalLength = new DataView(view.buffer, view.byteOffset, view.byteLength).getUint32(0, false)\n if (view.length < totalLength) break\n\n const decoded = yield* Effect.try({\n try: () => eventCodec.decode(view.subarray(0, totalLength)),\n catch: (error) =>\n ProviderShared.eventError(\n route,\n `Failed to decode Bedrock Converse event-stream frame: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n })\n cursor = { buffer: cursor.buffer, offset: cursor.offset + totalLength }\n\n const messageType = decoded.headers[\":message-type\"]?.value\n if (messageType === \"error\") {\n const code = decoded.headers[\":error-code\"]?.value\n const message = decoded.headers[\":error-message\"]?.value\n return yield* ProviderShared.eventError(\n route,\n [code, message].filter((value): value is string => typeof value === \"string\").join(\": \") ||\n \"Bedrock Converse event-stream error\",\n )\n }\n const eventType =\n messageType === \"event\"\n ? decoded.headers[\":event-type\"]?.value\n : messageType === \"exception\"\n ? decoded.headers[\":exception-type\"]?.value\n : undefined\n if (typeof eventType !== \"string\") continue\n const payload = utf8.decode(decoded.body)\n if (!payload) continue\n // The AWS event stream pads short payloads with a `p` field. Drop it\n // before handing the object to the chunk schema. JSON decode goes\n // through the shared Schema-driven codec to satisfy the package rule\n // against ad-hoc `JSON.parse` calls.\n const parsed = (yield* ProviderShared.parseJson(\n route,\n payload,\n \"Failed to parse Bedrock Converse event-stream payload\",\n )) as Record<string, unknown>\n delete parsed.p\n out.push({ [eventType]: parsed })\n }\n return [cursor, out] as const\n })\n\n/**\n * AWS event-stream framing for Bedrock Converse. Each frame is decoded by\n * `@smithy/eventstream-codec` (length + header + payload + CRC) and rewrapped\n * under its `:event-type` header so the chunk schema can match the JSON\n * payload directly.\n */\nexport const framing = (route: string): Framing.Definition<object> => ({\n id: \"aws-event-stream\",\n frame: (bytes) => bytes.pipe(Stream.mapAccumEffect(() => initialFrameBuffer, consumeFrames(route))),\n})\n\nexport * as BedrockEventStream from \"./bedrock-event-stream.js\"\n", | ||
| "import { Schema } from \"effect\"\nimport type { CacheHint } from \"../../schema/index.js\"\nimport { newBreakpoints, ttlBucket, type Breakpoints } from \"./cache.js\"\n\n// Bedrock cache markers are positional: emit a `cachePoint` block immediately\n// after the content the caller wants treated as a cacheable prefix. Bedrock\n// accepts optional `ttl: \"5m\" | \"1h\"` on cachePoint.\nexport const CachePointBlock = Schema.Struct({\n cachePoint: Schema.Struct({\n type: Schema.tag(\"default\"),\n ttl: Schema.optional(Schema.Literals([\"5m\", \"1h\"])),\n }),\n})\nexport type CachePointBlock = Schema.Schema.Type<typeof CachePointBlock>\n\n// Callers pass a shared counter through every `block()` call site so the\n// four-breakpoint budget is respected across `system`, `messages`, and `tools`.\nexport const BEDROCK_BREAKPOINT_CAP = 4\n\nexport type { Breakpoints } from \"./cache.js\"\nexport const breakpoints = () => newBreakpoints(BEDROCK_BREAKPOINT_CAP)\n\nconst DEFAULT_5M: CachePointBlock = { cachePoint: { type: \"default\" } }\nconst DEFAULT_1H: CachePointBlock = { cachePoint: { type: \"default\", ttl: \"1h\" } }\n\nexport const block = (breakpoints: Breakpoints, cache: CacheHint | undefined): CachePointBlock | undefined => {\n if (cache?.type !== \"ephemeral\" && cache?.type !== \"persistent\") return undefined\n if (breakpoints.remaining <= 0) {\n breakpoints.dropped += 1\n return undefined\n }\n breakpoints.remaining -= 1\n return ttlBucket(cache.ttlSeconds) === \"1h\" ? DEFAULT_1H : DEFAULT_5M\n}\n\nexport * as BedrockCache from \"./bedrock-cache.js\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport type { MediaPart } from \"../../schema/index.js\"\nimport { ProviderShared } from \"../shared.js\"\n\n// Bedrock Converse accepts image `format` as the file extension and\n// `source.bytes` as base64 in the JSON wire format.\nexport const ImageFormat = Schema.Literals([\"png\", \"jpeg\", \"gif\", \"webp\"])\nexport type ImageFormat = Schema.Schema.Type<typeof ImageFormat>\n\nexport const ImageBlock = Schema.Struct({\n image: Schema.Struct({\n format: ImageFormat,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type ImageBlock = Schema.Schema.Type<typeof ImageBlock>\n\n// Bedrock document blocks require a user-facing name so the model can refer to\n// the uploaded document.\nexport const DocumentFormat = Schema.Literals([\"pdf\", \"csv\", \"doc\", \"docx\", \"xls\", \"xlsx\", \"html\", \"txt\", \"md\"])\nexport type DocumentFormat = Schema.Schema.Type<typeof DocumentFormat>\n\nexport const DocumentBlock = Schema.Struct({\n document: Schema.Struct({\n format: DocumentFormat,\n name: Schema.String,\n source: Schema.Struct({ bytes: Schema.String }),\n }),\n})\nexport type DocumentBlock = Schema.Schema.Type<typeof DocumentBlock>\n\nconst IMAGE_FORMATS = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpeg\",\n \"image/gif\": \"gif\",\n \"image/webp\": \"webp\",\n} as const satisfies Record<string, ImageFormat>\n\nconst DOCUMENT_FORMATS = {\n \"application/pdf\": \"pdf\",\n \"text/csv\": \"csv\",\n \"application/msword\": \"doc\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"text/html\": \"html\",\n \"text/plain\": \"txt\",\n \"text/markdown\": \"md\",\n} as const satisfies Record<string, DocumentFormat>\n\nconst documentBlock = (name: string, format: DocumentFormat, bytes: string): DocumentBlock => ({\n document: {\n format,\n name,\n source: { bytes },\n },\n})\n\n// Route by MIME. Known image/document formats lower into a typed block; anything\n// else fails with a clear error instead of silently degrading to a malformed\n// document block. Image MIME types not in `IMAGE_FORMATS` (e.g. `image/svg+xml`)\n// get an image-specific error so the caller knows it's a format-support issue,\n// not a kind-detection issue.\nexport const lower = Effect.fn(\"BedrockMedia.lower\")(function* (part: MediaPart) {\n const mime = part.mediaType.toLowerCase()\n const imageFormat = IMAGE_FORMATS[mime as keyof typeof IMAGE_FORMATS]\n if (imageFormat) {\n const media = ProviderShared.normalizeMedia(part)\n return { image: { format: imageFormat, source: { bytes: media.base64 } } } satisfies ImageBlock\n }\n if (mime.startsWith(\"image/\"))\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support image media type ${part.mediaType}`)\n const documentFormat = DOCUMENT_FORMATS[mime as keyof typeof DOCUMENT_FORMATS]\n if (documentFormat) {\n if (!part.filename)\n return yield* ProviderShared.invalidRequest(\"Bedrock Converse document media requires a filename\")\n const media = ProviderShared.normalizeMedia(part)\n return documentBlock(part.filename, documentFormat, media.base64)\n }\n return yield* ProviderShared.invalidRequest(`Bedrock Converse does not support media type ${part.mediaType}`)\n})\n\nexport * as BedrockMedia from \"./bedrock-media.js\"\n", | ||
| "import { Effect, Schema } from \"effect\"\nimport { Route } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Protocol } from \"../route/protocol.js\"\nimport {\n AIError,\n LLMEvent,\n Usage,\n type CacheHint,\n type FinishReason,\n type FinishReasonDetails,\n type JsonSchema,\n type LLMRequest,\n type LanguageModelToolSchemaCompatibility,\n type ProviderMetadata,\n type ReasoningPart,\n type ToolCallPart,\n type ToolDefinition,\n type ToolResultPart,\n} from \"../schema/index.js\"\nimport { BedrockEventStream } from \"./bedrock-event-stream.js\"\nimport { classifyProviderFailure } from \"../provider-error.js\"\nimport { JsonObject, optionalArray, ProviderShared } from \"./shared.js\"\nimport { BedrockAuth } from \"./utils/bedrock-auth.js\"\nimport { BedrockCache } from \"./utils/bedrock-cache.js\"\nimport { BedrockMedia } from \"./utils/bedrock-media.js\"\nimport { Lifecycle } from \"./utils/lifecycle.js\"\nimport { ToolSchemaProjection } from \"./utils/tool-schema.js\"\nimport { ToolStream } from \"./utils/tool-stream.js\"\n\nconst ADAPTER = \"bedrock-converse\"\n\nexport type { Credentials as BedrockCredentials } from \"./utils/bedrock-auth.js\"\n\n// =============================================================================\n// Request Body Schema\n// =============================================================================\nconst BedrockTextBlock = Schema.Struct({\n text: Schema.String,\n})\ntype BedrockTextBlock = Schema.Schema.Type<typeof BedrockTextBlock>\n\nconst BedrockToolUseBlock = Schema.Struct({\n toolUse: Schema.Struct({\n toolUseId: Schema.String,\n name: Schema.String,\n input: Schema.Unknown,\n }),\n})\ntype BedrockToolUseBlock = Schema.Schema.Type<typeof BedrockToolUseBlock>\n\nconst BedrockToolResultContentItem = Schema.Union([\n Schema.Struct({ text: Schema.String }),\n Schema.Struct({ json: Schema.Unknown }),\n BedrockMedia.ImageBlock,\n BedrockMedia.DocumentBlock,\n])\n\nconst BedrockToolResultBlock = Schema.Struct({\n toolResult: Schema.Struct({\n toolUseId: Schema.String,\n content: Schema.Array(BedrockToolResultContentItem),\n status: Schema.optional(Schema.Literals([\"success\", \"error\"])),\n }),\n})\ntype BedrockToolResultBlock = Schema.Schema.Type<typeof BedrockToolResultBlock>\n\nconst BedrockReasoningBlock = Schema.Struct({\n reasoningContent: Schema.Union([\n Schema.Struct({\n reasoningText: Schema.Struct({\n text: Schema.String,\n signature: Schema.optional(Schema.String),\n }),\n }),\n Schema.Struct({ redactedContent: Schema.String }),\n ]),\n})\n\nconst BedrockUserBlock = Schema.Union([\n BedrockTextBlock,\n BedrockMedia.ImageBlock,\n BedrockMedia.DocumentBlock,\n BedrockToolResultBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockUserBlock = Schema.Schema.Type<typeof BedrockUserBlock>\n\nconst BedrockAssistantBlock = Schema.Union([\n BedrockTextBlock,\n BedrockReasoningBlock,\n BedrockToolUseBlock,\n BedrockCache.CachePointBlock,\n])\ntype BedrockAssistantBlock = Schema.Schema.Type<typeof BedrockAssistantBlock>\n\nconst BedrockMessage = Schema.Union([\n Schema.Struct({ role: Schema.Literal(\"user\"), content: Schema.Array(BedrockUserBlock) }),\n Schema.Struct({ role: Schema.Literal(\"assistant\"), content: Schema.Array(BedrockAssistantBlock) }),\n]).pipe(Schema.toTaggedUnion(\"role\"))\ntype BedrockMessage = Schema.Schema.Type<typeof BedrockMessage>\n\nconst BedrockSystemBlock = Schema.Union([BedrockTextBlock, BedrockCache.CachePointBlock])\ntype BedrockSystemBlock = Schema.Schema.Type<typeof BedrockSystemBlock>\n\nconst BedrockToolSpec = Schema.Struct({\n toolSpec: Schema.Struct({\n name: Schema.String,\n description: Schema.String,\n inputSchema: Schema.Struct({\n json: JsonObject,\n }),\n }),\n})\ntype BedrockToolSpec = Schema.Schema.Type<typeof BedrockToolSpec>\n\nconst BedrockTool = Schema.Union([BedrockToolSpec, BedrockCache.CachePointBlock])\ntype BedrockTool = Schema.Schema.Type<typeof BedrockTool>\n\nconst BedrockToolChoice = Schema.Union([\n Schema.Struct({ auto: Schema.Struct({}) }),\n Schema.Struct({ any: Schema.Struct({}) }),\n Schema.Struct({ tool: Schema.Struct({ name: Schema.String }) }),\n])\n\nconst BedrockBodyFields = {\n modelId: Schema.String,\n messages: Schema.Array(BedrockMessage),\n system: optionalArray(BedrockSystemBlock),\n inferenceConfig: Schema.optional(\n Schema.Struct({\n maxTokens: Schema.optional(Schema.Number),\n temperature: Schema.optional(Schema.Number),\n topP: Schema.optional(Schema.Number),\n stopSequences: optionalArray(Schema.String),\n }),\n ),\n toolConfig: Schema.optional(\n Schema.Struct({\n tools: Schema.Array(BedrockTool),\n toolChoice: Schema.optional(BedrockToolChoice),\n }),\n ),\n additionalModelRequestFields: Schema.optional(JsonObject),\n}\nconst BedrockConverseBody = Schema.Struct(BedrockBodyFields)\nexport type BedrockConverseBody = Schema.Schema.Type<typeof BedrockConverseBody>\n\nconst BedrockUsageSchema = Schema.Struct({\n inputTokens: Schema.optional(Schema.Number),\n outputTokens: Schema.optional(Schema.Number),\n totalTokens: Schema.optional(Schema.Number),\n cacheReadInputTokens: Schema.optional(Schema.Number),\n cacheWriteInputTokens: Schema.optional(Schema.Number),\n})\ntype BedrockUsageSchema = Schema.Schema.Type<typeof BedrockUsageSchema>\n\nconst BedrockStreamException = Schema.Struct({\n message: Schema.optional(Schema.String),\n originalMessage: Schema.optional(Schema.String),\n originalStatusCode: Schema.optional(Schema.Number),\n})\n\n// Streaming event shape — the AWS event stream wraps each JSON payload by its\n// `:event-type` header (e.g. `messageStart`, `contentBlockDelta`). We\n// reconstruct that wrapping in `decodeFrames` below so the event schema can\n// stay a plain discriminated record.\nconst BedrockEvent = Schema.Struct({\n messageStart: Schema.optional(Schema.Struct({ role: Schema.String })),\n contentBlockStart: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n start: Schema.optional(\n Schema.Struct({\n toolUse: Schema.optional(Schema.Struct({ toolUseId: Schema.String, name: Schema.String })),\n }),\n ),\n }),\n ),\n contentBlockDelta: Schema.optional(\n Schema.Struct({\n contentBlockIndex: Schema.Number,\n delta: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n toolUse: Schema.optional(Schema.Struct({ input: Schema.String })),\n reasoningContent: Schema.optional(\n Schema.Struct({\n text: Schema.optional(Schema.String),\n signature: Schema.optional(Schema.String),\n // Blob fields in Bedrock's JSON event stream are base64 strings.\n redactedContent: Schema.optional(Schema.String),\n // Vercel's Bedrock provider exposes the same delta under\n // Anthropic's shorter `data` spelling.\n data: Schema.optional(Schema.String),\n }),\n ),\n }),\n ),\n }),\n ),\n contentBlockStop: Schema.optional(Schema.Struct({ contentBlockIndex: Schema.Number })),\n messageStop: Schema.optional(\n Schema.Struct({\n stopReason: Schema.String,\n additionalModelResponseFields: Schema.optional(Schema.Unknown),\n }),\n ),\n metadata: Schema.optional(\n Schema.Struct({\n usage: Schema.optional(BedrockUsageSchema),\n metrics: Schema.optional(Schema.Unknown),\n }),\n ),\n internalServerException: Schema.optional(BedrockStreamException),\n modelStreamErrorException: Schema.optional(BedrockStreamException),\n validationException: Schema.optional(BedrockStreamException),\n throttlingException: Schema.optional(BedrockStreamException),\n serviceUnavailableException: Schema.optional(BedrockStreamException),\n})\ntype BedrockEvent = Schema.Schema.Type<typeof BedrockEvent>\n\n// =============================================================================\n// Request Lowering\n// =============================================================================\nconst lowerToolSpec = (tool: ToolDefinition, inputSchema: JsonSchema): BedrockToolSpec => ({\n toolSpec: {\n name: tool.name,\n description: tool.description,\n inputSchema: { json: inputSchema },\n },\n})\n\nconst lowerTools = (\n compatibility: LanguageModelToolSchemaCompatibility | undefined,\n breakpoints: BedrockCache.Breakpoints,\n tools: ReadonlyArray<ToolDefinition>,\n): BedrockTool[] => {\n const result: BedrockTool[] = []\n for (const tool of tools) {\n result.push(lowerToolSpec(tool, ToolSchemaProjection.modelCompatibility(tool.inputSchema, compatibility)))\n const cachePoint = BedrockCache.block(breakpoints, tool.cache)\n if (cachePoint) result.push(cachePoint)\n }\n return result\n}\n\nconst textWithCache = (\n breakpoints: BedrockCache.Breakpoints,\n text: string,\n cache: CacheHint | undefined,\n): Array<BedrockTextBlock | BedrockCache.CachePointBlock> => {\n const cachePoint = BedrockCache.block(breakpoints, cache)\n return cachePoint ? [{ text }, cachePoint] : [{ text }]\n}\n\nconst lowerToolChoice = (toolChoice: NonNullable<LLMRequest[\"toolChoice\"]>) =>\n ProviderShared.matchToolChoice(\"Bedrock Converse\", toolChoice, {\n auto: () => ({ auto: {} }) as const,\n none: () => undefined,\n required: () => ({ any: {} }) as const,\n tool: (name) => ({ tool: { name } }) as const,\n })\n\nconst bedrockMetadata = (metadata: Record<string, unknown>): ProviderMetadata => ({ bedrock: metadata })\n\nconst reasoningSignature = (part: ReasoningPart) => {\n const bedrock = part.providerMetadata?.bedrock\n return (\n part.encrypted ??\n (ProviderShared.isRecord(bedrock) && typeof bedrock.signature === \"string\" ? bedrock.signature : undefined)\n )\n}\n\nconst reasoningRedactedData = (part: ReasoningPart) => {\n const bedrock = part.providerMetadata?.bedrock\n return ProviderShared.isRecord(bedrock) && typeof bedrock.redactedData === \"string\" ? bedrock.redactedData : undefined\n}\n\nconst lowerToolCall = (part: ToolCallPart): BedrockToolUseBlock => ({\n toolUse: {\n toolUseId: part.id,\n name: part.name,\n input: part.input,\n },\n})\n\nconst lowerToolResultContent = Effect.fn(\"BedrockConverse.lowerToolResultContent\")(function* (part: ToolResultPart) {\n if (part.result.type === \"text\" || part.result.type === \"error\")\n return [{ text: ProviderShared.toolResultText(part) }]\n if (part.result.type === \"json\") return [{ json: part.result.value }]\n\n const content: Array<Schema.Schema.Type<typeof BedrockToolResultContentItem>> = []\n for (const item of part.result.value) {\n if (item.type === \"text\") {\n content.push({ text: item.text })\n continue\n }\n const media = yield* BedrockMedia.lower({\n type: \"media\",\n mediaType: item.mime,\n data: item.uri,\n filename: item.name,\n })\n content.push(media)\n }\n return content\n})\n\nconst lowerToolResult = Effect.fn(\"BedrockConverse.lowerToolResult\")(function* (part: ToolResultPart) {\n return {\n toolResult: {\n toolUseId: part.id,\n content: yield* lowerToolResultContent(part),\n status: part.result.type === \"error\" ? \"error\" : \"success\",\n },\n } satisfies BedrockToolResultBlock\n})\n\nconst lowerMessages = Effect.fn(\"BedrockConverse.lowerMessages\")(function* (\n request: LLMRequest,\n breakpoints: BedrockCache.Breakpoints,\n) {\n const messages: BedrockMessage[] = []\n\n for (const message of request.messages) {\n if (message.role === \"system\") {\n const part = yield* ProviderShared.wrappedSystemUpdate(\"Bedrock Converse\", message)\n const content = textWithCache(breakpoints, part.text, part.cache)\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"user\") {\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"media\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"user\", [\"text\", \"media\"])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"media\") {\n content.push(yield* BedrockMedia.lower(part))\n continue\n }\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n continue\n }\n\n if (message.role === \"assistant\") {\n const content: BedrockAssistantBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"text\", \"reasoning\", \"tool-call\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"assistant\", [\n \"text\",\n \"reasoning\",\n \"tool-call\",\n ])\n if (part.type === \"text\") {\n content.push(...textWithCache(breakpoints, part.text, part.cache))\n continue\n }\n if (part.type === \"reasoning\") {\n const signature = reasoningSignature(part)\n const redactedData = reasoningRedactedData(part)\n if (signature === undefined && redactedData !== undefined) {\n content.push({ reasoningContent: { redactedContent: redactedData } })\n continue\n }\n content.push({ reasoningContent: { reasoningText: { text: part.text, signature } } })\n continue\n }\n if (part.type === \"tool-call\") {\n content.push(lowerToolCall(part))\n continue\n }\n }\n messages.push({ role: \"assistant\", content })\n continue\n }\n\n const content: BedrockUserBlock[] = []\n for (const part of message.content) {\n if (!ProviderShared.supportsContent(part, [\"tool-result\"]))\n return yield* ProviderShared.unsupportedContent(\"Bedrock Converse\", \"tool\", [\"tool-result\"])\n content.push(yield* lowerToolResult(part))\n const cachePoint = BedrockCache.block(breakpoints, part.cache)\n if (cachePoint) content.push(cachePoint)\n }\n const previous = messages.at(-1)\n if (previous?.role === \"user\")\n messages[messages.length - 1] = { role: \"user\", content: [...previous.content, ...content] }\n else messages.push({ role: \"user\", content })\n }\n\n return messages\n})\n\n// System prompts share the cache-point convention: emit the text block, then\n// optionally a positional `cachePoint` marker.\nconst lowerSystem = (\n breakpoints: BedrockCache.Breakpoints,\n system: ReadonlyArray<LLMRequest[\"system\"][number]>,\n): BedrockSystemBlock[] => system.flatMap((part) => textWithCache(breakpoints, part.text, part.cache))\n\nconst fromRequest = Effect.fn(\"BedrockConverse.fromRequest\")(function* (request: LLMRequest) {\n const toolChoice = request.toolChoice ? yield* lowerToolChoice(request.toolChoice) : undefined\n const generation = request.generation\n // Bedrock-Claude shares Anthropic's 4-breakpoint cap. Spend the budget in\n // tools → system → messages order to favour the highest-impact prefixes.\n const breakpoints = BedrockCache.breakpoints()\n const toolConfig =\n request.tools.length > 0\n ? {\n tools: lowerTools(request.model.compatibility?.toolSchema, breakpoints, request.tools),\n // Converse has no native \"none\". Keep definitions stable for prompt\n // caching and omit only the unsupported choice.\n toolChoice,\n }\n : undefined\n const system = request.system.length === 0 ? undefined : lowerSystem(breakpoints, request.system)\n const messages = yield* lowerMessages(request, breakpoints)\n if (breakpoints.dropped > 0) {\n yield* Effect.logWarning(\n `Bedrock Converse: dropped ${breakpoints.dropped} cache breakpoint(s); the API allows at most ${BedrockCache.BEDROCK_BREAKPOINT_CAP} per request.`,\n )\n }\n return {\n modelId: request.model.id,\n messages,\n system,\n inferenceConfig:\n generation?.maxTokens === undefined &&\n generation?.temperature === undefined &&\n generation?.topP === undefined &&\n (generation?.stop === undefined || generation.stop.length === 0)\n ? undefined\n : {\n maxTokens: generation?.maxTokens,\n temperature: generation?.temperature,\n topP: generation?.topP,\n stopSequences: generation?.stop,\n },\n toolConfig,\n // Converse's base inferenceConfig has no topK; Anthropic/Nova accept it\n // as a model-specific field, so it goes through additionalModelRequestFields.\n additionalModelRequestFields: generation?.topK === undefined ? undefined : { top_k: generation.topK },\n }\n})\n\n// =============================================================================\n// Stream Parsing\n// =============================================================================\nconst mapFinishReason = (reason: string): FinishReason => {\n if (reason === \"end_turn\" || reason === \"stop_sequence\") return \"stop\"\n if (reason === \"max_tokens\" || reason === \"model_context_window_exceeded\") return \"length\"\n if (reason === \"tool_use\") return \"tool-calls\"\n if (reason === \"content_filtered\" || reason === \"guardrail_intervened\") return \"content-filter\"\n if (reason === \"malformed_model_output\" || reason === \"malformed_tool_use\") return \"error\"\n return \"unknown\"\n}\n\n// AWS reports inputTokens separately from cache reads and writes.\n// Bedrock does not break reasoning out of outputTokens for current models.\nconst mapUsage = (usage: BedrockUsageSchema | undefined): Usage | undefined => {\n if (!usage) return undefined\n const inputTokens = ProviderShared.sumTokens(\n usage.inputTokens,\n usage.cacheReadInputTokens,\n usage.cacheWriteInputTokens,\n )\n return new Usage({\n inputTokens,\n outputTokens: usage.outputTokens,\n nonCachedInputTokens: usage.inputTokens,\n cacheReadInputTokens: usage.cacheReadInputTokens,\n cacheWriteInputTokens: usage.cacheWriteInputTokens,\n totalTokens: ProviderShared.totalTokens(inputTokens, usage.outputTokens, usage.totalTokens),\n providerMetadata: { bedrock: usage },\n })\n}\n\ninterface ParserState {\n readonly tools: ToolStream.State<number>\n // Bedrock splits the finish into `messageStop` (carries `stopReason`) and\n // `metadata` (carries usage). Hold the terminal event in state so `onHalt`\n // can emit exactly one finish after both chunks have had a chance to arrive.\n readonly pendingFinish: { readonly reason: FinishReasonDetails; readonly usage?: Usage } | undefined\n readonly hasToolCalls: boolean\n readonly lifecycle: Lifecycle.State\n readonly reasoningSignatures: Readonly<Record<number, string>>\n}\n\nconst step = (state: ParserState, event: BedrockEvent) =>\n Effect.gen(function* () {\n if (event.contentBlockStart?.start?.toolUse) {\n const index = event.contentBlockStart.contentBlockIndex\n const events: LLMEvent[] = []\n const lifecycle = Lifecycle.stepStart(state.lifecycle, events)\n return [\n {\n ...state,\n lifecycle,\n tools: ToolStream.start(state.tools, index, {\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n },\n [\n ...events,\n LLMEvent.toolInputStart({\n id: event.contentBlockStart.start.toolUse.toolUseId,\n name: event.contentBlockStart.start.toolUse.name,\n }),\n ],\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.text) {\n const events: LLMEvent[] = []\n return [\n {\n ...state,\n lifecycle: Lifecycle.textDelta(\n state.lifecycle,\n events,\n `text-${event.contentBlockDelta.contentBlockIndex}`,\n event.contentBlockDelta.delta.text,\n ),\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.reasoningContent) {\n const index = event.contentBlockDelta.contentBlockIndex\n const reasoning = event.contentBlockDelta.delta.reasoningContent\n const events: LLMEvent[] = []\n const redactedData = reasoning.redactedContent ?? reasoning.data\n const providerMetadata = reasoning.signature\n ? bedrockMetadata({ signature: reasoning.signature })\n : redactedData !== undefined\n ? bedrockMetadata({ redactedData })\n : undefined\n const lifecycle =\n reasoning.text !== undefined || providerMetadata !== undefined\n ? Lifecycle.reasoningDelta(\n state.lifecycle,\n events,\n `reasoning-${index}`,\n reasoning.text ?? \"\",\n providerMetadata,\n )\n : state.lifecycle\n return [\n {\n ...state,\n lifecycle,\n reasoningSignatures: reasoning.signature\n ? { ...state.reasoningSignatures, [index]: reasoning.signature }\n : state.reasoningSignatures,\n },\n events,\n ] as const\n }\n\n if (event.contentBlockDelta?.delta?.toolUse) {\n const index = event.contentBlockDelta.contentBlockIndex\n const result = ToolStream.appendExisting(\n ADAPTER,\n state.tools,\n index,\n event.contentBlockDelta.delta.toolUse.input,\n \"Bedrock Converse tool delta is missing its tool call\",\n )\n if (ToolStream.isError(result)) return yield* result\n const events: LLMEvent[] = []\n const lifecycle = result.events.length ? Lifecycle.stepStart(state.lifecycle, events) : state.lifecycle\n events.push(...result.events)\n return [{ ...state, lifecycle, tools: result.tools }, events] as const\n }\n\n if (event.contentBlockStop) {\n const index = event.contentBlockStop.contentBlockIndex\n const result = yield* ToolStream.finish(ADAPTER, state.tools, index)\n const events: LLMEvent[] = []\n const resultEvents = result.events ?? []\n const lifecycle = resultEvents.length\n ? Lifecycle.stepStart(state.lifecycle, events)\n : Lifecycle.reasoningEnd(\n Lifecycle.textEnd(state.lifecycle, events, `text-${index}`),\n events,\n `reasoning-${index}`,\n state.reasoningSignatures[index]\n ? bedrockMetadata({ signature: state.reasoningSignatures[index] })\n : undefined,\n )\n events.push(...resultEvents)\n return [\n {\n ...state,\n hasToolCalls:\n resultEvents.some((event) => LLMEvent.is.toolCall(event) || LLMEvent.is.toolInputError(event)) ||\n state.hasToolCalls,\n lifecycle,\n tools: result.tools,\n reasoningSignatures: Object.fromEntries(\n Object.entries(state.reasoningSignatures).filter(([key]) => key !== String(index)),\n ),\n },\n events,\n ] as const\n }\n\n if (event.messageStop) {\n return [\n {\n ...state,\n pendingFinish: {\n reason: {\n normalized: mapFinishReason(event.messageStop.stopReason),\n raw: event.messageStop.stopReason,\n },\n usage: state.pendingFinish?.usage,\n },\n },\n [],\n ] as const\n }\n\n if (event.metadata) {\n const usage = mapUsage(event.metadata.usage) ?? state.pendingFinish?.usage\n return [\n {\n ...state,\n pendingFinish: {\n reason: state.pendingFinish?.reason ?? { normalized: \"stop\" },\n usage,\n },\n },\n [],\n ] as const\n }\n\n const exception = (\n [\n [\"internalServerException\", event.internalServerException],\n [\"modelStreamErrorException\", event.modelStreamErrorException],\n [\"serviceUnavailableException\", event.serviceUnavailableException],\n [\"throttlingException\", event.throttlingException],\n [\"validationException\", event.validationException],\n ] as const\n ).find((entry) => entry[1] !== undefined)\n if (exception) {\n return yield* new AIError({\n module: ADAPTER,\n method: \"stream\",\n reason: classifyProviderFailure({\n message: exception[1]?.message ?? exception[1]?.originalMessage ?? \"Bedrock Converse stream error\",\n code: exception[0],\n }),\n })\n }\n\n return [state, []] as const\n })\n\nconst framing = BedrockEventStream.framing(ADAPTER)\n\nconst onHalt = (state: ParserState): ReadonlyArray<LLMEvent> =>\n state.pendingFinish\n ? (() => {\n const events: LLMEvent[] = []\n Lifecycle.finish(state.lifecycle, events, {\n reason: {\n ...state.pendingFinish.reason,\n normalized:\n state.pendingFinish.reason.normalized === \"stop\" && state.hasToolCalls\n ? \"tool-calls\"\n : state.pendingFinish.reason.normalized,\n },\n usage: state.pendingFinish.usage,\n })\n return events\n })()\n : []\n\n// =============================================================================\n// Protocol And Bedrock Route\n// =============================================================================\n/**\n * The Bedrock Converse protocol — request body construction, body schema, and\n * the streaming-event state machine.\n */\nexport const protocol = Protocol.make({\n id: ADAPTER,\n body: {\n schema: BedrockConverseBody,\n from: fromRequest,\n },\n stream: {\n event: BedrockEvent,\n initial: () => ({\n tools: ToolStream.empty<number>(),\n pendingFinish: undefined,\n hasToolCalls: false,\n lifecycle: Lifecycle.initial(),\n reasoningSignatures: {},\n }),\n step,\n onHalt,\n },\n})\n\nexport const route = Route.make({\n id: ADAPTER,\n provider: \"bedrock\",\n providerMetadataKey: \"bedrock\",\n protocol,\n // Bedrock's URL embeds the region in the route endpoint host and the\n // validated modelId in the path. We read the validated body so the URL\n // matches the body that gets signed.\n endpoint: Endpoint.path<BedrockConverseBody>(\n ({ body }) => `/model/${encodeURIComponent(body.modelId)}/converse-stream`,\n ),\n auth: BedrockAuth.auth,\n framing,\n})\n\nexport const sigV4Auth = BedrockAuth.sigV4\n\nexport * as BedrockConverse from \"./bedrock-converse.js\"\n", | ||
| "import type { RouteDefaultsInput } from \"../route/client.js\"\nimport { Auth } from \"../route/auth.js\"\nimport type { ProviderPackage } from \"../provider-package.js\"\nimport { ProviderID, type ModelID } from \"../schema/index.js\"\nimport * as BedrockConverse from \"../protocols/bedrock-converse.js\"\nimport type { BedrockCredentials } from \"../protocols/bedrock-converse.js\"\n\nexport const id = ProviderID.make(\"amazon-bedrock\")\n\nexport type Config = RouteDefaultsInput & {\n readonly apiKey?: string\n readonly headers?: Record<string, string>\n readonly credentials?: BedrockCredentials\n /** AWS region. Defaults to `us-east-1` when neither this nor `credentials.region` is set. */\n readonly region?: string\n /** Override the computed `https://bedrock-runtime.<region>.amazonaws.com` URL. */\n readonly baseURL?: string\n}\n\nexport interface Settings extends ProviderPackage.Settings {\n readonly apiKey?: string\n readonly auth?: \"bearer\" | \"sigv4\"\n readonly baseURL?: string\n readonly credentials?: BedrockCredentials\n readonly region?: string\n readonly topP?: number\n}\nexport const routes = [BedrockConverse.route]\n\nconst bedrockBaseURL = (region: string) => `https://bedrock-runtime.${region}.amazonaws.com`\n\nconst configuredRoute = (input: Config) => {\n const { apiKey, credentials, region, baseURL, ...rest } = input\n const resolvedRegion = region ?? credentials?.region ?? \"us-east-1\"\n return BedrockConverse.route.with({\n ...rest,\n provider: id,\n endpoint: { baseURL: baseURL ?? bedrockBaseURL(resolvedRegion) },\n auth: apiKey === undefined ? BedrockConverse.sigV4Auth(credentials) : Auth.bearer(apiKey),\n })\n}\n\nexport const configure = (input: Config = {}) => {\n const route = configuredRoute(input)\n return {\n id,\n model: (modelID: string | ModelID) => route.model({ id: modelID }),\n configure,\n }\n}\n\nexport const provider = configure()\nexport const model: ProviderPackage.Definition<Settings>[\"model\"] = (modelID, settings) => {\n if (settings.auth === \"bearer\" && settings.apiKey === undefined)\n throw new Error(\"Amazon Bedrock bearer auth requires apiKey\")\n if (settings.auth === \"sigv4\" && settings.apiKey !== undefined)\n throw new Error(\"Amazon Bedrock SigV4 auth does not accept apiKey\")\n return configure({\n apiKey: settings.auth === \"sigv4\" ? undefined : settings.apiKey,\n baseURL: settings.baseURL,\n credentials: settings.credentials,\n generation: settings.topP === undefined ? undefined : { topP: settings.topP },\n headers: settings.headers === undefined ? undefined : { ...settings.headers },\n http: settings.body === undefined ? undefined : { body: { ...settings.body } },\n region: settings.region,\n }).model(modelID)\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "738F4DBDF481657464756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/mcp/oauth.ts"], | ||
| "sourcesContent": [ | ||
| "export * as MCPOAuth from \"./oauth.js\"\n\nimport { auth, type OAuthClientProvider } from \"@modelcontextprotocol/sdk/client/auth.js\"\nimport type { OAuthClientInformationMixed, OAuthTokens } from \"@modelcontextprotocol/sdk/shared/auth.js\"\nimport { Deferred, Effect } from \"effect\"\nimport { Credential } from \"@opencode-ai/schema/credential\"\nimport { ConfigMCP } from \"@opencode-ai/schema/config/mcp\"\nimport { OauthCallbackPage } from \"../oauth/page.js\"\nimport type { Integration } from \"../integration.js\"\n\n/** Persists the OAuth artifacts for one MCP server session: DCR client info, PKCE verifier, and tokens. */\nexport interface Store {\n readonly tokens: () => Promise<OAuthTokens | undefined>\n readonly saveTokens: (tokens: OAuthTokens) => Promise<void>\n readonly clientInformation: () => Promise<OAuthClientInformationMixed | undefined>\n readonly saveClientInformation: (info: OAuthClientInformationMixed) => Promise<void>\n readonly codeVerifier: () => Promise<string | undefined>\n readonly saveCodeVerifier: (verifier: string) => Promise<void>\n}\n\nexport interface Options {\n /** Loopback URL the authorization server redirects back to after the user approves. */\n readonly redirectUrl: string\n /** Space-delimited OAuth scopes to request when the server requires specific ones. */\n readonly scope?: string\n /** CSRF state embedded in the authorization request; required by the spec and enforced by some servers.\n * The caller is responsible for validating the value echoed back to the redirect. */\n readonly state?: string\n /** Statically pre-registered client credentials from config; when set, the SDK skips dynamic registration. */\n readonly client?: { readonly id: string; readonly secret?: string }\n /** Invoked by the SDK to drop credentials it has determined are invalid (e.g. a rejected refresh token). */\n readonly invalidate?: (scope: \"all\" | \"client\" | \"tokens\" | \"verifier\" | \"discovery\") => void | Promise<void>\n /** Receives the authorization URL so the caller can open a browser and capture the eventual code. */\n readonly onRedirect: (url: URL) => void | Promise<void>\n readonly store: Store\n}\n\n/**\n * Builds the MCP SDK's OAuthClientProvider. The SDK drives dynamic client registration, PKCE, and\n * token refresh through these callbacks; we only persist whatever it hands back via `store`.\n */\nexport const provider = (options: Options): OAuthClientProvider => {\n const state = options.state\n const client = options.client\n return {\n redirectUrl: options.redirectUrl,\n clientMetadata: {\n redirect_uris: [options.redirectUrl],\n client_name: \"opencode\",\n client_uri: \"https://opencode.ai\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: client?.secret ? \"client_secret_post\" : \"none\",\n ...(options.scope ? { scope: options.scope } : {}),\n },\n // Only advertise state when the caller supplied one (the interactive flow); the connect-time\n // provider has no redirect to validate, so it omits it.\n ...(state !== undefined ? { state: () => state } : {}),\n // Static client config short-circuits dynamic registration; otherwise the SDK registers and we persist.\n clientInformation: () =>\n client ? { client_id: client.id, client_secret: client.secret } : options.store.clientInformation(),\n saveClientInformation: (info) => options.store.saveClientInformation(info),\n tokens: () => options.store.tokens(),\n saveTokens: (tokens) => options.store.saveTokens(tokens),\n redirectToAuthorization: (url) => options.onRedirect(url),\n ...(options.invalidate ? { invalidateCredentials: options.invalidate } : {}),\n saveCodeVerifier: (verifier) => options.store.saveCodeVerifier(verifier),\n // The SDK only reads the verifier back after saving one earlier in the same flow; a miss means\n // the flow was resumed without its session state, which the SDK surfaces as an auth failure.\n codeVerifier: async () => {\n const verifier = await options.store.codeVerifier()\n if (!verifier) throw new Error(\"Missing PKCE code verifier for MCP OAuth flow\")\n return verifier\n },\n }\n}\n\n/** A Store that keeps OAuth artifacts in memory for the duration of one interactive login attempt. */\nexport const memoryStore = (): Store => {\n let tokens: OAuthTokens | undefined\n let client: OAuthClientInformationMixed | undefined\n let verifier: string | undefined\n return {\n tokens: async () => tokens,\n saveTokens: async (value) => {\n tokens = value\n },\n clientInformation: async () => client,\n saveClientInformation: async (value) => {\n client = value\n },\n codeVerifier: async () => verifier,\n saveCodeVerifier: async (value) => {\n verifier = value\n },\n }\n}\n\n/** Reads the dynamically-registered client info we stash in a credential's metadata, for token refresh. */\nexport const clientFromCredential = (credential: Credential.OAuth) =>\n credential.metadata?.client as OAuthClientInformationMixed | undefined\n\n/** Folds SDK tokens (plus DCR client info and the server URL) into a storable credential. */\nexport const toCredential = (input: {\n readonly methodID: Integration.MethodID\n readonly serverUrl: string\n readonly tokens: OAuthTokens\n readonly client: OAuthClientInformationMixed | undefined\n}) =>\n Credential.OAuth.make({\n type: \"oauth\",\n methodID: input.methodID,\n access: input.tokens.access_token,\n refresh: input.tokens.refresh_token ?? \"\",\n // 0 marks an unknown/non-expiring token; toTokens then omits expires_in so the SDK won't force a refresh.\n expires: input.tokens.expires_in ? Date.now() + input.tokens.expires_in * 1000 : 0,\n metadata: {\n serverUrl: input.serverUrl,\n tokenType: input.tokens.token_type,\n ...(input.tokens.scope ? { scope: input.tokens.scope } : {}),\n ...(input.client ? { client: input.client } : {}),\n },\n })\n\n/** Reconstructs SDK tokens from a stored credential so the connect-time provider can present them. */\nexport const toTokens = (credential: Credential.OAuth): OAuthTokens => {\n const metadata = credential.metadata ?? {}\n return {\n access_token: credential.access,\n token_type: typeof metadata.tokenType === \"string\" ? metadata.tokenType : \"Bearer\",\n ...(credential.refresh ? { refresh_token: credential.refresh } : {}),\n ...(credential.expires ? { expires_in: Math.max(0, Math.floor((credential.expires - Date.now()) / 1000)) } : {}),\n ...(typeof metadata.scope === \"string\" ? { scope: metadata.scope } : {}),\n }\n}\n\n/**\n * Runs the interactive OAuth login for one remote MCP server. Stands up a loopback callback server,\n * lets the SDK drive DCR + PKCE to produce an authorization URL, and returns an attempt whose callback\n * exchanges the redirect code for a storable credential. Scoped: the callback server closes with the scope.\n */\nexport const authorize = (input: {\n readonly name: string\n readonly config: typeof ConfigMCP.Remote.Type\n readonly methodID: Integration.MethodID\n}) =>\n Effect.gen(function* () {\n const oauth = input.config.oauth || undefined\n const store = memoryStore()\n const code = yield* Deferred.make<string, Error>()\n const redirectPath = oauth?.redirect_uri ? new URL(oauth.redirect_uri).pathname : \"/callback\"\n const state = Buffer.from(crypto.getRandomValues(new Uint8Array(32))).toString(\"base64url\")\n\n // Lazy so runtimes without a loopback listener (workerd) never evaluate node:http.\n const { createServer } = yield* Effect.promise(() => import(\"node:http\"))\n const server = createServer((request, response) => {\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\")\n if (url.pathname !== redirectPath) {\n response.writeHead(404).end(\"Not found\")\n return\n }\n const fail = (reason: string) => {\n Effect.runFork(Deferred.fail(code, new Error(reason)))\n response\n .writeHead(400, { \"Content-Type\": \"text/html\" })\n .end(OauthCallbackPage.error(reason, { provider: input.name }))\n }\n const error = url.searchParams.get(\"error_description\") ?? url.searchParams.get(\"error\")\n if (error) return fail(error)\n // Reject a redirect whose state does not match what we issued: this is the CSRF defense the\n // state parameter exists for, so an attacker can't inject their own authorization code.\n if (url.searchParams.get(\"state\") !== state) return fail(\"OAuth state mismatch\")\n const value = url.searchParams.get(\"code\")\n if (!value) return fail(\"Missing authorization code\")\n Effect.runFork(Deferred.succeed(code, value))\n response.writeHead(200, { \"Content-Type\": \"text/html\" }).end(OauthCallbackPage.success({ provider: input.name }))\n })\n\n // Bind the port the redirect will actually arrive on: an explicit callback_port wins, else the port\n // pinned by redirect_uri, else an ephemeral port. Binding ephemerally while redirect_uri names a fixed\n // port would send the browser somewhere nothing is listening, hanging the attempt until it expires.\n const redirectPort = oauth?.redirect_uri ? Number(new URL(oauth.redirect_uri).port) || undefined : undefined\n const port = yield* Effect.callback<number, Error>((resume) => {\n server.once(\"error\", (error) => resume(Effect.fail(error)))\n server.listen(oauth?.callback_port ?? redirectPort ?? 0, \"127.0.0.1\", () => {\n const address = server.address()\n resume(\n address && typeof address === \"object\"\n ? Effect.succeed(address.port)\n : Effect.fail(new Error(\"Could not determine MCP OAuth callback port\")),\n )\n })\n })\n yield* Effect.addFinalizer(() => Effect.sync(() => server.close()))\n\n let authorizationUrl: URL | undefined\n const oauthProvider = provider({\n redirectUrl: oauth?.redirect_uri ?? `http://127.0.0.1:${port}${redirectPath}`,\n scope: oauth?.scope,\n state,\n client: oauth?.client_id ? { id: oauth.client_id, secret: oauth.client_secret } : undefined,\n onRedirect: (url) => {\n authorizationUrl = url\n },\n store,\n })\n\n const finalize = Effect.gen(function* () {\n const tokens = yield* Effect.promise(() => store.tokens())\n if (!tokens) return yield* Effect.fail(new Error(`MCP server \"${input.name}\" did not return OAuth tokens`))\n const client = yield* Effect.promise(() => store.clientInformation())\n return toCredential({ methodID: input.methodID, serverUrl: input.config.url, tokens, client })\n })\n\n const result = yield* Effect.tryPromise({\n try: () => auth(oauthProvider, { serverUrl: input.config.url, scope: oauth?.scope }),\n catch: (error) => (error instanceof Error ? error : new Error(String(error))),\n })\n\n // The provider may already hold valid tokens (e.g. a re-auth), in which case there is no browser step.\n if (result === \"AUTHORIZED\") {\n return {\n url: input.config.url,\n instructions: `Connected to ${input.name}.`,\n mode: \"auto\" as const,\n callback: finalize,\n }\n }\n if (!authorizationUrl)\n return yield* Effect.fail(new Error(`MCP server \"${input.name}\" did not provide an authorization URL`))\n\n return {\n url: authorizationUrl.toString(),\n instructions: `Authorize ${input.name} in your browser. This window will close automatically.`,\n mode: \"auto\" as const,\n callback: Deferred.await(code).pipe(\n Effect.flatMap((value) =>\n Effect.tryPromise({\n try: () =>\n auth(oauthProvider, { serverUrl: input.config.url, authorizationCode: value, scope: oauth?.scope }),\n catch: (error) => (error instanceof Error ? error : new Error(String(error))),\n }),\n ),\n Effect.flatMap(() => finalize),\n ),\n }\n })\n" | ||
| ], | ||
| "mappings": ";omBAyCO,IAAM,EAAW,CAAC,IAA0C,CACjE,IAAsB,MAAhB,EACiB,OAAjB,GAAS,EACf,MAAO,CACL,YAAa,EAAQ,YACrB,eAAgB,CACd,cAAe,CAAC,EAAQ,WAAW,EACnC,YAAa,WACb,WAAY,sBACZ,YAAa,CAAC,qBAAsB,eAAe,EACnD,eAAgB,CAAC,MAAM,EACvB,2BAA4B,GAAQ,OAAS,qBAAuB,UAChE,EAAQ,MAAQ,CAAE,MAAO,EAAQ,KAAM,EAAI,CAAC,CAClD,KAGI,IAAU,OAAY,CAAE,MAAO,IAAM,CAAM,EAAI,CAAC,EAEpD,kBAAmB,IACjB,EAAS,CAAE,UAAW,EAAO,GAAI,cAAe,EAAO,MAAO,EAAI,EAAQ,MAAM,kBAAkB,EACpG,sBAAuB,CAAC,IAAS,EAAQ,MAAM,sBAAsB,CAAI,EACzE,OAAQ,IAAM,EAAQ,MAAM,OAAO,EACnC,WAAY,CAAC,IAAW,EAAQ,MAAM,WAAW,CAAM,EACvD,wBAAyB,CAAC,IAAQ,EAAQ,WAAW,CAAG,KACpD,EAAQ,WAAa,CAAE,sBAAuB,EAAQ,UAAW,EAAI,CAAC,EAC1E,iBAAkB,CAAC,IAAa,EAAQ,MAAM,iBAAiB,CAAQ,EAGvE,aAAc,SAAY,CACxB,IAAM,EAAW,MAAM,EAAQ,MAAM,aAAa,EAClD,GAAI,CAAC,EAAU,MAAU,MAAM,+CAA+C,EAC9E,OAAO,EAEX,GAIW,EAAc,IAAa,CACtC,IAAI,EACA,EACA,EACJ,MAAO,CACL,OAAQ,SAAY,EACpB,WAAY,MAAO,IAAU,CAC3B,EAAS,GAEX,kBAAmB,SAAY,EAC/B,sBAAuB,MAAO,IAAU,CACtC,EAAS,GAEX,aAAc,SAAY,EAC1B,iBAAkB,MAAO,IAAU,CACjC,EAAW,EAEf,GAIW,EAAuB,CAAC,IACnC,EAAW,UAAU,OAGV,EAAe,CAAC,IAM3B,EAAW,MAAM,KAAK,CACpB,KAAM,QACN,SAAU,EAAM,SAChB,OAAQ,EAAM,OAAO,aACrB,QAAS,EAAM,OAAO,eAAiB,GAEvC,QAAS,EAAM,OAAO,WAAa,KAAK,IAAI,EAAI,EAAM,OAAO,WAAa,KAAO,EACjF,SAAU,CACR,UAAW,EAAM,UACjB,UAAW,EAAM,OAAO,cACpB,EAAM,OAAO,MAAQ,CAAE,MAAO,EAAM,OAAO,KAAM,EAAI,CAAC,KACtD,EAAM,OAAS,CAAE,OAAQ,EAAM,MAAO,EAAI,CAAC,CACjD,CACF,CAAC,EAGU,EAAW,CAAC,IAA8C,CACrE,IAAM,EAAW,EAAW,UAAY,CAAC,EACzC,MAAO,CACL,aAAc,EAAW,OACzB,WAAY,OAAO,EAAS,YAAc,SAAW,EAAS,UAAY,YACtE,EAAW,QAAU,CAAE,cAAe,EAAW,OAAQ,EAAI,CAAC,KAC9D,EAAW,QAAU,CAAE,WAAY,KAAK,IAAI,EAAG,KAAK,OAAO,EAAW,QAAU,KAAK,IAAI,GAAK,IAAI,CAAC,CAAE,EAAI,CAAC,KAC1G,OAAO,EAAS,QAAU,SAAW,CAAE,MAAO,EAAS,KAAM,EAAI,CAAC,CACxE,GAQW,EAAY,CAAC,IAKxB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAQ,EAAM,OAAO,OAAS,OAC9B,EAAQ,EAAY,EACpB,EAAO,MAAO,EAAS,KAAoB,EAC3C,EAAe,GAAO,aAAe,IAAI,IAAI,EAAM,YAAY,EAAE,SAAW,YAC5E,EAAQ,OAAO,KAAK,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC,EAAE,SAAS,WAAW,GAGlF,gBAAiB,MAAO,EAAO,QAAQ,IAAa,cAAY,EAClE,EAAS,EAAa,CAAC,EAAS,IAAa,CACjD,IAAM,EAAM,IAAI,IAAI,EAAQ,KAAO,IAAK,kBAAkB,EAC1D,GAAI,EAAI,WAAa,EAAc,CACjC,EAAS,UAAU,GAAG,EAAE,IAAI,WAAW,EACvC,OAEF,IAAM,EAAO,CAAC,IAAmB,CAC/B,EAAO,QAAQ,EAAS,KAAK,EAAU,MAAM,CAAM,CAAC,CAAC,EACrD,EACG,UAAU,IAAK,CAAE,eAAgB,WAAY,CAAC,EAC9C,IAAI,EAAkB,MAAM,EAAQ,CAAE,SAAU,EAAM,IAAK,CAAC,CAAC,GAE5D,EAAQ,EAAI,aAAa,IAAI,mBAAmB,GAAK,EAAI,aAAa,IAAI,OAAO,EACvF,GAAI,EAAO,OAAO,EAAK,CAAK,EAG5B,GAAI,EAAI,aAAa,IAAI,OAAO,IAAM,EAAO,OAAO,EAAK,sBAAsB,EAC/E,IAAM,EAAQ,EAAI,aAAa,IAAI,MAAM,EACzC,GAAI,CAAC,EAAO,OAAO,EAAK,4BAA4B,EACpD,EAAO,QAAQ,EAAS,QAAQ,EAAM,CAAK,CAAC,EAC5C,EAAS,UAAU,IAAK,CAAE,eAAgB,WAAY,CAAC,EAAE,IAAI,EAAkB,QAAQ,CAAE,SAAU,EAAM,IAAK,CAAC,CAAC,EACjH,EAKK,EAAe,GAAO,aAAe,OAAO,IAAI,IAAI,EAAM,YAAY,EAAE,IAAI,GAAK,OAAY,OAC7F,EAAO,MAAO,EAAO,SAAwB,CAAC,IAAW,CAC7D,EAAO,KAAK,QAAS,CAAC,IAAU,EAAO,EAAO,KAAK,CAAK,CAAC,CAAC,EAC1D,EAAO,OAAO,GAAO,eAAiB,GAAgB,EAAG,YAAa,IAAM,CAC1E,IAAM,EAAU,EAAO,QAAQ,EAC/B,EACE,GAAW,OAAO,IAAY,SAC1B,EAAO,QAAQ,EAAQ,IAAI,EAC3B,EAAO,KAAS,MAAM,6CAA6C,CAAC,CAC1E,EACD,EACF,EACD,MAAO,EAAO,aAAa,IAAM,EAAO,KAAK,IAAM,EAAO,MAAM,CAAC,CAAC,EAElE,IAAI,EACE,EAAgB,EAAS,CAC7B,YAAa,GAAO,cAAgB,oBAAoB,IAAO,IAC/D,MAAO,GAAO,MACd,QACA,OAAQ,GAAO,UAAY,CAAE,GAAI,EAAM,UAAW,OAAQ,EAAM,aAAc,EAAI,OAClF,WAAY,CAAC,IAAQ,CACnB,EAAmB,GAErB,OACF,CAAC,EAEK,EAAW,EAAO,IAAI,SAAU,EAAG,CACvC,IAAM,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAM,OAAO,CAAC,EACzD,GAAI,CAAC,EAAQ,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,mCAAmC,CAAC,EAC1G,IAAM,EAAS,MAAO,EAAO,QAAQ,IAAM,EAAM,kBAAkB,CAAC,EACpE,OAAO,EAAa,CAAE,SAAU,EAAM,SAAU,UAAW,EAAM,OAAO,IAAK,SAAQ,QAAO,CAAC,EAC9F,EAQD,IANe,MAAO,EAAO,WAAW,CACtC,IAAK,IAAM,EAAK,EAAe,CAAE,UAAW,EAAM,OAAO,IAAK,MAAO,GAAO,KAAM,CAAC,EACnF,MAAO,CAAC,IAAW,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,CAC7E,CAAC,KAGc,aACb,MAAO,CACL,IAAK,EAAM,OAAO,IAClB,aAAc,gBAAgB,EAAM,QACpC,KAAM,OACN,SAAU,CACZ,EAEF,GAAI,CAAC,EACH,OAAO,MAAO,EAAO,KAAS,MAAM,eAAe,EAAM,4CAA4C,CAAC,EAExG,MAAO,CACL,IAAK,EAAiB,SAAS,EAC/B,aAAc,aAAa,EAAM,8DACjC,KAAM,OACN,SAAU,EAAS,MAAM,CAAI,EAAE,KAC7B,EAAO,QAAQ,CAAC,IACd,EAAO,WAAW,CAChB,IAAK,IACH,EAAK,EAAe,CAAE,UAAW,EAAM,OAAO,IAAK,kBAAmB,EAAO,MAAO,GAAO,KAAM,CAAC,EACpG,MAAO,CAAC,IAAW,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,CAC7E,CAAC,CACH,EACA,EAAO,QAAQ,IAAM,CAAQ,CAC/B,CACF,EACD", | ||
| "debugId": "69211EEFEC1A1D0F64756E2164756E21", | ||
| "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": "CEDE3CD3A9D7DA6264756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "530167B1DF4586B064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/openai-compatible-chat.ts"], | ||
| "sourcesContent": [ | ||
| "import { Route, type RouteRoutedLanguageModelInput } from \"../route/client.js\"\nimport { Endpoint } from \"../route/endpoint.js\"\nimport { Framing } from \"../route/framing.js\"\nimport * as OpenAIChat from \"./openai-chat.js\"\n\nconst ADAPTER = \"openai-compatible-chat\"\n\nexport type OpenAICompatibleChatLanguageModelInput = RouteRoutedLanguageModelInput\n\n/**\n * Route for non-OpenAI providers that expose an OpenAI Chat-compatible\n * `/chat/completions` endpoint. Reuses `OpenAIChat.protocol` end-to-end and\n * overrides only the route id so providers can be resolved per-family without\n * colliding with native OpenAI. Provider helpers configure the route endpoint\n * before model selection.\n */\nexport const route = Route.make({\n id: ADAPTER,\n providerMetadataKey: \"openai\",\n protocol: OpenAIChat.protocol,\n endpoint: Endpoint.path(\"/chat/completions\"),\n framing: Framing.sse,\n})\n\nexport * as OpenAICompatibleChat from \"./openai-compatible-chat.js\"\n" | ||
| ], | ||
| "mappings": ";mOAKA,IAAM,EAAU,yBAWH,EAAQ,EAAM,KAAK,CAC9B,GAAI,EACJ,oBAAqB,SACrB,SAAqB,EACrB,SAAU,EAAS,KAAK,mBAAmB,EAC3C,QAAS,EAAQ,GACnB,CAAC", | ||
| "debugId": "95AC09E649ECC60564756E2164756E21", | ||
| "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": "388D13F354DBBC4664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/prompt/content.ts"], | ||
| "sourcesContent": [ | ||
| "export function normalizePromptContent(content: string) {\n if (content.endsWith(\"\\r\\n\")) {\n const body = content.slice(0, -2)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n if (content.endsWith(\"\\n\")) {\n const body = content.slice(0, -1)\n return !body.includes(\"\\n\") && !body.includes(\"\\r\") ? body : content\n }\n\n return content\n}\n" | ||
| ], | ||
| "mappings": ";AAAO,SAAS,CAAsB,CAAC,EAAiB,CACtD,GAAI,EAAQ,SAAS;AAAA,CAAM,EAAG,CAC5B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,GAAI,EAAQ,SAAS;AAAA,CAAI,EAAG,CAC1B,IAAM,EAAO,EAAQ,MAAM,EAAG,EAAE,EAChC,MAAO,CAAC,EAAK,SAAS;AAAA,CAAI,GAAK,CAAC,EAAK,SAAS,IAAI,EAAI,EAAO,EAG/D,OAAO", | ||
| "debugId": "EFC6BA2239E1AA6064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "72FB3F38C95847E764756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/mcp.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Mcp from \"./mcp.js\"\n\nimport { Schema } from \"effect\"\nimport { optional, PositiveInt } from \"./schema.js\"\nimport { IntegrationID } from \"./integration-id.js\"\n\nexport class TimeoutConfig extends Schema.Class<TimeoutConfig>(\"Mcp.TimeoutConfig\")({\n startup: PositiveInt.pipe(optional).annotate({\n description: \"Maximum time in milliseconds to establish and initialize the MCP server.\",\n }),\n catalog: PositiveInt.pipe(optional).annotate({\n description: \"Maximum time in milliseconds to wait for MCP discovery requests such as tools/list and prompts/list.\",\n }),\n execution: PositiveInt.pipe(optional).annotate({\n description: \"Maximum time in milliseconds to wait for MCP tool and prompt execution.\",\n }),\n}) {}\n\nexport class LocalConfig extends Schema.Class<LocalConfig>(\"Mcp.LocalConfig\")({\n type: Schema.Literal(\"local\"),\n command: Schema.String.pipe(Schema.Array),\n cwd: Schema.String.pipe(optional).annotate({\n description: \"Working directory for the MCP server process. Relative paths resolve from the workspace directory.\",\n }),\n environment: Schema.Record(Schema.String, Schema.String).pipe(optional),\n disabled: Schema.Boolean.pipe(optional),\n codemode: Schema.Boolean.pipe(optional).annotate({\n description: \"Expose this server's tools through Code Mode. Defaults to true.\",\n }),\n timeout: TimeoutConfig.pipe(optional),\n}) {}\n\nexport class OAuthConfig extends Schema.Class<OAuthConfig>(\"Mcp.OAuthConfig\")({\n client_id: Schema.String.pipe(optional),\n client_secret: Schema.String.pipe(optional),\n scope: Schema.String.pipe(optional),\n callback_port: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65535 })).pipe(optional),\n redirect_uri: Schema.String.pipe(optional),\n}) {}\n\nexport class RemoteConfig extends Schema.Class<RemoteConfig>(\"Mcp.RemoteConfig\")({\n type: Schema.Literal(\"remote\"),\n url: Schema.String,\n headers: Schema.Record(Schema.String, Schema.String).pipe(optional),\n oauth: Schema.Union([OAuthConfig, Schema.Literal(false)]).pipe(optional),\n disabled: Schema.Boolean.pipe(optional),\n codemode: Schema.Boolean.pipe(optional).annotate({\n description: \"Expose this server's tools through Code Mode. Defaults to true.\",\n }),\n timeout: TimeoutConfig.pipe(optional),\n}) {}\n\nexport const ServerConfig = Schema.Union([LocalConfig, RemoteConfig]).pipe(Schema.toTaggedUnion(\"type\"))\nexport type ServerConfig = typeof ServerConfig.Type\n\nconst Connected = Schema.Struct({ status: Schema.Literal(\"connected\") }).annotate({\n identifier: \"Mcp.Status.Connected\",\n})\nconst Pending = Schema.Struct({ status: Schema.Literal(\"pending\") }).annotate({\n identifier: \"Mcp.Status.Pending\",\n})\nconst Disabled = Schema.Struct({ status: Schema.Literal(\"disabled\") }).annotate({\n identifier: \"Mcp.Status.Disabled\",\n})\nconst Failed = Schema.Struct({ status: Schema.Literal(\"failed\"), error: Schema.String }).annotate({\n identifier: \"Mcp.Status.Failed\",\n})\nconst NeedsAuth = Schema.Struct({ status: Schema.Literal(\"needs_auth\") }).annotate({\n identifier: \"Mcp.Status.NeedsAuth\",\n})\n\nexport type Status = typeof Status.Type\nexport const Status = Schema.Union([Connected, Pending, Disabled, Failed, NeedsAuth]).pipe(\n Schema.toTaggedUnion(\"status\"),\n)\n\nexport interface Server extends Schema.Schema.Type<typeof Server> {}\nexport const Server = Schema.Struct({\n name: Schema.String,\n status: Status,\n // Set for remote servers registered as OAuth integrations; lets clients act on the right integration\n // without matching by name, which could collide with provider or plugin integrations.\n integrationID: optional(IntegrationID),\n}).annotate({ identifier: \"Mcp.Server\" })\n\nexport interface Resource extends Schema.Schema.Type<typeof Resource> {}\nexport const Resource = Schema.Struct({\n server: Schema.String,\n name: Schema.String,\n uri: Schema.String,\n description: optional(Schema.String),\n mimeType: optional(Schema.String),\n}).annotate({ identifier: \"Mcp.Resource\" })\n\nexport interface ResourceTemplate extends Schema.Schema.Type<typeof ResourceTemplate> {}\nexport const ResourceTemplate = Schema.Struct({\n server: Schema.String,\n name: Schema.String,\n uriTemplate: Schema.String,\n description: optional(Schema.String),\n mimeType: optional(Schema.String),\n}).annotate({ identifier: \"Mcp.ResourceTemplate\" })\n\nexport interface ResourceCatalog extends Schema.Schema.Type<typeof ResourceCatalog> {}\nexport const ResourceCatalog = Schema.Struct({\n resources: Schema.Array(Resource),\n templates: Schema.Array(ResourceTemplate),\n}).annotate({ identifier: \"Mcp.ResourceCatalog\" })\n\nexport const ResourceContentPart = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"text\"),\n uri: Schema.String,\n text: Schema.String,\n mimeType: optional(Schema.String),\n }),\n Schema.Struct({\n type: Schema.Literal(\"blob\"),\n uri: Schema.String,\n blob: Schema.String,\n mimeType: optional(Schema.String),\n }),\n]).pipe(Schema.toTaggedUnion(\"type\"), Schema.annotate({ identifier: \"Mcp.ResourceContentPart\" }))\nexport type ResourceContentPart = typeof ResourceContentPart.Type\n\nexport interface ResourceContent extends Schema.Schema.Type<typeof ResourceContent> {}\nexport const ResourceContent = Schema.Struct({\n server: Schema.String,\n uri: Schema.String,\n contents: Schema.Array(ResourceContentPart),\n}).annotate({ identifier: \"Mcp.ResourceContent\" })\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "8F4E2F1F87951EFF64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/util/io.ts", "src/session-target.ts"], | ||
| "sourcesContent": [ | ||
| "import { text } from \"node:stream/consumers\"\n\nexport function readStdin() {\n return text(process.stdin)\n}\n", | ||
| "import type { LocationGetOutput, ModelRef, OpenCodeClient, SessionInfo } from \"@opencode-ai/client/promise\"\nimport { Model } from \"@opencode-ai/schema/model\"\n\nconst SESSION_PAGE_LIMIT = 50\n\nexport type SessionTarget = {\n session: SessionInfo\n location: LocationGetOutput\n model: ModelRef | undefined\n agent: string | undefined\n resume: boolean\n}\n\nexport type SessionTargetPreparation = (input: {\n client: OpenCodeClient\n location: LocationGetOutput\n session: SessionInfo | undefined\n model: ModelRef | undefined\n agent: string | undefined\n signal?: AbortSignal\n}) => Promise<{ model: ModelRef | undefined; agent: string | undefined }>\n\nexport class SessionTargetMutationError extends Error {\n override readonly name = \"SessionTargetMutationError\"\n\n constructor(cause: unknown) {\n super(cause instanceof Error ? cause.message : \"Session target mutation failed\", { cause })\n }\n}\n\nexport async function resolveSessionTarget(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n model?: ModelRef\n agent?: string\n environment?: Readonly<Record<string, string>>\n prepare: SessionTargetPreparation\n signal?: AbortSignal\n}): Promise<SessionTarget> {\n const selection = await selectSession(input)\n const selected = selection.session\n const location =\n selection.location ??\n (await resolveLocation(\n input.client,\n selected ? { directory: selected.location.directory, workspace: selected.location.workspaceID } : input.location,\n input.signal,\n ))\n const prepared = await input.prepare({\n client: input.client,\n location,\n session: selected,\n model: input.model ?? selected?.model,\n agent: input.agent ?? selected?.agent,\n signal: input.signal,\n })\n const session =\n selected ??\n (await input.client.session\n .create(\n {\n agent: prepared.agent,\n model: prepared.model,\n location: { directory: location.directory, workspaceID: location.workspaceID },\n },\n ...requestOptions(input.signal),\n )\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n }))\n if (input.environment !== undefined && location.workspaceID === undefined)\n await input.client.session\n .environment({ sessionID: session.id, variables: input.environment }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n return {\n session,\n location,\n model: prepared.model,\n agent: prepared.agent ?? session.agent,\n resume: selected !== undefined,\n }\n}\n\nexport function parseSessionTargetModel(value?: string): ModelRef | undefined {\n if (!value) return\n const model = Model.Ref.parse(value)\n return { providerID: model.providerID, id: model.id, variant: model.variant }\n}\n\nasync function selectSession(input: {\n client: OpenCodeClient\n location?: { directory?: string; workspace?: string }\n continue?: boolean\n session?: string\n fork?: boolean\n signal?: AbortSignal\n}) {\n const explicit = input.session\n ? await input.client.session.get({ sessionID: input.session }, ...requestOptions(input.signal)).catch((error) => {\n if (error && typeof error === \"object\" && Reflect.get(error, \"_tag\") === \"SessionNotFoundError\")\n return undefined\n throw error\n })\n : undefined\n if (input.session && !explicit) throw new Error(\"Session not found\")\n if (explicit)\n return {\n session: input.fork\n ? await input.client.session\n .fork({ sessionID: explicit.id, boundary: { type: \"through\" } }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : explicit,\n }\n if (!input.continue) return { session: undefined }\n\n const location = await resolveLocation(input.client, input.location, input.signal)\n const selected = await latestSession(input.client, location, undefined, input.signal)\n if (!selected) return { session: undefined, location }\n return {\n session: input.fork\n ? await input.client.session\n .fork({ sessionID: selected.id, boundary: { type: \"through\" } }, ...requestOptions(input.signal))\n .catch((error) => {\n throw new SessionTargetMutationError(error)\n })\n : selected,\n }\n}\n\nasync function latestSession(\n client: OpenCodeClient,\n location: LocationGetOutput,\n cursor?: string,\n signal?: AbortSignal,\n): Promise<SessionInfo | undefined> {\n const page = await client.session.list(\n {\n directory: location.directory,\n workspace: location.workspaceID,\n parentID: null,\n limit: SESSION_PAGE_LIMIT,\n order: \"desc\",\n ...(cursor ? { cursor } : {}),\n },\n ...requestOptions(signal),\n )\n const selected = page.data.find(\n (session) =>\n session.location.directory === location.directory && session.location.workspaceID === location.workspaceID,\n )\n if (selected) return selected\n if (!page.cursor.next || page.data.length === 0) return\n return latestSession(client, location, page.cursor.next, signal)\n}\n\nfunction resolveLocation(\n client: OpenCodeClient,\n location?: { directory?: string; workspace?: string },\n signal?: AbortSignal,\n) {\n if (!location && !signal) return client.location.get()\n if (!location) return client.location.get(undefined, { signal })\n return client.location.get({ location }, ...requestOptions(signal))\n}\n\nfunction requestOptions(signal?: AbortSignal): [] | [{ signal: AbortSignal }] {\n return signal ? [{ signal }] : []\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "359E7E7C8CAF04AC64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/workspace-event.ts"], | ||
| "sourcesContent": [ | ||
| "export * as WorkspaceEvent from \"./workspace-event.js\"\n\nimport { Schema } from \"effect\"\nimport { Event } from \"./event.js\"\nimport { WorkspaceID } from \"./workspace-id.js\"\n\nexport const ConnectionStatus = Schema.Struct({\n workspaceID: WorkspaceID,\n status: Schema.Literals([\"connected\", \"connecting\", \"disconnected\", \"error\"]),\n}).annotate({ identifier: \"WorkspaceEvent.ConnectionStatus\" })\nexport interface ConnectionStatus extends Schema.Schema.Type<typeof ConnectionStatus> {}\n\nexport const Ready = Event.ephemeral({\n type: \"workspace.ready\",\n schema: {\n name: Schema.String,\n },\n})\n\nexport const Failed = Event.ephemeral({\n type: \"workspace.failed\",\n schema: {\n message: Schema.String,\n },\n})\n\nexport const Status = Event.ephemeral({\n type: \"workspace.status\",\n schema: ConnectionStatus.fields,\n})\n\nexport const Definitions = Event.inventory(Ready, Failed, Status)\n" | ||
| ], | ||
| "mappings": ";wRAMO,IAAM,EAAmB,EAAO,OAAO,CAC5C,YAAa,EACb,OAAQ,EAAO,SAAS,CAAC,YAAa,aAAc,eAAgB,OAAO,CAAC,CAC9E,CAAC,EAAE,SAAS,CAAE,WAAY,iCAAkC,CAAC,EAGhD,EAAQ,EAAM,UAAU,CACnC,KAAM,kBACN,OAAQ,CACN,KAAM,EAAO,MACf,CACF,CAAC,EAEY,EAAS,EAAM,UAAU,CACpC,KAAM,mBACN,OAAQ,CACN,QAAS,EAAO,MAClB,CACF,CAAC,EAEY,EAAS,EAAM,UAAU,CACpC,KAAM,mBACN,OAAQ,EAAiB,MAC3B,CAAC,EAEY,EAAc,EAAM,UAAU,EAAO,EAAQ,CAAM", | ||
| "debugId": "AF0276C3B3406E2464756E2164756E21", | ||
| "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": "BEEBD026EA9D7BBA64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/tool.ts"], | ||
| "sourcesContent": [ | ||
| "// Per-tool display rules shared across `opencode run` output paths.\n//\n// Each known tool (shell, edit, write, subagent, etc.) has a ToolRule that controls\n// four display hooks:\n//\n// view → visibility policy for progress/final scrollback entries and\n// whether completed finals can render as structured snapshots\n// run → inline summary for the non-interactive `run` command output\n// scroll → text formatting for start/progress/final scrollback entries\n// snap → structured snapshot (code block, diff, task card) for rich\n// scrollback entries\n//\n// Tools not in TOOL_RULES get fallback formatting.\nimport os from \"os\"\nimport path from \"path\"\nimport stripAnsi from \"strip-ansi\"\nimport type { SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { LANGUAGE_EXTENSIONS } from \"../util/filetype\"\nimport { Locale } from \"../util/locale\"\nimport {\n canonicalToolName,\n finiteNumber,\n primitiveInputSummary,\n toolDisplayContent,\n toolDisplayMetadata,\n webSearchProviderLabel,\n} from \"../util/tool-display\"\nimport { formatPath } from \"../util/path-format\"\nimport type { RunEntryBody, StreamCommit, ToolSnapshot } from \"./types\"\n\nexport { canonicalToolName } from \"../util/tool-display\"\n\ntype ToolView = {\n output: boolean\n final: boolean\n snap?: \"code\" | \"diff\" | \"structured\"\n}\n\ntype ToolPhase = \"start\" | \"progress\" | \"final\"\n\ntype ToolDict = Record<string, unknown>\n\ntype PatchFile = {\n status?: string\n file?: string\n from?: string\n patch?: string\n deletions?: number\n}\n\ntype ToolInput = ToolDict & {\n id?: string\n path?: string\n pattern?: string\n url?: string\n query?: string\n agent?: string\n description?: string\n name?: string\n operation?: string\n line?: number\n character?: number\n content?: string\n command?: string\n workdir?: string\n questions?: Array<{ question?: string }>\n diff?: string\n}\n\ntype ToolMetadata = ToolDict & {\n name?: string\n count?: number\n matches?: number\n diff?: string\n provider?: unknown\n files?: PatchFile[]\n answers?: string[][]\n exit?: number\n}\n\ntype ToolFrame = {\n directory?: string\n raw: string\n name: string\n input: ToolDict\n meta: ToolDict\n state: ToolDict\n status: string\n error: string\n output: string\n time: {\n start?: number\n end?: number\n }\n}\n\ntype ToolInline = {\n icon: string\n title: string\n description?: string\n mode?: \"inline\" | \"block\"\n body?: string\n}\n\ntype ToolProps = {\n input: ToolInput\n metadata: ToolMetadata\n frame: ToolFrame\n}\n\ntype ToolName =\n | \"invalid\"\n | \"shell\"\n | \"write\"\n | \"edit\"\n | \"patch\"\n | \"batch\"\n | \"subagent\"\n | \"question\"\n | \"read\"\n | \"glob\"\n | \"grep\"\n | \"list\"\n | \"lsp\"\n | \"webfetch\"\n | \"websearch\"\n | \"skill\"\n\ntype ToolRule = {\n view: ToolView\n run: (props: ToolProps) => ToolInline\n scroll?: Partial<Record<ToolPhase, (props: ToolProps) => string>>\n snap?: (props: ToolProps) => ToolSnapshot | undefined\n}\n\ntype ToolRegistry = Record<ToolName, ToolRule>\n\ntype AnyToolRule = ToolRule\n\nfunction dict(v: unknown): ToolDict {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n return {}\n }\n\n return { ...v }\n}\n\nfunction props(frame: ToolFrame): ToolProps {\n return {\n input: frame.input,\n metadata: frame.meta,\n frame,\n }\n}\n\nfunction text(v: unknown): string {\n return typeof v === \"string\" ? v : \"\"\n}\n\nexport function toolOutputText(name: string, content: ReadonlyArray<{ type: string; text?: string }> | undefined) {\n if (!content) return \"\"\n // V2 shell content appends model-only status after the user-visible command output.\n if (canonicalToolName(name) === \"shell\") return content.find((item) => item.type === \"text\")?.text ?? \"\"\n const joined = content.flatMap((item) => (item.type === \"text\" && item.text ? [item.text] : [])).join(\"\\n\")\n if (canonicalToolName(name) === \"read\") return readDisplayText(joined) ?? joined\n return joined\n}\n\n/** Read's model content is a JSON page envelope; unwrap the human-facing text. */\nexport function readDisplayText(text: string): string | undefined {\n if (!text.startsWith(\"{\")) return undefined\n const parsed = (() => {\n try {\n return JSON.parse(text) as unknown\n } catch {\n return undefined\n }\n })()\n const envelope = dict(parsed)\n if (typeof envelope.content === \"string\" && (envelope.type === \"text-page\" || envelope.encoding === \"utf8\"))\n return envelope.content\n if (!Array.isArray(envelope.entries)) return undefined\n return envelope.entries\n .flatMap((entry): string[] => {\n if (typeof entry === \"string\") return [entry]\n const path = dict(entry).path\n return typeof path === \"string\" ? [path] : []\n })\n .join(\"\\n\")\n}\n\nfunction normalizeInput(name: string, value: unknown) {\n const input = dict(value)\n const path = typeof input.path === \"string\" ? input.path : text(input.filePath)\n const agent = typeof input.agent === \"string\" ? input.agent : text(input.subagent_type)\n return {\n ...input,\n ...([\"read\", \"write\", \"edit\", \"lsp\"].includes(name) && path ? { path } : {}),\n ...(name === \"subagent\" && agent ? { agent } : {}),\n }\n}\n\nfunction normalizeFile(value: unknown): PatchFile | undefined {\n const file = dict(value)\n const name = text(file.file) || text(file.relativePath) || text(file.filePath)\n if (!name) return\n const legacy = text(file.type)\n const status =\n text(file.status) ||\n (legacy === \"add\"\n ? \"added\"\n : legacy === \"delete\"\n ? \"deleted\"\n : legacy === \"update\"\n ? \"modified\"\n : legacy === \"move\"\n ? \"moved\"\n : legacy)\n const patch = typeof file.patch === \"string\" ? file.patch : undefined\n const deletions = finiteNumber(file.deletions)\n return {\n ...file,\n file: name,\n ...(status === \"moved\" && text(file.filePath) ? { from: text(file.filePath) } : {}),\n ...(status ? { status } : {}),\n ...(patch === undefined ? {} : { patch }),\n ...(deletions === undefined ? {} : { deletions }),\n }\n}\n\nfunction normalizeMetadata(name: string, value: unknown) {\n const metadata = dict(value)\n const files = list(metadata.files).flatMap((item) => {\n const file = normalizeFile(item)\n return file ? [file] : []\n })\n const sessionID = text(metadata.sessionID) || text(metadata.sessionId)\n return {\n ...metadata,\n ...([\"edit\", \"patch\"].includes(name) && Array.isArray(metadata.files) ? { files } : {}),\n ...(name === \"subagent\" && sessionID ? { sessionID } : {}),\n }\n}\n\nexport function normalizeTool(tool: SessionMessageAssistantTool): SessionMessageAssistantTool {\n const name = canonicalToolName(tool.name)\n if (tool.state.status === \"streaming\") return { ...tool, name }\n return {\n ...tool,\n name,\n state: {\n ...tool.state,\n input: normalizeInput(name, tool.state.input),\n metadata: normalizeMetadata(name, toolDisplayMetadata(tool.state)),\n },\n } as SessionMessageAssistantTool\n}\n\nfunction list<T>(v: unknown): T[] {\n if (!Array.isArray(v)) {\n return []\n }\n\n return v\n}\n\nfunction span(frame: ToolFrame): string {\n const start = frame.time.start\n const end = frame.time.end\n if (start === undefined || end === undefined || end <= start) {\n return \"\"\n }\n\n return Locale.duration(end - start)\n}\n\nfunction fail(ctx: ToolFrame): string {\n const error = toolError(ctx)\n if (error) {\n return `✖ ${ctx.name} failed: ${error}`\n }\n\n return `✖ ${ctx.name} failed`\n}\n\nfunction toolError(ctx: ToolFrame): string {\n if (ctx.error) {\n return ctx.error\n }\n\n const state = text(ctx.state.error).trim()\n if (state) {\n return state\n }\n\n return ctx.raw.trim()\n}\n\nfunction fallbackStart(ctx: ToolFrame): string {\n const extra = primitiveInputSummary(ctx.input)\n if (!extra) {\n return `⚙ ${ctx.name}`\n }\n\n return `⚙ ${ctx.name} ${extra}`\n}\n\nfunction fallbackFinal(ctx: ToolFrame): string {\n if (ctx.status === \"error\") {\n return fail(ctx)\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return ctx.raw.trim()\n }\n\n const time = span(ctx)\n if (!time) {\n return `${ctx.name} completed`\n }\n\n return `${ctx.name} completed · ${time}`\n}\n\nexport function toolPath(input?: string, opts: { home?: boolean; directory?: string } = {}): string {\n return formatPath(input, {\n base: opts.directory ?? process.cwd(),\n home: opts.home ? os.homedir() : undefined,\n forwardSlashes: true,\n })\n}\n\nfunction displayPath(p: ToolProps, input?: string, opts: { home?: boolean } = {}) {\n return toolPath(input, { ...opts, directory: p.frame.directory })\n}\n\nfunction fallbackInline(ctx: ToolFrame): ToolInline {\n const title = Object.keys(ctx.input).length > 0 ? JSON.stringify(ctx.input) : \"Unknown\"\n\n return {\n icon: \"⚙\",\n title: `${ctx.name} ${title}`,\n }\n}\n\nfunction count(n: number, label: string): string {\n return `${n} ${label}${n === 1 ? \"\" : \"es\"}`\n}\n\nfunction runGlob(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Glob \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.count\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runGrep(p: ToolProps): ToolInline {\n const root = p.input.path ?? \"\"\n const title = `Grep \"${p.input.pattern ?? \"\"}\"`\n const suffix = root ? `in ${displayPath(p, root)}` : \"\"\n const matches = p.metadata.matches\n const description = matches === undefined ? suffix : `${suffix}${suffix ? \" · \" : \"\"}${count(matches, \"match\")}`\n return {\n icon: \"✱\",\n title,\n ...(description && { description }),\n }\n}\n\nfunction runList(p: ToolProps): ToolInline {\n const dir = text(dict(p.input).path)\n return {\n icon: \"→\",\n title: dir ? `List ${displayPath(p, dir)}` : \"List\",\n }\n}\n\nfunction runRead(p: ToolProps): ToolInline {\n const file = displayPath(p, p.input.path)\n const description = primitiveInputSummary(p.frame.input, [\"path\"]) || undefined\n return {\n icon: \"→\",\n title: `Read ${file}`,\n ...(description && { description }),\n }\n}\n\nfunction runWrite(p: ToolProps): ToolInline {\n return {\n icon: \"←\",\n title: `Write ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runWebfetch(p: ToolProps): ToolInline {\n const url = p.input.url ?? \"\"\n return {\n icon: \"%\",\n title: url ? `WebFetch ${url}` : \"WebFetch\",\n }\n}\n\nfunction runEdit(p: ToolProps): ToolInline {\n const file = list<PatchFile>(p.metadata.files)[0]\n return {\n icon: \"←\",\n title: `Edit ${displayPath(p, p.input.path)}`,\n mode: \"block\",\n body: file?.patch ?? p.metadata.diff,\n }\n}\n\nfunction runWebSearch(p: ToolProps): ToolInline {\n const title = webSearchProviderLabel(p.metadata.provider)\n return {\n icon: \"◈\",\n title: p.input.query ? `${title} \"${p.input.query}\"` : title,\n }\n}\n\nfunction runTask(p: ToolProps): ToolInline {\n const kind = Locale.titlecase(p.input.agent || \"unknown\")\n const desc = p.input.description\n const icon = p.frame.status === \"error\" ? \"✗\" : p.frame.status === \"running\" ? \"•\" : \"✓\"\n return {\n icon,\n title: desc || `${kind} Subagent`,\n description: desc ? `${kind} Agent` : undefined,\n }\n}\n\nfunction runSkill(p: ToolProps): ToolInline {\n const name = p.metadata.name ?? p.input.id ?? \"\"\n return {\n icon: \"→\",\n title: `Skill \"${name}\"`,\n }\n}\n\nfunction runPatch(p: ToolProps): ToolInline {\n const files = p.metadata.files?.length ?? 0\n if (files === 0) {\n return {\n icon: \"%\",\n title: \"Patch\",\n }\n }\n\n return {\n icon: \"%\",\n title: `Patch ${files} file${files === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runQuestion(p: ToolProps): ToolInline {\n const total = list(p.frame.input.questions).length\n return {\n icon: \"→\",\n title: `Asked ${total} question${total === 1 ? \"\" : \"s\"}`,\n }\n}\n\nfunction runInvalid(p: ToolProps): ToolInline {\n return {\n icon: \"✗\",\n title: \"Invalid Tool\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction runBatch(p: ToolProps): ToolInline {\n const calls = list(dict(p.input).tool_calls).length\n return {\n icon: \"#\",\n title: calls > 0 ? `Batch ${calls} tool${calls === 1 ? \"\" : \"s\"}` : \"Batch\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output : undefined,\n }\n}\n\nfunction lspTitle(\n input: {\n operation?: string\n path?: string\n line?: number\n character?: number\n },\n opts: { home?: boolean; directory?: string } = {},\n): string {\n const op = input.operation || \"request\"\n const file = input.path ? toolPath(input.path, opts) : \"\"\n const line = typeof input.line === \"number\" ? input.line : undefined\n const char = typeof input.character === \"number\" ? input.character : undefined\n const pos = line !== undefined && char !== undefined ? `:${line}:${char}` : \"\"\n if (!file) {\n return `LSP ${op}`\n }\n\n return `LSP ${op} ${file}${pos}`\n}\n\nfunction runLsp(p: ToolProps): ToolInline {\n return {\n icon: \"→\",\n title: lspTitle(p.input, { directory: p.frame.directory }),\n }\n}\n\nfunction patchTitle(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `# Created ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"deleted\") {\n return `# Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `# Moved ${toolPath(file.from, { directory })} -> ${toolPath(file.file, { directory })}`\n }\n\n return `# Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction snapWrite(p: ToolProps): ToolSnapshot | undefined {\n const file = p.input.path || \"\"\n const content = p.input.content || \"\"\n if (!file && !content) {\n return undefined\n }\n\n return {\n kind: \"code\",\n title: `# Wrote ${displayPath(p, file)}`,\n content,\n file,\n }\n}\n\nfunction snapEdit(p: ToolProps): ToolSnapshot | undefined {\n const item = list<PatchFile>(p.metadata.files)[0]\n const file = item?.file || p.input.path || \"\"\n const diff = item?.patch || p.metadata.diff || \"\"\n if (!file || !diff.trim()) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items: [\n {\n title: `# Edited ${displayPath(p, file)}`,\n diff,\n file,\n },\n ],\n }\n}\n\nfunction snapPatch(p: ToolProps): ToolSnapshot | undefined {\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n return undefined\n }\n\n const items = files.flatMap((file) => {\n if (!file || typeof file !== \"object\") {\n return []\n }\n\n const diff = typeof file.patch === \"string\" ? file.patch : \"\"\n if (!diff.trim()) {\n return []\n }\n\n const name = file.file\n return [\n {\n title: patchTitle(file, p.frame.directory),\n diff,\n file: name,\n deletions: typeof file.deletions === \"number\" ? file.deletions : 0,\n },\n ]\n })\n\n if (items.length !== files.length) {\n return undefined\n }\n\n return {\n kind: \"diff\",\n items,\n }\n}\n\nfunction snapTask(p: ToolProps): ToolSnapshot {\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const desc = p.input.description\n const rows = [desc].filter((item): item is string => Boolean(item))\n\n return {\n kind: \"task\",\n title: `# ${kind} Subagent`,\n rows,\n tail: \"\",\n }\n}\n\nfunction snapQuestion(p: ToolProps): ToolSnapshot {\n const answers = list<unknown[]>(p.frame.meta.answers)\n const items = list<{ question?: string }>(p.frame.input.questions).map((item, i) => {\n const answer = list<string>(answers[i]).filter((entry) => typeof entry === \"string\")\n return {\n question: item.question || `Question ${i + 1}`,\n answer: answer.length > 0 ? answer.join(\", \") : \"(no answer)\",\n }\n })\n\n return {\n kind: \"question\",\n items,\n tail: \"\",\n }\n}\n\nfunction scrollBashStart(p: ToolProps): string {\n const cmd = p.input.command ?? \"\"\n const wd = p.input.workdir ?? \"\"\n const formatted = wd && wd !== \".\" ? displayPath(p, wd, { home: true }) : \"\"\n const dir = formatted === \".\" ? \"\" : formatted\n if (cmd && !dir) {\n return `$ ${cmd}`\n }\n\n if (!cmd) {\n return dir ? `${dir}$` : \"\"\n }\n\n return `${dir}$ ${cmd}`\n}\n\nfunction scrollBashProgress(p: ToolProps): string {\n const out = stripAnsi(p.frame.raw)\n const cmd = (p.input.command ?? \"\").trim()\n const fmt = (text: string) => {\n const body = text.replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n return body ? `\\n${body}` : \"\"\n }\n\n if (!cmd) {\n return out.replace(/\\n+$/, \"\")\n }\n\n const wdRaw = (p.input.workdir ?? \"\").trim()\n const wd = wdRaw ? displayPath(p, wdRaw, { home: true }) : \"\"\n const lines = out.split(\"\\n\")\n const first = (lines[0] || \"\").trim()\n const second = (lines[1] || \"\").trim()\n\n if (wd && (first === wd || first === wdRaw) && second === cmd) {\n return fmt(lines.slice(2).join(\"\\n\"))\n }\n\n if (first === cmd || first === `$ ${cmd}`) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n if (wd && (first === `${wd} ${cmd}` || first === `${wdRaw} ${cmd}`)) {\n return fmt(lines.slice(1).join(\"\\n\"))\n }\n\n return fmt(out)\n}\n\nfunction scrollShellFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const code = p.metadata.exit\n const time = span(p.frame)\n if (code === undefined) {\n if (!time) {\n return \"shell completed\"\n }\n\n return `shell completed · ${time}`\n }\n\n return `shell completed (exit ${code})${time ? ` · ${time}` : \"\"}`\n}\n\nfunction scrollReadStart(p: ToolProps): string {\n const file = displayPath(p, p.input.path)\n const extra = primitiveInputSummary(p.frame.input, [\"path\"])\n const tail = extra ? ` ${extra}` : \"\"\n return `→ Read ${file}${tail}`.trim()\n}\n\nfunction scrollWriteStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollEditStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollPatchStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction patchLine(file: PatchFile, directory?: string): string {\n if (file.status === \"added\") {\n return `+ Created ${toolPath(file.file, { directory })}`\n }\n\n if (file.status === \"deleted\") {\n return `- Deleted ${toolPath(file.file, { directory })}`\n }\n if (file.status === \"moved\") {\n return `→ Moved ${toolPath(file.from, { directory })} → ${toolPath(file.file, { directory })}`\n }\n\n return `~ Patched ${toolPath(file.file, { directory })}`\n}\n\nfunction scrollPatchFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const files = list<PatchFile>(p.frame.meta.files)\n if (files.length === 0) {\n const time = span(p.frame)\n if (!time) {\n return \"patch\"\n }\n\n return `patch · ${time}`\n }\n\n const showModified = !files.some((file) => file?.status && file.status !== \"modified\")\n const shown = files.filter((file) => showModified || file.status !== \"modified\")\n const rows = shown.slice(0, 6).map((file) => patchLine(file, p.frame.directory))\n if (shown.length > 6) {\n rows.push(`... and ${shown.length - 6} more`)\n }\n\n if (rows.length > 0) {\n return rows.join(\"\\n\")\n }\n\n return patchLine(files[0]!, p.frame.directory)\n}\n\nfunction scrollTaskStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction taskResult(output: string): string | undefined {\n if (!output.trim()) {\n return undefined\n }\n\n const match = output.match(/<task_result>\\s*([\\s\\S]*?)\\s*<\\/task_result>/)\n if (match) {\n return match[1].trim() || undefined\n }\n\n const next = output\n .split(\"\\n\")\n .filter((line) => !line.startsWith(\"task_id:\"))\n .join(\"\\n\")\n .trim()\n return next || undefined\n}\n\nfunction scrollTaskFinal(p: ToolProps): string {\n if (p.frame.status === \"error\") {\n return fail(p.frame)\n }\n\n const kind = Locale.titlecase(p.input.agent || \"general\")\n const row = p.input.description\n if (!row) {\n return `# ${kind} Subagent`\n }\n\n return `# ${kind} Subagent\\n${row}`\n}\n\nfunction scrollQuestionStart(_: ToolProps): string {\n return \"\"\n}\n\nfunction scrollQuestionFinal(p: ToolProps): string {\n const q = p.input.questions ?? []\n const a = p.metadata.answers ?? []\n const time = span(p.frame)\n if (q.length === 0) {\n if (!time) {\n return \"0 questions\"\n }\n\n return `0 questions · ${time}`\n }\n\n const rows: string[] = []\n for (const [i, item] of q.slice(0, 4).entries()) {\n const prompt = item.question\n const reply = a[i] ?? []\n rows.push(`? ${prompt || `Question ${i + 1}`}`)\n rows.push(` ${reply.length > 0 ? reply.join(\", \") : \"(no answer)\"}`)\n }\n\n if (q.length > 4) {\n rows.push(`... and ${q.length - 4} more`)\n }\n\n return rows.join(\"\\n\")\n}\n\nfunction scrollLspStart(p: ToolProps): string {\n return `→ ${lspTitle(p.input, { directory: p.frame.directory })}`\n}\n\nfunction scrollSkillStart(p: ToolProps): string {\n return `→ Skill \"${p.metadata.name ?? p.input.id ?? \"\"}\"`\n}\n\nfunction scrollGlobStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Glob \"${pattern}\"` : \"✱ Glob\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollGlobFinal(p: ToolProps): string {\n return toolError(p.frame) || fail(p.frame)\n}\n\nfunction scrollGrepStart(p: ToolProps): string {\n const pattern = p.input.pattern ?? \"\"\n const head = pattern ? `✱ Grep \"${pattern}\"` : \"✱ Grep\"\n const dir = p.input.path ?? \"\"\n if (!dir) {\n return head\n }\n\n return `${head} in ${displayPath(p, dir)}`\n}\n\nfunction scrollListStart(p: ToolProps): string {\n const dir = text(dict(p.input).path)\n if (!dir) {\n return \"→ List\"\n }\n\n return `→ List ${displayPath(p, dir)}`\n}\n\nfunction scrollWebfetchStart(p: ToolProps): string {\n const url = p.input.url ?? \"\"\n if (!url) {\n return \"% WebFetch\"\n }\n\n return `% WebFetch ${url}`\n}\n\nfunction scrollWebSearchStart(p: ToolProps): string {\n const title = webSearchProviderLabel(p.metadata.provider)\n const query = p.input.query ?? \"\"\n if (!query) {\n return `◈ ${title}`\n }\n\n return `◈ ${title} \"${query}\"`\n}\n\nconst TOOL_RULES = {\n invalid: {\n view: {\n output: true,\n final: false,\n },\n run: runInvalid,\n scroll: {\n start: () => \"\",\n },\n },\n shell: {\n view: {\n output: true,\n final: false,\n },\n run: runShell,\n scroll: {\n start: scrollBashStart,\n progress: scrollBashProgress,\n final: scrollShellFinal,\n },\n },\n write: {\n view: {\n output: false,\n final: true,\n snap: \"code\",\n },\n run: runWrite,\n snap: snapWrite,\n scroll: {\n start: scrollWriteStart,\n },\n },\n edit: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runEdit,\n snap: snapEdit,\n scroll: {\n start: scrollEditStart,\n },\n },\n patch: {\n view: {\n output: false,\n final: true,\n snap: \"diff\",\n },\n run: runPatch,\n snap: snapPatch,\n scroll: {\n start: scrollPatchStart,\n final: scrollPatchFinal,\n },\n },\n batch: {\n view: {\n output: true,\n final: false,\n },\n run: runBatch,\n scroll: {\n start: () => \"\",\n },\n },\n subagent: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runTask,\n snap: snapTask,\n scroll: {\n start: scrollTaskStart,\n final: scrollTaskFinal,\n },\n },\n question: {\n view: {\n output: false,\n final: true,\n snap: \"structured\",\n },\n run: runQuestion,\n snap: snapQuestion,\n scroll: {\n start: scrollQuestionStart,\n final: scrollQuestionFinal,\n },\n },\n read: {\n view: {\n output: false,\n final: false,\n },\n run: runRead,\n scroll: {\n start: scrollReadStart,\n },\n },\n glob: {\n view: {\n output: false,\n final: false,\n },\n run: runGlob,\n scroll: {\n start: scrollGlobStart,\n final: scrollGlobFinal,\n },\n },\n grep: {\n view: {\n output: false,\n final: false,\n },\n run: runGrep,\n scroll: {\n start: scrollGrepStart,\n },\n },\n list: {\n view: {\n output: false,\n final: false,\n },\n run: runList,\n scroll: {\n start: scrollListStart,\n },\n },\n lsp: {\n view: {\n output: false,\n final: false,\n },\n run: runLsp,\n scroll: {\n start: scrollLspStart,\n },\n },\n webfetch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebfetch,\n scroll: {\n start: scrollWebfetchStart,\n },\n },\n websearch: {\n view: {\n output: false,\n final: false,\n },\n run: runWebSearch,\n scroll: {\n start: scrollWebSearchStart,\n },\n },\n skill: {\n view: {\n output: false,\n final: false,\n },\n run: runSkill,\n scroll: {\n start: scrollSkillStart,\n },\n },\n} as const satisfies ToolRegistry\n\nfunction key(name: string): name is ToolName {\n return Object.prototype.hasOwnProperty.call(TOOL_RULES, name)\n}\n\nfunction rule(name?: string): AnyToolRule | undefined {\n if (!name || !key(name)) {\n return undefined\n }\n\n return TOOL_RULES[name]\n}\n\nfunction frame(part: SessionMessageAssistantTool, directory?: string): ToolFrame {\n const tool = normalizeTool(part)\n if (tool.state.status === \"streaming\")\n return {\n directory,\n raw: tool.state.input,\n name: tool.name,\n input: {},\n meta: {},\n state: dict(tool.state),\n status: tool.state.status,\n error: \"\",\n output: \"\",\n time: { start: tool.time.created },\n }\n const output = toolOutputText(tool.name, toolDisplayContent(tool.state))\n return {\n directory,\n raw: output,\n name: tool.name,\n input: normalizeInput(tool.name, tool.state.input),\n meta: normalizeMetadata(tool.name, tool.state.metadata),\n state: dict(tool.state),\n status: tool.state.status,\n error: tool.state.status === \"error\" ? tool.state.error.message : \"\",\n output,\n time: {\n start: tool.time.ran ?? tool.time.created,\n end: tool.time.completed,\n },\n }\n}\n\nfunction toolFrame(commit: StreamCommit, raw: string): ToolFrame {\n const current = commit.part ? frame(commit.part, commit.directory) : undefined\n return {\n directory: commit.directory,\n raw,\n name: canonicalToolName(commit.tool || current?.name || \"tool\"),\n input: current?.input ?? {},\n meta: current?.meta ?? {},\n state: current?.state ?? {},\n status: commit.toolState ?? current?.status ?? \"\",\n error: (commit.toolError ?? current?.error ?? \"\").trim(),\n output: current?.output ?? raw,\n time: current?.time ?? {},\n }\n}\n\nfunction runShell(p: ToolProps): ToolInline {\n return {\n icon: \"$\",\n title: p.input.command || \"\",\n mode: \"block\",\n body: p.frame.status === \"completed\" ? p.frame.output.trim() : undefined,\n }\n}\n\nexport function toolView(name?: string): ToolView {\n return (\n rule(name ? canonicalToolName(name) : undefined)?.view ?? {\n output: true,\n final: true,\n }\n )\n}\n\nexport function toolStructuredFinal(commit: StreamCommit): boolean {\n const state = commit.toolState ?? commit.part?.state.status\n return (\n commit.kind === \"tool\" &&\n commit.phase === \"final\" &&\n state === \"completed\" &&\n Boolean(toolView(commit.tool ?? commit.part?.name).snap)\n )\n}\n\nexport function toolInlineInfo(part: SessionMessageAssistantTool, directory?: string): ToolInline {\n const ctx = frame(part, directory)\n const draw = rule(ctx.name)?.run\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n return fallbackInline(ctx)\n }\n\n return fallbackInline(ctx)\n}\n\nexport function toolScroll(phase: ToolPhase, ctx: ToolFrame): string {\n const draw = rule(ctx.name)?.scroll?.[phase]\n try {\n if (draw) {\n return draw(props(ctx))\n }\n } catch {\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n if (phase === \"progress\") {\n return ctx.raw\n }\n return fallbackFinal(ctx)\n }\n\n if (phase === \"start\") {\n return fallbackStart(ctx)\n }\n\n if (phase === \"progress\") {\n return ctx.raw\n }\n\n return fallbackFinal(ctx)\n}\n\nfunction toolSnapshot(commit: StreamCommit, raw: string): ToolSnapshot | undefined {\n const ctx = toolFrame(commit, raw)\n const draw = rule(ctx.name)?.snap\n if (!draw) {\n return undefined\n }\n\n try {\n return draw(props(ctx))\n } catch {\n return undefined\n }\n}\n\nfunction textBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"text\",\n content,\n }\n}\n\nfunction markdownBody(content: string): RunEntryBody | undefined {\n if (!content) {\n return undefined\n }\n\n return {\n type: \"markdown\",\n content,\n }\n}\n\nfunction structuredBody(commit: StreamCommit, raw: string): RunEntryBody | undefined {\n const snap = toolSnapshot(commit, raw)\n if (!snap) {\n return undefined\n }\n\n return {\n type: \"structured\",\n snapshot: snap,\n }\n}\n\nconst STRUCTURED_FALLBACK_LENGTH = 4_096\n\nfunction structuredFallback(value: ToolDict): RunEntryBody | undefined {\n if (Object.keys(value).length === 0) return\n const content = JSON.stringify(value, null, 2)\n if (!content) return\n const suffix = \"\\n... [truncated]\"\n return {\n type: \"code\",\n content:\n content.length <= STRUCTURED_FALLBACK_LENGTH\n ? content\n : content.slice(0, STRUCTURED_FALLBACK_LENGTH - suffix.length) + suffix,\n filetype: \"json\",\n }\n}\n\nfunction shellOutput(command: string, raw: string): string | undefined {\n const body = stripAnsi(raw).replace(/^\\n+/, \"\").replace(/\\n+$/, \"\")\n if (!body) {\n return undefined\n }\n\n if (!command) {\n return body\n }\n\n return `\\n${body}`\n}\n\nexport function toolEntryBody(\n commit: StreamCommit,\n raw: string,\n options?: { shellOutput?: boolean },\n): RunEntryBody | undefined {\n if (commit.shell) {\n if (commit.phase === \"start\") {\n return textBody(`$ ${commit.shell.command}`)\n }\n\n if (commit.phase === \"progress\") {\n return textBody(shellOutput(commit.shell.command, raw) ?? \"\")\n }\n\n if (commit.toolState === \"error\") {\n const ctx = toolFrame(commit, raw)\n return textBody(toolScroll(\"final\", ctx))\n }\n\n return undefined\n }\n\n const ctx = toolFrame(commit, raw)\n const view = toolView(ctx.name)\n\n if (ctx.name === \"shell\" && commit.phase === \"progress\" && options?.shellOutput === false) return undefined\n\n if (ctx.name === \"subagent\") {\n if (commit.phase === \"start\") {\n return undefined\n }\n\n if (commit.phase === \"final\" && ctx.status === \"completed\") {\n const result = taskResult(ctx.output)\n if (result) {\n return markdownBody(result)\n }\n }\n }\n\n if (commit.phase === \"progress\" && !view.output) {\n return undefined\n }\n\n if (commit.phase === \"final\") {\n if (ctx.status === \"error\") {\n return textBody(toolScroll(\"final\", ctx))\n }\n\n if (!view.final) {\n return undefined\n }\n\n if (ctx.status && ctx.status !== \"completed\") {\n return textBody(ctx.raw.trim())\n }\n\n if (toolStructuredFinal(commit)) {\n return structuredBody(commit, raw) ?? textBody(toolScroll(\"final\", ctx))\n }\n\n if (!rule(ctx.name) && !ctx.output.trim()) {\n return structuredFallback(ctx.meta) ?? textBody(toolScroll(\"final\", ctx))\n }\n }\n\n return textBody(toolScroll(commit.phase, ctx))\n}\n\nexport function toolFiletype(input?: string): string | undefined {\n if (!input) {\n return undefined\n }\n\n const ext = path.extname(input)\n const lang = LANGUAGE_EXTENSIONS[ext]\n if ([\"typescriptreact\", \"javascriptreact\", \"javascript\"].includes(lang)) {\n return \"typescript\"\n }\n\n return lang\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "A25EBF0E6D1E26DE64756E2164756E21", | ||
| "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": ";+qBAGA,qBAAS,wBCDT,kBACA,mBAAS,oBACT,oBACA,qBAAS,YAEF,IAAM,EAA0B,0DASvC,SAAS,CAAW,CAAC,EAA4C,CAC/D,IAAM,EAAa,EAAgC,EAAK,KAAK,EAAW,YAAY,CAAC,EACrF,MAAO,MACC,eAAc,CAAC,EAAO,CAC1B,GAAI,CAAC,EAAO,OACZ,OAAO,EAAW,eAAe,CAAK,QAElC,YAAW,CAAC,EAAO,EAAS,CAChC,GAAI,CAAC,EAAO,OACZ,MAAM,EAAW,YAAY,EAAO,CAAO,EAAE,MAAM,IAAG,CAAG,OAAS,EAEtE,EAGF,SAAS,CAAM,CAAC,EAA2D,CACzE,MAAO,CACL,SAAS,CAAC,EAAU,CAClB,IAAI,EAAa,GAEjB,OADA,QAAQ,GAAG,EAAM,CAAQ,EAClB,IAAM,CACX,GAAI,CAAC,EAAY,OACjB,EAAa,GACb,QAAQ,IAAI,EAAM,CAAQ,GAGhC,EAGF,SAAS,CAAW,CAClB,EACA,EACkC,CAClC,GAAI,CAAC,QAAQ,IAAI,sBAAuB,OACxC,IAAM,EAAQ,IAAI,KAAK,EACpB,YAAY,EACZ,QAAQ,QAAS,EAAE,EACnB,QAAQ,UAAW,GAAG,EACnB,EAAS,EAAK,KAAK,EAAS,SAAU,GAAG,KAAS,EAAY,WAAW,EACzE,EAAO,CAAC,IACZ,KAAK,UAAU,EAAM,CAAC,EAAM,IAAW,OAAO,IAAU,SAAW,OAAO,CAAK,EAAI,EAAQ,CAAC,EAC9F,EAAG,UAAU,EAAK,QAAQ,CAAM,EAAG,CAAE,UAAW,EAAK,CAAC,EACtD,EAAG,cACD,EAAK,KAAK,EAAS,SAAU,aAAa,EAC1C,EAAK,CACH,KAAM,IAAI,KAAK,EAAE,YAAY,KAC1B,EACH,KAAM,CACR,CAAC,EAAI;AAAA,CACP,EACA,IAAM,EAAQ,CACZ,KAAK,CAAC,EAAc,EAAgB,CAClC,EAAG,eACD,EACA,EAAK,CACH,KAAM,IAAI,KAAK,EAAE,YAAY,EAC7B,IAAK,EAAY,IACjB,OACA,MACF,CAAC,EAAI;AAAA,CACP,EAEJ,EAMA,OALA,EAAM,MAAM,cAAe,CACzB,KAAM,EAAY,KAClB,IAAK,EAAY,IACjB,KAAM,CACR,CAAC,EACM,EAGT,SAAS,CAAiB,CAAC,EAAmC,CAC5D,OAAO,IAAI,EAAW,EAAG,SAAS,EAAQ,GAAG,CAAC,EAGzC,SAAS,CAAuB,CACrC,EAA2B,QAAQ,MACnC,EAA8C,EAC9C,EAA4B,QACV,CAClB,GAAI,EAAM,MAAO,MAAO,CAAE,QAAO,OAAO,EAAG,EAAG,EAC9C,IAAM,EAAS,IAAa,QAAU,SAAW,WACjD,GAAI,CACF,IAAM,EAAS,EAAK,CAAM,EACtB,EAAU,GACd,MAAO,CACL,MAAO,EACP,OAAO,EAAG,CACR,GAAI,EAAS,OACb,EAAU,GACV,EAAO,QAAQ,EAEnB,EACA,MAAO,EAAO,CACd,MAAU,MAAM,EAAyB,CAAE,MAAO,CAAM,CAAC,GAK7D,eAAsB,CAAwB,CAC5C,EACA,EAAkC,EAClC,CACA,IAAM,EAAW,EAAQ,EACzB,GAAI,CACF,OAAO,MAAM,EAAI,CAAQ,SACzB,CACA,EAAS,QAAQ,GAKd,SAAS,CAAc,CAAC,EAIlB,CACX,IAAM,EAAQ,EAAM,MACd,EAAc,CAClB,IAAK,QAAQ,IACb,IAAK,EAAM,UACX,KAAM,QAAQ,KAAK,MAAM,CAAC,CAC5B,EACA,MAAO,CACL,SAAU,CAAE,MAAO,EAAM,SAAS,KAAM,EACxC,SAAU,QACV,OAAQ,CACN,KAAK,CAAC,EAAO,CACX,QAAQ,OAAO,MAAM,CAAK,EAE9B,EACA,MAAO,CACL,SAAU,CAAC,IAAQ,EAAS,IAAI,IAAI,CAAG,EAAG,MAAM,CAClD,EACA,OAAQ,MACA,KAAI,CAAC,EAAS,CAClB,IAAQ,cAAe,KAAa,0CACpC,OAAO,EAAW,CAAO,EAE7B,EACA,MAAO,CAAE,KAAM,EAAM,IAAK,EAC1B,QAAS,CACP,OAAQ,EAAO,QAAQ,EACvB,QAAS,EAAO,SAAS,CAC3B,EACA,QAAS,CACP,WAAY,CAAC,IAAK,MAAM,EAAE,SAAS,QAAQ,IAAI,oBAAoB,YAAY,GAAK,EAAE,EACtF,IAAK,IAAM,YAAY,IAAI,CAC7B,EACA,YAAa,CACX,MAAO,EAAY,EAAM,IAAK,CAAW,CAC3C,EACA,YAAa,EAAY,EAAM,KAAK,CACtC,ED1IF,MAAM,UAAuB,KAAM,CAAC,CAEpC,eAAsB,EAAO,CAAC,EAAyB,CACrD,GAAI,CACF,EAAS,CAAK,EACd,IAAM,EAAS,MAAM,EAAsB,MAAO,IAAa,CAC7D,IAAM,EAAe,EAAW,QAAQ,MAAM,MAAQ,OAAY,MAAM,EAAU,EAAG,EAAM,MAAM,EAC3F,EAAsB,yCACtB,EAAY,EAAe,EAC3B,EAAa,EAAqB,EAAM,MAAM,EAC9C,EAAM,EAAW,IACjB,EAAc,EAAM,OAAO,UAAY,EAAI,QAAQ,EAAI,OACvD,EAAY,EAAW,EAAM,KAAK,EAClC,EAAQ,EAAY,CAAE,WAAY,EAAU,WAAY,QAAS,EAAU,EAAG,EAAI,OAClF,EAAU,EAAc,EAAM,KAAK,EACnC,EAAgB,MAAO,EAAyB,IAAwB,CAC5E,IAAM,EAAW,MAAM,EAAkB,CACvC,IAAK,EACL,UAAW,EAAW,UACtB,SACA,QAAS,CAAC,IACR,EAAqB,CACnB,SACA,SAAU,CAAE,WAAU,EACtB,SAAU,EAAM,SAChB,QAAS,EAAM,QACf,KAAM,EAAM,KACZ,MAAO,EACP,MAAO,EAAM,MACb,cACA,UACA,QACF,CAAC,EAAE,MAAM,CAAC,IAAU,CAClB,GAAI,aAAiB,OAAS,EAAM,UAAY,oBAC9C,MAAM,IAAI,EAAe,EAAM,OAAO,EACxC,MAAM,EACP,CACL,CAAC,EACK,EAAS,EAAS,MACxB,MAAO,CACL,IAAK,EAAS,IACd,UAAW,EAAO,QAAQ,GAC1B,aAAc,EAAO,QAAQ,MAC7B,SAAU,EAAO,SACjB,MAAO,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC1F,QAAS,EAAO,OAAO,QACvB,MAAO,EAAO,MACd,OAAQ,EAAO,MACjB,GAEI,EAAS,CACb,EACA,EAMA,IAEA,EAAqB,CACnB,SACA,SAAU,CAAE,UAAW,EAAK,SAAS,UAAW,UAAW,EAAK,SAAS,WAAY,EACrF,MAAO,EAAK,MACZ,cACA,MAAO,EAAK,MACR,CAAE,WAAY,EAAK,MAAM,WAAY,GAAI,EAAK,MAAM,QAAS,QAAS,EAAK,OAAQ,EACnF,OACJ,UACA,QACF,CAAC,EAAE,KAAK,CAAC,KAAY,CACnB,UAAW,EAAO,QAAQ,GAC1B,aAAc,EAAO,QAAQ,MAC7B,SAAU,EAAO,SACjB,MAAO,EAAO,MAAQ,CAAE,WAAY,EAAO,MAAM,WAAY,QAAS,EAAO,MAAM,EAAG,EAAI,OAC1F,QAAS,EAAO,OAAO,QACvB,MAAO,EAAO,MACd,OAAQ,EACV,EAAE,EAEJ,OADiB,MAAM,GACP,gBAAgB,CAC9B,KAAM,EAAe,CAAE,WAAU,YAAW,MAAO,EAAM,KAAM,CAAC,EAChE,MACA,YACA,OAAQ,EACR,UAAW,EAAW,UACtB,cAAe,EACf,MAAO,EAAM,MACb,QACA,QAAS,GAAW,QACpB,MAAO,CAAC,EACR,eACA,OAAQ,EAAM,QAAU,GACxB,YAAa,EAAM,YACnB,KAAM,EAAM,KACZ,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EACF,EACD,GAAI,EAAO,WAAa,EAAG,QAAQ,KAAK,EAAO,QAAQ,EACvD,MAAO,EAAO,CACd,GAAI,aAAiB,GAAmB,aAAiB,OAAS,EAAM,UAAY,EAClF,EAAK,EAAM,OAAO,EACpB,MAAM,GAKH,SAAS,CAAoB,CAAC,EAAmC,CACtE,IAAM,EAAO,CAAC,IACZ,EAAS,KAAK,CACZ,QAAS,EAAS,IAClB,QAAS,EAAQ,QAAQ,CAAQ,CACnC,CAAC,EACG,EAAY,EAAM,UACxB,MAAO,CACL,IAAK,EAAK,EAAM,QAAQ,EACxB,UAAW,EACP,MAAO,IAAwB,CAC7B,IAAM,EAAW,MAAM,EAAU,CAAM,EACvC,OAAO,EAAK,CAAQ,GAEtB,MACN,EAIF,eAAsB,CAAoB,CAAC,EAKxC,CACD,IAAI,EAAM,EAAM,IAChB,MAAO,GACL,GAAI,CACF,MAAO,CAAE,MAAK,MAAO,MAAM,EAAM,QAAQ,CAAG,CAAE,EAC9C,MAAO,EAAO,CACd,GAAI,CAAC,EAAM,WAAa,EAAE,aAAiB,IAAgB,EAAM,SAAW,YAAa,MAAM,EAC/F,MAAO,GACL,GAAI,CACF,EAAM,MAAM,EAAM,UAAU,EAAM,MAAM,EACxC,MACA,MAAO,EAAc,CACrB,GAAI,EAAM,OAAO,QAAS,MAAM,EAChC,MAAM,EAAW,IAAK,OAAW,CAAE,OAAQ,EAAM,MAAO,CAAC,IAO5D,SAAS,CAAoB,EAAG,CACrC,GAAI,CAAC,QAAQ,OAAO,MAAO,EAAK,qCAAqC,EAIhE,SAAS,CAAU,CAAC,EAA2B,EAA4B,CAChF,GAAI,CAAC,EAAQ,OAAO,GAAS,OAC7B,GAAI,CAAC,EAAO,OAAO,EACnB,OAAO,EAAQ;AAAA,EAAO,EAGxB,SAAS,CAAQ,CAAC,EAAyB,CAEzC,GADA,EAAqB,EACjB,EAAM,cAAgB,SAAc,CAAC,OAAO,UAAU,EAAM,WAAW,GAAK,EAAM,aAAe,GACnG,EAAK,2CAA2C,EAElD,GAAI,EAAM,MAAQ,CAAC,EAAM,UAAY,CAAC,EAAM,QAAS,EAAK,yCAAyC,EAGrG,SAAS,CAAc,EAAW,CAChC,IAAM,EAAO,QAAQ,IAAI,KAAO,QAAQ,IAAI,EAC5C,GAAI,CAEF,OADA,QAAQ,MAAM,CAAI,EACX,QAAQ,IAAI,EACnB,KAAM,CACN,MAAM,IAAI,EAAe,iCAAiC,GAAM,GAIpE,SAAS,CAAU,CAAC,EAAgB,CAClC,GAAI,CACF,OAAO,EAAwB,CAAK,EACpC,KAAM,CACN,MAAM,IAAI,EAAe,sDAAsD,GAInF,SAAS,CAAa,CAAC,EAAmD,CACxE,MAAO,OAAO,KAAW,CAAE,MAAO,EAAM,MAAO,MAAO,GAAkB,EAAM,KAAM,GAGtF,SAAS,CAAI,CAAC,EAAwB,CACpC,QAAQ,OAAO,MAAM,gCAAgC;AAAA,CAAW,EAChE,QAAQ,KAAK,CAAC", | ||
| "debugId": "3A1FB452E18F867D64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": [], | ||
| "sourcesContent": [ | ||
| ], | ||
| "mappings": "", | ||
| "debugId": "D4B9650F19E0FE5C64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/util/string-width.bun.ts", "../tui/src/util/locale.ts"], | ||
| "sourcesContent": [ | ||
| "export const stringWidth = Bun.stringWidth\n", | ||
| "import { stringWidth } from \"./string-width\"\n\nexport function titlecase(str: string) {\n return str.replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport function time(input: number): string {\n const date = new Date(input)\n return date.toLocaleTimeString(undefined, { timeStyle: \"short\" })\n}\n\nexport function datetime(input: number): string {\n const date = new Date(input)\n const localTime = time(input)\n const localDate = date.toLocaleDateString()\n return `${localTime} · ${localDate}`\n}\n\nexport function number(num: number): string {\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + \"M\"\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + \"K\"\n }\n return num.toString()\n}\n\nexport function duration(input: number) {\n if (input < 1000) {\n return `${input}ms`\n }\n if (input < 60000) {\n return `${(input / 1000).toFixed(1)}s`\n }\n if (input < 3600000) {\n const minutes = Math.floor(input / 60000)\n const seconds = Math.floor((input % 60000) / 1000)\n return `${minutes}m ${seconds}s`\n }\n if (input < 86400000) {\n const hours = Math.floor(input / 3600000)\n const minutes = Math.floor((input % 3600000) / 60000)\n return `${hours}h ${minutes}m`\n }\n const days = Math.floor(input / 86400000)\n const hours = Math.floor((input % 86400000) / 3600000)\n return `${days}d ${hours}h`\n}\n\nexport function truncate(str: string, len: number): string {\n if (str.length <= len) return str\n return str.slice(0, len - 1) + \"…\"\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" })\n\nexport function graphemes(str: string) {\n return Array.from(graphemeSegmenter.segment(str), (item) => item.segment)\n}\n\nexport function takeWidth(str: string, width: number) {\n if (width <= 0) return \"\"\n if (stringWidth(str) <= width) return str\n\n const result: string[] = []\n let used = 0\n for (const segment of graphemes(str)) {\n const next = stringWidth(segment)\n if (used + next > width) break\n result.push(segment)\n used += next\n }\n return result.join(\"\")\n}\n\nexport function truncateWidth(str: string, width: number): string {\n if (width <= 0) return \"\"\n if (stringWidth(str) <= width) return str\n if (width === 1) return \"…\"\n return takeWidth(str, width - 1) + \"…\"\n}\n\nexport function truncateLeft(str: string, len: number): string {\n if (str.length <= len) return str\n return \"…\" + str.slice(-(len - 1))\n}\n\nexport function truncateMiddle(str: string, maxLength: number = 35): string {\n if (str.length <= maxLength) return str\n\n const ellipsis = \"…\"\n const keepStart = Math.ceil((maxLength - ellipsis.length) / 2)\n const keepEnd = Math.floor((maxLength - ellipsis.length) / 2)\n\n return str.slice(0, keepStart) + ellipsis + str.slice(-keepEnd)\n}\n\nexport * as Locale from \"./locale\"\n" | ||
| ], | ||
| "mappings": ";kQAAO,IAAM,EAAc,IAAI,YCExB,SAAS,CAAS,CAAC,EAAa,CACrC,OAAO,EAAI,QAAQ,QAAS,CAAC,IAAM,EAAE,YAAY,CAAC,EAG7C,SAAS,CAAI,CAAC,EAAuB,CAE1C,OADa,IAAI,KAAK,CAAK,EACf,mBAAmB,OAAW,CAAE,UAAW,OAAQ,CAAC,EAG3D,SAAS,CAAQ,CAAC,EAAuB,CAC9C,IAAM,EAAO,IAAI,KAAK,CAAK,EACrB,EAAY,EAAK,CAAK,EACtB,EAAY,EAAK,mBAAmB,EAC1C,MAAO,GAAG,UAAe,IAGpB,SAAS,CAAM,CAAC,EAAqB,CAC1C,GAAI,GAAO,IACT,OAAQ,EAAM,KAAS,QAAQ,CAAC,EAAI,IAC/B,QAAI,GAAO,KAChB,OAAQ,EAAM,MAAM,QAAQ,CAAC,EAAI,IAEnC,OAAO,EAAI,SAAS,EAGf,SAAS,CAAQ,CAAC,EAAe,CACtC,GAAI,EAAQ,KACV,MAAO,GAAG,MAEZ,GAAI,EAAQ,MACV,MAAO,IAAI,EAAQ,MAAM,QAAQ,CAAC,KAEpC,GAAI,EAAQ,QAAS,CACnB,IAAM,EAAU,KAAK,MAAM,EAAQ,KAAK,EAClC,EAAU,KAAK,MAAO,EAAQ,MAAS,IAAI,EACjD,MAAO,GAAG,MAAY,KAExB,GAAI,EAAQ,SAAU,CACpB,IAAM,EAAQ,KAAK,MAAM,EAAQ,OAAO,EAClC,EAAU,KAAK,MAAO,EAAQ,QAAW,KAAK,EACpD,MAAO,GAAG,MAAU,KAEtB,IAAM,EAAO,KAAK,MAAM,EAAQ,QAAQ,EAClC,EAAQ,KAAK,MAAO,EAAQ,SAAY,OAAO,EACrD,MAAO,GAAG,MAAS,KAGd,SAAS,CAAQ,CAAC,EAAa,EAAqB,CACzD,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,OAAO,EAAI,MAAM,EAAG,EAAM,CAAC,EAAI,SAGjC,IAAM,EAAoB,IAAI,KAAK,UAAU,OAAW,CAAE,YAAa,UAAW,CAAC,EAE5E,SAAS,CAAS,CAAC,EAAa,CACrC,OAAO,MAAM,KAAK,EAAkB,QAAQ,CAAG,EAAG,CAAC,IAAS,EAAK,OAAO,EAGnE,SAAS,CAAS,CAAC,EAAa,EAAe,CACpD,GAAI,GAAS,EAAG,MAAO,GACvB,GAAI,EAAY,CAAG,GAAK,EAAO,OAAO,EAEtC,IAAM,EAAmB,CAAC,EACtB,EAAO,EACX,QAAW,KAAW,EAAU,CAAG,EAAG,CACpC,IAAM,EAAO,EAAY,CAAO,EAChC,GAAI,EAAO,EAAO,EAAO,MACzB,EAAO,KAAK,CAAO,EACnB,GAAQ,EAEV,OAAO,EAAO,KAAK,EAAE,EAGhB,SAAS,CAAa,CAAC,EAAa,EAAuB,CAChE,GAAI,GAAS,EAAG,MAAO,GACvB,GAAI,EAAY,CAAG,GAAK,EAAO,OAAO,EACtC,GAAI,IAAU,EAAG,MAAO,SACxB,OAAO,EAAU,EAAK,EAAQ,CAAC,EAAI,SAG9B,SAAS,CAAY,CAAC,EAAa,EAAqB,CAC7D,GAAI,EAAI,QAAU,EAAK,OAAO,EAC9B,MAAO,SAAM,EAAI,MAAM,EAAE,EAAM,EAAE,EAG5B,SAAS,CAAc,CAAC,EAAa,EAAoB,GAAY,CAC1E,GAAI,EAAI,QAAU,EAAW,OAAO,EAEpC,IAAM,EAAW,SACX,EAAY,KAAK,MAAM,EAAY,EAAS,QAAU,CAAC,EACvD,EAAU,KAAK,OAAO,EAAY,EAAS,QAAU,CAAC,EAE5D,OAAO,EAAI,MAAM,EAAG,CAAS,EAAI,EAAW,EAAI,MAAM,CAAC,CAAO", | ||
| "debugId": "D3E9CA7FEB51844B64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/providers/google-vertex-shared.ts"], | ||
| "sourcesContent": [ | ||
| "import type { AnyAuthClient } from \"google-auth-library\"\nimport { Effect, Redacted } from \"effect\"\nimport { Auth, MissingCredentialError } from \"../route/auth.js\"\n\nconst SCOPE = \"https://www.googleapis.com/auth/cloud-platform\"\n\nexport type OAuthOptions =\n | { readonly accessToken?: string; readonly auth?: never }\n | { readonly accessToken?: never; readonly auth?: Auth.Definition }\n\nexport type ApiKeyOptions =\n | (OAuthOptions & { readonly apiKey?: never })\n | { readonly accessToken?: never; readonly apiKey?: string; readonly auth?: never }\n\nexport const project = (value?: string) =>\n value ??\n process.env.GOOGLE_VERTEX_PROJECT ??\n process.env.GOOGLE_CLOUD_PROJECT ??\n process.env.GCP_PROJECT ??\n process.env.GCLOUD_PROJECT\n\nexport const location = (value: string | undefined, fallback: string) =>\n value ??\n process.env.GOOGLE_VERTEX_LOCATION ??\n process.env.GOOGLE_CLOUD_LOCATION ??\n process.env.VERTEX_LOCATION ??\n fallback\n\nexport const host = (location: string) => {\n if (location === \"global\") return \"aiplatform.googleapis.com\"\n // Jurisdictional multi-regions use Regional Endpoint Platform domains.\n if (location === \"eu\" || location === \"us\") return `aiplatform.${location}.rep.googleapis.com`\n return `${location}-aiplatform.googleapis.com`\n}\n\nexport const requireProject = (value: string | undefined) => {\n if (value) return value\n throw new Error(\"Google Vertex requires a project when baseURL is not configured\")\n}\n\nexport const apiKey = (input: ApiKeyOptions) => {\n if (input.apiKey !== undefined && (input.accessToken !== undefined || input.auth !== undefined))\n throw new Error(\"Google Vertex apiKey cannot be combined with accessToken or auth\")\n if (input.accessToken !== undefined || input.auth !== undefined) return undefined\n return input.apiKey ?? process.env.GOOGLE_VERTEX_API_KEY\n}\n\nconst adc = (project?: string) => {\n let client: Promise<AnyAuthClient> | undefined\n const loadClient = () => {\n if (client) return client\n client = import(\"google-auth-library\").then(({ GoogleAuth }) =>\n new GoogleAuth({ projectId: project, scopes: [SCOPE] }).getClient(),\n )\n return client\n }\n return Auth.effect(\n Effect.tryPromise({\n try: async () => {\n const token = await (await loadClient()).getAccessToken()\n if (!token.token) throw new Error(\"Google ADC returned an empty access token\")\n return Redacted.make(token.token)\n },\n catch: () => new MissingCredentialError(\"Google Application Default Credentials\"),\n }),\n ).bearer()\n}\n\nexport const oauth = (input: OAuthOptions, project?: string) => {\n if (input.accessToken !== undefined && input.auth !== undefined)\n throw new Error(\"Google Vertex accessToken cannot be combined with auth\")\n if (input.auth) return input.auth\n if (input.accessToken !== undefined) return Auth.bearer(input.accessToken)\n return adc(project)\n}\n\nexport * as GoogleVertexShared from \"./google-vertex-shared.js\"\n" | ||
| ], | ||
| "mappings": ";2TAIA,IAAM,EAAQ,iDAUD,EAAU,CAAC,IACtB,GACA,QAAQ,IAAI,uBACZ,QAAQ,IAAI,sBACZ,QAAQ,IAAI,aACZ,QAAQ,IAAI,eAED,EAAW,CAAC,EAA2B,IAClD,GACA,QAAQ,IAAI,wBACZ,QAAQ,IAAI,uBACZ,QAAQ,IAAI,iBACZ,EAEW,EAAO,CAAC,IAAqB,CACxC,GAAI,IAAa,SAAU,MAAO,4BAElC,GAAI,IAAa,MAAQ,IAAa,KAAM,MAAO,cAAc,uBACjE,MAAO,GAAG,+BAGC,EAAiB,CAAC,IAA8B,CAC3D,GAAI,EAAO,OAAO,EAClB,MAAU,MAAM,iEAAiE,GAGtE,EAAS,CAAC,IAAyB,CAC9C,GAAI,EAAM,SAAW,SAAc,EAAM,cAAgB,QAAa,EAAM,OAAS,QACnF,MAAU,MAAM,kEAAkE,EACpF,GAAI,EAAM,cAAgB,QAAa,EAAM,OAAS,OAAW,OACjE,OAAO,EAAM,QAAU,QAAQ,IAAI,uBAG/B,EAAM,CAAC,IAAqB,CAChC,IAAI,EACE,EAAa,IAAM,CACvB,GAAI,EAAQ,OAAO,EAInB,OAHA,EAAgB,mEAAuB,KAAK,EAAG,gBAC7C,IAAI,EAAW,CAAE,UAAW,EAAS,OAAQ,CAAC,CAAK,CAAE,CAAC,EAAE,UAAU,CACpE,EACO,GAET,OAAO,EAAK,OACV,EAAO,WAAW,CAChB,IAAK,SAAY,CACf,IAAM,EAAQ,MAAO,MAAM,EAAW,GAAG,eAAe,EACxD,GAAI,CAAC,EAAM,MAAO,MAAU,MAAM,2CAA2C,EAC7E,OAAO,EAAS,KAAK,EAAM,KAAK,GAElC,MAAO,IAAM,IAAI,EAAuB,wCAAwC,CAClF,CAAC,CACH,EAAE,OAAO,GAGE,EAAQ,CAAC,EAAqB,IAAqB,CAC9D,GAAI,EAAM,cAAgB,QAAa,EAAM,OAAS,OACpD,MAAU,MAAM,wDAAwD,EAC1E,GAAI,EAAM,KAAM,OAAO,EAAM,KAC7B,GAAI,EAAM,cAAgB,OAAW,OAAO,EAAK,OAAO,EAAM,WAAW,EACzE,OAAO,EAAI,CAAO", | ||
| "debugId": "B8D10528E7ED2FF664756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../schema/src/command.ts", "../schema/src/websearch.ts", "../schema/src/reference.ts"], | ||
| "sourcesContent": [ | ||
| "export * as Command from \"./command.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\nimport { Model } from \"./model.js\"\nimport { Agent } from \"./agent.js\"\n\nconst Updated = ephemeral({ type: \"command.updated\", schema: {} })\n\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\nexport const Info = Schema.Struct({\n name: Schema.String,\n template: Schema.String,\n description: Schema.String.pipe(optional),\n agent: Agent.ID.pipe(optional),\n model: Model.Ref.pipe(optional),\n subtask: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Command.Info\" })\n\nexport const Event = {\n Updated,\n Definitions: inventory(Updated),\n}\n", | ||
| "export * as WebSearch from \"./websearch.js\"\n\nimport { Schema } from \"effect\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { optional } from \"./schema.js\"\n\nexport const ID = Schema.String.pipe(Schema.brand(\"WebSearch.ID\"))\nexport type ID = typeof ID.Type\n\nexport interface Provider extends Schema.Schema.Type<typeof Provider> {}\nexport const Provider = Schema.Struct({\n id: ID,\n name: Schema.String,\n}).annotate({ identifier: \"WebSearch.Provider\" })\n\nexport interface Input extends Schema.Schema.Type<typeof Input> {}\nexport const Input = Schema.Struct({\n query: Schema.String,\n providerID: ID.pipe(optional),\n}).annotate({ identifier: \"WebSearch.Input\" })\nexport type ProviderInput = Pick<Input, \"query\">\n\nexport interface Result extends Schema.Schema.Type<typeof Result> {}\nexport const Result = Schema.Struct({\n url: Schema.String,\n title: Schema.String.pipe(optional),\n content: Schema.String.pipe(optional),\n time: Schema.Struct({\n published: Schema.Finite.pipe(optional),\n }),\n}).annotate({ identifier: \"WebSearch.Result\" })\n\nexport class Response extends Schema.Class<Response>(\"WebSearch.Response\")({\n providerID: ID,\n results: Schema.Array(Result),\n}) {}\n\nconst Updated = ephemeral({\n type: \"websearch.updated\",\n schema: {},\n})\nexport const Event = { Updated, Definitions: inventory(Updated) }\n", | ||
| "export * as Reference from \"./reference.js\"\n\nimport { Schema } from \"effect\"\nimport { optional } from \"./schema.js\"\nimport { ephemeral, inventory } from \"./event.js\"\nimport { AbsolutePath } from \"./schema.js\"\n\nconst Updated = ephemeral({ type: \"reference.updated\", schema: {} })\nexport const Event = { Updated, Definitions: inventory(Updated) }\n\nexport interface LocalSource extends Schema.Schema.Type<typeof LocalSource> {}\nexport const LocalSource = Schema.Struct({\n type: Schema.Literal(\"local\"),\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.LocalSource\" })\n\nexport interface GitSource extends Schema.Schema.Type<typeof GitSource> {}\nexport const GitSource = Schema.Struct({\n type: Schema.Literal(\"git\"),\n repository: Schema.String,\n branch: Schema.String.pipe(optional),\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n}).annotate({ identifier: \"Reference.GitSource\" })\n\nexport const Source = Schema.Union([LocalSource, GitSource])\n .pipe(Schema.toTaggedUnion(\"type\"))\n .annotate({ identifier: \"Reference.Source\" })\nexport type Source = typeof Source.Type\n\nexport const Info = Schema.Struct({\n name: Schema.String,\n path: AbsolutePath,\n description: Schema.String.pipe(optional),\n hidden: Schema.Boolean.pipe(optional),\n source: Source,\n}).annotate({ identifier: \"Reference.Info\" })\nexport interface Info extends Schema.Schema.Type<typeof Info> {}\n" | ||
| ], | ||
| "mappings": ";6XAQA,IAAM,EAAU,EAAU,CAAE,KAAM,kBAAmB,OAAQ,CAAC,CAAE,CAAC,EAGpD,EAAO,EAAO,OAAO,CAChC,KAAM,EAAO,OACb,SAAU,EAAO,OACjB,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,MAAO,EAAM,GAAG,KAAK,CAAQ,EAC7B,MAAO,EAAM,IAAI,KAAK,CAAQ,EAC9B,QAAS,EAAO,QAAQ,KAAK,CAAQ,CACvC,CAAC,EAAE,SAAS,CAAE,WAAY,cAAe,CAAC,EAE7B,EAAQ,CACnB,UACA,YAAa,EAAU,CAAO,CAChC,8GCjBO,IAAM,EAAK,EAAO,OAAO,KAAK,EAAO,MAAM,cAAc,CAAC,EAIpD,EAAW,EAAO,OAAO,CACpC,GAAI,EACJ,KAAM,EAAO,MACf,CAAC,EAAE,SAAS,CAAE,WAAY,oBAAqB,CAAC,EAGnC,EAAQ,EAAO,OAAO,CACjC,MAAO,EAAO,OACd,WAAY,EAAG,KAAK,CAAQ,CAC9B,CAAC,EAAE,SAAS,CAAE,WAAY,iBAAkB,CAAC,EAIhC,EAAS,EAAO,OAAO,CAClC,IAAK,EAAO,OACZ,MAAO,EAAO,OAAO,KAAK,CAAQ,EAClC,QAAS,EAAO,OAAO,KAAK,CAAQ,EACpC,KAAM,EAAO,OAAO,CAClB,UAAW,EAAO,OAAO,KAAK,CAAQ,CACxC,CAAC,CACH,CAAC,EAAE,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAEvC,MAAM,UAAiB,EAAO,MAAgB,oBAAoB,EAAE,CACzE,WAAY,EACZ,QAAS,EAAO,MAAM,CAAM,CAC9B,CAAC,CAAE,CAAC,CAEJ,IAAM,EAAU,EAAU,CACxB,KAAM,oBACN,OAAQ,CAAC,CACX,CAAC,EACY,EAAQ,CAAE,UAAS,YAAa,EAAU,CAAO,CAAE,wGClChE,IAAM,EAAU,EAAU,CAAE,KAAM,oBAAqB,OAAQ,CAAC,CAAE,CAAC,EACtD,EAAQ,CAAE,UAAS,YAAa,EAAU,CAAO,CAAE,EAGnD,EAAc,EAAO,OAAO,CACvC,KAAM,EAAO,QAAQ,OAAO,EAC5B,KAAM,EACN,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,OAAQ,EAAO,QAAQ,KAAK,CAAQ,CACtC,CAAC,EAAE,SAAS,CAAE,WAAY,uBAAwB,CAAC,EAGtC,EAAY,EAAO,OAAO,CACrC,KAAM,EAAO,QAAQ,KAAK,EAC1B,WAAY,EAAO,OACnB,OAAQ,EAAO,OAAO,KAAK,CAAQ,EACnC,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,OAAQ,EAAO,QAAQ,KAAK,CAAQ,CACtC,CAAC,EAAE,SAAS,CAAE,WAAY,qBAAsB,CAAC,EAEpC,EAAS,EAAO,MAAM,CAAC,EAAa,CAAS,CAAC,EACxD,KAAK,EAAO,cAAc,MAAM,CAAC,EACjC,SAAS,CAAE,WAAY,kBAAmB,CAAC,EAGjC,EAAO,EAAO,OAAO,CAChC,KAAM,EAAO,OACb,KAAM,EACN,YAAa,EAAO,OAAO,KAAK,CAAQ,EACxC,OAAQ,EAAO,QAAQ,KAAK,CAAQ,EACpC,OAAQ,CACV,CAAC,EAAE,SAAS,CAAE,WAAY,gBAAiB,CAAC", | ||
| "debugId": "5A8A100B2335433E64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/protocols/utils/tool-stream.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect } from \"effect\"\nimport { AIError, LLMEvent, type ProviderMetadata, type ToolCall, type ToolInputError } from \"../../schema/index.js\"\nimport { eventError, parseToolInput, type ToolAccumulator } from \"../shared.js\"\n\ntype StreamKey = string | number\n\n/**\n * One pending streamed tool call. Providers emit the tool identity and JSON\n * argument text across separate chunks; `input` is the raw JSON string collected\n * so far, not the parsed object.\n */\nexport interface PendingTool extends ToolAccumulator {\n readonly providerExecuted?: boolean\n readonly providerMetadata?: ProviderMetadata\n}\n\n/**\n * Sparse parser state keyed by the provider's stream-local tool identifier.\n *\n * This key is not the final tool-call id (`call_...`). It is the id/index the\n * provider uses while streaming a partial call: OpenAI Chat / Anthropic /\n * Bedrock use numeric content indexes, while OpenAI Responses uses string\n * `item_id`s. The generic keeps each protocol internally consistent.\n */\nexport type State<K extends StreamKey> = Partial<Record<K, PendingTool>>\n\n/**\n * Result of adding argument text to one pending tool call. It returns both the\n * next `tools` state and the updated `tool` because parsers often need the\n * current id/name immediately. `events` contains lifecycle and delta events\n * produced by the append; metadata-only deltas update identity without output.\n */\nexport interface AppendOutcome<K extends StreamKey> {\n readonly tools: State<K>\n readonly tool: PendingTool\n readonly events: ReadonlyArray<LLMEvent>\n}\n\n/** Create empty accumulator state for one provider stream. */\nexport const empty = <K extends StreamKey>(): State<K> => ({})\n\nconst withTool = <K extends StreamKey>(tools: State<K>, key: K, tool: PendingTool): State<K> => {\n return { ...tools, [key]: tool }\n}\n\nconst withoutTool = <K extends StreamKey>(tools: State<K>, key: K): State<K> => {\n const next = { ...tools }\n delete next[key]\n return next\n}\n\nconst inputStart = (tool: PendingTool) =>\n LLMEvent.toolInputStart({\n id: tool.id,\n name: tool.name,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n })\n\nconst inputDelta = (tool: PendingTool, text: string) =>\n LLMEvent.toolInputDelta({\n id: tool.id,\n name: tool.name,\n text,\n })\n\nconst toolCall = (route: string, tool: PendingTool, inputOverride?: string) => {\n const raw = inputOverride ?? tool.input\n return parseToolInput(route, tool.name, raw).pipe(\n Effect.map((input): ToolCall | ToolInputError =>\n LLMEvent.toolCall({\n id: tool.id,\n name: tool.name,\n input,\n providerExecuted: tool.providerExecuted ? true : undefined,\n providerMetadata: tool.providerMetadata,\n }),\n ),\n Effect.catch((error) =>\n tool.providerExecuted\n ? Effect.fail(error)\n : Effect.succeed(\n LLMEvent.toolInputError({\n id: tool.id,\n name: tool.name,\n raw,\n }),\n ),\n ),\n )\n}\n\nconst finishEvents = (tool: PendingTool, event: ToolCall | ToolInputError): ReadonlyArray<LLMEvent> =>\n event.type === \"tool-input-error\"\n ? [event]\n : [LLMEvent.toolInputEnd({ id: tool.id, name: tool.name, providerMetadata: tool.providerMetadata }), event]\n\n/** Store the updated tool and produce the optional public delta event. */\nconst appendTool = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: PendingTool,\n text: string,\n): AppendOutcome<K> => {\n const events: LLMEvent[] = []\n if (!tools[key]) events.push(inputStart(tool))\n if (text.length > 0) events.push(inputDelta(tool, text))\n return {\n tools: withTool(tools, key, tool),\n tool,\n events,\n }\n}\n\nexport const isError = <K extends StreamKey>(result: AppendOutcome<K> | AIError): result is AIError =>\n result instanceof AIError\n\n/**\n * Register a tool call whose start event arrived before any argument deltas.\n * Used by Anthropic `content_block_start`, Bedrock `contentBlockStart`, and\n * OpenAI Responses `response.output_item.added`.\n */\nexport const start = <K extends StreamKey>(\n tools: State<K>,\n key: K,\n tool: Omit<PendingTool, \"input\"> & { readonly input?: string },\n) => withTool(tools, key, { ...tool, input: tool.input ?? \"\" })\n\n/**\n * Append a streamed argument delta, starting the tool if this provider encodes\n * identity on the first delta instead of a separate start event. OpenAI Chat has\n * this shape: `tool_calls[].index` is the stream key, and `id` / `name` may only\n * appear on the first delta for that index.\n */\nexport const appendOrStart = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n delta: { readonly id?: string; readonly name?: string; readonly text: string },\n missingToolMessage: string,\n): AppendOutcome<K> | AIError => {\n const current = tools[key]\n const id = current?.id ?? delta.id\n const name = current?.name ?? delta.name\n if (!id || !name) return eventError(route, missingToolMessage)\n\n const tool = {\n id,\n name,\n input: `${current?.input ?? \"\"}${delta.text}`,\n providerExecuted: current?.providerExecuted,\n providerMetadata: current?.providerMetadata,\n }\n if (current && delta.text.length === 0 && current.id === id && current.name === name)\n return { tools, tool: current, events: [] }\n return appendTool(tools, key, tool, delta.text)\n}\n\n/**\n * Append argument text to a tool that must already have been started. This keeps\n * protocols honest when their stream grammar promises a start event before any\n * argument delta.\n */\nexport const appendExisting = <K extends StreamKey>(\n route: string,\n tools: State<K>,\n key: K,\n text: string,\n missingToolMessage: string,\n): AppendOutcome<K> | AIError => {\n const current = tools[key]\n if (!current) return eventError(route, missingToolMessage)\n if (text.length === 0) return { tools, tool: current, events: [] }\n return appendTool(tools, key, { ...current, input: `${current.input}${text}` }, text)\n}\n\n/**\n * Finalize one pending tool call: parse the accumulated raw JSON, remove it\n * from state, and return either a call or a non-executable local input error.\n * Missing keys are a no-op because some providers emit stop events for\n * non-tool content blocks.\n */\nexport const finish = <K extends StreamKey>(route: string, tools: State<K>, key: K) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool)),\n }\n })\n\n/**\n * Finalize one pending tool call with an authoritative final input string.\n * OpenAI Responses can send accumulated deltas and then repeat the completed\n * arguments on `response.output_item.done`; the final value wins.\n */\nexport const finishWithInput = <K extends StreamKey>(route: string, tools: State<K>, key: K, input: string) =>\n Effect.gen(function* () {\n const tool = tools[key]\n if (!tool) return { tools }\n return {\n tools: withoutTool(tools, key),\n events: finishEvents(tool, yield* toolCall(route, tool, input)),\n }\n })\n\n/**\n * Finalize every pending tool call at once. OpenAI Chat has this shape: it does\n * not emit per-tool stop events, so all accumulated calls finish independently\n * when the choice receives a terminal `finish_reason`.\n */\nexport const finishAll = <K extends StreamKey>(route: string, tools: State<K>) =>\n Effect.gen(function* () {\n const pending = Object.values<PendingTool | undefined>(tools).filter(\n (tool): tool is PendingTool => tool !== undefined,\n )\n return {\n tools: empty<K>(),\n events: yield* Effect.forEach(pending, (tool) =>\n toolCall(route, tool).pipe(Effect.map((event) => finishEvents(tool, event))),\n ).pipe(Effect.map((events) => events.flat())),\n }\n })\n\nexport * as ToolStream from \"./tool-stream.js\"\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "38C2AF1EC46C865B64756E2164756E21", | ||
| "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": "7594BBCF155D39D964756E2164756E21", | ||
| "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": "CAE1AAB6FAD8B4BE64756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/run.ts"], | ||
| "sourcesContent": [ | ||
| "import { Effect, Option } from \"effect\"\nimport { Commands } from \"../commands\"\nimport { Runtime } from \"../../framework/runtime\"\nimport { ServerConnection } from \"../../services/server-connection\"\n\nexport default Runtime.handler(Commands.commands.run, (input) =>\n Effect.gen(function* () {\n const { runNonInteractive } = yield* Effect.promise(() => import(\"../../run/run\"))\n const separator = process.argv.indexOf(\"--\", 2)\n const server = yield* ServerConnection.resolve({\n server: Option.getOrUndefined(input.server),\n standalone: input.standalone,\n })\n yield* Effect.promise(() =>\n runNonInteractive({\n server,\n message: [...input.message, ...(separator === -1 ? [] : process.argv.slice(separator + 1))],\n continue: input.continue,\n session: Option.getOrUndefined(input.session),\n fork: input.fork,\n model: Option.getOrUndefined(input.model),\n agent: Option.getOrUndefined(input.agent),\n format: input.format,\n file: [...input.file],\n title: Option.getOrUndefined(input.title),\n thinking: input.thinking,\n auto: input.auto || input.yolo || input.dangerouslySkipPermissions,\n }),\n )\n }),\n)\n" | ||
| ], | ||
| "mappings": ";mhCAKA,IAAe,IAAQ,QAAQ,EAAS,SAAS,IAAK,CAAC,IACrD,EAAO,IAAI,SAAU,EAAG,CACtB,IAAQ,qBAAsB,MAAO,EAAO,QAAQ,IAAa,wCAAgB,EAC3E,EAAY,QAAQ,KAAK,QAAQ,KAAM,CAAC,EACxC,EAAS,MAAO,EAAiB,QAAQ,CAC7C,OAAQ,EAAO,eAAe,EAAM,MAAM,EAC1C,WAAY,EAAM,UACpB,CAAC,EACD,MAAO,EAAO,QAAQ,IACpB,EAAkB,CAChB,SACA,QAAS,CAAC,GAAG,EAAM,QAAS,GAAI,IAAc,GAAK,CAAC,EAAI,QAAQ,KAAK,MAAM,EAAY,CAAC,CAAE,EAC1F,SAAU,EAAM,SAChB,QAAS,EAAO,eAAe,EAAM,OAAO,EAC5C,KAAM,EAAM,KACZ,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,OAAQ,EAAM,OACd,KAAM,CAAC,GAAG,EAAM,IAAI,EACpB,MAAO,EAAO,eAAe,EAAM,KAAK,EACxC,SAAU,EAAM,SAChB,KAAM,EAAM,MAAQ,EAAM,MAAQ,EAAM,0BAC1C,CAAC,CACH,EACD,CACH", | ||
| "debugId": "5BDAB833894F487064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../tui/src/mini/demo.ts"], | ||
| "sourcesContent": [ | ||
| "// Demo mode for testing direct interactive mode without a real SDK.\n//\n// Enabled with `--demo`. Intercepts prompt submissions and drives the same\n// presentation commits and footer actions as the live transport. This\n// lets you test scrollback formatting, permission UI, canonical Form UI, and tool\n// snapshots without making actual model calls. Pass a demo slash command as\n// the initial interactive message to trigger a preview immediately.\n//\n// Slash commands:\n// /permission [kind] → triggers a permission request variant\n// /form [kind] → triggers a canonical Form request variant\n// /fmt <kind> → emits a specific tool/text type (text, reasoning, shell,\n// write, edit, patch, subagent, question, error, mix)\n//\n// Demo mode handles permission and Form replies locally, completing or failing\n// the synthetic tool parts through the same callbacks used by the live footer.\nimport path from \"path\"\nimport type { JsonValue, SessionMessageAssistantTool } from \"@opencode-ai/client/promise\"\nimport { parseSlashHead } from \"../prompt/parse\"\nimport { writeSessionOutput } from \"./stream\"\nimport { toolCommit, toolFinalPhase } from \"./stream-v2.subagent\"\nimport type {\n FooterApi,\n FooterView,\n FormCancel,\n FormReply,\n MiniFormRequest,\n MiniPermissionRequest,\n PermissionReply,\n RunPrompt,\n StreamCommit,\n} from \"./types\"\n\nconst KINDS = [\n \"markdown\",\n \"table\",\n \"text\",\n \"reasoning\",\n \"shell\",\n \"write\",\n \"edit\",\n \"patch\",\n \"subagent\",\n \"question\",\n \"error\",\n \"mix\",\n]\nconst PERMISSIONS = [\"edit\", \"shell\", \"read\", \"subagent\", \"external\", \"doom\"] as const\nconst FORMS = [\"question\", \"external\"] as const\n\ntype PermissionKind = (typeof PERMISSIONS)[number]\ntype FormKind = (typeof FORMS)[number]\n\nfunction permissionKind(value: string | undefined): PermissionKind | undefined {\n const next = (value || \"edit\").toLowerCase()\n return PERMISSIONS.find((item) => item === next)\n}\n\nfunction formKind(value: string | undefined): FormKind | undefined {\n const next = (value || \"question\").toLowerCase()\n return FORMS.find((item) => item === next)\n}\n\nconst SAMPLE_MARKDOWN = [\n \"# Direct Mode Demo\",\n \"\",\n \"This is a realistic assistant response for direct-mode formatting checks.\",\n \"It mixes **bold**, _italic_, `inline code`, links, code fences, and tables in one streamed reply.\",\n \"\",\n \"## Summary\",\n \"\",\n \"- Restored the final markdown flush so the last block is committed on idle.\",\n \"- Switched markdown scrollback commits back to top-level block boundaries.\",\n \"- Added footer-level regression coverage for split-footer rendering.\",\n \"\",\n \"## Status\",\n \"\",\n \"| Area | Before | After | Notes |\",\n \"| --- | --- | --- | --- |\",\n \"| Direct mode | Missing final rows | Stable | Final markdown block now flushes on idle |\",\n \"| Tables | Dropped in streaming mode | Visible | Block-based commits match the working OpenTUI demo |\",\n \"| Tests | Partial coverage | Broader coverage | Includes a footer-level split render capture |\",\n \"\",\n \"> This sample intentionally includes a wide table so you can spot wrapping and commit bugs quickly.\",\n \"\",\n \"```ts\",\n \"const result = { markdown: true, tables: 2, stable: true }\",\n \"```\",\n \"\",\n \"## Files\",\n \"\",\n \"| File | Change |\",\n \"| --- | --- |\",\n \"| `scrollback.surface.ts` | Align markdown commit logic with the split-footer demo |\",\n \"| `footer.ts` | Keep active surfaces across footer-height-only resizes |\",\n \"| `footer.test.ts` | Capture real split-footer markdown payloads during idle completion |\",\n \"\",\n \"Next step: run `/fmt table` if you want a tighter table-only sample.\",\n].join(\"\\n\")\n\nconst SAMPLE_TABLE = [\n \"# Table Sample\",\n \"\",\n \"| Kind | Example | Notes |\",\n \"| --- | --- | --- |\",\n \"| Pipe | `A\\\\|B` | Escaped pipes should stay in one cell |\",\n \"| Unicode | `漢字` | Wide characters should remain aligned |\",\n \"| Wrap | `LongTokenWithoutNaturalBreaks_1234567890` | Useful for width stress |\",\n \"| Status | done | Final row should still appear after idle |\",\n].join(\"\\n\")\n\ntype Ref = {\n msg: string\n call: string\n tool: string\n input: Record<string, JsonValue>\n start: number\n}\n\ntype FormRequest = {\n ref: Ref\n kind: FormKind\n request: MiniFormRequest\n}\n\ntype Perm = {\n ref: Ref\n done: {\n output: string\n metadata?: Record<string, JsonValue>\n }\n}\n\ntype Permit = {\n ref: Ref\n permission: string\n patterns: string[]\n metadata?: MiniPermissionRequest[\"metadata\"]\n always: string[]\n done: Perm[\"done\"]\n}\n\ntype State = {\n id: string\n thinking: boolean\n footer: FooterApi\n msg: number\n part: number\n call: number\n perm: number\n form: number\n perms: Map<string, Perm>\n forms: Map<string, FormRequest>\n started: Set<string>\n}\n\ntype Input = {\n sessionID: string\n thinking: boolean\n footer: FooterApi\n}\n\nfunction note(footer: FooterApi, text: string): void {\n footer.append({\n kind: \"system\",\n text,\n phase: \"start\",\n source: \"system\",\n })\n}\n\nfunction clearSubagent(footer: FooterApi): void {\n footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [],\n details: {},\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction showSubagent(\n state: State,\n input: {\n sessionID: string\n label: string\n description: string\n status: \"running\" | \"completed\" | \"cancelled\" | \"error\"\n title?: string\n commits: StreamCommit[]\n },\n) {\n state.footer.event({\n type: \"stream.subagent\",\n state: {\n tabs: [\n {\n sessionID: input.sessionID,\n label: input.label,\n description: input.description,\n status: input.status,\n title: input.title,\n },\n ],\n details: {\n [input.sessionID]: {\n commits: input.commits,\n },\n },\n permissions: [],\n forms: [],\n },\n })\n}\n\nfunction wait(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (!signal) {\n setTimeout(resolve, ms)\n return\n }\n\n if (signal.aborted) {\n resolve()\n return\n }\n\n const done = () => {\n clearTimeout(timer)\n signal.removeEventListener(\"abort\", done)\n resolve()\n }\n\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", done)\n resolve()\n }, ms)\n\n signal.addEventListener(\"abort\", done, { once: true })\n })\n}\n\nfunction split(text: string): string[] {\n if (text.length <= 48) {\n return [text]\n }\n\n const size = Math.ceil(text.length / 3)\n return [text.slice(0, size), text.slice(size, size * 2), text.slice(size * 2)]\n}\n\nfunction take(state: State, key: \"msg\" | \"part\" | \"call\" | \"perm\", prefix: string): string {\n state[key] += 1\n return `demo_${prefix}_${state[key]}`\n}\n\nfunction present(state: State, commits: StreamCommit[], view?: FooterView): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits,\n updates: view\n ? [\n {\n type: \"stream.patch\" as const,\n patch: { status: view.type === \"permission\" ? \"awaiting permission\" : \"awaiting form\" },\n },\n { type: \"stream.view\" as const, view },\n ]\n : undefined,\n },\n )\n}\n\nfunction clearBlocker(state: State): void {\n writeSessionOutput(\n { footer: state.footer },\n {\n commits: [],\n updates: [\n { type: \"stream.patch\", patch: { status: \"\" } },\n { type: \"stream.view\", view: { type: \"prompt\" } },\n ],\n },\n )\n}\n\nfunction open(state: State): string {\n return take(state, \"msg\", \"msg\")\n}\n\nasync function emitText(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n present(state, [\n { kind: \"assistant\", source: \"assistant\", text: item, phase: \"progress\", messageID: msg, partID: part },\n ])\n await wait(45, signal)\n }\n}\n\nasync function emitReasoning(state: State, body: string, signal?: AbortSignal): Promise<void> {\n const msg = open(state)\n const part = take(state, \"part\", \"part\")\n let first = true\n for (const item of split(body)) {\n if (signal?.aborted) {\n return\n }\n\n if (state.thinking) {\n present(state, [\n {\n kind: \"reasoning\",\n source: \"reasoning\",\n text: first ? `Thinking: ${item.replace(/\\[REDACTED\\]/g, \"\")}` : item.replace(/\\[REDACTED\\]/g, \"\"),\n phase: \"progress\",\n messageID: msg,\n partID: part,\n },\n ])\n first = false\n }\n await wait(45, signal)\n }\n}\n\nfunction make(state: State, tool: string, input: Record<string, JsonValue>): Ref {\n return {\n msg: open(state),\n call: take(state, \"call\", \"call\"),\n tool,\n input,\n start: Date.now(),\n }\n}\n\nfunction startTool(state: State, ref: Ref, metadata: Record<string, JsonValue> = {}): SessionMessageAssistantTool {\n state.started.add(ref.call)\n const part = {\n type: \"tool\" as const,\n id: ref.call,\n name: ref.tool,\n state: { status: \"running\" as const, input: ref.input, metadata },\n time: { created: ref.start, ran: ref.start },\n }\n present(state, [toolCommit(part, ref.msg, \"start\")])\n return part\n}\n\nfunction askPermission(state: State, item: Permit): void {\n const tool = startTool(state, item.ref)\n\n const id = take(state, \"perm\", \"perm\")\n state.perms.set(id, {\n ref: item.ref,\n done: item.done,\n })\n\n present(state, [], {\n type: \"permission\",\n request: {\n id,\n sessionID: state.id,\n action: item.permission,\n resources: item.patterns,\n metadata: item.metadata ?? {},\n save: item.always,\n source: { type: \"tool\", messageID: item.ref.msg, id: item.ref.call },\n tool,\n },\n })\n}\n\nfunction doneTool(\n state: State,\n ref: Ref,\n output: {\n output: string\n metadata?: Record<string, JsonValue>\n },\n): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n const part: SessionMessageAssistantTool = {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"completed\",\n input: ref.input,\n content: [{ type: \"text\", text: output.output }],\n metadata: output.metadata,\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n }\n present(state, [toolCommit(part, ref.msg, toolFinalPhase(part))])\n}\n\nfunction failTool(state: State, ref: Ref, error: string): void {\n if (!state.started.has(ref.call)) startTool(state, ref)\n present(state, [\n toolCommit(\n {\n type: \"tool\",\n id: ref.call,\n name: ref.tool,\n state: {\n status: \"error\",\n input: ref.input,\n error: { type: \"unknown\", message: error },\n },\n time: { created: ref.start, ran: ref.start, completed: Date.now() },\n },\n ref.msg,\n \"final\",\n ),\n ])\n}\n\nfunction emitError(state: State, text: string): void {\n present(state, [{ kind: \"error\", source: \"system\", text, phase: \"start\" }])\n}\n\nasync function emitBash(state: State, signal?: AbortSignal): Promise<void> {\n const ref = make(state, \"shell\", {\n command: \"git status\",\n workdir: process.cwd(),\n description: \"Show git status\",\n })\n startTool(state, ref)\n await wait(70, signal)\n doneTool(state, ref, {\n output: `${process.cwd()}\\ngit status\\nOn branch demo\\nnothing to commit, working tree clean\\n`,\n metadata: {\n exit: 0,\n },\n })\n}\n\nfunction emitWrite(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"write\", {\n path: file,\n content: \"export const demo = 42\\n\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {},\n })\n}\n\nfunction emitEdit(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"edit\", {\n path: file,\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n file,\n status: \"modified\",\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n },\n ],\n },\n })\n}\n\nfunction emitPatch(state: State): void {\n const file = path.join(process.cwd(), \"src\", \"demo-format.ts\")\n const ref = make(state, \"patch\", {\n patchText: \"*** Begin Patch\\n*** End Patch\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n files: [\n {\n status: \"modified\",\n file,\n patch: \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\",\n deletions: 1,\n },\n {\n status: \"added\",\n file: path.join(process.cwd(), \"README-demo.md\"),\n patch: \"@@ -0,0 +1,4 @@\\n+# Demo\\n+This is a generated preview file.\\n\",\n deletions: 0,\n },\n ],\n },\n })\n}\n\nfunction emitTask(state: State): void {\n const ref = make(state, \"subagent\", {\n description: \"Scan run/* for reducer touchpoints\",\n agent: \"explore\",\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n sessionID: \"ses_demo_child\",\n status: \"completed\",\n output: \"\",\n },\n })\n const part = {\n type: \"tool\",\n id: \"sub_demo_call_1\",\n name: \"read\",\n state: {\n status: \"running\",\n input: {\n path: \"packages/tui/src/mini/stream.ts\",\n offset: 1,\n limit: 200,\n },\n metadata: {},\n },\n time: { created: Date.now(), ran: Date.now() },\n } satisfies SessionMessageAssistantTool\n showSubagent(state, {\n sessionID: \"ses_demo_child\",\n label: \"Explore\",\n description: \"Scan run/* for reducer touchpoints\",\n status: \"completed\",\n title: \"Reducer touchpoints found\",\n commits: [\n {\n kind: \"user\",\n text: \"Scan run/* for reducer touchpoints\",\n phase: \"start\",\n source: \"system\",\n },\n {\n kind: \"reasoning\",\n text: \"Thinking: tracing reducer and footer boundaries\",\n phase: \"progress\",\n source: \"reasoning\",\n messageID: \"sub_demo_msg_reasoning\",\n partID: \"sub_demo_reasoning_1\",\n },\n toolCommit(part, \"sub_demo_msg_tool\", \"start\"),\n {\n kind: \"assistant\",\n text: \"Footer updates flow through stream.ts into RunFooter\",\n phase: \"progress\",\n source: \"assistant\",\n messageID: \"sub_demo_msg_text\",\n partID: \"sub_demo_text_1\",\n },\n ],\n })\n}\n\nfunction emitQuestionTool(state: State): void {\n const ref = make(state, \"question\", {\n questions: [\n {\n header: \"Style\",\n question: \"Which output style do you want to inspect?\",\n options: [\n { label: \"Diff\", description: \"Show diff block\" },\n { label: \"Code\", description: \"Show code block\" },\n ],\n multiple: false,\n custom: false,\n },\n {\n header: \"Extras\",\n question: \"Pick extra rows\",\n options: [\n { label: \"Usage\", description: \"Add usage row\" },\n { label: \"Duration\", description: \"Add duration row\" },\n ],\n multiple: true,\n custom: true,\n },\n ],\n })\n doneTool(state, ref, {\n output: \"\",\n metadata: {\n answers: [[\"Diff\"], [\"Usage\", \"custom-note\"]],\n },\n })\n}\n\nfunction emitPermission(state: State, kind: PermissionKind = \"edit\"): void {\n const root = process.cwd()\n const file = path.join(root, \"src\", \"demo-format.ts\")\n\n if (kind === \"shell\") {\n const command = \"git status --short\"\n const ref = make(state, \"shell\", {\n command,\n workdir: root,\n description: \"Inspect worktree changes\",\n })\n askPermission(state, {\n ref,\n permission: \"shell\",\n patterns: [command],\n always: [\"*\"],\n done: {\n output: `${root}\\ngit status --short\\n M src/demo-format.ts\\n?? src/demo-permission.ts\\n`,\n metadata: {\n exit: 0,\n },\n },\n })\n return\n }\n\n if (kind === \"read\") {\n const target = path.join(root, \"package.json\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 80,\n })\n askPermission(state, {\n ref,\n permission: \"read\",\n patterns: [target],\n always: [target],\n done: {\n output: [\"1: {\", '2: \"name\": \"opencode\",', '3: \"private\": true', \"4: }\"].join(\"\\n\"),\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"subagent\") {\n const ref = make(state, \"subagent\", {\n description: \"Inspect footer spacing across direct-mode prompts\",\n agent: \"explore\",\n })\n askPermission(state, {\n ref,\n permission: \"subagent\",\n patterns: [\"explore\"],\n always: [\"*\"],\n done: {\n output: \"\",\n metadata: {\n sessionID: \"sub_demo_perm_1\",\n status: \"completed\",\n output: \"\",\n },\n },\n })\n return\n }\n\n if (kind === \"external\") {\n const dir = path.join(path.dirname(root), \"demo-shared\")\n const target = path.join(dir, \"README.md\")\n const ref = make(state, \"read\", {\n path: target,\n offset: 1,\n limit: 40,\n })\n askPermission(state, {\n ref,\n permission: \"external_directory\",\n patterns: [`${dir}/**`],\n metadata: {\n parentDir: dir,\n filepath: target,\n },\n always: [`${dir}/**`],\n done: {\n output: `1: # External demo\\n2: Shared preview file\\nPath: ${target}`,\n metadata: {},\n },\n })\n return\n }\n\n if (kind === \"doom\") {\n const ref = make(state, \"subagent\", {\n description: \"Retry the formatter after repeated failures\",\n agent: \"general\",\n })\n askPermission(state, {\n ref,\n permission: \"doom_loop\",\n patterns: [\"*\"],\n always: [\"*\"],\n done: {\n output: \"Continuing after repeated failures.\\n\",\n metadata: {},\n },\n })\n return\n }\n\n const diff = \"@@ -1 +1 @@\\n-export const demo = 1\\n+export const demo = 42\\n\"\n const ref = make(state, \"edit\", {\n path: file,\n })\n askPermission(state, {\n ref,\n permission: \"edit\",\n patterns: [file],\n always: [file],\n done: {\n output: \"\",\n metadata: {\n files: [{ file, status: \"modified\", patch: diff }],\n },\n },\n })\n}\n\nfunction demoForm(kind: FormKind): { title: string; fields: MiniFormRequest[\"fields\"]; questions?: JsonValue[] } {\n if (kind === \"question\") {\n const questions: JsonValue[] = [\n {\n header: \"Layout\",\n question: \"Which footer view should be the reference for spacing checks?\",\n options: [\n { label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n multiple: false,\n custom: true,\n },\n {\n header: \"Checks\",\n question: \"Pick formatting previews\",\n options: [\n { label: \"Diff\", description: \"Emit an edit diff\" },\n { label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n multiple: true,\n custom: true,\n },\n ]\n return {\n title: \"Questions\",\n questions,\n fields: [\n {\n key: \"q0\",\n title: \"Layout\",\n description: \"Which footer view should be the reference for spacing checks?\",\n type: \"string\",\n options: [\n { value: \"Form\", label: \"Form\", description: \"Inspect the canonical Form footer\" },\n { value: \"Prompt\", label: \"Prompt\", description: \"Return to the normal composer\" },\n ],\n custom: true,\n },\n {\n key: \"q1\",\n title: \"Checks\",\n description: \"Pick formatting previews\",\n type: \"multiselect\",\n options: [\n { value: \"Diff\", label: \"Diff\", description: \"Emit an edit diff\" },\n { value: \"Subagent\", label: \"Subagent\", description: \"Emit a subagent card\" },\n ],\n custom: true,\n },\n ],\n }\n }\n return {\n title: \"MCP authorization\",\n fields: [\n {\n key: \"authorization\",\n type: \"external\",\n url: \"https://example.com/opencode-demo\",\n title: \"Authorize demo MCP server\",\n description: \"Complete authorization in your browser\",\n },\n ],\n }\n}\n\nfunction emitForm(state: State, kind: FormKind = \"question\"): void {\n const form = demoForm(kind)\n const ref = make(state, kind === \"question\" ? \"question\" : \"mcp_demo\", {\n ...(form.questions ? { questions: form.questions } : { form: kind }),\n })\n startTool(state, ref)\n state.form++\n const request: MiniFormRequest = {\n id: `frm_demo_${state.form}`,\n sessionID: state.id,\n title: form.title,\n metadata:\n kind === \"question\"\n ? { kind: \"question\", tool: { messageID: ref.msg, id: ref.call } }\n : { kind: \"mcp\", message: `Synthetic ${kind} MCP elicitation` },\n fields: form.fields,\n }\n state.forms.set(request.id, { ref, kind, request })\n present(state, [], { type: \"form\", request })\n}\n\nasync function emitFmt(state: State, kind: string, body: string, signal?: AbortSignal): Promise<boolean> {\n if (kind === \"text\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"markdown\" || kind === \"md\") {\n await emitText(state, body || SAMPLE_MARKDOWN, signal)\n return true\n }\n\n if (kind === \"table\") {\n await emitText(state, body || SAMPLE_TABLE, signal)\n return true\n }\n\n if (kind === \"reasoning\") {\n await emitReasoning(state, body || \"Planning next steps [REDACTED] while preserving reducer ordering.\", signal)\n return true\n }\n\n if (kind === \"shell\") {\n await emitBash(state, signal)\n return true\n }\n\n if (kind === \"write\") {\n emitWrite(state)\n return true\n }\n\n if (kind === \"edit\") {\n emitEdit(state)\n return true\n }\n\n if (kind === \"patch\") {\n emitPatch(state)\n return true\n }\n\n if (kind === \"subagent\") {\n emitTask(state)\n return true\n }\n\n if (kind === \"question\") {\n emitQuestionTool(state)\n return true\n }\n\n if (kind === \"error\") {\n emitError(state, body || \"demo error event\")\n return true\n }\n\n if (kind === \"mix\") {\n await emitText(state, SAMPLE_MARKDOWN, signal)\n await wait(50, signal)\n await emitReasoning(state, \"Thinking through formatter edge cases [REDACTED].\", signal)\n await wait(50, signal)\n await emitBash(state, signal)\n emitWrite(state)\n emitEdit(state)\n emitPatch(state)\n emitTask(state)\n emitQuestionTool(state)\n emitError(state, \"demo mixed scenario error\")\n return true\n }\n\n return false\n}\n\nfunction intro(state: State): void {\n note(\n state.footer,\n [\n \"Demo slash commands enabled for interactive mode.\",\n `- /permission [kind] (${PERMISSIONS.join(\", \")})`,\n `- /form [kind] (${FORMS.join(\", \")})`,\n `- /fmt <kind> (${KINDS.join(\", \")})`,\n \"Examples:\",\n \"- /permission shell\",\n \"- /form question\",\n \"- /form external\",\n \"- /fmt markdown\",\n \"- /fmt table\",\n \"- /fmt text your custom text\",\n ].join(\"\\n\"),\n )\n}\n\nexport function createRunDemo(input: Input) {\n const state: State = {\n id: input.sessionID,\n thinking: input.thinking,\n footer: input.footer,\n msg: 0,\n part: 0,\n call: 0,\n perm: 0,\n form: 0,\n perms: new Map(),\n forms: new Map(),\n started: new Set(),\n }\n\n const start = async (): Promise<void> => {\n intro(state)\n }\n\n const prompt = async (line: RunPrompt, signal?: AbortSignal): Promise<boolean> => {\n const text = line.text.trim()\n const head = parseSlashHead(text)\n const list = head?.arguments.split(/\\s+/).filter(Boolean) ?? []\n const cmd = head ? `/${head.name}` : \"\"\n\n clearSubagent(state.footer)\n\n if (cmd === \"/help\") {\n intro(state)\n return true\n }\n\n if (cmd === \"/permission\") {\n const kind = permissionKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a permission kind: ${PERMISSIONS.join(\", \")}`)\n return true\n }\n\n emitPermission(state, kind)\n return true\n }\n\n if (cmd === \"/form\") {\n const kind = formKind(list[0])\n if (!kind) {\n note(state.footer, `Pick a form kind: ${FORMS.join(\", \")}`)\n return true\n }\n\n emitForm(state, kind)\n return true\n }\n\n if (cmd === \"/fmt\") {\n const kind = (list[0] || \"\").toLowerCase()\n const body = list.slice(1).join(\" \")\n if (!kind) {\n note(state.footer, `Pick a kind: ${KINDS.join(\", \")}`)\n return true\n }\n\n const ok = await emitFmt(state, kind, body, signal)\n if (ok) {\n return true\n }\n\n note(state.footer, `Unknown kind \"${kind}\". Use: ${KINDS.join(\", \")}`)\n return true\n }\n\n return false\n }\n\n const permission = (input: PermissionReply): boolean => {\n const item = state.perms.get(input.requestID)\n if (!item || !input.reply) {\n return false\n }\n\n state.perms.delete(input.requestID)\n clearBlocker(state)\n\n if (input.reply === \"reject\") {\n failTool(state, item.ref, input.message || \"permission rejected\")\n return true\n }\n\n doneTool(state, item.ref, item.done)\n return true\n }\n\n const formReply = (input: FormReply): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n if (form.kind === \"question\") {\n doneTool(state, form.ref, {\n output: \"\",\n metadata: {\n answers: form.request.fields.map((field) => {\n const value = input.answer[field.key]\n if (value === undefined) return []\n return Array.isArray(value) ? [...value] : [String(value)]\n }),\n },\n })\n return true\n }\n doneTool(state, form.ref, {\n output: `Form submitted: ${Object.entries(input.answer)\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.join(\", \") : String(value)}`)\n .join(\"; \")}\\n`,\n metadata: { answer: input.answer },\n })\n return true\n }\n\n const formCancel = (input: FormCancel): boolean => {\n const form = state.forms.get(input.formID)\n if (!form || input.sessionID !== form.request.sessionID) return false\n state.forms.delete(input.formID)\n clearBlocker(state)\n failTool(state, form.ref, \"form cancelled\")\n return true\n }\n\n return {\n start,\n prompt,\n permission,\n formReply,\n formCancel,\n }\n}\n" | ||
| ], | ||
| "mappings": "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", | ||
| "debugId": "B7B82006D69A219164756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../core/src/workspace/driver.ts", "../core/src/workspace/sql.ts", "../core/src/workspace.ts", "../core/src/environment/files.ts", "../core/src/environment/exec-defaults.ts", "../core/src/environment/local.ts", "../core/src/environment/memory.ts", "../core/src/environment/environment.ts", "../core/src/environment/index.ts"], | ||
| "sourcesContent": [ | ||
| "export * as WorkspaceDriver from \"./driver.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer, Schema } from \"effect\"\nimport type { Scope } from \"effect\"\nimport type { Driver as EnvironmentDriver } from \"../environment/driver.js\"\n\n/**\n * Smallest provider-owned JSON value required to reconnect to the same\n * provider resource. Core stores it opaquely and hands it back; only the\n * owning driver reads inside.\n */\nexport const Binding = Schema.Record(Schema.String, Schema.Json)\nexport type Binding = typeof Binding.Type\n\nexport class Error extends Schema.TaggedError<Error>()(\"WorkspaceDriver.Error\", {\n message: Schema.optional(Schema.String),\n cause: Schema.optional(Schema.Defect()),\n}) {}\n\nexport class ProviderNotFound extends Schema.TaggedError<ProviderNotFound>()(\"WorkspaceDriver.ProviderNotFound\", {\n provider: Schema.String,\n}) {}\n\nexport interface Interface {\n readonly create: (input: {\n readonly workspaceID: Workspace.ID\n }) => Effect.Effect<{ readonly binding: Binding }, Error>\n readonly connect: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<EnvironmentDriver, Error, Scope.Scope>\n readonly suspendForIdle: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n readonly saveBinding: (binding: Binding) => Effect.Effect<void>\n }) => Effect.Effect<void, Error>\n readonly destroy: (input: {\n readonly workspaceID: Workspace.ID\n readonly binding: Binding\n }) => Effect.Effect<void, Error>\n}\n\nexport const make = (driver: Interface) => driver\n\nexport interface Registry {\n readonly get: (provider: string) => Effect.Effect<Interface, ProviderNotFound>\n}\n\nexport class RegistryService extends Context.Service<RegistryService, Registry>()(\n \"@opencode/WorkspaceDriverRegistry\",\n) {}\n\nexport const registry = (drivers: Readonly<Record<string, Interface>>): Registry => ({\n get: (provider) => {\n const driver = Object.hasOwn(drivers, provider) ? drivers[provider] : undefined\n return driver ? Effect.succeed(driver) : Effect.fail(new ProviderNotFound({ provider }))\n },\n})\n\nexport const registryNode = (drivers: Readonly<Record<string, Interface>>) =>\n makeGlobalNode({\n service: RegistryService,\n layer: Layer.succeed(RegistryService, RegistryService.of(registry(drivers))),\n deps: [],\n })\n\nexport const node = registryNode({})\n", | ||
| "import { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { integer, sqliteTable, text } from \"drizzle-orm/sqlite-core\"\nimport type { WorkspaceDriver } from \"./driver.js\"\n\nexport const WorkspaceTable = sqliteTable(\"workspace\", {\n id: text().$type<Workspace.ID>().primaryKey(),\n provider: text().notNull(),\n binding: text({ mode: \"json\" }).$type<WorkspaceDriver.Binding>().notNull(),\n created_at: integer().notNull(),\n last_used_at: integer().notNull(),\n})\n", | ||
| "export * as Workspace from \"./workspace.js\"\n\nimport { Workspace } from \"@opencode-ai/schema/workspace\"\nimport { makeGlobalNode } from \"@opencode-ai/util/effect/app-node\"\nimport { eq } from \"drizzle-orm\"\nimport { Clock, Context, Duration, Effect, Exit, Layer, Ref, Schedule, Schema, Scope } from \"effect\"\nimport { systemError } from \"effect/PlatformError\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver as EnvironmentDriver } from \"./environment/driver.js\"\nimport { Database } from \"./database/database.js\"\nimport { KeyedMutex } from \"./effect/keyed-mutex.js\"\nimport { WorkspaceDriver } from \"./workspace/driver.js\"\nimport { WorkspaceTable } from \"./workspace/sql.js\"\n\nexport const ID = Workspace.ID\nexport type ID = Workspace.ID\n\nexport class Info extends Schema.Class<Info>(\"Workspace.Info\")({\n id: ID,\n provider: Schema.String,\n binding: WorkspaceDriver.Binding,\n createdAt: Schema.Number,\n lastUsedAt: Schema.Number,\n}) {}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Workspace.NotFound\", { workspaceID: ID }) {}\n\nexport interface Interface {\n readonly create: (provider: string) => Effect.Effect<Info, WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly connect: (\n workspaceID: ID,\n ) => Effect.Effect<EnvironmentDriver, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n readonly destroy: (\n workspaceID: ID,\n ) => Effect.Effect<void, NotFound | WorkspaceDriver.Error | WorkspaceDriver.ProviderNotFound>\n}\n\nexport interface Options {\n readonly idleThreshold?: Duration.Input\n readonly pollInterval?: Duration.Input\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Workspace\") {}\n\ninterface Connection {\n readonly driver: WorkspaceDriver.Interface\n readonly environment: EnvironmentDriver\n readonly saveBinding: (binding: WorkspaceDriver.Binding) => Effect.Effect<void>\n readonly lastActivity: Ref.Ref<number>\n readonly active: Ref.Ref<number>\n readonly scope: Scope.Closeable\n}\n\nexport const configured = (options: Options = {}) =>\n makeGlobalNode({\n service: Service,\n layer: layer(options),\n deps: [Database.node, WorkspaceDriver.node],\n })\n\nconst layer = (options: Options) =>\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const db = (yield* Database.Service).db\n const registry = yield* WorkspaceDriver.RegistryService\n const lifetime = yield* Scope.Scope\n const connections = new Map<ID, Connection>()\n const locks = KeyedMutex.makeUnsafe<ID>()\n const idleThreshold = Duration.toMillis(options.idleThreshold ?? Duration.minutes(20))\n\n const load = Effect.fn(\"Workspace.load\")(function* (workspaceID: ID) {\n const row = yield* db\n .select()\n .from(WorkspaceTable)\n .where(eq(WorkspaceTable.id, workspaceID))\n .get()\n .pipe(Effect.orDie)\n if (!row) return yield* new NotFound({ workspaceID })\n return row\n })\n\n const open = Effect.fn(\"Workspace.open\")(function* (workspaceID: ID) {\n const existing = connections.get(workspaceID)\n if (existing) return existing\n\n const row = yield* load(workspaceID)\n const driver = yield* registry.get(row.provider)\n const saveBinding = (value: WorkspaceDriver.Binding) =>\n db\n .update(WorkspaceTable)\n .set({ binding: value })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n const scope = yield* Scope.fork(lifetime)\n const environment = yield* driver.connect({ workspaceID, binding: row.binding, saveBinding }).pipe(\n Effect.provideService(Scope.Scope, scope),\n Effect.onError((cause) => Scope.close(scope, Exit.failCause(cause))),\n )\n const now = yield* Clock.currentTimeMillis\n const connection: Connection = {\n driver,\n environment,\n saveBinding,\n lastActivity: yield* Ref.make(now),\n active: yield* Ref.make(0),\n scope,\n }\n connections.set(workspaceID, connection)\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: now })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n return connection\n })\n\n yield* Effect.gen(function* () {\n const now = yield* Clock.currentTimeMillis\n yield* Effect.forEach(\n [...connections.entries()],\n ([workspaceID, expected]) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = connections.get(workspaceID)\n if (connection !== expected || (yield* Ref.get(connection.active)) > 0) return\n const lastActivity = yield* Ref.get(connection.lastActivity)\n if (now - lastActivity < idleThreshold) return\n const row = yield* load(workspaceID)\n // Deliberate: a racing spawn blocks, then wakes cleanly. Unlocking mid-suspend could reattach a sandbox being terminated.\n yield* connection.driver.suspendForIdle({\n workspaceID,\n binding: row.binding,\n saveBinding: connection.saveBinding,\n })\n yield* db\n .update(WorkspaceTable)\n .set({ last_used_at: lastActivity })\n .where(eq(WorkspaceTable.id, workspaceID))\n .run()\n .pipe(Effect.orDie)\n connections.delete(workspaceID)\n yield* Scope.close(connection.scope, Exit.void)\n }).pipe(Effect.catchCause((cause) => Effect.logError(\"workspace idle suspension failed\", cause))),\n ),\n { concurrency: \"unbounded\", discard: true },\n )\n }).pipe(Effect.repeat(Schedule.spaced(options.pollInterval ?? Duration.minutes(1))), Effect.forkScoped)\n\n return Service.of({\n create: Effect.fn(\"Workspace.create\")(function* (provider) {\n const driver = yield* registry.get(provider)\n const workspaceID = ID.create()\n const result = yield* driver.create({ workspaceID })\n const now = yield* Clock.currentTimeMillis\n yield* db\n .insert(WorkspaceTable)\n .values({ id: workspaceID, provider, binding: result.binding, created_at: now, last_used_at: now })\n .run()\n .pipe(Effect.orDie)\n return new Info({ id: workspaceID, provider, binding: result.binding, createdAt: now, lastUsedAt: now })\n }),\n connect: Effect.fn(\"Workspace.connect\")(function* (workspaceID) {\n const spawner = make((command) =>\n Effect.acquireRelease(\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const connection = yield* open(workspaceID).pipe(\n Effect.mapError((cause) =>\n systemError({\n _tag: \"Unknown\",\n module: \"Workspace\",\n method: \"spawn\",\n description: `Failed to wake workspace ${workspaceID}`,\n cause,\n }),\n ),\n )\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n yield* Ref.update(connection.active, (active) => active + 1)\n return connection\n }),\n ),\n (connection) =>\n locks.withLock(workspaceID)(\n Effect.gen(function* () {\n yield* Ref.update(connection.active, (active) => active - 1)\n yield* Ref.set(connection.lastActivity, yield* Clock.currentTimeMillis)\n }),\n ),\n ).pipe(Effect.flatMap((connection) => connection.environment.spawner.spawn(command))),\n )\n // Overrides are connection-bound; per-spawn routing is required before any driver ships them, so they are deliberately omitted.\n return { spawner }\n }),\n destroy: Effect.fn(\"Workspace.destroy\")(function* (workspaceID) {\n yield* locks.withLock(workspaceID)(\n Effect.gen(function* () {\n const row = yield* load(workspaceID)\n const connection = connections.get(workspaceID)\n connections.delete(workspaceID)\n if (connection) yield* Scope.close(connection.scope, Exit.void)\n const driver = yield* registry.get(row.provider)\n yield* driver.destroy({ workspaceID, binding: row.binding })\n yield* db.delete(WorkspaceTable).where(eq(WorkspaceTable.id, workspaceID)).run().pipe(Effect.orDie)\n }),\n )\n }),\n })\n }),\n )\n\nexport const node = configured()\n\n// TODO(workspace-plan): add the boot janitor and ~23h safety snapshot rotation in a later PR.\n// TODO(workspace-plan): make cold wake interruptible with a re-pin loop against janitor races.\n// TODO(workspace-plan): consider RcMap at end-of-series consolidation; idle suspend and destroy need distinct finalizers.\n", | ||
| "import { Effect, Schema } from \"effect\"\n\nexport const FileType = Schema.Literals([\"file\", \"directory\", \"symlink\", \"other\"])\nexport type FileType = typeof FileType.Type\n\nexport interface FileInfo {\n readonly type: FileType\n readonly size: number\n readonly mtimeMs: number\n}\n\nexport interface DirEntry {\n readonly name: string\n readonly type: FileType\n}\n\nexport class NotFound extends Schema.TaggedError<NotFound>()(\"Environment.NotFound\", {\n path: Schema.String,\n}) {}\n\nexport class WrongKind extends Schema.TaggedError<WrongKind>()(\"Environment.WrongKind\", {\n path: Schema.String,\n actual: FileType,\n}) {}\n\nexport class Failed extends Schema.TaggedError<Failed>()(\"Environment.Failed\", {\n path: Schema.String,\n cause: Schema.Defect(),\n}) {}\n\nexport interface FilesImpl {\n /**\n * Content operations (`read`, `list`) follow final symlinks; metadata operations (`stat` and entry\n * tags returned by `list`) do not. `info` describes the target file whose bytes are returned.\n * The process-backed default caps collected output at 64 MiB; larger whole-file reads fail with\n * `Failed`, so callers must use ranges for larger files.\n */\n readonly read: (\n path: string,\n range?: { readonly offset: number; readonly length: number },\n ) => Effect.Effect<{ readonly info: FileInfo; readonly bytes: Uint8Array }, NotFound | WrongKind | Failed>\n readonly write: (path: string, bytes: Uint8Array) => Effect.Effect<void, Failed>\n /** Describes the path entry itself, so a final symlink is reported as `symlink` rather than followed. */\n readonly stat: (path: string) => Effect.Effect<FileInfo, NotFound | Failed>\n /** Follows a final symlink to the listed directory while preserving each returned entry's own type. */\n readonly list: (path: string) => Effect.Effect<ReadonlyArray<DirEntry>, NotFound | WrongKind | Failed>\n readonly remove: (path: string) => Effect.Effect<void, Failed>\n readonly move: (from: string, to: string) => Effect.Effect<void, NotFound | Failed>\n readonly mkdir: (path: string) => Effect.Effect<void, Failed>\n}\n\nexport interface Files extends FilesImpl {}\n\n/**\n * Derives a follow-stat kind from the lstat-like Files contract. A dangling\n * symlink fails with `NotFound`.\n */\nexport const typeFollowing = (files: Files, path: string) =>\n files.stat(path).pipe(\n Effect.flatMap((info) =>\n info.type === \"symlink\"\n ? files.read(path, { offset: 0, length: 0 }).pipe(\n Effect.map((result) => result.info.type),\n Effect.catchTag(\"Environment.WrongKind\", (error) => Effect.succeed(error.actual)),\n )\n : Effect.succeed(info.type),\n ),\n )\n\nexport * as EnvironmentFiles from \"./files.js\"\n", | ||
| "import { Effect, Stream } from \"effect\"\nimport { ChildProcess } from \"effect/unstable/process\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { collectStream } from \"@opencode-ai/util/process\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FileType, type FilesImpl } from \"./files.js\"\n\n/**\n * Files derived from spawning processes: one process per intent, \"$1\" is\n * always the target path. Scripts report classification through an exit-code\n * protocol (44/45/46) so failures never require parsing localized error text;\n * LC_ALL=C pins the one stderr match that remains. Requires GNU coreutils and\n * findutils in the target image — BSD and busybox userlands will not work.\n * Malformed output from these scripts is our own bug and dies as a defect.\n */\n\nconst MAX_DATA_BYTES = 64 * 1024 * 1024\nconst MAX_ERROR_BYTES = 64 * 1024\nconst NOT_FOUND = 44\nconst WRONG_KIND = 45\nconst FAILED = 46\nconst TAB = \"\\t\"\n\nconst loadMetadata = (flags = \"\") => `\nmetadata=$(stat ${flags} -c '%F${TAB}%s${TAB}%Y' -- \"$1\" 2>&1) || {\n case \"$metadata\" in\n *'No such file or directory'*|*'Not a directory'*) exit ${NOT_FOUND} ;;\n *) printf '%s' \"$metadata\" >&2; exit ${FAILED} ;;\n esac\n}\n`\n\nconst statScript = `\n${loadMetadata()}\nprintf '%s\\n' \"$metadata\"\n`\n\nconst readScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != 'regular file' ] && [ \"$kind\" != 'regular empty file' ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nprintf '%s\\n' \"$metadata\"\nif [ \"$2\" = range ]; then\n dd if=\"$1\" iflag=skip_bytes,count_bytes skip=\"$3\" count=\"$4\" status=none\nelse\n cat -- \"$1\"\nfi\n`\n\nconst listScript = `\n${loadMetadata(\"-L\")}\nkind=\\${metadata%%${TAB}*}\nif [ \"$kind\" != directory ]; then\n printf '%s' \"$kind\" >&2\n exit ${WRONG_KIND}\nfi\nfind -H \"$1\" -mindepth 1 -maxdepth 1 -printf '%y\\\\0%f\\\\0'\n`\n\nconst moveScript = `\n${loadMetadata()}\nmv -- \"$1\" \"$2\"\n`\n\ninterface Result {\n readonly exitCode: number\n readonly stdout: Uint8Array\n readonly stderr: Uint8Array\n}\n\nexport const execDefaults = (spawner: ChildProcessSpawner[\"Service\"]): FilesImpl => {\n const run = (\n path: string,\n script: string,\n args: ReadonlyArray<string> = [],\n stdin?: Uint8Array,\n ): Effect.Effect<Result, Failed> =>\n Effect.scoped(\n Effect.gen(function* () {\n const command = ChildProcess.make(\"sh\", [\"-c\", script, \"sh\", path, ...args], {\n env: { LC_ALL: \"C\" },\n extendEnv: true,\n stdin: stdin === undefined ? undefined : Stream.make(stdin),\n })\n const handle = yield* spawner.spawn(command).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStream(handle.stdout, MAX_DATA_BYTES),\n collectStream(handle.stderr, MAX_ERROR_BYTES),\n handle.exitCode,\n ],\n { concurrency: \"unbounded\" },\n ).pipe(Effect.mapError((cause) => new Failed({ path, cause })))\n if (stdout.truncated || stderr.truncated) {\n return yield* new Failed({ path, cause: new Error(\"Process output exceeded its collection limit\") })\n }\n return { exitCode, stdout: stdout.buffer, stderr: stderr.buffer }\n }),\n )\n\n const classify = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n ): Effect.Effect<A, NotFound | WrongKind | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n if (result.exitCode === WRONG_KIND) {\n return Effect.fail(new WrongKind({ path, actual: parseType(new TextDecoder().decode(result.stderr)) }))\n }\n return Effect.fail(processFailure(path, result))\n }\n\n const complete = (path: string, result: Result) =>\n result.exitCode === 0 ? Effect.void : Effect.fail(processFailure(path, result))\n\n return {\n stat: (path) => run(path, statScript).pipe(Effect.flatMap((result) => classifyPlain(path, result, parseInfo))),\n read: (path, range) =>\n run(\n path,\n readScript,\n range === undefined ? [\"whole\"] : [\"range\", String(range.offset), String(range.length)],\n ).pipe(\n Effect.flatMap((result) =>\n classify(path, result, (stdout) => {\n const newline = stdout.indexOf(10)\n if (newline < 0) throw new Error(\"Missing read metadata header\")\n return {\n info: parseInfo(stdout.slice(0, newline)),\n bytes: stdout.slice(newline + 1),\n }\n }),\n ),\n ),\n write: (path, bytes) =>\n run(path, `mkdir -p \"$(dirname \"$1\")\" && cat > \"$1\"`, [], bytes).pipe(\n Effect.flatMap((result) => complete(path, result)),\n ),\n list: (path) => run(path, listScript).pipe(Effect.flatMap((result) => classify(path, result, parseList))),\n remove: (path) => run(path, `rm -rf -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n move: (from, to) =>\n run(from, moveScript, [to]).pipe(Effect.flatMap((result) => classifyPlain(from, result, () => undefined))),\n mkdir: (path) => run(path, `mkdir -p -- \"$1\"`).pipe(Effect.flatMap((result) => complete(path, result))),\n }\n}\n\n/** `classify` for scripts whose protocol never reports WrongKind. */\nconst classifyPlain = <A>(\n path: string,\n result: Result,\n success: (stdout: Uint8Array) => A,\n): Effect.Effect<A, NotFound | Failed> => {\n if (result.exitCode === 0) return Effect.sync(() => success(result.stdout))\n if (result.exitCode === NOT_FOUND) return Effect.fail(new NotFound({ path }))\n return Effect.fail(processFailure(path, result))\n}\n\nconst processFailure = (path: string, result: Result) =>\n new Failed({\n path,\n cause: new Error(new TextDecoder().decode(result.stderr).trim() || `Process exited with code ${result.exitCode}`),\n })\n\nconst parseInfo = (bytes: Uint8Array): FileInfo => {\n const [rawType, rawSize, rawMtime] = new TextDecoder().decode(bytes).trim().split(TAB)\n const size = Number(rawSize)\n const mtimeMs = Number(rawMtime) * 1_000\n if (!rawType || !Number.isFinite(size) || !Number.isFinite(mtimeMs)) throw new Error(\"Invalid stat output\")\n return { type: parseType(rawType), size, mtimeMs }\n}\n\nconst parseType = (value: string): FileType => {\n if (value === \"regular file\" || value === \"regular empty file\" || value === \"f\") return \"file\"\n if (value === \"directory\" || value === \"d\") return \"directory\"\n if (value === \"symbolic link\" || value === \"l\") return \"symlink\"\n return \"other\"\n}\n\nconst parseList = (bytes: Uint8Array) => {\n const fields = new TextDecoder().decode(bytes).split(\"\\0\")\n fields.pop()\n if (fields.length % 2 !== 0) throw new Error(\"Invalid find output\")\n return Array.from({ length: fields.length / 2 }, (_, index) => ({\n name: fields[index * 2 + 1],\n type: parseType(fields[index * 2]),\n }))\n}\n\nexport * as EnvironmentExecDefaults from \"./exec-defaults.js\"\n", | ||
| "import fs from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { Effect } from \"effect\"\nimport type { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\n/**\n * The host filesystem binding. Deliberately raw node:fs rather than effect's\n * FileSystem service or FSUtil: the contract needs lstat semantics (stat\n * reports \"symlink\") and typed directory entries, and effect's node\n * FileSystem provides neither — its stat always follows symlinks and\n * readDirectory returns names only. FSUtil hits the same gap and its\n * readDirectoryEntries already bypasses to raw node readdir internally.\n * Nothing above the environment seam touches node:fs.\n */\nexport const makeLocalDriver = (spawner: ChildProcessSpawner[\"Service\"]): Driver => {\n const overrides: FilesImpl = {\n read: (value, range) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"file\") return yield* new WrongKind({ path: value, actual: info.type })\n if (range === undefined) {\n const bytes = yield* attempt(value, () => fs.readFile(value), true)\n return { info, bytes }\n }\n const bytes = yield* attempt(\n value,\n async () => {\n const handle = await fs.open(value, \"r\")\n try {\n const buffer = new Uint8Array(range.length)\n const result = await handle.read(buffer, 0, range.length, range.offset)\n return buffer.subarray(0, result.bytesRead)\n } finally {\n await handle.close()\n }\n },\n true,\n )\n return { info, bytes }\n }),\n stat: (value) => stat(value, false),\n list: (value) =>\n Effect.gen(function* () {\n const info = yield* stat(value, true)\n if (info.type !== \"directory\") return yield* new WrongKind({ path: value, actual: info.type })\n const entries = yield* attempt(value, () => fs.readdir(value, { withFileTypes: true }), true)\n return entries.map((entry) => ({ name: entry.name, type: fileType(entry) }))\n }),\n write: (value, bytes) =>\n attempt(value, async () => {\n await fs.mkdir(path.dirname(value), { recursive: true })\n await fs.writeFile(value, bytes)\n }),\n remove: (value) => attempt(value, () => fs.rm(value, { recursive: true, force: true })),\n move: (from, to) =>\n Effect.gen(function* () {\n yield* stat(from, false)\n const destination = yield* stat(to, false).pipe(\n Effect.map((info) => (info.type === \"directory\" ? path.join(to, path.basename(from)) : to)),\n Effect.catchIf(\n (error) => error instanceof NotFound,\n () => Effect.succeed(to),\n ),\n )\n yield* attempt(from, () => fs.rename(from, destination))\n }),\n mkdir: (value) => attempt(value, () => fs.mkdir(value, { recursive: true }).then(() => undefined)),\n }\n\n return { spawner, overrides }\n}\n\nconst stat = (value: string, follow: boolean) =>\n attempt(value, () => (follow ? fs.stat(value) : fs.lstat(value)), true).pipe(\n Effect.map((stats): FileInfo => ({ type: fileType(stats), size: stats.size, mtimeMs: stats.mtimeMs })),\n )\n\nconst fileType = (entry: { isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean }): FileType => {\n if (entry.isFile()) return \"file\"\n if (entry.isDirectory()) return \"directory\"\n if (entry.isSymbolicLink()) return \"symlink\"\n return \"other\"\n}\n\nfunction attempt<A>(value: string, run: () => Promise<A>): Effect.Effect<A, Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing: true): Effect.Effect<A, NotFound | Failed>\nfunction attempt<A>(value: string, run: () => Promise<A>, missing = false) {\n return Effect.tryPromise({\n try: run,\n catch: (cause) =>\n missing && isMissing(cause) ? new NotFound({ path: value }) : new Failed({ path: value, cause }),\n })\n}\n\nconst isMissing = (cause: unknown) =>\n cause !== null &&\n typeof cause === \"object\" &&\n \"code\" in cause &&\n (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\")\n\nexport * as EnvironmentLocal from \"./local.js\"\n", | ||
| "import path from \"node:path\"\nimport { Effect, PlatformError } from \"effect\"\nimport { make } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Driver } from \"./driver.js\"\nimport { Failed, NotFound, WrongKind, type FileInfo, type FilesImpl, type FileType } from \"./files.js\"\n\ntype Node =\n | { readonly type: \"file\"; readonly bytes: Uint8Array; readonly mtimeMs: number }\n | { readonly type: \"directory\"; readonly mtimeMs: number }\n | { readonly type: \"symlink\"; readonly target: string; readonly mtimeMs: number }\n\nexport interface MemoryDriver extends Driver {\n readonly symlink: (target: string, path: string) => Effect.Effect<void, Failed>\n}\n\nexport const makeMemoryDriver = (): MemoryDriver => {\n const nodes = new Map<string, Node>([[\"/\", { type: \"directory\", mtimeMs: Date.now() }]])\n const key = (value: string) => path.posix.resolve(\"/\", value)\n const info = (node: Node): FileInfo => ({\n type: node.type,\n size:\n node.type === \"file\"\n ? node.bytes.length\n : node.type === \"symlink\"\n ? new TextEncoder().encode(node.target).length\n : 0,\n mtimeMs: node.mtimeMs,\n })\n const resolveKey = (value: string, followFinal: boolean, seen = new Set<string>()): string | undefined => {\n const normalized = key(value)\n const parts = normalized.split(\"/\").filter(Boolean)\n const base = \"/\"\n const walk = (current: string, index: number): string | undefined => {\n if (index === parts.length) return current\n const part = parts[index]\n const candidate = path.posix.join(current, part)\n const node = nodes.get(candidate)\n if (node?.type !== \"symlink\" || (!followFinal && index === parts.length - 1)) return walk(candidate, index + 1)\n if (seen.has(candidate)) return undefined\n seen.add(candidate)\n const target = path.posix.resolve(path.posix.dirname(candidate), node.target)\n return resolveKey(path.posix.join(target, ...parts.slice(index + 1)), followFinal, seen)\n }\n return walk(base, 0)\n }\n const lookup = (value: string) => nodes.get(resolveKey(value, false) ?? key(value))\n const requireParent = (value: string) => {\n const parentPath = path.posix.dirname(key(value))\n const parent = nodes.get(resolveKey(parentPath, true) ?? parentPath)\n if (!parent) throw new Error(`Parent directory does not exist: ${path.posix.dirname(value)}`)\n if (parent.type !== \"directory\") throw new Error(`Parent is not a directory: ${path.posix.dirname(value)}`)\n }\n const mkdirSync = (value: string) => {\n const target = resolveKey(value, false) ?? key(value)\n const existing = nodes.get(target)\n if (existing?.type === \"directory\") return\n if (existing) throw new Error(`Path is not a directory: ${value}`)\n const parent = path.posix.dirname(target)\n if (parent !== target) mkdirSync(parent)\n nodes.set(target, { type: \"directory\", mtimeMs: Date.now() })\n }\n const failed = (value: string, cause: unknown) => new Failed({ path: value, cause })\n const overrides: FilesImpl = {\n stat: (value) => {\n const node = lookup(value)\n return node ? Effect.succeed(info(node)) : Effect.fail(new NotFound({ path: value }))\n },\n read: (value, range) => {\n const original = lookup(value)\n if (!original) return Effect.fail(new NotFound({ path: value }))\n if (original.type === \"directory\") return Effect.fail(new WrongKind({ path: value, actual: \"directory\" }))\n const resolved = resolveKey(value, true)\n const node = resolved === undefined ? undefined : nodes.get(resolved)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"file\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const bytes = range === undefined ? node.bytes : node.bytes.subarray(range.offset, range.offset + range.length)\n return Effect.succeed({ info: info(node), bytes: bytes.slice() })\n },\n write: (value, bytes) =>\n Effect.try({\n try: () => {\n mkdirSync(path.posix.dirname(key(value)))\n const existing = lookup(value)\n if (existing?.type === \"directory\") throw new Error(`Path is a directory: ${value}`)\n const target = existing?.type === \"symlink\" ? resolveKey(value, true) : resolveKey(value, false)\n if (!target) throw new Error(`Cannot resolve symlink: ${value}`)\n requireParent(target)\n nodes.set(target, { type: \"file\", bytes: bytes.slice(), mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n list: (value) => {\n const target = resolveKey(value, true) ?? key(value)\n const node = nodes.get(target)\n if (!node) return Effect.fail(new NotFound({ path: value }))\n if (node.type !== \"directory\") return Effect.fail(new WrongKind({ path: value, actual: node.type }))\n const entries = [...nodes.entries()]\n .filter(([entry]) => entry !== target && path.posix.dirname(entry) === target)\n .map(([entry, child]) => ({ name: path.posix.basename(entry), type: child.type satisfies FileType }))\n .sort((a, b) => a.name.localeCompare(b.name))\n return Effect.succeed(entries)\n },\n remove: (value) =>\n Effect.sync(() => {\n const target = resolveKey(value, false) ?? key(value)\n for (const entry of nodes.keys()) {\n if (entry === target || entry.startsWith(`${target}/`)) nodes.delete(entry)\n }\n }),\n move: (from, to) => {\n const source = resolveKey(from, false) ?? key(from)\n const node = nodes.get(source)\n if (!node) return Effect.fail(new NotFound({ path: from }))\n return Effect.try({\n try: () => {\n const requested = resolveKey(to, false) ?? key(to)\n const destination =\n nodes.get(requested)?.type === \"directory\"\n ? path.posix.join(requested, path.posix.basename(source))\n : requested\n if (node.type === \"directory\" && destination.startsWith(`${source}/`)) {\n throw new Error(`Cannot move a directory into itself: ${from}`)\n }\n const existing = nodes.get(destination)\n if (node.type === \"directory\" && existing && existing.type !== \"directory\") {\n throw new Error(`Cannot overwrite a non-directory with a directory: ${to}`)\n }\n requireParent(destination)\n const moved = [...nodes.entries()].filter(([entry]) => entry === source || entry.startsWith(`${source}/`))\n for (const [entry] of moved) nodes.delete(entry)\n for (const [entry, child] of moved) nodes.set(`${destination}${entry.slice(source.length)}`, child)\n },\n catch: (cause) => failed(from, cause),\n })\n },\n mkdir: (value) => Effect.try({ try: () => mkdirSync(value), catch: (cause) => failed(value, cause) }),\n }\n\n const spawner = make((command) =>\n Effect.suspend(() => {\n const description = command._tag === \"StandardCommand\" ? command.command : \"pipeline\"\n return Effect.fail(\n PlatformError.systemError({\n _tag: \"Unknown\",\n module: \"EnvironmentMemory\",\n method: \"spawn\",\n pathOrDescriptor: description,\n cause: failed(description, new Error(\"The memory driver cannot spawn processes\")),\n }),\n )\n }),\n )\n\n return {\n spawner,\n overrides,\n symlink: (target, value) =>\n Effect.try({\n try: () => {\n requireParent(value)\n nodes.set(resolveKey(value, false) ?? key(value), { type: \"symlink\", target, mtimeMs: Date.now() })\n },\n catch: (cause) => failed(value, cause),\n }),\n }\n}\n\nexport * as EnvironmentMemory from \"./memory.js\"\n", | ||
| "import { CrossSpawnSpawner } from \"@opencode-ai/util/cross-spawn-spawner\"\nimport { makeLocationNode } from \"@opencode-ai/util/effect/app-node\"\nimport { Context, Effect, Layer } from \"effect\"\nimport { ChildProcessSpawner } from \"effect/unstable/process/ChildProcessSpawner\"\nimport type { Files } from \"./files.js\"\nimport { makeFiles } from \"./index.js\"\nimport { makeLocalDriver } from \"./local.js\"\nimport { Location } from \"../location.js\"\nimport { Workspace } from \"../workspace.js\"\n\nexport interface Interface {\n readonly files: Files\n readonly spawner: ChildProcessSpawner[\"Service\"]\n}\n\nexport class Service extends Context.Service<Service, Interface>()(\"@opencode/Environment\") {}\n\nconst layer = Layer.effect(\n Service,\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner\n const location = yield* Location.Service\n const workspace = yield* Workspace.Service\n const driver = location.workspaceID\n ? yield* workspace.connect(location.workspaceID).pipe(\n // Environment has no error channel; an unknown or destroyed placement is a configuration defect by design.\n Effect.mapError(\n (cause) => new Error(`Failed to bind Environment to workspace ${location.workspaceID}`, { cause }),\n ),\n Effect.orDie,\n )\n : makeLocalDriver(spawner)\n return Service.of({ files: makeFiles(driver), spawner: driver.spawner })\n }),\n)\n\nexport const node = makeLocationNode({\n service: Service,\n layer,\n deps: [CrossSpawnSpawner.node, Location.node, Workspace.node],\n})\n\nexport * as EnvironmentService from \"./environment.js\"\n", | ||
| "export * as Environment from \"./index.js\"\n\nexport { type Driver } from \"./driver.js\"\nexport {\n type DirEntry,\n Failed,\n type FileInfo,\n type Files,\n type FilesImpl,\n type FileType,\n NotFound,\n typeFollowing,\n WrongKind,\n} from \"./files.js\"\nexport { execDefaults } from \"./exec-defaults.js\"\nexport { makeLocalDriver } from \"./local.js\"\nexport { makeMemoryDriver, type MemoryDriver } from \"./memory.js\"\nexport { type Interface, node, Service } from \"./environment.js\"\n\nimport type { Driver } from \"./driver.js\"\nimport { execDefaults } from \"./exec-defaults.js\"\nimport type { Files } from \"./files.js\"\n\nexport const makeFiles = (driver: Driver): Files => ({\n ...execDefaults(driver.spawner),\n ...driver.overrides,\n})\n" | ||
| ], | ||
| "mappings": ";w0BAaO,IAAM,GAAU,EAAO,OAAO,EAAO,OAAQ,EAAO,IAAI,EAGxD,MAAM,WAAc,EAAO,YAAmB,EAAE,wBAAyB,CAC9E,QAAS,EAAO,SAAS,EAAO,MAAM,EACtC,MAAO,EAAO,SAAS,EAAO,OAAO,CAAC,CACxC,CAAC,CAAE,CAAC,CAEG,MAAM,WAAyB,EAAO,YAA8B,EAAE,mCAAoC,CAC/G,SAAU,EAAO,MACnB,CAAC,CAAE,CAAC,CAsBG,IAAM,GAAO,CAAC,IAAsB,EAMpC,MAAM,UAAwB,EAAQ,QAAmC,EAC9E,mCACF,CAAE,CAAC,CAEI,IAAM,GAAW,CAAC,KAA4D,CACnF,IAAK,CAAC,IAAa,CACjB,IAAM,EAAS,OAAO,OAAO,EAAS,CAAQ,EAAI,EAAQ,GAAY,OACtE,OAAO,EAAS,EAAO,QAAQ,CAAM,EAAI,EAAO,KAAK,IAAI,GAAiB,CAAE,UAAS,CAAC,CAAC,EAE3F,GAEa,GAAe,CAAC,IAC3B,EAAe,CACb,QAAS,EACT,MAAO,EAAM,QAAQ,EAAiB,EAAgB,GAAG,GAAS,CAAO,CAAC,CAAC,EAC3E,KAAM,CAAC,CACT,CAAC,EAEU,GAAO,GAAa,CAAC,CAAC,ECjE5B,IAAM,EAAiB,GAAY,YAAa,CACrD,GAAI,EAAK,EAAE,MAAoB,EAAE,WAAW,EAC5C,SAAU,EAAK,EAAE,QAAQ,EACzB,QAAS,EAAK,CAAE,KAAM,MAAO,CAAC,EAAE,MAA+B,EAAE,QAAQ,EACzE,WAAY,GAAQ,EAAE,QAAQ,EAC9B,aAAc,GAAQ,EAAE,QAAQ,CAClC,CAAC,ECIM,IAAM,EAAK,GAAU,GAGrB,MAAM,WAAa,EAAO,MAAY,gBAAgB,EAAE,CAC7D,GAAI,EACJ,SAAU,EAAO,OACjB,QAAS,EAAgB,QACzB,UAAW,EAAO,OAClB,WAAY,EAAO,MACrB,CAAC,CAAE,CAAC,CAEG,MAAM,WAAiB,EAAO,YAAsB,EAAE,qBAAsB,CAAE,YAAa,CAAG,CAAC,CAAE,CAAC,CAiBlG,MAAM,UAAgB,EAAQ,QAA4B,EAAE,qBAAqB,CAAE,CAAC,CAWpF,IAAM,GAAa,CAAC,EAAmB,CAAC,IAC7C,EAAe,CACb,QAAS,EACT,MAAO,GAAM,CAAO,EACpB,KAAM,CAAC,GAAS,KAAM,EAAgB,IAAI,CAC5C,CAAC,EAEG,GAAQ,CAAC,IACb,EAAM,OACJ,EACA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,GAAM,MAAO,GAAS,SAAS,GAC/B,EAAW,MAAO,EAAgB,gBAClC,EAAW,MAAO,EAAM,MACxB,EAAc,IAAI,IAClB,EAAQ,GAAW,WAAe,EAClC,EAAgB,EAAS,SAAS,EAAQ,eAAiB,EAAS,QAAQ,EAAE,CAAC,EAE/E,EAAO,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAiB,CACnE,IAAM,EAAM,MAAO,EAChB,OAAO,EACP,KAAK,CAAc,EACnB,MAAM,EAAG,EAAe,GAAI,CAAW,CAAC,EACxC,IAAI,EACJ,KAAK,EAAO,KAAK,EACpB,GAAI,CAAC,EAAK,OAAO,MAAO,IAAI,GAAS,CAAE,aAAY,CAAC,EACpD,OAAO,EACR,EAEK,EAAO,EAAO,GAAG,gBAAgB,EAAE,SAAU,CAAC,EAAiB,CACnE,IAAM,EAAW,EAAY,IAAI,CAAW,EAC5C,GAAI,EAAU,OAAO,EAErB,IAAM,EAAM,MAAO,EAAK,CAAW,EAC7B,EAAS,MAAO,EAAS,IAAI,EAAI,QAAQ,EACzC,EAAc,CAAC,IACnB,EACG,OAAO,CAAc,EACrB,IAAI,CAAE,QAAS,CAAM,CAAC,EACtB,MAAM,EAAG,EAAe,GAAI,CAAW,CAAC,EACxC,IAAI,EACJ,KAAK,EAAO,KAAK,EAChB,EAAQ,MAAO,EAAM,KAAK,CAAQ,EAClC,EAAc,MAAO,EAAO,QAAQ,CAAE,cAAa,QAAS,EAAI,QAAS,aAAY,CAAC,EAAE,KAC5F,EAAO,eAAe,EAAM,MAAO,CAAK,EACxC,EAAO,QAAQ,CAAC,IAAU,EAAM,MAAM,EAAO,EAAK,UAAU,CAAK,CAAC,CAAC,CACrE,EACM,EAAM,MAAO,EAAM,kBACnB,EAAyB,CAC7B,SACA,cACA,cACA,aAAc,MAAO,EAAI,KAAK,CAAG,EACjC,OAAQ,MAAO,EAAI,KAAK,CAAC,EACzB,OACF,EAQA,OAPA,EAAY,IAAI,EAAa,CAAU,EACvC,MAAO,EACJ,OAAO,CAAc,EACrB,IAAI,CAAE,aAAc,CAAI,CAAC,EACzB,MAAM,EAAG,EAAe,GAAI,CAAW,CAAC,EACxC,IAAI,EACJ,KAAK,EAAO,KAAK,EACb,EACR,EAkCD,OAhCA,MAAO,EAAO,IAAI,SAAU,EAAG,CAC7B,IAAM,EAAM,MAAO,EAAM,kBACzB,MAAO,EAAO,QACZ,CAAC,GAAG,EAAY,QAAQ,CAAC,EACzB,EAAE,EAAa,KACb,EAAM,SAAS,CAAW,EACxB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAa,EAAY,IAAI,CAAW,EAC9C,GAAI,IAAe,IAAa,MAAO,EAAI,IAAI,EAAW,MAAM,GAAK,EAAG,OACxE,IAAM,EAAe,MAAO,EAAI,IAAI,EAAW,YAAY,EAC3D,GAAI,EAAM,EAAe,EAAe,OACxC,IAAM,EAAM,MAAO,EAAK,CAAW,EAEnC,MAAO,EAAW,OAAO,eAAe,CACtC,cACA,QAAS,EAAI,QACb,YAAa,EAAW,WAC1B,CAAC,EACD,MAAO,EACJ,OAAO,CAAc,EACrB,IAAI,CAAE,aAAc,CAAa,CAAC,EAClC,MAAM,EAAG,EAAe,GAAI,CAAW,CAAC,EACxC,IAAI,EACJ,KAAK,EAAO,KAAK,EACpB,EAAY,OAAO,CAAW,EAC9B,MAAO,EAAM,MAAM,EAAW,MAAO,EAAK,IAAI,EAC/C,EAAE,KAAK,EAAO,WAAW,CAAC,IAAU,EAAO,SAAS,mCAAoC,CAAK,CAAC,CAAC,CAClG,EACF,CAAE,YAAa,YAAa,QAAS,EAAK,CAC5C,EACD,EAAE,KAAK,EAAO,OAAO,GAAS,OAAO,EAAQ,cAAgB,EAAS,QAAQ,CAAC,CAAC,CAAC,EAAG,EAAO,UAAU,EAE/F,EAAQ,GAAG,CAChB,OAAQ,EAAO,GAAG,kBAAkB,EAAE,SAAU,CAAC,EAAU,CACzD,IAAM,EAAS,MAAO,EAAS,IAAI,CAAQ,EACrC,EAAc,EAAG,OAAO,EACxB,EAAS,MAAO,EAAO,OAAO,CAAE,aAAY,CAAC,EAC7C,EAAM,MAAO,EAAM,kBAMzB,OALA,MAAO,EACJ,OAAO,CAAc,EACrB,OAAO,CAAE,GAAI,EAAa,WAAU,QAAS,EAAO,QAAS,WAAY,EAAK,aAAc,CAAI,CAAC,EACjG,IAAI,EACJ,KAAK,EAAO,KAAK,EACb,IAAI,GAAK,CAAE,GAAI,EAAa,WAAU,QAAS,EAAO,QAAS,UAAW,EAAK,WAAY,CAAI,CAAC,EACxG,EACD,QAAS,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAa,CA+B9D,MAAO,CAAE,QA9BO,EAAK,CAAC,IACpB,EAAO,eACL,EAAM,SAAS,CAAW,EACxB,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAa,MAAO,EAAK,CAAW,EAAE,KAC1C,EAAO,SAAS,CAAC,IACf,GAAY,CACV,KAAM,UACN,OAAQ,YACR,OAAQ,QACR,YAAa,4BAA4B,IACzC,OACF,CAAC,CACH,CACF,EAGA,OAFA,MAAO,EAAI,IAAI,EAAW,aAAc,MAAO,EAAM,iBAAiB,EACtE,MAAO,EAAI,OAAO,EAAW,OAAQ,CAAC,IAAW,EAAS,CAAC,EACpD,EACR,CACH,EACA,CAAC,IACC,EAAM,SAAS,CAAW,EACxB,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAI,OAAO,EAAW,OAAQ,CAAC,IAAW,EAAS,CAAC,EAC3D,MAAO,EAAI,IAAI,EAAW,aAAc,MAAO,EAAM,iBAAiB,EACvE,CACH,CACJ,EAAE,KAAK,EAAO,QAAQ,CAAC,IAAe,EAAW,YAAY,QAAQ,MAAM,CAAO,CAAC,CAAC,CACtF,CAEiB,EAClB,EACD,QAAS,EAAO,GAAG,mBAAmB,EAAE,SAAU,CAAC,EAAa,CAC9D,MAAO,EAAM,SAAS,CAAW,EAC/B,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAM,MAAO,EAAK,CAAW,EAC7B,EAAa,EAAY,IAAI,CAAW,EAE9C,GADA,EAAY,OAAO,CAAW,EAC1B,EAAY,MAAO,EAAM,MAAM,EAAW,MAAO,EAAK,IAAI,EAE9D,OADe,MAAO,EAAS,IAAI,EAAI,QAAQ,GACjC,QAAQ,CAAE,cAAa,QAAS,EAAI,OAAQ,CAAC,EAC3D,MAAO,EAAG,OAAO,CAAc,EAAE,MAAM,EAAG,EAAe,GAAI,CAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAO,KAAK,EACnG,CACH,EACD,CACH,CAAC,EACF,CACH,EAEW,GAAO,GAAW,oNCpNxB,IAAM,GAAW,EAAO,SAAS,CAAC,OAAQ,YAAa,UAAW,OAAO,CAAC,EAc1E,MAAM,UAAiB,EAAO,YAAsB,EAAE,uBAAwB,CACnF,KAAM,EAAO,MACf,CAAC,CAAE,CAAC,CAEG,MAAM,UAAkB,EAAO,YAAuB,EAAE,wBAAyB,CACtF,KAAM,EAAO,OACb,OAAQ,EACV,CAAC,CAAE,CAAC,CAEG,MAAM,UAAe,EAAO,YAAoB,EAAE,qBAAsB,CAC7E,KAAM,EAAO,OACb,MAAO,EAAO,OAAO,CACvB,CAAC,CAAE,CAAC,CA6BG,IAAM,GAAgB,CAAC,EAAc,IAC1C,EAAM,KAAK,CAAI,EAAE,KACf,EAAO,QAAQ,CAAC,IACd,EAAK,OAAS,UACV,EAAM,KAAK,EAAM,CAAE,OAAQ,EAAG,OAAQ,CAAE,CAAC,EAAE,KACzC,EAAO,IAAI,CAAC,IAAW,EAAO,KAAK,IAAI,EACvC,EAAO,SAAS,wBAAyB,CAAC,IAAU,EAAO,QAAQ,EAAM,MAAM,CAAC,CAClF,EACA,EAAO,QAAQ,EAAK,IAAI,CAC9B,CACF,ECpDF,IAAM,GAAiB,SACjB,GAAkB,MAClB,GAAY,GACZ,GAAa,GACb,GAAS,GACT,EAAM,KAEN,EAAe,CAAC,EAAQ,KAAO;AAAA,kBACnB,WAAe,MAAQ;AAAA;AAAA,8DAEqB;AAAA,2CACnB;AAAA;AAAA;AAAA,EAKrC,GAAa;AAAA,EACjB,EAAa;AAAA;AAAA;AAAA,EAIT,GAAa;AAAA,EACjB,EAAa,IAAI;AAAA,oBACC;AAAA;AAAA;AAAA,SAGX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUH,GAAa;AAAA,EACjB,EAAa,IAAI;AAAA,oBACC;AAAA;AAAA;AAAA,SAGX;AAAA;AAAA;AAAA,EAKH,GAAa;AAAA,EACjB,EAAa;AAAA;AAAA,EAUF,EAAe,CAAC,IAAuD,CAClF,IAAM,EAAM,CACV,EACA,EACA,EAA8B,CAAC,EAC/B,IAEA,EAAO,OACL,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAU,GAAa,KAAK,KAAM,CAAC,KAAM,EAAQ,KAAM,EAAM,GAAG,CAAI,EAAG,CAC3E,IAAK,CAAE,OAAQ,GAAI,EACnB,UAAW,GACX,MAAO,IAAU,OAAY,OAAY,GAAO,KAAK,CAAK,CAC5D,CAAC,EACK,EAAS,MAAO,EAAQ,MAAM,CAAO,EAAE,KAAK,EAAO,SAAS,CAAC,IAAU,IAAI,EAAO,CAAE,OAAM,OAAM,CAAC,CAAC,CAAC,GAClG,EAAQ,EAAQ,GAAY,MAAO,EAAO,IAC/C,CACE,GAAc,EAAO,OAAQ,EAAc,EAC3C,GAAc,EAAO,OAAQ,EAAe,EAC5C,EAAO,QACT,EACA,CAAE,YAAa,WAAY,CAC7B,EAAE,KAAK,EAAO,SAAS,CAAC,IAAU,IAAI,EAAO,CAAE,OAAM,OAAM,CAAC,CAAC,CAAC,EAC9D,GAAI,EAAO,WAAa,EAAO,UAC7B,OAAO,MAAO,IAAI,EAAO,CAAE,OAAM,MAAW,MAAM,8CAA8C,CAAE,CAAC,EAErG,MAAO,CAAE,WAAU,OAAQ,EAAO,OAAQ,OAAQ,EAAO,MAAO,EACjE,CACH,EAEI,EAAW,CACf,EACA,EACA,IACoD,CACpD,GAAI,EAAO,WAAa,EAAG,OAAO,EAAO,KAAK,IAAM,EAAQ,EAAO,MAAM,CAAC,EAC1E,GAAI,EAAO,WAAa,GAAW,OAAO,EAAO,KAAK,IAAI,EAAS,CAAE,MAAK,CAAC,CAAC,EAC5E,GAAI,EAAO,WAAa,GACtB,OAAO,EAAO,KAAK,IAAI,EAAU,CAAE,OAAM,OAAQ,GAAU,IAAI,YAAY,EAAE,OAAO,EAAO,MAAM,CAAC,CAAE,CAAC,CAAC,EAExG,OAAO,EAAO,KAAK,GAAe,EAAM,CAAM,CAAC,GAG3C,EAAW,CAAC,EAAc,IAC9B,EAAO,WAAa,EAAI,EAAO,KAAO,EAAO,KAAK,GAAe,EAAM,CAAM,CAAC,EAEhF,MAAO,CACL,KAAM,CAAC,IAAS,EAAI,EAAM,EAAU,EAAE,KAAK,EAAO,QAAQ,CAAC,IAAW,GAAc,EAAM,EAAQ,EAAS,CAAC,CAAC,EAC7G,KAAM,CAAC,EAAM,IACX,EACE,EACA,GACA,IAAU,OAAY,CAAC,OAAO,EAAI,CAAC,QAAS,OAAO,EAAM,MAAM,EAAG,OAAO,EAAM,MAAM,CAAC,CACxF,EAAE,KACA,EAAO,QAAQ,CAAC,IACd,EAAS,EAAM,EAAQ,CAAC,IAAW,CACjC,IAAM,EAAU,EAAO,QAAQ,EAAE,EACjC,GAAI,EAAU,EAAG,MAAU,MAAM,8BAA8B,EAC/D,MAAO,CACL,KAAM,GAAU,EAAO,MAAM,EAAG,CAAO,CAAC,EACxC,MAAO,EAAO,MAAM,EAAU,CAAC,CACjC,EACD,CACH,CACF,EACF,MAAO,CAAC,EAAM,IACZ,EAAI,EAAM,2CAA4C,CAAC,EAAG,CAAK,EAAE,KAC/D,EAAO,QAAQ,CAAC,IAAW,EAAS,EAAM,CAAM,CAAC,CACnD,EACF,KAAM,CAAC,IAAS,EAAI,EAAM,EAAU,EAAE,KAAK,EAAO,QAAQ,CAAC,IAAW,EAAS,EAAM,EAAQ,EAAS,CAAC,CAAC,EACxG,OAAQ,CAAC,IAAS,EAAI,EAAM,gBAAgB,EAAE,KAAK,EAAO,QAAQ,CAAC,IAAW,EAAS,EAAM,CAAM,CAAC,CAAC,EACrG,KAAM,CAAC,EAAM,IACX,EAAI,EAAM,GAAY,CAAC,CAAE,CAAC,EAAE,KAAK,EAAO,QAAQ,CAAC,IAAW,GAAc,EAAM,EAAQ,IAAG,CAAG,OAAS,CAAC,CAAC,EAC3G,MAAO,CAAC,IAAS,EAAI,EAAM,kBAAkB,EAAE,KAAK,EAAO,QAAQ,CAAC,IAAW,EAAS,EAAM,CAAM,CAAC,CAAC,CACxG,GAII,GAAgB,CACpB,EACA,EACA,IACwC,CACxC,GAAI,EAAO,WAAa,EAAG,OAAO,EAAO,KAAK,IAAM,EAAQ,EAAO,MAAM,CAAC,EAC1E,GAAI,EAAO,WAAa,GAAW,OAAO,EAAO,KAAK,IAAI,EAAS,CAAE,MAAK,CAAC,CAAC,EAC5E,OAAO,EAAO,KAAK,GAAe,EAAM,CAAM,CAAC,GAG3C,GAAiB,CAAC,EAAc,IACpC,IAAI,EAAO,CACT,OACA,MAAW,MAAM,IAAI,YAAY,EAAE,OAAO,EAAO,MAAM,EAAE,KAAK,GAAK,4BAA4B,EAAO,UAAU,CAClH,CAAC,EAEG,GAAY,CAAC,IAAgC,CACjD,IAAO,EAAS,EAAS,GAAY,IAAI,YAAY,EAAE,OAAO,CAAK,EAAE,KAAK,EAAE,MAAM,CAAG,EAC/E,EAAO,OAAO,CAAO,EACrB,EAAU,OAAO,CAAQ,EAAI,KACnC,GAAI,CAAC,GAAW,CAAC,OAAO,SAAS,CAAI,GAAK,CAAC,OAAO,SAAS,CAAO,EAAG,MAAU,MAAM,qBAAqB,EAC1G,MAAO,CAAE,KAAM,GAAU,CAAO,EAAG,OAAM,SAAQ,GAG7C,GAAY,CAAC,IAA4B,CAC7C,GAAI,IAAU,gBAAkB,IAAU,sBAAwB,IAAU,IAAK,MAAO,OACxF,GAAI,IAAU,aAAe,IAAU,IAAK,MAAO,YACnD,GAAI,IAAU,iBAAmB,IAAU,IAAK,MAAO,UACvD,MAAO,SAGH,GAAY,CAAC,IAAsB,CACvC,IAAM,EAAS,IAAI,YAAY,EAAE,OAAO,CAAK,EAAE,MAAM,MAAI,EAEzD,GADA,EAAO,IAAI,EACP,EAAO,OAAS,IAAM,EAAG,MAAU,MAAM,qBAAqB,EAClE,OAAO,MAAM,KAAK,CAAE,OAAQ,EAAO,OAAS,CAAE,EAAG,CAAC,EAAG,KAAW,CAC9D,KAAM,EAAO,EAAQ,EAAI,GACzB,KAAM,GAAU,EAAO,EAAQ,EAAE,CACnC,EAAE,GC5LJ,2BACA,qBAeO,IAAM,EAAkB,CAAC,KAuDvB,CAAE,UAAS,UAtDW,CAC3B,KAAM,CAAC,EAAO,IACZ,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAO,MAAO,EAAK,EAAO,EAAI,EACpC,GAAI,EAAK,OAAS,OAAQ,OAAO,MAAO,IAAI,EAAU,CAAE,KAAM,EAAO,OAAQ,EAAK,IAAK,CAAC,EACxF,GAAI,IAAU,OAAW,CACvB,IAAM,EAAQ,MAAO,EAAQ,EAAO,IAAM,EAAG,SAAS,CAAK,EAAG,EAAI,EAClE,MAAO,CAAE,OAAM,OAAM,EAEvB,IAAM,EAAQ,MAAO,EACnB,EACA,SAAY,CACV,IAAM,EAAS,MAAM,EAAG,KAAK,EAAO,GAAG,EACvC,GAAI,CACF,IAAM,EAAS,IAAI,WAAW,EAAM,MAAM,EACpC,EAAS,MAAM,EAAO,KAAK,EAAQ,EAAG,EAAM,OAAQ,EAAM,MAAM,EACtE,OAAO,EAAO,SAAS,EAAG,EAAO,SAAS,SAC1C,CACA,MAAM,EAAO,MAAM,IAGvB,EACF,EACA,MAAO,CAAE,OAAM,OAAM,EACtB,EACH,KAAM,CAAC,IAAU,EAAK,EAAO,EAAK,EAClC,KAAM,CAAC,IACL,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAO,MAAO,EAAK,EAAO,EAAI,EACpC,GAAI,EAAK,OAAS,YAAa,OAAO,MAAO,IAAI,EAAU,CAAE,KAAM,EAAO,OAAQ,EAAK,IAAK,CAAC,EAE7F,OADgB,MAAO,EAAQ,EAAO,IAAM,EAAG,QAAQ,EAAO,CAAE,cAAe,EAAK,CAAC,EAAG,EAAI,GAC7E,IAAI,CAAC,KAAW,CAAE,KAAM,EAAM,KAAM,KAAM,GAAS,CAAK,CAAE,EAAE,EAC5E,EACH,MAAO,CAAC,EAAO,IACb,EAAQ,EAAO,SAAY,CACzB,MAAM,EAAG,MAAM,GAAK,QAAQ,CAAK,EAAG,CAAE,UAAW,EAAK,CAAC,EACvD,MAAM,EAAG,UAAU,EAAO,CAAK,EAChC,EACH,OAAQ,CAAC,IAAU,EAAQ,EAAO,IAAM,EAAG,GAAG,EAAO,CAAE,UAAW,GAAM,MAAO,EAAK,CAAC,CAAC,EACtF,KAAM,CAAC,EAAM,IACX,EAAO,IAAI,SAAU,EAAG,CACtB,MAAO,EAAK,EAAM,EAAK,EACvB,IAAM,EAAc,MAAO,EAAK,EAAI,EAAK,EAAE,KACzC,EAAO,IAAI,CAAC,IAAU,EAAK,OAAS,YAAc,GAAK,KAAK,EAAI,GAAK,SAAS,CAAI,CAAC,EAAI,CAAG,EAC1F,EAAO,QACL,CAAC,IAAU,aAAiB,EAC5B,IAAM,EAAO,QAAQ,CAAE,CACzB,CACF,EACA,MAAO,EAAQ,EAAM,IAAM,EAAG,OAAO,EAAM,CAAW,CAAC,EACxD,EACH,MAAO,CAAC,IAAU,EAAQ,EAAO,IAAM,EAAG,MAAM,EAAO,CAAE,UAAW,EAAK,CAAC,EAAE,KAAK,IAAG,CAAG,OAAS,CAAC,CACnG,CAE4B,GAGxB,EAAO,CAAC,EAAe,IAC3B,EAAQ,EAAO,IAAO,EAAS,EAAG,KAAK,CAAK,EAAI,EAAG,MAAM,CAAK,EAAI,EAAI,EAAE,KACtE,EAAO,IAAI,CAAC,KAAqB,CAAE,KAAM,GAAS,CAAK,EAAG,KAAM,EAAM,KAAM,QAAS,EAAM,OAAQ,EAAE,CACvG,EAEI,GAAW,CAAC,IAA8F,CAC9G,GAAI,EAAM,OAAO,EAAG,MAAO,OAC3B,GAAI,EAAM,YAAY,EAAG,MAAO,YAChC,GAAI,EAAM,eAAe,EAAG,MAAO,UACnC,MAAO,SAKT,SAAS,CAAU,CAAC,EAAe,EAAuB,EAAU,GAAO,CACzE,OAAO,EAAO,WAAW,CACvB,IAAK,EACL,MAAO,CAAC,IACN,GAAW,GAAU,CAAK,EAAI,IAAI,EAAS,CAAE,KAAM,CAAM,CAAC,EAAI,IAAI,EAAO,CAAE,KAAM,EAAO,OAAM,CAAC,CACnG,CAAC,EAGH,IAAM,GAAY,CAAC,IACjB,IAAU,MACV,OAAO,IAAU,WACjB,SAAU,KACT,EAAM,OAAS,UAAY,EAAM,OAAS,WCpG7C,oBAeO,IAAM,GAAmB,IAAoB,CAClD,IAAM,EAAQ,IAAI,IAAkB,CAAC,CAAC,IAAK,CAAE,KAAM,YAAa,QAAS,KAAK,IAAI,CAAE,CAAC,CAAC,CAAC,EACjF,EAAM,CAAC,IAAkB,EAAK,MAAM,QAAQ,IAAK,CAAK,EACtD,EAAO,CAAC,KAA0B,CACtC,KAAM,EAAK,KACX,KACE,EAAK,OAAS,OACV,EAAK,MAAM,OACX,EAAK,OAAS,UACZ,IAAI,YAAY,EAAE,OAAO,EAAK,MAAM,EAAE,OACtC,EACR,QAAS,EAAK,OAChB,GACM,EAAa,CAAC,EAAe,EAAsB,EAAO,IAAI,MAAsC,CAExG,IAAM,EADa,EAAI,CAAK,EACH,MAAM,GAAG,EAAE,OAAO,OAAO,EAC5C,EAAO,IACP,EAAO,CAAC,EAAiB,IAAsC,CACnE,GAAI,IAAU,EAAM,OAAQ,OAAO,EACnC,IAAM,EAAO,EAAM,GACb,EAAY,EAAK,MAAM,KAAK,EAAS,CAAI,EACzC,GAAO,EAAM,IAAI,CAAS,EAChC,GAAI,IAAM,OAAS,WAAc,CAAC,GAAe,IAAU,EAAM,OAAS,EAAI,OAAO,EAAK,EAAW,EAAQ,CAAC,EAC9G,GAAI,EAAK,IAAI,CAAS,EAAG,OACzB,EAAK,IAAI,CAAS,EAClB,IAAM,GAAS,EAAK,MAAM,QAAQ,EAAK,MAAM,QAAQ,CAAS,EAAG,GAAK,MAAM,EAC5E,OAAO,EAAW,EAAK,MAAM,KAAK,GAAQ,GAAG,EAAM,MAAM,EAAQ,CAAC,CAAC,EAAG,EAAa,CAAI,GAEzF,OAAO,EAZM,IAYK,CAAC,GAEf,EAAS,CAAC,IAAkB,EAAM,IAAI,EAAW,EAAO,EAAK,GAAK,EAAI,CAAK,CAAC,EAC5E,EAAgB,CAAC,IAAkB,CACvC,IAAM,EAAa,EAAK,MAAM,QAAQ,EAAI,CAAK,CAAC,EAC1C,EAAS,EAAM,IAAI,EAAW,EAAY,EAAI,GAAK,CAAU,EACnE,GAAI,CAAC,EAAQ,MAAU,MAAM,oCAAoC,EAAK,MAAM,QAAQ,CAAK,GAAG,EAC5F,GAAI,EAAO,OAAS,YAAa,MAAU,MAAM,8BAA8B,EAAK,MAAM,QAAQ,CAAK,GAAG,GAEtG,EAAY,CAAC,IAAkB,CACnC,IAAM,EAAS,EAAW,EAAO,EAAK,GAAK,EAAI,CAAK,EAC9C,EAAW,EAAM,IAAI,CAAM,EACjC,GAAI,GAAU,OAAS,YAAa,OACpC,GAAI,EAAU,MAAU,MAAM,4BAA4B,GAAO,EACjE,IAAM,EAAS,EAAK,MAAM,QAAQ,CAAM,EACxC,GAAI,IAAW,EAAQ,EAAU,CAAM,EACvC,EAAM,IAAI,EAAQ,CAAE,KAAM,YAAa,QAAS,KAAK,IAAI,CAAE,CAAC,GAExD,EAAS,CAAC,EAAe,IAAmB,IAAI,EAAO,CAAE,KAAM,EAAO,OAAM,CAAC,EAC7E,EAAuB,CAC3B,KAAM,CAAC,IAAU,CACf,IAAM,EAAO,EAAO,CAAK,EACzB,OAAO,EAAO,EAAO,QAAQ,EAAK,CAAI,CAAC,EAAI,EAAO,KAAK,IAAI,EAAS,CAAE,KAAM,CAAM,CAAC,CAAC,GAEtF,KAAM,CAAC,EAAO,IAAU,CACtB,IAAM,EAAW,EAAO,CAAK,EAC7B,GAAI,CAAC,EAAU,OAAO,EAAO,KAAK,IAAI,EAAS,CAAE,KAAM,CAAM,CAAC,CAAC,EAC/D,GAAI,EAAS,OAAS,YAAa,OAAO,EAAO,KAAK,IAAI,EAAU,CAAE,KAAM,EAAO,OAAQ,WAAY,CAAC,CAAC,EACzG,IAAM,EAAW,EAAW,EAAO,EAAI,EACjC,EAAO,IAAa,OAAY,OAAY,EAAM,IAAI,CAAQ,EACpE,GAAI,CAAC,EAAM,OAAO,EAAO,KAAK,IAAI,EAAS,CAAE,KAAM,CAAM,CAAC,CAAC,EAC3D,GAAI,EAAK,OAAS,OAAQ,OAAO,EAAO,KAAK,IAAI,EAAU,CAAE,KAAM,EAAO,OAAQ,EAAK,IAAK,CAAC,CAAC,EAC9F,IAAM,EAAQ,IAAU,OAAY,EAAK,MAAQ,EAAK,MAAM,SAAS,EAAM,OAAQ,EAAM,OAAS,EAAM,MAAM,EAC9G,OAAO,EAAO,QAAQ,CAAE,KAAM,EAAK,CAAI,EAAG,MAAO,EAAM,MAAM,CAAE,CAAC,GAElE,MAAO,CAAC,EAAO,IACb,EAAO,IAAI,CACT,IAAK,IAAM,CACT,EAAU,EAAK,MAAM,QAAQ,EAAI,CAAK,CAAC,CAAC,EACxC,IAAM,EAAW,EAAO,CAAK,EAC7B,GAAI,GAAU,OAAS,YAAa,MAAU,MAAM,wBAAwB,GAAO,EACnF,IAAM,EAAS,GAAU,OAAS,UAAY,EAAW,EAAO,EAAI,EAAI,EAAW,EAAO,EAAK,EAC/F,GAAI,CAAC,EAAQ,MAAU,MAAM,2BAA2B,GAAO,EAC/D,EAAc,CAAM,EACpB,EAAM,IAAI,EAAQ,CAAE,KAAM,OAAQ,MAAO,EAAM,MAAM,EAAG,QAAS,KAAK,IAAI,CAAE,CAAC,GAE/E,MAAO,CAAC,IAAU,EAAO,EAAO,CAAK,CACvC,CAAC,EACH,KAAM,CAAC,IAAU,CACf,IAAM,EAAS,EAAW,EAAO,EAAI,GAAK,EAAI,CAAK,EAC7C,EAAO,EAAM,IAAI,CAAM,EAC7B,GAAI,CAAC,EAAM,OAAO,EAAO,KAAK,IAAI,EAAS,CAAE,KAAM,CAAM,CAAC,CAAC,EAC3D,GAAI,EAAK,OAAS,YAAa,OAAO,EAAO,KAAK,IAAI,EAAU,CAAE,KAAM,EAAO,OAAQ,EAAK,IAAK,CAAC,CAAC,EACnG,IAAM,EAAU,CAAC,GAAG,EAAM,QAAQ,CAAC,EAChC,OAAO,EAAE,KAAW,IAAU,GAAU,EAAK,MAAM,QAAQ,CAAK,IAAM,CAAM,EAC5E,IAAI,EAAE,EAAO,MAAY,CAAE,KAAM,EAAK,MAAM,SAAS,CAAK,EAAG,KAAM,EAAM,IAAwB,EAAE,EACnG,KAAK,CAAC,EAAG,IAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC9C,OAAO,EAAO,QAAQ,CAAO,GAE/B,OAAQ,CAAC,IACP,EAAO,KAAK,IAAM,CAChB,IAAM,EAAS,EAAW,EAAO,EAAK,GAAK,EAAI,CAAK,EACpD,QAAW,KAAS,EAAM,KAAK,EAC7B,GAAI,IAAU,GAAU,EAAM,WAAW,GAAG,IAAS,EAAG,EAAM,OAAO,CAAK,EAE7E,EACH,KAAM,CAAC,EAAM,IAAO,CAClB,IAAM,EAAS,EAAW,EAAM,EAAK,GAAK,EAAI,CAAI,EAC5C,EAAO,EAAM,IAAI,CAAM,EAC7B,GAAI,CAAC,EAAM,OAAO,EAAO,KAAK,IAAI,EAAS,CAAE,KAAM,CAAK,CAAC,CAAC,EAC1D,OAAO,EAAO,IAAI,CAChB,IAAK,IAAM,CACT,IAAM,EAAY,EAAW,EAAI,EAAK,GAAK,EAAI,CAAE,EAC3C,EACJ,EAAM,IAAI,CAAS,GAAG,OAAS,YAC3B,EAAK,MAAM,KAAK,EAAW,EAAK,MAAM,SAAS,CAAM,CAAC,EACtD,EACN,GAAI,EAAK,OAAS,aAAe,EAAY,WAAW,GAAG,IAAS,EAClE,MAAU,MAAM,wCAAwC,GAAM,EAEhE,IAAM,EAAW,EAAM,IAAI,CAAW,EACtC,GAAI,EAAK,OAAS,aAAe,GAAY,EAAS,OAAS,YAC7D,MAAU,MAAM,sDAAsD,GAAI,EAE5E,EAAc,CAAW,EACzB,IAAM,EAAQ,CAAC,GAAG,EAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAW,IAAU,GAAU,EAAM,WAAW,GAAG,IAAS,CAAC,EACzG,QAAY,KAAU,EAAO,EAAM,OAAO,CAAK,EAC/C,QAAY,EAAO,KAAU,EAAO,EAAM,IAAI,GAAG,IAAc,EAAM,MAAM,EAAO,MAAM,IAAK,CAAK,GAEpG,MAAO,CAAC,IAAU,EAAO,EAAM,CAAK,CACtC,CAAC,GAEH,MAAO,CAAC,IAAU,EAAO,IAAI,CAAE,IAAK,IAAM,EAAU,CAAK,EAAG,MAAO,CAAC,IAAU,EAAO,EAAO,CAAK,CAAE,CAAC,CACtG,EAiBA,MAAO,CACL,QAhBc,EAAK,CAAC,IACpB,EAAO,QAAQ,IAAM,CACnB,IAAM,EAAc,EAAQ,OAAS,kBAAoB,EAAQ,QAAU,WAC3E,OAAO,EAAO,KACZ,GAAc,YAAY,CACxB,KAAM,UACN,OAAQ,oBACR,OAAQ,QACR,iBAAkB,EAClB,MAAO,EAAO,EAAiB,MAAM,0CAA0C,CAAC,CAClF,CAAC,CACH,EACD,CACH,EAIE,YACA,QAAS,CAAC,EAAQ,IAChB,EAAO,IAAI,CACT,IAAK,IAAM,CACT,EAAc,CAAK,EACnB,EAAM,IAAI,EAAW,EAAO,EAAK,GAAK,EAAI,CAAK,EAAG,CAAE,KAAM,UAAW,SAAQ,QAAS,KAAK,IAAI,CAAE,CAAC,GAEpG,MAAO,CAAC,IAAU,EAAO,EAAO,CAAK,CACvC,CAAC,CACL,GCrJK,MAAM,UAAgB,EAAQ,QAA4B,EAAE,uBAAuB,CAAE,CAAC,CAE7F,IAAM,GAAQ,EAAM,OAClB,EACA,EAAO,IAAI,SAAU,EAAG,CACtB,IAAM,EAAU,MAAO,GACjB,EAAW,MAAO,GAAS,QAC3B,EAAY,MAAO,EAAU,QAC7B,EAAS,EAAS,YACpB,MAAO,EAAU,QAAQ,EAAS,WAAW,EAAE,KAE7C,EAAO,SACL,CAAC,IAAc,MAAM,2CAA2C,EAAS,cAAe,CAAE,OAAM,CAAC,CACnG,EACA,EAAO,KACT,EACA,EAAgB,CAAO,EAC3B,OAAO,EAAQ,GAAG,CAAE,MAAO,GAAU,CAAM,EAAG,QAAS,EAAO,OAAQ,CAAC,EACxE,CACH,EAEa,GAAO,GAAiB,CACnC,QAAS,EACT,SACA,KAAM,CAAC,GAAkB,KAAM,GAAS,KAAM,EAAU,IAAI,CAC9D,CAAC,ECjBM,IAAM,GAAY,CAAC,KAA2B,IAChD,EAAa,EAAO,OAAO,KAC3B,EAAO,SACZ", | ||
| "debugId": "B8652C3F022CBC7064756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["src/commands/handlers/auth/list.ts"], | ||
| "sourcesContent": [ | ||
| "import { EOL } from \"node:os\"\nimport { Effect, Option } from \"effect\"\nimport { Commands } from \"../../commands\"\nimport { Runtime } from \"../../../framework/runtime\"\nimport { createClient, loadIntegrations } from \"./shared\"\nimport { errorMessage } from \"../../../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": "1F73C8265F97989864756E2164756E21", | ||
| "names": [] | ||
| } |
| { | ||
| "version": 3, | ||
| "sources": ["../ai/src/route/auth-options.ts"], | ||
| "sourcesContent": [ | ||
| "import type { Config, Redacted } from \"effect\"\nimport { Auth } from \"./auth.js\"\n\nexport type ApiKeyMode = \"optional\" | \"required\"\n\nexport type AuthOverride = {\n readonly auth: Auth.Definition\n readonly apiKey?: never\n}\n\nexport type OptionalApiKeyAuth = {\n readonly apiKey?: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type RequiredApiKeyAuth = {\n readonly apiKey: string | Redacted.Redacted<string> | Config.Config<string | Redacted.Redacted<string>>\n readonly auth?: never\n}\n\nexport type ProviderAuthOption<Mode extends ApiKeyMode> =\n | AuthOverride\n | (Mode extends \"optional\" ? OptionalApiKeyAuth : RequiredApiKeyAuth)\n\nexport type LanguageModelOptions<Base, Mode extends ApiKeyMode> = Omit<Base, \"apiKey\" | \"auth\"> &\n ProviderAuthOption<Mode>\n\nexport type LanguageModelArgs<Base, Mode extends ApiKeyMode> = Mode extends \"optional\"\n ? readonly [options?: LanguageModelOptions<Base, Mode>]\n : readonly [options: LanguageModelOptions<Base, Mode>]\n\nexport type LanguageModelFactory<Base, Mode extends ApiKeyMode, LanguageModel> = (\n id: string,\n ...args: LanguageModelArgs<Base, Mode>\n) => LanguageModel\n\n/**\n * Require at least one of the keys in `T`. Use for option shapes where any\n * subset of fields is acceptable but at least one must be present (e.g. Azure\n * accepts `resourceName` or `baseURL`).\n */\nexport type AtLeastOne<T> = {\n [K in keyof T]: Required<Pick<T, K>> & Partial<Omit<T, K>>\n}[keyof T]\n\n/**\n * Standard bearer-auth resolution for providers: honor an explicit `auth`\n * override, otherwise resolve `apiKey` (option > config var) and apply it as\n * a bearer token.\n */\nexport const bearer = (\n options: ProviderAuthOption<\"optional\">,\n envVar: string | ReadonlyArray<string>,\n): Auth.Definition => {\n if (\"auth\" in options && options.auth) return options.auth\n return (Array.isArray(envVar) ? envVar : [envVar])\n .reduce(\n (auth, name) => auth.orElse(Auth.config(name)),\n Auth.optional(\"apiKey\" in options ? options.apiKey : undefined, \"apiKey\"),\n )\n .bearer()\n}\n\nexport * as AuthOptions from \"./auth-options.js\"\n" | ||
| ], | ||
| "mappings": ";uJAkDO,IAAM,EAAS,CACpB,EACA,IACoB,CACpB,GAAI,SAAU,GAAW,EAAQ,KAAM,OAAO,EAAQ,KACtD,OAAQ,MAAM,QAAQ,CAAM,EAAI,EAAS,CAAC,CAAM,GAC7C,OACC,CAAC,EAAM,IAAS,EAAK,OAAO,EAAK,OAAO,CAAI,CAAC,EAC7C,EAAK,SAAS,WAAY,EAAU,EAAQ,OAAS,OAAW,QAAQ,CAC1E,EACC,OAAO", | ||
| "debugId": "01C639A9A848B0DF64756E2164756E21", | ||
| "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": "CAB82E072995FE1C64756E2164756E21", | ||
| "names": [] | ||
| } |
Sorry, the diff of this file is not supported yet
304
1%247243897
0