@integrity-labs/agt-cli 0.28.944 → 0.28.946

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-6OAQAAWH.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-523F5U4H.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-MH55KUOA.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-K2J6WVEN.js.map
@@ -63,7 +63,7 @@ import {
63
63
  safeWriteJsonAtomic,
64
64
  setConfigHash,
65
65
  tripClass
66
- } from "../chunk-6J4R5MJQ.js";
66
+ } from "../chunk-RTMBVYTR.js";
67
67
  import {
68
68
  getProjectDir as getProjectDir2,
69
69
  getReadyTasks,
@@ -136,7 +136,7 @@ import {
136
136
  takeZombieDetection,
137
137
  toOpencodeModel,
138
138
  writeEgressAllowlist
139
- } from "../chunk-UHW6YFL2.js";
139
+ } from "../chunk-XN5MOKSV.js";
140
140
  import {
141
141
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
142
142
  AnchorSessionClient,
@@ -232,7 +232,7 @@ import {
232
232
  subagentActivityAgeSeconds,
233
233
  sumTranscriptUsageInWindow,
234
234
  transcriptActivityAgeSeconds
235
- } from "../chunk-CO3QPWIB.js";
235
+ } from "../chunk-YZ5HGHPG.js";
236
236
  import {
237
237
  reapOrphanChannelMcps
238
238
  } from "../chunk-XWVM4KPK.js";
