@openacp/cli 0.6.6 → 0.6.8

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 (68) hide show
  1. package/dist/{adapter-RKK7A5GI.js → adapter-7GY3N4ZH.js} +9 -9
  2. package/dist/{admin-SCP25TN2.js → admin-2HAFXQBG.js} +6 -4
  3. package/dist/{chunk-WVMSP4AF.js → chunk-2J2RBYWN.js} +2 -2
  4. package/dist/{chunk-ZKTIZME6.js → chunk-47B7GNOE.js} +2 -2
  5. package/dist/{chunk-XVL6AGMG.js → chunk-5OVPEDUB.js} +2 -2
  6. package/dist/{chunk-AHPRT3RY.js → chunk-5SXG7X5D.js} +523 -251
  7. package/dist/chunk-5SXG7X5D.js.map +1 -0
  8. package/dist/{chunk-F3AICYO4.js → chunk-JHYXKVV2.js} +19 -1
  9. package/dist/chunk-JHYXKVV2.js.map +1 -0
  10. package/dist/{chunk-FCLGYYTY.js → chunk-JUYDFUSN.js} +224 -2
  11. package/dist/chunk-JUYDFUSN.js.map +1 -0
  12. package/dist/{chunk-774Y4RAK.js → chunk-KIRH7TUJ.js} +94 -24
  13. package/dist/chunk-KIRH7TUJ.js.map +1 -0
  14. package/dist/{chunk-4GQ3I65A.js → chunk-LBIKITQT.js} +1 -2
  15. package/dist/{chunk-4GQ3I65A.js.map → chunk-LBIKITQT.js.map} +1 -1
  16. package/dist/{chunk-ZMVVW3BK.js → chunk-LO4Y5WQ7.js} +127 -18
  17. package/dist/chunk-LO4Y5WQ7.js.map +1 -0
  18. package/dist/{chunk-3IRAWHMC.js → chunk-MZXWCDBU.js} +3 -3
  19. package/dist/{chunk-YQRF3IOR.js → chunk-O7CPGUAI.js} +2 -2
  20. package/dist/{chunk-7KZI2236.js → chunk-RHE2JSYE.js} +2 -2
  21. package/dist/{chunk-3ZO3MHZN.js → chunk-SHHMBGB3.js} +4 -3
  22. package/dist/chunk-SHHMBGB3.js.map +1 -0
  23. package/dist/{chunk-JV6XQRAE.js → chunk-XANPHG7W.js} +2 -2
  24. package/dist/{chunk-PJVKOZTR.js → chunk-YEOY2PBJ.js} +2 -2
  25. package/dist/cli.js +21 -21
  26. package/dist/{config-B26J3XXN.js → config-CQAS6YHR.js} +2 -2
  27. package/dist/{config-editor-QTGUK3CD.js → config-editor-37BM56WF.js} +4 -4
  28. package/dist/{config-registry-7I6GGDOY.js → config-registry-HDXFES2D.js} +2 -2
  29. package/dist/{daemon-5DS5BQXJ.js → daemon-K33ZPSEZ.js} +3 -3
  30. package/dist/{discord-QKT3JMRW.js → discord-VOHXRTCH.js} +113 -131
  31. package/dist/discord-VOHXRTCH.js.map +1 -0
  32. package/dist/{doctor-QQ3YZEYV.js → doctor-HASEBMUD.js} +4 -4
  33. package/dist/doctor-W4VGLDVM.js +9 -0
  34. package/dist/index.d.ts +25 -9
  35. package/dist/index.js +11 -11
  36. package/dist/{main-B5L3DD3Y.js → main-DUXVFTDD.js} +19 -19
  37. package/dist/{new-session-K6UCWYOP.js → new-session-NHK7TOEW.js} +3 -3
  38. package/dist/{settings-RRF77IC4.js → settings-6TF4WIGJ.js} +3 -3
  39. package/dist/{setup-5ZKSUR26.js → setup-RJCEB6FS.js} +3 -3
  40. package/package.json +1 -16
  41. package/dist/chunk-3ZO3MHZN.js.map +0 -1
  42. package/dist/chunk-774Y4RAK.js.map +0 -1
  43. package/dist/chunk-AHPRT3RY.js.map +0 -1
  44. package/dist/chunk-F3AICYO4.js.map +0 -1
  45. package/dist/chunk-FCLGYYTY.js.map +0 -1
  46. package/dist/chunk-ZMVVW3BK.js.map +0 -1
  47. package/dist/discord-QKT3JMRW.js.map +0 -1
  48. package/dist/doctor-6SUCVUZB.js +0 -9
  49. /package/dist/{adapter-RKK7A5GI.js.map → adapter-7GY3N4ZH.js.map} +0 -0
  50. /package/dist/{admin-SCP25TN2.js.map → admin-2HAFXQBG.js.map} +0 -0
  51. /package/dist/{chunk-WVMSP4AF.js.map → chunk-2J2RBYWN.js.map} +0 -0
  52. /package/dist/{chunk-ZKTIZME6.js.map → chunk-47B7GNOE.js.map} +0 -0
  53. /package/dist/{chunk-XVL6AGMG.js.map → chunk-5OVPEDUB.js.map} +0 -0
  54. /package/dist/{chunk-3IRAWHMC.js.map → chunk-MZXWCDBU.js.map} +0 -0
  55. /package/dist/{chunk-YQRF3IOR.js.map → chunk-O7CPGUAI.js.map} +0 -0
  56. /package/dist/{chunk-7KZI2236.js.map → chunk-RHE2JSYE.js.map} +0 -0
  57. /package/dist/{chunk-JV6XQRAE.js.map → chunk-XANPHG7W.js.map} +0 -0
  58. /package/dist/{chunk-PJVKOZTR.js.map → chunk-YEOY2PBJ.js.map} +0 -0
  59. /package/dist/{config-B26J3XXN.js.map → config-CQAS6YHR.js.map} +0 -0
  60. /package/dist/{config-editor-QTGUK3CD.js.map → config-editor-37BM56WF.js.map} +0 -0
  61. /package/dist/{config-registry-7I6GGDOY.js.map → config-registry-HDXFES2D.js.map} +0 -0
  62. /package/dist/{daemon-5DS5BQXJ.js.map → daemon-K33ZPSEZ.js.map} +0 -0
  63. /package/dist/{doctor-6SUCVUZB.js.map → doctor-HASEBMUD.js.map} +0 -0
  64. /package/dist/{doctor-QQ3YZEYV.js.map → doctor-W4VGLDVM.js.map} +0 -0
  65. /package/dist/{main-B5L3DD3Y.js.map → main-DUXVFTDD.js.map} +0 -0
  66. /package/dist/{new-session-K6UCWYOP.js.map → new-session-NHK7TOEW.js.map} +0 -0
  67. /package/dist/{settings-RRF77IC4.js.map → settings-6TF4WIGJ.js.map} +0 -0
  68. /package/dist/{setup-5ZKSUR26.js.map → setup-RJCEB6FS.js.map} +0 -0
