@integrity-labs/agt-cli 0.28.567 → 0.28.569

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.
@@ -46,7 +46,7 @@ import {
46
46
  resolveConnectivityProbe,
47
47
  worseConnectivityOutcome,
48
48
  wrapScheduledTaskPrompt
49
- } from "./chunk-FSWAPB5J.js";
49
+ } from "./chunk-7O2TXBWR.js";
50
50
  import {
51
51
  parsePsRows
52
52
  } from "./chunk-XWVM4KPK.js";
@@ -5646,7 +5646,7 @@ function exchangeFailureKind(err) {
5646
5646
  }
5647
5647
 
5648
5648
  // src/lib/api-client.ts
5649
- var agtCliVersion = true ? "0.28.567" : "dev";
5649
+ var agtCliVersion = true ? "0.28.569" : "dev";
5650
5650
  var lastConfigHash = null;
5651
5651
  function setConfigHash(hash) {
5652
5652
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -9011,4 +9011,4 @@ export {
9011
9011
  managerInstallSystemUnitCommand,
9012
9012
  managerUninstallSystemUnitCommand
9013
9013
  };
9014
- //# sourceMappingURL=chunk-IALXJ6H3.js.map
9014
+ //# sourceMappingURL=chunk-JBOJC6PG.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-DVTSZAPE.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-WUNZJXCI.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-4C5NQQHR.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-XVEJ7XLB.js.map
@@ -53,7 +53,7 @@ import {
53
53
  safeWriteJsonAtomic,
54
54
  setConfigHash,
55
55
  tripClass
56
- } from "../chunk-IALXJ6H3.js";
56
+ } from "../chunk-JBOJC6PG.js";
57
57
  import {
58
58
  getProjectDir as getProjectDir2,
59
59
  getReadyTasks,
@@ -182,7 +182,7 @@ import {
182
182
  toOpencodeModel,
183
183
  transcriptActivityAgeSeconds,
184
184
  writeEgressAllowlist
185
- } from "../chunk-FSWAPB5J.js";
185
+ } from "../chunk-7O2TXBWR.js";
186
186
  import {
187
187
  reapOrphanChannelMcps
188
188
  } from "../chunk-XWVM4KPK.js";
@@ -3833,6 +3833,7 @@ function scanLines(lines, file, opts) {
3833
3833
  return { records: ordered, pending: pending2 };
3834
3834
  }
3835
3835
  var WINDOW_CHUNK_BYTES = 64 * 1024;
