@integrity-labs/agt-cli 0.28.1140 → 0.28.1142

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.
Files changed (25) hide show
  1. package/dist/bin/agt.js +35 -7
  2. package/dist/bin/agt.js.map +1 -1
  3. package/dist/{chunk-DRAZDG3U.js → chunk-J2PUVUK6.js} +4 -4
  4. package/dist/{chunk-DYFE224A.js → chunk-JM47BARM.js} +7 -1
  5. package/dist/chunk-JM47BARM.js.map +1 -0
  6. package/dist/{chunk-7U4VSBOE.js → chunk-ZJFS74H5.js} +2 -2
  7. package/dist/{claude-pair-runtime-BOTE3DRW.js → claude-pair-runtime-A3OWKP3K.js} +2 -2
  8. package/dist/lib/manager-worker.js +65 -30
  9. package/dist/lib/manager-worker.js.map +1 -1
  10. package/dist/mcp/direct-chat-channel.js +6 -0
  11. package/dist/mcp/index.js +103 -25
  12. package/dist/mcp/origami.js +6 -0
  13. package/dist/mcp/slack-channel.js +6 -0
  14. package/dist/mcp/telegram-channel.js +6 -0
  15. package/dist/{persistent-session-6O66QEI4.js → persistent-session-VNJDG3VN.js} +3 -3
  16. package/dist/{responsiveness-probe-WGD3NDWG.js → responsiveness-probe-ABQGETFV.js} +3 -3
  17. package/dist/{session-auth-dead-6N2AEFKX.js → session-auth-dead-DVE6OGRT.js} +2 -2
  18. package/package.json +1 -1
  19. package/dist/chunk-DYFE224A.js.map +0 -1
  20. /package/dist/{chunk-DRAZDG3U.js.map → chunk-J2PUVUK6.js.map} +0 -0
  21. /package/dist/{chunk-7U4VSBOE.js.map → chunk-ZJFS74H5.js.map} +0 -0
  22. /package/dist/{claude-pair-runtime-BOTE3DRW.js.map → claude-pair-runtime-A3OWKP3K.js.map} +0 -0
  23. /package/dist/{persistent-session-6O66QEI4.js.map → persistent-session-VNJDG3VN.js.map} +0 -0
  24. /package/dist/{responsiveness-probe-WGD3NDWG.js.map → responsiveness-probe-ABQGETFV.js.map} +0 -0
  25. /package/dist/{session-auth-dead-6N2AEFKX.js.map → session-auth-dead-DVE6OGRT.js.map} +0 -0
