@integrity-labs/agt-cli 0.28.316 → 0.28.318
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-J6H7R3Y4.js → chunk-2DIWTRTU.js} +3 -3
- package/dist/{chunk-ORTMG5E3.js → chunk-4DHYHNCV.js} +1 -1
- package/dist/{chunk-ORTMG5E3.js.map → chunk-4DHYHNCV.js.map} +1 -1
- package/dist/{claude-pair-runtime-4PLFHGOI.js → claude-pair-runtime-PWVOBBX4.js} +2 -2
- package/dist/lib/manager-worker.js +10 -10
- package/dist/mcp/index.js +17 -2
- package/dist/mcp/slack-channel.js +14 -6
- package/dist/{persistent-session-UZNQVUYB.js → persistent-session-VSSEZTY7.js} +2 -2
- package/dist/{responsiveness-probe-5XF7ZCYF.js → responsiveness-probe-I6YFUKYD.js} +2 -2
- package/package.json +1 -1
- /package/dist/{chunk-J6H7R3Y4.js.map → chunk-2DIWTRTU.js.map} +0 -0
- /package/dist/{claude-pair-runtime-4PLFHGOI.js.map → claude-pair-runtime-PWVOBBX4.js.map} +0 -0
- /package/dist/{persistent-session-UZNQVUYB.js.map → persistent-session-VSSEZTY7.js.map} +0 -0
- /package/dist/{responsiveness-probe-5XF7ZCYF.js.map → responsiveness-probe-I6YFUKYD.js.map} +0 -0
|
@@ -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-VSSEZTY7.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-PWVOBBX4.js.map
|
|
@@ -39,7 +39,7 @@ import {
|
|
|
39
39
|
requireHost,
|
|
40
40
|
safeWriteJsonAtomic,
|
|
41
41
|
setConfigHash
|
|
42
|
-
} from "../chunk-
|
|
42
|
+
} from "../chunk-2DIWTRTU.js";
|
|
43
43
|
import {
|
|
44
44
|
getProjectDir as getProjectDir2,
|
|
45
45
|
getReadyTasks,
|
|
@@ -127,7 +127,7 @@ import {
|
|
|
127
127
|
takeZombieDetection,
|
|
128
128
|
transcriptActivityAgeSeconds,
|
|
129
129
|
writeEgressAllowlist
|
|
130
|
-
} from "../chunk-
|
|
130
|
+
} from "../chunk-4DHYHNCV.js";
|
|
131
131
|
import {
|
|
132
132
|
reapOrphanChannelMcps
|
|
133
133
|
} from "../chunk-XWVM4KPK.js";
|
|
@@ -7087,7 +7087,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
7087
7087
|
var lastVersionCheckAt = 0;
|
|
7088
7088
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
7089
7089
|
var lastResponsivenessProbeAt = 0;
|
|
7090
|
-
var agtCliVersion = true ? "0.28.
|
|
7090
|
+
var agtCliVersion = true ? "0.28.318" : "dev";
|
|
7091
7091
|
function resolveBrewPath(execFileSync2) {
|
|
7092
7092
|
try {
|
|
7093
7093
|
const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -7959,7 +7959,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
|
|
|
7959
7959
|
if (codeNames.length === 0) return;
|
|
7960
7960
|
void (async () => {
|
|
7961
7961
|
try {
|
|
7962
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
7962
|
+
const { collectDiagnostics } = await import("../persistent-session-VSSEZTY7.js");
|
|
7963
7963
|
await api.post("/host/heartbeat", {
|
|
7964
7964
|
host_id: hostId,
|
|
7965
7965
|
agent_diagnostics: collectDiagnostics(codeNames)
|
|
@@ -8057,7 +8057,7 @@ async function pollCycle() {
|
|
|
8057
8057
|
}
|
|
8058
8058
|
try {
|
|
8059
8059
|
const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
|
|
8060
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
8060
|
+
const { collectDiagnostics } = await import("../persistent-session-VSSEZTY7.js");
|
|
8061
8061
|
const diagCodeNames = [...agentState.persistentSessionAgents];
|
|
8062
8062
|
const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
|
|
8063
8063
|
let tailscaleHostname;
|
|
@@ -8206,7 +8206,7 @@ async function pollCycle() {
|
|
|
8206
8206
|
const {
|
|
8207
8207
|
collectResponsivenessProbes,
|
|
8208
8208
|
getResponsivenessIntervalMs
|
|
8209
|
-
} = await import("../responsiveness-probe-
|
|
8209
|
+
} = await import("../responsiveness-probe-I6YFUKYD.js");
|
|
8210
8210
|
const probeIntervalMs = getResponsivenessIntervalMs();
|
|
8211
8211
|
if (now - lastResponsivenessProbeAt > probeIntervalMs) {
|
|
8212
8212
|
const probeCodeNames = [...agentState.persistentSessionAgents];
|
|
@@ -8238,7 +8238,7 @@ async function pollCycle() {
|
|
|
8238
8238
|
collectResponsivenessProbes,
|
|
8239
8239
|
livePendingInboundOldestAgeSeconds,
|
|
8240
8240
|
parkPendingInbound
|
|
8241
|
-
} = await import("../responsiveness-probe-
|
|
8241
|
+
} = await import("../responsiveness-probe-I6YFUKYD.js");
|
|
8242
8242
|
const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
|
|
8243
8243
|
const wedgeNow = /* @__PURE__ */ new Date();
|
|
8244
8244
|
const liveAgents = agentState.persistentSessionAgents;
|
|
@@ -11257,7 +11257,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
11257
11257
|
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}`));
|
|
11258
11258
|
void (async () => {
|
|
11259
11259
|
try {
|
|
11260
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
11260
|
+
const { collectDiagnostics } = await import("../persistent-session-VSSEZTY7.js");
|
|
11261
11261
|
await api.post("/host/heartbeat", {
|
|
11262
11262
|
host_id: hostId,
|
|
11263
11263
|
agent_diagnostics: collectDiagnostics([codeName])
|
|
@@ -11307,7 +11307,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
|
|
|
11307
11307
|
}
|
|
11308
11308
|
try {
|
|
11309
11309
|
const hostId = await getHostId();
|
|
11310
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
11310
|
+
const { collectDiagnostics } = await import("../persistent-session-VSSEZTY7.js");
|
|
11311
11311
|
await api.post("/host/heartbeat", {
|
|
11312
11312
|
host_id: hostId,
|
|
11313
11313
|
agent_diagnostics: collectDiagnostics([codeName])
|
|
@@ -11731,7 +11731,7 @@ async function processClaudePairSessions(agents) {
|
|
|
11731
11731
|
killPairSession,
|
|
11732
11732
|
pairTmuxSession,
|
|
11733
11733
|
finalizeClaudePairOnboarding
|
|
11734
|
-
} = await import("../claude-pair-runtime-
|
|
11734
|
+
} = await import("../claude-pair-runtime-PWVOBBX4.js");
|
|
11735
11735
|
for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
|
|
11736
11736
|
log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
|
|
11737
11737
|
const killed = await killPairSession(pairTmuxSession(pairId));
|
package/dist/mcp/index.js
CHANGED
|
@@ -21824,7 +21824,7 @@ server.tool(
|
|
|
21824
21824
|
}
|
|
21825
21825
|
);
|
|
21826
21826
|
var kanbanMoveStatuses = AGT_KANBAN_WAITING_ENABLED ? ["backlog", "todo", "in_progress", "waiting", "done", "failed"] : ["backlog", "todo", "in_progress", "done", "failed"];
|
|
21827
|
-
var kanbanMoveDescription = AGT_KANBAN_WAITING_ENABLED ?
|
|
21827
|
+
var kanbanMoveDescription = AGT_KANBAN_WAITING_ENABLED ? `Move a kanban item to a different status column. Use status="failed" for a task attempted but not completable. Use status="waiting" when you have COMPLETED your part and cannot proceed until one specific external action happens (a person approves/answers/decides, or a dependency like a PR merge or deploy completes). status="waiting" REQUIRES waiting_kind - classify the wait as "pr-review", "pr-merged", "human", "external", or "other" (the catch-all when none fit). For a PR wait ("pr-review"/"pr-merged") set waiting_repo ("owner/repo") and waiting_pr (the number) INSTEAD of waiting_on - the card then links straight to the PR and can auto-resume when it lands. For "human"/"external"/"other" set waiting_on to a one-line ask ("Answer my 5 scoping questions") AND put the full context the person needs to decide - the actual questions, options, links - in waiting_details, so they can answer from the card without opening a ticket. For "human" ALSO set waiting_on_person to that person's Slack user id, so the card lands in their "Awaiting you" queue and they are notified instead of your ask sitting unseen. Do NOT use waiting to offload hard work, and do NOT confuse it with a failure. (matches the hosted kanban_move enum).` : 'Move a kanban item to a different status column. Use status="failed" to mark a task that was attempted but could not complete (matches the hosted kanban_move enum).';
|
|
21828
21828
|
var kanbanMoveStatusDescribe = AGT_KANBAN_WAITING_ENABLED ? 'Target status. "waiting" parks the card until one external action happens; it REQUIRES waiting_kind - use "pr-review"/"pr-merged" with waiting_repo + waiting_pr, or "human"/"external"/"other" with a concrete waiting_on. "failed" closes the row as a failed attempt; there is no "cancelled" status, close no-longer-needed work via kanban_done with an explanatory result.' : 'Target status. "failed" closes the row as a failed attempt; there is no "cancelled" status, close no-longer-needed work via kanban_done with an explanatory result.';
|
|
21829
21829
|
server.tool(
|
|
21830
21830
|
"kanban_move",
|
|
@@ -21850,6 +21850,9 @@ server.tool(
|
|
|
21850
21850
|
waiting_pr: external_exports.number().int().positive().optional().describe("Only with a pr-* waiting_kind: the pull request number (e.g. 3120)."),
|
|
21851
21851
|
waiting_choices: external_exports.array(external_exports.string()).optional().describe(
|
|
21852
21852
|
'Optional, best with waiting_kind="human": 2-5 short answer options to offer the person as one-click buttons (e.g. ["Ship it", "Hold", "Needs changes"]). Keep them short. They can still add a free-text comment alongside a choice. Omit for an open-ended human wait (they just get a comment box).'
|
|
21853
|
+
),
|
|
21854
|
+
waiting_on_person: external_exports.string().optional().describe(
|
|
21855
|
+
`Only with waiting_kind="human": the Slack user id of the ONE person whose decision you are parked on (e.g. "U0123ABCD" - the same id you would pass to deliver_to). This puts the card in that person's "Awaiting you" queue and notifies them, so your ask does not sit unseen. It does NOT reassign the card - you still own driving it to done and you resume as soon as they answer. Set it whenever you know who has to act; omit only if genuinely nobody specific does.`
|
|
21853
21856
|
)
|
|
21854
21857
|
} : {}
|
|
21855
21858
|
},
|
|
@@ -21884,6 +21887,17 @@ server.tool(
|
|
|
21884
21887
|
isError: true
|
|
21885
21888
|
};
|
|
21886
21889
|
}
|
|
21890
|
+
if (p.waiting_on_person && p.waiting_kind !== "human") {
|
|
21891
|
+
return {
|
|
21892
|
+
content: [
|
|
21893
|
+
{
|
|
21894
|
+
type: "text",
|
|
21895
|
+
text: `Error: waiting_on_person is only valid with waiting_kind="human" (got "${p.waiting_kind ?? "unset"}"). Use waiting_kind="human" when one specific person must decide; for a PR use "pr-review"/"pr-merged" with waiting_repo + waiting_pr, and for a non-human blocker use "external"/"other" with waiting_on.`
|
|
21896
|
+
}
|
|
21897
|
+
],
|
|
21898
|
+
isError: true
|
|
21899
|
+
};
|
|
21900
|
+
}
|
|
21887
21901
|
let waitingContext;
|
|
21888
21902
|
if (isPrKind) {
|
|
21889
21903
|
waitingContext = { repo: p.waiting_repo, pr_number: p.waiting_pr };
|
|
@@ -21903,7 +21917,8 @@ server.tool(
|
|
|
21903
21917
|
notes: params.notes,
|
|
21904
21918
|
waiting_on: isPrKind ? void 0 : p.waiting_on,
|
|
21905
21919
|
waiting_kind: p.waiting_kind,
|
|
21906
|
-
waiting_context: waitingContext
|
|
21920
|
+
waiting_context: waitingContext,
|
|
21921
|
+
waiting_on_person: p.waiting_on_person
|
|
21907
21922
|
}
|
|
21908
21923
|
]
|
|
21909
21924
|
});
|
|
@@ -16461,6 +16461,10 @@ import { createHash as createHash2, randomUUID as randomUUID2 } from "crypto";
|
|
|
16461
16461
|
// src/slack-thread-store.ts
|
|
16462
16462
|
import { mkdirSync as mkdirSync3, readFileSync as readFileSync5, writeFileSync as writeFileSync4 } from "fs";
|
|
16463
16463
|
import { dirname as dirname2 } from "path";
|
|
16464
|
+
function isParticipatingThread(entry) {
|
|
16465
|
+
if (!entry) return false;
|
|
16466
|
+
return entry.bot_posted === true || entry.involvement === "mentioned" || entry.involvement === "started";
|
|
16467
|
+
}
|
|
16464
16468
|
var FILE_VERSION = 1;
|
|
16465
16469
|
var DEFAULT_TTL_DAYS = 30;
|
|
16466
16470
|
var DEFAULT_MIN_INTERVAL_MS = 1e3;
|
|
@@ -20956,14 +20960,18 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
20956
20960
|
mode: bindingMode,
|
|
20957
20961
|
args: { inbound_id, channel, thread_ts, message_ts, proactive },
|
|
20958
20962
|
registry: slackInboundRegistry,
|
|
20959
|
-
// ENG-7409: the persisted
|
|
20960
|
-
// restart via loadThreadStore). A reply into a thread the agent has posted
|
|
20961
|
-
//
|
|
20962
|
-
//
|
|
20963
|
-
//
|
|
20963
|
+
// ENG-7409 + ENG-7782: the persisted thread-participation signal (survives
|
|
20964
|
+
// restart via loadThreadStore). A reply into a thread the agent has posted in
|
|
20965
|
+
// (bot_posted) OR was @-mentioned into / owns the root of (involvement) is a
|
|
20966
|
+
// legitimate follow-up, so it must not be flagged unknown_target even when no
|
|
20967
|
+
// live inbound marker survives - this is what stops warn from nagging (and
|
|
20968
|
+
// enforce from blocking) ordinary in-thread conversation. Keying on bot_posted
|
|
20969
|
+
// ALONE previously deadlocked the FIRST reply into a mention-followed thread
|
|
20970
|
+
// (bot_posted is only set after a successful reply), which enforce blocked as
|
|
20971
|
+
// unknown_target - see isParticipatingThread.
|
|
20964
20972
|
knownThread: (c, t) => {
|
|
20965
20973
|
const k = buildThreadKey(c, t);
|
|
20966
|
-
return !!k &&
|
|
20974
|
+
return !!k && isParticipatingThread(trackedThreads.get(k));
|
|
20967
20975
|
}
|
|
20968
20976
|
});
|
|
20969
20977
|
recordReplyBindingClassification(SLACK_AGENT_DIR, "slack", {
|
|
@@ -36,7 +36,7 @@ import {
|
|
|
36
36
|
writeDirectChatSessionState,
|
|
37
37
|
writeEgressAllowlist,
|
|
38
38
|
writePersistentClaudeWrapper
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-4DHYHNCV.js";
|
|
40
40
|
import "./chunk-XWVM4KPK.js";
|
|
41
41
|
export {
|
|
42
42
|
EGRESS_BASELINE_DOMAINS,
|
|
@@ -77,4 +77,4 @@ export {
|
|
|
77
77
|
writeEgressAllowlist,
|
|
78
78
|
writePersistentClaudeWrapper
|
|
79
79
|
};
|
|
80
|
-
//# sourceMappingURL=persistent-session-
|
|
80
|
+
//# sourceMappingURL=persistent-session-VSSEZTY7.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
paneLogPath
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-4DHYHNCV.js";
|
|
4
4
|
import "./chunk-XWVM4KPK.js";
|
|
5
5
|
|
|
6
6
|
// src/lib/responsiveness-probe.ts
|
|
@@ -427,4 +427,4 @@ export {
|
|
|
427
427
|
readAndResetSlackReplyBindingClassifications,
|
|
428
428
|
readAndResetSlackReplyTargetClassifications
|
|
429
429
|
};
|
|
430
|
-
//# sourceMappingURL=responsiveness-probe-
|
|
430
|
+
//# sourceMappingURL=responsiveness-probe-I6YFUKYD.js.map
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|