@integrity-labs/agt-cli 0.28.256 → 0.28.257

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-EKXNGE5B.js");
103
+ const { resolveClaudeBinary } = await import("./persistent-session-W4K5XKD7.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-EE3MXQHY.js.map
376
+ //# sourceMappingURL=claude-pair-runtime-HM6XZJWB.js.map
@@ -37,7 +37,7 @@ import {
37
37
  requireHost,
38
38
  safeWriteJsonAtomic,
39
39
  setConfigHash
40
- } from "../chunk-YAPZYRH4.js";
40
+ } from "../chunk-FKVH7UZA.js";
41
41
  import {
42
42
  getProjectDir as getProjectDir2,
43
43
  getReadyTasks,
@@ -122,7 +122,7 @@ import {
122
122
  takeZombieDetection,
123
123
  transcriptActivityAgeSeconds,
124
124
  writeEgressAllowlist
125
- } from "../chunk-GFX74FGP.js";
125
+ } from "../chunk-L2GVB37X.js";
126
126
  import {
127
127
  reapOrphanChannelMcps
128
128
  } from "../chunk-XWVM4KPK.js";
@@ -6669,7 +6669,7 @@ var agentRestartTimezoneInputs = /* @__PURE__ */ new Map();
6669
6669
  var lastVersionCheckAt = 0;
6670
6670
  var VERSION_CHECK_INTERVAL_MS = 5 * 60 * 1e3;
6671
6671
  var lastResponsivenessProbeAt = 0;
