@integrity-labs/agt-cli 0.28.806 → 0.28.807

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-GPVAPK4S.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-LEICQMWY.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-YEW7Y5N2.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-XZLX2PEL.js.map
@@ -58,7 +58,7 @@ import {
58
58
  safeWriteJsonAtomic,
59
59
  setConfigHash,
60
60
  tripClass
61
- } from "../chunk-7TIQODEK.js";
61
+ } from "../chunk-SHQCTBFE.js";
62
62
  import {
63
63
  getProjectDir as getProjectDir2,
64
64
  getReadyTasks,
@@ -123,7 +123,7 @@ import {
123
123
  takeZombieDetection,
124
124
  toOpencodeModel,
125
125
  writeEgressAllowlist
126
- } from "../chunk-TWZFTSGP.js";
126
+ } from "../chunk-GIV6ORI3.js";
127
127
  import {
128
128
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
129
129
  AnchorSessionClient,
@@ -215,7 +215,7 @@ import {
215
215
  subagentActivityAgeSeconds,
216
216
  sumTranscriptUsageInWindow,
217
217
  transcriptActivityAgeSeconds
218
- } from "../chunk-RMBASAMS.js";
218
+ } from "../chunk-VK35F6O7.js";
219
219
  import {
220
220
  reapOrphanChannelMcps
221
221
  } from "../chunk-XWVM4KPK.js";
