@integrity-labs/agt-cli 0.28.645 → 0.28.647

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.
@@ -16,7 +16,7 @@ import {
16
16
  rotateDailySession,
17
17
  sessionFileExists,
18
18
  todayLocalIso
19
- } from "./chunk-2MDR3ZHP.js";
19
+ } from "./chunk-3ZK66WZZ.js";
20
20
  import {
21
21
  reapOrphanChannelMcps
22
22
  } from "./chunk-XWVM4KPK.js";
@@ -4313,4 +4313,4 @@ export {
4313
4313
  stopAllSessionsAndWait,
4314
4314
  getProjectDir
4315
4315
  };
4316
- //# sourceMappingURL=chunk-Z2SA7JLD.js.map
4316
+ //# sourceMappingURL=chunk-PJSEFPIS.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-ZXOO6LYN.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-KMPIHBCE.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-YA5QHYHF.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-56Z3MRYQ.js.map
@@ -55,7 +55,7 @@ import {
55
55
  safeWriteJsonAtomic,
56
56
  setConfigHash,
57
57
  tripClass
58
- } from "../chunk-T47HZECK.js";
58
+ } from "../chunk-3WJXUNQH.js";
59
59
  import {
60
60
  getProjectDir as getProjectDir2,
61
61
  getReadyTasks,
@@ -111,7 +111,7 @@ import {
111
111
  takeZombieDetection,
112
112
  toOpencodeModel,
113
113
  writeEgressAllowlist
114
- } from "../chunk-Z2SA7JLD.js";
114
+ } from "../chunk-PJSEFPIS.js";
115
115
  import {
116
116
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
117
117
  AnchorSessionClient,
@@ -146,6 +146,7 @@ import {
146
146
  estimateActiveTasksTokens,
147
147
  extractFrontmatter,
148
148
  extractQualifyingTurns,
149
+ extractToolCallEvents,
149
150
  findRunMarker,
150
151
  forcedUpdatePendingForMs,
151
152
  formatActorId,
@@ -156,6 +157,8 @@ import {
156
157
  isAgentIdle,
157
158
  isAgentTimezoneOverrideExpired,
158
159
  isBareAck,
160
+ isBucketInBracket,
161
+ isBucketInOpenCall,
159
162
  isBucketQualified,
160
163
  isControlPlaneOnlyConfigKey,
161
164
  isControlPlaneOnlyEnvVar,
@@ -172,6 +175,7 @@ import {
172
175
  isVacuousDeliverReason,
173
176
  laneTagFragment,
174
177
  minutesSinceLocalMidnight,
178
+ pairToolCallBrackets,
175
179
  parseDeliverAssertion,
176
180
  parseDeliveryTarget,
177
181
  parseTranscriptUsage,
@@ -188,7 +192,7 @@ import {
188
192
  subagentActivityAgeSeconds,
189
193
  sumTranscriptUsageInWindow,
190
194
  transcriptActivityAgeSeconds
191
- } from "../chunk-2MDR3ZHP.js";
195
+ } from "../chunk-3ZK66WZZ.js";
192
196
  import {
193
197
  reapOrphanChannelMcps
194
198
  } from "../chunk-XWVM4KPK.js";
@@ -7508,8 +7512,10 @@ function rostersMeasuredZero(mode, attested, runtimeRunning) {
7508
7512
  var TAIL_BYTES = 256 * 1024;
7509
7513
  var MAX_RECORD_ALIGN_BYTES = 8 * 1024 * 1024;
7510
7514
  var GATE_MAX_BUCKET_AGE_MS = 30 * 6e4;
7515
+ var MAX_BRACKET_DEFERRAL_MS = 25 * 6e4;
7511
7516
  var TRANSCRIPT_MTIME_WINDOW_MS4 = GATE_MAX_BUCKET_AGE_MS + DEFAULT_NEIGHBOURHOOD_MS + 6e4;
7512
7517
  var cache2 = /* @__PURE__ */ new Map();
7518
+ var brackets = /* @__PURE__ */ new Map();
7513
7519
  function readAlignedTail(path, tailBytes, maxAlignBytes) {
7514
7520
  let fd = null;
7515
7521
  try {
@@ -7607,6 +7613,37 @@ function candidateTranscriptPaths(dir) {
7607
7613
  }
7608
7614
  return { paths, complete };
7609
7615
  }
7616
+ function foldToolCallBrackets(codeName, eventsByPath, nowMs) {
7617
+ const state8 = brackets.get(codeName) ?? {
7618
+ open: /* @__PURE__ */ new Map(),
7619
+ closed: []
7620
+ };
7621
+ const nextOpen = /* @__PURE__ */ new Map();
7622
+ const openOut = [];
7623
+ const paths = /* @__PURE__ */ new Set([...state8.open.keys(), ...eventsByPath.keys()]);
7624
+ for (const path of paths) {
7625
+ const carried = state8.open.get(path) ?? [];
7626
+ const paired = pairToolCallBrackets(eventsByPath.get(path) ?? [], carried);
7627
+ state8.closed.push(...paired.brackets);
7628
+ const live = paired.open.filter((c) => nowMs - c.startMs <= MAX_BRACKET_DEFERRAL_MS);
7629
+ if (live.length > 0) {
7630
+ nextOpen.set(path, live);
7631
+ openOut.push(...live);
7632
+ }
7633
+ }
7634
+ const keepFrom = nowMs - GATE_MAX_BUCKET_AGE_MS;
7635
+ const seen = /* @__PURE__ */ new Set();
7636
+ const closed = [];
7637
+ for (const b of state8.closed) {
7638
+ if (b.endMs < keepFrom) continue;
7639
+ const key = `${b.id}\0${b.startMs}\0${b.endMs}`;
7640
+ if (seen.has(key)) continue;
7641
+ seen.add(key);
7642
+ closed.push(b);
7643
+ }
7644
+ brackets.set(codeName, { open: nextOpen, closed });
7645
+ return { toolCallBrackets: closed, openToolCalls: openOut };
7646
+ }
7610
7647
  function collectQualifyingTurns(codeName, nowMs, opts = {}) {
7611
7648
  const dir = opts.transcriptDir ?? sessionTranscriptDir(getProjectDir(codeName));
7612
7649
  const tailBytes = opts.tailBytes ?? TAIL_BYTES;
@@ -7615,6 +7652,7 @@ function collectQualifyingTurns(codeName, nowMs, opts = {}) {
7615
7652
  const agentCache = cache2.get(codeName) ?? /* @__PURE__ */ new Map();
7616
7653
  const nextCache = /* @__PURE__ */ new Map();
7617
7654
  const all = /* @__PURE__ */ new Set();
7655
+ const eventsByPath = /* @__PURE__ */ new Map();
7618
7656
  let transcriptsRead = 0;
7619
7657
  let coveredFromMs = Number.NEGATIVE_INFINITY;
7620
7658
  const raiseCoverageFloor = (floor) => {
@@ -7638,6 +7676,7 @@ function collectQualifyingTurns(codeName, nowMs, opts = {}) {
7638
7676
  nextCache.set(path, seen);
7639
7677
  for (const t of seen.turns) all.add(t);
7640
7678
  raiseCoverageFloor(seen.coverageFloorMs);
7679
+ eventsByPath.set(path, seen.events);
7641
7680
  continue;
7642
7681
  }
7643
7682
  const aligned = readAlignedTail(path, tailBytes, maxAlignBytes);
@@ -7656,21 +7695,34 @@ function collectQualifyingTurns(codeName, nowMs, opts = {}) {
7656
7695
  raiseCoverageFloor(coverageFloorMs);
7657
7696
  transcriptsRead += 1;
7658
7697
  const turns = extractQualifyingTurns(content, { startMs: sinceMs });
7698
+ const events = extractToolCallEvents(content);
7699
+ eventsByPath.set(path, events);
7659
7700
  if (!floorUnknown) {
7660
- nextCache.set(path, { mtimeMs: st.mtimeMs, size: st.size, turns, coverageFloorMs });
7701
+ nextCache.set(path, { mtimeMs: st.mtimeMs, size: st.size, turns, coverageFloorMs, events });
7661
7702
  }
7662
7703
  for (const t of turns) all.add(t);
7663
7704
  }
7664
7705
  cache2.set(codeName, nextCache);
7665
- return { turns: [...all].sort((a, b) => a - b), transcriptsRead, complete, coveredFromMs };
7706
+ const { toolCallBrackets, openToolCalls } = foldToolCallBrackets(codeName, eventsByPath, nowMs);
7707
+ return {
7708
+ turns: [...all].sort((a, b) => a - b),
7709
+ transcriptsRead,
7710
+ complete,
7711
+ coveredFromMs,
7712
+ toolCallBrackets,
7713
+ openToolCalls
7714
+ };
7666
7715
  }
7667
7716
  function qualifyBuckets(buckets, qualifying, mode, nowMs, neighbourhoodMs = DEFAULT_NEIGHBOURHOOD_MS) {
7668
7717
  const failOpen = !qualifying.complete;
7669
7718
  const kept = [];
7719
+ const deferred = [];
7670
7720
  let qualified = 0;
7671
7721
  let unqualifiedDropped = 0;
7672
7722
  let unreadable = 0;
7673
7723
  let coverageShortfall = 0;
7724
+ let qualifiedByBracket = 0;
7725
+ let bracketDeferred = 0;
7674
7726
  for (const b of buckets) {
7675
7727
  const startMs = Date.parse(b.bucket);
7676
7728
  const parsed = Number.isFinite(startMs);
@@ -7685,15 +7737,35 @@ function qualifyBuckets(buckets, qualifying, mode, nowMs, neighbourhoodMs = DEFA
7685
7737
  kept.push(b);
7686
7738
  continue;
7687
7739
  }
7740
+ if (isBucketInBracket(startMs, qualifying.toolCallBrackets)) {
7741
+ qualifiedByBracket += 1;
7742
+ kept.push(b);
7743
+ continue;
7744
+ }
7688
7745
  if (startMs - neighbourhoodMs < qualifying.coveredFromMs) {
7689
7746
  coverageShortfall += 1;
7690
7747
  kept.push(b);
7691
7748
  continue;
7692
7749
  }
7750
+ if (nowMs - startMs <= MAX_BRACKET_DEFERRAL_MS && isBucketInOpenCall(startMs, qualifying.openToolCalls)) {
7751
+ bracketDeferred += 1;
7752
+ if (mode === "shadow") kept.push(b);
7753
+ else deferred.push(b);
7754
+ continue;
7755
+ }
7693
7756
  unqualifiedDropped += 1;
7694
7757
  if (mode === "shadow") kept.push(b);
7695
7758
  }
7696
- return { kept, qualified, unqualifiedDropped, unreadable, coverageShortfall };
7759
+ return {
7760
+ kept,
7761
+ qualified,
7762
+ unqualifiedDropped,
7763
+ unreadable,
7764
+ coverageShortfall,
7765
+ qualifiedByBracket,
7766
+ bracketDeferred,
7767
+ deferred
7768
+ };
7697
7769
  }
7698
7770
 
7699
7771
  // src/lib/pane-occupancy-sampler.ts
@@ -11535,7 +11607,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
11535
11607
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
11536
11608
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
11537
11609
  async function channelInboundActivityAgeSecondsFor(codeName) {
11538
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-RQCDK5LF.js");
11610
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-24SNN4ZH.js");
11539
11611
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
11540
11612
  if (newest === null) return null;
11541
11613
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -12178,7 +12250,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
12178
12250
  var lastVersionCheckAt = 0;
12179
12251
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
12180
12252
  var lastResponsivenessProbeAt = 0;
12181
- var agtCliVersion = true ? "0.28.645" : "dev";
12253
+ var agtCliVersion = true ? "0.28.647" : "dev";
12182
12254
  function resolveBrewPath(execFileSync3) {
12183
12255
  try {
12184
12256
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -12691,6 +12763,7 @@ var selfUpdatePinInvalidLogged = false;
12691
12763
  var restartAfterUpgrade = false;
12692
12764
  var pendingUpgradeVersion = null;
12693
12765
  var selfUpdateInFlight = false;
12766
+ var upgradeRestartInitiated = false;
12694
12767
  var cachedUpdateRequestedAt = null;
12695
12768
  var forcedUpdateDeferStreak = 0;
12696
12769
  var forcedUpdateRelaxAnnounced = false;
@@ -13485,7 +13558,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
13485
13558
  if (codeNames.length === 0) return;
13486
13559
  void (async () => {
13487
13560
  try {
13488
- const { collectDiagnostics } = await import("../persistent-session-ZXOO6LYN.js");
13561
+ const { collectDiagnostics } = await import("../persistent-session-KMPIHBCE.js");
13489
13562
  await api.post("/host/heartbeat", {
13490
13563
  host_id: hostId,
13491
13564
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -13601,7 +13674,7 @@ async function pollCycleInner() {
13601
13674
  }
13602
13675
  try {
13603
13676
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
13604
- const { collectDiagnostics } = await import("../persistent-session-ZXOO6LYN.js");
13677
+ const { collectDiagnostics } = await import("../persistent-session-KMPIHBCE.js");
13605
13678
  const diagCodeNames = [...agentState.persistentSessionAgents];
13606
13679
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
13607
13680
  let tailscaleHostname;
@@ -13724,7 +13797,7 @@ async function pollCycleInner() {
13724
13797
  collectPanelessActivityProbes,
13725
13798
  getResponsivenessIntervalMs,
13726
13799
  occupancyQualificationClassifications
13727
- } = await import("../responsiveness-probe-RQCDK5LF.js");
13800
+ } = await import("../responsiveness-probe-24SNN4ZH.js");
13728
13801
  const probeIntervalMs = getResponsivenessIntervalMs();
13729
13802
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
13730
13803
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -13768,9 +13841,13 @@ async function pollCycleInner() {
13768
13841
  qualified: 0,
13769
13842
  unqualifiedDropped: 0,
13770
13843
  unreadable: raw.length,
13771
- coverageShortfall: 0
13844
+ coverageShortfall: 0,
13845
+ qualifiedByBracket: 0,
13846
+ bracketDeferred: 0,
13847
+ deferred: []
13772
13848
  };
13773
13849
  }
13850
+ if (q.deferred.length > 0) sharedBusyBuckets.credit(codeName, q.deferred);
13774
13851
  if (q.kept.length > 0) drainedBuckets.set(codeName, q.kept);
13775
13852
  return {
13776
13853
  buckets: q.kept,
@@ -13830,7 +13907,7 @@ async function pollCycleInner() {
13830
13907
  collectResponsivenessProbes,
13831
13908
  livePendingInboundOldestAgeSeconds,
13832
13909
  parkPendingInbound
13833
- } = await import("../responsiveness-probe-RQCDK5LF.js");
13910
+ } = await import("../responsiveness-probe-24SNN4ZH.js");
13834
13911
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
13835
13912
  const wedgeNow = /* @__PURE__ */ new Date();
13836
13913
  const liveAgents = agentState.persistentSessionAgents;
@@ -13986,7 +14063,7 @@ async function pollCycleInner() {
13986
14063
  }
13987
14064
  try {
13988
14065
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
13989
- const { probeSessionAuth } = await import("../session-auth-dead-DPY5S3RZ.js");
14066
+ const { probeSessionAuth } = await import("../session-auth-dead-EB2WYA52.js");
13990
14067
  const observations = [];
13991
14068
  const pendingCacheCommits = [];
13992
14069
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -17619,7 +17696,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
17619
17696
  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}`));
17620
17697
  void (async () => {
17621
17698
  try {
17622
- const { collectDiagnostics } = await import("../persistent-session-ZXOO6LYN.js");
17699
+ const { collectDiagnostics } = await import("../persistent-session-KMPIHBCE.js");
17623
17700
  await api.post("/host/heartbeat", {
17624
17701
  host_id: hostId,
17625
17702
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17670,7 +17747,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
17670
17747
  }
17671
17748
  try {
17672
17749
  const hostId = await getHostId();
17673
- const { collectDiagnostics } = await import("../persistent-session-ZXOO6LYN.js");
17750
+ const { collectDiagnostics } = await import("../persistent-session-KMPIHBCE.js");
17674
17751
  await api.post("/host/heartbeat", {
17675
17752
  host_id: hostId,
17676
17753
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -18267,7 +18344,7 @@ async function processClaudePairSessions(agents) {
18267
18344
  killPairSession,
18268
18345
  pairTmuxSession,
18269
18346
  finalizeClaudePairOnboarding
18270
- } = await import("../claude-pair-runtime-YA5QHYHF.js");
18347
+ } = await import("../claude-pair-runtime-56Z3MRYQ.js");
18271
18348
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
18272
18349
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
18273
18350
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -18798,6 +18875,8 @@ async function reportSelfUpdateRestarts() {
18798
18875
  function scheduleNext() {
18799
18876
  if (!running || !config) return;
18800
18877
  const restartNow = () => {
18878
+ if (upgradeRestartInitiated) return;
18879
+ upgradeRestartInitiated = true;
18801
18880
  log(`[self-update] Restarting manager to load upgraded binary (${pendingUpgradeVersion ?? "unknown version"})`);
18802
18881
  void reportSelfUpdateRestarts().catch((err) => log(`[self-update] restart-event audit failed: ${err.message}`)).finally(() => {
18803
18882
  void stopPolling({ forcedExitCode: SUPERVISOR_RESTART_EXIT_CODE }).then(() => {