@ai-sdk/harness-opencode 1.0.124 → 1.0.126

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/harness-opencode",
3
- "version": "1.0.124",
3
+ "version": "1.0.126",
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.122",
30
- "@ai-sdk/provider-utils": "5.0.46",
29
+ "@ai-sdk/harness": "1.0.124",
30
+ "@ai-sdk/provider-utils": "5.0.47",
31
31
  "ws": "8.21.0"
32
32
  },
33
33
  "peerDependencies": {
@@ -486,8 +486,8 @@ function emitLegacyToolPart({
486
486
  const toolName = toWireToolName(rawToolName);
487
487
  if (toolName === 'agent') {
488
488
  const metadata = {
489
- ...(toolPart.metadata ?? {}),
490
- ...(toolPart.state?.metadata ?? {}),
489
+ ...toolPart.metadata,
490
+ ...toolPart.state?.metadata,
491
491
  };
492
492
  const parentSessionId = stringValue(metadata.parentSessionId);
493
493
  const sessionId = stringValue(metadata.sessionId);
@@ -541,9 +541,9 @@ function emitLegacyToolPart({
541
541
 
542
542
  function legacyToolPartInput(part: LegacyToolPart): Record<string, unknown> {
543
543
  return {
544
- ...(part.metadata ?? {}),
545
- ...(part.state?.metadata ?? {}),
546
- ...(part.state?.input ?? {}),
544
+ ...part.metadata,
545
+ ...part.state?.metadata,
546
+ ...part.state?.input,
547
547
  };
548
548
  }
549
549
 
@@ -311,7 +311,7 @@ function buildOpenCodeConfig({
311
311
  }
312
312
  const provider = buildProviderConfig(start);
313
313
  if (provider) config.provider = provider;
314
- const mcp = { ...(start.mcpServers ?? {}) };
314
+ const mcp = { ...start.mcpServers };
315
315
  if (relayPort && start.tools && start.tools.length > 0) {
316
316
  mcp['harness-tools'] = {
317
317
  type: 'local',
@@ -464,8 +464,6 @@ function buildProviderConfig(
464
464
  },
465
465
  };
466
466
  }
467
-
468
- return undefined;
469
467
  }
470
468
 
471
469
  function parseOpenAIQueryParams(): Record<string, unknown> {
@@ -570,7 +568,6 @@ function readSessionId(data: unknown): string | undefined {
570
568
  const record = data as { id?: unknown; data?: { id?: unknown } };
571
569
  if (typeof record.id === 'string') return record.id;
572
570
  if (typeof record.data?.id === 'string') return record.data.id;
573
- return undefined;
574
571
  }
575
572
 
576
573
  function isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {
@@ -1454,7 +1451,6 @@ function getHostToolName(
1454
1451
  ) {
1455
1452
  return rawToolName.slice('harness-tools_'.length);
1456
1453
  }
1457
- return undefined;
1458
1454
  }
1459
1455
 
1460
1456
  function authorizeHostToolCall({
@@ -1593,7 +1589,6 @@ function latestLegacyAssistantMessage(
1593
1589
  };
1594
1590
  }
1595
1591
  }
1596
- return undefined;
1597
1592
  }
1598
1593
 
1599
1594
  function latestV2AssistantMessage(
@@ -1623,7 +1618,6 @@ function latestV2AssistantMessage(
1623
1618
  };
1624
1619
  }
1625
1620
  }
1626
- return undefined;
1627
1621
  }
1628
1622
 
1629
1623
  function emitAssistantContentPart(part: unknown, emit: Emit): void {
@@ -22,7 +22,7 @@ export function jsonSchemaToZodShape(input: unknown): ZodShape {
22
22
 
23
23
  function toZodShape(schema: JsonSchemaObject | undefined): ZodShape {
24
24
  if (!schema?.properties) return {};
25
- const required = new Set(schema.required ?? []);
25
+ const required = new Set(schema.required);
26
26
  const shape: ZodShape = {};
27
27
  for (const [key, propSchema] of Object.entries(schema.properties)) {
28
28
  const propType = toZodType(propSchema);
@@ -114,7 +114,6 @@ export function getOpenCodeEventSessionId(
114
114
  const part = props.part;
115
115
  const partObject = asOpenCodeObject(part);
116
116
  if (typeof partObject?.sessionID === 'string') return partObject.sessionID;
117
- return undefined;
118
117
  }
119
118
 
120
119
  export function isStepSettlementEvent(event: OpenCodeEvent): boolean {
@@ -22,6 +22,8 @@ import {
22
22
  type HarnessV1Session,
23
23
  type HarnessV1Skill,
24
24
  type HarnessV1StreamPart,
25
+ harnessStateDirectoryPath,
26
+ harnessSessionDataDirectoryPath,
25
27
  } from '@ai-sdk/harness';
26
28
  import {
27
29
  applyCredentialForwarding,
@@ -35,7 +37,6 @@ import {
35
37
  forwardBridgeProcessStream,
36
38
  getRestrictedSandboxSession,
37
39
  markBridgeStarting,
38
- resolveSandboxDefaultWorkingDirectory,
39
40
  resolveSandboxHomeDir,
40
41
  SandboxChannel,
41
42
  shellQuote,
@@ -293,11 +294,6 @@ export function createOpenCode(
293
294
  'The OpenCode harness cannot use `mintBridgeToken` with a sandbox session that does not expose an id.',
294
295
  });
295
296
  }
296
- const defaultWorkingDirectory =
297
- await resolveSandboxDefaultWorkingDirectory({
298
- sandboxSession,
299
- abortSignal: startOpts.abortSignal,
300
- });
301
297
  const lifecycleState = startOpts.continueFrom ?? startOpts.resumeFrom;
302
298
  const isResume = lifecycleState != null;
303
299
  const isContinue = startOpts.continueFrom != null;
@@ -404,17 +400,22 @@ export function createOpenCode(
404
400
  }
405
401
  credentialsBrokered = true;
406
402
  }
407
- const bootstrapDir = path.posix.resolve(
408
- defaultWorkingDirectory,
409
- BOOTSTRAP_DIR,
410
- );
411
- const workDir = startOpts.sessionWorkDir;
403
+ // Harness SDK state (bootstrap, per-session runs) always lives under
404
+ // the sandbox's own HOME, never the working directory, so it stays
405
+ // out of a user-owned workspace.
412
406
  const sandboxHomeDir = await resolveSandboxHomeDir({
413
407
  sandbox: toolSafeSandboxSession,
414
408
  abortSignal: startOpts.abortSignal,
415
409
  });
410
+ const stateDir = harnessStateDirectoryPath({ sandboxHomeDir });
411
+ const bootstrapDir = path.posix.resolve(stateDir, BOOTSTRAP_DIR);
412
+
413
+ const workDir = startOpts.sessionWorkDir;
416
414
  const skillsDir = path.posix.join(sandboxHomeDir, '.agents', 'skills');
417
- const sessionDataDir = `${defaultWorkingDirectory}/.agent-runs/${startOpts.sessionId}`;
415
+ const sessionDataDir = harnessSessionDataDirectoryPath({
416
+ stateDirectory: stateDir,
417
+ sessionId: startOpts.sessionId,
418
+ });
418
419
  const bridgeStateDir = `${sessionDataDir}/bridge`;
419
420
  const timeoutMs = settings.startupTimeoutMs ?? 120_000;
420
421
  const report = startOpts.observability?.report;