@@ -7,15 +7,16 @@ import {
7
7
  handleNew,
8
8
  handleNewChat,
9
9
  handleNewSessionButton
10
- } from "./chunk-JV6XQRAE.js";
10
+ } from "./chunk-XANPHG7W.js";
11
11
  import {
12
12
  handleDangerous,
13
13
  handleDangerousButton,
14
14
  handleRestart,
15
15
  handleTTS,
16
16
  handleTTSButton,
17
- handleUpdate
18
- } from "./chunk-774Y4RAK.js";
17
+ handleUpdate,
18
+ handleVerbosity
19
+ } from "./chunk-KIRH7TUJ.js";
19
20
  import {
20
21
  handleCancel,
21
22
  handleCleanupButton,
@@ -39,21 +40,31 @@ import {
39
40
  import {
40
41
  handleSettings,
41
42
  handleSettingsButton
42
- } from "./chunk-YQRF3IOR.js";
43
+ } from "./chunk-O7CPGUAI.js";
43
44
  import {
44
45
  handleDoctor,
45
46
  handleDoctorButton
46
- } from "./chunk-7KZI2236.js";
47
+ } from "./chunk-RHE2JSYE.js";
47
48
  import {
48
49
  PRODUCT_GUIDE,
49
- dispatchMessage
50
- } from "./chunk-FCLGYYTY.js";
51
- import "./chunk-PJVKOZTR.js";
50
+ STATUS_ICONS,
51
+ dispatchMessage,
52
+ evaluateNoise,
53
+ extractContentText,
54
+ formatTokens,
55
+ formatToolSummary,
56
+ formatToolTitle,
57
+ progressBar,
58
+ splitMessage,
59
+ stripCodeFences,
60
+ truncateContent
61
+ } from "./chunk-JUYDFUSN.js";
62
+ import "./chunk-YEOY2PBJ.js";
52
63
  import {
53
64
  ChannelAdapter
54
- } from "./chunk-4GQ3I65A.js";
55
- import "./chunk-F3AICYO4.js";
56
- import "./chunk-3ZO3MHZN.js";
65
+ } from "./chunk-LBIKITQT.js";
66
+ import "./chunk-JHYXKVV2.js";
67
+ import "./chunk-SHHMBGB3.js";
57
68
  import {
58
69
  log
59
70
  } from "./chunk-GAK6PIBW.js";
@@ -129,71 +140,36 @@ var DiscordSendQueue = class {
129
140
  };
130
141
 
131
142
  // src/adapters/discord/formatting.ts
132
- var STATUS_ICON = {
133
- running: "\u{1F504}",
134
- completed: "\u2705",
135
- failed: "\u274C",
136
- pending: "\u23F3",
137
- in_progress: "\u{1F504}"
138
- };
139
- var KIND_ICON = {
140
- read: "\u{1F4D6}",
141
- write: "\u270F\uFE0F",
142
- command: "\u26A1",
143
- search: "\u{1F50D}"
144
- };
145
- function extractContentText(content, depth = 0) {
146
- if (!content || depth > 5) return "";
147
- if (typeof content === "string") return content;
148
- if (Array.isArray(content)) {
149
- return content.map((c) => extractContentText(c, depth + 1)).filter(Boolean).join("\n");
150
- }
151
- if (typeof content === "object" && content !== null) {
152
- const c = content;
153
- if (c.type === "text" && typeof c.text === "string") return c.text;
154
- if (typeof c.text === "string") return c.text;
155
- if (typeof c.content === "string") return c.content;
156
- if (c.content && typeof c.content === "object") return extractContentText(c.content, depth + 1);
157
- if (c.input) return extractContentText(c.input, depth + 1);
158
- if (c.output) return extractContentText(c.output, depth + 1);
159
- const keys = Object.keys(c).filter((k) => k !== "type");
160
- if (keys.length === 0) return "";
161
- return JSON.stringify(c, null, 2);
162
- }
163
- return String(content);
164
- }
165
- function truncateContent(text, maxLen = 500) {
166
- if (text.length <= maxLen) return text;
167
- return text.slice(0, maxLen) + "\n\u2026 (truncated)";
168
- }
169
143
  function formatViewerLinks(links, filePath) {
170
144
  if (!links) return "";
171
145
  const fileName = filePath ? filePath.split("/").pop() || filePath : "";
172
146
  let text = "\n";
173
147
  if (links.file) text += `
174
148
  [View ${fileName || "file"}](${links.file})`;
175
- if (links.diff) text += `
149
+ if (links.diff)
150
+ text += `
176
151
  [View diff${fileName ? ` \u2014 ${fileName}` : ""}](${links.diff})`;
177
152
  return text;
178
153
  }
179
- function formatToolCall(tool) {
180
- const si = STATUS_ICON[tool.status || ""] || "\u{1F527}";
181
- const ki = KIND_ICON[tool.kind || ""] || "\u{1F6E0}\uFE0F";
182
- let text = `${si} ${ki} **${tool.name || "Tool"}**`;
154
+ function formatToolCall(tool, verbosity = "medium") {
155
+ const si = STATUS_ICONS[tool.status || ""] || "\u{1F527}";
156
+ const name = tool.name || "Tool";
157
+ const label = verbosity === "low" ? formatToolTitle(name, tool.rawInput) : formatToolSummary(name, tool.rawInput);
158
+ let text = `${si} **${label}**`;
183
159
  text += formatViewerLinks(tool.viewerLinks, tool.viewerFilePath);
184
- if (!tool.viewerLinks) {
185
- const details = extractContentText(tool.content);
160
+ if (verbosity === "high" || verbosity === "medium" && !tool.viewerLinks) {
161
+ const details = stripCodeFences(extractContentText(tool.content));
186
162
  if (details) {
187
163
  text += `
188
164
  \`\`\`
189
- ${truncateContent(details)}
165
+ ${truncateContent(details, 500)}
190
166
  \`\`\``;
191
167
  }
