@boxlite-ai/boxlite 0.2.11 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,368 @@
1
+ /**
2
+ * SkillBox - Secure Claude Code CLI container.
3
+ *
4
+ * Provides an isolated environment for running Claude Code CLI with skills.
5
+ */
6
+ import * as net from "node:net";
7
+ import { SimpleBox } from "./simplebox.js";
8
+ import { TimeoutError } from "./errors.js";
9
+ import { SKILLBOX_IMAGE, SKILLBOX_MEMORY_MIB, SKILLBOX_DISK_SIZE_GB, SKILLBOX_GUI_HTTP_PORT, SKILLBOX_GUI_HTTPS_PORT, COMPUTERBOX_DISPLAY_WIDTH, COMPUTERBOX_DISPLAY_HEIGHT, DESKTOP_READY_TIMEOUT, DESKTOP_READY_RETRY_DELAY, } from "./constants.js";
10
+ function findAvailablePort(start = 10000, end = 65535) {
11
+ const ports = Array.from({ length: end - start + 1 }, (_, i) => start + i);
12
+ // Shuffle and try up to 100
13
+ for (let i = ports.length - 1; i > 0; i--) {
14
+ const j = Math.floor(Math.random() * (i + 1));
15
+ [ports[i], ports[j]] = [ports[j], ports[i]];
16
+ }
17
+ const candidates = ports.slice(0, 100);
18
+ return new Promise((resolve, reject) => {
19
+ let idx = 0;
20
+ function tryNext() {
21
+ if (idx >= candidates.length) {
22
+ reject(new Error(`Could not find an available port in range ${start}-${end}`));
23
+ return;
24
+ }
25
+ const port = candidates[idx++];
26
+ const server = net.createServer();
27
+ server.once("error", () => tryNext());
28
+ server.once("listening", () => {
29
+ server.close(() => resolve(port));
30
+ });
31
+ server.listen(port, "127.0.0.1");
32
+ }
33
+ tryNext();
34
+ });
35
+ }
36
+ function sleep(ms) {
37
+ return new Promise((resolve) => setTimeout(resolve, ms));
38
+ }
39
+ /**
40
+ * Secure container for running Claude Code CLI with skills.
41
+ *
42
+ * SkillBox provides an isolated environment for Claude Code CLI
43
+ * with user-specified skills installed. It supports multi-turn conversations
44
+ * and includes a desktop GUI accessible via noVNC.
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const box = new SkillBox({ skills: ["anthropics/skills"] });
49
+ * try {
50
+ * await box.start();
51
+ * const result = await box.call("What skills do you have?");
52
+ * console.log(result);
53
+ * } finally {
54
+ * await box.stop();
55
+ * }
56
+ * ```
57
+ */
58
+ export class SkillBox extends SimpleBox {
59
+ constructor(options = {}) {
60
+ // Build image args
61
+ const imageOpts = {};
62
+ if (options.rootfsPath) {
63
+ imageOpts.rootfsPath = options.rootfsPath;
64
+ }
65
+ else {
66
+ imageOpts.image = options.image ?? SKILLBOX_IMAGE;
67
+ }
68
+ const oauthToken = options.oauthToken ?? process.env.CLAUDE_CODE_OAUTH_TOKEN ?? "";
69
+ super({
70
+ ...imageOpts,
71
+ memoryMib: options.memoryMib ?? SKILLBOX_MEMORY_MIB,
72
+ diskSizeGb: options.diskSizeGb ?? SKILLBOX_DISK_SIZE_GB,
73
+ name: options.name ?? "skill-box",
74
+ autoRemove: options.autoRemove ?? true,
75
+ runtime: options.runtime,
76
+ env: {
77
+ CLAUDE_CODE_OAUTH_TOKEN: oauthToken,
78
+ DISPLAY: ":1",
79
+ DISPLAY_SIZEW: String(COMPUTERBOX_DISPLAY_WIDTH),
80
+ DISPLAY_SIZEH: String(COMPUTERBOX_DISPLAY_HEIGHT),
81
+ SELKIES_MANUAL_WIDTH: String(COMPUTERBOX_DISPLAY_WIDTH),
82
+ SELKIES_MANUAL_HEIGHT: String(COMPUTERBOX_DISPLAY_HEIGHT),
83
+ SELKIES_UI_SHOW_SIDEBAR: "false",
84
+ },
85
+ ports: [],
86
+ });
87
+ this._process = null;
88
+ this._stdin = null;
89
+ this._stdout = null;
90
+ this._sessionId = "default";
91
+ this._setupComplete = false;
92
+ this._started = false;
93
+ this._skillboxEnv = {
94
+ DISPLAY: ":1",
95
+ };
96
+ this._skills = options.skills ?? [];
97
+ this._oauthToken = oauthToken;
98
+ this.guiHttpPort = options.guiHttpPort ?? 0;
99
+ this.guiHttpsPort = options.guiHttpsPort ?? 0;
100
+ }
101
+ /**
102
+ * Start the SkillBox (resolves ports and creates the box).
103
+ */
104
+ async start() {
105
+ if (!this._oauthToken) {
106
+ throw new Error("OAuth token required. Set CLAUDE_CODE_OAUTH_TOKEN env var " +
107
+ "or pass oauthToken parameter.");
108
+ }
109
+ // Resolve ports
110
+ if (this.guiHttpPort === 0) {
111
+ this.guiHttpPort = await findAvailablePort();
112
+ }
113
+ if (this.guiHttpsPort === 0) {
114
+ this.guiHttpsPort = await findAvailablePort();
115
+ }
116
+ if (this.guiHttpPort === this.guiHttpsPort) {
117
+ this.guiHttpsPort = await findAvailablePort();
118
+ }
119
+ // Patch port mappings before box creation
120
+ this._boxOpts.ports = [
121
+ { hostPort: this.guiHttpPort, guestPort: SKILLBOX_GUI_HTTP_PORT },
122
+ { hostPort: this.guiHttpsPort, guestPort: SKILLBOX_GUI_HTTPS_PORT },
123
+ ];
124
+ await this._ensureBox();
125
+ this._started = true;
126
+ }
127
+ /**
128
+ * Stop the SkillBox and clean up Claude process.
129
+ */
130
+ async stop() {
131
+ await this._stopClaude();
132
+ this._started = false;
133
+ await super.stop();
134
+ }
135
+ /**
136
+ * Wait until the desktop environment is fully loaded and ready.
137
+ *
138
+ * @param timeout - Maximum time to wait in seconds (default: 60)
139
+ */
140
+ async waitUntilReady(timeout = DESKTOP_READY_TIMEOUT) {
141
+ const startMs = Date.now();
142
+ const expectedSize = `${COMPUTERBOX_DISPLAY_WIDTH}x${COMPUTERBOX_DISPLAY_HEIGHT}`;
143
+ while (true) {
144
+ const elapsed = (Date.now() - startMs) / 1000;
145
+ if (elapsed > timeout) {
146
+ throw new TimeoutError(`Desktop did not become ready within ${timeout} seconds`);
147
+ }
148
+ try {
149
+ const result = await SimpleBox.prototype.exec.call(this, "xwininfo", ["-tree", "-root"], this._skillboxEnv);
150
+ if (result.stdout.includes("xfdesktop") &&
151
+ result.stdout.includes(expectedSize)) {
152
+ return;
153
+ }
154
+ }
155
+ catch {
156
+ // Not ready yet
157
+ }
158
+ await sleep(DESKTOP_READY_RETRY_DELAY * 1000);
159
+ }
160
+ }
161
+ /**
162
+ * Send a prompt to Claude and return the response.
163
+ *
164
+ * Supports multi-turn conversations within the same session.
165
+ * On first call, installs dependencies if not already installed.
166
+ *
167
+ * @param prompt - The message to send to Claude
168
+ * @returns Claude's response text
169
+ */
170
+ async call(prompt) {
171
+ if (!this._started) {
172
+ throw new Error("SkillBox not started. Call start() first.");
173
+ }
174
+ if (!this._setupComplete) {
175
+ await this._setup();
176
+ this._setupComplete = true;
177
+ }
178
+ if (!this._stdin || !this._stdout) {
179
+ await this._startClaude();
180
+ }
181
+ const [responseText, newSessionId] = await this._sendMessage(prompt);
182
+ this._sessionId = newSessionId;
183
+ return responseText;
184
+ }
185
+ /**
186
+ * Install a skill from skills.sh.
187
+ *
188
+ * @param skillId - Skill identifier (owner/repo format)
189
+ * @returns True if installation succeeded
190
+ */
191
+ async installSkill(skillId) {
192
+ if (!this._started) {
193
+ throw new Error("SkillBox not started. Call start() first.");
194
+ }
195
+ if (!this._setupComplete) {
196
+ await this._setup();
197
+ this._setupComplete = true;
198
+ }
199
+ return this._installSkillInternal(skillId);
200
+ }
201
+ async _setup() {
202
+ if (!(await this._isClaudeInstalled())) {
203
+ await this._installDependencies();
204
+ }
205
+ for (const skillId of this._skills) {
206
+ await this._installSkillInternal(skillId);
207
+ }
208
+ }
209
+ async _isClaudeInstalled() {
210
+ try {
211
+ const result = await SimpleBox.prototype.exec.call(this, "claude", ["--version"], this._skillboxEnv);
212
+ return result.exitCode === 0;
213
+ }
214
+ catch {
215
+ return false;
216
+ }
217
+ }
218
+ async _installDependencies() {
219
+ const run = (cmd, args) => SimpleBox.prototype.exec.call(this, cmd, args, this._skillboxEnv);
220
+ await run("apt-get", ["update"]);
221
+ const installResult = await run("bash", [
222
+ "-c",
223
+ "curl -fsSL https://claude.ai/install.sh | bash",
224
+ ]);
225
+ if (installResult.exitCode !== 0) {
226
+ throw new Error(`Failed to install Claude CLI: ${installResult.stderr}`);
227
+ }
228
+ const bashResult = await run("apt-get", ["install", "-y", "bash"]);
229
+ if (bashResult.exitCode !== 0) {
230
+ throw new Error(`Failed to install bash: ${bashResult.stderr}`);
231
+ }
232
+ const gitResult = await run("apt-get", ["install", "-y", "git"]);
233
+ if (gitResult.exitCode !== 0) {
234
+ throw new Error(`Failed to install git: ${gitResult.stderr}`);
235
+ }
236
+ const pyResult = await run("apt-get", [
237
+ "install",
238
+ "-y",
239
+ "python3",
240
+ "python3-pip",
241
+ ]);
242
+ if (pyResult.exitCode !== 0) {
243
+ throw new Error(`Failed to install Python: ${pyResult.stderr}`);
244
+ }
245
+ await run("/config/.local/bin/claude", ["--version"]);
246
+ }
247
+ async _installSkillInternal(skillId) {
248
+ const result = await SimpleBox.prototype.exec.call(this, "npx", ["add-skill", skillId, "-y", "--agent", "claude-code"], this._skillboxEnv);
249
+ return result.exitCode === 0;
250
+ }
251
+ async _startClaude() {
252
+ const box = await this._ensureBox();
253
+ this._process = await box.exec("claude", [
254
+ "--dangerously-skip-permissions",
255
+ "--input-format",
256
+ "stream-json",
257
+ "--output-format",
258
+ "stream-json",
259
+ "--mcp-config",
260
+ "/config/.claude.json",
261
+ "--verbose",
262
+ ], [
263
+ ["CLAUDE_CODE_OAUTH_TOKEN", this._oauthToken],
264
+ ["IS_SANDBOX", "1"],
265
+ ["SHELL", "/bin/bash"],
266
+ ["DISPLAY", ":1"],
267
+ ], false);
268
+ this._stdin = await this._process.stdin();
269
+ this._stdout = await this._process.stdout();
270
+ }
271
+ async _stopClaude() {
272
+ if (this._stdin) {
273
+ try {
274
+ await this._stdin.close();
275
+ }
276
+ catch {
277
+ // Ignore close errors
278
+ }
279
+ this._stdin = null;
280
+ }
281
+ if (this._process) {
282
+ try {
283
+ await this._process.wait();
284
+ }
285
+ catch {
286
+ // Ignore wait errors
287
+ }
288
+ this._process = null;
289
+ }
290
+ this._stdout = null;
291
+ }
292
+ async _sendMessage(content) {
293
+ const msg = {
294
+ type: "user",
295
+ message: { role: "user", content },
296
+ session_id: this._sessionId,
297
+ parent_tool_use_id: null,
298
+ };
299
+ const payload = JSON.stringify(msg) + "\n";
300
+ await this._stdin.writeString(payload);
301
+ const responses = [];
302
+ let newSessionId = this._sessionId;
303
+ let buffer = "";
304
+ let done = false;
305
+ try {
306
+ while (!done) {
307
+ const chunk = await Promise.race([
308
+ this._stdout.next(),
309
+ sleep(120000).then(() => {
310
+ throw new TimeoutError("Timeout waiting for Claude response");
311
+ }),
312
+ ]);
313
+ if (chunk === null)
314
+ break;
315
+ buffer += chunk;
316
+ while (buffer.includes("\n")) {
317
+ const nlIdx = buffer.indexOf("\n");
318
+ const line = buffer.slice(0, nlIdx).trim();
319
+ buffer = buffer.slice(nlIdx + 1);
320
+ if (!line)
321
+ continue;
322
+ try {
323
+ const parsed = JSON.parse(line);
324
+ responses.push(parsed);
325
+ if (parsed.session_id) {
326
+ newSessionId = parsed.session_id;
327
+ }
328
+ if (parsed.type === "result") {
329
+ done = true;
330
+ break;
331
+ }
332
+ }
333
+ catch {
334
+ // JSON parse error, skip
335
+ }
336
+ }
337
+ }
338
+ }
339
+ catch (err) {
340
+ if (!(err instanceof TimeoutError)) {
341
+ // Stream ended
342
+ }
343
+ }
344
+ // Extract response text
345
+ const resultMsg = responses.find((r) => r.type === "result");
346
+ let responseText = "";
347
+ if (resultMsg) {
348
+ responseText = resultMsg.result ?? "";
349
+ }
350
+ else {
351
+ for (const r of responses) {
352
+ if (r.type === "assistant") {
353
+ const contentList = r.message?.content ?? [];
354
+ for (const item of contentList) {
355
+ if (item.type === "text" && item.text) {
356
+ responseText = item.text;
357
+ break;
358
+ }
359
+ }
360
+ if (responseText)
361
+ break;
362
+ }
363
+ }
364
+ }
365
+ return [responseText, newSessionId];
366
+ }
367
+ }
368
+ //# sourceMappingURL=skillbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillbox.js","sourceRoot":"","sources":["../lib/skillbox.ts"],"names":[],"mappings":"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"}