@hasna/sandboxes 0.1.2 → 0.1.5

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/dist/cli/index.js CHANGED
@@ -3238,29 +3238,27 @@ async function runAgent(sandboxId, opts) {
3238
3238
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
3239
3239
  const collector = createStreamCollector(sandbox.id, session.id);
3240
3240
  const provider = await getProvider(sandbox.provider);
3241
- try {
3242
- const result = await provider.exec(sandbox.provider_sandbox_id, cmd, {
3243
- onStdout: (data) => {
3244
- collector.onStdout(data);
3245
- opts.onStdout?.(data);
3246
- },
3247
- onStderr: (data) => {
3248
- collector.onStderr(data);
3249
- opts.onStderr?.(data);
3250
- },
3251
- background: true
3252
- });
3253
- if ("exit_code" in result) {
3254
- const exitResult = result;
3255
- const status = exitResult.exit_code === 0 ? "completed" : "failed";
3256
- return endSession(session.id, exitResult.exit_code, status);
3257
- }
3258
- return session;
3259
- } catch (err) {
3241
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
3242
+ provider.exec(sandbox.provider_sandbox_id, cmd, {
3243
+ onStdout: (data) => {
3244
+ collector.onStdout(data);
3245
+ opts.onStdout?.(data);
3246
+ },
3247
+ onStderr: (data) => {
3248
+ collector.onStderr(data);
3249
+ opts.onStderr?.(data);
3250
+ },
3251
+ env
3252
+ }).then((result) => {
3253
+ const exitResult = result;
3254
+ const status = exitResult.exit_code === 0 ? "completed" : "failed";
3255
+ endSession(session.id, exitResult.exit_code ?? 0, status);
3256
+ emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
3257
+ }).catch((err) => {
3260
3258
  endSession(session.id, 1, "failed");
3261
3259
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
3262
- throw err;
3263
- }
3260
+ });
3261
+ return session;
3264
3262
  }
3265
3263
  async function stopAgent(sandboxId) {
3266
3264
  const sandbox = getSandbox(sandboxId);
@@ -3272,14 +3270,15 @@ async function stopAgent(sandboxId) {
3272
3270
  } catch {}
3273
3271
  emitLifecycleEvent(sandbox.id, "Agent stopped by user");
3274
3272
  }
