@integrity-labs/agt-cli 0.28.231 → 0.28.233
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-2ZZ4SWAY.js → chunk-EXBFINF4.js} +9 -3
- package/dist/chunk-EXBFINF4.js.map +1 -0
- package/dist/{chunk-X4FOPVGZ.js → chunk-LTBALKME.js} +60 -1
- package/dist/chunk-LTBALKME.js.map +1 -0
- package/dist/{claude-pair-runtime-CGUFXCYJ.js → claude-pair-runtime-MTIOLC2O.js} +2 -2
- package/dist/lib/manager-worker.js +24 -12
- package/dist/lib/manager-worker.js.map +1 -1
- package/dist/mcp/slack-channel.js +47 -0
- package/dist/{persistent-session-XYM2DWZU.js → persistent-session-BWE63K2J.js} +2 -2
- package/dist/{responsiveness-probe-MUPAYTJF.js → responsiveness-probe-NV2I7OCG.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-2ZZ4SWAY.js.map +0 -1
- package/dist/chunk-X4FOPVGZ.js.map +0 -1
- /package/dist/{claude-pair-runtime-CGUFXCYJ.js.map → claude-pair-runtime-MTIOLC2O.js.map} +0 -0
- /package/dist/{persistent-session-XYM2DWZU.js.map → persistent-session-BWE63K2J.js.map} +0 -0
- /package/dist/{responsiveness-probe-MUPAYTJF.js.map → responsiveness-probe-NV2I7OCG.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-BWE63K2J.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-MTIOLC2O.js.map
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
requireHost,
|
|
38
38
|
safeWriteJsonAtomic,
|
|
39
39
|
setConfigHash
|
|
40
|
-
} from "../chunk-
|
|
40
|
+
} from "../chunk-EXBFINF4.js";
|
|
41
41
|
import {
|
|
42
42
|
getProjectDir as getProjectDir2,
|
|
43
43
|
getReadyTasks,
|
|
@@ -122,7 +122,7 @@ import {
|
|
|
122
122
|
takeZombieDetection,
|
|
123
123
|
transcriptActivityAgeSeconds,
|
|
124
124
|
writeEgressAllowlist
|
|
125
|
-
} from "../chunk-
|
|
125
|
+
} from "../chunk-LTBALKME.js";
|
|
126
126
|
import {
|
|
127
127
|
reapOrphanChannelMcps
|
|
128
128
|
} from "../chunk-XWVM4KPK.js";
|
|
@@ -3478,6 +3478,7 @@ var STANDUP_TEMPLATES = /* @__PURE__ */ new Set(["daily-standup", "end-of-day-su
|
|
|
3478
3478
|
var TASK_UPDATE_TEMPLATES = /* @__PURE__ */ new Set(["hourly-status", "task-update"]);
|
|
3479
3479
|
var PLAN_TEMPLATES = /* @__PURE__ */ new Set(["morning-plan"]);
|
|
3480
3480
|
var KANBAN_WORK_TEMPLATES = /* @__PURE__ */ new Set(["kanban-work"]);
|
|
3481
|
+
var TOOL_DELIVERED_TEMPLATES = /* @__PURE__ */ new Set(["performance-review"]);
|
|
3481
3482
|
function isPlainScheduledTemplate(templateId) {
|
|
3482
3483
|
return !STANDUP_TEMPLATES.has(templateId) && !TASK_UPDATE_TEMPLATES.has(templateId) && !PLAN_TEMPLATES.has(templateId) && !KANBAN_WORK_TEMPLATES.has(templateId);
|
|
3483
3484
|
}
|
|
@@ -4551,6 +4552,11 @@ var SCHEDULED_CARD_DELIVERY_CONTRACT = `
|
|
|
4551
4552
|
[delivery contract \u2014 system]
|
|
4552
4553
|
The result you write on this card IS the message that will be delivered to the user. Delivery happens automatically from the card \u2014 never send, post, or message it yourself.
|
|
4553
4554
|
If \u2014 and ONLY if \u2014 the task above contains explicit opt-out wording the user typed ("DO NOT notify me unless \u2026", "only if X", "stay silent unless \u2026") and that condition is NOT met this run, call kanban_done with suppress_delivery: true \u2014 your result is still recorded on the card but will NOT be messaged to the user. That is how you honor the user's do-not-notify instruction; a "nothing urgent" / "all quiet" result WITHOUT the flag would still be DELIVERED as a message. (Legacy fallback: writing exactly ${SUPPRESS_SENTINEL} alone as the result also suppresses.) If the task asks for a digest/report WITHOUT opt-out wording, a zero-item report is a valid deliverable \u2014 deliver it.`;
|
|
4555
|
+
var SCHEDULED_CARD_TOOL_DELIVERY_INSTRUCTION = `
|
|
4556
|
+
|
|
4557
|
+
---
|
|
4558
|
+
[delivery contract \u2014 system]
|
|
4559
|
+
This task delivers its result by CALLING A TOOL, not via this card. Follow the task instructions above and call the tool they name \u2014 for the weekly performance review that is submit_performance_review, which delivers the rating form to your manager. That tool call is what reaches the recipient. This card is only your working record: writing a summary here does NOT deliver anything and is NOT a substitute for the tool call. Make the tool call, then note briefly on the card what you sent and mark it done.`;
|
|
4554
4560
|
var SCHEDULED_CARD_PLAN_INSTRUCTION = `
|
|
4555
4561
|
|
|
4556
4562
|
---
|
|
@@ -4559,7 +4565,7 @@ This is a board-PLANNING task. Review your current board with kanban_list, then
|
|
|
4559
4565
|
async function routeScheduledTaskViaKanban(codeName, agentId, task, prompt) {
|
|
4560
4566
|
const priorRuns = await fetchPriorScheduledRuns(agentId, task.taskId);
|
|
4561
4567
|
const contextBlocks = buildScheduledTaskContextBlocks({ priorRuns, timezone: task.timezone });
|
|
4562
|
-
const cardDescription = contextBlocks + (PLAN_TEMPLATES.has(task.templateId) ? prompt + SCHEDULED_CARD_PLAN_INSTRUCTION : prompt + SCHEDULED_CARD_DELIVERY_CONTRACT);
|
|
4568
|
+
const cardDescription = contextBlocks + (TOOL_DELIVERED_TEMPLATES.has(task.templateId) ? prompt + SCHEDULED_CARD_TOOL_DELIVERY_INSTRUCTION : PLAN_TEMPLATES.has(task.templateId) ? prompt + SCHEDULED_CARD_PLAN_INSTRUCTION : prompt + SCHEDULED_CARD_DELIVERY_CONTRACT);
|
|
4563
4569
|
const { run_id, kanban_item_id } = await startRun({
|
|
4564
4570
|
agent_id: agentId,
|
|
4565
4571
|
source_type: "scheduled_task",
|
|
@@ -4581,7 +4587,8 @@ async function routeScheduledTaskViaKanban(codeName, agentId, task, prompt) {
|
|
|
4581
4587
|
const suppressionTeaching = (task.deliveryPolicy ?? "always") === "conditional" ? `THIS task is CONDITIONAL: quiet runs stay SILENT automatically. Write your findings on the card and mark it done \u2014 if nothing met the user's criteria, NOTHING will be sent (no flag needed). If something DID meet the criteria and the user must be told, call kanban_done with suppress_delivery: false AND delivery_reason naming the concrete trigger that fired (e.g. "urgent email from the CEO", "CI failing on main"); a vacuous reason like "status check" or "all clear" is rejected and stays silent. That explicit, justified assert is the ONLY way this result reaches the user.
|
|
4582
4588
|
` : `If \u2014 and ONLY if \u2014 the task description contains explicit opt-out wording the user typed (e.g. "DO NOT notify me unless urgent", "only if X", "stay silent unless \u2026") and that condition is NOT met this run, call kanban_done with suppress_delivery: true \u2014 your result stays on the card but will NOT be messaged to the user. That is how you honor the user's do-not-notify instruction: a "nothing urgent" result without the flag would still be DELIVERED as a message. A report with zero items is only a valid deliverable when the task asks for a digest WITHOUT opt-out wording \u2014 when in doubt, deliver.
|
|
4583
4589
|
`;
|
|
4584
|
-
const nudge = `You have a new scheduled task on your kanban board: id=${kanban_item_id} title=${JSON.stringify(task.name)}. Call kanban_move("${kanban_item_id}", "in_progress"), do the work described on the card
|
|
4590
|
+
const nudge = TOOL_DELIVERED_TEMPLATES.has(task.templateId) ? `You have a new scheduled task on your kanban board: id=${kanban_item_id} title=${JSON.stringify(task.name)}. Call kanban_move("${kanban_item_id}", "in_progress"), then do the work described on the card. This task DELIVERS VIA A TOOL, not the card: you MUST call the tool the task specifies \u2014 for the weekly performance review that is submit_performance_review \u2014 to actually deliver it. Writing a summary to the card does NOT send anything and is NOT a substitute for the tool call. After the tool call, note briefly on the card what you sent and mark it done.
|
|
4591
|
+
` + formatRunMarker(run_id) : `You have a new scheduled task on your kanban board: id=${kanban_item_id} title=${JSON.stringify(task.name)}. Call kanban_move("${kanban_item_id}", "in_progress"), do the work described on the card, then write the finished result onto the card and mark it done. Do NOT send, post, or message the result to anyone yourself \u2014 the result you write on the card IS the message that will be delivered to the user; delivery happens automatically from the card.
|
|
4585
4592
|
` + suppressionTeaching + formatRunMarker(run_id);
|
|
4586
4593
|
let injectStatus;
|
|
4587
4594
|
try {
|
|
@@ -6419,7 +6426,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
|
|
|
6419
6426
|
var lastVersionCheckAt = 0;
|
|
6420
6427
|
var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
|
|
6421
6428
|
var lastResponsivenessProbeAt = 0;
|
|
6422
|
-
var agtCliVersion = true ? "0.28.
|
|
6429
|
+
var agtCliVersion = true ? "0.28.233" : "dev";
|
|
6423
6430
|
function resolveBrewPath(execFileSync2) {
|
|
6424
6431
|
try {
|
|
6425
6432
|
const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
|
|
@@ -7344,7 +7351,7 @@ async function pollCycle() {
|
|
|
7344
7351
|
}
|
|
7345
7352
|
try {
|
|
7346
7353
|
const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
|
|
7347
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
7354
|
+
const { collectDiagnostics } = await import("../persistent-session-BWE63K2J.js");
|
|
7348
7355
|
const diagCodeNames = [...agentState.persistentSessionAgents];
|
|
7349
7356
|
const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
|
|
7350
7357
|
let tailscaleHostname;
|
|
@@ -7492,7 +7499,7 @@ async function pollCycle() {
|
|
|
7492
7499
|
const {
|
|
7493
7500
|
collectResponsivenessProbes,
|
|
7494
7501
|
getResponsivenessIntervalMs
|
|
7495
|
-
} = await import("../responsiveness-probe-
|
|
7502
|
+
} = await import("../responsiveness-probe-NV2I7OCG.js");
|
|
7496
7503
|
const probeIntervalMs = getResponsivenessIntervalMs();
|
|
7497
7504
|
if (now - lastResponsivenessProbeAt > probeIntervalMs) {
|
|
7498
7505
|
const probeCodeNames = [...agentState.persistentSessionAgents];
|
|
@@ -7524,7 +7531,7 @@ async function pollCycle() {
|
|
|
7524
7531
|
collectResponsivenessProbes,
|
|
7525
7532
|
livePendingInboundOldestAgeSeconds,
|
|
7526
7533
|
parkPendingInbound
|
|
7527
|
-
} = await import("../responsiveness-probe-
|
|
7534
|
+
} = await import("../responsiveness-probe-NV2I7OCG.js");
|
|
7528
7535
|
const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
|
|
7529
7536
|
const wedgeNow = /* @__PURE__ */ new Date();
|
|
7530
7537
|
const liveAgents = agentState.persistentSessionAgents;
|
|
@@ -7820,7 +7827,7 @@ async function pollCycle() {
|
|
|
7820
7827
|
if (restartedCodeNames.length > 0) {
|
|
7821
7828
|
void (async () => {
|
|
7822
7829
|
try {
|
|
7823
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
7830
|
+
const { collectDiagnostics } = await import("../persistent-session-BWE63K2J.js");
|
|
7824
7831
|
const freshDiagnostics = collectDiagnostics(restartedCodeNames);
|
|
7825
7832
|
await api.post("/host/heartbeat", {
|
|
7826
7833
|
host_id: hostId,
|
|
@@ -8563,12 +8570,15 @@ async function processAgent(agent, agentStates) {
|
|
|
8563
8570
|
crossTeamPeerIntraOrg: crossTeamData.organization?.cross_team_peer_intra_org ?? "unrestricted"
|
|
8564
8571
|
} : void 0;
|
|
8565
8572
|
const peersForHash = channelId === "telegram" ? extractCharterTelegramPeers(refreshData.charter?.raw_content ?? "", gateContext) : channelId === "slack" ? extractCharterSlackPeers(refreshData.charter?.raw_content ?? "", gateContext) : null;
|
|
8573
|
+
const slackTeamPeerUserIds = channelId === "slack" && Array.isArray(crossTeamData.team_peer_slack_user_ids) ? crossTeamData.team_peer_slack_user_ids : void 0;
|
|
8566
8574
|
const sessionModeForHash = refreshData.agent.session_mode;
|
|
8567
8575
|
const senderPolicyForHash = refreshData.sender_policy ?? null;
|
|
8568
8576
|
const configHash = computeChannelConfigHash({
|
|
8569
8577
|
cliVersion: agtCliVersion,
|
|
8570
8578
|
config: entry.config,
|
|
8571
|
-
|
|
8579
|
+
// ENG-7349: the slack team roster rides the `team` input (it is
|
|
8580
|
+
// team-level data, not a CHARTER peer declaration).
|
|
8581
|
+
team: slackTeamPeerUserIds !== void 0 ? { ...teamSettingsForHash, slack_team_peer_user_ids: slackTeamPeerUserIds } : teamSettingsForHash,
|
|
8572
8582
|
peers: peersForHash,
|
|
8573
8583
|
sessionMode: sessionModeForHash,
|
|
8574
8584
|
senderPolicy: senderPolicyForHash
|
|
@@ -8619,6 +8629,8 @@ async function processAgent(agent, agentStates) {
|
|
|
8619
8629
|
peerDisabled,
|
|
8620
8630
|
telegramPeers,
|
|
8621
8631
|
slackPeers,
|
|
8632
|
+
// ENG-7349: same-team roster for the peer-enablement hint.
|
|
8633
|
+
slackTeamPeerUserIds,
|
|
8622
8634
|
agentTimezone,
|
|
8623
8635
|
senderPolicy: senderPolicyForCall,
|
|
8624
8636
|
agentAvatarUrl
|
|
@@ -10323,7 +10335,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
|
|
|
10323
10335
|
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}`));
|
|
10324
10336
|
void (async () => {
|
|
10325
10337
|
try {
|
|
10326
|
-
const { collectDiagnostics } = await import("../persistent-session-
|
|
10338
|
+
const { collectDiagnostics } = await import("../persistent-session-BWE63K2J.js");
|
|
10327
10339
|
await api.post("/host/heartbeat", {
|
|
10328
10340
|
host_id: hostId,
|
|
10329
10341
|
agent_diagnostics: collectDiagnostics([codeName])
|
|
@@ -10717,7 +10729,7 @@ async function processClaudePairSessions(agents) {
|
|
|
10717
10729
|
killPairSession,
|
|
10718
10730
|
pairTmuxSession,
|
|
10719
10731
|
finalizeClaudePairOnboarding
|
|
10720
|
-
} = await import("../claude-pair-runtime-
|
|
10732
|
+
} = await import("../claude-pair-runtime-MTIOLC2O.js");
|
|
10721
10733
|
for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
|
|
10722
10734
|
log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
|
|
10723
10735
|
const killed = await killPairSession(pairTmuxSession(pairId));
|