@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.
- package/dist/bin/agt.js +3 -3
- package/dist/{chunk-4Y3UPOR2.js → chunk-RQOJLHYA.js} +119 -26
- package/dist/chunk-RQOJLHYA.js.map +1 -0
- package/dist/lib/manager-worker.js +4 -4
- package/dist/mcp/direct-chat-channel.js +296 -83
- package/dist/mcp/slack-channel.js +155 -118
- package/dist/mcp/teams-channel.js +100 -51
- package/dist/mcp/telegram-channel.js +146 -98
- package/dist/{responsiveness-probe-OJJESVVX.js → responsiveness-probe-46XFHCPY.js} +12 -2
- package/dist/responsiveness-probe-46XFHCPY.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-4Y3UPOR2.js.map +0 -1
- package/dist/responsiveness-probe-OJJESVVX.js.map +0 -1
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
requireHost,
|
|
44
44
|
safeWriteJsonAtomic,
|
|
45
45
|
setConfigHash
|
|
46
|
-
} from "../chunk-
|
|
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.
|
|
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-
|
|
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-
|
|
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
|
|
14404
|
-
mkdirSync as
|
|
14405
|
-
readFileSync as
|
|
14406
|
-
renameSync as
|
|
14608
|
+
existsSync as existsSync5,
|
|
14609
|
+
mkdirSync as mkdirSync4,
|
|
14610
|
+
readFileSync as readFileSync6,
|
|
14611
|
+
renameSync as renameSync4,
|
|
14407
14612
|
unlinkSync as unlinkSync2,
|
|
14408
|
-
writeFileSync as
|
|
14613
|
+
writeFileSync as writeFileSync5
|
|
14409
14614
|
} from "fs";
|
|
14410
|
-
import { join as
|
|
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 =
|
|
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
|
-
|
|
14643
|
+
mkdirSync4(agentDir, { recursive: true, mode: 448 });
|
|
14439
14644
|
const tmpPath = `${path}.${selfPid}.tmp`;
|
|
14440
14645
|
const payload = { pid: selfPid, started_at: now() };
|
|
14441
|
-
|
|
14442
|
-
|
|
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 (!
|
|
14662
|
+
if (!existsSync5(path)) return null;
|
|
14458
14663
|
try {
|
|
14459
|
-
const raw =
|
|
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
|
|
14677
|
+
import { join as join9 } from "path";
|
|
14473
14678
|
import { randomUUID } from "crypto";
|
|
14474
14679
|
import {
|
|
14475
14680
|
watch,
|
|
14476
|
-
mkdirSync as
|
|
14477
|
-
writeFileSync as
|
|
14478
|
-
readFileSync as
|
|
14479
|
-
readdirSync as
|
|
14480
|
-
existsSync as
|
|
14481
|
-
renameSync as
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 ?
|
|
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 ?
|
|
14962
|
-
var DIRECT_CHAT_PENDING_INBOUND_DIR = AGT_AGENT_CODE_NAME ?
|
|
14963
|
-
var
|
|
14964
|
-
var
|
|
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 || !
|
|
15161
|
+
if (!PROGRESS_HEARTBEAT_PATH || !existsSync6(PROGRESS_HEARTBEAT_PATH)) return null;
|
|
14982
15162
|
try {
|
|
14983
|
-
return parseProgressHeartbeat(
|
|
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
|
-
|
|
14993
|
-
|
|
14994
|
-
|
|
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) =>
|
|
15151
|
-
writeFile: (path, bytes) =>
|
|
15152
|
-
joinPath: (...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
|
-
|
|
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) =>
|
|
15646
|
-
renameFile: (from, to) =>
|
|
15858
|
+
readFile: (p) => readFileSync7(p, "utf-8"),
|
|
15859
|
+
renameFile: (from, to) => renameSync5(from, to),
|
|
15647
15860
|
unlinkFile: (p) => {
|
|
15648
|
-
if (
|
|
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 =
|
|
15659
|
-
if (
|
|
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 =
|
|
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
|
-
|
|
15921
|
+
mkdirSync5(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, { recursive: true, mode: 448 });
|
|
15709
15922
|
} catch {
|
|
15710
15923
|
}
|
|
15711
15924
|
try {
|
|
15712
|
-
for (const f of
|
|
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 (
|
|
15935
|
+
if (existsSync6(join9(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, name))) {
|
|
15723
15936
|
void processDirectChatRecoveryOutboxFile(name);
|
|
15724
15937
|
}
|
|
15725
15938
|
});
|