@integrity-labs/agt-cli 0.28.567 → 0.28.569
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-FSWAPB5J.js → chunk-7O2TXBWR.js} +30 -16
- package/dist/{chunk-FSWAPB5J.js.map → chunk-7O2TXBWR.js.map} +1 -1
- package/dist/{chunk-IALXJ6H3.js → chunk-JBOJC6PG.js} +3 -3
- package/dist/{claude-pair-runtime-4C5NQQHR.js → claude-pair-runtime-XVEJ7XLB.js} +2 -2
- package/dist/lib/manager-worker.js +126 -30
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/direct-chat-channel.js +29 -15
- package/dist/mcp/origami.js +29 -15
- package/dist/mcp/slack-channel.js +29 -15
- package/dist/mcp/telegram-channel.js +29 -15
- package/dist/{persistent-session-DVTSZAPE.js → persistent-session-WUNZJXCI.js} +2 -2
- package/dist/{responsiveness-probe-KEFPJXQ6.js → responsiveness-probe-V3P5TGBH.js} +2 -2
- package/package.json +1 -1
- /package/dist/{chunk-IALXJ6H3.js.map → chunk-JBOJC6PG.js.map} +0 -0
- /package/dist/{claude-pair-runtime-4C5NQQHR.js.map → claude-pair-runtime-XVEJ7XLB.js.map} +0 -0
- /package/dist/{persistent-session-DVTSZAPE.js.map → persistent-session-WUNZJXCI.js.map} +0 -0
- /package/dist/{responsiveness-probe-KEFPJXQ6.js.map → responsiveness-probe-V3P5TGBH.js.map} +0 -0
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
resolveConnectivityProbe,
|
|
47
47
|
worseConnectivityOutcome,
|
|
48
48
|
wrapScheduledTaskPrompt
|
|
49
|
-
} from "./chunk-
|
|
49
|
+
} from "./chunk-7O2TXBWR.js";
|
|
50
50
|
import {
|
|
51
51
|
parsePsRows
|
|
52
52
|
} from "./chunk-XWVM4KPK.js";
|
|
@@ -5646,7 +5646,7 @@ function exchangeFailureKind(err) {
|
|
|
5646
5646
|
}
|
|
5647
5647
|
|
|
5648
5648
|
// src/lib/api-client.ts
|
|
5649
|
-
var agtCliVersion = true ? "0.28.
|
|
5649
|
+
var agtCliVersion = true ? "0.28.569" : "dev";
|
|
5650
5650
|
var lastConfigHash = null;
|
|
5651
5651
|
function setConfigHash(hash) {
|
|
5652
5652
|
lastConfigHash = hash && hash.length > 0 ? hash : null;
|
|
@@ -9011,4 +9011,4 @@ export {
|
|
|
9011
9011
|
managerInstallSystemUnitCommand,
|
|
9012
9012
|
managerUninstallSystemUnitCommand
|
|
9013
9013
|
};
|
|
9014
|
-
//# sourceMappingURL=chunk-
|
|
9014
|
+
//# sourceMappingURL=chunk-JBOJC6PG.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-WUNZJXCI.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-XVEJ7XLB.js.map
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
safeWriteJsonAtomic,
|
|
54
54
|
setConfigHash,
|
|
55
55
|
tripClass
|
|
56
|
-
} from "../chunk-
|
|
56
|
+
} from "../chunk-JBOJC6PG.js";
|
|
57
57
|
import {
|
|
58
58
|
getProjectDir as getProjectDir2,
|
|
59
59
|
getReadyTasks,
|
|
@@ -182,7 +182,7 @@ import {
|
|
|
182
182
|
toOpencodeModel,
|
|
183
183
|
transcriptActivityAgeSeconds,
|
|
184
184
|
writeEgressAllowlist
|
|
185
|
-
} from "../chunk-
|
|
185
|
+
} from "../chunk-7O2TXBWR.js";
|
|
186
186
|
import {
|
|
187
187
|
reapOrphanChannelMcps
|
|
188
188
|
} from "../chunk-XWVM4KPK.js";
|
|
@@ -3833,6 +3833,7 @@ function scanLines(lines, file, opts) {
|
|
|
3833
3833
|
return { records: ordered, pending: pending2 };
|
|
3834
3834
|
}
|
|
3835
3835
|
var WINDOW_CHUNK_BYTES = 64 * 1024;
|
|
3836
|
+
var WINDOW_BUDGET_BYTES = 4 * 1024 * 1024;
|
|
3836
3837
|
function extractTranscriptWindow(file, opts, from) {
|
|
3837
3838
|
let fd;
|
|
3838
3839
|
try {
|
|
@@ -3844,14 +3845,17 @@ function extractTranscriptWindow(file, opts, from) {
|
|
|
3844
3845
|
endLine: from.lineOffset,
|
|
3845
3846
|
unpaired: [],
|
|
3846
3847
|
missing: true,
|
|
3847
|
-
rewound: false
|
|
3848
|
+
rewound: false,
|
|
3849
|
+
truncated: false
|
|
3848
3850
|
};
|
|
3849
3851
|
}
|
|
3850
3852
|
let startByte = from.byteOffset;
|
|
3851
3853
|
let startLine = from.lineOffset;
|
|
3852
3854
|
let rewound = false;
|
|
3855
|
+
let fileSize = null;
|
|
3853
3856
|
try {
|
|
3854
3857
|
const { size } = fstatSync(fd);
|
|
3858
|
+
fileSize = size;
|
|
3855
3859
|
if (startByte > size) {
|
|
3856
3860
|
startByte = 0;
|
|
3857
3861
|
startLine = 0;
|
|
@@ -3859,15 +3863,22 @@ function extractTranscriptWindow(file, opts, from) {
|
|
|
3859
3863
|
}
|
|
3860
3864
|
} catch {
|
|
3861
3865
|
}
|
|
3866
|
+
const requested = from.budgetBytes;
|
|
3867
|
+
const budget = typeof requested === "number" && Number.isFinite(requested) && requested >= 1 ? Math.floor(requested) : WINDOW_BUDGET_BYTES;
|
|
3862
3868
|
const decoder = new StringDecoder("utf8");
|
|
3863
3869
|
const buf = Buffer.allocUnsafe(WINDOW_CHUNK_BYTES);
|
|
3864
3870
|
let position = startByte;
|
|
3865
3871
|
let runningByte = startByte;
|
|
3866
3872
|
let lineOffset = startLine;
|
|
3867
3873
|
let carry = "";
|
|
3874
|
+
let hitBudget = false;
|
|
3868
3875
|
const pairs = [];
|
|
3869
3876
|
try {
|
|
3870
3877
|
for (; ; ) {
|
|
3878
|
+
if (runningByte - startByte >= budget) {
|
|
3879
|
+
hitBudget = true;
|
|
3880
|
+
break;
|
|
3881
|
+
}
|
|
3871
3882
|
const bytesRead = readSync(fd, buf, 0, WINDOW_CHUNK_BYTES, position);
|
|
3872
3883
|
if (bytesRead <= 0) break;
|
|
3873
3884
|
position += bytesRead;
|
|
@@ -3875,11 +3886,18 @@ function extractTranscriptWindow(file, opts, from) {
|
|
|
3875
3886
|
let nl;
|
|
3876
3887
|
while ((nl = carry.indexOf("\n")) !== -1) {
|
|
3877
3888
|
const line = carry.slice(0, nl);
|
|
3889
|
+
const lineBytes = Buffer.byteLength(line, "utf8") + 1;
|
|
3890
|
+
const consumed = runningByte - startByte;
|
|
3891
|
+
if (consumed > 0 && consumed + lineBytes > budget) {
|
|
3892
|
+
hitBudget = true;
|
|
3893
|
+
break;
|
|
3894
|
+
}
|
|
3878
3895
|
pairs.push([lineOffset, line, runningByte]);
|
|
3879
|
-
runningByte +=
|
|
3896
|
+
runningByte += lineBytes;
|
|
3880
3897
|
lineOffset += 1;
|
|
3881
3898
|
carry = carry.slice(nl + 1);
|
|
3882
3899
|
}
|
|
3900
|
+
if (hitBudget) break;
|
|
3883
3901
|
}
|
|
3884
3902
|
} catch {
|
|
3885
3903
|
} finally {
|
|
@@ -3894,7 +3912,16 @@ function extractTranscriptWindow(file, opts, from) {
|
|
|
3894
3912
|
byteStart: p.byteStart,
|
|
3895
3913
|
lineOffset: p.record.line_offset
|
|
3896
3914
|
})).sort((a, b) => a.byteStart - b.byteStart);
|
|
3897
|
-
|
|
3915
|
+
const truncated = hitBudget && (fileSize === null || runningByte < fileSize);
|
|
3916
|
+
return {
|
|
3917
|
+
records,
|
|
3918
|
+
endByte: runningByte,
|
|
3919
|
+
endLine: lineOffset,
|
|
3920
|
+
unpaired,
|
|
3921
|
+
missing: false,
|
|
3922
|
+
rewound,
|
|
3923
|
+
truncated
|
|
3924
|
+
};
|
|
3898
3925
|
}
|
|
3899
3926
|
|
|
3900
3927
|
// src/lib/tool-call-cursor.ts
|
|
@@ -3965,15 +3992,30 @@ function loadCursors(path) {
|
|
|
3965
3992
|
if (!parsed || parsed.version !== 1 || typeof parsed.files !== "object") return out;
|
|
3966
3993
|
for (const [k, v] of Object.entries(parsed.files)) {
|
|
3967
3994
|
if (!v || typeof v !== "object") continue;
|
|
3968
|
-
const offsetsOk = [
|
|
3995
|
+
const offsetsOk = [
|
|
3996
|
+
"byteOffset",
|
|
3997
|
+
"lineOffset",
|
|
3998
|
+
"startedFromLine",
|
|
3999
|
+
"startedFromByte",
|
|
4000
|
+
"scannedThroughByte",
|
|
4001
|
+
"scannedThroughLine",
|
|
4002
|
+
"rewindGeneration",
|
|
4003
|
+
"callsExtracted"
|
|
4004
|
+
].every((f) => {
|
|
3969
4005
|
const n = v[f];
|
|
3970
4006
|
return n === void 0 || typeof n === "number" && Number.isSafeInteger(n) && n >= 0;
|
|
3971
4007
|
});
|
|
3972
4008
|
if (typeof v.byteOffset !== "number" || typeof v.lineOffset !== "number" || !offsetsOk) continue;
|
|
4009
|
+
const startedFromByte = typeof v.startedFromByte === "number" ? v.startedFromByte : v.byteOffset;
|
|
3973
4010
|
out.set(k, {
|
|
3974
4011
|
byteOffset: v.byteOffset,
|
|
3975
4012
|
lineOffset: v.lineOffset,
|
|
3976
4013
|
startedFromLine: typeof v.startedFromLine === "number" ? v.startedFromLine : 0,
|
|
4014
|
+
startedFromByte,
|
|
4015
|
+
scannedThroughByte: typeof v.scannedThroughByte === "number" ? v.scannedThroughByte : startedFromByte,
|
|
4016
|
+
scannedThroughLine: typeof v.scannedThroughLine === "number" ? v.scannedThroughLine : typeof v.startedFromLine === "number" ? v.startedFromLine : 0,
|
|
4017
|
+
rewindGeneration: typeof v.rewindGeneration === "number" ? v.rewindGeneration : 0,
|
|
4018
|
+
lastWindowTruncated: v.lastWindowTruncated === true,
|
|
3977
4019
|
callsExtracted: typeof v.callsExtracted === "number" ? v.callsExtracted : 0,
|
|
3978
4020
|
unpairedSince: typeof v.unpairedSince === "string" ? v.unpairedSince : null,
|
|
3979
4021
|
lastDisposition: COVERAGE_DISPOSITIONS.includes(v.lastDisposition) ? v.lastDisposition : "ok",
|
|
@@ -3992,22 +4034,47 @@ function saveCursors(path, cursors) {
|
|
|
3992
4034
|
atomicWriteFileSync(path, JSON.stringify({ version: 1, files }, null, 2));
|
|
3993
4035
|
}
|
|
3994
4036
|
function nextCursor(args) {
|
|
3995
|
-
const {
|
|
4037
|
+
const { endByte, endLine, earliestUnpaired, outcome, nowMs } = args;
|
|
3996
4038
|
const nowIso = new Date(nowMs).toISOString();
|
|
3997
4039
|
const disposition = dispositionFor(outcome);
|
|
4040
|
+
const truncated = args.truncated === true;
|
|
4041
|
+
const previous = args.rewound ? {
|
|
4042
|
+
...args.previous,
|
|
4043
|
+
byteOffset: 0,
|
|
4044
|
+
lineOffset: 0,
|
|
4045
|
+
scannedThroughByte: 0,
|
|
4046
|
+
scannedThroughLine: 0,
|
|
4047
|
+
startedFromByte: 0,
|
|
4048
|
+
startedFromLine: 0,
|
|
4049
|
+
rewindGeneration: args.previous.rewindGeneration + 1,
|
|
4050
|
+
// The call this was waiting on lived in the old file. Holding its clock
|
|
4051
|
+
// would apply an unrelated deadline to the new one.
|
|
4052
|
+
unpairedSince: null
|
|
4053
|
+
} : args.previous;
|
|
3998
4054
|
if (!mayAdvance(outcome)) {
|
|
3999
|
-
return {
|
|
4055
|
+
return {
|
|
4056
|
+
...previous,
|
|
4057
|
+
lastDisposition: disposition,
|
|
4058
|
+
lastScanAt: nowIso,
|
|
4059
|
+
lastWindowTruncated: truncated
|
|
4060
|
+
};
|
|
4000
4061
|
}
|
|
4001
4062
|
const callsExtracted = previous.callsExtracted + args.callsExtracted;
|
|
4063
|
+
const covered = (throughByte, throughLine) => ({
|
|
4064
|
+
scannedThroughByte: Math.max(previous.scannedThroughByte, throughByte),
|
|
4065
|
+
scannedThroughLine: Math.max(previous.scannedThroughLine, throughLine)
|
|
4066
|
+
});
|
|
4002
4067
|
if (!earliestUnpaired) {
|
|
4003
4068
|
return {
|
|
4004
4069
|
...previous,
|
|
4005
4070
|
byteOffset: endByte,
|
|
4006
4071
|
lineOffset: endLine,
|
|
4072
|
+
...covered(endByte, endLine),
|
|
4007
4073
|
callsExtracted,
|
|
4008
4074
|
unpairedSince: null,
|
|
4009
4075
|
lastDisposition: disposition,
|
|
4010
|
-
lastScanAt: nowIso
|
|
4076
|
+
lastScanAt: nowIso,
|
|
4077
|
+
lastWindowTruncated: truncated
|
|
4011
4078
|
};
|
|
4012
4079
|
}
|
|
4013
4080
|
const since = previous.unpairedSince ?? nowIso;
|
|
@@ -4017,20 +4084,30 @@ function nextCursor(args) {
|
|
|
4017
4084
|
...previous,
|
|
4018
4085
|
byteOffset: endByte,
|
|
4019
4086
|
lineOffset: endLine,
|
|
4087
|
+
...covered(endByte, endLine),
|
|
4020
4088
|
callsExtracted,
|
|
4021
4089
|
unpairedSince: null,
|
|
4022
4090
|
lastDisposition: disposition,
|
|
4023
|
-
lastScanAt: nowIso
|
|
4091
|
+
lastScanAt: nowIso,
|
|
4092
|
+
lastWindowTruncated: truncated
|
|
4024
4093
|
};
|
|
4025
4094
|
}
|
|
4095
|
+
const resumeByte = Math.max(previous.byteOffset, Math.min(endByte, earliestUnpaired.byteStart));
|
|
4096
|
+
const resumeLine = Math.max(previous.lineOffset, Math.min(endLine, earliestUnpaired.lineOffset));
|
|
4026
4097
|
return {
|
|
4027
4098
|
...previous,
|
|
4028
|
-
byteOffset:
|
|
4029
|
-
lineOffset:
|
|
4099
|
+
byteOffset: resumeByte,
|
|
4100
|
+
lineOffset: resumeLine,
|
|
4101
|
+
// Covered ground stops at the unpaired call: the calls from there on were
|
|
4102
|
+
// deliberately NOT sent (their `is_error` would be written null and
|
|
4103
|
+
// `ignoreDuplicates` makes that permanent), so claiming them would be
|
|
4104
|
+
// claiming rows the control plane has never been offered.
|
|
4105
|
+
...covered(resumeByte, resumeLine),
|
|
4030
4106
|
callsExtracted,
|
|
4031
4107
|
unpairedSince: since,
|
|
4032
4108
|
lastDisposition: disposition,
|
|
4033
|
-
lastScanAt: nowIso
|
|
4109
|
+
lastScanAt: nowIso,
|
|
4110
|
+
lastWindowTruncated: truncated
|
|
4034
4111
|
};
|
|
4035
4112
|
}
|
|
4036
4113
|
function initialCursor(args) {
|
|
@@ -4038,7 +4115,12 @@ function initialCursor(args) {
|
|
|
4038
4115
|
return {
|
|
4039
4116
|
byteOffset: args.startByte,
|
|
4040
4117
|
lineOffset: args.startLine,
|
|
4118
|
+
scannedThroughByte: args.startByte,
|
|
4119
|
+
scannedThroughLine: args.startLine,
|
|
4041
4120
|
startedFromLine: args.startLine,
|
|
4121
|
+
startedFromByte: args.startByte,
|
|
4122
|
+
rewindGeneration: 0,
|
|
4123
|
+
lastWindowTruncated: false,
|
|
4042
4124
|
callsExtracted: 0,
|
|
4043
4125
|
unpairedSince: null,
|
|
4044
4126
|
lastDisposition: "ok",
|
|
@@ -4053,9 +4135,14 @@ function coverageRowFor(key, cursor, versions) {
|
|
|
4053
4135
|
session_id: sessionId,
|
|
4054
4136
|
transcript_ref: transcriptRef,
|
|
4055
4137
|
transcript_rel_path: cursor.transcriptRelPath,
|
|
4056
|
-
through_line: cursor.
|
|
4057
|
-
through_byte: cursor.
|
|
4138
|
+
through_line: cursor.scannedThroughLine,
|
|
4139
|
+
through_byte: cursor.scannedThroughByte,
|
|
4058
4140
|
started_from_line: cursor.startedFromLine,
|
|
4141
|
+
started_from_byte: cursor.startedFromByte,
|
|
4142
|
+
scan_position_byte: cursor.byteOffset,
|
|
4143
|
+
scan_position_line: cursor.lineOffset,
|
|
4144
|
+
scan_window_truncated: cursor.lastWindowTruncated,
|
|
4145
|
+
rewind_generation: cursor.rewindGeneration,
|
|
4059
4146
|
calls_extracted: cursor.callsExtracted,
|
|
4060
4147
|
last_disposition: cursor.lastDisposition,
|
|
4061
4148
|
extractor_version: versions.extractor,
|
|
@@ -4150,7 +4237,8 @@ async function scanAgentToolCalls(args) {
|
|
|
4150
4237
|
}
|
|
4151
4238
|
const window = extractTranscriptWindow(file, extractOpts, {
|
|
4152
4239
|
byteOffset: cursor.byteOffset,
|
|
4153
|
-
lineOffset: cursor.lineOffset
|
|
4240
|
+
lineOffset: cursor.lineOffset,
|
|
4241
|
+
...args.windowBudgetBytes === void 0 ? {} : { budgetBytes: args.windowBudgetBytes }
|
|
4154
4242
|
});
|
|
4155
4243
|
summary.filesScanned += 1;
|
|
4156
4244
|
if (window.missing) {
|
|
@@ -4161,6 +4249,11 @@ async function scanAgentToolCalls(args) {
|
|
|
4161
4249
|
if (window.rewound) {
|
|
4162
4250
|
log2(`[tool-call-scan] ${file.relPath} ref=${file.ref} shrank below the cursor \u2014 re-reading from 0`);
|
|
4163
4251
|
}
|
|
4252
|
+
if (window.truncated) {
|
|
4253
|
+
log2(
|
|
4254
|
+
`[tool-call-scan] ${file.relPath} ref=${file.ref} hit the window budget at byte ${window.endByte} \u2014 more remains, resuming next tick`
|
|
4255
|
+
);
|
|
4256
|
+
}
|
|
4164
4257
|
summary.callsExtracted += window.records.length;
|
|
4165
4258
|
const unpairedIds = new Set(window.unpaired.map((u) => u.toolUseId));
|
|
4166
4259
|
const sendable = window.records.filter((r) => !unpairedIds.has(r.tool_use_id));
|
|
@@ -4183,7 +4276,9 @@ async function scanAgentToolCalls(args) {
|
|
|
4183
4276
|
earliestUnpaired: window.unpaired[0] ?? null,
|
|
4184
4277
|
outcome,
|
|
4185
4278
|
callsExtracted: sendable.length,
|
|
4186
|
-
nowMs: now()
|
|
4279
|
+
nowMs: now(),
|
|
4280
|
+
rewound: window.rewound,
|
|
4281
|
+
truncated: window.truncated
|
|
4187
4282
|
});
|
|
4188
4283
|
const advanced = attempted ? computed : { ...computed, lastDisposition: cursor.lastDisposition };
|
|
4189
4284
|
if (advanced.byteOffset === cursor.byteOffset && outcome.kind === "ingest_failed") {
|
|
@@ -11390,7 +11485,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
11390
11485
|
var lastVersionCheckAt = 0;
|
|
11391
11486
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
11392
11487
|
var lastResponsivenessProbeAt = 0;
|
|
11393
|
-
var agtCliVersion = true ? "0.28.
|
|
11488
|
+
var agtCliVersion = true ? "0.28.569" : "dev";
|
|
11394
11489
|
function resolveBrewPath(execFileSync2) {
|
|
11395
11490
|
try {
|
|
11396
11491
|
const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -12697,7 +12792,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
|
|
|
12697
12792
|
if (codeNames.length === 0) return;
|
|
12698
12793
|
void (async () => {
|
|
12699
12794
|
try {
|
|
12700
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
12795
|
+
const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
|
|
12701
12796
|
await api.post("/host/heartbeat", {
|
|
12702
12797
|
host_id: hostId,
|
|
12703
12798
|
agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics)
|
|
@@ -12805,7 +12900,7 @@ async function pollCycle() {
|
|
|
12805
12900
|
}
|
|
12806
12901
|
try {
|
|
12807
12902
|
const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
|
|
12808
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
12903
|
+
const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
|
|
12809
12904
|
const diagCodeNames = [...agentState.persistentSessionAgents];
|
|
12810
12905
|
const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics) : void 0;
|
|
12811
12906
|
let tailscaleHostname;
|
|
@@ -12928,7 +13023,7 @@ async function pollCycle() {
|
|
|
12928
13023
|
collectPanelessActivityProbes,
|
|
12929
13024
|
getResponsivenessIntervalMs,
|
|
12930
13025
|
occupancyQualificationClassifications
|
|
12931
|
-
} = await import("../responsiveness-probe-
|
|
13026
|
+
} = await import("../responsiveness-probe-V3P5TGBH.js");
|
|
12932
13027
|
const probeIntervalMs = getResponsivenessIntervalMs();
|
|
12933
13028
|
if (now - lastResponsivenessProbeAt > probeIntervalMs) {
|
|
12934
13029
|
const probeCodeNames = [...agentState.persistentSessionAgents];
|
|
@@ -13019,7 +13114,7 @@ async function pollCycle() {
|
|
|
13019
13114
|
collectResponsivenessProbes,
|
|
13020
13115
|
livePendingInboundOldestAgeSeconds,
|
|
13021
13116
|
parkPendingInbound
|
|
13022
|
-
} = await import("../responsiveness-probe-
|
|
13117
|
+
} = await import("../responsiveness-probe-V3P5TGBH.js");
|
|
13023
13118
|
const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
|
|
13024
13119
|
const wedgeNow = /* @__PURE__ */ new Date();
|
|
13025
13120
|
const liveAgents = agentState.persistentSessionAgents;
|
|
@@ -15649,7 +15744,7 @@ async function processAgent(agent, agentStates) {
|
|
|
15649
15744
|
if (newlyDone.length > 0) {
|
|
15650
15745
|
const displayName = agentState.agentDisplayNames.get(agent.code_name) ?? agent.code_name;
|
|
15651
15746
|
for (const item of newlyDone) {
|
|
15652
|
-
log(`Newly done:
|
|
15747
|
+
log(`Newly done: item_id=${item.id} notify_channel=${item.notify_channel ?? "none"} notify_to=${item.notify_to ?? "none"}`);
|
|
15653
15748
|
if (item.notify_channel && item.notify_to) {
|
|
15654
15749
|
const message = await buildDoneCardNotification(agentId, agent.code_name, displayName, item);
|
|
15655
15750
|
sendTaskNotification(agent.code_name, item.notify_channel, item.notify_to, message).catch((err) => {
|
|
@@ -15715,11 +15810,11 @@ async function processAgent(agent, agentStates) {
|
|
|
15715
15810
|
const stuckKey = `${agent.code_name}:${item.id}`;
|
|
15716
15811
|
if (!stuckKanbanLogged.has(stuckKey)) {
|
|
15717
15812
|
log(
|
|
15718
|
-
`[persistent-session-stuck-kanban] agent=${agent.code_name} item_id=${item.id}
|
|
15813
|
+
`[persistent-session-stuck-kanban] agent=${agent.code_name} item_id=${item.id} status=in_progress age_minutes=${age} threshold_minutes=${Math.round(STALE_TASK_THRESHOLD_MS / 6e4)}`
|
|
15719
15814
|
);
|
|
15720
15815
|
stuckKanbanLogged.add(stuckKey);
|
|
15721
15816
|
}
|
|
15722
|
-
log(`Stale task:
|
|
15817
|
+
log(`Stale task: item_id=${item.id} in_progress for ${age}m \u2014 reaping for '${agent.code_name}'`);
|
|
15723
15818
|
alertedStaleItems.add(`${agent.code_name}:${item.id}`);
|
|
15724
15819
|
let reapAction = null;
|
|
15725
15820
|
try {
|
|
@@ -15730,13 +15825,14 @@ async function processAgent(agent, agentStates) {
|
|
|
15730
15825
|
});
|
|
15731
15826
|
reapAction = reapResult.action ?? null;
|
|
15732
15827
|
log(
|
|
15733
|
-
`Reap result for
|
|
15828
|
+
`Reap result for item_id=${item.id}: updated=${reapResult.updated} action=${reapResult.action ?? reapResult.reason ?? "none"}`
|
|
15734
15829
|
);
|
|
15735
15830
|
if (reapAction === "dead_letter" && ((reapResult.updated ?? 0) > 0 || reapResult.ok === true)) {
|
|
15736
15831
|
freshDoneIds.add(item.id);
|
|
15737
15832
|
}
|
|
15738
15833
|
} catch (err) {
|
|
15739
|
-
|
|
15834
|
+
const errId = createHash17("sha256").update(err instanceof Error ? err.message : String(err)).digest("hex").slice(0, 12);
|
|
15835
|
+
log(`Reap API error for item_id=${item.id} error_id=${errId}`);
|
|
15740
15836
|
}
|
|
15741
15837
|
if (reapAction === "dead_letter") {
|
|
15742
15838
|
const message = `\u26A0\uFE0F Task Stalled \u2014 ${displayName}
|
|
@@ -16577,7 +16673,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
16577
16673
|
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}`));
|
|
16578
16674
|
void (async () => {
|
|
16579
16675
|
try {
|
|
16580
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
16676
|
+
const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
|
|
16581
16677
|
await api.post("/host/heartbeat", {
|
|
16582
16678
|
host_id: hostId,
|
|
16583
16679
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics)
|
|
@@ -16628,7 +16724,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
|
|
|
16628
16724
|
}
|
|
16629
16725
|
try {
|
|
16630
16726
|
const hostId = await getHostId();
|
|
16631
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
16727
|
+
const { collectDiagnostics } = await import("../persistent-session-WUNZJXCI.js");
|
|
16632
16728
|
await api.post("/host/heartbeat", {
|
|
16633
16729
|
host_id: hostId,
|
|
16634
16730
|
agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics)
|
|
@@ -17206,7 +17302,7 @@ async function processClaudePairSessions(agents) {
|
|
|
17206
17302
|
killPairSession,
|
|
17207
17303
|
pairTmuxSession,
|
|
17208
17304
|
finalizeClaudePairOnboarding
|
|
17209
|
-
} = await import("../claude-pair-runtime-
|
|
17305
|
+
} = await import("../claude-pair-runtime-XVEJ7XLB.js");
|
|
17210
17306
|
for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
|
|
17211
17307
|
log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
|
|
17212
17308
|
const killed = await killPairSession(pairTmuxSession(pairId));
|