@integrity-labs/agt-cli 0.28.297 → 0.28.298

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.
@@ -18,7 +18,7 @@ import {
18
18
  resolveConnectivityProbe,
19
19
  worseConnectivityOutcome,
20
20
  wrapScheduledTaskPrompt
21
- } from "./chunk-QXU5FMXN.js";
21
+ } from "./chunk-5LUVY4P6.js";
22
22
  import {
23
23
  parsePsRows
24
24
  } from "./chunk-XWVM4KPK.js";
@@ -5882,7 +5882,7 @@ function requireHost() {
5882
5882
  }
5883
5883
 
5884
5884
  // src/lib/api-client.ts
5885
- var agtCliVersion = true ? "0.28.297" : "dev";
5885
+ var agtCliVersion = true ? "0.28.298" : "dev";
5886
5886
  var lastConfigHash = null;
5887
5887
  function setConfigHash(hash) {
5888
5888
  lastConfigHash = hash && hash.length > 0 ? hash : null;
@@ -8181,4 +8181,4 @@ export {
8181
8181
  managerInstallSystemUnitCommand,
8182
8182
  managerUninstallSystemUnitCommand
8183
8183
  };
8184
- //# sourceMappingURL=chunk-VTSO7X7P.js.map
8184
+ //# sourceMappingURL=chunk-EF42DMMK.js.map
@@ -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-A5N7BYS3.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-ZQUFIWLK.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-BIBIVB7I.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-UTQO3G5A.js.map
@@ -39,7 +39,7 @@ import {
39
39
  requireHost,
40
40
  safeWriteJsonAtomic,
41
41
  setConfigHash
42
- } from "../chunk-VTSO7X7P.js";
42
+ } from "../chunk-EF42DMMK.js";
43
43
  import {
44
44
  getProjectDir as getProjectDir2,
45
45
  getReadyTasks,
@@ -126,7 +126,7 @@ import {
126
126
  takeZombieDetection,
127
127
  transcriptActivityAgeSeconds,
128
128
  writeEgressAllowlist
129
- } from "../chunk-QXU5FMXN.js";
129
+ } from "../chunk-5LUVY4P6.js";
130
130
  import {
131
131
  reapOrphanChannelMcps
132
132
  } from "../chunk-XWVM4KPK.js";
@@ -6947,7 +6947,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
6947
6947
  var lastVersionCheckAt = 0;
6948
6948
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
6949
6949
  var lastResponsivenessProbeAt = 0;
