@integrity-labs/agt-cli 0.28.331 → 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.
@@ -43,7 +43,7 @@ import {
43
43
  requireHost,
44
44
  safeWriteJsonAtomic,
45
45
  setConfigHash
46
- } from "../chunk-4Y3UPOR2.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.331" : "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();
@@ -9530,7 +9530,7 @@ async function pollCycle() {
9530
9530
  const {
9531
9531
  collectResponsivenessProbes,
9532
9532
  getResponsivenessIntervalMs
9533
- } = await import("../responsiveness-probe-OJJESVVX.js");
9533
+ } = await import("../responsiveness-probe-46XFHCPY.js");
9534
9534
  const probeIntervalMs = getResponsivenessIntervalMs();
9535
9535
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
9536
9536
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -9562,7 +9562,7 @@ async function pollCycle() {
9562
9562
  collectResponsivenessProbes,
9563
9563
  livePendingInboundOldestAgeSeconds,
9564
9564
  parkPendingInbound
9565
- } = await import("../responsiveness-probe-OJJESVVX.js");
9565
+ } = await import("../responsiveness-probe-46XFHCPY.js");
9566
9566
  const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
9567
9567
  const wedgeNow = /* @__PURE__ */ new Date();
9568
9568
  const liveAgents = agentState.persistentSessionAgents;