@@ -24,7 +24,7 @@ import {
24
24
  rotateDailySession,
25
25
  sessionFileExists,
26
26
  todayLocalIso
27
- } from "./chunk-DYFE224A.js";
27
+ } from "./chunk-JM47BARM.js";
28
28
  import {
29
29
  classifyUnanswerablePane,
30
30
  findUsageLimitResetHint,
@@ -6114,4 +6114,4 @@ export {
6114
6114
  stopAllSessionsAndWait,
6115
6115
  getProjectDir
6116
6116
  };
6117
- //# sourceMappingURL=chunk-7U4VSBOE.js.map
6117
+ //# sourceMappingURL=chunk-ZJFS74H5.js.map
@@ -269,7 +269,7 @@ async function spawnPairSession(session) {
269
269
  return { ok: true };
270
270
  } catch {
271
271
  }
272
- const { resolveClaudeBinary } = await import("./persistent-session-6O66QEI4.js");
272
+ const { resolveClaudeBinary } = await import("./persistent-session-VNJDG3VN.js");
273
273
  const claudeBin = resolveClaudeBinary();
274
274
  const pairEnv = {
275
275
  ...process.env,
@@ -739,4 +739,4 @@ export {
739
739
  startClaudePair,
740
740
  submitClaudePairCode
741
741
  };
742
- //# sourceMappingURL=claude-pair-runtime-BOTE3DRW.js.map
742
+ //# sourceMappingURL=claude-pair-runtime-A3OWKP3K.js.map
@@ -76,7 +76,7 @@ import {
76
76
  setConfigHash,
77
77
  shellGuard,
78
78
  tripClass
79
- } from "../chunk-DRAZDG3U.js";
79
+ } from "../chunk-J2PUVUK6.js";
80
80
  import {
81
81
  getProjectDir as getProjectDir2,
82
82
  getReadyTasks,
@@ -163,7 +163,7 @@ import {
163
163
  webFetchBaselineValue,
164
164
  webFetchRestartNeeded,
165
165
  writeEgressAllowlist
166
- } from "../chunk-7U4VSBOE.js";
166
+ } from "../chunk-ZJFS74H5.js";
167
167
  import {
168
168
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
169
169
  AnchorSessionClient,
@@ -274,7 +274,7 @@ import {
274
274
  subagentActivityAgeSeconds,
275
275
  sumTranscriptUsageInWindow,
276
276
  transcriptActivityAgeSeconds
277
- } from "../chunk-DYFE224A.js";
277
+ } from "../chunk-JM47BARM.js";
278
278
  import {
279
279
  classifyUnanswerablePane,
280
280
  focusedConfirmDialogBlock,
@@ -343,6 +343,8 @@ var HostNodeConvergence = class {
343
343
  }
344
344
  converged = /* @__PURE__ */ new Set();
345
345
  abandoned = /* @__PURE__ */ new Set();
346
+ /** Pins this platform cannot install at all; see {@link recordUnsupported}. */
347
+ unsupported = /* @__PURE__ */ new Set();
346
348
  failures = /* @__PURE__ */ new Map();
347
349
  retryAfter = /* @__PURE__ */ new Map();
348
350
  /**
@@ -383,6 +385,7 @@ var HostNodeConvergence = class {
383
385
  this.lastDesired = pin;
384
386
  this.converged.clear();
385
387
  this.abandoned.clear();
388
+ this.unsupported.clear();
386
389
  this.failures.clear();
387
390
  this.retryAfter.clear();
388
391
  }
@@ -393,6 +396,7 @@ var HostNodeConvergence = class {
393
396
  stateOf(pin, now = Date.now()) {
394
397
  if (this.converged.has(pin)) return "converged";
395
398
  if (this.abandoned.has(pin)) return "abandoned";
399
+ if (this.unsupported.has(pin)) return "unsupported";
396
400
  if ((this.retryAfter.get(pin) ?? 0) > now) return "cooling";
397
401
  return "ready";
398
402
  }
@@ -447,6 +451,20 @@ var HostNodeConvergence = class {
447
451
  this.failures.delete(pin);
448
452
  this.retryAfter.delete(pin);
449
453
  }
454
+ /**
455
+ * The pin cannot be installed on this platform (no `dnf`). Terminal, so it
456
+ * stops further attempts exactly as success does — hammering an impossible
457
+ * install every poll is worse than stopping — but it reports as itself.
458
+ *
459
+ * Carries the same staleness guard as {@link recordSuccess}: a late call for
460
+ * a superseded pin must not write a conclusion about the pin now wanted.
461
+ */
462
+ recordUnsupported(pin) {
463
+ if (this.lastDesired !== null && pin !== this.lastDesired) return;
464
+ this.unsupported.add(pin);
465
+ this.failures.delete(pin);
466
+ this.retryAfter.delete(pin);
467
+ }
450
468
  /**
451
469
  * An attempt failed. Returns the resulting state so the caller can log the
452
470
  * right thing: 'cooling' means it will retry, 'abandoned' means it will not.
@@ -500,12 +518,32 @@ function normalizeReportedNodeVersion(raw) {
500
518
  return HOST_NODE_PIN_VERSION_RE.test(v) ? v : null;
501
519
  }
502
520
  function parsePathNodeVersion(stdout) {
503
- const m = /^v?(\d+\.\d+\.\d+)/.exec(stdout.trim());
521
+ const m = /^v?(\d+\.\d+\.\d+)$/.exec(stdout.trim());
504
522
  return m ? normalizeReportedNodeVersion(m[1]) : null;
505
523
  }
506
524
  function parseRpmNodeVersion(stdout) {
507
525
  return normalizeReportedNodeVersion(stdout.trim());
508
526
  }
527
+ var RPM_NODE_QUERY_ARGV = ["-q", "--qf", "%{VERSION}", "nodejs"];
528
+ var PATH_NODE_QUERY_ARGV = ["--version"];
529
+ async function probeOrNull(probe) {
530
+ try {
531
+ return await probe();
532
+ } catch {
533
+ return null;
534
+ }
535
+ }
536
+ async function probeHostNode(run) {
537
+ const pathVersion = await probeOrNull(async () => {
538
+ const probe = await run("node", [...PATH_NODE_QUERY_ARGV]);
539
+ return probe.code === 0 ? parsePathNodeVersion(probe.stdout) : null;
540
+ });
541
+ const rpmVersion = await probeOrNull(async () => {
542
+ const rpm = await run("rpm", [...RPM_NODE_QUERY_ARGV]);
543
+ return rpm.code === 0 ? parseRpmNodeVersion(rpm.stdout) : null;
544
+ });
545
+ return { pathVersion, rpmVersion };
546
+ }
509
547
  function heartbeatHostNodeFields(observation, pin, pinState) {
510
548
  if (!observation) return {};
511
549
  return {
@@ -8456,7 +8494,7 @@ function isKanbanHybridDryRun() {
8456
8494
  }
8457
8495
  var HYBRID_ACTIONABLE_STATUSES = new Set(KANBAN_NUDGE_ACTIONABLE_STATUSES);
8458
8496
  function isHybridActionable(item) {
8459
- return HYBRID_ACTIONABLE_STATUSES.has(item.status) && item.source_type !== "scheduled_task" && item.assignee_type !== "human";
8497
+ return HYBRID_ACTIONABLE_STATUSES.has(item.status) && item.source_type !== "scheduled_task" && item.assignee_type !== "human" && item.owed_reply_on_own_card !== false;
8460
8498
  }
8461
8499
  function resolveHybridNudgeAction(stale, allowedCount, suppressedCount) {
8462
8500
  if (stale) return "skip-stale";
@@ -14690,7 +14728,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
14690
14728
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
14691
14729
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
14692
14730
  async function channelInboundActivityAgeSecondsFor(codeName) {
14693
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-WGD3NDWG.js");
14731
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-ABQGETFV.js");
14694
14732
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
14695
14733
  if (newest === null) return null;
14696
14734
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -15448,7 +15486,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
15448
15486
  var lastVersionCheckAt = 0;
15449
15487
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
15450
15488
  var lastResponsivenessProbeAt = 0;
15451
- var agtCliVersion = true ? "0.28.1140" : "dev";
15489
+ var agtCliVersion = true ? "0.28.1142" : "dev";
15452
15490
  function resolveBrewPath(execFileSync3) {
15453
15491
  try {
15454
15492
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15633,22 +15671,18 @@ async function diskNodeVersion() {
15633
15671
  }
15634
15672
  var hostNodeObservation = null;
15635
15673
  var hostNodeObservedAt = 0;
15636
- async function probeOrNull(probe) {
15637
- try {
15638
- return await probe();
15639
- } catch {
15640
- return null;
15674
+ function invalidateHostNodeObservation(pathVersion) {
15675
+ hostNodeObservedAt = 0;
15676
+ if (pathVersion !== void 0 && hostNodeObservation) {
15677
+ hostNodeObservation = { ...hostNodeObservation, pathVersion };
15641
15678
  }
15642
15679
  }
15643
15680
  async function refreshHostNodeObservation(now = Date.now()) {
15644
15681
  if (!shouldReprobeHostNode(hostNodeObservedAt, now)) return;
15645
15682
  hostNodeObservedAt = now;
15646
- const pathVersion = await probeOrNull(() => diskNodeVersion());
15647
- const rpmVersion = await probeOrNull(async () => {
15648
- const rpm = await runAsync("rpm", ["-q", "--qf", "%{VERSION}", "nodejs"], { timeout: 15e3 });
15649
- return rpm.code === 0 ? parseRpmNodeVersion(rpm.stdout) : null;
15650
- });
15651
- hostNodeObservation = { pathVersion, rpmVersion };
15683
+ hostNodeObservation = await probeHostNode(
15684
+ (cmd, args) => runAsync(cmd, args, { timeout: 15e3 })
15685
+ );
15652
15686
  }
15653
15687
  async function ensureHostNodeVersion(rawPin) {
15654
15688
  const pin = normalizeHostNodePinVersion(rawPin);
@@ -15678,7 +15712,7 @@ async function ensureHostNodeVersion(rawPin) {
15678
15712
  hostNodeNoDnfLogged = true;
15679
15713
  log(`[host-node] 'dnf' not found - cannot converge host Node onto ${pin} on this platform (leaving ${current ?? "unknown"} in place)`);
15680
15714
  }
15681
- hostNodeConvergence.recordSuccess(pin);
15715
+ hostNodeConvergence.recordUnsupported(pin);
15682
15716
  return;
15683
15717
  }
15684
15718
  const asRoot = typeof process.getuid === "function" && process.getuid() === 0;
@@ -15699,6 +15733,7 @@ async function ensureHostNodeVersion(rawPin) {
15699
15733
  }
15700
15734
  log(`[host-node] host Node is now ${pin} on disk. Running processes keep the previous binary until they restart - this does NOT restart the manager (ENG-11617).`);
15701
15735
  hostNodeConvergence.recordSuccess(pin);
15736
+ invalidateHostNodeObservation(after);
15702
15737
  } catch (err) {
15703
15738
  recordHostNodeFailure(pin, `install attempt threw: ${isolationImageErrDetail(err)}`);
15704
15739
  } finally {
@@ -17171,7 +17206,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
17171
17206
  if (codeNames.length === 0) return;
17172
17207
  void (async () => {
17173
17208
  try {
17174
- const { collectDiagnostics } = await import("../persistent-session-6O66QEI4.js");
17209
+ const { collectDiagnostics } = await import("../persistent-session-VNJDG3VN.js");
17175
17210
  await api.post("/host/heartbeat", {
17176
17211
  host_id: hostId,
17177
17212
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -17313,7 +17348,7 @@ async function pollCycleInner() {
17313
17348
  }
17314
17349
  try {
17315
17350
  const { detectHostSecurity } = await import("../host-security-KQYYZZVW.js");
17316
- const { collectDiagnostics } = await import("../persistent-session-6O66QEI4.js");
17351
+ const { collectDiagnostics } = await import("../persistent-session-VNJDG3VN.js");
17317
17352
  const diagCodeNames = [...agentState.persistentSessionAgents];
17318
17353
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor) : void 0;
17319
17354
  let tailscaleHostname;
@@ -17534,7 +17569,7 @@ async function pollCycleInner() {
17534
17569
  collectPanelessActivityProbes,
17535
17570
  getResponsivenessIntervalMs,
17536
17571
  occupancyQualificationClassifications
17537
- } = await import("../responsiveness-probe-WGD3NDWG.js");
17572
+ } = await import("../responsiveness-probe-ABQGETFV.js");
17538
17573
  const probeIntervalMs = getResponsivenessIntervalMs();
17539
17574
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
17540
17575
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -17651,7 +17686,7 @@ async function pollCycleInner() {
17651
17686
  collectResponsivenessProbes,
17652
17687
  livePendingInboundOldestAgeSeconds,
17653
17688
  parkPendingInbound
17654
- } = await import("../responsiveness-probe-WGD3NDWG.js");
17689
+ } = await import("../responsiveness-probe-ABQGETFV.js");
17655
17690
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-M6AFZWNU.js");
17656
17691
  const wedgeNow = /* @__PURE__ */ new Date();
17657
17692
  const liveAgents = agentState.persistentSessionAgents;
@@ -17937,7 +17972,7 @@ async function pollCycleInner() {
17937
17972
  }
17938
17973
  }
17939
17974
  );