6950
- var agtCliVersion = true ? "0.28.297" : "dev";
6950
+ var agtCliVersion = true ? "0.28.298" : "dev";
6951
6951
  function resolveBrewPath(execFileSync2) {
6952
6952
  try {
6953
6953
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -7802,7 +7802,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
7802
7802
  if (codeNames.length === 0) return;
7803
7803
  void (async () => {
7804
7804
  try {
7805
- const { collectDiagnostics } = await import("../persistent-session-A5N7BYS3.js");
7805
+ const { collectDiagnostics } = await import("../persistent-session-ZQUFIWLK.js");
7806
7806
  await api.post("/host/heartbeat", {
7807
7807
  host_id: hostId,
7808
7808
  agent_diagnostics: collectDiagnostics(codeNames)
@@ -7900,7 +7900,7 @@ async function pollCycle() {
7900
7900
  }
7901
7901
  try {
7902
7902
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
7903
- const { collectDiagnostics } = await import("../persistent-session-A5N7BYS3.js");
7903
+ const { collectDiagnostics } = await import("../persistent-session-ZQUFIWLK.js");
7904
7904
  const diagCodeNames = [...agentState.persistentSessionAgents];
7905
7905
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
7906
7906
  let tailscaleHostname;
@@ -8048,7 +8048,7 @@ async function pollCycle() {
8048
8048
  const {
8049
8049
  collectResponsivenessProbes,
8050
8050
  getResponsivenessIntervalMs
8051
- } = await import("../responsiveness-probe-OZP2HO2F.js");
8051
+ } = await import("../responsiveness-probe-BFB2G333.js");
8052
8052
  const probeIntervalMs = getResponsivenessIntervalMs();
8053
8053
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
8054
8054
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -8080,7 +8080,7 @@ async function pollCycle() {
8080
8080
  collectResponsivenessProbes,
8081
8081
  livePendingInboundOldestAgeSeconds,
8082
8082
  parkPendingInbound
8083
- } = await import("../responsiveness-probe-OZP2HO2F.js");
8083
+ } = await import("../responsiveness-probe-BFB2G333.js");
8084
8084
  const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
8085
8085
  const wedgeNow = /* @__PURE__ */ new Date();
8086
8086
  const liveAgents = agentState.persistentSessionAgents;
@@ -11051,7 +11051,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
11051
11051
  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}`));
11052
11052
  void (async () => {
11053
11053
  try {
11054
- const { collectDiagnostics } = await import("../persistent-session-A5N7BYS3.js");
11054
+ const { collectDiagnostics } = await import("../persistent-session-ZQUFIWLK.js");
11055
11055
  await api.post("/host/heartbeat", {
11056
11056
  host_id: hostId,
11057
11057
  agent_diagnostics: collectDiagnostics([codeName])
@@ -11101,7 +11101,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
11101
11101
  }
11102
11102
  try {
11103
11103
  const hostId = await getHostId();
11104
- const { collectDiagnostics } = await import("../persistent-session-A5N7BYS3.js");
11104
+ const { collectDiagnostics } = await import("../persistent-session-ZQUFIWLK.js");
11105
11105
  await api.post("/host/heartbeat", {
11106
11106
  host_id: hostId,
11107
11107
  agent_diagnostics: collectDiagnostics([codeName])
@@ -11506,7 +11506,7 @@ async function processClaudePairSessions(agents) {
11506
11506
  killPairSession,
11507
11507
  pairTmuxSession,
11508
11508
  finalizeClaudePairOnboarding
11509
- } = await import("../claude-pair-runtime-BIBIVB7I.js");
11509
+ } = await import("../claude-pair-runtime-UTQO3G5A.js");
11510
11510
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
11511
11511
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
11512
11512
  const killed = await killPairSession(pairTmuxSession(pairId));
package/dist/mcp/index.js CHANGED
@@ -22533,6 +22533,9 @@ server.tool(
22533
22533
  "Short form title (max 24 chars - the Slack modal title limit), shown on the button and as the modal heading. Put longer context in intro."
22534
22534
  ),
22535
22535
  intro: external_exports.string().max(1e3).optional().describe("Optional context shown above the button and inside the modal (what you are asking and why)."),
22536
+ button_label: external_exports.string().min(1).max(75).optional().describe(
22537
+ 'Optional label for the button that opens the form (max 75 chars). Defaults to "Fill out form". Use a specific call-to-action so the person knows what they are opening, e.g. "Start intake", "Give feedback", "Book a slot", "Submit your update".'
22538
+ ),
22536
22539
  schema: external_exports.record(external_exports.unknown()).describe(
22537
22540
  'The form definition as a constrained JSON Schema: { "type": "object", "properties": { "<field>": { "type": "string|number|integer|boolean|array", "enum"?: [...], "format"?: "date|time|date-time|email|uri", ... } }, "required": ["..."] }. Flat only - no nested objects or oneOf/anyOf/allOf.'
22538
22541
  ),
@@ -22555,6 +22558,7 @@ server.tool(
22555
22558
  ...params.thread_ts ? { thread_ts: params.thread_ts } : {},
22556
22559
  title: params.title,
22557
22560
  ...params.intro ? { intro: params.intro } : {},
22561
+ ...params.button_label ? { button_label: params.button_label } : {},
22558
22562
  schema: params.schema,
22559
22563
  ...params.request_id ? { request_id: params.request_id } : {}
22560
22564
  });
@@ -38842,7 +38842,10 @@ var INTEGRATION_REGISTRY = [
38842
38842
  note: "Billed per second of generated video; the rate depends on the resolution.",
38843
38843
  meters: [
38844
38844
  { event_type: "grok_imagine_video_1_5_480p", unit: "second" },
38845
- { event_type: "grok_imagine_video_1_5_720p", unit: "second" }
38845
+ { event_type: "grok_imagine_video_1_5_720p", unit: "second" },
38846
+ // 1080p is image-to-video only (xAI restriction); metered when the
38847
+ // agent supplies image_url (ENG-7675).
38848
+ { event_type: "grok_imagine_video_1_5_1080p", unit: "second" }
38846
38849
  ]
38847
38850
  }
38848
38851
  },
@@ -40115,6 +40118,41 @@ var FLAG_REGISTRY = [
40115
40118
  // safety control, so mutations require explicit confirmation.
40116
40119
  sensitive: true
40117
40120
  },
40121
+ {
40122
+ key: "composio-hitl-mode",
40123
+ description: "Composio managed-toolkits HITL gate (ENG-6027): off = kill switch, shadow = resolve + audit the tier decision but never block, enforce = block write_high_risk+ calls (routed to approval when hitl-approval-routing is on). Per-org rollout from the admin Feature Flags page; ENG-7672 migrated this off the fleet-wide COMPOSIO_HITL_MODE env var.",
40124
+ flagType: "enum",
40125
+ allowedValues: ["off", "shadow", "enforce"],
40126
+ // Declared safe value is `shadow` (resolve + audit, never block) — NOT `off`.
40127
+ // shadow keeps the control evaluating + producing enforce-flip evidence while
40128
+ // staying non-blocking, and matches the pre-flag compiled default so migrating
40129
+ // onto the flag (ENG-7672) preserves fleet behaviour. A flag-DB read error
40130
+ // degrades here. `enforce` is the deliberate, audited flip.
40131
+ defaultValue: "shadow",
40132
+ // Migration override (ADR-0022): the pre-flags env gate stays the
40133
+ // highest-precedence operator override. It is only injected onto the Lambdas
40134
+ // when an operator explicitly sets it (sst.config.ts) — otherwise this flag governs.
40135
+ envVar: "COMPOSIO_HITL_MODE",
40136
+ // enforce blocks prod tool calls, so weakening it (enforce → shadow/off) drops a
40137
+ // safety control — mutations require explicit confirmation.
40138
+ sensitive: true
40139
+ },
40140
+ {
40141
+ key: "hitl-approval-routing",
40142
+ description: "Routing for HITL-blocked integration calls (ENG-6028): off = blocked calls return the terminal block, on = route them into the approval-core flow (approval_requests row + Slack approval card). Needs a block first (composio-hitl-mode=enforce, or the always-on Direct-HTTP lane). Per-org rollout; ENG-7672 migrated this off the fleet-wide HITL_APPROVAL_ROUTING env var.",
40143
+ flagType: "enum",
40144
+ allowedValues: ["off", "on"],
40145
+ // Declared safe value is `off` (terminal block, no new side effects) — the
40146
+ // most-restrictive-known state, matching the pre-flag default. A flag-DB read
40147
+ // error degrades here.
40148
+ defaultValue: "off",
40149
+ // Migration override (ADR-0022): only injected onto the Lambdas when an operator
40150
+ // explicitly sets it (sst.config.ts) — otherwise this flag governs.
40151
+ envVar: "HITL_APPROVAL_ROUTING",
40152
+ // Turning routing on starts minting approval cards / approval_requests rows — an
40153
+ // egress + workflow change worth an explicit confirm.
40154
+ sensitive: true
40155
+ },
40118
40156
  {
40119
40157
  key: "slack-reply-binding",
40120
40158
  description: "Slack reply-target binding (ENG-7396 / WS2, cross-thread reply routing): the model names which inbound it answers (inbound_id) and the server resolves the destination from its own verified record. shadow = classify + count only, routing unchanged; warn = same routing plus a tool-result note so the model self-corrects; enforce = route a bound reply to the registry thread and REJECT a reply whose target matches no inbound this process delivered. The channel server can't evaluate flags, so the manager materializes the resolved value into the AGT_SLACK_REPLY_BINDING spawn env (the operator/canary override, ADR-0022). Ships shadow.",
@@ -15629,7 +15629,8 @@ var SLACK_EGRESS_TOOLS = /* @__PURE__ */ new Set([
15629
15629
  "slack.react",
15630
15630
  "slack.send_structured",
15631
15631
  "slack.ask_user",
15632
- "slack.upload_file"
15632
+ "slack.upload_file",
15633
+ "slack.update"
15633
15634
  ]);
15634
15635
 
15635
15636
  // src/strip-repost-preamble.ts
@@ -20417,6 +20418,25 @@ mcp.setRequestHandler(ListToolsRequestSchema, async () => ({
20417
20418
  required: ["channel", "timestamp", "emoji"]
20418
20419
  }
20419
20420
  },
20421
+ {
20422
+ name: "slack.update",
20423
+ description: 'Edit the text of a Slack message YOU already sent (Slack chat.update). Pass the channel and the message\'s ts (slack.reply returns it as `(ts=\u2026)` on a successful send) plus the new text. You can only edit your OWN messages. This REPLACES the message text - any block layout on the original is cleared - so use it to correct a typo or update a message in place instead of posting a new one. NOTE: editing an interim "On it\u2026" into the final answer does NOT clear the pending-reply obligation - your final answer must still be a separate slack.reply (interim omitted). Common Slack errors: message_not_found (wrong ts/channel), cant_update_message (not your message), edit_window_closed.',
20424
+ inputSchema: {
20425
+ type: "object",
20426
+ properties: {
20427
+ channel: {
20428
+ type: "string",
20429
+ description: "Slack channel ID the message is in (the same channel you sent it to)."
20430
+ },
20431
+ ts: {
20432
+ type: "string",
20433
+ description: 'Timestamp of the message to edit - the `ts` value slack.reply returned when you sent it (e.g. "1783902864.258519"). Must be a message the bot itself sent.'
20434
+ },
20435
+ text: { type: "string", description: "The new message text. Replaces the existing text." }
20436
+ },
20437
+ required: ["channel", "ts", "text"]
20438
+ }
20439
+ },
20420
20440
  {
20421
20441
  name: "slack.read_thread",
20422
20442
  description: "Read the full message history of a Slack thread. Inbound thread replies already carry the surrounding thread inline as the <channel> tag's thread_context attribute \u2014 ground your reply in that first, and only call this tool when you need MORE history than thread_context shows (it is capped to recent messages) or to catch up on an auto-followed thread.",
@@ -20820,8 +20840,10 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
20820
20840
  }
20821
20841
  })();
20822
20842
  }
20843
+ const base = bindingFeedback ? `sent. ${bindingFeedback}` : "sent";
20844
+ const sentTs = typeof data.ts === "string" ? data.ts : void 0;
20823
20845
  return {
20824
- content: [{ type: "text", text: bindingFeedback ? `sent. ${bindingFeedback}` : "sent" }]
20846
+ content: [{ type: "text", text: sentTs ? `${base} (ts=${sentTs})` : base }]
20825
20847
  };
20826
20848
  } catch (err) {
20827
20849
  return {
@@ -20868,6 +20890,40 @@ mcp.setRequestHandler(CallToolRequestSchema, async (req) => {
20868
20890
  };
20869
20891
  }
20870
20892
  }
20893
+ if (name === "slack.update") {
20894
+ const { channel, ts, text } = args;
20895
+ if (!channel || !ts || typeof text !== "string") {
20896
+ return {
20897
+ content: [{ type: "text", text: "slack.update requires channel, ts and text" }],
20898
+ isError: true
20899
+ };
20900
+ }
20901
+ try {
20902
+ const res = await fetch("https://slack.com/api/chat.update", {
20903
+ method: "POST",
20904
+ headers: {
20905
+ "Content-Type": "application/json; charset=utf-8",
20906
+ Authorization: `Bearer ${BOT_TOKEN}`
20907
+ },
20908
+ // text only: chat.update replaces the message, clearing any prior blocks.
20909
+ body: JSON.stringify({ channel, ts, text }),
20910
+ signal: AbortSignal.timeout(8e3)
20911
+ });
20912
+ const data = await res.json();
20913
+ if (!data.ok) {
20914
+ return {
20915
+ content: [{ type: "text", text: `Slack error: ${data.error}` }],
20916
+ isError: true
20917
+ };
20918
+ }
20919
+ return { content: [{ type: "text", text: "updated" }] };
20920
+ } catch (err) {
20921
+ return {
20922
+ content: [{ type: "text", text: `Failed: ${err.message}` }],
20923
+ isError: true
20924
+ };
20925
+ }
20926
+ }
20871
20927
  if (name === "slack.read_thread") {
20872
20928
  const { channel, thread_ts, limit: rawLimit } = args;
20873
20929
  const limit = Math.min(Math.max(rawLimit ?? 50, 1), 200);
@@ -36,7 +36,7 @@ import {
36
36
  writeDirectChatSessionState,
37
37
  writeEgressAllowlist,
38
38
  writePersistentClaudeWrapper
39
- } from "./chunk-QXU5FMXN.js";
39
+ } from "./chunk-5LUVY4P6.js";
40
40
  import "./chunk-XWVM4KPK.js";
41
41
  export {
42
42
  EGRESS_BASELINE_DOMAINS,
@@ -77,4 +77,4 @@ export {
77
77
  writeEgressAllowlist,
78
78
  writePersistentClaudeWrapper
79
79
  };
80
- //# sourceMappingURL=persistent-session-A5N7BYS3.js.map
80
+ //# sourceMappingURL=persistent-session-ZQUFIWLK.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-QXU5FMXN.js";
3
+ } from "./chunk-5LUVY4P6.js";
4
4
  import "./chunk-XWVM4KPK.js";
5
5
 
6
6
  // src/lib/responsiveness-probe.ts
@@ -418,4 +418,4 @@ export {
418
418
  readAndResetSlackReplyBindingClassifications,
419
419
  readAndResetSlackReplyTargetClassifications
420
420
  };
421
- //# sourceMappingURL=responsiveness-probe-OZP2HO2F.js.map
421
+ //# sourceMappingURL=responsiveness-probe-BFB2G333.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.297",
3
+ "version": "0.28.298",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {