@integrity-labs/agt-cli 0.28.436 → 0.28.438

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.
@@ -29,7 +29,7 @@ import {
29
29
  resolveConnectivityProbe,
30
30
  worseConnectivityOutcome,
31
31
  wrapScheduledTaskPrompt
32
- } from "./chunk-IRFNOPFU.js";
32
+ } from "./chunk-MOASN7XT.js";
33
33
  import {
34
34
  parsePsRows
35
35
  } from "./chunk-XWVM4KPK.js";
@@ -4901,7 +4901,7 @@ function requireHost() {
4901
4901
  }
4902
4902
 
4903
4903
  // src/lib/api-client.ts
4904
- var agtCliVersion = true ? "0.28.436" : "dev";
4904
+ var agtCliVersion = true ? "0.28.438" : "dev";
4905
4905
  var lastConfigHash = null;
4906
4906
  function setConfigHash(hash) {
4907
4907
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -7402,4 +7402,4 @@ export {
7402
7402
  managerInstallSystemUnitCommand,
7403
7403
  managerUninstallSystemUnitCommand
7404
7404
  };
7405
- //# sourceMappingURL=chunk-DT6YHTVR.js.map
7405
+ //# sourceMappingURL=chunk-WNSFE56R.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-W7T5YOS6.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-2TTEAJDH.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-SZVGJMGJ.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-QDNXOLED.js.map
@@ -42,7 +42,7 @@ import {
42
42
  resolveEffectivePinRaw,
43
43
  safeWriteJsonAtomic,
44
44
  setConfigHash
45
- } from "../chunk-DT6YHTVR.js";
45
+ } from "../chunk-WNSFE56R.js";
46
46
  import {
47
47
  getProjectDir as getProjectDir2,
48
48
  getReadyTasks,
@@ -155,7 +155,7 @@ import {
155
155
  transcriptActivityAgeSeconds,
156
156
  writeEgressAllowlist,
157
157
  writeUsageLimitMarker
158
- } from "../chunk-IRFNOPFU.js";
158
+ } from "../chunk-MOASN7XT.js";
159
159
  import {
160
160
  reapOrphanChannelMcps
161
161
  } from "../chunk-XWVM4KPK.js";
@@ -9667,7 +9667,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
9667
9667
  var lastVersionCheckAt = 0;
9668
9668
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
9669
9669
  var lastResponsivenessProbeAt = 0;
