@integrity-labs/agt-cli 0.28.303 → 0.28.304

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.
package/dist/bin/agt.js CHANGED
@@ -38,7 +38,7 @@ import {
38
38
  success,
39
39
  table,
40
40
  warn
41
- } from "../chunk-7LFB5DAW.js";
41
+ } from "../chunk-OA5EO3U4.js";
42
42
  import {
43
43
  CHANNEL_REGISTRY,
44
44
  DEFAULT_FRAMEWORK,
@@ -4826,7 +4826,7 @@ import { execFileSync, execSync } from "child_process";
4826
4826
  import { existsSync as existsSync10, realpathSync as realpathSync2 } from "fs";
4827
4827
  import chalk18 from "chalk";
4828
4828
  import ora16 from "ora";
4829
- var cliVersion = true ? "0.28.303" : "dev";
4829
+ var cliVersion = true ? "0.28.304" : "dev";
4830
4830
  async function fetchLatestVersion() {
4831
4831
  const host2 = getHost();
4832
4832
  if (!host2) return null;
@@ -5843,7 +5843,7 @@ function handleError(err) {
5843
5843
  }
5844
5844
 
5845
5845
  // src/bin/agt.ts
5846
- var cliVersion2 = true ? "0.28.303" : "dev";
5846
+ var cliVersion2 = true ? "0.28.304" : "dev";
5847
5847
  var program = new Command();
5848
5848
  program.name("agt").description("Augmented CLI \u2014 agent provisioning and management").version(cliVersion2).option("--json", "Emit machine-readable JSON output (suppress spinners and colors)").option("--skip-update-check", "Skip the automatic update check on startup");
5849
5849
  program.hook("preAction", async (thisCommand, actionCommand) => {
@@ -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.304" : "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-OA5EO3U4.js.map
@@ -39,7 +39,7 @@ import {
39
39
  requireHost,
40
40
  safeWriteJsonAtomic,
41
41
  setConfigHash
42
- } from "../chunk-7LFB5DAW.js";
42
+ } from "../chunk-OA5EO3U4.js";
43
43
  import {
44
44
  getProjectDir as getProjectDir2,
45
45
  getReadyTasks,
@@ -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.304" : "dev";
6993
7001
  function resolveBrewPath(execFileSync2) {
6994
7002
  try {
6995
7003
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -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
  }
@@ -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
  );