192
168
  }
193
169
  return text;
194
170
  }
195
- function formatToolUpdate(update) {
196
- return formatToolCall(update);
171
+ function formatToolUpdate(update, verbosity = "medium") {
172
+ return formatToolCall(update, verbosity);
197
173
  }
198
174
  function formatPlan(entries) {
199
175
  const statusIcon = {
@@ -207,13 +183,6 @@ function formatPlan(entries) {
207
183
  return `**Plan:**
208
184
  ${lines.join("\n")}`;
209
185
  }
210
- function formatTokens(n) {
211
- return n >= 1e3 ? `${Math.round(n / 1e3)}k` : String(n);
212
- }
213
- function progressBar(ratio) {
214
- const filled = Math.round(Math.min(ratio, 1) * 10);
215
- return "\u2593".repeat(filled) + "\u2591".repeat(10 - filled);
216
- }
217
186
  function formatUsage(usage) {
218
187
  const { tokensUsed, contextSize } = usage;
219
188
  if (tokensUsed == null) return "\u{1F4CA} Usage data unavailable";
@@ -225,37 +194,8 @@ function formatUsage(usage) {
225
194
  return `${emoji} ${formatTokens(tokensUsed)} / ${formatTokens(contextSize)} tokens
226
195
  ${bar} ${pct}%`;
227
196
  }
228
- function splitMessage(text, maxLength = 1800) {
229
- if (text.length <= maxLength) return [text];
230
- const chunks = [];
231
- let remaining = text;
232
- while (remaining.length > 0) {
233
- if (remaining.length <= maxLength) {
234
- chunks.push(remaining);
235
- break;
236
- }
237
- const wouldLeaveSmall = remaining.length < maxLength * 1.3;
238
- const searchLimit = wouldLeaveSmall ? Math.floor(remaining.length / 2) + 300 : maxLength;
239
- let splitAt = remaining.lastIndexOf("\n\n", searchLimit);
240
- if (splitAt === -1 || splitAt < searchLimit * 0.2) {
241
- splitAt = remaining.lastIndexOf("\n", searchLimit);
242
- }
243
- if (splitAt === -1 || splitAt < searchLimit * 0.2) {
244
- splitAt = searchLimit;
245
- }
246
- const candidate = remaining.slice(0, splitAt);
247
- const fences = candidate.match(/```/g);
248
- if (fences && fences.length % 2 !== 0) {
249
- const closingFence = remaining.indexOf("```", splitAt);
250
- if (closingFence !== -1) {
251
- const afterFence = remaining.indexOf("\n", closingFence + 3);
252
- splitAt = afterFence !== -1 ? afterFence + 1 : closingFence + 3;
253
- }
254
- }
255
- chunks.push(remaining.slice(0, splitAt));
256
- remaining = remaining.slice(splitAt).replace(/^\n+/, "");
257
- }
258
- return chunks;
197
+ function splitMessage2(text, maxLength = 1800) {
198
+ return splitMessage(text, maxLength);
259
199
  }
260
200
 
261
201
  // src/adapters/discord/tool-call-tracker.ts
@@ -264,7 +204,7 @@ var ToolCallTracker = class {
264
204
  this.sendQueue = sendQueue;
265
205
  }
266
206
  sessions = /* @__PURE__ */ new Map();
267
- async trackNewCall(sessionId, thread, tool) {
207
+ async trackNewCall(sessionId, thread, tool, verbosity = "medium") {
268
208
  if (!this.sessions.has(sessionId)) {
269
209
  this.sessions.set(sessionId, /* @__PURE__ */ new Map());
270
210
  }
@@ -276,25 +216,28 @@ var ToolCallTracker = class {
276
216
  message: void 0,
277
217
  name: tool.name,
278
218
  kind: tool.kind,
219
+ rawInput: tool.rawInput,
279
220
  viewerLinks: tool.viewerLinks,
280
221
  viewerFilePath: tool.viewerFilePath,
281
222
  ready
282
223
  };
283
224
  this.sessions.get(sessionId).set(tool.id, state);
284
- const content = formatToolCall(tool);
225
+ const content = formatToolCall(tool, verbosity);
285
226
  try {
286
- const msg = await this.sendQueue.enqueue(
287
- () => thread.send({ content }),
288
- { type: "other" }
289
- );
227
+ const msg = await this.sendQueue.enqueue(() => thread.send({ content }), {
228
+ type: "other"
229
+ });
290
230
  if (msg) state.message = msg;
291
231
  } catch (err) {
292
- log.warn({ err, toolId: tool.id }, "[ToolCallTracker] trackNewCall() send failed");
232
+ log.warn(
233
+ { err, toolId: tool.id },
234
+ "[ToolCallTracker] trackNewCall() send failed"
235
+ );
293
236
  } finally {
294
237
  resolveReady();
295
238
  }
296
239
  }
297
- async updateCall(sessionId, update) {
240
+ async updateCall(sessionId, update, verbosity = "medium") {
298
241
  const toolState = this.sessions.get(sessionId)?.get(update.id);
299
242
  if (!toolState) return;
300
243
  if (update.viewerLinks) toolState.viewerLinks = update.viewerLinks;
@@ -319,15 +262,15 @@ var ToolCallTracker = class {
319
262
  ...update,
320
263
  name: toolState.name,
321
264
  kind: toolState.kind,
265
+ rawInput: toolState.rawInput,
322
266
  viewerLinks: toolState.viewerLinks,
323
267
  viewerFilePath: toolState.viewerFilePath
324
268
  };
325
- const content = formatToolUpdate(merged);
269
+ const content = formatToolUpdate(merged, verbosity);
326
270
  try {
327
- await this.sendQueue.enqueue(
328
- () => toolState.message.edit({ content }),
329
- { type: "other" }
330
- );
271
+ await this.sendQueue.enqueue(() => toolState.message.edit({ content }), {
272
+ type: "other"
273
+ });
331
274
  } catch (err) {
332
275
  log.warn(
333
276
  {
@@ -470,7 +413,7 @@ var MessageDraft = class {
470
413
  } catch {
471
414
  }
472
415
  }
473
- const chunks = splitMessage(this.buffer, MAX_DISPLAY_LENGTH);
416
+ const chunks = splitMessage2(this.buffer, MAX_DISPLAY_LENGTH);
474
417
  for (let i = 0; i < chunks.length; i++) {
475
418
  const content = chunks[i];
476
419
  try {
@@ -1029,7 +972,7 @@ async function handleMenuButton(interaction, adapter) {
1029
972
  try {
1030
973
  switch (customId) {
1031
974
  case "m:new": {
1032
- const { handleNew: handleNew2 } = await import("./new-session-K6UCWYOP.js");
975
+ const { handleNew: handleNew2 } = await import("./new-session-NHK7TOEW.js");
1033
976
  await interaction.followUp({ content: "Use `/new` to create a new session.", ephemeral: true });
1034
977
  break;
1035
978
  }
@@ -1048,7 +991,7 @@ async function handleMenuButton(interaction, adapter) {
1048
991
  break;
1049
992
  }
1050
993
  case "m:settings": {
1051
- const { showSettingsInfo } = await import("./settings-RRF77IC4.js");
994
+ const { showSettingsInfo } = await import("./settings-6TF4WIGJ.js");
1052
995
  await showSettingsInfo(interaction, adapter);
1053
996
  break;
1054
997
  }
@@ -1057,7 +1000,7 @@ async function handleMenuButton(interaction, adapter) {
1057
1000
  break;
1058
1001
  }
1059
1002
  case "m:restart": {
1060
- const { handleRestart: handleRestart2 } = await import("./admin-SCP25TN2.js");
1003
+ const { handleRestart: handleRestart2 } = await import("./admin-2HAFXQBG.js");
1061
1004
  if (!adapter.core.requestRestart) {
1062
1005
  await interaction.followUp({ content: "\u26A0\uFE0F Restart not available.", ephemeral: true });
1063
1006
  } else {
@@ -1076,7 +1019,7 @@ async function handleMenuButton(interaction, adapter) {
1076
1019
  break;
1077
1020
  }
1078
1021
  case "m:doctor": {
1079
- const { runDoctorInline } = await import("./doctor-QQ3YZEYV.js");
1022
+ const { runDoctorInline } = await import("./doctor-HASEBMUD.js");
1080
1023
  await runDoctorInline(interaction, adapter);
1081
1024
  break;
1082
1025
  }
@@ -1230,14 +1173,23 @@ async function handleSlashCommand(interaction, adapter) {
1230
1173
  case "tts":
1231
1174
  await handleTTS(interaction, adapter);
1232
1175
  break;
1176
+ case "verbosity":
1177
+ await handleVerbosity(interaction, adapter);
1178
+ break;
1233
1179
  default:
1234
1180
  log.warn({ commandName }, "[discord-router] Unknown slash command");
1235
1181
  if (!interaction.replied && !interaction.deferred) {
1236
- await interaction.reply({ content: `Unknown command: /${commandName}`, ephemeral: true });
1182
+ await interaction.reply({
1183
+ content: `Unknown command: /${commandName}`,
1184
+ ephemeral: true
1185
+ });
1237
1186
  }
1238
1187
  }
1239
1188
  } catch (err) {
1240
- log.error({ err, commandName }, "[discord-router] Slash command handler failed");
1189
+ log.error(
1190
+ { err, commandName },
1191
+ "[discord-router] Slash command handler failed"
1192
+ );
1241
1193
  try {
1242
1194
  const errMsg = `\u274C Command failed: ${err instanceof Error ? err.message : String(err)}`;
1243
1195
  if (interaction.deferred) {
@@ -1264,12 +1216,20 @@ async function setupButtonCallbacks(interaction, adapter) {
1264
1216
  const actionId = customId.slice(2);
1265
1217
  const action = getAction(actionId);
1266
1218
  if (!action) {
1267
- await interaction.reply({ content: "\u274C Action expired.", ephemeral: true });
1219
+ await interaction.reply({
1220
+ content: "\u274C Action expired.",
1221
+ ephemeral: true
1222
+ });
1268
1223
  return;
1269
1224
  }
1270
1225
  removeAction(actionId);
1271
1226
  if (action.type === "new_session") {
1272
- await executeNewSession(interaction, adapter, action.agent, action.workspace);
1227
+ await executeNewSession(
1228
+ interaction,
1229
+ adapter,
1230
+ action.agent,
1231
+ action.workspace
1232
+ );
1273
1233
  } else if (action.type === "cancel_session") {
1274
1234
  await executeCancelSession(interaction, adapter);
1275
1235
  }
@@ -1335,7 +1295,7 @@ async function setupButtonCallbacks(interaction, adapter) {
1335
1295
  }
1336
1296
  }
1337
1297
  async function executeNewSession(interaction, adapter, agentName, workspace) {
1338
- const { executeNewSession: doExecute } = await import("./new-session-K6UCWYOP.js");
1298
+ const { executeNewSession: doExecute } = await import("./new-session-NHK7TOEW.js");
1339
1299
  await doExecute(interaction, adapter, agentName, workspace);
1340
1300
  }
1341
1301
  async function executeCancelSession(interaction, adapter) {
@@ -1345,13 +1305,21 @@ async function executeCancelSession(interaction, adapter) {
1345
1305
 
1346
1306
  // src/adapters/discord/commands/index.ts
1347
1307
  var SLASH_COMMANDS = [
1348
- new SlashCommandBuilder().setName("new").setDescription("Create a new agent session").addStringOption((o) => o.setName("agent").setDescription("Agent to use").setRequired(false)).addStringOption((o) => o.setName("workspace").setDescription("Workspace directory").setRequired(false)),
1349
- new SlashCommandBuilder().setName("newchat").setDescription("New chat in current thread, inheriting agent and workspace"),
1308
+ new SlashCommandBuilder().setName("new").setDescription("Create a new agent session").addStringOption(
1309
+ (o) => o.setName("agent").setDescription("Agent to use").setRequired(false)
1310
+ ).addStringOption(
1311
+ (o) => o.setName("workspace").setDescription("Workspace directory").setRequired(false)
1312
+ ),
1313
+ new SlashCommandBuilder().setName("newchat").setDescription(
1314
+ "New chat in current thread, inheriting agent and workspace"
1315
+ ),
1350
1316
  new SlashCommandBuilder().setName("cancel").setDescription("Cancel the current session"),
1351
1317
  new SlashCommandBuilder().setName("status").setDescription("Show session or global status"),
1352
1318
  new SlashCommandBuilder().setName("sessions").setDescription("List all sessions"),
1353
1319
  new SlashCommandBuilder().setName("agents").setDescription("List available agents"),
1354
- new SlashCommandBuilder().setName("install").setDescription("Install an agent by name").addStringOption((o) => o.setName("name").setDescription("Agent name to install").setRequired(true)),
1320
+ new SlashCommandBuilder().setName("install").setDescription("Install an agent by name").addStringOption(
1321
+ (o) => o.setName("name").setDescription("Agent name to install").setRequired(true)
1322
+ ),
1355
1323
  new SlashCommandBuilder().setName("menu").setDescription("Show the action menu"),
1356
1324
  new SlashCommandBuilder().setName("help").setDescription("Show help"),
1357
1325
  new SlashCommandBuilder().setName("dangerous").setDescription("Toggle dangerous mode for the current session"),
@@ -1363,9 +1331,15 @@ var SLASH_COMMANDS = [
1363
1331
  new SlashCommandBuilder().setName("handoff").setDescription("Generate a terminal resume command for this session"),
1364
1332
  new SlashCommandBuilder().setName("clear").setDescription("Reset the assistant session"),
1365
1333
  new SlashCommandBuilder().setName("tts").setDescription("Toggle Text to Speech for the current session").addStringOption(
1366
- (o) => o.setName("mode").setDescription("on = persistent, off = disable, empty = next message only").setRequired(false).addChoices(
1367
- { name: "on", value: "on" },
1368
- { name: "off", value: "off" }
1334
+ (o) => o.setName("mode").setDescription(
1335
+ "on = persistent, off = disable, empty = next message only"
1336
+ ).setRequired(false).addChoices({ name: "on", value: "on" }, { name: "off", value: "off" })
1337
+ ),
1338
+ new SlashCommandBuilder().setName("verbosity").setDescription("Set display verbosity level").addStringOption(
1339
+ (o) => o.setName("level").setDescription("Verbosity level").setRequired(true).addChoices(
1340
+ { name: "low \u2014 minimal, title only", value: "low" },
1341
+ { name: "medium \u2014 balanced (default)", value: "medium" },
1342
+ { name: "high \u2014 full detail with content", value: "high" }
1369
1343
  )
1370
1344
  )
1371
1345
  ];
@@ -1584,6 +1558,9 @@ var DiscordAdapter = class extends ChannelAdapter {
1584
1558
  skillManager;
1585
1559
  permissionHandler;
1586
1560
  sessionTrackers = /* @__PURE__ */ new Map();
1561
+ get verbosity() {
1562
+ return this.discordConfig.displayVerbosity ?? "medium";
1563
+ }
1587
1564
  guild;
1588
1565
  forumChannel;
1589
1566
  notificationChannel;
@@ -1870,19 +1847,24 @@ var DiscordAdapter = class extends ChannelAdapter {
1870
1847
  this.draftManager.appendText(ctx.sessionId, content.text);
1871
1848
  },
1872
1849
  onToolCall: async (ctx, content) => {
1850
+ const meta = content.metadata ?? {};
1851
+ const toolName = String(meta.name ?? content.text ?? "Tool");
1852
+ const toolKind = String(meta.kind ?? "other");
1853
+ const noiseAction = evaluateNoise(toolName, toolKind, meta.rawInput);
1854
+ if (noiseAction === "hide" && this.verbosity !== "high") return;
1855
+ if (noiseAction === "collapse" && this.verbosity === "low") return;
1873
1856
  const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1874
1857
  await tracker.onToolCall();
1875
1858
  await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
1876
- const meta = content.metadata ?? {};
1877
1859
  await this.toolTracker.trackNewCall(ctx.sessionId, ctx.thread, {
1878
1860
  id: String(meta.id ?? ""),
1879
- name: content.text || String(meta.name ?? "Tool"),
1861
+ name: toolName,
1880
1862
  kind: meta.kind,
1881
1863
  status: String(meta.status ?? "running"),
1882
1864
  content: meta.content,
1883
1865
  viewerLinks: meta.viewerLinks,
1884
1866
  viewerFilePath: meta.viewerFilePath
1885
- });
1867
+ }, this.verbosity);
1886
1868
  },
1887
1869
  onToolUpdate: async (ctx, content) => {
1888
1870
  const meta = content.metadata ?? {};
@@ -1894,7 +1876,7 @@ var DiscordAdapter = class extends ChannelAdapter {
1894
1876
  content: meta.content,
1895
1877
  viewerLinks: meta.viewerLinks,
1896
1878
  viewerFilePath: meta.viewerFilePath
1897
- });
1879
+ }, this.verbosity);
1898
1880
  },
1899
1881
  onPlan: async (ctx, content) => {
1900
1882
  const entries = content.metadata?.entries ?? [];
@@ -2000,7 +1982,7 @@ var DiscordAdapter = class extends ChannelAdapter {
2000
1982
  await ensureUnarchived(thread);
2001
1983
  const isAssistant = this.assistantSession != null && sessionId === this.assistantSession.id;
2002
1984
  const ctx = { sessionId, thread, isAssistant };
2003
- await dispatchMessage(this.messageHandlers, ctx, content);
1985
+ await dispatchMessage(this.messageHandlers, ctx, content, this.verbosity);
2004
1986
  }
2005
1987
  // ─── sendPermissionRequest ────────────────────────────────────────────────
2006
1988
  async sendPermissionRequest(sessionId, request) {
@@ -2097,4 +2079,4 @@ ${notification.deepLink}`;
2097
2079
  export {
2098
2080
  DiscordAdapter
2099
2081
  };
2100
- //# sourceMappingURL=discord-QKT3JMRW.js.map
2082
+ //# sourceMappingURL=discord-VOHXRTCH.js.map