@integrity-labs/agt-cli 0.28.905 → 0.28.907

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-TPADZX4C.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-ZOEBA7KM.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-UZPPOEIB.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-A36CKF54.js.map
@@ -63,7 +63,7 @@ import {
63
63
  safeWriteJsonAtomic,
64
64
  setConfigHash,
65
65
  tripClass
66
- } from "../chunk-YA7AXSKP.js";
66
+ } from "../chunk-GBQRH5RE.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-2LV6SJ7W.js";
139
+ } from "../chunk-I2PUWPUR.js";
140
140
  import {
141
141
  ACCOUNT_ENFORCEMENT_MARKER_FILENAME,
142
142
  AnchorSessionClient,
@@ -231,7 +231,7 @@ import {
231
231
  subagentActivityAgeSeconds,
232
232
  sumTranscriptUsageInWindow,
233
233
  transcriptActivityAgeSeconds
234
- } from "../chunk-Q2GQY64J.js";
234
+ } from "../chunk-N47GH7MJ.js";
235
235
  import {
236
236
  reapOrphanChannelMcps
237
237
  } from "../chunk-XWVM4KPK.js";
@@ -13053,7 +13053,7 @@ var pendingDayRolloverReset = /* @__PURE__ */ new Set();
13053
13053
  var dayRolloverInboundHold = /* @__PURE__ */ new Map();
13054
13054
  var INBOUND_HOLD_EPISODE_GAP_MS = 12e4;
13055
13055
  async function channelInboundActivityAgeSecondsFor(codeName) {
13056
- const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-P2L74AKB.js");
13056
+ const { newestPendingInboundActivityMtimeMs } = await import("../responsiveness-probe-BNQIJAFF.js");
13057
13057
  const newest = newestPendingInboundActivityMtimeMs(dirname11(paneLogPath(codeName)));
13058
13058
  if (newest === null) return null;
13059
13059
  return Math.max(0, Math.floor((Date.now() - newest) / 1e3));
@@ -13721,7 +13721,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
13721
13721
  var lastVersionCheckAt = 0;
13722
13722
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
13723
13723
  var lastResponsivenessProbeAt = 0;
13724
- var agtCliVersion = true ? "0.28.905" : "dev";
13724
+ var agtCliVersion = true ? "0.28.907" : "dev";
13725
13725
  function resolveBrewPath(execFileSync2) {
13726
13726
  try {
13727
13727
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -15311,7 +15311,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
15311
15311
  if (codeNames.length === 0) return;
15312
15312
  void (async () => {
15313
15313
  try {
15314
- const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
15314
+ const { collectDiagnostics } = await import("../persistent-session-ZOEBA7KM.js");
15315
15315
  await api.post("/host/heartbeat", {
15316
15316
  host_id: hostId,
15317
15317
  agent_diagnostics: collectDiagnostics(codeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -15453,7 +15453,7 @@ async function pollCycleInner() {
15453
15453
  }
15454
15454
  try {
15455
15455
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
15456
- const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
15456
+ const { collectDiagnostics } = await import("../persistent-session-ZOEBA7KM.js");
15457
15457
  const diagCodeNames = [...agentState.persistentSessionAgents];
15458
15458
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames, quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor) : void 0;
15459
15459
  let tailscaleHostname;
@@ -15622,7 +15622,7 @@ async function pollCycleInner() {
15622
15622
  collectPanelessActivityProbes,
15623
15623
  getResponsivenessIntervalMs,
15624
15624
  occupancyQualificationClassifications
15625
- } = await import("../responsiveness-probe-P2L74AKB.js");
15625
+ } = await import("../responsiveness-probe-BNQIJAFF.js");
15626
15626
  const probeIntervalMs = getResponsivenessIntervalMs();
15627
15627
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
15628
15628
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -15739,7 +15739,7 @@ async function pollCycleInner() {
15739
15739
  collectResponsivenessProbes,
15740
15740
  livePendingInboundOldestAgeSeconds,
15741
15741
  parkPendingInbound
15742
- } = await import("../responsiveness-probe-P2L74AKB.js");
15742
+ } = await import("../responsiveness-probe-BNQIJAFF.js");
15743
15743
  const { getProjectDir: wedgeProjectDir } = await import("../scheduler-engine-NDP36U7O.js");
15744
15744
  const wedgeNow = /* @__PURE__ */ new Date();
15745
15745
  const liveAgents = agentState.persistentSessionAgents;
@@ -15895,7 +15895,7 @@ async function pollCycleInner() {
15895
15895
  }
15896
15896
  try {
15897
15897
  const { scrapeMcpFailedBannerCount } = await import("../pane-mcp-banner-scraper-JA437JIB.js");
15898
- const { probeSessionAuth } = await import("../session-auth-dead-YKD22CHZ.js");
15898
+ const { probeSessionAuth } = await import("../session-auth-dead-TAAZTRTD.js");
15899
15899
  const observations = [];
15900
15900
  const pendingCacheCommits = [];
15901
15901
  const modelApiErrorReportingOn = hostFlagStore().getBoolean("model-api-error-reporting");
@@ -20153,7 +20153,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20153
20153
  try {
20154
20154
  const freshId = rotateSessionForWedge(codeName);
20155
20155
  consecutiveWedgeCycles.delete(codeName);
20156
- const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-P2L74AKB.js");
20156
+ const { parkPendingInbound: parkForRestart } = await import("../responsiveness-probe-BNQIJAFF.js");
20157
20157
  const { parked, deadLettered } = parkForRestart(codeName, /* @__PURE__ */ new Date());
20158
20158
  const parkNote = parked > 0 ? `, ${parked} inbound parked` : "";
20159
20159
  const deadNote = deadLettered > 0 ? `, ${deadLettered} undeliverable dead-lettered` : "";
@@ -20196,7 +20196,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
20196
20196
  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}`));
20197
20197
  void (async () => {
20198
20198
  try {
20199
- const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
20199
+ const { collectDiagnostics } = await import("../persistent-session-ZOEBA7KM.js");
20200
20200
  await api.post("/host/heartbeat", {
20201
20201
  host_id: hostId,
20202
20202
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20247,7 +20247,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
20247
20247
  }
20248
20248
  try {
20249
20249
  const hostId = await getHostId();
20250
- const { collectDiagnostics } = await import("../persistent-session-TPADZX4C.js");
20250
+ const { collectDiagnostics } = await import("../persistent-session-ZOEBA7KM.js");
20251
20251
  await api.post("/host/heartbeat", {
20252
20252
  host_id: hostId,
20253
20253
  agent_diagnostics: collectDiagnostics([codeName], quarantineEntriesFor, claudeMdSizeFor, spawnOutcomeForDiagnostics, pidPressureFor, forwardedToolsFor)
@@ -20889,7 +20889,7 @@ async function processClaudePairSessions(agents) {
20889
20889
  killPairSession,
20890
20890
  pairTmuxSession,
20891
20891
  finalizeClaudePairOnboarding
20892
- } = await import("../claude-pair-runtime-UZPPOEIB.js");
20892
+ } = await import("../claude-pair-runtime-A36CKF54.js");
20893
20893
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
20894
20894
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
20895
20895
  const killed = await killPairSession(pairTmuxSession(pairId));
@@ -21877,7 +21877,7 @@ server.registerTool(
21877
21877
  );
21878
21878
  server.registerTool(
21879
21879
  "debug_query_audit_log",
21880
- { description: 'Read recent audit events to troubleshoot why/when agents bounced \u2014 primarily restart events. Defaults to the "agent.restart" action: each event returns { id, created_at, action, actor_kind, user_id, agent_id, organization_id, source, reason, detail, code_name, impersonated, impersonated_by_user_id, impersonated_agent_id, impersonation_session_id } \u2014 `user_id` is the identity the action was performed AS, `agent_id` the agent it was performed ON, `impersonated_by_user_id` the operator who was actually driving a user-impersonation session, and `impersonated_agent_id` the agent identity an operator was driving in the agent-impersonation flow (the two flows are distinct and a row carries at most one). `source` is the restart trigger (agent-self-request, channel-command, maintenance-window, stale-mcp, hot-reload-mcp, mcp-presence-reaper, day-rollover, auth-tuple-change, \u2026) and `reason` is the free-text rationale when one was given (e.g. the agent\'s own words for a request_restart). `detail` (ENG-8293) is the structured "what changed?" payload, null for sources that don\'t emit one. For `auth-tuple-change` it is { auth_tuple: { changed[], unchanged[], components[] } } naming WHICH credential/identity component moved and its before/after fingerprint \u2014 the auth tuple is deliberately NOT keyed on the rotating access token, so an auth-tuple-change is always a genuine credential or identity change, and `detail.auth_tuple.changed` is how you tell which one. Comparing `components[].to` across agents answers whether a restart WAVE was one control-plane push (same new value everywhere) or coincidental per-agent rotations. Two modes: (1) pass { agent_id } to scope to ONE agent (fails closed if you\'re not authorized for its org) \u2014 use when a specific agent went quiet. (2) OMIT agent_id for a CROSS-AGENT sweep across every org you\'re authorized for (optionally narrow with { org_id }) \u2014 use to spot fleet-wide restart storms or compare agents. Filter the action with `action` (pass "all" to drop the action filter and read every event type), and bound with { since_hours?, limit? }. Cross-agent results are org-walled in SQL; unauthorized orgs are invisible. ENG-9079 \u2014 IMPERSONATION: `user_id` is the identity an action was performed AS, which is not always who performed it. When `impersonated` is true an Integrity Labs operator was driving: `impersonated_by_user_id` is that operator and `impersonation_session_id` joins every action in the same session. `actor_kind` does NOT distinguish these \u2014 an impersonated user action still reads `user`, so read `impersonated`, not `actor_kind`, to answer "was this really the customer?". Two caveats an investigator must hold: rows written before ENG-9018 shipped (17 Aug 06:04Z) carry NULL because the information was never captured, so absence there is not evidence of a genuine customer action; and a small number of audit writers are still unthreaded, so `impersonated: false` on a recent row means "not recorded as impersonated", not "proven genuine".', inputSchema: queryAuditLogSchema },
21880
+ { description: 'Read recent audit events to troubleshoot why/when agents bounced \u2014 primarily restart events. Defaults to the "agent.restart" action: each event returns { id, created_at, action, actor_kind, user_id, agent_id, organization_id, source, reason, detail, code_name, impersonated, impersonated_by_user_id, impersonated_agent_id, impersonation_session_id } \u2014 `user_id` is the identity the action was performed AS, `agent_id` the agent it was performed ON, `impersonated_by_user_id` the operator who was actually driving a user-impersonation session, and `impersonated_agent_id` the agent identity an operator was driving in the agent-impersonation flow (the two flows are distinct and a row carries at most one). `source` is the restart trigger (agent-self-request, channel-command, maintenance-window, stale-mcp, hot-reload-mcp, mcp-presence-reaper, day-rollover, auth-tuple-change, \u2026) and `reason` is the free-text rationale when one was given (e.g. the agent\'s own words for a request_restart). `detail` (ENG-8293) is the structured "what changed?" payload, null for sources that don\'t emit one. For `auth-tuple-change` it is { auth_tuple: { changed[], unchanged[], components[] } } naming WHICH credential/identity component moved and its before/after fingerprint \u2014 the auth tuple is deliberately NOT keyed on the rotating access token, so an auth-tuple-change is always a genuine credential or identity change, and `detail.auth_tuple.changed` is how you tell which one. Comparing `components[].to` across agents answers whether a restart WAVE was one control-plane push (same new value everywhere) or coincidental per-agent rotations. Two modes: (1) pass { agent_id } to scope to ONE agent (fails closed if you\'re not authorized for its org) \u2014 use when a specific agent went quiet. (2) OMIT agent_id for a CROSS-AGENT sweep across every org you\'re authorized for (optionally narrow with { org_id }) \u2014 use to spot fleet-wide restart storms or compare agents. Filter the action with `action` (pass "all" to drop the action filter and read every event type), and bound with { since_hours?, limit? }. Cross-agent results are org-walled in SQL; unauthorized orgs are invisible. ENG-9079 \u2014 IMPERSONATION: `user_id` is the identity an action was performed AS, which is not always who performed it. When `impersonated` is true an Integrity Labs operator was driving: `impersonated_by_user_id` is that operator and `impersonation_session_id` joins every action in the same session. `actor_kind` does NOT distinguish these \u2014 an impersonated user action still reads `user`, so read `impersonated`, not `actor_kind`, to answer "was this really the customer?". One caveat an investigator must hold: rows written before ENG-9018 shipped (17 Aug 06:04Z) carry NULL because the information was never captured, so absence there is not evidence of a genuine customer action. From ENG-9210 (13 Sep) every audit writer REACHABLE during an impersonation session is threaded, so on a row written after that, `impersonated: false` means the action was genuinely not impersonated. Writers that remain unthreaded are all classified `unreachable` \u2014 they cannot execute during an impersonation session at all (host-JWT and agent-MCP paths), so a NULL from them is correct rather than merely unrecorded.', inputSchema: queryAuditLogSchema },
21881
21881
  async (args) => {
21882
21882
  try {
21883
21883
  const result = await client.queryAuditLog(args);
@@ -62,8 +62,8 @@ import {
62
62
  writeDirectChatSessionState,
63
63
  writeEgressAllowlist,
64
64
  writePersistentClaudeWrapper
65
- } from "./chunk-2LV6SJ7W.js";
66
- import "./chunk-Q2GQY64J.js";
65
+ } from "./chunk-I2PUWPUR.js";
66
+ import "./chunk-N47GH7MJ.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-TPADZX4C.js.map
133
+ //# sourceMappingURL=persistent-session-ZOEBA7KM.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-2LV6SJ7W.js";
4
- import "./chunk-Q2GQY64J.js";
3
+ } from "./chunk-I2PUWPUR.js";
4
+ import "./chunk-N47GH7MJ.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-P2L74AKB.js.map
802
+ //# sourceMappingURL=responsiveness-probe-BNQIJAFF.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-Q2GQY64J.js";
3
+ } from "./chunk-N47GH7MJ.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-YKD22CHZ.js.map
206
+ //# sourceMappingURL=session-auth-dead-TAAZTRTD.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.905",
3
+ "version": "0.28.907",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {