@ai-sdk/harness-opencode 1.0.88 → 1.0.91
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 +27 -0
- package/dist/index.js +95 -39
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/opencode-auth.ts +73 -26
- package/src/opencode-harness.ts +67 -34
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# @ai-sdk/harness-opencode
|
|
2
2
|
|
|
3
|
+
## 1.0.91
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 0e590d2: feat(harness): harden credential brokering to only apply with correct ephemeral secret
|
|
8
|
+
- Updated dependencies [3e125ba]
|
|
9
|
+
- Updated dependencies [0e590d2]
|
|
10
|
+
- @ai-sdk/provider-utils@5.0.32
|
|
11
|
+
- @ai-sdk/harness@1.0.90
|
|
12
|
+
|
|
13
|
+
## 1.0.90
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- @ai-sdk/harness@1.0.89
|
|
18
|
+
|
|
19
|
+
## 1.0.89
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [32349cc]
|
|
24
|
+
- Updated dependencies [a9782e1]
|
|
25
|
+
- Updated dependencies [35841f5]
|
|
26
|
+
- Updated dependencies [d2f3353]
|
|
27
|
+
- @ai-sdk/harness@1.0.88
|
|
28
|
+
- @ai-sdk/provider-utils@5.0.31
|
|
29
|
+
|
|
3
30
|
## 1.0.88
|
|
4
31
|
|
|
5
32
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
applyCredentialForwarding,
|
|
11
11
|
classifyDiskLog,
|
|
12
|
+
createSandboxCredentialEnvironment,
|
|
12
13
|
experimental_createBridgeUserMessageSubmitter,
|
|
13
14
|
createBridgeErrorHandler,
|
|
14
15
|
createBridgeStartupError,
|
|
@@ -16,7 +17,6 @@ import {
|
|
|
16
17
|
forwardBridgeProcessStream,
|
|
17
18
|
getRestrictedSandboxSession,
|
|
18
19
|
markBridgeStarting,
|
|
19
|
-
maskSandboxCredentials,
|
|
20
20
|
resolveSandboxDefaultWorkingDirectory,
|
|
21
21
|
resolveSandboxHomeDir,
|
|
22
22
|
SandboxChannel,
|
|
@@ -102,38 +102,75 @@ var OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [
|
|
|
102
102
|
"ANTHROPIC_API_KEY",
|
|
103
103
|
"ANTHROPIC_AUTH_TOKEN"
|
|
104
104
|
];
|
|
105
|
-
function createOpenCodeRequestTransformations(
|
|
106
|
-
|
|
105
|
+
function createOpenCodeRequestTransformations({
|
|
106
|
+
env: environment,
|
|
107
|
+
sandboxEnv: sandboxEnvironment,
|
|
108
|
+
auth: authenticationMode
|
|
109
|
+
}) {
|
|
110
|
+
switch (authenticationMode) {
|
|
107
111
|
case "ai-gateway":
|
|
108
|
-
return
|
|
112
|
+
return environment.AI_GATEWAY_API_KEY && sandboxEnvironment.AI_GATEWAY_API_KEY ? [
|
|
113
|
+
createCredentialRequestTransformation({
|
|
114
|
+
matchUrl: environment.AI_GATEWAY_BASE_URL,
|
|
115
|
+
matchHeaders: {
|
|
116
|
+
"x-api-key": sandboxEnvironment.AI_GATEWAY_API_KEY
|
|
117
|
+
},
|
|
118
|
+
transformHeaders: {
|
|
119
|
+
Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`
|
|
120
|
+
}
|
|
121
|
+
}),
|
|
109
122
|
createCredentialRequestTransformation({
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
Authorization: `Bearer ${
|
|
123
|
+
matchUrl: environment.AI_GATEWAY_BASE_URL,
|
|
124
|
+
matchHeaders: {
|
|
125
|
+
Authorization: `Bearer ${sandboxEnvironment.AI_GATEWAY_API_KEY}`
|
|
126
|
+
},
|
|
127
|
+
transformHeaders: {
|
|
128
|
+
Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`
|
|
113
129
|
}
|
|
114
130
|
})
|
|
115
131
|
] : [];
|
|
116
132
|
case "openai":
|
|
117
|
-
return
|
|
133
|
+
return environment.OPENAI_API_KEY && sandboxEnvironment.OPENAI_API_KEY ? [
|
|
118
134
|
createCredentialRequestTransformation({
|
|
119
|
-
|
|
120
|
-
|
|
135
|
+
matchUrl: environment.OPENAI_BASE_URL ?? "https://api.openai.com/v1",
|
|
136
|
+
matchHeaders: {
|
|
137
|
+
Authorization: `Bearer ${sandboxEnvironment.OPENAI_API_KEY}`
|
|
138
|
+
},
|
|
139
|
+
transformHeaders: {
|
|
140
|
+
Authorization: `Bearer ${environment.OPENAI_API_KEY}`
|
|
141
|
+
}
|
|
121
142
|
})
|
|
122
143
|
] : [];
|
|
123
144
|
case "anthropic": {
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
145
|
+
const matchUrl = environment.ANTHROPIC_BASE_URL ?? "https://api.anthropic.com";
|
|
146
|
+
const transformations = [];
|
|
147
|
+
if (environment.ANTHROPIC_API_KEY != null && sandboxEnvironment.ANTHROPIC_API_KEY != null) {
|
|
148
|
+
transformations.push(
|
|
149
|
+
createCredentialRequestTransformation({
|
|
150
|
+
matchUrl,
|
|
151
|
+
matchHeaders: {
|
|
152
|
+
"x-api-key": sandboxEnvironment.ANTHROPIC_API_KEY
|
|
153
|
+
},
|
|
154
|
+
transformHeaders: {
|
|
155
|
+
"x-api-key": environment.ANTHROPIC_API_KEY
|
|
156
|
+
}
|
|
157
|
+
})
|
|
158
|
+
);
|
|
127
159
|
}
|
|
128
|
-
if (
|
|
129
|
-
|
|
160
|
+
if (environment.ANTHROPIC_AUTH_TOKEN != null && sandboxEnvironment.ANTHROPIC_AUTH_TOKEN != null) {
|
|
161
|
+
transformations.push(
|
|
162
|
+
createCredentialRequestTransformation({
|
|
163
|
+
matchUrl,
|
|
164
|
+
matchHeaders: {
|
|
165
|
+
Authorization: `Bearer ${sandboxEnvironment.ANTHROPIC_AUTH_TOKEN}`
|
|
166
|
+
},
|
|
167
|
+
transformHeaders: {
|
|
168
|
+
Authorization: `Bearer ${environment.ANTHROPIC_AUTH_TOKEN}`
|
|
169
|
+
}
|
|
170
|
+
})
|
|
171
|
+
);
|
|
130
172
|
}
|
|
131
|
-
return
|
|
132
|
-
createCredentialRequestTransformation({
|
|
133
|
-
baseUrl: env.ANTHROPIC_BASE_URL ?? "https://api.anthropic.com",
|
|
134
|
-
headers
|
|
135
|
-
})
|
|
136
|
-
];
|
|
173
|
+
return transformations;
|
|
137
174
|
}
|
|
138
175
|
}
|
|
139
176
|
}
|
|
@@ -327,7 +364,7 @@ var inboundMessageSchema = z.discriminatedUnion("type", [
|
|
|
327
364
|
]);
|
|
328
365
|
|
|
329
366
|
// src/version.ts
|
|
330
|
-
var VERSION = true ? "1.0.
|
|
367
|
+
var VERSION = true ? "1.0.91" : "0.0.0-test";
|
|
331
368
|
|
|
332
369
|
// src/opencode-harness.ts
|
|
333
370
|
var OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;
|
|
@@ -438,7 +475,8 @@ var openCodeBridgeCoordsSchema = z2.object({
|
|
|
438
475
|
});
|
|
439
476
|
var openCodeResumeStateSchema = z2.object({
|
|
440
477
|
openCodeSessionId: z2.string().optional(),
|
|
441
|
-
bridge: openCodeBridgeCoordsSchema.optional()
|
|
478
|
+
bridge: openCodeBridgeCoordsSchema.optional(),
|
|
479
|
+
sandboxCredentialEnvironment: z2.record(z2.string(), z2.string()).optional()
|
|
442
480
|
});
|
|
443
481
|
function createOpenCode(settings = {}) {
|
|
444
482
|
if (settings.mcpServers != null && Object.prototype.hasOwnProperty.call(settings.mcpServers, "harness-tools")) {
|
|
@@ -472,6 +510,12 @@ function createOpenCode(settings = {}) {
|
|
|
472
510
|
sandboxSession,
|
|
473
511
|
abortSignal: startOpts.abortSignal
|
|
474
512
|
});
|
|
513
|
+
const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;
|
|
514
|
+
const isResume = lifecycleState != null;
|
|
515
|
+
const isContinue = startOpts.continueFrom != null;
|
|
516
|
+
const resumeData = isResume && typeof lifecycleState?.data === "object" ? lifecycleState.data : void 0;
|
|
517
|
+
const resumeSessionId = typeof resumeData?.openCodeSessionId === "string" && resumeData.openCodeSessionId.length > 0 ? resumeData.openCodeSessionId : void 0;
|
|
518
|
+
const coords = resumeData?.bridge;
|
|
475
519
|
const authenticationMode = resolveOpenCodeAuthenticationMode({
|
|
476
520
|
auth: settings.auth,
|
|
477
521
|
model: settings.model,
|
|
@@ -483,20 +527,29 @@ function createOpenCode(settings = {}) {
|
|
|
483
527
|
provider: settings.provider
|
|
484
528
|
});
|
|
485
529
|
let sandboxAuthEnvironment = resolvedAuthEnvironment;
|
|
530
|
+
let sandboxCredentialEnvironment;
|
|
531
|
+
let credentialsBrokered = false;
|
|
486
532
|
if ("addRequestTransformations" in sandboxSession && sandboxSession.addRequestTransformations != null) {
|
|
487
|
-
|
|
488
|
-
resolvedAuthEnvironment,
|
|
489
|
-
|
|
490
|
-
|
|
533
|
+
sandboxCredentialEnvironment = resumeData?.sandboxCredentialEnvironment ?? await createSandboxCredentialEnvironment({
|
|
534
|
+
environment: resolvedAuthEnvironment,
|
|
535
|
+
credentialEnvironmentVariables: OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,
|
|
536
|
+
credentialForwarding: settings.credentialForwarding
|
|
537
|
+
});
|
|
538
|
+
sandboxAuthEnvironment = {
|
|
539
|
+
...resolvedAuthEnvironment,
|
|
540
|
+
...sandboxCredentialEnvironment
|
|
541
|
+
};
|
|
542
|
+
const requestTransformations = createOpenCodeRequestTransformations({
|
|
543
|
+
env: resolvedAuthEnvironment,
|
|
544
|
+
sandboxEnv: sandboxAuthEnvironment,
|
|
545
|
+
auth: authenticationMode
|
|
546
|
+
});
|
|
491
547
|
if (requestTransformations.length > 0) {
|
|
492
548
|
await sandboxSession.addRequestTransformations(
|
|
493
549
|
requestTransformations
|
|
494
550
|
);
|
|
495
551
|
}
|
|
496
|
-
|
|
497
|
-
environment: resolvedAuthEnvironment,
|
|
498
|
-
credentialEnvironmentVariables: OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES
|
|
499
|
-
});
|
|
552
|
+
credentialsBrokered = true;
|
|
500
553
|
} else {
|
|
501
554
|
warnCredentialBrokeringUnavailable();
|
|
502
555
|
}
|
|
@@ -504,12 +557,6 @@ function createOpenCode(settings = {}) {
|
|
|
504
557
|
defaultWorkingDirectory,
|
|
505
558
|
OPENCODE_BOOTSTRAP_DIR
|
|
506
559
|
);
|
|
507
|
-
const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;
|
|
508
|
-
const isResume = lifecycleState != null;
|
|
509
|
-
const isContinue = startOpts.continueFrom != null;
|
|
510
|
-
const resumeData = isResume && typeof lifecycleState?.data === "object" ? lifecycleState.data : void 0;
|
|
511
|
-
const resumeSessionId = typeof resumeData?.openCodeSessionId === "string" && resumeData.openCodeSessionId.length > 0 ? resumeData.openCodeSessionId : void 0;
|
|
512
|
-
const coords = resumeData?.bridge;
|
|
513
560
|
const workDir = startOpts.sessionWorkDir;
|
|
514
561
|
const sessionDataDir = `${defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;
|
|
515
562
|
const bridgeStateDir = `${sessionDataDir}/bridge`;
|
|
@@ -567,6 +614,7 @@ function createOpenCode(settings = {}) {
|
|
|
567
614
|
bridgePort: coords.port,
|
|
568
615
|
bridgeToken: coords.token,
|
|
569
616
|
sandboxId,
|
|
617
|
+
sandboxCredentialEnvironment,
|
|
570
618
|
debug: startOpts.observability?.debug,
|
|
571
619
|
permissionMode: startOpts.permissionMode,
|
|
572
620
|
builtinToolFiltering: startOpts.builtinToolFiltering,
|
|
@@ -606,7 +654,7 @@ function createOpenCode(settings = {}) {
|
|
|
606
654
|
homeDir: sandboxHomeDir,
|
|
607
655
|
abortSignal: startOpts.abortSignal
|
|
608
656
|
}) : void 0;
|
|
609
|
-
const forwardedAuthEnvironment = await applyCredentialForwarding({
|
|
657
|
+
const forwardedAuthEnvironment = credentialsBrokered ? sandboxAuthEnvironment : await applyCredentialForwarding({
|
|
610
658
|
environment: sandboxAuthEnvironment,
|
|
611
659
|
credentialEnvironmentVariables: OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,
|
|
612
660
|
credentialForwarding: settings.credentialForwarding
|
|
@@ -709,6 +757,7 @@ function createOpenCode(settings = {}) {
|
|
|
709
757
|
bridgePort: boundPort,
|
|
710
758
|
bridgeToken: token,
|
|
711
759
|
sandboxId,
|
|
760
|
+
sandboxCredentialEnvironment,
|
|
712
761
|
debug: startOpts.observability?.debug,
|
|
713
762
|
permissionMode: startOpts.permissionMode,
|
|
714
763
|
builtinToolFiltering: startOpts.builtinToolFiltering,
|
|
@@ -886,6 +935,7 @@ function createSession({
|
|
|
886
935
|
bridgePort,
|
|
887
936
|
bridgeToken,
|
|
888
937
|
sandboxId,
|
|
938
|
+
sandboxCredentialEnvironment,
|
|
889
939
|
debug,
|
|
890
940
|
permissionMode,
|
|
891
941
|
builtinToolFiltering,
|
|
@@ -1138,6 +1188,7 @@ function createSession({
|
|
|
1138
1188
|
specificationVersion: "harness-v1",
|
|
1139
1189
|
data: {
|
|
1140
1190
|
...latestOpenCodeSessionId ? { openCodeSessionId: latestOpenCodeSessionId } : {},
|
|
1191
|
+
...sandboxCredentialEnvironment == null ? {} : { sandboxCredentialEnvironment },
|
|
1141
1192
|
bridge: {
|
|
1142
1193
|
port: bridgePort,
|
|
1143
1194
|
token: bridgeToken,
|
|
@@ -1230,11 +1281,15 @@ function createSession({
|
|
|
1230
1281
|
}
|
|
1231
1282
|
channel.close();
|
|
1232
1283
|
}
|
|
1284
|
+
const lifecycleData = data != null && typeof data === "object" && !Array.isArray(data) ? { ...data } : {};
|
|
1233
1285
|
const payload = {
|
|
1234
1286
|
type: "resume-session",
|
|
1235
1287
|
harnessId: "opencode",
|
|
1236
1288
|
specificationVersion: "harness-v1",
|
|
1237
|
-
data:
|
|
1289
|
+
data: {
|
|
1290
|
+
...lifecycleData,
|
|
1291
|
+
...sandboxCredentialEnvironment == null ? {} : { sandboxCredentialEnvironment }
|
|
1292
|
+
}
|
|
1238
1293
|
};
|
|
1239
1294
|
return payload;
|
|
1240
1295
|
},
|
|
@@ -1252,6 +1307,7 @@ function createSession({
|
|
|
1252
1307
|
specificationVersion: "harness-v1",
|
|
1253
1308
|
data: {
|
|
1254
1309
|
...latestOpenCodeSessionId ? { openCodeSessionId: latestOpenCodeSessionId } : {},
|
|
1310
|
+
...sandboxCredentialEnvironment == null ? {} : { sandboxCredentialEnvironment },
|
|
1255
1311
|
bridge: {
|
|
1256
1312
|
port: bridgePort,
|
|
1257
1313
|
token: bridgeToken,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/opencode-harness.ts","../src/opencode-bootstrap.ts","../src/opencode-auth.ts","../src/opencode-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport path from 'node:path';\nimport {\n commonTool,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1PortEndpoint,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n maskSandboxCredentials,\n resolveSandboxDefaultWorkingDirectory,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession as SandboxSession,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n getOpenCodeBootstrap,\n OPENCODE_BOOTSTRAP_DIR as BOOTSTRAP_DIR,\n} from './opencode-bootstrap';\nimport {\n createOpenCodeRequestTransformations,\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n resolveOpenCodeAuthenticationMode,\n resolveOpenCodeEnv,\n splitOpenCodeModel,\n type OpenCodeAuthOptions,\n} from './opencode-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './opencode-bridge-protocol';\nimport { VERSION } from './version';\n\ntype OpenCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype OpenCodeRespawnStrategy = 'replay' | 'rerun';\n\ntype WriteSkillsResult = {\n readonly skillsDir: string;\n};\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;\n\nexport type OpenCodeHarnessSettings = {\n readonly auth?: OpenCodeAuthOptions;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n readonly model?: string;\n readonly provider?: string;\n /**\n * OpenCode reasoning/thinking variant for reasoning-capable models, e.g.\n * `'low'`, `'medium'`, `'high'`, or another model-supported OpenCode\n * variant.\n */\n readonly reasoningVariant?: string;\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n readonly startupTimeoutMs?: number;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'view',\n toolUseKind: 'readonly',\n description: 'Read file contents',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n description: 'Write content to a file',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n content: z.string().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'edit',\n toolUseKind: 'edit',\n description: 'Edit a file by replacing text',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n old_string: z.string().optional(),\n new_string: z.string().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command',\n inputSchema: z.looseObject({\n command: z.string().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'glob',\n toolUseKind: 'readonly',\n description: 'Find files matching a glob pattern',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n description: 'Search file contents with regex',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ls: tool({\n description: 'List directory contents',\n inputSchema: z.looseObject({\n path: z.string().optional(),\n }),\n }),\n webfetch: tool({\n description: 'Fetch a URL',\n inputSchema: z.looseObject({\n url: z.string().optional(),\n prompt: z.string().optional(),\n }),\n }),\n skill: tool({\n description: 'Load an OpenCode skill by name',\n inputSchema: z.looseObject({\n name: z.string().optional(),\n }),\n }),\n todowrite: tool({\n description: 'Replace the OpenCode session todo list',\n inputSchema: z.looseObject({\n todos: z\n .array(\n z.looseObject({\n content: z.string().optional(),\n status: z.string().optional(),\n priority: z.string().optional(),\n }),\n )\n .optional(),\n }),\n }),\n agent: tool({\n description: 'Run an OpenCode subagent',\n inputSchema: z.looseObject({\n agent: z.string().optional(),\n prompt: z.string().optional(),\n description: z.string().optional(),\n metadata: optionalStringRecord,\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nconst openCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\nconst openCodeResumeStateSchema = z.object({\n openCodeSessionId: z.string().optional(),\n bridge: openCodeBridgeCoordsSchema.optional(),\n});\n\ntype OpenCodeBridgeCoords = z.infer<typeof openCodeBridgeCoordsSchema>;\n\nexport function createOpenCode(\n settings: OpenCodeHarnessSettings = {},\n): HarnessV1<typeof OPENCODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'OpenCode MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'opencode',\n builtinTools: OPENCODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n lifecycleStateSchema: openCodeResumeStateSchema,\n getBootstrap: getOpenCodeBootstrap,\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness cannot use `mintBridgeToken` with a sandbox session that does not expose an id.',\n });\n }\n const defaultWorkingDirectory =\n await resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const authenticationMode = resolveOpenCodeAuthenticationMode({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n const resolvedAuthEnvironment = resolveOpenCodeEnv({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n let sandboxAuthEnvironment = resolvedAuthEnvironment;\n if (\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n const requestTransformations = createOpenCodeRequestTransformations(\n resolvedAuthEnvironment,\n authenticationMode,\n );\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n sandboxAuthEnvironment = maskSandboxCredentials({\n environment: resolvedAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n });\n } else {\n warnCredentialBrokeringUnavailable();\n }\n const bootstrapDir = path.posix.resolve(\n defaultWorkingDirectory,\n BOOTSTRAP_DIR,\n );\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData =\n isResume && typeof lifecycleState?.data === 'object'\n ? (lifecycleState.data as {\n openCodeSessionId?: unknown;\n bridge?: OpenCodeBridgeCoords;\n })\n : undefined;\n const resumeSessionId =\n typeof resumeData?.openCodeSessionId === 'string' &&\n resumeData.openCodeSessionId.length > 0\n ? resumeData.openCodeSessionId\n : undefined;\n const coords = resumeData?.bridge;\n\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n const model = splitOpenCodeModel(settings.model, settings.provider).model;\n\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'opencode',\n sessionId: startOpts.sessionId,\n });\n\n if (coords) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: coords.port,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n let supportsUserMessageResponses = false;\n const attachChannel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: attachEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: true,\n seedResumeSessionOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n } catch {}\n }\n\n let respawnStrategy: OpenCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort({\n sandboxSession,\n override: settings.port,\n });\n const token =\n settings.mintBridgeToken == null\n ? randomBytes(32).toString('hex')\n : settings.mintBridgeToken(sandboxId!);\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const xdgConfigHome = `${sandboxHomeDir}/.config`;\n const xdgCacheHome = `${sandboxHomeDir}/.cache`;\n const xdgDataHome = `${sandboxHomeDir}/.local/share`;\n const xdgStateHome = `${sandboxHomeDir}/.local/state`;\n const skillSetup =\n startOpts.skills && startOpts.skills.length > 0\n ? await writeOpenCodeSkills({\n sandbox: toolSafeSandboxSession,\n skills: startOpts.skills,\n homeDir: sandboxHomeDir,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const forwardedAuthEnvironment = await applyCredentialForwarding({\n environment: sandboxAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n });\n const env = {\n ...forwardedAuthEnvironment,\n AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n HOME: sandboxHomeDir,\n USERPROFILE: sandboxHomeDir,\n XDG_CONFIG_HOME: xdgConfigHome,\n XDG_CACHE_HOME: xdgCacheHome,\n XDG_DATA_HOME: xdgDataHome,\n XDG_STATE_HOME: xdgStateHome,\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n if (respawnStrategy === undefined) {\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)} ${shellQuote(xdgConfigHome)} ${shellQuote(xdgCacheHome)} ${shellQuote(xdgDataHome)} ${shellQuote(xdgStateHome)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)} --bootstrap-dir ${shellQuote(bootstrapDir)}${skillSetup ? ` --skills-dir ${shellQuote(skillSetup.skillsDir)}` : ''}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n const stderrTail: string[] = [];\n const bridgeStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'opencode',\n collectTail: stderrTail,\n });\n\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: boundPort,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n let supportsUserMessageResponses = false;\n\n const channel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: bridgeEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: respawnStrategy !== undefined,\n seedResumeSessionOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n },\n };\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n}): number {\n if (override !== undefined) return override;\n if ('ports' in sandboxSession && sandboxSession.ports.length > 0) {\n return sandboxSession.ports[0];\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createOpenCode({ port })`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `port` when using a basic sandbox session.',\n });\n }\n if (portEndpoint == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n }\n}\n\nasync function resolveBridgeEndpoint({\n sandboxSession,\n override,\n port,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n}\n\nasync function writeOpenCodeSkills({\n sandbox,\n skills,\n homeDir,\n abortSignal,\n}: {\n sandbox: SandboxSession;\n skills: ReadonlyArray<HarnessV1Skill>;\n homeDir: string;\n abortSignal?: AbortSignal;\n}): Promise<WriteSkillsResult> {\n const skillsDir = path.posix.join(homeDir, '.agents', 'skills');\n await writeHarnessSkills({\n sandbox,\n rootDir: skillsDir,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid OpenCode skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid OpenCode skill file path for ${skillName}: ${filePath}`,\n });\n\n return { skillsDir };\n}\n\nfunction openWebSocket({\n endpoint,\n helloTimeoutMs,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n helloTimeoutMs: number;\n onHello(supportsUserMessageResponses: boolean): void;\n}): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(endpoint.url, {\n headers: endpoint.headers == null ? undefined : { ...endpoint.headers },\n });\n let opened = false;\n let receivedHello = false;\n let settled = false;\n const cleanup = () => {\n clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n ws.off('close', onClose);\n ws.off('error', onError);\n };\n const settle = (error?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error == null) {\n resolve(ws);\n } else {\n reject(error);\n }\n };\n const tryResolve = () => {\n if (opened && receivedHello) settle();\n };\n const onOpen = () => {\n opened = true;\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success) return;\n const value = parsed.value;\n if (\n typeof value !== 'object' ||\n value == null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== 'bridge-hello'\n ) {\n return;\n }\n const capabilities = (\n value as {\n capabilities?: { experimental_userMessageResponses?: unknown };\n }\n ).capabilities;\n onHello(capabilities?.experimental_userMessageResponses === true);\n receivedHello = true;\n tryResolve();\n })();\n };\n const onClose = () =>\n settle(new Error('OpenCode bridge closed before sending bridge-hello.'));\n const onError = (err: Error) => {\n settle(err);\n };\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n const helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `OpenCode bridge did not send bridge-hello within ${helloTimeoutMs}ms.`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n });\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction withBridgeToken({\n endpoint,\n token,\n}: {\n endpoint: HarnessV1PortEndpoint;\n token: string;\n}): HarnessV1PortEndpoint {\n const bridgeUrl = new URL(endpoint.url);\n bridgeUrl.searchParams.set('agent_bridge_token', token);\n return { ...endpoint, url: bridgeUrl.toString() };\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n provider,\n reasoningVariant,\n mcpServers,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n debug,\n permissionMode,\n builtinToolFiltering,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n mcpServers: Record<string, unknown> | undefined;\n openCodeSessionId: string | undefined;\n isResume: boolean;\n seedResumeSessionOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n supportsUserMessageResponses: () => boolean;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n let latestOpenCodeSessionId = openCodeSessionId;\n let pendingResumeSessionId = seedResumeSessionOnFirstPrompt\n ? openCodeSessionId\n : undefined;\n let activeTurn = false;\n const pendingCompactionParts: HarnessV1StreamPart[] = [];\n\n channel.on('bridge-thread', msg => {\n latestOpenCodeSessionId = msg.threadId;\n });\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n activeTurn = true;\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const userMessageSubmitter = supportsUserMessageResponses()\n ? experimental_createBridgeUserMessageSubmitter({\n send: message => channel.send(message),\n onResponse: listener => channel.on('user-message-response', listener),\n onReconnect: listener => channel.onReconnect(listener),\n })\n : undefined;\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'file-change',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close();\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close(err);\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('OpenCode bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n while (pendingCompactionParts.length > 0) {\n forward(pendingCompactionParts.shift()!);\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n ...(userMessageSubmitter == null\n ? {}\n : {\n submitUserMessage: async (text: string) => {\n await userMessageSubmitter.submit(text);\n },\n }),\n done,\n };\n };\n\n const startBase = () => ({\n model,\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n if (\n promptOpts.responseFormat?.type === 'json' &&\n promptOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.responseFormat == null\n ? {}\n : { responseFormat: promptOpts.responseFormat }),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n if (\n continueOpts.responseFormat?.type === 'json' &&\n continueOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n if (rerunContinue) {\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.responseFormat == null\n ? {}\n : { responseFormat: continueOpts.responseFormat }),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n }\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n if (customInstructions?.trim()) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports native manual compaction, but OpenCode does not expose custom compaction instructions through the supported API.\",\n });\n }\n if (activeTurn) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports manual compaction between turns; compacting during an active turn is not supported by the bridge transport.\",\n });\n }\n await runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId: latestOpenCodeSessionId,\n onCompaction: part => pendingCompactionParts.push(part),\n });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `OpenCode session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: (data ?? {}) as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n return payload;\n },\n };\n}\n\nasync function runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId,\n onCompaction,\n}: {\n channel: OpenCodeChannel;\n model: string | undefined;\n provider: string | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n debug: HarnessV1DebugConfig | undefined;\n mcpServers: Record<string, unknown> | undefined;\n resumeSessionId: string | undefined;\n onCompaction: (part: HarnessV1StreamPart) => void;\n}): Promise<void> {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const unsubs = [\n channel.on('compaction', msg => onCompaction(msg)),\n channel.on('finish', () => {\n for (const u of unsubs) u();\n pendingResolve!();\n }),\n channel.on('error', msg => {\n for (const u of unsubs) u();\n pendingReject!(msg.error);\n }),\n ];\n channel.send({\n type: 'start',\n operation: 'compact',\n prompt: '',\n tools: [],\n model,\n provider,\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(resumeSessionId ? { resumeSessionId } : {}),\n ...(debug ? { debug } : {}),\n });\n await done;\n}\n\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `The OpenCode harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport type { HarnessV1Bootstrap } from '@ai-sdk/harness';\n\nexport const OPENCODE_BOOTSTRAP_DIR = '.harness-bootstrap/opencode';\n\nlet cachedBootstrap: HarnessV1Bootstrap | undefined;\n\nexport async function getOpenCodeBootstrap(): Promise<HarnessV1Bootstrap> {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, workspace, bridge, hostToolMcp] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('pnpm-workspace.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'opencode',\n bootstrapDir: OPENCODE_BOOTSTRAP_DIR,\n files: [\n { path: `${OPENCODE_BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-workspace.yaml`,\n content: workspace,\n },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/host-tool-mcp.mjs`,\n content: hostToolMcp,\n },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: './node_modules/.bin/opencode --version',\n },\n ],\n };\n return cachedBootstrap;\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n","import type { HarnessV1RequestTransformation } from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n} from '@ai-sdk/harness/utils';\n\nexport const OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [\n 'AI_GATEWAY_API_KEY',\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n] as const;\n\nexport function createOpenCodeRequestTransformations(\n env: Record<string, string>,\n auth: OpenCodeResolvedAuthenticationMode,\n): HarnessV1RequestTransformation[] {\n switch (auth) {\n case 'ai-gateway':\n return env.AI_GATEWAY_API_KEY\n ? [\n createCredentialRequestTransformation({\n baseUrl: env.AI_GATEWAY_BASE_URL,\n headers: {\n Authorization: `Bearer ${env.AI_GATEWAY_API_KEY}`,\n },\n }),\n ]\n : [];\n case 'openai':\n return env.OPENAI_API_KEY\n ? [\n createCredentialRequestTransformation({\n baseUrl: env.OPENAI_BASE_URL ?? 'https://api.openai.com/v1',\n headers: { Authorization: `Bearer ${env.OPENAI_API_KEY}` },\n }),\n ]\n : [];\n case 'anthropic': {\n const headers: Record<string, string> = {};\n if (env.ANTHROPIC_API_KEY) {\n headers['x-api-key'] = env.ANTHROPIC_API_KEY;\n }\n if (env.ANTHROPIC_AUTH_TOKEN) {\n headers.Authorization = `Bearer ${env.ANTHROPIC_AUTH_TOKEN}`;\n }\n return Object.keys(headers).length === 0\n ? []\n : [\n createCredentialRequestTransformation({\n baseUrl: env.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com',\n headers,\n }),\n ];\n }\n }\n}\n\nexport type OpenCodeResolvedAuthenticationMode =\n | 'anthropic'\n | 'openai'\n | 'ai-gateway';\n\nexport type OpenCodeAuthenticationMode =\n | OpenCodeResolvedAuthenticationMode\n | 'auto';\n\n/**\n * @deprecated Passing an object to auth options is deprecated. Use an `OpenCodeAuthenticationMode` string value (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.\n */\nexport type LegacyOpenCodeAuthOptions = {\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly openai?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly organization?: string;\n readonly project?: string;\n };\n readonly openaiCompatible?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly name?: string;\n readonly queryParams?: Record<string, string>;\n };\n};\n\nexport type OpenCodeAuthOptions =\n | OpenCodeAuthenticationMode\n | LegacyOpenCodeAuthOptions;\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): 'anthropic' | 'openai' {\n if (provider === 'anthropic' || provider === 'openai') {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (modelProvider === 'anthropic' || modelProvider === 'openai') {\n return modelProvider;\n }\n }\n return 'anthropic';\n}\n\nexport function splitOpenCodeModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string; model?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return {\n providerID,\n modelID: rest.join('/'),\n model,\n };\n }\n return {\n providerID: provider,\n modelID: model,\n model: provider ? `${provider}/${model}` : model,\n };\n}\n\nexport function resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const normalizedAuth = normalizeOpenCodeAuthToLegacyAuth(auth);\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (normalizedAuth?.openaiCompatible) {\n return pickOpenAICompatible(normalizedAuth.openaiCompatible, processEnv);\n }\n if (selectedProvider === 'openai') {\n if (normalizedAuth?.openai) {\n return pickOpenAI({ explicit: normalizedAuth.openai, processEnv });\n }\n } else if (normalizedAuth?.anthropic) {\n return pickAnthropic({ explicit: normalizedAuth.anthropic, processEnv });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (normalizedAuth?.gateway) {\n return pickGateway({\n explicit: normalizedAuth.gateway,\n gatewayAuthFromEnv,\n });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({ explicit: {}, gatewayAuthFromEnv });\n }\n return selectedProvider === 'openai'\n ? pickOpenAI({ processEnv })\n : pickAnthropic({ processEnv });\n}\n\nexport function resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): OpenCodeResolvedAuthenticationMode {\n if (typeof auth !== 'string' && auth?.openaiCompatible) {\n return 'openai';\n }\n\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (\n selectedProvider === 'openai' &&\n (auth === 'openai' || (typeof auth !== 'string' && auth?.openai))\n ) {\n return 'openai';\n }\n if (\n selectedProvider === 'anthropic' &&\n (auth === 'anthropic' || (typeof auth !== 'string' && auth?.anthropic))\n ) {\n return 'anthropic';\n }\n if (auth === 'ai-gateway' || (typeof auth !== 'string' && auth?.gateway)) {\n return 'ai-gateway';\n }\n if (getAiGatewayAuthFromEnv({ env: processEnv }).apiKey) {\n return 'ai-gateway';\n }\n return selectedProvider;\n}\n\nfunction normalizeOpenCodeAuthToLegacyAuth(\n auth: OpenCodeAuthOptions | undefined,\n): LegacyOpenCodeAuthOptions | undefined {\n if (auth == null || auth === 'auto') {\n return undefined;\n }\n if (typeof auth === 'string') {\n switch (auth) {\n case 'anthropic':\n return { anthropic: {} };\n case 'openai':\n return { openai: {} };\n case 'ai-gateway':\n return { gateway: {} };\n default:\n return undefined;\n }\n }\n\n console.warn(\n '[opencode] Passing an object to auth options is deprecated. Use a string mode (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.',\n );\n return auth;\n}\n\nfunction pickOpenAICompatible(\n explicit: NonNullable<LegacyOpenCodeAuthOptions['openaiCompatible']>,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const name = explicit.name ?? processEnv.OPENAI_NAME;\n if (name) env.OPENAI_NAME = name;\n if (explicit.queryParams && Object.keys(explicit.queryParams).length > 0) {\n env.OPENAI_QUERY_PARAMS_JSON = JSON.stringify(explicit.queryParams);\n } else if (processEnv.OPENAI_QUERY_PARAMS_JSON) {\n env.OPENAI_QUERY_PARAMS_JSON = processEnv.OPENAI_QUERY_PARAMS_JSON;\n }\n return env;\n}\n\nfunction pickOpenAI({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['openai']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit?.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = explicit?.organization ?? processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = explicit?.project ?? processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<LegacyOpenCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n const baseUrl = toOpenCodeGatewayBaseUrl(\n explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl,\n );\n env.AI_GATEWAY_BASE_URL = baseUrl;\n return env;\n}\n\nexport function toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n operation: z.enum(['prompt', 'compact']).optional(),\n provider: z.string().optional(),\n variant: z.string().optional(),\n instructions: z.string().optional(),\n resumeSessionId: z.string().optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createOpenCode } from './opencode-harness';\n\n/**\n * Default `openCode` harness instance with no overrides. Equivalent to\n * `createOpenCode()`.\n */\nexport const openCode = createOpenCode();\n\nexport { createOpenCode } from './opencode-harness';\nexport { VERSION } from './version';\nexport type { OpenCodeHarnessSettings } from './opencode-harness';\nexport type {\n OpenCodeAuthenticationMode,\n OpenCodeAuthOptions,\n} from './opencode-auth';\n"],"mappings":"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","names":["z","z","endpoint","supportsUserMessageResponses","proc"]}
|
|
1
|
+
{"version":3,"sources":["../src/opencode-harness.ts","../src/opencode-bootstrap.ts","../src/opencode-auth.ts","../src/opencode-bridge-protocol.ts","../src/version.ts","../src/index.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport path from 'node:path';\nimport {\n commonTool,\n HarnessCapabilityUnsupportedError,\n harnessV1DiagnosticFromBridgeFrame,\n type HarnessV1,\n type HarnessV1BuiltinTool,\n type HarnessV1BuiltinToolFiltering,\n type HarnessV1ContinueTurnState,\n type HarnessV1CredentialForwarding,\n type HarnessV1DebugConfig,\n type HarnessV1NetworkSandboxSession,\n type HarnessV1PermissionMode,\n type HarnessV1Prompt,\n type HarnessV1PromptControl,\n type HarnessV1PortEndpoint,\n type HarnessV1ResumeSessionState,\n type HarnessV1Session,\n type HarnessV1Skill,\n type HarnessV1StreamPart,\n} from '@ai-sdk/harness';\nimport {\n applyCredentialForwarding,\n classifyDiskLog,\n createSandboxCredentialEnvironment,\n experimental_createBridgeUserMessageSubmitter,\n createBridgeErrorHandler,\n createBridgeStartupError,\n drainBridgeProcessStream,\n forwardBridgeProcessStream,\n getRestrictedSandboxSession,\n markBridgeStarting,\n resolveSandboxDefaultWorkingDirectory,\n resolveSandboxHomeDir,\n SandboxChannel,\n shellQuote,\n warnCredentialBrokeringUnavailable,\n waitForBridgeReady,\n writeSkills as writeHarnessSkills,\n} from '@ai-sdk/harness/utils';\nimport {\n safeParseJSON,\n tool,\n type Experimental_SandboxProcess,\n type Experimental_SandboxSession as SandboxSession,\n} from '@ai-sdk/provider-utils';\nimport { WebSocket } from 'ws';\nimport { z } from 'zod/v4';\nimport {\n getOpenCodeBootstrap,\n OPENCODE_BOOTSTRAP_DIR as BOOTSTRAP_DIR,\n} from './opencode-bootstrap';\nimport {\n createOpenCodeRequestTransformations,\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n resolveOpenCodeAuthenticationMode,\n resolveOpenCodeEnv,\n splitOpenCodeModel,\n type OpenCodeAuthOptions,\n} from './opencode-auth';\nimport {\n outboundMessageSchema,\n type InboundMessage,\n type OutboundMessage,\n} from './opencode-bridge-protocol';\nimport { VERSION } from './version';\n\ntype OpenCodeChannel = SandboxChannel<OutboundMessage, InboundMessage>;\ntype OpenCodeRespawnStrategy = 'replay' | 'rerun';\n\ntype WriteSkillsResult = {\n readonly skillsDir: string;\n};\n\n/**\n * Value to use in User-Agent and `x-client-app` headers.\n */\nconst OPENCODE_CLIENT_APP = `ai-sdk/harness-opencode/${VERSION}`;\n\nexport type OpenCodeHarnessSettings = {\n readonly auth?: OpenCodeAuthOptions;\n /**\n * Customizes each credential value before it is forwarded into a sandbox\n * process. This does not restrict which credentials the harness adapter can\n * discover, read, or otherwise access in the host process.\n */\n readonly credentialForwarding?: HarnessV1CredentialForwarding;\n /**\n * MCP server definitions keyed by server name. Each definition uses the\n * underlying runtime's native MCP server configuration format.\n */\n readonly mcpServers?: Record<string, unknown>;\n readonly model?: string;\n readonly provider?: string;\n /**\n * OpenCode reasoning/thinking variant for reasoning-capable models, e.g.\n * `'low'`, `'medium'`, `'high'`, or another model-supported OpenCode\n * variant.\n */\n readonly reasoningVariant?: string;\n readonly port?: number;\n /**\n * Override the host endpoint used to connect to the sandbox bridge. Required\n * together with `port` when using a basic sandbox session.\n */\n readonly portEndpoint?: HarnessV1PortEndpoint;\n readonly startupTimeoutMs?: number;\n /**\n * Creates the authentication token used by the sandbox bridge. Defaults to\n * a random 32-byte hexadecimal token.\n */\n readonly mintBridgeToken?: (sandboxId: string) => string;\n};\n\nconst optionalStringRecord = z.record(z.string(), z.unknown()).optional();\n\nconst OPENCODE_BUILTIN_TOOLS = {\n read: commonTool('read', {\n nativeName: 'view',\n toolUseKind: 'readonly',\n description: 'Read file contents',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n write: commonTool('write', {\n nativeName: 'write',\n toolUseKind: 'edit',\n description: 'Write content to a file',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n content: z.string().optional(),\n }),\n }),\n edit: commonTool('edit', {\n nativeName: 'edit',\n toolUseKind: 'edit',\n description: 'Edit a file by replacing text',\n inputSchema: z.looseObject({\n file_path: z.string().optional(),\n path: z.string().optional(),\n old_string: z.string().optional(),\n new_string: z.string().optional(),\n }),\n }),\n bash: commonTool('bash', {\n nativeName: 'bash',\n toolUseKind: 'bash',\n description: 'Execute a shell command',\n inputSchema: z.looseObject({\n command: z.string().optional(),\n }),\n }),\n glob: commonTool('glob', {\n nativeName: 'glob',\n toolUseKind: 'readonly',\n description: 'Find files matching a glob pattern',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n grep: commonTool('grep', {\n nativeName: 'grep',\n toolUseKind: 'readonly',\n description: 'Search file contents with regex',\n inputSchema: z.looseObject({\n pattern: z.string().optional(),\n path: z.string().optional(),\n }),\n }),\n ls: tool({\n description: 'List directory contents',\n inputSchema: z.looseObject({\n path: z.string().optional(),\n }),\n }),\n webfetch: tool({\n description: 'Fetch a URL',\n inputSchema: z.looseObject({\n url: z.string().optional(),\n prompt: z.string().optional(),\n }),\n }),\n skill: tool({\n description: 'Load an OpenCode skill by name',\n inputSchema: z.looseObject({\n name: z.string().optional(),\n }),\n }),\n todowrite: tool({\n description: 'Replace the OpenCode session todo list',\n inputSchema: z.looseObject({\n todos: z\n .array(\n z.looseObject({\n content: z.string().optional(),\n status: z.string().optional(),\n priority: z.string().optional(),\n }),\n )\n .optional(),\n }),\n }),\n agent: tool({\n description: 'Run an OpenCode subagent',\n inputSchema: z.looseObject({\n agent: z.string().optional(),\n prompt: z.string().optional(),\n description: z.string().optional(),\n metadata: optionalStringRecord,\n }),\n }),\n} as const satisfies Record<string, HarnessV1BuiltinTool<any, any>>;\n\nconst openCodeBridgeCoordsSchema = z.object({\n port: z.number(),\n token: z.string(),\n lastSeenEventId: z.number(),\n sandboxId: z.string().optional(),\n});\n\nconst openCodeResumeStateSchema = z.object({\n openCodeSessionId: z.string().optional(),\n bridge: openCodeBridgeCoordsSchema.optional(),\n sandboxCredentialEnvironment: z.record(z.string(), z.string()).optional(),\n});\n\ntype OpenCodeBridgeCoords = z.infer<typeof openCodeBridgeCoordsSchema>;\n\nexport function createOpenCode(\n settings: OpenCodeHarnessSettings = {},\n): HarnessV1<typeof OPENCODE_BUILTIN_TOOLS> {\n if (\n settings.mcpServers != null &&\n Object.prototype.hasOwnProperty.call(settings.mcpServers, 'harness-tools')\n ) {\n throw new Error(\n 'OpenCode MCP server name \"harness-tools\" is reserved for HarnessAgent tools.',\n );\n }\n return {\n specificationVersion: 'harness-v1',\n harnessId: 'opencode',\n builtinTools: OPENCODE_BUILTIN_TOOLS,\n supportsBuiltinToolApprovals: true,\n lifecycleStateSchema: openCodeResumeStateSchema,\n getBootstrap: getOpenCodeBootstrap,\n doStart: async startOpts => {\n const sandboxSession = startOpts.sandboxSession;\n const toolSafeSandboxSession =\n getRestrictedSandboxSession(sandboxSession);\n const sandboxId = 'id' in sandboxSession ? sandboxSession.id : undefined;\n validateBasicSandboxSettings({\n sandboxSession,\n port: settings.port,\n portEndpoint: settings.portEndpoint,\n });\n if (settings.mintBridgeToken != null && sandboxId == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness cannot use `mintBridgeToken` with a sandbox session that does not expose an id.',\n });\n }\n const defaultWorkingDirectory =\n await resolveSandboxDefaultWorkingDirectory({\n sandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;\n const isResume = lifecycleState != null;\n const isContinue = startOpts.continueFrom != null;\n const resumeData =\n isResume && typeof lifecycleState?.data === 'object'\n ? (lifecycleState.data as {\n openCodeSessionId?: unknown;\n bridge?: OpenCodeBridgeCoords;\n sandboxCredentialEnvironment?: Record<string, string>;\n })\n : undefined;\n const resumeSessionId =\n typeof resumeData?.openCodeSessionId === 'string' &&\n resumeData.openCodeSessionId.length > 0\n ? resumeData.openCodeSessionId\n : undefined;\n const coords = resumeData?.bridge;\n const authenticationMode = resolveOpenCodeAuthenticationMode({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n const resolvedAuthEnvironment = resolveOpenCodeEnv({\n auth: settings.auth,\n model: settings.model,\n provider: settings.provider,\n });\n let sandboxAuthEnvironment = resolvedAuthEnvironment;\n let sandboxCredentialEnvironment: Record<string, string> | undefined;\n let credentialsBrokered = false;\n if (\n 'addRequestTransformations' in sandboxSession &&\n sandboxSession.addRequestTransformations != null\n ) {\n sandboxCredentialEnvironment =\n resumeData?.sandboxCredentialEnvironment ??\n (await createSandboxCredentialEnvironment({\n environment: resolvedAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n }));\n sandboxAuthEnvironment = {\n ...resolvedAuthEnvironment,\n ...sandboxCredentialEnvironment,\n };\n const requestTransformations = createOpenCodeRequestTransformations({\n env: resolvedAuthEnvironment,\n sandboxEnv: sandboxAuthEnvironment,\n auth: authenticationMode,\n });\n if (requestTransformations.length > 0) {\n await sandboxSession.addRequestTransformations(\n requestTransformations,\n );\n }\n credentialsBrokered = true;\n } else {\n warnCredentialBrokeringUnavailable();\n }\n const bootstrapDir = path.posix.resolve(\n defaultWorkingDirectory,\n BOOTSTRAP_DIR,\n );\n const workDir = startOpts.sessionWorkDir;\n const sessionDataDir = `${defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;\n const bridgeStateDir = `${sessionDataDir}/bridge`;\n const timeoutMs = settings.startupTimeoutMs ?? 120_000;\n const model = splitOpenCodeModel(settings.model, settings.provider).model;\n\n const report = startOpts.observability?.report;\n const onDiagnostic = report\n ? (frame: Parameters<typeof harnessV1DiagnosticFromBridgeFrame>[0]) =>\n report(\n harnessV1DiagnosticFromBridgeFrame(frame, {\n sessionId: startOpts.sessionId,\n timestamp: Date.now(),\n }),\n )\n : undefined;\n const onBridgeError = createBridgeErrorHandler({\n harnessId: 'opencode',\n sessionId: startOpts.sessionId,\n });\n\n if (coords) {\n try {\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: coords.port,\n });\n const attachEndpoint = withBridgeToken({\n endpoint,\n token: coords.token,\n });\n let supportsUserMessageResponses = false;\n const attachChannel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: attachEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n initialLastSeenEventId: coords.lastSeenEventId,\n onDiagnostic,\n onBridgeError,\n });\n await attachChannel.open(isContinue ? { resume: true } : undefined);\n return createSession({\n sessionId: startOpts.sessionId,\n channel: attachChannel,\n proc: undefined,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: true,\n seedResumeSessionOnFirstPrompt: false,\n rerunContinue: false,\n bridgePort: coords.port,\n bridgeToken: coords.token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n } catch {}\n }\n\n let respawnStrategy: OpenCodeRespawnStrategy | undefined = isResume\n ? 'rerun'\n : undefined;\n if (coords && isContinue) {\n const logRaw = await Promise.resolve(\n toolSafeSandboxSession.readTextFile({\n path: `${bridgeStateDir}/event-log.ndjson`,\n abortSignal: startOpts.abortSignal,\n }),\n ).catch(() => null);\n if ((await classifyDiskLog(logRaw)) === 'replay') {\n respawnStrategy = 'replay';\n }\n }\n\n const port = resolveBridgePort({\n sandboxSession,\n override: settings.port,\n });\n const token =\n settings.mintBridgeToken == null\n ? randomBytes(32).toString('hex')\n : settings.mintBridgeToken(sandboxId!);\n const sandboxHomeDir = await resolveSandboxHomeDir({\n sandbox: toolSafeSandboxSession,\n abortSignal: startOpts.abortSignal,\n });\n const xdgConfigHome = `${sandboxHomeDir}/.config`;\n const xdgCacheHome = `${sandboxHomeDir}/.cache`;\n const xdgDataHome = `${sandboxHomeDir}/.local/share`;\n const xdgStateHome = `${sandboxHomeDir}/.local/state`;\n const skillSetup =\n startOpts.skills && startOpts.skills.length > 0\n ? await writeOpenCodeSkills({\n sandbox: toolSafeSandboxSession,\n skills: startOpts.skills,\n homeDir: sandboxHomeDir,\n abortSignal: startOpts.abortSignal,\n })\n : undefined;\n const forwardedAuthEnvironment = credentialsBrokered\n ? sandboxAuthEnvironment\n : await applyCredentialForwarding({\n environment: sandboxAuthEnvironment,\n credentialEnvironmentVariables:\n OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,\n credentialForwarding: settings.credentialForwarding,\n });\n const env = {\n ...forwardedAuthEnvironment,\n AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,\n BRIDGE_CHANNEL_TOKEN: token,\n BRIDGE_WS_PORT: String(port),\n HOME: sandboxHomeDir,\n USERPROFILE: sandboxHomeDir,\n XDG_CONFIG_HOME: xdgConfigHome,\n XDG_CACHE_HOME: xdgCacheHome,\n XDG_DATA_HOME: xdgDataHome,\n XDG_STATE_HOME: xdgStateHome,\n ...(respawnStrategy === 'replay'\n ? { BRIDGE_REPLAY_FROM_DISK: '1' }\n : {}),\n };\n\n if (respawnStrategy === undefined) {\n await toolSafeSandboxSession.run({\n command: `mkdir -p ${shellQuote(workDir)} ${shellQuote(bridgeStateDir)} ${shellQuote(xdgConfigHome)} ${shellQuote(xdgCacheHome)} ${shellQuote(xdgDataHome)} ${shellQuote(xdgStateHome)}`,\n abortSignal: startOpts.abortSignal,\n });\n }\n\n await markBridgeStarting({\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n abortSignal: startOpts.abortSignal,\n });\n\n const proc = await toolSafeSandboxSession.spawn({\n command: `node ${shellQuote(`${bootstrapDir}/bridge.mjs`)} --workdir ${shellQuote(workDir)} --bridge-state-dir ${shellQuote(bridgeStateDir)} --bootstrap-dir ${shellQuote(bootstrapDir)}${skillSetup ? ` --skills-dir ${shellQuote(skillSetup.skillsDir)}` : ''}`,\n env,\n abortSignal: startOpts.abortSignal,\n });\n const stderrTail: string[] = [];\n const bridgeStderrDone = forwardBridgeProcessStream({\n stream: proc.stderr,\n streamName: 'stderr',\n source: 'opencode',\n collectTail: stderrTail,\n });\n\n const { port: boundPort } = await waitForBridgeReady({\n proc,\n sandbox: toolSafeSandboxSession,\n bridgeStateDir,\n bridgeType: 'opencode',\n timeoutMs,\n abortSignal: startOpts.abortSignal,\n createTimeoutError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge did not become ready in time.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n createExitError: ({ proc, stdoutTail }) =>\n createBridgeStartupError({\n message: 'OpenCode bridge exited before becoming ready.',\n proc,\n stdoutTail,\n stderrTail,\n stderrDone: bridgeStderrDone,\n }),\n });\n void drainBridgeProcessStream(proc.stdout);\n\n const endpoint = await resolveBridgeEndpoint({\n sandboxSession,\n override: settings.portEndpoint,\n port: boundPort,\n });\n const bridgeEndpoint = withBridgeToken({ endpoint, token });\n let supportsUserMessageResponses = false;\n\n const channel: OpenCodeChannel = new SandboxChannel({\n connect: () =>\n openWebSocket({\n endpoint: bridgeEndpoint,\n helloTimeoutMs: Math.min(timeoutMs, 5_000),\n onHello: supported => {\n supportsUserMessageResponses = supported;\n },\n }),\n outboundSchema: outboundMessageSchema,\n onDiagnostic,\n onBridgeError,\n ...(respawnStrategy === 'replay'\n ? { initialLastSeenEventId: coords?.lastSeenEventId ?? 0 }\n : {}),\n });\n await channel.open(\n respawnStrategy === 'replay' ? { resume: true } : undefined,\n );\n\n return createSession({\n sessionId: startOpts.sessionId,\n channel,\n proc,\n model,\n provider: settings.provider,\n reasoningVariant: settings.reasoningVariant,\n mcpServers: settings.mcpServers,\n openCodeSessionId: resumeSessionId,\n isResume: respawnStrategy !== undefined,\n seedResumeSessionOnFirstPrompt: respawnStrategy !== undefined,\n rerunContinue: respawnStrategy === 'rerun',\n bridgePort: boundPort,\n bridgeToken: token,\n sandboxId,\n sandboxCredentialEnvironment,\n debug: startOpts.observability?.debug,\n permissionMode: startOpts.permissionMode,\n builtinToolFiltering: startOpts.builtinToolFiltering,\n supportsUserMessageResponses: () => supportsUserMessageResponses,\n });\n },\n };\n}\n\nfunction resolveBridgePort({\n sandboxSession,\n override,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: number | undefined;\n}): number {\n if (override !== undefined) return override;\n if ('ports' in sandboxSession && sandboxSession.ports.length > 0) {\n return sandboxSession.ports[0];\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness needs a TCP port exposed by the sandbox. ' +\n 'Create the sandbox with `ports: [<port>]` or pass `createOpenCode({ port })`.',\n });\n}\n\nfunction validateBasicSandboxSettings({\n sandboxSession,\n port,\n portEndpoint,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n port: number | undefined;\n portEndpoint: HarnessV1PortEndpoint | undefined;\n}): void {\n if ('getPortEndpoint' in sandboxSession) return;\n if (port == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `port` when using a basic sandbox session.',\n });\n }\n if (portEndpoint == null) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n }\n}\n\nasync function resolveBridgeEndpoint({\n sandboxSession,\n override,\n port,\n}: {\n sandboxSession: HarnessV1NetworkSandboxSession | SandboxSession;\n override: HarnessV1PortEndpoint | undefined;\n port: number;\n}): Promise<HarnessV1PortEndpoint> {\n if (override != null) return override;\n if ('getPortEndpoint' in sandboxSession) {\n return sandboxSession.getPortEndpoint({ port, protocol: 'ws' });\n }\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n 'The OpenCode harness requires an explicit `portEndpoint` when using a basic sandbox session.',\n });\n}\n\nasync function writeOpenCodeSkills({\n sandbox,\n skills,\n homeDir,\n abortSignal,\n}: {\n sandbox: SandboxSession;\n skills: ReadonlyArray<HarnessV1Skill>;\n homeDir: string;\n abortSignal?: AbortSignal;\n}): Promise<WriteSkillsResult> {\n const skillsDir = path.posix.join(homeDir, '.agents', 'skills');\n await writeHarnessSkills({\n sandbox,\n rootDir: skillsDir,\n skills,\n abortSignal,\n invalidSkillNameMessage: ({ name }) =>\n `Invalid OpenCode skill name: ${name}`,\n invalidSkillFilePathMessage: ({ skillName, filePath }) =>\n `Invalid OpenCode skill file path for ${skillName}: ${filePath}`,\n });\n\n return { skillsDir };\n}\n\nfunction openWebSocket({\n endpoint,\n helloTimeoutMs,\n onHello,\n}: {\n endpoint: HarnessV1PortEndpoint;\n helloTimeoutMs: number;\n onHello(supportsUserMessageResponses: boolean): void;\n}): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(endpoint.url, {\n headers: endpoint.headers == null ? undefined : { ...endpoint.headers },\n });\n let opened = false;\n let receivedHello = false;\n let settled = false;\n const cleanup = () => {\n clearTimeout(helloTimer);\n ws.off('open', onOpen);\n ws.off('message', onMessage);\n ws.off('close', onClose);\n ws.off('error', onError);\n };\n const settle = (error?: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n if (error == null) {\n resolve(ws);\n } else {\n reject(error);\n }\n };\n const tryResolve = () => {\n if (opened && receivedHello) settle();\n };\n const onOpen = () => {\n opened = true;\n tryResolve();\n };\n const onMessage = (raw: unknown) => {\n void (async () => {\n const parsed = await safeParseJSON({\n text: webSocketMessageToString(raw),\n });\n if (!parsed.success) return;\n const value = parsed.value;\n if (\n typeof value !== 'object' ||\n value == null ||\n Array.isArray(value) ||\n (value as { type?: unknown }).type !== 'bridge-hello'\n ) {\n return;\n }\n const capabilities = (\n value as {\n capabilities?: { experimental_userMessageResponses?: unknown };\n }\n ).capabilities;\n onHello(capabilities?.experimental_userMessageResponses === true);\n receivedHello = true;\n tryResolve();\n })();\n };\n const onClose = () =>\n settle(new Error('OpenCode bridge closed before sending bridge-hello.'));\n const onError = (err: Error) => {\n settle(err);\n };\n ws.on('open', onOpen);\n ws.on('message', onMessage);\n ws.on('close', onClose);\n ws.on('error', onError);\n const helloTimer = setTimeout(\n () =>\n settle(\n new Error(\n `OpenCode bridge did not send bridge-hello within ${helloTimeoutMs}ms.`,\n ),\n ),\n helloTimeoutMs,\n );\n helloTimer.unref?.();\n });\n}\n\nfunction webSocketMessageToString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Buffer.isBuffer(raw)) return raw.toString('utf8');\n if (Array.isArray(raw)) return Buffer.concat(raw).toString('utf8');\n if (raw instanceof ArrayBuffer) return Buffer.from(raw).toString('utf8');\n if (ArrayBuffer.isView(raw)) {\n return Buffer.from(raw.buffer, raw.byteOffset, raw.byteLength).toString(\n 'utf8',\n );\n }\n return String(raw);\n}\n\nfunction withBridgeToken({\n endpoint,\n token,\n}: {\n endpoint: HarnessV1PortEndpoint;\n token: string;\n}): HarnessV1PortEndpoint {\n const bridgeUrl = new URL(endpoint.url);\n bridgeUrl.searchParams.set('agent_bridge_token', token);\n return { ...endpoint, url: bridgeUrl.toString() };\n}\n\nfunction createSession({\n sessionId,\n channel,\n proc,\n model,\n provider,\n reasoningVariant,\n mcpServers,\n openCodeSessionId,\n isResume,\n seedResumeSessionOnFirstPrompt,\n rerunContinue,\n bridgePort,\n bridgeToken,\n sandboxId,\n sandboxCredentialEnvironment,\n debug,\n permissionMode,\n builtinToolFiltering,\n supportsUserMessageResponses,\n}: {\n sessionId: string;\n channel: OpenCodeChannel;\n proc: Experimental_SandboxProcess | undefined;\n model: string | undefined;\n provider: string | undefined;\n reasoningVariant: string | undefined;\n mcpServers: Record<string, unknown> | undefined;\n openCodeSessionId: string | undefined;\n isResume: boolean;\n seedResumeSessionOnFirstPrompt: boolean;\n rerunContinue: boolean;\n bridgePort: number;\n bridgeToken: string;\n sandboxId: string | undefined;\n sandboxCredentialEnvironment: Record<string, string> | undefined;\n debug: HarnessV1DebugConfig | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;\n supportsUserMessageResponses: () => boolean;\n}): HarnessV1Session {\n let stopped = false;\n let stopPromise: Promise<void> | undefined;\n let latestOpenCodeSessionId = openCodeSessionId;\n let pendingResumeSessionId = seedResumeSessionOnFirstPrompt\n ? openCodeSessionId\n : undefined;\n let activeTurn = false;\n const pendingCompactionParts: HarnessV1StreamPart[] = [];\n\n channel.on('bridge-thread', msg => {\n latestOpenCodeSessionId = msg.threadId;\n });\n const wireTurn = (turnOpts: {\n emit: (event: HarnessV1StreamPart) => void;\n abortSignal?: AbortSignal;\n }): HarnessV1PromptControl => {\n activeTurn = true;\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const userMessageSubmitter = supportsUserMessageResponses()\n ? experimental_createBridgeUserMessageSubmitter({\n send: message => channel.send(message),\n onResponse: listener => channel.on('user-message-response', listener),\n onReconnect: listener => channel.onReconnect(listener),\n })\n : undefined;\n\n const unsubs: Array<() => void> = [];\n const forward = (event: HarnessV1StreamPart) => {\n try {\n turnOpts.emit(event);\n } catch {}\n };\n\n const eventTypes = [\n 'stream-start',\n 'text-start',\n 'text-delta',\n 'text-end',\n 'reasoning-start',\n 'reasoning-delta',\n 'reasoning-end',\n 'tool-call',\n 'tool-approval-request',\n 'tool-result',\n 'file-change',\n 'finish-step',\n 'compaction',\n 'raw',\n ] as const;\n let isSettled = false;\n const settleSuccess = () => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close();\n for (const u of unsubs) u();\n pendingResolve!();\n };\n const settleError = (err: unknown) => {\n if (isSettled) return;\n isSettled = true;\n activeTurn = false;\n userMessageSubmitter?.close(err);\n for (const u of unsubs) u();\n pendingReject!(err);\n };\n\n for (const type of eventTypes) {\n unsubs.push(\n channel.on(type, msg => {\n forward(msg);\n }),\n );\n }\n unsubs.push(\n channel.on('finish', msg => {\n forward(msg);\n settleSuccess();\n }),\n );\n unsubs.push(\n channel.on('error', msg => {\n forward(msg);\n settleError(msg.error);\n }),\n );\n\n const onClose = (_code?: number, reason?: string) => {\n if (isSettled) return;\n if (reason === 'suspended') {\n settleSuccess();\n return;\n }\n settleError(\n new Error('OpenCode bridge closed before the turn finished.'),\n );\n };\n channel.onClose(onClose);\n\n const onAbort = () => {\n if (isSettled) return;\n try {\n channel.send({ type: 'abort' });\n } catch {}\n settleError(\n turnOpts.abortSignal?.reason ??\n new DOMException('Aborted', 'AbortError'),\n );\n };\n if (turnOpts.abortSignal) {\n if (turnOpts.abortSignal.aborted) {\n onAbort();\n } else {\n turnOpts.abortSignal.addEventListener('abort', onAbort, {\n once: true,\n });\n }\n }\n\n while (pendingCompactionParts.length > 0) {\n forward(pendingCompactionParts.shift()!);\n }\n\n return {\n submitToolResult: async input => {\n channel.send({\n type: 'tool-result',\n toolCallId: input.toolCallId,\n output: input.output,\n isError: input.isError,\n });\n },\n submitToolApproval: async input => {\n channel.send({\n type: 'tool-approval-response',\n approvalId: input.approvalId,\n approved: input.approved,\n reason: input.reason,\n });\n },\n ...(userMessageSubmitter == null\n ? {}\n : {\n submitUserMessage: async (text: string) => {\n await userMessageSubmitter.submit(text);\n },\n }),\n done,\n };\n };\n\n const startBase = () => ({\n model,\n provider,\n ...(reasoningVariant ? { variant: reasoningVariant } : {}),\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(builtinToolFiltering ? { builtinToolFiltering } : {}),\n ...(pendingResumeSessionId\n ? { resumeSessionId: pendingResumeSessionId }\n : latestOpenCodeSessionId\n ? { resumeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(debug ? { debug } : {}),\n });\n\n return {\n sessionId,\n isResume,\n modelId: model,\n doPromptTurn: async promptOpts => {\n if (\n promptOpts.responseFormat?.type === 'json' &&\n promptOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: promptOpts.emit,\n abortSignal: promptOpts.abortSignal,\n });\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: extractUserText(promptOpts.prompt),\n tools: (promptOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(promptOpts.responseFormat == null\n ? {}\n : { responseFormat: promptOpts.responseFormat }),\n ...(promptOpts.instructions\n ? { instructions: promptOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n return control;\n },\n doContinueTurn: async continueOpts => {\n if (\n continueOpts.responseFormat?.type === 'json' &&\n continueOpts.responseFormat.schema == null\n ) {\n throw new HarnessCapabilityUnsupportedError({\n message:\n \"Harness 'opencode' requires a JSON schema for structured output.\",\n harnessId: 'opencode',\n });\n }\n const control = wireTurn({\n emit: continueOpts.emit,\n abortSignal: continueOpts.abortSignal,\n });\n if (rerunContinue) {\n channel.send({\n type: 'start',\n operation: 'prompt',\n prompt: 'Continue.',\n tools: (continueOpts.tools ?? []).map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n ...(continueOpts.responseFormat == null\n ? {}\n : { responseFormat: continueOpts.responseFormat }),\n ...(continueOpts.instructions\n ? { instructions: continueOpts.instructions }\n : {}),\n ...startBase(),\n });\n pendingResumeSessionId = undefined;\n }\n return control;\n },\n doCompact: async (customInstructions?: string) => {\n if (customInstructions?.trim()) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports native manual compaction, but OpenCode does not expose custom compaction instructions through the supported API.\",\n });\n }\n if (activeTurn) {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message:\n \"Harness 'opencode' supports manual compaction between turns; compacting during an active turn is not supported by the bridge transport.\",\n });\n }\n await runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId: latestOpenCodeSessionId,\n onCompaction: part => pendingCompactionParts.push(part),\n });\n },\n doDetach: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot detach.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n return {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n },\n doDestroy: async () => {\n if (stopped) return stopPromise;\n stopped = true;\n stopPromise = (async () => {\n channel.beginClose();\n try {\n if (!channel.isClosed()) {\n channel.send({ type: 'destroy' });\n }\n } catch {}\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n })();\n return stopPromise;\n },\n doStop: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is already stopped; cannot stop.`,\n );\n }\n stopped = true;\n channel.beginClose();\n const data: unknown = channel.isClosed()\n ? {}\n : await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n unsub();\n reject(\n new Error(\n `OpenCode session ${sessionId} did not reply to stop within 5s.`,\n ),\n );\n }, 5000);\n timer.unref?.();\n const unsub = channel.on('bridge-stop', msg => {\n clearTimeout(timer);\n unsub();\n resolve(msg.data);\n });\n try {\n channel.send({ type: 'stop' });\n } catch (err) {\n clearTimeout(timer);\n unsub();\n reject(err);\n }\n });\n\n let stopTimer: ReturnType<typeof setTimeout> | undefined;\n try {\n if (proc) {\n await Promise.race([\n proc.wait(),\n new Promise<void>(resolve => {\n stopTimer = setTimeout(resolve, 5000);\n stopTimer.unref?.();\n }),\n ]);\n }\n } finally {\n if (stopTimer) clearTimeout(stopTimer);\n try {\n await proc?.kill();\n } catch {}\n channel.close();\n }\n\n const lifecycleData =\n data != null && typeof data === 'object' && !Array.isArray(data)\n ? { ...(data as Record<string, unknown>) }\n : {};\n const payload: HarnessV1ResumeSessionState = {\n type: 'resume-session',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...lifecycleData,\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n } as HarnessV1ResumeSessionState['data'],\n };\n return payload;\n },\n doSuspendTurn: async () => {\n if (stopped) {\n throw new Error(\n `OpenCode session ${sessionId} is stopped; cannot suspend.`,\n );\n }\n stopped = true;\n const lastSeenEventId = await channel.suspend();\n const payload: HarnessV1ContinueTurnState = {\n type: 'continue-turn',\n harnessId: 'opencode',\n specificationVersion: 'harness-v1',\n data: {\n ...(latestOpenCodeSessionId\n ? { openCodeSessionId: latestOpenCodeSessionId }\n : {}),\n ...(sandboxCredentialEnvironment == null\n ? {}\n : { sandboxCredentialEnvironment }),\n bridge: {\n port: bridgePort,\n token: bridgeToken,\n lastSeenEventId,\n ...(sandboxId == null ? {} : { sandboxId }),\n },\n },\n };\n return payload;\n },\n };\n}\n\nasync function runCompactOperation({\n channel,\n model,\n provider,\n permissionMode,\n debug,\n mcpServers,\n resumeSessionId,\n onCompaction,\n}: {\n channel: OpenCodeChannel;\n model: string | undefined;\n provider: string | undefined;\n permissionMode: HarnessV1PermissionMode | undefined;\n debug: HarnessV1DebugConfig | undefined;\n mcpServers: Record<string, unknown> | undefined;\n resumeSessionId: string | undefined;\n onCompaction: (part: HarnessV1StreamPart) => void;\n}): Promise<void> {\n let pendingResolve: (() => void) | undefined;\n let pendingReject: ((err: unknown) => void) | undefined;\n const done = new Promise<void>((resolve, reject) => {\n pendingResolve = resolve;\n pendingReject = reject;\n });\n const unsubs = [\n channel.on('compaction', msg => onCompaction(msg)),\n channel.on('finish', () => {\n for (const u of unsubs) u();\n pendingResolve!();\n }),\n channel.on('error', msg => {\n for (const u of unsubs) u();\n pendingReject!(msg.error);\n }),\n ];\n channel.send({\n type: 'start',\n operation: 'compact',\n prompt: '',\n tools: [],\n model,\n provider,\n ...(mcpServers == null ? {} : { mcpServers }),\n ...(permissionMode ? { permissionMode } : {}),\n ...(resumeSessionId ? { resumeSessionId } : {}),\n ...(debug ? { debug } : {}),\n });\n await done;\n}\n\nfunction extractUserText(prompt: HarnessV1Prompt): string {\n if (typeof prompt === 'string') return prompt;\n const { content } = prompt;\n if (typeof content === 'string') return content;\n const parts: string[] = [];\n for (const part of content) {\n if (part.type !== 'text') {\n throw new HarnessCapabilityUnsupportedError({\n harnessId: 'opencode',\n message: `The OpenCode harness does not yet support user message parts of type '${part.type}'. Pass a string or a user message whose content contains only text parts.`,\n });\n }\n parts.push(part.text);\n }\n return parts.join('\\n\\n');\n}\n","import { readFile } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport type { HarnessV1Bootstrap } from '@ai-sdk/harness';\n\nexport const OPENCODE_BOOTSTRAP_DIR = '.harness-bootstrap/opencode';\n\nlet cachedBootstrap: HarnessV1Bootstrap | undefined;\n\nexport async function getOpenCodeBootstrap(): Promise<HarnessV1Bootstrap> {\n if (cachedBootstrap != null) return cachedBootstrap;\n const [pkg, lock, workspace, bridge, hostToolMcp] = await Promise.all([\n readBridgeAsset('package.json'),\n readBridgeAsset('pnpm-lock.yaml'),\n readBridgeAsset('pnpm-workspace.yaml'),\n readBridgeAsset('index.mjs'),\n readBridgeAsset('host-tool-mcp.mjs'),\n ]);\n cachedBootstrap = {\n harnessId: 'opencode',\n bootstrapDir: OPENCODE_BOOTSTRAP_DIR,\n files: [\n { path: `${OPENCODE_BOOTSTRAP_DIR}/package.json`, content: pkg },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-lock.yaml`, content: lock },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/pnpm-workspace.yaml`,\n content: workspace,\n },\n { path: `${OPENCODE_BOOTSTRAP_DIR}/bridge.mjs`, content: bridge },\n {\n path: `${OPENCODE_BOOTSTRAP_DIR}/host-tool-mcp.mjs`,\n content: hostToolMcp,\n },\n ],\n commands: [\n {\n command: 'pnpm install --frozen-lockfile --store-dir .pnpm-store',\n },\n {\n command: './node_modules/.bin/opencode --version',\n },\n ],\n };\n return cachedBootstrap;\n}\n\nasync function readBridgeAsset(name: string): Promise<string> {\n const candidates = [\n new URL(`./bridge/${name}`, import.meta.url),\n new URL(`../bridge/${name}`, import.meta.url),\n ];\n let lastErr: unknown;\n for (const url of candidates) {\n try {\n return await readFile(fileURLToPath(url), 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n lastErr = err;\n }\n }\n throw lastErr ?? new Error(`bridge asset not found: ${name}`);\n}\n","import type {\n HarnessV1RequestTransformation,\n HarnessV1RequestTransformationSources,\n} from '@ai-sdk/harness';\nimport {\n createCredentialRequestTransformation,\n getAiGatewayAuthFromEnv,\n} from '@ai-sdk/harness/utils';\n\nexport const OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [\n 'AI_GATEWAY_API_KEY',\n 'OPENAI_API_KEY',\n 'ANTHROPIC_API_KEY',\n 'ANTHROPIC_AUTH_TOKEN',\n] as const;\n\nexport function createOpenCodeRequestTransformations({\n env: environment,\n sandboxEnv: sandboxEnvironment,\n auth: authenticationMode,\n}: HarnessV1RequestTransformationSources<OpenCodeResolvedAuthenticationMode>): HarnessV1RequestTransformation[] {\n switch (authenticationMode) {\n case 'ai-gateway':\n return environment.AI_GATEWAY_API_KEY &&\n sandboxEnvironment.AI_GATEWAY_API_KEY\n ? [\n createCredentialRequestTransformation({\n matchUrl: environment.AI_GATEWAY_BASE_URL,\n matchHeaders: {\n 'x-api-key': sandboxEnvironment.AI_GATEWAY_API_KEY,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`,\n },\n }),\n createCredentialRequestTransformation({\n matchUrl: environment.AI_GATEWAY_BASE_URL,\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.AI_GATEWAY_API_KEY}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`,\n },\n }),\n ]\n : [];\n case 'openai':\n return environment.OPENAI_API_KEY && sandboxEnvironment.OPENAI_API_KEY\n ? [\n createCredentialRequestTransformation({\n matchUrl:\n environment.OPENAI_BASE_URL ?? 'https://api.openai.com/v1',\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.OPENAI_API_KEY}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.OPENAI_API_KEY}`,\n },\n }),\n ]\n : [];\n case 'anthropic': {\n const matchUrl =\n environment.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com';\n const transformations: HarnessV1RequestTransformation[] = [];\n\n if (\n environment.ANTHROPIC_API_KEY != null &&\n sandboxEnvironment.ANTHROPIC_API_KEY != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n 'x-api-key': sandboxEnvironment.ANTHROPIC_API_KEY,\n },\n transformHeaders: {\n 'x-api-key': environment.ANTHROPIC_API_KEY,\n },\n }),\n );\n }\n\n if (\n environment.ANTHROPIC_AUTH_TOKEN != null &&\n sandboxEnvironment.ANTHROPIC_AUTH_TOKEN != null\n ) {\n transformations.push(\n createCredentialRequestTransformation({\n matchUrl,\n matchHeaders: {\n Authorization: `Bearer ${sandboxEnvironment.ANTHROPIC_AUTH_TOKEN}`,\n },\n transformHeaders: {\n Authorization: `Bearer ${environment.ANTHROPIC_AUTH_TOKEN}`,\n },\n }),\n );\n }\n\n return transformations;\n }\n }\n}\n\nexport type OpenCodeResolvedAuthenticationMode =\n | 'anthropic'\n | 'openai'\n | 'ai-gateway';\n\nexport type OpenCodeAuthenticationMode =\n | OpenCodeResolvedAuthenticationMode\n | 'auto';\n\n/**\n * @deprecated Passing an object to auth options is deprecated. Use an `OpenCodeAuthenticationMode` string value (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.\n */\nexport type LegacyOpenCodeAuthOptions = {\n readonly gateway?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n };\n readonly anthropic?: {\n readonly apiKey?: string;\n readonly authToken?: string;\n readonly baseUrl?: string;\n };\n readonly openai?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly organization?: string;\n readonly project?: string;\n };\n readonly openaiCompatible?: {\n readonly apiKey?: string;\n readonly baseUrl?: string;\n readonly name?: string;\n readonly queryParams?: Record<string, string>;\n };\n};\n\nexport type OpenCodeAuthOptions =\n | OpenCodeAuthenticationMode\n | LegacyOpenCodeAuthOptions;\n\nexport function resolveOpenCodeProvider({\n model,\n provider,\n}: {\n model?: string;\n provider?: string;\n}): 'anthropic' | 'openai' {\n if (provider === 'anthropic' || provider === 'openai') {\n return provider;\n }\n if (model?.includes('/')) {\n const [modelProvider] = model.split('/');\n if (modelProvider === 'anthropic' || modelProvider === 'openai') {\n return modelProvider;\n }\n }\n return 'anthropic';\n}\n\nexport function splitOpenCodeModel(\n model: string | undefined,\n provider: string | undefined,\n): { providerID?: string; modelID?: string; model?: string } {\n if (!model) return {};\n if (model.includes('/')) {\n const [providerID, ...rest] = model.split('/');\n return {\n providerID,\n modelID: rest.join('/'),\n model,\n };\n }\n return {\n providerID: provider,\n modelID: model,\n model: provider ? `${provider}/${model}` : model,\n };\n}\n\nexport function resolveOpenCodeEnv({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): Record<string, string> {\n const normalizedAuth = normalizeOpenCodeAuthToLegacyAuth(auth);\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (normalizedAuth?.openaiCompatible) {\n return pickOpenAICompatible(normalizedAuth.openaiCompatible, processEnv);\n }\n if (selectedProvider === 'openai') {\n if (normalizedAuth?.openai) {\n return pickOpenAI({ explicit: normalizedAuth.openai, processEnv });\n }\n } else if (normalizedAuth?.anthropic) {\n return pickAnthropic({ explicit: normalizedAuth.anthropic, processEnv });\n }\n\n const gatewayAuthFromEnv = getAiGatewayAuthFromEnv({ env: processEnv });\n if (normalizedAuth?.gateway) {\n return pickGateway({\n explicit: normalizedAuth.gateway,\n gatewayAuthFromEnv,\n });\n }\n if (gatewayAuthFromEnv.apiKey) {\n return pickGateway({ explicit: {}, gatewayAuthFromEnv });\n }\n return selectedProvider === 'openai'\n ? pickOpenAI({ processEnv })\n : pickAnthropic({ processEnv });\n}\n\nexport function resolveOpenCodeAuthenticationMode({\n auth,\n model,\n provider,\n processEnv = process.env,\n}: {\n auth: OpenCodeAuthOptions | undefined;\n model?: string;\n provider?: string;\n processEnv?: Record<string, string | undefined>;\n}): OpenCodeResolvedAuthenticationMode {\n if (typeof auth !== 'string' && auth?.openaiCompatible) {\n return 'openai';\n }\n\n const selectedProvider = resolveOpenCodeProvider({ model, provider });\n if (\n selectedProvider === 'openai' &&\n (auth === 'openai' || (typeof auth !== 'string' && auth?.openai))\n ) {\n return 'openai';\n }\n if (\n selectedProvider === 'anthropic' &&\n (auth === 'anthropic' || (typeof auth !== 'string' && auth?.anthropic))\n ) {\n return 'anthropic';\n }\n if (auth === 'ai-gateway' || (typeof auth !== 'string' && auth?.gateway)) {\n return 'ai-gateway';\n }\n if (getAiGatewayAuthFromEnv({ env: processEnv }).apiKey) {\n return 'ai-gateway';\n }\n return selectedProvider;\n}\n\nfunction normalizeOpenCodeAuthToLegacyAuth(\n auth: OpenCodeAuthOptions | undefined,\n): LegacyOpenCodeAuthOptions | undefined {\n if (auth == null || auth === 'auto') {\n return undefined;\n }\n if (typeof auth === 'string') {\n switch (auth) {\n case 'anthropic':\n return { anthropic: {} };\n case 'openai':\n return { openai: {} };\n case 'ai-gateway':\n return { gateway: {} };\n default:\n return undefined;\n }\n }\n\n console.warn(\n '[opencode] Passing an object to auth options is deprecated. Use a string mode (\"auto\" | \"anthropic\" | \"openai\" | \"ai-gateway\") instead, and pass credentials via environment variables.',\n );\n return auth;\n}\n\nfunction pickOpenAICompatible(\n explicit: NonNullable<LegacyOpenCodeAuthOptions['openaiCompatible']>,\n processEnv: Record<string, string | undefined>,\n): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const name = explicit.name ?? processEnv.OPENAI_NAME;\n if (name) env.OPENAI_NAME = name;\n if (explicit.queryParams && Object.keys(explicit.queryParams).length > 0) {\n env.OPENAI_QUERY_PARAMS_JSON = JSON.stringify(explicit.queryParams);\n } else if (processEnv.OPENAI_QUERY_PARAMS_JSON) {\n env.OPENAI_QUERY_PARAMS_JSON = processEnv.OPENAI_QUERY_PARAMS_JSON;\n }\n return env;\n}\n\nfunction pickOpenAI({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['openai']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.OPENAI_API_KEY;\n if (apiKey) env.OPENAI_API_KEY = apiKey;\n const baseUrl = explicit?.baseUrl ?? processEnv.OPENAI_BASE_URL;\n if (baseUrl) env.OPENAI_BASE_URL = baseUrl;\n const organization = explicit?.organization ?? processEnv.OPENAI_ORGANIZATION;\n if (organization) env.OPENAI_ORGANIZATION = organization;\n const project = explicit?.project ?? processEnv.OPENAI_PROJECT;\n if (project) env.OPENAI_PROJECT = project;\n return env;\n}\n\nfunction pickAnthropic({\n explicit,\n processEnv,\n}: {\n explicit?: NonNullable<LegacyOpenCodeAuthOptions['anthropic']>;\n processEnv: Record<string, string | undefined>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit?.apiKey ?? processEnv.ANTHROPIC_API_KEY;\n if (apiKey) env.ANTHROPIC_API_KEY = apiKey;\n const authToken = explicit?.authToken ?? processEnv.ANTHROPIC_AUTH_TOKEN;\n if (authToken) env.ANTHROPIC_AUTH_TOKEN = authToken;\n const baseUrl = explicit?.baseUrl ?? processEnv.ANTHROPIC_BASE_URL;\n if (baseUrl) env.ANTHROPIC_BASE_URL = baseUrl;\n return env;\n}\n\nfunction pickGateway({\n explicit,\n gatewayAuthFromEnv,\n}: {\n explicit: NonNullable<LegacyOpenCodeAuthOptions['gateway']>;\n gatewayAuthFromEnv: ReturnType<typeof getAiGatewayAuthFromEnv>;\n}): Record<string, string> {\n const env: Record<string, string> = {};\n const apiKey = explicit.apiKey ?? gatewayAuthFromEnv.apiKey;\n if (apiKey) env.AI_GATEWAY_API_KEY = apiKey;\n const baseUrl = toOpenCodeGatewayBaseUrl(\n explicit.baseUrl ?? gatewayAuthFromEnv.baseUrl,\n );\n env.AI_GATEWAY_BASE_URL = baseUrl;\n return env;\n}\n\nexport function toOpenCodeGatewayBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.replace(/\\/+$/, '');\n return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;\n}\n","import {\n harnessV1BridgeInboundCommandSchemas,\n harnessV1BridgeOutboundMessageSchema,\n harnessV1BridgeReadySchema,\n harnessV1BridgeStartBaseSchema,\n} from '@ai-sdk/harness';\nimport { z } from 'zod/v4';\n\nexport const outboundMessageSchema = harnessV1BridgeOutboundMessageSchema;\nexport type OutboundMessage = z.infer<typeof outboundMessageSchema>;\n\nexport const startMessageSchema = harnessV1BridgeStartBaseSchema.extend({\n operation: z.enum(['prompt', 'compact']).optional(),\n provider: z.string().optional(),\n variant: z.string().optional(),\n instructions: z.string().optional(),\n resumeSessionId: z.string().optional(),\n mcpServers: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type StartMessage = z.infer<typeof startMessageSchema>;\n\nexport const inboundMessageSchema = z.discriminatedUnion('type', [\n startMessageSchema,\n ...harnessV1BridgeInboundCommandSchemas,\n]);\nexport type InboundMessage = z.infer<typeof inboundMessageSchema>;\n\nexport const bridgeReadySchema = harnessV1BridgeReadySchema;\nexport type BridgeReady = z.infer<typeof bridgeReadySchema>;\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import { createOpenCode } from './opencode-harness';\n\n/**\n * Default `openCode` harness instance with no overrides. Equivalent to\n * `createOpenCode()`.\n */\nexport const openCode = createOpenCode();\n\nexport { createOpenCode } from './opencode-harness';\nexport { VERSION } from './version';\nexport type { OpenCodeHarnessSettings } from './opencode-harness';\nexport type {\n OpenCodeAuthenticationMode,\n OpenCodeAuthOptions,\n} from './opencode-auth';\n"],"mappings":"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","names":["z","z","endpoint","supportsUserMessageResponses","proc"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/harness-opencode",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.91",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ai-sdk/harness": "1.0.
|
|
30
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
29
|
+
"@ai-sdk/harness": "1.0.90",
|
|
30
|
+
"@ai-sdk/provider-utils": "5.0.32",
|
|
31
31
|
"ws": "8.21.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {
|
package/src/opencode-auth.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {
|
|
2
|
+
HarnessV1RequestTransformation,
|
|
3
|
+
HarnessV1RequestTransformationSources,
|
|
4
|
+
} from '@ai-sdk/harness';
|
|
2
5
|
import {
|
|
3
6
|
createCredentialRequestTransformation,
|
|
4
7
|
getAiGatewayAuthFromEnv,
|
|
@@ -11,47 +14,91 @@ export const OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES = [
|
|
|
11
14
|
'ANTHROPIC_AUTH_TOKEN',
|
|
12
15
|
] as const;
|
|
13
16
|
|
|
14
|
-
export function createOpenCodeRequestTransformations(
|
|
15
|
-
env:
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
export function createOpenCodeRequestTransformations({
|
|
18
|
+
env: environment,
|
|
19
|
+
sandboxEnv: sandboxEnvironment,
|
|
20
|
+
auth: authenticationMode,
|
|
21
|
+
}: HarnessV1RequestTransformationSources<OpenCodeResolvedAuthenticationMode>): HarnessV1RequestTransformation[] {
|
|
22
|
+
switch (authenticationMode) {
|
|
19
23
|
case 'ai-gateway':
|
|
20
|
-
return
|
|
24
|
+
return environment.AI_GATEWAY_API_KEY &&
|
|
25
|
+
sandboxEnvironment.AI_GATEWAY_API_KEY
|
|
21
26
|
? [
|
|
22
27
|
createCredentialRequestTransformation({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
matchUrl: environment.AI_GATEWAY_BASE_URL,
|
|
29
|
+
matchHeaders: {
|
|
30
|
+
'x-api-key': sandboxEnvironment.AI_GATEWAY_API_KEY,
|
|
31
|
+
},
|
|
32
|
+
transformHeaders: {
|
|
33
|
+
Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`,
|
|
34
|
+
},
|
|
35
|
+
}),
|
|
36
|
+
createCredentialRequestTransformation({
|
|
37
|
+
matchUrl: environment.AI_GATEWAY_BASE_URL,
|
|
38
|
+
matchHeaders: {
|
|
39
|
+
Authorization: `Bearer ${sandboxEnvironment.AI_GATEWAY_API_KEY}`,
|
|
40
|
+
},
|
|
41
|
+
transformHeaders: {
|
|
42
|
+
Authorization: `Bearer ${environment.AI_GATEWAY_API_KEY}`,
|
|
26
43
|
},
|
|
27
44
|
}),
|
|
28
45
|
]
|
|
29
46
|
: [];
|
|
30
47
|
case 'openai':
|
|
31
|
-
return
|
|
48
|
+
return environment.OPENAI_API_KEY && sandboxEnvironment.OPENAI_API_KEY
|
|
32
49
|
? [
|
|
33
50
|
createCredentialRequestTransformation({
|
|
34
|
-
|
|
35
|
-
|
|
51
|
+
matchUrl:
|
|
52
|
+
environment.OPENAI_BASE_URL ?? 'https://api.openai.com/v1',
|
|
53
|
+
matchHeaders: {
|
|
54
|
+
Authorization: `Bearer ${sandboxEnvironment.OPENAI_API_KEY}`,
|
|
55
|
+
},
|
|
56
|
+
transformHeaders: {
|
|
57
|
+
Authorization: `Bearer ${environment.OPENAI_API_KEY}`,
|
|
58
|
+
},
|
|
36
59
|
}),
|
|
37
60
|
]
|
|
38
61
|
: [];
|
|
39
62
|
case 'anthropic': {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
63
|
+
const matchUrl =
|
|
64
|
+
environment.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com';
|
|
65
|
+
const transformations: HarnessV1RequestTransformation[] = [];
|
|
66
|
+
|
|
67
|
+
if (
|
|
68
|
+
environment.ANTHROPIC_API_KEY != null &&
|
|
69
|
+
sandboxEnvironment.ANTHROPIC_API_KEY != null
|
|
70
|
+
) {
|
|
71
|
+
transformations.push(
|
|
72
|
+
createCredentialRequestTransformation({
|
|
73
|
+
matchUrl,
|
|
74
|
+
matchHeaders: {
|
|
75
|
+
'x-api-key': sandboxEnvironment.ANTHROPIC_API_KEY,
|
|
76
|
+
},
|
|
77
|
+
transformHeaders: {
|
|
78
|
+
'x-api-key': environment.ANTHROPIC_API_KEY,
|
|
79
|
+
},
|
|
80
|
+
}),
|
|
81
|
+
);
|
|
43
82
|
}
|
|
44
|
-
|
|
45
|
-
|
|
83
|
+
|
|
84
|
+
if (
|
|
85
|
+
environment.ANTHROPIC_AUTH_TOKEN != null &&
|
|
86
|
+
sandboxEnvironment.ANTHROPIC_AUTH_TOKEN != null
|
|
87
|
+
) {
|
|
88
|
+
transformations.push(
|
|
89
|
+
createCredentialRequestTransformation({
|
|
90
|
+
matchUrl,
|
|
91
|
+
matchHeaders: {
|
|
92
|
+
Authorization: `Bearer ${sandboxEnvironment.ANTHROPIC_AUTH_TOKEN}`,
|
|
93
|
+
},
|
|
94
|
+
transformHeaders: {
|
|
95
|
+
Authorization: `Bearer ${environment.ANTHROPIC_AUTH_TOKEN}`,
|
|
96
|
+
},
|
|
97
|
+
}),
|
|
98
|
+
);
|
|
46
99
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
: [
|
|
50
|
-
createCredentialRequestTransformation({
|
|
51
|
-
baseUrl: env.ANTHROPIC_BASE_URL ?? 'https://api.anthropic.com',
|
|
52
|
-
headers,
|
|
53
|
-
}),
|
|
54
|
-
];
|
|
100
|
+
|
|
101
|
+
return transformations;
|
|
55
102
|
}
|
|
56
103
|
}
|
|
57
104
|
}
|
package/src/opencode-harness.ts
CHANGED
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
import {
|
|
24
24
|
applyCredentialForwarding,
|
|
25
25
|
classifyDiskLog,
|
|
26
|
+
createSandboxCredentialEnvironment,
|
|
26
27
|
experimental_createBridgeUserMessageSubmitter,
|
|
27
28
|
createBridgeErrorHandler,
|
|
28
29
|
createBridgeStartupError,
|
|
@@ -30,7 +31,6 @@ import {
|
|
|
30
31
|
forwardBridgeProcessStream,
|
|
31
32
|
getRestrictedSandboxSession,
|
|
32
33
|
markBridgeStarting,
|
|
33
|
-
maskSandboxCredentials,
|
|
34
34
|
resolveSandboxDefaultWorkingDirectory,
|
|
35
35
|
resolveSandboxHomeDir,
|
|
36
36
|
SandboxChannel,
|
|
@@ -226,6 +226,7 @@ const openCodeBridgeCoordsSchema = z.object({
|
|
|
226
226
|
const openCodeResumeStateSchema = z.object({
|
|
227
227
|
openCodeSessionId: z.string().optional(),
|
|
228
228
|
bridge: openCodeBridgeCoordsSchema.optional(),
|
|
229
|
+
sandboxCredentialEnvironment: z.record(z.string(), z.string()).optional(),
|
|
229
230
|
});
|
|
230
231
|
|
|
231
232
|
type OpenCodeBridgeCoords = z.infer<typeof openCodeBridgeCoordsSchema>;
|
|
@@ -270,6 +271,23 @@ export function createOpenCode(
|
|
|
270
271
|
sandboxSession,
|
|
271
272
|
abortSignal: startOpts.abortSignal,
|
|
272
273
|
});
|
|
274
|
+
const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;
|
|
275
|
+
const isResume = lifecycleState != null;
|
|
276
|
+
const isContinue = startOpts.continueFrom != null;
|
|
277
|
+
const resumeData =
|
|
278
|
+
isResume && typeof lifecycleState?.data === 'object'
|
|
279
|
+
? (lifecycleState.data as {
|
|
280
|
+
openCodeSessionId?: unknown;
|
|
281
|
+
bridge?: OpenCodeBridgeCoords;
|
|
282
|
+
sandboxCredentialEnvironment?: Record<string, string>;
|
|
283
|
+
})
|
|
284
|
+
: undefined;
|
|
285
|
+
const resumeSessionId =
|
|
286
|
+
typeof resumeData?.openCodeSessionId === 'string' &&
|
|
287
|
+
resumeData.openCodeSessionId.length > 0
|
|
288
|
+
? resumeData.openCodeSessionId
|
|
289
|
+
: undefined;
|
|
290
|
+
const coords = resumeData?.bridge;
|
|
273
291
|
const authenticationMode = resolveOpenCodeAuthenticationMode({
|
|
274
292
|
auth: settings.auth,
|
|
275
293
|
model: settings.model,
|
|
@@ -281,24 +299,35 @@ export function createOpenCode(
|
|
|
281
299
|
provider: settings.provider,
|
|
282
300
|
});
|
|
283
301
|
let sandboxAuthEnvironment = resolvedAuthEnvironment;
|
|
302
|
+
let sandboxCredentialEnvironment: Record<string, string> | undefined;
|
|
303
|
+
let credentialsBrokered = false;
|
|
284
304
|
if (
|
|
285
305
|
'addRequestTransformations' in sandboxSession &&
|
|
286
306
|
sandboxSession.addRequestTransformations != null
|
|
287
307
|
) {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
308
|
+
sandboxCredentialEnvironment =
|
|
309
|
+
resumeData?.sandboxCredentialEnvironment ??
|
|
310
|
+
(await createSandboxCredentialEnvironment({
|
|
311
|
+
environment: resolvedAuthEnvironment,
|
|
312
|
+
credentialEnvironmentVariables:
|
|
313
|
+
OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,
|
|
314
|
+
credentialForwarding: settings.credentialForwarding,
|
|
315
|
+
}));
|
|
316
|
+
sandboxAuthEnvironment = {
|
|
317
|
+
...resolvedAuthEnvironment,
|
|
318
|
+
...sandboxCredentialEnvironment,
|
|
319
|
+
};
|
|
320
|
+
const requestTransformations = createOpenCodeRequestTransformations({
|
|
321
|
+
env: resolvedAuthEnvironment,
|
|
322
|
+
sandboxEnv: sandboxAuthEnvironment,
|
|
323
|
+
auth: authenticationMode,
|
|
324
|
+
});
|
|
292
325
|
if (requestTransformations.length > 0) {
|
|
293
326
|
await sandboxSession.addRequestTransformations(
|
|
294
327
|
requestTransformations,
|
|
295
328
|
);
|
|
296
329
|
}
|
|
297
|
-
|
|
298
|
-
environment: resolvedAuthEnvironment,
|
|
299
|
-
credentialEnvironmentVariables:
|
|
300
|
-
OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,
|
|
301
|
-
});
|
|
330
|
+
credentialsBrokered = true;
|
|
302
331
|
} else {
|
|
303
332
|
warnCredentialBrokeringUnavailable();
|
|
304
333
|
}
|
|
@@ -306,23 +335,6 @@ export function createOpenCode(
|
|
|
306
335
|
defaultWorkingDirectory,
|
|
307
336
|
BOOTSTRAP_DIR,
|
|
308
337
|
);
|
|
309
|
-
const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;
|
|
310
|
-
const isResume = lifecycleState != null;
|
|
311
|
-
const isContinue = startOpts.continueFrom != null;
|
|
312
|
-
const resumeData =
|
|
313
|
-
isResume && typeof lifecycleState?.data === 'object'
|
|
314
|
-
? (lifecycleState.data as {
|
|
315
|
-
openCodeSessionId?: unknown;
|
|
316
|
-
bridge?: OpenCodeBridgeCoords;
|
|
317
|
-
})
|
|
318
|
-
: undefined;
|
|
319
|
-
const resumeSessionId =
|
|
320
|
-
typeof resumeData?.openCodeSessionId === 'string' &&
|
|
321
|
-
resumeData.openCodeSessionId.length > 0
|
|
322
|
-
? resumeData.openCodeSessionId
|
|
323
|
-
: undefined;
|
|
324
|
-
const coords = resumeData?.bridge;
|
|
325
|
-
|
|
326
338
|
const workDir = startOpts.sessionWorkDir;
|
|
327
339
|
const sessionDataDir = `${defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;
|
|
328
340
|
const bridgeStateDir = `${sessionDataDir}/bridge`;
|
|
@@ -386,6 +398,7 @@ export function createOpenCode(
|
|
|
386
398
|
bridgePort: coords.port,
|
|
387
399
|
bridgeToken: coords.token,
|
|
388
400
|
sandboxId,
|
|
401
|
+
sandboxCredentialEnvironment,
|
|
389
402
|
debug: startOpts.observability?.debug,
|
|
390
403
|
permissionMode: startOpts.permissionMode,
|
|
391
404
|
builtinToolFiltering: startOpts.builtinToolFiltering,
|
|
@@ -434,12 +447,14 @@ export function createOpenCode(
|
|
|
434
447
|
abortSignal: startOpts.abortSignal,
|
|
435
448
|
})
|
|
436
449
|
: undefined;
|
|
437
|
-
const forwardedAuthEnvironment =
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
450
|
+
const forwardedAuthEnvironment = credentialsBrokered
|
|
451
|
+
? sandboxAuthEnvironment
|
|
452
|
+
: await applyCredentialForwarding({
|
|
453
|
+
environment: sandboxAuthEnvironment,
|
|
454
|
+
credentialEnvironmentVariables:
|
|
455
|
+
OPENCODE_CREDENTIAL_ENVIRONMENT_VARIABLES,
|
|
456
|
+
credentialForwarding: settings.credentialForwarding,
|
|
457
|
+
});
|
|
443
458
|
const env = {
|
|
444
459
|
...forwardedAuthEnvironment,
|
|
445
460
|
AI_SDK_HARNESS_CLIENT_APP: OPENCODE_CLIENT_APP,
|
|
@@ -552,6 +567,7 @@ export function createOpenCode(
|
|
|
552
567
|
bridgePort: boundPort,
|
|
553
568
|
bridgeToken: token,
|
|
554
569
|
sandboxId,
|
|
570
|
+
sandboxCredentialEnvironment,
|
|
555
571
|
debug: startOpts.observability?.debug,
|
|
556
572
|
permissionMode: startOpts.permissionMode,
|
|
557
573
|
builtinToolFiltering: startOpts.builtinToolFiltering,
|
|
@@ -779,6 +795,7 @@ function createSession({
|
|
|
779
795
|
bridgePort,
|
|
780
796
|
bridgeToken,
|
|
781
797
|
sandboxId,
|
|
798
|
+
sandboxCredentialEnvironment,
|
|
782
799
|
debug,
|
|
783
800
|
permissionMode,
|
|
784
801
|
builtinToolFiltering,
|
|
@@ -798,6 +815,7 @@ function createSession({
|
|
|
798
815
|
bridgePort: number;
|
|
799
816
|
bridgeToken: string;
|
|
800
817
|
sandboxId: string | undefined;
|
|
818
|
+
sandboxCredentialEnvironment: Record<string, string> | undefined;
|
|
801
819
|
debug: HarnessV1DebugConfig | undefined;
|
|
802
820
|
permissionMode: HarnessV1PermissionMode | undefined;
|
|
803
821
|
builtinToolFiltering: HarnessV1BuiltinToolFiltering | undefined;
|
|
@@ -1092,6 +1110,9 @@ function createSession({
|
|
|
1092
1110
|
...(latestOpenCodeSessionId
|
|
1093
1111
|
? { openCodeSessionId: latestOpenCodeSessionId }
|
|
1094
1112
|
: {}),
|
|
1113
|
+
...(sandboxCredentialEnvironment == null
|
|
1114
|
+
? {}
|
|
1115
|
+
: { sandboxCredentialEnvironment }),
|
|
1095
1116
|
bridge: {
|
|
1096
1117
|
port: bridgePort,
|
|
1097
1118
|
token: bridgeToken,
|
|
@@ -1185,11 +1206,20 @@ function createSession({
|
|
|
1185
1206
|
channel.close();
|
|
1186
1207
|
}
|
|
1187
1208
|
|
|
1209
|
+
const lifecycleData =
|
|
1210
|
+
data != null && typeof data === 'object' && !Array.isArray(data)
|
|
1211
|
+
? { ...(data as Record<string, unknown>) }
|
|
1212
|
+
: {};
|
|
1188
1213
|
const payload: HarnessV1ResumeSessionState = {
|
|
1189
1214
|
type: 'resume-session',
|
|
1190
1215
|
harnessId: 'opencode',
|
|
1191
1216
|
specificationVersion: 'harness-v1',
|
|
1192
|
-
data:
|
|
1217
|
+
data: {
|
|
1218
|
+
...lifecycleData,
|
|
1219
|
+
...(sandboxCredentialEnvironment == null
|
|
1220
|
+
? {}
|
|
1221
|
+
: { sandboxCredentialEnvironment }),
|
|
1222
|
+
} as HarnessV1ResumeSessionState['data'],
|
|
1193
1223
|
};
|
|
1194
1224
|
return payload;
|
|
1195
1225
|
},
|
|
@@ -1209,6 +1239,9 @@ function createSession({
|
|
|
1209
1239
|
...(latestOpenCodeSessionId
|
|
1210
1240
|
? { openCodeSessionId: latestOpenCodeSessionId }
|
|
1211
1241
|
: {}),
|
|
1242
|
+
...(sandboxCredentialEnvironment == null
|
|
1243
|
+
? {}
|
|
1244
|
+
: { sandboxCredentialEnvironment }),
|
|
1212
1245
|
bridge: {
|
|
1213
1246
|
port: bridgePort,
|
|
1214
1247
|
token: bridgeToken,
|