@integrity-labs/agt-cli 0.28.610 → 0.28.612

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-HOFUHGKI.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-KO24RZN7.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-3Y6ZICI3.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-4MKFMNYN.js.map
@@ -53,7 +53,7 @@ import {
53
53
  safeWriteJsonAtomic,
54
54
  setConfigHash,
55
55
  tripClass
56
- } from "../chunk-RTZ2VC7V.js";
56
+ } from "../chunk-F2WTBHMD.js";
57
57
  import {
58
58
  getProjectDir as getProjectDir2,
59
59
  getReadyTasks,
@@ -109,7 +109,7 @@ import {
109
109
  takeZombieDetection,
110
110
  toOpencodeModel,
111
111
  writeEgressAllowlist
112
- } from "../chunk-DESCRVVM.js";
112
+ } from "../chunk-DJP4JZGE.js";
113
113
  import {
114
114
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
115
115
  AnchorSessionClient,
@@ -186,7 +186,7 @@ import {
186
186
  subagentActivityAgeSeconds,
187
187
  sumTranscriptUsageInWindow,
188
188
  transcriptActivityAgeSeconds
189
- } from "../chunk-FF7H4K7I.js";
189
+ } from "../chunk-RQAAW5LL.js";
190
190
  import {
191
191
  reapOrphanChannelMcps
192
192
  } from "../chunk-XWVM4KPK.js";
