@madarco/agentbox 0.11.1 → 0.11.3

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/index.js CHANGED
@@ -40,6 +40,7 @@ import {
40
40
  buildCloudAttachInnerCommand,
41
41
  clipboardCaptureAvailable,
42
42
  cloudAgentAttach,
43
+ cloudAgentStartDetached,
43
44
  createMenuLines,
44
45
  detectHostTerminal,
45
46
  getProvider,
@@ -61,7 +62,7 @@ import {
61
62
  statusLine,
62
63
  stripTitleGlyph,
63
64
  subscribePrompts
64
- } from "./chunk-PZ2TJF2U.js";
65
+ } from "./chunk-GYJ62GFL.js";
65
66
  import {
66
67
  AmbiguousBoxError,
67
68
  BOX_STATUS_EVENT,
@@ -220,8 +221,8 @@ import {
220
221
  import "./chunk-G3H2L3O2.js";
221
222
 
222
223
  // src/version.ts
223
- var AGENTBOX_VERSION = true ? "0.11.1" : "0.0.0-dev";
224
- var AGENTBOX_COMMIT = true ? "b00384ce" : "dev";
224
+ var AGENTBOX_VERSION = true ? "0.11.3" : "0.0.0-dev";
225
+ var AGENTBOX_COMMIT = true ? "c74f16c4" : "dev";
225
226
 
226
227
  // src/index.ts
227
228
  import { Command as Command46 } from "commander";
@@ -2249,11 +2250,6 @@ var claudeCommand = new Command2("claude").description("Create a sandboxed box a
2249
2250
  const providerName = opts.provider ?? cfg.effective.box.provider ?? "docker";
2250
2251
  const isCloud = providerName !== "docker";
2251
2252
  if (opts.initialPrompt && opts.initialPrompt.length > 0) {
2252
- if (isCloud) {
2253
- log8.error("-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).");
2254
- cmdLog.close();
2255
- process.exit(2);
2256
- }
2257
2253
  try {
2258
2254
  await assertAgentCredsAvailable({
2259
2255
  agent: "claude-code",
@@ -3664,11 +3660,6 @@ var codexCommand = new Command5("codex").description("Create a sandboxed box and
3664
3660
  const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);
3665
3661
  const checkpointRef = opts.snapshot && opts.snapshot.length > 0 ? opts.snapshot : providerDefault.length > 0 ? providerDefault : void 0;
3666
3662
  if (opts.initialPrompt && opts.initialPrompt.length > 0) {
3667
- if (isCloud) {
3668
- log11.error("-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).");
3669
- cmdLog.close();
3670
- process.exit(2);
3671
- }
3672
3663
  try {
3673
3664
  await assertAgentCredsAvailable({
3674
3665
  agent: "codex",
@@ -4382,11 +4373,6 @@ var opencodeCommand = new Command6("opencode").description("Create a sandboxed b
4382
4373
  const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);
4383
4374
  const checkpointRef = opts.snapshot && opts.snapshot.length > 0 ? opts.snapshot : providerDefault.length > 0 ? providerDefault : void 0;
4384
4375
  if (opts.initialPrompt && opts.initialPrompt.length > 0) {
4385
- if (isCloud) {
4386
- log12.error("-i / --initial-prompt is currently docker-only (cloud sessions only start on attach).");
4387
- cmdLog.close();
4388
- process.exit(2);
4389
- }
4390
4376
  try {
4391
4377
  await assertAgentCredsAvailable({
4392
4378
  agent: "opencode",
@@ -5419,7 +5405,7 @@ var createCommand = new Command9("create").description("Create and start a new a
5419
5405
  }
5420
5406
  outro4("done");
5421
5407
  if (attachClaudeAfter) {
5422
- const { cloudAgentAttach: cloudAgentAttach2 } = await import("./_cloud-attach-45ECDTRL.js");
5408
+ const { cloudAgentAttach: cloudAgentAttach2 } = await import("./_cloud-attach-XWCVLO5V.js");
5423
5409
  await cloudAgentAttach2({
5424
5410
  box: result.record,
5425
5411
  binary: "claude",
@@ -10866,9 +10852,14 @@ var runQueuedJobCommand = new Command35("_run-queued-job").description("internal
10866
10852
  log44.close();
10867
10853
  process.exit(64);
10868
10854
  }
10869
- await runDockerJob(job, log44, (boxId) => {
10855
+ const onBoxCreated = (boxId) => {
10870
10856
  if (job) job = { ...job, boxId };
10871
- });
10857
+ };
10858
+ if ((job.providerName || "docker") === "docker") {
10859
+ await runDockerJob(job, log44, onBoxCreated);
10860
+ } else {
10861
+ await runCloudJob(job, log44, onBoxCreated);
10862
+ }
10872
10863
  const done = {
10873
10864
  ...job,
10874
10865
  status: "done",
@@ -10906,9 +10897,6 @@ async function runDockerJob(job, log44, onBoxCreated) {
10906
10897
  });
10907
10898
  const projectRoot = (await findProjectRoot(opts.workspace)).root;
10908
10899
  const providerName = job.providerName || cfg.effective.box.provider || "docker";
10909
- if (providerName !== "docker") {
10910
- throw new Error(`worker only supports docker provider (got "${providerName}")`);
10911
- }
10912
10900
  const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);
10913
10901
  const checkpointRef = opts.snapshot && opts.snapshot.length > 0 ? opts.snapshot : providerDefault.length > 0 ? providerDefault : void 0;
10914
10902
  const useSnapshot = opts.hostSnapshot === false ? false : opts.hostSnapshot === true ? true : cfg.effective.box.hostSnapshot ?? false;
@@ -10981,6 +10969,60 @@ async function runDockerJob(job, log44, onBoxCreated) {
10981
10969
  throw new Error(`unknown agent kind: ${String(job.agent)}`);
10982
10970
  }
10983
10971
  }
10972
+ async function runCloudJob(job, log44, onBoxCreated) {
10973
+ const opts = job.createOpts;
10974
+ const cfg = await loadEffectiveConfig(opts.workspace, {
10975
+ cliOverrides: buildOverridesFromJob(job)
10976
+ });
10977
+ const projectRoot = (await findProjectRoot(opts.workspace)).root;
10978
+ const providerName = job.providerName || cfg.effective.box.provider || "docker";
10979
+ const provider = await providerForCreate({ flag: providerName, config: cfg.effective });
10980
+ const providerDefault = resolveDefaultCheckpoint(cfg.effective, providerName);
10981
+ const checkpointRef = opts.snapshot && opts.snapshot.length > 0 ? opts.snapshot : providerDefault.length > 0 ? providerDefault : void 0;
10982
+ const withPlaywright = cfg.effective.box.withPlaywright || cfg.effective.browser.default !== "agent-browser";
10983
+ log44.write(`creating cloud box (${providerName}) for agent=${job.agent}`);
10984
+ const result = await provider.create({
10985
+ workspacePath: opts.workspace,
10986
+ name: opts.name && opts.name.length > 0 ? opts.name : void 0,
10987
+ checkpointRef,
10988
+ image: cfg.effective.box.image,
10989
+ withPlaywright,
10990
+ withEnv: cfg.effective.box.withEnv,
10991
+ vnc: { enabled: cfg.effective.box.vnc },
10992
+ limits: resolveLimits(cfg.effective.box, opts),
10993
+ projectRoot,
10994
+ onLog: (line) => log44.write(line)
10995
+ });
10996
+ log44.write(`box created: ${result.record.id}`);
10997
+ onBoxCreated(result.record.id);
10998
+ await writeJob({ ...job, boxId: result.record.id });
10999
+ const promptedArgs = buildPromptArgs(job.agent, job.prompt, job.agentArgs);
11000
+ let binary;
11001
+ let sessionName;
11002
+ let extraArgs;
11003
+ if (job.agent === "claude-code") {
11004
+ binary = "claude";
11005
+ sessionName = cfg.effective.claude.sessionName;
11006
+ extraArgs = applyClaudeSkipPermissions(promptedArgs, cfg.effective);
11007
+ } else if (job.agent === "codex") {
11008
+ binary = "codex";
11009
+ sessionName = cfg.effective.codex.sessionName;
11010
+ extraArgs = applyCodexSkipPermissions(promptedArgs, cfg.effective);
11011
+ } else if (job.agent === "opencode") {
11012
+ binary = "opencode";
11013
+ sessionName = cfg.effective.opencode.sessionName;
11014
+ extraArgs = promptedArgs;
11015
+ } else {
11016
+ throw new Error(`unknown agent kind: ${String(job.agent)}`);
11017
+ }
11018
+ log44.write(`starting detached ${job.agent} session`);
11019
+ await cloudAgentStartDetached({
11020
+ box: result.record,
11021
+ binary,
11022
+ sessionName,
11023
+ extraArgs
11024
+ });
11025
+ }
10984
11026
  function buildOverridesFromJob(job) {
10985
11027
  const opts = job.createOpts;
10986
11028
  const box = {};
@@ -12057,8 +12099,8 @@ function runInherit(cmd, args) {
12057
12099
  });
12058
12100
  }
12059
12101
  var updateCommand = new Command43("self-update").description(
12060
- "Update agentbox: self-update via npm/pnpm (unless run via npx), wipe the box image so it rebuilds, and reload the relay"
12061
- ).option("-y, --yes", "skip the confirmation prompt").option("--dry-run", "show what would happen, don't change anything").option("--skip-self", "skip the package self-update; only refresh the image + relay").action(async (opts) => {
12102
+ "Update agentbox: self-update via npm/pnpm (unless run via npx), refresh the host skills, wipe the box image so it rebuilds, and reload the relay"
12103
+ ).option("-y, --yes", "skip the confirmation prompt").option("--dry-run", "show what would happen, don't change anything").option("--skip-self", "skip the package self-update; only refresh the skills + image + relay").option("--skip-skills", "skip refreshing the host skill files in ~/.claude, ~/.codex, ~/.config/opencode").action(async (opts) => {
12062
12104
  try {
12063
12105
  const method = detectExecutionMethod({
12064
12106
  userAgent: process.env.npm_config_user_agent,
@@ -12066,10 +12108,12 @@ var updateCommand = new Command43("self-update").description(
12066
12108
  });
12067
12109
  intro8("agentbox self-update");
12068
12110
  const selfStep = opts.skipSelf ? "self-update: skipped (--skip-self)" : describeSelfUpdate(method);
12111
+ const skillsStep = opts.skipSkills ? "skills: skipped (--skip-skills)" : "skills: refresh agentbox-managed host skill files in ~/.claude (and Codex/OpenCode)";
12069
12112
  log41.info(
12070
12113
  [
12071
12114
  "plan:",
12072
12115
  ` ${selfStep}`,
12116
+ ` ${skillsStep}`,
12073
12117
  ` image: docker image rm -f ${DEFAULT_BOX_IMAGE} (rebuilds on next create/claude)`,
12074
12118
  " relay: stop, then respawn unless a self-update ran"
12075
12119
  ].join("\n")
@@ -12102,6 +12146,36 @@ var updateCommand = new Command43("self-update").description(
12102
12146
  log41.success(`updated ${PKG} via ${cmd.cmd}`);
12103
12147
  }
12104
12148
  }
12149
+ if (opts.skipSkills) {
12150
+ log41.info("skipping skills refresh (--skip-skills)");
12151
+ } else if (selfUpdated) {
12152
+ const code = await runInherit("agentbox", ["install", "--skills-only"]);
12153
+ if (code === 0) {
12154
+ log41.success("refreshed host skills (via updated build)");
12155
+ } else {
12156
+ log41.warn(
12157
+ `host skills not refreshed (agentbox install --skills-only exited ${String(code)}) \u2014 run it manually to pick up the new versions`
12158
+ );
12159
+ }
12160
+ } else {
12161
+ try {
12162
+ const res = installHostSkills({ quiet: true });
12163
+ if (res.written.length > 0) {
12164
+ log41.success(`refreshed host skills (${String(res.written.length)} file(s))`);
12165
+ } else {
12166
+ log41.info(`host skills already current (${String(res.skipped)} skipped)`);
12167
+ }
12168
+ if (res.blocked.length > 0) {
12169
+ log41.warn(
12170
+ `user-modified skill file(s) left in place: ${res.blocked.join(", ")} \u2014 run \`agentbox install --skills-only --force\` to overwrite`
12171
+ );
12172
+ }
12173
+ } catch (err) {
12174
+ log41.warn(
12175
+ `host skills not refreshed (${err instanceof Error ? err.message : String(err)})`
12176
+ );
12177
+ }
12178
+ }
12105
12179
  const s = spinner10();
12106
12180
  s.start(`removing image ${DEFAULT_BOX_IMAGE}`);
12107
12181
  const removed = await removeImage(DEFAULT_BOX_IMAGE);