@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.
@@ -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":"AAAA,kFAAkF;AAElF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAY,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExF,MAAM,aAAa,GAAG;;;;iBAIL,CAAC;AAElB,oDAAoD;AACpD,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7F,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAiC,CAAC;AAC3C,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACpD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,GAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAwB,CAAC,IAAI,CAAC;QACxD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,oDAAoD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,WAAW,CAAC,GAAQ,EAAE,EAAY;IACzC,MAAM,CAAC,GAAG,EAAgG,CAAC;IAC3G,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QACb,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;SAChF,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;;QAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAQ,EAAE,IAAc;IACpD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;QACpB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC9B,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;QACvC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B,CAAC,CAAC;IACH,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IACxB,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,aAAa,EAAE,CAAC,CAAC;YAC3F,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACxF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAChD,yFAAyF;YACzF,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnF,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;gBACjB,MAAM,CAAC,GAAI,CAA8C,CAAC,cAAc,EAAE,MAAM,CAAC;gBACjF,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,aAAa,EAAE,CAAC,CAAC;YAC3F,MAAM,IAAI,GAAqB,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAC9B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACnD,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,CAAC;YACD,IAAI,IAAgB,CAAC;YACrB,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzD,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM;oBAAE,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;gBAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;iBACjD,IAAI,CAAC,GAAG,CAAC,IAAI;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3G,OAAO,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;YACD,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,UAAU,CAAC,6BAA6B,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACpB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC;oBAAE,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACxE,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,CAAC;YACD,MAAM,KAAK,GAAc,EAAE,CAAC;YAC5B,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,CACrB,GAAG,CAAC,KAAK,CAAC,KAAkD,EAAE;gBAC5D,IAAI;gBACJ,QAAQ;gBACR,MAAM;gBACN,UAAU;gBACV,YAAY;aACb,CAAC,CACH,CAAC;YACF,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,KAAK,IAAI,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YAC3F,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,CACpB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAiD,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAC1G,CAAC;YACF,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD;YACE,MAAM,IAAI,UAAU,CAAC,4BAA4B,GAAG,MAAM,aAAa,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG;;;iFAG4D,CAAC;AAElF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,GAAQ,EAAE,IAAc;IACnD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE;QACpB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC9C,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACjC,CAAC,CAAC;IACH,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACtB,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;IACxB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAC;YACxE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;gBAChC,CAAC;gBACD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAA0B;gBACzC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAgB;gBAClC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC;aAC1C,CAAC,CAAC;YACH,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAiD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YACjH,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;YACtE,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD,KAAK,KAAK,CAAC;QACX,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,UAAU,CAAC,gEAAgE,CAAC,CAAC;YACjG,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;gBAChC,GAAG;gBACH,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;gBACtC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS;gBACzF,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC;aAC5D,CAAC,CAAC;YACH,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,CAAC;QACD;YACE,MAAM,IAAI,UAAU,CAAC,2BAA2B,GAAG,MAAM,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type Ctx } from "../ctx.ts";
2
+ export declare function sandbox(ctx: Ctx, argv: string[]): Promise<number>;
@@ -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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"}
@@ -0,0 +1,4 @@
1
+ import { type Ctx } from "../ctx.ts";
2
+ export declare function scrape(ctx: Ctx, argv: string[]): Promise<number>;
3
+ export declare function screenshot(ctx: Ctx, argv: string[]): Promise<number>;
4
+ export declare function video(ctx: Ctx, argv: string[]): Promise<number>;