17940
- const { parkPendingInbound } = await import("../responsiveness-probe-WGD3NDWG.js");
17975
+ const { parkPendingInbound } = await import("../responsiveness-probe-ABQGETFV.js");
17941
17976
  const { parked, deadLettered } = parkPendingInbound(codeName, new Date(fatalNowMs));
17942
17977
  paneFatalStreak.delete(codeName);
17943
17978
  paneFatalRestarts.set(codeName, [...history, fatalNowMs]);
@@ -17968,7 +18003,7 @@ async function pollCycleInner() {
17968
18003
  TRANSCRIPT_MOUNT_ESCALATION_REFRESH_MS,
17969
18004
  bindSourceEscalations
17970
18005
  } = await import("../transcript-mount-health-OHE6IVJV.js");
17971
- const { transcriptBindSourcesFor, ensureTranscriptBindSources } = await import("../persistent-session-6O66QEI4.js");
18006
+ const { transcriptBindSourcesFor, ensureTranscriptBindSources } = await import("../persistent-session-VNJDG3VN.js");
17972
18007
  const mountConfig = resolveTranscriptMountConfig();
17973
18008
  const liveAgents = agentState.persistentSessionAgents;
17974
18009
  for (const tracked of [
@@ -18133,7 +18168,7 @@ async function pollCycleInner() {
18133
18168
  }
18134
18169
  try {
18135
18170
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-VR5QGP3J.js");
18136
- const { probeSessionAuth } = await import("../session-auth-dead-6N2AEFKX.js");
18171
+ const { probeSessionAuth } = await import("../session-auth-dead-DVE6OGRT.js");
18137
18172
  const observations = [];
18138
18173
  const pendingCacheCommits = [];
18139
18174
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -22731,7 +22766,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
22731
22766
  try {
22732
22767
  const freshId = rotateSessionForWedge(codeName);
22733
22768
  consecutiveWedgeCycles.delete(codeName);
22734
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-WGD3NDWG.js");
22769
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-ABQGETFV.js");
22735
22770
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
22736
22771
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
22737
22772
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -22774,7 +22809,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
22774
22809
  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}`));
22775
22810
  void (async () => {
22776
22811
  try {
22777
- const { collectDiagnostics } = await import("../persistent-session-6O66QEI4.js");
22812
+ const { collectDiagnostics } = await import("../persistent-session-VNJDG3VN.js");
22778
22813
  await api.post("/host/heartbeat", {
22779
22814
  host_id: hostId,
22780
22815
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -22825,7 +22860,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
22825
22860
  }
22826
22861
  try {
22827
22862
  const hostId = await getHostId();
22828
- const { collectDiagnostics } = await import("../persistent-session-6O66QEI4.js");
22863
+ const { collectDiagnostics } = await import("../persistent-session-VNJDG3VN.js");
22829
22864
  await api.post("/host/heartbeat", {
22830
22865
  host_id: hostId,
22831
22866
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor, runtimeVersionFor)
@@ -23498,7 +23533,7 @@ async function processClaudePairSessions(agents) {
23498
23533
  // cannot take it for itself — by the time it runs, the write it is looking
23499
23534
  // for may already have happened.
23500
23535
  snapshotPairConfig
23501
- } = await import("../claude-pair-runtime-BOTE3DRW.js");
23536
+ } = await import("../claude-pair-runtime-A3OWKP3K.js");
23502
23537
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
23503
23538
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
23504
23539
  const killed = await killPairSession(pairTmuxSession(pairId));