@solarisdk/core 0.1.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/LICENSE +17 -0
- package/README.md +21 -0
- package/dist/desktop.d.ts +106 -0
- package/dist/desktop.d.ts.map +1 -0
- package/dist/desktop.js +170 -0
- package/dist/desktop.js.map +1 -0
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +91 -0
- package/dist/errors.js.map +1 -0
- package/dist/handle.d.ts +169 -0
- package/dist/handle.d.ts.map +1 -0
- package/dist/handle.js +386 -0
- package/dist/handle.js.map +1 -0
- package/dist/http.d.ts +35 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +106 -0
- package/dist/http.js.map +1 -0
- package/dist/image.d.ts +85 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +126 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/sandbox.d.ts +8 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +15 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/template-client.d.ts +35 -0
- package/dist/template-client.d.ts.map +1 -0
- package/dist/template-client.js +95 -0
- package/dist/template-client.js.map +1 -0
- package/dist/transport.d.ts +108 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +337 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +591 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/ws.d.ts +18 -0
- package/dist/ws.d.ts.map +1 -0
- package/dist/ws.js +63 -0
- package/dist/ws.js.map +1 -0
- package/package.json +44 -0
package/dist/handle.d.ts
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { ControlChannel, type ControlChannelConfig } from "./transport.js";
|
|
2
|
+
import type { CommandHandle, CommandOptions, CommandResult, FsEntry, FsSearchMatch, FsStat, FsWatchEvent, MetricsResult, PtyHandle, PtyOptions, RunCodeOptions, RunCodeResult } from "./types.js";
|
|
3
|
+
/** Wiring supplied by the owning sub-client so handle-level admin calls reach
|
|
4
|
+
* the gateway without the handle holding an HTTP client. */
|
|
5
|
+
export interface SessionHooks {
|
|
6
|
+
/** `GET /sandboxes/:id/metrics`. */
|
|
7
|
+
metrics?(id: string): Promise<MetricsResult>;
|
|
8
|
+
/** `POST /sandboxes/:id/snapshots`. */
|
|
9
|
+
snapshot?(id: string, name?: string): Promise<{
|
|
10
|
+
snapshotId: string;
|
|
11
|
+
}>;
|
|
12
|
+
/** `POST /sandboxes/:id/revert`. */
|
|
13
|
+
revert?(id: string, snapshotId: string): Promise<void>;
|
|
14
|
+
/** `POST /sandboxes/:id/pause`. */
|
|
15
|
+
pause?(id: string): Promise<void>;
|
|
16
|
+
/** `POST /sandboxes/:id/resume` → fresh controlUrl. */
|
|
17
|
+
resume?(id: string): Promise<{
|
|
18
|
+
controlUrl: string;
|
|
19
|
+
}>;
|
|
20
|
+
/** `POST /sandboxes/:id/timeout`. */
|
|
21
|
+
setTimeout?(id: string, timeoutMs: number): Promise<{
|
|
22
|
+
expiresAt: string;
|
|
23
|
+
}>;
|
|
24
|
+
/** `GET /sandboxes/:id/files/download-url?path=` — signed direct download URL. */
|
|
25
|
+
downloadUrl?(id: string, path: string): Promise<{
|
|
26
|
+
url: string;
|
|
27
|
+
expiresAt?: string;
|
|
28
|
+
}>;
|
|
29
|
+
/** `GET /sandboxes/:id/files/upload-url?path=` — signed direct upload URL. */
|
|
30
|
+
uploadUrl?(id: string, path?: string): Promise<{
|
|
31
|
+
url: string;
|
|
32
|
+
expiresAt?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/** `GET /sandboxes/:id/ports/:port` — public preview URL for an in-guest port. */
|
|
35
|
+
previewUrl?(id: string, port: number): Promise<{
|
|
36
|
+
url: string;
|
|
37
|
+
token?: string;
|
|
38
|
+
}>;
|
|
39
|
+
/** `DELETE /sandboxes/:id`. */
|
|
40
|
+
kill?(id: string): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export interface SessionConfig extends ControlChannelConfig {
|
|
43
|
+
hooks?: SessionHooks;
|
|
44
|
+
}
|
|
45
|
+
export declare class SessionHandle {
|
|
46
|
+
/** The session id (sandboxId / sessionId). */
|
|
47
|
+
readonly id: string;
|
|
48
|
+
readonly controlUrl: string;
|
|
49
|
+
readonly expiresAt: string;
|
|
50
|
+
protected readonly channel: ControlChannel;
|
|
51
|
+
protected readonly hooks: SessionHooks;
|
|
52
|
+
constructor(id: string, controlUrl: string, expiresAt: string, config?: SessionConfig);
|
|
53
|
+
/** Whether the control channel is open. */
|
|
54
|
+
get connected(): boolean;
|
|
55
|
+
/** Subclass hook: send a raw JSON-RPC call over the control channel. */
|
|
56
|
+
protected rpc<T>(method: string, params: unknown): Promise<T>;
|
|
57
|
+
/** Subclass hook: send a v1 streamed call (per-`id` stdout/stderr frames). */
|
|
58
|
+
protected rpcStream<T>(method: string, params: unknown, onStream: (c: {
|
|
59
|
+
stream: "stdout" | "stderr";
|
|
60
|
+
data?: string;
|
|
61
|
+
}) => void): Promise<T>;
|
|
62
|
+
/** Open the control WebSocket. Idempotent. */
|
|
63
|
+
connect(): Promise<void>;
|
|
64
|
+
/** Reconnect after a drop (re-opens the socket). */
|
|
65
|
+
reconnect(): Promise<void>;
|
|
66
|
+
/** Close the control channel locally (does NOT release the remote session). */
|
|
67
|
+
close(): void;
|
|
68
|
+
readonly commands: {
|
|
69
|
+
/**
|
|
70
|
+
* Run a command to completion. `onStdout`/`onStderr` receive output as it
|
|
71
|
+
* streams (via `cmd.data` frames); the promise resolves with the terminal
|
|
72
|
+
* exit code (from `cmd.exit`).
|
|
73
|
+
*/
|
|
74
|
+
run: (cmd: string, opts?: CommandOptions) => Promise<CommandResult>;
|
|
75
|
+
/**
|
|
76
|
+
* Start a command and return a handle immediately (does not wait for exit).
|
|
77
|
+
* Output streams as `cmd.data`; the handle exposes `stdin`, `onData`,
|
|
78
|
+
* `wait()`, and `kill()`.
|
|
79
|
+
*/
|
|
80
|
+
start: (cmd: string, opts?: CommandOptions) => Promise<CommandHandle>;
|
|
81
|
+
/** Reconnect the control channel (e.g. to resume receiving frames). */
|
|
82
|
+
connect: () => Promise<void>;
|
|
83
|
+
};
|
|
84
|
+
private startCommand;
|
|
85
|
+
private runCommand;
|
|
86
|
+
readonly pty: {
|
|
87
|
+
/** Open a PTY; output streams as `pty.data` frames. */
|
|
88
|
+
create: (opts: PtyOptions) => Promise<PtyHandle>;
|
|
89
|
+
};
|
|
90
|
+
private createPty;
|
|
91
|
+
/**
|
|
92
|
+
* Run code in a stateful kernel (`code.run`). Rich outputs (png/html/json/…)
|
|
93
|
+
* come back as `results` items; `onStdout`/`onStderr` receive streamed text.
|
|
94
|
+
*/
|
|
95
|
+
runCode(code: string, opts?: RunCodeOptions): Promise<RunCodeResult>;
|
|
96
|
+
/** Create a fresh stateful kernel context (`code.context.create`). */
|
|
97
|
+
createCodeContext(language?: CodeLanguageArg): Promise<string>;
|
|
98
|
+
readonly files: {
|
|
99
|
+
read: (path: string) => Promise<Uint8Array>;
|
|
100
|
+
readText: (path: string) => Promise<string>;
|
|
101
|
+
write: (path: string, data: Uint8Array | string, mode?: number) => Promise<void>;
|
|
102
|
+
list: (path: string) => Promise<FsEntry[]>;
|
|
103
|
+
stat: (path: string) => Promise<FsStat>;
|
|
104
|
+
rename: (from: string, to: string) => Promise<void>;
|
|
105
|
+
remove: (path: string, recursive?: boolean) => Promise<void>;
|
|
106
|
+
mkdir: (path: string) => Promise<void>;
|
|
107
|
+
/** Recursively grep `query` under `path`. */
|
|
108
|
+
search: (path: string, query: string, maxResults?: number) => Promise<FsSearchMatch[]>;
|
|
109
|
+
/**
|
|
110
|
+
* Watch `path` for changes; `cb` is invoked for each `fs.event` frame.
|
|
111
|
+
* Returns an unwatch function.
|
|
112
|
+
*/
|
|
113
|
+
watch: (path: string, cb: (ev: FsWatchEvent) => void, recursive?: boolean) => Promise<() => Promise<void>>;
|
|
114
|
+
/** Upload local bytes to an in-guest path (chunked base64 under the hood). */
|
|
115
|
+
upload: (path: string, data: Uint8Array | string) => Promise<void>;
|
|
116
|
+
/** Download an in-guest file's bytes. */
|
|
117
|
+
download: (path: string) => Promise<Uint8Array>;
|
|
118
|
+
};
|
|
119
|
+
/** Inject/replace per-session env vars in the guest (`setEnv`). */
|
|
120
|
+
env(vars: Record<string, string>): Promise<void>;
|
|
121
|
+
/** Signed, time-limited URL to download an in-guest file directly over HTTP
|
|
122
|
+
* (bypasses the control channel — good for large files). */
|
|
123
|
+
downloadUrl(path: string): Promise<{
|
|
124
|
+
url: string;
|
|
125
|
+
expiresAt?: string;
|
|
126
|
+
}>;
|
|
127
|
+
/** Signed, time-limited URL to upload a file into the guest directly over
|
|
128
|
+
* HTTP. `path` is the destination (optional; some backends return a prefix). */
|
|
129
|
+
uploadUrl(path?: string): Promise<{
|
|
130
|
+
url: string;
|
|
131
|
+
expiresAt?: string;
|
|
132
|
+
}>;
|
|
133
|
+
readonly volumes: {
|
|
134
|
+
/**
|
|
135
|
+
* Mount a volume into the guest at `path`. Thin pass-through to the guest
|
|
136
|
+
* `volume.mount` RPC; the gateway volume routes may be a 501 stub today.
|
|
137
|
+
*/
|
|
138
|
+
mount: (volId: string, path: string) => Promise<void>;
|
|
139
|
+
};
|
|
140
|
+
/** Live resource metrics. */
|
|
141
|
+
metrics(): Promise<MetricsResult>;
|
|
142
|
+
/** Checkpoint this RUNNING session; it keeps running. Returns the snapshot id. */
|
|
143
|
+
snapshot(name?: string): Promise<string>;
|
|
144
|
+
/** Restore this session in place from a snapshot (id stays stable). */
|
|
145
|
+
revert(snapshotId: string): Promise<void>;
|
|
146
|
+
/** Pause (snapshot RAM+disk, free the slot). Closes the control channel. */
|
|
147
|
+
pause(): Promise<void>;
|
|
148
|
+
/** Resume a paused session; re-points the control channel at the fresh slot. */
|
|
149
|
+
resume(): Promise<void>;
|
|
150
|
+
/** Extend the idle/keep-alive window. */
|
|
151
|
+
setTimeout(timeoutMs: number): Promise<{
|
|
152
|
+
expiresAt: string;
|
|
153
|
+
}>;
|
|
154
|
+
/**
|
|
155
|
+
* Resolve a public preview URL for an in-guest port (e.g. a dev server on
|
|
156
|
+
* `:3000`). Returns the routable `https://` URL and, when the gateway signs
|
|
157
|
+
* one, an access `token`.
|
|
158
|
+
*/
|
|
159
|
+
previewUrl(port: number): Promise<{
|
|
160
|
+
url: string;
|
|
161
|
+
token?: string;
|
|
162
|
+
}>;
|
|
163
|
+
/** Destroy the remote session and close the channel. Idempotent. */
|
|
164
|
+
kill(): Promise<void>;
|
|
165
|
+
}
|
|
166
|
+
/** Local helper type for `createCodeContext` to avoid a hard import cycle. */
|
|
167
|
+
type CodeLanguageArg = "python" | "javascript" | "typescript" | "bash" | "r";
|
|
168
|
+
export {};
|
|
169
|
+
//# sourceMappingURL=handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"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"}
|
package/dist/handle.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
// `SessionHandle` — the shared base for {@link Sandbox} and {@link Desktop}.
|
|
2
|
+
//
|
|
3
|
+
// Wraps a {@link ControlChannel} and exposes the CONTRACTS-V2 §4 primitives
|
|
4
|
+
// (commands, pty, runCode, files) plus the gateway-routed lifecycle/admin calls
|
|
5
|
+
// (metrics, snapshot, revert, pause/resume, setTimeout, env, volumes,
|
|
6
|
+
// kill). Both Sandbox and Desktop extend this; Desktop adds the GUI surface.
|
|
7
|
+
//
|
|
8
|
+
// Streaming model: async output from `commands.start`/`pty.create`/`files.watch`
|
|
9
|
+
// arrives as v2 frames `{type:"cmd.data"|"cmd.exit"|"pty.data"|"fs.event", ...}`
|
|
10
|
+
// dispatched by the ControlChannel by `type` + the stream's own id, NOT by the
|
|
11
|
+
// originating request id. We register/unregister those frame handlers as
|
|
12
|
+
// commands/ptys/watches are created and torn down.
|
|
13
|
+
import { base64ToBytes, bytesToBase64, ControlChannel, } from "./transport.js";
|
|
14
|
+
export class SessionHandle {
|
|
15
|
+
/** The session id (sandboxId / sessionId). */
|
|
16
|
+
id;
|
|
17
|
+
controlUrl;
|
|
18
|
+
expiresAt;
|
|
19
|
+
channel;
|
|
20
|
+
hooks;
|
|
21
|
+
constructor(id, controlUrl, expiresAt, config = {}) {
|
|
22
|
+
this.id = id;
|
|
23
|
+
this.controlUrl = controlUrl;
|
|
24
|
+
this.expiresAt = expiresAt;
|
|
25
|
+
this.channel = new ControlChannel(controlUrl, config);
|
|
26
|
+
this.hooks = config.hooks ?? {};
|
|
27
|
+
}
|
|
28
|
+
/** Whether the control channel is open. */
|
|
29
|
+
get connected() {
|
|
30
|
+
return this.channel.connected;
|
|
31
|
+
}
|
|
32
|
+
/** Subclass hook: send a raw JSON-RPC call over the control channel. */
|
|
33
|
+
rpc(method, params) {
|
|
34
|
+
return this.channel.call(method, params);
|
|
35
|
+
}
|
|
36
|
+
/** Subclass hook: send a v1 streamed call (per-`id` stdout/stderr frames). */
|
|
37
|
+
rpcStream(method, params, onStream) {
|
|
38
|
+
return this.channel.call(method, params, { onStream });
|
|
39
|
+
}
|
|
40
|
+
/** Open the control WebSocket. Idempotent. */
|
|
41
|
+
connect() {
|
|
42
|
+
return this.channel.connect();
|
|
43
|
+
}
|
|
44
|
+
/** Reconnect after a drop (re-opens the socket). */
|
|
45
|
+
reconnect() {
|
|
46
|
+
return this.channel.reconnect();
|
|
47
|
+
}
|
|
48
|
+
/** Close the control channel locally (does NOT release the remote session). */
|
|
49
|
+
close() {
|
|
50
|
+
this.channel.close();
|
|
51
|
+
}
|
|
52
|
+
// --- commands -------------------------------------------------------------
|
|
53
|
+
commands = {
|
|
54
|
+
/**
|
|
55
|
+
* Run a command to completion. `onStdout`/`onStderr` receive output as it
|
|
56
|
+
* streams (via `cmd.data` frames); the promise resolves with the terminal
|
|
57
|
+
* exit code (from `cmd.exit`).
|
|
58
|
+
*/
|
|
59
|
+
run: (cmd, opts = {}) => this.runCommand(cmd, opts),
|
|
60
|
+
/**
|
|
61
|
+
* Start a command and return a handle immediately (does not wait for exit).
|
|
62
|
+
* Output streams as `cmd.data`; the handle exposes `stdin`, `onData`,
|
|
63
|
+
* `wait()`, and `kill()`.
|
|
64
|
+
*/
|
|
65
|
+
start: (cmd, opts = {}) => this.startCommand(cmd, opts),
|
|
66
|
+
/** Reconnect the control channel (e.g. to resume receiving frames). */
|
|
67
|
+
connect: () => this.channel.reconnect(),
|
|
68
|
+
};
|
|
69
|
+
async startCommand(cmd, opts) {
|
|
70
|
+
const r = await this.channel.call("cmd.start", {
|
|
71
|
+
cmd,
|
|
72
|
+
args: opts.args,
|
|
73
|
+
cwd: opts.cwd,
|
|
74
|
+
env: opts.env,
|
|
75
|
+
user: opts.user,
|
|
76
|
+
});
|
|
77
|
+
const cmdId = r.cmdId;
|
|
78
|
+
const dataCbs = [];
|
|
79
|
+
// Frames can arrive in the microtask gap between this method returning the
|
|
80
|
+
// handle and the caller (e.g. runCommand) attaching its onData accumulator.
|
|
81
|
+
// Buffer chunks while no consumer is attached, then replay on first onData
|
|
82
|
+
// so early stdout/stderr is never dropped (would surface as exit=0 + "").
|
|
83
|
+
const buffered = [];
|
|
84
|
+
let exitResolve = null;
|
|
85
|
+
let exitReject = null;
|
|
86
|
+
const exitPromise = new Promise((res, rej) => {
|
|
87
|
+
exitResolve = res;
|
|
88
|
+
exitReject = rej;
|
|
89
|
+
});
|
|
90
|
+
// If the control channel drops before `cmd.exit` arrives, reject the wait so
|
|
91
|
+
// callers get a ConnectionError instead of hanging forever.
|
|
92
|
+
this.channel.onStreamClose(cmdId, (err) => exitReject?.(err));
|
|
93
|
+
if (opts.onStdout || opts.onStderr) {
|
|
94
|
+
dataCbs.push((c) => {
|
|
95
|
+
if (c.stream === "stdout")
|
|
96
|
+
opts.onStdout?.(c.data);
|
|
97
|
+
else
|
|
98
|
+
opts.onStderr?.(c.data);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
this.channel.onFrame("cmd.data", cmdId, (f) => {
|
|
102
|
+
const stream = f.stream ?? "stdout";
|
|
103
|
+
const data = f.base64 ? new TextDecoder().decode(base64ToBytes(f.base64)) : "";
|
|
104
|
+
const chunk = { stream, data };
|
|
105
|
+
if (dataCbs.length === 0)
|
|
106
|
+
buffered.push(chunk);
|
|
107
|
+
else
|
|
108
|
+
for (const cb of dataCbs)
|
|
109
|
+
cb(chunk);
|
|
110
|
+
});
|
|
111
|
+
this.channel.onFrame("cmd.exit", cmdId, (f) => {
|
|
112
|
+
this.channel.offFrame("cmd.data", cmdId);
|
|
113
|
+
this.channel.offFrame("cmd.exit", cmdId);
|
|
114
|
+
this.channel.offStreamClose(cmdId);
|
|
115
|
+
exitResolve?.(typeof f.exitCode === "number" ? f.exitCode : 0);
|
|
116
|
+
});
|
|
117
|
+
return {
|
|
118
|
+
cmdId,
|
|
119
|
+
stdin: (data) => this.channel
|
|
120
|
+
.call("cmd.stdin", { cmdId, base64: toB64(data) })
|
|
121
|
+
.then(() => undefined),
|
|
122
|
+
onData: (cb) => {
|
|
123
|
+
if (buffered.length > 0) {
|
|
124
|
+
for (const c of buffered)
|
|
125
|
+
cb(c);
|
|
126
|
+
buffered.length = 0;
|
|
127
|
+
}
|
|
128
|
+
dataCbs.push(cb);
|
|
129
|
+
},
|
|
130
|
+
wait: () => exitPromise,
|
|
131
|
+
kill: (signal) => this.channel
|
|
132
|
+
.call("cmd.kill", { cmdId, signal })
|
|
133
|
+
.then(() => undefined),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
async runCommand(cmd, opts) {
|
|
137
|
+
const handle = await this.startCommand(cmd, opts);
|
|
138
|
+
let stdout = "";
|
|
139
|
+
let stderr = "";
|
|
140
|
+
handle.onData((c) => {
|
|
141
|
+
if (c.stream === "stdout")
|
|
142
|
+
stdout += c.data;
|
|
143
|
+
else
|
|
144
|
+
stderr += c.data;
|
|
145
|
+
});
|
|
146
|
+
if (opts.background) {
|
|
147
|
+
// Detached: don't block on exit. Caller drives via callbacks/handle.
|
|
148
|
+
return { exitCode: 0, stdout: "", stderr: "" };
|
|
149
|
+
}
|
|
150
|
+
const exitCode = await handle.wait();
|
|
151
|
+
return { exitCode, stdout, stderr };
|
|
152
|
+
}
|
|
153
|
+
// --- pty ------------------------------------------------------------------
|
|
154
|
+
pty = {
|
|
155
|
+
/** Open a PTY; output streams as `pty.data` frames. */
|
|
156
|
+
create: (opts) => this.createPty(opts),
|
|
157
|
+
};
|
|
158
|
+
async createPty(opts) {
|
|
159
|
+
const r = await this.channel.call("pty.create", {
|
|
160
|
+
cols: opts.cols,
|
|
161
|
+
rows: opts.rows,
|
|
162
|
+
cmd: opts.cmd,
|
|
163
|
+
cwd: opts.cwd,
|
|
164
|
+
env: opts.env,
|
|
165
|
+
});
|
|
166
|
+
const ptyId = r.ptyId;
|
|
167
|
+
const dataCbs = [];
|
|
168
|
+
this.channel.onFrame("pty.data", ptyId, (f) => {
|
|
169
|
+
const bytes = f.base64 ? base64ToBytes(f.base64) : new Uint8Array();
|
|
170
|
+
for (const cb of dataCbs)
|
|
171
|
+
cb(bytes);
|
|
172
|
+
});
|
|
173
|
+
return {
|
|
174
|
+
ptyId,
|
|
175
|
+
write: (data) => this.channel
|
|
176
|
+
.call("pty.input", { ptyId, base64: toB64(data) })
|
|
177
|
+
.then(() => undefined),
|
|
178
|
+
resize: (cols, rows) => this.channel
|
|
179
|
+
.call("pty.resize", { ptyId, cols, rows })
|
|
180
|
+
.then(() => undefined),
|
|
181
|
+
onData: (cb) => {
|
|
182
|
+
dataCbs.push(cb);
|
|
183
|
+
},
|
|
184
|
+
kill: () => {
|
|
185
|
+
this.channel.offFrame("pty.data", ptyId);
|
|
186
|
+
return this.channel
|
|
187
|
+
.call("pty.kill", { ptyId })
|
|
188
|
+
.then(() => undefined);
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
// --- runCode --------------------------------------------------------------
|
|
193
|
+
/**
|
|
194
|
+
* Run code in a stateful kernel (`code.run`). Rich outputs (png/html/json/…)
|
|
195
|
+
* come back as `results` items; `onStdout`/`onStderr` receive streamed text.
|
|
196
|
+
*/
|
|
197
|
+
async runCode(code, opts = {}) {
|
|
198
|
+
const r = await this.channel.call("code.run", {
|
|
199
|
+
code,
|
|
200
|
+
language: opts.language,
|
|
201
|
+
contextId: opts.contextId,
|
|
202
|
+
});
|
|
203
|
+
const results = Array.isArray(r.results) ? r.results : [];
|
|
204
|
+
for (const item of results) {
|
|
205
|
+
if (item.type === "stdout" && item.text)
|
|
206
|
+
opts.onStdout?.(item.text);
|
|
207
|
+
if (item.type === "stderr" && item.text)
|
|
208
|
+
opts.onStderr?.(item.text);
|
|
209
|
+
}
|
|
210
|
+
const charts = results
|
|
211
|
+
.filter((i) => i.chart !== undefined)
|
|
212
|
+
.map((i) => i.chart);
|
|
213
|
+
return { results, charts, ...(r.error !== undefined ? { error: r.error } : {}) };
|
|
214
|
+
}
|
|
215
|
+
/** Create a fresh stateful kernel context (`code.context.create`). */
|
|
216
|
+
async createCodeContext(language = "python") {
|
|
217
|
+
const r = await this.channel.call("code.context.create", { language });
|
|
218
|
+
return r.contextId;
|
|
219
|
+
}
|
|
220
|
+
// --- files ----------------------------------------------------------------
|
|
221
|
+
files = {
|
|
222
|
+
read: async (path) => {
|
|
223
|
+
const r = await this.channel.call("fs.read", { path });
|
|
224
|
+
return base64ToBytes(r.base64);
|
|
225
|
+
},
|
|
226
|
+
readText: async (path) => {
|
|
227
|
+
const bytes = await this.files.read(path);
|
|
228
|
+
return new TextDecoder().decode(bytes);
|
|
229
|
+
},
|
|
230
|
+
write: (path, data, mode) => this.channel
|
|
231
|
+
.call("fs.write", { path, base64: toB64(data), mode })
|
|
232
|
+
.then(() => undefined),
|
|
233
|
+
list: async (path) => {
|
|
234
|
+
const r = await this.channel.call("fs.list", {
|
|
235
|
+
path,
|
|
236
|
+
});
|
|
237
|
+
return r.entries;
|
|
238
|
+
},
|
|
239
|
+
stat: (path) => this.channel.call("fs.stat", { path }),
|
|
240
|
+
rename: (from, to) => this.channel
|
|
241
|
+
.call("fs.rename", { from, to })
|
|
242
|
+
.then(() => undefined),
|
|
243
|
+
remove: (path, recursive = false) => this.channel
|
|
244
|
+
.call("fs.remove", { path, recursive })
|
|
245
|
+
.then(() => undefined),
|
|
246
|
+
mkdir: (path) => this.channel
|
|
247
|
+
.call("fs.mkdir", { path })
|
|
248
|
+
.then(() => undefined),
|
|
249
|
+
/** Recursively grep `query` under `path`. */
|
|
250
|
+
search: async (path, query, maxResults) => {
|
|
251
|
+
const r = await this.channel.call("fs.search", { path, query, maxResults });
|
|
252
|
+
return r.matches ?? [];
|
|
253
|
+
},
|
|
254
|
+
/**
|
|
255
|
+
* Watch `path` for changes; `cb` is invoked for each `fs.event` frame.
|
|
256
|
+
* Returns an unwatch function.
|
|
257
|
+
*/
|
|
258
|
+
watch: async (path, cb, recursive = false) => {
|
|
259
|
+
const r = await this.channel.call("fs.watch", {
|
|
260
|
+
path,
|
|
261
|
+
recursive,
|
|
262
|
+
});
|
|
263
|
+
const watchId = r.watchId;
|
|
264
|
+
this.channel.onFrame("fs.event", watchId, (f) => {
|
|
265
|
+
cb({ type: String(f.type ?? "change"), path: String(f.path ?? "") });
|
|
266
|
+
});
|
|
267
|
+
return async () => {
|
|
268
|
+
this.channel.offFrame("fs.event", watchId);
|
|
269
|
+
await this.channel.call("fs.unwatch", { watchId });
|
|
270
|
+
};
|
|
271
|
+
},
|
|
272
|
+
/** Upload local bytes to an in-guest path (chunked base64 under the hood). */
|
|
273
|
+
upload: (path, data) => this.channel
|
|
274
|
+
.call("fs.upload", { path, base64: toB64(data) })
|
|
275
|
+
.then(() => undefined),
|
|
276
|
+
/** Download an in-guest file's bytes. */
|
|
277
|
+
download: async (path) => {
|
|
278
|
+
const r = await this.channel.call("fs.download", {
|
|
279
|
+
path,
|
|
280
|
+
});
|
|
281
|
+
return base64ToBytes(r.base64);
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
// --- env ------------------------------------------------------------------
|
|
285
|
+
/** Inject/replace per-session env vars in the guest (`setEnv`). */
|
|
286
|
+
env(vars) {
|
|
287
|
+
return this.channel
|
|
288
|
+
.call("setEnv", { env: vars })
|
|
289
|
+
.then(() => undefined);
|
|
290
|
+
}
|
|
291
|
+
/** Signed, time-limited URL to download an in-guest file directly over HTTP
|
|
292
|
+
* (bypasses the control channel — good for large files). */
|
|
293
|
+
downloadUrl(path) {
|
|
294
|
+
if (!this.hooks.downloadUrl) {
|
|
295
|
+
return Promise.reject(new Error("downloadUrl requires a client-created handle"));
|
|
296
|
+
}
|
|
297
|
+
return this.hooks.downloadUrl(this.id, path);
|
|
298
|
+
}
|
|
299
|
+
/** Signed, time-limited URL to upload a file into the guest directly over
|
|
300
|
+
* HTTP. `path` is the destination (optional; some backends return a prefix). */
|
|
301
|
+
uploadUrl(path) {
|
|
302
|
+
if (!this.hooks.uploadUrl) {
|
|
303
|
+
return Promise.reject(new Error("uploadUrl requires a client-created handle"));
|
|
304
|
+
}
|
|
305
|
+
return this.hooks.uploadUrl(this.id, path);
|
|
306
|
+
}
|
|
307
|
+
// --- volumes --------------------------------------------------------------
|
|
308
|
+
volumes = {
|
|
309
|
+
/**
|
|
310
|
+
* Mount a volume into the guest at `path`. Thin pass-through to the guest
|
|
311
|
+
* `volume.mount` RPC; the gateway volume routes may be a 501 stub today.
|
|
312
|
+
*/
|
|
313
|
+
mount: (volId, path) => this.channel
|
|
314
|
+
.call("volume.mount", { volumeId: volId, path })
|
|
315
|
+
.then(() => undefined),
|
|
316
|
+
};
|
|
317
|
+
// --- lifecycle / admin (gateway-routed via hooks) -------------------------
|
|
318
|
+
/** Live resource metrics. */
|
|
319
|
+
metrics() {
|
|
320
|
+
if (!this.hooks.metrics) {
|
|
321
|
+
return Promise.reject(new Error("metrics requires a client-created handle"));
|
|
322
|
+
}
|
|
323
|
+
return this.hooks.metrics(this.id);
|
|
324
|
+
}
|
|
325
|
+
/** Checkpoint this RUNNING session; it keeps running. Returns the snapshot id. */
|
|
326
|
+
async snapshot(name) {
|
|
327
|
+
if (!this.hooks.snapshot) {
|
|
328
|
+
throw new Error("snapshot requires a client-created handle");
|
|
329
|
+
}
|
|
330
|
+
const r = await this.hooks.snapshot(this.id, name);
|
|
331
|
+
return r.snapshotId;
|
|
332
|
+
}
|
|
333
|
+
/** Restore this session in place from a snapshot (id stays stable). */
|
|
334
|
+
revert(snapshotId) {
|
|
335
|
+
if (!this.hooks.revert) {
|
|
336
|
+
return Promise.reject(new Error("revert requires a client-created handle"));
|
|
337
|
+
}
|
|
338
|
+
return this.hooks.revert(this.id, snapshotId);
|
|
339
|
+
}
|
|
340
|
+
/** Pause (snapshot RAM+disk, free the slot). Closes the control channel. */
|
|
341
|
+
async pause() {
|
|
342
|
+
if (!this.hooks.pause) {
|
|
343
|
+
throw new Error("pause requires a client-created handle");
|
|
344
|
+
}
|
|
345
|
+
await this.hooks.pause(this.id);
|
|
346
|
+
this.close();
|
|
347
|
+
}
|
|
348
|
+
/** Resume a paused session; re-points the control channel at the fresh slot. */
|
|
349
|
+
async resume() {
|
|
350
|
+
if (!this.hooks.resume) {
|
|
351
|
+
throw new Error("resume requires a client-created handle");
|
|
352
|
+
}
|
|
353
|
+
const r = await this.hooks.resume(this.id);
|
|
354
|
+
this.channel.setControlUrl(r.controlUrl);
|
|
355
|
+
await this.channel.reconnect();
|
|
356
|
+
}
|
|
357
|
+
/** Extend the idle/keep-alive window. */
|
|
358
|
+
setTimeout(timeoutMs) {
|
|
359
|
+
if (!this.hooks.setTimeout) {
|
|
360
|
+
return Promise.reject(new Error("setTimeout requires a client-created handle"));
|
|
361
|
+
}
|
|
362
|
+
return this.hooks.setTimeout(this.id, timeoutMs);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Resolve a public preview URL for an in-guest port (e.g. a dev server on
|
|
366
|
+
* `:3000`). Returns the routable `https://` URL and, when the gateway signs
|
|
367
|
+
* one, an access `token`.
|
|
368
|
+
*/
|
|
369
|
+
previewUrl(port) {
|
|
370
|
+
if (!this.hooks.previewUrl) {
|
|
371
|
+
return Promise.reject(new Error("previewUrl requires a client-created handle"));
|
|
372
|
+
}
|
|
373
|
+
return this.hooks.previewUrl(this.id, port);
|
|
374
|
+
}
|
|
375
|
+
/** Destroy the remote session and close the channel. Idempotent. */
|
|
376
|
+
async kill() {
|
|
377
|
+
if (this.hooks.kill)
|
|
378
|
+
await this.hooks.kill(this.id);
|
|
379
|
+
this.close();
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
function toB64(data) {
|
|
383
|
+
const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
384
|
+
return bytesToBase64(bytes);
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../src/handle.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface HttpTransportOptions {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
/** Optional `fetch` implementation (defaults to the global). */
|
|
5
|
+
fetch?: typeof fetch;
|
|
6
|
+
/** Max retry attempts for idempotent requests. Default 3. */
|
|
7
|
+
maxRetries?: number;
|
|
8
|
+
/** Per-request timeout in ms (AbortSignal). Default 30000. */
|
|
9
|
+
requestTimeoutMs?: number;
|
|
10
|
+
/** Fixed retry delay in ms. When unset, uses exponential backoff + jitter.
|
|
11
|
+
* Mainly for tests (pass 0) and ops tuning. */
|
|
12
|
+
retryDelayMs?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface HttpRequestOptions {
|
|
15
|
+
/** Send an `Idempotency-Key` header AND make this request retry-safe. */
|
|
16
|
+
idempotencyKey?: string;
|
|
17
|
+
}
|
|
18
|
+
/** A fresh idempotency key (UUID where available). */
|
|
19
|
+
export declare function newIdempotencyKey(): string;
|
|
20
|
+
export declare class HttpTransport {
|
|
21
|
+
readonly apiKey: string;
|
|
22
|
+
readonly baseUrl: string;
|
|
23
|
+
private readonly fetchImpl;
|
|
24
|
+
private readonly maxRetries;
|
|
25
|
+
private readonly requestTimeoutMs;
|
|
26
|
+
private readonly retryDelayMs;
|
|
27
|
+
constructor(o: HttpTransportOptions);
|
|
28
|
+
/** `Authorization` header for handles + WS upgrades. */
|
|
29
|
+
authHeaders(): Record<string, string>;
|
|
30
|
+
/** ws:// (or wss://) origin derived from the gateway base URL. */
|
|
31
|
+
wsOrigin(): string;
|
|
32
|
+
request<T>(method: string, path: string, body?: unknown, opts?: HttpRequestOptions): Promise<T>;
|
|
33
|
+
private backoffMs;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;oDACgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,sDAAsD;AACtD,wBAAgB,iBAAiB,IAAI,MAAM,CAG1C;AAED,qBAAa,aAAa;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAEtC,CAAC,EAAE,oBAAoB;IAenC,wDAAwD;IACxD,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC,kEAAkE;IAClE,QAAQ,IAAI,MAAM;IAIZ,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,CAAC,CAAC;IAsDb,OAAO,CAAC,SAAS;CAIlB"}
|