@madarco/agentbox 0.1.0 → 0.2.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.
@@ -9,7 +9,7 @@ import {
9
9
  volumeExists
10
10
  } from "./chunk-SOMIKEN2.js";
11
11
 
12
- // ../../packages/sandbox-docker/dist/chunk-VHV7OF2K.js
12
+ // ../../packages/sandbox-docker/dist/chunk-DVEY57YJ.js
13
13
  import { spawnSync } from "child_process";
14
14
  import { mkdir, mkdtemp, readdir, readFile, rm, stat, writeFile } from "fs/promises";
15
15
  import { homedir, tmpdir } from "os";
@@ -41,7 +41,7 @@ var RELAY_NETWORK_NAME = "agentbox-net";
41
41
  var RELAY_IMAGE_REF = "agentbox/relay:dev";
42
42
  var MAX_BODY_BYTES = 1024 * 1024;
43
43
 
44
- // ../../packages/sandbox-docker/dist/chunk-VHV7OF2K.js
44
+ // ../../packages/sandbox-docker/dist/chunk-DVEY57YJ.js
45
45
  function isHostPathHookCommand(command, hostHome) {
46
46
  if (typeof command !== "string" || command.length === 0) return false;
47
47
  if (hostHome.length === 0) return false;
@@ -384,6 +384,10 @@ function buildClaudeMounts(spec, hostEnv) {
384
384
  };
385
385
  }
386
386
  var PLUGIN_INSTALLED_MARKER = ".agentbox-installed";
