@b3os/cli 0.0.0-stage → 0.0.1
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 +202 -0
- package/README.md +111 -2
- package/bin/b3os.js +6 -0
- package/dist/commands/api.d.ts +2 -0
- package/dist/commands/api.js +48 -0
- package/dist/commands/api.js.map +1 -0
- package/dist/commands/auth.d.ts +4 -0
- package/dist/commands/auth.js +141 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/bench.d.ts +12 -0
- package/dist/commands/bench.js +146 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/keys.d.ts +2 -0
- package/dist/commands/keys.js +108 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/mcp.d.ts +6 -0
- package/dist/commands/mcp.js +194 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/routine.d.ts +5 -0
- package/dist/commands/routine.js +206 -0
- package/dist/commands/routine.js.map +1 -0
- package/dist/commands/sandbox.d.ts +2 -0
- package/dist/commands/sandbox.js +245 -0
- package/dist/commands/sandbox.js.map +1 -0
- package/dist/commands/web.d.ts +4 -0
- package/dist/commands/web.js +205 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.js +71 -0
- package/dist/config.js.map +1 -0
- package/dist/ctx.d.ts +112 -0
- package/dist/ctx.js +271 -0
- package/dist/ctx.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.js +86 -0
- package/dist/main.js.map +1 -0
- package/package.json +46 -4
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// b3os routine deploy | run | logs | ls, and b3os action search | describe | run.
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { EXIT, intFlag, jsonFlag, pairs, parse, UsageError } from "../ctx.js";
|
|
4
|
+
const ROUTINE_USAGE = `usage: b3os routine <command>
|
|
5
|
+
deploy <file.yaml|file.json> [--name NAME] publish (creates the routine on first deploy)
|
|
6
|
+
run <routine> [--input JSON|@file] [--version N] [--no-wait] [--follow]
|
|
7
|
+
logs <run_id> [--follow]
|
|
8
|
+
ls [--limit N]`;
|
|
9
|
+
/** `--input '{"a":1}'` or `--input @input.json`. */
|
|
10
|
+
function inputFlag(v) {
|
|
11
|
+
if (v === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
const s = String(v);
|
|
14
|
+
const parsed = jsonFlag(s.startsWith("@") ? readFileSync(s.slice(1), "utf8") : s, "--input");
|
|
15
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
16
|
+
throw new UsageError("--input must be a JSON object");
|
|
17
|
+
}
|
|
18
|
+
return parsed;
|
|
19
|
+
}
|
|
20
|
+
/** The routine's name from its definition (JSON `name`, or a top-level `name:` line of YAML). */
|
|
21
|
+
export function routineName(text, file) {
|
|
22
|
+
const t = text.trimStart();
|
|
23
|
+
if (t.startsWith("{")) {
|
|
24
|
+
const name = JSON.parse(t).name;
|
|
25
|
+
if (typeof name === "string" && name)
|
|
26
|
+
return name;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const m = /^name:\s*["']?([a-z0-9][a-z0-9-]*)["']?\s*(#.*)?$/m.exec(text);
|
|
30
|
+
if (m?.[1])
|
|
31
|
+
return m[1];
|
|
32
|
+
}
|
|
33
|
+
throw new UsageError(`${file} has no top-level name; pass --name`);
|
|
34
|
+
}
|
|
35
|
+
function logRunEvent(ctx, ev) {
|
|
36
|
+
const e = ev;
|
|
37
|
+
if (ctx.json) {
|
|
38
|
+
ctx.printJsonLine(ev);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (e.type === "run.log")
|
|
42
|
+
ctx.info(` ${e.step ?? ""} ${e.message ?? ""}`.trimEnd());
|
|
43
|
+
else if (e.type.startsWith("step.")) {
|
|
44
|
+
const extra = e.error ? ` ${e.error.code}: ${e.error.detail ?? ""}` : "";
|
|
45
|
+
ctx.info(`${e.type.slice(5).padEnd(9)} ${e.step ?? ""}${extra}`);
|
|
46
|
+
}
|
|
47
|
+
else
|
|
48
|
+
ctx.info(e.type);
|
|
49
|
+
}
|
|
50
|
+
export async function routine(ctx, argv) {
|
|
51
|
+
const [sub, ...rest] = argv;
|
|
52
|
+
const a = parse(rest, {
|
|
53
|
+
name: { type: "string" },
|
|
54
|
+
input: { type: "string" },
|
|
55
|
+
version: { type: "string" },
|
|
56
|
+
"no-wait": { type: "boolean" },
|
|
57
|
+
follow: { type: "boolean", short: "f" },
|
|
58
|
+
limit: { type: "string" },
|
|
59
|
+
});
|
|
60
|
+
ctx.applyGlobals(a.values);
|
|
61
|
+
if (!sub || a.values.help) {
|
|
62
|
+
ctx.out(ROUTINE_USAGE);
|
|
63
|
+
return sub ? EXIT.OK : EXIT.USAGE;
|
|
64
|
+
}
|
|
65
|
+
const b3 = ctx.client();
|
|
66
|
+
const arg = a.positionals[0];
|
|
67
|
+
switch (sub) {
|
|
68
|
+
case "deploy": {
|
|
69
|
+
if (!arg)
|
|
70
|
+
throw new UsageError(`routine deploy needs a definition file\n${ROUTINE_USAGE}`);
|
|
71
|
+
const text = readFileSync(arg, "utf8");
|
|
72
|
+
const name = typeof a.values.name === "string" ? a.values.name : routineName(text, arg);
|
|
73
|
+
const isJson = text.trimStart().startsWith("{");
|
|
74
|
+
// PUT by name creates the routine the first time and publishes a new version after that.
|
|
75
|
+
const r = await b3.routines.publishRoutine(name, isJson ? JSON.parse(text) : text);
|
|
76
|
+
ctx.result(r, () => {
|
|
77
|
+
const v = r.active_version?.number;
|
|
78
|
+
ctx.out(`${r.id} ${name}${v === undefined ? "" : ` v${v}`}`);
|
|
79
|
+
});
|
|
80
|
+
return EXIT.OK;
|
|
81
|
+
}
|
|
82
|
+
case "run": {
|
|
83
|
+
if (!arg)
|
|
84
|
+
throw new UsageError(`routine run needs a routine id or name\n${ROUTINE_USAGE}`);
|
|
85
|
+
const body = {};
|
|
86
|
+
const input = inputFlag(a.values.input);
|
|
87
|
+
if (input)
|
|
88
|
+
body.input = input;
|
|
89
|
+
const v = intFlag(a.values.version, "--version");
|
|
90
|
+
if (v !== undefined)
|
|
91
|
+
body.version = v;
|
|
92
|
+
if (a.values["no-wait"]) {
|
|
93
|
+
const run = await b3.routines.createRun(arg, body);
|
|
94
|
+
ctx.result(run, () => ctx.out(run.id));
|
|
95
|
+
return EXIT.OK;
|
|
96
|
+
}
|
|
97
|
+
let done;
|
|
98
|
+
if (a.values.follow) {
|
|
99
|
+
const stream = b3.routines.createRun(arg, body).events();
|
|
100
|
+
for await (const ev of stream)
|
|
101
|
+
logRunEvent(ctx, ev);
|
|
102
|
+
done = await stream.result;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
done = await b3.routines.createRun(arg, body).wait({ throwOnFailure: false });
|
|
106
|
+
}
|
|
107
|
+
if (ctx.json && !a.values.follow)
|
|
108
|
+
ctx.printJson(done);
|
|
109
|
+
else if (!ctx.json)
|
|
110
|
+
ctx.out(JSON.stringify(done.result ?? null, null, 2));
|
|
111
|
+
if (done.status !== "succeeded") {
|
|
112
|
+
ctx.warn(`run ${done.id} ${done.status}${done.error ? `: ${done.error.code}: ${done.error.detail}` : ""}`);
|
|
113
|
+
return EXIT.FAILED;
|
|
114
|
+
}
|
|
115
|
+
return EXIT.OK;
|
|
116
|
+
}
|
|
117
|
+
case "logs": {
|
|
118
|
+
if (!arg)
|
|
119
|
+
throw new UsageError("routine logs needs a run id");
|
|
120
|
+
if (a.values.follow) {
|
|
121
|
+
for await (const ev of b3.routines.runEvents(arg))
|
|
122
|
+
logRunEvent(ctx, ev);
|
|
123
|
+
return EXIT.OK;
|
|
124
|
+
}
|
|
125
|
+
const steps = [];
|
|
126
|
+
for await (const s of b3.routines.listRunSteps(arg))
|
|
127
|
+
steps.push(s);
|
|
128
|
+
ctx.result(steps, () => ctx.table(steps, [
|
|
129
|
+
"id",
|
|
130
|
+
"status",
|
|
131
|
+
"uses",
|
|
132
|
+
"attempts",
|
|
133
|
+
"started_at",
|
|
134
|
+
]));
|
|
135
|
+
return EXIT.OK;
|
|
136
|
+
}
|
|
137
|
+
case "ls":
|
|
138
|
+
case "list": {
|
|
139
|
+
const page = await b3.routines.listRoutines({ limit: intFlag(a.values.limit, "--limit") });
|
|
140
|
+
ctx.result(page, () => ctx.table(page.data, ["id", "name", "status", "updated_at"]));
|
|
141
|
+
return EXIT.OK;
|
|
142
|
+
}
|
|
143
|
+
default:
|
|
144
|
+
throw new UsageError(`unknown routine command "${sub}"\n${ROUTINE_USAGE}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const ACTION_USAGE = `usage: b3os action <command>
|
|
148
|
+
search <words> [--pack ns/name] [--effects pure|read|write|irreversible] [--limit N]
|
|
149
|
+
describe <ref>
|
|
150
|
+
run <ref> [--input JSON|@file] [--connection KEY=conn_… ...] [--timeout-ms MS]`;
|
|
151
|
+
export async function action(ctx, argv) {
|
|
152
|
+
const [sub, ...rest] = argv;
|
|
153
|
+
const a = parse(rest, {
|
|
154
|
+
pack: { type: "string" },
|
|
155
|
+
effects: { type: "string" },
|
|
156
|
+
limit: { type: "string" },
|
|
157
|
+
input: { type: "string" },
|
|
158
|
+
connection: { type: "string", multiple: true },
|
|
159
|
+
"timeout-ms": { type: "string" },
|
|
160
|
+
});
|
|
161
|
+
ctx.applyGlobals(a.values);
|
|
162
|
+
if (!sub || a.values.help) {
|
|
163
|
+
ctx.out(ACTION_USAGE);
|
|
164
|
+
return sub ? EXIT.OK : EXIT.USAGE;
|
|
165
|
+
}
|
|
166
|
+
const b3 = ctx.client();
|
|
167
|
+
switch (sub) {
|
|
168
|
+
case "search": {
|
|
169
|
+
const q = a.positionals.join(" ");
|
|
170
|
+
if (!q)
|
|
171
|
+
throw new UsageError("action search needs words to search for");
|
|
172
|
+
const r = await b3.actions.search({
|
|
173
|
+
q,
|
|
174
|
+
pack: a.values.pack,
|
|
175
|
+
effects: a.values.effects,
|
|
176
|
+
limit: intFlag(a.values.limit, "--limit"),
|
|
177
|
+
});
|
|
178
|
+
ctx.result(r, () => ctx.table(r.data, ["ref", "effects", "title"]));
|
|
179
|
+
return EXIT.OK;
|
|
180
|
+
}
|
|
181
|
+
case "describe": {
|
|
182
|
+
const ref = a.positionals[0];
|
|
183
|
+
if (!ref)
|
|
184
|
+
throw new UsageError("action describe needs an action ref");
|
|
185
|
+
ctx.printJson(await b3.actions.describe({ ref }));
|
|
186
|
+
return EXIT.OK;
|
|
187
|
+
}
|
|
188
|
+
case "run":
|
|
189
|
+
case "call": {
|
|
190
|
+
const ref = a.positionals[0];
|
|
191
|
+
if (!ref)
|
|
192
|
+
throw new UsageError("action run needs an action ref (io.b3os/github/create-issue@1)");
|
|
193
|
+
const res = await b3.actions.call({
|
|
194
|
+
ref,
|
|
195
|
+
input: inputFlag(a.values.input) ?? {},
|
|
196
|
+
connections: a.values.connection ? pairs(a.values.connection, "--connection") : undefined,
|
|
197
|
+
timeout_ms: intFlag(a.values["timeout-ms"], "--timeout-ms"),
|
|
198
|
+
});
|
|
199
|
+
ctx.result(res, () => ctx.printJson(res.output));
|
|
200
|
+
return EXIT.OK;
|
|
201
|
+
}
|
|
202
|
+
default:
|
|
203
|
+
throw new UsageError(`unknown action command "${sub}"\n${ACTION_USAGE}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=routine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routine.js","sourceRoot":"","sources":["../../src/commands/routine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// b3os sandbox create | exec | shell | ls | rm | get | logs | url.
|
|
2
|
+
import { EXIT, intFlag, pairs, parse, UsageError } from "../ctx.js";
|
|
3
|
+
const USAGE = `usage: b3os sandbox <command>
|
|
4
|
+
create [--template base] [--snapshot snap_…] [--vcpu N] [--memory MiB] [--disk GiB] [--lifetime S]
|
|
5
|
+
[--on-idle stop|pause] [--env K=V ...] [--port N[:public] ...] [--grant SCOPE,...]
|
|
6
|
+
exec <id> [--cwd DIR] [--env K=V ...] [--timeout-ms MS] [--root] [--stdin] [--background] [--exit-code]
|
|
7
|
+
-- <cmd> [args...]
|
|
8
|
+
shell <id> [--cmd CMD] [--cwd DIR] [--exit-code]
|
|
9
|
+
ls [--status running|paused|stopped] [--limit N]
|
|
10
|
+
get <id>
|
|
11
|
+
logs <id> [--pid N] [--no-follow]
|
|
12
|
+
url <id> <port> [--ttl S]
|
|
13
|
+
rm <id> [<id>...] [--yes]
|
|
14
|
+
exec and shell exit 0 when the remote command exits 0, else 10 (the remote code is printed on stderr), so the
|
|
15
|
+
CLI's own exit codes keep their meaning; --exit-code exits with the remote command's code instead. --json prints
|
|
16
|
+
the buffered result instead of streaming.`;
|
|
17
|
+
/** The CLI's exit code for a remote command's: 0 or 10 (stable codes), or the remote code with --exit-code. */
|
|
18
|
+
function remoteExit(code, passthrough, warn) {
|
|
19
|
+
if (code === 0)
|
|
20
|
+
return EXIT.OK;
|
|
21
|
+
if (passthrough && typeof code === "number")
|
|
22
|
+
return code;
|
|
23
|
+
if (typeof code === "number")
|
|
24
|
+
warn?.(`(remote command exited ${code})`);
|
|
25
|
+
return EXIT.FAILED;
|
|
26
|
+
}
|
|
27
|
+
async function readStdin() {
|
|
28
|
+
const chunks = [];
|
|
29
|
+
for await (const c of process.stdin)
|
|
30
|
+
chunks.push(c);
|
|
31
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
32
|
+
}
|
|
33
|
+
export async function sandbox(ctx, argv) {
|
|
34
|
+
const [sub, ...rest] = argv;
|
|
35
|
+
const a = parse(rest, {
|
|
36
|
+
template: { type: "string" },
|
|
37
|
+
snapshot: { type: "string" },
|
|
38
|
+
vcpu: { type: "string" },
|
|
39
|
+
memory: { type: "string" },
|
|
40
|
+
disk: { type: "string" },
|
|
41
|
+
lifetime: { type: "string" },
|
|
42
|
+
"on-idle": { type: "string" },
|
|
43
|
+
env: { type: "string", multiple: true },
|
|
44
|
+
port: { type: "string", multiple: true },
|
|
45
|
+
grant: { type: "string" },
|
|
46
|
+
cwd: { type: "string" },
|
|
47
|
+
"timeout-ms": { type: "string" },
|
|
48
|
+
root: { type: "boolean" },
|
|
49
|
+
stdin: { type: "boolean" },
|
|
50
|
+
background: { type: "boolean" },
|
|
51
|
+
cmd: { type: "string" },
|
|
52
|
+
status: { type: "string" },
|
|
53
|
+
limit: { type: "string" },
|
|
54
|
+
pid: { type: "string" },
|
|
55
|
+
"no-follow": { type: "boolean" },
|
|
56
|
+
ttl: { type: "string" },
|
|
57
|
+
"exit-code": { type: "boolean" },
|
|
58
|
+
});
|
|
59
|
+
ctx.applyGlobals(a.values);
|
|
60
|
+
if (!sub || a.values.help) {
|
|
61
|
+
ctx.out(USAGE);
|
|
62
|
+
return sub ? EXIT.OK : EXIT.USAGE;
|
|
63
|
+
}
|
|
64
|
+
const b3 = ctx.client();
|
|
65
|
+
const [id, ...cmd] = a.positionals;
|
|
66
|
+
const need = (what) => {
|
|
67
|
+
if (!id)
|
|
68
|
+
throw new UsageError(`sandbox ${what} needs a sandbox id\n${USAGE}`);
|
|
69
|
+
return id;
|
|
70
|
+
};
|
|
71
|
+
switch (sub) {
|
|
72
|
+
case "create": {
|
|
73
|
+
const body = {};
|
|
74
|
+
if (typeof a.values.template === "string")
|
|
75
|
+
body.template = a.values.template;
|
|
76
|
+
if (typeof a.values.snapshot === "string")
|
|
77
|
+
body.snapshot = a.values.snapshot;
|
|
78
|
+
const vcpu = intFlag(a.values.vcpu, "--vcpu");
|
|
79
|
+
if (vcpu !== undefined)
|
|
80
|
+
body.vcpu = vcpu;
|
|
81
|
+
const mem = intFlag(a.values.memory, "--memory");
|
|
82
|
+
if (mem !== undefined)
|
|
83
|
+
body.memory_mib = mem;
|
|
84
|
+
const disk = intFlag(a.values.disk, "--disk");
|
|
85
|
+
if (disk !== undefined)
|
|
86
|
+
body.disk_gib = disk;
|
|
87
|
+
const life = intFlag(a.values.lifetime, "--lifetime");
|
|
88
|
+
if (life !== undefined)
|
|
89
|
+
body.timeout_s = life;
|
|
90
|
+
if (typeof a.values["on-idle"] === "string")
|
|
91
|
+
body.on_idle = a.values["on-idle"];
|
|
92
|
+
if (a.values.env)
|
|
93
|
+
body.env = pairs(a.values.env, "--env");
|
|
94
|
+
if (a.values.port) {
|
|
95
|
+
body.ports = a.values.port.map((p) => {
|
|
96
|
+
const [n, flag] = p.split(":");
|
|
97
|
+
const port = Number(n);
|
|
98
|
+
if (!Number.isInteger(port))
|
|
99
|
+
throw new UsageError(`--port takes N or N:public, got "${p}"`);
|
|
100
|
+
return flag === "public" ? { port, public: true } : { port };
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (typeof a.values.grant === "string") {
|
|
104
|
+
body.api = { scopes: a.values.grant.split(/[,\s]+/).filter(Boolean) };
|
|
105
|
+
}
|
|
106
|
+
const sbx = await b3.sandboxes.createSandbox(body);
|
|
107
|
+
ctx.result(sbx, () => {
|
|
108
|
+
ctx.out(sbx.id);
|
|
109
|
+
ctx.info(`${sbx.status}, ${sbx.vcpu} vCPU, ${sbx.memory_mib} MiB, until ${sbx.expires_at ?? "-"}`);
|
|
110
|
+
});
|
|
111
|
+
return EXIT.OK;
|
|
112
|
+
}
|
|
113
|
+
case "exec": {
|
|
114
|
+
const sid = need("exec");
|
|
115
|
+
if (cmd.length === 0)
|
|
116
|
+
throw new UsageError("sandbox exec needs a command after --");
|
|
117
|
+
const body = { cmd: cmd.length === 1 ? cmd[0] : cmd };
|
|
118
|
+
if (typeof a.values.cwd === "string")
|
|
119
|
+
body.cwd = a.values.cwd;
|
|
120
|
+
if (a.values.env)
|
|
121
|
+
body.env = pairs(a.values.env, "--env");
|
|
122
|
+
const t = intFlag(a.values["timeout-ms"], "--timeout-ms");
|
|
123
|
+
if (t !== undefined)
|
|
124
|
+
body.timeout_ms = t;
|
|
125
|
+
if (a.values.root)
|
|
126
|
+
body.user = "root";
|
|
127
|
+
if (a.values.stdin)
|
|
128
|
+
body.stdin = await readStdin();
|
|
129
|
+
if (a.values.background) {
|
|
130
|
+
const proc = await b3.sandboxes.exec(sid, { ...body, background: true });
|
|
131
|
+
ctx.result(proc, () => ctx.out(String(proc.pid)));
|
|
132
|
+
return EXIT.OK;
|
|
133
|
+
}
|
|
134
|
+
const passthrough = !!a.values["exit-code"];
|
|
135
|
+
if (ctx.json) {
|
|
136
|
+
const r = await b3.sandboxes.exec(sid, body);
|
|
137
|
+
ctx.printJson(r);
|
|
138
|
+
return remoteExit(r.exit_code, passthrough); // the printed result carries exit_code
|
|
139
|
+
}
|
|
140
|
+
let code = null;
|
|
141
|
+
for await (const ev of b3.sandboxes.exec(sid, body, { stream: true })) {
|
|
142
|
+
if (ev.type === "exec.stdout")
|
|
143
|
+
ctx.io.stdout.write(ev.data ?? "");
|
|
144
|
+
else if (ev.type === "exec.stderr")
|
|
145
|
+
ctx.io.stderr.write(ev.data ?? "");
|
|
146
|
+
else if (ev.type === "exec.exit") {
|
|
147
|
+
code = ev.exit_code ?? null;
|
|
148
|
+
if (ev.timed_out)
|
|
149
|
+
ctx.warn("(timed out)");
|
|
150
|
+
if (code === null && ev.signal)
|
|
151
|
+
ctx.warn(`(killed by ${ev.signal})`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return remoteExit(code, passthrough, (m) => ctx.warn(m));
|
|
155
|
+
}
|
|
156
|
+
case "shell": {
|
|
157
|
+
const sid = need("shell");
|
|
158
|
+
const out = process.stdout;
|
|
159
|
+
const stdin = process.stdin;
|
|
160
|
+
const pty = await b3.sandboxes.openPty(sid, {
|
|
161
|
+
cols: out.columns ?? 80,
|
|
162
|
+
rows: out.rows ?? 24,
|
|
163
|
+
cmd: typeof a.values.cmd === "string" ? a.values.cmd : undefined,
|
|
164
|
+
cwd: typeof a.values.cwd === "string" ? a.values.cwd : undefined,
|
|
165
|
+
});
|
|
166
|
+
const raw = stdin.isTTY;
|
|
167
|
+
if (raw)
|
|
168
|
+
stdin.setRawMode(true);
|
|
169
|
+
const onInput = (d) => pty.write(d);
|
|
170
|
+
const onResize = () => pty.resize(out.columns ?? 80, out.rows ?? 24);
|
|
171
|
+
stdin.on("data", onInput);
|
|
172
|
+
stdin.resume();
|
|
173
|
+
out.on("resize", onResize);
|
|
174
|
+
pty.onData((c) => out.write(c));
|
|
175
|
+
try {
|
|
176
|
+
const exit = await pty.exit;
|
|
177
|
+
return remoteExit(exit.code, !!a.values["exit-code"], (m) => ctx.warn(m));
|
|
178
|
+
}
|
|
179
|
+
finally {
|
|
180
|
+
stdin.off("data", onInput);
|
|
181
|
+
out.off("resize", onResize);
|
|
182
|
+
if (raw)
|
|
183
|
+
stdin.setRawMode(false);
|
|
184
|
+
stdin.pause();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
case "ls":
|
|
188
|
+
case "list": {
|
|
189
|
+
const page = await b3.sandboxes.listSandboxes({
|
|
190
|
+
status: a.values.status,
|
|
191
|
+
limit: intFlag(a.values.limit, "--limit"),
|
|
192
|
+
});
|
|
193
|
+
ctx.result(page, () => ctx.table(page.data.map((s) => ({ ...s, template: s.template?.name ?? s.snapshot ?? "-" })), ["id", "status", "template", "vcpu", "memory_mib", "expires_at"]));
|
|
194
|
+
return EXIT.OK;
|
|
195
|
+
}
|
|
196
|
+
case "get": {
|
|
197
|
+
ctx.printJson(await b3.sandboxes.getSandbox(need("get")));
|
|
198
|
+
return EXIT.OK;
|
|
199
|
+
}
|
|
200
|
+
case "logs": {
|
|
201
|
+
const sid = need("logs");
|
|
202
|
+
const pid = intFlag(a.values.pid, "--pid");
|
|
203
|
+
for await (const ev of b3.sandboxes.streamLogs(sid, { pid, follow: !a.values["no-follow"] })) {
|
|
204
|
+
if (ctx.json)
|
|
205
|
+
ctx.printJsonLine(ev);
|
|
206
|
+
else if (ev.type === "log.stdout")
|
|
207
|
+
ctx.io.stdout.write(String(ev.data ?? ""));
|
|
208
|
+
else if (ev.type === "log.stderr")
|
|
209
|
+
ctx.io.stderr.write(String(ev.data ?? ""));
|
|
210
|
+
else if (ev.type === "process.exited")
|
|
211
|
+
ctx.info(`[pid ${ev.pid} exited]`);
|
|
212
|
+
}
|
|
213
|
+
return EXIT.OK;
|
|
214
|
+
}
|
|
215
|
+
case "url": {
|
|
216
|
+
const sid = need("url");
|
|
217
|
+
const port = Number(cmd[0]);
|
|
218
|
+
if (!Number.isInteger(port))
|
|
219
|
+
throw new UsageError("sandbox url needs <id> <port>");
|
|
220
|
+
const ttl = intFlag(a.values.ttl, "--ttl");
|
|
221
|
+
const u = await b3.sandboxes.createPortUrl(sid, port, ttl === undefined ? undefined : { ttl_s: ttl });
|
|
222
|
+
ctx.result(u, () => ctx.out(u.url));
|
|
223
|
+
return EXIT.OK;
|
|
224
|
+
}
|
|
225
|
+
case "rm":
|
|
226
|
+
case "delete": {
|
|
227
|
+
const ids = a.positionals;
|
|
228
|
+
if (!ids.length)
|
|
229
|
+
throw new UsageError("sandbox rm needs at least one sandbox id");
|
|
230
|
+
if (!(await ctx.confirm(`Delete ${ids.join(", ")}? Memory and disk are destroyed.`)))
|
|
231
|
+
return EXIT.OK;
|
|
232
|
+
const done = [];
|
|
233
|
+
for (const s of ids)
|
|
234
|
+
done.push(await b3.sandboxes.deleteSandbox(s));
|
|
235
|
+
ctx.result(done, () => {
|
|
236
|
+
for (const s of done)
|
|
237
|
+
ctx.out(`${s.id} ${s.status}`);
|
|
238
|
+
});
|
|
239
|
+
return EXIT.OK;
|
|
240
|
+
}
|
|
241
|
+
default:
|
|
242
|
+
throw new UsageError(`unknown sandbox command "${sub}"\n${USAGE}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/commands/sandbox.ts"],"names":[],"mappings":"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"}
|