6672
- var agtCliVersion = true ? "0.28.256" : "dev";
6672
+ var agtCliVersion = true ? "0.28.257" : "dev";
6673
6673
  function resolveBrewPath(execFileSync2) {
6674
6674
  try {
6675
6675
  const out = execFileSync2("which", ["brew"], { timeout: 5e3 }).toString().trim();
@@ -7519,7 +7519,7 @@ function flushRestartedAgentDiagnostics(hostId, codeNames) {
7519
7519
  if (codeNames.length === 0) return;
7520
7520
  void (async () => {
7521
7521
  try {
7522
- const { collectDiagnostics } = await import("../persistent-session-EKXNGE5B.js");
7522
+ const { collectDiagnostics } = await import("../persistent-session-W4K5XKD7.js");
7523
7523
  await api.post("/host/heartbeat", {
7524
7524
  host_id: hostId,
7525
7525
  agent_diagnostics: collectDiagnostics(codeNames)
@@ -7617,7 +7617,7 @@ async function pollCycle() {
7617
7617
  }
7618
7618
  try {
7619
7619
  const { detectHostSecurity } = await import("../host-security-6PDFG7F5.js");
7620
- const { collectDiagnostics } = await import("../persistent-session-EKXNGE5B.js");
7620
+ const { collectDiagnostics } = await import("../persistent-session-W4K5XKD7.js");
7621
7621
  const diagCodeNames = [...agentState.persistentSessionAgents];
7622
7622
  const agentDiagnostics = diagCodeNames.length > 0 ? collectDiagnostics(diagCodeNames) : void 0;
7623
7623
  let tailscaleHostname;
@@ -7765,7 +7765,7 @@ async function pollCycle() {
7765
7765
  const {
7766
7766
  collectResponsivenessProbes,
7767
7767
  getResponsivenessIntervalMs
7768
- } = await import("../responsiveness-probe-DE6TIHJZ.js");
7768
+ } = await import("../responsiveness-probe-Y4FBRFRW.js");
7769
7769
  const probeIntervalMs = getResponsivenessIntervalMs();
7770
7770
  if (now - lastResponsivenessProbeAt > probeIntervalMs) {
7771
7771
  const probeCodeNames = [...agentState.persistentSessionAgents];
@@ -7797,7 +7797,7 @@ async function pollCycle() {
7797
7797
  collectResponsivenessProbes,
7798
7798
  livePendingInboundOldestAgeSeconds,
7799
7799
  parkPendingInbound
7800
- } = await import("../responsiveness-probe-DE6TIHJZ.js");
7800
+ } = await import("../responsiveness-probe-Y4FBRFRW.js");
7801
7801
  const { getProjectDir: wedgeProjectDir } = await import("../claude-scheduler-FATCLHDM.js");
7802
7802
  const wedgeNow = /* @__PURE__ */ new Date();
7803
7803
  const liveAgents = agentState.persistentSessionAgents;
@@ -10623,7 +10623,7 @@ async function handleRestartDoorbell(agentId, requestedAt, restartReason) {
10623
10623
  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}`));
10624
10624
  void (async () => {
10625
10625
  try {
10626
- const { collectDiagnostics } = await import("../persistent-session-EKXNGE5B.js");
10626
+ const { collectDiagnostics } = await import("../persistent-session-W4K5XKD7.js");
10627
10627
  await api.post("/host/heartbeat", {
10628
10628
  host_id: hostId,
10629
10629
  agent_diagnostics: collectDiagnostics([codeName])
@@ -10673,7 +10673,7 @@ async function respawnAgentAfterMcpStop(codeName, reason) {
10673
10673
  }
10674
10674
  try {
10675
10675
  const hostId = await getHostId();
10676
- const { collectDiagnostics } = await import("../persistent-session-EKXNGE5B.js");
10676
+ const { collectDiagnostics } = await import("../persistent-session-W4K5XKD7.js");
10677
10677
  await api.post("/host/heartbeat", {
10678
10678
  host_id: hostId,
10679
10679
  agent_diagnostics: collectDiagnostics([codeName])
@@ -11064,7 +11064,7 @@ async function processClaudePairSessions(agents) {
11064
11064
  killPairSession,
11065
11065
  pairTmuxSession,
11066
11066
  finalizeClaudePairOnboarding
11067
- } = await import("../claude-pair-runtime-EE3MXQHY.js");
11067
+ } = await import("../claude-pair-runtime-HM6XZJWB.js");
11068
11068
  for (const pairId of pendingResp.cancelled_pair_ids ?? []) {
11069
11069
  log(`[claude-pair] sweeping orphan tmux session for pair ${pairId.slice(0, 8)}`);
11070
11070
  const killed = await killPairSession(pairTmuxSession(pairId));
package/dist/mcp/index.js CHANGED
@@ -21426,21 +21426,27 @@ function describeAssignHumanResult(resp, email2) {
21426
21426
  }
21427
21427
 
21428
21428
  // src/directory.ts
21429
- function formatDirectoryResult(data, query) {
21429
+ function formatDirectoryResult(data, query, slackUserId) {
21430
21430
  const agents = data.agents ?? [];
21431
21431
  const people = data.people ?? [];
21432
21432
  if (agents.length === 0 && people.length === 0) {
21433
+ if (slackUserId) {
21434
+ return {
21435
+ text: `No agent or person in your directory matches Slack id ${slackUserId}. Either they are not someone you're authorised to see, or they haven't linked their Slack account. Do not guess who it is.`
21436
+ };
21437
+ }
21433
21438
  return {
21434
21439
  text: query ? `No agents or people match "${query}" in your directory.` : "No agents or people are visible in your directory."
21435
21440
  };
21436
21441
  }
21442
+ const slackTag = (id) => id ? ` \u2014 Slack <@${id}>` : "";
21437
21443
  const agentLines = agents.map((a) => {
21438
21444
  const scope = a.same_team ? "your team" : `team ${a.team_slug}`;
21439
21445
  const assignHint = a.same_team ? `kanban_assign target_agent="${a.code_name}"` : `kanban_assign target_agent="${a.code_name}" target_team="${a.team_slug}"`;
21440
- return ` \u2022 ${a.code_name} (${a.display_name}) - ${scope} [${a.team_name}] \u2192 ${assignHint}`;
21446
+ return ` \u2022 ${a.code_name} (${a.display_name}) - ${scope} [${a.team_name}]${slackTag(a.slack_user_id)} \u2192 ${assignHint}`;
21441
21447
  });
21442
21448
  const peopleLines = people.map(
21443
- (p) => ` \u2022 ${p.name ?? p.email} <${p.email}> \u2192 assign_kanban_to_human assignee_email="${p.email}"`
21449
+ (p) => ` \u2022 ${p.name ?? p.email} <${p.email}>${slackTag(p.slack_user_id)} \u2192 assign_kanban_to_human assignee_email="${p.email}"`
21444
21450
  );
21445
21451
  const sections = [];
21446
21452
  if (agents.length > 0) sections.push(`Agents (${agents.length}):
@@ -21940,19 +21946,23 @@ server.tool(
21940
21946
  );
21941
21947
  server.tool(
21942
21948
  "directory_lookup",
21943
- "Look up the AGENTS and PEOPLE you are allowed to see, so you can find the identifiers the assignment + messaging tools need. Returns each agent's code_name + team slug (use these as `target_agent` / `target_team` for kanban_assign) and each person's name + email (use the email as `assignee_email` for assign_kanban_to_human). Your own team is always included; other teams in your organization appear only when your org has enabled cross-team work. Pass an optional `query` to filter by name, code_name, team, or email. If someone is not in the results, you are not authorised to act on them, so do not guess identifiers.",
21949
+ "Look up the AGENTS and PEOPLE you are allowed to see, so you can find the identifiers the assignment + messaging tools need. Returns each agent's code_name + team slug (use these as `target_agent` / `target_team` for kanban_assign) and each person's name + email (use the email as `assignee_email` for assign_kanban_to_human), plus their linked Slack id when known. Your own team is always included; other teams in your organization appear only when your org has enabled cross-team work. Pass an optional `query` to filter by name, code_name, team, or email. Pass `slack_user_id` to resolve a raw Slack @-mention id (e.g. `U0BEUAYRR0V` or `<@U0BEUAYRR0V>`, which is all you receive when someone @-mentions a teammate) to that agent or person. If someone is not in the results, you are not authorised to act on them, so do not guess identifiers.",
21944
21950
  {
21945
- query: external_exports.string().trim().min(1).optional().describe("Optional case-insensitive filter on agent code_name / name / team, or person name / email.")
21951
+ query: external_exports.string().trim().min(1).optional().describe("Optional case-insensitive filter on agent code_name / name / team, or person name / email."),
21952
+ slack_user_id: external_exports.string().trim().min(1).optional().describe(
21953
+ "Optional Slack USER id to resolve to a teammate agent/person. Accepts a bare id (`U0BEUAYRR0V`), a mention (`<@U0BEUAYRR0V>`), or a labelled mention (`<@U0BEUAYRR0V|ada>`). Returns only the match(es) in your authorised directory, or a clear not-found."
21954
+ )
21946
21955
  },
21947
21956
  async (params) => {
21948
21957
  try {
21949
21958
  const data = await apiPost("/host/directory/lookup", {
21950
21959
  agent_id: AGT_AGENT_ID,
21951
- // `.trim().min(1)` already rejects a whitespace-only query; the truthy
21952
- // check keeps the wire body free of an empty query either way.
21953
- ...params.query ? { query: params.query } : {}
21960
+ // `.trim().min(1)` already rejects a whitespace-only value; the truthy
21961
+ // checks keep the wire body free of empty fields either way.
21962
+ ...params.query ? { query: params.query } : {},
21963
+ ...params.slack_user_id ? { slack_user_id: params.slack_user_id } : {}
21954
21964
  });
21955
- const { text } = formatDirectoryResult(data, params.query);
21965
+ const { text } = formatDirectoryResult(data, params.query, params.slack_user_id);
21956
21966
  return { content: [{ type: "text", text }] };
21957
21967
  } catch (err) {
21958
21968
  const msg = err instanceof Error ? err.message : String(err);
@@ -38694,11 +38694,18 @@ var INTEGRATION_REGISTRY = [
38694
38694
  // ENG-7089: instrumental music generation for Augmented Live. Surfaced as the
38695
38695
  // agt_live.generate_music tool; shares this one platform account key + the
38696
38696
  // same per-org budget.
38697
- { id: "elevenlabs:music", name: "Generate Music", description: "Compose an instrumental MP3 music track from a text prompt for an Augmented Live page via ElevenLabs Music (agt_live.generate_music)", access: "write" }
38697
+ { id: "elevenlabs:music", name: "Generate Music", description: "Compose an instrumental MP3 music track from a text prompt for an Augmented Live page via ElevenLabs Music (agt_live.generate_music)", access: "write" },
38698
+ // ENG-7453: sound-effects + speech-to-speech, surfaced as general brokered
38699
+ // agent tools (elevenlabs_generate_sound_effect, elevenlabs_speech_to_speech
38700
+ // in scribe-broker.ts) available to any agent - not Augmented-Live-only.
38701
+ // Both share this one platform account key + the same per-org budget.
38702
+ { id: "elevenlabs:sound_effects", name: "Generate Sound Effects", description: "Generate a sound-effect MP3 from a text prompt via ElevenLabs (elevenlabs_generate_sound_effect)", access: "write" },
38703
+ { id: "elevenlabs:speech_to_speech", name: "Convert Speech to Speech", description: "Re-voice an uploaded audio clip in a target voice and return an MP3 via ElevenLabs speech-to-speech (elevenlabs_speech_to_speech)", access: "write" }
38698
38704
  ],
38699
- // Capabilities index — covers speech-to-text, text-to-speech, and music, since
38700
- // the integration now advertises elevenlabs:transcribe, elevenlabs:tts, and
38701
- // elevenlabs:music.
38705
+ // Capabilities index — covers speech-to-text, text-to-speech, music, sound
38706
+ // effects, and speech-to-speech, since the integration now advertises
38707
+ // elevenlabs:transcribe, elevenlabs:tts, elevenlabs:music,
38708
+ // elevenlabs:sound_effects, and elevenlabs:speech_to_speech.
38702
38709
  docs_url: "https://elevenlabs.io/docs/capabilities",
38703
38710
  beta: true,
38704
38711
  // ENG-7005 / ENG-7048: premium (billable). Both surfaces bill back to
@@ -38708,14 +38715,18 @@ var INTEGRATION_REGISTRY = [
38708
38715
  // amounts live in integration_rate_cards; this only declares the model.
38709
38716
  premium: {
38710
38717
  pricing: "usage",
38711
- note: "Billed on audio transcribed (per second), voiceover synthesized (per character), and music generated (per second).",
38712
- // ENG-7032: each surface meters its own event in its own physical unit; the
38713
- // matching integration_rate_cards rows price them. Until a rate is seeded,
38714
- // that event prices at 0.
38718
+ note: "Billed on audio transcribed (per second), voiceover synthesized (per character), music/sound-effects generated and speech-to-speech converted (per second of output audio).",
38719
+ // ENG-7032 / ENG-7453: each surface meters its own event in its own physical
38720
+ // unit; the matching integration_rate_cards rows price them. Until a rate is
38721
+ // seeded, that event prices at 0. Sound-effects and speech-to-speech meter
38722
+ // in seconds of OUTPUT audio (derived from the returned MP3 byte size at the
38723
+ // fixed 128 kbps output bitrate) at the broker chokepoint.
38715
38724
  meters: [
38716
38725
  { event_type: "transcribe", unit: "audio_second" },
38717
38726
  { event_type: "tts", unit: "character" },
38718
- { event_type: "music", unit: "second" }
38727
+ { event_type: "music", unit: "second" },
38728
+ { event_type: "sound_effects", unit: "second" },
38729
+ { event_type: "speech_to_speech", unit: "second" }
38719
38730
  ]
38720
38731
  }
38721
38732
  },
@@ -36,7 +36,7 @@ import {
36
36
  writeDirectChatSessionState,
37
37
  writeEgressAllowlist,
38
38
  writePersistentClaudeWrapper
39
- } from "./chunk-GFX74FGP.js";
39
+ } from "./chunk-L2GVB37X.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-EKXNGE5B.js.map
80
+ //# sourceMappingURL=persistent-session-W4K5XKD7.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  paneLogPath
3
- } from "./chunk-GFX74FGP.js";
3
+ } from "./chunk-L2GVB37X.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-DE6TIHJZ.js.map
421
+ //# sourceMappingURL=responsiveness-probe-Y4FBRFRW.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integrity-labs/agt-cli",
3
- "version": "0.28.256",
3
+ "version": "0.28.257",
4
4
  "description": "Augmented Team CLI — agent provisioning and management",
5
5
  "type": "module",
6
6
  "engines": {