@agent-relay/harnesses 10.6.6 → 11.0.0
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/README.md +71 -4
- package/dist/ai-sdk/adapter-registry.d.ts +47 -0
- package/dist/ai-sdk/adapter-registry.d.ts.map +1 -0
- package/dist/ai-sdk/adapter-registry.js +134 -0
- package/dist/ai-sdk/adapter-registry.js.map +1 -0
- package/dist/ai-sdk/harness-host.d.ts +83 -0
- package/dist/ai-sdk/harness-host.d.ts.map +1 -0
- package/dist/ai-sdk/harness-host.js +573 -0
- package/dist/ai-sdk/harness-host.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +6 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +6 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/ai-sdk/local-host-sandbox.d.ts +119 -0
- package/dist/ai-sdk/local-host-sandbox.d.ts.map +1 -0
- package/dist/ai-sdk/local-host-sandbox.js +475 -0
- package/dist/ai-sdk/local-host-sandbox.js.map +1 -0
- package/dist/ai-sdk/native-relay-tools.d.ts +10 -0
- package/dist/ai-sdk/native-relay-tools.d.ts.map +1 -0
- package/dist/ai-sdk/native-relay-tools.js +178 -0
- package/dist/ai-sdk/native-relay-tools.js.map +1 -0
- package/dist/ai-sdk/relay-session.d.ts +22 -0
- package/dist/ai-sdk/relay-session.d.ts.map +1 -0
- package/dist/ai-sdk/relay-session.js +423 -0
- package/dist/ai-sdk/relay-session.js.map +1 -0
- package/dist/ai-sdk/sidecar-main.d.ts +3 -0
- package/dist/ai-sdk/sidecar-main.d.ts.map +1 -0
- package/dist/ai-sdk/sidecar-main.js +7 -0
- package/dist/ai-sdk/sidecar-main.js.map +1 -0
- package/dist/ai-sdk/sidecar.d.ts +20 -0
- package/dist/ai-sdk/sidecar.d.ts.map +1 -0
- package/dist/ai-sdk/sidecar.js +361 -0
- package/dist/ai-sdk/sidecar.js.map +1 -0
- package/dist/define.d.ts +49 -1
- package/dist/define.d.ts.map +1 -1
- package/dist/define.js +202 -1
- package/dist/define.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/observability.d.ts +41 -0
- package/dist/observability.d.ts.map +1 -0
- package/dist/observability.js +178 -0
- package/dist/observability.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { HarnessV1NetworkSandboxSession, HarnessV1SandboxProvider } from '@ai-sdk/harness';
|
|
2
|
+
import type { Experimental_SandboxProcess as SandboxProcess, Experimental_SandboxSession as SandboxSession } from '@ai-sdk/provider-utils';
|
|
3
|
+
export interface LocalHostSandboxProviderOptions {
|
|
4
|
+
workspace: string;
|
|
5
|
+
runtimeRoot?: string;
|
|
6
|
+
/** Host path used by official adapters for their derived `/tmp/harness/*` bootstrap files. */
|
|
7
|
+
adapterBootstrapRoot?: string;
|
|
8
|
+
env?: Record<string, string>;
|
|
9
|
+
gracefulShutdownMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface LocalHostPreflightResult {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
checks: {
|
|
14
|
+
node22: boolean;
|
|
15
|
+
pnpm: boolean;
|
|
16
|
+
workspace: boolean;
|
|
17
|
+
port: boolean;
|
|
18
|
+
cache: boolean;
|
|
19
|
+
platform: boolean;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
declare class LocalHostSandboxSession implements HarnessV1NetworkSandboxSession {
|
|
23
|
+
#private;
|
|
24
|
+
readonly description: string;
|
|
25
|
+
readonly id: string;
|
|
26
|
+
readonly defaultWorkingDirectory: string;
|
|
27
|
+
constructor(options: {
|
|
28
|
+
id: string;
|
|
29
|
+
workspace: string;
|
|
30
|
+
runtimeRoot: string;
|
|
31
|
+
adapterBootstrapRoot: string;
|
|
32
|
+
env: Record<string, string>;
|
|
33
|
+
port: number;
|
|
34
|
+
gracefulShutdownMs: number;
|
|
35
|
+
releasePorts: (ports: readonly number[]) => Promise<void>;
|
|
36
|
+
handoffPort: (port: number) => Promise<void>;
|
|
37
|
+
onStop: () => void;
|
|
38
|
+
});
|
|
39
|
+
get ports(): readonly number[];
|
|
40
|
+
readFile(options: {
|
|
41
|
+
path: string;
|
|
42
|
+
abortSignal?: AbortSignal;
|
|
43
|
+
}): Promise<import("stream/web").ReadableStream<Uint8Array<ArrayBufferLike>> | null>;
|
|
44
|
+
readBinaryFile(options: {
|
|
45
|
+
path: string;
|
|
46
|
+
abortSignal?: AbortSignal;
|
|
47
|
+
}): Promise<Uint8Array<ArrayBuffer> | null>;
|
|
48
|
+
readTextFile(options: {
|
|
49
|
+
path: string;
|
|
50
|
+
abortSignal?: AbortSignal;
|
|
51
|
+
encoding?: string;
|
|
52
|
+
startLine?: number;
|
|
53
|
+
endLine?: number;
|
|
54
|
+
}): Promise<string | null>;
|
|
55
|
+
writeFile(options: {
|
|
56
|
+
path: string;
|
|
57
|
+
content: ReadableStream<Uint8Array>;
|
|
58
|
+
abortSignal?: AbortSignal;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
writeBinaryFile(options: {
|
|
61
|
+
path: string;
|
|
62
|
+
content: Uint8Array;
|
|
63
|
+
abortSignal?: AbortSignal;
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
writeTextFile(options: {
|
|
66
|
+
path: string;
|
|
67
|
+
content: string;
|
|
68
|
+
abortSignal?: AbortSignal;
|
|
69
|
+
encoding?: string;
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
spawn(options: {
|
|
72
|
+
command: string;
|
|
73
|
+
workingDirectory?: string;
|
|
74
|
+
env?: Record<string, string>;
|
|
75
|
+
abortSignal?: AbortSignal;
|
|
76
|
+
}): Promise<SandboxProcess>;
|
|
77
|
+
run(options: {
|
|
78
|
+
command: string;
|
|
79
|
+
workingDirectory?: string;
|
|
80
|
+
env?: Record<string, string>;
|
|
81
|
+
abortSignal?: AbortSignal;
|
|
82
|
+
}): Promise<{
|
|
83
|
+
exitCode: number;
|
|
84
|
+
stdout: string;
|
|
85
|
+
stderr: string;
|
|
86
|
+
}>;
|
|
87
|
+
getPortUrl(options: {
|
|
88
|
+
port: number;
|
|
89
|
+
protocol?: 'http' | 'https' | 'ws';
|
|
90
|
+
}): Promise<string>;
|
|
91
|
+
setPorts(ports: readonly number[]): Promise<void>;
|
|
92
|
+
restricted(): SandboxSession;
|
|
93
|
+
stop(): Promise<void>;
|
|
94
|
+
destroy(): Promise<void>;
|
|
95
|
+
}
|
|
96
|
+
export declare class LocalHostSandboxProvider implements HarnessV1SandboxProvider {
|
|
97
|
+
#private;
|
|
98
|
+
readonly specificationVersion: "harness-sandbox-v1";
|
|
99
|
+
readonly providerId = "relay-local-host";
|
|
100
|
+
readonly workspace: string;
|
|
101
|
+
readonly runtimeRoot: string;
|
|
102
|
+
readonly adapterBootstrapRoot: string;
|
|
103
|
+
constructor(options: LocalHostSandboxProviderOptions);
|
|
104
|
+
createSession(options?: {
|
|
105
|
+
sessionId?: string;
|
|
106
|
+
abortSignal?: AbortSignal;
|
|
107
|
+
identity?: string;
|
|
108
|
+
onFirstCreate?: (session: SandboxSession, options: {
|
|
109
|
+
abortSignal?: AbortSignal;
|
|
110
|
+
}) => Promise<void>;
|
|
111
|
+
}): Promise<HarnessV1NetworkSandboxSession>;
|
|
112
|
+
resumeSession(options: {
|
|
113
|
+
sessionId: string;
|
|
114
|
+
abortSignal?: AbortSignal;
|
|
115
|
+
}): Promise<LocalHostSandboxSession>;
|
|
116
|
+
preflight(): Promise<LocalHostPreflightResult>;
|
|
117
|
+
}
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=local-host-sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-host-sandbox.d.ts","sourceRoot":"","sources":["../../src/ai-sdk/local-host-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { spawn as spawnChild } from 'node:child_process';
|
|
3
|
+
import { constants } from 'node:fs';
|
|
4
|
+
import { access, mkdir, open, realpath, rm, writeFile } from 'node:fs/promises';
|
|
5
|
+
import { createServer } from 'node:net';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { dirname, isAbsolute, relative, resolve } from 'node:path';
|
|
8
|
+
import { Readable } from 'node:stream';
|
|
9
|
+
const encoder = new TextEncoder();
|
|
10
|
+
const decoder = new TextDecoder();
|
|
11
|
+
function stateSegment(value) {
|
|
12
|
+
return createHash('sha256').update(value).digest('hex');
|
|
13
|
+
}
|
|
14
|
+
function abortError(signal) {
|
|
15
|
+
return signal?.reason ?? new DOMException('The operation was aborted', 'AbortError');
|
|
16
|
+
}
|
|
17
|
+
function assertNotAborted(signal) {
|
|
18
|
+
if (signal?.aborted)
|
|
19
|
+
throw abortError(signal);
|
|
20
|
+
}
|
|
21
|
+
function isInside(root, candidate) {
|
|
22
|
+
const rel = relative(root, candidate);
|
|
23
|
+
return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
|
|
24
|
+
}
|
|
25
|
+
async function streamToBytes(stream) {
|
|
26
|
+
const chunks = [];
|
|
27
|
+
let size = 0;
|
|
28
|
+
for await (const chunk of stream) {
|
|
29
|
+
chunks.push(chunk);
|
|
30
|
+
size += chunk.byteLength;
|
|
31
|
+
}
|
|
32
|
+
const result = new Uint8Array(size);
|
|
33
|
+
let offset = 0;
|
|
34
|
+
for (const chunk of chunks) {
|
|
35
|
+
result.set(chunk, offset);
|
|
36
|
+
offset += chunk.byteLength;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
async function reserveLoopbackPort(excluded) {
|
|
41
|
+
for (;;) {
|
|
42
|
+
const reservation = await new Promise((resolvePort, reject) => {
|
|
43
|
+
const server = createServer();
|
|
44
|
+
server.unref();
|
|
45
|
+
server.once('error', reject);
|
|
46
|
+
server.listen(0, '127.0.0.1', () => {
|
|
47
|
+
const address = server.address();
|
|
48
|
+
const port = typeof address === 'object' && address ? address.port : 0;
|
|
49
|
+
resolvePort({ port, server });
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
if (reservation.port > 0 && !excluded.has(reservation.port))
|
|
53
|
+
return reservation;
|
|
54
|
+
await new Promise((resolveClose, reject) => reservation.server.close((error) => (error ? reject(error) : resolveClose())));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
class LocalHostSandboxSession {
|
|
58
|
+
description;
|
|
59
|
+
id;
|
|
60
|
+
defaultWorkingDirectory;
|
|
61
|
+
#runtimeRoot;
|
|
62
|
+
#adapterBootstrapRoot;
|
|
63
|
+
#env;
|
|
64
|
+
#gracefulShutdownMs;
|
|
65
|
+
#children = new Set();
|
|
66
|
+
#releasePorts;
|
|
67
|
+
#handoffPort;
|
|
68
|
+
#onStop;
|
|
69
|
+
#ports;
|
|
70
|
+
#stopped = false;
|
|
71
|
+
constructor(options) {
|
|
72
|
+
this.id = options.id;
|
|
73
|
+
this.defaultWorkingDirectory = options.workspace;
|
|
74
|
+
this.#runtimeRoot = options.runtimeRoot;
|
|
75
|
+
this.#adapterBootstrapRoot = options.adapterBootstrapRoot;
|
|
76
|
+
this.#env = options.env;
|
|
77
|
+
this.#ports = [options.port];
|
|
78
|
+
this.#gracefulShutdownMs = options.gracefulShutdownMs;
|
|
79
|
+
this.#releasePorts = options.releasePorts;
|
|
80
|
+
this.#handoffPort = options.handoffPort;
|
|
81
|
+
this.#onStop = options.onStop;
|
|
82
|
+
this.description = `Local host process rooted at ${options.workspace}; this is lifecycle ownership, not filesystem isolation.`;
|
|
83
|
+
}
|
|
84
|
+
get ports() {
|
|
85
|
+
return this.#ports;
|
|
86
|
+
}
|
|
87
|
+
#lexicalPath(path) {
|
|
88
|
+
const resolved = resolve(this.defaultWorkingDirectory, path);
|
|
89
|
+
const root = isInside(this.defaultWorkingDirectory, resolved)
|
|
90
|
+
? this.defaultWorkingDirectory
|
|
91
|
+
: isInside(this.#runtimeRoot, resolved)
|
|
92
|
+
? this.#runtimeRoot
|
|
93
|
+
: isInside(this.#adapterBootstrapRoot, resolved)
|
|
94
|
+
? this.#adapterBootstrapRoot
|
|
95
|
+
: undefined;
|
|
96
|
+
if (!root) {
|
|
97
|
+
throw new Error(`Path is outside the local harness workspace, runtime cache, and adapter bootstrap cache: ${path}`);
|
|
98
|
+
}
|
|
99
|
+
return { path: resolved, root };
|
|
100
|
+
}
|
|
101
|
+
async #path(path) {
|
|
102
|
+
const lexical = this.#lexicalPath(path);
|
|
103
|
+
let existing = lexical.path;
|
|
104
|
+
for (;;) {
|
|
105
|
+
try {
|
|
106
|
+
await access(existing, constants.F_OK);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
if (error.code !== 'ENOENT')
|
|
111
|
+
throw error;
|
|
112
|
+
const parent = dirname(existing);
|
|
113
|
+
if (parent === existing)
|
|
114
|
+
throw error;
|
|
115
|
+
existing = parent;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const [canonicalRoot, canonicalExisting] = await Promise.all([
|
|
119
|
+
realpath(lexical.root),
|
|
120
|
+
realpath(existing),
|
|
121
|
+
]);
|
|
122
|
+
if (!isInside(canonicalRoot, canonicalExisting)) {
|
|
123
|
+
throw new Error(`Path resolves through a symlink outside the local harness roots: ${path}`);
|
|
124
|
+
}
|
|
125
|
+
return lexical.path;
|
|
126
|
+
}
|
|
127
|
+
async #workingDirectory(path) {
|
|
128
|
+
return this.#path(path ?? this.defaultWorkingDirectory);
|
|
129
|
+
}
|
|
130
|
+
async readFile(options) {
|
|
131
|
+
const bytes = await this.readBinaryFile(options);
|
|
132
|
+
if (bytes === null)
|
|
133
|
+
return null;
|
|
134
|
+
return new ReadableStream({
|
|
135
|
+
start: (controller) => (controller.enqueue(bytes), controller.close()),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async readBinaryFile(options) {
|
|
139
|
+
assertNotAborted(options.abortSignal);
|
|
140
|
+
try {
|
|
141
|
+
const path = await this.#path(options.path);
|
|
142
|
+
const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
143
|
+
try {
|
|
144
|
+
return new Uint8Array(await handle.readFile({ signal: options.abortSignal }));
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
await handle.close();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (error.code === 'ENOENT')
|
|
152
|
+
return null;
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async readTextFile(options) {
|
|
157
|
+
const bytes = await this.readBinaryFile(options);
|
|
158
|
+
if (bytes === null)
|
|
159
|
+
return null;
|
|
160
|
+
const text = Buffer.from(bytes).toString((options.encoding ?? 'utf8'));
|
|
161
|
+
if (options.startLine === undefined && options.endLine === undefined)
|
|
162
|
+
return text;
|
|
163
|
+
const lines = text.split('\n');
|
|
164
|
+
return lines.slice(Math.max(0, (options.startLine ?? 1) - 1), options.endLine).join('\n');
|
|
165
|
+
}
|
|
166
|
+
async writeFile(options) {
|
|
167
|
+
await this.writeBinaryFile({
|
|
168
|
+
path: options.path,
|
|
169
|
+
content: await streamToBytes(options.content),
|
|
170
|
+
abortSignal: options.abortSignal,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async writeBinaryFile(options) {
|
|
174
|
+
assertNotAborted(options.abortSignal);
|
|
175
|
+
const path = await this.#path(options.path);
|
|
176
|
+
await mkdir(resolve(path, '..'), { recursive: true });
|
|
177
|
+
await this.#path(resolve(path, '..'));
|
|
178
|
+
const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW, 0o600);
|
|
179
|
+
try {
|
|
180
|
+
await handle.writeFile(options.content, { signal: options.abortSignal });
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
await handle.close();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async writeTextFile(options) {
|
|
187
|
+
assertNotAborted(options.abortSignal);
|
|
188
|
+
const path = await this.#path(options.path);
|
|
189
|
+
await mkdir(resolve(path, '..'), { recursive: true });
|
|
190
|
+
await this.#path(resolve(path, '..'));
|
|
191
|
+
const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW, 0o600);
|
|
192
|
+
try {
|
|
193
|
+
await handle.writeFile(options.content, {
|
|
194
|
+
encoding: (options.encoding ?? 'utf8'),
|
|
195
|
+
signal: options.abortSignal,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
finally {
|
|
199
|
+
await handle.close();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async spawn(options) {
|
|
203
|
+
if (this.#stopped)
|
|
204
|
+
throw new Error(`Local sandbox session ${this.id} is stopped`);
|
|
205
|
+
assertNotAborted(options.abortSignal);
|
|
206
|
+
for (const port of this.#ports) {
|
|
207
|
+
const portText = String(port);
|
|
208
|
+
const commandMentionsPort = options.command.includes(portText);
|
|
209
|
+
const environmentMentionsPort = Object.values(options.env ?? {}).includes(portText);
|
|
210
|
+
if (commandMentionsPort || environmentMentionsPort)
|
|
211
|
+
await this.#handoffPort(port);
|
|
212
|
+
}
|
|
213
|
+
const child = spawnChild('/bin/sh', ['-lc', options.command], {
|
|
214
|
+
cwd: await this.#workingDirectory(options.workingDirectory),
|
|
215
|
+
env: {
|
|
216
|
+
...process.env,
|
|
217
|
+
// Official adapters bootstrap their pinned bridge dependencies with
|
|
218
|
+
// `pnpm --dir /tmp/harness/<adapter>`. Corepack otherwise inspects the
|
|
219
|
+
// Relay workspace cwd first and rejects pnpm because Relay declares npm
|
|
220
|
+
// as its package manager. Explicit caller/provider env still wins.
|
|
221
|
+
COREPACK_ENABLE_PROJECT_SPEC: '0',
|
|
222
|
+
...this.#env,
|
|
223
|
+
...options.env,
|
|
224
|
+
},
|
|
225
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
226
|
+
detached: process.platform !== 'win32',
|
|
227
|
+
});
|
|
228
|
+
this.#children.add(child);
|
|
229
|
+
const cleanup = () => this.#children.delete(child);
|
|
230
|
+
child.once('exit', cleanup);
|
|
231
|
+
child.once('error', cleanup);
|
|
232
|
+
const kill = async () => {
|
|
233
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
234
|
+
return;
|
|
235
|
+
if (process.platform !== 'win32' && child.pid) {
|
|
236
|
+
try {
|
|
237
|
+
process.kill(-child.pid, 'SIGTERM');
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
if (error.code !== 'ESRCH')
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
child.kill('SIGTERM');
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
const onAbort = () => void kill();
|
|
249
|
+
options.abortSignal?.addEventListener('abort', onAbort, { once: true });
|
|
250
|
+
const completion = new Promise((resolveWait, reject) => {
|
|
251
|
+
child.once('error', reject);
|
|
252
|
+
child.once('exit', (code) => {
|
|
253
|
+
options.abortSignal?.removeEventListener('abort', onAbort);
|
|
254
|
+
if (options.abortSignal?.aborted)
|
|
255
|
+
reject(abortError(options.abortSignal));
|
|
256
|
+
else
|
|
257
|
+
resolveWait({ exitCode: code ?? 1 });
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
const wait = () => completion;
|
|
261
|
+
return {
|
|
262
|
+
pid: child.pid,
|
|
263
|
+
stdout: Readable.toWeb(child.stdout),
|
|
264
|
+
stderr: Readable.toWeb(child.stderr),
|
|
265
|
+
wait,
|
|
266
|
+
kill,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
async run(options) {
|
|
270
|
+
const processHandle = await this.spawn(options);
|
|
271
|
+
const [stdout, stderr, result] = await Promise.all([
|
|
272
|
+
streamToBytes(processHandle.stdout),
|
|
273
|
+
streamToBytes(processHandle.stderr),
|
|
274
|
+
processHandle.wait(),
|
|
275
|
+
]);
|
|
276
|
+
return { exitCode: result.exitCode, stdout: decoder.decode(stdout), stderr: decoder.decode(stderr) };
|
|
277
|
+
}
|
|
278
|
+
async getPortUrl(options) {
|
|
279
|
+
if (!this.#ports.includes(options.port))
|
|
280
|
+
throw new Error(`Port ${options.port} is not leased`);
|
|
281
|
+
const protocol = options.protocol ?? 'https';
|
|
282
|
+
return `${protocol === 'https' ? 'http' : protocol}://127.0.0.1:${options.port}`;
|
|
283
|
+
}
|
|
284
|
+
async setPorts(ports) {
|
|
285
|
+
if (ports.some((port) => !this.#ports.includes(port))) {
|
|
286
|
+
throw new Error('Local sandbox ports are exclusively allocated by the provider');
|
|
287
|
+
}
|
|
288
|
+
this.#ports = [...ports];
|
|
289
|
+
}
|
|
290
|
+
restricted() {
|
|
291
|
+
return {
|
|
292
|
+
description: this.description,
|
|
293
|
+
readFile: this.readFile.bind(this),
|
|
294
|
+
readBinaryFile: this.readBinaryFile.bind(this),
|
|
295
|
+
readTextFile: this.readTextFile.bind(this),
|
|
296
|
+
writeFile: this.writeFile.bind(this),
|
|
297
|
+
writeBinaryFile: this.writeBinaryFile.bind(this),
|
|
298
|
+
writeTextFile: this.writeTextFile.bind(this),
|
|
299
|
+
spawn: this.spawn.bind(this),
|
|
300
|
+
run: this.run.bind(this),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
async stop() {
|
|
304
|
+
if (this.#stopped)
|
|
305
|
+
return;
|
|
306
|
+
this.#stopped = true;
|
|
307
|
+
const children = [...this.#children];
|
|
308
|
+
await Promise.allSettled(children.map(async (child) => {
|
|
309
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
310
|
+
return;
|
|
311
|
+
if (process.platform !== 'win32' && child.pid)
|
|
312
|
+
process.kill(-child.pid, 'SIGTERM');
|
|
313
|
+
else
|
|
314
|
+
child.kill('SIGTERM');
|
|
315
|
+
}));
|
|
316
|
+
if (children.some((child) => child.exitCode === null && child.signalCode === null)) {
|
|
317
|
+
await new Promise((resolveWait) => setTimeout(resolveWait, this.#gracefulShutdownMs));
|
|
318
|
+
}
|
|
319
|
+
await Promise.allSettled(children.map(async (child) => {
|
|
320
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
321
|
+
return;
|
|
322
|
+
if (process.platform !== 'win32' && child.pid)
|
|
323
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
324
|
+
else
|
|
325
|
+
child.kill('SIGKILL');
|
|
326
|
+
}));
|
|
327
|
+
await this.#releasePorts(this.#ports);
|
|
328
|
+
this.#ports = [];
|
|
329
|
+
this.#onStop();
|
|
330
|
+
}
|
|
331
|
+
async destroy() {
|
|
332
|
+
await this.stop();
|
|
333
|
+
await rm(resolve(this.#runtimeRoot, 'sessions', stateSegment(this.id)), {
|
|
334
|
+
recursive: true,
|
|
335
|
+
force: true,
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
export class LocalHostSandboxProvider {
|
|
340
|
+
specificationVersion = 'harness-sandbox-v1';
|
|
341
|
+
providerId = 'relay-local-host';
|
|
342
|
+
workspace;
|
|
343
|
+
runtimeRoot;
|
|
344
|
+
adapterBootstrapRoot;
|
|
345
|
+
#env;
|
|
346
|
+
#gracefulShutdownMs;
|
|
347
|
+
#ports = new Set();
|
|
348
|
+
#usedPorts = new Set();
|
|
349
|
+
#portReservations = new Map();
|
|
350
|
+
#sessions = new Map();
|
|
351
|
+
#bootstrap = new Map();
|
|
352
|
+
constructor(options) {
|
|
353
|
+
if (!isAbsolute(options.workspace))
|
|
354
|
+
throw new Error('Local host workspace must be absolute');
|
|
355
|
+
this.workspace = resolve(options.workspace);
|
|
356
|
+
this.runtimeRoot = resolve(options.runtimeRoot ?? resolve(tmpdir(), 'agent-relay', 'harness'));
|
|
357
|
+
this.adapterBootstrapRoot = resolve(options.adapterBootstrapRoot ?? '/tmp/harness');
|
|
358
|
+
if (this.workspace === '/' || this.runtimeRoot === '/' || this.adapterBootstrapRoot === '/') {
|
|
359
|
+
throw new Error('Local host workspace, runtime cache, and adapter bootstrap cache cannot be the filesystem root');
|
|
360
|
+
}
|
|
361
|
+
this.#env = { ...options.env };
|
|
362
|
+
this.#gracefulShutdownMs = options.gracefulShutdownMs ?? 1_000;
|
|
363
|
+
}
|
|
364
|
+
async #port() {
|
|
365
|
+
const reservation = await reserveLoopbackPort(this.#usedPorts);
|
|
366
|
+
this.#ports.add(reservation.port);
|
|
367
|
+
this.#usedPorts.add(reservation.port);
|
|
368
|
+
this.#portReservations.set(reservation.port, reservation.server);
|
|
369
|
+
return reservation.port;
|
|
370
|
+
}
|
|
371
|
+
async #handoffPort(port) {
|
|
372
|
+
const reservation = this.#portReservations.get(port);
|
|
373
|
+
if (!reservation)
|
|
374
|
+
return;
|
|
375
|
+
this.#portReservations.delete(port);
|
|
376
|
+
await new Promise((resolveClose, reject) => reservation.close((error) => (error ? reject(error) : resolveClose())));
|
|
377
|
+
}
|
|
378
|
+
async #releasePorts(ports) {
|
|
379
|
+
for (const port of ports) {
|
|
380
|
+
await this.#handoffPort(port);
|
|
381
|
+
this.#ports.delete(port);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
async createSession(options = {}) {
|
|
385
|
+
assertNotAborted(options.abortSignal);
|
|
386
|
+
if (process.platform === 'win32') {
|
|
387
|
+
throw new Error('The Relay local-host AI SDK runtime currently supports macOS and Linux; use the PTY runtime on Windows');
|
|
388
|
+
}
|
|
389
|
+
await mkdir(this.workspace, { recursive: true });
|
|
390
|
+
await mkdir(this.runtimeRoot, { recursive: true });
|
|
391
|
+
await mkdir(this.adapterBootstrapRoot, { recursive: true });
|
|
392
|
+
const id = options.sessionId ?? randomUUID();
|
|
393
|
+
if (this.#sessions.has(id))
|
|
394
|
+
throw new Error(`Local sandbox session ${id} already exists`);
|
|
395
|
+
const session = new LocalHostSandboxSession({
|
|
396
|
+
id,
|
|
397
|
+
workspace: this.workspace,
|
|
398
|
+
runtimeRoot: this.runtimeRoot,
|
|
399
|
+
adapterBootstrapRoot: this.adapterBootstrapRoot,
|
|
400
|
+
env: this.#env,
|
|
401
|
+
port: await this.#port(),
|
|
402
|
+
gracefulShutdownMs: this.#gracefulShutdownMs,
|
|
403
|
+
releasePorts: (ports) => this.#releasePorts(ports),
|
|
404
|
+
handoffPort: (port) => this.#handoffPort(port),
|
|
405
|
+
onStop: () => this.#sessions.delete(id),
|
|
406
|
+
});
|
|
407
|
+
this.#sessions.set(id, session);
|
|
408
|
+
if (options.identity && options.onFirstCreate) {
|
|
409
|
+
const marker = resolve(this.runtimeRoot, '.relay-bootstrap', createHash('sha256').update(options.identity).digest('hex'));
|
|
410
|
+
let bootstrap = this.#bootstrap.get(options.identity);
|
|
411
|
+
if (!bootstrap) {
|
|
412
|
+
bootstrap = (async () => {
|
|
413
|
+
try {
|
|
414
|
+
await access(marker, constants.F_OK);
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
await options.onFirstCreate(session.restricted(), { abortSignal: options.abortSignal });
|
|
418
|
+
await mkdir(resolve(marker, '..'), { recursive: true });
|
|
419
|
+
await writeFile(marker, encoder.encode(options.identity));
|
|
420
|
+
}
|
|
421
|
+
})();
|
|
422
|
+
this.#bootstrap.set(options.identity, bootstrap);
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
await bootstrap;
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
this.#bootstrap.delete(options.identity);
|
|
429
|
+
this.#sessions.delete(id);
|
|
430
|
+
await session.destroy();
|
|
431
|
+
throw error;
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
return session;
|
|
435
|
+
}
|
|
436
|
+
async resumeSession(options) {
|
|
437
|
+
assertNotAborted(options.abortSignal);
|
|
438
|
+
const session = this.#sessions.get(options.sessionId);
|
|
439
|
+
if (!session)
|
|
440
|
+
throw new Error(`Local sandbox session ${options.sessionId} is unavailable`);
|
|
441
|
+
return session;
|
|
442
|
+
}
|
|
443
|
+
async preflight() {
|
|
444
|
+
await mkdir(this.workspace, { recursive: true });
|
|
445
|
+
await mkdir(this.runtimeRoot, { recursive: true });
|
|
446
|
+
await mkdir(this.adapterBootstrapRoot, { recursive: true });
|
|
447
|
+
const command = async (value) => {
|
|
448
|
+
const child = spawnChild(value, ['--version'], {
|
|
449
|
+
stdio: 'ignore',
|
|
450
|
+
env: { ...process.env, COREPACK_ENABLE_PROJECT_SPEC: '0', ...this.#env },
|
|
451
|
+
});
|
|
452
|
+
return new Promise((resolveCheck) => {
|
|
453
|
+
child.once('error', () => resolveCheck(false));
|
|
454
|
+
child.once('exit', (code) => resolveCheck(code === 0));
|
|
455
|
+
});
|
|
456
|
+
};
|
|
457
|
+
const [pnpm, port] = await Promise.all([
|
|
458
|
+
command(process.platform === 'win32' ? 'pnpm.cmd' : 'pnpm'),
|
|
459
|
+
reserveLoopbackPort(this.#usedPorts).then(({ server }) => new Promise((resolveClose) => server.close(() => resolveClose(true))), () => false),
|
|
460
|
+
]);
|
|
461
|
+
const checks = {
|
|
462
|
+
node22: Number(process.versions.node.split('.')[0]) >= 22,
|
|
463
|
+
pnpm,
|
|
464
|
+
workspace: await access(this.workspace, constants.R_OK | constants.W_OK).then(() => true, () => false),
|
|
465
|
+
port,
|
|
466
|
+
cache: await Promise.all([
|
|
467
|
+
access(this.runtimeRoot, constants.R_OK | constants.W_OK),
|
|
468
|
+
access(this.adapterBootstrapRoot, constants.R_OK | constants.W_OK),
|
|
469
|
+
]).then(() => true, () => false),
|
|
470
|
+
platform: process.platform !== 'win32',
|
|
471
|
+
};
|
|
472
|
+
return { ok: Object.values(checks).every(Boolean), checks };
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
//# sourceMappingURL=local-host-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-host-sandbox.js","sourceRoot":"","sources":["../../src/ai-sdk/local-host-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type RelayAgentThinClient, type RelayWorkspaceThinClient } from '@agent-relay/sdk';
|
|
2
|
+
import type { HarnessHostTool } from './harness-host.js';
|
|
3
|
+
export declare const NATIVE_RELAY_INSTRUCTIONS = "You are a participant in an Agent Relay workspace. Relay collaboration tools are installed as host-provided tools for this session. Use them directly whenever the user asks you to contact another agent, inspect collaborators or channels, check messages, or coordinate work. Do not ask the user how to use Relay, read a Relay skill file, register another identity, or fall back to shelling out to agent-relay. Prefer send_dm for a named recipient and post_message for a shared channel. Report a send as successful only after the tool returns successfully.";
|
|
4
|
+
export interface NativeRelayToolOptions {
|
|
5
|
+
env?: NodeJS.ProcessEnv;
|
|
6
|
+
agentClient?: RelayAgentThinClient;
|
|
7
|
+
workspaceClient?: RelayWorkspaceThinClient;
|
|
8
|
+
}
|
|
9
|
+
export declare function createNativeRelayTools(options?: NativeRelayToolOptions): HarnessHostTool[];
|
|
10
|
+
//# sourceMappingURL=native-relay-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-relay-tools.d.ts","sourceRoot":"","sources":["../../src/ai-sdk/native-relay-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,eAAO,MAAM,yBAAyB,+iBAA+iB,CAAC;AAMtlB,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,eAAe,CAAC,EAAE,wBAAwB,CAAC;CAC5C;AA2BD,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,EAAE,CA4J9F"}
|