@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/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(env, auth) {
106
- switch (auth) {
105
+ function createOpenCodeRequestTransformations({
106
+ env: environment,
107
+ sandboxEnv: sandboxEnvironment,
108
+ auth: authenticationMode
109
+ }) {
110
+ switch (authenticationMode) {
107
111
  case "ai-gateway":
108
- return env.AI_GATEWAY_API_KEY ? [
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
- baseUrl: env.AI_GATEWAY_BASE_URL,
111
- headers: {
112
- Authorization: `Bearer ${env.AI_GATEWAY_API_KEY}`
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 env.OPENAI_API_KEY ? [
133
+ return environment.OPENAI_API_KEY && sandboxEnvironment.OPENAI_API_KEY ? [
118
134
  createCredentialRequestTransformation({
119
- baseUrl: env.OPENAI_BASE_URL ?? "https://api.openai.com/v1",
120
- headers: { Authorization: `Bearer ${env.OPENAI_API_KEY}` }
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 headers = {};
125
- if (env.ANTHROPIC_API_KEY) {
126
- headers["x-api-key"] = env.ANTHROPIC_API_KEY;
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 (env.ANTHROPIC_AUTH_TOKEN) {
129
- headers.Authorization = `Bearer ${env.ANTHROPIC_AUTH_TOKEN}`;
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 Object.keys(headers).length === 0 ? [] : [
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.88" : "0.0.0-test";
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
- const requestTransformations = createOpenCodeRequestTransformations(
488
- resolvedAuthEnvironment,
489
- authenticationMode
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
- sandboxAuthEnvironment = maskSandboxCredentials({
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: 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,