@@ -11287,7 +11287,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
11287
11287
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
11288
11288
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
11289
11289
  async function channelInboundActivityAgeSecondsFor(codeName) {
11290
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-Z7IFPQCU.js");
11290
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-V4O7DXYV.js");
11291
11291
  const newest = newestPendingInboundActivityMtimeMs(dirname9(paneLogPath(codeName)));
11292
11292
  if (newest === null) return null;
11293
11293
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -11926,7 +11926,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
11926
11926
  var lastVersionCheckAt = 0;
11927
11927
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
11928
11928
  var lastResponsivenessProbeAt = 0;
11929
- var agtCliVersion = true ? "0.28.610" : "dev";
11929
+ var agtCliVersion = true ? "0.28.612" : "dev";
11930
11930
  function resolveBrewPath(execFileSync3) {
11931
11931
  try {
11932
11932
  const out = execFileSync3("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -13233,7 +13233,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
13233
13233
  if (codeNames.length === 0) return;
13234
13234
  void (async () => {
13235
13235
  try {
13236
- const { collectDiagnostics } = await import("../persistent-session-HOFUHGKI.js");
13236
+ const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
13237
13237
  await api.post("/host/heartbeat", {
13238
13238
  host_id: hostId,
13239
13239
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -13341,7 +13341,7 @@ async function pollCycle() {
13341
13341
  }
13342
13342
  try {
13343
13343
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
13344
- const { collectDiagnostics } = await import("../persistent-session-HOFUHGKI.js");
13344
+ const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
13345
13345
  const diagCodeNames = [...agentState.persistentSessionAgents];
13346
13346
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor) : void 0;
13347
13347
  let tailscaleHostname;
@@ -13464,7 +13464,7 @@ async function pollCycle() {
13464
13464
  collectPanelessActivityProbes,
13465
13465
  getResponsivenessIntervalMs,
13466
13466
  occupancyQualificationClassifications
13467
- } = await import("../responsiveness-probe-Z7IFPQCU.js");
13467
+ } = await import("../responsiveness-probe-V4O7DXYV.js");
13468
13468
  const probeIntervalMs = getResponsivenessIntervalMs();
13469
13469
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
13470
13470
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -13570,7 +13570,7 @@ async function pollCycle() {
13570
13570
  collectResponsivenessProbes,
13571
13571
  livePendingInboundOldestAgeSeconds,
13572
13572
  parkPendingInbound
13573
- } = await import("../responsiveness-probe-Z7IFPQCU.js");
13573
+ } = await import("../responsiveness-probe-V4O7DXYV.js");
13574
13574
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
13575
13575
  const wedgeNow = /* @__PURE__ */ new Date();
13576
13576
  const liveAgents = agentState.persistentSessionAgents;
@@ -13726,7 +13726,7 @@ async function pollCycle() {
13726
13726
  }
13727
13727
  try {
13728
13728
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
13729
- const { probeSessionAuth } = await import("../session-auth-dead-Q6AY5HC7.js");
13729
+ const { probeSessionAuth } = await import("../session-auth-dead-S7WK33WO.js");
13730
13730
  const observations = [];
13731
13731
  const pendingCacheCommits = [];
13732
13732
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -17215,7 +17215,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
17215
17215
  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}`));
17216
17216
  void (async () => {
17217
17217
  try {
17218
- const { collectDiagnostics } = await import("../persistent-session-HOFUHGKI.js");
17218
+ const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
17219
17219
  await api.post("/host/heartbeat", {
17220
17220
  host_id: hostId,
17221
17221
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17266,7 +17266,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
17266
17266
  }
17267
17267
  try {
17268
17268
  const hostId = await getHostId();
17269
- const { collectDiagnostics } = await import("../persistent-session-HOFUHGKI.js");
17269
+ const { collectDiagnostics } = await import("../persistent-session-KO24RZN7.js");
17270
17270
  await api.post("/host/heartbeat", {
17271
17271
  host_id: hostId,
17272
17272
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor)
@@ -17862,7 +17862,7 @@ async function processClaudePairSessions(agents) {
17862
17862
  killPairSession,
17863
17863
  pairTmuxSession,
17864
17864
  finalizeClaudePairOnboarding
17865
- } = await import("../claude-pair-runtime-3Y6ZICI3.js");
17865
+ } = await import("../claude-pair-runtime-4MKFMNYN.js");
17866
17866
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
17867
17867
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
17868
17868
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -30142,8 +30142,12 @@ function busyAckNoticeText() {
30142
30142
  return "\u{1F6E0}\uFE0F I'm in the middle of something right now \u2014 I'll follow up on this as soon as I'm free.";
30143
30143
  }
30144
30144
  var GIVE_UP_SIGNAL_MAX_AGE_MS = 30 * 60 * 1e3;
30145
- function turnFailedNoticeText() {
30146
- return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
30145
+ function turnFailedNoticeText(failureClass) {
30146
+ const cause = failureClass === "overloaded" ? "the service I run on is overloaded right now \u2014 nothing to do with you or what you asked for" : failureClass === "server_error" ? "something upstream of me is failing right now \u2014 nothing to do with you or what you asked for" : null;
30147
+ if (cause === null) {
30148
+ return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
30149
+ }
30150
+ return `\u26A0\uFE0F I couldn\u2019t finish that \u2014 ${cause}. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.`;
30147
30151
  }
30148
30152
  function oldestPendingMarkerAgeMs(dir, now = Date.now(), opts) {
30149
30153
  if (!dir) return null;
@@ -32565,6 +32569,12 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32565
32569
  var AL_PANEL_WIDTH_PX = 420;
32566
32570
  var AL_MIN_CANVAS_PX = 320;
32567
32571
  var AL_SPLIT_MIN_VIEWPORT_PX = AL_PANEL_WIDTH_PX + AL_MIN_CANVAS_PX;
32572
+ var DECK_HUD_BOTTOM_PX = 20;
32573
+ var DECK_HUD_HEIGHT_PX = 48;
32574
+ var DECK_HUD_TOP_PX = DECK_HUD_BOTTOM_PX + DECK_HUD_HEIGHT_PX;
32575
+ var DECK_CHROME_GAP_PX = 8;
32576
+ var DECK_ATTRIBUTION_BOTTOM_PX = DECK_HUD_TOP_PX + DECK_CHROME_GAP_PX;
32577
+ var DECK_ATTRIBUTION_NARROW_BOTTOM_PX = 104 + DECK_CHROME_GAP_PX;
32568
32578
 
32569
32579
  // ../core/dist/integrations/augmented-live/asset.js
32570
32580
  var MB = 1024 * 1024;
@@ -34866,6 +34876,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
34866
34876
 
34867
34877
  // ../core/dist/feature-flags/registry.js
34868
34878
  var FLAG_REGISTRY = [
34879
+ {
34880
+ key: "impersonation-enabled",
34881
+ description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
34882
+ flagType: "boolean",
34883
+ // Declared safe value is `true` = impersonation available, i.e. today's
34884
+ // behaviour, so merging this changes nothing until an operator flips it.
34885
+ //
34886
+ // NOTE the asymmetry with the other gates in this file, and it is
34887
+ // deliberate: their safe direction is "off / don't do the new thing"
34888
+ // because they gate NEW behaviour. This one gates EXISTING behaviour, so
34889
+ // the no-op default is `true`. The READ direction is where the safety lives
34890
+ // instead — an unreachable flag store resolves to DISABLED, not to this
34891
+ // default. See readImpersonationEnabled for that argument.
34892
+ defaultValue: true,
34893
+ // Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
34894
+ // "relaxing a security control", exactly the mutation that must not happen
34895
+ // on a single unguarded write. The emergency direction (turning it OFF)
34896
+ // costs one confirmation, which is the right price.
34897
+ sensitive: true
34898
+ // Deliberately NOT public. A browser has no business evaluating whether
34899
+ // impersonation is available; both consumers are server-side route
34900
+ // handlers.
34901
+ },
34869
34902
  {
34870
34903
  key: "at-rest-v2-writes",
34871
34904
  description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
@@ -38099,7 +38132,7 @@ function armTurnFailureWatch(args) {
38099
38132
  return;
38100
38133
  }
38101
38134
  lastTurnFailedNoticeAt.set(args.sessionId, now);
38102
- const ok = await postDirectChatNoticeMessage(args.sessionId, turnFailedNoticeText());
38135
+ const ok = await postDirectChatNoticeMessage(args.sessionId, turnFailedNoticeText(failure.failureClass));
38103
38136
  if (!ok) {
38104
38137
  lastTurnFailedNoticeAt.delete(args.sessionId);
38105
38138
  process.stderr.write(
@@ -38903,6 +38903,12 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
38903
38903
  var AL_PANEL_WIDTH_PX = 420;
38904
38904
  var AL_MIN_CANVAS_PX = 320;
38905
38905
  var AL_SPLIT_MIN_VIEWPORT_PX = AL_PANEL_WIDTH_PX + AL_MIN_CANVAS_PX;
38906
+ var DECK_HUD_BOTTOM_PX = 20;
38907
+ var DECK_HUD_HEIGHT_PX = 48;
38908
+ var DECK_HUD_TOP_PX = DECK_HUD_BOTTOM_PX + DECK_HUD_HEIGHT_PX;
38909
+ var DECK_CHROME_GAP_PX = 8;
38910
+ var DECK_ATTRIBUTION_BOTTOM_PX = DECK_HUD_TOP_PX + DECK_CHROME_GAP_PX;
38911
+ var DECK_ATTRIBUTION_NARROW_BOTTOM_PX = 104 + DECK_CHROME_GAP_PX;
38906
38912
 
38907
38913
  // ../core/dist/integrations/augmented-live/asset.js
38908
38914
  var MB = 1024 * 1024;
@@ -40757,6 +40763,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
40757
40763
 
40758
40764
  // ../core/dist/feature-flags/registry.js
40759
40765
  var FLAG_REGISTRY = [
40766
+ {
40767
+ key: "impersonation-enabled",
40768
+ description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
40769
+ flagType: "boolean",
40770
+ // Declared safe value is `true` = impersonation available, i.e. today's
40771
+ // behaviour, so merging this changes nothing until an operator flips it.
40772
+ //
40773
+ // NOTE the asymmetry with the other gates in this file, and it is
40774
+ // deliberate: their safe direction is "off / don't do the new thing"
40775
+ // because they gate NEW behaviour. This one gates EXISTING behaviour, so
40776
+ // the no-op default is `true`. The READ direction is where the safety lives
40777
+ // instead — an unreachable flag store resolves to DISABLED, not to this
40778
+ // default. See readImpersonationEnabled for that argument.
40779
+ defaultValue: true,
40780
+ // Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
40781
+ // "relaxing a security control", exactly the mutation that must not happen
40782
+ // on a single unguarded write. The emergency direction (turning it OFF)
40783
+ // costs one confirmation, which is the right price.
40784
+ sensitive: true
40785
+ // Deliberately NOT public. A browser has no business evaluating whether
40786
+ // impersonation is available; both consumers are server-side route
40787
+ // handlers.
40788
+ },
40760
40789
  {
40761
40790
  key: "at-rest-v2-writes",
40762
40791
  description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
@@ -32954,6 +32954,12 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
32954
32954
  var AL_PANEL_WIDTH_PX = 420;
32955
32955
  var AL_MIN_CANVAS_PX = 320;
32956
32956
  var AL_SPLIT_MIN_VIEWPORT_PX = AL_PANEL_WIDTH_PX + AL_MIN_CANVAS_PX;
32957
+ var DECK_HUD_BOTTOM_PX = 20;
32958
+ var DECK_HUD_HEIGHT_PX = 48;
32959
+ var DECK_HUD_TOP_PX = DECK_HUD_BOTTOM_PX + DECK_HUD_HEIGHT_PX;
32960
+ var DECK_CHROME_GAP_PX = 8;
32961
+ var DECK_ATTRIBUTION_BOTTOM_PX = DECK_HUD_TOP_PX + DECK_CHROME_GAP_PX;
32962
+ var DECK_ATTRIBUTION_NARROW_BOTTOM_PX = 104 + DECK_CHROME_GAP_PX;
32957
32963
 
32958
32964
  // ../core/dist/integrations/augmented-live/asset.js
32959
32965
  var MB = 1024 * 1024;
@@ -35202,6 +35208,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
35202
35208
 
35203
35209
  // ../core/dist/feature-flags/registry.js
35204
35210
  var FLAG_REGISTRY = [
35211
+ {
35212
+ key: "impersonation-enabled",
35213
+ description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
35214
+ flagType: "boolean",
35215
+ // Declared safe value is `true` = impersonation available, i.e. today's
35216
+ // behaviour, so merging this changes nothing until an operator flips it.
35217
+ //
35218
+ // NOTE the asymmetry with the other gates in this file, and it is
35219
+ // deliberate: their safe direction is "off / don't do the new thing"
35220
+ // because they gate NEW behaviour. This one gates EXISTING behaviour, so
35221
+ // the no-op default is `true`. The READ direction is where the safety lives
35222
+ // instead — an unreachable flag store resolves to DISABLED, not to this
35223
+ // default. See readImpersonationEnabled for that argument.
35224
+ defaultValue: true,
35225
+ // Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
35226
+ // "relaxing a security control", exactly the mutation that must not happen
35227
+ // on a single unguarded write. The emergency direction (turning it OFF)
35228
+ // costs one confirmation, which is the right price.
35229
+ sensitive: true
35230
+ // Deliberately NOT public. A browser has no business evaluating whether
35231
+ // impersonation is available; both consumers are server-side route
35232
+ // handlers.
35233
+ },
35205
35234
  {
35206
35235
  key: "at-rest-v2-writes",
35207
35236
  description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
@@ -36968,8 +36997,12 @@ function giveUpNoticeText(reason = null) {
36968
36997
  }
36969
36998
  return "\u26A0\uFE0F I couldn't read your last message \u2014 please resend it.";
36970
36999
  }
36971
- function turnFailedNoticeText() {
36972
- return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
37000
+ function turnFailedNoticeText(failureClass) {
37001
+ const cause = failureClass === "overloaded" ? "the service I run on is overloaded right now \u2014 nothing to do with you or what you asked for" : failureClass === "server_error" ? "something upstream of me is failing right now \u2014 nothing to do with you or what you asked for" : null;
37002
+ if (cause === null) {
37003
+ return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
37004
+ }
37005
+ return `\u26A0\uFE0F I couldn\u2019t finish that \u2014 ${cause}. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.`;
36973
37006
  }
36974
37007
  function turnRetryingNoticeText() {
36975
37008
  return "\u23F3 Still working on this \u2014 things are running slower than usual on my side. I\u2019ll reply as soon as I have it.";
@@ -42672,7 +42705,7 @@ function armSlackTurnFailureWatch(args) {
42672
42705
  const posted = await postSlackTurnNotice({
42673
42706
  channel,
42674
42707
  threadTs: args.threadTs,
42675
- text: turnFailedNoticeText()
42708
+ text: turnFailedNoticeText(failure.failureClass)
42676
42709
  });
42677
42710
  if (!posted.ok) {
42678
42711
  lastSlackTurnFailedNoticeAt.delete(conversationKey);
@@ -33113,6 +33113,12 @@ var MARKUP_BRIDGE_SCRIPT = `<script>(function(){
33113
33113
  var AL_PANEL_WIDTH_PX = 420;
33114
33114
  var AL_MIN_CANVAS_PX = 320;
33115
33115
  var AL_SPLIT_MIN_VIEWPORT_PX = AL_PANEL_WIDTH_PX + AL_MIN_CANVAS_PX;
33116
+ var DECK_HUD_BOTTOM_PX = 20;
33117
+ var DECK_HUD_HEIGHT_PX = 48;
33118
+ var DECK_HUD_TOP_PX = DECK_HUD_BOTTOM_PX + DECK_HUD_HEIGHT_PX;
33119
+ var DECK_CHROME_GAP_PX = 8;
33120
+ var DECK_ATTRIBUTION_BOTTOM_PX = DECK_HUD_TOP_PX + DECK_CHROME_GAP_PX;
33121
+ var DECK_ATTRIBUTION_NARROW_BOTTOM_PX = 104 + DECK_CHROME_GAP_PX;
33116
33122
 
33117
33123
  // ../core/dist/integrations/augmented-live/asset.js
33118
33124
  var MB = 1024 * 1024;
@@ -35361,6 +35367,29 @@ registerTriggerSource(videoRenderTriggerAdapter);
35361
35367
 
35362
35368
  // ../core/dist/feature-flags/registry.js
35363
35369
  var FLAG_REGISTRY = [
35370
+ {
35371
+ key: "impersonation-enabled",
35372
+ description: "Kill switch for admin impersonation (ENG-9080), filed during the 18 Aug cross-tenant identity incident. ON (default) = impersonation works as today. OFF = both halves of the flow refuse: the mint route stops issuing redeem URLs, and \u2014 the half that actually matters \u2014 the REDEEM route refuses before it inserts the nonce or calls generateLink, so a URL that was already issued cannot still mint a session. Redeem tokens live REDEEM_TTL_SECONDS = 300, so gating only the mint route would leave five minutes in which new sessions keep appearing after an operator believes they have stopped it. Evaluated as a GLOBAL stage value, read UNCACHED on the redeem path (see readImpersonationEnabled): a kill switch that takes a cache TTL to bite is not a kill switch. Containment only \u2014 it does not fix the underlying defect that redeem writes the target's cookies into whatever browser context opens the URL (ENG-8923 / ENG-9020).",
35373
+ flagType: "boolean",
35374
+ // Declared safe value is `true` = impersonation available, i.e. today's
35375
+ // behaviour, so merging this changes nothing until an operator flips it.
35376
+ //
35377
+ // NOTE the asymmetry with the other gates in this file, and it is
35378
+ // deliberate: their safe direction is "off / don't do the new thing"
35379
+ // because they gate NEW behaviour. This one gates EXISTING behaviour, so
35380
+ // the no-op default is `true`. The READ direction is where the safety lives
35381
+ // instead — an unreachable flag store resolves to DISABLED, not to this
35382
+ // default. See readImpersonationEnabled for that argument.
35383
+ defaultValue: true,
35384
+ // Enforcement gate (ADR-0022 section 4): re-enabling impersonation is
35385
+ // "relaxing a security control", exactly the mutation that must not happen
35386
+ // on a single unguarded write. The emergency direction (turning it OFF)
35387
+ // costs one confirmation, which is the right price.
35388
+ sensitive: true
35389
+ // Deliberately NOT public. A browser has no business evaluating whether
35390
+ // impersonation is available; both consumers are server-side route
35391
+ // handlers.
35392
+ },
35364
35393
  {
35365
35394
  key: "at-rest-v2-writes",
35366
35395
  description: "ADR-0061 A2\u2192arm cutover (ENG-8944, parent ENG-8764). Gates whether the at-rest writer (encryptSecret/encryptAtRest) emits the v2 AAD-bound envelope when a DecryptContext is supplied; OFF (default) = the legacy v1 envelope (pre-ADR-0061 behaviour). Resolved FLEET-WIDE and process-global via setV2WritesArmed at the API + webapp + cron bootstrap seams, so ONLY the stage value applies \u2014 per-org overrides do not (the crypto writer carries no request/org context). Ships dark. Flip on only once every reader parses v2 (fleet-wide since release A1) AND the re-seal engine can re-seal v2 blobs before any AUTH_ENCRYPTION_KEY rotation (slice 5b). Reversible without redeploy: clearing it returns the writer to v1 within the flag cache TTL; already-written v2 blobs stay readable.",
@@ -39572,8 +39601,12 @@ function giveUpNoticeText(reason = null) {
39572
39601
  }
39573
39602
  return "\u26A0\uFE0F I couldn't read your last message \u2014 please resend it.";
39574
39603
  }
39575
- function turnFailedNoticeText() {
39576
- return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
39604
+ function turnFailedNoticeText(failureClass) {
39605
+ const cause = failureClass === "overloaded" ? "the service I run on is overloaded right now \u2014 nothing to do with you or what you asked for" : failureClass === "server_error" ? "something upstream of me is failing right now \u2014 nothing to do with you or what you asked for" : null;
39606
+ if (cause === null) {
39607
+ return "\u26A0\uFE0F Something went wrong on my side and I couldn\u2019t finish that. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.";
39608
+ }
39609
+ return `\u26A0\uFE0F I couldn\u2019t finish that \u2014 ${cause}. Sorry \u2014 send it again when you get a chance and I\u2019ll pick it straight up.`;
39577
39610
  }
39578
39611
  function turnRetryingNoticeText() {
39579
39612
  return "\u23F3 Still working on this \u2014 things are running slower than usual on my side. I\u2019ll reply as soon as I have it.";
@@ -41987,7 +42020,7 @@ function armTelegramTurnFailureWatch(args) {
41987
42020
  const posted = await postTelegramTurnNotice({
41988
42021
  chatId: args.chatId,
41989
42022
  ...args.messageThreadId != null ? { messageThreadId: args.messageThreadId } : {},
41990
- text: turnFailedNoticeText()
42023
+ text: turnFailedNoticeText(failure.failureClass)
41991
42024
  });
41992
42025
  if (!posted) {
41993
42026
  lastTurnFailedNoticeAt.delete(conversationKey);
@@ -43,8 +43,8 @@ import {
43
43
  writeDirectChatSessionState,
44
44
  writeEgressAllowlist,
45
45
  writePersistentClaudeWrapper
46
- } from "./chunk-DESCRVVM.js";
47
- import "./chunk-FF7H4K7I.js";
46
+ } from "./chunk-DJP4JZGE.js";
47
+ import "./chunk-RQAAW5LL.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-HOFUHGKI.js.map
95
+ //# sourceMappingURL=persistent-session-KO24RZN7.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-DESCRVVM.js";
4
- import "./chunk-FF7H4K7I.js";
3
+ } from "./chunk-DJP4JZGE.js";
4
+ import "./chunk-RQAAW5LL.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-Z7IFPQCU.js.map
713
+ //# sourceMappingURL=responsiveness-probe-V4O7DXYV.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-FF7H4K7I.js";
3
+ } from "./chunk-RQAAW5LL.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-Q6AY5HC7.js.map
206
+ //# sourceMappingURL=session-auth-dead-S7WK33WO.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.610",
3
+ "version": "0.28.612",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {