@integrity-labs/agt-cli 0.28.943 → 0.28.945

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.
Files changed (23) hide show
  1. package/dist/bin/agt.js +5 -5
  2. package/dist/{chunk-44X625BP.js → chunk-U5ETXDXQ.js} +4 -4
  3. package/dist/{chunk-NB7WT7MA.js → chunk-XN5MOKSV.js} +2 -2
  4. package/dist/{chunk-HF2GMFMJ.js → chunk-YZ5HGHPG.js} +23 -6
  5. package/dist/{chunk-HF2GMFMJ.js.map → chunk-YZ5HGHPG.js.map} +1 -1
  6. package/dist/{claude-pair-runtime-7ZXVEOXN.js → claude-pair-runtime-K2J6WVEN.js} +2 -2
  7. package/dist/lib/manager-worker.js +14 -14
  8. package/dist/mcp/augmented-admin.js +9 -8
  9. package/dist/mcp/direct-chat-channel.js +22 -5
  10. package/dist/mcp/index.js +22 -5
  11. package/dist/mcp/origami.js +22 -5
  12. package/dist/mcp/slack-channel.js +22 -5
  13. package/dist/mcp/telegram-channel.js +22 -5
  14. package/dist/{persistent-session-VS57VBUF.js → persistent-session-523F5U4H.js} +3 -3
  15. package/dist/{responsiveness-probe-ZCNVWA6X.js → responsiveness-probe-CHGET573.js} +3 -3
  16. package/dist/{session-auth-dead-YDAYAWNL.js → session-auth-dead-T5SUK2HT.js} +2 -2
  17. package/package.json +1 -1
  18. /package/dist/{chunk-44X625BP.js.map → chunk-U5ETXDXQ.js.map} +0 -0
  19. /package/dist/{chunk-NB7WT7MA.js.map → chunk-XN5MOKSV.js.map} +0 -0
  20. /package/dist/{claude-pair-runtime-7ZXVEOXN.js.map → claude-pair-runtime-K2J6WVEN.js.map} +0 -0
  21. /package/dist/{persistent-session-VS57VBUF.js.map → persistent-session-523F5U4H.js.map} +0 -0
  22. /package/dist/{responsiveness-probe-ZCNVWA6X.js.map → responsiveness-probe-CHGET573.js.map} +0 -0
  23. /package/dist/{session-auth-dead-YDAYAWNL.js.map → session-auth-dead-T5SUK2HT.js.map} +0 -0
@@ -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-VS57VBUF.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-7ZXVEOXN.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-44X625BP.js";
66
+ } from "../chunk-U5ETXDXQ.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-NB7WT7MA.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-HF2GMFMJ.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-ZCNVWA6X.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.943" : "dev";
13945
+ var agtCliVersion = true ? "0.28.945" : "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-VS57VBUF.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-VS57VBUF.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-ZCNVWA6X.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-ZCNVWA6X.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-YDAYAWNL.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-ZCNVWA6X.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-VS57VBUF.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-VS57VBUF.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-7ZXVEOXN.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));
@@ -21564,6 +21564,7 @@ var queryAuditLogSchema = strictObject({
21564
21564
  since_hours: external_exports.number().int().min(1).max(720).optional().describe("Only events newer than this many hours. Omit for no time bound."),
21565
21565
  limit: limitSchema
21566
21566
  });
21567
+ var REMEDIAL_WRITE_BOUNDARY = 'REACHABILITY (ENG-10145): the approval path above exists only for an agent whose org you hold WRITE authorization on (Integrity-Labs-internal orgs, or an org a human has issued a write grant for). Against any other customer org this is refused BEFORE any approval card is created (403 when you can read the org, the uniform 404 "target agent not found" when you cannot): no request_id, nobody is paged, and debug_request_access cannot change it (it mints read grants only). Check `org_write_authorized` on debug_get_agent first. When it is false, do not call this tool and do not report a pending approval; escalate to an Integrity Labs operator with the agent id, the action you need and why. When it is null the check itself failed: that is indeterminate, not a refusal and not an authorization. This tool re-checks and may return 500 "failed to verify write authorization"; relay that error as it is, do not infer a 403/404 or claim a pending approval from it, and escalate.';
21567
21568
 
