@integrity-labs/agt-cli 0.28.303 → 0.28.305

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.
@@ -18,7 +18,7 @@ import {
18
18
  resolveConnectivityProbe,
19
19
  worseConnectivityOutcome,
20
20
  wrapScheduledTaskPrompt
21
- } from "./chunk-5WQATS6J.js";
21
+ } from "./chunk-A546IARM.js";
22
22
  import {
23
23
  parsePsRows
24
24
  } from "./chunk-XWVM4KPK.js";
@@ -5882,7 +5882,7 @@ function requireHost() {
5882
5882
  }
5883
5883
 
5884
5884
  // src/lib/api-client.ts
5885
- var agtCliVersion = true ? "0.28.303" : "dev";
5885
+ var agtCliVersion = true ? "0.28.305" : "dev";
5886
5886
  var lastConfigHash = null;
5887
5887
  function setConfigHash(hash) {
5888
5888
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -8181,4 +8181,4 @@ export {
8181
8181
  managerInstallSystemUnitCommand,
8182
8182
  managerUninstallSystemUnitCommand
8183
8183
  };
8184
- //# sourceMappingURL=chunk-7LFB5DAW.js.map
8184
+ //# sourceMappingURL=chunk-XVLVNR33.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-52DPSJGK.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-WYNJBCVB.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-FOFN74JS.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-6MRJ6ZJV.js.map
@@ -39,7 +39,7 @@ import {
39
39
  requireHost,
40
40
  safeWriteJsonAtomic,
41
41
  setConfigHash
42
- } from "../chunk-7LFB5DAW.js";
42
+ } from "../chunk-XVLVNR33.js";
43
43
  import {
44
44
  getProjectDir as getProjectDir2,
45
45
  getReadyTasks,
@@ -127,7 +127,7 @@ import {
127
127
  takeZombieDetection,
128
128
  transcriptActivityAgeSeconds,
129
129
  writeEgressAllowlist
130
- } from "../chunk-5WQATS6J.js";
130
+ } from "../chunk-A546IARM.js";
131
131
  import {
132
132
  reapOrphanChannelMcps
133
133
  } from "../chunk-XWVM4KPK.js";
@@ -3927,6 +3927,14 @@ var HYBRID_ACTIONABLE_STATUSES = new Set(KANBAN_NUDGE_ACTIONABLE_STATUSES);
3927
3927
  function isHybridActionable(item) {
3928
3928
  return HYBRID_ACTIONABLE_STATUSES.has(item.status) && item.source_type !== "scheduled_task";
3929
3929
  }
3930
+ function kanbanActionableSignature(allowed) {
3931
+ return allowed.map((i) => `${i.id}:${i.status}`).sort().join("|");
3932
+ }
3933
+ function shouldNudgeUnchangedBoard(signature, state7, now, fullCadenceMs) {
3934
+ if (!state7) return true;
3935
+ if (state7.signature !== signature) return true;
3936
+ return now - state7.nudgedAt >= fullCadenceMs;
3937
+ }
3930
3938
  function isSlashCommand(command) {
3931
3939
  return command.trimStart().startsWith("/");
3932
3940
  }
@@ -6989,7 +6997,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
6989
6997
  var lastVersionCheckAt = 0;
6990
6998
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
6991
6999
  var lastResponsivenessProbeAt = 0;