3836
+ var WINDOW_BUDGET_BYTES = 4 * 1024 * 1024;
3836
3837
  function extractTranscriptWindow(file, opts, from) {
3837
3838
  let fd;
3838
3839
  try {
@@ -3844,14 +3845,17 @@ function extractTranscriptWindow(file, opts, from) {
3844
3845
  endLine: from.lineOffset,
3845
3846
  unpaired: [],
3846
3847
  missing: true,
3847
- rewound: false
3848
+ rewound: false,
3849
+ truncated: false
3848
3850
  };
3849
3851
  }
3850
3852
  let startByte = from.byteOffset;
3851
3853
  let startLine = from.lineOffset;
3852
3854
  let rewound = false;
3855
+ let fileSize = null;
3853
3856
  try {
3854
3857
  const { size } = fstatSync(fd);
3858
+ fileSize = size;
3855
3859
  if (startByte > size) {
3856
3860
  startByte = 0;
3857
3861
  startLine = 0;
@@ -3859,15 +3863,22 @@ function extractTranscriptWindow(file, opts, from) {
3859
3863
  }
3860
3864
  } catch {
3861
3865
  }
3866
+ const requested = from.budgetBytes;
3867
+ const budget = typeof requested === "number" && Number.isFinite(requested) && requested >= 1 ? Math.floor(requested) : WINDOW_BUDGET_BYTES;
3862
3868
  const decoder = new StringDecoder("utf8");
3863
3869
  const buf = Buffer.allocUnsafe(WINDOW_CHUNK_BYTES);
3864
3870
  let position = startByte;
3865
3871
  let runningByte = startByte;
3866
3872
  let lineOffset = startLine;
3867
3873
  let carry = "";
3874
+ let hitBudget = false;
3868
3875
  const pairs = [];
3869
3876
  try {
3870
3877
  for (; ; ) {
3878
+ if (runningByte - startByte >= budget) {
3879
+ hitBudget = true;
3880
+ break;
3881
+ }
3871
3882
  const bytesRead = readSync(fd, buf, 0, WINDOW_CHUNK_BYTES, position);
3872
3883
  if (bytesRead <= 0) break;
3873
3884
  position += bytesRead;
@@ -3875,11 +3886,18 @@ function extractTranscriptWindow(file, opts, from) {
3875
3886
  let nl;
3876
3887
  while ((nl = carry.indexOf("\n")) !== -1) {
3877
3888
  const line = carry.slice(0, nl);
3889
+ const lineBytes = Buffer.byteLength(line, "utf8") + 1;
3890
+ const consumed = runningByte - startByte;
3891
+ if (consumed > 0 && consumed + lineBytes > budget) {
3892
+ hitBudget = true;
3893
+ break;
3894
+ }
3878
3895
  pairs.push([lineOffset, line, runningByte]);
3879
- runningByte += Buffer.byteLength(line, "utf8") + 1;
3896
+ runningByte += lineBytes;
3880
3897
  lineOffset += 1;
3881
3898
  carry = carry.slice(nl + 1);
3882
3899
  }
3900
+ if (hitBudget) break;
3883
3901
  }
3884
3902
  } catch {
3885
3903
  } finally {
@@ -3894,7 +3912,16 @@ function extractTranscriptWindow(file, opts, from) {
3894
3912
  byteStart: p.byteStart,
3895
3913
  lineOffset: p.record.line_offset
3896
3914
  })).sort((a, b) => a.byteStart - b.byteStart);
3897
- return { records, endByte: runningByte, endLine: lineOffset, unpaired, missing: false, rewound };
3915
+ const truncated = hitBudget && (fileSize === null || runningByte < fileSize);
3916
+ return {
3917
+ records,
3918
+ endByte: runningByte,
3919
+ endLine: lineOffset,
3920
+ unpaired,
3921
+ missing: false,
3922
+ rewound,
3923
+ truncated
3924
+ };
3898
3925
  }
3899
3926
 
3900
3927
  // src/lib/tool-call-cursor.ts
@@ -3965,15 +3992,30 @@ function loadCursors(path) {
3965
3992
  if (!parsed || parsed.version !== 1 || typeof parsed.files !== "object") return out;
3966
3993
  for (const [k, v] of Object.entries(parsed.files)) {
3967
3994
  if (!v || typeof v !== "object") continue;
3968
- const offsetsOk = ["byteOffset", "lineOffset", "startedFromLine", "callsExtracted"].every((f) => {
3995
+ const offsetsOk = [
3996
+ "byteOffset",
3997
+ "lineOffset",
3998
+ "startedFromLine",
3999
+ "startedFromByte",
4000
+ "scannedThroughByte",
4001
+ "scannedThroughLine",
4002
+ "rewindGeneration",
4003
+ "callsExtracted"
4004
+ ].every((f) => {
3969
4005
  const n = v[f];
3970
4006
  return n === void 0 || typeof n === "number" && Number.isSafeInteger(n) && n >= 0;
3971
4007
  });
3972
4008
  if (typeof v.byteOffset !== "number" || typeof v.lineOffset !== "number" || !offsetsOk) continue;
4009
+ const startedFromByte = typeof v.startedFromByte === "number" ? v.startedFromByte : v.byteOffset;
3973
4010
  out.set(k, {
3974
4011
  byteOffset: v.byteOffset,
3975
4012
  lineOffset: v.lineOffset,
3976
4013
  startedFromLine: typeof v.startedFromLine === "number" ? v.startedFromLine : 0,
4014
+ startedFromByte,
4015
+ scannedThroughByte: typeof v.scannedThroughByte === "number" ? v.scannedThroughByte : startedFromByte,
4016
+ scannedThroughLine: typeof v.scannedThroughLine === "number" ? v.scannedThroughLine : typeof v.startedFromLine === "number" ? v.startedFromLine : 0,
4017
+ rewindGeneration: typeof v.rewindGeneration === "number" ? v.rewindGeneration : 0,
4018
+ lastWindowTruncated: v.lastWindowTruncated === true,
3977
4019
  callsExtracted: typeof v.callsExtracted === "number" ? v.callsExtracted : 0,
3978
4020
  unpairedSince: typeof v.unpairedSince === "string" ? v.unpairedSince : null,
3979
4021
  lastDisposition: COVERAGE_DISPOSITIONS.includes(v.lastDisposition) ? v.lastDisposition : "ok",
@@ -3992,22 +4034,47 @@ function saveCursors(path, cursors) {
3992
4034
  atomicWriteFileSync(path, JSON.stringify({ version: 1, files }, null, 2));
3993
4035
  }
3994
4036
  function nextCursor(args) {
3995
- const { previous, endByte, endLine, earliestUnpaired, outcome, nowMs } = args;
4037
+ const { endByte, endLine, earliestUnpaired, outcome, nowMs } = args;
3996
4038
  const nowIso = new Date(nowMs).toISOString();
3997
4039
  const disposition = dispositionFor(outcome);
4040
+ const truncated = args.truncated === true;
4041
+ const previous = args.rewound ? {
4042
+ ...args.previous,
4043
+ byteOffset: 0,
4044
+ lineOffset: 0,
4045
+ scannedThroughByte: 0,
4046
+ scannedThroughLine: 0,
4047
+ startedFromByte: 0,
4048
+ startedFromLine: 0,
4049
+ rewindGeneration: args.previous.rewindGeneration + 1,
4050
+ // The call this was waiting on lived in the old file. Holding its clock
4051
+ // would apply an unrelated deadline to the new one.
4052
+ unpairedSince: null
4053
+ } : args.previous;
3998
4054
  if (!mayAdvance(outcome)) {
3999
- return { ...previous, lastDisposition: disposition, lastScanAt: nowIso };
4055
+ return {
4056
+ ...previous,
4057
+ lastDisposition: disposition,
4058
+ lastScanAt: nowIso,
4059
+ lastWindowTruncated: truncated
4060
+ };
4000
4061
  }
4001
4062
  const callsExtracted = previous.callsExtracted + args.callsExtracted;
4063
+ const covered = (throughByte, throughLine) => ({
4064
+ scannedThroughByte: Math.max(previous.scannedThroughByte, throughByte),
4065
+ scannedThroughLine: Math.max(previous.scannedThroughLine, throughLine)
4066
+ });
4002
4067
  if (!earliestUnpaired) {
4003
4068
  return {
4004
4069
  ...previous,
4005
4070
  byteOffset: endByte,
4006
4071
  lineOffset: endLine,
4072
+ ...covered(endByte, endLine),
4007
4073
  callsExtracted,
4008
4074
  unpairedSince: null,
4009
4075
  lastDisposition: disposition,
4010
- lastScanAt: nowIso
4076
+ lastScanAt: nowIso,
4077
+ lastWindowTruncated: truncated
4011
4078
  };
4012
4079
  }
4013
4080
  const since = previous.unpairedSince ?? nowIso;
@@ -4017,20 +4084,30 @@ function nextCursor(args) {
4017
4084
  ...previous,
4018
4085
  byteOffset: endByte,
4019
4086
  lineOffset: endLine,
4087
+ ...covered(endByte, endLine),
4020
4088
  callsExtracted,
4021
4089
  unpairedSince: null,
4022
4090
  lastDisposition: disposition,
4023
- lastScanAt: nowIso
4091
+ lastScanAt: nowIso,
4092
+ lastWindowTruncated: truncated
4024
4093
  };
4025
4094
  }
4095
+ const resumeByte = Math.max(previous.byteOffset, Math.min(endByte, earliestUnpaired.byteStart));
4096
+ const resumeLine = Math.max(previous.lineOffset, Math.min(endLine, earliestUnpaired.lineOffset));
4026
4097
  return {
4027
4098
  ...previous,
4028
- byteOffset: Math.max(previous.byteOffset, Math.min(endByte, earliestUnpaired.byteStart)),
4029
- lineOffset: Math.max(previous.lineOffset, Math.min(endLine, earliestUnpaired.lineOffset)),
4099
+ byteOffset: resumeByte,
4100
+ lineOffset: resumeLine,
4101
+ // Covered ground stops at the unpaired call: the calls from there on were
4102
+ // deliberately NOT sent (their `is_error` would be written null and
4103
+ // `ignoreDuplicates` makes that permanent), so claiming them would be
4104
+ // claiming rows the control plane has never been offered.
4105
+ ...covered(resumeByte, resumeLine),
4030
4106
  callsExtracted,
4031
4107
  unpairedSince: since,
4032
4108
  lastDisposition: disposition,
4033
- lastScanAt: nowIso
4109
+ lastScanAt: nowIso,
4110
+ lastWindowTruncated: truncated
4034
4111
  };
4035
4112
  }
4036
4113
  function initialCursor(args) {
@@ -4038,7 +4115,12 @@ function initialCursor(args) {
4038
4115
  return {
4039
4116
  byteOffset: args.startByte,
4040
4117
  lineOffset: args.startLine,
4118
+ scannedThroughByte: args.startByte,
4119
+ scannedThroughLine: args.startLine,
4041
4120
  startedFromLine: args.startLine,
4121
+ startedFromByte: args.startByte,
4122
+ rewindGeneration: 0,
4123
+ lastWindowTruncated: false,
4042
4124
  callsExtracted: 0,
4043
4125
  unpairedSince: null,
4044
4126
  lastDisposition: "ok",
@@ -4053,9 +4135,14 @@ function coverageRowFor(key, cursor, versions) {
4053
4135
  session_id: sessionId,
4054
4136
  transcript_ref: transcriptRef,
4055
4137
  transcript_rel_path: cursor.transcriptRelPath,
4056
- through_line: cursor.lineOffset,
4057
- through_byte: cursor.byteOffset,
4138
+ through_line: cursor.scannedThroughLine,
4139
+ through_byte: cursor.scannedThroughByte,
4058
4140
  started_from_line: cursor.startedFromLine,
4141
+ started_from_byte: cursor.startedFromByte,
4142
+ scan_position_byte: cursor.byteOffset,
4143
+ scan_position_line: cursor.lineOffset,
4144
+ scan_window_truncated: cursor.lastWindowTruncated,
4145
+ rewind_generation: cursor.rewindGeneration,
4059
4146
  calls_extracted: cursor.callsExtracted,
4060
4147
  last_disposition: cursor.lastDisposition,
4061
4148
  extractor_version: versions.extractor,
@@ -4150,7 +4237,8 @@ async function scanAgentToolCalls(args) {
4150
4237
  }
4151
4238
  const window = extractTranscriptWindow(file, extractOpts, {
4152
4239
  byteOffset: cursor.byteOffset,
4153
- lineOffset: cursor.lineOffset
4240
+ lineOffset: cursor.lineOffset,
4241
+ ...args.windowBudgetBytes === void 0 ? {} : { budgetBytes: args.windowBudgetBytes }
4154
4242
  });
4155
4243
  summary.filesScanned += 1;
4156
4244
  if (window.missing) {
@@ -4161,6 +4249,11 @@ async function scanAgentToolCalls(args) {
4161
4249
  if (window.rewound) {
4162
4250
  log2(`[tool-call-scan] ${file.relPath} ref=${file.ref} shrank below the cursor \u2014 re-reading from 0`);
4163
4251
  }
4252
+ if (window.truncated) {
4253
+ log2(
4254
+ `[tool-call-scan] ${file.relPath} ref=${file.ref} hit the window budget at byte ${window.endByte} \u2014 more remains, resuming next tick`
4255
+ );
4256
+ }
4164
4257
  summary.callsExtracted += window.records.length;
4165
4258
  const unpairedIds = new Set(window.unpaired.map((u) => u.toolUseId));
4166
4259
  const sendable = window.records.filter((r) => !unpairedIds.has(r.tool_use_id));
@@ -4183,7 +4276,9 @@ async function scanAgentToolCalls(args) {
4183
4276
  earliestUnpaired: window.unpaired[0] ?? null,
4184
4277
  outcome,
4185
4278
  callsExtracted: sendable.length,
4186
- nowMs: now()
4279
+ nowMs: now(),
4280
+ rewound: window.rewound,
4281
+ truncated: window.truncated
4187
4282
  });
4188
4283
  const advanced = attempted ? computed : { ...computed, lastDisposition: cursor.lastDisposition };
4189
4284
  if (advanced.byteOffset === cursor.byteOffset && outcome.kind === "ingest_failed") {
@@ -11390,7 +11485,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
11390
11485
  var lastVersionCheckAt = 0;
11391
11486
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
11392
11487
  var lastResponsivenessProbeAt = 0;
11393
- var agtCliVersion = true ? "0.28.567" : "dev";
11488
+ var agtCliVersion = true ? "0.28.569" : "dev";
11394
11489
  function resolveBrewPath(execFileSync2) {
11395
11490
  try {
11396
11491
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -12697,7 +12792,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
12697
12792
  if (codeNames.length === 0) return;
12698
12793
  void (async () => {
12699
12794
  try {
12700
- const { collectDiagnostics } = await import("../persistent-session-DVTSZAPE.js");
12795
+ const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
12701
12796
  await api.post("/host/heartbeat", {
12702
12797
  host_id: hostId,
12703
12798
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics)
@@ -12805,7 +12900,7 @@ async function pollCycle() {
12805
12900
  }
12806
12901
  try {
12807
12902
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
12808
- const { collectDiagnostics } = await import("../persistent-session-DVTSZAPE.js");
12903
+ const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
12809
12904
  const diagCodeNames = [...agentState.persistentSessionAgents];
12810
12905
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics) : void 0;
12811
12906
  let tailscaleHostname;
@@ -12928,7 +13023,7 @@ async function pollCycle() {
12928
13023
  collectPanelessActivityProbes,
12929
13024
  getResponsivenessIntervalMs,
12930
13025
  occupancyQualificationClassifications
12931
- } = await import("../responsiveness-probe-KEFPJXQ6.js");
13026
+ } = await import("../responsiveness-probe-V3P5TGBH.js");
12932
13027
  const probeIntervalMs = getResponsivenessIntervalMs();
12933
13028
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
12934
13029
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -13019,7 +13114,7 @@ async function pollCycle() {
13019
13114
  collectResponsivenessProbes,
13020
13115
  livePendingInboundOldestAgeSeconds,
13021
13116
  parkPendingInbound
13022
- } = await import("../responsiveness-probe-KEFPJXQ6.js");
13117
+ } = await import("../responsiveness-probe-V3P5TGBH.js");
13023
13118
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
13024
13119
  const wedgeNow = /* @__PURE__ */ new Date();
13025
13120
  const liveAgents = agentState.persistentSessionAgents;
@@ -15649,7 +15744,7 @@ async function processAgent(agent, agentStates) {
15649
15744
  if (newlyDone.length > 0) {
15650
15745
  const displayName = agentState.agentDisplayNames.get(agent.code_name) ?? agent.code_name;
15651
15746
  for (const item of newlyDone) {
15652
- log(`Newly done: '${item.title}' notify_channel=${item.notify_channel ?? "none"} notify_to=${item.notify_to ?? "none"}`);
15747
+ log(`Newly done: item_id=${item.id} notify_channel=${item.notify_channel ?? "none"} notify_to=${item.notify_to ?? "none"}`);
15653
15748
  if (item.notify_channel && item.notify_to) {
15654
15749
  const message = await buildDoneCardNotification(agentId, agent.code_name, displayName, item);
15655
15750
  sendTaskNotification(agent.code_name, item.notify_channel, item.notify_to, message).catch((err) => {
@@ -15715,11 +15810,11 @@ async function processAgent(agent, agentStates) {
15715
15810
  const stuckKey = `${agent.code_name}:${item.id}`;
15716
15811
  if (!stuckKanbanLogged.has(stuckKey)) {
15717
15812
  log(
15718
- `[persistent-session-stuck-kanban] agent=${agent.code_name} item_id=${item.id} title=${JSON.stringify(item.title)} status=in_progress age_minutes=${age} threshold_minutes=${Math.round(STALE_TASK_THRESHOLD_MS / 6e4)}`
15813
+ `[persistent-session-stuck-kanban] agent=${agent.code_name} item_id=${item.id} status=in_progress age_minutes=${age} threshold_minutes=${Math.round(STALE_TASK_THRESHOLD_MS / 6e4)}`
15719
15814
  );
15720
15815
  stuckKanbanLogged.add(stuckKey);
15721
15816
  }
15722
- log(`Stale task: '${item.title}' (id=${item.id}) in_progress for ${age}m \u2014 reaping for '${agent.code_name}'`);
15817
+ log(`Stale task: item_id=${item.id} in_progress for ${age}m \u2014 reaping for '${agent.code_name}'`);
15723
15818
  alertedStaleItems.add(`${agent.code_name}:${item.id}`);
15724
15819
  let reapAction = null;
15725
15820
  try {
@@ -15730,13 +15825,14 @@ async function processAgent(agent, agentStates) {
15730
15825
  });
15731
15826
  reapAction = reapResult.action ?? null;
15732
15827
  log(
15733
- `Reap result for '${item.title}': updated=${reapResult.updated} action=${reapResult.action ?? reapResult.reason ?? "none"}`
15828
+ `Reap result for item_id=${item.id}: updated=${reapResult.updated} action=${reapResult.action ?? reapResult.reason ?? "none"}`
15734
15829
  );
15735
15830
  if (reapAction === "dead_letter" && ((reapResult.updated ?? 0) > 0 || reapResult.ok === true)) {
15736
15831
  freshDoneIds.add(item.id);
15737
15832
  }
15738
15833
  } catch (err) {
15739
- log(`Reap API error for '${item.title}': ${err.message}`);
15834
+ const errId = createHash17("sha256").update(err instanceof Error ? err.message : String(err)).digest("hex").slice(0, 12);
15835
+ log(`Reap API error for item_id=${item.id} error_id=${errId}`);
15740
15836
  }
15741
15837
  if (reapAction === "dead_letter") {
15742
15838
  const message = `\u26A0\uFE0F Task Stalled \u2014 ${displayName}
@@ -16577,7 +16673,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
16577
16673
  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}`));
16578
16674
  void (async () => {
16579
16675
  try {
16580
- const { collectDiagnostics } = await import("../persistent-session-DVTSZAPE.js");
16676
+ const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
16581
16677
  await api.post("/host/heartbeat", {
16582
16678
  host_id: hostId,
16583
16679
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics)
@@ -16628,7 +16724,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
16628
16724
  }
16629
16725
  try {
16630
16726
  const hostId = await getHostId();
16631
- const { collectDiagnostics } = await import("../persistent-session-DVTSZAPE.js");
16727
+ const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
16632
16728
  await api.post("/host/heartbeat", {
16633
16729
  host_id: hostId,
16634
16730
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics)
@@ -17206,7 +17302,7 @@ async function processClaudePairSessions(agents) {
17206
17302
  killPairSession,
17207
17303
  pairTmuxSession,
17208
17304
  finalizeClaudePairOnboarding
17209
- } = await import("../claude-pair-runtime-4C5NQQHR.js");
17305
+ } = await import("../claude-pair-runtime-XVEJ7XLB.js");
17210
17306
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
17211
17307
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
17212
17308
  const killed = await killPairSession(pairTmuxSession(pairId));