@integrity-labs/agt-cli 0.28.147 → 0.28.149

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.
@@ -3,7 +3,7 @@ import {
3
3
  formatMissingVar,
4
4
  isClaudeFastMode,
5
5
  probeMcpEnvSubstitution
6
- } from "./chunk-POW4BZEC.js";
6
+ } from "./chunk-5AIF4FOP.js";
7
7
  import {
8
8
  reapOrphanChannelMcps
9
9
  } from "./chunk-XWVM4KPK.js";
@@ -1590,4 +1590,4 @@ export {
1590
1590
  stopAllSessionsAndWait,
1591
1591
  getProjectDir
1592
1592
  };
1593
- //# sourceMappingURL=chunk-H7DPP33E.js.map
1593
+ //# sourceMappingURL=chunk-SVF454L3.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-ERNRO4J6.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-IMMJEVRD.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-E32P2WMR.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-OU4ROYH4.js.map
@@ -28,7 +28,7 @@ import {
28
28
  requireHost,
29
29
  safeWriteJsonAtomic,
30
30
  setConfigHash
31
- } from "../chunk-FAWY7H7Q.js";
31
+ } from "../chunk-A4S52T2C.js";
32
32
  import {
33
33
  getProjectDir as getProjectDir2,
34
34
  getReadyTasks,
@@ -72,7 +72,7 @@ import {
72
72
  takeZombieDetection,
73
73
  transcriptActivityAgeSeconds,
74
74
  writeEgressAllowlist
75
- } from "../chunk-H7DPP33E.js";
75
+ } from "../chunk-SVF454L3.js";
76
76
  import {
77
77
  FLAGS_SCHEMA_VERSION,
78
78
  FLAG_REGISTRY,
@@ -98,6 +98,7 @@ import {
98
98
  isResolveError,
99
99
  isSelfCompletion,
100
100
  isUnsetTimezone,
101
+ isVacuousDeliverReason,
101
102
  laneTagFragment,
102
103
  parseDeliverAssertion,
103
104
  parseDeliveryTarget,
@@ -111,7 +112,7 @@ import {
111
112
  resolveDmTarget,
112
113
  sumTranscriptUsageInWindow,
113
114
  wrapScheduledTaskPrompt
114
- } from "../chunk-POW4BZEC.js";
115
+ } from "../chunk-5AIF4FOP.js";
115
116
  import {
116
117
  parsePsRows,
117
118
  reapOrphanChannelMcps
@@ -5145,9 +5146,10 @@ async function deliverScheduledCardResult(codeName, agentId, cardId, completedBy
5145
5146
  return "terminal";
5146
5147
  }
5147
5148
  const deliveryPolicy = task.deliveryPolicy ?? "always";
5148
- if (deliveryPolicy === "never" || deliveryPolicy === "conditional" && card.suppress_delivery !== false) {
5149
+ const vacuousAssertion = deliveryPolicy === "conditional" && card.suppress_delivery === false && card.delivery_reason !== void 0 && isVacuousDeliverReason(card.delivery_reason);
5150
+ if (deliveryPolicy === "never" || deliveryPolicy === "conditional" && card.suppress_delivery !== false || vacuousAssertion) {
5149
5151
  log(
5150
- `[scheduled-kanban] Suppressed by delivery_policy=${deliveryPolicy} for card ${cardId} (task '${task.name}') on '${codeName}' \u2014 result recorded on the card only (tombstone)`
5152
+ `[scheduled-kanban] Suppressed by delivery_policy=${deliveryPolicy}` + (vacuousAssertion ? " (asserted delivery but reason was vacuous/empty)" : "") + ` for card ${cardId} (task '${task.name}') on '${codeName}' - result recorded on the card only (tombstone)`
5151
5153
  );
5152
5154
  if (task.deliveryMode === "announce" && task.deliveryTo) {
5153
5155
  await reportDeliveryStatus(agentId, task.taskId, {
@@ -5237,7 +5239,7 @@ async function routeScheduledTaskViaKanban(codeName, agentId, task, prompt) {
5237
5239
  if (run_id) void finishRun(run_id, "failed", { outcomeMessage: "kanban materialise incomplete", completeKanbanItemId: kanban_item_id });
5238
5240
  return false;
5239
5241
  }
5240
- 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 \u2014 that explicit assert is the ONLY way this result reaches the user.
5242
+ 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.
5241
5243
  ` : `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.
5242
5244
  `;
5243
5245
  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, 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.
@@ -7122,7 +7124,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
7122
7124
  var lastVersionCheckAt = 0;
7123
7125
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
7124
7126
  var lastResponsivenessProbeAt = 0;
7125
- var agtCliVersion = true ? "0.28.147" : "dev";
7127
+ var agtCliVersion = true ? "0.28.149" : "dev";
7126
7128
  function resolveBrewPath(execFileSync4) {
7127
7129
  try {
7128
7130
  const out = execFileSync4("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -8255,7 +8257,7 @@ async function pollCycle() {
8255
8257
  }
8256
8258
  try {
8257
8259
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
8258
- const { collectDiagnostics } = await import("../persistent-session-ERNRO4J6.js");
8260
+ const { collectDiagnostics } = await import("../persistent-session-IMMJEVRD.js");
8259
8261
  const diagCodeNames = [...agentState.persistentSessionAgents];
8260
8262
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
8261
8263
  let tailscaleHostname;
@@ -8403,7 +8405,7 @@ async function pollCycle() {
8403
8405
  const {
8404
8406
  collectResponsivenessProbes,
8405
8407
  getResponsivenessIntervalMs
8406
- } = await import("../responsiveness-probe-BLJS46ME.js");
8408
+ } = await import("../responsiveness-probe-Z2GD24QE.js");
8407
8409
  const probeIntervalMs = getResponsivenessIntervalMs();
8408
8410
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
8409
8411
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -8435,7 +8437,7 @@ async function pollCycle() {
8435
8437
  collectResponsivenessProbes,
8436
8438
  livePendingInboundOldestAgeSeconds,
8437
8439
  parkPendingInbound
8438
- } = await import("../responsiveness-probe-BLJS46ME.js");
8440
+ } = await import("../responsiveness-probe-Z2GD24QE.js");
8439
8441
  const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
8440
8442
  const wedgeNow = /* @__PURE__ */ new Date();
8441
8443
  const liveAgents = agentState.persistentSessionAgents;
@@ -12028,7 +12030,7 @@ async function processClaudePairSessions(agents) {
12028
12030
  killPairSession,
12029
12031
  pairTmuxSession,
12030
12032
  finalizeClaudePairOnboarding
12031
- } = await import("../claude-pair-runtime-E32P2WMR.js");
12033
+ } = await import("../claude-pair-runtime-OU4ROYH4.js");
12032
12034
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
12033
12035
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
12034
12036
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -12843,6 +12845,10 @@ function deployMcpAssets() {
12843
12845
  // ENG-6019
12844
12846
  "whatsapp-channel.js",
12845
12847
  // ENG-6812
12848
+ // ENG-6827: the one-time WhatsApp/Baileys QR-link tool. Deployed so an
12849
+ // operator can run it on the host, but NOT in RESTARTABLE_CHANNEL_FILES —
12850
+ // it's an interactive tool, not a per-session channel server.
12851
+ "whatsapp-link.js",
12846
12852
  // ENG-6195: the staff-only admin-debug broker, bundled with the CLI (never
12847
12853
  // published to npm). NOT in RESTARTABLE_CHANNEL_FILES — it's not a channel,
12848
12854
  // so it doesn't drive the channel-restart path; the mcp-presence-reaper