@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.
@@ -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-XYM2DWZU.js");
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-CGUFXCYJ.js.map
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-2ZZ4SWAY.js";
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-X4FOPVGZ.js";
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, 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.
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.231" : "dev";
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-XYM2DWZU.js");
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-MUPAYTJF.js");
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-MUPAYTJF.js");
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-XYM2DWZU.js");
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
- team: teamSettingsForHash,
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-XYM2DWZU.js");
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-CGUFXCYJ.js");
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));