@integrity-labs/agt-cli 0.28.136 → 0.28.138

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.
@@ -100,7 +100,7 @@ async function spawnPairSession(session) {
100
100
  return { ok: true };
101
101
  } catch {
102
102
  }
103
- const { resolveClaudeBinary } = await import("./persistent-session-VQCCFN4M.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-SVZCOP7I.js");
104
104
  const claudeBin = resolveClaudeBinary();
105
105
  const pairEnv = {
106
106
  ...process.env,
@@ -373,4 +373,4 @@ export {
373
373
  startClaudePair,
374
374
  submitClaudePairCode
375
375
  };
376
- //# sourceMappingURL=claude-pair-runtime-ODRPKNKT.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-7TJXAPIK.js.map
@@ -28,7 +28,7 @@ import {
28
28
  requireHost,
29
29
  safeWriteJsonAtomic,
30
30
  setConfigHash
31
- } from "../chunk-FDRT52UA.js";
31
+ } from "../chunk-QJCTWNIJ.js";
32
32
  import {
33
33
  getProjectDir as getProjectDir2,
34
34
  getReadyTasks,
@@ -72,7 +72,7 @@ import {
72
72
  takeZombieDetection,
73
73
  transcriptActivityAgeSeconds,
74
74
  writeEgressAllowlist
75
- } from "../chunk-2WWCHEQT.js";
75
+ } from "../chunk-NGES4EZD.js";
76
76
  import {
77
77
  FLAGS_SCHEMA_VERSION,
78
78
  FLAG_REGISTRY,
@@ -110,7 +110,7 @@ import {
110
110
  resolveDmTarget,
111
111
  sumTranscriptUsageInWindow,
112
112
  wrapScheduledTaskPrompt
113
- } from "../chunk-QKA46UNQ.js";
113
+ } from "../chunk-ROOFBKRE.js";
114
114
  import {
115
115
  parsePsRows,
116
116
  reapOrphanChannelMcps
@@ -1676,6 +1676,9 @@ function decideMaintenanceWindowGate(opts) {
1676
1676
  if (!opts.window) return "proceed";
1677
1677
  return isWithinMaintenanceWindow(opts.window, opts.now) ? "proceed" : "defer";
1678
1678
  }
1679
+ function shouldConsumeForcedUpdate(outcome) {
1680
+ return outcome !== "failed";
1681
+ }
1679
1682
  function decideForcedUpdate(opts) {
1680
1683
  const { requestedAt, lastProcessedAt, hostBusy } = opts;
1681
1684
  if (!requestedAt) return "none";
@@ -7067,7 +7070,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
7067
7070
  var lastVersionCheckAt = 0;
7068
7071
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
7069
7072
  var lastResponsivenessProbeAt = 0;
7070
- var agtCliVersion = true ? "0.28.136" : "dev";
7073
+ var agtCliVersion = true ? "0.28.138" : "dev";
7071
7074
  function resolveBrewPath(execFileSync4) {
7072
7075
  try {
7073
7076
  const out = execFileSync4("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -7370,12 +7373,12 @@ var pendingUpgradeVersion = null;
7370
7373
  var selfUpdateInFlight = false;
7371
7374
  async function checkAndUpdateCli(opts) {
7372
7375
  const force = opts?.force ?? false;
7373
- if (selfUpdateInFlight) return;
7376
+ if (selfUpdateInFlight) return "failed";
7374
7377
  selfUpdateInFlight = true;
7375
7378
  try {
7376
7379
  const cliPath = process.argv[1] ?? "";
7377
7380
  const isDevMode = cliPath.includes("/src/") || cliPath.includes("tsx");
7378
- if (isDevMode) return;
7381
+ if (isDevMode) return "noop";
7379
7382
  let resolvedPath = cliPath;
7380
7383
  try {
7381
7384
  const { realpathSync } = await import("fs");
@@ -7384,13 +7387,13 @@ async function checkAndUpdateCli(opts) {
7384
7387
  }
7385
7388
  const isBrewFormula = /\/Cellar\/[^/]+\//.test(resolvedPath);
7386
7389
  const isNpmGlobal = !isBrewFormula && resolvedPath.includes("node_modules");
7387
- if (!isBrewFormula && !isNpmGlobal) return;
7390
+ if (!isBrewFormula && !isNpmGlobal) return "noop";
7388
7391
  const { readFileSync: readF, writeFileSync: writeF } = await import("fs");
7389
7392
  const markerPath = join16(homedir9(), ".augmented", ".last-update-check");
7390
7393
  if (!force) {
7391
7394
  try {
7392
7395
  const lastCheck = parseInt(readF(markerPath, "utf-8").trim(), 10);
7393
- if (Date.now() - lastCheck < UPDATE_CHECK_INTERVAL_MS) return;
7396
+ if (Date.now() - lastCheck < UPDATE_CHECK_INTERVAL_MS) return "noop";
7394
7397
  } catch {
7395
7398
  }
7396
7399
  }
@@ -7398,15 +7401,12 @@ async function checkAndUpdateCli(opts) {
7398
7401
  writeF(markerPath, String(Date.now()));
7399
7402
  } catch {
7400
7403
  }
7401
- if (isBrewFormula) {
7402
- await checkAndUpdateCliViaBrew(force);
7403
- } else {
7404
- await checkAndUpdateCliViaNpm(force);
7405
- }
7404
+ const outcome = isBrewFormula ? await checkAndUpdateCliViaBrew(force) : await checkAndUpdateCliViaNpm(force);
7406
7405
  try {
7407
7406
  writeF(markerPath, String(Date.now()));
7408
7407
  } catch {
7409
7408
  }
7409
+ return outcome;
7410
7410
  } finally {
7411
7411
  selfUpdateInFlight = false;
7412
7412
  }
@@ -7414,10 +7414,12 @@ async function checkAndUpdateCli(opts) {
7414
7414
  async function checkAndUpdateCliViaBrew(force = false) {
7415
7415
  const { execFileSync: execFileSync4 } = await import("child_process");
7416
7416
  const brewPath = resolveBrewPath(execFileSync4);
7417
- if (!brewPath) return;
7417
+ if (!brewPath) return "noop";
7418
+ let metadataFresh = true;
7418
7419
  try {
7419
7420
  execFileSync4(brewPath, ["update", "--quiet"], { timeout: 6e4, stdio: "pipe" });
7420
7421
  } catch (err) {
7422
+ metadataFresh = false;
7421
7423
  log(`[self-update] brew update failed (continuing with stale cache): ${err.message}`);
7422
7424
  }
7423
7425
  try {
@@ -7434,7 +7436,7 @@ async function checkAndUpdateCliViaBrew(force = false) {
7434
7436
  log(
7435
7437
  `[self-update] agt CLI ${installed} \u2192 ${latest} (brew) deferred \u2014 ` + formatWindowDeferLogLine(cachedMaintenanceWindow ?? {}, /* @__PURE__ */ new Date())
7436
7438
  );
7437
- return;
7439
+ return "noop";
7438
7440
  }
7439
7441
  const coalesceWindowMs = resolveCoalesceWindowMs();
7440
7442
  const coalesce = decideSelfUpdateCoalesce({
@@ -7450,7 +7452,7 @@ async function checkAndUpdateCliViaBrew(force = false) {
7450
7452
  remainingMs: coalesce.remainingMs,
7451
7453
  windowMs: coalesceWindowMs
7452
7454
  }));
7453
- return;
7455
+ return "noop";
7454
7456
  }
7455
7457
  log(`[self-update] agt CLI update available: ${installed} \u2192 ${latest}. Upgrading via brew${force ? " (forced \u2014 Update CLI now)" : ""}...`);
7456
7458
  try {
@@ -7462,19 +7464,23 @@ async function checkAndUpdateCliViaBrew(force = false) {
7462
7464
  stampLastSelfUpdateApplied(selfUpdateAppliedMarkerPath());
7463
7465
  restartAfterUpgrade = true;
7464
7466
  pendingUpgradeVersion = latest;
7467
+ return "updated";
7465
7468
  } catch (err) {
7466
7469
  log(`[self-update] brew upgrade failed: ${err.message}`);
7470
+ return "failed";
7467
7471
  }
7468
7472
  } else if (!selfUpdateUpToDateLogged) {
7469
7473
  log(`[self-update] agt CLI is up to date (brew, ${agtCliVersion})`);
7470
7474
  selfUpdateUpToDateLogged = true;
7471
7475
  }
7476
+ return metadataFresh ? "noop" : "failed";
7472
7477
  } catch (err) {
7473
7478
  log(`[self-update] brew outdated failed: ${err.message}`);
7479
+ return "failed";
7474
7480
  }
7475
7481
  }
7476
7482
  async function checkAndUpdateCliViaNpm(force = false) {
7477
- if (agtCliVersion === "dev") return;
7483
+ if (agtCliVersion === "dev") return "noop";
7478
7484
  const channel = process.env.AGT_CLI_RELEASE_CHANNEL || "latest";
7479
7485
  let latest;
7480
7486
  try {
@@ -7487,17 +7493,17 @@ async function checkAndUpdateCliViaNpm(force = false) {
7487
7493
  );
7488
7494
  if (!res.ok) {
7489
7495
  log(`[self-update] npm registry returned ${res.status} (channel=${channel})`);
7490
- return;
7496
+ return "failed";
7491
7497
  }
7492
7498
  const body = await res.json();
7493
7499
  if (!body.version) {
7494
7500
  log(`[self-update] npm registry response missing version field`);
7495
- return;
7501
+ return "failed";
7496
7502
  }
7497
7503
  latest = body.version;
7498
7504
  } catch (err) {
7499
7505
  log(`[self-update] npm registry fetch failed: ${err.message}`);
7500
- return;
7506
+ return "failed";
7501
7507
  }
7502
7508
  const urgentTarget = await fetchUrgentDistTagVersion();
7503
7509
  if (isUrgentUpgrade({
@@ -7508,8 +7514,7 @@ async function checkAndUpdateCliViaNpm(force = false) {
7508
7514
  log(
7509
7515
  `[self-update] URGENT agt CLI hotfix ${agtCliVersion} \u2192 ${urgentTarget} (overrides channel=${channel} + maintenance window). Upgrading via npm...`
7510
7516
  );
7511
- await installAgtCliViaNpm(urgentTarget, "urgent");
7512
- return;
7517
+ return await installAgtCliViaNpm(urgentTarget, "urgent");
7513
7518
  }
7514
7519
  let shouldUpdate;
7515
7520
  if (channel === "latest") {
@@ -7529,13 +7534,13 @@ async function checkAndUpdateCliViaNpm(force = false) {
7529
7534
  log(`[self-update] agt CLI is up to date (npm, channel=${channel}, ${agtCliVersion})`);
7530
7535
  selfUpdateUpToDateLogged = true;
7531
7536
  }
7532
- return;
7537
+ return "noop";
7533
7538
  }
7534
7539
  if (!force && decideMaintenanceWindowGate({ window: cachedMaintenanceWindow, now: /* @__PURE__ */ new Date() }) === "defer") {
7535
7540
  log(
7536
7541
  `[self-update] agt CLI ${agtCliVersion} \u2192 ${latest} (channel=${channel}) deferred \u2014 ` + formatWindowDeferLogLine(cachedMaintenanceWindow ?? {}, /* @__PURE__ */ new Date())
7537
7542
  );
7538
- return;
7543
+ return "noop";
7539
7544
  }
7540
7545
  const coalesceWindowMs = resolveCoalesceWindowMs();
7541
7546
  const coalesce = decideSelfUpdateCoalesce({
@@ -7551,10 +7556,10 @@ async function checkAndUpdateCliViaNpm(force = false) {
7551
7556
  remainingMs: coalesce.remainingMs,
7552
7557
  windowMs: coalesceWindowMs
7553
7558
  }));
7554
- return;
7559
+ return "noop";
7555
7560
  }
7556
7561
  log(`[self-update] agt CLI update available: ${agtCliVersion} \u2192 ${latest} (channel=${channel}). Upgrading via npm...`);
7557
- await installAgtCliViaNpm(latest, `channel=${channel}`);
7562
+ return await installAgtCliViaNpm(latest, `channel=${channel}`);
7558
7563
  }
7559
7564
  async function fetchUrgentDistTagVersion() {
7560
7565
  try {
@@ -7584,7 +7589,7 @@ async function installAgtCliViaNpm(version, reasonLabel) {
7584
7589
  execFileSync4(cmd, args, { timeout: 18e4, stdio: "pipe" });
7585
7590
  } catch (err) {
7586
7591
  log(`[self-update] npm upgrade failed: ${err.message}`);
7587
- return;
7592
+ return "failed";
7588
7593
  }
7589
7594
  let smokeOk = false;
7590
7595
  try {
@@ -7600,13 +7605,14 @@ async function installAgtCliViaNpm(version, reasonLabel) {
7600
7605
  `[self-update] smoke check failed: \`agt --version\` would not run after install (${err.message}). The binary may be dangling; NOT restarting. systemd ExecStartPre will repair on the next start if needed.`
7601
7606
  );
7602
7607
  }
7603
- if (!smokeOk) return;
7608
+ if (!smokeOk) return "failed";
7604
7609
  log(
7605
7610
  `[self-update] agt CLI upgraded to ${version} (${reasonLabel}). Scheduling manager restart so the new binary takes effect.`
7606
7611
  );
7607
7612
  stampLastSelfUpdateApplied(selfUpdateAppliedMarkerPath());
7608
7613
  restartAfterUpgrade = true;
7609
7614
  pendingUpgradeVersion = version;
7615
+ return "updated";
7610
7616
  }
7611
7617
  function isPrereleaseVersion(v) {
7612
7618
  return v.replace(/^v/, "").split("+")[0].includes("-");
@@ -8197,7 +8203,7 @@ async function pollCycle() {
8197
8203
  }
8198
8204
  try {
8199
8205
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
8200
- const { collectDiagnostics } = await import("../persistent-session-VQCCFN4M.js");
8206
+ const { collectDiagnostics } = await import("../persistent-session-SVZCOP7I.js");
8201
8207
  const diagCodeNames = [...agentState.persistentSessionAgents];
8202
8208
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
8203
8209
  let tailscaleHostname;
@@ -8294,26 +8300,31 @@ async function pollCycle() {
8294
8300
  `[self-update] "Update CLI now" requested at ${requestedUpdateAt} \u2014 deferring: a self-update is already in flight. Retrying next poll.`
8295
8301
  );
8296
8302
  } else {
8303
+ log(
8304
+ `[self-update] "Update CLI now" requested at ${requestedUpdateAt} \u2014 running window-bypassing self-update now (host idle).`
8305
+ );
8297
8306
  const prevProcessedAt = state6.lastUpdateRequestProcessedAt ?? null;
8298
- state6.lastUpdateRequestProcessedAt = requestedUpdateAt;
8299
- let persisted = true;
8300
- try {
8301
- atomicWriteFileSync(getStateFile(), JSON.stringify(state6, null, 2));
8302
- } catch (err) {
8303
- persisted = false;
8304
- state6.lastUpdateRequestProcessedAt = prevProcessedAt;
8305
- log(
8306
- `[self-update] failed to persist update-request ack; retrying next heartbeat: ${err.message}`
8307
- );
8308
- }
8309
- if (persisted) {
8307
+ void checkAndUpdateCli({ force: true }).then((outcome) => {
8308
+ if (!shouldConsumeForcedUpdate(outcome)) {
8309
+ log(
8310
+ `[self-update] "Update CLI now" did not complete (no install ran) \u2014 leaving the request pending; the next idle heartbeat retries.`
8311
+ );
8312
+ return;
8313
+ }
8314
+ state6.lastUpdateRequestProcessedAt = requestedUpdateAt;
8315
+ try {
8316
+ atomicWriteFileSync(getStateFile(), JSON.stringify(state6, null, 2));
8317
+ } catch (err) {
8318
+ state6.lastUpdateRequestProcessedAt = prevProcessedAt;
8319
+ log(
8320
+ `[self-update] failed to persist update-request ack; retrying next heartbeat: ${err.message}`
8321
+ );
8322
+ }
8323
+ }).catch((err) => {
8310
8324
  log(
8311
- `[self-update] "Update CLI now" requested at ${requestedUpdateAt} \u2014 running window-bypassing self-update now (host idle).`
8312
- );
8313
- void checkAndUpdateCli({ force: true }).catch(
8314
- (err) => log(`[self-update] forced check failed: ${err.message}`)
8325
+ `[self-update] forced check failed: ${err.message} \u2014 leaving the request pending for retry.`
8315
8326
  );
8316
- }
8327
+ });
8317
8328
  }
8318
8329
  }
8319
8330
  if (hbResp?.feature_flags) {
@@ -8340,7 +8351,7 @@ async function pollCycle() {
8340
8351
  const {
8341
8352
  collectResponsivenessProbes,
8342
8353
  getResponsivenessIntervalMs
8343
- } = await import("../responsiveness-probe-FIXXJ7ZV.js");
8354
+ } = await import("../responsiveness-probe-AS7ASMDE.js");
8344
8355
  const probeIntervalMs = getResponsivenessIntervalMs();
8345
8356
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
8346
8357
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -8372,7 +8383,7 @@ async function pollCycle() {
8372
8383
  collectResponsivenessProbes,
8373
8384
  livePendingInboundOldestAgeSeconds,
8374
8385
  parkPendingInbound
8375
- } = await import("../responsiveness-probe-FIXXJ7ZV.js");
8386
+ } = await import("../responsiveness-probe-AS7ASMDE.js");
8376
8387
  const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
8377
8388
  const wedgeNow = /* @__PURE__ */ new Date();
8378
8389
  const liveAgents = agentState.persistentSessionAgents;
@@ -11921,7 +11932,7 @@ async function processClaudePairSessions(agents) {
11921
11932
  killPairSession,
11922
11933
  pairTmuxSession,
11923
11934
  finalizeClaudePairOnboarding
11924
- } = await import("../claude-pair-runtime-ODRPKNKT.js");
11935
+ } = await import("../claude-pair-runtime-7TJXAPIK.js");
11925
11936
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
11926
11937
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
11927
11938
  const killed = await killPairSession(pairTmuxSession(pairId));