@integrity-labs/agt-cli 0.28.424 → 0.28.426
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 +4 -4
- package/dist/{chunk-CWIWI2ZX.js → chunk-HXP4I5QZ.js} +228 -2
- package/dist/chunk-HXP4I5QZ.js.map +1 -0
- package/dist/{chunk-2QBY2QVX.js → chunk-XDODHW3I.js} +3 -3
- package/dist/{claude-pair-runtime-PAP4BS3I.js → claude-pair-runtime-OONIISXX.js} +2 -2
- package/dist/lib/manager-worker.js +104 -22
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/direct-chat-channel.js +80 -0
- package/dist/mcp/origami.js +80 -0
- package/dist/mcp/slack-channel.js +80 -0
- package/dist/mcp/telegram-channel.js +80 -0
- package/dist/{persistent-session-O7OCNB6B.js → persistent-session-AKMSEWFL.js} +2 -2
- package/dist/{responsiveness-probe-R5FWKHPI.js → responsiveness-probe-FAIPVVYA.js} +2 -2
- package/dist/responsiveness-probe-FAIPVVYA.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-CWIWI2ZX.js.map +0 -1
- package/dist/responsiveness-probe-R5FWKHPI.js.map +0 -1
- /package/dist/{chunk-2QBY2QVX.js.map → chunk-XDODHW3I.js.map} +0 -0
- /package/dist/{claude-pair-runtime-PAP4BS3I.js.map → claude-pair-runtime-OONIISXX.js.map} +0 -0
- /package/dist/{persistent-session-O7OCNB6B.js.map → persistent-session-AKMSEWFL.js.map} +0 -0
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
resolveConnectivityProbe,
|
|
26
26
|
worseConnectivityOutcome,
|
|
27
27
|
wrapScheduledTaskPrompt
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-HXP4I5QZ.js";
|
|
29
29
|
import {
|
|
30
30
|
parsePsRows
|
|
31
31
|
} from "./chunk-XWVM4KPK.js";
|
|
@@ -6027,7 +6027,7 @@ function requireHost() {
|
|
|
6027
6027
|
}
|
|
6028
6028
|
|
|
6029
6029
|
// src/lib/api-client.ts
|
|
6030
|
-
var agtCliVersion = true ? "0.28.
|
|
6030
|
+
var agtCliVersion = true ? "0.28.426" : "dev";
|
|
6031
6031
|
var lastConfigHash = null;
|
|
6032
6032
|
function setConfigHash(hash) {
|
|
6033
6033
|
lastConfigHash = hash && hash.length > 0 ? hash : null;
|
|
@@ -8531,4 +8531,4 @@ export {
|
|
|
8531
8531
|
managerInstallSystemUnitCommand,
|
|
8532
8532
|
managerUninstallSystemUnitCommand
|
|
8533
8533
|
};
|
|
8534
|
-
//# sourceMappingURL=chunk-
|
|
8534
|
+
//# sourceMappingURL=chunk-XDODHW3I.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-
|
|
103
|
+
const { resolveClaudeBinary } = await import("./persistent-session-AKMSEWFL.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-
|
|
376
|
+
//# sourceMappingURL=claude-pair-runtime-OONIISXX.js.map
|
|
@@ -45,7 +45,7 @@ import {
|
|
|
45
45
|
resolveEffectivePinRaw,
|
|
46
46
|
safeWriteJsonAtomic,
|
|
47
47
|
setConfigHash
|
|
48
|
-
} from "../chunk-
|
|
48
|
+
} from "../chunk-XDODHW3I.js";
|
|
49
49
|
import {
|
|
50
50
|
getProjectDir as getProjectDir2,
|
|
51
51
|
getReadyTasks,
|
|
@@ -138,6 +138,7 @@ import {
|
|
|
138
138
|
serializeUsageLimitMarker,
|
|
139
139
|
sessionTranscriptDir,
|
|
140
140
|
sha256,
|
|
141
|
+
sharedBusyBuckets,
|
|
141
142
|
startOpencodeSession,
|
|
142
143
|
startPersistentSession,
|
|
143
144
|
stopAllSessionsAndWait,
|
|
@@ -150,14 +151,14 @@ import {
|
|
|
150
151
|
toOpencodeModel,
|
|
151
152
|
transcriptActivityAgeSeconds,
|
|
152
153
|
writeEgressAllowlist
|
|
153
|
-
} from "../chunk-
|
|
154
|
+
} from "../chunk-HXP4I5QZ.js";
|
|
154
155
|
import {
|
|
155
156
|
reapOrphanChannelMcps
|
|
156
157
|
} from "../chunk-XWVM4KPK.js";
|
|
157
158
|
|
|
158
159
|
// src/lib/manager-worker.ts
|
|
159
160
|
import { createHash as createHash15 } from "crypto";
|
|
160
|
-
import { readFileSync as readFileSync19, writeFileSync as writeFileSync12, mkdirSync as mkdirSync10, existsSync as existsSync11, rmSync as rmSync5, readdirSync as readdirSync6, statSync as
|
|
161
|
+
import { readFileSync as readFileSync19, writeFileSync as writeFileSync12, mkdirSync as mkdirSync10, existsSync as existsSync11, rmSync as rmSync5, readdirSync as readdirSync6, statSync as statSync5, copyFileSync } from "fs";
|
|
161
162
|
import { execFileSync as syncExecFile } from "child_process";
|
|
162
163
|
import { join as join22, dirname as dirname7, delimiter as pathDelimiter } from "path";
|
|
163
164
|
import { homedir as homedir10 } from "os";
|
|
@@ -5707,6 +5708,59 @@ async function syncAndCheckClaudeScheduler(agent, tasks, boardItems, refreshData
|
|
|
5707
5708
|
}
|
|
5708
5709
|
}
|
|
5709
5710
|
|
|
5711
|
+
// src/lib/pane-occupancy-sampler.ts
|
|
5712
|
+
import { statSync as statSync4 } from "fs";
|
|
5713
|
+
var SAMPLE_INTERVAL_MS = 1e4;
|
|
5714
|
+
var IDLE_GAP_MS = 12e4;
|
|
5715
|
+
var POST_IDLE_CREDIT_MS = 6e4;
|
|
5716
|
+
var lastMtimeMs = /* @__PURE__ */ new Map();
|
|
5717
|
+
function paneMtimeMs(codeName) {
|
|
5718
|
+
try {
|
|
5719
|
+
return statSync4(paneLogPath(codeName)).mtimeMs;
|
|
5720
|
+
} catch {
|
|
5721
|
+
return null;
|
|
5722
|
+
}
|
|
5723
|
+
}
|
|
5724
|
+
function samplePaneOccupancyOnce(codeNames, opts = {}) {
|
|
5725
|
+
const ledger = opts.ledger ?? sharedBusyBuckets;
|
|
5726
|
+
const readMtime = opts.readMtime ?? paneMtimeMs;
|
|
5727
|
+
const seen = /* @__PURE__ */ new Set();
|
|
5728
|
+
for (const codeName of codeNames) {
|
|
5729
|
+
seen.add(codeName);
|
|
5730
|
+
const mtime = readMtime(codeName);
|
|
5731
|
+
if (mtime == null) continue;
|
|
5732
|
+
const prev = lastMtimeMs.get(codeName);
|
|
5733
|
+
lastMtimeMs.set(codeName, mtime);
|
|
5734
|
+
if (prev == null) continue;
|
|
5735
|
+
if (mtime <= prev) continue;
|
|
5736
|
+
const gap = mtime - prev;
|
|
5737
|
+
if (gap <= IDLE_GAP_MS) {
|
|
5738
|
+
ledger.accrueSpan(codeName, prev, mtime);
|
|
5739
|
+
} else {
|
|
5740
|
+
ledger.accrueSpan(codeName, mtime - POST_IDLE_CREDIT_MS, mtime);
|
|
5741
|
+
}
|
|
5742
|
+
}
|
|
5743
|
+
for (const codeName of [...lastMtimeMs.keys()]) {
|
|
5744
|
+
if (!seen.has(codeName)) lastMtimeMs.delete(codeName);
|
|
5745
|
+
}
|
|
5746
|
+
}
|
|
5747
|
+
var timer = null;
|
|
5748
|
+
function startPaneOccupancySampler(liveAgents) {
|
|
5749
|
+
if (timer) return;
|
|
5750
|
+
timer = setInterval(() => {
|
|
5751
|
+
try {
|
|
5752
|
+
samplePaneOccupancyOnce(liveAgents());
|
|
5753
|
+
} catch {
|
|
5754
|
+
}
|
|
5755
|
+
}, SAMPLE_INTERVAL_MS);
|
|
5756
|
+
timer.unref?.();
|
|
5757
|
+
}
|
|
5758
|
+
function stopPaneOccupancySampler() {
|
|
5759
|
+
if (!timer) return;
|
|
5760
|
+
clearInterval(timer);
|
|
5761
|
+
timer = null;
|
|
5762
|
+
}
|
|
5763
|
+
|
|
5710
5764
|
// src/lib/opencode-slack-ingest.ts
|
|
5711
5765
|
import { createHash as createHash12 } from "crypto";
|
|
5712
5766
|
|
|
@@ -8803,7 +8857,7 @@ function scheduleSessionRestart(codeName, delayMs, reason, breakerReason = "hot-
|
|
|
8803
8857
|
clearTimeout(existing.timer);
|
|
8804
8858
|
log(`[hot-reload] Coalesced restart for '${codeName}': replacing pending timer with ${reason}`);
|
|
8805
8859
|
}
|
|
8806
|
-
const
|
|
8860
|
+
const timer2 = setTimeout(() => {
|
|
8807
8861
|
pendingSessionRestarts.delete(codeName);
|
|
8808
8862
|
const gate = restartGateFor(codeName, breakerReason);
|
|
8809
8863
|
if (gate !== "bypass" && gate !== "proceed") {
|
|
@@ -8869,8 +8923,8 @@ function scheduleSessionRestart(codeName, delayMs, reason, breakerReason = "hot-
|
|
|
8869
8923
|
void respawnAgentAfterMcpStop(codeName, reason);
|
|
8870
8924
|
}
|
|
8871
8925
|
}, delayMs);
|
|
8872
|
-
|
|
8873
|
-
pendingSessionRestarts.set(codeName, { timer, reason, breakerReason, beforeStop });
|
|
8926
|
+
timer2.unref?.();
|
|
8927
|
+
pendingSessionRestarts.set(codeName, { timer: timer2, reason, breakerReason, beforeStop });
|
|
8874
8928
|
}
|
|
8875
8929
|
function cancelPendingSessionRestart(codeName) {
|
|
8876
8930
|
pendingRestartVerifications.delete(codeName);
|
|
@@ -8982,7 +9036,7 @@ function inboundAgeSecondsFor(codeName) {
|
|
|
8982
9036
|
}
|
|
8983
9037
|
function paneLogAgeSecondsFor(codeName) {
|
|
8984
9038
|
try {
|
|
8985
|
-
const mtimeMs =
|
|
9039
|
+
const mtimeMs = statSync5(paneLogPath(codeName)).mtimeMs;
|
|
8986
9040
|
return Math.max(0, Math.floor((Date.now() - mtimeMs) / 1e3));
|
|
8987
9041
|
} catch (err) {
|
|
8988
9042
|
if (err?.code === "ENOENT") return null;
|
|
@@ -9447,6 +9501,7 @@ function resolveAgentFramework(codeName) {
|
|
|
9447
9501
|
function clearAgentCaches(agentId, codeName) {
|
|
9448
9502
|
const channelCacheMutated = clearAgentState(agentId, codeName);
|
|
9449
9503
|
agentChannelTokens.delete(codeName);
|
|
9504
|
+
sharedBusyBuckets.reset(codeName);
|
|
9450
9505
|
stopOpencodeSlackIngest(codeName, log);
|
|
9451
9506
|
stopOpencodeTelegramIngest(codeName, log);
|
|
9452
9507
|
agentFrameworkCache.delete(codeName);
|
|
@@ -9479,7 +9534,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
9479
9534
|
var lastVersionCheckAt = 0;
|
|
9480
9535
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
9481
9536
|
var lastResponsivenessProbeAt = 0;
|
|
9482
|
-
var agtCliVersion = true ? "0.28.
|
|
9537
|
+
var agtCliVersion = true ? "0.28.426" : "dev";
|
|
9483
9538
|
function resolveBrewPath(execFileSync2) {
|
|
9484
9539
|
try {
|
|
9485
9540
|
const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -9728,7 +9783,7 @@ function runAsync(cmd, args, opts) {
|
|
|
9728
9783
|
let stdout = "";
|
|
9729
9784
|
let stderr = "";
|
|
9730
9785
|
let settled = false;
|
|
9731
|
-
const
|
|
9786
|
+
const timer2 = setTimeout(() => {
|
|
9732
9787
|
child.kill("SIGTERM");
|
|
9733
9788
|
if (settled) return;
|
|
9734
9789
|
settled = true;
|
|
@@ -9749,13 +9804,13 @@ function runAsync(cmd, args, opts) {
|
|
|
9749
9804
|
child.on("error", (err) => {
|
|
9750
9805
|
if (settled) return;
|
|
9751
9806
|
settled = true;
|
|
9752
|
-
clearTimeout(
|
|
9807
|
+
clearTimeout(timer2);
|
|
9753
9808
|
reject(err);
|
|
9754
9809
|
});
|
|
9755
9810
|
child.on("close", (code) => {
|
|
9756
9811
|
if (settled) return;
|
|
9757
9812
|
settled = true;
|
|
9758
|
-
clearTimeout(
|
|
9813
|
+
clearTimeout(timer2);
|
|
9759
9814
|
resolve({ code: code ?? -1, stdout, stderr });
|
|
9760
9815
|
});
|
|
9761
9816
|
}).catch(reject);
|
|
@@ -10627,7 +10682,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
|
|
|
10627
10682
|
if (codeNames.length === 0) return;
|
|
10628
10683
|
void (async () => {
|
|
10629
10684
|
try {
|
|
10630
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
10685
|
+
const { collectDiagnostics } = await import("../persistent-session-AKMSEWFL.js");
|
|
10631
10686
|
await api.post("/host/heartbeat", {
|
|
10632
10687
|
host_id: hostId,
|
|
10633
10688
|
agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor)
|
|
@@ -10660,7 +10715,7 @@ async function pollCycle() {
|
|
|
10660
10715
|
getSlackToken: (codeName) => agentChannelTokens.get(codeName)?.slack ?? null,
|
|
10661
10716
|
sendSlack: async (botToken, body) => {
|
|
10662
10717
|
const controller = new AbortController();
|
|
10663
|
-
const
|
|
10718
|
+
const timer2 = setTimeout(() => controller.abort(), 5e3);
|
|
10664
10719
|
try {
|
|
10665
10720
|
const res = await fetch("https://slack.com/api/chat.postMessage", {
|
|
10666
10721
|
method: "POST",
|
|
@@ -10677,7 +10732,7 @@ async function pollCycle() {
|
|
|
10677
10732
|
const isAbort = err.name === "AbortError";
|
|
10678
10733
|
return { ok: false, error: isAbort ? "timeout" : err.message };
|
|
10679
10734
|
} finally {
|
|
10680
|
-
clearTimeout(
|
|
10735
|
+
clearTimeout(timer2);
|
|
10681
10736
|
}
|
|
10682
10737
|
},
|
|
10683
10738
|
// ENG-6399: report the restart to audit_log via POST /host/restart-event.
|
|
@@ -10734,7 +10789,7 @@ async function pollCycle() {
|
|
|
10734
10789
|
}
|
|
10735
10790
|
try {
|
|
10736
10791
|
const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
|
|
10737
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
10792
|
+
const { collectDiagnostics } = await import("../persistent-session-AKMSEWFL.js");
|
|
10738
10793
|
const diagCodeNames = [...agentState.persistentSessionAgents];
|
|
10739
10794
|
const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor) : void 0;
|
|
10740
10795
|
let tailscaleHostname;
|
|
@@ -10848,7 +10903,7 @@ async function pollCycle() {
|
|
|
10848
10903
|
collectResponsivenessProbes,
|
|
10849
10904
|
collectPanelessActivityProbes,
|
|
10850
10905
|
getResponsivenessIntervalMs
|
|
10851
|
-
} = await import("../responsiveness-probe-
|
|
10906
|
+
} = await import("../responsiveness-probe-FAIPVVYA.js");
|
|
10852
10907
|
const probeIntervalMs = getResponsivenessIntervalMs();
|
|
10853
10908
|
if (now - lastResponsivenessProbeAt > probeIntervalMs) {
|
|
10854
10909
|
const probeCodeNames = [...agentState.persistentSessionAgents];
|
|
@@ -10861,17 +10916,42 @@ async function pollCycle() {
|
|
|
10861
10916
|
return lastRepliedAt == null ? null : Math.max(0, Math.floor((Date.now() - lastRepliedAt) / 1e3));
|
|
10862
10917
|
}
|
|
10863
10918
|
});
|
|
10919
|
+
const drainedBuckets = /* @__PURE__ */ new Map();
|
|
10920
|
+
const drainedCodeNames = /* @__PURE__ */ new Set();
|
|
10921
|
+
const takeBuckets = (codeName) => {
|
|
10922
|
+
if (drainedCodeNames.has(codeName)) return [];
|
|
10923
|
+
drainedCodeNames.add(codeName);
|
|
10924
|
+
const buckets = sharedBusyBuckets.drainClosed(codeName, Date.now());
|
|
10925
|
+
if (buckets.length > 0) drainedBuckets.set(codeName, buckets);
|
|
10926
|
+
return buckets;
|
|
10927
|
+
};
|
|
10864
10928
|
const probes = [...collectResponsivenessProbes(probeCodeNames), ...paneless].map((p) => {
|
|
10865
10929
|
const giveUps = takeWatchdogGiveUpCount(p.code_name);
|
|
10866
10930
|
if (giveUps > 0) drainedGiveUps.set(p.code_name, giveUps);
|
|
10867
|
-
|
|
10931
|
+
const busyBuckets = takeBuckets(p.code_name);
|
|
10932
|
+
return {
|
|
10933
|
+
...p,
|
|
10934
|
+
input_stuck_give_ups: giveUps,
|
|
10935
|
+
...busyBuckets.length > 0 ? { busy_buckets: busyBuckets } : {}
|
|
10936
|
+
};
|
|
10868
10937
|
});
|
|
10938
|
+
for (const codeName of probeCodeNames) {
|
|
10939
|
+
const buckets = takeBuckets(codeName);
|
|
10940
|
+
if (buckets.length > 0) {
|
|
10941
|
+
probes.push({ code_name: codeName, busy_buckets: buckets, input_stuck_give_ups: 0 });
|
|
10942
|
+
}
|
|
10943
|
+
}
|
|
10869
10944
|
if (probes.length > 0) {
|
|
10870
10945
|
void api.post("/host/responsiveness-probe", { host_id: hostId, probes }).catch((err) => {
|
|
10871
10946
|
for (const [codeName, count] of drainedGiveUps) {
|
|
10872
10947
|
creditWatchdogGiveUpCount(codeName, count);
|
|
10873
10948
|
}
|
|
10874
|
-
|
|
10949
|
+
for (const [codeName, buckets] of drainedBuckets) {
|
|
10950
|
+
sharedBusyBuckets.credit(codeName, buckets);
|
|
10951
|
+
}
|
|
10952
|
+
log(
|
|
10953
|
+
`[responsiveness-probe] post failed (give-up counts + ${drainedBuckets.size} busy-bucket set(s) re-credited): ${err.message}`
|
|
10954
|
+
);
|
|
10875
10955
|
});
|
|
10876
10956
|
}
|
|
10877
10957
|
}
|
|
@@ -10887,7 +10967,7 @@ async function pollCycle() {
|
|
|
10887
10967
|
collectResponsivenessProbes,
|
|
10888
10968
|
livePendingInboundOldestAgeSeconds,
|
|
10889
10969
|
parkPendingInbound
|
|
10890
|
-
} = await import("../responsiveness-probe-
|
|
10970
|
+
} = await import("../responsiveness-probe-FAIPVVYA.js");
|
|
10891
10971
|
const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
|
|
10892
10972
|
const wedgeNow = /* @__PURE__ */ new Date();
|
|
10893
10973
|
const liveAgents = agentState.persistentSessionAgents;
|
|
@@ -14198,7 +14278,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
14198
14278
|
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}`));
|
|
14199
14279
|
void (async () => {
|
|
14200
14280
|
try {
|
|
14201
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
14281
|
+
const { collectDiagnostics } = await import("../persistent-session-AKMSEWFL.js");
|
|
14202
14282
|
await api.post("/host/heartbeat", {
|
|
14203
14283
|
host_id: hostId,
|
|
14204
14284
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor)
|
|
@@ -14248,7 +14328,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
|
|
|
14248
14328
|
}
|
|
14249
14329
|
try {
|
|
14250
14330
|
const hostId = await getHostId();
|
|
14251
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
14331
|
+
const { collectDiagnostics } = await import("../persistent-session-AKMSEWFL.js");
|
|
14252
14332
|
await api.post("/host/heartbeat", {
|
|
14253
14333
|
host_id: hostId,
|
|
14254
14334
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor)
|
|
@@ -14701,7 +14781,7 @@ async function processClaudePairSessions(agents) {
|
|
|
14701
14781
|
killPairSession,
|
|
14702
14782
|
pairTmuxSession,
|
|
14703
14783
|
finalizeClaudePairOnboarding
|
|
14704
|
-
} = await import("../claude-pair-runtime-
|
|
14784
|
+
} = await import("../claude-pair-runtime-OONIISXX.js");
|
|
14705
14785
|
for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
|
|
14706
14786
|
log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
|
|
14707
14787
|
const killed = await killPairSession(pairTmuxSession(pairId));
|
|
@@ -15173,6 +15253,7 @@ function startPolling() {
|
|
|
15173
15253
|
void postLivenessHeartbeat();
|
|
15174
15254
|
}, LIVENESS_HEARTBEAT_INTERVAL_MS);
|
|
15175
15255
|
livenessTimer.unref();
|
|
15256
|
+
startPaneOccupancySampler(() => agentState.persistentSessionAgents);
|
|
15176
15257
|
void startCaffeinate();
|
|
15177
15258
|
loadChannelHashCache2();
|
|
15178
15259
|
loadSenderPolicyBaseline2();
|
|
@@ -15266,6 +15347,7 @@ async function stopPolling(opts = {}) {
|
|
|
15266
15347
|
clearInterval(livenessTimer);
|
|
15267
15348
|
livenessTimer = null;
|
|
15268
15349
|
}
|
|
15350
|
+
stopPaneOccupancySampler();
|
|
15269
15351
|
const shutdownTimer = setTimeout(() => {
|
|
15270
15352
|
log("Shutdown timeout exceeded (15s), forcing exit");
|
|
15271
15353
|
process.exit(opts.forcedExitCode ?? 1);
|