@@ -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) {
@@ -14378,6 +14414,175 @@ async function consumeDirectChatRecoveryFile(fullPath, filename, deps) {
14378
14414
  return "failed";
14379
14415
  }
14380
14416
 
14417
+ // src/inbound-delivery-ledger.ts
14418
+ import { existsSync as existsSync3, mkdirSync as mkdirSync3, readdirSync as readdirSync2, readFileSync as readFileSync3, renameSync as renameSync3, writeFileSync as writeFileSync3 } from "fs";
14419
+ import { join as join4 } from "path";
14420
+ function safeInboundId(inboundId) {
14421
+ return inboundId.replace(/[^A-Za-z0-9_-]/g, "_");
14422
+ }
14423
+ var defaultDeps = {
14424
+ mkdir: (dir) => mkdirSync3(dir, { recursive: true }),
14425
+ writeFile: (path, data) => writeFileSync3(path, data, "utf8"),
14426
+ rename: (from, to) => renameSync3(from, to),
14427
+ readdir: (dir) => readdirSync2(dir),
14428
+ readFile: (path) => readFileSync3(path, "utf8"),
14429
+ exists: (path) => existsSync3(path)
14430
+ };
14431
+ function writeInboundDeliveryLedgerEntry(dir, record2, deps = defaultDeps) {
14432
+ if (!dir || !record2.inbound_id || !record2.conv_key) return;
14433
+ const safe = safeInboundId(record2.inbound_id);
14434
+ if (!safe || safe.includes("/") || safe.includes("\\") || safe.includes("..")) return;
14435
+ try {
14436
+ deps.mkdir(dir);
14437
+ const final = join4(dir, `${safe}.json`);
14438
+ const tmp = `${final}.tmp`;
14439
+ deps.writeFile(tmp, JSON.stringify(record2));
14440
+ deps.rename(tmp, final);
14441
+ } catch {
14442
+ }
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
+ }
14585
+
14381
14586
  // src/direct-chat-poll-guard.ts
14382
14587
  function evaluatePollGuard(state, nowMs, stuckMs) {
14383
14588
  if (!state.inFlight) return { run: true, stuck: false };
@@ -14400,14 +14605,14 @@ async function fetchWithTimeout(input, init, timeoutMs, fetchImpl = fetch) {
14400
14605
 
14401
14606
  // src/mcp-spawn-lock.ts
14402
14607
  import {
14403
- existsSync as existsSync3,
14404
- mkdirSync as mkdirSync3,
14405
- readFileSync as readFileSync3,
14406
- renameSync as renameSync3,
14608
+ existsSync as existsSync5,
14609
+ mkdirSync as mkdirSync4,
14610
+ readFileSync as readFileSync6,
14611
+ renameSync as renameSync4,
14407
14612
  unlinkSync as unlinkSync2,
14408
- writeFileSync as writeFileSync3
14613
+ writeFileSync as writeFileSync5
14409
14614
  } from "fs";
14410
- import { join as join4 } from "path";
14615
+ import { join as join7 } from "path";
14411
14616
  function defaultIsPidAlive(pid) {
14412
14617
  if (!Number.isFinite(pid) || pid <= 0) return false;
14413
14618
  try {
@@ -14425,7 +14630,7 @@ function acquireMcpSpawnLock(args) {
14425
14630
  const isPidAlive = options.isPidAlive ?? defaultIsPidAlive;
14426
14631
  const selfPid = options.selfPid ?? process.pid;
14427
14632
  const now = options.now ?? (() => (/* @__PURE__ */ new Date()).toISOString());
14428
- const path = join4(agentDir, basename);
14633
+ const path = join7(agentDir, basename);
14429
14634
  const existing = readLockHolder(path);
14430
14635
  if (existing) {
14431
14636
  if (existing.pid === selfPid) {
@@ -14435,11 +14640,11 @@ function acquireMcpSpawnLock(args) {
14435
14640
  return { kind: "blocked", path, holder: existing };
14436
14641
  }
14437
14642
  }
14438
- mkdirSync3(agentDir, { recursive: true, mode: 448 });
14643
+ mkdirSync4(agentDir, { recursive: true, mode: 448 });
14439
14644
  const tmpPath = `${path}.${selfPid}.tmp`;
14440
14645
  const payload = { pid: selfPid, started_at: now() };
14441
- writeFileSync3(tmpPath, JSON.stringify(payload), { mode: 384 });
14442
- renameSync3(tmpPath, path);
14646
+ writeFileSync5(tmpPath, JSON.stringify(payload), { mode: 384 });
14647
+ renameSync4(tmpPath, path);
14443
14648
  return { kind: "acquired", path };
14444
14649
  }
14445
14650
  function releaseMcpSpawnLock(lockPath, opts = {}) {
@@ -14454,9 +14659,9 @@ function releaseMcpSpawnLock(lockPath, opts = {}) {
14454
14659
  }
14455
14660
  }
14456
14661
  function readLockHolder(path) {
14457
- if (!existsSync3(path)) return null;
14662
+ if (!existsSync5(path)) return null;
14458
14663
  try {
14459
- const raw = readFileSync3(path, "utf8");
14664
+ const raw = readFileSync6(path, "utf8");
14460
14665
  const parsed = JSON.parse(raw);
14461
14666
  const pid = typeof parsed.pid === "number" ? parsed.pid : Number(parsed.pid);
14462
14667
  if (!Number.isFinite(pid) || pid <= 0) return null;
@@ -14469,36 +14674,36 @@ function readLockHolder(path) {
14469
14674
 
14470
14675
  // src/direct-chat-channel.ts
14471
14676
  import { homedir as homedir2 } from "os";
14472
- import { join as join7 } from "path";
14677
+ import { join as join9 } from "path";
14473
14678
  import { randomUUID } from "crypto";
14474
14679
  import {
14475
14680
  watch,
14476
- mkdirSync as mkdirSync4,
14477
- writeFileSync as writeFileSync4,
14478
- readFileSync as readFileSync5,
14479
- readdirSync as readdirSync2,
14480
- existsSync as existsSync5,
14481
- renameSync as renameSync4,
14681
+ mkdirSync as mkdirSync5,
14682
+ writeFileSync as writeFileSync6,
14683
+ readFileSync as readFileSync7,
14684
+ readdirSync as readdirSync4,
14685
+ existsSync as existsSync6,
14686
+ renameSync as renameSync5,
14482
14687
  unlinkSync as unlinkSync3
14483
14688
  } from "fs";
14484
14689
 
14485
14690
  // src/direct-chat-inbound-attachments.ts
14486
- import { dirname as dirname2, join as join5 } from "path";
14691
+ import { dirname as dirname2, join as join8 } from "path";
14487
14692
  var MAX_INBOUND_ATTACHMENT_BYTES = 10 * 1024 * 1024;
14488
14693
  var INBOUND_ATTACHMENTS_SUBDIR = "direct-chat-inbound";
14489
14694
  function resolveInboundAttachmentsDir(input) {
14490
14695
  const { codeName, turnInitiatorFile, agentId, homeDir } = input;
14491
14696
  const codeNameTrimmed = typeof codeName === "string" ? codeName.trim() : "";
14492
14697
  if (codeNameTrimmed) {
14493
- return join5(homeDir, ".augmented", codeNameTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14698
+ return join8(homeDir, ".augmented", codeNameTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14494
14699
  }
14495
14700
  const initiator = typeof turnInitiatorFile === "string" ? turnInitiatorFile.trim() : "";
14496
14701
  if (initiator) {
14497
- return join5(dirname2(initiator), INBOUND_ATTACHMENTS_SUBDIR);
14702
+ return join8(dirname2(initiator), INBOUND_ATTACHMENTS_SUBDIR);
14498
14703
  }
14499
14704
  const agentIdTrimmed = typeof agentId === "string" ? agentId.trim() : "";
14500
14705
  if (agentIdTrimmed) {
14501
- return join5(homeDir, ".augmented", agentIdTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14706
+ return join8(homeDir, ".augmented", agentIdTrimmed, INBOUND_ATTACHMENTS_SUBDIR);
14502
14707
  }
14503
14708
  return null;
14504
14709
  }
@@ -14595,43 +14800,6 @@ async function downloadInboundAttachments(attachments, dir, deps) {
14595
14800
  return out;
14596
14801
  }
14597
14802
 
14598
- // src/flags-cache-read.ts
14599
- import { existsSync as existsSync4, readFileSync as readFileSync4 } from "fs";
14600
- import { homedir } from "os";
14601
- import { join as join6 } from "path";
14602
- function defaultFlagsCachePath() {
14603
- return join6(homedir(), ".augmented", "flags-cache.json");
14604
- }
14605
- function envBoolean(raw) {
14606
- if (raw === void 0) return void 0;
14607
- const v = raw.trim().toLowerCase();
14608
- if (v === "") return void 0;
14609
- if (v === "1" || v === "true" || v === "yes" || v === "on") return true;
14610
- if (v === "0" || v === "false" || v === "no" || v === "off") return false;
14611
- return void 0;
14612
- }
14613
- function cachedBoolean(key, path) {
14614
- try {
14615
- if (!existsSync4(path)) return void 0;
14616
- const parsed = JSON.parse(readFileSync4(path, "utf8"));
14617
- if (!parsed || typeof parsed !== "object") return void 0;
14618
- const flags = parsed.flags;
14619
- if (!flags || typeof flags !== "object") return void 0;
14620
- const value = flags[key];
14621
- return typeof value === "boolean" ? value : void 0;
14622
- } catch {
14623
- return void 0;
14624
- }
14625
- }
14626
- function resolveHostBooleanFlag(opts) {
14627
- const env = opts.env ?? process.env;
14628
- const envValue = envBoolean(env[opts.envVar]);
14629
- if (envValue !== void 0) return envValue;
14630
- const cached2 = cachedBoolean(opts.key, opts.cachePath ?? defaultFlagsCachePath());
14631
- if (cached2 !== void 0) return cached2;
14632
- return opts.defaultValue;
14633
- }
14634
-
14635
14803
  // src/direct-chat-stream.ts
14636
14804
  var DEFAULT_STREAM_SLICE_CONFIG = {
14637
14805
  minContentLength: 120,
@@ -14950,7 +15118,7 @@ var DIRECT_CHAT_MAINTENANCE_COOLDOWN_MS = (() => {
14950
15118
  var AGT_HOST = process.env.AGT_HOST;
14951
15119
  var AGT_API_KEY = process.env.AGT_API_KEY;
14952
15120
  var AGT_AGENT_ID = process.env.AGT_AGENT_ID;
14953
- var DIRECT_CHAT_AGENT_DIR = AGT_AGENT_ID ? join7(homedir2(), ".augmented", AGT_AGENT_ID) : null;
15121
+ var DIRECT_CHAT_AGENT_DIR = AGT_AGENT_ID ? join9(homedir2(), ".augmented", AGT_AGENT_ID) : null;
14954
15122
  var INBOUND_ATTACHMENTS_DIR = resolveInboundAttachmentsDir({
14955
15123
  codeName: process.env.AGT_AGENT_CODE_NAME,
14956
15124
  turnInitiatorFile: process.env.AGT_TURN_INITIATOR_FILE,
@@ -14958,10 +15126,22 @@ var INBOUND_ATTACHMENTS_DIR = resolveInboundAttachmentsDir({
14958
15126
  homeDir: homedir2()
14959
15127
  });
14960
15128
  var AGT_AGENT_CODE_NAME = process.env.AGT_AGENT_CODE_NAME;
14961
- var PROGRESS_HEARTBEAT_PATH = AGT_AGENT_CODE_NAME ? join7(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "channel-progress-heartbeat.json") : null;
14962
- var DIRECT_CHAT_PENDING_INBOUND_DIR = AGT_AGENT_CODE_NAME ? join7(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "direct-chat-pending-inbound") : null;
14963
- var DIRECT_CHAT_RECOVERY_OUTBOX_DIR = AGT_AGENT_CODE_NAME ? join7(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, "direct-chat-recovery-outbox") : null;
14964
- var DIRECT_CHAT_RECOVERY_LEDGER_DIR = AGT_AGENT_CODE_NAME ? join7(homedir2(), ".augmented", AGT_AGENT_CODE_NAME, ".agt-direct-chat-recovery-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;
15134
+ function recordDirectChatDelivery(sessionId, messageIds) {
15135
+ if (!sessionId) return;
15136
+ writeInboundDeliveryLedgerEntry(DIRECT_CHAT_DELIVERY_LEDGER_DIR, {
15137
+ inbound_id: directChatInboundId(sessionId, messageIds[0] ?? ""),
15138
+ source: "direct-chat",
15139
+ conv_key: sessionId,
15140
+ delivered_at: (/* @__PURE__ */ new Date()).toISOString()
15141
+ });
15142
+ }
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;
14965
15145
  var progressReceivedAt = /* @__PURE__ */ new Map();
14966
15146
  var directChatProgressState = { tracked: null };
14967
15147
  var directChatProgressTickRunning = false;
@@ -14978,9 +15158,9 @@ var directChatKanbanCardClient = createKanbanCardActiveClient({
14978
15158
  `)
14979
15159
  });
14980
15160
  function readProgressHeartbeat() {
14981
- if (!PROGRESS_HEARTBEAT_PATH || !existsSync5(PROGRESS_HEARTBEAT_PATH)) return null;
15161
+ if (!PROGRESS_HEARTBEAT_PATH || !existsSync6(PROGRESS_HEARTBEAT_PATH)) return null;
14982
15162
  try {
14983
- return parseProgressHeartbeat(readFileSync5(PROGRESS_HEARTBEAT_PATH, "utf-8"));
15163
+ return parseProgressHeartbeat(readFileSync7(PROGRESS_HEARTBEAT_PATH, "utf-8"));
14984
15164
  } catch {
14985
15165
  return null;
14986
15166
  }
@@ -14989,9 +15169,9 @@ function seedProgressHeartbeat() {
14989
15169
  if (!PROGRESS_HEARTBEAT_PATH) return;
14990
15170
  const tmp = `${PROGRESS_HEARTBEAT_PATH}.${process.pid}.tmp`;
14991
15171
  try {
14992
- mkdirSync4(join7(homedir2(), ".augmented", AGT_AGENT_CODE_NAME), { recursive: true });
14993
- writeFileSync4(tmp, serializeProgressHeartbeat(SEED_PROGRESS_STEP, Date.now()), { mode: 384 });
14994
- renameSync4(tmp, PROGRESS_HEARTBEAT_PATH);
15172
+ mkdirSync5(join9(homedir2(), ".augmented", AGT_AGENT_CODE_NAME), { recursive: true });
15173
+ writeFileSync6(tmp, serializeProgressHeartbeat(SEED_PROGRESS_STEP, Date.now()), { mode: 384 });
15174
+ renameSync5(tmp, PROGRESS_HEARTBEAT_PATH);
14995
15175
  } catch {
14996
15176
  try {
14997
15177
  unlinkSync3(tmp);
@@ -15147,9 +15327,9 @@ var inboundAttachmentDeps = {
15147
15327
  bytes: async () => new Uint8Array(await res.arrayBuffer())
15148
15328
  };
15149
15329
  },
15150
- ensureDir: (dir) => mkdirSync4(dir, { recursive: true }),
15151
- writeFile: (path, bytes) => writeFileSync4(path, bytes, { mode: 384 }),
15152
- joinPath: (...parts) => join7(...parts),
15330
+ ensureDir: (dir) => mkdirSync5(dir, { recursive: true }),
15331
+ writeFile: (path, bytes) => writeFileSync6(path, bytes, { mode: 384 }),
15332
+ joinPath: (...parts) => join9(...parts),
15153
15333
  warn: (msg) => process.stderr.write(`${msg}
15154
15334
  `)
15155
15335
  };
@@ -15318,6 +15498,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
15318
15498
  }
15319
15499
  claimTracker.clear(session_id, message_ids);
15320
15500
  clearDirectChatPendingMarkersForSession(DIRECT_CHAT_PENDING_INBOUND_DIR, session_id);
15501
+ recordDirectChatDelivery(session_id, message_ids);
15321
15502
  const messageId = data.message_id;
15322
15503
  for (let i = 1; i < slices.length; i++) {
15323
15504
  await sleep(STREAM_REPLY_FLUSH_MS);
@@ -15363,6 +15544,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
15363
15544
  }
15364
15545
  claimTracker.clear(session_id, message_ids);
15365
15546
  clearDirectChatPendingMarkersForSession(DIRECT_CHAT_PENDING_INBOUND_DIR, session_id);
15547
+ recordDirectChatDelivery(session_id, message_ids);
15366
15548
  return { content: [{ type: "text", text: "sent" }] };
15367
15549
  } catch (err) {
15368
15550
  return {
@@ -15392,6 +15574,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
15392
15574
  }
15393
15575
  claimTracker.clear(session_id, message_ids);
15394
15576
  clearDirectChatPendingMarkersForSession(DIRECT_CHAT_PENDING_INBOUND_DIR, session_id);
15577
+ recordDirectChatDelivery(session_id, message_ids);
15395
15578
  return { content: [{ type: "text", text: "consumed" }] };
15396
15579
  } catch (err) {
15397
15580
  return {
@@ -15587,7 +15770,7 @@ var doorbellWatcher = null;
15587
15770
  var safetyNetTimer = null;
15588
15771
  if (DOORBELL_ENABLED && DIRECT_CHAT_AGENT_DIR) {
15589
15772
  try {
15590
- mkdirSync4(DIRECT_CHAT_AGENT_DIR, { recursive: true });
15773
+ mkdirSync5(DIRECT_CHAT_AGENT_DIR, { recursive: true });
15591
15774
  } catch {
15592
15775
  }
15593
15776
  const sessionState = readDirectChatSessionState(DIRECT_CHAT_AGENT_DIR, Date.now());
@@ -15631,6 +15814,36 @@ if (PROGRESS_HEARTBEAT_PATH) {
15631
15814
  }, PROGRESS_TICK_MS);
15632
15815
  progressTickTimer.unref?.();
15633
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
+ }
15634
15847
  function sanitizeRecoveryText(text) {
15635
15848
  const preamble = stripRepostPreambleWithMeta(text);
15636
15849
  if (preamble.stripped) emitPreambleStripTelemetry("direct_chat", preamble.shape);
@@ -15642,10 +15855,10 @@ function sanitizeRecoveryText(text) {
15642
15855
  }
15643
15856
  function directChatRecoveryDeps() {
15644
15857
  return {
15645
- readFile: (p) => readFileSync5(p, "utf-8"),
15646
- renameFile: (from, to) => renameSync4(from, to),
15858
+ readFile: (p) => readFileSync7(p, "utf-8"),
15859
+ renameFile: (from, to) => renameSync5(from, to),
15647
15860
  unlinkFile: (p) => {
15648
- if (existsSync5(p)) unlinkSync3(p);
15861
+ if (existsSync6(p)) unlinkSync3(p);
15649
15862
  },
15650
15863
  sanitize: sanitizeRecoveryText,
15651
15864
  peekClaims: (sessionId) => claimTracker.peek(sessionId),
@@ -15655,8 +15868,8 @@ function directChatRecoveryDeps() {
15655
15868
  if (!DIRECT_CHAT_RECOVERY_LEDGER_DIR) return;
15656
15869
  if (markerName.includes("/") || markerName.includes("\\") || markerName.includes("..")) return;
15657
15870
  try {
15658
- const p = join7(DIRECT_CHAT_RECOVERY_LEDGER_DIR, markerName);
15659
- if (existsSync5(p)) unlinkSync3(p);
15871
+ const p = join9(DIRECT_CHAT_RECOVERY_LEDGER_DIR, markerName);
15872
+ if (existsSync6(p)) unlinkSync3(p);
15660
15873
  } catch {
15661
15874
  }
15662
15875
  },
@@ -15691,7 +15904,7 @@ async function processDirectChatRecoveryOutboxFile(filename) {
15691
15904
  if (!enabled) return;
15692
15905
  directChatRecoveryInFlight.add(filename);
15693
15906
  try {
15694
- const fullPath = join7(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, filename);
15907
+ const fullPath = join9(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, filename);
15695
15908
  await consumeDirectChatRecoveryFile(fullPath, filename, directChatRecoveryDeps());
15696
15909
  } catch (err) {
15697
15910
  process.stderr.write(
@@ -15705,11 +15918,11 @@ async function processDirectChatRecoveryOutboxFile(filename) {
15705
15918
  var directChatRecoveryWatcher = null;
15706
15919
  if (DIRECT_CHAT_RECOVERY_OUTBOX_DIR) {
15707
15920
  try {
15708
- mkdirSync4(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, { recursive: true, mode: 448 });
15921
+ mkdirSync5(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, { recursive: true, mode: 448 });
15709
15922
  } catch {
15710
15923
  }
15711
15924
  try {
15712
- for (const f of readdirSync2(DIRECT_CHAT_RECOVERY_OUTBOX_DIR)) {
15925
+ for (const f of readdirSync4(DIRECT_CHAT_RECOVERY_OUTBOX_DIR)) {
15713
15926
  if (f.endsWith(".json")) void processDirectChatRecoveryOutboxFile(f);
15714
15927
  }
15715
15928
  } catch {
@@ -15719,7 +15932,7 @@ if (DIRECT_CHAT_RECOVERY_OUTBOX_DIR) {
15719
15932
  if (!filename) return;
15720
15933
  const name = filename.toString();
15721
15934
  if (!name.endsWith(".json")) return;
15722
- if (existsSync5(join7(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, name))) {
15935
+ if (existsSync6(join9(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, name))) {
15723
15936
  void processDirectChatRecoveryOutboxFile(name);
15724
15937
  }
15725
15938
  });