@@ -12918,7 +12918,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
12918
12918
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
12919
12919
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
12920
12920
  async function channelInboundActivityAgeSecondsFor(codeName) {
12921
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-7FEKDJZW.js");
12921
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-WEXP254C.js");
12922
12922
  const newest = newestPendingInboundActivityMtimeMs(dirname10(paneLogPath(codeName)));
12923
12923
  if (newest === null) return null;
12924
12924
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -13578,7 +13578,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13578
13578
  var lastVersionCheckAt = 0;
13579
13579
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13580
13580
  var lastResponsivenessProbeAt = 0;
13581
- var agtCliVersion = true ? "0.28.806" : "dev";
13581
+ var agtCliVersion = true ? "0.28.807" : "dev";
13582
13582
  function resolveBrewPath(execFileSync2) {
13583
13583
  try {
13584
13584
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15125,7 +15125,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15125
15125
  if (codeNames.length === 0) return;
15126
15126
  void (async () => {
15127
15127
  try {
15128
- const { collectDiagnostics } = await import("../persistent-session-GPVAPK4S.js");
15128
+ const { collectDiagnostics } = await import("../persistent-session-LEICQMWY.js");
15129
15129
  await api.post("/host/heartbeat", {
15130
15130
  host_id: hostId,
15131
15131
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15266,7 +15266,7 @@ async function pollCycleInner() {
15266
15266
  }
15267
15267
  try {
15268
15268
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
15269
- const { collectDiagnostics } = await import("../persistent-session-GPVAPK4S.js");
15269
+ const { collectDiagnostics } = await import("../persistent-session-LEICQMWY.js");
15270
15270
  const diagCodeNames = [...agentState.persistentSessionAgents];
15271
15271
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15272
15272
  let tailscaleHostname;
@@ -15435,7 +15435,7 @@ async function pollCycleInner() {
15435
15435
  collectPanelessActivityProbes,
15436
15436
  getResponsivenessIntervalMs,
15437
15437
  occupancyQualificationClassifications
15438
- } = await import("../responsiveness-probe-7FEKDJZW.js");
15438
+ } = await import("../responsiveness-probe-WEXP254C.js");
15439
15439
  const probeIntervalMs = getResponsivenessIntervalMs();
15440
15440
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15441
15441
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -15552,7 +15552,7 @@ async function pollCycleInner() {
15552
15552
  collectResponsivenessProbes,
15553
15553
  livePendingInboundOldestAgeSeconds,
15554
15554
  parkPendingInbound
15555
- } = await import("../responsiveness-probe-7FEKDJZW.js");
15555
+ } = await import("../responsiveness-probe-WEXP254C.js");
15556
15556
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
15557
15557
  const wedgeNow = /* @__PURE__ */ new Date();
15558
15558
  const liveAgents = agentState.persistentSessionAgents;
@@ -15708,7 +15708,7 @@ async function pollCycleInner() {
15708
15708
  }
15709
15709
  try {
15710
15710
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
15711
- const { probeSessionAuth } = await import("../session-auth-dead-ZBMVGQYW.js");
15711
+ const { probeSessionAuth } = await import("../session-auth-dead-AROKHZET.js");
15712
15712
  const observations = [];
15713
15713
  const pendingCacheCommits = [];
15714
15714
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -19868,7 +19868,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
19868
19868
  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}`));
19869
19869
  void (async () => {
19870
19870
  try {
19871
- const { collectDiagnostics } = await import("../persistent-session-GPVAPK4S.js");
19871
+ const { collectDiagnostics } = await import("../persistent-session-LEICQMWY.js");
19872
19872
  await api.post("/host/heartbeat", {
19873
19873
  host_id: hostId,
19874
19874
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -19914,7 +19914,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
19914
19914
  }
19915
19915
  try {
19916
19916
  const hostId = await getHostId();
19917
- const { collectDiagnostics } = await import("../persistent-session-GPVAPK4S.js");
19917
+ const { collectDiagnostics } = await import("../persistent-session-LEICQMWY.js");
19918
19918
  await api.post("/host/heartbeat", {
19919
19919
  host_id: hostId,
19920
19920
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20550,7 +20550,7 @@ async function processClaudePairSessions(agents) {
20550
20550
  killPairSession,
20551
20551
  pairTmuxSession,
20552
20552
  finalizeClaudePairOnboarding
20553
- } = await import("../claude-pair-runtime-YEW7Y5N2.js");
20553
+ } = await import("../claude-pair-runtime-XZLX2PEL.js");
20554
20554
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
20555
20555
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
20556
20556
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -37279,6 +37279,26 @@ var FLAG_REGISTRY = [
37279
37279
  // env var is retired.
37280
37280
  envVar: "AUGMENTED_CONNECTIVITY_ESCALATION_ENABLED"
37281
37281
  },
37282
+ {
37283
+ key: "slack-manifest-remediate",
37284
+ description: "Let the Slack manifest drift monitor PUSH, not just alert (ENG-9963). updateSlackManifest had exactly one caller \u2014 a console button \u2014 so nothing but a human click ever pushed a manifest; ENG-7762 changed the generator with no rollout mechanism and 26 agents went 53 days with no working per-agent slash commands. When on, the daily drift cron pushes the generated manifest for a drifted agent. When off it alerts exactly as before. NOTE what arming this authorises: a push REPLACES a customer-owned Slack app's entire manifest, so the cron only ever pushes drift whose diffs are purely additive (isSafelyRemediable) \u2014 an app with live-only entries a push would destroy is declined and left for a human. Boolean gate; ships dark.",
37285
+ flagType: "boolean",
37286
+ // Declared safe value is `false` (alert-only), matching the cron's compiled
37287
+ // default. The fail-safe direction is the opposite of a paging gate's and
37288
+ // matters more: a flag-DB read error must never authorise a WRITE to a
37289
+ // customer's Slack app.
37290
+ defaultValue: false,
37291
+ // Operator override, same precedence and vocabulary as the connectivity
37292
+ // escalation gate above, so an operator who knows one knows both.
37293
+ envVar: "AUGMENTED_SLACK_MANIFEST_REMEDIATE_ENABLED",
37294
+ // ADR-0022 §4. NOTE this is where it diverges from the connectivity gate it
37295
+ // otherwise mirrors, and the divergence is the point: arming THAT one only
37296
+ // causes alerts to open, while arming THIS one authorises a cron to REPLACE
37297
+ // manifests on customer-owned Slack apps. That is precisely the class the
37298
+ // sensitive marker exists for — a control whose relaxation should not be one
37299
+ // unguarded write away.
37300
+ sensitive: true
37301
+ },
37282
37302
  {
37283
37303
  key: "integration-reauth-reminders",
37284
37304
  description: "Re-notify an integration that stays in needs_reauth (ENG-8370). Failure notification is at-most-once PER TRANSITION, so an integration nobody repairs is announced once and then silent forever - prod carried a row failing every 30-minute tick for ~21 days on a single day-one notification. When on, the IntegrationReauthReminder cron re-fires the existing reconnect notification on a backoff measured from failure ONSET (+1d, +3d, +7d, then weekly), skipping rows an operator has muted. When off the cron still scans and logs what it WOULD have sent, so the volume can be sized before anyone is messaged. Boolean gate; ships dark.",
package/dist/mcp/index.js CHANGED
@@ -37099,7 +37099,7 @@ function renderKanbanList(items, nowMs = Date.now()) {
37099
37099
  return lines.join("\n");
37100
37100
  }
37101
37101
  var BLOCKED_ON_ME_SECTION_HEADING = "You are blocking these (another agent has stopped)";
37102
- 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._";
37102
+ 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 answer with `kanban_respond` (card_id + your answer) \u2014 that delivers it ON the parked card and un-parks it. Do NOT open a second card to carry the answer._";
37103
37103
  var HUMAN_ASSIGNED_SECTION_HEADING = "Assigned to a person (not yours to action)";
37104
37104
  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._";
37105
37105
 
@@ -37824,6 +37824,27 @@ function formatKanbanLogResult(label, data, match = {}) {
37824
37824
  };
37825
37825
  }
37826
37826
 
37827
+ // src/kanban-respond-outcome.ts
37828
+ function describeKanbanRespondOutcome(data) {
37829
+ if (data.ok && data.delivered !== false) {
37830
+ return "Answer delivered. Their card is un-parked and back on their board \u2014 they will pick it up from here, so it is off your plate.";
37831
+ }
37832
+ if (data.reason === "recorded_undelivered" || data.ok && data.delivered === false) {
37833
+ return "Your answer was recorded and the card un-parked, but delivery to that agent could not be confirmed \u2014 tell them directly as well so it is not lost.";
37834
+ }
37835
+ const refusal = REFUSAL_MESSAGES[data.reason ?? ""];
37836
+ if (refusal) return refusal(data);
37837
+ return data.error ?? "Could not send your answer.";
37838
+ }
37839
+ var REFUSAL_MESSAGES = {
37840
+ not_found: () => 'No card is parked on you with that id. Re-read kanban_list \u2014 only cards under "You are blocking these" can be answered here, and the id must be copied exactly.',
37841
+ self_block: () => "That card is parked on YOU by you \u2014 a self-block, almost always a mistyped code_name when it was parked. Fix it on your own card rather than answering it.",
37842
+ already_responded: () => "Someone already answered that card, so it has resumed. Nothing more to do.",
37843
+ not_actionable: (d) => `That card is no longer parked (status: ${d.status ?? "unknown"}), so there is nothing to un-park. The agent has moved on.`,
37844
+ recorded_not_unparked: () => "Your answer was recorded but the card could not be un-parked, so the agent is still blocked \u2014 tell them directly and check the card."
37845
+ };
37846
+ var HANDLED_REFUSAL_REASONS = Object.keys(REFUSAL_MESSAGES).sort();
37847
+
37827
37848
  // src/kanban-update.ts
37828
37849
  function buildKanbanUpdateItem(id, fields) {
37829
37850
  const item = { id };
@@ -44363,6 +44384,26 @@ var FLAG_REGISTRY = [
44363
44384
  // env var is retired.
44364
44385
  envVar: "AUGMENTED_CONNECTIVITY_ESCALATION_ENABLED"
44365
44386
  },
44387
+ {
44388
+ key: "slack-manifest-remediate",
44389
+ description: "Let the Slack manifest drift monitor PUSH, not just alert (ENG-9963). updateSlackManifest had exactly one caller \u2014 a console button \u2014 so nothing but a human click ever pushed a manifest; ENG-7762 changed the generator with no rollout mechanism and 26 agents went 53 days with no working per-agent slash commands. When on, the daily drift cron pushes the generated manifest for a drifted agent. When off it alerts exactly as before. NOTE what arming this authorises: a push REPLACES a customer-owned Slack app's entire manifest, so the cron only ever pushes drift whose diffs are purely additive (isSafelyRemediable) \u2014 an app with live-only entries a push would destroy is declined and left for a human. Boolean gate; ships dark.",
44390
+ flagType: "boolean",
44391
+ // Declared safe value is `false` (alert-only), matching the cron's compiled
44392
+ // default. The fail-safe direction is the opposite of a paging gate's and
44393
+ // matters more: a flag-DB read error must never authorise a WRITE to a
44394
+ // customer's Slack app.
44395
+ defaultValue: false,
44396
+ // Operator override, same precedence and vocabulary as the connectivity
44397
+ // escalation gate above, so an operator who knows one knows both.
44398
+ envVar: "AUGMENTED_SLACK_MANIFEST_REMEDIATE_ENABLED",
44399
+ // ADR-0022 §4. NOTE this is where it diverges from the connectivity gate it
44400
+ // otherwise mirrors, and the divergence is the point: arming THAT one only
44401
+ // causes alerts to open, while arming THIS one authorises a cron to REPLACE
44402
+ // manifests on customer-owned Slack apps. That is precisely the class the
44403
+ // sensitive marker exists for — a control whose relaxation should not be one
44404
+ // unguarded write away.
44405
+ sensitive: true
44406
+ },
44366
44407
  {
44367
44408
  key: "integration-reauth-reminders",
44368
44409
  description: "Re-notify an integration that stays in needs_reauth (ENG-8370). Failure notification is at-most-once PER TRANSITION, so an integration nobody repairs is announced once and then silent forever - prod carried a row failing every 30-minute tick for ~21 days on a single day-one notification. When on, the IntegrationReauthReminder cron re-fires the existing reconnect notification on a backoff measured from failure ONSET (+1d, +3d, +7d, then weekly), skipping rows an operator has muted. When off the cron still scans and logs what it WOULD have sent, so the volume can be sized before anyone is messaged. Boolean gate; ships dark.",
@@ -45968,6 +46009,37 @@ server.tool(
45968
46009
  }
45969
46010
  }
45970
46011
  );
46012
+ server.tool(
46013
+ "kanban_respond",
46014
+ 'Answer a card ANOTHER agent parked on you, and un-park it so they can resume. Use this for any card in the "You are blocking these" section of kanban_list: that agent has STOPPED until you act, and this is the only way your answer reaches the card they are blocked on. Do the thing they asked, then send the answer here. Do NOT create a second card to carry it - they would end up with the parked card AND a separate one holding the thing that unblocks it, joined by nothing. You can only respond to a card that names YOU in its wait.',
46015
+ {
46016
+ card_id: external_exports.string().describe(
46017
+ 'The card id, exactly as kanban_list shows it under "You are blocking these".'
46018
+ ),
46019
+ text: external_exports.string().optional().describe(
46020
+ "Your answer, self-contained. This is what the blocked agent resumes on, so give it the ANSWER rather than a pointer to one - it cannot see your board, your session or your files. Required unless you are picking a choice with `value`."
46021
+ ),
46022
+ value: external_exports.string().optional().describe("Machine value of a choice, when the card offered options. Otherwise omit."),
46023
+ label: external_exports.string().optional().describe("Human label for that choice, when it differs from the value.")
46024
+ },
46025
+ async (params) => {
46026
+ let data;
46027
+ try {
46028
+ data = await apiPost("/host/kanban/respond", {
46029
+ agent_id: AGT_AGENT_ID,
46030
+ card_id: params.card_id,
46031
+ ...params.text ? { text: params.text } : {},
46032
+ ...params.value ? { value: params.value } : {},
46033
+ ...params.label ? { label: params.label } : {}
46034
+ });
46035
+ } catch (err) {
46036
+ return {
46037
+ content: [{ type: "text", text: `Could not send your answer: ${err.message}` }]
46038
+ };
46039
+ }
46040
+ return { content: [{ type: "text", text: describeKanbanRespondOutcome(data) }] };
46041
+ }
46042
+ );
45971
46043
  server.tool(
45972
46044
  "kanban_recall",
45973
46045
  'Pull a card you assigned to a HUMAN teammate back onto your own board. Use this when a card shows under "Assigned to a person" in kanban_list and you need to act on it - typically because the person finished the work (or it is no longer needed) and the card has to be closed. While a card is assigned to a person, every kanban write to it is refused; recall makes it yours again so kanban_move / kanban_done / kanban_log work. Recall does NOT complete the card - after recalling, close it yourself with kanban_done and a result. You can only recall a card you assigned.',
@@ -47848,6 +47920,11 @@ var LOCAL_TOOL_NAMES = /* @__PURE__ */ new Set([
47848
47920
  // ENG-8281: the inverse of assign_kanban_to_human — take a human-assigned
47849
47921
  // card back so the agent can finally close it.
47850
47922
  "kanban_recall",
47923
+ // ENG-9838: the UNBLOCKING direction of waiting_on_agent. Parking already
47924
+ // notified the target; the answer had no route back, so every agent-to-agent
47925
+ // park needed a second, unlinked card carrying the answer beside the card it
47926
+ // was meant to unblock.
47927
+ "kanban_respond",
47851
47928
  // ENG-9050: the return path for delegated work.
47852
47929
  "kanban_reopen",
47853
47930
  // ENG-9375: the READ path over a teammate's board (counts only).
@@ -43003,6 +43003,26 @@ var FLAG_REGISTRY = [
43003
43003
  // env var is retired.
43004
43004
  envVar: "AUGMENTED_CONNECTIVITY_ESCALATION_ENABLED"
43005
43005
  },
43006
+ {
43007
+ key: "slack-manifest-remediate",
43008
+ description: "Let the Slack manifest drift monitor PUSH, not just alert (ENG-9963). updateSlackManifest had exactly one caller \u2014 a console button \u2014 so nothing but a human click ever pushed a manifest; ENG-7762 changed the generator with no rollout mechanism and 26 agents went 53 days with no working per-agent slash commands. When on, the daily drift cron pushes the generated manifest for a drifted agent. When off it alerts exactly as before. NOTE what arming this authorises: a push REPLACES a customer-owned Slack app's entire manifest, so the cron only ever pushes drift whose diffs are purely additive (isSafelyRemediable) \u2014 an app with live-only entries a push would destroy is declined and left for a human. Boolean gate; ships dark.",
43009
+ flagType: "boolean",
43010
+ // Declared safe value is `false` (alert-only), matching the cron's compiled
43011
+ // default. The fail-safe direction is the opposite of a paging gate's and
43012
+ // matters more: a flag-DB read error must never authorise a WRITE to a
43013
+ // customer's Slack app.
43014
+ defaultValue: false,
43015
+ // Operator override, same precedence and vocabulary as the connectivity
43016
+ // escalation gate above, so an operator who knows one knows both.
43017
+ envVar: "AUGMENTED_SLACK_MANIFEST_REMEDIATE_ENABLED",
43018
+ // ADR-0022 §4. NOTE this is where it diverges from the connectivity gate it
43019
+ // otherwise mirrors, and the divergence is the point: arming THAT one only
43020
+ // causes alerts to open, while arming THIS one authorises a cron to REPLACE
43021
+ // manifests on customer-owned Slack apps. That is precisely the class the
43022
+ // sensitive marker exists for — a control whose relaxation should not be one
43023
+ // unguarded write away.
43024
+ sensitive: true
43025
+ },
43006
43026
  {
43007
43027
  key: "integration-reauth-reminders",
43008
43028
  description: "Re-notify an integration that stays in needs_reauth (ENG-8370). Failure notification is at-most-once PER TRANSITION, so an integration nobody repairs is announced once and then silent forever - prod carried a row failing every 30-minute tick for ~21 days on a single day-one notification. When on, the IntegrationReauthReminder cron re-fires the existing reconnect notification on a backoff measured from failure ONSET (+1d, +3d, +7d, then weekly), skipping rows an operator has muted. When off the cron still scans and logs what it WOULD have sent, so the volume can be sized before anyone is messaged. Boolean gate; ships dark.",
@@ -37526,6 +37526,26 @@ var FLAG_REGISTRY = [
37526
37526
  // env var is retired.
37527
37527
  envVar: "AUGMENTED_CONNECTIVITY_ESCALATION_ENABLED"
37528
37528
  },
37529
+ {
37530
+ key: "slack-manifest-remediate",
37531
+ description: "Let the Slack manifest drift monitor PUSH, not just alert (ENG-9963). updateSlackManifest had exactly one caller \u2014 a console button \u2014 so nothing but a human click ever pushed a manifest; ENG-7762 changed the generator with no rollout mechanism and 26 agents went 53 days with no working per-agent slash commands. When on, the daily drift cron pushes the generated manifest for a drifted agent. When off it alerts exactly as before. NOTE what arming this authorises: a push REPLACES a customer-owned Slack app's entire manifest, so the cron only ever pushes drift whose diffs are purely additive (isSafelyRemediable) \u2014 an app with live-only entries a push would destroy is declined and left for a human. Boolean gate; ships dark.",
37532
+ flagType: "boolean",
37533
+ // Declared safe value is `false` (alert-only), matching the cron's compiled
37534
+ // default. The fail-safe direction is the opposite of a paging gate's and
37535
+ // matters more: a flag-DB read error must never authorise a WRITE to a
37536
+ // customer's Slack app.
37537
+ defaultValue: false,
37538
+ // Operator override, same precedence and vocabulary as the connectivity
37539
+ // escalation gate above, so an operator who knows one knows both.
37540
+ envVar: "AUGMENTED_SLACK_MANIFEST_REMEDIATE_ENABLED",
37541
+ // ADR-0022 §4. NOTE this is where it diverges from the connectivity gate it
37542
+ // otherwise mirrors, and the divergence is the point: arming THAT one only
37543
+ // causes alerts to open, while arming THIS one authorises a cron to REPLACE
37544
+ // manifests on customer-owned Slack apps. That is precisely the class the
37545
+ // sensitive marker exists for — a control whose relaxation should not be one
37546
+ // unguarded write away.
37547
+ sensitive: true
37548
+ },
37529
37549
  {
37530
37550
  key: "integration-reauth-reminders",
37531
37551
  description: "Re-notify an integration that stays in needs_reauth (ENG-8370). Failure notification is at-most-once PER TRANSITION, so an integration nobody repairs is announced once and then silent forever - prod carried a row failing every 30-minute tick for ~21 days on a single day-one notification. When on, the IntegrationReauthReminder cron re-fires the existing reconnect notification on a backoff measured from failure ONSET (+1d, +3d, +7d, then weekly), skipping rows an operator has muted. When off the cron still scans and logs what it WOULD have sent, so the volume can be sized before anyone is messaged. Boolean gate; ships dark.",
@@ -37684,6 +37684,26 @@ var FLAG_REGISTRY = [
37684
37684
  // env var is retired.
37685
37685
  envVar: "AUGMENTED_CONNECTIVITY_ESCALATION_ENABLED"
37686
37686
  },
37687
+ {
37688
+ key: "slack-manifest-remediate",
37689
+ description: "Let the Slack manifest drift monitor PUSH, not just alert (ENG-9963). updateSlackManifest had exactly one caller \u2014 a console button \u2014 so nothing but a human click ever pushed a manifest; ENG-7762 changed the generator with no rollout mechanism and 26 agents went 53 days with no working per-agent slash commands. When on, the daily drift cron pushes the generated manifest for a drifted agent. When off it alerts exactly as before. NOTE what arming this authorises: a push REPLACES a customer-owned Slack app's entire manifest, so the cron only ever pushes drift whose diffs are purely additive (isSafelyRemediable) \u2014 an app with live-only entries a push would destroy is declined and left for a human. Boolean gate; ships dark.",
37690
+ flagType: "boolean",
37691
+ // Declared safe value is `false` (alert-only), matching the cron's compiled
37692
+ // default. The fail-safe direction is the opposite of a paging gate's and
37693
+ // matters more: a flag-DB read error must never authorise a WRITE to a
37694
+ // customer's Slack app.
37695
+ defaultValue: false,
37696
+ // Operator override, same precedence and vocabulary as the connectivity
37697
+ // escalation gate above, so an operator who knows one knows both.
37698
+ envVar: "AUGMENTED_SLACK_MANIFEST_REMEDIATE_ENABLED",
37699
+ // ADR-0022 §4. NOTE this is where it diverges from the connectivity gate it
37700
+ // otherwise mirrors, and the divergence is the point: arming THAT one only
37701
+ // causes alerts to open, while arming THIS one authorises a cron to REPLACE
37702
+ // manifests on customer-owned Slack apps. That is precisely the class the
37703
+ // sensitive marker exists for — a control whose relaxation should not be one
37704
+ // unguarded write away.
37705
+ sensitive: true
37706
+ },
37687
37707
  {
37688
37708
  key: "integration-reauth-reminders",
37689
37709
  description: "Re-notify an integration that stays in needs_reauth (ENG-8370). Failure notification is at-most-once PER TRANSITION, so an integration nobody repairs is announced once and then silent forever - prod carried a row failing every 30-minute tick for ~21 days on a single day-one notification. When on, the IntegrationReauthReminder cron re-fires the existing reconnect notification on a backoff measured from failure ONSET (+1d, +3d, +7d, then weekly), skipping rows an operator has muted. When off the cron still scans and logs what it WOULD have sent, so the volume can be sized before anyone is messaged. Boolean gate; ships dark.",
@@ -49,8 +49,8 @@ import {
49
49
  writeDirectChatSessionState,
50
50
  writeEgressAllowlist,
51
51
  writePersistentClaudeWrapper
52
- } from "./chunk-TWZFTSGP.js";
53
- import "./chunk-RMBASAMS.js";
52
+ } from "./chunk-GIV6ORI3.js";
53
+ import "./chunk-VK35F6O7.js";
54
54
  import "./chunk-XWVM4KPK.js";
55
55
  export {
56
56
  EGRESS_BASELINE_DOMAINS,
@@ -104,4 +104,4 @@ export {
104
104
  writeEgressAllowlist,
105
105
  writePersistentClaudeWrapper
106
106
  };
107
- //# sourceMappingURL=persistent-session-GPVAPK4S.js.map
107
+ //# sourceMappingURL=persistent-session-LEICQMWY.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-TWZFTSGP.js";
4
- import "./chunk-RMBASAMS.js";
3
+ } from "./chunk-GIV6ORI3.js";
4
+ import "./chunk-VK35F6O7.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -745,4 +745,4 @@ export {
745
745
  readAndResetSlackReplyBindingClassifications,
746
746
  readAndResetSlackReplyTargetClassifications
747
747
  };
748
- //# sourceMappingURL=responsiveness-probe-7FEKDJZW.js.map
748
+ //# sourceMappingURL=responsiveness-probe-WEXP254C.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-RMBASAMS.js";
3
+ } from "./chunk-VK35F6O7.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-ZBMVGQYW.js.map
206
+ //# sourceMappingURL=session-auth-dead-AROKHZET.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.806",
3
+ "version": "0.28.807",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {