@ai-sdk/harness-opencode 1.0.129 → 1.0.131

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 CHANGED
@@ -1,5 +1,22 @@
1
1
  # @ai-sdk/harness-opencode
2
2
 
3
+ ## 1.0.131
4
+
5
+ ### Patch Changes
6
+
7
+ - 8c195c0: fix(harness-opencode): resolve and broker Google API keys for OpenCode
8
+ - Updated dependencies [e3605f6]
9
+ - Updated dependencies [e5aeb11]
10
+ - Updated dependencies [d99d6dc]
11
+ - @ai-sdk/provider-utils@5.0.50
12
+ - @ai-sdk/harness@1.0.129
13
+
14
+ ## 1.0.130
15
+
16
+ ### Patch Changes
17
+
18
+ - @ai-sdk/harness@1.0.128
19
+
3
20
  ## 1.0.129
4
21
 
5
22
  ### Patch Changes
package/dist/index.js CHANGED
@@ -98,6 +98,7 @@ var OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [
98
98
  "OPENAI_API_KEY",
99
99
  "ANTHROPIC_API_KEY",
100
100
  "ANTHROPIC_AUTH_TOKEN",
101
+ "GOOGLE_GENERATIVE_AI_API_KEY",
101
102
  "XAI_API_KEY",
102
103
  "GITHUB_TOKEN",
103
104
  "GITHUB_COPILOT_TOKEN",
@@ -106,6 +107,17 @@ var OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [
106
107
  "GITLAB_TOKEN",
107
108
  OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE
108
109
  ];
110
+ var NON_GOOGLE_DIRECT_CREDENTIAL_ENVIRONMENT_VARIABLES = [
111
+ "OPENAI_API_KEY",
112
+ "ANTHROPIC_API_KEY",
113
+ "ANTHROPIC_AUTH_TOKEN",
114
+ "XAI_API_KEY",
115
+ "GITHUB_TOKEN",
116
+ "GITHUB_COPILOT_TOKEN",
117
+ "POE_API_KEY",
118
+ "OPENCODE_API_KEY",
119
+ "GITLAB_TOKEN"
120
+ ];
109
121
  function createOpenCodeRequestTransformations({
110
122
  env: environment,
111
123
  sandboxEnv: sandboxEnvironment,
@@ -176,6 +188,18 @@ function createOpenCodeRequestTransformations({
176
188
  }
177
189
  return transformations;
178
190
  }
191
+ case "google":
192
+ return environment.GOOGLE_GENERATIVE_AI_API_KEY && sandboxEnvironment.GOOGLE_GENERATIVE_AI_API_KEY ? [
193
+ createCredentialRequestTransformation({
194
+ matchUrl: "https://generativelanguage.googleapis.com",
195
+ matchHeaders: {
196
+ "x-goog-api-key": sandboxEnvironment.GOOGLE_GENERATIVE_AI_API_KEY
197
+ },
198
+ transformHeaders: {
199
+ "x-goog-api-key": environment.GOOGLE_GENERATIVE_AI_API_KEY
200
+ }
201
+ })
202
+ ] : [];
179
203
  case "xai":
180
204
  return createBearerTransformation({
181
205
  environment,
@@ -236,7 +260,12 @@ function resolveOpenCodeEnv({
236
260
  }) {
237
261
  const suppliedEnvironment = isHarnessAuthenticationEnvironment(auth);
238
262
  const authenticationEnvironment = suppliedEnvironment ? auth : processEnv;
239
- const selectedProvider = resolveOpenCodeProvider({ model, provider });
263
+ const selectedProvider = resolveOpenCodeAuthenticationProvider({
264
+ auth,
265
+ model,
266
+ provider,
267
+ environment: authenticationEnvironment
268
+ });
240
269
  if (selectedProvider === "openai" && auth === "openai" || selectedProvider === "anthropic" && auth === "anthropic") {
241
270
  return pickDirectProvider({
242
271
  provider: selectedProvider,
@@ -261,9 +290,19 @@ function resolveOpenCodeAuthenticationMode({
261
290
  processEnv = process.env
262
291
  }) {
263
292
  if (isHarnessAuthenticationEnvironment(auth)) {
264
- return getAiGatewayAuthFromEnv({ env: auth }).apiKey ? "ai-gateway" : resolveOpenCodeProvider({ model, provider });
293
+ return getAiGatewayAuthFromEnv({ env: auth }).apiKey ? "ai-gateway" : resolveOpenCodeAuthenticationProvider({
294
+ auth,
295
+ model,
296
+ provider,
297
+ environment: auth
298
+ });
265
299
  }
266
- const selectedProvider = resolveOpenCodeProvider({ model, provider });
300
+ const selectedProvider = resolveOpenCodeAuthenticationProvider({
301
+ auth,
302
+ model,
303
+ provider,
304
+ environment: processEnv
305
+ });
267
306
  if (selectedProvider === "openai" && auth === "openai") {
268
307
  return "openai";
269
308
  }
@@ -278,6 +317,20 @@ function resolveOpenCodeAuthenticationMode({
278
317
  }
279
318
  return selectedProvider;
280
319
  }
320
+ function resolveOpenCodeAuthenticationProvider({
321
+ auth,
322
+ model,
323
+ provider,
324
+ environment
325
+ }) {
326
+ const selectedProvider = resolveOpenCodeProvider({ model, provider });
327
+ if (model == null && provider == null && (auth === "anthropic" || auth === "openai")) {
328
+ return auth;
329
+ }
330
+ return model == null && provider == null && (environment.GOOGLE_GENERATIVE_AI_API_KEY?.length ?? 0) > 0 && !NON_GOOGLE_DIRECT_CREDENTIAL_ENVIRONMENT_VARIABLES.some(
331
+ (name) => (environment[name]?.length ?? 0) > 0
332
+ ) ? "google" : selectedProvider;
333
+ }
281
334
  function pickOpenAI({
282
335
  processEnv
283
336
  }) {
@@ -310,7 +363,7 @@ function pickDirectProvider({
310
363
  }) {
311
364
  if (provider === "openai") return pickOpenAI({ processEnv });
312
365
  if (provider === "anthropic") return pickAnthropic({ processEnv });
313
- const names = provider === "xai" ? ["XAI_API_KEY", "XAI_BASE_URL"] : provider === "github-copilot" ? ["GITHUB_COPILOT_TOKEN", "GITHUB_TOKEN"] : provider === "poe" ? ["POE_API_KEY"] : provider === "opencode-go" ? ["OPENCODE_API_KEY"] : ["GITLAB_TOKEN", "GITLAB_INSTANCE_URL"];
366
+ const names = provider === "google" ? ["GOOGLE_GENERATIVE_AI_API_KEY"] : provider === "xai" ? ["XAI_API_KEY", "XAI_BASE_URL"] : provider === "github-copilot" ? ["GITHUB_COPILOT_TOKEN", "GITHUB_TOKEN"] : provider === "poe" ? ["POE_API_KEY"] : provider === "opencode-go" ? ["OPENCODE_API_KEY"] : ["GITLAB_TOKEN", "GITLAB_INSTANCE_URL"];
314
367
  return Object.fromEntries(
315
368
  names.flatMap(
316
369
  (name) => processEnv[name] == null ? [] : [[name, processEnv[name]]]
@@ -347,7 +400,7 @@ function createBearerTransformation({
347
400
  ];
348
401
  }
349
402
  function isDirectProvider(value) {
350
- return value === "anthropic" || value === "openai" || value === "xai" || value === "github-copilot" || value === "poe" || value === "opencode-go" || value === "gitlab";
403
+ return value === "anthropic" || value === "openai" || value === "google" || value === "xai" || value === "github-copilot" || value === "poe" || value === "opencode-go" || value === "gitlab";
351
404
  }
352
405
  function pickGateway({
353
406
  gatewayAuthFromEnv
@@ -917,7 +970,7 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
917
970
  ]);
918
971
 
919
972
  // src/version.ts
920
- var VERSION = true ? "1.0.129" : "0.0.0-test";
973
+ var VERSION = true ? "1.0.131" : "0.0.0-test";
921
974
 
922
975
  // src/opencode-harness.ts
923
976
  var OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;
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-subscription.ts","../src/opencode-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import path from 'node:path';\nimport {\n commonTool,\n HARNESS_V1_BUILTIN_TOOLS,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1MintBridgeTokenCallback,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResponseFormat,\n type HarnessV1PortEndpoint,\n type HarnessV1RequestTransformation,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n harnessStateDirectoryPath,\n harnessSessionDataDirectoryPath,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n createSandboxCredentialEnvironment,\n createBridgeToken,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n withBridgeToken,\n writeSkills,\n type SandboxChannelReconnectOptions,\n type WriteSkillsResult,\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 OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\n type OpenCodeAuthenticationMode,\n} from './opencode-auth';\nimport {\n createOpenCodeGitLabSubscriptionConfig,\n createOpenCodeGitLabSubscriptionRequestTransformations,\n createOpenCodeSubscriptionAuthContent,\n createOpenCodeSubscriptionRequestTransformations,\n requestOpenCodeGitLabDirectAccess,\n resolveOpenCodeAuthentication,\n resolveOpenCodeGitLabSubscriptionModel,\n} from './opencode-subscription';\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\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?: OpenCodeAuthenticationMode;\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 * Additional configuration passed through to OpenCode as-is. OpenCode\n * config keys must use their native names. Values managed by this adapter\n * take precedence over conflicting entries.\n */\n readonly openCodeConfig?: Record<string, unknown>;\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 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 * Configures reconnection attempts after an established bridge connection\n * drops. The reconnect window includes connection establishment and\n * backoff delays. Defaults to 30 seconds with exponential backoff from 50\n * milliseconds up to 2 seconds.\n */\n readonly reconnect?: SandboxChannelReconnectOptions;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: HarnessV1MintBridgeTokenCallback;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n askUserQuestions: {\n ...HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,\n nativeName: 'question',\n toolUseKind: 'readonly',\n },\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 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 authentication = await resolveOpenCodeAuthentication({\n auth: settings.auth,\n provider: settings.provider,\n });\n const authenticationMode = authentication.authenticationMode;\n const resolvedAuthEnvironment = authentication.environment;\n let resolvedOpenCodeConfig = settings.openCodeConfig;\n let transformModel:\n | ((model: string | undefined) => string | undefined)\n | undefined;\n let gitLabSubscriptionBrokered = false;\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 transformationSources = {\n env: resolvedAuthEnvironment,\n sandboxEnv: sandboxAuthEnvironment,\n auth: authenticationMode,\n };\n const sandboxSubscriptionAccessToken =\n sandboxAuthEnvironment[\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE\n ];\n let requestTransformations: HarnessV1RequestTransformation[];\n if (\n authentication.subscription?.providerId === 'gitlab' &&\n sandboxSubscriptionAccessToken != null\n ) {\n const directAccess = await requestOpenCodeGitLabDirectAccess({\n accessToken: authentication.subscription.accessToken,\n ...(authentication.subscription.enterpriseUrl == null\n ? {}\n : { instanceUrl: authentication.subscription.enterpriseUrl }),\n ...(process.env.GITLAB_AI_GATEWAY_URL == null\n ? {}\n : { aiGatewayUrl: process.env.GITLAB_AI_GATEWAY_URL }),\n });\n requestTransformations =\n createOpenCodeGitLabSubscriptionRequestTransformations({\n directAccess,\n sandboxAccessToken: sandboxSubscriptionAccessToken,\n });\n resolvedOpenCodeConfig = createOpenCodeGitLabSubscriptionConfig({\n openCodeConfig: settings.openCodeConfig,\n sandboxAccessToken: sandboxSubscriptionAccessToken,\n aiGatewayUrl: directAccess.aiGatewayUrl,\n ...(startOpts.headers == null\n ? {}\n : { headers: startOpts.headers }),\n });\n transformModel = model =>\n resolveOpenCodeGitLabSubscriptionModel({\n model,\n provider: settings.provider,\n });\n gitLabSubscriptionBrokered = true;\n } else {\n requestTransformations =\n authentication.subscription == null ||\n sandboxSubscriptionAccessToken == null\n ? createOpenCodeRequestTransformations(transformationSources)\n : createOpenCodeSubscriptionRequestTransformations({\n authentication: authentication.subscription,\n sandboxAccessToken: sandboxSubscriptionAccessToken,\n });\n }\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n credentialsBrokered = true;\n }\n // Harness SDK state (bootstrap, per-session runs) always lives under\n // the sandbox's own HOME, never the working directory, so it stays\n // out of a user-owned workspace.\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const stateDir = harnessStateDirectoryPath({ sandboxHomeDir });\n const bootstrapDir = path.posix.resolve(stateDir, BOOTSTRAP_DIR);\n\n const workDir = startOpts.sessionWorkDir;\n const skillsDir = path.posix.join(sandboxHomeDir, '.agents', 'skills');\n const sessionDataDir = harnessSessionDataDirectoryPath({\n stateDirectory: stateDir,\n sessionId: startOpts.sessionId,\n });\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\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: ({ abortSignal }) =>\n openWebSocket({\n endpoint: attachEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n abortSignal,\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeConfig: resolvedOpenCodeConfig,\n mcpServers: settings.mcpServers,\n headers: startOpts.headers,\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 sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n transformModel,\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 ? createBridgeToken()\n : settings.mintBridgeToken(sandboxId!);\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 if (!credentialsBrokered) {\n warnCredentialBrokeringUnavailable({\n environment: resolvedAuthEnvironment,\n forwardedEnvironment: forwardedAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n });\n }\n const subscriptionAccessToken =\n forwardedAuthEnvironment[\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE\n ];\n const forwardableAuthEnvironment = Object.fromEntries(\n Object.entries(forwardedAuthEnvironment).filter(\n ([name]) =>\n name !== OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\n ),\n );\n const env = {\n ...forwardableAuthEnvironment,\n ...(gitLabSubscriptionBrokered ||\n authentication.subscription == null ||\n subscriptionAccessToken == null\n ? {}\n : {\n OPENCODE_AUTH_CONTENT: createOpenCodeSubscriptionAuthContent({\n authentication: authentication.subscription,\n accessToken: subscriptionAccessToken,\n }),\n }),\n AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\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)}`,\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)} --skills-dir ${shellQuote(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: ({ abortSignal }) =>\n openWebSocket({\n endpoint: bridgeEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n abortSignal,\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\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 provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeConfig: resolvedOpenCodeConfig,\n mcpServers: settings.mcpServers,\n headers: startOpts.headers,\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 sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n transformModel,\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\nfunction openWebSocket({\n endpoint,\n helloTimeoutMs,\n abortSignal,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n helloTimeoutMs: number;\n abortSignal: AbortSignal;\n onHello(supportsUserMessageResponses: boolean): void;\n}): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const abortReason = () =>\n abortSignal.reason ?? new Error('WebSocket connection aborted');\n if (abortSignal.aborted) {\n reject(abortReason());\n return;\n }\n\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 let helloTimer: ReturnType<typeof setTimeout> | undefined;\n let onAbort: (() => void) | undefined;\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 if (onAbort != null) {\n abortSignal.removeEventListener('abort', onAbort);\n }\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 const suppressError = () => {};\n const socketWithOnce = ws as WebSocket & {\n once?: (event: string, listener: () => void) => void;\n };\n socketWithOnce.once?.('error', suppressError);\n try {\n ws.terminate();\n } catch {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n }\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 onAbort = () => settle(abortReason());\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n abortSignal.addEventListener('abort', onAbort, { once: true });\n if (abortSignal.aborted) {\n onAbort();\n return;\n }\n 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 createSession({\n sessionId,\n channel,\n proc,\n provider,\n reasoningVariant,\n openCodeConfig,\n mcpServers,\n headers,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n sandboxCredentialEnvironment,\n debug,\n permissionMode,\n builtinToolFiltering,\n sandbox,\n sandboxHomeDir,\n transformModel,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n openCodeConfig: Record<string, unknown> | undefined;\n mcpServers: Record<string, unknown> | undefined;\n headers: Readonly<Record<string, string>> | 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 sandbox: SandboxSession;\n sandboxHomeDir: string;\n transformModel:\n | ((model: string | undefined) => string | undefined)\n | 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 selectedModel: string | 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 ...(input.toolResult !== undefined\n ? { toolResult: input.toolResult }\n : {}),\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 = (turnModel: string | undefined) => ({\n model: transformModel == null ? turnModel : transformModel(turnModel),\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(openCodeConfig == null ? {} : { openCodeConfig }),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(headers == null ? {} : { headers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n const prepareTurn = async (opts: {\n responseFormat?: HarnessV1ResponseFormat;\n skills: ReadonlyArray<HarnessV1Skill>;\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): Promise<{\n control: HarnessV1PromptControl;\n skillWriteResult: WriteSkillsResult;\n }> => {\n if (\n opts.responseFormat?.type === 'json' &&\n opts.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 skillWriteResult = await writeSkills({\n sandbox,\n homePath: sandboxHomeDir,\n skillsDir: '.agents/skills',\n skills: opts.skills,\n abortSignal: opts.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 const control = wireTurn({\n emit: opts.emit,\n abortSignal: opts.abortSignal,\n });\n return { control, skillWriteResult };\n };\n\n return {\n sessionId,\n isResume,\n doPromptTurn: async promptOpts => {\n const { control, skillWriteResult } = await prepareTurn(promptOpts);\n const turnModel = promptOpts.model ?? selectedModel;\n if (turnModel) selectedModel = turnModel;\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 skillsChanged: skillWriteResult.changed,\n ...startBase(turnModel),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n const { control, skillWriteResult } = await prepareTurn(continueOpts);\n if (rerunContinue) {\n const turnModel = continueOpts.model ?? selectedModel;\n if (turnModel) selectedModel = turnModel;\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 skillsChanged: skillWriteResult.changed,\n ...startBase(turnModel),\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 transformModel == null\n ? selectedModel\n : transformModel(selectedModel),\n provider,\n permissionMode,\n debug,\n openCodeConfig,\n mcpServers,\n headers,\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 openCodeConfig,\n mcpServers,\n headers,\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 openCodeConfig: Record<string, unknown> | undefined;\n mcpServers: Record<string, unknown> | undefined;\n headers: Readonly<Record<string, string>> | 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 ...(openCodeConfig == null ? {} : { openCodeConfig }),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(headers == null ? {} : { headers }),\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 type { HarnessV1Bootstrap } from '@ai-sdk/harness';\nimport { createReadBridgeAsset } from '@ai-sdk/harness/utils';\n\n/*\n * Keep every asset URL literal so bundlers can emit each file separately.\n * Dynamic new URL() paths can collapse multiple assets into one resolution.\n */\nconst readBridgeAsset = createReadBridgeAsset({\n 'package.json': new URL('./bridge/package.json', import.meta.url),\n 'pnpm-lock.yaml': new URL('./bridge/pnpm-lock.yaml', import.meta.url),\n 'pnpm-workspace.yaml': new URL(\n './bridge/pnpm-workspace.yaml',\n import.meta.url,\n ),\n 'index.mjs': new URL('./bridge/index.mjs', import.meta.url),\n 'host-tool-mcp.mjs': new URL('./bridge/host-tool-mcp.mjs', import.meta.url),\n});\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","import type {\n HarnessV1Authentication,\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n isHarnessAuthenticationEnvironment,\n} from '@ai-sdk/harness/utils';\n\nexport const OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE =\n 'AI_SDK_OPENCODE_NATIVE_ACCESS_TOKEN';\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 'XAI_API_KEY',\n 'GITHUB_TOKEN',\n 'GITHUB_COPILOT_TOKEN',\n 'POE_API_KEY',\n 'OPENCODE_API_KEY',\n 'GITLAB_TOKEN',\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\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 case 'xai':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'XAI_API_KEY',\n matchUrl: environment.XAI_BASE_URL ?? 'https://api.x.ai/v1',\n });\n case 'github-copilot':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName:\n environment.GITHUB_COPILOT_TOKEN != null\n ? 'GITHUB_COPILOT_TOKEN'\n : 'GITHUB_TOKEN',\n matchUrl: 'https://api.githubcopilot.com',\n });\n case 'poe':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'POE_API_KEY',\n matchUrl: 'https://api.poe.com',\n });\n case 'opencode-go':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'OPENCODE_API_KEY',\n matchUrl: 'https://opencode.ai/zen/go/v1',\n });\n case 'gitlab':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'GITLAB_TOKEN',\n matchUrl: environment.GITLAB_INSTANCE_URL ?? 'https://gitlab.com',\n });\n }\n}\n\nexport type OpenCodeResolvedAuthenticationMode =\n | 'anthropic'\n | 'openai'\n | 'xai'\n | 'github-copilot'\n | 'poe'\n | 'opencode-go'\n | 'gitlab'\n | 'ai-gateway';\n\nexport type OpenCodeAuthenticationMode = HarnessV1Authentication<\n 'anthropic' | 'openai'\n>;\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'> {\n if (isDirectProvider(provider)) {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (isDirectProvider(modelProvider)) {\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: OpenCodeAuthenticationMode | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const suppliedEnvironment = isHarnessAuthenticationEnvironment(auth);\n const authenticationEnvironment = suppliedEnvironment ? auth : processEnv;\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (\n (selectedProvider === 'openai' && auth === 'openai') ||\n (selectedProvider === 'anthropic' && auth === 'anthropic')\n ) {\n return pickDirectProvider({\n provider: selectedProvider,\n processEnv: authenticationEnvironment,\n });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({\n env: authenticationEnvironment,\n });\n if (auth === 'ai-gateway' || gatewayAuthFromEnv.apiKey) {\n return pickGateway({ gatewayAuthFromEnv });\n }\n return pickDirectProvider({\n provider: selectedProvider,\n processEnv: authenticationEnvironment,\n });\n}\n\nexport function resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthenticationMode | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): OpenCodeResolvedAuthenticationMode {\n if (isHarnessAuthenticationEnvironment(auth)) {\n return getAiGatewayAuthFromEnv({ env: auth }).apiKey\n ? 'ai-gateway'\n : resolveOpenCodeProvider({ model, provider });\n }\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (selectedProvider === 'openai' && auth === 'openai') {\n return 'openai';\n }\n if (selectedProvider === 'anthropic' && auth === 'anthropic') {\n return 'anthropic';\n }\n if (auth === 'ai-gateway') {\n return 'ai-gateway';\n }\n if (getAiGatewayAuthFromEnv({ env: processEnv }).apiKey) {\n return 'ai-gateway';\n }\n return selectedProvider;\n}\n\nfunction pickOpenAI({\n processEnv,\n}: {\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n processEnv,\n}: {\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickDirectProvider({\n provider,\n processEnv,\n}: {\n provider: Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n if (provider === 'openai') return pickOpenAI({ processEnv });\n if (provider === 'anthropic') return pickAnthropic({ processEnv });\n const names =\n provider === 'xai'\n ? ['XAI_API_KEY', 'XAI_BASE_URL']\n : provider === 'github-copilot'\n ? ['GITHUB_COPILOT_TOKEN', 'GITHUB_TOKEN']\n : provider === 'poe'\n ? ['POE_API_KEY']\n : provider === 'opencode-go'\n ? ['OPENCODE_API_KEY']\n : ['GITLAB_TOKEN', 'GITLAB_INSTANCE_URL'];\n return Object.fromEntries(\n names.flatMap(name =>\n processEnv[name] == null ? [] : [[name, processEnv[name]!]],\n ),\n );\n}\n\nexport function hasOpenCodeCredential({\n environment,\n authenticationMode,\n}: {\n environment: Record<string, string>;\n authenticationMode: OpenCodeResolvedAuthenticationMode;\n}): boolean {\n if (authenticationMode === 'ai-gateway') {\n return environment.AI_GATEWAY_API_KEY != null;\n }\n return Object.keys(environment).some(\n name =>\n name.endsWith('_API_KEY') ||\n name.endsWith('_TOKEN') ||\n name === 'ANTHROPIC_AUTH_TOKEN',\n );\n}\n\nfunction createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName,\n matchUrl,\n}: {\n environment: Readonly<Record<string, string>>;\n sandboxEnvironment: Readonly<Record<string, string>>;\n environmentVariableName: string;\n matchUrl: string;\n}): HarnessV1RequestTransformation[] {\n const credential = environment[environmentVariableName];\n const sandboxCredential = sandboxEnvironment[environmentVariableName];\n return credential == null || sandboxCredential == null\n ? []\n : [\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxCredential}`,\n },\n transformHeaders: { Authorization: `Bearer ${credential}` },\n }),\n ];\n}\n\nfunction isDirectProvider(\n value: string | undefined,\n): value is Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'> {\n return (\n value === 'anthropic' ||\n value === 'openai' ||\n value === 'xai' ||\n value === 'github-copilot' ||\n value === 'poe' ||\n value === 'opencode-go' ||\n value === 'gitlab'\n );\n}\n\nfunction pickGateway({\n gatewayAuthFromEnv,\n}: {\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n const baseUrl = toOpenCodeGatewayBaseUrl(gatewayAuthFromEnv.baseUrl);\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 { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport {\n HarnessCapabilityUnsupportedError,\n type HarnessV1RequestTransformation,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n isAccessTokenExpiringSoon,\n isHarnessAuthenticationEnvironment,\n isWindows,\n parseJwtPayload,\n refreshOAuthAccessToken,\n} from '@ai-sdk/harness/utils';\nimport { isRecord, safeParseJSON } from '@ai-sdk/provider-utils';\nimport {\n hasOpenCodeCredential,\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\n resolveOpenCodeAuthenticationMode,\n resolveOpenCodeEnv,\n type OpenCodeAuthenticationMode,\n type OpenCodeResolvedAuthenticationMode,\n} from './opencode-auth';\n\nconst OPENAI_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst XAI_CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828';\nconst GITLAB_CLIENT_ID =\n '1d89f9fdb23ee96d4e603201f6861dab6e143c5c3c00469a018a2d94bdc03d4e';\nconst GITLAB_AI_GATEWAY_URL = 'https://cloud.gitlab.com';\nconst GITLAB_ANTHROPIC_PROVIDER_ID = 'ai-sdk-gitlab-anthropic';\nconst GITLAB_OPENAI_CHAT_PROVIDER_ID = 'ai-sdk-gitlab-openai-chat';\nconst GITLAB_OPENAI_RESPONSES_PROVIDER_ID = 'ai-sdk-gitlab-openai-responses';\n\ntype OpenCodeGitLabModel = {\n readonly providerId:\n | typeof GITLAB_ANTHROPIC_PROVIDER_ID\n | typeof GITLAB_OPENAI_CHAT_PROVIDER_ID\n | typeof GITLAB_OPENAI_RESPONSES_PROVIDER_ID\n | 'workflow';\n readonly modelId: string;\n};\n\nconst OPEN_CODE_GITLAB_MODELS = {\n 'duo-chat-fable-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-fable-5',\n },\n 'duo-chat-opus-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-5',\n },\n 'duo-chat-opus-4-8': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-8',\n },\n 'duo-chat-opus-4-7': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-7',\n },\n 'duo-chat-opus-4-6': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-6',\n },\n 'duo-chat-sonnet-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-sonnet-5',\n },\n 'duo-chat-sonnet-4-6': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-sonnet-4-6',\n },\n 'duo-chat-opus-4-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-5-20251101',\n },\n 'duo-chat-sonnet-4-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-sonnet-4-5-20250929',\n },\n 'duo-chat-haiku-4-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-haiku-4-5-20251001',\n },\n 'duo-chat-gpt-5-1': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.1-2025-11-13',\n },\n 'duo-chat-gpt-5-2': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.2-2025-12-11',\n },\n 'duo-chat-gpt-5-4': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.4-2026-03-05',\n },\n 'duo-chat-gpt-5-5': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.5-2026-04-23',\n },\n 'duo-chat-gpt-5-mini': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5-mini-2025-08-07',\n },\n 'duo-chat-gpt-5-4-mini': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.4-mini',\n },\n 'duo-chat-gpt-5-4-nano': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.4-nano',\n },\n 'duo-chat-gpt-5-6-sol': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.6-sol',\n },\n 'duo-chat-gpt-5-6-terra': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.6-terra',\n },\n 'duo-chat-gpt-5-6-luna': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.6-luna',\n },\n 'duo-chat-gpt-5-codex': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5-codex',\n },\n 'duo-chat-gpt-5-2-codex': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.2-codex',\n },\n 'duo-chat-gpt-5-3-codex': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.3-codex',\n },\n 'duo-workflow': { providerId: 'workflow', modelId: 'default' },\n 'duo-workflow-default': { providerId: 'workflow', modelId: 'default' },\n 'duo-workflow-sonnet-4-5': {\n providerId: 'workflow',\n modelId: 'anthropic/claude-sonnet-4-5-20250929',\n },\n 'duo-workflow-sonnet-5': {\n providerId: 'workflow',\n modelId: 'claude_sonnet_5',\n },\n 'duo-workflow-opus-5': {\n providerId: 'workflow',\n modelId: 'claude_opus_5',\n },\n 'duo-workflow-sonnet-4-6': {\n providerId: 'workflow',\n modelId: 'claude_sonnet_4_6',\n },\n 'duo-workflow-opus-4-5': {\n providerId: 'workflow',\n modelId: 'anthropic/claude-opus-4-5-20251101',\n },\n 'duo-workflow-haiku-4-5': {\n providerId: 'workflow',\n modelId: 'claude_haiku_4_5_20251001',\n },\n 'duo-workflow-opus-4-6': {\n providerId: 'workflow',\n modelId: 'claude_opus_4_6_20260205',\n },\n} as const satisfies Record<string, OpenCodeGitLabModel>;\n\nexport type OpenCodeSubscriptionProvider =\n | 'openai'\n | 'xai'\n | 'github-copilot'\n | 'poe'\n | 'opencode-go'\n | 'gitlab';\n\nexport type OpenCodeSubscription = {\n readonly providerId: OpenCodeSubscriptionProvider;\n readonly accessToken: string;\n readonly accountId?: string;\n readonly enterpriseUrl?: string;\n};\n\nexport type OpenCodeGitLabDirectAccess = {\n readonly accessToken: string;\n readonly headers: Readonly<Record<string, string>>;\n readonly aiGatewayUrl: string;\n};\n\nexport async function resolveOpenCodeAuthentication({\n auth,\n model,\n provider,\n processEnv = process.env,\n readSubscription = readOpenCodeSubscription,\n}: {\n auth: OpenCodeAuthenticationMode | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n readSubscription?: typeof readOpenCodeSubscription;\n}): Promise<{\n environment: Record<string, string>;\n authenticationMode: OpenCodeResolvedAuthenticationMode;\n subscription?: OpenCodeSubscription;\n}> {\n const environment = resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv,\n });\n const authenticationMode = resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv,\n });\n if (\n isHarnessAuthenticationEnvironment(auth) ||\n auth === 'ai-gateway' ||\n authenticationMode === 'ai-gateway' ||\n hasOpenCodeCredential({ environment, authenticationMode })\n ) {\n return { environment, authenticationMode };\n }\n const subscription = await readSubscription({\n providerId: authenticationMode,\n env: processEnv,\n });\n return subscription == null\n ? { environment, authenticationMode }\n : {\n environment: {\n ...environment,\n [OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE]:\n subscription.accessToken,\n },\n authenticationMode,\n subscription,\n };\n}\n\nexport async function readOpenCodeSubscription({\n providerId,\n env = process.env,\n homeDirectory = homedir(),\n platform = process.platform,\n fetch,\n}: {\n providerId: string;\n env?: Readonly<Record<string, string | undefined>>;\n homeDirectory?: string;\n platform?: NodeJS.Platform;\n fetch?: typeof globalThis.fetch;\n}): Promise<OpenCodeSubscription | undefined> {\n if (!isSubscriptionProvider(providerId)) return undefined;\n const stored = await readStore({ env, homeDirectory, platform });\n if (stored == null) return undefined;\n const candidate = stored.value[providerId];\n if (!isRecord(candidate)) return undefined;\n\n if (candidate.type === 'api') {\n return typeof candidate.key === 'string' && candidate.key.length > 0\n ? { providerId, accessToken: candidate.key }\n : undefined;\n }\n if (candidate.type !== 'oauth') return undefined;\n if (providerId === 'opencode-go') return undefined;\n\n const access = candidate.access;\n const refresh = candidate.refresh;\n const expires = candidate.expires;\n if (\n typeof access !== 'string' ||\n typeof refresh !== 'string' ||\n typeof expires !== 'number'\n ) {\n return undefined;\n }\n\n if (providerId === 'github-copilot') {\n return {\n providerId,\n accessToken: refresh,\n ...(typeof candidate.enterpriseUrl === 'string'\n ? { enterpriseUrl: candidate.enterpriseUrl }\n : {}),\n };\n }\n if (providerId === 'poe') {\n if (isAccessTokenExpiringSoon({ expiresAt: expires })) {\n throw new Error(\n 'OpenCode Poe subscription API key is expiring soon. Run OpenCode login again.',\n );\n }\n return { providerId, accessToken: access };\n }\n\n let accessToken = access;\n let accountId =\n typeof candidate.accountId === 'string'\n ? candidate.accountId\n : providerId === 'openai'\n ? await extractOpenAIAccountId(access)\n : undefined;\n if (isAccessTokenExpiringSoon({ expiresAt: expires })) {\n const refreshSettings = resolveRefreshSettings({\n providerId,\n candidate,\n env,\n });\n const refreshed = await refreshOAuthAccessToken({\n ...refreshSettings,\n refreshToken: refresh,\n ...(fetch == null ? {} : { fetch }),\n });\n accessToken = refreshed.accessToken;\n if (providerId === 'openai') {\n accountId =\n (await extractOpenAIAccountId(refreshed.accessToken)) ?? accountId;\n }\n stored.value[providerId] = {\n ...candidate,\n access: refreshed.accessToken,\n refresh: refreshed.refreshToken ?? refresh,\n expires: refreshed.expiresAt,\n ...(accountId == null ? {} : { accountId }),\n };\n await stored.write?.(stored.value);\n }\n\n return {\n providerId,\n accessToken,\n ...(accountId == null ? {} : { accountId }),\n ...(typeof candidate.enterpriseUrl === 'string'\n ? { enterpriseUrl: candidate.enterpriseUrl }\n : {}),\n };\n}\n\nexport async function requestOpenCodeGitLabDirectAccess({\n accessToken,\n instanceUrl = 'https://gitlab.com',\n aiGatewayUrl = GITLAB_AI_GATEWAY_URL,\n fetch: fetchImplementation = globalThis.fetch,\n}: {\n accessToken: string;\n instanceUrl?: string;\n aiGatewayUrl?: string;\n fetch?: typeof globalThis.fetch;\n}): Promise<OpenCodeGitLabDirectAccess> {\n const response = await fetchImplementation(\n `${instanceUrl.replace(/\\/+$/, '')}/api/v4/ai/third_party_agents/direct_access`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n feature_flags: { DuoAgentPlatformNext: true },\n }),\n },\n );\n if (!response.ok) {\n throw new Error(\n `OpenCode GitLab direct access request failed with status ${response.status}.`,\n );\n }\n\n const parsed = await safeParseJSON({ text: await response.text() });\n if (!parsed.success || !isRecord(parsed.value)) {\n throw new Error('OpenCode GitLab direct access returned invalid JSON.');\n }\n const token = parsed.value.token;\n const headers = parsed.value.headers;\n if (\n typeof token !== 'string' ||\n token.length === 0 ||\n !isRecord(headers) ||\n Object.values(headers).some(value => typeof value !== 'string')\n ) {\n throw new Error(\n 'OpenCode GitLab direct access returned invalid credentials.',\n );\n }\n\n return {\n accessToken: token,\n headers: headers as Record<string, string>,\n aiGatewayUrl: aiGatewayUrl.replace(/\\/+$/, ''),\n };\n}\n\nexport function createOpenCodeGitLabSubscriptionRequestTransformations({\n directAccess,\n sandboxAccessToken,\n}: {\n directAccess: OpenCodeGitLabDirectAccess;\n sandboxAccessToken: string;\n}): HarnessV1RequestTransformation[] {\n const headers = Object.fromEntries(\n Object.entries(directAccess.headers).filter(\n ([name]) =>\n name.toLowerCase() !== 'authorization' &&\n name.toLowerCase() !== 'x-api-key',\n ),\n );\n const transformHeaders = {\n ...headers,\n Authorization: `Bearer ${directAccess.accessToken}`,\n };\n return [\n `${directAccess.aiGatewayUrl}/ai/v1/proxy/anthropic`,\n `${directAccess.aiGatewayUrl}/ai/v1/proxy/openai/v1`,\n ].map(matchUrl =>\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxAccessToken}`,\n },\n transformHeaders,\n }),\n );\n}\n\nexport function createOpenCodeGitLabSubscriptionConfig({\n openCodeConfig,\n sandboxAccessToken,\n aiGatewayUrl,\n headers,\n}: {\n openCodeConfig: Record<string, unknown> | undefined;\n sandboxAccessToken: string;\n aiGatewayUrl: string;\n headers?: Readonly<Record<string, string>>;\n}): Record<string, unknown> {\n const providerOptions = headers == null ? {} : { headers };\n const providers = {\n [GITLAB_ANTHROPIC_PROVIDER_ID]: {\n name: 'GitLab Anthropic',\n npm: '@ai-sdk/anthropic',\n api: `${aiGatewayUrl}/ai/v1/proxy/anthropic/v1`,\n options: { authToken: sandboxAccessToken, ...providerOptions },\n models: createOpenCodeGitLabModels(GITLAB_ANTHROPIC_PROVIDER_ID),\n },\n [GITLAB_OPENAI_CHAT_PROVIDER_ID]: {\n name: 'GitLab OpenAI Chat',\n npm: '@ai-sdk/openai-compatible',\n api: `${aiGatewayUrl}/ai/v1/proxy/openai/v1`,\n options: { apiKey: sandboxAccessToken, ...providerOptions },\n models: createOpenCodeGitLabModels(GITLAB_OPENAI_CHAT_PROVIDER_ID),\n },\n [GITLAB_OPENAI_RESPONSES_PROVIDER_ID]: {\n name: 'GitLab OpenAI Responses',\n npm: '@ai-sdk/openai',\n api: `${aiGatewayUrl}/ai/v1/proxy/openai/v1`,\n options: { apiKey: sandboxAccessToken, ...providerOptions },\n models: createOpenCodeGitLabModels(GITLAB_OPENAI_RESPONSES_PROVIDER_ID),\n },\n };\n const configuredProviders = isRecord(openCodeConfig?.provider)\n ? openCodeConfig.provider\n : {};\n return {\n ...openCodeConfig,\n provider: { ...configuredProviders, ...providers },\n };\n}\n\nexport function resolveOpenCodeGitLabSubscriptionModel({\n model,\n provider,\n}: {\n model: string | undefined;\n provider: string | undefined;\n}): string | undefined {\n if (model == null) {\n if (provider === 'gitlab') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' requires an explicit GitLab model when native GitLab subscription credentials are brokered.\",\n });\n }\n return undefined;\n }\n const modelProvider = model.includes('/') ? model.split('/')[0] : provider;\n if (modelProvider !== 'gitlab') return model;\n const modelId = model.includes('/')\n ? model.slice(model.indexOf('/') + 1)\n : model;\n const mapping: OpenCodeGitLabModel | undefined =\n OPEN_CODE_GITLAB_MODELS[modelId as keyof typeof OPEN_CODE_GITLAB_MODELS];\n if (mapping == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `Harness 'opencode' cannot broker native GitLab subscription credentials for unknown model '${modelId}'.`,\n });\n }\n if (mapping.providerId === 'workflow') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `Harness 'opencode' cannot broker native GitLab subscription credentials for workflow model '${modelId}' because it authenticates over WebSocket. Use a sandbox without credential brokering to use the credential-forwarding fallback.`,\n });\n }\n return `${mapping.providerId}/${modelId}`;\n}\n\nfunction createOpenCodeGitLabModels(\n providerId: Exclude<OpenCodeGitLabModel['providerId'], 'workflow'>,\n): Record<string, { id: string; name: string }> {\n return Object.fromEntries(\n Object.entries(OPEN_CODE_GITLAB_MODELS).flatMap(([id, model]) =>\n model.providerId === providerId\n ? [[id, { id: model.modelId, name: id }]]\n : [],\n ),\n );\n}\n\nexport function createOpenCodeSubscriptionAuthContent({\n authentication,\n accessToken,\n}: {\n authentication: OpenCodeSubscription;\n accessToken: string;\n}): string {\n const { providerId } = authentication;\n const value =\n providerId === 'opencode-go'\n ? { type: 'api', key: accessToken }\n : {\n type: 'oauth',\n access: accessToken,\n refresh:\n providerId === 'github-copilot' ? accessToken : 'host-managed',\n expires: Number.MAX_SAFE_INTEGER,\n ...(authentication.accountId == null\n ? {}\n : { accountId: authentication.accountId }),\n ...(authentication.enterpriseUrl == null\n ? {}\n : { enterpriseUrl: authentication.enterpriseUrl }),\n };\n return JSON.stringify({ [providerId]: value });\n}\n\nexport function createOpenCodeSubscriptionRequestTransformations({\n authentication,\n sandboxAccessToken,\n}: {\n authentication: OpenCodeSubscription;\n sandboxAccessToken: string;\n}): HarnessV1RequestTransformation[] {\n const matchUrl = resolveRequestUrl(authentication);\n const transformHeaders = {\n Authorization: `Bearer ${authentication.accessToken}`,\n ...(authentication.providerId === 'openai' && authentication.accountId\n ? { 'ChatGPT-Account-Id': authentication.accountId }\n : {}),\n };\n const transformations = [\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxAccessToken}`,\n },\n transformHeaders,\n }),\n ];\n if (\n authentication.providerId === 'poe' ||\n authentication.providerId === 'opencode-go'\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: { 'x-api-key': sandboxAccessToken },\n transformHeaders: { 'x-api-key': authentication.accessToken },\n }),\n );\n }\n return transformations;\n}\n\nfunction resolveRefreshSettings({\n providerId,\n candidate,\n env,\n}: {\n providerId: Exclude<\n OpenCodeSubscriptionProvider,\n 'github-copilot' | 'poe' | 'opencode-go'\n >;\n candidate: Record<string, unknown>;\n env: Readonly<Record<string, string | undefined>>;\n}): {\n tokenUrl: string;\n clientId: string;\n} {\n if (providerId === 'openai') {\n return {\n tokenUrl: 'https://auth.openai.com/oauth/token',\n clientId: OPENAI_CLIENT_ID,\n };\n }\n if (providerId === 'xai') {\n return {\n tokenUrl: 'https://auth.x.ai/oauth2/token',\n clientId: XAI_CLIENT_ID,\n };\n }\n const instanceUrl =\n (typeof candidate.enterpriseUrl === 'string'\n ? candidate.enterpriseUrl\n : env.GITLAB_INSTANCE_URL) ?? 'https://gitlab.com';\n return {\n tokenUrl: `${instanceUrl.replace(/\\/+$/, '')}/oauth/token`,\n clientId: env.GITLAB_OAUTH_CLIENT_ID ?? GITLAB_CLIENT_ID,\n };\n}\n\nfunction resolveRequestUrl(authentication: OpenCodeSubscription): string {\n switch (authentication.providerId) {\n case 'openai':\n return 'https://chatgpt.com/backend-api/codex';\n case 'xai':\n return 'https://api.x.ai/v1';\n case 'github-copilot':\n return authentication.enterpriseUrl == null\n ? 'https://api.githubcopilot.com'\n : `https://copilot-api.${normalizeDomain(authentication.enterpriseUrl)}`;\n case 'poe':\n return 'https://api.poe.com';\n case 'opencode-go':\n return 'https://opencode.ai/zen/go/v1';\n case 'gitlab':\n return authentication.enterpriseUrl ?? 'https://gitlab.com';\n }\n}\n\nfunction normalizeDomain(value: string): string {\n try {\n return new URL(value.includes('://') ? value : `https://${value}`).host;\n } catch {\n return value.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n }\n}\n\nasync function extractOpenAIAccountId(\n accessToken: string,\n): Promise<string | undefined> {\n const payload = await parseJwtPayload({ token: accessToken });\n const auth = payload?.['https://api.openai.com/auth'];\n if (!isRecord(auth)) return undefined;\n const accountId = auth.chatgpt_account_id;\n return typeof accountId === 'string' ? accountId : undefined;\n}\n\nasync function readStore({\n env,\n homeDirectory,\n platform,\n}: {\n env: Readonly<Record<string, string | undefined>>;\n homeDirectory: string;\n platform: NodeJS.Platform;\n}): Promise<\n | {\n value: Record<string, unknown>;\n write?: (value: Record<string, unknown>) => Promise<void>;\n }\n | undefined\n> {\n if (env.OPENCODE_AUTH_CONTENT != null) {\n const parsed = await safeParseJSON({ text: env.OPENCODE_AUTH_CONTENT });\n return parsed.success && isRecord(parsed.value)\n ? { value: parsed.value }\n : undefined;\n }\n const authPath =\n env.XDG_DATA_HOME != null\n ? join(env.XDG_DATA_HOME, 'opencode', 'auth.json')\n : isWindows(platform)\n ? join(homeDirectory, '.opencode', 'auth.json')\n : join(homeDirectory, '.local', 'share', 'opencode', 'auth.json');\n const text = await readFile(authPath, 'utf8').catch(() => undefined);\n if (text == null) return undefined;\n const parsed = await safeParseJSON({ text });\n if (!parsed.success || !isRecord(parsed.value)) return undefined;\n return {\n value: parsed.value,\n write: value => writeStore({ authPath, value }),\n };\n}\n\nasync function writeStore({\n authPath,\n value,\n}: {\n authPath: string;\n value: Record<string, unknown>;\n}): Promise<void> {\n await mkdir(dirname(authPath), { recursive: true });\n const temporaryPath = `${authPath}.${process.pid}.tmp`;\n await writeFile(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, {\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, authPath);\n}\n\nfunction isSubscriptionProvider(\n value: string,\n): value is OpenCodeSubscriptionProvider {\n return (\n value === 'openai' ||\n value === 'xai' ||\n value === 'github-copilot' ||\n value === 'poe' ||\n value === 'opencode-go' ||\n value === 'gitlab'\n );\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 skillsChanged: z.boolean().optional(),\n resumeSessionId: z.string().optional(),\n openCodeConfig: z.record(z.string(), z.unknown()).optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n headers: z.record(z.string(), z.string()).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 { OpenCodeAuthenticationMode } from './opencode-auth';\n"],"mappings":"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","names":["HarnessCapabilityUnsupportedError","safeParseJSON","z","createCredentialRequestTransformation","isHarnessAuthenticationEnvironment","isHarnessAuthenticationEnvironment","createCredentialRequestTransformation","parsed","z","HarnessCapabilityUnsupportedError","endpoint","supportsUserMessageResponses","proc","safeParseJSON"]}
1
+ {"version":3,"sources":["../src/opencode-harness.ts","../src/opencode-bootstrap.ts","../src/opencode-auth.ts","../src/opencode-subscription.ts","../src/opencode-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import path from 'node:path';\nimport {\n commonTool,\n HARNESS_V1_BUILTIN_TOOLS,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1MintBridgeTokenCallback,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1ResponseFormat,\n type HarnessV1PortEndpoint,\n type HarnessV1RequestTransformation,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n harnessStateDirectoryPath,\n harnessSessionDataDirectoryPath,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n createSandboxCredentialEnvironment,\n createBridgeToken,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n withBridgeToken,\n writeSkills,\n type SandboxChannelReconnectOptions,\n type WriteSkillsResult,\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 OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\n type OpenCodeAuthenticationMode,\n} from './opencode-auth';\nimport {\n createOpenCodeGitLabSubscriptionConfig,\n createOpenCodeGitLabSubscriptionRequestTransformations,\n createOpenCodeSubscriptionAuthContent,\n createOpenCodeSubscriptionRequestTransformations,\n requestOpenCodeGitLabDirectAccess,\n resolveOpenCodeAuthentication,\n resolveOpenCodeGitLabSubscriptionModel,\n} from './opencode-subscription';\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\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?: OpenCodeAuthenticationMode;\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 * Additional configuration passed through to OpenCode as-is. OpenCode\n * config keys must use their native names. Values managed by this adapter\n * take precedence over conflicting entries.\n */\n readonly openCodeConfig?: Record<string, unknown>;\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 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 * Configures reconnection attempts after an established bridge connection\n * drops. The reconnect window includes connection establishment and\n * backoff delays. Defaults to 30 seconds with exponential backoff from 50\n * milliseconds up to 2 seconds.\n */\n readonly reconnect?: SandboxChannelReconnectOptions;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: HarnessV1MintBridgeTokenCallback;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n askUserQuestions: {\n ...HARNESS_V1_BUILTIN_TOOLS.askUserQuestions,\n nativeName: 'question',\n toolUseKind: 'readonly',\n },\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 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 authentication = await resolveOpenCodeAuthentication({\n auth: settings.auth,\n provider: settings.provider,\n });\n const authenticationMode = authentication.authenticationMode;\n const resolvedAuthEnvironment = authentication.environment;\n let resolvedOpenCodeConfig = settings.openCodeConfig;\n let transformModel:\n | ((model: string | undefined) => string | undefined)\n | undefined;\n let gitLabSubscriptionBrokered = false;\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 transformationSources = {\n env: resolvedAuthEnvironment,\n sandboxEnv: sandboxAuthEnvironment,\n auth: authenticationMode,\n };\n const sandboxSubscriptionAccessToken =\n sandboxAuthEnvironment[\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE\n ];\n let requestTransformations: HarnessV1RequestTransformation[];\n if (\n authentication.subscription?.providerId === 'gitlab' &&\n sandboxSubscriptionAccessToken != null\n ) {\n const directAccess = await requestOpenCodeGitLabDirectAccess({\n accessToken: authentication.subscription.accessToken,\n ...(authentication.subscription.enterpriseUrl == null\n ? {}\n : { instanceUrl: authentication.subscription.enterpriseUrl }),\n ...(process.env.GITLAB_AI_GATEWAY_URL == null\n ? {}\n : { aiGatewayUrl: process.env.GITLAB_AI_GATEWAY_URL }),\n });\n requestTransformations =\n createOpenCodeGitLabSubscriptionRequestTransformations({\n directAccess,\n sandboxAccessToken: sandboxSubscriptionAccessToken,\n });\n resolvedOpenCodeConfig = createOpenCodeGitLabSubscriptionConfig({\n openCodeConfig: settings.openCodeConfig,\n sandboxAccessToken: sandboxSubscriptionAccessToken,\n aiGatewayUrl: directAccess.aiGatewayUrl,\n ...(startOpts.headers == null\n ? {}\n : { headers: startOpts.headers }),\n });\n transformModel = model =>\n resolveOpenCodeGitLabSubscriptionModel({\n model,\n provider: settings.provider,\n });\n gitLabSubscriptionBrokered = true;\n } else {\n requestTransformations =\n authentication.subscription == null ||\n sandboxSubscriptionAccessToken == null\n ? createOpenCodeRequestTransformations(transformationSources)\n : createOpenCodeSubscriptionRequestTransformations({\n authentication: authentication.subscription,\n sandboxAccessToken: sandboxSubscriptionAccessToken,\n });\n }\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n credentialsBrokered = true;\n }\n // Harness SDK state (bootstrap, per-session runs) always lives under\n // the sandbox's own HOME, never the working directory, so it stays\n // out of a user-owned workspace.\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const stateDir = harnessStateDirectoryPath({ sandboxHomeDir });\n const bootstrapDir = path.posix.resolve(stateDir, BOOTSTRAP_DIR);\n\n const workDir = startOpts.sessionWorkDir;\n const skillsDir = path.posix.join(sandboxHomeDir, '.agents', 'skills');\n const sessionDataDir = harnessSessionDataDirectoryPath({\n stateDirectory: stateDir,\n sessionId: startOpts.sessionId,\n });\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\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: ({ abortSignal }) =>\n openWebSocket({\n endpoint: attachEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n abortSignal,\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeConfig: resolvedOpenCodeConfig,\n mcpServers: settings.mcpServers,\n headers: startOpts.headers,\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 sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n transformModel,\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 ? createBridgeToken()\n : settings.mintBridgeToken(sandboxId!);\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 if (!credentialsBrokered) {\n warnCredentialBrokeringUnavailable({\n environment: resolvedAuthEnvironment,\n forwardedEnvironment: forwardedAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n });\n }\n const subscriptionAccessToken =\n forwardedAuthEnvironment[\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE\n ];\n const forwardableAuthEnvironment = Object.fromEntries(\n Object.entries(forwardedAuthEnvironment).filter(\n ([name]) =>\n name !== OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\n ),\n );\n const env = {\n ...forwardableAuthEnvironment,\n ...(gitLabSubscriptionBrokered ||\n authentication.subscription == null ||\n subscriptionAccessToken == null\n ? {}\n : {\n OPENCODE_AUTH_CONTENT: createOpenCodeSubscriptionAuthContent({\n authentication: authentication.subscription,\n accessToken: subscriptionAccessToken,\n }),\n }),\n AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\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)}`,\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)} --skills-dir ${shellQuote(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: ({ abortSignal }) =>\n openWebSocket({\n endpoint: bridgeEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n abortSignal,\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n reconnect: settings.reconnect,\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 provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n openCodeConfig: resolvedOpenCodeConfig,\n mcpServers: settings.mcpServers,\n headers: startOpts.headers,\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 sandbox: toolSafeSandboxSession,\n sandboxHomeDir,\n transformModel,\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\nfunction openWebSocket({\n endpoint,\n helloTimeoutMs,\n abortSignal,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n helloTimeoutMs: number;\n abortSignal: AbortSignal;\n onHello(supportsUserMessageResponses: boolean): void;\n}): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const abortReason = () =>\n abortSignal.reason ?? new Error('WebSocket connection aborted');\n if (abortSignal.aborted) {\n reject(abortReason());\n return;\n }\n\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 let helloTimer: ReturnType<typeof setTimeout> | undefined;\n let onAbort: (() => void) | undefined;\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 if (onAbort != null) {\n abortSignal.removeEventListener('abort', onAbort);\n }\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 const suppressError = () => {};\n const socketWithOnce = ws as WebSocket & {\n once?: (event: string, listener: () => void) => void;\n };\n socketWithOnce.once?.('error', suppressError);\n try {\n ws.terminate();\n } catch {\n try {\n ws.close();\n } catch {\n // best-effort\n }\n }\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 onAbort = () => settle(abortReason());\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n abortSignal.addEventListener('abort', onAbort, { once: true });\n if (abortSignal.aborted) {\n onAbort();\n return;\n }\n 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 createSession({\n sessionId,\n channel,\n proc,\n provider,\n reasoningVariant,\n openCodeConfig,\n mcpServers,\n headers,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n sandboxCredentialEnvironment,\n debug,\n permissionMode,\n builtinToolFiltering,\n sandbox,\n sandboxHomeDir,\n transformModel,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n openCodeConfig: Record<string, unknown> | undefined;\n mcpServers: Record<string, unknown> | undefined;\n headers: Readonly<Record<string, string>> | 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 sandbox: SandboxSession;\n sandboxHomeDir: string;\n transformModel:\n | ((model: string | undefined) => string | undefined)\n | 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 selectedModel: string | 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 ...(input.toolResult !== undefined\n ? { toolResult: input.toolResult }\n : {}),\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 = (turnModel: string | undefined) => ({\n model: transformModel == null ? turnModel : transformModel(turnModel),\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(openCodeConfig == null ? {} : { openCodeConfig }),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(headers == null ? {} : { headers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n const prepareTurn = async (opts: {\n responseFormat?: HarnessV1ResponseFormat;\n skills: ReadonlyArray<HarnessV1Skill>;\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): Promise<{\n control: HarnessV1PromptControl;\n skillWriteResult: WriteSkillsResult;\n }> => {\n if (\n opts.responseFormat?.type === 'json' &&\n opts.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 skillWriteResult = await writeSkills({\n sandbox,\n homePath: sandboxHomeDir,\n skillsDir: '.agents/skills',\n skills: opts.skills,\n abortSignal: opts.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 const control = wireTurn({\n emit: opts.emit,\n abortSignal: opts.abortSignal,\n });\n return { control, skillWriteResult };\n };\n\n return {\n sessionId,\n isResume,\n doPromptTurn: async promptOpts => {\n const { control, skillWriteResult } = await prepareTurn(promptOpts);\n const turnModel = promptOpts.model ?? selectedModel;\n if (turnModel) selectedModel = turnModel;\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 skillsChanged: skillWriteResult.changed,\n ...startBase(turnModel),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n const { control, skillWriteResult } = await prepareTurn(continueOpts);\n if (rerunContinue) {\n const turnModel = continueOpts.model ?? selectedModel;\n if (turnModel) selectedModel = turnModel;\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 skillsChanged: skillWriteResult.changed,\n ...startBase(turnModel),\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 transformModel == null\n ? selectedModel\n : transformModel(selectedModel),\n provider,\n permissionMode,\n debug,\n openCodeConfig,\n mcpServers,\n headers,\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 openCodeConfig,\n mcpServers,\n headers,\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 openCodeConfig: Record<string, unknown> | undefined;\n mcpServers: Record<string, unknown> | undefined;\n headers: Readonly<Record<string, string>> | 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 ...(openCodeConfig == null ? {} : { openCodeConfig }),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(headers == null ? {} : { headers }),\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 type { HarnessV1Bootstrap } from '@ai-sdk/harness';\nimport { createReadBridgeAsset } from '@ai-sdk/harness/utils';\n\n/*\n * Keep every asset URL literal so bundlers can emit each file separately.\n * Dynamic new URL() paths can collapse multiple assets into one resolution.\n */\nconst readBridgeAsset = createReadBridgeAsset({\n 'package.json': new URL('./bridge/package.json', import.meta.url),\n 'pnpm-lock.yaml': new URL('./bridge/pnpm-lock.yaml', import.meta.url),\n 'pnpm-workspace.yaml': new URL(\n './bridge/pnpm-workspace.yaml',\n import.meta.url,\n ),\n 'index.mjs': new URL('./bridge/index.mjs', import.meta.url),\n 'host-tool-mcp.mjs': new URL('./bridge/host-tool-mcp.mjs', import.meta.url),\n});\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","import type {\n HarnessV1Authentication,\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n isHarnessAuthenticationEnvironment,\n} from '@ai-sdk/harness/utils';\n\nexport const OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE =\n 'AI_SDK_OPENCODE_NATIVE_ACCESS_TOKEN';\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 'GOOGLE_GENERATIVE_AI_API_KEY',\n 'XAI_API_KEY',\n 'GITHUB_TOKEN',\n 'GITHUB_COPILOT_TOKEN',\n 'POE_API_KEY',\n 'OPENCODE_API_KEY',\n 'GITLAB_TOKEN',\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\n] as const;\n\nconst NON_GOOGLE_DIRECT_CREDENTIAL_ENVIRONMENT_VARIABLES = [\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n 'XAI_API_KEY',\n 'GITHUB_TOKEN',\n 'GITHUB_COPILOT_TOKEN',\n 'POE_API_KEY',\n 'OPENCODE_API_KEY',\n 'GITLAB_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 case 'google':\n return environment.GOOGLE_GENERATIVE_AI_API_KEY &&\n sandboxEnvironment.GOOGLE_GENERATIVE_AI_API_KEY\n ? [\n createCredentialRequestTransformation({\n matchUrl: 'https://generativelanguage.googleapis.com',\n matchHeaders: {\n 'x-goog-api-key':\n sandboxEnvironment.GOOGLE_GENERATIVE_AI_API_KEY,\n },\n transformHeaders: {\n 'x-goog-api-key': environment.GOOGLE_GENERATIVE_AI_API_KEY,\n },\n }),\n ]\n : [];\n case 'xai':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'XAI_API_KEY',\n matchUrl: environment.XAI_BASE_URL ?? 'https://api.x.ai/v1',\n });\n case 'github-copilot':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName:\n environment.GITHUB_COPILOT_TOKEN != null\n ? 'GITHUB_COPILOT_TOKEN'\n : 'GITHUB_TOKEN',\n matchUrl: 'https://api.githubcopilot.com',\n });\n case 'poe':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'POE_API_KEY',\n matchUrl: 'https://api.poe.com',\n });\n case 'opencode-go':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'OPENCODE_API_KEY',\n matchUrl: 'https://opencode.ai/zen/go/v1',\n });\n case 'gitlab':\n return createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName: 'GITLAB_TOKEN',\n matchUrl: environment.GITLAB_INSTANCE_URL ?? 'https://gitlab.com',\n });\n }\n}\n\nexport type OpenCodeResolvedAuthenticationMode =\n | 'anthropic'\n | 'openai'\n | 'google'\n | 'xai'\n | 'github-copilot'\n | 'poe'\n | 'opencode-go'\n | 'gitlab'\n | 'ai-gateway';\n\nexport type OpenCodeAuthenticationMode = HarnessV1Authentication<\n 'anthropic' | 'openai'\n>;\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'> {\n if (isDirectProvider(provider)) {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (isDirectProvider(modelProvider)) {\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: OpenCodeAuthenticationMode | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const suppliedEnvironment = isHarnessAuthenticationEnvironment(auth);\n const authenticationEnvironment = suppliedEnvironment ? auth : processEnv;\n const selectedProvider = resolveOpenCodeAuthenticationProvider({\n auth,\n model,\n provider,\n environment: authenticationEnvironment,\n });\n if (\n (selectedProvider === 'openai' && auth === 'openai') ||\n (selectedProvider === 'anthropic' && auth === 'anthropic')\n ) {\n return pickDirectProvider({\n provider: selectedProvider,\n processEnv: authenticationEnvironment,\n });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({\n env: authenticationEnvironment,\n });\n if (auth === 'ai-gateway' || gatewayAuthFromEnv.apiKey) {\n return pickGateway({ gatewayAuthFromEnv });\n }\n return pickDirectProvider({\n provider: selectedProvider,\n processEnv: authenticationEnvironment,\n });\n}\n\nexport function resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthenticationMode | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): OpenCodeResolvedAuthenticationMode {\n if (isHarnessAuthenticationEnvironment(auth)) {\n return getAiGatewayAuthFromEnv({ env: auth }).apiKey\n ? 'ai-gateway'\n : resolveOpenCodeAuthenticationProvider({\n auth,\n model,\n provider,\n environment: auth,\n });\n }\n const selectedProvider = resolveOpenCodeAuthenticationProvider({\n auth,\n model,\n provider,\n environment: processEnv,\n });\n if (selectedProvider === 'openai' && auth === 'openai') {\n return 'openai';\n }\n if (selectedProvider === 'anthropic' && auth === 'anthropic') {\n return 'anthropic';\n }\n if (auth === 'ai-gateway') {\n return 'ai-gateway';\n }\n if (getAiGatewayAuthFromEnv({ env: processEnv }).apiKey) {\n return 'ai-gateway';\n }\n return selectedProvider;\n}\n\nfunction resolveOpenCodeAuthenticationProvider({\n auth,\n model,\n provider,\n environment,\n}: {\n auth: OpenCodeAuthenticationMode | undefined;\n model?: string;\n provider?: string;\n environment: Record<string, string | undefined>;\n}): Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'> {\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (\n model == null &&\n provider == null &&\n (auth === 'anthropic' || auth === 'openai')\n ) {\n return auth;\n }\n return model == null &&\n provider == null &&\n (environment.GOOGLE_GENERATIVE_AI_API_KEY?.length ?? 0) > 0 &&\n !NON_GOOGLE_DIRECT_CREDENTIAL_ENVIRONMENT_VARIABLES.some(\n name => (environment[name]?.length ?? 0) > 0,\n )\n ? 'google'\n : selectedProvider;\n}\n\nfunction pickOpenAI({\n processEnv,\n}: {\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n processEnv,\n}: {\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickDirectProvider({\n provider,\n processEnv,\n}: {\n provider: Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n if (provider === 'openai') return pickOpenAI({ processEnv });\n if (provider === 'anthropic') return pickAnthropic({ processEnv });\n const names =\n provider === 'google'\n ? ['GOOGLE_GENERATIVE_AI_API_KEY']\n : provider === 'xai'\n ? ['XAI_API_KEY', 'XAI_BASE_URL']\n : provider === 'github-copilot'\n ? ['GITHUB_COPILOT_TOKEN', 'GITHUB_TOKEN']\n : provider === 'poe'\n ? ['POE_API_KEY']\n : provider === 'opencode-go'\n ? ['OPENCODE_API_KEY']\n : ['GITLAB_TOKEN', 'GITLAB_INSTANCE_URL'];\n return Object.fromEntries(\n names.flatMap(name =>\n processEnv[name] == null ? [] : [[name, processEnv[name]!]],\n ),\n );\n}\n\nexport function hasOpenCodeCredential({\n environment,\n authenticationMode,\n}: {\n environment: Record<string, string>;\n authenticationMode: OpenCodeResolvedAuthenticationMode;\n}): boolean {\n if (authenticationMode === 'ai-gateway') {\n return environment.AI_GATEWAY_API_KEY != null;\n }\n return Object.keys(environment).some(\n name =>\n name.endsWith('_API_KEY') ||\n name.endsWith('_TOKEN') ||\n name === 'ANTHROPIC_AUTH_TOKEN',\n );\n}\n\nfunction createBearerTransformation({\n environment,\n sandboxEnvironment,\n environmentVariableName,\n matchUrl,\n}: {\n environment: Readonly<Record<string, string>>;\n sandboxEnvironment: Readonly<Record<string, string>>;\n environmentVariableName: string;\n matchUrl: string;\n}): HarnessV1RequestTransformation[] {\n const credential = environment[environmentVariableName];\n const sandboxCredential = sandboxEnvironment[environmentVariableName];\n return credential == null || sandboxCredential == null\n ? []\n : [\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxCredential}`,\n },\n transformHeaders: { Authorization: `Bearer ${credential}` },\n }),\n ];\n}\n\nfunction isDirectProvider(\n value: string | undefined,\n): value is Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'> {\n return (\n value === 'anthropic' ||\n value === 'openai' ||\n value === 'google' ||\n value === 'xai' ||\n value === 'github-copilot' ||\n value === 'poe' ||\n value === 'opencode-go' ||\n value === 'gitlab'\n );\n}\n\nfunction pickGateway({\n gatewayAuthFromEnv,\n}: {\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n const baseUrl = toOpenCodeGatewayBaseUrl(gatewayAuthFromEnv.baseUrl);\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 { chmod, mkdir, readFile, rename, writeFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport {\n HarnessCapabilityUnsupportedError,\n type HarnessV1RequestTransformation,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n isAccessTokenExpiringSoon,\n isHarnessAuthenticationEnvironment,\n isWindows,\n parseJwtPayload,\n refreshOAuthAccessToken,\n} from '@ai-sdk/harness/utils';\nimport { isRecord, safeParseJSON } from '@ai-sdk/provider-utils';\nimport {\n hasOpenCodeCredential,\n OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,\n resolveOpenCodeAuthenticationMode,\n resolveOpenCodeEnv,\n type OpenCodeAuthenticationMode,\n type OpenCodeResolvedAuthenticationMode,\n} from './opencode-auth';\n\nconst OPENAI_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst XAI_CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828';\nconst GITLAB_CLIENT_ID =\n '1d89f9fdb23ee96d4e603201f6861dab6e143c5c3c00469a018a2d94bdc03d4e';\nconst GITLAB_AI_GATEWAY_URL = 'https://cloud.gitlab.com';\nconst GITLAB_ANTHROPIC_PROVIDER_ID = 'ai-sdk-gitlab-anthropic';\nconst GITLAB_OPENAI_CHAT_PROVIDER_ID = 'ai-sdk-gitlab-openai-chat';\nconst GITLAB_OPENAI_RESPONSES_PROVIDER_ID = 'ai-sdk-gitlab-openai-responses';\n\ntype OpenCodeGitLabModel = {\n readonly providerId:\n | typeof GITLAB_ANTHROPIC_PROVIDER_ID\n | typeof GITLAB_OPENAI_CHAT_PROVIDER_ID\n | typeof GITLAB_OPENAI_RESPONSES_PROVIDER_ID\n | 'workflow';\n readonly modelId: string;\n};\n\nconst OPEN_CODE_GITLAB_MODELS = {\n 'duo-chat-fable-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-fable-5',\n },\n 'duo-chat-opus-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-5',\n },\n 'duo-chat-opus-4-8': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-8',\n },\n 'duo-chat-opus-4-7': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-7',\n },\n 'duo-chat-opus-4-6': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-6',\n },\n 'duo-chat-sonnet-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-sonnet-5',\n },\n 'duo-chat-sonnet-4-6': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-sonnet-4-6',\n },\n 'duo-chat-opus-4-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-opus-4-5-20251101',\n },\n 'duo-chat-sonnet-4-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-sonnet-4-5-20250929',\n },\n 'duo-chat-haiku-4-5': {\n providerId: GITLAB_ANTHROPIC_PROVIDER_ID,\n modelId: 'claude-haiku-4-5-20251001',\n },\n 'duo-chat-gpt-5-1': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.1-2025-11-13',\n },\n 'duo-chat-gpt-5-2': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.2-2025-12-11',\n },\n 'duo-chat-gpt-5-4': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.4-2026-03-05',\n },\n 'duo-chat-gpt-5-5': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.5-2026-04-23',\n },\n 'duo-chat-gpt-5-mini': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5-mini-2025-08-07',\n },\n 'duo-chat-gpt-5-4-mini': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.4-mini',\n },\n 'duo-chat-gpt-5-4-nano': {\n providerId: GITLAB_OPENAI_CHAT_PROVIDER_ID,\n modelId: 'gpt-5.4-nano',\n },\n 'duo-chat-gpt-5-6-sol': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.6-sol',\n },\n 'duo-chat-gpt-5-6-terra': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.6-terra',\n },\n 'duo-chat-gpt-5-6-luna': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.6-luna',\n },\n 'duo-chat-gpt-5-codex': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5-codex',\n },\n 'duo-chat-gpt-5-2-codex': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.2-codex',\n },\n 'duo-chat-gpt-5-3-codex': {\n providerId: GITLAB_OPENAI_RESPONSES_PROVIDER_ID,\n modelId: 'gpt-5.3-codex',\n },\n 'duo-workflow': { providerId: 'workflow', modelId: 'default' },\n 'duo-workflow-default': { providerId: 'workflow', modelId: 'default' },\n 'duo-workflow-sonnet-4-5': {\n providerId: 'workflow',\n modelId: 'anthropic/claude-sonnet-4-5-20250929',\n },\n 'duo-workflow-sonnet-5': {\n providerId: 'workflow',\n modelId: 'claude_sonnet_5',\n },\n 'duo-workflow-opus-5': {\n providerId: 'workflow',\n modelId: 'claude_opus_5',\n },\n 'duo-workflow-sonnet-4-6': {\n providerId: 'workflow',\n modelId: 'claude_sonnet_4_6',\n },\n 'duo-workflow-opus-4-5': {\n providerId: 'workflow',\n modelId: 'anthropic/claude-opus-4-5-20251101',\n },\n 'duo-workflow-haiku-4-5': {\n providerId: 'workflow',\n modelId: 'claude_haiku_4_5_20251001',\n },\n 'duo-workflow-opus-4-6': {\n providerId: 'workflow',\n modelId: 'claude_opus_4_6_20260205',\n },\n} as const satisfies Record<string, OpenCodeGitLabModel>;\n\nexport type OpenCodeSubscriptionProvider =\n | 'openai'\n | 'xai'\n | 'github-copilot'\n | 'poe'\n | 'opencode-go'\n | 'gitlab';\n\nexport type OpenCodeSubscription = {\n readonly providerId: OpenCodeSubscriptionProvider;\n readonly accessToken: string;\n readonly accountId?: string;\n readonly enterpriseUrl?: string;\n};\n\nexport type OpenCodeGitLabDirectAccess = {\n readonly accessToken: string;\n readonly headers: Readonly<Record<string, string>>;\n readonly aiGatewayUrl: string;\n};\n\nexport async function resolveOpenCodeAuthentication({\n auth,\n model,\n provider,\n processEnv = process.env,\n readSubscription = readOpenCodeSubscription,\n}: {\n auth: OpenCodeAuthenticationMode | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n readSubscription?: typeof readOpenCodeSubscription;\n}): Promise<{\n environment: Record<string, string>;\n authenticationMode: OpenCodeResolvedAuthenticationMode;\n subscription?: OpenCodeSubscription;\n}> {\n const environment = resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv,\n });\n const authenticationMode = resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv,\n });\n if (\n isHarnessAuthenticationEnvironment(auth) ||\n auth === 'ai-gateway' ||\n authenticationMode === 'ai-gateway' ||\n hasOpenCodeCredential({ environment, authenticationMode })\n ) {\n return { environment, authenticationMode };\n }\n const subscription = await readSubscription({\n providerId: authenticationMode,\n env: processEnv,\n });\n return subscription == null\n ? { environment, authenticationMode }\n : {\n environment: {\n ...environment,\n [OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE]:\n subscription.accessToken,\n },\n authenticationMode,\n subscription,\n };\n}\n\nexport async function readOpenCodeSubscription({\n providerId,\n env = process.env,\n homeDirectory = homedir(),\n platform = process.platform,\n fetch,\n}: {\n providerId: string;\n env?: Readonly<Record<string, string | undefined>>;\n homeDirectory?: string;\n platform?: NodeJS.Platform;\n fetch?: typeof globalThis.fetch;\n}): Promise<OpenCodeSubscription | undefined> {\n if (!isSubscriptionProvider(providerId)) return undefined;\n const stored = await readStore({ env, homeDirectory, platform });\n if (stored == null) return undefined;\n const candidate = stored.value[providerId];\n if (!isRecord(candidate)) return undefined;\n\n if (candidate.type === 'api') {\n return typeof candidate.key === 'string' && candidate.key.length > 0\n ? { providerId, accessToken: candidate.key }\n : undefined;\n }\n if (candidate.type !== 'oauth') return undefined;\n if (providerId === 'opencode-go') return undefined;\n\n const access = candidate.access;\n const refresh = candidate.refresh;\n const expires = candidate.expires;\n if (\n typeof access !== 'string' ||\n typeof refresh !== 'string' ||\n typeof expires !== 'number'\n ) {\n return undefined;\n }\n\n if (providerId === 'github-copilot') {\n return {\n providerId,\n accessToken: refresh,\n ...(typeof candidate.enterpriseUrl === 'string'\n ? { enterpriseUrl: candidate.enterpriseUrl }\n : {}),\n };\n }\n if (providerId === 'poe') {\n if (isAccessTokenExpiringSoon({ expiresAt: expires })) {\n throw new Error(\n 'OpenCode Poe subscription API key is expiring soon. Run OpenCode login again.',\n );\n }\n return { providerId, accessToken: access };\n }\n\n let accessToken = access;\n let accountId =\n typeof candidate.accountId === 'string'\n ? candidate.accountId\n : providerId === 'openai'\n ? await extractOpenAIAccountId(access)\n : undefined;\n if (isAccessTokenExpiringSoon({ expiresAt: expires })) {\n const refreshSettings = resolveRefreshSettings({\n providerId,\n candidate,\n env,\n });\n const refreshed = await refreshOAuthAccessToken({\n ...refreshSettings,\n refreshToken: refresh,\n ...(fetch == null ? {} : { fetch }),\n });\n accessToken = refreshed.accessToken;\n if (providerId === 'openai') {\n accountId =\n (await extractOpenAIAccountId(refreshed.accessToken)) ?? accountId;\n }\n stored.value[providerId] = {\n ...candidate,\n access: refreshed.accessToken,\n refresh: refreshed.refreshToken ?? refresh,\n expires: refreshed.expiresAt,\n ...(accountId == null ? {} : { accountId }),\n };\n await stored.write?.(stored.value);\n }\n\n return {\n providerId,\n accessToken,\n ...(accountId == null ? {} : { accountId }),\n ...(typeof candidate.enterpriseUrl === 'string'\n ? { enterpriseUrl: candidate.enterpriseUrl }\n : {}),\n };\n}\n\nexport async function requestOpenCodeGitLabDirectAccess({\n accessToken,\n instanceUrl = 'https://gitlab.com',\n aiGatewayUrl = GITLAB_AI_GATEWAY_URL,\n fetch: fetchImplementation = globalThis.fetch,\n}: {\n accessToken: string;\n instanceUrl?: string;\n aiGatewayUrl?: string;\n fetch?: typeof globalThis.fetch;\n}): Promise<OpenCodeGitLabDirectAccess> {\n const response = await fetchImplementation(\n `${instanceUrl.replace(/\\/+$/, '')}/api/v4/ai/third_party_agents/direct_access`,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n feature_flags: { DuoAgentPlatformNext: true },\n }),\n },\n );\n if (!response.ok) {\n throw new Error(\n `OpenCode GitLab direct access request failed with status ${response.status}.`,\n );\n }\n\n const parsed = await safeParseJSON({ text: await response.text() });\n if (!parsed.success || !isRecord(parsed.value)) {\n throw new Error('OpenCode GitLab direct access returned invalid JSON.');\n }\n const token = parsed.value.token;\n const headers = parsed.value.headers;\n if (\n typeof token !== 'string' ||\n token.length === 0 ||\n !isRecord(headers) ||\n Object.values(headers).some(value => typeof value !== 'string')\n ) {\n throw new Error(\n 'OpenCode GitLab direct access returned invalid credentials.',\n );\n }\n\n return {\n accessToken: token,\n headers: headers as Record<string, string>,\n aiGatewayUrl: aiGatewayUrl.replace(/\\/+$/, ''),\n };\n}\n\nexport function createOpenCodeGitLabSubscriptionRequestTransformations({\n directAccess,\n sandboxAccessToken,\n}: {\n directAccess: OpenCodeGitLabDirectAccess;\n sandboxAccessToken: string;\n}): HarnessV1RequestTransformation[] {\n const headers = Object.fromEntries(\n Object.entries(directAccess.headers).filter(\n ([name]) =>\n name.toLowerCase() !== 'authorization' &&\n name.toLowerCase() !== 'x-api-key',\n ),\n );\n const transformHeaders = {\n ...headers,\n Authorization: `Bearer ${directAccess.accessToken}`,\n };\n return [\n `${directAccess.aiGatewayUrl}/ai/v1/proxy/anthropic`,\n `${directAccess.aiGatewayUrl}/ai/v1/proxy/openai/v1`,\n ].map(matchUrl =>\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxAccessToken}`,\n },\n transformHeaders,\n }),\n );\n}\n\nexport function createOpenCodeGitLabSubscriptionConfig({\n openCodeConfig,\n sandboxAccessToken,\n aiGatewayUrl,\n headers,\n}: {\n openCodeConfig: Record<string, unknown> | undefined;\n sandboxAccessToken: string;\n aiGatewayUrl: string;\n headers?: Readonly<Record<string, string>>;\n}): Record<string, unknown> {\n const providerOptions = headers == null ? {} : { headers };\n const providers = {\n [GITLAB_ANTHROPIC_PROVIDER_ID]: {\n name: 'GitLab Anthropic',\n npm: '@ai-sdk/anthropic',\n api: `${aiGatewayUrl}/ai/v1/proxy/anthropic/v1`,\n options: { authToken: sandboxAccessToken, ...providerOptions },\n models: createOpenCodeGitLabModels(GITLAB_ANTHROPIC_PROVIDER_ID),\n },\n [GITLAB_OPENAI_CHAT_PROVIDER_ID]: {\n name: 'GitLab OpenAI Chat',\n npm: '@ai-sdk/openai-compatible',\n api: `${aiGatewayUrl}/ai/v1/proxy/openai/v1`,\n options: { apiKey: sandboxAccessToken, ...providerOptions },\n models: createOpenCodeGitLabModels(GITLAB_OPENAI_CHAT_PROVIDER_ID),\n },\n [GITLAB_OPENAI_RESPONSES_PROVIDER_ID]: {\n name: 'GitLab OpenAI Responses',\n npm: '@ai-sdk/openai',\n api: `${aiGatewayUrl}/ai/v1/proxy/openai/v1`,\n options: { apiKey: sandboxAccessToken, ...providerOptions },\n models: createOpenCodeGitLabModels(GITLAB_OPENAI_RESPONSES_PROVIDER_ID),\n },\n };\n const configuredProviders = isRecord(openCodeConfig?.provider)\n ? openCodeConfig.provider\n : {};\n return {\n ...openCodeConfig,\n provider: { ...configuredProviders, ...providers },\n };\n}\n\nexport function resolveOpenCodeGitLabSubscriptionModel({\n model,\n provider,\n}: {\n model: string | undefined;\n provider: string | undefined;\n}): string | undefined {\n if (model == null) {\n if (provider === 'gitlab') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' requires an explicit GitLab model when native GitLab subscription credentials are brokered.\",\n });\n }\n return undefined;\n }\n const modelProvider = model.includes('/') ? model.split('/')[0] : provider;\n if (modelProvider !== 'gitlab') return model;\n const modelId = model.includes('/')\n ? model.slice(model.indexOf('/') + 1)\n : model;\n const mapping: OpenCodeGitLabModel | undefined =\n OPEN_CODE_GITLAB_MODELS[modelId as keyof typeof OPEN_CODE_GITLAB_MODELS];\n if (mapping == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `Harness 'opencode' cannot broker native GitLab subscription credentials for unknown model '${modelId}'.`,\n });\n }\n if (mapping.providerId === 'workflow') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `Harness 'opencode' cannot broker native GitLab subscription credentials for workflow model '${modelId}' because it authenticates over WebSocket. Use a sandbox without credential brokering to use the credential-forwarding fallback.`,\n });\n }\n return `${mapping.providerId}/${modelId}`;\n}\n\nfunction createOpenCodeGitLabModels(\n providerId: Exclude<OpenCodeGitLabModel['providerId'], 'workflow'>,\n): Record<string, { id: string; name: string }> {\n return Object.fromEntries(\n Object.entries(OPEN_CODE_GITLAB_MODELS).flatMap(([id, model]) =>\n model.providerId === providerId\n ? [[id, { id: model.modelId, name: id }]]\n : [],\n ),\n );\n}\n\nexport function createOpenCodeSubscriptionAuthContent({\n authentication,\n accessToken,\n}: {\n authentication: OpenCodeSubscription;\n accessToken: string;\n}): string {\n const { providerId } = authentication;\n const value =\n providerId === 'opencode-go'\n ? { type: 'api', key: accessToken }\n : {\n type: 'oauth',\n access: accessToken,\n refresh:\n providerId === 'github-copilot' ? accessToken : 'host-managed',\n expires: Number.MAX_SAFE_INTEGER,\n ...(authentication.accountId == null\n ? {}\n : { accountId: authentication.accountId }),\n ...(authentication.enterpriseUrl == null\n ? {}\n : { enterpriseUrl: authentication.enterpriseUrl }),\n };\n return JSON.stringify({ [providerId]: value });\n}\n\nexport function createOpenCodeSubscriptionRequestTransformations({\n authentication,\n sandboxAccessToken,\n}: {\n authentication: OpenCodeSubscription;\n sandboxAccessToken: string;\n}): HarnessV1RequestTransformation[] {\n const matchUrl = resolveRequestUrl(authentication);\n const transformHeaders = {\n Authorization: `Bearer ${authentication.accessToken}`,\n ...(authentication.providerId === 'openai' && authentication.accountId\n ? { 'ChatGPT-Account-Id': authentication.accountId }\n : {}),\n };\n const transformations = [\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxAccessToken}`,\n },\n transformHeaders,\n }),\n ];\n if (\n authentication.providerId === 'poe' ||\n authentication.providerId === 'opencode-go'\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: { 'x-api-key': sandboxAccessToken },\n transformHeaders: { 'x-api-key': authentication.accessToken },\n }),\n );\n }\n return transformations;\n}\n\nfunction resolveRefreshSettings({\n providerId,\n candidate,\n env,\n}: {\n providerId: Exclude<\n OpenCodeSubscriptionProvider,\n 'github-copilot' | 'poe' | 'opencode-go'\n >;\n candidate: Record<string, unknown>;\n env: Readonly<Record<string, string | undefined>>;\n}): {\n tokenUrl: string;\n clientId: string;\n} {\n if (providerId === 'openai') {\n return {\n tokenUrl: 'https://auth.openai.com/oauth/token',\n clientId: OPENAI_CLIENT_ID,\n };\n }\n if (providerId === 'xai') {\n return {\n tokenUrl: 'https://auth.x.ai/oauth2/token',\n clientId: XAI_CLIENT_ID,\n };\n }\n const instanceUrl =\n (typeof candidate.enterpriseUrl === 'string'\n ? candidate.enterpriseUrl\n : env.GITLAB_INSTANCE_URL) ?? 'https://gitlab.com';\n return {\n tokenUrl: `${instanceUrl.replace(/\\/+$/, '')}/oauth/token`,\n clientId: env.GITLAB_OAUTH_CLIENT_ID ?? GITLAB_CLIENT_ID,\n };\n}\n\nfunction resolveRequestUrl(authentication: OpenCodeSubscription): string {\n switch (authentication.providerId) {\n case 'openai':\n return 'https://chatgpt.com/backend-api/codex';\n case 'xai':\n return 'https://api.x.ai/v1';\n case 'github-copilot':\n return authentication.enterpriseUrl == null\n ? 'https://api.githubcopilot.com'\n : `https://copilot-api.${normalizeDomain(authentication.enterpriseUrl)}`;\n case 'poe':\n return 'https://api.poe.com';\n case 'opencode-go':\n return 'https://opencode.ai/zen/go/v1';\n case 'gitlab':\n return authentication.enterpriseUrl ?? 'https://gitlab.com';\n }\n}\n\nfunction normalizeDomain(value: string): string {\n try {\n return new URL(value.includes('://') ? value : `https://${value}`).host;\n } catch {\n return value.replace(/^https?:\\/\\//, '').replace(/\\/+$/, '');\n }\n}\n\nasync function extractOpenAIAccountId(\n accessToken: string,\n): Promise<string | undefined> {\n const payload = await parseJwtPayload({ token: accessToken });\n const auth = payload?.['https://api.openai.com/auth'];\n if (!isRecord(auth)) return undefined;\n const accountId = auth.chatgpt_account_id;\n return typeof accountId === 'string' ? accountId : undefined;\n}\n\nasync function readStore({\n env,\n homeDirectory,\n platform,\n}: {\n env: Readonly<Record<string, string | undefined>>;\n homeDirectory: string;\n platform: NodeJS.Platform;\n}): Promise<\n | {\n value: Record<string, unknown>;\n write?: (value: Record<string, unknown>) => Promise<void>;\n }\n | undefined\n> {\n if (env.OPENCODE_AUTH_CONTENT != null) {\n const parsed = await safeParseJSON({ text: env.OPENCODE_AUTH_CONTENT });\n return parsed.success && isRecord(parsed.value)\n ? { value: parsed.value }\n : undefined;\n }\n const authPath =\n env.XDG_DATA_HOME != null\n ? join(env.XDG_DATA_HOME, 'opencode', 'auth.json')\n : isWindows(platform)\n ? join(homeDirectory, '.opencode', 'auth.json')\n : join(homeDirectory, '.local', 'share', 'opencode', 'auth.json');\n const text = await readFile(authPath, 'utf8').catch(() => undefined);\n if (text == null) return undefined;\n const parsed = await safeParseJSON({ text });\n if (!parsed.success || !isRecord(parsed.value)) return undefined;\n return {\n value: parsed.value,\n write: value => writeStore({ authPath, value }),\n };\n}\n\nasync function writeStore({\n authPath,\n value,\n}: {\n authPath: string;\n value: Record<string, unknown>;\n}): Promise<void> {\n await mkdir(dirname(authPath), { recursive: true });\n const temporaryPath = `${authPath}.${process.pid}.tmp`;\n await writeFile(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, {\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, authPath);\n}\n\nfunction isSubscriptionProvider(\n value: string,\n): value is OpenCodeSubscriptionProvider {\n return (\n value === 'openai' ||\n value === 'xai' ||\n value === 'github-copilot' ||\n value === 'poe' ||\n value === 'opencode-go' ||\n value === 'gitlab'\n );\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 skillsChanged: z.boolean().optional(),\n resumeSessionId: z.string().optional(),\n openCodeConfig: z.record(z.string(), z.unknown()).optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n headers: z.record(z.string(), z.string()).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 { OpenCodeAuthenticationMode } from './opencode-auth';\n"],"mappings":"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","names":["HarnessCapabilityUnsupportedError","safeParseJSON","z","createCredentialRequestTransformation","isHarnessAuthenticationEnvironment","isHarnessAuthenticationEnvironment","createCredentialRequestTransformation","parsed","z","HarnessCapabilityUnsupportedError","endpoint","supportsUserMessageResponses","proc","safeParseJSON"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/harness-opencode",
3
- "version": "1.0.129",
3
+ "version": "1.0.131",
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.127",
30
- "@ai-sdk/provider-utils": "5.0.49",
29
+ "@ai-sdk/harness": "1.0.129",
30
+ "@ai-sdk/provider-utils": "5.0.50",
31
31
  "ws": "8.21.0"
32
32
  },
33
33
  "peerDependencies": {
@@ -17,6 +17,7 @@ export const OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [
17
17
  'OPENAI_API_KEY',
18
18
  'ANTHROPIC_API_KEY',
19
19
  'ANTHROPIC_AUTH_TOKEN',
20
+ 'GOOGLE_GENERATIVE_AI_API_KEY',
20
21
  'XAI_API_KEY',
21
22
  'GITHUB_TOKEN',
22
23
  'GITHUB_COPILOT_TOKEN',
@@ -26,6 +27,18 @@ export const OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [
26
27
  OPENCODE_SUBSCRIPTION_ACCESS_TOKEN_ENVIRONMENT_VARIABLE,
27
28
  ] as const;
28
29
 
30
+ const NON_GOOGLE_DIRECT_CREDENTIAL_ENVIRONMENT_VARIABLES = [
31
+ 'OPENAI_API_KEY',
32
+ 'ANTHROPIC_API_KEY',
33
+ 'ANTHROPIC_AUTH_TOKEN',
34
+ 'XAI_API_KEY',
35
+ 'GITHUB_TOKEN',
36
+ 'GITHUB_COPILOT_TOKEN',
37
+ 'POE_API_KEY',
38
+ 'OPENCODE_API_KEY',
39
+ 'GITLAB_TOKEN',
40
+ ] as const;
41
+
29
42
  export function createOpenCodeRequestTransformations({
30
43
  env: environment,
31
44
  sandboxEnv: sandboxEnvironment,
@@ -112,6 +125,22 @@ export function createOpenCodeRequestTransformations({
112
125
 
113
126
  return transformations;
114
127
  }
128
+ case 'google':
129
+ return environment.GOOGLE_GENERATIVE_AI_API_KEY &&
130
+ sandboxEnvironment.GOOGLE_GENERATIVE_AI_API_KEY
131
+ ? [
132
+ createCredentialRequestTransformation({
133
+ matchUrl: 'https://generativelanguage.googleapis.com',
134
+ matchHeaders: {
135
+ 'x-goog-api-key':
136
+ sandboxEnvironment.GOOGLE_GENERATIVE_AI_API_KEY,
137
+ },
138
+ transformHeaders: {
139
+ 'x-goog-api-key': environment.GOOGLE_GENERATIVE_AI_API_KEY,
140
+ },
141
+ }),
142
+ ]
143
+ : [];
115
144
  case 'xai':
116
145
  return createBearerTransformation({
117
146
  environment,
@@ -156,6 +185,7 @@ export function createOpenCodeRequestTransformations({
156
185
  export type OpenCodeResolvedAuthenticationMode =
157
186
  | 'anthropic'
158
187
  | 'openai'
188
+ | 'google'
159
189
  | 'xai'
160
190
  | 'github-copilot'
161
191
  | 'poe'
@@ -219,7 +249,12 @@ export function resolveOpenCodeEnv({
219
249
  }): Record<string, string> {
220
250
  const suppliedEnvironment = isHarnessAuthenticationEnvironment(auth);
221
251
  const authenticationEnvironment = suppliedEnvironment ? auth : processEnv;
222
- const selectedProvider = resolveOpenCodeProvider({ model, provider });
252
+ const selectedProvider = resolveOpenCodeAuthenticationProvider({
253
+ auth,
254
+ model,
255
+ provider,
256
+ environment: authenticationEnvironment,
257
+ });
223
258
  if (
224
259
  (selectedProvider === 'openai' && auth === 'openai') ||
225
260
  (selectedProvider === 'anthropic' && auth === 'anthropic')
@@ -256,9 +291,19 @@ export function resolveOpenCodeAuthenticationMode({
256
291
  if (isHarnessAuthenticationEnvironment(auth)) {
257
292
  return getAiGatewayAuthFromEnv({ env: auth }).apiKey
258
293
  ? 'ai-gateway'
259
- : resolveOpenCodeProvider({ model, provider });
294
+ : resolveOpenCodeAuthenticationProvider({
295
+ auth,
296
+ model,
297
+ provider,
298
+ environment: auth,
299
+ });
260
300
  }
261
- const selectedProvider = resolveOpenCodeProvider({ model, provider });
301
+ const selectedProvider = resolveOpenCodeAuthenticationProvider({
302
+ auth,
303
+ model,
304
+ provider,
305
+ environment: processEnv,
306
+ });
262
307
  if (selectedProvider === 'openai' && auth === 'openai') {
263
308
  return 'openai';
264
309
  }
@@ -274,6 +319,35 @@ export function resolveOpenCodeAuthenticationMode({
274
319
  return selectedProvider;
275
320
  }
276
321
 
322
+ function resolveOpenCodeAuthenticationProvider({
323
+ auth,
324
+ model,
325
+ provider,
326
+ environment,
327
+ }: {
328
+ auth: OpenCodeAuthenticationMode | undefined;
329
+ model?: string;
330
+ provider?: string;
331
+ environment: Record<string, string | undefined>;
332
+ }): Exclude<OpenCodeResolvedAuthenticationMode, 'ai-gateway'> {
333
+ const selectedProvider = resolveOpenCodeProvider({ model, provider });
334
+ if (
335
+ model == null &&
336
+ provider == null &&
337
+ (auth === 'anthropic' || auth === 'openai')
338
+ ) {
339
+ return auth;
340
+ }
341
+ return model == null &&
342
+ provider == null &&
343
+ (environment.GOOGLE_GENERATIVE_AI_API_KEY?.length ?? 0) > 0 &&
344
+ !NON_GOOGLE_DIRECT_CREDENTIAL_ENVIRONMENT_VARIABLES.some(
345
+ name => (environment[name]?.length ?? 0) > 0,
346
+ )
347
+ ? 'google'
348
+ : selectedProvider;
349
+ }
350
+
277
351
  function pickOpenAI({
278
352
  processEnv,
279
353
  }: {
@@ -316,15 +390,17 @@ function pickDirectProvider({
316
390
  if (provider === 'openai') return pickOpenAI({ processEnv });
317
391
  if (provider === 'anthropic') return pickAnthropic({ processEnv });
318
392
  const names =
319
- provider === 'xai'
320
- ? ['XAI_API_KEY', 'XAI_BASE_URL']
321
- : provider === 'github-copilot'
322
- ? ['GITHUB_COPILOT_TOKEN', 'GITHUB_TOKEN']
323
- : provider === 'poe'
324
- ? ['POE_API_KEY']
325
- : provider === 'opencode-go'
326
- ? ['OPENCODE_API_KEY']
327
- : ['GITLAB_TOKEN', 'GITLAB_INSTANCE_URL'];
393
+ provider === 'google'
394
+ ? ['GOOGLE_GENERATIVE_AI_API_KEY']
395
+ : provider === 'xai'
396
+ ? ['XAI_API_KEY', 'XAI_BASE_URL']
397
+ : provider === 'github-copilot'
398
+ ? ['GITHUB_COPILOT_TOKEN', 'GITHUB_TOKEN']
399
+ : provider === 'poe'
400
+ ? ['POE_API_KEY']
401
+ : provider === 'opencode-go'
402
+ ? ['OPENCODE_API_KEY']
403
+ : ['GITLAB_TOKEN', 'GITLAB_INSTANCE_URL'];
328
404
  return Object.fromEntries(
329
405
  names.flatMap(name =>
330
406
  processEnv[name] == null ? [] : [[name, processEnv[name]!]],
@@ -382,6 +458,7 @@ function isDirectProvider(
382
458
  return (
383
459
  value === 'anthropic' ||
384
460
  value === 'openai' ||
461
+ value === 'google' ||
385
462
  value === 'xai' ||
386
463
  value === 'github-copilot' ||
387
464
  value === 'poe' ||