@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-
|
|
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.
|
|
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.
|
|
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.
|
|
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-
|
|
9356
|
+
//# sourceMappingURL=chunk-RQOJLHYA.js.map
|
|
@@ -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();
|
|
@@ -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
|
|
14608
|
+
existsSync as existsSync5,
|
|
14432
14609
|
mkdirSync as mkdirSync4,
|
|
14433
|
-
readFileSync as
|
|
14610
|
+
readFileSync as readFileSync6,
|
|
14434
14611
|
renameSync as renameSync4,
|
|
14435
14612
|
unlinkSync as unlinkSync2,
|
|
14436
|
-
writeFileSync as
|
|
14613
|
+
writeFileSync as writeFileSync5
|
|
14437
14614
|
} from "fs";
|
|
14438
|
-
import { join as
|
|
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 =
|
|
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
|
-
|
|
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 (!
|
|
14662
|
+
if (!existsSync5(path)) return null;
|
|
14486
14663
|
try {
|
|
14487
|
-
const raw =
|
|
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
|
|
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
|
|
14506
|
-
readFileSync as
|
|
14507
|
-
readdirSync as
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 ?
|
|
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 ?
|
|
14990
|
-
var DIRECT_CHAT_PENDING_INBOUND_DIR = AGT_AGENT_CODE_NAME ?
|
|
14991
|
-
var DIRECT_CHAT_DELIVERY_LEDGER_DIR = AGT_AGENT_CODE_NAME ?
|
|
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 ?
|
|
15002
|
-
var DIRECT_CHAT_RECOVERY_LEDGER_DIR = AGT_AGENT_CODE_NAME ?
|
|
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(
|
|
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(
|
|
15031
|
-
|
|
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) =>
|
|
15190
|
-
joinPath: (...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) =>
|
|
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 =
|
|
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 =
|
|
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
|
|
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(
|
|
15935
|
+
if (existsSync6(join9(DIRECT_CHAT_RECOVERY_OUTBOX_DIR, name))) {
|
|
15764
15936
|
void processDirectChatRecoveryOutboxFile(name);
|
|
15765
15937
|
}
|
|
15766
15938
|
});
|
package/package.json
CHANGED
|
File without changes
|