@lightningai/sdk 2026.5.12 → 2026.5.15-post0
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 +90 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/process.d.ts +115 -0
- package/dist/process.d.ts.map +1 -0
- package/dist/process.js +254 -0
- package/dist/process.js.map +1 -0
- package/dist/pty.d.ts +121 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +264 -0
- package/dist/pty.js.map +1 -0
- package/dist/sandbox.d.ts +17 -0
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sandbox.js +29 -0
- package/dist/sandbox.js.map +1 -1
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -50,6 +50,96 @@ Environment variables read by the SDK:
|
|
|
50
50
|
| ------------------- | --------------------------------------------------------- |
|
|
51
51
|
| `LIGHTNING_API_KEY` | API key if not passed via `configure()` / request options |
|
|
52
52
|
|
|
53
|
+
## PTY sessions
|
|
54
|
+
|
|
55
|
+
For interactive shells (REPLs, build watchers, anything that needs `stdin`/window-resize/ANSI), use the `sandbox.process` namespace instead of `runCommand`. PTY sessions are bridged over a WebSocket from the controlplane down to the in-sandbox SSH server, with the same xterm wire protocol the Lightning UI's web terminal uses.
|
|
56
|
+
|
|
57
|
+
PTY support requires Node 22+ (for the built-in `WebSocket` global).
|
|
58
|
+
|
|
59
|
+
### Create a session
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
const pty = await sandbox.process.createPty({
|
|
63
|
+
sessionName: "build",
|
|
64
|
+
clusterId: sandbox.clusterId,
|
|
65
|
+
cwd: "/app",
|
|
66
|
+
cols: 120,
|
|
67
|
+
rows: 30,
|
|
68
|
+
envs: { TERM: "xterm-256color" },
|
|
69
|
+
onData: (chunk) => process.stdout.write(chunk),
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
await pty.waitForConnection();
|
|
73
|
+
await pty.sendInput("npm test\n");
|
|
74
|
+
await pty.sendInput("exit\n");
|
|
75
|
+
|
|
76
|
+
const result = await pty.wait();
|
|
77
|
+
console.log(`exit code: ${result.exitCode}`);
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
| Option | Type | Description |
|
|
81
|
+
| ------------- | --------------------------- | ---------------------------------------------------------------------- |
|
|
82
|
+
| `sessionName` | `string` | Session identifier (used by `connectPty`) |
|
|
83
|
+
| `clusterId` | `string` | Cluster the sandbox runs on (`sandbox.clusterId`) |
|
|
84
|
+
| `cwd` | `string` | Initial working directory |
|
|
85
|
+
| `envs` | `Record<string, string>` | Environment variables exported into the session |
|
|
86
|
+
| `cols` | `number` | Initial terminal columns (default 80) |
|
|
87
|
+
| `rows` | `number` | Initial terminal rows (default 24) |
|
|
88
|
+
| `onData` | `(chunk: Uint8Array)=>void` | Callback for every chunk of shell output (defaults to `writeToStdout`) |
|
|
89
|
+
|
|
90
|
+
If `onData` is omitted, the SDK uses the exported `writeToStdout` helper, which forwards raw shell bytes to `process.stdout`. Pass `onData: () => {}` to suppress.
|
|
91
|
+
|
|
92
|
+
### Reconnect to a session
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
const pty = await sandbox.process.connectPty("build", sandbox.clusterId, {
|
|
96
|
+
onData: (chunk) => process.stdout.write(chunk),
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### List, inspect, and kill sessions
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
const sessions = await sandbox.process.listPtySessions();
|
|
104
|
+
for (const s of sessions) {
|
|
105
|
+
console.log(s.id, s.active, s.cols, s.rows);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const info = await sandbox.process.getPtySessionInfo("build");
|
|
109
|
+
await sandbox.process.killPtySession("build");
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Resize
|
|
113
|
+
|
|
114
|
+
Resize from a handle (preferred — works without a server round-trip):
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
await pty.resize(150, 40);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Or via the namespace, which finds the live handle in this process:
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
await sandbox.process.resizePtySession("build", 150, 40);
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### `PtyHandle` reference
|
|
127
|
+
|
|
128
|
+
| Member | Description |
|
|
129
|
+
| --------------------------------- | -------------------------------------------------------- |
|
|
130
|
+
| `sendInput(string \| Uint8Array)` | Send raw bytes to the shell (e.g. `"\u0003"` for Ctrl+C) |
|
|
131
|
+
| `resize(cols, rows)` | Send a resize control frame |
|
|
132
|
+
| `wait()` | Resolve when the WebSocket closes; returns `PtyResult` |
|
|
133
|
+
| `waitForConnection(timeoutMs?)` | Resolve when the WebSocket opens |
|
|
134
|
+
| `kill()` | Send Ctrl+C and disconnect |
|
|
135
|
+
| `disconnect()` | Close the WebSocket without killing the shell |
|
|
136
|
+
| `isConnected()` | Whether the WebSocket is OPEN |
|
|
137
|
+
| `exitCode` | `0` on clean close, `-1` on abnormal, `null` while alive |
|
|
138
|
+
| `error` | Termination reason on abnormal close, otherwise `null` |
|
|
139
|
+
| `size` | Most recent `{ cols, rows }` |
|
|
140
|
+
|
|
141
|
+
> **Note on cross-process persistence.** Within a single SDK process, every PTY method works against an in-process registry. Reattaching from a *different* process to a session that's still running on the sandbox requires the runtime image to ship `screen` (or similar) and the in-sandbox SSH login shell to honor `LAI_TERM_SESSION_NAME` / `LAI_TERM_RESTORE` — both of which are tracked as a follow-up to this initial parity work. The API surface above does not change either way.
|
|
142
|
+
|
|
53
143
|
## License
|
|
54
144
|
|
|
55
145
|
Apache-2.0
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { Sandbox } from "./sandbox.js";
|
|
2
2
|
export { FileSystem } from "./filesystem.js";
|
|
3
3
|
export { Command } from "./command.js";
|
|
4
|
-
export
|
|
4
|
+
export { SandboxProcess } from "./process.js";
|
|
5
|
+
export { PtyHandle, writeToStdout } from "./pty.js";
|
|
6
|
+
export type { SandboxConfig, SandboxData, CreateSandboxParams, GetSandboxParams, ListSandboxesParams, ListSandboxesResponse, RunCommandOpts, CommandStatus, CommandLog, WaitForCommandOptions, WriteFileParams, ReadFileParams, CreateDirectoryParams, FileStat, PtySize, PtyCreateOpts, PtyConnectOpts, PtyResult, PtySessionInfo, } from "./types.js";
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,YAAY,EACV,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,QAAQ,EACR,OAAO,EACP,aAAa,EACb,cAAc,EACd,SAAS,EACT,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { Command } from "./command.js";
|
|
2
|
+
import { PtyHandle } from "./pty.js";
|
|
3
|
+
import type { PtyConnectOpts, PtyCreateOpts, PtySessionInfo, RunCommandOpts } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Runtime context the `Sandbox` passes into a `SandboxProcess` so that
|
|
6
|
+
* the PTY namespace can build URLs, authenticate, and shell out to
|
|
7
|
+
* `runCommand` for session bookkeeping without importing the `Sandbox`
|
|
8
|
+
* class directly (avoids a circular dependency).
|
|
9
|
+
*
|
|
10
|
+
* Internal — not part of the public API surface.
|
|
11
|
+
*/
|
|
12
|
+
export interface SandboxProcessContext {
|
|
13
|
+
sandboxId: string;
|
|
14
|
+
organizationId: string;
|
|
15
|
+
/**
|
|
16
|
+
* Returns the resolved API key. Mirrors the lazy lookup used by the
|
|
17
|
+
* REST request helpers so that `Sandbox.configure` calls made after
|
|
18
|
+
* the sandbox object was created are still honored.
|
|
19
|
+
*/
|
|
20
|
+
getApiKey(): string;
|
|
21
|
+
/** Returns the resolved base URL (with no trailing slash). */
|
|
22
|
+
getBaseUrl(): string;
|
|
23
|
+
/** Forwards to `Sandbox.runCommand`. */
|
|
24
|
+
runCommand(opts: RunCommandOpts): Promise<Command>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* `sandbox.process` — interactive shell sessions on a sandbox.
|
|
28
|
+
*
|
|
29
|
+
* Mirrors the Daytona PTY surface so existing code shaped around it
|
|
30
|
+
* ports over with mechanical changes only. Under the hood, every method
|
|
31
|
+
* either opens a WebSocket against the controlplane's
|
|
32
|
+
* `/v1/clusters/{clusterId}/machines/{sandboxId}/attach` endpoint (which
|
|
33
|
+
* is bridged to the in-sandbox SSH server at port 2222) or shells out to
|
|
34
|
+
* `screen` via the existing `runCommand` REST API for session
|
|
35
|
+
* bookkeeping.
|
|
36
|
+
*
|
|
37
|
+
* Within a single SDK process every method works against a local
|
|
38
|
+
* registry. Cross-process session persistence (i.e. `connectPty` from
|
|
39
|
+
* a fresh process to a session created elsewhere) requires the sandbox
|
|
40
|
+
* runtime image to ship `screen` and the gliderlabs SSH login shell to
|
|
41
|
+
* honor `LAI_TERM_SESSION_NAME` / `LAI_TERM_RESTORE` — both of which
|
|
42
|
+
* are tracked as a follow-up to this initial parity work.
|
|
43
|
+
*/
|
|
44
|
+
export declare class SandboxProcess {
|
|
45
|
+
private readonly ctx;
|
|
46
|
+
/**
|
|
47
|
+
* Live handles bound to this `SandboxProcess`, keyed by their
|
|
48
|
+
* caller-chosen session name. Used by `connectPty` /
|
|
49
|
+
* `getPtySessionInfo` / `killPtySession` / `resizePtySession` to find
|
|
50
|
+
* an existing session before falling back to `screen -ls` over
|
|
51
|
+
* `runCommand`.
|
|
52
|
+
*/
|
|
53
|
+
private readonly handles;
|
|
54
|
+
constructor(ctx: SandboxProcessContext);
|
|
55
|
+
/**
|
|
56
|
+
* Create a new PTY session on the sandbox.
|
|
57
|
+
*
|
|
58
|
+
* ```ts
|
|
59
|
+
* const pty = await sandbox.process.createPty({
|
|
60
|
+
* sessionName: "build",
|
|
61
|
+
* clusterId: sandbox.clusterId,
|
|
62
|
+
* cols: 120,
|
|
63
|
+
* rows: 30,
|
|
64
|
+
* onData: (chunk) => process.stdout.write(chunk),
|
|
65
|
+
* });
|
|
66
|
+
* await pty.waitForConnection();
|
|
67
|
+
* await pty.sendInput("npm test\n");
|
|
68
|
+
* const result = await pty.wait();
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
createPty(opts: PtyCreateOpts): Promise<PtyHandle>;
|
|
72
|
+
/**
|
|
73
|
+
* Reattach to a PTY session that was previously created by `createPty`.
|
|
74
|
+
*
|
|
75
|
+
* ```ts
|
|
76
|
+
* const pty = await sandbox.process.connectPty("build", sandbox.clusterId, {
|
|
77
|
+
* onData: (chunk) => process.stdout.write(chunk),
|
|
78
|
+
* });
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
connectPty(sessionName: string, clusterId: string, opts?: PtyConnectOpts): Promise<PtyHandle>;
|
|
82
|
+
/**
|
|
83
|
+
* List PTY sessions on the sandbox. Implemented as a `screen -ls`
|
|
84
|
+
* call via {@link runCommand} so no new server endpoint is required.
|
|
85
|
+
* Returns the union of locally-tracked handles and remote `screen`
|
|
86
|
+
* sessions; locally-tracked handles include live `cols`/`rows`.
|
|
87
|
+
*/
|
|
88
|
+
listPtySessions(): Promise<PtySessionInfo[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Look up a single PTY session.
|
|
91
|
+
*
|
|
92
|
+
* ```ts
|
|
93
|
+
* const info = await sandbox.process.getPtySessionInfo("build");
|
|
94
|
+
* console.log(info.active);
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
getPtySessionInfo(id: string): Promise<PtySessionInfo>;
|
|
98
|
+
/**
|
|
99
|
+
* Forcefully terminate a PTY session. Closes any live `PtyHandle` for
|
|
100
|
+
* the session within this SDK process and runs
|
|
101
|
+
* `screen -X -S {id} quit` on the sandbox so the remote screen
|
|
102
|
+
* session (when present) is also torn down.
|
|
103
|
+
*/
|
|
104
|
+
killPtySession(id: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Resize the terminal of an active PTY session. Requires the session
|
|
107
|
+
* to be currently attached in this SDK process; the existing wire
|
|
108
|
+
* protocol carries resize as a JSON control frame on the open
|
|
109
|
+
* WebSocket and offers no out-of-band REST equivalent.
|
|
110
|
+
*/
|
|
111
|
+
resizePtySession(id: string, cols: number, rows: number): Promise<PtySessionInfo>;
|
|
112
|
+
/** Internal: builds the WebSocket URL and opens the connection. */
|
|
113
|
+
private openPty;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,SAAS,IAAI,MAAM,CAAC;IACpB,8DAA8D;IAC9D,UAAU,IAAI,MAAM,CAAC;IACrB,wCAAwC;IACxC,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAE5C;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAE5C,GAAG,EAAE,qBAAqB;IAItC;;;;;;;;;;;;;;;OAeG;IACG,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC;IAIxD;;;;;;;;OAQG;IACG,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,SAAS,CAAC;IASrB;;;;;OAKG;IACG,eAAe,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IA+BlD;;;;;;;OAOG;IACG,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS5D;;;;;OAKG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C;;;;;OAKG;IACG,gBAAgB,CACpB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,CAAC;IAU1B,mEAAmE;YACrD,OAAO;CAmEtB"}
|
package/dist/process.js
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { PtyHandle } from "./pty.js";
|
|
2
|
+
/**
|
|
3
|
+
* `sandbox.process` — interactive shell sessions on a sandbox.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the Daytona PTY surface so existing code shaped around it
|
|
6
|
+
* ports over with mechanical changes only. Under the hood, every method
|
|
7
|
+
* either opens a WebSocket against the controlplane's
|
|
8
|
+
* `/v1/clusters/{clusterId}/machines/{sandboxId}/attach` endpoint (which
|
|
9
|
+
* is bridged to the in-sandbox SSH server at port 2222) or shells out to
|
|
10
|
+
* `screen` via the existing `runCommand` REST API for session
|
|
11
|
+
* bookkeeping.
|
|
12
|
+
*
|
|
13
|
+
* Within a single SDK process every method works against a local
|
|
14
|
+
* registry. Cross-process session persistence (i.e. `connectPty` from
|
|
15
|
+
* a fresh process to a session created elsewhere) requires the sandbox
|
|
16
|
+
* runtime image to ship `screen` and the gliderlabs SSH login shell to
|
|
17
|
+
* honor `LAI_TERM_SESSION_NAME` / `LAI_TERM_RESTORE` — both of which
|
|
18
|
+
* are tracked as a follow-up to this initial parity work.
|
|
19
|
+
*/
|
|
20
|
+
export class SandboxProcess {
|
|
21
|
+
ctx;
|
|
22
|
+
/**
|
|
23
|
+
* Live handles bound to this `SandboxProcess`, keyed by their
|
|
24
|
+
* caller-chosen session name. Used by `connectPty` /
|
|
25
|
+
* `getPtySessionInfo` / `killPtySession` / `resizePtySession` to find
|
|
26
|
+
* an existing session before falling back to `screen -ls` over
|
|
27
|
+
* `runCommand`.
|
|
28
|
+
*/
|
|
29
|
+
handles = new Map();
|
|
30
|
+
constructor(ctx) {
|
|
31
|
+
this.ctx = ctx;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Create a new PTY session on the sandbox.
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* const pty = await sandbox.process.createPty({
|
|
38
|
+
* sessionName: "build",
|
|
39
|
+
* clusterId: sandbox.clusterId,
|
|
40
|
+
* cols: 120,
|
|
41
|
+
* rows: 30,
|
|
42
|
+
* onData: (chunk) => process.stdout.write(chunk),
|
|
43
|
+
* });
|
|
44
|
+
* await pty.waitForConnection();
|
|
45
|
+
* await pty.sendInput("npm test\n");
|
|
46
|
+
* const result = await pty.wait();
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
async createPty(opts) {
|
|
50
|
+
return this.openPty({ ...opts, restore: false });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Reattach to a PTY session that was previously created by `createPty`.
|
|
54
|
+
*
|
|
55
|
+
* ```ts
|
|
56
|
+
* const pty = await sandbox.process.connectPty("build", sandbox.clusterId, {
|
|
57
|
+
* onData: (chunk) => process.stdout.write(chunk),
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
async connectPty(sessionName, clusterId, opts) {
|
|
62
|
+
return this.openPty({
|
|
63
|
+
sessionName,
|
|
64
|
+
clusterId,
|
|
65
|
+
onData: opts?.onData,
|
|
66
|
+
restore: true,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* List PTY sessions on the sandbox. Implemented as a `screen -ls`
|
|
71
|
+
* call via {@link runCommand} so no new server endpoint is required.
|
|
72
|
+
* Returns the union of locally-tracked handles and remote `screen`
|
|
73
|
+
* sessions; locally-tracked handles include live `cols`/`rows`.
|
|
74
|
+
*/
|
|
75
|
+
async listPtySessions() {
|
|
76
|
+
let remote = [];
|
|
77
|
+
try {
|
|
78
|
+
const result = await this.ctx.runCommand({
|
|
79
|
+
cmd: "screen",
|
|
80
|
+
args: ["-ls"],
|
|
81
|
+
});
|
|
82
|
+
remote = parseScreenList(result.output);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// `screen -ls` exits non-zero when there are no sessions; the SDK
|
|
86
|
+
// treats that as an empty list rather than an error.
|
|
87
|
+
}
|
|
88
|
+
const merged = new Map();
|
|
89
|
+
for (const info of remote)
|
|
90
|
+
merged.set(info.id, info);
|
|
91
|
+
for (const [id, handle] of this.handles) {
|
|
92
|
+
const existing = merged.get(id);
|
|
93
|
+
const size = handle.size;
|
|
94
|
+
merged.set(id, {
|
|
95
|
+
id,
|
|
96
|
+
active: handle.isConnected(),
|
|
97
|
+
cols: size.cols,
|
|
98
|
+
rows: size.rows,
|
|
99
|
+
cwd: existing?.cwd,
|
|
100
|
+
createdAt: existing?.createdAt,
|
|
101
|
+
processId: existing?.processId,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return Array.from(merged.values());
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Look up a single PTY session.
|
|
108
|
+
*
|
|
109
|
+
* ```ts
|
|
110
|
+
* const info = await sandbox.process.getPtySessionInfo("build");
|
|
111
|
+
* console.log(info.active);
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
async getPtySessionInfo(id) {
|
|
115
|
+
const sessions = await this.listPtySessions();
|
|
116
|
+
const found = sessions.find((s) => s.id === id);
|
|
117
|
+
if (!found) {
|
|
118
|
+
throw new Error(`PTY session "${id}" not found`);
|
|
119
|
+
}
|
|
120
|
+
return found;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Forcefully terminate a PTY session. Closes any live `PtyHandle` for
|
|
124
|
+
* the session within this SDK process and runs
|
|
125
|
+
* `screen -X -S {id} quit` on the sandbox so the remote screen
|
|
126
|
+
* session (when present) is also torn down.
|
|
127
|
+
*/
|
|
128
|
+
async killPtySession(id) {
|
|
129
|
+
const handle = this.handles.get(id);
|
|
130
|
+
if (handle) {
|
|
131
|
+
await handle.kill();
|
|
132
|
+
this.handles.delete(id);
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
await this.ctx.runCommand({
|
|
136
|
+
cmd: "screen",
|
|
137
|
+
args: ["-X", "-S", id, "quit"],
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// No remote session existed, or `screen` is not in the runtime
|
|
142
|
+
// image — either way, the local handle (if any) has been killed.
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Resize the terminal of an active PTY session. Requires the session
|
|
147
|
+
* to be currently attached in this SDK process; the existing wire
|
|
148
|
+
* protocol carries resize as a JSON control frame on the open
|
|
149
|
+
* WebSocket and offers no out-of-band REST equivalent.
|
|
150
|
+
*/
|
|
151
|
+
async resizePtySession(id, cols, rows) {
|
|
152
|
+
const handle = this.handles.get(id);
|
|
153
|
+
if (!handle || !handle.isConnected()) {
|
|
154
|
+
throw new Error(`PTY session "${id}" is not attached in this process; resize requires an active connection`);
|
|
155
|
+
}
|
|
156
|
+
return handle.resize(cols, rows);
|
|
157
|
+
}
|
|
158
|
+
/** Internal: builds the WebSocket URL and opens the connection. */
|
|
159
|
+
async openPty(args) {
|
|
160
|
+
const cols = args.cols ?? 80;
|
|
161
|
+
const rows = args.rows ?? 24;
|
|
162
|
+
const url = new URL(`${this.ctx.getBaseUrl()}/v1/clusters/${encodeURIComponent(args.clusterId)}/machines/${encodeURIComponent(this.ctx.sandboxId)}/attach`);
|
|
163
|
+
// Switch http(s) -> ws(s).
|
|
164
|
+
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
165
|
+
url.searchParams.set("sessionName", args.sessionName ? args.sessionName : "main-session");
|
|
166
|
+
url.searchParams.set("cols", String(cols));
|
|
167
|
+
url.searchParams.set("rows", String(rows));
|
|
168
|
+
if (args.restore)
|
|
169
|
+
url.searchParams.set("restore", "true");
|
|
170
|
+
const headers = {
|
|
171
|
+
Authorization: `Bearer ${this.ctx.getApiKey()}`,
|
|
172
|
+
};
|
|
173
|
+
if (this.ctx.organizationId) {
|
|
174
|
+
headers["X-Lightning-Organization-Id"] = this.ctx.organizationId;
|
|
175
|
+
}
|
|
176
|
+
const wsCtor = globalThis.WebSocket;
|
|
177
|
+
if (!wsCtor) {
|
|
178
|
+
throw new Error("Native WebSocket is not available; @lightningai/sdk requires Node 22+ for PTY support");
|
|
179
|
+
}
|
|
180
|
+
// Node's native WebSocket constructor accepts a `headers` option in the
|
|
181
|
+
// second argument as of Node 22; the DOM lib types it as `protocols`,
|
|
182
|
+
// so we cast to bypass the lib mismatch without pulling in `@types/ws`.
|
|
183
|
+
const ws = new wsCtor(url.toString(), { headers });
|
|
184
|
+
const initialInput = buildInitialInput(args.cwd, args.envs);
|
|
185
|
+
const handle = new PtyHandle({
|
|
186
|
+
id: args.sessionName,
|
|
187
|
+
ws,
|
|
188
|
+
cols,
|
|
189
|
+
rows,
|
|
190
|
+
onData: args.onData,
|
|
191
|
+
initialInput,
|
|
192
|
+
});
|
|
193
|
+
// Track in the local registry; remove when the session closes so a
|
|
194
|
+
// subsequent createPty with the same sessionName doesn't see a stale entry.
|
|
195
|
+
this.handles.set(args.sessionName, handle);
|
|
196
|
+
handle.wait().finally(() => {
|
|
197
|
+
const current = this.handles.get(args.sessionName);
|
|
198
|
+
if (current === handle)
|
|
199
|
+
this.handles.delete(args.sessionName);
|
|
200
|
+
});
|
|
201
|
+
return handle;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Build the lines that should be flushed to the shell right after the
|
|
206
|
+
* WebSocket opens — `export X=Y` for each env var followed by an
|
|
207
|
+
* optional `cd $cwd && clear`. Mirrors the Daytona convention so users
|
|
208
|
+
* see a clean prompt at the requested directory.
|
|
209
|
+
*/
|
|
210
|
+
function buildInitialInput(cwd, envs) {
|
|
211
|
+
const lines = [];
|
|
212
|
+
if (envs) {
|
|
213
|
+
for (const [k, v] of Object.entries(envs)) {
|
|
214
|
+
lines.push(`export ${k}=${shellQuote(v)}\n`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (cwd) {
|
|
218
|
+
lines.push(`cd ${shellQuote(cwd)} && clear\n`);
|
|
219
|
+
}
|
|
220
|
+
return lines;
|
|
221
|
+
}
|
|
222
|
+
/** Single-quote a value for safe inclusion in a POSIX shell command. */
|
|
223
|
+
function shellQuote(value) {
|
|
224
|
+
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Parse the (text) output of `screen -ls`. The format looks like:
|
|
228
|
+
*
|
|
229
|
+
* There is a screen on:
|
|
230
|
+
* 12345.build (Detached)
|
|
231
|
+
* 1 Socket in /run/screen/S-root.
|
|
232
|
+
*
|
|
233
|
+
* We extract the part after the first `.` (the user-supplied session
|
|
234
|
+
* name) and infer `active` from the `(Attached)` / `(Detached)` tag.
|
|
235
|
+
*/
|
|
236
|
+
function parseScreenList(output) {
|
|
237
|
+
const sessions = [];
|
|
238
|
+
for (const rawLine of output.split("\n")) {
|
|
239
|
+
const line = rawLine.trim();
|
|
240
|
+
// Lines starting with a digit and a dot are session entries;
|
|
241
|
+
// everything else is header / footer noise.
|
|
242
|
+
const match = line.match(/^(\d+)\.([^\s]+)\s*\((Attached|Detached)\)/);
|
|
243
|
+
if (!match)
|
|
244
|
+
continue;
|
|
245
|
+
const [, pid, name, state] = match;
|
|
246
|
+
sessions.push({
|
|
247
|
+
id: name,
|
|
248
|
+
active: state === "Attached",
|
|
249
|
+
processId: Number(pid),
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
return sessions;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"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"}
|
package/dist/pty.d.ts
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import type { PtyResult, PtySessionInfo, PtySize } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Default `onData` sink: write raw shell bytes to `process.stdout`.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the Python SDK's `write_to_stdout` helper. On a TTY,
|
|
6
|
+
* Node flushes per chunk, so users see live shell output without
|
|
7
|
+
* having to wire up their own callback. Pass `onData: () => {}`
|
|
8
|
+
* (or any no-op) to suppress.
|
|
9
|
+
*/
|
|
10
|
+
export declare function writeToStdout(chunk: Uint8Array): void;
|
|
11
|
+
/**
|
|
12
|
+
* Live handle to a sandbox PTY (pseudo-terminal) session.
|
|
13
|
+
*
|
|
14
|
+
* A `PtyHandle` wraps a single WebSocket to the controlplane's
|
|
15
|
+
* `/v1/clusters/{clusterId}/machines/{sandboxId}/attach` endpoint. Text
|
|
16
|
+
* frames from the server are raw shell bytes (combined stdout/stderr); the
|
|
17
|
+
* SDK forwards them verbatim to the `onData` callback supplied at create
|
|
18
|
+
* time. Outbound input is sent as raw text frames; resize is sent as a
|
|
19
|
+
* JSON control frame `{"type":"resize","cols":N,"rows":M}` (matches the
|
|
20
|
+
* wire shape the Lightning UI's terminal already speaks).
|
|
21
|
+
*
|
|
22
|
+
* The handle is created by `Sandbox.process.createPty` / `connectPty` and
|
|
23
|
+
* is not intended to be constructed directly.
|
|
24
|
+
*/
|
|
25
|
+
export declare class PtyHandle {
|
|
26
|
+
/** Caller-supplied session id (passed as `sessionName` query param). */
|
|
27
|
+
readonly id: string;
|
|
28
|
+
/**
|
|
29
|
+
* Raw output callback. Defaults to {@link writeToStdout} so omitting
|
|
30
|
+
* `onData` produces live output on a TTY (mirrors Python's default).
|
|
31
|
+
*/
|
|
32
|
+
private readonly onDataCb;
|
|
33
|
+
private readonly ws;
|
|
34
|
+
private _exitCode;
|
|
35
|
+
private _error;
|
|
36
|
+
private _size;
|
|
37
|
+
private _connected;
|
|
38
|
+
private _closed;
|
|
39
|
+
/**
|
|
40
|
+
* Resolves once the WebSocket transitions to OPEN. Rejected if the
|
|
41
|
+
* underlying socket errors out before opening.
|
|
42
|
+
*/
|
|
43
|
+
private readonly openPromise;
|
|
44
|
+
/**
|
|
45
|
+
* Resolves once the WebSocket has closed. Carries the populated
|
|
46
|
+
* exit code / error so {@link wait} can be re-awaited safely.
|
|
47
|
+
*/
|
|
48
|
+
private readonly closePromise;
|
|
49
|
+
/** Internal: assembled by `SandboxProcess` once it has built the URL. */
|
|
50
|
+
constructor(opts: {
|
|
51
|
+
id: string;
|
|
52
|
+
ws: WebSocket;
|
|
53
|
+
cols: number;
|
|
54
|
+
rows: number;
|
|
55
|
+
onData?: (data: Uint8Array) => void;
|
|
56
|
+
/**
|
|
57
|
+
* Lines of shell input automatically sent right after the connection
|
|
58
|
+
* opens — typically `cd $cwd && clear` and any `export X=Y` lines.
|
|
59
|
+
*/
|
|
60
|
+
initialInput?: string[];
|
|
61
|
+
});
|
|
62
|
+
/** Most recent exit code; `null` while the session is still running. */
|
|
63
|
+
get exitCode(): number | null;
|
|
64
|
+
/** Termination reason after an abnormal close; otherwise `null`. */
|
|
65
|
+
get error(): string | null;
|
|
66
|
+
/** Last terminal dimensions known to the SDK. */
|
|
67
|
+
get size(): PtySize;
|
|
68
|
+
/**
|
|
69
|
+
* Waits for the WebSocket to open. Useful before calling
|
|
70
|
+
* {@link sendInput} so input doesn't race the handshake.
|
|
71
|
+
*
|
|
72
|
+
* ```ts
|
|
73
|
+
* await ptyHandle.waitForConnection();
|
|
74
|
+
* await ptyHandle.sendInput("ls -la\n");
|
|
75
|
+
* ```
|
|
76
|
+
*
|
|
77
|
+
* @param timeoutMs reject if the socket hasn't opened within this many ms.
|
|
78
|
+
*/
|
|
79
|
+
waitForConnection(timeoutMs?: number): Promise<void>;
|
|
80
|
+
/** Whether the underlying WebSocket is currently OPEN. */
|
|
81
|
+
isConnected(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Send input to the shell. Strings are forwarded verbatim; `Uint8Array`
|
|
84
|
+
* values are decoded as UTF-8 (matches the existing handler, which
|
|
85
|
+
* treats every WebSocket frame as text).
|
|
86
|
+
*
|
|
87
|
+
* ```ts
|
|
88
|
+
* await ptyHandle.sendInput("ls -la\n");
|
|
89
|
+
* await ptyHandle.sendInput(new Uint8Array([0x03])); // Ctrl+C
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
sendInput(data: string | Uint8Array): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Resize the terminal. Emits the same JSON control frame the Lightning
|
|
95
|
+
* UI sends, which the server translates into an SSH `WindowChange`.
|
|
96
|
+
*
|
|
97
|
+
* ```ts
|
|
98
|
+
* await ptyHandle.resize(120, 30);
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
resize(cols: number, rows: number): Promise<PtySessionInfo>;
|
|
102
|
+
/**
|
|
103
|
+
* Send Ctrl+C to the shell, then close the WebSocket. The remote screen
|
|
104
|
+
* session (when present) keeps running; use
|
|
105
|
+
* `Sandbox.process.killPtySession(id)` to also tear down the screen
|
|
106
|
+
* session itself.
|
|
107
|
+
*/
|
|
108
|
+
kill(): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Close the WebSocket without signaling the shell. The underlying
|
|
111
|
+
* process keeps running on the server.
|
|
112
|
+
*/
|
|
113
|
+
disconnect(): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Wait for the session to terminate. Resolves once the WebSocket has
|
|
116
|
+
* closed (either because the user typed `exit`, the shell exited, or
|
|
117
|
+
* the SDK called {@link disconnect}/{@link kill}).
|
|
118
|
+
*/
|
|
119
|
+
wait(): Promise<PtyResult>;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=pty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.d.ts","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAIrD;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,SAAS;IACpB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAY;IAE/B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IAExB;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAE5C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAElD,yEAAyE;gBAC7D,IAAI,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,EAAE,EAAE,SAAS,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;QACpC;;;WAGG;QACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB;IAgED,wEAAwE;IACxE,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IAED,oEAAoE;IACpE,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,iDAAiD;IACjD,IAAI,IAAI,IAAI,OAAO,CAElB;IAED;;;;;;;;;;OAUG;IACG,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1D,0DAA0D;IAC1D,WAAW,IAAI,OAAO;IAItB;;;;;;;;;OASG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzD;;;;;;;OAOG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAiBjE;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAUjC;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,SAAS,CAAC;CAGjC"}
|
package/dist/pty.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default `onData` sink: write raw shell bytes to `process.stdout`.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the Python SDK's `write_to_stdout` helper. On a TTY,
|
|
5
|
+
* Node flushes per chunk, so users see live shell output without
|
|
6
|
+
* having to wire up their own callback. Pass `onData: () => {}`
|
|
7
|
+
* (or any no-op) to suppress.
|
|
8
|
+
*/
|
|
9
|
+
export function writeToStdout(chunk) {
|
|
10
|
+
if (typeof process !== "undefined" && process.stdout && typeof process.stdout.write === "function") {
|
|
11
|
+
process.stdout.write(chunk);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Live handle to a sandbox PTY (pseudo-terminal) session.
|
|
16
|
+
*
|
|
17
|
+
* A `PtyHandle` wraps a single WebSocket to the controlplane's
|
|
18
|
+
* `/v1/clusters/{clusterId}/machines/{sandboxId}/attach` endpoint. Text
|
|
19
|
+
* frames from the server are raw shell bytes (combined stdout/stderr); the
|
|
20
|
+
* SDK forwards them verbatim to the `onData` callback supplied at create
|
|
21
|
+
* time. Outbound input is sent as raw text frames; resize is sent as a
|
|
22
|
+
* JSON control frame `{"type":"resize","cols":N,"rows":M}` (matches the
|
|
23
|
+
* wire shape the Lightning UI's terminal already speaks).
|
|
24
|
+
*
|
|
25
|
+
* The handle is created by `Sandbox.process.createPty` / `connectPty` and
|
|
26
|
+
* is not intended to be constructed directly.
|
|
27
|
+
*/
|
|
28
|
+
export class PtyHandle {
|
|
29
|
+
/** Caller-supplied session id (passed as `sessionName` query param). */
|
|
30
|
+
id;
|
|
31
|
+
/**
|
|
32
|
+
* Raw output callback. Defaults to {@link writeToStdout} so omitting
|
|
33
|
+
* `onData` produces live output on a TTY (mirrors Python's default).
|
|
34
|
+
*/
|
|
35
|
+
onDataCb;
|
|
36
|
+
ws;
|
|
37
|
+
_exitCode = null;
|
|
38
|
+
_error = null;
|
|
39
|
+
_size;
|
|
40
|
+
_connected = false;
|
|
41
|
+
_closed = false;
|
|
42
|
+
/**
|
|
43
|
+
* Resolves once the WebSocket transitions to OPEN. Rejected if the
|
|
44
|
+
* underlying socket errors out before opening.
|
|
45
|
+
*/
|
|
46
|
+
openPromise;
|
|
47
|
+
/**
|
|
48
|
+
* Resolves once the WebSocket has closed. Carries the populated
|
|
49
|
+
* exit code / error so {@link wait} can be re-awaited safely.
|
|
50
|
+
*/
|
|
51
|
+
closePromise;
|
|
52
|
+
/** Internal: assembled by `SandboxProcess` once it has built the URL. */
|
|
53
|
+
constructor(opts) {
|
|
54
|
+
this.id = opts.id;
|
|
55
|
+
// Default to flushing stdout so JS users get the same live-output
|
|
56
|
+
// experience Python users get from `write_to_stdout` on a TTY.
|
|
57
|
+
this.onDataCb = opts.onData ?? writeToStdout;
|
|
58
|
+
this.ws = opts.ws;
|
|
59
|
+
this._size = { cols: opts.cols, rows: opts.rows };
|
|
60
|
+
// Force binary frames to ArrayBuffer in Node so we can construct a
|
|
61
|
+
// Uint8Array directly without going through Blob.arrayBuffer().
|
|
62
|
+
this.ws.binaryType = "arraybuffer";
|
|
63
|
+
let openResolve;
|
|
64
|
+
let openReject;
|
|
65
|
+
this.openPromise = new Promise((resolve, reject) => {
|
|
66
|
+
openResolve = resolve;
|
|
67
|
+
openReject = reject;
|
|
68
|
+
});
|
|
69
|
+
let closeResolve;
|
|
70
|
+
this.closePromise = new Promise((resolve) => {
|
|
71
|
+
closeResolve = resolve;
|
|
72
|
+
});
|
|
73
|
+
this.ws.addEventListener("open", () => {
|
|
74
|
+
this._connected = true;
|
|
75
|
+
// Drain any queued setup commands before the user can send input.
|
|
76
|
+
if (opts.initialInput && opts.initialInput.length > 0) {
|
|
77
|
+
for (const line of opts.initialInput) {
|
|
78
|
+
try {
|
|
79
|
+
this.ws.send(line);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Will be surfaced via the error handler below.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
openResolve();
|
|
87
|
+
});
|
|
88
|
+
this.ws.addEventListener("message", (ev) => {
|
|
89
|
+
const chunk = toUint8Array(ev.data);
|
|
90
|
+
if (chunk)
|
|
91
|
+
this.onDataCb(chunk);
|
|
92
|
+
});
|
|
93
|
+
this.ws.addEventListener("error", () => {
|
|
94
|
+
// The Node `ws` global delivers errors without details on the event;
|
|
95
|
+
// we only know there was a problem. The close event fires next with
|
|
96
|
+
// a numeric code we can use.
|
|
97
|
+
if (!this._connected) {
|
|
98
|
+
openReject(new Error("PTY WebSocket connection failed"));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
this.ws.addEventListener("close", (ev) => {
|
|
102
|
+
this._connected = false;
|
|
103
|
+
this._closed = true;
|
|
104
|
+
const clean = ev.code === 1000 || ev.code === 1005;
|
|
105
|
+
this._exitCode = clean ? 0 : -1;
|
|
106
|
+
if (!clean && ev.reason)
|
|
107
|
+
this._error = ev.reason;
|
|
108
|
+
else if (!clean)
|
|
109
|
+
this._error = `WebSocket closed with code ${ev.code}`;
|
|
110
|
+
closeResolve({ exitCode: this._exitCode, error: this._error });
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/** Most recent exit code; `null` while the session is still running. */
|
|
114
|
+
get exitCode() {
|
|
115
|
+
return this._exitCode;
|
|
116
|
+
}
|
|
117
|
+
/** Termination reason after an abnormal close; otherwise `null`. */
|
|
118
|
+
get error() {
|
|
119
|
+
return this._error;
|
|
120
|
+
}
|
|
121
|
+
/** Last terminal dimensions known to the SDK. */
|
|
122
|
+
get size() {
|
|
123
|
+
return { ...this._size };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Waits for the WebSocket to open. Useful before calling
|
|
127
|
+
* {@link sendInput} so input doesn't race the handshake.
|
|
128
|
+
*
|
|
129
|
+
* ```ts
|
|
130
|
+
* await ptyHandle.waitForConnection();
|
|
131
|
+
* await ptyHandle.sendInput("ls -la\n");
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
* @param timeoutMs reject if the socket hasn't opened within this many ms.
|
|
135
|
+
*/
|
|
136
|
+
async waitForConnection(timeoutMs) {
|
|
137
|
+
if (this._connected)
|
|
138
|
+
return;
|
|
139
|
+
if (timeoutMs === undefined) {
|
|
140
|
+
await this.openPromise;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
let timer;
|
|
144
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
145
|
+
timer = setTimeout(() => reject(new Error(`PTY connection timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
146
|
+
});
|
|
147
|
+
try {
|
|
148
|
+
await Promise.race([this.openPromise, timeout]);
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
if (timer)
|
|
152
|
+
clearTimeout(timer);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Whether the underlying WebSocket is currently OPEN. */
|
|
156
|
+
isConnected() {
|
|
157
|
+
return this._connected;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Send input to the shell. Strings are forwarded verbatim; `Uint8Array`
|
|
161
|
+
* values are decoded as UTF-8 (matches the existing handler, which
|
|
162
|
+
* treats every WebSocket frame as text).
|
|
163
|
+
*
|
|
164
|
+
* ```ts
|
|
165
|
+
* await ptyHandle.sendInput("ls -la\n");
|
|
166
|
+
* await ptyHandle.sendInput(new Uint8Array([0x03])); // Ctrl+C
|
|
167
|
+
* ```
|
|
168
|
+
*/
|
|
169
|
+
async sendInput(data) {
|
|
170
|
+
if (this._closed) {
|
|
171
|
+
throw new Error("PTY session is closed");
|
|
172
|
+
}
|
|
173
|
+
if (!this._connected) {
|
|
174
|
+
await this.waitForConnection();
|
|
175
|
+
}
|
|
176
|
+
const payload = typeof data === "string" ? data : new TextDecoder().decode(data);
|
|
177
|
+
this.ws.send(payload);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Resize the terminal. Emits the same JSON control frame the Lightning
|
|
181
|
+
* UI sends, which the server translates into an SSH `WindowChange`.
|
|
182
|
+
*
|
|
183
|
+
* ```ts
|
|
184
|
+
* await ptyHandle.resize(120, 30);
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
async resize(cols, rows) {
|
|
188
|
+
if (this._closed) {
|
|
189
|
+
throw new Error("PTY session is closed");
|
|
190
|
+
}
|
|
191
|
+
if (!this._connected) {
|
|
192
|
+
await this.waitForConnection();
|
|
193
|
+
}
|
|
194
|
+
this.ws.send(JSON.stringify({ type: "resize", cols, rows }));
|
|
195
|
+
this._size = { cols, rows };
|
|
196
|
+
return {
|
|
197
|
+
id: this.id,
|
|
198
|
+
active: this._connected,
|
|
199
|
+
cols,
|
|
200
|
+
rows,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Send Ctrl+C to the shell, then close the WebSocket. The remote screen
|
|
205
|
+
* session (when present) keeps running; use
|
|
206
|
+
* `Sandbox.process.killPtySession(id)` to also tear down the screen
|
|
207
|
+
* session itself.
|
|
208
|
+
*/
|
|
209
|
+
async kill() {
|
|
210
|
+
if (this._closed)
|
|
211
|
+
return;
|
|
212
|
+
try {
|
|
213
|
+
if (this._connected) {
|
|
214
|
+
this.ws.send("\u0003");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Ignore — we're closing anyway.
|
|
219
|
+
}
|
|
220
|
+
await this.disconnect();
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Close the WebSocket without signaling the shell. The underlying
|
|
224
|
+
* process keeps running on the server.
|
|
225
|
+
*/
|
|
226
|
+
async disconnect() {
|
|
227
|
+
if (this._closed)
|
|
228
|
+
return;
|
|
229
|
+
try {
|
|
230
|
+
this.ws.close(1000, "client disconnect");
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// Already closing.
|
|
234
|
+
}
|
|
235
|
+
await this.closePromise;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Wait for the session to terminate. Resolves once the WebSocket has
|
|
239
|
+
* closed (either because the user typed `exit`, the shell exited, or
|
|
240
|
+
* the SDK called {@link disconnect}/{@link kill}).
|
|
241
|
+
*/
|
|
242
|
+
async wait() {
|
|
243
|
+
return this.closePromise;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Best-effort coercion of a WebSocket message payload to bytes. The
|
|
248
|
+
* Lightning xterm protocol always sends text frames; we still accept
|
|
249
|
+
* Buffer / ArrayBuffer for forward compatibility.
|
|
250
|
+
*/
|
|
251
|
+
function toUint8Array(data) {
|
|
252
|
+
if (typeof data === "string") {
|
|
253
|
+
return new TextEncoder().encode(data);
|
|
254
|
+
}
|
|
255
|
+
if (data instanceof ArrayBuffer) {
|
|
256
|
+
return new Uint8Array(data);
|
|
257
|
+
}
|
|
258
|
+
if (ArrayBuffer.isView(data)) {
|
|
259
|
+
const view = data;
|
|
260
|
+
return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
|
|
261
|
+
}
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=pty.js.map
|
package/dist/pty.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"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"}
|
package/dist/sandbox.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { SandboxConfig, CreateSandboxParams, GetSandboxParams, ListSandboxesParams, RunCommandOpts, CommandStatus, CommandLog, WaitForCommandOptions, WriteFileParams, ReadFileParams, CreateDirectoryParams } from "./types.js";
|
|
2
2
|
import { Command } from "./command.js";
|
|
3
3
|
import { FileSystem } from "./filesystem.js";
|
|
4
|
+
import { SandboxProcess } from "./process.js";
|
|
4
5
|
/**
|
|
5
6
|
* A sandbox is an isolated Linux environment you can create on demand.
|
|
6
7
|
* Use it to run commands, read/write files, and manage the sandbox lifecycle.
|
|
@@ -43,7 +44,23 @@ export declare class Sandbox {
|
|
|
43
44
|
readonly updatedAt: Date;
|
|
44
45
|
/** Path-oriented file helpers that run commands inside the sandbox (see {@link FileSystem}). */
|
|
45
46
|
readonly fs: FileSystem;
|
|
47
|
+
/** Lazily-instantiated PTY namespace; see {@link Sandbox.process}. */
|
|
48
|
+
private _process?;
|
|
46
49
|
private constructor();
|
|
50
|
+
/**
|
|
51
|
+
* Interactive process namespace for this sandbox: PTY sessions and
|
|
52
|
+
* shell-style helpers. Mirrors Daytona's `sandbox.process` surface.
|
|
53
|
+
*
|
|
54
|
+
* ```ts
|
|
55
|
+
* const pty = await sandbox.process.createPty({
|
|
56
|
+
* sessionName: "shell",
|
|
57
|
+
* clusterId: sandbox.clusterId,
|
|
58
|
+
* onData: (chunk) => process.stdout.write(chunk),
|
|
59
|
+
* });
|
|
60
|
+
* await pty.sendInput("ls -la\n");
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
get process(): SandboxProcess;
|
|
47
64
|
/**
|
|
48
65
|
* Set global defaults used by all subsequent SDK calls.
|
|
49
66
|
*/
|
package/dist/sandbox.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EAEnB,cAAc,EACd,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAevC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
|
package/dist/sandbox.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Command } from "./command.js";
|
|
2
2
|
import { getApiKey, getBaseUrl, mergeSandboxConfig, resolveOrgId } from "./config.js";
|
|
3
3
|
import { FileSystem } from "./filesystem.js";
|
|
4
|
+
import { SandboxProcess } from "./process.js";
|
|
4
5
|
function buildQuery(params) {
|
|
5
6
|
const qs = new URLSearchParams();
|
|
6
7
|
for (const [k, v] of Object.entries(params)) {
|
|
@@ -21,6 +22,7 @@ async function request(method, path, body, apiKeyOverride) {
|
|
|
21
22
|
init.body = JSON.stringify(body);
|
|
22
23
|
}
|
|
23
24
|
const resp = await fetch(url, init);
|
|
25
|
+
console.log(url);
|
|
24
26
|
if (!resp.ok) {
|
|
25
27
|
const text = await resp.text();
|
|
26
28
|
throw new Error(`Lightning API error ${resp.status}: ${text}`);
|
|
@@ -89,6 +91,8 @@ export class Sandbox {
|
|
|
89
91
|
updatedAt;
|
|
90
92
|
/** Path-oriented file helpers that run commands inside the sandbox (see {@link FileSystem}). */
|
|
91
93
|
fs;
|
|
94
|
+
/** Lazily-instantiated PTY namespace; see {@link Sandbox.process}. */
|
|
95
|
+
_process;
|
|
92
96
|
constructor(data) {
|
|
93
97
|
this.sandboxId = data.id;
|
|
94
98
|
this.name = data.name;
|
|
@@ -104,6 +108,31 @@ export class Sandbox {
|
|
|
104
108
|
this.updatedAt = new Date(data.updatedAt);
|
|
105
109
|
this.fs = new FileSystem(this);
|
|
106
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Interactive process namespace for this sandbox: PTY sessions and
|
|
113
|
+
* shell-style helpers. Mirrors Daytona's `sandbox.process` surface.
|
|
114
|
+
*
|
|
115
|
+
* ```ts
|
|
116
|
+
* const pty = await sandbox.process.createPty({
|
|
117
|
+
* sessionName: "shell",
|
|
118
|
+
* clusterId: sandbox.clusterId,
|
|
119
|
+
* onData: (chunk) => process.stdout.write(chunk),
|
|
120
|
+
* });
|
|
121
|
+
* await pty.sendInput("ls -la\n");
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
get process() {
|
|
125
|
+
if (!this._process) {
|
|
126
|
+
this._process = new SandboxProcess({
|
|
127
|
+
sandboxId: this.sandboxId,
|
|
128
|
+
organizationId: this.organizationId,
|
|
129
|
+
getApiKey: () => getApiKey(),
|
|
130
|
+
getBaseUrl: () => getBaseUrl(),
|
|
131
|
+
runCommand: (opts) => this.runCommand(opts),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return this._process;
|
|
135
|
+
}
|
|
107
136
|
// ---------------------------------------------------------------------------
|
|
108
137
|
// Global configuration
|
|
109
138
|
// ---------------------------------------------------------------------------
|
package/dist/sandbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAcvC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,SAAS,UAAU,CAAC,MAA0C;IAC5D,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;YAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IACxB,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,cAAuB;IAEvB,MAAM,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,SAAS,CAAC,cAAc,CAAC,EAAE;KACrD,CAAC;IACF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC3D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAM,CAAC;IAClC,CAAC;IACD,OAAO,EAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,CAAY;IACjC,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE;QACd,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;QAClB,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;QACtC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;QAC5B,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE;QAClC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;QACtB,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,EAAE;QAClC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;QACxB,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;QAC5B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;KAC7B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,OAAO,OAAO;IACT,SAAS,CAAS;IAClB,IAAI,CAAS;IACb,cAAc,CAAS;IACvB,SAAS,CAAS;IAClB,YAAY,CAAS;IACrB,IAAI,CAAU;IACd,MAAM,CAAS;IACf,YAAY,CAAS;IACrB,KAAK,CAAW;IAChB,OAAO,CAAS;IAChB,SAAS,CAAO;IAChB,SAAS,CAAO;IAEzB,gGAAgG;IACvF,EAAE,CAAa;IAExB,YAAoB,IAAiB;QACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,8EAA8E;IAC9E,uBAAuB;IACvB,8EAA8E;IAE9E;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,MAAqB;QACpC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,8EAA8E;IAC9E,sBAAsB;IACtB,8EAA8E;IAE9E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAA2B;QAC7C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,WAAW,GAAG,CAAC,cAAc,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;QAE3L,MAAM,IAAI,GAA2B;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW;YAChC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK;YAC1B,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;SACxC,CAAC;QACF,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,KAAK;YAAE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;QACvC,IAAI,MAAM,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACxD,IAAI,MAAM,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACjE,IAAI,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAElD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAY,MAAM,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAC1E,IAAI,OAAO,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;QACjC,OAAO,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACpC,IACE,OAAO,CAAC,MAAM,KAAK,OAAO;gBAC1B,OAAO,CAAC,MAAM,KAAK,SAAS;gBAC5B,OAAO,CAAC,MAAM,KAAK,UAAU,EAC7B,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,iDAAiD,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACnC,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;YAC7C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAChD,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,SAAS;aACpD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAwB;QACvC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,KAAK,EACL,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAClE,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,SAA8B,EAAE;QAOhC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,cAAc,EAAE,KAAK;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;SACrE,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAA0B,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACtF,MAAM,GAAG,GAA0B;YACjC,SAAS,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC;YACpD,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,SAAS,EACP,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,EAAE;gBACnD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBACxB,CAAC,CAAC,SAAS;SAChB,CAAC;QACF,OAAO;YACL,SAAS,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3D,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;YACtC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,EAAE;YAC9C,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,CAAC;SAC9B,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,+BAA+B;IAC/B,8EAA8E;IAE9E,KAAK,CAAC,MAAM;QACV,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SACjD,CAAC,CAAC;QACH,MAAM,OAAO,CACX,QAAQ,EACR,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,CAChE,CAAC;IACJ,CAAC;IAgBD,KAAK,CAAC,UAAU,CACd,aAAsC,EACtC,IAAe;QAEf,MAAM,IAAI,GAA0C;YAClD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SACjD,CAAC;QAEF,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC;YAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC;YACjC,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;YACrC,IAAI,aAAa,CAAC,GAAG;gBAAE,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;YACpD,IAAI,aAAa,CAAC,GAAG;gBAAE,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;YACpD,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;YACrE,IAAI,aAAa,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzC,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;gBACvC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;YACpC,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,MAAM,EACN,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EACnE,IAAI,CACL,CAAC;QAEF,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAAa;QAChC,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SACjD,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,KAAK,EACL,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAC3G,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC;YACvD,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;YAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;SACzB,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SACjD,CAAC,CAAC;QACH,MAAM,OAAO,CACX,MAAM,EACN,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAC3G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SACjD,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,KAAK,EACL,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,kBAAkB,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CACtG,CAAC;QACF,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;SAC/B,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,OAA8B,EAAE;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,GAAG,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAExF,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC;YACnC,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,YAAY,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,2BAA2B;IAC3B,8EAA8E;IAE9E,KAAK,CAAC,SAAS,CAAC,MAAuB;QACrC,MAAM,IAAI,GAAyC;YACjD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;YAChD,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QACF,MAAM,OAAO,CACX,MAAM,EACN,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAChE,IAAI,CACL,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,MAAM,EAAE,GAAG,UAAU,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;SACjD,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,KAAK,EACL,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CACtE,CAAC;YACF,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAwB;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAA6B;QACjD,MAAM,IAAI,GAA+C;YACvD,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,SAAS;YAChD,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QACF,MAAM,OAAO,CACX,MAAM,EACN,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EACtE,IAAI,CACL,CAAC;IACJ,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -98,4 +98,71 @@ export interface FileStat {
|
|
|
98
98
|
/** Permission bits as an octal string (e.g. `644`). */
|
|
99
99
|
mode: string;
|
|
100
100
|
}
|
|
101
|
+
/** Terminal dimensions in columns and rows. */
|
|
102
|
+
export interface PtySize {
|
|
103
|
+
cols: number;
|
|
104
|
+
rows: number;
|
|
105
|
+
}
|
|
106
|
+
/** Parameters for creating a new PTY session. */
|
|
107
|
+
export interface PtyCreateOpts {
|
|
108
|
+
/**
|
|
109
|
+
* Caller-chosen identifier for the session. Re-using the same name with
|
|
110
|
+
* `connectPty` reattaches to the same WebSocket-side session within the
|
|
111
|
+
* SDK process (cross-process persistence requires a server follow-up).
|
|
112
|
+
*/
|
|
113
|
+
sessionName: string;
|
|
114
|
+
/**
|
|
115
|
+
* Cluster the sandbox is running on. Required because the controlplane
|
|
116
|
+
* attach endpoint is keyed on `(clusterId, sandboxId)`.
|
|
117
|
+
*/
|
|
118
|
+
clusterId: string;
|
|
119
|
+
/** Working directory the session starts in. Sent as `cd ... && clear`. */
|
|
120
|
+
cwd?: string;
|
|
121
|
+
/** Environment variables exported in the session before any user input. */
|
|
122
|
+
envs?: Record<string, string>;
|
|
123
|
+
/** Initial terminal columns. Defaults to 80. */
|
|
124
|
+
cols?: number;
|
|
125
|
+
/** Initial terminal rows. Defaults to 24. */
|
|
126
|
+
rows?: number;
|
|
127
|
+
/**
|
|
128
|
+
* Callback invoked for every chunk of bytes received from the shell
|
|
129
|
+
* (combined stdout/stderr). Bytes are delivered exactly as the server
|
|
130
|
+
* forwards them, with no buffering or line-splitting on the SDK side.
|
|
131
|
+
*/
|
|
132
|
+
onData?: (data: Uint8Array) => void;
|
|
133
|
+
}
|
|
134
|
+
/** Parameters for connecting to an existing PTY session. */
|
|
135
|
+
export interface PtyConnectOpts {
|
|
136
|
+
/** See {@link PtyCreateOpts.onData}. */
|
|
137
|
+
onData?: (data: Uint8Array) => void;
|
|
138
|
+
}
|
|
139
|
+
/** Result returned when a PTY session terminates. */
|
|
140
|
+
export interface PtyResult {
|
|
141
|
+
/**
|
|
142
|
+
* Exit code of the underlying process. The Lightning xterm wire protocol
|
|
143
|
+
* does not currently propagate the SSH command's exit status, so this is
|
|
144
|
+
* `0` for a clean WebSocket close, `-1` for an abnormal close, and `null`
|
|
145
|
+
* if the session is still running.
|
|
146
|
+
*/
|
|
147
|
+
exitCode: number | null;
|
|
148
|
+
/** Termination reason for abnormal exits. */
|
|
149
|
+
error: string | null;
|
|
150
|
+
}
|
|
151
|
+
/** Snapshot of a PTY session's state. */
|
|
152
|
+
export interface PtySessionInfo {
|
|
153
|
+
/** The session id supplied when the session was created. */
|
|
154
|
+
id: string;
|
|
155
|
+
/** Whether a WebSocket is currently attached to the session. */
|
|
156
|
+
active: boolean;
|
|
157
|
+
/** Terminal columns. */
|
|
158
|
+
cols?: number;
|
|
159
|
+
/** Terminal rows. */
|
|
160
|
+
rows?: number;
|
|
161
|
+
/** Working directory the session was created with. */
|
|
162
|
+
cwd?: string;
|
|
163
|
+
/** ISO timestamp the session was created. */
|
|
164
|
+
createdAt?: string;
|
|
165
|
+
/** Underlying process id, when available. */
|
|
166
|
+
processId?: number;
|
|
167
|
+
}
|
|
101
168
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lightningai/sdk",
|
|
3
|
-
"version": "2026.5.
|
|
3
|
+
"version": "2026.5.15-post0",
|
|
4
4
|
"description": "Lightning AI Sandbox SDK — create and manage sandboxes, run commands, read/write files",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -22,13 +22,13 @@
|
|
|
22
22
|
"clean": "rm -rf dist",
|
|
23
23
|
"build": "tsc",
|
|
24
24
|
"prepublishOnly": "npm run clean && npm run build",
|
|
25
|
-
"test": "node --test --import tsx tests/config.test.ts tests/sandbox.test.ts tests/filesystem.test.ts"
|
|
25
|
+
"test": "node --test --import tsx tests/config.test.ts tests/sandbox.test.ts tests/filesystem.test.ts tests/pty.test.ts"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"axios": "^1.7.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@types/node": "^22.
|
|
31
|
+
"@types/node": "^22.19.18",
|
|
32
32
|
"tsx": "^4.0.0",
|
|
33
33
|
"typescript": "^5.4.0"
|
|
34
34
|
},
|