6992
- var agtCliVersion = true ? "0.28.303" : "dev";
7000
+ var agtCliVersion = true ? "0.28.305" : "dev";
6993
7001
  function resolveBrewPath(execFileSync2) {
6994
7002
  try {
6995
7003
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -7844,7 +7852,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
7844
7852
  if (codeNames.length === 0) return;
7845
7853
  void (async () => {
7846
7854
  try {
7847
- const { collectDiagnostics } = await import("../persistent-session-52DPSJGK.js");
7855
+ const { collectDiagnostics } = await import("../persistent-session-WYNJBCVB.js");
7848
7856
  await api.post("/host/heartbeat", {
7849
7857
  host_id: hostId,
7850
7858
  agent_diagnostics: collectDiagnostics(codeNames)
@@ -7942,7 +7950,7 @@ async function pollCycle() {
7942
7950
  }
7943
7951
  try {
7944
7952
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
7945
- const { collectDiagnostics } = await import("../persistent-session-52DPSJGK.js");
7953
+ const { collectDiagnostics } = await import("../persistent-session-WYNJBCVB.js");
7946
7954
  const diagCodeNames = [...agentState.persistentSessionAgents];
7947
7955
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
7948
7956
  let tailscaleHostname;
@@ -8090,7 +8098,7 @@ async function pollCycle() {
8090
8098
  const {
8091
8099
  collectResponsivenessProbes,
8092
8100
  getResponsivenessIntervalMs
8093
- } = await import("../responsiveness-probe-KXWV4FXD.js");
8101
+ } = await import("../responsiveness-probe-2FQLPFAR.js");
8094
8102
  const probeIntervalMs = getResponsivenessIntervalMs();
8095
8103
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
8096
8104
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -8122,7 +8130,7 @@ async function pollCycle() {
8122
8130
  collectResponsivenessProbes,
8123
8131
  livePendingInboundOldestAgeSeconds,
8124
8132
  parkPendingInbound
8125
- } = await import("../responsiveness-probe-KXWV4FXD.js");
8133
+ } = await import("../responsiveness-probe-2FQLPFAR.js");
8126
8134
  const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
8127
8135
  const wedgeNow = /* @__PURE__ */ new Date();
8128
8136
  const liveAgents = agentState.persistentSessionAgents;
@@ -10104,7 +10112,12 @@ async function processAgent(agent, agentStates) {
10104
10112
  );
10105
10113
  }
10106
10114
  } else if (allowed.length > 0) {
10107
- void maybeInjectKanbanCheck(agent.code_name, agent.agent_id, allowed.length);
10115
+ void maybeInjectKanbanCheck(
10116
+ agent.code_name,
10117
+ agent.agent_id,
10118
+ allowed.length,
10119
+ kanbanActionableSignature(allowed)
10120
+ );
10108
10121
  } else if (suppressed.length > 0) {
10109
10122
  closeInjectedRunIfOpen(
10110
10123
  agent.code_name,
@@ -10114,6 +10127,7 @@ async function processAgent(agent, agentStates) {
10114
10127
  } else if (openInjectedRunByCode.has(agent.code_name)) {
10115
10128
  const openRunId = openInjectedRunByCode.get(agent.code_name);
10116
10129
  openInjectedRunByCode.delete(agent.code_name);
10130
+ kanbanNudgeStateByCode.delete(agent.code_name);
10117
10131
  void cancelKanbanNoticeOnDrain(agent.code_name, agent.agent_id, openRunId);
10118
10132
  }
10119
10133
  }
@@ -11099,7 +11113,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
11099
11113
  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}`));
11100
11114
  void (async () => {
11101
11115
  try {
11102
- const { collectDiagnostics } = await import("../persistent-session-52DPSJGK.js");
11116
+ const { collectDiagnostics } = await import("../persistent-session-WYNJBCVB.js");
11103
11117
  await api.post("/host/heartbeat", {
11104
11118
  host_id: hostId,
11105
11119
  agent_diagnostics: collectDiagnostics([codeName])
@@ -11149,7 +11163,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
11149
11163
  }
11150
11164
  try {
11151
11165
  const hostId = await getHostId();
11152
- const { collectDiagnostics } = await import("../persistent-session-52DPSJGK.js");
11166
+ const { collectDiagnostics } = await import("../persistent-session-WYNJBCVB.js");
11153
11167
  await api.post("/host/heartbeat", {
11154
11168
  host_id: hostId,
11155
11169
  agent_diagnostics: collectDiagnostics([codeName])
@@ -11423,6 +11437,7 @@ ${escapeXml(msg.content)}
11423
11437
  log(`[direct-chat] No in-session delivery for '${agent.codeName}' (msg=${msg.id}) \u2014 leaving pending for ENG-5927 durable replay`);
11424
11438
  }
11425
11439
  var lastKanbanInjectAt = /* @__PURE__ */ new Map();
11440
+ var kanbanNudgeStateByCode = /* @__PURE__ */ new Map();
11426
11441
  var openInjectedRunByCode = /* @__PURE__ */ new Map();
11427
11442
  function closeInjectedRunIfOpen(codeName, outcome, outcomeMessage) {
11428
11443
  const runId = openInjectedRunByCode.get(codeName);
@@ -11449,6 +11464,12 @@ var KANBAN_HYBRID_DEBOUNCE_MS = (() => {
11449
11464
  if (Number.isFinite(parsed) && parsed > 0) return Math.max(parsed, 10) * 1e3;
11450
11465
  return 6e4;
11451
11466
  })();
11467
+ var KANBAN_HYBRID_FULL_CADENCE_MS = (() => {
11468
+ const raw = process.env["AGT_KANBAN_HYBRID_FULL_CADENCE_SECONDS"];
11469
+ const parsed = raw ? parseInt(raw, 10) : NaN;
11470
+ if (Number.isFinite(parsed) && parsed > 0) return Math.max(parsed * 1e3, KANBAN_HYBRID_DEBOUNCE_MS);
11471
+ return Math.max(5 * 6e4, KANBAN_HYBRID_DEBOUNCE_MS);
11472
+ })();
11452
11473
  async function injectKanbanCheckViaDirectChat(codeName, agentId, actionableCount) {
11453
11474
  if (isKanbanHybridDryRun()) {
11454
11475
  log(
@@ -11483,7 +11504,15 @@ ${formatRunMarker(run_id)}` : KANBAN_CHECK_COMMAND;
11483
11504
  );
11484
11505
  return true;
11485
11506
  }
11486
- async function maybeInjectKanbanCheck(codeName, agentId, actionableCount) {
11507
+ async function maybeInjectKanbanCheck(codeName, agentId, actionableCount, signature) {
11508
+ if (!shouldNudgeUnchangedBoard(
11509
+ signature,
11510
+ kanbanNudgeStateByCode.get(codeName),
11511
+ Date.now(),
11512
+ KANBAN_HYBRID_FULL_CADENCE_MS
11513
+ )) {
11514
+ return;
11515
+ }
11487
11516
  const lastAt = lastKanbanInjectAt.get(codeName) ?? 0;
11488
11517
  if (Date.now() - lastAt < KANBAN_HYBRID_DEBOUNCE_MS) {
11489
11518
  return;
@@ -11491,7 +11520,10 @@ async function maybeInjectKanbanCheck(codeName, agentId, actionableCount) {
11491
11520
  lastKanbanInjectAt.set(codeName, Date.now());
11492
11521
  if (hostFlagStore().getBoolean("kanban-doorbell")) {
11493
11522
  const ok = await injectKanbanCheckViaDirectChat(codeName, agentId, actionableCount);
11494
- if (ok) return;
11523
+ if (ok) {
11524
+ kanbanNudgeStateByCode.set(codeName, { signature, nudgedAt: Date.now() });
11525
+ return;
11526
+ }
11495
11527
  log(`[manager-worker] kanban direct-chat enqueue failed for '${codeName}' \u2014 falling back to send-keys`);
11496
11528
  }
11497
11529
  const tmuxSession = `agt-${codeName}`;
@@ -11523,6 +11555,7 @@ ${formatRunMarker(run_id)}` : KANBAN_CHECK_COMMAND;
11523
11555
  }
11524
11556
  if (delivered) {
11525
11557
  if (run_id) openInjectedRunByCode.set(codeName, run_id);
11558
+ kanbanNudgeStateByCode.set(codeName, { signature, nudgedAt: Date.now() });
11526
11559
  log(
11527
11560
  `[manager-worker] Injected kanban check for '${codeName}' (${actionableCount} actionable items)${run_id ? ` run_id=${run_id}` : ""}`
11528
11561
  );
@@ -11554,7 +11587,7 @@ async function processClaudePairSessions(agents) {
11554
11587
  killPairSession,
11555
11588
  pairTmuxSession,
11556
11589
  finalizeClaudePairOnboarding
11557
- } = await import("../claude-pair-runtime-FOFN74JS.js");
11590
+ } = await import("../claude-pair-runtime-6MRJ6ZJV.js");
11558
11591
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
11559
11592
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
11560
11593
  const killed = await killPairSession(pairTmuxSession(pairId));