3275
- var AGENT_COMMANDS;
3273
+ var CLAUDE_ONBOARDING_SETUP, AGENT_COMMANDS;
3276
3274
  var init_agent_runner = __esm(() => {
3277
3275
  init_sandboxes();
3278
3276
  init_sessions();
3279
3277
  init_providers();
3280
3278
  init_stream();
3279
+ CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
3281
3280
  AGENT_COMMANDS = {
3282
- claude: (prompt) => `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
3281
+ claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
3283
3282
  codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
3284
3283
  gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
3285
3284
  };
@@ -3762,7 +3761,7 @@ program2.command("mcp").description("Install MCP server for AI agents").option("
3762
3761
  for (const target of targets) {
3763
3762
  switch (target) {
3764
3763
  case "claude": {
3765
- const cmd = `claude mcp add --transport stdio --scope user sandboxes -- bunx @hasna/sandboxes sandboxes-mcp`;
3764
+ const cmd = `claude mcp add --transport stdio --scope user sandboxes -- bunx --bun --package @hasna/sandboxes sandboxes-mcp`;
3766
3765
  console.log(chalk.dim(`Running: ${cmd}`));
3767
3766
  execSync(cmd, { stdio: "inherit" });
3768
3767
  console.log(chalk.green("Installed MCP server for Claude Code."));
@@ -3773,7 +3772,7 @@ program2.command("mcp").description("Install MCP server for AI agents").option("
3773
3772
  console.log();
3774
3773
  console.log(`[mcp_servers.sandboxes]`);
3775
3774
  console.log(`command = "bunx"`);
3776
- console.log(`args = ["@hasna/sandboxes", "sandboxes-mcp"]`);
3775
+ console.log(`args = ["--bun", "--package", "@hasna/sandboxes", "sandboxes-mcp"]`);
3777
3776
  break;
3778
3777
  }
3779
3778
  case "gemini": {
@@ -3783,7 +3782,7 @@ program2.command("mcp").description("Install MCP server for AI agents").option("
3783
3782
  mcpServers: {
3784
3783
  sandboxes: {
3785
3784
  command: "bunx",
3786
- args: ["@hasna/sandboxes", "sandboxes-mcp"]
3785
+ args: ["--bun", "--package", "@hasna/sandboxes", "sandboxes-mcp"]
3787
3786
  }
3788
3787
  }
3789
3788
  }, null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAS/E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAuDzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
1
+ {"version":3,"file":"agent-runner.d.ts","sourceRoot":"","sources":["../../src/lib/agent-runner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAc/E,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAkDzB;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE"}
package/dist/mcp/index.js CHANGED
@@ -5191,8 +5191,9 @@ function emitLifecycleEvent(sandboxId, message) {
5191
5191
  }
5192
5192
 
5193
5193
  // src/lib/agent-runner.ts
5194
+ var CLAUDE_ONBOARDING_SETUP = `mkdir -p ~/.claude && ` + `echo '{"hasCompletedOnboarding":true,"hasTrustDialogAccepted":true,"hasAcknowledgedCostThreshold":true}' > ~/.claude.json`;
5194
5195
  var AGENT_COMMANDS = {
5195
- claude: (prompt) => `claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
5196
+ claude: (prompt) => `${CLAUDE_ONBOARDING_SETUP} && claude --dangerously-skip-permissions -p ${JSON.stringify(prompt)}`,
5196
5197
  codex: (prompt) => `codex -q ${JSON.stringify(prompt)}`,
5197
5198
  gemini: (prompt) => `gemini -p ${JSON.stringify(prompt)}`
5198
5199
  };
@@ -5211,29 +5212,27 @@ async function runAgent(sandboxId, opts) {
5211
5212
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} started: ${opts.prompt.slice(0, 100)}`);
5212
5213
  const collector = createStreamCollector(sandbox.id, session.id);
5213
5214
  const provider = await getProvider(sandbox.provider);
5214
- try {
5215
- const result = await provider.exec(sandbox.provider_sandbox_id, cmd, {
5216
- onStdout: (data) => {
5217
- collector.onStdout(data);
5218
- opts.onStdout?.(data);
5219
- },
5220
- onStderr: (data) => {
5221
- collector.onStderr(data);
5222
- opts.onStderr?.(data);
5223
- },
5224
- background: true
5225
- });
5226
- if ("exit_code" in result) {
5227
- const exitResult = result;
5228
- const status = exitResult.exit_code === 0 ? "completed" : "failed";
5229
- return endSession(session.id, exitResult.exit_code, status);
5230
- }
5231
- return session;
5232
- } catch (err) {
5215
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5216
+ provider.exec(sandbox.provider_sandbox_id, cmd, {
5217
+ onStdout: (data) => {
5218
+ collector.onStdout(data);
5219
+ opts.onStdout?.(data);
5220
+ },
5221
+ onStderr: (data) => {
5222
+ collector.onStderr(data);
5223
+ opts.onStderr?.(data);
5224
+ },
5225
+ env
5226
+ }).then((result) => {
5227
+ const exitResult = result;
5228
+ const status = exitResult.exit_code === 0 ? "completed" : "failed";
5229
+ endSession(session.id, exitResult.exit_code ?? 0, status);
5230
+ emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} finished with exit code ${exitResult.exit_code}`);
5231
+ }).catch((err) => {
5233
5232
  endSession(session.id, 1, "failed");
5234
5233
  emitLifecycleEvent(sandbox.id, `Agent ${opts.agentType} failed: ${err.message}`);
5235
- throw err;
5236
- }
5234
+ });
5235
+ return session;
5237
5236
  }
5238
5237
  async function stopAgent(sandboxId) {
5239
5238
  const sandbox = getSandbox(sandboxId);
@@ -5397,14 +5396,25 @@ server.tool("exec_command", "Execute a command in a sandbox", {
5397
5396
  });
5398
5397
  const collector = createStreamCollector(sandbox.id, session.id);
5399
5398
  const provider = await getProvider(sandbox.provider);
5400
- const result = await provider.exec(sandbox.provider_sandbox_id, params.command, {
5401
- background: params.background,
5402
- onStdout: collector.onStdout,
5403
- onStderr: collector.onStderr
5404
- });
5399
+ const env = Object.keys(sandbox.env_vars ?? {}).length > 0 ? sandbox.env_vars : undefined;
5405
5400
  if (params.background) {
5401
+ provider.exec(sandbox.provider_sandbox_id, params.command, {
5402
+ onStdout: collector.onStdout,
5403
+ onStderr: collector.onStderr,
5404
+ env
5405
+ }).then((res) => {
5406
+ const r = res;
5407
+ endSession(session.id, r.exit_code ?? 0);
5408
+ }).catch(() => {
5409
+ endSession(session.id, 1);
5410
+ });
5406
5411
  return ok({ session_id: session.id, background: true });
5407
5412
  }
5413
+ const result = await provider.exec(sandbox.provider_sandbox_id, params.command, {
5414
+ onStdout: collector.onStdout,
5415
+ onStderr: collector.onStderr,
5416
+ env
5417
+ });
5408
5418
  const execResult = result;
5409
5419
  endSession(session.id, execResult.exit_code);
5410
5420
  return ok({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hasna/sandboxes",
3
- "version": "0.1.2",
3
+ "version": "0.1.5",
4
4
  "author": "Andrei Hasna <andrei@hasna.com>",
5
5
  "repository": {
6
6
  "type": "git",