21568
21569
  // package.json
21569
21570
  var package_default = {
@@ -21654,7 +21655,7 @@ server.registerTool(
21654
21655
  );
21655
21656
  server.registerTool(
21656
21657
  "debug_get_agent",
21657
- { description: 'Fetch a composite diagnostic for ONE agent: the agent projection plus its host (heartbeat verdict, framework, EC2/auth status), its integrations, and recent alerts. The primary "why is this agent unhealthy?" read. Never returns credentials. Pass { agent_id }.\n\nThe payload carries TWO integration reads, and confusing them produces wrong root-cause (ENG-8271):\n \u2022 `effective_integrations` \u2014 the COMPLETE set the agent runs with: agent + team + ORG scope, each entry carrying `scope` ("agent" | "team" | "org") and `source_id`. Read THIS to answer "does this agent have integration X?". `effective_count` equals the manager\'s `Integrations provisioned for \'<code_name>\' (N)`, so the two reconcile; `by_scope`, `inherited_definition_ids`, `scopes_skipped`, `excluded_control_plane_only`, `shadowed_by_more_specific` and `duplicate_merge_keys` attribute any row that did not make the count.\n \u2022 `agent_integrations` \u2014 PER-AGENT rows only, kept for compatibility. Team- and org-scoped installs are ABSENT. Do NOT infer "not installed" from an absence here: an org-level install is genuinely missing from this array while being fully present on the agent. Same warning ships in-payload as `agent_integrations_note`.', inputSchema: getAgentSchema },
21658
+ { description: 'Fetch a composite diagnostic for ONE agent: the agent projection plus its host (heartbeat verdict, framework, EC2/auth status), its integrations, and recent alerts. The primary "why is this agent unhealthy?" read. Never returns credentials. Pass { agent_id }.\n\nThe payload carries TWO integration reads, and confusing them produces wrong root-cause (ENG-8271):\n \u2022 `effective_integrations` \u2014 the COMPLETE set the agent runs with: agent + team + ORG scope, each entry carrying `scope` ("agent" | "team" | "org") and `source_id`. Read THIS to answer "does this agent have integration X?". `effective_count` equals the manager\'s `Integrations provisioned for \'<code_name>\' (N)`, so the two reconcile; `by_scope`, `inherited_definition_ids`, `scopes_skipped`, `excluded_control_plane_only`, `shadowed_by_more_specific` and `duplicate_merge_keys` attribute any row that did not make the count.\n \u2022 `agent_integrations` \u2014 PER-AGENT rows only, kept for compatibility. Team- and org-scoped installs are ABSENT. Do NOT infer "not installed" from an absence here: an org-level install is genuinely missing from this array while being fully present on the agent. Same warning ships in-payload as `agent_integrations_note`.\n\n`org_write_authorized` (ENG-10145) says whether this agent\'s org passes the write-authorization check that every HITL-gated remedial tool (debug_resume_agent, debug_restart_agent, request_action, request_config_update, request_ssm_run, debug_replay_dead_letter, request_clear_restart_request) runs first: false means every one of them is refused with a 403 before an approval card exists (404 only if your read access lapsed in between), so escalate to an Integrity Labs operator instead. true means only that this check passes; write mode, token capability and approval routing are still checked at call time. null means the check itself failed: indeterminate, not a refusal, and a remedial call may then return 500 "failed to verify write authorization" - relay that, never report a pending approval, and escalate. `org_write_authorized_note` explains it in-payload.', inputSchema: getAgentSchema },
21658
21659
  async (args) => {
21659
21660
  try {
21660
21661
  const result = await client.getAgent(args.agent_id);
@@ -21866,7 +21867,7 @@ server.registerTool(
21866
21867
  );
21867
21868
  server.registerTool(
21868
21869
  "request_clear_restart_request",
21869
- { description: "Request a HITL-gated CLEAR of a STUCK restart request \u2014 cancel a restart the manager never acked (listed by debug_inspect_restart_requests) and resolve its agent_restart_stuck alert. Use it to clear a restart signal wedged open for hours/days/weeks. This is NOT a restart and NOT a host action: it nulls the agent's `restart_requested_at` signal in the central DB and closes the alert/incident; the agent keeps running as-is, no in-flight work is destroyed. Reversible \u2014 request a fresh restart afterwards if one is still needed. A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). Async: returns { request_id, status, write_mode, notification_status }; after approval, poll check_action_status (result_payload carries { cleared_bindings, alert_closed }). Pass { target_agent_id, reason }.", inputSchema: clearRestartRequestSchema },
21870
+ { description: "Request a HITL-gated CLEAR of a STUCK restart request \u2014 cancel a restart the manager never acked (listed by debug_inspect_restart_requests) and resolve its agent_restart_stuck alert. Use it to clear a restart signal wedged open for hours/days/weeks. This is NOT a restart and NOT a host action: it nulls the agent's `restart_requested_at` signal in the central DB and closes the alert/incident; the agent keeps running as-is, no in-flight work is destroyed. Reversible \u2014 request a fresh restart afterwards if one is still needed. A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). Async: returns { request_id, status, write_mode, notification_status }; after approval, poll check_action_status (result_payload carries { cleared_bindings, alert_closed }). Pass { target_agent_id, reason }. " + REMEDIAL_WRITE_BOUNDARY, inputSchema: clearRestartRequestSchema },
21870
21871
  async (args) => {
21871
21872
  try {
21872
21873
  const result = await client.requestClearRestartRequest({
@@ -21908,7 +21909,7 @@ server.registerTool(
21908
21909
  );
21909
21910
  server.registerTool(
21910
21911
  "request_action",
21911
- { description: `Request a HITL-gated remedial action on a customer agent: "restart" (bounce the agent \u2014 reversible, backlog replays) or "clear_pending_inbound" (move stuck pending-inbound markers aside \u2014 drops queued inbound messages, NOT reprocessed). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage; in shadow mode the approval runs but nothing executes. Returns { request_id, status, write_mode, notification_status }. Surface a brief, jargon-free note to the user (e.g. "I've asked an admin to approve restarting that agent"). Pass { action, target_agent_id, reason }.`, inputSchema: requestActionSchema },
21912
+ { description: `Request a HITL-gated remedial action on a customer agent: "restart" (bounce the agent \u2014 reversible, backlog replays) or "clear_pending_inbound" (move stuck pending-inbound markers aside \u2014 drops queued inbound messages, NOT reprocessed). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage; in shadow mode the approval runs but nothing executes. Returns { request_id, status, write_mode, notification_status }. Only when the response is status "pending" with a request_id, surface a brief, jargon-free note to the user (e.g. "I've asked an admin to approve restarting that agent"); on a refusal (403/404/409/503) or any other result nothing was filed, so relay that outcome instead and never say an approval was requested. Pass { action, target_agent_id, reason }. ` + REMEDIAL_WRITE_BOUNDARY, inputSchema: requestActionSchema },
21912
21913
  async (args) => {
21913
21914
  try {
21914
21915
  const result = await client.requestAction(args.action, {
@@ -21923,7 +21924,7 @@ server.registerTool(
21923
21924
  );
21924
21925
  server.registerTool(
21925
21926
  "debug_restart_agent",
21926
- { description: `Request a HITL-gated RESTART of a customer agent \u2014 bounce its session so the manager respawns it on the next poll (reversible; the inbound backlog replays). Use this to recover a wedged agent or to make it pick up a newly-bound integration/config change. NOT for a PAUSED agent: a paused agent's manager does not respawn it, so a restart against one does nothing at all - use \`debug_resume_agent\`, which is the only tool that ends a pause (ENG-9343). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage; in shadow mode the approval runs but nothing executes. Org-agnostic: keyed on the agent's host assignment, so it works cross-org without an active-org dependency. This is the same path as request_action({ action: "restart" }), exposed as a dedicated tool for discoverability. Returns { request_id, status, write_mode, notification_status }. Surface a brief, jargon-free note to the user (e.g. "I've asked an admin to approve restarting that agent"). Pass { target_agent_id, reason }.`, inputSchema: restartAgentSchema },
21927
+ { description: `Request a HITL-gated RESTART of a customer agent \u2014 bounce its session so the manager respawns it on the next poll (reversible; the inbound backlog replays). Use this to recover a wedged agent or to make it pick up a newly-bound integration/config change. NOT for a PAUSED agent: a paused agent's manager does not respawn it, so a restart against one does nothing at all - use \`debug_resume_agent\`, which is the only tool that ends a pause (ENG-9343). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage; in shadow mode the approval runs but nothing executes. Org-agnostic: keyed on the agent's host assignment, so it works cross-org without an active-org dependency. This is the same path as request_action({ action: "restart" }), exposed as a dedicated tool for discoverability. Returns { request_id, status, write_mode, notification_status }. Only when the response is status "pending" with a request_id, surface a brief, jargon-free note to the user (e.g. "I've asked an admin to approve restarting that agent"); on a refusal (403/404/409/503) or any other result nothing was filed, so relay that outcome instead and never say an approval was requested. Pass { target_agent_id, reason }. ` + REMEDIAL_WRITE_BOUNDARY, inputSchema: restartAgentSchema },
21927
21928
  async (args) => {
21928
21929
  try {
21929
21930
  const result = await client.requestAction("restart", {
@@ -21938,7 +21939,7 @@ server.registerTool(
21938
21939
  );
21939
21940
  server.registerTool(
21940
21941
  "debug_resume_agent",
21941
- { description: 'Request a HITL-gated END to a customer agent\'s CIRCUIT-BREAKER pause - flip it back to active so its manager respawns it, close the agent_paused alert, and clear any pending restart request. This is the ONLY tool that ends a pause; debug_restart_agent does NOT, because a paused agent\'s manager never respawns it, so a restart against a paused agent is a no-op. SCOPE: it touches ONLY pauses whose reason is `circuit_breaker`. A "manual" pause (a person clicked Pause) and an "hourly_cost_exceeded" pause (a budget guard) are refused with a 409 - do not retry those, escalate to a human. BEFORE YOU CALL IT: the approval card names the breaker\'s trip reason and count and flags when that condition still appears to hold (e.g. other agents on the same host tripping on the same driver), so write a `reason` that addresses the driver, not just the downtime - the approver is deciding "resume DESPITE day-rollover=3", not "resume". Resuming while the driver is still live just re-trips the breaker and the agent flaps instead of failing cleanly. A HUMAN must approve in Slack, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). Returns { request_id, status, write_mode, trip_driver, trip_count, precondition_verdict, precondition_signals, notification_status }; after approval, poll check_action_status (result_payload carries { resumed, alert_closed, cleared_restart_bindings } or { resumed: false, not_eligible }). Pass { target_agent_id, reason }.', inputSchema: resumeAgentSchema },
21942
+ { description: 'Request a HITL-gated END to a customer agent\'s CIRCUIT-BREAKER pause - flip it back to active so its manager respawns it, close the agent_paused alert, and clear any pending restart request. This is the ONLY tool that ends a pause; debug_restart_agent does NOT, because a paused agent\'s manager never respawns it, so a restart against a paused agent is a no-op. SCOPE: it touches ONLY pauses whose reason is `circuit_breaker`. A "manual" pause (a person clicked Pause) and an "hourly_cost_exceeded" pause (a budget guard) are refused with a 409 - do not retry those, escalate to a human. BEFORE YOU CALL IT: the approval card names the breaker\'s trip reason and count and flags when that condition still appears to hold (e.g. other agents on the same host tripping on the same driver), so write a `reason` that addresses the driver, not just the downtime - the approver is deciding "resume DESPITE day-rollover=3", not "resume". Resuming while the driver is still live just re-trips the breaker and the agent flaps instead of failing cleanly. A HUMAN must approve in Slack, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). Returns { request_id, status, write_mode, trip_driver, trip_count, precondition_verdict, precondition_signals, notification_status }; after approval, poll check_action_status (result_payload carries { resumed, alert_closed, cleared_restart_bindings } or { resumed: false, not_eligible }). Pass { target_agent_id, reason }. ' + REMEDIAL_WRITE_BOUNDARY, inputSchema: resumeAgentSchema },
21942
21943
  async (args) => {
21943
21944
  try {
21944
21945
  const result = await client.requestResumeAgent({
@@ -21953,7 +21954,7 @@ server.registerTool(
21953
21954
  );
21954
21955
  server.registerTool(
21955
21956
  "request_config_update",
21956
- { description: "Request a HITL-gated change to a customer agent's model config (primary/secondary/tertiary_model). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). The change is reversible and applies at the agent's NEXT session launch after /host/refresh \u2014 it does not restart the agent. The new value is validated against the agent before approval is requested: Claude Code (subscription) agents take a family alias (fable/opus/opus[fast]/sonnet/haiku); routed agents take a full stored model id (e.g. openrouter/anthropic/claude-opus-4-6). Use this to fix a misconfigured model (e.g. an agent wedged on a model its auth can't access). Returns { request_id, status, write_mode, notification_status }. Pass { target_agent_id, field, new_value, reason }.", inputSchema: requestConfigUpdateSchema },
21957
+ { description: "Request a HITL-gated change to a customer agent's model config (primary/secondary/tertiary_model). A HUMAN must approve in Slack before anything happens, and only if writes are armed for this stage (shadow mode runs the approval but executes nothing). The change is reversible and applies at the agent's NEXT session launch after /host/refresh \u2014 it does not restart the agent. The new value is validated against the agent before approval is requested: Claude Code (subscription) agents take a family alias (fable/opus/opus[fast]/sonnet/haiku); routed agents take a full stored model id (e.g. openrouter/anthropic/claude-opus-4-6). Use this to fix a misconfigured model (e.g. an agent wedged on a model its auth can't access). Returns { request_id, status, write_mode, notification_status }. Pass { target_agent_id, field, new_value, reason }. " + REMEDIAL_WRITE_BOUNDARY, inputSchema: requestConfigUpdateSchema },
21957
21958
  async (args) => {
21958
21959
  try {
21959
21960
  const result = await client.requestConfigUpdate({
@@ -21970,7 +21971,7 @@ server.registerTool(
21970
21971
  );
21971
21972
  server.registerTool(
21972
21973
  "request_ssm_run",
21973
- { description: "Request a HITL-gated, ALLOWLISTED read-only DIAGNOSTIC command on a customer agent's host over SSM \u2014 the escape hatch for host/process/service facts the typed read tools (debug_get_agent, debug_tail_logs, debug_host_versions) don't cover. A HUMAN must approve the EXACT command in Slack before it runs, and only if writes are armed (shadow mode runs the approval but executes nothing). This is NOT a shell: `command` is a CLOSED enum \u2014 host_health (uptime/df/free), manager_status (systemctl status agt-manager), manager_journal (journalctl -n 200), process_list (ps comm-only, no argv/env), agent_dir (ls -la ~/.augmented/<code_name>/, names only). No free-form commands, no file-content reads (use debug_tail_logs for log contents). Async: returns { request_id, status, write_mode, command_key, resolved_command, notification_status }; after approval, poll check_action_status to read the command OUTPUT in result_payload. Pass { target_agent_id, command, reason }.", inputSchema: requestSsmRunSchema },
21974
+ { description: "Request a HITL-gated, ALLOWLISTED read-only DIAGNOSTIC command on a customer agent's host over SSM \u2014 the escape hatch for host/process/service facts the typed read tools (debug_get_agent, debug_tail_logs, debug_host_versions) don't cover. A HUMAN must approve the EXACT command in Slack before it runs, and only if writes are armed (shadow mode runs the approval but executes nothing). This is NOT a shell: `command` is a CLOSED enum \u2014 host_health (uptime/df/free), manager_status (systemctl status agt-manager), manager_journal (journalctl -n 200), process_list (ps comm-only, no argv/env), agent_dir (ls -la ~/.augmented/<code_name>/, names only). No free-form commands, no file-content reads (use debug_tail_logs for log contents). Async: returns { request_id, status, write_mode, command_key, resolved_command, notification_status }; after approval, poll check_action_status to read the command OUTPUT in result_payload. Pass { target_agent_id, command, reason }. " + REMEDIAL_WRITE_BOUNDARY, inputSchema: requestSsmRunSchema },
21974
21975
  async (args) => {
21975
21976
  try {
21976
21977
  const result = await client.requestSsmRun({
@@ -21986,7 +21987,7 @@ server.registerTool(
21986
21987
  );
21987
21988
  server.registerTool(
21988
21989
  "debug_replay_dead_letter",
21989
- { description: "Request a HITL-gated REPLAY of ONE dead-lettered inbound \u2014 re-inject a customer message that was parked on the host (listed by debug_inspect_dead_letters) back into the agent's live inbound so it is reprocessed. This is the inverse of clear_pending_inbound: use it to recover a message a wedged agent missed. A HUMAN must approve in Slack before anything happens, and only if writes are armed (shadow mode runs the approval but executes nothing). The marker is matched on the host by the exact (channel, store, marker_name) you pass \u2014 copy them verbatim from the inspect result \u2014 so a stale or wrong selector safely no-ops (`replayed:false, reason:not_found`) rather than moving the wrong message. Async: returns { request_id, status, write_mode, notification_status }; after approval, poll check_action_status (result_payload carries { replayed, moved_to }). Pass { target_agent_id, channel, store, marker_name, reason }.", inputSchema: replayDeadLetterSchema },
21990
+ { description: "Request a HITL-gated REPLAY of ONE dead-lettered inbound \u2014 re-inject a customer message that was parked on the host (listed by debug_inspect_dead_letters) back into the agent's live inbound so it is reprocessed. This is the inverse of clear_pending_inbound: use it to recover a message a wedged agent missed. A HUMAN must approve in Slack before anything happens, and only if writes are armed (shadow mode runs the approval but executes nothing). The marker is matched on the host by the exact (channel, store, marker_name) you pass \u2014 copy them verbatim from the inspect result \u2014 so a stale or wrong selector safely no-ops (`replayed:false, reason:not_found`) rather than moving the wrong message. Async: returns { request_id, status, write_mode, notification_status }; after approval, poll check_action_status (result_payload carries { replayed, moved_to }). Pass { target_agent_id, channel, store, marker_name, reason }. " + REMEDIAL_WRITE_BOUNDARY, inputSchema: replayDeadLetterSchema },
21990
21991
  async (args) => {
21991
21992
  try {
21992
21993
  const result = await client.requestReplayDeadLetter({
@@ -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
  };
@@ -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-NB7WT7MA.js";
66
- import "./chunk-HF2GMFMJ.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-VS57VBUF.js.map
133
+ //# sourceMappingURL=persistent-session-523F5U4H.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-NB7WT7MA.js";
4
- import "./chunk-HF2GMFMJ.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-ZCNVWA6X.js.map
802
+ //# sourceMappingURL=responsiveness-probe-CHGET573.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  sessionTranscriptDir
3
- } from "./chunk-HF2GMFMJ.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-YDAYAWNL.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.943",
3
+ "version": "0.28.945",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {