@volter/browser-sandboxes 0.1.3
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/LICENSE +21 -0
- package/README.md +63 -0
- package/dist/bin/control-plane.d.ts +3 -0
- package/dist/bin/control-plane.d.ts.map +1 -0
- package/dist/bin/control-plane.js +11 -0
- package/dist/bin/control-plane.js.map +1 -0
- package/dist/bin/mcp.d.ts +3 -0
- package/dist/bin/mcp.d.ts.map +1 -0
- package/dist/bin/mcp.js +10 -0
- package/dist/bin/mcp.js.map +1 -0
- package/dist/client.d.ts +156 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +225 -0
- package/dist/client.js.map +1 -0
- package/dist/contract.d.ts +13 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +79 -0
- package/dist/contract.js.map +1 -0
- package/dist/control-plane.d.ts +14 -0
- package/dist/control-plane.d.ts.map +1 -0
- package/dist/control-plane.js +133 -0
- package/dist/control-plane.js.map +1 -0
- package/dist/docker-provider.d.ts +23 -0
- package/dist/docker-provider.d.ts.map +1 -0
- package/dist/docker-provider.js +50 -0
- package/dist/docker-provider.js.map +1 -0
- package/dist/fly-provider.d.ts +51 -0
- package/dist/fly-provider.d.ts.map +1 -0
- package/dist/fly-provider.js +135 -0
- package/dist/fly-provider.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/manager.d.ts +90 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +113 -0
- package/dist/manager.js.map +1 -0
- package/dist/mcp.d.ts +12 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +142 -0
- package/dist/mcp.js.map +1 -0
- package/dist/providers.d.ts +8 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +17 -0
- package/dist/providers.js.map +1 -0
- package/package.json +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Volter Browser Substrate contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# @volter/browser-sandboxes
|
|
2
|
+
|
|
3
|
+
The hosted backend's control-plane side. One sandbox is one host agent from
|
|
4
|
+
`@volter/browser-host-node`; this package creates them, drives them, and
|
|
5
|
+
exposes them.
|
|
6
|
+
|
|
7
|
+
- `RemoteRuntime` (`@volter/browser-sandboxes/client.js`) is a browser-safe
|
|
8
|
+
client with the in-page runtime's method names: `spawn`, `start`, `on`,
|
|
9
|
+
`ports`, `portUrl`, `request`, `metrics`, `openPty`, `webSocket`, and an
|
|
10
|
+
asynchronous `files` surface including archive `export` and `import`.
|
|
11
|
+
- `SandboxManager` creates sandboxes through a provider with four calls,
|
|
12
|
+
`start`, `pause`, `resume`, `stop`, returns a remote runtime per sandbox,
|
|
13
|
+
reaps idle ones from the agent's own activity report, forks workspaces,
|
|
14
|
+
and passes templates, volumes, and limits through.
|
|
15
|
+
- `DockerProvider` runs the agent image as a local container.
|
|
16
|
+
`FlyProvider` drives the Fly Machines API, the Fly twin offline or Fly
|
|
17
|
+
itself, reaching machines through flyctl's WireGuard proxy.
|
|
18
|
+
- `serveControlPlane` is an HTTP server a page can call that proxies each
|
|
19
|
+
sandbox's agent with the token held server-side.
|
|
20
|
+
- `serveMcp` speaks the Model Context Protocol over stdio with tools for
|
|
21
|
+
sandboxes, commands, files, ports, and guest requests.
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { DockerProvider, SandboxManager } from "@volter/browser-sandboxes";
|
|
25
|
+
|
|
26
|
+
const manager = new SandboxManager({ provider: new DockerProvider({ image: "substrate-node-host:local" }) });
|
|
27
|
+
const sandbox = await manager.create();
|
|
28
|
+
const result = await sandbox.runtime.spawn("echo $((21 * 2))", { cwd: "/workspace" });
|
|
29
|
+
await sandbox.kill();
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Run the hosted tier yourself
|
|
33
|
+
|
|
34
|
+
Everything needed is in this repository under the MIT license.
|
|
35
|
+
|
|
36
|
+
1. Build the guest image, which carries the kernel and
|
|
37
|
+
`@volter/browser-host-node`: `node examples/node-host/build-image.mjs`
|
|
38
|
+
(add `--platform linux/amd64` for x86 hosts such as Fly Machines).
|
|
39
|
+
2. On a machine with Docker, start a control plane with
|
|
40
|
+
`browser-substrate-control-plane`; it creates one container per sandbox
|
|
41
|
+
from that image and proxies each sandbox's agent under
|
|
42
|
+
`/v1/sandboxes/<id>/agent/` with the token held server-side. Point a page
|
|
43
|
+
or the MCP server (`browser-substrate-mcp`) at it.
|
|
44
|
+
3. On Fly Machines, push the image to your app's registry and set
|
|
45
|
+
`SUBSTRATE_PROVIDER=fly`, `FLY_APP`, `FLY_IMAGE`, `FLY_REGION`, and
|
|
46
|
+
`FLY_API_TOKEN`; the provider reaches machines through flyctl's WireGuard
|
|
47
|
+
proxy using your existing login. A stopped machine restarts from a clean
|
|
48
|
+
rootfs, so create sandboxes with a `volume` when the workspace must
|
|
49
|
+
survive pause and resume.
|
|
50
|
+
|
|
51
|
+
## The wire
|
|
52
|
+
|
|
53
|
+
The agent speaks `substrate-agent/1` and the control plane
|
|
54
|
+
`substrate-control-plane/1`. Each describes itself at its unversioned root
|
|
55
|
+
with its protocol, version, base path, route catalogue, and capabilities,
|
|
56
|
+
serves every route under `/v1`, carries `x-substrate-protocol` on every
|
|
57
|
+
response, and answers 426 to a client stating another version.
|
|
58
|
+
`RemoteRuntime` negotiates `GET /` before it trusts the wire and refuses a
|
|
59
|
+
server speaking another protocol or version with the reason. The agent's
|
|
60
|
+
`/v1` stays visible through the control plane's prefix, so one client class
|
|
61
|
+
drives a bare agent and a proxied one alike. `runHostedContract` walks the
|
|
62
|
+
catalogue against any live server; a managed service that passes it speaks
|
|
63
|
+
the same API as this self-hosted tier.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.d.ts","sourceRoot":"","sources":["../../src/bin/control-plane.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { SandboxManager } from "../manager.js";
|
|
3
|
+
import { providerFromEnvironment } from "../providers.js";
|
|
4
|
+
import { serveControlPlane } from "../control-plane.js";
|
|
5
|
+
const manager = new SandboxManager({ provider: providerFromEnvironment(), idleTimeoutMs: Number(process.env.SUBSTRATE_IDLE_MS ?? 15 * 60_000), healthTimeoutMs: 120_000 });
|
|
6
|
+
const served = await serveControlPlane({ manager, port: Number(process.env.PORT ?? 4291), bind: process.env.HOST ?? "127.0.0.1" });
|
|
7
|
+
console.log(JSON.stringify({ controlPlane: `http://${process.env.HOST ?? "127.0.0.1"}:${served.port}`, provider: process.env.SUBSTRATE_PROVIDER ?? "docker" }));
|
|
8
|
+
const shutdown = async () => { await served.close(); await manager.close(); process.exit(0); };
|
|
9
|
+
process.on("SIGTERM", () => { void shutdown(); });
|
|
10
|
+
process.on("SIGINT", () => { void shutdown(); });
|
|
11
|
+
//# sourceMappingURL=control-plane.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane.js","sourceRoot":"","sources":["../../src/bin/control-plane.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,GAAG,MAAM,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3K,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;AACnI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;AAChK,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9G,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/bin/mcp.ts"],"names":[],"mappings":""}
|
package/dist/bin/mcp.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { SandboxManager } from "../manager.js";
|
|
3
|
+
import { providerFromEnvironment } from "../providers.js";
|
|
4
|
+
import { serveMcp } from "../mcp.js";
|
|
5
|
+
const manager = new SandboxManager({ provider: providerFromEnvironment(), idleTimeoutMs: Number(process.env.SUBSTRATE_IDLE_MS ?? 10 * 60_000), healthTimeoutMs: 120_000 });
|
|
6
|
+
const shutdown = async () => { await manager.close(); process.exit(0); };
|
|
7
|
+
process.on("SIGTERM", () => { void shutdown(); });
|
|
8
|
+
await serveMcp({ manager });
|
|
9
|
+
await shutdown();
|
|
10
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/bin/mcp.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,uBAAuB,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,GAAG,MAAM,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3K,MAAM,QAAQ,GAAG,KAAK,IAAmB,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAC5B,MAAM,QAAQ,EAAE,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { type HostedProtocolDescriptor } from "@volter/browser-runtime/browser-hosted-protocol.js";
|
|
2
|
+
export interface RemoteProcessOptions {
|
|
3
|
+
cwd?: string;
|
|
4
|
+
env?: Record<string, string>;
|
|
5
|
+
stdin?: string;
|
|
6
|
+
onStdout?: (chunk: string) => void;
|
|
7
|
+
onStderr?: (chunk: string) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface RemoteProcessResult {
|
|
10
|
+
stdout: string;
|
|
11
|
+
stderr: string;
|
|
12
|
+
exitCode: number;
|
|
13
|
+
cwd?: string;
|
|
14
|
+
env?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface RemoteProcessHandle {
|
|
17
|
+
pid: number;
|
|
18
|
+
command: string;
|
|
19
|
+
startedAt: number;
|
|
20
|
+
readonly state: "running" | "exited" | "failed";
|
|
21
|
+
result: Promise<RemoteProcessResult>;
|
|
22
|
+
kill(): void;
|
|
23
|
+
}
|
|
24
|
+
export interface RemoteProcessInfo {
|
|
25
|
+
pid: number;
|
|
26
|
+
command: string;
|
|
27
|
+
startedAt: number;
|
|
28
|
+
state: string;
|
|
29
|
+
}
|
|
30
|
+
export interface RemotePtyOptions {
|
|
31
|
+
command?: string;
|
|
32
|
+
cols?: number;
|
|
33
|
+
rows?: number;
|
|
34
|
+
cwd?: string;
|
|
35
|
+
env?: Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
export interface RemotePtySession {
|
|
38
|
+
id: number;
|
|
39
|
+
pid: number;
|
|
40
|
+
cols: number;
|
|
41
|
+
rows: number;
|
|
42
|
+
allocator: "node-pty" | "script";
|
|
43
|
+
resizable: boolean;
|
|
44
|
+
write(data: string | Uint8Array): Promise<Response>;
|
|
45
|
+
/** Resolves the applied size, or rejects when the allocator cannot resize. */
|
|
46
|
+
resize(cols: number, rows: number): Promise<{
|
|
47
|
+
cols: number;
|
|
48
|
+
rows: number;
|
|
49
|
+
}>;
|
|
50
|
+
onData(listener: (bytes: Uint8Array) => void): () => void;
|
|
51
|
+
kill(): void;
|
|
52
|
+
exited: Promise<number>;
|
|
53
|
+
}
|
|
54
|
+
export interface RemoteFileEntry {
|
|
55
|
+
name: string;
|
|
56
|
+
type: "file" | "directory";
|
|
57
|
+
size: number;
|
|
58
|
+
}
|
|
59
|
+
export interface RemoteArchive {
|
|
60
|
+
format: "zip" | "json";
|
|
61
|
+
bytes: Uint8Array;
|
|
62
|
+
integrity: string | null;
|
|
63
|
+
entries: number;
|
|
64
|
+
fileBytes: number;
|
|
65
|
+
}
|
|
66
|
+
export interface RemoteImportResult {
|
|
67
|
+
format: string;
|
|
68
|
+
integrity: string;
|
|
69
|
+
entries: number;
|
|
70
|
+
fileBytes: number;
|
|
71
|
+
}
|
|
72
|
+
export interface RemoteHealth {
|
|
73
|
+
ok: boolean;
|
|
74
|
+
root: string;
|
|
75
|
+
portDiscovery: string;
|
|
76
|
+
ports: number[];
|
|
77
|
+
startedAt: number;
|
|
78
|
+
lastActivityAt: number;
|
|
79
|
+
liveProcesses: number;
|
|
80
|
+
confinement?: unknown;
|
|
81
|
+
}
|
|
82
|
+
export interface RemoteRuntimeOptions {
|
|
83
|
+
/**
|
|
84
|
+
* The network to use. A tab's runtime patches the global fetch so loopback
|
|
85
|
+
* hosts become its virtual network; a page that drives a real sandbox passes
|
|
86
|
+
* the fetch it captured before booting the runtime.
|
|
87
|
+
*/
|
|
88
|
+
fetch?: typeof fetch;
|
|
89
|
+
}
|
|
90
|
+
type Listener = (event: Record<string, unknown>) => void;
|
|
91
|
+
export declare class RemoteRuntime {
|
|
92
|
+
readonly files: {
|
|
93
|
+
read(path: string): Promise<Uint8Array>;
|
|
94
|
+
readText(path: string): Promise<string>;
|
|
95
|
+
write(path: string, data: string | Uint8Array): Promise<{
|
|
96
|
+
ok: true;
|
|
97
|
+
}>;
|
|
98
|
+
list(path: string): Promise<RemoteFileEntry[]>;
|
|
99
|
+
mkdir(path: string): Promise<{
|
|
100
|
+
ok: true;
|
|
101
|
+
}>;
|
|
102
|
+
remove(path: string): Promise<{
|
|
103
|
+
ok: true;
|
|
104
|
+
}>;
|
|
105
|
+
snapshot(): Promise<{
|
|
106
|
+
files: unknown[];
|
|
107
|
+
}>;
|
|
108
|
+
export(root?: string, format?: "zip" | "json"): Promise<RemoteArchive>;
|
|
109
|
+
import(bytes: Uint8Array, options?: {
|
|
110
|
+
root?: string;
|
|
111
|
+
replace?: boolean;
|
|
112
|
+
}): Promise<RemoteImportResult>;
|
|
113
|
+
};
|
|
114
|
+
private readonly base;
|
|
115
|
+
/** The catalogue's base path, from the negotiated descriptor; /v1 until then. */
|
|
116
|
+
private basePath;
|
|
117
|
+
/** The agent's descriptor once negotiated. */
|
|
118
|
+
descriptor: HostedProtocolDescriptor | undefined;
|
|
119
|
+
private readonly token;
|
|
120
|
+
private readonly network;
|
|
121
|
+
private readonly listeners;
|
|
122
|
+
private readonly outputs;
|
|
123
|
+
private readonly pending;
|
|
124
|
+
private readonly abort;
|
|
125
|
+
constructor(baseUrl: string, token: string, options?: RemoteRuntimeOptions);
|
|
126
|
+
/**
|
|
127
|
+
* Negotiates the agent's protocol, then opens the event stream and returns
|
|
128
|
+
* the agent's health. A server speaking another protocol or version is
|
|
129
|
+
* refused with the reason.
|
|
130
|
+
*/
|
|
131
|
+
connect(): Promise<RemoteHealth>;
|
|
132
|
+
private consume;
|
|
133
|
+
private dispatch;
|
|
134
|
+
on(type: string, listener: Listener): () => void;
|
|
135
|
+
start(command: string, options?: RemoteProcessOptions): Promise<RemoteProcessHandle>;
|
|
136
|
+
spawn(command: string, options?: RemoteProcessOptions): Promise<RemoteProcessResult>;
|
|
137
|
+
/** A terminal session on a guest pseudo-terminal; bytes in, bytes out. */
|
|
138
|
+
openPty(options?: RemotePtyOptions): Promise<RemotePtySession>;
|
|
139
|
+
/** GET / on the agent, judged by the protocol the client speaks. */
|
|
140
|
+
negotiate(): Promise<HostedProtocolDescriptor>;
|
|
141
|
+
/** The agent's health; never counts as activity on the agent. */
|
|
142
|
+
health(): Promise<RemoteHealth>;
|
|
143
|
+
processes(): Promise<RemoteProcessInfo[]>;
|
|
144
|
+
ports(): Promise<number[]>;
|
|
145
|
+
portUrl(port: number): string;
|
|
146
|
+
request(port: number, input?: string | URL, init?: RequestInit): Promise<Response>;
|
|
147
|
+
metrics(): Promise<Record<string, unknown>>;
|
|
148
|
+
/** A WebSocket to a guest port, tunnelled through the agent. */
|
|
149
|
+
webSocket(port: number, input?: string | URL): WebSocket;
|
|
150
|
+
close(): void;
|
|
151
|
+
private call;
|
|
152
|
+
private ok;
|
|
153
|
+
private json;
|
|
154
|
+
}
|
|
155
|
+
export {};
|
|
156
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// A remote runtime client with the same method shape as the in-page runtime.
|
|
2
|
+
// Differences forced by the wire: ports() and the file surface are async.
|
|
3
|
+
// Browser-safe: no Node globals, so a tab can drive a hosted sandbox with it.
|
|
4
|
+
// The client negotiates the agent's descriptor before it trusts the wire and
|
|
5
|
+
// states the protocol it speaks on every request.
|
|
6
|
+
import { SUBSTRATE_AGENT_PROTOCOL, SUBSTRATE_PROTOCOL_BASE_PATH, SUBSTRATE_PROTOCOL_HEADER, hostedProtocolHeader, negotiateHostedProtocol, } from "@volter/browser-runtime/browser-hosted-protocol.js";
|
|
7
|
+
/** A fresh ArrayBuffer copy satisfies the fetch body type for any typed array. */
|
|
8
|
+
function toBody(data) {
|
|
9
|
+
return typeof data === "string" ? data : data.slice().buffer;
|
|
10
|
+
}
|
|
11
|
+
export class RemoteRuntime {
|
|
12
|
+
files;
|
|
13
|
+
base;
|
|
14
|
+
/** The catalogue's base path, from the negotiated descriptor; /v1 until then. */
|
|
15
|
+
basePath = SUBSTRATE_PROTOCOL_BASE_PATH;
|
|
16
|
+
/** The agent's descriptor once negotiated. */
|
|
17
|
+
descriptor;
|
|
18
|
+
token;
|
|
19
|
+
network;
|
|
20
|
+
listeners = new Map();
|
|
21
|
+
outputs = new Map();
|
|
22
|
+
pending = new Map();
|
|
23
|
+
abort = new AbortController();
|
|
24
|
+
constructor(baseUrl, token, options = {}) {
|
|
25
|
+
this.base = baseUrl.replace(/\/$/, "");
|
|
26
|
+
this.token = token;
|
|
27
|
+
this.network = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
28
|
+
this.files = {
|
|
29
|
+
read: async (p) => new Uint8Array(await (await this.ok(await this.call(`/fs/read?path=${encodeURIComponent(p)}`))).arrayBuffer()),
|
|
30
|
+
readText: async (p) => new TextDecoder().decode(await this.files.read(p)),
|
|
31
|
+
write: async (p, data) => this.json(await this.call(`/fs/write?path=${encodeURIComponent(p)}`, { method: "PUT", body: toBody(data) })),
|
|
32
|
+
list: async (p) => this.json(await this.call(`/fs/list?path=${encodeURIComponent(p)}`)),
|
|
33
|
+
mkdir: async (p) => this.json(await this.call(`/fs/mkdir?path=${encodeURIComponent(p)}`, { method: "POST" })),
|
|
34
|
+
remove: async (p) => this.json(await this.call(`/fs/remove?path=${encodeURIComponent(p)}`, { method: "DELETE" })),
|
|
35
|
+
snapshot: async () => this.json(await this.call("/fs/snapshot")),
|
|
36
|
+
export: async (root = "/workspace", format = "zip") => {
|
|
37
|
+
const response = await this.ok(await this.call(`/fs/export?root=${encodeURIComponent(root)}&format=${format}`));
|
|
38
|
+
return {
|
|
39
|
+
format,
|
|
40
|
+
bytes: new Uint8Array(await response.arrayBuffer()),
|
|
41
|
+
integrity: response.headers.get("x-substrate-integrity"),
|
|
42
|
+
entries: Number(response.headers.get("x-substrate-entries")),
|
|
43
|
+
fileBytes: Number(response.headers.get("x-substrate-file-bytes")),
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
import: async (bytes, { root = "/workspace", replace = true } = {}) => this.json(await this.call(`/fs/import?root=${encodeURIComponent(root)}&replace=${replace}`, { method: "POST", body: toBody(bytes) })),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Negotiates the agent's protocol, then opens the event stream and returns
|
|
51
|
+
* the agent's health. A server speaking another protocol or version is
|
|
52
|
+
* refused with the reason.
|
|
53
|
+
*/
|
|
54
|
+
async connect() {
|
|
55
|
+
await this.negotiate();
|
|
56
|
+
const response = await this.call("/events", { signal: this.abort.signal });
|
|
57
|
+
await this.ok(response);
|
|
58
|
+
if (response.body)
|
|
59
|
+
void this.consume(response.body);
|
|
60
|
+
return this.json(await this.call("/health"));
|
|
61
|
+
}
|
|
62
|
+
async consume(body) {
|
|
63
|
+
const decoder = new TextDecoder();
|
|
64
|
+
let buffered = "";
|
|
65
|
+
try {
|
|
66
|
+
const reader = body.getReader();
|
|
67
|
+
for (;;) {
|
|
68
|
+
const { value, done } = await reader.read();
|
|
69
|
+
if (done)
|
|
70
|
+
break;
|
|
71
|
+
buffered += decoder.decode(value, { stream: true });
|
|
72
|
+
let index;
|
|
73
|
+
while ((index = buffered.indexOf("\n\n")) >= 0) {
|
|
74
|
+
const frame = buffered.slice(0, index);
|
|
75
|
+
buffered = buffered.slice(index + 2);
|
|
76
|
+
const data = frame.split("\n").filter((line) => line.startsWith("data: ")).map((line) => line.slice(6)).join("\n");
|
|
77
|
+
if (data)
|
|
78
|
+
this.dispatch(JSON.parse(data));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (cause) {
|
|
83
|
+
if (!this.abort.signal.aborted)
|
|
84
|
+
throw cause;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
dispatch(event) {
|
|
88
|
+
const type = String(event.type);
|
|
89
|
+
if (type === "pty-output" || type === "pty-exit") {
|
|
90
|
+
const key = `pty:${String(event.id)}`;
|
|
91
|
+
const sink = this.outputs.get(key);
|
|
92
|
+
if (sink)
|
|
93
|
+
sink(event);
|
|
94
|
+
else
|
|
95
|
+
this.pending.set(key, [...(this.pending.get(key) ?? []), event]);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (type === "output") {
|
|
99
|
+
const key = Number(event.pid);
|
|
100
|
+
const sink = this.outputs.get(key);
|
|
101
|
+
if (sink)
|
|
102
|
+
sink(event);
|
|
103
|
+
else
|
|
104
|
+
this.pending.set(key, [...(this.pending.get(key) ?? []), event]);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
for (const listener of this.listeners.get(type) ?? [])
|
|
108
|
+
listener(event);
|
|
109
|
+
}
|
|
110
|
+
on(type, listener) {
|
|
111
|
+
const set = this.listeners.get(type) ?? new Set();
|
|
112
|
+
set.add(listener);
|
|
113
|
+
this.listeners.set(type, set);
|
|
114
|
+
return () => { set.delete(listener); };
|
|
115
|
+
}
|
|
116
|
+
async start(command, options = {}) {
|
|
117
|
+
const { onStdout, onStderr, cwd, env, stdin } = options;
|
|
118
|
+
const started = await this.json(await this.call("/processes", {
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: { "content-type": "application/json" },
|
|
121
|
+
body: JSON.stringify({ command, cwd, env, stdin }),
|
|
122
|
+
}));
|
|
123
|
+
const sink = (event) => (event.stream === "stdout" ? onStdout : onStderr)?.(String(event.chunk));
|
|
124
|
+
this.outputs.set(started.pid, sink);
|
|
125
|
+
for (const event of this.pending.get(started.pid) ?? [])
|
|
126
|
+
sink(event);
|
|
127
|
+
this.pending.delete(started.pid);
|
|
128
|
+
let state = "running";
|
|
129
|
+
const result = this.json(this.call(`/processes/${started.pid}/result`)).then((settled) => {
|
|
130
|
+
this.outputs.delete(started.pid);
|
|
131
|
+
state = settled.state;
|
|
132
|
+
if (settled.state === "failed" || !settled.result)
|
|
133
|
+
throw new Error(settled.error ?? "process failed");
|
|
134
|
+
return settled.result;
|
|
135
|
+
});
|
|
136
|
+
return {
|
|
137
|
+
pid: started.pid,
|
|
138
|
+
command: started.command,
|
|
139
|
+
startedAt: started.startedAt,
|
|
140
|
+
get state() { return state; },
|
|
141
|
+
result,
|
|
142
|
+
kill: () => { void this.call(`/processes/${started.pid}/kill`, { method: "POST" }); },
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async spawn(command, options = {}) {
|
|
146
|
+
return (await this.start(command, options)).result;
|
|
147
|
+
}
|
|
148
|
+
/** A terminal session on a guest pseudo-terminal; bytes in, bytes out. */
|
|
149
|
+
async openPty(options = {}) {
|
|
150
|
+
const opened = await this.json(await this.call("/ptys", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(options) }));
|
|
151
|
+
const key = `pty:${opened.id}`;
|
|
152
|
+
const listeners = new Set();
|
|
153
|
+
let resolveExit = () => undefined;
|
|
154
|
+
const exited = new Promise((resolve) => { resolveExit = resolve; });
|
|
155
|
+
const sink = (event) => {
|
|
156
|
+
if (event.type === "pty-output") {
|
|
157
|
+
const bytes = Uint8Array.from(atob(String(event.data)), (c) => c.charCodeAt(0));
|
|
158
|
+
for (const listener of listeners)
|
|
159
|
+
listener(bytes);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
this.outputs.delete(key);
|
|
163
|
+
resolveExit(Number(event.exitCode));
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
this.outputs.set(key, sink);
|
|
167
|
+
for (const event of this.pending.get(key) ?? [])
|
|
168
|
+
sink(event);
|
|
169
|
+
this.pending.delete(key);
|
|
170
|
+
return {
|
|
171
|
+
id: opened.id, pid: opened.pid, cols: opened.cols, rows: opened.rows, allocator: opened.allocator, resizable: opened.resizable,
|
|
172
|
+
write: (data) => this.call(`/ptys/${opened.id}/input`, { method: "POST", body: toBody(data) }),
|
|
173
|
+
resize: (cols, rows) => this.json(this.call(`/ptys/${opened.id}/resize`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ cols, rows }) })),
|
|
174
|
+
onData: (listener) => { listeners.add(listener); return () => { listeners.delete(listener); }; },
|
|
175
|
+
kill: () => { void this.call(`/ptys/${opened.id}/kill`, { method: "POST" }); },
|
|
176
|
+
exited,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** GET / on the agent, judged by the protocol the client speaks. */
|
|
180
|
+
async negotiate() {
|
|
181
|
+
const response = await this.network(`${this.base}/`, { headers: { authorization: `Bearer ${this.token}` } });
|
|
182
|
+
const descriptor = response.ok ? await response.json().catch(() => undefined) : undefined;
|
|
183
|
+
const negotiated = negotiateHostedProtocol(descriptor, { protocol: SUBSTRATE_AGENT_PROTOCOL });
|
|
184
|
+
if (!negotiated.ok)
|
|
185
|
+
throw new Error(`${this.base} is not a ${SUBSTRATE_AGENT_PROTOCOL} server: ${negotiated.reason}`);
|
|
186
|
+
this.descriptor = negotiated.descriptor;
|
|
187
|
+
this.basePath = negotiated.descriptor.basePath.replace(/\/$/, "");
|
|
188
|
+
return negotiated.descriptor;
|
|
189
|
+
}
|
|
190
|
+
/** The agent's health; never counts as activity on the agent. */
|
|
191
|
+
async health() { return this.json(await this.call("/health")); }
|
|
192
|
+
async processes() { return this.json(await this.call("/processes")); }
|
|
193
|
+
async ports() { return (await this.json(await this.call("/ports"))).map((entry) => entry.port); }
|
|
194
|
+
portUrl(port) { return `${this.base}${this.basePath}/ports/${port}/`; }
|
|
195
|
+
request(port, input = "/", init = {}) {
|
|
196
|
+
// An absolute virtual path is relative to the port, never to the agent, and
|
|
197
|
+
// the agent may itself sit behind a path prefix such as a control plane.
|
|
198
|
+
const target = new URL(input.toString().replace(/^\//, ""), `${this.base}${this.basePath}/ports/${port}/`);
|
|
199
|
+
return this.call(target.href.slice(this.base.length + this.basePath.length), init);
|
|
200
|
+
}
|
|
201
|
+
async metrics() { return this.json(await this.call("/metrics")); }
|
|
202
|
+
/** A WebSocket to a guest port, tunnelled through the agent. */
|
|
203
|
+
webSocket(port, input = "/") {
|
|
204
|
+
const target = new URL(input.toString().replace(/^\//, ""), `${this.base}${this.basePath}/ports/${port}/`);
|
|
205
|
+
target.protocol = target.protocol === "https:" ? "wss:" : "ws:";
|
|
206
|
+
target.searchParams.set("token", this.token);
|
|
207
|
+
return new WebSocket(target);
|
|
208
|
+
}
|
|
209
|
+
close() { this.abort.abort(); }
|
|
210
|
+
call(route, init = {}) {
|
|
211
|
+
const headers = new Headers(init.headers);
|
|
212
|
+
headers.set("authorization", `Bearer ${this.token}`);
|
|
213
|
+
headers.set(SUBSTRATE_PROTOCOL_HEADER, hostedProtocolHeader(SUBSTRATE_AGENT_PROTOCOL));
|
|
214
|
+
return this.network(`${this.base}${this.basePath}${route}`, { ...init, headers });
|
|
215
|
+
}
|
|
216
|
+
async ok(response) {
|
|
217
|
+
if (!response.ok)
|
|
218
|
+
throw new Error(`${response.status} ${await response.text()}`);
|
|
219
|
+
return response;
|
|
220
|
+
}
|
|
221
|
+
async json(responseOrPromise) {
|
|
222
|
+
return (await this.ok(await responseOrPromise)).json();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type HostedProtocolName } from "@volter/browser-runtime/browser-hosted-protocol.js";
|
|
2
|
+
export interface HostedContractTarget {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
protocol: HostedProtocolName;
|
|
5
|
+
token?: string;
|
|
6
|
+
fetch?: typeof fetch;
|
|
7
|
+
}
|
|
8
|
+
export interface HostedContractFailure {
|
|
9
|
+
label: string;
|
|
10
|
+
detail?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export declare function runHostedContract({ baseUrl, token, protocol, fetch: network }: HostedContractTarget): Promise<HostedContractFailure[]>;
|
|
13
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAMA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,oDAAoD,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE;AAE1E,wBAAsB,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAA0B,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAoE/J"}
|