@ai-sdk/harness-opencode 1.0.88 → 1.0.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/dist/bridge/index.mjs +61 -3
- package/dist/bridge/index.mjs.map +1 -1
- package/dist/index.js +95 -39
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/bridge/create-emit-stream-event.ts +21 -0
- package/src/bridge/index.ts +61 -3
- package/src/bridge/opencode-events.ts +10 -0
- package/src/bridge/opencode-types.ts +1 -0
- package/src/opencode-auth.ts +73 -26
- package/src/opencode-harness.ts +67 -34
package/dist/index.js
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.92" : "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,
|