9670
- var agtCliVersion = true ? "0.28.436" : "dev";
9670
+ var agtCliVersion = true ? "0.28.438" : "dev";
9671
9671
  function resolveBrewPath(execFileSync2) {
9672
9672
  try {
9673
9673
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -10825,7 +10825,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
10825
10825
  if (codeNames.length === 0) return;
10826
10826
  void (async () => {
10827
10827
  try {
10828
- const { collectDiagnostics } = await import("../persistent-session-W7T5YOS6.js");
10828
+ const { collectDiagnostics } = await import("../persistent-session-2TTEAJDH.js");
10829
10829
  await api.post("/host/heartbeat", {
10830
10830
  host_id: hostId,
10831
10831
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor)
@@ -10932,7 +10932,7 @@ async function pollCycle() {
10932
10932
  }
10933
10933
  try {
10934
10934
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
10935
- const { collectDiagnostics } = await import("../persistent-session-W7T5YOS6.js");
10935
+ const { collectDiagnostics } = await import("../persistent-session-2TTEAJDH.js");
10936
10936
  const diagCodeNames = [...agentState.persistentSessionAgents];
10937
10937
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor) : void 0;
10938
10938
  let tailscaleHostname;
@@ -11046,7 +11046,7 @@ async function pollCycle() {
11046
11046
  collectResponsivenessProbes,
11047
11047
  collectPanelessActivityProbes,
11048
11048
  getResponsivenessIntervalMs
11049
- } = await import("../responsiveness-probe-3NKR4QOX.js");
11049
+ } = await import("../responsiveness-probe-PMDNQ4J4.js");
11050
11050
  const probeIntervalMs = getResponsivenessIntervalMs();
11051
11051
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
11052
11052
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -11110,7 +11110,7 @@ async function pollCycle() {
11110
11110
  collectResponsivenessProbes,
11111
11111
  livePendingInboundOldestAgeSeconds,
11112
11112
  parkPendingInbound
11113
- } = await import("../responsiveness-probe-3NKR4QOX.js");
11113
+ } = await import("../responsiveness-probe-PMDNQ4J4.js");
11114
11114
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
11115
11115
  const wedgeNow = /* @__PURE__ */ new Date();
11116
11116
  const liveAgents = agentState.persistentSessionAgents;
@@ -14428,7 +14428,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
14428
14428
  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}`));
14429
14429
  void (async () => {
14430
14430
  try {
14431
- const { collectDiagnostics } = await import("../persistent-session-W7T5YOS6.js");
14431
+ const { collectDiagnostics } = await import("../persistent-session-2TTEAJDH.js");
14432
14432
  await api.post("/host/heartbeat", {
14433
14433
  host_id: hostId,
14434
14434
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor)
@@ -14478,7 +14478,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
14478
14478
  }
14479
14479
  try {
14480
14480
  const hostId = await getHostId();
14481
- const { collectDiagnostics } = await import("../persistent-session-W7T5YOS6.js");
14481
+ const { collectDiagnostics } = await import("../persistent-session-2TTEAJDH.js");
14482
14482
  await api.post("/host/heartbeat", {
14483
14483
  host_id: hostId,
14484
14484
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor)
@@ -14931,7 +14931,7 @@ async function processClaudePairSessions(agents) {
14931
14931
  killPairSession,
14932
14932
  pairTmuxSession,
14933
14933
  finalizeClaudePairOnboarding
14934
- } = await import("../claude-pair-runtime-SZVGJMGJ.js");
14934
+ } = await import("../claude-pair-runtime-QDNXOLED.js");
14935
14935
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
14936
14936
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
14937
14937
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -35505,6 +35505,21 @@ function readUsageLimitUntil(opts) {
35505
35505
  import { readFileSync as readFileSync10 } from "fs";
35506
35506
  import { homedir as homedir3 } from "os";
35507
35507
  import { join as join11 } from "path";
35508
+
35509
+ // ../core/dist/channels/governance/sender-policy-decline.js
35510
+ function decideDeclineReply(input) {
35511
+ const last = input.cache.get(input.key);
35512
+ if (last !== void 0) {
35513
+ const elapsed = input.now - last;
35514
+ if (elapsed < input.cooldownMs) {
35515
+ return { reply: false, remainingMs: input.cooldownMs - elapsed };
35516
+ }
35517
+ }
35518
+ input.cache.set(input.key, input.now);
35519
+ return { reply: true };
35520
+ }
35521
+
35522
+ // src/account-enforcement-notice.ts
35508
35523
  function accountEnforcementMarkerPath(codeName) {
35509
35524
  if (!codeName) return null;
35510
35525
  return join11(homedir3(), ".augmented", codeName, ACCOUNT_ENFORCEMENT_MARKER_FILENAME);
@@ -35520,18 +35535,16 @@ function readAccountEnforcementLevel(opts) {
35520
35535
  }
35521
35536
  return parseAccountEnforcementMarker(raw)?.level ?? null;
35522
35537
  }
35523
-
35524
- // ../core/dist/channels/governance/sender-policy-decline.js
35525
- function decideDeclineReply(input) {
35526
- const last = input.cache.get(input.key);
35527
- if (last !== void 0) {
35528
- const elapsed = input.now - last;
35529
- if (elapsed < input.cooldownMs) {
35530
- return { reply: false, remainingMs: input.cooldownMs - elapsed };
35531
- }
35538
+ function shouldSendAccountWarn(opts) {
35539
+ if (readAccountEnforcementLevel({ codeName: opts.codeName, filePath: opts.filePath }) !== "warn") {
35540
+ return false;
35532
35541
  }
35533
- input.cache.set(input.key, input.now);
35534
- return { reply: true };
35542
+ return decideDeclineReply({
35543
+ cache: opts.cache,
35544
+ key: opts.key,
35545
+ cooldownMs: opts.cooldownMs,
35546
+ now: opts.now ?? Date.now()
35547
+ }).reply;
35535
35548
  }
35536
35549
 
35537
35550
  // src/direct-chat-channel.ts
@@ -35543,6 +35556,12 @@ var DIRECT_CHAT_MAINTENANCE_COOLDOWN_MS = (() => {
35543
35556
  })();
35544
35557
  var DIRECT_CHAT_USAGE_LIMIT_CACHE = /* @__PURE__ */ new Map();
35545
35558
  var DIRECT_CHAT_ACCOUNT_MUTE_CACHE = /* @__PURE__ */ new Map();
35559
+ var DIRECT_CHAT_ACCOUNT_WARN_CACHE = /* @__PURE__ */ new Map();
35560
+ var DIRECT_CHAT_ACCOUNT_WARN_COOLDOWN_MS = (() => {
35561
+ const raw = process.env["DIRECT_CHAT_ACCOUNT_WARN_COOLDOWN_SEC"];
35562
+ const n = raw ? Number(raw) : NaN;
35563
+ return Number.isFinite(n) && n >= 0 ? n * 1e3 : 24 * 60 * 60 * 1e3;
35564
+ })();
35546
35565
  var AGT_HOST = process.env.AGT_HOST;
35547
35566
  var AGT_API_KEY = process.env.AGT_API_KEY;
35548
35567
  var AGT_AGENT_ID = process.env.AGT_AGENT_ID;
@@ -35769,6 +35788,38 @@ async function apiPost(path, body) {
35769
35788
  }
35770
35789
  return res;
35771
35790
  }
35791
+ async function maybeSendDirectChatAccountWarn(sessionId) {
35792
+ try {
35793
+ if (!shouldSendAccountWarn({
35794
+ codeName: AGT_AGENT_CODE_NAME ?? null,
35795
+ cache: DIRECT_CHAT_ACCOUNT_WARN_CACHE,
35796
+ key: `${sessionId}|account_warn`,
35797
+ cooldownMs: DIRECT_CHAT_ACCOUNT_WARN_COOLDOWN_MS
35798
+ })) {
35799
+ return;
35800
+ }
35801
+ const res = await apiPost("/host/direct-chat/reply", {
35802
+ agent_id: AGT_AGENT_ID,
35803
+ session_id: sessionId,
35804
+ content: buildAccountIssueReplyText(),
35805
+ message_ids: []
35806
+ });
35807
+ const data = await res.json().catch(() => ({}));
35808
+ if (!res.ok || data.error) {
35809
+ DIRECT_CHAT_ACCOUNT_WARN_CACHE.delete(`${sessionId}|account_warn`);
35810
+ process.stderr.write(
35811
+ `direct-chat-channel: account-warn follow-up failed: ${data.error ?? `HTTP ${res.status}`}
35812
+ `
35813
+ );
35814
+ }
35815
+ } catch (err) {
35816
+ DIRECT_CHAT_ACCOUNT_WARN_CACHE.delete(`${sessionId}|account_warn`);
35817
+ process.stderr.write(
35818
+ `direct-chat-channel: account-warn follow-up error: ${err.message}
35819
+ `
35820
+ );
35821
+ }
35822
+ }
35772
35823
  var inboundAttachmentDeps = {
35773
35824
  fetchUrl: async (url) => {
35774
35825
  const res = await fetchWithTimeout(url, { method: "GET" }, HTTP_TIMEOUT_MS);
@@ -35980,6 +36031,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
35980
36031
  }
35981
36032
  }
35982
36033
  }
36034
+ await maybeSendDirectChatAccountWarn(session_id);
35983
36035
  return { content: [{ type: "text", text: "sent" }] };
35984
36036
  } catch (err) {
35985
36037
  return {
@@ -36005,6 +36057,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
36005
36057
  claimTracker.clear(session_id, message_ids);
36006
36058
  clearDirectChatPendingMarkersForSession(DIRECT_CHAT_PENDING_INBOUND_DIR, session_id);
36007
36059
  recordDirectChatDelivery(session_id, message_ids);
36060
+ await maybeSendDirectChatAccountWarn(session_id);
36008
36061
  return { content: [{ type: "text", text: "sent" }] };
36009
36062
  } catch (err) {
36010
36063
  return {
@@ -35089,6 +35089,17 @@ function readAccountEnforcementLevel(opts) {
35089
35089
  }
35090
35090
  return parseAccountEnforcementMarker(raw)?.level ?? null;
35091
35091
  }
35092
+ function shouldSendAccountWarn(opts) {
35093
+ if (readAccountEnforcementLevel({ codeName: opts.codeName, filePath: opts.filePath }) !== "warn") {
35094
+ return false;
35095
+ }
35096
+ return decideDeclineReply({
35097
+ cache: opts.cache,
35098
+ key: opts.key,
35099
+ cooldownMs: opts.cooldownMs,
35100
+ now: opts.now ?? Date.now()
35101
+ }).reply;
35102
+ }
35092
35103
 
35093
35104
  // src/watch-command.ts
35094
35105
  var WATCH_DEFAULT_DURATION_MS = 2 * 60 * 60 * 1e3;
@@ -39171,6 +39182,57 @@ async function maybeSendAccountMuteNotice(args) {
39171
39182
  clearTimeout(timeoutId);
39172
39183
  }
39173
39184
  }
39185
+ var SLACK_ACCOUNT_WARN_NOTICE_CACHE = /* @__PURE__ */ new Map();
39186
+ var SLACK_ACCOUNT_WARN_COOLDOWN_MS = (() => {
39187
+ const raw = process.env["SLACK_ACCOUNT_WARN_COOLDOWN_SEC"];
39188
+ const n = raw ? Number(raw) : NaN;
39189
+ return Number.isFinite(n) && n >= 0 ? n * 1e3 : 24 * 60 * 60 * 1e3;
39190
+ })();
39191
+ async function maybeSendSlackAccountWarn(args) {
39192
+ if (!BOT_TOKEN || !args.channel) return;
39193
+ const key2 = `${args.channel}|${args.threadTs ?? "root"}|account_warn`;
39194
+ if (!shouldSendAccountWarn({
39195
+ codeName: AGENT_CODE_NAME,
39196
+ cache: SLACK_ACCOUNT_WARN_NOTICE_CACHE,
39197
+ key: key2,
39198
+ cooldownMs: SLACK_ACCOUNT_WARN_COOLDOWN_MS
39199
+ })) {
39200
+ return;
39201
+ }
39202
+ const controller = new AbortController();
39203
+ const timeoutId = setTimeout(() => controller.abort(), 1e4);
39204
+ try {
39205
+ const res = await fetch("https://slack.com/api/chat.postMessage", {
39206
+ method: "POST",
39207
+ signal: controller.signal,
39208
+ headers: {
39209
+ "Content-Type": "application/json",
39210
+ Authorization: `Bearer ${BOT_TOKEN}`
39211
+ },
39212
+ body: JSON.stringify({
39213
+ channel: args.channel,
39214
+ text: buildAccountIssueReplyText(),
39215
+ ...args.threadTs ? { thread_ts: args.threadTs } : {}
39216
+ })
39217
+ });
39218
+ const data = await res.json();
39219
+ if (!data.ok) {
39220
+ SLACK_ACCOUNT_WARN_NOTICE_CACHE.delete(key2);
39221
+ process.stderr.write(
39222
+ `slack-channel(${AGENT_CODE_NAME}): account-warn follow-up post failed: ${data.error ?? "unknown"}
39223
+ `
39224
+ );
39225
+ }
39226
+ } catch (err) {
39227
+ SLACK_ACCOUNT_WARN_NOTICE_CACHE.delete(key2);
39228
+ process.stderr.write(
39229
+ `slack-channel(${AGENT_CODE_NAME}): account-warn follow-up error: ${err.message}
39230
+ `
39231
+ );
39232
+ } finally {
39233
+ clearTimeout(timeoutId);
39234
+ }
39235
+ }
39174
39236
  var BLOCK_KIT_DISABLED = process.env.SLACK_BLOCK_KIT_DISABLED === "true";
39175
39237
  var ALLOWED_USERS = parseAllowedUsersCsv(process.env.SLACK_ALLOWED_USERS);
39176
39238
  var PING_ALLOWED_USERS = parseAllowedUsersCsv(process.env.SLACK_PING_ALLOWED_USERS);
@@ -42126,6 +42188,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
42126
42188
  });
42127
42189
  if (redirectNote) base += `. ${redirectNote}`;
42128
42190
  const sentTs = typeof data.ts === "string" ? data.ts : void 0;
42191
+ await maybeSendSlackAccountWarn({ channel: effectiveChannel, threadTs: effectiveThreadTs });
42129
42192
  return {
42130
42193
  content: [{ type: "text", text: sentTs ? `${base} (ts=${sentTs})` : base }]
42131
42194
  };
@@ -35391,6 +35391,17 @@ function readAccountEnforcementLevel(opts) {
35391
35391
  }
35392
35392
  return parseAccountEnforcementMarker(raw)?.level ?? null;
35393
35393
  }
35394
+ function shouldSendAccountWarn(opts) {
35395
+ if (readAccountEnforcementLevel({ codeName: opts.codeName, filePath: opts.filePath }) !== "warn") {
35396
+ return false;
35397
+ }
35398
+ return decideDeclineReply({
35399
+ cache: opts.cache,
35400
+ key: opts.key,
35401
+ cooldownMs: opts.cooldownMs,
35402
+ now: opts.now ?? Date.now()
35403
+ }).reply;
35404
+ }
35394
35405
 
35395
35406
  // src/turn-initiator-marker.ts
35396
35407
  import { writeFileSync as writeFileSync4, readFileSync as readFileSync6, mkdirSync as mkdirSync4, renameSync as renameSync3 } from "fs";
@@ -35658,18 +35669,39 @@ function createPeerRateLimiter(config2 = DEFAULT_RATE_LIMITER_CONFIG) {
35658
35669
  }
35659
35670
  };
35660
35671
  }
35661
- function createPresenceTracker() {
35672
+ function createPresenceTracker(opts = {}) {
35673
+ const retainMs = opts.retainMs ?? DAY_MS;
35662
35674
  const lastHumanByChat = /* @__PURE__ */ new Map();
35675
+ for (const [chatId, at] of Object.entries(opts.initial ?? {})) {
35676
+ if (typeof at === "number" && Number.isFinite(at)) lastHumanByChat.set(chatId, at);
35677
+ }
35678
+ const snapshot = (now = Date.now()) => {
35679
+ const out = {};
35680
+ for (const [chatId, at] of lastHumanByChat) {
35681
+ if (now - at < retainMs) out[chatId] = at;
35682
+ }
35683
+ return out;
35684
+ };
35663
35685
  return {
35664
35686
  noteInbound(chatId, kind, now) {
35665
- if (kind === "human") lastHumanByChat.set(chatId, now);
35687
+ if (kind !== "human") return;
35688
+ const prev = lastHumanByChat.get(chatId);
35689
+ if (prev !== void 0 && prev >= now) return;
35690
+ lastHumanByChat.set(chatId, now);
35691
+ if (opts.onChange) {
35692
+ try {
35693
+ opts.onChange(snapshot(now));
35694
+ } catch {
35695
+ }
35696
+ }
35666
35697
  },
35667
35698
  shouldDropOutgress(chatId, now, maxAgeMs = 30 * MINUTE_MS) {
35668
35699
  const last = lastHumanByChat.get(chatId);
35669
35700
  if (last === void 0) return "no_human_recent";
35670
35701
  if (now - last >= maxAgeMs) return "no_human_recent";
35671
35702
  return null;
35672
- }
35703
+ },
35704
+ snapshot
35673
35705
  };
35674
35706
  }
35675
35707
 
@@ -37950,6 +37982,10 @@ if (PEER_DISABLED_MODE !== "off") {
37950
37982
  );
37951
37983
  }
37952
37984
  PEER_CLASSIFIER_CONFIG.peer_disabled_mode = PEER_DISABLED_MODE;
37985
+ function peerSurfaceActiveOnChat(chatId) {
37986
+ if (!chatId.startsWith("-")) return false;
37987
+ return PEER_CLASSIFIER_CONFIG.peer_agent_mode !== "off" && PEER_CLASSIFIER_CONFIG.peer_group_ids.length > 0 && PEER_CLASSIFIER_CONFIG.peer_group_ids.includes(chatId);
37988
+ }
37953
37989
  var crossTeamPeerAuditClient = createCrossTeamPeerAuditClient({
37954
37990
  agtHost: AGT_HOST,
37955
37991
  agtApiKey: AGT_API_KEY,
@@ -38008,7 +38044,35 @@ var peerRateLimiter = peerRateApiClient && parsePeerAgentModeEnv(process.env.TEL
38008
38044
  log: (line) => process.stderr.write(`telegram-channel(${AGENT_CODE_NAME}): ${line}
38009
38045
  `)
38010
38046
  }) : createPeerRateLimiter();
38011
- var peerPresence = createPresenceTracker();
38047
+ var PEER_PRESENCE_STATE_FILE = TELEGRAM_AGENT_DIR ? join15(TELEGRAM_AGENT_DIR, "telegram-peer-presence.json") : null;
38048
+ function readPeerPresenceState() {
38049
+ if (!PEER_PRESENCE_STATE_FILE) return null;
38050
+ try {
38051
+ const parsed = JSON.parse(readFileSync15(PEER_PRESENCE_STATE_FILE, "utf-8"));
38052
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
38053
+ return parsed;
38054
+ } catch {
38055
+ return null;
38056
+ }
38057
+ }
38058
+ function writePeerPresenceState(snapshot) {
38059
+ if (!PEER_PRESENCE_STATE_FILE || !TELEGRAM_AGENT_DIR) return;
38060
+ const tmp = `${PEER_PRESENCE_STATE_FILE}.tmp`;
38061
+ try {
38062
+ mkdirSync9(TELEGRAM_AGENT_DIR, { recursive: true, mode: 448 });
38063
+ writeFileSync11(tmp, JSON.stringify(snapshot), { mode: 384 });
38064
+ renameSync7(tmp, PEER_PRESENCE_STATE_FILE);
38065
+ } catch (err) {
38066
+ process.stderr.write(
38067
+ `telegram-channel(${AGENT_CODE_NAME}): peer-presence persist failed: ${err.message}
38068
+ `
38069
+ );
38070
+ }
38071
+ }
38072
+ var peerPresence = createPresenceTracker({
38073
+ initial: readPeerPresenceState(),
38074
+ onChange: writePeerPresenceState
38075
+ });
38012
38076
  var dailyBudgetWarned = false;
38013
38077
  if (!BOT_TOKEN) {
38014
38078
  process.stderr.write(
@@ -38248,6 +38312,39 @@ async function maybeSendTelegramAccountMuteNotice(args) {
38248
38312
  );
38249
38313
  }
38250
38314
  }
38315
+ var TELEGRAM_ACCOUNT_WARN_NOTICE_CACHE = /* @__PURE__ */ new Map();
38316
+ var TELEGRAM_ACCOUNT_WARN_COOLDOWN_MS = (() => {
38317
+ const raw = process.env["TELEGRAM_ACCOUNT_WARN_COOLDOWN_SEC"];
38318
+ const n = raw ? Number(raw) : NaN;
38319
+ return Number.isFinite(n) && n >= 0 ? n * 1e3 : 24 * 60 * 60 * 1e3;
38320
+ })();
38321
+ async function maybeSendTelegramAccountWarn(args) {
38322
+ const key2 = `${args.chatId}|account_warn`;
38323
+ if (!shouldSendAccountWarn({
38324
+ codeName: AGENT_CODE_NAME,
38325
+ cache: TELEGRAM_ACCOUNT_WARN_NOTICE_CACHE,
38326
+ key: key2,
38327
+ cooldownMs: TELEGRAM_ACCOUNT_WARN_COOLDOWN_MS
38328
+ })) {
38329
+ return;
38330
+ }
38331
+ try {
38332
+ const resp = await telegramApiCall("sendMessage", { chat_id: args.chatId, text: buildAccountIssueReplyText() }, 1e4);
38333
+ if (!resp.ok) {
38334
+ TELEGRAM_ACCOUNT_WARN_NOTICE_CACHE.delete(key2);
38335
+ process.stderr.write(
38336
+ `telegram-channel(${AGENT_CODE_NAME}): account-warn follow-up rejected (chat=${redactId(String(args.chatId))}): ${resp.description ?? "unknown"}
38337
+ `
38338
+ );
38339
+ }
38340
+ } catch (err) {
38341
+ TELEGRAM_ACCOUNT_WARN_NOTICE_CACHE.delete(key2);
38342
+ process.stderr.write(
38343
+ `telegram-channel(${AGENT_CODE_NAME}): account-warn follow-up failed: ${err.message}
38344
+ `
38345
+ );
38346
+ }
38347
+ }
38251
38348
  var ACK_EMOJI = (process.env.TELEGRAM_ACK_REACTION ?? "").trim() || "\u{1F440}";
38252
38349
  var TELEGRAM_SKIP_REACTION = (process.env.TELEGRAM_SKIP_REACTION ?? "").trim();
38253
38350
  async function setMessageReaction(chatId, messageId, emoji2) {
@@ -40251,7 +40348,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
40251
40348
  isError: true
40252
40349
  };
40253
40350
  }
40254
- const peerActiveOnChat = PEER_CLASSIFIER_CONFIG.peer_agent_mode !== "off" && PEER_CLASSIFIER_CONFIG.peer_group_ids.length > 0 && PEER_CLASSIFIER_CONFIG.peer_group_ids.includes(chat_id);
40351
+ const peerActiveOnChat = peerSurfaceActiveOnChat(chat_id);
40255
40352
  if (peerActiveOnChat) {
40256
40353
  if (PEER_DISABLED_GLOBAL) {
40257
40354
  process.stderr.write(
@@ -40344,7 +40441,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
40344
40441
  isError: true
40345
40442
  };
40346
40443
  }
40347
- const peerActiveOnChat = PEER_CLASSIFIER_CONFIG.peer_agent_mode !== "off" && PEER_CLASSIFIER_CONFIG.peer_group_ids.length > 0 && PEER_CLASSIFIER_CONFIG.peer_group_ids.includes(chat_id);
40444
+ const peerActiveOnChat = peerSurfaceActiveOnChat(chat_id);
40348
40445
  if (peerActiveOnChat) {
40349
40446
  if (PEER_DISABLED_GLOBAL) {
40350
40447
  process.stderr.write(
@@ -40459,6 +40556,7 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
40459
40556
  delivered_at: (/* @__PURE__ */ new Date()).toISOString()
40460
40557
  });
40461
40558
  }
40559
+ await maybeSendTelegramAccountWarn({ chatId: chat_id });
40462
40560
  return { content: [{ type: "text", text: "sent" }] };
40463
40561
  } catch (err) {
40464
40562
  return {
@@ -40918,6 +41016,9 @@ async function replayPendingTelegramMarkers() {
40918
41016
  params: replayParams
40919
41017
  });
40920
41018
  seedTelegramProgressHeartbeat();
41019
+ if (replayPayload.meta?.["source_role"] !== "agent") {
41020
+ peerPresence.noteInbound(marker.chat_id, "human", now);
41021
+ }
40921
41022
  } catch (err) {
40922
41023
  process.stderr.write(
40923
41024
  `telegram-channel(${AGENT_CODE_NAME}): replay push failed: ${err.message}
@@ -36,7 +36,7 @@ import {
36
36
  writeDirectChatSessionState,
37
37
  writeEgressAllowlist,
38
38
  writePersistentClaudeWrapper
39
- } from "./chunk-IRFNOPFU.js";
39
+ } from "./chunk-MOASN7XT.js";
40
40
  import "./chunk-XWVM4KPK.js";
41
41
  export {
42
42
  EGRESS_BASELINE_DOMAINS,
@@ -77,4 +77,4 @@ export {
77
77
  writeEgressAllowlist,
78
78
  writePersistentClaudeWrapper
79
79
  };
80
- //# sourceMappingURL=persistent-session-W7T5YOS6.js.map
80
+ //# sourceMappingURL=persistent-session-2TTEAJDH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-IRFNOPFU.js";
3
+ } from "./chunk-MOASN7XT.js";
4
4
  import "./chunk-XWVM4KPK.js";
5
5
 
6
6
  // src/lib/responsiveness-probe.ts
@@ -471,4 +471,4 @@ export {
471
471
  readAndResetSlackReplyBindingClassifications,
472
472
  readAndResetSlackReplyTargetClassifications
473
473
  };
474
- //# sourceMappingURL=responsiveness-probe-3NKR4QOX.js.map
474
+ //# sourceMappingURL=responsiveness-probe-PMDNQ4J4.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.436",
3
+ "version": "0.28.438",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {