@integrity-labs/agt-cli 0.28.620 → 0.28.621

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.
@@ -7,7 +7,7 @@ import {
7
7
  expandTemplateVars,
8
8
  isolationMode,
9
9
  parseEnvIntegrations
10
- } from "./chunk-RXC3MTSN.js";
10
+ } from "./chunk-QSPSXG4K.js";
11
11
  import {
12
12
  BIND_FAILURE_QUARANTINE_THRESHOLD,
13
13
  INTEGRATIONS_SECTION_END,
@@ -48,7 +48,7 @@ import {
48
48
  resolveConnectivityProbe,
49
49
  worseConnectivityOutcome,
50
50
  wrapScheduledTaskPrompt
51
- } from "./chunk-P6KFZVKA.js";
51
+ } from "./chunk-EDH4GZIW.js";
52
52
  import {
53
53
  parsePsRows
54
54
  } from "./chunk-XWVM4KPK.js";
@@ -6065,7 +6065,7 @@ function exchangeFailureKind(err) {
6065
6065
  }
6066
6066
 
6067
6067
  // src/lib/api-client.ts
6068
- var agtCliVersion = true ? "0.28.620" : "dev";
6068
+ var agtCliVersion = true ? "0.28.621" : "dev";
6069
6069
  var lastConfigHash = null;
6070
6070
  function setConfigHash(hash) {
6071
6071
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -9558,4 +9558,4 @@ export {
9558
9558
  managerInstallSystemUnitCommand,
9559
9559
  managerUninstallSystemUnitCommand
9560
9560
  };
9561
- //# sourceMappingURL=chunk-5ZJFTTGB.js.map
9561
+ //# sourceMappingURL=chunk-MSQXSVA5.js.map
@@ -16,7 +16,7 @@ import {
16
16
  rotateDailySession,
17
17
  sessionFileExists,
18
18
  todayLocalIso
19
- } from "./chunk-P6KFZVKA.js";
19
+ } from "./chunk-EDH4GZIW.js";
20
20
  import {
21
21
  reapOrphanChannelMcps
22
22
  } from "./chunk-XWVM4KPK.js";
@@ -4352,4 +4352,4 @@ export {
4352
4352
  stopAllSessionsAndWait,
4353
4353
  getProjectDir
4354
4354
  };
4355
- //# sourceMappingURL=chunk-RXC3MTSN.js.map
4355
+ //# sourceMappingURL=chunk-QSPSXG4K.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-AGPLISL3.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-IFZS5AXT.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-3356FFTC.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-63GQ5AOP.js.map
@@ -54,7 +54,7 @@ import {
54
54
  safeWriteJsonAtomic,
55
55
  setConfigHash,
56
56
  tripClass
57
- } from "../chunk-5ZJFTTGB.js";
57
+ } from "../chunk-MSQXSVA5.js";
58
58
  import {
59
59
  getProjectDir as getProjectDir2,
60
60
  getReadyTasks,
@@ -110,7 +110,7 @@ import {
110
110
  takeZombieDetection,
111
111
  toOpencodeModel,
112
112
  writeEgressAllowlist
113
- } from "../chunk-RXC3MTSN.js";
113
+ } from "../chunk-QSPSXG4K.js";
114
114
  import {
115
115
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
116
116
  AnchorSessionClient,
@@ -187,7 +187,7 @@ import {
187
187
  subagentActivityAgeSeconds,
188
188
  sumTranscriptUsageInWindow,
189
189
  transcriptActivityAgeSeconds
190
- } from "../chunk-P6KFZVKA.js";
190
+ } from "../chunk-EDH4GZIW.js";
191
191
  import {
192
192
  reapOrphanChannelMcps
193
193
  } from "../chunk-XWVM4KPK.js";
