@integrity-labs/agt-cli 0.27.105 → 0.27.107

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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  claudeModelAlias,
3
3
  isClaudeFastMode
4
- } from "./chunk-S5RULZFY.js";
4
+ } from "./chunk-BP4D3ZPJ.js";
5
5
  import {
6
6
  reapOrphanChannelMcps
7
7
  } from "./chunk-XWVM4KPK.js";
@@ -1574,4 +1574,4 @@ export {
1574
1574
  stopAllSessionsAndWait,
1575
1575
  getProjectDir
1576
1576
  };
1577
- //# sourceMappingURL=chunk-VCDQUERH.js.map
1577
+ //# sourceMappingURL=chunk-DFQ2EOHB.js.map
@@ -9,7 +9,7 @@ import {
9
9
  parseDeliveryTarget,
10
10
  registerFramework,
11
11
  wrapScheduledTaskPrompt
12
- } from "./chunk-S5RULZFY.js";
12
+ } from "./chunk-BP4D3ZPJ.js";
13
13
 
14
14
  // ../../packages/core/dist/integrations/registry.js
15
15
  var INTEGRATION_REGISTRY = [
@@ -7586,4 +7586,4 @@ export {
7586
7586
  managerInstallSystemUnitCommand,
7587
7587
  managerUninstallSystemUnitCommand
7588
7588
  };
7589
- //# sourceMappingURL=chunk-ZFJTCUVZ.js.map
7589
+ //# sourceMappingURL=chunk-KBN7SNAV.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-HGJ6THYI.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-HGR5D4DJ.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-EGHRQJRW.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-AI37D2CT.js.map
@@ -17,7 +17,7 @@ import {
17
17
  provisionStopHook,
18
18
  requireHost,
19
19
  safeWriteJsonAtomic
20
- } from "../chunk-ZFJTCUVZ.js";
20
+ } from "../chunk-KBN7SNAV.js";
21
21
  import {
22
22
  getProjectDir as getProjectDir2,
23
23
  getReadyTasks,
@@ -55,7 +55,7 @@ import {
55
55
  stopPersistentSession,
56
56
  takeWatchdogGiveUpCount,
57
57
  takeZombieDetection
58
- } from "../chunk-VCDQUERH.js";
58
+ } from "../chunk-DFQ2EOHB.js";
59
59
  import {
60
60
  KANBAN_CHECK_COMMAND,
61
61
  SUPPRESS_SENTINEL,
@@ -79,7 +79,7 @@ import {
79
79
  resolveConnectivityProbe,
80
80
  resolveDmTarget,
81
81
  wrapScheduledTaskPrompt
82
- } from "../chunk-S5RULZFY.js";
82
+ } from "../chunk-BP4D3ZPJ.js";
83
83
  import {
84
84
  parsePsRows,
85
85
  reapOrphanChannelMcps
@@ -4039,7 +4039,7 @@ var cachedMaintenanceWindow = null;
4039
4039
  var lastVersionCheckAt = 0;
4040
4040
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
4041
4041
  var lastResponsivenessProbeAt = 0;
4042
- var agtCliVersion = true ? "0.27.105" : "dev";
4042
+ var agtCliVersion = true ? "0.27.107" : "dev";
4043
4043
  function resolveBrewPath(execFileSync4) {
4044
4044
  try {
4045
4045
  const out = execFileSync4("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -5232,7 +5232,7 @@ async function pollCycle() {
5232
5232
  }
5233
5233
  try {
5234
5234
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
5235
- const { collectDiagnostics } = await import("../persistent-session-HGJ6THYI.js");
5235
+ const { collectDiagnostics } = await import("../persistent-session-HGR5D4DJ.js");
5236
5236
  const diagCodeNames = [...agentState.persistentSessionAgents];
5237
5237
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
5238
5238
  let tailscaleHostname;
@@ -5319,12 +5319,12 @@ async function pollCycle() {
5319
5319
  const {
5320
5320
  collectResponsivenessProbes,
5321
5321
  getResponsivenessIntervalMs
5322
- } = await import("../responsiveness-probe-HH5V6RUN.js");
5322
+ } = await import("../responsiveness-probe-FS376EVY.js");
5323
5323
  const probeIntervalMs = getResponsivenessIntervalMs();
5324
5324
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
5325
5325
  const probeCodeNames = [...agentState.persistentSessionAgents];
5326
5326
  if (probeCodeNames.length > 0) {
5327
- const { takeAcpxExecFailureCount, creditAcpxExecFailureCount } = await import("../persistent-session-HGJ6THYI.js");
5327
+ const { takeAcpxExecFailureCount, creditAcpxExecFailureCount } = await import("../persistent-session-HGR5D4DJ.js");
5328
5328
  const drainedGiveUps = /* @__PURE__ */ new Map();
5329
5329
  const drainedAcpxFailures = /* @__PURE__ */ new Map();
5330
5330
  const probes = collectResponsivenessProbes(probeCodeNames).map((p) => {
@@ -7645,6 +7645,17 @@ async function deliverScheduledCardResult(codeName, agentId, cardId) {
7645
7645
  markScheduledCardDeliveryComplete(cardId);
7646
7646
  return "terminal";
7647
7647
  }
7648
+ if (card.suppress_delivery === true) {
7649
+ log(`[scheduled-kanban] Suppressing delivery (structured flag) for card ${cardId} (task '${task.name}') on '${codeName}' \u2014 result recorded on the card only`);
7650
+ if (task.deliveryMode === "announce" && task.deliveryTo) {
7651
+ await reportDeliveryStatus(agentId, task.taskId, {
7652
+ status: "skipped",
7653
+ error_code: "NO_CONTENT"
7654
+ });
7655
+ }
7656
+ markScheduledCardDeliveryComplete(cardId);
7657
+ return "delivered";
7658
+ }
7648
7659
  await processClaudeTaskResult(codeName, agentId, task.templateId, card.result ?? "", {
7649
7660
  mode: task.deliveryMode,
7650
7661
  channel: task.deliveryChannel,
@@ -7674,6 +7685,12 @@ async function reconcileScheduledRuns(codeName, agentId, board) {
7674
7685
  }
7675
7686
  if (m.size === 0) scheduledRunsByCode.delete(codeName);
7676
7687
  }
7688
+ var SCHEDULED_CARD_DELIVERY_CONTRACT = `
7689
+
7690
+ ---
7691
+ [delivery contract \u2014 system]
7692
+ 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.
7693
+ 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.`;
7677
7694
  async function routeScheduledTaskViaKanban(codeName, agentId, task, prompt) {
7678
7695
  const { run_id, kanban_item_id } = await startRun({
7679
7696
  agent_id: agentId,
@@ -7682,7 +7699,7 @@ async function routeScheduledTaskViaKanban(codeName, agentId, task, prompt) {
7682
7699
  metadata: { template_id: task.templateId, name: task.name, via: "kanban-inject" },
7683
7700
  materialize_kanban: {
7684
7701
  title: task.name,
7685
- description: prompt,
7702
+ description: prompt + SCHEDULED_CARD_DELIVERY_CONTRACT,
7686
7703
  priority: 2,
7687
7704
  initial_status: "todo",
7688
7705
  ...deriveScheduledTaskNotify(task)
@@ -7693,8 +7710,8 @@ async function routeScheduledTaskViaKanban(codeName, agentId, task, prompt) {
7693
7710
  if (run_id) void finishRun(run_id, "failed", { outcomeMessage: "kanban materialise incomplete", completeKanbanItemId: kanban_item_id });
7694
7711
  return false;
7695
7712
  }
7696
- 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 recording it on the card is enough; delivery to the recipient is handled for you.
7697
- 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, write exactly \`${SUPPRESS_SENTINEL}\` ALONE as the card result (no other text, no "nothing urgent", no notes) and mark the card done \u2014 that tells the delivery pipeline to skip the send. A report with zero items ("nothing urgent", "no follow-ups", "all quiet") is still a valid deliverable when the task asks for a digest, NOT a reason to suppress \u2014 when in doubt, deliver.
7713
+ 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.
7714
+ 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.
7698
7715
  ` + formatRunMarker(run_id);
7699
7716
  let injectStatus;
7700
7717
  try {
@@ -9662,7 +9679,7 @@ async function processClaudePairSessions(agents) {
9662
9679
  killPairSession,
9663
9680
  pairTmuxSession,
9664
9681
  finalizeClaudePairOnboarding
9665
- } = await import("../claude-pair-runtime-EGHRQJRW.js");
9682
+ } = await import("../claude-pair-runtime-AI37D2CT.js");
9666
9683
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
9667
9684
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
9668
9685
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -10539,6 +10556,7 @@ process.on("disconnect", () => {
10539
10556
  });
10540
10557
  export {
10541
10558
  ChildProcessError,
10559
+ SCHEDULED_CARD_DELIVERY_CONTRACT,
10542
10560
  __resetScheduledDeliveryDedupeForTest,
10543
10561
  __setAgentChannelTokensForTest,
10544
10562
  applyRestartAcks,