@integrity-labs/agt-cli 0.28.332 → 0.28.333

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-YNHMQ4CW.js";
41
+ } from "../chunk-RQOJLHYA.js";
42
42
  import {
43
43
  AnchorSessionClient,
44
44
  CHANNEL_REGISTRY,
@@ -4827,7 +4827,7 @@ import { execFileSync, execSync } from "child_process";
4827
4827
  import { existsSync as existsSync10, realpathSync as realpathSync2 } from "fs";
4828
4828
  import chalk18 from "chalk";
4829
4829
  import ora16 from "ora";
4830
- var cliVersion = true ? "0.28.332" : "dev";
4830
+ var cliVersion = true ? "0.28.333" : "dev";
4831
4831
  async function fetchLatestVersion() {
4832
4832
  const host2 = getHost();
4833
4833
  if (!host2) return null;
@@ -5931,7 +5931,7 @@ function handleError(err) {
5931
5931
  }
5932
5932
 
5933
5933
  // src/bin/agt.ts
5934
- var cliVersion2 = true ? "0.28.332" : "dev";
5934
+ var cliVersion2 = true ? "0.28.333" : "dev";
5935
5935
  var program = new Command();
5936
5936
  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");
5937
5937
  program.hook("preAction", async (thisCommand, actionCommand) => {
@@ -6956,7 +6956,7 @@ function requireHost() {
6956
6956
  }
6957
6957
 
6958
6958
  // src/lib/api-client.ts
6959
- var agtCliVersion = true ? "0.28.332" : "dev";
6959
+ var agtCliVersion = true ? "0.28.333" : "dev";
6960
6960
  var lastConfigHash = null;
6961
6961
  function setConfigHash(hash) {
6962
6962
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -9353,4 +9353,4 @@ export {
9353
9353
  managerInstallSystemUnitCommand,
9354
9354
  managerUninstallSystemUnitCommand
9355
9355
  };
9356
- //# sourceMappingURL=chunk-YNHMQ4CW.js.map
9356
+ //# sourceMappingURL=chunk-RQOJLHYA.js.map
@@ -43,7 +43,7 @@ import {
43
43
  requireHost,
44
44
  safeWriteJsonAtomic,
45
45
  setConfigHash
46
- } from "../chunk-YNHMQ4CW.js";
46
+ } from "../chunk-RQOJLHYA.js";
47
47
  import {
48
48
  getProjectDir as getProjectDir2,
49
49
  getReadyTasks,
@@ -8386,7 +8386,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
8386
8386
  var lastVersionCheckAt = 0;
8387
8387
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
8388
8388
  var lastResponsivenessProbeAt = 0;
8389
- var agtCliVersion = true ? "0.28.332" : "dev";
8389
+ var agtCliVersion = true ? "0.28.333" : "dev";
8390
8390
  function resolveBrewPath(execFileSync2) {
8391
8391
  try {
8392
8392
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -14315,6 +14315,42 @@ function clearDirectChatPendingMarkersForSession(dir, sessionId, op = defaultCle
14315
14315
  }
14316
14316
  return cleared;
14317
14317
  }
14318
+ function sweepAgedDirectChatMarkers(dir, deps) {
14319
+ const result = { cleared: 0, orphaned: 0 };
14320
+ if (!dir) return result;
14321
+ let names;
14322
+ try {
14323
+ names = deps.readdir(dir);
14324
+ } catch {
14325
+ return result;
14326
+ }
14327
+ for (const name of names) {
14328
+ if (!name.endsWith(".json") || name.startsWith(".")) continue;
14329
+ const full = join3(dir, name);
14330
+ let marker;
14331
+ try {
14332
+ marker = JSON.parse(deps.readFile(full));
14333
+ } catch {
14334
+ continue;
14335
+ }
14336
+ if (!deps.isAged(marker.received_at)) continue;
14337
+ const undelivered = !deps.hasDelivery(marker.inbound_id);
14338
+ try {
14339
+ deps.unlink(full);
14340
+ } catch {
14341
+ continue;
14342
+ }
14343
+ result.cleared += 1;
14344
+ if (undelivered) {
14345
+ try {
14346
+ deps.onOrphaned();
14347
+ } catch {
14348
+ }
14349
+ result.orphaned += 1;
14350
+ }
14351
+ }
14352
+ return result;
14353
+ }
14318
14354
 
14319
14355
  // src/direct-chat-recovery-outbox.ts
14320
14356
  async function consumeDirectChatRecoveryFile(fullPath, filename, deps) {
@@ -14405,6 +14441,147 @@ function writeInboundDeliveryLedgerEntry(dir, record2, deps = defaultDeps) {
14405
14441
  } catch {
14406
14442
  }
14407
14443
  }
14444
+ function inboundDeliveryLedgerHas(dir, inboundId, deps = defaultDeps) {
14445
+ if (!dir || !inboundId) return false;
14446
+ const safe = safeInboundId(inboundId);
14447
+ if (!safe || safe.includes("/") || safe.includes("\\") || safe.includes("..")) return false;
14448
+ try {
14449
+ return deps.exists(join4(dir, `${safe}.json`));
14450
+ } catch {
14451
+ return false;
14452
+ }
14453
+ }
14454
+
14455
+ // src/ack-reaction.ts
14456
+ import { readdirSync as readdirSync3, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "fs";
14457
+ import { join as join6 } from "path";
14458
+
14459
+ // src/flags-cache-read.ts
14460
+ import { existsSync as existsSync4, readFileSync as readFileSync4 } from "fs";
14461
+ import { homedir } from "os";
14462
+ import { join as join5 } from "path";
14463
+ function defaultFlagsCachePath() {
14464
+ return join5(homedir(), ".augmented", "flags-cache.json");
14465
+ }
14466
+ function envBoolean(raw) {
14467
+ if (raw === void 0) return void 0;
14468
+ const v = raw.trim().toLowerCase();
14469
+ if (v === "") return void 0;
14470
+ if (v === "1" || v === "true" || v === "yes" || v === "on") return true;
14471
+ if (v === "0" || v === "false" || v === "no" || v === "off") return false;
14472
+ return void 0;
14473
+ }
14474
+ function cachedBoolean(key, path) {
14475
+ try {
14476
+ if (!existsSync4(path)) return void 0;
14477
+ const parsed = JSON.parse(readFileSync4(path, "utf8"));
14478
+ if (!parsed || typeof parsed !== "object") return void 0;
14479
+ const flags = parsed.flags;
14480
+ if (!flags || typeof flags !== "object") return void 0;
14481
+ const value = flags[key];
14482
+ return typeof value === "boolean" ? value : void 0;
14483
+ } catch {
14484
+ return void 0;
14485
+ }
14486
+ }
14487
+ function resolveHostBooleanFlag(opts) {
14488
+ const env = opts.env ?? process.env;
14489
+ const envValue = envBoolean(env[opts.envVar]);
14490
+ if (envValue !== void 0) return envValue;
14491
+ const cached2 = cachedBoolean(opts.key, opts.cachePath ?? defaultFlagsCachePath());
14492
+ if (cached2 !== void 0) return cached2;
14493
+ return opts.defaultValue;
14494
+ }
14495
+
14496
+ // src/ack-reaction.ts
14497
+ var REPLY_WEDGED_THRESHOLD_MS = 5 * 60 * 1e3;
14498
+ var UNDELIVERABLE_NOTICE_THROTTLE_MS = 5 * 60 * 1e3;
14499
+ var BUSY_ACK_NOTICE_THROTTLE_MS = 20 * 60 * 1e3;
14500
+ var GIVE_UP_SIGNAL_MAX_AGE_MS = 30 * 60 * 1e3;
14501
+ function channelOrphanMarkerMs() {
14502
+ const raw = parseInt(process.env.AGT_CHANNEL_ORPHAN_MARKER_MS ?? "", 10);
14503
+ return Number.isFinite(raw) && raw > 0 ? Math.max(raw, 12e4) : 30 * 6e4;
14504
+ }
14505
+ var ORPHAN_SWEEP_INTERVAL_MS = 30 * 60 * 1e3;
14506
+ function orphanSweepIntervalMs() {
14507
+ return Math.max(6e4, Math.min(ORPHAN_SWEEP_INTERVAL_MS, channelOrphanMarkerMs()));
14508
+ }
14509
+ var PANE_FRESH_DEFER_MAX_MS = 10 * 60 * 1e3;
14510
+ function isMarkerGenuinelyAged(receivedAt, nowMs, thresholdMs) {
14511
+ const t = Date.parse(receivedAt ?? "");
14512
+ return Number.isFinite(t) && t <= nowMs && nowMs - t >= thresholdMs;
14513
+ }
14514
+ var DEFLECTION_COUNTER_SUFFIX = "-deflections.json";
14515
+ function deflectionCounterPath(agentDir, channel) {
14516
+ return join6(agentDir, `${channel}${DEFLECTION_COUNTER_SUFFIX}`);
14517
+ }
14518
+ function recordChannelDeflection(agentDir, channel, cause) {
14519
+ if (!agentDir) return;
14520
+ const path = deflectionCounterPath(agentDir, channel);
14521
+ let counts = {};
14522
+ try {
14523
+ const parsed = JSON.parse(readFileSync5(path, "utf-8"));
14524
+ if (parsed && typeof parsed === "object") counts = parsed;
14525
+ } catch {
14526
+ }
14527
+ counts[cause] = (counts[cause] ?? 0) + 1;
14528
+ try {
14529
+ writeFileSync4(path, JSON.stringify(counts), { mode: 384 });
14530
+ } catch {
14531
+ }
14532
+ }
14533
+
14534
+ // src/session-probe-runtime.ts
14535
+ import { execFileSync } from "child_process";
14536
+ function agentTmuxSessionName(codeName) {
14537
+ return `agt-${codeName}`;
14538
+ }
14539
+ function escapePgrepRegex(value) {
14540
+ return value.replace(/[.[\]{}()*+?^$|\\]/g, "\\$&");
14541
+ }
14542
+ function probeClaudeProcessInTmux(tmuxSession) {
14543
+ const escapedSession = escapePgrepRegex(tmuxSession);
14544
+ const pattern = `(^|[[:space:]])--name ${escapedSession}([[:space:]]|$)`;
14545
+ try {
14546
+ const out = execFileSync("pgrep", ["-f", "--", pattern], {
14547
+ encoding: "utf-8",
14548
+ timeout: 3e3
14549
+ }).trim();
14550
+ return out.length > 0 ? "alive" : "dead";
14551
+ } catch (err) {
14552
+ const e = err;
14553
+ if (e?.code === "ENOENT") return "unknown";
14554
+ return e?.status === 1 ? "dead" : "unknown";
14555
+ }
14556
+ }
14557
+ function probeTmuxSession(tmuxSession) {
14558
+ try {
14559
+ execFileSync("tmux", ["has-session", "-t", tmuxSession], {
14560
+ stdio: "ignore",
14561
+ timeout: 3e3
14562
+ });
14563
+ return "alive";
14564
+ } catch (err) {
14565
+ const e = err;
14566
+ if (e?.code === "ENOENT") return "unknown";
14567
+ return "dead";
14568
+ }
14569
+ }
14570
+ function probeAgentSession(codeName) {
14571
+ const session = agentTmuxSessionName(codeName);
14572
+ const tmux = probeTmuxSession(session);
14573
+ const claude = tmux === "alive" ? probeClaudeProcessInTmux(session) : tmux;
14574
+ return { tmux, claude };
14575
+ }
14576
+ var probeCache = /* @__PURE__ */ new Map();
14577
+ var SESSION_PROBE_TTL_MS = 15e3;
14578
+ function probeAgentSessionCached(codeName, ttlMs = SESSION_PROBE_TTL_MS, now = Date.now()) {
14579
+ const cached2 = probeCache.get(codeName);
14580
+ if (cached2 && now - cached2.at < ttlMs) return cached2.value;
14581
+ const value = probeAgentSession(codeName);
14582
+ probeCache.set(codeName, { at: now, value });
14583
+ return value;
14584
+ }
14408
14585
 
14409
14586
  // src/direct-chat-poll-guard.ts
14410
14587
  function evaluatePollGuard(state, nowMs, stuckMs) {
@@ -14428,14 +14605,14 @@ async function fetchWithTimeout(input, init, timeoutMs, fetchImpl = fetch) {
14428
14605
 
14429
14606
  // src/mcp-spawn-lock.ts
14430
14607
  import {
14431
- existsSync as existsSync4,
14608
+ existsSync as existsSync5,
14432
14609
  mkdirSync as mkdirSync4,
14433
- readFileSync as readFileSync4,
14610
+ readFileSync as readFileSync6,
14434
14611
  renameSync as renameSync4,
14435
14612
  unlinkSync as unlinkSync2,
14436
- writeFileSync as writeFileSync4
14613
+ writeFileSync as writeFileSync5
14437
14614
  } from "fs";
14438
- import { join as join5 } from "path";
14615
+ import { join as join7 } from "path";
14439
14616
  function defaultIsPidAlive(pid) {
14440
14617
  if (!Number.isFinite(pid) || pid <= 0) return false;
14441
14618
  try {
@@ -14453,7 +14630,7 @@ function acquireMcpSpawnLock(args) {
14453
14630
  const isPidAlive = options.isPidAlive ?? defaultIsPidAlive;
14454
14631
  const selfPid = options.selfPid ?? process.pid;
14455
14632
  const now = options.now ?? (() => (/* @__PURE__ */ new Date()).toISOString());
14456
- const path = join5(agentDir, basename);
14633
+ const path = join7(agentDir, basename);
14457
14634
  const existing = readLockHolder(path);
14458
14635
  if (existing) {
14459
14636
  if (existing.pid === selfPid) {
@@ -14466,7 +14643,7 @@ function acquireMcpSpawnLock(args) {
14466
14643
  mkdirSync4(agentDir, { recursive: true, mode: 448 });
14467
14644
  const tmpPath = `${path}.${selfPid}.tmp`;
14468
14645
  const payload = { pid: selfPid, started_at: now() };
14469
- writeFileSync4(tmpPath, JSON.stringify(payload), { mode: 384 });
14646
+ writeFileSync5(tmpPath, JSON.stringify(payload), { mode: 384 });
14470
14647
  renameSync4(tmpPath, path);
14471
14648
  return { kind: "acquired", path };
14472
14649
  }
@@ -14482,9 +14659,9 @@ function releaseMcpSpawnLock(lockPath, opts = {}) {
14482
14659
  }
14483
14660
  }
14484
14661
  function readLockHolder(path) {
14485
- if (!existsSync4(path)) return null;
14662
+ if (!existsSync5(path)) return null;
14486
14663
  try {
14487
- const raw = readFileSync4(path, "utf8");
14664
+ const raw = readFileSync6(path, "utf8");
14488
14665
  const parsed = JSON.parse(raw);
14489
14666
  const pid = typeof parsed.pid === "number" ? parsed.pid : Number(parsed.pid);
14490
14667
  if (!Number.isFinite(pid) || pid <= 0) return null;
@@ -14497,36 +14674,36 @@ function readLockHolder(path) {
14497
14674
 
14498
14675
  // src/direct-chat-channel.ts
14499
14676
  import { homedir as homedir2 } from "os";
14500
- import { join as join8 } from "path";
14677
+ import { join as join9 } from "path";
14501
14678
  import { randomUUID } from "crypto";
14502
14679
  import {
14503
14680
  watch,
14504
14681
  mkdirSync as mkdirSync5,
14505
- writeFileSync as writeFileSync5,
14506
- readFileSync as readFileSync6,
14507
- readdirSync as readdirSync3,
14682
+ writeFileSync as writeFileSync6,
14683
+ readFileSync as readFileSync7,
14684
+ readdirSync as readdirSync4,
14508
14685
  existsSync as existsSync6,
14509
14686
  renameSync as renameSync5,
14510
14687
  unlinkSync as unlinkSync3
14511
14688
  } from "fs";
14512
14689
 
14513
14690
  // src/direct-chat-inbound-attachments.ts
14514
- import { dirname as dirname2, join as join6 } from "path";
14691
+ import { dirname as dirname2, join as join8 } from "path";
14515
14692
  var MAX_INBOUND_ATTACHMENT_BYTES = 10 * 1024 * 1024;
14516
14693
  var INBOUND_ATTACHMENTS_SUBDIR = "direct-chat-inbound";
14517
14694
  function resolveInboundAttachmentsDir(input) {
14518
14695
  const { codeName, turnInitiatorFile, agentId, homeDir } = input;
14519
14696
  const codeNameTrimmed = typeof codeName === "string" ? codeName.trim() : "";
14520
14697
  if (codeNameTrimmed) {
14521
- return join6(homeDir, ".augmented", codeNameTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14698
+ return join8(homeDir, ".augmented", codeNameTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14522
14699
  }
14523
14700
  const initiator = typeof turnInitiatorFile === "string" ? turnInitiatorFile.trim() : "";
14524
14701
  if (initiator) {
14525
- return join6(dirname2(initiator), INBOUND_ATTACHMENTS_SUBDIR);
14702
+ return join8(dirname2(initiator), INBOUND_ATTACHMENTS_SUBDIR);
14526
14703
  }
14527
14704
  const agentIdTrimmed = typeof agentId === "string" ? agentId.trim() : "";
14528
14705
  if (agentIdTrimmed) {
14529
- return join6(homeDir, ".augmented", agentIdTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14706
+ return join8(homeDir, ".augmented", agentIdTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14530
14707
  }
14531
14708
  return null;
14532
14709
  }
@@ -14623,43 +14800,6 @@ async function downloadInboundAttachments(attachments, dir, deps) {
14623
14800
  return out;
14624
14801
  }
14625
14802
 
14626
- // src/flags-cache-read.ts
14627
- import { existsSync as existsSync5, readFileSync as readFileSync5 } from "fs";
14628
- import { homedir } from "os";
14629
- import { join as join7 } from "path";
14630
- function defaultFlagsCachePath() {
14631
- return join7(homedir(), ".augmented", "flags-cache.json");
14632
- }
14633
- function envBoolean(raw) {
14634
- if (raw === void 0) return void 0;
14635
- const v = raw.trim().toLowerCase();
14636
- if (v === "") return void 0;
14637
- if (v === "1" || v === "true" || v === "yes" || v === "on") return true;
14638
- if (v === "0" || v === "false" || v === "no" || v === "off") return false;
14639
- return void 0;
14640
- }
14641
- function cachedBoolean(key, path) {
14642
- try {
14643
- if (!existsSync5(path)) return void 0;
14644
- const parsed = JSON.parse(readFileSync5(path, "utf8"));
14645
- if (!parsed || typeof parsed !== "object") return void 0;
14646
- const flags = parsed.flags;
14647
- if (!flags || typeof flags !== "object") return void 0;
14648
- const value = flags[key];
14649
- return typeof value === "boolean" ? value : void 0;
14650
- } catch {
14651
- return void 0;
14652
- }
14653
- }
14654
- function resolveHostBooleanFlag(opts) {
14655
- const env = opts.env ?? process.env;
14656
- const envValue = envBoolean(env[opts.envVar]);
14657
- if (envValue !== void 0) return envValue;
14658
- const cached2 = cachedBoolean(opts.key, opts.cachePath ?? defaultFlagsCachePath());
14659
- if (cached2 !== void 0) return cached2;
14660
- return opts.defaultValue;
14661
- }
14662
-
14663
14803
  // src/direct-chat-stream.ts
14664
14804
  var DEFAULT_STREAM_SLICE_CONFIG = {
14665
14805
  minContentLength: 120,
@@ -14978,7 +15118,7 @@ var DIRECT_CHAT_MAINTENANCE_COOLDOWN_MS = (() => {
14978
15118
  var AGT_HOST = process.env.AGT_HOST;
14979
15119
  var AGT_API_KEY = process.env.AGT_API_KEY;
14980
15120
  var AGT_AGENT_ID = process.env.AGT_AGENT_ID;
14981
- var DIRECT_CHAT_AGENT_DIR = AGT_AGENT_ID ? join8(homedir2(), ".augmented", AGT_AGENT_ID) : null;
15121
+ var DIRECT_CHAT_AGENT_DIR = AGT_AGENT_ID ? join9(homedir2(), ".augmented", AGT_AGENT_ID) : null;
14982
15122
  var INBOUND_ATTACHMENTS_DIR = resolveInboundAttachmentsDir({
14983
15123
  codeName: process.env.AGT_AGENT_CODE_NAME,
14984
15124
  turnInitiatorFile: process.env.AGT_TURN_INITIATOR_FILE,
@@ -14986,9 +15126,11 @@ var INBOUND_ATTACHMENTS_DIR = resolveInboundAttachmentsDir({
14986
15126
  homeDir: homedir2()
14987
15127
  });
14988
15128
  var AGT_AGENT_CODE_NAME = process.env.AGT_AGENT_CODE_NAME;
14989
- var PROGRESS_HEARTBEAT_PATH = AGT_AGENT_CODE_NAME ? join8(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "channel-progress-heartbeat.json") : null;
14990
- var DIRECT_CHAT_PENDING_INBOUND_DIR = AGT_AGENT_CODE_NAME ? join8(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "direct-chat-pending-inbound") : null;
14991
- var DIRECT_CHAT_DELIVERY_LEDGER_DIR = AGT_AGENT_CODE_NAME ? join8(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, ".agt-inbound-delivery-ledger") : null;
15129
+ var PROGRESS_HEARTBEAT_PATH = AGT_AGENT_CODE_NAME ? join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "channel-progress-heartbeat.json") : null;
15130
+ var DIRECT_CHAT_PENDING_INBOUND_DIR = AGT_AGENT_CODE_NAME ? join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "direct-chat-pending-inbound") : null;
15131
+ var DIRECT_CHAT_DELIVERY_LEDGER_DIR = AGT_AGENT_CODE_NAME ? join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, ".agt-inbound-delivery-ledger") : null;
15132
+ var DIRECT_CHAT_CODE_NAME_AGENT_DIR = AGT_AGENT_CODE_NAME ? join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME) : null;
15133
+ var DIRECT_CHAT_STALE_MARKER_MS = 24 * 60 * 60 * 1e3;
14992
15134
  function recordDirectChatDelivery(sessionId, messageIds) {
14993
15135
  if (!sessionId) return;
14994
15136
  writeInboundDeliveryLedgerEntry(DIRECT_CHAT_DELIVERY_LEDGER_DIR, {
@@ -14998,8 +15140,8 @@ function recordDirectChatDelivery(sessionId, messageIds) {
14998
15140
  delivered_at: (/* @__PURE__ */ new Date()).toISOString()
14999
15141
  });
15000
15142
  }
15001
- var DIRECT_CHAT_RECOVERY_OUTBOX_DIR = AGT_AGENT_CODE_NAME ? join8(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "direct-chat-recovery-outbox") : null;
15002
- var DIRECT_CHAT_RECOVERY_LEDGER_DIR = AGT_AGENT_CODE_NAME ? join8(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, ".agt-direct-chat-recovery-ledger") : null;
15143
+ var DIRECT_CHAT_RECOVERY_OUTBOX_DIR = AGT_AGENT_CODE_NAME ? join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "direct-chat-recovery-outbox") : null;
15144
+ var DIRECT_CHAT_RECOVERY_LEDGER_DIR = AGT_AGENT_CODE_NAME ? join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, ".agt-direct-chat-recovery-ledger") : null;
15003
15145
  var progressReceivedAt = /* @__PURE__ */ new Map();
15004
15146
  var directChatProgressState = { tracked: null };
15005
15147
  var directChatProgressTickRunning = false;
@@ -15018,7 +15160,7 @@ var directChatKanbanCardClient = createKanbanCardActiveClient({
15018
15160
  function readProgressHeartbeat() {
15019
15161
  if (!PROGRESS_HEARTBEAT_PATH || !existsSync6(PROGRESS_HEARTBEAT_PATH)) return null;
15020
15162
  try {
15021
- return parseProgressHeartbeat(readFileSync6(PROGRESS_HEARTBEAT_PATH, "utf-8"));
15163
+ return parseProgressHeartbeat(readFileSync7(PROGRESS_HEARTBEAT_PATH, "utf-8"));
15022
15164
  } catch {
15023
15165
  return null;
15024
15166
  }
@@ -15027,8 +15169,8 @@ function seedProgressHeartbeat() {
15027
15169
  if (!PROGRESS_HEARTBEAT_PATH) return;
15028
15170
  const tmp = `${PROGRESS_HEARTBEAT_PATH}.${process.pid}.tmp`;
15029
15171
  try {
15030
- mkdirSync5(join8(homedir2(), ".augmented", AGT_AGENT_CODE_NAME), { recursive: true });
15031
- writeFileSync5(tmp, serializeProgressHeartbeat(SEED_PROGRESS_STEP, Date.now()), { mode: 384 });
15172
+ mkdirSync5(join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME), { recursive: true });
15173
+ writeFileSync6(tmp, serializeProgressHeartbeat(SEED_PROGRESS_STEP, Date.now()), { mode: 384 });
15032
15174
  renameSync5(tmp, PROGRESS_HEARTBEAT_PATH);
15033
15175
  } catch {
15034
15176
  try {
@@ -15186,8 +15328,8 @@ var inboundAttachmentDeps = {
15186
15328
  };
15187
15329
  },
15188
15330
  ensureDir: (dir) => mkdirSync5(dir, { recursive: true }),
15189
- writeFile: (path, bytes) => writeFileSync5(path, bytes, { mode: 384 }),
15190
- joinPath: (...parts) => join8(...parts),
15331
+ writeFile: (path, bytes) => writeFileSync6(path, bytes, { mode: 384 }),
15332
+ joinPath: (...parts) => join9(...parts),
15191
15333
  warn: (msg) => process.stderr.write(`${msg}
15192
15334
  `)
15193
15335
  };
@@ -15672,6 +15814,36 @@ if (PROGRESS_HEARTBEAT_PATH) {
15672
15814
  }, PROGRESS_TICK_MS);
15673
15815
  progressTickTimer.unref?.();
15674
15816
  }
15817
+ function sweepAgedDirectChatMarkersNow(thresholdMs) {
15818
+ if (!DIRECT_CHAT_PENDING_INBOUND_DIR) return;
15819
+ const now = Date.now();
15820
+ const res = sweepAgedDirectChatMarkers(DIRECT_CHAT_PENDING_INBOUND_DIR, {
15821
+ readdir: (dir) => readdirSync4(dir),
15822
+ readFile: (p) => readFileSync7(p, "utf8"),
15823
+ unlink: (p) => {
15824
+ if (existsSync6(p)) unlinkSync3(p);
15825
+ },
15826
+ isAged: (receivedAt) => isMarkerGenuinelyAged(receivedAt, now, thresholdMs),
15827
+ hasDelivery: (inboundId) => inboundDeliveryLedgerHas(DIRECT_CHAT_DELIVERY_LEDGER_DIR, inboundId),
15828
+ onOrphaned: () => recordChannelDeflection(DIRECT_CHAT_CODE_NAME_AGENT_DIR, "direct-chat", "replay_orphaned")
15829
+ });
15830
+ if (res.cleared > 0) {
15831
+ process.stderr.write(
15832
+ `direct-chat-channel(${AGT_AGENT_CODE_NAME}): stale-marker sweep cleared=${res.cleared} orphaned=${res.orphaned}
15833
+ `
15834
+ );
15835
+ }
15836
+ }
15837
+ var directChatOrphanSweepTimer = null;
15838
+ if (DIRECT_CHAT_PENDING_INBOUND_DIR) {
15839
+ sweepAgedDirectChatMarkersNow(DIRECT_CHAT_STALE_MARKER_MS);
15840
+ directChatOrphanSweepTimer = setInterval(() => {
15841
+ const probe = process.env.TMUX && AGT_AGENT_CODE_NAME ? probeAgentSessionCached(AGT_AGENT_CODE_NAME) : { tmux: "unknown", claude: "unknown" };
15842
+ const sessionAlive = probe.tmux === "alive" && probe.claude === "alive";
15843
+ sweepAgedDirectChatMarkersNow(sessionAlive ? channelOrphanMarkerMs() : DIRECT_CHAT_STALE_MARKER_MS);
15844
+ }, orphanSweepIntervalMs());
15845
+ directChatOrphanSweepTimer.unref?.();
15846
+ }
15675
15847
  function sanitizeRecoveryText(text) {
15676
15848
  const preamble = stripRepostPreambleWithMeta(text);
15677
15849
  if (preamble.stripped) emitPreambleStripTelemetry("direct_chat", preamble.shape);
@@ -15683,7 +15855,7 @@ function sanitizeRecoveryText(text) {
15683
15855
  }
15684
15856
  function directChatRecoveryDeps() {
15685
15857
  return {
15686
- readFile: (p) => readFileSync6(p, "utf-8"),
15858
+ readFile: (p) => readFileSync7(p, "utf-8"),
15687
15859
  renameFile: (from, to) => renameSync5(from, to),
15688
15860
  unlinkFile: (p) => {
15689
15861
  if (existsSync6(p)) unlinkSync3(p);
@@ -15696,7 +15868,7 @@ function directChatRecoveryDeps() {
15696
15868
  if (!DIRECT_CHAT_RECOVERY_LEDGER_DIR) return;
15697
15869
  if (markerName.includes("/") || markerName.includes("\\") || markerName.includes("..")) return;
15698
15870
  try {
15699
- const p = join8(DIRECT_CHAT_RECOVERY_LEDGER_DIR, markerName);
15871
+ const p = join9(DIRECT_CHAT_RECOVERY_LEDGER_DIR, markerName);
15700
15872
  if (existsSync6(p)) unlinkSync3(p);
15701
15873
  } catch {
15702
15874
  }
@@ -15732,7 +15904,7 @@ async function processDirectChatRecoveryOutboxFile(filename) {
15732
15904
  if (!enabled) return;
15733
15905
  directChatRecoveryInFlight.add(filename);
15734
15906
  try {
15735
- const fullPath = join8(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, filename);
15907
+ const fullPath = join9(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, filename);
15736
15908
  await consumeDirectChatRecoveryFile(fullPath, filename, directChatRecoveryDeps());
15737
15909
  } catch (err) {
15738
15910
  process.stderr.write(
@@ -15750,7 +15922,7 @@ if (DIRECT_CHAT_RECOVERY_OUTBOX_DIR) {
15750
15922
  } catch {
15751
15923
  }
15752
15924
  try {
15753
- for (const f of readdirSync3(DIRECT_CHAT_RECOVERY_OUTBOX_DIR)) {
15925
+ for (const f of readdirSync4(DIRECT_CHAT_RECOVERY_OUTBOX_DIR)) {
15754
15926
  if (f.endsWith(".json")) void processDirectChatRecoveryOutboxFile(f);
15755
15927
  }
15756
15928
  } catch {
@@ -15760,7 +15932,7 @@ if (DIRECT_CHAT_RECOVERY_OUTBOX_DIR) {
15760
15932
  if (!filename) return;
15761
15933
  const name = filename.toString();
15762
15934
  if (!name.endsWith(".json")) return;
15763
- if (existsSync6(join8(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, name))) {
15935
+ if (existsSync6(join9(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, name))) {
15764
15936
  void processDirectChatRecoveryOutboxFile(name);
15765
15937
  }
15766
15938
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.332",
3
+ "version": "0.28.333",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {