@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.
@@ -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-UZNQVUYB.js");
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-4PLFHGOI.js.map
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-J6H7R3Y4.js";
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-ORTMG5E3.js";
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.316" : "dev";
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-UZNQVUYB.js");
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-UZNQVUYB.js");
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-5XF7ZCYF.js");
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-5XF7ZCYF.js");
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-UZNQVUYB.js");
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-UZNQVUYB.js");
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-4PLFHGOI.js");
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 ? '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. 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).';
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 bot_posted thread-participation signal (survives
20960
- // restart via loadThreadStore). A reply into a thread the agent has posted
20961
- // in is a legitimate follow-up, so it must not be flagged unknown_target
20962
- // even when no live inbound marker survives - this is what stops warn from
20963
- // nagging (and enforce from blocking) ordinary in-thread conversation.
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 && !!trackedThreads.get(k)?.bot_posted;
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-ORTMG5E3.js";
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-UZNQVUYB.js.map
80
+ //# sourceMappingURL=persistent-session-VSSEZTY7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-ORTMG5E3.js";
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-5XF7ZCYF.js.map
430
+ //# sourceMappingURL=responsiveness-probe-I6YFUKYD.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.316",
3
+ "version": "0.28.318",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {