@ai-sdk/harness-opencode 1.0.88 → 1.0.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/bridge/index.mjs +61 -3
- package/dist/bridge/index.mjs.map +1 -1
- package/dist/index.js +95 -39
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/bridge/create-emit-stream-event.ts +21 -0
- package/src/bridge/index.ts +61 -3
- package/src/bridge/opencode-events.ts +10 -0
- package/src/bridge/opencode-types.ts +1 -0
- package/src/opencode-auth.ts +73 -26
- package/src/opencode-harness.ts +67 -34
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/opencode-harness.ts","../src/opencode-bootstrap.ts","../src/opencode-auth.ts","../src/opencode-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport path from 'node:path';\nimport {\n commonTool,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1PortEndpoint,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n maskSandboxCredentials,\n resolveSandboxDefaultWorkingDirectory,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession as SandboxSession,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n getOpenCodeBootstrap,\n OPENCODE_BOOTSTRAP_DIR as BOOTSTRAP_DIR,\n} from './opencode-bootstrap';\nimport {\n createOpenCodeRequestTransformations,\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n resolveOpenCodeAuthenticationMode,\n resolveOpenCodeEnv,\n splitOpenCodeModel,\n type OpenCodeAuthOptions,\n} from './opencode-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './opencode-bridge-protocol';\nimport { VERSION } from './version';\n\ntype OpenCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype OpenCodeRespawnStrategy = 'replay' | 'rerun';\n\ntype WriteSkillsResult = {\n readonly skillsDir: string;\n};\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;\n\nexport type OpenCodeHarnessSettings = {\n readonly auth?: OpenCodeAuthOptions;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n readonly model?: string;\n readonly provider?: string;\n /**\n * OpenCode reasoning/thinking variant for reasoning-capable models, e.g.\n * `'low'`, `'medium'`, `'high'`, or another model-supported OpenCode\n * variant.\n */\n readonly reasoningVariant?: string;\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n readonly startupTimeoutMs?: number;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'view',\n toolUseKind: 'readonly',\n description: 'Read file contents',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n description: 'Write content to a file',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n content: z.string().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'edit',\n toolUseKind: 'edit',\n description: 'Edit a file by replacing text',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n old_string: z.string().optional(),\n new_string: z.string().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command',\n inputSchema: z.looseObject({\n command: z.string().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'glob',\n toolUseKind: 'readonly',\n description: 'Find files matching a glob pattern',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n description: 'Search file contents with regex',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ls: tool({\n description: 'List directory contents',\n inputSchema: z.looseObject({\n path: z.string().optional(),\n }),\n }),\n webfetch: tool({\n description: 'Fetch a URL',\n inputSchema: z.looseObject({\n url: z.string().optional(),\n prompt: z.string().optional(),\n }),\n }),\n skill: tool({\n description: 'Load an OpenCode skill by name',\n inputSchema: z.looseObject({\n name: z.string().optional(),\n }),\n }),\n todowrite: tool({\n description: 'Replace the OpenCode session todo list',\n inputSchema: z.looseObject({\n todos: z\n .array(\n z.looseObject({\n content: z.string().optional(),\n status: z.string().optional(),\n priority: z.string().optional(),\n }),\n )\n .optional(),\n }),\n }),\n agent: tool({\n description: 'Run an OpenCode subagent',\n inputSchema: z.looseObject({\n agent: z.string().optional(),\n prompt: z.string().optional(),\n description: z.string().optional(),\n metadata: optionalStringRecord,\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nconst openCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\nconst openCodeResumeStateSchema = z.object({\n openCodeSessionId: z.string().optional(),\n bridge: openCodeBridgeCoordsSchema.optional(),\n});\n\ntype OpenCodeBridgeCoords = z.infer<typeof openCodeBridgeCoordsSchema>;\n\nexport function createOpenCode(\n settings: OpenCodeHarnessSettings = {},\n): HarnessV1<typeof OPENCODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'OpenCode MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'opencode',\n builtinTools: OPENCODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n lifecycleStateSchema: openCodeResumeStateSchema,\n getBootstrap: getOpenCodeBootstrap,\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness cannot use `mintBridgeToken` with a sandbox session that does not expose an id.',\n });\n }\n const defaultWorkingDirectory =\n await resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const authenticationMode = resolveOpenCodeAuthenticationMode({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n const resolvedAuthEnvironment = resolveOpenCodeEnv({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n let sandboxAuthEnvironment = resolvedAuthEnvironment;\n if (\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n const requestTransformations = createOpenCodeRequestTransformations(\n resolvedAuthEnvironment,\n authenticationMode,\n );\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n sandboxAuthEnvironment = maskSandboxCredentials({\n environment: resolvedAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n });\n } else {\n warnCredentialBrokeringUnavailable();\n }\n const bootstrapDir = path.posix.resolve(\n defaultWorkingDirectory,\n BOOTSTRAP_DIR,\n );\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData =\n isResume && typeof lifecycleState?.data === 'object'\n ? (lifecycleState.data as {\n openCodeSessionId?: unknown;\n bridge?: OpenCodeBridgeCoords;\n })\n : undefined;\n const resumeSessionId =\n typeof resumeData?.openCodeSessionId === 'string' &&\n resumeData.openCodeSessionId.length > 0\n ? resumeData.openCodeSessionId\n : undefined;\n const coords = resumeData?.bridge;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n const model = splitOpenCodeModel(settings.model, settings.provider).model;\n\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'opencode',\n sessionId: startOpts.sessionId,\n });\n\n if (coords) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: coords.port,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n let supportsUserMessageResponses = false;\n const attachChannel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: attachEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: true,\n seedResumeSessionOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n } catch {}\n }\n\n let respawnStrategy: OpenCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort({\n sandboxSession,\n override: settings.port,\n });\n const token =\n settings.mintBridgeToken == null\n ? randomBytes(32).toString('hex')\n : settings.mintBridgeToken(sandboxId!);\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const xdgConfigHome = `${sandboxHomeDir}/.config`;\n const xdgCacheHome = `${sandboxHomeDir}/.cache`;\n const xdgDataHome = `${sandboxHomeDir}/.local/share`;\n const xdgStateHome = `${sandboxHomeDir}/.local/state`;\n const skillSetup =\n startOpts.skills && startOpts.skills.length > 0\n ? await writeOpenCodeSkills({\n sandbox: toolSafeSandboxSession,\n skills: startOpts.skills,\n homeDir: sandboxHomeDir,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const forwardedAuthEnvironment = await applyCredentialForwarding({\n environment: sandboxAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n });\n const env = {\n ...forwardedAuthEnvironment,\n AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n HOME: sandboxHomeDir,\n USERPROFILE: sandboxHomeDir,\n XDG_CONFIG_HOME: xdgConfigHome,\n XDG_CACHE_HOME: xdgCacheHome,\n XDG_DATA_HOME: xdgDataHome,\n XDG_STATE_HOME: xdgStateHome,\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n if (respawnStrategy === undefined) {\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)} ${shellQuote(xdgConfigHome)} ${shellQuote(xdgCacheHome)} ${shellQuote(xdgDataHome)} ${shellQuote(xdgStateHome)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)} --bootstrap-dir ${shellQuote(bootstrapDir)}${skillSetup ? ` --skills-dir ${shellQuote(skillSetup.skillsDir)}` : ''}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n const stderrTail: string[] = [];\n const bridgeStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'opencode',\n collectTail: stderrTail,\n });\n\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: boundPort,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n let supportsUserMessageResponses = false;\n\n const channel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: bridgeEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: respawnStrategy !== undefined,\n seedResumeSessionOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n },\n };\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n}): number {\n if (override !== undefined) return override;\n if ('ports' in sandboxSession && sandboxSession.ports.length > 0) {\n return sandboxSession.ports[0];\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createOpenCode({ port })`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `port` when using a basic sandbox session.',\n });\n }\n if (portEndpoint == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n }\n}\n\nasync function resolveBridgeEndpoint({\n sandboxSession,\n override,\n port,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n}\n\nasync function writeOpenCodeSkills({\n sandbox,\n skills,\n homeDir,\n abortSignal,\n}: {\n sandbox: SandboxSession;\n skills: ReadonlyArray<HarnessV1Skill>;\n homeDir: string;\n abortSignal?: AbortSignal;\n}): Promise<WriteSkillsResult> {\n const skillsDir = path.posix.join(homeDir, '.agents', 'skills');\n await writeHarnessSkills({\n sandbox,\n rootDir: skillsDir,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid OpenCode skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid OpenCode skill file path for ${skillName}: ${filePath}`,\n });\n\n return { skillsDir };\n}\n\nfunction openWebSocket({\n endpoint,\n helloTimeoutMs,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n helloTimeoutMs: number;\n onHello(supportsUserMessageResponses: boolean): void;\n}): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(endpoint.url, {\n headers: endpoint.headers == null ? undefined : { ...endpoint.headers },\n });\n let opened = false;\n let receivedHello = false;\n let settled = false;\n const cleanup = () => {\n clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n ws.off('close', onClose);\n ws.off('error', onError);\n };\n const settle = (error?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error == null) {\n resolve(ws);\n } else {\n reject(error);\n }\n };\n const tryResolve = () => {\n if (opened && receivedHello) settle();\n };\n const onOpen = () => {\n opened = true;\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success) return;\n const value = parsed.value;\n if (\n typeof value !== 'object' ||\n value == null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== 'bridge-hello'\n ) {\n return;\n }\n const capabilities = (\n value as {\n capabilities?: { experimental_userMessageResponses?: unknown };\n }\n ).capabilities;\n onHello(capabilities?.experimental_userMessageResponses === true);\n receivedHello = true;\n tryResolve();\n })();\n };\n const onClose = () =>\n settle(new Error('OpenCode bridge closed before sending bridge-hello.'));\n const onError = (err: Error) => {\n settle(err);\n };\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n const helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `OpenCode bridge did not send bridge-hello within ${helloTimeoutMs}ms.`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n });\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction withBridgeToken({\n endpoint,\n token,\n}: {\n endpoint: HarnessV1PortEndpoint;\n token: string;\n}): HarnessV1PortEndpoint {\n const bridgeUrl = new URL(endpoint.url);\n bridgeUrl.searchParams.set('agent_bridge_token', token);\n return { ...endpoint, url: bridgeUrl.toString() };\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n provider,\n reasoningVariant,\n mcpServers,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n debug,\n permissionMode,\n builtinToolFiltering,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n mcpServers: Record<string, unknown> | undefined;\n openCodeSessionId: string | undefined;\n isResume: boolean;\n seedResumeSessionOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n supportsUserMessageResponses: () => boolean;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n let latestOpenCodeSessionId = openCodeSessionId;\n let pendingResumeSessionId = seedResumeSessionOnFirstPrompt\n ? openCodeSessionId\n : undefined;\n let activeTurn = false;\n const pendingCompactionParts: HarnessV1StreamPart[] = [];\n\n channel.on('bridge-thread', msg => {\n latestOpenCodeSessionId = msg.threadId;\n });\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n activeTurn = true;\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const userMessageSubmitter = supportsUserMessageResponses()\n ? experimental_createBridgeUserMessageSubmitter({\n send: message => channel.send(message),\n onResponse: listener => channel.on('user-message-response', listener),\n onReconnect: listener => channel.onReconnect(listener),\n })\n : undefined;\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'file-change',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close();\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close(err);\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('OpenCode bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n while (pendingCompactionParts.length > 0) {\n forward(pendingCompactionParts.shift()!);\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n ...(userMessageSubmitter == null\n ? {}\n : {\n submitUserMessage: async (text: string) => {\n await userMessageSubmitter.submit(text);\n },\n }),\n done,\n };\n };\n\n const startBase = () => ({\n model,\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n if (\n promptOpts.responseFormat?.type === 'json' &&\n promptOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.responseFormat == null\n ? {}\n : { responseFormat: promptOpts.responseFormat }),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n if (\n continueOpts.responseFormat?.type === 'json' &&\n continueOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n if (rerunContinue) {\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.responseFormat == null\n ? {}\n : { responseFormat: continueOpts.responseFormat }),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n }\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n if (customInstructions?.trim()) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports native manual compaction, but OpenCode does not expose custom compaction instructions through the supported API.\",\n });\n }\n if (activeTurn) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports manual compaction between turns; compacting during an active turn is not supported by the bridge transport.\",\n });\n }\n await runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId: latestOpenCodeSessionId,\n onCompaction: part => pendingCompactionParts.push(part),\n });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `OpenCode session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: (data ?? {}) as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n return payload;\n },\n };\n}\n\nasync function runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId,\n onCompaction,\n}: {\n channel: OpenCodeChannel;\n model: string | undefined;\n provider: string | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n debug: HarnessV1DebugConfig | undefined;\n mcpServers: Record<string, unknown> | undefined;\n resumeSessionId: string | undefined;\n onCompaction: (part: HarnessV1StreamPart) => void;\n}): Promise<void> {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const unsubs = [\n channel.on('compaction', msg => onCompaction(msg)),\n channel.on('finish', () => {\n for (const u of unsubs) u();\n pendingResolve!();\n }),\n channel.on('error', msg => {\n for (const u of unsubs) u();\n pendingReject!(msg.error);\n }),\n ];\n channel.send({\n type: 'start',\n operation: 'compact',\n prompt: '',\n tools: [],\n model,\n provider,\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(resumeSessionId ? { resumeSessionId } : {}),\n ...(debug ? { debug } : {}),\n });\n await done;\n}\n\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `The OpenCode harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport type { HarnessV1Bootstrap } from '@ai-sdk/harness';\n\nexport const OPENCODE_BOOTSTRAP_DIR = '.harness-bootstrap/opencode';\n\nlet cachedBootstrap: HarnessV1Bootstrap | undefined;\n\nexport async function getOpenCodeBootstrap(): Promise<HarnessV1Bootstrap> {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, workspace, bridge, hostToolMcp] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('pnpm-workspace.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'opencode',\n bootstrapDir: OPENCODE_BOOTSTRAP_DIR,\n files: [\n { path: `${OPENCODE_BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-workspace.yaml`,\n content: workspace,\n },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/host-tool-mcp.mjs`,\n content: hostToolMcp,\n },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: './node_modules/.bin/opencode --version',\n },\n ],\n };\n return cachedBootstrap;\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n","import type { HarnessV1RequestTransformation } from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n} from '@ai-sdk/harness/utils';\n\nexport const OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [\n 'AI_GATEWAY_API_KEY',\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n] as const;\n\nexport function createOpenCodeRequestTransformations(\n env: Record<string, string>,\n auth: OpenCodeResolvedAuthenticationMode,\n): HarnessV1RequestTransformation[] {\n switch (auth) {\n case 'ai-gateway':\n return env.AI_GATEWAY_API_KEY\n ? [\n createCredentialRequestTransformation({\n baseUrl: env.AI_GATEWAY_BASE_URL,\n headers: {\n Authorization: `Bearer ${env.AI_GATEWAY_API_KEY}`,\n },\n }),\n ]\n : [];\n case 'openai':\n return env.OPENAI_API_KEY\n ? [\n createCredentialRequestTransformation({\n baseUrl: env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1',\n headers: { Authorization: `Bearer ${env.OPENAI_API_KEY}` },\n }),\n ]\n : [];\n case 'anthropic': {\n const headers: Record<string, string> = {};\n if (env.ANTHROPIC_API_KEY) {\n headers['x-api-key'] = env.ANTHROPIC_API_KEY;\n }\n if (env.ANTHROPIC_AUTH_TOKEN) {\n headers.Authorization = `Bearer ${env.ANTHROPIC_AUTH_TOKEN}`;\n }\n return Object.keys(headers).length === 0\n ? []\n : [\n createCredentialRequestTransformation({\n baseUrl: env.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com',\n headers,\n }),\n ];\n }\n }\n}\n\nexport type OpenCodeResolvedAuthenticationMode =\n | 'anthropic'\n | 'openai'\n | 'ai-gateway';\n\nexport type OpenCodeAuthenticationMode =\n | OpenCodeResolvedAuthenticationMode\n | 'auto';\n\n/**\n * @deprecated Passing an object to auth options is deprecated. Use an `OpenCodeAuthenticationMode` string value (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.\n */\nexport type LegacyOpenCodeAuthOptions = {\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly openai?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly organization?: string;\n readonly project?: string;\n };\n readonly openaiCompatible?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly name?: string;\n readonly queryParams?: Record<string, string>;\n };\n};\n\nexport type OpenCodeAuthOptions =\n | OpenCodeAuthenticationMode\n | LegacyOpenCodeAuthOptions;\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): 'anthropic' | 'openai' {\n if (provider === 'anthropic' || provider === 'openai') {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (modelProvider === 'anthropic' || modelProvider === 'openai') {\n return modelProvider;\n }\n }\n return 'anthropic';\n}\n\nexport function splitOpenCodeModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string; model?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return {\n providerID,\n modelID: rest.join('/'),\n model,\n };\n }\n return {\n providerID: provider,\n modelID: model,\n model: provider ? `${provider}/${model}` : model,\n };\n}\n\nexport function resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const normalizedAuth = normalizeOpenCodeAuthToLegacyAuth(auth);\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (normalizedAuth?.openaiCompatible) {\n return pickOpenAICompatible(normalizedAuth.openaiCompatible, processEnv);\n }\n if (selectedProvider === 'openai') {\n if (normalizedAuth?.openai) {\n return pickOpenAI({ explicit: normalizedAuth.openai, processEnv });\n }\n } else if (normalizedAuth?.anthropic) {\n return pickAnthropic({ explicit: normalizedAuth.anthropic, processEnv });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (normalizedAuth?.gateway) {\n return pickGateway({\n explicit: normalizedAuth.gateway,\n gatewayAuthFromEnv,\n });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({ explicit: {}, gatewayAuthFromEnv });\n }\n return selectedProvider === 'openai'\n ? pickOpenAI({ processEnv })\n : pickAnthropic({ processEnv });\n}\n\nexport function resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): OpenCodeResolvedAuthenticationMode {\n if (typeof auth !== 'string' && auth?.openaiCompatible) {\n return 'openai';\n }\n\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (\n selectedProvider === 'openai' &&\n (auth === 'openai' || (typeof auth !== 'string' && auth?.openai))\n ) {\n return 'openai';\n }\n if (\n selectedProvider === 'anthropic' &&\n (auth === 'anthropic' || (typeof auth !== 'string' && auth?.anthropic))\n ) {\n return 'anthropic';\n }\n if (auth === 'ai-gateway' || (typeof auth !== 'string' && auth?.gateway)) {\n return 'ai-gateway';\n }\n if (getAiGatewayAuthFromEnv({ env: processEnv }).apiKey) {\n return 'ai-gateway';\n }\n return selectedProvider;\n}\n\nfunction normalizeOpenCodeAuthToLegacyAuth(\n auth: OpenCodeAuthOptions | undefined,\n): LegacyOpenCodeAuthOptions | undefined {\n if (auth == null || auth === 'auto') {\n return undefined;\n }\n if (typeof auth === 'string') {\n switch (auth) {\n case 'anthropic':\n return { anthropic: {} };\n case 'openai':\n return { openai: {} };\n case 'ai-gateway':\n return { gateway: {} };\n default:\n return undefined;\n }\n }\n\n console.warn(\n '[opencode] Passing an object to auth options is deprecated. Use a string mode (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.',\n );\n return auth;\n}\n\nfunction pickOpenAICompatible(\n explicit: NonNullable<LegacyOpenCodeAuthOptions['openaiCompatible']>,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const name = explicit.name ?? processEnv.OPENAI_NAME;\n if (name) env.OPENAI_NAME = name;\n if (explicit.queryParams && Object.keys(explicit.queryParams).length > 0) {\n env.OPENAI_QUERY_PARAMS_JSON = JSON.stringify(explicit.queryParams);\n } else if (processEnv.OPENAI_QUERY_PARAMS_JSON) {\n env.OPENAI_QUERY_PARAMS_JSON = processEnv.OPENAI_QUERY_PARAMS_JSON;\n }\n return env;\n}\n\nfunction pickOpenAI({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['openai']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit?.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = explicit?.organization ?? processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = explicit?.project ?? processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<LegacyOpenCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n const baseUrl = toOpenCodeGatewayBaseUrl(\n explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl,\n );\n env.AI_GATEWAY_BASE_URL = baseUrl;\n return env;\n}\n\nexport function toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n operation: z.enum(['prompt', 'compact']).optional(),\n provider: z.string().optional(),\n variant: z.string().optional(),\n instructions: z.string().optional(),\n resumeSessionId: z.string().optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createOpenCode } from './opencode-harness';\n\n/**\n * Default `openCode` harness instance with no overrides. Equivalent to\n * `createOpenCode()`.\n */\nexport const openCode = createOpenCode();\n\nexport { createOpenCode } from './opencode-harness';\nexport { VERSION } from './version';\nexport type { OpenCodeHarnessSettings } from './opencode-harness';\nexport type {\n OpenCodeAuthenticationMode,\n OpenCodeAuthOptions,\n} from './opencode-auth';\n"],"mappings":";AAAA,SAAS,mBAAmB;AAC5B,OAAO,UAAU;AACjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAgBK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,OACV;AACP;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,iBAAiB;AAC1B,SAAS,KAAAA,UAAS;;;AChDlB,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAGvB,IAAM,yBAAyB;AAEtC,IAAI;AAEJ,eAAsB,uBAAoD;AACxE,MAAI,mBAAmB,KAAM,QAAO;AACpC,QAAM,CAAC,KAAK,MAAM,WAAW,QAAQ,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,IACpE,gBAAgB,cAAc;AAAA,IAC9B,gBAAgB,gBAAgB;AAAA,IAChC,gBAAgB,qBAAqB;AAAA,IACrC,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB,mBAAmB;AAAA,EACrC,CAAC;AACD,oBAAkB;AAAA,IAChB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,OAAO;AAAA,MACL,EAAE,MAAM,GAAG,sBAAsB,iBAAiB,SAAS,IAAI;AAAA,MAC/D,EAAE,MAAM,GAAG,sBAAsB,mBAAmB,SAAS,KAAK;AAAA,MAClE;AAAA,QACE,MAAM,GAAG,sBAAsB;AAAA,QAC/B,SAAS;AAAA,MACX;AAAA,MACA,EAAE,MAAM,GAAG,sBAAsB,eAAe,SAAS,OAAO;AAAA,MAChE;AAAA,QACE,MAAM,GAAG,sBAAsB;AAAA,QAC/B,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,gBAAgB,MAA+B;AAC5D,QAAM,aAAa;AAAA,IACjB,IAAI,IAAI,YAAY,IAAI,IAAI,YAAY,GAAG;AAAA,IAC3C,IAAI,IAAI,aAAa,IAAI,IAAI,YAAY,GAAG;AAAA,EAC9C;AACA,MAAI;AACJ,aAAW,OAAO,YAAY;AAC5B,QAAI;AACF,aAAO,MAAM,SAAS,cAAc,GAAG,GAAG,MAAM;AAAA,IAClD,SAAS,KAAK;AACZ,YAAM,OAAQ,IAA8B;AAC5C,UAAI,SAAS,SAAU,OAAM;AAC7B,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,WAAW,IAAI,MAAM,2BAA2B,IAAI,EAAE;AAC9D;;;AC5DA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEA,IAAM,4CAA4C;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,qCACd,KACA,MACkC;AAClC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI,qBACP;AAAA,QACE,sCAAsC;AAAA,UACpC,SAAS,IAAI;AAAA,UACb,SAAS;AAAA,YACP,eAAe,UAAU,IAAI,kBAAkB;AAAA,UACjD;AAAA,QACF,CAAC;AAAA,MACH,IACA,CAAC;AAAA,IACP,KAAK;AACH,aAAO,IAAI,iBACP;AAAA,QACE,sCAAsC;AAAA,UACpC,SAAS,IAAI,mBAAmB;AAAA,UAChC,SAAS,EAAE,eAAe,UAAU,IAAI,cAAc,GAAG;AAAA,QAC3D,CAAC;AAAA,MACH,IACA,CAAC;AAAA,IACP,KAAK,aAAa;AAChB,YAAM,UAAkC,CAAC;AACzC,UAAI,IAAI,mBAAmB;AACzB,gBAAQ,WAAW,IAAI,IAAI;AAAA,MAC7B;AACA,UAAI,IAAI,sBAAsB;AAC5B,gBAAQ,gBAAgB,UAAU,IAAI,oBAAoB;AAAA,MAC5D;AACA,aAAO,OAAO,KAAK,OAAO,EAAE,WAAW,IACnC,CAAC,IACD;AAAA,QACE,sCAAsC;AAAA,UACpC,SAAS,IAAI,sBAAsB;AAAA,UACnC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACN;AAAA,EACF;AACF;AA0CO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAG2B;AACzB,MAAI,aAAa,eAAe,aAAa,UAAU;AACrD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,GAAG,GAAG;AACxB,UAAM,CAAC,aAAa,IAAI,MAAM,MAAM,GAAG;AACvC,QAAI,kBAAkB,eAAe,kBAAkB,UAAU;AAC/D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBACd,OACA,UAC2D;AAC3D,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,MAAI,MAAM,SAAS,GAAG,GAAG;AACvB,UAAM,CAAC,YAAY,GAAG,IAAI,IAAI,MAAM,MAAM,GAAG;AAC7C,WAAO;AAAA,MACL;AAAA,MACA,SAAS,KAAK,KAAK,GAAG;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO,WAAW,GAAG,QAAQ,IAAI,KAAK,KAAK;AAAA,EAC7C;AACF;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,QAAQ;AACvB,GAK2B;AACzB,QAAM,iBAAiB,kCAAkC,IAAI;AAC7D,QAAM,mBAAmB,wBAAwB,EAAE,OAAO,SAAS,CAAC;AACpE,MAAI,gBAAgB,kBAAkB;AACpC,WAAO,qBAAqB,eAAe,kBAAkB,UAAU;AAAA,EACzE;AACA,MAAI,qBAAqB,UAAU;AACjC,QAAI,gBAAgB,QAAQ;AAC1B,aAAO,WAAW,EAAE,UAAU,eAAe,QAAQ,WAAW,CAAC;AAAA,IACnE;AAAA,EACF,WAAW,gBAAgB,WAAW;AACpC,WAAO,cAAc,EAAE,UAAU,eAAe,WAAW,WAAW,CAAC;AAAA,EACzE;AAEA,QAAM,qBAAqB,wBAAwB,EAAE,KAAK,WAAW,CAAC;AACtE,MAAI,gBAAgB,SAAS;AAC3B,WAAO,YAAY;AAAA,MACjB,UAAU,eAAe;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI,mBAAmB,QAAQ;AAC7B,WAAO,YAAY,EAAE,UAAU,CAAC,GAAG,mBAAmB,CAAC;AAAA,EACzD;AACA,SAAO,qBAAqB,WACxB,WAAW,EAAE,WAAW,CAAC,IACzB,cAAc,EAAE,WAAW,CAAC;AAClC;AAEO,SAAS,kCAAkC;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa,QAAQ;AACvB,GAKuC;AACrC,MAAI,OAAO,SAAS,YAAY,MAAM,kBAAkB;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,wBAAwB,EAAE,OAAO,SAAS,CAAC;AACpE,MACE,qBAAqB,aACpB,SAAS,YAAa,OAAO,SAAS,YAAY,MAAM,SACzD;AACA,WAAO;AAAA,EACT;AACA,MACE,qBAAqB,gBACpB,SAAS,eAAgB,OAAO,SAAS,YAAY,MAAM,YAC5D;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,gBAAiB,OAAO,SAAS,YAAY,MAAM,SAAU;AACxE,WAAO;AAAA,EACT;AACA,MAAI,wBAAwB,EAAE,KAAK,WAAW,CAAC,EAAE,QAAQ;AACvD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kCACP,MACuC;AACvC,MAAI,QAAQ,QAAQ,SAAS,QAAQ;AACnC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,EAAE,WAAW,CAAC,EAAE;AAAA,MACzB,KAAK;AACH,eAAO,EAAE,QAAQ,CAAC,EAAE;AAAA,MACtB,KAAK;AACH,eAAO,EAAE,SAAS,CAAC,EAAE;AAAA,MACvB;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,UAAQ;AAAA,IACN;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBACP,UACA,YACwB;AACxB,QAAM,MAA8B,CAAC;AACrC,QAAM,SAAS,SAAS,UAAU,WAAW;AAC7C,MAAI,OAAQ,KAAI,iBAAiB;AACjC,QAAM,UAAU,SAAS,WAAW,WAAW;AAC/C,MAAI,QAAS,KAAI,kBAAkB;AACnC,QAAM,OAAO,SAAS,QAAQ,WAAW;AACzC,MAAI,KAAM,KAAI,cAAc;AAC5B,MAAI,SAAS,eAAe,OAAO,KAAK,SAAS,WAAW,EAAE,SAAS,GAAG;AACxE,QAAI,2BAA2B,KAAK,UAAU,SAAS,WAAW;AAAA,EACpE,WAAW,WAAW,0BAA0B;AAC9C,QAAI,2BAA2B,WAAW;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AACF,GAG2B;AACzB,QAAM,MAA8B,CAAC;AACrC,QAAM,SAAS,UAAU,UAAU,WAAW;AAC9C,MAAI,OAAQ,KAAI,iBAAiB;AACjC,QAAM,UAAU,UAAU,WAAW,WAAW;AAChD,MAAI,QAAS,KAAI,kBAAkB;AACnC,QAAM,eAAe,UAAU,gBAAgB,WAAW;AAC1D,MAAI,aAAc,KAAI,sBAAsB;AAC5C,QAAM,UAAU,UAAU,WAAW,WAAW;AAChD,MAAI,QAAS,KAAI,iBAAiB;AAClC,SAAO;AACT;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAG2B;AACzB,QAAM,MAA8B,CAAC;AACrC,QAAM,SAAS,UAAU,UAAU,WAAW;AAC9C,MAAI,OAAQ,KAAI,oBAAoB;AACpC,QAAM,YAAY,UAAU,aAAa,WAAW;AACpD,MAAI,UAAW,KAAI,uBAAuB;AAC1C,QAAM,UAAU,UAAU,WAAW,WAAW;AAChD,MAAI,QAAS,KAAI,qBAAqB;AACtC,SAAO;AACT;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AACF,GAG2B;AACzB,QAAM,MAA8B,CAAC;AACrC,QAAM,SAAS,SAAS,UAAU,mBAAmB;AACrD,MAAI,OAAQ,KAAI,qBAAqB;AACrC,QAAM,UAAU;AAAA,IACd,SAAS,WAAW,mBAAmB;AAAA,EACzC;AACA,MAAI,sBAAsB;AAC1B,SAAO;AACT;AAEO,SAAS,yBAAyB,SAAyB;AAChE,QAAM,UAAU,QAAQ,QAAQ,QAAQ,EAAE;AAC1C,SAAO,QAAQ,SAAS,KAAK,IAAI,UAAU,GAAG,OAAO;AACvD;;;ACzTA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,SAAS;AAEX,IAAM,wBAAwB;AAG9B,IAAM,qBAAqB,+BAA+B,OAAO;AAAA,EACtE,WAAW,EAAE,KAAK,CAAC,UAAU,SAAS,CAAC,EAAE,SAAS;AAAA,EAClD,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,YAAY,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS;AACzD,CAAC;AAIM,IAAM,uBAAuB,EAAE,mBAAmB,QAAQ;AAAA,EAC/D;AAAA,EACA,GAAG;AACL,CAAC;;;ACvBM,IAAM,UACX,OACI,WACA;;;AJyEN,IAAM,sBAAsB,2BAA2B,OAAO;AAqC9D,IAAM,uBAAuBC,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,QAAQ,CAAC,EAAE,SAAS;AAExE,IAAM,yBAAyB;AAAA,EAC7B,MAAM,WAAW,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,OAAO,WAAW,SAAS;AAAA,IACzB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,MAAM,WAAW,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAChC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AAAA,EACD,MAAM,WAAW,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,MAAM,WAAW,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,MAAM,WAAW,QAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,IAAI,KAAK;AAAA,IACP,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,UAAU,KAAK;AAAA,IACb,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,KAAKA,GAAE,OAAO,EAAE,SAAS;AAAA,MACzB,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,OAAO,KAAK;AAAA,IACV,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH,CAAC;AAAA,EACD,WAAW,KAAK;AAAA,IACd,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,OAAOA,GACJ;AAAA,QACCA,GAAE,YAAY;AAAA,UACZ,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,UAC7B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,QAChC,CAAC;AAAA,MACH,EACC,SAAS;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AAAA,EACD,OAAO,KAAK;AAAA,IACV,aAAa;AAAA,IACb,aAAaA,GAAE,YAAY;AAAA,MACzB,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,6BAA6BA,GAAE,OAAO;AAAA,EAC1C,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO;AAAA,EAChB,iBAAiBA,GAAE,OAAO;AAAA,EAC1B,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAED,IAAM,4BAA4BA,GAAE,OAAO;AAAA,EACzC,mBAAmBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACvC,QAAQ,2BAA2B,SAAS;AAC9C,CAAC;AAIM,SAAS,eACd,WAAoC,CAAC,GACK;AAC1C,MACE,SAAS,cAAc,QACvB,OAAO,UAAU,eAAe,KAAK,SAAS,YAAY,eAAe,GACzE;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,sBAAsB;AAAA,IACtB,WAAW;AAAA,IACX,cAAc;AAAA,IACd,8BAA8B;AAAA,IAC9B,sBAAsB;AAAA,IACtB,cAAc;AAAA,IACd,SAAS,OAAM,cAAa;AAC1B,YAAM,iBAAiB,UAAU;AACjC,YAAM,yBACJ,4BAA4B,cAAc;AAC5C,YAAM,YAAY,QAAQ,iBAAiB,eAAe,KAAK;AAC/D,mCAA6B;AAAA,QAC3B;AAAA,QACA,MAAM,SAAS;AAAA,QACf,cAAc,SAAS;AAAA,MACzB,CAAC;AACD,UAAI,SAAS,mBAAmB,QAAQ,aAAa,MAAM;AACzD,cAAM,IAAI,kCAAkC;AAAA,UAC1C,WAAW;AAAA,UACX,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,0BACJ,MAAM,sCAAsC;AAAA,QAC1C;AAAA,QACA,aAAa,UAAU;AAAA,MACzB,CAAC;AACH,YAAM,qBAAqB,kCAAkC;AAAA,QAC3D,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,UAAU,SAAS;AAAA,MACrB,CAAC;AACD,YAAM,0BAA0B,mBAAmB;AAAA,QACjD,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,UAAU,SAAS;AAAA,MACrB,CAAC;AACD,UAAI,yBAAyB;AAC7B,UACE,+BAA+B,kBAC/B,eAAe,6BAA6B,MAC5C;AACA,cAAM,yBAAyB;AAAA,UAC7B;AAAA,UACA;AAAA,QACF;AACA,YAAI,uBAAuB,SAAS,GAAG;AACrC,gBAAM,eAAe;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AACA,iCAAyB,uBAAuB;AAAA,UAC9C,aAAa;AAAA,UACb,gCACE;AAAA,QACJ,CAAC;AAAA,MACH,OAAO;AACL,2CAAmC;AAAA,MACrC;AACA,YAAM,eAAe,KAAK,MAAM;AAAA,QAC9B;AAAA,QACA;AAAA,MACF;AACA,YAAM,iBAAiB,UAAU,gBAAgB,UAAU;AAC3D,YAAM,WAAW,kBAAkB;AACnC,YAAM,aAAa,UAAU,gBAAgB;AAC7C,YAAM,aACJ,YAAY,OAAO,gBAAgB,SAAS,WACvC,eAAe,OAIhB;AACN,YAAM,kBACJ,OAAO,YAAY,sBAAsB,YACzC,WAAW,kBAAkB,SAAS,IAClC,WAAW,oBACX;AACN,YAAM,SAAS,YAAY;AAE3B,YAAM,UAAU,UAAU;AAC1B,YAAM,iBAAiB,GAAG,uBAAuB,gBAAgB,UAAU,SAAS;AACpF,YAAM,iBAAiB,GAAG,cAAc;AACxC,YAAM,YAAY,SAAS,oBAAoB;AAC/C,YAAM,QAAQ,mBAAmB,SAAS,OAAO,SAAS,QAAQ,EAAE;AAEpE,YAAM,SAAS,UAAU,eAAe;AACxC,YAAM,eAAe,SACjB,CAAC,UACC;AAAA,QACE,mCAAmC,OAAO;AAAA,UACxC,WAAW,UAAU;AAAA,UACrB,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH,IACF;AACJ,YAAM,gBAAgB,yBAAyB;AAAA,QAC7C,WAAW;AAAA,QACX,WAAW,UAAU;AAAA,MACvB,CAAC;AAED,UAAI,QAAQ;AACV,YAAI;AACF,gBAAMC,YAAW,MAAM,sBAAsB;AAAA,YAC3C;AAAA,YACA,UAAU,SAAS;AAAA,YACnB,MAAM,OAAO;AAAA,UACf,CAAC;AACD,gBAAM,iBAAiB,gBAAgB;AAAA,YACrC,UAAAA;AAAA,YACA,OAAO,OAAO;AAAA,UAChB,CAAC;AACD,cAAIC,gCAA+B;AACnC,gBAAM,gBAAiC,IAAI,eAAe;AAAA,YACxD,SAAS,MACP,cAAc;AAAA,cACZ,UAAU;AAAA,cACV,gBAAgB,KAAK,IAAI,WAAW,GAAK;AAAA,cACzC,SAAS,eAAa;AACpB,gBAAAA,gCAA+B;AAAA,cACjC;AAAA,YACF,CAAC;AAAA,YACH,gBAAgB;AAAA,YAChB,wBAAwB,OAAO;AAAA,YAC/B;AAAA,YACA;AAAA,UACF,CAAC;AACD,gBAAM,cAAc,KAAK,aAAa,EAAE,QAAQ,KAAK,IAAI,MAAS;AAClE,iBAAO,cAAc;AAAA,YACnB,WAAW,UAAU;AAAA,YACrB,SAAS;AAAA,YACT,MAAM;AAAA,YACN;AAAA,YACA,UAAU,SAAS;AAAA,YACnB,kBAAkB,SAAS;AAAA,YAC3B,YAAY,SAAS;AAAA,YACrB,mBAAmB;AAAA,YACnB,UAAU;AAAA,YACV,gCAAgC;AAAA,YAChC,eAAe;AAAA,YACf,YAAY,OAAO;AAAA,YACnB,aAAa,OAAO;AAAA,YACpB;AAAA,YACA,OAAO,UAAU,eAAe;AAAA,YAChC,gBAAgB,UAAU;AAAA,YAC1B,sBAAsB,UAAU;AAAA,YAChC,8BAA8B,MAAMA;AAAA,UACtC,CAAC;AAAA,QACH,QAAQ;AAAA,QAAC;AAAA,MACX;AAEA,UAAI,kBAAuD,WACvD,UACA;AACJ,UAAI,UAAU,YAAY;AACxB,cAAM,SAAS,MAAM,QAAQ;AAAA,UAC3B,uBAAuB,aAAa;AAAA,YAClC,MAAM,GAAG,cAAc;AAAA,YACvB,aAAa,UAAU;AAAA,UACzB,CAAC;AAAA,QACH,EAAE,MAAM,MAAM,IAAI;AAClB,YAAK,MAAM,gBAAgB,MAAM,MAAO,UAAU;AAChD,4BAAkB;AAAA,QACpB;AAAA,MACF;AAEA,YAAM,OAAO,kBAAkB;AAAA,QAC7B;AAAA,QACA,UAAU,SAAS;AAAA,MACrB,CAAC;AACD,YAAM,QACJ,SAAS,mBAAmB,OACxB,YAAY,EAAE,EAAE,SAAS,KAAK,IAC9B,SAAS,gBAAgB,SAAU;AACzC,YAAM,iBAAiB,MAAM,sBAAsB;AAAA,QACjD,SAAS;AAAA,QACT,aAAa,UAAU;AAAA,MACzB,CAAC;AACD,YAAM,gBAAgB,GAAG,cAAc;AACvC,YAAM,eAAe,GAAG,cAAc;AACtC,YAAM,cAAc,GAAG,cAAc;AACrC,YAAM,eAAe,GAAG,cAAc;AACtC,YAAM,aACJ,UAAU,UAAU,UAAU,OAAO,SAAS,IAC1C,MAAM,oBAAoB;AAAA,QACxB,SAAS;AAAA,QACT,QAAQ,UAAU;AAAA,QAClB,SAAS;AAAA,QACT,aAAa,UAAU;AAAA,MACzB,CAAC,IACD;AACN,YAAM,2BAA2B,MAAM,0BAA0B;AAAA,QAC/D,aAAa;AAAA,QACb,gCACE;AAAA,QACF,sBAAsB,SAAS;AAAA,MACjC,CAAC;AACD,YAAM,MAAM;AAAA,QACV,GAAG;AAAA,QACH,2BAA2B;AAAA,QAC3B,sBAAsB;AAAA,QACtB,gBAAgB,OAAO,IAAI;AAAA,QAC3B,MAAM;AAAA,QACN,aAAa;AAAA,QACb,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,GAAI,oBAAoB,WACpB,EAAE,yBAAyB,IAAI,IAC/B,CAAC;AAAA,MACP;AAEA,UAAI,oBAAoB,QAAW;AACjC,cAAM,uBAAuB,IAAI;AAAA,UAC/B,SAAS,YAAY,WAAW,OAAO,CAAC,IAAI,WAAW,cAAc,CAAC,IAAI,WAAW,aAAa,CAAC,IAAI,WAAW,YAAY,CAAC,IAAI,WAAW,WAAW,CAAC,IAAI,WAAW,YAAY,CAAC;AAAA,UACtL,aAAa,UAAU;AAAA,QACzB,CAAC;AAAA,MACH;AAEA,YAAM,mBAAmB;AAAA,QACvB,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ,aAAa,UAAU;AAAA,MACzB,CAAC;AAED,YAAM,OAAO,MAAM,uBAAuB,MAAM;AAAA,QAC9C,SAAS,QAAQ,WAAW,GAAG,YAAY,aAAa,CAAC,cAAc,WAAW,OAAO,CAAC,uBAAuB,WAAW,cAAc,CAAC,oBAAoB,WAAW,YAAY,CAAC,GAAG,aAAa,iBAAiB,WAAW,WAAW,SAAS,CAAC,KAAK,EAAE;AAAA,QAC/P;AAAA,QACA,aAAa,UAAU;AAAA,MACzB,CAAC;AACD,YAAM,aAAuB,CAAC;AAC9B,YAAM,mBAAmB,2BAA2B;AAAA,QAClD,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAED,YAAM,EAAE,MAAM,UAAU,IAAI,MAAM,mBAAmB;AAAA,QACnD;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,aAAa,UAAU;AAAA,QACvB,oBAAoB,CAAC,EAAE,MAAAC,OAAM,WAAW,MACtC,yBAAyB;AAAA,UACvB,SAAS;AAAA,UACT,MAAAA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,QACH,iBAAiB,CAAC,EAAE,MAAAA,OAAM,WAAW,MACnC,yBAAyB;AAAA,UACvB,SAAS;AAAA,UACT,MAAAA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACL,CAAC;AACD,WAAK,yBAAyB,KAAK,MAAM;AAEzC,YAAM,WAAW,MAAM,sBAAsB;AAAA,QAC3C;AAAA,QACA,UAAU,SAAS;AAAA,QACnB,MAAM;AAAA,MACR,CAAC;AACD,YAAM,iBAAiB,gBAAgB,EAAE,UAAU,MAAM,CAAC;AAC1D,UAAI,+BAA+B;AAEnC,YAAM,UAA2B,IAAI,eAAe;AAAA,QAClD,SAAS,MACP,cAAc;AAAA,UACZ,UAAU;AAAA,UACV,gBAAgB,KAAK,IAAI,WAAW,GAAK;AAAA,UACzC,SAAS,eAAa;AACpB,2CAA+B;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,QACH,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA,GAAI,oBAAoB,WACpB,EAAE,wBAAwB,QAAQ,mBAAmB,EAAE,IACvD,CAAC;AAAA,MACP,CAAC;AACD,YAAM,QAAQ;AAAA,QACZ,oBAAoB,WAAW,EAAE,QAAQ,KAAK,IAAI;AAAA,MACpD;AAEA,aAAO,cAAc;AAAA,QACnB,WAAW,UAAU;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,SAAS;AAAA,QACnB,kBAAkB,SAAS;AAAA,QAC3B,YAAY,SAAS;AAAA,QACrB,mBAAmB;AAAA,QACnB,UAAU,oBAAoB;AAAA,QAC9B,gCAAgC,oBAAoB;AAAA,QACpD,eAAe,oBAAoB;AAAA,QACnC,YAAY;AAAA,QACZ,aAAa;AAAA,QACb;AAAA,QACA,OAAO,UAAU,eAAe;AAAA,QAChC,gBAAgB,UAAU;AAAA,QAC1B,sBAAsB,UAAU;AAAA,QAChC,8BAA8B,MAAM;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB;AAAA,EACzB;AAAA,EACA;AACF,GAGW;AACT,MAAI,aAAa,OAAW,QAAO;AACnC,MAAI,WAAW,kBAAkB,eAAe,MAAM,SAAS,GAAG;AAChE,WAAO,eAAe,MAAM,CAAC;AAAA,EAC/B;AACA,QAAM,IAAI,kCAAkC;AAAA,IAC1C,WAAW;AAAA,IACX,SACE;AAAA,EAEJ,CAAC;AACH;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF,GAIS;AACP,MAAI,qBAAqB,eAAgB;AACzC,MAAI,QAAQ,MAAM;AAChB,UAAM,IAAI,kCAAkC;AAAA,MAC1C,WAAW;AAAA,MACX,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI,kCAAkC;AAAA,MAC1C,WAAW;AAAA,MACX,SACE;AAAA,IACJ,CAAC;AAAA,EACH;AACF;AAEA,eAAe,sBAAsB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAImC;AACjC,MAAI,YAAY,KAAM,QAAO;AAC7B,MAAI,qBAAqB,gBAAgB;AACvC,WAAO,eAAe,gBAAgB,EAAE,MAAM,UAAU,KAAK,CAAC;AAAA,EAChE;AACA,QAAM,IAAI,kCAAkC;AAAA,IAC1C,WAAW;AAAA,IACX,SACE;AAAA,EACJ,CAAC;AACH;AAEA,eAAe,oBAAoB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAK+B;AAC7B,QAAM,YAAY,KAAK,MAAM,KAAK,SAAS,WAAW,QAAQ;AAC9D,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,yBAAyB,CAAC,EAAE,KAAK,MAC/B,gCAAgC,IAAI;AAAA,IACtC,6BAA6B,CAAC,EAAE,WAAW,SAAS,MAClD,wCAAwC,SAAS,KAAK,QAAQ;AAAA,EAClE,CAAC;AAED,SAAO,EAAE,UAAU;AACrB;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AACF,GAIuB;AACrB,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,KAAK,IAAI,UAAU,SAAS,KAAK;AAAA,MACrC,SAAS,SAAS,WAAW,OAAO,SAAY,EAAE,GAAG,SAAS,QAAQ;AAAA,IACxE,CAAC;AACD,QAAI,SAAS;AACb,QAAI,gBAAgB;AACpB,QAAI,UAAU;AACd,UAAM,UAAU,MAAM;AACpB,mBAAa,UAAU;AACvB,SAAG,IAAI,QAAQ,MAAM;AACrB,SAAG,IAAI,WAAW,SAAS;AAC3B,SAAG,IAAI,SAAS,OAAO;AACvB,SAAG,IAAI,SAAS,OAAO;AAAA,IACzB;AACA,UAAM,SAAS,CAAC,UAAoB;AAClC,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ;AACR,UAAI,SAAS,MAAM;AACjB,gBAAQ,EAAE;AAAA,MACZ,OAAO;AACL,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AACA,UAAM,aAAa,MAAM;AACvB,UAAI,UAAU,cAAe,QAAO;AAAA,IACtC;AACA,UAAM,SAAS,MAAM;AACnB,eAAS;AACT,iBAAW;AAAA,IACb;AACA,UAAM,YAAY,CAAC,QAAiB;AAClC,YAAM,YAAY;AAChB,cAAM,SAAS,MAAM,cAAc;AAAA,UACjC,MAAM,yBAAyB,GAAG;AAAA,QACpC,CAAC;AACD,YAAI,CAAC,OAAO,QAAS;AACrB,cAAM,QAAQ,OAAO;AACrB,YACE,OAAO,UAAU,YACjB,SAAS,QACT,MAAM,QAAQ,KAAK,KAClB,MAA6B,SAAS,gBACvC;AACA;AAAA,QACF;AACA,cAAM,eACJ,MAGA;AACF,gBAAQ,cAAc,sCAAsC,IAAI;AAChE,wBAAgB;AAChB,mBAAW;AAAA,MACb,GAAG;AAAA,IACL;AACA,UAAM,UAAU,MACd,OAAO,IAAI,MAAM,qDAAqD,CAAC;AACzE,UAAM,UAAU,CAAC,QAAe;AAC9B,aAAO,GAAG;AAAA,IACZ;AACA,OAAG,GAAG,QAAQ,MAAM;AACpB,OAAG,GAAG,WAAW,SAAS;AAC1B,OAAG,GAAG,SAAS,OAAO;AACtB,OAAG,GAAG,SAAS,OAAO;AACtB,UAAM,aAAa;AAAA,MACjB,MACE;AAAA,QACE,IAAI;AAAA,UACF,oDAAoD,cAAc;AAAA,QACpE;AAAA,MACF;AAAA,MACF;AAAA,IACF;AACA,eAAW,QAAQ;AAAA,EACrB,CAAC;AACH;AAEA,SAAS,yBAAyB,KAAsB;AACtD,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,OAAO,SAAS,GAAG,EAAG,QAAO,IAAI,SAAS,MAAM;AACpD,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,OAAO,OAAO,GAAG,EAAE,SAAS,MAAM;AACjE,MAAI,eAAe,YAAa,QAAO,OAAO,KAAK,GAAG,EAAE,SAAS,MAAM;AACvE,MAAI,YAAY,OAAO,GAAG,GAAG;AAC3B,WAAO,OAAO,KAAK,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU,EAAE;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,GAAG;AACnB;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AACF,GAG0B;AACxB,QAAM,YAAY,IAAI,IAAI,SAAS,GAAG;AACtC,YAAU,aAAa,IAAI,sBAAsB,KAAK;AACtD,SAAO,EAAE,GAAG,UAAU,KAAK,UAAU,SAAS,EAAE;AAClD;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAmBqB;AACnB,MAAI,UAAU;AACd,MAAI;AACJ,MAAI,0BAA0B;AAC9B,MAAI,yBAAyB,iCACzB,oBACA;AACJ,MAAI,aAAa;AACjB,QAAM,yBAAgD,CAAC;AAEvD,UAAQ,GAAG,iBAAiB,SAAO;AACjC,8BAA0B,IAAI;AAAA,EAChC,CAAC;AACD,QAAM,WAAW,CAAC,aAGY;AAC5B,iBAAa;AACb,QAAI;AACJ,QAAI;AACJ,UAAM,OAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAClD,uBAAiB;AACjB,sBAAgB;AAAA,IAClB,CAAC;AACD,UAAM,uBAAuB,6BAA6B,IACtD,8CAA8C;AAAA,MAC5C,MAAM,aAAW,QAAQ,KAAK,OAAO;AAAA,MACrC,YAAY,cAAY,QAAQ,GAAG,yBAAyB,QAAQ;AAAA,MACpE,aAAa,cAAY,QAAQ,YAAY,QAAQ;AAAA,IACvD,CAAC,IACD;AAEJ,UAAM,SAA4B,CAAC;AACnC,UAAM,UAAU,CAAC,UAA+B;AAC9C,UAAI;AACF,iBAAS,KAAK,KAAK;AAAA,MACrB,QAAQ;AAAA,MAAC;AAAA,IACX;AAEA,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,YAAY;AAChB,UAAM,gBAAgB,MAAM;AAC1B,UAAI,UAAW;AACf,kBAAY;AACZ,mBAAa;AACb,4BAAsB,MAAM;AAC5B,iBAAW,KAAK,OAAQ,GAAE;AAC1B,qBAAgB;AAAA,IAClB;AACA,UAAM,cAAc,CAAC,QAAiB;AACpC,UAAI,UAAW;AACf,kBAAY;AACZ,mBAAa;AACb,4BAAsB,MAAM,GAAG;AAC/B,iBAAW,KAAK,OAAQ,GAAE;AAC1B,oBAAe,GAAG;AAAA,IACpB;AAEA,eAAW,QAAQ,YAAY;AAC7B,aAAO;AAAA,QACL,QAAQ,GAAG,MAAM,SAAO;AACtB,kBAAQ,GAAG;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,MACL,QAAQ,GAAG,UAAU,SAAO;AAC1B,gBAAQ,GAAG;AACX,sBAAc;AAAA,MAChB,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,QAAQ,GAAG,SAAS,SAAO;AACzB,gBAAQ,GAAG;AACX,oBAAY,IAAI,KAAK;AAAA,MACvB,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,CAAC,OAAgB,WAAoB;AACnD,UAAI,UAAW;AACf,UAAI,WAAW,aAAa;AAC1B,sBAAc;AACd;AAAA,MACF;AACA;AAAA,QACE,IAAI,MAAM,kDAAkD;AAAA,MAC9D;AAAA,IACF;AACA,YAAQ,QAAQ,OAAO;AAEvB,UAAM,UAAU,MAAM;AACpB,UAAI,UAAW;AACf,UAAI;AACF,gBAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,MAChC,QAAQ;AAAA,MAAC;AACT;AAAA,QACE,SAAS,aAAa,UACpB,IAAI,aAAa,WAAW,YAAY;AAAA,MAC5C;AAAA,IACF;AACA,QAAI,SAAS,aAAa;AACxB,UAAI,SAAS,YAAY,SAAS;AAChC,gBAAQ;AAAA,MACV,OAAO;AACL,iBAAS,YAAY,iBAAiB,SAAS,SAAS;AAAA,UACtD,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,uBAAuB,SAAS,GAAG;AACxC,cAAQ,uBAAuB,MAAM,CAAE;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,kBAAkB,OAAM,UAAS;AAC/B,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,QAAQ,MAAM;AAAA,UACd,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,MACA,oBAAoB,OAAM,UAAS;AACjC,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,YAAY,MAAM;AAAA,UAClB,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,MACA,GAAI,wBAAwB,OACxB,CAAC,IACD;AAAA,QACE,mBAAmB,OAAO,SAAiB;AACzC,gBAAM,qBAAqB,OAAO,IAAI;AAAA,QACxC;AAAA,MACF;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,IACA,GAAI,mBAAmB,EAAE,SAAS,iBAAiB,IAAI,CAAC;AAAA,IACxD,GAAI,cAAc,OAAO,CAAC,IAAI,EAAE,WAAW;AAAA,IAC3C,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC3C,GAAI,uBAAuB,EAAE,qBAAqB,IAAI,CAAC;AAAA,IACvD,GAAI,yBACA,EAAE,iBAAiB,uBAAuB,IAC1C,0BACE,EAAE,iBAAiB,wBAAwB,IAC3C,CAAC;AAAA,IACP,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,cAAc,OAAM,eAAc;AAChC,UACE,WAAW,gBAAgB,SAAS,UACpC,WAAW,eAAe,UAAU,MACpC;AACA,cAAM,IAAI,kCAAkC;AAAA,UAC1C,SACE;AAAA,UACF,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AACA,YAAM,UAAU,SAAS;AAAA,QACvB,MAAM,WAAW;AAAA,QACjB,aAAa,WAAW;AAAA,MAC1B,CAAC;AACD,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,WAAW;AAAA,QACX,QAAQ,gBAAgB,WAAW,MAAM;AAAA,QACzC,QAAQ,WAAW,SAAS,CAAC,GAAG,IAAI,QAAM;AAAA,UACxC,MAAM,EAAE;AAAA,UACR,aAAa,EAAE;AAAA,UACf,aAAa,EAAE;AAAA,QACjB,EAAE;AAAA,QACF,GAAI,WAAW,kBAAkB,OAC7B,CAAC,IACD,EAAE,gBAAgB,WAAW,eAAe;AAAA,QAChD,GAAI,WAAW,eACX,EAAE,cAAc,WAAW,aAAa,IACxC,CAAC;AAAA,QACL,GAAG,UAAU;AAAA,MACf,CAAC;AACD,+BAAyB;AACzB,aAAO;AAAA,IACT;AAAA,IACA,gBAAgB,OAAM,iBAAgB;AACpC,UACE,aAAa,gBAAgB,SAAS,UACtC,aAAa,eAAe,UAAU,MACtC;AACA,cAAM,IAAI,kCAAkC;AAAA,UAC1C,SACE;AAAA,UACF,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AACA,YAAM,UAAU,SAAS;AAAA,QACvB,MAAM,aAAa;AAAA,QACnB,aAAa,aAAa;AAAA,MAC5B,CAAC;AACD,UAAI,eAAe;AACjB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,QAAQ,aAAa,SAAS,CAAC,GAAG,IAAI,QAAM;AAAA,YAC1C,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,aAAa,EAAE;AAAA,UACjB,EAAE;AAAA,UACF,GAAI,aAAa,kBAAkB,OAC/B,CAAC,IACD,EAAE,gBAAgB,aAAa,eAAe;AAAA,UAClD,GAAI,aAAa,eACb,EAAE,cAAc,aAAa,aAAa,IAC1C,CAAC;AAAA,UACL,GAAG,UAAU;AAAA,QACf,CAAC;AACD,iCAAyB;AAAA,MAC3B;AACA,aAAO;AAAA,IACT;AAAA,IACA,WAAW,OAAO,uBAAgC;AAChD,UAAI,oBAAoB,KAAK,GAAG;AAC9B,cAAM,IAAI,kCAAkC;AAAA,UAC1C,WAAW;AAAA,UACX,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,UAAI,YAAY;AACd,cAAM,IAAI,kCAAkC;AAAA,UAC1C,WAAW;AAAA,UACX,SACE;AAAA,QACJ,CAAC;AAAA,MACH;AACA,YAAM,oBAAoB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB;AAAA,QACjB,cAAc,UAAQ,uBAAuB,KAAK,IAAI;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,IACA,UAAU,YAAY;AACpB,UAAI,SAAS;AACX,cAAM,IAAI;AAAA,UACR,oBAAoB,SAAS;AAAA,QAC/B;AAAA,MACF;AACA,gBAAU;AACV,YAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAC9C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,sBAAsB;AAAA,QACtB,MAAM;AAAA,UACJ,GAAI,0BACA,EAAE,mBAAmB,wBAAwB,IAC7C,CAAC;AAAA,UACL,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,YACP;AAAA,YACA,GAAI,aAAa,OAAO,CAAC,IAAI,EAAE,UAAU;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW,YAAY;AACrB,UAAI,QAAS,QAAO;AACpB,gBAAU;AACV,qBAAe,YAAY;AACzB,gBAAQ,WAAW;AACnB,YAAI;AACF,cAAI,CAAC,QAAQ,SAAS,GAAG;AACvB,oBAAQ,KAAK,EAAE,MAAM,UAAU,CAAC;AAAA,UAClC;AAAA,QACF,QAAQ;AAAA,QAAC;AACT,YAAI;AACJ,YAAI;AACF,cAAI,MAAM;AACR,kBAAM,QAAQ,KAAK;AAAA,cACjB,KAAK,KAAK;AAAA,cACV,IAAI,QAAc,aAAW;AAC3B,4BAAY,WAAW,SAAS,GAAI;AACpC,0BAAU,QAAQ;AAAA,cACpB,CAAC;AAAA,YACH,CAAC;AAAA,UACH;AAAA,QACF,UAAE;AACA,cAAI,UAAW,cAAa,SAAS;AACrC,cAAI;AACF,kBAAM,MAAM,KAAK;AAAA,UACnB,QAAQ;AAAA,UAAC;AACT,kBAAQ,MAAM;AAAA,QAChB;AAAA,MACF,GAAG;AACH,aAAO;AAAA,IACT;AAAA,IACA,QAAQ,YAAY;AAClB,UAAI,SAAS;AACX,cAAM,IAAI;AAAA,UACR,oBAAoB,SAAS;AAAA,QAC/B;AAAA,MACF;AACA,gBAAU;AACV,cAAQ,WAAW;AACnB,YAAM,OAAgB,QAAQ,SAAS,IACnC,CAAC,IACD,MAAM,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC9C,cAAM,QAAQ,WAAW,MAAM;AAC7B,gBAAM;AACN;AAAA,YACE,IAAI;AAAA,cACF,oBAAoB,SAAS;AAAA,YAC/B;AAAA,UACF;AAAA,QACF,GAAG,GAAI;AACP,cAAM,QAAQ;AACd,cAAM,QAAQ,QAAQ,GAAG,eAAe,SAAO;AAC7C,uBAAa,KAAK;AAClB,gBAAM;AACN,kBAAQ,IAAI,IAAI;AAAA,QAClB,CAAC;AACD,YAAI;AACF,kBAAQ,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,QAC/B,SAAS,KAAK;AACZ,uBAAa,KAAK;AAClB,gBAAM;AACN,iBAAO,GAAG;AAAA,QACZ;AAAA,MACF,CAAC;AAEL,UAAI;AACJ,UAAI;AACF,YAAI,MAAM;AACR,gBAAM,QAAQ,KAAK;AAAA,YACjB,KAAK,KAAK;AAAA,YACV,IAAI,QAAc,aAAW;AAC3B,0BAAY,WAAW,SAAS,GAAI;AACpC,wBAAU,QAAQ;AAAA,YACpB,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAAA,MACF,UAAE;AACA,YAAI,UAAW,cAAa,SAAS;AACrC,YAAI;AACF,gBAAM,MAAM,KAAK;AAAA,QACnB,QAAQ;AAAA,QAAC;AACT,gBAAQ,MAAM;AAAA,MAChB;AAEA,YAAM,UAAuC;AAAA,QAC3C,MAAM;AAAA,QACN,WAAW;AAAA,QACX,sBAAsB;AAAA,QACtB,MAAO,QAAQ,CAAC;AAAA,MAClB;AACA,aAAO;AAAA,IACT;AAAA,IACA,eAAe,YAAY;AACzB,UAAI,SAAS;AACX,cAAM,IAAI;AAAA,UACR,oBAAoB,SAAS;AAAA,QAC/B;AAAA,MACF;AACA,gBAAU;AACV,YAAM,kBAAkB,MAAM,QAAQ,QAAQ;AAC9C,YAAM,UAAsC;AAAA,QAC1C,MAAM;AAAA,QACN,WAAW;AAAA,QACX,sBAAsB;AAAA,QACtB,MAAM;AAAA,UACJ,GAAI,0BACA,EAAE,mBAAmB,wBAAwB,IAC7C,CAAC;AAAA,UACL,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,OAAO;AAAA,YACP;AAAA,YACA,GAAI,aAAa,OAAO,CAAC,IAAI,EAAE,UAAU;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,oBAAoB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GASkB;AAChB,MAAI;AACJ,MAAI;AACJ,QAAM,OAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAClD,qBAAiB;AACjB,oBAAgB;AAAA,EAClB,CAAC;AACD,QAAM,SAAS;AAAA,IACb,QAAQ,GAAG,cAAc,SAAO,aAAa,GAAG,CAAC;AAAA,IACjD,QAAQ,GAAG,UAAU,MAAM;AACzB,iBAAW,KAAK,OAAQ,GAAE;AAC1B,qBAAgB;AAAA,IAClB,CAAC;AAAA,IACD,QAAQ,GAAG,SAAS,SAAO;AACzB,iBAAW,KAAK,OAAQ,GAAE;AAC1B,oBAAe,IAAI,KAAK;AAAA,IAC1B,CAAC;AAAA,EACH;AACA,UAAQ,KAAK;AAAA,IACX,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,OAAO,CAAC;AAAA,IACR;AAAA,IACA;AAAA,IACA,GAAI,cAAc,OAAO,CAAC,IAAI,EAAE,WAAW;AAAA,IAC3C,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,IAC3C,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3B,CAAC;AACD,QAAM;AACR;AAEA,SAAS,gBAAgB,QAAiC;AACxD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,QAAM,EAAE,QAAQ,IAAI;AACpB,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,SAAS;AAC1B,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,IAAI,kCAAkC;AAAA,QAC1C,WAAW;AAAA,QACX,SAAS,yEAAyE,KAAK,IAAI;AAAA,MAC7F,CAAC;AAAA,IACH;AACA,UAAM,KAAK,KAAK,IAAI;AAAA,EACtB;AACA,SAAO,MAAM,KAAK,MAAM;AAC1B;;;AKpwCO,IAAM,WAAW,eAAe;","names":["z","z","endpoint","supportsUserMessageResponses","proc"]}
|
|
1
|
+
{"version":3,"sources":["../src/opencode-harness.ts","../src/opencode-bootstrap.ts","../src/opencode-auth.ts","../src/opencode-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport path from 'node:path';\nimport {\n commonTool,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1PortEndpoint,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n createSandboxCredentialEnvironment,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxDefaultWorkingDirectory,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession as SandboxSession,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n getOpenCodeBootstrap,\n OPENCODE_BOOTSTRAP_DIR as BOOTSTRAP_DIR,\n} from './opencode-bootstrap';\nimport {\n createOpenCodeRequestTransformations,\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n resolveOpenCodeAuthenticationMode,\n resolveOpenCodeEnv,\n splitOpenCodeModel,\n type OpenCodeAuthOptions,\n} from './opencode-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './opencode-bridge-protocol';\nimport { VERSION } from './version';\n\ntype OpenCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype OpenCodeRespawnStrategy = 'replay' | 'rerun';\n\ntype WriteSkillsResult = {\n readonly skillsDir: string;\n};\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;\n\nexport type OpenCodeHarnessSettings = {\n readonly auth?: OpenCodeAuthOptions;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n readonly model?: string;\n readonly provider?: string;\n /**\n * OpenCode reasoning/thinking variant for reasoning-capable models, e.g.\n * `'low'`, `'medium'`, `'high'`, or another model-supported OpenCode\n * variant.\n */\n readonly reasoningVariant?: string;\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n readonly startupTimeoutMs?: number;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'view',\n toolUseKind: 'readonly',\n description: 'Read file contents',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n description: 'Write content to a file',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n content: z.string().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'edit',\n toolUseKind: 'edit',\n description: 'Edit a file by replacing text',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n old_string: z.string().optional(),\n new_string: z.string().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command',\n inputSchema: z.looseObject({\n command: z.string().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'glob',\n toolUseKind: 'readonly',\n description: 'Find files matching a glob pattern',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n description: 'Search file contents with regex',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ls: tool({\n description: 'List directory contents',\n inputSchema: z.looseObject({\n path: z.string().optional(),\n }),\n }),\n webfetch: tool({\n description: 'Fetch a URL',\n inputSchema: z.looseObject({\n url: z.string().optional(),\n prompt: z.string().optional(),\n }),\n }),\n skill: tool({\n description: 'Load an OpenCode skill by name',\n inputSchema: z.looseObject({\n name: z.string().optional(),\n }),\n }),\n todowrite: tool({\n description: 'Replace the OpenCode session todo list',\n inputSchema: z.looseObject({\n todos: z\n .array(\n z.looseObject({\n content: z.string().optional(),\n status: z.string().optional(),\n priority: z.string().optional(),\n }),\n )\n .optional(),\n }),\n }),\n agent: tool({\n description: 'Run an OpenCode subagent',\n inputSchema: z.looseObject({\n agent: z.string().optional(),\n prompt: z.string().optional(),\n description: z.string().optional(),\n metadata: optionalStringRecord,\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nconst openCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\nconst openCodeResumeStateSchema = z.object({\n openCodeSessionId: z.string().optional(),\n bridge: openCodeBridgeCoordsSchema.optional(),\n sandboxCredentialEnvironment: z.record(z.string(), z.string()).optional(),\n});\n\ntype OpenCodeBridgeCoords = z.infer<typeof openCodeBridgeCoordsSchema>;\n\nexport function createOpenCode(\n settings: OpenCodeHarnessSettings = {},\n): HarnessV1<typeof OPENCODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'OpenCode MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'opencode',\n builtinTools: OPENCODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n lifecycleStateSchema: openCodeResumeStateSchema,\n getBootstrap: getOpenCodeBootstrap,\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness cannot use `mintBridgeToken` with a sandbox session that does not expose an id.',\n });\n }\n const defaultWorkingDirectory =\n await resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData =\n isResume && typeof lifecycleState?.data === 'object'\n ? (lifecycleState.data as {\n openCodeSessionId?: unknown;\n bridge?: OpenCodeBridgeCoords;\n sandboxCredentialEnvironment?: Record<string, string>;\n })\n : undefined;\n const resumeSessionId =\n typeof resumeData?.openCodeSessionId === 'string' &&\n resumeData.openCodeSessionId.length > 0\n ? resumeData.openCodeSessionId\n : undefined;\n const coords = resumeData?.bridge;\n const authenticationMode = resolveOpenCodeAuthenticationMode({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n const resolvedAuthEnvironment = resolveOpenCodeEnv({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n let sandboxAuthEnvironment = resolvedAuthEnvironment;\n let sandboxCredentialEnvironment: Record<string, string> | undefined;\n let credentialsBrokered = false;\n if (\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n sandboxCredentialEnvironment =\n resumeData?.sandboxCredentialEnvironment ??\n (await createSandboxCredentialEnvironment({\n environment: resolvedAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n }));\n sandboxAuthEnvironment = {\n ...resolvedAuthEnvironment,\n ...sandboxCredentialEnvironment,\n };\n const requestTransformations = createOpenCodeRequestTransformations({\n env: resolvedAuthEnvironment,\n sandboxEnv: sandboxAuthEnvironment,\n auth: authenticationMode,\n });\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n credentialsBrokered = true;\n } else {\n warnCredentialBrokeringUnavailable();\n }\n const bootstrapDir = path.posix.resolve(\n defaultWorkingDirectory,\n BOOTSTRAP_DIR,\n );\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n const model = splitOpenCodeModel(settings.model, settings.provider).model;\n\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'opencode',\n sessionId: startOpts.sessionId,\n });\n\n if (coords) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: coords.port,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n let supportsUserMessageResponses = false;\n const attachChannel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: attachEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: true,\n seedResumeSessionOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n } catch {}\n }\n\n let respawnStrategy: OpenCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort({\n sandboxSession,\n override: settings.port,\n });\n const token =\n settings.mintBridgeToken == null\n ? randomBytes(32).toString('hex')\n : settings.mintBridgeToken(sandboxId!);\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const xdgConfigHome = `${sandboxHomeDir}/.config`;\n const xdgCacheHome = `${sandboxHomeDir}/.cache`;\n const xdgDataHome = `${sandboxHomeDir}/.local/share`;\n const xdgStateHome = `${sandboxHomeDir}/.local/state`;\n const skillSetup =\n startOpts.skills && startOpts.skills.length > 0\n ? await writeOpenCodeSkills({\n sandbox: toolSafeSandboxSession,\n skills: startOpts.skills,\n homeDir: sandboxHomeDir,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const forwardedAuthEnvironment = credentialsBrokered\n ? sandboxAuthEnvironment\n : await applyCredentialForwarding({\n environment: sandboxAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n });\n const env = {\n ...forwardedAuthEnvironment,\n AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n HOME: sandboxHomeDir,\n USERPROFILE: sandboxHomeDir,\n XDG_CONFIG_HOME: xdgConfigHome,\n XDG_CACHE_HOME: xdgCacheHome,\n XDG_DATA_HOME: xdgDataHome,\n XDG_STATE_HOME: xdgStateHome,\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n if (respawnStrategy === undefined) {\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)} ${shellQuote(xdgConfigHome)} ${shellQuote(xdgCacheHome)} ${shellQuote(xdgDataHome)} ${shellQuote(xdgStateHome)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)} --bootstrap-dir ${shellQuote(bootstrapDir)}${skillSetup ? ` --skills-dir ${shellQuote(skillSetup.skillsDir)}` : ''}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n const stderrTail: string[] = [];\n const bridgeStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'opencode',\n collectTail: stderrTail,\n });\n\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: boundPort,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n let supportsUserMessageResponses = false;\n\n const channel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: bridgeEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: respawnStrategy !== undefined,\n seedResumeSessionOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n },\n };\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n}): number {\n if (override !== undefined) return override;\n if ('ports' in sandboxSession && sandboxSession.ports.length > 0) {\n return sandboxSession.ports[0];\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createOpenCode({ port })`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `port` when using a basic sandbox session.',\n });\n }\n if (portEndpoint == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n }\n}\n\nasync function resolveBridgeEndpoint({\n sandboxSession,\n override,\n port,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n}\n\nasync function writeOpenCodeSkills({\n sandbox,\n skills,\n homeDir,\n abortSignal,\n}: {\n sandbox: SandboxSession;\n skills: ReadonlyArray<HarnessV1Skill>;\n homeDir: string;\n abortSignal?: AbortSignal;\n}): Promise<WriteSkillsResult> {\n const skillsDir = path.posix.join(homeDir, '.agents', 'skills');\n await writeHarnessSkills({\n sandbox,\n rootDir: skillsDir,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid OpenCode skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid OpenCode skill file path for ${skillName}: ${filePath}`,\n });\n\n return { skillsDir };\n}\n\nfunction openWebSocket({\n endpoint,\n helloTimeoutMs,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n helloTimeoutMs: number;\n onHello(supportsUserMessageResponses: boolean): void;\n}): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(endpoint.url, {\n headers: endpoint.headers == null ? undefined : { ...endpoint.headers },\n });\n let opened = false;\n let receivedHello = false;\n let settled = false;\n const cleanup = () => {\n clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n ws.off('close', onClose);\n ws.off('error', onError);\n };\n const settle = (error?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error == null) {\n resolve(ws);\n } else {\n reject(error);\n }\n };\n const tryResolve = () => {\n if (opened && receivedHello) settle();\n };\n const onOpen = () => {\n opened = true;\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success) return;\n const value = parsed.value;\n if (\n typeof value !== 'object' ||\n value == null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== 'bridge-hello'\n ) {\n return;\n }\n const capabilities = (\n value as {\n capabilities?: { experimental_userMessageResponses?: unknown };\n }\n ).capabilities;\n onHello(capabilities?.experimental_userMessageResponses === true);\n receivedHello = true;\n tryResolve();\n })();\n };\n const onClose = () =>\n settle(new Error('OpenCode bridge closed before sending bridge-hello.'));\n const onError = (err: Error) => {\n settle(err);\n };\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n const helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `OpenCode bridge did not send bridge-hello within ${helloTimeoutMs}ms.`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n });\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction withBridgeToken({\n endpoint,\n token,\n}: {\n endpoint: HarnessV1PortEndpoint;\n token: string;\n}): HarnessV1PortEndpoint {\n const bridgeUrl = new URL(endpoint.url);\n bridgeUrl.searchParams.set('agent_bridge_token', token);\n return { ...endpoint, url: bridgeUrl.toString() };\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n provider,\n reasoningVariant,\n mcpServers,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n sandboxCredentialEnvironment,\n debug,\n permissionMode,\n builtinToolFiltering,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n mcpServers: Record<string, unknown> | undefined;\n openCodeSessionId: string | undefined;\n isResume: boolean;\n seedResumeSessionOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n sandboxCredentialEnvironment: Record<string, string> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n supportsUserMessageResponses: () => boolean;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n let latestOpenCodeSessionId = openCodeSessionId;\n let pendingResumeSessionId = seedResumeSessionOnFirstPrompt\n ? openCodeSessionId\n : undefined;\n let activeTurn = false;\n const pendingCompactionParts: HarnessV1StreamPart[] = [];\n\n channel.on('bridge-thread', msg => {\n latestOpenCodeSessionId = msg.threadId;\n });\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n activeTurn = true;\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const userMessageSubmitter = supportsUserMessageResponses()\n ? experimental_createBridgeUserMessageSubmitter({\n send: message => channel.send(message),\n onResponse: listener => channel.on('user-message-response', listener),\n onReconnect: listener => channel.onReconnect(listener),\n })\n : undefined;\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'file-change',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close();\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close(err);\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('OpenCode bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n while (pendingCompactionParts.length > 0) {\n forward(pendingCompactionParts.shift()!);\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n ...(userMessageSubmitter == null\n ? {}\n : {\n submitUserMessage: async (text: string) => {\n await userMessageSubmitter.submit(text);\n },\n }),\n done,\n };\n };\n\n const startBase = () => ({\n model,\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n if (\n promptOpts.responseFormat?.type === 'json' &&\n promptOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.responseFormat == null\n ? {}\n : { responseFormat: promptOpts.responseFormat }),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n if (\n continueOpts.responseFormat?.type === 'json' &&\n continueOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n if (rerunContinue) {\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.responseFormat == null\n ? {}\n : { responseFormat: continueOpts.responseFormat }),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n }\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n if (customInstructions?.trim()) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports native manual compaction, but OpenCode does not expose custom compaction instructions through the supported API.\",\n });\n }\n if (activeTurn) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports manual compaction between turns; compacting during an active turn is not supported by the bridge transport.\",\n });\n }\n await runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId: latestOpenCodeSessionId,\n onCompaction: part => pendingCompactionParts.push(part),\n });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `OpenCode session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const lifecycleData =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? { ...(data as Record<string, unknown>) }\n : {};\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...lifecycleData,\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n } as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n return payload;\n },\n };\n}\n\nasync function runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId,\n onCompaction,\n}: {\n channel: OpenCodeChannel;\n model: string | undefined;\n provider: string | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n debug: HarnessV1DebugConfig | undefined;\n mcpServers: Record<string, unknown> | undefined;\n resumeSessionId: string | undefined;\n onCompaction: (part: HarnessV1StreamPart) => void;\n}): Promise<void> {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const unsubs = [\n channel.on('compaction', msg => onCompaction(msg)),\n channel.on('finish', () => {\n for (const u of unsubs) u();\n pendingResolve!();\n }),\n channel.on('error', msg => {\n for (const u of unsubs) u();\n pendingReject!(msg.error);\n }),\n ];\n channel.send({\n type: 'start',\n operation: 'compact',\n prompt: '',\n tools: [],\n model,\n provider,\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(resumeSessionId ? { resumeSessionId } : {}),\n ...(debug ? { debug } : {}),\n });\n await done;\n}\n\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `The OpenCode harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport type { HarnessV1Bootstrap } from '@ai-sdk/harness';\n\nexport const OPENCODE_BOOTSTRAP_DIR = '.harness-bootstrap/opencode';\n\nlet cachedBootstrap: HarnessV1Bootstrap | undefined;\n\nexport async function getOpenCodeBootstrap(): Promise<HarnessV1Bootstrap> {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, workspace, bridge, hostToolMcp] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('pnpm-workspace.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'opencode',\n bootstrapDir: OPENCODE_BOOTSTRAP_DIR,\n files: [\n { path: `${OPENCODE_BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-workspace.yaml`,\n content: workspace,\n },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/host-tool-mcp.mjs`,\n content: hostToolMcp,\n },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: './node_modules/.bin/opencode --version',\n },\n ],\n };\n return cachedBootstrap;\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n","import type {\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n} from '@ai-sdk/harness/utils';\n\nexport const OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [\n 'AI_GATEWAY_API_KEY',\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n] as const;\n\nexport function createOpenCodeRequestTransformations({\n env: environment,\n sandboxEnv: sandboxEnvironment,\n auth: authenticationMode,\n}: HarnessV1RequestTransformationSources<OpenCodeResolvedAuthenticationMode>): HarnessV1RequestTransformation[] {\n switch (authenticationMode) {\n case 'ai-gateway':\n return environment.AI_GATEWAY_API_KEY &&\n sandboxEnvironment.AI_GATEWAY_API_KEY\n ? [\n createCredentialRequestTransformation({\n matchUrl: environment.AI_GATEWAY_BASE_URL,\n matchHeaders: {\n 'x-api-key': sandboxEnvironment.AI_GATEWAY_API_KEY,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`,\n },\n }),\n createCredentialRequestTransformation({\n matchUrl: environment.AI_GATEWAY_BASE_URL,\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.AI_GATEWAY_API_KEY}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`,\n },\n }),\n ]\n : [];\n case 'openai':\n return environment.OPENAI_API_KEY && sandboxEnvironment.OPENAI_API_KEY\n ? [\n createCredentialRequestTransformation({\n matchUrl:\n environment.OPENAI_BASE_URL ?? 'https://api.openai.com/v1',\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.OPENAI_API_KEY}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.OPENAI_API_KEY}`,\n },\n }),\n ]\n : [];\n case 'anthropic': {\n const matchUrl =\n environment.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com';\n const transformations: HarnessV1RequestTransformation[] = [];\n\n if (\n environment.ANTHROPIC_API_KEY != null &&\n sandboxEnvironment.ANTHROPIC_API_KEY != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n 'x-api-key': sandboxEnvironment.ANTHROPIC_API_KEY,\n },\n transformHeaders: {\n 'x-api-key': environment.ANTHROPIC_API_KEY,\n },\n }),\n );\n }\n\n if (\n environment.ANTHROPIC_AUTH_TOKEN != null &&\n sandboxEnvironment.ANTHROPIC_AUTH_TOKEN != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.ANTHROPIC_AUTH_TOKEN}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.ANTHROPIC_AUTH_TOKEN}`,\n },\n }),\n );\n }\n\n return transformations;\n }\n }\n}\n\nexport type OpenCodeResolvedAuthenticationMode =\n | 'anthropic'\n | 'openai'\n | 'ai-gateway';\n\nexport type OpenCodeAuthenticationMode =\n | OpenCodeResolvedAuthenticationMode\n | 'auto';\n\n/**\n * @deprecated Passing an object to auth options is deprecated. Use an `OpenCodeAuthenticationMode` string value (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.\n */\nexport type LegacyOpenCodeAuthOptions = {\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly openai?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly organization?: string;\n readonly project?: string;\n };\n readonly openaiCompatible?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly name?: string;\n readonly queryParams?: Record<string, string>;\n };\n};\n\nexport type OpenCodeAuthOptions =\n | OpenCodeAuthenticationMode\n | LegacyOpenCodeAuthOptions;\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): 'anthropic' | 'openai' {\n if (provider === 'anthropic' || provider === 'openai') {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (modelProvider === 'anthropic' || modelProvider === 'openai') {\n return modelProvider;\n }\n }\n return 'anthropic';\n}\n\nexport function splitOpenCodeModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string; model?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return {\n providerID,\n modelID: rest.join('/'),\n model,\n };\n }\n return {\n providerID: provider,\n modelID: model,\n model: provider ? `${provider}/${model}` : model,\n };\n}\n\nexport function resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const normalizedAuth = normalizeOpenCodeAuthToLegacyAuth(auth);\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (normalizedAuth?.openaiCompatible) {\n return pickOpenAICompatible(normalizedAuth.openaiCompatible, processEnv);\n }\n if (selectedProvider === 'openai') {\n if (normalizedAuth?.openai) {\n return pickOpenAI({ explicit: normalizedAuth.openai, processEnv });\n }\n } else if (normalizedAuth?.anthropic) {\n return pickAnthropic({ explicit: normalizedAuth.anthropic, processEnv });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (normalizedAuth?.gateway) {\n return pickGateway({\n explicit: normalizedAuth.gateway,\n gatewayAuthFromEnv,\n });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({ explicit: {}, gatewayAuthFromEnv });\n }\n return selectedProvider === 'openai'\n ? pickOpenAI({ processEnv })\n : pickAnthropic({ processEnv });\n}\n\nexport function resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): OpenCodeResolvedAuthenticationMode {\n if (typeof auth !== 'string' && auth?.openaiCompatible) {\n return 'openai';\n }\n\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (\n selectedProvider === 'openai' &&\n (auth === 'openai' || (typeof auth !== 'string' && auth?.openai))\n ) {\n return 'openai';\n }\n if (\n selectedProvider === 'anthropic' &&\n (auth === 'anthropic' || (typeof auth !== 'string' && auth?.anthropic))\n ) {\n return 'anthropic';\n }\n if (auth === 'ai-gateway' || (typeof auth !== 'string' && auth?.gateway)) {\n return 'ai-gateway';\n }\n if (getAiGatewayAuthFromEnv({ env: processEnv }).apiKey) {\n return 'ai-gateway';\n }\n return selectedProvider;\n}\n\nfunction normalizeOpenCodeAuthToLegacyAuth(\n auth: OpenCodeAuthOptions | undefined,\n): LegacyOpenCodeAuthOptions | undefined {\n if (auth == null || auth === 'auto') {\n return undefined;\n }\n if (typeof auth === 'string') {\n switch (auth) {\n case 'anthropic':\n return { anthropic: {} };\n case 'openai':\n return { openai: {} };\n case 'ai-gateway':\n return { gateway: {} };\n default:\n return undefined;\n }\n }\n\n console.warn(\n '[opencode] Passing an object to auth options is deprecated. Use a string mode (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.',\n );\n return auth;\n}\n\nfunction pickOpenAICompatible(\n explicit: NonNullable<LegacyOpenCodeAuthOptions['openaiCompatible']>,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const name = explicit.name ?? processEnv.OPENAI_NAME;\n if (name) env.OPENAI_NAME = name;\n if (explicit.queryParams && Object.keys(explicit.queryParams).length > 0) {\n env.OPENAI_QUERY_PARAMS_JSON = JSON.stringify(explicit.queryParams);\n } else if (processEnv.OPENAI_QUERY_PARAMS_JSON) {\n env.OPENAI_QUERY_PARAMS_JSON = processEnv.OPENAI_QUERY_PARAMS_JSON;\n }\n return env;\n}\n\nfunction pickOpenAI({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['openai']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit?.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = explicit?.organization ?? processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = explicit?.project ?? processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<LegacyOpenCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n const baseUrl = toOpenCodeGatewayBaseUrl(\n explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl,\n );\n env.AI_GATEWAY_BASE_URL = baseUrl;\n return env;\n}\n\nexport function toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n operation: z.enum(['prompt', 'compact']).optional(),\n provider: z.string().optional(),\n variant: z.string().optional(),\n instructions: z.string().optional(),\n resumeSessionId: z.string().optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createOpenCode } from './opencode-harness';\n\n/**\n * Default `openCode` harness instance with no overrides. Equivalent to\n * `createOpenCode()`.\n */\nexport const openCode = createOpenCode();\n\nexport { createOpenCode } from './opencode-harness';\nexport { VERSION } from './version';\nexport type { OpenCodeHarnessSettings } from './opencode-harness';\nexport type {\n OpenCodeAuthenticationMode,\n OpenCodeAuthOptions,\n} from './opencode-auth';\n"],"mappings":"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","names":["z","z","endpoint","supportsUserMessageResponses","proc"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/harness-opencode",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.92",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ai-sdk/harness": "1.0.
|
|
30
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
29
|
+
"@ai-sdk/harness": "1.0.91",
|
|
30
|
+
"@ai-sdk/provider-utils": "5.0.32",
|
|
31
31
|
"ws": "8.21.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
|
@@ -19,6 +19,11 @@ import {
|
|
|
19
19
|
|
|
20
20
|
type Emit = (message: Record<string, unknown>) => void;
|
|
21
21
|
|
|
22
|
+
type SubagentSession = {
|
|
23
|
+
parentSessionId: string;
|
|
24
|
+
sessionId: string;
|
|
25
|
+
};
|
|
26
|
+
|
|
22
27
|
export function createEmitStreamEvent({
|
|
23
28
|
state,
|
|
24
29
|
emit,
|
|
@@ -28,6 +33,7 @@ export function createEmitStreamEvent({
|
|
|
28
33
|
nativeNameField,
|
|
29
34
|
getHostToolName,
|
|
30
35
|
authorizeHostToolCall,
|
|
36
|
+
onSubagentSession,
|
|
31
37
|
isMcpToolName,
|
|
32
38
|
stripWorkDir,
|
|
33
39
|
formatError,
|
|
@@ -49,6 +55,7 @@ export function createEmitStreamEvent({
|
|
|
49
55
|
toolName: string;
|
|
50
56
|
input: unknown;
|
|
51
57
|
}) => void;
|
|
58
|
+
onSubagentSession?: (session: SubagentSession) => void;
|
|
52
59
|
isMcpToolName: (toolName: string) => boolean;
|
|
53
60
|
stripWorkDir: (file: string) => string;
|
|
54
61
|
formatError: (error: unknown) => string;
|
|
@@ -83,6 +90,7 @@ export function createEmitStreamEvent({
|
|
|
83
90
|
nativeNameField,
|
|
84
91
|
getHostToolName,
|
|
85
92
|
authorizeHostToolCall,
|
|
93
|
+
onSubagentSession,
|
|
86
94
|
isMcpToolName,
|
|
87
95
|
});
|
|
88
96
|
return;
|
|
@@ -359,6 +367,7 @@ function emitLegacyToolPart({
|
|
|
359
367
|
nativeNameField,
|
|
360
368
|
getHostToolName,
|
|
361
369
|
authorizeHostToolCall,
|
|
370
|
+
onSubagentSession,
|
|
362
371
|
isMcpToolName,
|
|
363
372
|
}: {
|
|
364
373
|
part: unknown;
|
|
@@ -377,6 +386,7 @@ function emitLegacyToolPart({
|
|
|
377
386
|
toolName: string;
|
|
378
387
|
input: unknown;
|
|
379
388
|
}) => void;
|
|
389
|
+
onSubagentSession?: (session: SubagentSession) => void;
|
|
380
390
|
isMcpToolName: (toolName: string) => boolean;
|
|
381
391
|
}): void {
|
|
382
392
|
const toolPart = legacyToolPartFromValue(part);
|
|
@@ -389,6 +399,17 @@ function emitLegacyToolPart({
|
|
|
389
399
|
const rawToolName = toolPart.tool;
|
|
390
400
|
if (rawToolName === 'StructuredOutput') return;
|
|
391
401
|
const toolName = toWireToolName(rawToolName);
|
|
402
|
+
if (toolName === 'agent') {
|
|
403
|
+
const metadata = {
|
|
404
|
+
...(toolPart.metadata ?? {}),
|
|
405
|
+
...(toolPart.state?.metadata ?? {}),
|
|
406
|
+
};
|
|
407
|
+
const parentSessionId = stringValue(metadata.parentSessionId);
|
|
408
|
+
const sessionId = stringValue(metadata.sessionId);
|
|
409
|
+
if (parentSessionId && sessionId) {
|
|
410
|
+
onSubagentSession?.({ parentSessionId, sessionId });
|
|
411
|
+
}
|
|
412
|
+
}
|
|
392
413
|
state.toolNames.set(callID, { rawToolName, toolName });
|
|
393
414
|
const hostToolName = getHostToolName(toolName, rawToolName);
|
|
394
415
|
if (hostToolName) {
|
package/src/bridge/index.ts
CHANGED
|
@@ -878,6 +878,22 @@ async function consumeEvents({
|
|
|
878
878
|
const stream = await subscribeLegacyEvents({ client, signal });
|
|
879
879
|
onSubscribed?.();
|
|
880
880
|
if (!stream) return;
|
|
881
|
+
const taskSessionIds = new Set([sessionId]);
|
|
882
|
+
const registerSubagentSession = (sourceSessionId: string) =>
|
|
883
|
+
function register({
|
|
884
|
+
parentSessionId,
|
|
885
|
+
sessionId: subagentSessionId,
|
|
886
|
+
}: {
|
|
887
|
+
parentSessionId: string;
|
|
888
|
+
sessionId: string;
|
|
889
|
+
}) {
|
|
890
|
+
if (
|
|
891
|
+
parentSessionId === sourceSessionId &&
|
|
892
|
+
taskSessionIds.has(sourceSessionId)
|
|
893
|
+
) {
|
|
894
|
+
taskSessionIds.add(subagentSessionId);
|
|
895
|
+
}
|
|
896
|
+
};
|
|
881
897
|
const emitStreamEvent = createEmitStreamEvent({
|
|
882
898
|
state,
|
|
883
899
|
emit,
|
|
@@ -887,20 +903,59 @@ async function consumeEvents({
|
|
|
887
903
|
nativeNameField,
|
|
888
904
|
getHostToolName,
|
|
889
905
|
authorizeHostToolCall: input => authorizeHostToolCall({ ...input, state }),
|
|
906
|
+
onSubagentSession: registerSubagentSession(sessionId),
|
|
890
907
|
isMcpToolName: toolName =>
|
|
891
908
|
[...runtime.mcpToolPrefixes].some(prefix => toolName.startsWith(prefix)),
|
|
892
909
|
stripWorkDir,
|
|
893
910
|
formatError,
|
|
894
911
|
});
|
|
912
|
+
const descendantEventProcessors = new Map<
|
|
913
|
+
string,
|
|
914
|
+
(event: OpenCodeEvent) => void
|
|
915
|
+
>();
|
|
916
|
+
const processDescendantEvent = (
|
|
917
|
+
descendantSessionId: string,
|
|
918
|
+
event: OpenCodeEvent,
|
|
919
|
+
) => {
|
|
920
|
+
let processEvent = descendantEventProcessors.get(descendantSessionId);
|
|
921
|
+
if (!processEvent) {
|
|
922
|
+
const descendantState = createTranslationState();
|
|
923
|
+
processEvent = createEmitStreamEvent({
|
|
924
|
+
state: descendantState,
|
|
925
|
+
emit: () => undefined,
|
|
926
|
+
emitWarning: () => undefined,
|
|
927
|
+
emitError: () => undefined,
|
|
928
|
+
toWireToolName,
|
|
929
|
+
nativeNameField,
|
|
930
|
+
getHostToolName,
|
|
931
|
+
authorizeHostToolCall: input =>
|
|
932
|
+
authorizeHostToolCall({ ...input, state: descendantState }),
|
|
933
|
+
onSubagentSession: registerSubagentSession(descendantSessionId),
|
|
934
|
+
isMcpToolName: () => false,
|
|
935
|
+
stripWorkDir,
|
|
936
|
+
formatError,
|
|
937
|
+
});
|
|
938
|
+
descendantEventProcessors.set(descendantSessionId, processEvent);
|
|
939
|
+
}
|
|
940
|
+
processEvent(event);
|
|
941
|
+
};
|
|
895
942
|
for await (const rawEvent of stream) {
|
|
896
943
|
if (signal.aborted || turn.abortSignal.aborted) break;
|
|
897
944
|
const event = unwrapOpenCodeEvent(rawEvent);
|
|
898
945
|
const eventSessionId = event ? getOpenCodeEventSessionId(event) : undefined;
|
|
899
|
-
if (!event
|
|
946
|
+
if (!event) continue;
|
|
947
|
+
const scopedSessionId =
|
|
948
|
+
!eventSessionId || eventSessionId === sessionId
|
|
949
|
+
? sessionId
|
|
950
|
+
: taskSessionIds.has(eventSessionId)
|
|
951
|
+
? eventSessionId
|
|
952
|
+
: undefined;
|
|
953
|
+
if (!scopedSessionId) continue;
|
|
954
|
+
const isDescendant = scopedSessionId !== sessionId;
|
|
900
955
|
if (event.type === 'permission.v2.asked') {
|
|
901
956
|
await handlePermissionV2({
|
|
902
957
|
client,
|
|
903
|
-
sessionId,
|
|
958
|
+
sessionId: scopedSessionId,
|
|
904
959
|
permissionMode,
|
|
905
960
|
builtinToolFiltering,
|
|
906
961
|
turn,
|
|
@@ -910,16 +965,19 @@ async function consumeEvents({
|
|
|
910
965
|
} else if (event.type === 'permission.asked') {
|
|
911
966
|
await handlePermission({
|
|
912
967
|
client,
|
|
913
|
-
sessionId,
|
|
968
|
+
sessionId: scopedSessionId,
|
|
914
969
|
permissionMode,
|
|
915
970
|
builtinToolFiltering,
|
|
916
971
|
turn,
|
|
917
972
|
emit,
|
|
918
973
|
event,
|
|
919
974
|
});
|
|
975
|
+
} else if (isDescendant) {
|
|
976
|
+
processDescendantEvent(scopedSessionId, event);
|
|
920
977
|
} else {
|
|
921
978
|
emitStreamEvent(event);
|
|
922
979
|
}
|
|
980
|
+
if (isDescendant) continue;
|
|
923
981
|
if (onEvent?.(event)) break;
|
|
924
982
|
}
|
|
925
983
|
}
|
|
@@ -101,6 +101,16 @@ export function getOpenCodeEventSessionId(
|
|
|
101
101
|
if (event.type?.startsWith('session.') && typeof props.id === 'string') {
|
|
102
102
|
return props.id;
|
|
103
103
|
}
|
|
104
|
+
const info = asOpenCodeObject(props.info);
|
|
105
|
+
if (typeof info?.sessionID === 'string') return info.sessionID;
|
|
106
|
+
if (
|
|
107
|
+
(event.type === 'session.created' ||
|
|
108
|
+
event.type === 'session.updated' ||
|
|
109
|
+
event.type === 'session.deleted') &&
|
|
110
|
+
typeof info?.id === 'string'
|
|
111
|
+
) {
|
|
112
|
+
return info.id;
|
|
113
|
+
}
|
|
104
114
|
const part = props.part;
|
|
105
115
|
const partObject = asOpenCodeObject(part);
|
|
106
116
|
if (typeof partObject?.sessionID === 'string') return partObject.sessionID;
|