@@ -13257,7 +13257,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
13257
13257
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
13258
13258
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
13259
13259
  async function channelInboundActivityAgeSecondsFor(codeName) {
13260
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-DKYZBD3Y.js");
13260
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-CHGET573.js");
13261
13261
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
13262
13262
  if (newest === null) return null;
13263
13263
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -13942,7 +13942,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13942
13942
  var lastVersionCheckAt = 0;
13943
13943
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13944
13944
  var lastResponsivenessProbeAt = 0;
13945
- var agtCliVersion = true ? "0.28.944" : "dev";
13945
+ var agtCliVersion = true ? "0.28.946" : "dev";
13946
13946
  function resolveBrewPath(execFileSync2) {
13947
13947
  try {
13948
13948
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15532,7 +15532,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15532
15532
  if (codeNames.length === 0) return;
15533
15533
  void (async () => {
15534
15534
  try {
15535
- const { collectDiagnostics } = await import("../persistent-session-6OAQAAWH.js");
15535
+ const { collectDiagnostics } = await import("../persistent-session-523F5U4H.js");
15536
15536
  await api.post("/host/heartbeat", {
15537
15537
  host_id: hostId,
15538
15538
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15674,7 +15674,7 @@ async function pollCycleInner() {
15674
15674
  }
15675
15675
  try {
15676
15676
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
15677
- const { collectDiagnostics } = await import("../persistent-session-6OAQAAWH.js");
15677
+ const { collectDiagnostics } = await import("../persistent-session-523F5U4H.js");
15678
15678
  const diagCodeNames = [...agentState.persistentSessionAgents];
15679
15679
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15680
15680
  let tailscaleHostname;
@@ -15849,7 +15849,7 @@ async function pollCycleInner() {
15849
15849
  collectPanelessActivityProbes,
15850
15850
  getResponsivenessIntervalMs,
15851
15851
  occupancyQualificationClassifications
15852
- } = await import("../responsiveness-probe-DKYZBD3Y.js");
15852
+ } = await import("../responsiveness-probe-CHGET573.js");
15853
15853
  const probeIntervalMs = getResponsivenessIntervalMs();
15854
15854
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15855
15855
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -15966,7 +15966,7 @@ async function pollCycleInner() {
15966
15966
  collectResponsivenessProbes,
15967
15967
  livePendingInboundOldestAgeSeconds,
15968
15968
  parkPendingInbound
15969
- } = await import("../responsiveness-probe-DKYZBD3Y.js");
15969
+ } = await import("../responsiveness-probe-CHGET573.js");
15970
15970
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
15971
15971
  const wedgeNow = /* @__PURE__ */ new Date();
15972
15972
  const liveAgents = agentState.persistentSessionAgents;
@@ -16122,7 +16122,7 @@ async function pollCycleInner() {
16122
16122
  }
16123
16123
  try {
16124
16124
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
16125
- const { probeSessionAuth } = await import("../session-auth-dead-IQ3WUFLF.js");
16125
+ const { probeSessionAuth } = await import("../session-auth-dead-T5SUK2HT.js");
16126
16126
  const observations = [];
16127
16127
  const pendingCacheCommits = [];
16128
16128
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -20386,7 +20386,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20386
20386
  try {
20387
20387
  const freshId = rotateSessionForWedge(codeName);
20388
20388
  consecutiveWedgeCycles.delete(codeName);
20389
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-DKYZBD3Y.js");
20389
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-CHGET573.js");
20390
20390
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
20391
20391
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
20392
20392
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -20429,7 +20429,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20429
20429
  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}`));
20430
20430
  void (async () => {
20431
20431
  try {
20432
- const { collectDiagnostics } = await import("../persistent-session-6OAQAAWH.js");
20432
+ const { collectDiagnostics } = await import("../persistent-session-523F5U4H.js");
20433
20433
  await api.post("/host/heartbeat", {
20434
20434
  host_id: hostId,
20435
20435
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20480,7 +20480,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
20480
20480
  }
20481
20481
  try {
20482
20482
  const hostId = await getHostId();
20483
- const { collectDiagnostics } = await import("../persistent-session-6OAQAAWH.js");
20483
+ const { collectDiagnostics } = await import("../persistent-session-523F5U4H.js");
20484
20484
  await api.post("/host/heartbeat", {
20485
20485
  host_id: hostId,
20486
20486
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -21122,7 +21122,7 @@ async function processClaudePairSessions(agents) {
21122
21122
  killPairSession,
21123
21123
  pairTmuxSession,
21124
21124
  finalizeClaudePairOnboarding
21125
- } = await import("../claude-pair-runtime-MH55KUOA.js");
21125
+ } = await import("../claude-pair-runtime-K2J6WVEN.js");
21126
21126
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
21127
21127
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
21128
21128
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -32980,7 +32980,24 @@ var composio_approved_egress_default = {
32980
32980
  "WHEN ENG-9426 LANDS THIS GOES RED UNTIL IT IS UPDATED. That is the forcing function",
32981
32981
  "working, not a fault. ENG-9426 adds a NAT in ap-southeast-2b, i.e. a THIRD egress",
32982
32982
  "address: add it here in the same change that lands it, or the detector correctly",
32983
- "reports that hosts are leaving from an address no key allows. Do not loosen the check."
32983
+ "reports that hosts are leaving from an address no key allows. Do not loosen the check.",
32984
+ "",
32985
+ " crossing to 2a and stop dying with it. The address does not exist until",
32986
+ "",
32987
+ "15.135.204.192 IS GONE AND MUST NOT BE RE-ADDED (ENG-9426, 2026-09-15).",
32988
+ "The dev NAT was retired and that address was RELEASED back to the AWS pool, so it can",
32989
+ "be reassigned to another AWS customer at any time. An allowlist entry naming it would",
32990
+ "then permit a stranger's host rather than simply failing closed. Nothing was armed when",
32991
+ "this happened, so no key ever held it - but this file IS what an operator pastes from,",
32992
+ "which is why it is removed here the same day.",
32993
+ "",
32994
+ "WHY retainOnDelete DID NOT SAVE IT, because the next person will assume it would.",
32995
+ "The option was added in the SAME change that set dev's natMode to `none`. Pulumi reads",
32996
+ "delete-time options from the STATE recorded at the resource's last registration, and by",
32997
+ "the time this ran the resource was no longer in the program at all - so the state still",
32998
+ "said 'delete normally'. retainOnDelete has to land in a deploy that STILL DECLARES the",
32999
+ "resource before it protects anything. The two prod EIPs above are protected, because",
33000
+ "this apply registered them with the option set."
32984
33001
  ],
32985
33002
  account: "711726113003",
32986
33003
  homeRegion: "ap-southeast-2",
@@ -32992,10 +33009,10 @@ var composio_approved_egress_default = {
32992
33009
  note: "Prod hosts NAT. Measured 2026-09-12 (ENG-10392): 25 of 25 active prod host instances route 0.0.0.0/0 here."
32993
33010
  },
32994
33011
  {
32995
- ip: "15.135.204.192",
32996
- stage: "dev",
32997
- seenAsGateway: "nat-01122e6efaf4c4eaa",
32998
- note: "Dev-stage hosts NAT, same account. 2 instances measured 2026-09-12; their host rows live in the dev Supabase project."
33012
+ ip: "54.253.255.215",
33013
+ stage: "prod",
33014
+ seenAsGateway: "nat-04384e27ab04973b5",
33015
+ note: "Prod hosts NAT in ap-southeast-2b, created 2026-09-15 by ENG-9426. The 12 prod hosts in the 2b private subnet egress here instead of crossing to 2a. Verified live after the Pulumi apply, not predicted."
32999
33016
  }
33000
33017
  ]
33001
33018
  };
package/dist/mcp/index.js CHANGED
@@ -25581,7 +25581,24 @@ var composio_approved_egress_default = {
25581
25581
  "WHEN ENG-9426 LANDS THIS GOES RED UNTIL IT IS UPDATED. That is the forcing function",
25582
25582
  "working, not a fault. ENG-9426 adds a NAT in ap-southeast-2b, i.e. a THIRD egress",
25583
25583
  "address: add it here in the same change that lands it, or the detector correctly",
25584
- "reports that hosts are leaving from an address no key allows. Do not loosen the check."
25584
+ "reports that hosts are leaving from an address no key allows. Do not loosen the check.",
25585
+ "",
25586
+ " crossing to 2a and stop dying with it. The address does not exist until",
25587
+ "",
25588
+ "15.135.204.192 IS GONE AND MUST NOT BE RE-ADDED (ENG-9426, 2026-09-15).",
25589
+ "The dev NAT was retired and that address was RELEASED back to the AWS pool, so it can",
25590
+ "be reassigned to another AWS customer at any time. An allowlist entry naming it would",
25591
+ "then permit a stranger's host rather than simply failing closed. Nothing was armed when",
25592
+ "this happened, so no key ever held it - but this file IS what an operator pastes from,",
25593
+ "which is why it is removed here the same day.",
25594
+ "",
25595
+ "WHY retainOnDelete DID NOT SAVE IT, because the next person will assume it would.",
25596
+ "The option was added in the SAME change that set dev's natMode to `none`. Pulumi reads",
25597
+ "delete-time options from the STATE recorded at the resource's last registration, and by",
25598
+ "the time this ran the resource was no longer in the program at all - so the state still",
25599
+ "said 'delete normally'. retainOnDelete has to land in a deploy that STILL DECLARES the",
25600
+ "resource before it protects anything. The two prod EIPs above are protected, because",
25601
+ "this apply registered them with the option set."
25585
25602
  ],
25586
25603
  account: "711726113003",
25587
25604
  homeRegion: "ap-southeast-2",
@@ -25593,10 +25610,10 @@ var composio_approved_egress_default = {
25593
25610
  note: "Prod hosts NAT. Measured 2026-09-12 (ENG-10392): 25 of 25 active prod host instances route 0.0.0.0/0 here."
25594
25611
  },
25595
25612
  {
25596
- ip: "15.135.204.192",
25597
- stage: "dev",
25598
- seenAsGateway: "nat-01122e6efaf4c4eaa",
25599
- note: "Dev-stage hosts NAT, same account. 2 instances measured 2026-09-12; their host rows live in the dev Supabase project."
25613
+ ip: "54.253.255.215",
25614
+ stage: "prod",
25615
+ seenAsGateway: "nat-04384e27ab04973b5",
25616
+ note: "Prod hosts NAT in ap-southeast-2b, created 2026-09-15 by ENG-9426. The 12 prod hosts in the 2b private subnet egress here instead of crossing to 2a. Verified live after the Pulumi apply, not predicted."
25600
25617
  }
25601
25618
  ]
25602
25619
  };
@@ -46406,6 +46423,11 @@ function describeAssignHumanResult(resp, email2) {
46406
46423
  // src/artefact-source.ts
46407
46424
  var SOURCE_READBACK_MAX_CHUNKS = 128;
46408
46425
  var SOURCE_READBACK_CHUNK_BYTES = 65536;
46426
+ function codePointLength(text) {
46427
+ let n = 0;
46428
+ for (const ch of text) n += ch ? 1 : 0;
46429
+ return n;
46430
+ }
46409
46431
  async function assembleArtefactSource(fetchChunk, maxChunks = SOURCE_READBACK_MAX_CHUNKS) {
46410
46432
  const parts = [];
46411
46433
  let offset = 0;
@@ -46419,12 +46441,12 @@ async function assembleArtefactSource(fetchChunk, maxChunks = SOURCE_READBACK_MA
46419
46441
  if (data.end_of_content) break;
46420
46442
  if (data.length <= 0) {
46421
46443
  throw new Error(
46422
- `source read stalled at offset ${offset} of ${totalLength} bytes (server returned an empty chunk without signalling end of content)`
46444
+ `source read stalled at offset ${offset} of ${totalLength} characters (server returned an empty chunk without signalling end of content)`
46423
46445
  );
46424
46446
  }
46425
46447
  if (chunks >= maxChunks) {
46426
46448
  throw new Error(
46427
- `source read exceeded ${maxChunks} chunks (${totalLength} bytes reported); refusing to continue`
46449
+ `source read exceeded ${maxChunks} chunks (${totalLength} characters reported); refusing to continue`
46428
46450
  );
46429
46451
  }
46430
46452
  offset = data.offset + data.length;
@@ -46435,14 +46457,14 @@ function classifyRevision(before, after) {
46435
46457
  if (before === null || after === null) return "unknown";
46436
46458
  return before === after ? "stable" : "changed";
46437
46459
  }
46438
- function describeSourceIntegrity(bytes, totalLength, revisionState = "stable") {
46460
+ function describeSourceIntegrity(assembledChars, totalLength, revisionState = "stable") {
46439
46461
  if (revisionState === "changed") {
46440
46462
  return "WARNING: the artefact was re-published while this was being read, so the file may mix two versions - re-read it before editing, and do NOT re-publish this copy";
46441
46463
  }
46442
46464
  if (revisionState === "unknown") {
46443
- return bytes === totalLength ? "assembled OK, but UNVERIFIED: the revision marker could not be read, so we cannot confirm the artefact stayed unchanged during the read - safe to read, but re-read before re-publishing" : `WARNING: assembled ${bytes} bytes but the server reports ${totalLength}, and the revision marker could not be read - do NOT re-publish this as-is`;
46465
+ return assembledChars === totalLength ? "assembled OK, but UNVERIFIED: the revision marker could not be read, so we cannot confirm the artefact stayed unchanged during the read - safe to read, but re-read before re-publishing" : `WARNING: assembled ${assembledChars} characters but the server reports ${totalLength}, and the revision marker could not be read - do NOT re-publish this as-is`;
46444
46466
  }
46445
- return bytes === totalLength ? "complete" : `WARNING: assembled ${bytes} bytes but the server reports ${totalLength} - do NOT re-publish this as-is`;
46467
+ return assembledChars === totalLength ? "complete" : `WARNING: assembled ${assembledChars} characters but the server reports ${totalLength} - do NOT re-publish this as-is`;
46446
46468
  }
46447
46469
 
46448
46470
  // src/directory.ts
@@ -49877,7 +49899,7 @@ async function getPublishedArtefactSourceChunkText(artefactId, offset, limit) {
49877
49899
  const trailer = data.end_of_content ? "\n\n---\n(end of source)" : `
49878
49900
 
49879
49901
  ---
49880
- (more \u2014 next offset: ${data.offset + data.length}, total: ${data.total_length} bytes)`;
49902
+ (more \u2014 next offset: ${data.offset + data.length}, total: ${data.total_length} characters)`;
49881
49903
  return data.chunk + trailer;
49882
49904
  }
49883
49905
  function formatDwellMs(ms) {
@@ -49974,8 +49996,8 @@ server.tool(
49974
49996
  "Fetch ONE chunk of source HTML for a published artefact. For editing a page, prefer artefacts_get_source, which saves the whole document to a file in a single call - assembling a large document from chunks by hand costs one round trip per 64KB and puts every byte in your context.",
49975
49997
  {
49976
49998
  artefact_id: external_exports.string().uuid().describe("The artefact id returned by artefacts_list"),
49977
- offset: external_exports.number().int().min(0).describe("Byte offset into the source HTML to start from"),
49978
- limit: external_exports.number().int().min(1).max(65536).optional().describe("Max bytes to return (default 32KB, max 64KB)")
49999
+ offset: external_exports.number().int().min(0).describe('Character offset into the source HTML to start from (continue from the "next offset" the previous chunk reported)'),
50000
+ limit: external_exports.number().int().min(1).max(65536).optional().describe("Max characters to return (default 32K, max 64K)")
49979
50001
  },
49980
50002
  async (params) => ({
49981
50003
  content: [
@@ -50019,6 +50041,7 @@ async function saveArtefactSourceToFile(artefactId) {
50019
50041
  return {
50020
50042
  path: filePath,
50021
50043
  bytes: Buffer.byteLength(result.html, "utf8"),
50044
+ characters: codePointLength(result.html),
50022
50045
  totalLength: result.totalLength,
50023
50046
  chunks: result.chunks,
50024
50047
  revisionState: result.revisionState
@@ -50026,10 +50049,10 @@ async function saveArtefactSourceToFile(artefactId) {
50026
50049
  }
50027
50050
  async function saveArtefactSourceText(artefactId) {
50028
50051
  const r = await saveArtefactSourceToFile(artefactId);
50029
- const integrity = describeSourceIntegrity(r.bytes, r.totalLength, r.revisionState);
50052
+ const integrity = describeSourceIntegrity(r.characters, r.totalLength, r.revisionState);
50030
50053
  return [
50031
50054
  `Saved source HTML to ${r.path}`,
50032
- `${r.bytes} bytes in ${r.chunks} chunk(s) \u2014 ${integrity}`,
50055
+ `${r.characters} characters (${r.bytes} bytes) in ${r.chunks} chunk(s) \u2014 ${integrity}`,
50033
50056
  "Read/edit that file, then pass the edited HTML back as `content` to agt_live_publish with the same slug."
50034
50057
  ].join("\n");
50035
50058
  }
@@ -39711,7 +39711,24 @@ var composio_approved_egress_default = {
39711
39711
  "WHEN ENG-9426 LANDS THIS GOES RED UNTIL IT IS UPDATED. That is the forcing function",
39712
39712
  "working, not a fault. ENG-9426 adds a NAT in ap-southeast-2b, i.e. a THIRD egress",
39713
39713
  "address: add it here in the same change that lands it, or the detector correctly",
39714
- "reports that hosts are leaving from an address no key allows. Do not loosen the check."
39714
+ "reports that hosts are leaving from an address no key allows. Do not loosen the check.",
39715
+ "",
39716
+ " crossing to 2a and stop dying with it. The address does not exist until",
39717
+ "",
39718
+ "15.135.204.192 IS GONE AND MUST NOT BE RE-ADDED (ENG-9426, 2026-09-15).",
39719
+ "The dev NAT was retired and that address was RELEASED back to the AWS pool, so it can",
39720
+ "be reassigned to another AWS customer at any time. An allowlist entry naming it would",
39721
+ "then permit a stranger's host rather than simply failing closed. Nothing was armed when",
39722
+ "this happened, so no key ever held it - but this file IS what an operator pastes from,",
39723
+ "which is why it is removed here the same day.",
39724
+ "",
39725
+ "WHY retainOnDelete DID NOT SAVE IT, because the next person will assume it would.",
39726
+ "The option was added in the SAME change that set dev's natMode to `none`. Pulumi reads",
39727
+ "delete-time options from the STATE recorded at the resource's last registration, and by",
39728
+ "the time this ran the resource was no longer in the program at all - so the state still",
39729
+ "said 'delete normally'. retainOnDelete has to land in a deploy that STILL DECLARES the",
39730
+ "resource before it protects anything. The two prod EIPs above are protected, because",
39731
+ "this apply registered them with the option set."
39715
39732
  ],
39716
39733
  account: "711726113003",
39717
39734
  homeRegion: "ap-southeast-2",
@@ -39723,10 +39740,10 @@ var composio_approved_egress_default = {
39723
39740
  note: "Prod hosts NAT. Measured 2026-09-12 (ENG-10392): 25 of 25 active prod host instances route 0.0.0.0/0 here."
39724
39741
  },
39725
39742
  {
39726
- ip: "15.135.204.192",
39727
- stage: "dev",
39728
- seenAsGateway: "nat-01122e6efaf4c4eaa",
39729
- note: "Dev-stage hosts NAT, same account. 2 instances measured 2026-09-12; their host rows live in the dev Supabase project."
39743
+ ip: "54.253.255.215",
39744
+ stage: "prod",
39745
+ seenAsGateway: "nat-04384e27ab04973b5",
39746
+ note: "Prod hosts NAT in ap-southeast-2b, created 2026-09-15 by ENG-9426. The 12 prod hosts in the 2b private subnet egress here instead of crossing to 2a. Verified live after the Pulumi apply, not predicted."
39730
39747
  }
39731
39748
  ]
39732
39749
  };
@@ -33949,7 +33949,24 @@ var composio_approved_egress_default = {
33949
33949
  "WHEN ENG-9426 LANDS THIS GOES RED UNTIL IT IS UPDATED. That is the forcing function",
33950
33950
  "working, not a fault. ENG-9426 adds a NAT in ap-southeast-2b, i.e. a THIRD egress",
33951
33951
  "address: add it here in the same change that lands it, or the detector correctly",
33952
- "reports that hosts are leaving from an address no key allows. Do not loosen the check."
33952
+ "reports that hosts are leaving from an address no key allows. Do not loosen the check.",
33953
+ "",
33954
+ " crossing to 2a and stop dying with it. The address does not exist until",
33955
+ "",
33956
+ "15.135.204.192 IS GONE AND MUST NOT BE RE-ADDED (ENG-9426, 2026-09-15).",
33957
+ "The dev NAT was retired and that address was RELEASED back to the AWS pool, so it can",
33958
+ "be reassigned to another AWS customer at any time. An allowlist entry naming it would",
33959
+ "then permit a stranger's host rather than simply failing closed. Nothing was armed when",
33960
+ "this happened, so no key ever held it - but this file IS what an operator pastes from,",
33961
+ "which is why it is removed here the same day.",
33962
+ "",
33963
+ "WHY retainOnDelete DID NOT SAVE IT, because the next person will assume it would.",
33964
+ "The option was added in the SAME change that set dev's natMode to `none`. Pulumi reads",
33965
+ "delete-time options from the STATE recorded at the resource's last registration, and by",
33966
+ "the time this ran the resource was no longer in the program at all - so the state still",
33967
+ "said 'delete normally'. retainOnDelete has to land in a deploy that STILL DECLARES the",
33968
+ "resource before it protects anything. The two prod EIPs above are protected, because",
33969
+ "this apply registered them with the option set."
33953
33970
  ],
33954
33971
  account: "711726113003",
33955
33972
  homeRegion: "ap-southeast-2",
@@ -33961,10 +33978,10 @@ var composio_approved_egress_default = {
33961
33978
  note: "Prod hosts NAT. Measured 2026-09-12 (ENG-10392): 25 of 25 active prod host instances route 0.0.0.0/0 here."
33962
33979
  },
33963
33980
  {
33964
- ip: "15.135.204.192",
33965
- stage: "dev",
33966
- seenAsGateway: "nat-01122e6efaf4c4eaa",
33967
- note: "Dev-stage hosts NAT, same account. 2 instances measured 2026-09-12; their host rows live in the dev Supabase project."
33981
+ ip: "54.253.255.215",
33982
+ stage: "prod",
33983
+ seenAsGateway: "nat-04384e27ab04973b5",
33984
+ note: "Prod hosts NAT in ap-southeast-2b, created 2026-09-15 by ENG-9426. The 12 prod hosts in the 2b private subnet egress here instead of crossing to 2a. Verified live after the Pulumi apply, not predicted."
33968
33985
  }
33969
33986
  ]
33970
33987
  };
@@ -33967,7 +33967,24 @@ var composio_approved_egress_default = {
33967
33967
  "WHEN ENG-9426 LANDS THIS GOES RED UNTIL IT IS UPDATED. That is the forcing function",
33968
33968
  "working, not a fault. ENG-9426 adds a NAT in ap-southeast-2b, i.e. a THIRD egress",
33969
33969
  "address: add it here in the same change that lands it, or the detector correctly",
33970
- "reports that hosts are leaving from an address no key allows. Do not loosen the check."
33970
+ "reports that hosts are leaving from an address no key allows. Do not loosen the check.",
33971
+ "",
33972
+ " crossing to 2a and stop dying with it. The address does not exist until",
33973
+ "",
33974
+ "15.135.204.192 IS GONE AND MUST NOT BE RE-ADDED (ENG-9426, 2026-09-15).",
33975
+ "The dev NAT was retired and that address was RELEASED back to the AWS pool, so it can",
33976
+ "be reassigned to another AWS customer at any time. An allowlist entry naming it would",
33977
+ "then permit a stranger's host rather than simply failing closed. Nothing was armed when",
33978
+ "this happened, so no key ever held it - but this file IS what an operator pastes from,",
33979
+ "which is why it is removed here the same day.",
33980
+ "",
33981
+ "WHY retainOnDelete DID NOT SAVE IT, because the next person will assume it would.",
33982
+ "The option was added in the SAME change that set dev's natMode to `none`. Pulumi reads",
33983
+ "delete-time options from the STATE recorded at the resource's last registration, and by",
33984
+ "the time this ran the resource was no longer in the program at all - so the state still",
33985
+ "said 'delete normally'. retainOnDelete has to land in a deploy that STILL DECLARES the",
33986
+ "resource before it protects anything. The two prod EIPs above are protected, because",
33987
+ "this apply registered them with the option set."
33971
33988
  ],
33972
33989
  account: "711726113003",
33973
33990
  homeRegion: "ap-southeast-2",
@@ -33979,10 +33996,10 @@ var composio_approved_egress_default = {
33979
33996
  note: "Prod hosts NAT. Measured 2026-09-12 (ENG-10392): 25 of 25 active prod host instances route 0.0.0.0/0 here."
33980
33997
  },
33981
33998
  {
33982
- ip: "15.135.204.192",
33983
- stage: "dev",
33984
- seenAsGateway: "nat-01122e6efaf4c4eaa",
33985
- note: "Dev-stage hosts NAT, same account. 2 instances measured 2026-09-12; their host rows live in the dev Supabase project."
33999
+ ip: "54.253.255.215",
34000
+ stage: "prod",
34001
+ seenAsGateway: "nat-04384e27ab04973b5",
34002
+ note: "Prod hosts NAT in ap-southeast-2b, created 2026-09-15 by ENG-9426. The 12 prod hosts in the 2b private subnet egress here instead of crossing to 2a. Verified live after the Pulumi apply, not predicted."
33986
34003
  }
33987
34004
  ]
33988
34005
  };
@@ -62,8 +62,8 @@ import {
62
62
  writeDirectChatSessionState,
63
63
  writeEgressAllowlist,
64
64
  writePersistentClaudeWrapper
65
- } from "./chunk-UHW6YFL2.js";
66
- import "./chunk-CO3QPWIB.js";
65
+ } from "./chunk-XN5MOKSV.js";
66
+ import "./chunk-YZ5HGHPG.js";
67
67
  import "./chunk-XWVM4KPK.js";
68
68
  export {
69
69
  CLAUDE_HOST_WIDE,
@@ -130,4 +130,4 @@ export {
130
130
  writeEgressAllowlist,
131
131
  writePersistentClaudeWrapper
132
132
  };
133
- //# sourceMappingURL=persistent-session-6OAQAAWH.js.map
133
+ //# sourceMappingURL=persistent-session-523F5U4H.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-UHW6YFL2.js";
4
- import "./chunk-CO3QPWIB.js";
3
+ } from "./chunk-XN5MOKSV.js";
4
+ import "./chunk-YZ5HGHPG.js";
5
5
  import "./chunk-XWVM4KPK.js";
6
6
 
7
7
  // src/lib/responsiveness-probe.ts
@@ -799,4 +799,4 @@ export {
799
799
  readAndResetSlackReplyBindingClassifications,
800
800
  readAndResetSlackReplyTargetClassifications
801
801
  };
802
- //# sourceMappingURL=responsiveness-probe-DKYZBD3Y.js.map
802
+ //# sourceMappingURL=responsiveness-probe-CHGET573.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-CO3QPWIB.js";
3
+ } from "./chunk-YZ5HGHPG.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-IQ3WUFLF.js.map
206
+ //# sourceMappingURL=session-auth-dead-T5SUK2HT.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.944",
3
+ "version": "0.28.946",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {