@integrity-labs/agt-cli 0.28.375 → 0.28.377
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.
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
resolveEffectivePinRaw,
|
|
44
44
|
safeWriteJsonAtomic,
|
|
45
45
|
setConfigHash
|
|
46
|
-
} from "../chunk-
|
|
46
|
+
} from "../chunk-IPWFCWG4.js";
|
|
47
47
|
import {
|
|
48
48
|
getProjectDir as getProjectDir2,
|
|
49
49
|
getReadyTasks,
|
|
@@ -9100,7 +9100,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
9100
9100
|
var lastVersionCheckAt = 0;
|
|
9101
9101
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
9102
9102
|
var lastResponsivenessProbeAt = 0;
|
|
9103
|
-
var agtCliVersion = true ? "0.28.
|
|
9103
|
+
var agtCliVersion = true ? "0.28.377" : "dev";
|
|
9104
9104
|
function resolveBrewPath(execFileSync2) {
|
|
9105
9105
|
try {
|
|
9106
9106
|
const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -9232,6 +9232,116 @@ async function ensureToolkitCli(toolkitSlug) {
|
|
|
9232
9232
|
recordToolkitFailure(toolkitSlug, `installer=${resolvedInstaller} completed but ${binary} still not on PATH`);
|
|
9233
9233
|
}
|
|
9234
9234
|
}
|
|
9235
|
+
var isolationImageEnsured = /* @__PURE__ */ new Set();
|
|
9236
|
+
var isolationImageRetryAfter = /* @__PURE__ */ new Map();
|
|
9237
|
+
var isolationImageFailureCount = /* @__PURE__ */ new Map();
|
|
9238
|
+
var isolationImageInFlight = /* @__PURE__ */ new Set();
|
|
9239
|
+
var ISOLATION_IMAGE_RETRY_MS = 5 * 6e4;
|
|
9240
|
+
var ISOLATION_IMAGE_MAX_FAILURES = 3;
|
|
9241
|
+
function isolationImageErrDetail(err) {
|
|
9242
|
+
const e = err;
|
|
9243
|
+
const stderr = e?.stderr ? e.stderr.toString().trim() : "";
|
|
9244
|
+
return (stderr || e?.message || String(err)).slice(0, 300);
|
|
9245
|
+
}
|
|
9246
|
+
function recordIsolationImageFailure(imageUri, reason) {
|
|
9247
|
+
const count = (isolationImageFailureCount.get(imageUri) ?? 0) + 1;
|
|
9248
|
+
isolationImageFailureCount.set(imageUri, count);
|
|
9249
|
+
if (count >= ISOLATION_IMAGE_MAX_FAILURES) {
|
|
9250
|
+
log(`[isolation-image] ${reason} (giving up after ${count} attempts - existing local image stays in use; restart the manager to retry)`);
|
|
9251
|
+
isolationImageEnsured.add(imageUri);
|
|
9252
|
+
isolationImageRetryAfter.delete(imageUri);
|
|
9253
|
+
} else {
|
|
9254
|
+
log(`[isolation-image] ${reason} (attempt ${count}/${ISOLATION_IMAGE_MAX_FAILURES}, retrying in ${ISOLATION_IMAGE_RETRY_MS / 6e4}m)`);
|
|
9255
|
+
isolationImageRetryAfter.set(imageUri, Date.now() + ISOLATION_IMAGE_RETRY_MS);
|
|
9256
|
+
}
|
|
9257
|
+
}
|
|
9258
|
+
async function ensureIsolationImage(imageUri) {
|
|
9259
|
+
if (process.env.AGT_ISOLATION_IMAGE) return;
|
|
9260
|
+
if (!imageUri || isolationImageEnsured.has(imageUri)) return;
|
|
9261
|
+
if (isolationImageInFlight.has(imageUri)) return;
|
|
9262
|
+
const retryAfter = isolationImageRetryAfter.get(imageUri) ?? 0;
|
|
9263
|
+
if (retryAfter > Date.now()) return;
|
|
9264
|
+
const registry = imageUri.split("/")[0] ?? "";
|
|
9265
|
+
const isPublic = registry === "public.ecr.aws";
|
|
9266
|
+
const privRegion = registry.match(/\.dkr\.ecr\.([a-z0-9-]+)\.amazonaws\.com$/)?.[1];
|
|
9267
|
+
if (!isPublic && !privRegion) {
|
|
9268
|
+
log(`[isolation-image] '${imageUri}' is not a recognised ECR image URI - skipping managed pull`);
|
|
9269
|
+
isolationImageEnsured.add(imageUri);
|
|
9270
|
+
return;
|
|
9271
|
+
}
|
|
9272
|
+
isolationImageInFlight.add(imageUri);
|
|
9273
|
+
try {
|
|
9274
|
+
const { execFileSync: execFileSync2 } = await import("child_process");
|
|
9275
|
+
try {
|
|
9276
|
+
execFileSync2("which", ["docker"], { timeout: 5e3, stdio: "pipe" });
|
|
9277
|
+
} catch {
|
|
9278
|
+
recordIsolationImageFailure(imageUri, `'docker' not found on host - required to pull the isolation image (install it, then the manager retries)`);
|
|
9279
|
+
return;
|
|
9280
|
+
}
|
|
9281
|
+
const hasAws = (() => {
|
|
9282
|
+
try {
|
|
9283
|
+
execFileSync2("which", ["aws"], { timeout: 5e3, stdio: "pipe" });
|
|
9284
|
+
return true;
|
|
9285
|
+
} catch {
|
|
9286
|
+
return false;
|
|
9287
|
+
}
|
|
9288
|
+
})();
|
|
9289
|
+
if (isPublic) {
|
|
9290
|
+
if (hasAws) {
|
|
9291
|
+
try {
|
|
9292
|
+
const password = execFileSync2("aws", ["ecr-public", "get-login-password", "--region", "us-east-1"], {
|
|
9293
|
+
timeout: 3e4,
|
|
9294
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
9295
|
+
}).toString().trim();
|
|
9296
|
+
execFileSync2("docker", ["login", "--username", "AWS", "--password-stdin", "public.ecr.aws"], {
|
|
9297
|
+
input: password,
|
|
9298
|
+
timeout: 3e4,
|
|
9299
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
9300
|
+
});
|
|
9301
|
+
} catch (err) {
|
|
9302
|
+
log(`[isolation-image] ecr-public login failed, falling back to anonymous pull: ${isolationImageErrDetail(err)}`);
|
|
9303
|
+
}
|
|
9304
|
+
}
|
|
9305
|
+
} else if (privRegion) {
|
|
9306
|
+
if (!hasAws) {
|
|
9307
|
+
recordIsolationImageFailure(imageUri, `'aws' CLI not found - required to authenticate a private ECR pull of ${registry} (install it, then the manager retries)`);
|
|
9308
|
+
return;
|
|
9309
|
+
}
|
|
9310
|
+
try {
|
|
9311
|
+
const password = execFileSync2("aws", ["ecr", "get-login-password", "--region", privRegion], {
|
|
9312
|
+
timeout: 3e4,
|
|
9313
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
9314
|
+
}).toString().trim();
|
|
9315
|
+
execFileSync2("docker", ["login", "--username", "AWS", "--password-stdin", registry], {
|
|
9316
|
+
input: password,
|
|
9317
|
+
timeout: 3e4,
|
|
9318
|
+
stdio: ["pipe", "pipe", "pipe"]
|
|
9319
|
+
});
|
|
9320
|
+
} catch (err) {
|
|
9321
|
+
recordIsolationImageFailure(imageUri, `ecr login for ${registry} failed: ${isolationImageErrDetail(err)}`);
|
|
9322
|
+
return;
|
|
9323
|
+
}
|
|
9324
|
+
}
|
|
9325
|
+
log(`[isolation-image] pulling ${imageUri}\u2026`);
|
|
9326
|
+
const pull = await runAsync("docker", ["pull", imageUri], { timeout: 6e5 });
|
|
9327
|
+
if (pull.code !== 0) {
|
|
9328
|
+
recordIsolationImageFailure(imageUri, `docker pull failed (exit ${pull.code}): ${(pull.stderr || pull.stdout).slice(0, 300)}`);
|
|
9329
|
+
return;
|
|
9330
|
+
}
|
|
9331
|
+
const localTag = "agt-runtime:latest";
|
|
9332
|
+
const tag = await runAsync("docker", ["tag", imageUri, localTag], { timeout: 3e4 });
|
|
9333
|
+
if (tag.code !== 0) {
|
|
9334
|
+
recordIsolationImageFailure(imageUri, `docker tag \u2192 ${localTag} failed (exit ${tag.code}): ${tag.stderr.slice(0, 200)}`);
|
|
9335
|
+
return;
|
|
9336
|
+
}
|
|
9337
|
+
log(`[isolation-image] ${localTag} now points at ${imageUri}`);
|
|
9338
|
+
isolationImageEnsured.add(imageUri);
|
|
9339
|
+
isolationImageRetryAfter.delete(imageUri);
|
|
9340
|
+
isolationImageFailureCount.delete(imageUri);
|
|
9341
|
+
} finally {
|
|
9342
|
+
isolationImageInFlight.delete(imageUri);
|
|
9343
|
+
}
|
|
9344
|
+
}
|
|
9235
9345
|
function runAsync(cmd, args, opts) {
|
|
9236
9346
|
return new Promise((resolve, reject) => {
|
|
9237
9347
|
import("child_process").then(({ spawn }) => {
|
|
@@ -12443,6 +12553,12 @@ async function processAgent(agent, agentStates) {
|
|
|
12443
12553
|
await ensureToolkitCli(toolkitSlug);
|
|
12444
12554
|
}
|
|
12445
12555
|
}
|
|
12556
|
+
const desiredRuntimeImage = refreshAny.desired_runtime_image;
|
|
12557
|
+
if (desiredRuntimeImage && isolationMode(agent.code_name) !== "none") {
|
|
12558
|
+
void ensureIsolationImage(desiredRuntimeImage).catch((err) => {
|
|
12559
|
+
log(`[isolation-image] unexpected managed-pull failure: ${isolationImageErrDetail(err)}`);
|
|
12560
|
+
});
|
|
12561
|
+
}
|
|
12446
12562
|
const agentFw2 = agentFrameworkCache.get(agent.code_name) ?? DEFAULT_FRAMEWORK;
|
|
12447
12563
|
if (agentFw2 === "claude-code" && installedIntegrationSkills.length > 0 && isSessionHealthy(agent.code_name)) {
|
|
12448
12564
|
const names = installedIntegrationSkills.join(", ");
|