@@ -11394,7 +11394,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
11394
11394
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
11395
11395
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
11396
11396
  async function channelInboundActivityAgeSecondsFor(codeName) {
11397
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-ITYPPSHM.js");
11397
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-76U4MR6U.js");
11398
11398
  const newest = newestPendingInboundActivityMtimeMs(dirname9(paneLogPath(codeName)));
11399
11399
  if (newest === null) return null;
11400
11400
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -12033,7 +12033,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
12033
12033
  var lastVersionCheckAt = 0;
12034
12034
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
12035
12035
  var lastResponsivenessProbeAt = 0;
12036
- var agtCliVersion = true ? "0.28.620" : "dev";
12036
+ var agtCliVersion = true ? "0.28.621" : "dev";
12037
12037
  function resolveBrewPath(execFileSync3) {
12038
12038
  try {
12039
12039
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -13340,7 +13340,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
13340
13340
  if (codeNames.length === 0) return;
13341
13341
  void (async () => {
13342
13342
  try {
13343
- const { collectDiagnostics } = await import("../persistent-session-AGPLISL3.js");
13343
+ const { collectDiagnostics } = await import("../persistent-session-IFZS5AXT.js");
13344
13344
  await api.post("/host/heartbeat", {
13345
13345
  host_id: hostId,
13346
13346
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -13456,7 +13456,7 @@ async function pollCycleInner() {
13456
13456
  }
13457
13457
  try {
13458
13458
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
13459
- const { collectDiagnostics } = await import("../persistent-session-AGPLISL3.js");
13459
+ const { collectDiagnostics } = await import("../persistent-session-IFZS5AXT.js");
13460
13460
  const diagCodeNames = [...agentState.persistentSessionAgents];
13461
13461
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
13462
13462
  let tailscaleHostname;
@@ -13579,7 +13579,7 @@ async function pollCycleInner() {
13579
13579
  collectPanelessActivityProbes,
13580
13580
  getResponsivenessIntervalMs,
13581
13581
  occupancyQualificationClassifications
13582
- } = await import("../responsiveness-probe-ITYPPSHM.js");
13582
+ } = await import("../responsiveness-probe-76U4MR6U.js");
13583
13583
  const probeIntervalMs = getResponsivenessIntervalMs();
13584
13584
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
13585
13585
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -13685,7 +13685,7 @@ async function pollCycleInner() {
13685
13685
  collectResponsivenessProbes,
13686
13686
  livePendingInboundOldestAgeSeconds,
13687
13687
  parkPendingInbound
13688
- } = await import("../responsiveness-probe-ITYPPSHM.js");
13688
+ } = await import("../responsiveness-probe-76U4MR6U.js");
13689
13689
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
13690
13690
  const wedgeNow = /* @__PURE__ */ new Date();
13691
13691
  const liveAgents = agentState.persistentSessionAgents;
@@ -13841,7 +13841,7 @@ async function pollCycleInner() {
13841
13841
  }
13842
13842
  try {
13843
13843
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
13844
- const { probeSessionAuth } = await import("../session-auth-dead-Y6ABNWNM.js");
13844
+ const { probeSessionAuth } = await import("../session-auth-dead-RLQK5ZQV.js");
13845
13845
  const observations = [];
13846
13846
  const pendingCacheCommits = [];
13847
13847
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -17368,7 +17368,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
17368
17368
  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}`));
17369
17369
  void (async () => {
17370
17370
  try {
17371
- const { collectDiagnostics } = await import("../persistent-session-AGPLISL3.js");
17371
+ const { collectDiagnostics } = await import("../persistent-session-IFZS5AXT.js");
17372
17372
  await api.post("/host/heartbeat", {
17373
17373
  host_id: hostId,
17374
17374
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17419,7 +17419,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
17419
17419
  }
17420
17420
  try {
17421
17421
  const hostId = await getHostId();
17422
- const { collectDiagnostics } = await import("../persistent-session-AGPLISL3.js");
17422
+ const { collectDiagnostics } = await import("../persistent-session-IFZS5AXT.js");
17423
17423
  await api.post("/host/heartbeat", {
17424
17424
  host_id: hostId,
17425
17425
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -18015,7 +18015,7 @@ async function processClaudePairSessions(agents) {
18015
18015
  killPairSession,
18016
18016
  pairTmuxSession,
18017
18017
  finalizeClaudePairOnboarding
18018
- } = await import("../claude-pair-runtime-3356FFTC.js");
18018
+ } = await import("../claude-pair-runtime-63GQ5AOP.js");
18019
18019
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
18020
18020
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
18021
18021
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -33939,7 +33939,12 @@ var AGENT_DIRECTED_NOTICE_KINDS = [
33939
33939
  // instructing the agent what not to do ("do not re-raise it yourself"). The
33940
33940
  // human needs none of it: they are the person who tapped the button, and the
33941
33941
  // card swapped under their finger to say so.
33942
- "offer_result"
33942
+ "offer_result",
33943
+ // ENG-9051. The "you are blocking another agent" notice. Its content opens
33944
+ // with a `[blocking]` machine tag and is second-person instruction to the
33945
+ // agent ("Do whatever you owe them, then tell them"). The customer has no
33946
+ // part in it - this is one agent telling another it has stopped.
33947
+ "waiting_on_agent"
33943
33948
  ];
33944
33949
  var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
33945
33950
 
@@ -34582,7 +34587,8 @@ var WAITING_KINDS = [
34582
34587
  "human",
34583
34588
  "external",
34584
34589
  "other",
34585
- "approval"
34590
+ "approval",
34591
+ "agent"
34586
34592
  ];
34587
34593
  var WAITING_KIND_SET = new Set(WAITING_KINDS);
34588
34594
 
@@ -35022,18 +35028,18 @@ var FLAG_REGISTRY = [
35022
35028
  // modal would report every recently-seen host as honoring the flip — the
35023
35029
  // dangerous direction, because it reads as "armed" when it is not.
35024
35030
  //
35025
- // PLACEHOLDER, deliberately above every published version (npm latest was
35026
- // 0.28.612 when this landed). The reader ships in whatever the auto-publish
35027
- // patch-bump produces AFTER this merges, which is not knowable here. Per the
35028
- // same reasoning recorded on the `agt-bin` flag: `since` is ADVISORY, read
35029
- // only by `computeFlagReach`; it changes what an operator is TOLD, it does
35030
- // not gate a flip. So an over-high placeholder is safe (reach under-reports,
35031
- // nobody flips), and a GUESSED number is not.
35031
+ // Resolved from the PUBLISHED artifacts, not from the merge timestamp: the
35032
+ // tarballs for 0.28.617 and 0.28.618 were unpacked and searched for the
35033
+ // `-e AGT_API_KEY=` push in `spawnSession`. 0.28.617 does not contain it;
35034
+ // 0.28.618 does, along with the flag key, `dedicatedEnabled` and the
35035
+ // `skipped-per-agent-key-mint-failed` decision so the whole reader
35036
+ // shipped together and core was not stale in that bundle.
35032
35037
  //
35033
- // BEFORE FLIPPING THIS ANYWHERE: replace with the exact first published
35034
- // agt-cli version whose `spawnSession` carries the `-e AGT_API_KEY=` push.
35035
- // The rollout runbook gates on it.
35036
- since: "0.29.0"
35038
+ // Bisected rather than inferred because the CLI auto-publishes on merge and
35039
+ // several unrelated versions landed within minutes either side; picking the
35040
+ // version whose timestamp merely looked closest would have been a guess
35041
+ // wearing a precise number, which is the failure this field invites.
35042
+ since: "0.28.618"
35037
35043
  },
35038
35044
  {
35039
35045
  key: "agent-hours-billing-enabled",
package/dist/mcp/index.js CHANGED
@@ -21317,6 +21317,9 @@ function kanbanPriorityLabel(priority) {
21317
21317
  function isHumanAssigned(item) {
21318
21318
  return item.assignee_type !== void 0 && item.assignee_type !== "agent";
21319
21319
  }
21320
+ function isBlockedOnMe(item) {
21321
+ return typeof item.blocked_agent_label === "string" && item.blocked_agent_label.length > 0;
21322
+ }
21320
21323
  function groupKanbanByStatus(items) {
21321
21324
  const groups = {};
21322
21325
  for (const item of items) {
@@ -21366,8 +21369,10 @@ function renderKanbanItemLine(item, nowMs) {
21366
21369
  }
21367
21370
  function renderKanbanList(items, nowMs = Date.now()) {
21368
21371
  if (!items.length) return "Board is empty.";
21369
- const humanAssigned = items.filter(isHumanAssigned);
21370
- const mine = items.filter((i) => !isHumanAssigned(i));
21372
+ const blockedOnMe = items.filter(isBlockedOnMe);
21373
+ const rest = items.filter((i) => !isBlockedOnMe(i));
21374
+ const humanAssigned = rest.filter(isHumanAssigned);
21375
+ const mine = rest.filter((i) => !isHumanAssigned(i));
21371
21376
  const grouped = groupKanbanByStatus(mine);
21372
21377
  const lines = [];
21373
21378
  const known = new Set(KANBAN_LIST_DISPLAY_ORDER);
@@ -21380,6 +21385,14 @@ function renderKanbanList(items, nowMs = Date.now()) {
21380
21385
  ## ${kanbanStatusLabel(status)} (${group.length})`);
21381
21386
  for (const item of group) lines.push(renderKanbanItemLine(item, nowMs));
21382
21387
  }
21388
+ if (blockedOnMe.length) {
21389
+ lines.push(`
21390
+ ## ${BLOCKED_ON_ME_SECTION_HEADING} (${blockedOnMe.length})`);
21391
+ lines.push(BLOCKED_ON_ME_SECTION_NOTE);
21392
+ for (const item of blockedOnMe) {
21393
+ lines.push(`${renderKanbanItemLine(item, nowMs)} [blocking ${item.blocked_agent_label}]`);
21394
+ }
21395
+ }
21383
21396
  if (humanAssigned.length) {
21384
21397
  lines.push(`
21385
21398
  ## ${HUMAN_ASSIGNED_SECTION_HEADING} (${humanAssigned.length})`);
@@ -21391,6 +21404,8 @@ function renderKanbanList(items, nowMs = Date.now()) {
21391
21404
  }
21392
21405
  return lines.join("\n");
21393
21406
  }
21407
+ var BLOCKED_ON_ME_SECTION_HEADING = "You are blocking these (another agent has stopped)";
21408
+ var BLOCKED_ON_ME_SECTION_NOTE = "_Another agent has PARKED its own work until you act. These are not your cards and not pullable work \u2014 you cannot move, note or complete them, and they do not count toward your in-progress load. Do the thing named, then tell the agent so it can resume; it un-parks its own card._";
21394
21409
  var HUMAN_ASSIGNED_SECTION_HEADING = "Assigned to a person (not yours to action)";
21395
21410
  var HUMAN_ASSIGNED_SECTION_NOTE = "_These belong to a person, not to you. You cannot move, note or complete them \u2014 every kanban write is refused. If the work is finished (or was never really theirs), use `kanban_recall` to pull the card back onto your board, then close it as normal._";
21396
21411
 
@@ -21399,8 +21414,15 @@ function isPersonWaitingKindMcp(kind) {
21399
21414
  if (kind === void 0 || kind === null || kind === "") return true;
21400
21415
  return kind === "human" || kind === "approval" || kind === "pr-review" || kind === "pr-merged";
21401
21416
  }
21417
+ function isAgentWaitingKindMcp(kind) {
21418
+ if (kind === void 0 || kind === null || kind === "") return true;
21419
+ return kind === "agent";
21420
+ }
21421
+ function agentWaitingKindRejection(kind) {
21422
+ return `Error: waiting_on_agent cannot be used with waiting_kind="${kind ?? "unset"}". Use waiting_kind="agent" when a teammate agent is what is blocking you, or drop waiting_on_agent.`;
21423
+ }
21402
21424
  function personWaitingKindRejection(kind) {
21403
- return `Error: waiting_on_person cannot be used with waiting_kind="${kind ?? "unset"}". A "${kind}" wait is parked on a system or is unclassified, so there is no one to notify. Name a person on a "human" decision, or on a "pr-review"/"pr-merged" wait (the reviewer or whoever has to tap merge), or drop waiting_on_person.`;
21425
+ return `Error: waiting_on_person cannot be used with waiting_kind="${kind ?? "unset"}". A "${kind}" wait is parked on a system or is unclassified, so there is no one to notify. Name a person on a "human" decision, or on a "pr-review"/"pr-merged" wait (the reviewer or whoever has to tap merge), or drop waiting_on_person. If a teammate AGENT is what is blocking you, use waiting_kind="agent" with waiting_on_agent.`;
21404
21426
  }
21405
21427
 
21406
21428
  // src/kanban-artefact-kinds.ts
@@ -22370,7 +22392,7 @@ if (AGT_AGENT_ID) {
22370
22392
  }
22371
22393
  server.tool(
22372
22394
  "kanban_list",
22373
- 'List kanban board items for this agent. Returns active items plus only the most recently completed work (last 24h). This is a NARROW, recency-windowed view \u2014 older done cards are NOT here (only done cards are windowed; failed and active cards always show). Before telling anyone you have "no record" of past work, use kanban_search, which covers your full history.',
22395
+ 'List kanban board items for this agent. Returns active items plus only the most recently completed work (last 24h). This is a NARROW, recency-windowed view \u2014 older done cards are NOT here (only done cards are windowed; failed and active cards always show). Before telling anyone you have "no record" of past work, use kanban_search, which covers your full history. The board also lists cards belonging to OTHER agents that are parked on you (a teammate has stopped until you act) in their own section \u2014 those are not yours to move and do not count toward your in-progress load; do the thing named and tell them.',
22374
22396
  {},
22375
22397
  async () => {
22376
22398
  const data = await apiPost("/host/my-kanban", {
@@ -22476,8 +22498,8 @@ server.tool(
22476
22498
  }
22477
22499
  );
22478
22500
  var kanbanMoveStatuses = AGT_KANBAN_WAITING_ENABLED ? ["backlog", "todo", "in_progress", "waiting", "done", "failed"] : ["backlog", "todo", "in_progress", "done", "failed"];
22479
- 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 person_id (uuid, from directory_lookup \u2014 preferred) or their 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).';
22480
- 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.';
22501
+ 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", "agent", "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 person_id (uuid, from directory_lookup \u2014 preferred) or their Slack user id, so the card lands in their "Awaiting you" queue and they are notified instead of your ask sitting unseen. When a teammate AGENT is what is blocking you, use waiting_kind="agent" with waiting_on_agent (its code_name) - that notifies the agent and shows the card on its board as something it is holding up. 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).';
22502
+ 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, "agent" with waiting_on_agent (a teammate agent is blocking you), 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.';
22481
22503
  server.tool(
22482
22504
  "kanban_move",
22483
22505
  kanbanMoveDescription,
@@ -22493,8 +22515,8 @@ server.tool(
22493
22515
  waiting_details: external_exports.string().optional().describe(
22494
22516
  `Only with status="waiting" on a "human"/"external"/"other" wait: the FULL context the person needs to make the decision, inline - the actual questions, the options, the specifics, any links. Put everything here so they can answer from the card alone; NEVER just point at a ticket ("see ENG-1234"). waiting_on stays the one-line headline; this is the body. Shown in full in the card's Respond panel; the card preview and chat notifications may show a truncated preview (kept within their limits).`
22495
22517
  ),
22496
- waiting_kind: external_exports.enum(["pr-review", "pr-merged", "human", "external", "other"]).optional().describe(
22497
- 'REQUIRED with status="waiting": classify what you are waiting on. "pr-review" = a pull request awaiting review, "pr-merged" = a reviewed PR awaiting merge (both require waiting_repo + waiting_pr and let the card link to the PR and auto-resume). "human" = a specific person must decide/answer, "external" = a non-PR system/process must complete (a deploy, CI, a third party); for those two put a one-line ask in waiting_on and the full decision context in waiting_details. "other" = none of the above / unsure - the generic catch-all, same waiting_on + waiting_details. Always pick the most specific kind that fits; fall back to "other" rather than leaving it unset.'
22518
+ waiting_kind: external_exports.enum(["pr-review", "pr-merged", "human", "external", "other", "agent"]).optional().describe(
22519
+ 'REQUIRED with status="waiting": classify what you are waiting on. "pr-review" = a pull request awaiting review, "pr-merged" = a reviewed PR awaiting merge (both require waiting_repo + waiting_pr and let the card link to the PR and auto-resume). "human" = a specific person must decide/answer, "external" = a non-PR system/process must complete (a deploy, CI, a third party); for those two put a one-line ask in waiting_on and the full decision context in waiting_details. "agent" = another AGENT has to act before you can continue - set waiting_on_agent to its code_name, which notifies it and puts the card on its board as something it is holding up. "other" = none of the above / unsure - the generic catch-all, same waiting_on + waiting_details. Always pick the most specific kind that fits; fall back to "other" rather than leaving it unset - but note "other" and "external" mean THERE IS NOBODY TO NOTIFY, so never use them when a person ("human") or a teammate agent ("agent") is what is actually blocking you.'
22498
22520
  ),
22499
22521
  waiting_repo: external_exports.string().optional().describe(
22500
22522
  'Only with a pr-* waiting_kind: the "owner/repo" the pull request lives in (e.g. "Integrity-Labs/augmented").'
@@ -22503,6 +22525,9 @@ server.tool(
22503
22525
  waiting_choices: external_exports.array(external_exports.string()).optional().describe(
22504
22526
  '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).'
22505
22527
  ),
22528
+ waiting_on_agent: external_exports.string().optional().describe(
22529
+ 'ENG-9051. The code_name (or uuid) of the teammate AGENT that has to act before you can continue - the same identifier kanban_assign takes as target_agent. Requires waiting_kind="agent". This notifies that agent and puts the card on its board as something it is holding up, so the blocker reaches it instead of sitting on a field. It does NOT reassign the card - you still own driving it to done and you resume as soon as they unblock you. Use this rather than "other"/"external" (which mean nobody to notify) or "human" (which takes a Slack user id and would notify the wrong entity).'
22530
+ ),
22506
22531
  waiting_on_person: external_exports.string().optional().describe(
22507
22532
  `Who has to act before you can continue - the ONE person. Two accepted forms: a person_id (uuid) as emitted by directory_lookup, which is PREFERRED because it is the id the directory actually gives you and it resolves for people with no linked Slack account; or a Slack user id (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. Valid on "human", "approval", "pr-review" and "pr-merged" waits (ENG-8291: a PR waiting on a review or a merge tap IS waiting on a person, and naming them is the whole point). Note "approval" is absent from the waiting_kind enum above deliberately and that is NOT an inconsistency: the approval broker sets that kind server-side, so you never pass it - but a card the server already parked that way still accepts this field, and rejecting the pair the server itself produces was the ENG-8291 bug. NOT valid on "external" or "other", which are parked on a system or unclassified - there is nobody to notify. Set it whenever you know who has to act; omit only if genuinely nobody specific does.`
22508
22533
  )
@@ -22521,7 +22546,7 @@ server.tool(
22521
22546
  content: [
22522
22547
  {
22523
22548
  type: "text",
22524
- text: 'Error: status="waiting" requires waiting_kind - one of "pr-review", "pr-merged", "human", "external", or "other". Pick the most specific that fits; use "other" if none do.'
22549
+ text: 'Error: status="waiting" requires waiting_kind - one of "pr-review", "pr-merged", "human", "external", "agent", or "other". Pick the most specific that fits. Use "agent" when a teammate agent is blocking you and "human" when a person is; "other" and "external" mean there is nobody to notify, so reach for them only when that is actually true.'
22525
22550
  }
22526
22551
  ],
22527
22552
  isError: true
@@ -22545,6 +22570,23 @@ server.tool(
22545
22570
  isError: true
22546
22571
  };
22547
22572
  }
22573
+ if (p.waiting_on_agent && !isAgentWaitingKindMcp(p.waiting_kind)) {
22574
+ return {
22575
+ content: [{ type: "text", text: agentWaitingKindRejection(p.waiting_kind) }],
22576
+ isError: true
22577
+ };
22578
+ }
22579
+ if (p.waiting_kind === "agent" && !p.waiting_on_agent) {
22580
+ return {
22581
+ content: [
22582
+ {
22583
+ type: "text",
22584
+ text: 'Error: waiting_kind="agent" requires waiting_on_agent - the code_name of the teammate agent that has to act. Without it the card is parked on nobody and the blocker is never told.'
22585
+ }
22586
+ ],
22587
+ isError: true
22588
+ };
22589
+ }
22548
22590
  let waitingContext;
22549
22591
  if (isPrKind) {
22550
22592
  waitingContext = { repo: p.waiting_repo, pr_number: p.waiting_pr };
@@ -22565,7 +22607,8 @@ server.tool(
22565
22607
  waiting_on: isPrKind ? void 0 : p.waiting_on,
22566
22608
  waiting_kind: p.waiting_kind,
22567
22609
  waiting_context: waitingContext,
22568
- waiting_on_person: p.waiting_on_person
22610
+ waiting_on_person: p.waiting_on_person,
22611
+ waiting_on_agent: p.waiting_on_agent
22569
22612
  }
22570
22613
  ]
22571
22614
  });
@@ -40273,7 +40273,12 @@ var AGENT_DIRECTED_NOTICE_KINDS = [
40273
40273
  // instructing the agent what not to do ("do not re-raise it yourself"). The
40274
40274
  // human needs none of it: they are the person who tapped the button, and the
40275
40275
  // card swapped under their finger to say so.
40276
- "offer_result"
40276
+ "offer_result",
40277
+ // ENG-9051. The "you are blocking another agent" notice. Its content opens
40278
+ // with a `[blocking]` machine tag and is second-person instruction to the
40279
+ // agent ("Do whatever you owe them, then tell them"). The customer has no
40280
+ // part in it - this is one agent telling another it has stopped.
40281
+ "waiting_on_agent"
40277
40282
  ];
40278
40283
  var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
40279
40284
 
@@ -40446,7 +40451,8 @@ var WAITING_KINDS = [
40446
40451
  "human",
40447
40452
  "external",
40448
40453
  "other",
40449
- "approval"
40454
+ "approval",
40455
+ "agent"
40450
40456
  ];
40451
40457
  var WAITING_KIND_SET = new Set(WAITING_KINDS);
40452
40458
 
@@ -40886,18 +40892,18 @@ var FLAG_REGISTRY = [
40886
40892
  // modal would report every recently-seen host as honoring the flip — the
40887
40893
  // dangerous direction, because it reads as "armed" when it is not.
40888
40894
  //
40889
- // PLACEHOLDER, deliberately above every published version (npm latest was
40890
- // 0.28.612 when this landed). The reader ships in whatever the auto-publish
40891
- // patch-bump produces AFTER this merges, which is not knowable here. Per the
40892
- // same reasoning recorded on the `agt-bin` flag: `since` is ADVISORY, read
40893
- // only by `computeFlagReach`; it changes what an operator is TOLD, it does
40894
- // not gate a flip. So an over-high placeholder is safe (reach under-reports,
40895
- // nobody flips), and a GUESSED number is not.
40895
+ // Resolved from the PUBLISHED artifacts, not from the merge timestamp: the
40896
+ // tarballs for 0.28.617 and 0.28.618 were unpacked and searched for the
40897
+ // `-e AGT_API_KEY=` push in `spawnSession`. 0.28.617 does not contain it;
40898
+ // 0.28.618 does, along with the flag key, `dedicatedEnabled` and the
40899
+ // `skipped-per-agent-key-mint-failed` decision so the whole reader
40900
+ // shipped together and core was not stale in that bundle.
40896
40901
  //
40897
- // BEFORE FLIPPING THIS ANYWHERE: replace with the exact first published
40898
- // agt-cli version whose `spawnSession` carries the `-e AGT_API_KEY=` push.
40899
- // The rollout runbook gates on it.
40900
- since: "0.29.0"
40902
+ // Bisected rather than inferred because the CLI auto-publishes on merge and
40903
+ // several unrelated versions landed within minutes either side; picking the
40904
+ // version whose timestamp merely looked closest would have been a guess
40905
+ // wearing a precise number, which is the failure this field invites.
40906
+ since: "0.28.618"
40901
40907
  },
40902
40908
  {
40903
40909
  key: "agent-hours-billing-enabled",
@@ -34333,7 +34333,12 @@ var AGENT_DIRECTED_NOTICE_KINDS = [
34333
34333
  // instructing the agent what not to do ("do not re-raise it yourself"). The
34334
34334
  // human needs none of it: they are the person who tapped the button, and the
34335
34335
  // card swapped under their finger to say so.
34336
- "offer_result"
34336
+ "offer_result",
34337
+ // ENG-9051. The "you are blocking another agent" notice. Its content opens
34338
+ // with a `[blocking]` machine tag and is second-person instruction to the
34339
+ // agent ("Do whatever you owe them, then tell them"). The customer has no
34340
+ // part in it - this is one agent telling another it has stopped.
34341
+ "waiting_on_agent"
34337
34342
  ];
34338
34343
  var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
34339
34344
 
@@ -34920,7 +34925,8 @@ var WAITING_KINDS = [
34920
34925
  "human",
34921
34926
  "external",
34922
34927
  "other",
34923
- "approval"
34928
+ "approval",
34929
+ "agent"
34924
34930
  ];
34925
34931
  var WAITING_KIND_SET = new Set(WAITING_KINDS);
34926
34932
 
@@ -35363,18 +35369,18 @@ var FLAG_REGISTRY = [
35363
35369
  // modal would report every recently-seen host as honoring the flip — the
35364
35370
  // dangerous direction, because it reads as "armed" when it is not.
35365
35371
  //
35366
- // PLACEHOLDER, deliberately above every published version (npm latest was
35367
- // 0.28.612 when this landed). The reader ships in whatever the auto-publish
35368
- // patch-bump produces AFTER this merges, which is not knowable here. Per the
35369
- // same reasoning recorded on the `agt-bin` flag: `since` is ADVISORY, read
35370
- // only by `computeFlagReach`; it changes what an operator is TOLD, it does
35371
- // not gate a flip. So an over-high placeholder is safe (reach under-reports,
35372
- // nobody flips), and a GUESSED number is not.
35372
+ // Resolved from the PUBLISHED artifacts, not from the merge timestamp: the
35373
+ // tarballs for 0.28.617 and 0.28.618 were unpacked and searched for the
35374
+ // `-e AGT_API_KEY=` push in `spawnSession`. 0.28.617 does not contain it;
35375
+ // 0.28.618 does, along with the flag key, `dedicatedEnabled` and the
35376
+ // `skipped-per-agent-key-mint-failed` decision so the whole reader
35377
+ // shipped together and core was not stale in that bundle.
35373
35378
  //
35374
- // BEFORE FLIPPING THIS ANYWHERE: replace with the exact first published
35375
- // agt-cli version whose `spawnSession` carries the `-e AGT_API_KEY=` push.
35376
- // The rollout runbook gates on it.
35377
- since: "0.29.0"
35379
+ // Bisected rather than inferred because the CLI auto-publishes on merge and
35380
+ // several unrelated versions landed within minutes either side; picking the
35381
+ // version whose timestamp merely looked closest would have been a guess
35382
+ // wearing a precise number, which is the failure this field invites.
35383
+ since: "0.28.618"
35378
35384
  },
35379
35385
  {
35380
35386
  key: "agent-hours-billing-enabled",
@@ -34483,7 +34483,12 @@ var AGENT_DIRECTED_NOTICE_KINDS = [
34483
34483
  // instructing the agent what not to do ("do not re-raise it yourself"). The
34484
34484
  // human needs none of it: they are the person who tapped the button, and the
34485
34485
  // card swapped under their finger to say so.
34486
- "offer_result"
34486
+ "offer_result",
34487
+ // ENG-9051. The "you are blocking another agent" notice. Its content opens
34488
+ // with a `[blocking]` machine tag and is second-person instruction to the
34489
+ // agent ("Do whatever you owe them, then tell them"). The customer has no
34490
+ // part in it - this is one agent telling another it has stopped.
34491
+ "waiting_on_agent"
34487
34492
  ];
34488
34493
  var AGENT_DIRECTED_KIND_SET = new Set(AGENT_DIRECTED_NOTICE_KINDS);
34489
34494
 
@@ -35070,7 +35075,8 @@ var WAITING_KINDS = [
35070
35075
  "human",
35071
35076
  "external",
35072
35077
  "other",
35073
- "approval"
35078
+ "approval",
35079
+ "agent"
35074
35080
  ];
35075
35081
  var WAITING_KIND_SET = new Set(WAITING_KINDS);
35076
35082
 
@@ -35513,18 +35519,18 @@ var FLAG_REGISTRY = [
35513
35519
  // modal would report every recently-seen host as honoring the flip — the
35514
35520
  // dangerous direction, because it reads as "armed" when it is not.
35515
35521
  //
35516
- // PLACEHOLDER, deliberately above every published version (npm latest was
35517
- // 0.28.612 when this landed). The reader ships in whatever the auto-publish
35518
- // patch-bump produces AFTER this merges, which is not knowable here. Per the
35519
- // same reasoning recorded on the `agt-bin` flag: `since` is ADVISORY, read
35520
- // only by `computeFlagReach`; it changes what an operator is TOLD, it does
35521
- // not gate a flip. So an over-high placeholder is safe (reach under-reports,
35522
- // nobody flips), and a GUESSED number is not.
35522
+ // Resolved from the PUBLISHED artifacts, not from the merge timestamp: the
35523
+ // tarballs for 0.28.617 and 0.28.618 were unpacked and searched for the
35524
+ // `-e AGT_API_KEY=` push in `spawnSession`. 0.28.617 does not contain it;
35525
+ // 0.28.618 does, along with the flag key, `dedicatedEnabled` and the
35526
+ // `skipped-per-agent-key-mint-failed` decision so the whole reader
35527
+ // shipped together and core was not stale in that bundle.
35523
35528
  //
35524
- // BEFORE FLIPPING THIS ANYWHERE: replace with the exact first published
35525
- // agt-cli version whose `spawnSession` carries the `-e AGT_API_KEY=` push.
35526
- // The rollout runbook gates on it.
35527
- since: "0.29.0"
35529
+ // Bisected rather than inferred because the CLI auto-publishes on merge and
35530
+ // several unrelated versions landed within minutes either side; picking the
35531
+ // version whose timestamp merely looked closest would have been a guess
35532
+ // wearing a precise number, which is the failure this field invites.
35533
+ since: "0.28.618"
35528
35534
  },
35529
35535
  {
35530
35536
  key: "agent-hours-billing-enabled",
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-RXC3MTSN.js";
47
- import "./chunk-P6KFZVKA.js";
46
+ } from "./chunk-QSPSXG4K.js";
47
+ import "./chunk-EDH4GZIW.js";
48
48
  import "./chunk-XWVM4KPK.js";
49
49
  export {
50
50
  EGRESS_BASELINE_DOMAINS,
@@ -92,4 +92,4 @@ export {
92
92
  writeEgressAllowlist,
93
93
  writePersistentClaudeWrapper
94
94
  };
95
- //# sourceMappingURL=persistent-session-AGPLISL3.js.map
95
+ //# sourceMappingURL=persistent-session-IFZS5AXT.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-RXC3MTSN.js";
4
- import "./chunk-P6KFZVKA.js";
3
+ } from "./chunk-QSPSXG4K.js";
4
+ import "./chunk-EDH4GZIW.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -710,4 +710,4 @@ export {
710
710
  readAndResetSlackReplyBindingClassifications,
711
711
  readAndResetSlackReplyTargetClassifications
712
712
  };
713
- //# sourceMappingURL=responsiveness-probe-ITYPPSHM.js.map
713
+ //# sourceMappingURL=responsiveness-probe-76U4MR6U.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-P6KFZVKA.js";
3
+ } from "./chunk-EDH4GZIW.js";
4
4
 
5
5
  // src/lib/session-auth-dead.ts
6
6
  import { closeSync, openSync, readSync, readdirSync, statSync } from "fs";
@@ -203,4 +203,4 @@ export {
203
203
  decideSessionAuthState,
204
204
  probeSessionAuth
205
205
  };
206
- //# sourceMappingURL=session-auth-dead-Y6ABNWNM.js.map
206
+ //# sourceMappingURL=session-auth-dead-RLQK5ZQV.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.620",
3
+ "version": "0.28.621",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {