@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/CHANGELOG.md +21 -0
- package/dist/bridge/host-tool-mcp.mjs +1 -1
- package/dist/bridge/host-tool-mcp.mjs.map +1 -1
- package/dist/bridge/index.mjs +6 -13
- package/dist/bridge/index.mjs.map +1 -1
- package/dist/index.js +11 -13
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/bridge/create-emit-stream-event.ts +5 -5
- package/src/bridge/index.ts +1 -7
- package/src/bridge/json-schema-to-zod.ts +1 -1
- package/src/bridge/opencode-events.ts +0 -1
- package/src/opencode-harness.ts +13 -12
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.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.
|
|
30
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
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
|
-
...
|
|
490
|
-
...
|
|
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
|
-
...
|
|
545
|
-
...
|
|
546
|
-
...
|
|
544
|
+
...part.metadata,
|
|
545
|
+
...part.state?.metadata,
|
|
546
|
+
...part.state?.input,
|
|
547
547
|
};
|
|
548
548
|
}
|
|
549
549
|
|
package/src/bridge/index.ts
CHANGED
|
@@ -311,7 +311,7 @@ function buildOpenCodeConfig({
|
|
|
311
311
|
}
|
|
312
312
|
const provider = buildProviderConfig(start);
|
|
313
313
|
if (provider) config.provider = provider;
|
|
314
|
-
const mcp = { ...
|
|
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 {
|
package/src/opencode-harness.ts
CHANGED
|
@@ -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
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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 =
|
|
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;
|