387
+ var PLUGIN_FAILED_MARKER = ".agentbox-install-failed";
388
+ var PLUGIN_INSTALL_BACKOFF_MS = 6 * 60 * 60 * 1e3;
389
+ var PLUGIN_INSTALL_BACKOFF_MIN = Math.round(PLUGIN_INSTALL_BACKOFF_MS / 6e4);
390
+ var NPM_CACHE_DIR = "/home/vscode/.claude/.agentbox-npm-cache";
387
391
  async function isFile(p) {
388
392
  try {
389
393
  return (await stat(p)).isFile();
@@ -391,6 +395,14 @@ async function isFile(p) {
391
395
  return false;
392
396
  }
393
397
  }
398
+ async function isRecentFailMarker(p) {
399
+ try {
400
+ const st = await stat(p);
401
+ return Date.now() - st.mtimeMs < PLUGIN_INSTALL_BACKOFF_MS;
402
+ } catch {
403
+ return false;
404
+ }
405
+ }
394
406
  async function isDir(p) {
395
407
  try {
396
408
  return (await stat(p)).isDirectory();
@@ -428,6 +440,7 @@ async function scanPluginCacheForRebuild(cacheRoot) {
428
440
  const vPath = join(pPath, v.name);
429
441
  if (!await isFile(join(vPath, "package.json"))) continue;
430
442
  if (await isFile(join(vPath, PLUGIN_INSTALLED_MARKER))) continue;
443
+ if (await isRecentFailMarker(join(vPath, PLUGIN_FAILED_MARKER))) continue;
431
444
  return true;
432
445
  }
433
446
  }
@@ -448,28 +461,66 @@ async function rebuildPluginNativeDeps(container, opts = {}) {
448
461
  }
449
462
  const script = `set -u
450
463
  PLUGINS_DIR=/home/vscode/.claude/plugins/cache
451
- MARKER=.agentbox-installed
452
- if [ ! -d "$PLUGINS_DIR" ]; then exit 0; fi
464
+ MARKER=${PLUGIN_INSTALLED_MARKER}
465
+ FAILMARKER=${PLUGIN_FAILED_MARKER}
466
+ NPM_CACHE=${NPM_CACHE_DIR}
467
+ BACKOFF_MIN=${PLUGIN_INSTALL_BACKOFF_MIN}
468
+ MAX=4
469
+ [ -d "$PLUGINS_DIR" ] || exit 0
470
+ mkdir -p "$NPM_CACHE"
471
+ WORK=$(mktemp -d)
472
+ relkey() { printf '%s' "\${1#$PLUGINS_DIR/}" | tr '/' '_'; }
473
+ # Run one plugin's install. $1 is frozen by value at call time, so it's safe
474
+ # to read from the backgrounded subshell; the rest are set-once constants.
475
+ do_one() {
476
+ d=$1
477
+ key=$(relkey "$d")
478
+ if (cd "$d" && \\
479
+ if [ -f package-lock.json ]; then \\
480
+ npm ci --no-audit --no-fund --silent --prefer-offline --cache "$NPM_CACHE"; \\
481
+ else \\
482
+ npm install --no-audit --no-fund --silent --no-package-lock --prefer-offline --cache "$NPM_CACHE"; \\
483
+ fi) >"$WORK/$key.out" 2>"$WORK/$key.err"; then
484
+ touch "$d/$MARKER"
485
+ rm -f "$d/$FAILMARKER"
486
+ printf 'OK\\n' > "$WORK/$key.res"
487
+ else
488
+ : > "$d/$FAILMARKER"
489
+ printf 'FAIL\\n' > "$WORK/$key.res"
490
+ fi
491
+ }
492
+ n=0
453
493
  for dir in "$PLUGINS_DIR"/*/*/*/; do
454
494
  [ -d "$dir" ] || continue
455
495
  [ -f "$dir/package.json" ] || continue
456
496
  [ -f "$dir/$MARKER" ] && continue
457
- rel="\${dir#$PLUGINS_DIR/}"
458
- echo "REBUILD_START $rel"
459
- if (cd "$dir" && \\
460
- if [ -f package-lock.json ]; then \\
461
- npm ci --no-audit --no-fund --silent; \\
462
- else \\
463
- npm install --no-audit --no-fund --silent --no-package-lock; \\
464
- fi) 2>/tmp/agentbox-npm.err; then
465
- touch "$dir/$MARKER"
497
+ [ -n "$(find "$dir" -maxdepth 1 -name "$FAILMARKER" -mmin -$BACKOFF_MIN 2>/dev/null)" ] && continue
498
+ echo "REBUILD_START \${dir#$PLUGINS_DIR/}"
499
+ n=$((n+1))
500
+ printf '%s\\n' "$dir" >> "$WORK/dirs"
501
+ done
502
+ if [ "$n" -eq 0 ]; then rm -rf "$WORK"; exit 0; fi
503
+ running=0
504
+ while IFS= read -r dir; do
505
+ do_one "$dir" &
506
+ running=$((running+1))
507
+ if [ "$running" -ge "$MAX" ]; then wait; running=0; fi
508
+ done < "$WORK/dirs"
509
+ wait
510
+ while IFS= read -r dir; do
511
+ key=$(relkey "$dir")
512
+ rel=\${dir#$PLUGINS_DIR/}
513
+ [ -f "$WORK/$key.res" ] || continue
514
+ read -r st < "$WORK/$key.res"
515
+ if [ "$st" = OK ]; then
466
516
  echo "REBUILD_OK $rel"
467
517
  else
468
518
  echo "REBUILD_FAIL $rel"
469
- sed 's/^/ /' /tmp/agentbox-npm.err
519
+ sed 's/^/ /' "$WORK/$key.err"
470
520
  echo "REBUILD_FAIL_END"
471
521
  fi
472
- done
522
+ done < "$WORK/dirs"
523
+ rm -rf "$WORK"
473
524
  `;
474
525
  const result = await execa(
475
526
  "docker",
@@ -2161,4 +2212,4 @@ export {
2161
2212
  ConfigError,
2162
2213
  loadConfig
2163
2214
  };
2164
- //# sourceMappingURL=chunk-O5HS3QHW.js.map
2215
+ //# sourceMappingURL=chunk-3NIZKZPJ.js.map