@integrity-labs/agt-cli 0.28.385 → 0.28.386

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.
@@ -25,7 +25,7 @@ import {
25
25
  resolveConnectivityProbe,
26
26
  worseConnectivityOutcome,
27
27
  wrapScheduledTaskPrompt
28
- } from "./chunk-MQHDPJZD.js";
28
+ } from "./chunk-LAO2CUZU.js";
29
29
  import {
30
30
  parsePsRows
31
31
  } from "./chunk-XWVM4KPK.js";
@@ -6184,7 +6184,7 @@ function requireHost() {
6184
6184
  }
6185
6185
 
6186
6186
  // src/lib/api-client.ts
6187
- var agtCliVersion = true ? "0.28.385" : "dev";
6187
+ var agtCliVersion = true ? "0.28.386" : "dev";
6188
6188
  var lastConfigHash = null;
6189
6189
  function setConfigHash(hash) {
6190
6190
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -8638,4 +8638,4 @@ export {
8638
8638
  managerInstallSystemUnitCommand,
8639
8639
  managerUninstallSystemUnitCommand
8640
8640
  };
8641
- //# sourceMappingURL=chunk-P3SY6KTF.js.map
8641
+ //# sourceMappingURL=chunk-O37EMHVE.js.map
@@ -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-MDQVHXKX.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-KQHWYEQF.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-OIK6HKPS.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-NVMVUAGS.js.map
@@ -43,7 +43,7 @@ import {
43
43
  resolveEffectivePinRaw,
44
44
  safeWriteJsonAtomic,
45
45
  setConfigHash
46
- } from "../chunk-P3SY6KTF.js";
46
+ } from "../chunk-O37EMHVE.js";
47
47
  import {
48
48
  getProjectDir as getProjectDir2,
49
49
  getReadyTasks,
@@ -145,7 +145,7 @@ import {
145
145
  toOpencodeModel,
146
146
  transcriptActivityAgeSeconds,
147
147
  writeEgressAllowlist
148
- } from "../chunk-MQHDPJZD.js";
148
+ } from "../chunk-LAO2CUZU.js";
149
149
  import {
150
150
  reapOrphanChannelMcps
151
151
  } from "../chunk-XWVM4KPK.js";
@@ -725,6 +725,24 @@ var ChannelQuarantineStore = class {
725
725
  const forAgent = this.load()[codeName];
726
726
  return new Set(forAgent ? Object.keys(forAgent) : []);
727
727
  }
728
+ /**
729
+ * ENG-8018: the full quarantine entries for `codeName` (serverKey → {reason,
730
+ * quarantinedAt}), empty array if none. Unlike {@link getQuarantinedKeys} this
731
+ * carries the reason + timestamp needed to surface the quarantine to the
732
+ * control plane (the manager folds it into the agent heartbeat's diagnostics)
733
+ * and to the agent itself, so an operator sees WHY/WHEN on the webapp badge
734
+ * and the agent reports the real cause instead of confabulating one (ENG-8003).
735
+ * Returns a defensive copy so callers can't mutate the cached store.
736
+ */
737
+ getQuarantineEntries(codeName) {
738
+ const forAgent = this.load()[codeName];
739
+ if (!forAgent) return [];
740
+ return Object.entries(forAgent).map(([serverKey, entry]) => ({
741
+ serverKey,
742
+ reason: entry.reason,
743
+ quarantinedAt: entry.quarantinedAt
744
+ }));
745
+ }
728
746
  /**
729
747
  * Mark `serverKey` quarantined for `codeName`. Idempotent — re-quarantining
730
748
  * an already-quarantined key preserves the original `quarantinedAt` (so the
@@ -9095,7 +9113,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
9095
9113
  var lastVersionCheckAt = 0;
9096
9114
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
9097
9115
  var lastResponsivenessProbeAt = 0;
9098
- var agtCliVersion = true ? "0.28.385" : "dev";
9116
+ var agtCliVersion = true ? "0.28.386" : "dev";
9099
9117
  function resolveBrewPath(execFileSync2) {
9100
9118
  try {
9101
9119
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -10085,6 +10103,9 @@ function channelQuarantineStore() {
10085
10103
  }
10086
10104
  return _channelQuarantineStore;
10087
10105
  }
10106
+ function quarantineEntriesFor(codeName) {
10107
+ return channelQuarantineStore().getQuarantineEntries(codeName);
10108
+ }
10088
10109
  var _hostFlagStore = null;
10089
10110
  function hostFlagStore() {
10090
10111
  if (!_hostFlagStore) {
@@ -10224,10 +10245,10 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
10224
10245
  if (codeNames.length === 0) return;
10225
10246
  void (async () => {
10226
10247
  try {
10227
- const { collectDiagnostics } = await import("../persistent-session-MDQVHXKX.js");
10248
+ const { collectDiagnostics } = await import("../persistent-session-KQHWYEQF.js");
10228
10249
  await api.post("/host/heartbeat", {
10229
10250
  host_id: hostId,
10230
- agent_diagnostics: collectDiagnostics(codeNames)
10251
+ agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor)
10231
10252
  });
10232
10253
  } catch (err) {
10233
10254
  log(`[restart] post-respawn diagnostics flush failed: ${err.message}`);
@@ -10323,9 +10344,9 @@ async function pollCycle() {
10323
10344
  }
10324
10345
  try {
10325
10346
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
10326
- const { collectDiagnostics } = await import("../persistent-session-MDQVHXKX.js");
10347
+ const { collectDiagnostics } = await import("../persistent-session-KQHWYEQF.js");
10327
10348
  const diagCodeNames = [...agentState.persistentSessionAgents];
10328
- const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
10349
+ const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor) : void 0;
10329
10350
  let tailscaleHostname;
10330
10351
  try {
10331
10352
  const { execSync: es } = await import("child_process");
@@ -10478,7 +10499,7 @@ async function pollCycle() {
10478
10499
  const {
10479
10500
  collectResponsivenessProbes,
10480
10501
  getResponsivenessIntervalMs
10481
- } = await import("../responsiveness-probe-CG7XM7GL.js");
10502
+ } = await import("../responsiveness-probe-5X6WVKUZ.js");
10482
10503
  const probeIntervalMs = getResponsivenessIntervalMs();
10483
10504
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
10484
10505
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -10510,7 +10531,7 @@ async function pollCycle() {
10510
10531
  collectResponsivenessProbes,
10511
10532
  livePendingInboundOldestAgeSeconds,
10512
10533
  parkPendingInbound
10513
- } = await import("../responsiveness-probe-CG7XM7GL.js");
10534
+ } = await import("../responsiveness-probe-5X6WVKUZ.js");
10514
10535
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-HYOOQV4A.js");
10515
10536
  const wedgeNow = /* @__PURE__ */ new Date();
10516
10537
  const liveAgents = agentState.persistentSessionAgents;
@@ -12854,6 +12875,14 @@ async function processAgent(agent, agentStates) {
12854
12875
  "quarantine",
12855
12876
  `optional channel '${serverKey}' dead past restart budget + dwell \u2014 quarantined`
12856
12877
  );
12878
+ void injectMessage(
12879
+ codeName,
12880
+ "system",
12881
+ `Your "${serverKey}" channel has been quarantined by the host runtime: it repeatedly failed to start (no live MCP process) past the recovery budget, so it has been pulled from your active channel set. You cannot send or receive on ${serverKey} until an operator re-enables it. This is an infrastructure fault, not a policy or allowlist decision. If anyone asks why you are quiet on ${serverKey}, tell them the channel is quarantined and ask them to have an operator re-enable it. Do not guess at other causes.`,
12882
+ { task_name: "channel-quarantine" },
12883
+ log
12884
+ ).catch(() => {
12885
+ });
12857
12886
  }
12858
12887
  }
12859
12888
  });
@@ -13713,10 +13742,10 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
13713
13742
  void api.post("/host/restart-ack", { host_id: hostId, agent_id: agentId, restart_requested_at: requestedAt }).catch((err) => log(`[restart-lane] ack failed for '${codeName}': ${err.message}`));
13714
13743
  void (async () => {
13715
13744
  try {
13716
- const { collectDiagnostics } = await import("../persistent-session-MDQVHXKX.js");
13745
+ const { collectDiagnostics } = await import("../persistent-session-KQHWYEQF.js");
13717
13746
  await api.post("/host/heartbeat", {
13718
13747
  host_id: hostId,
13719
- agent_diagnostics: collectDiagnostics([codeName])
13748
+ agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor)
13720
13749
  });
13721
13750
  } catch (err) {
13722
13751
  log(`[restart-lane] post-respawn diagnostics flush failed for '${codeName}': ${err.message}`);
@@ -13763,10 +13792,10 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
13763
13792
  }
13764
13793
  try {
13765
13794
  const hostId = await getHostId();
13766
- const { collectDiagnostics } = await import("../persistent-session-MDQVHXKX.js");
13795
+ const { collectDiagnostics } = await import("../persistent-session-KQHWYEQF.js");
13767
13796
  await api.post("/host/heartbeat", {
13768
13797
  host_id: hostId,
13769
- agent_diagnostics: collectDiagnostics([codeName])
13798
+ agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor)
13770
13799
  });
13771
13800
  } catch (err) {
13772
13801
  log(`[fast-mcp-respawn] post-respawn diagnostics flush failed for '${codeName}': ${err.message}`);
@@ -14216,7 +14245,7 @@ async function processClaudePairSessions(agents) {
14216
14245
  killPairSession,
14217
14246
  pairTmuxSession,
14218
14247
  finalizeClaudePairOnboarding
14219
- } = await import("../claude-pair-runtime-OIK6HKPS.js");
14248
+ } = await import("../claude-pair-runtime-NVMVUAGS.js");
14220
14249
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
14221
14250
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
14222
14251
  const killed = await killPairSession(pairTmuxSession(pairId));