@openacp/cli 0.6.8 → 0.6.10

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 (99) hide show
  1. package/README.md +100 -154
  2. package/dist/{action-detect-6M5GCGAU.js → action-detect-P7ZE4NEM.js} +2 -1
  3. package/dist/{adapter-7GY3N4ZH.js → adapter-ZOANORGM.js} +8 -7
  4. package/dist/{adapter-7GY3N4ZH.js.map → adapter-ZOANORGM.js.map} +1 -1
  5. package/dist/{admin-2HAFXQBG.js → admin-6SYB6XCZ.js} +2 -1
  6. package/dist/{agent-catalog-SBZQRYOD.js → agent-catalog-FC3HGDEQ.js} +2 -1
  7. package/dist/{agent-dependencies-QY5QSULV.js → agent-dependencies-4OWBMZWZ.js} +2 -1
  8. package/dist/{agent-registry-KZFSIRSJ.js → agent-registry-WT4NXPYG.js} +2 -1
  9. package/dist/{agent-store-CGE4G6PA.js → agent-store-VZLFPTZU.js} +2 -1
  10. package/dist/{agents-QJPHNWK2.js → agents-QO7DKARJ.js} +2 -1
  11. package/dist/{api-client-BH2JFHQW.js → api-client-CFQT5U7D.js} +2 -1
  12. package/dist/{autostart-6M3FZAKW.js → autostart-X33OGMX6.js} +2 -1
  13. package/dist/{chunk-RHE2JSYE.js → chunk-2HMQOC7N.js} +2 -2
  14. package/dist/{chunk-SHHMBGB3.js → chunk-33RP6K2O.js} +2 -2
  15. package/dist/{chunk-5SXG7X5D.js → chunk-CS3KCJ5D.js} +103 -55
  16. package/dist/chunk-CS3KCJ5D.js.map +1 -0
  17. package/dist/{chunk-47B7GNOE.js → chunk-LCRLAV4G.js} +541 -191
  18. package/dist/chunk-LCRLAV4G.js.map +1 -0
  19. package/dist/{chunk-LO4Y5WQ7.js → chunk-LGP2YGRL.js} +7 -7
  20. package/dist/{chunk-LO4Y5WQ7.js.map → chunk-LGP2YGRL.js.map} +1 -1
  21. package/dist/{chunk-MZXWCDBU.js → chunk-MKHUZLII.js} +4 -4
  22. package/dist/chunk-MKHUZLII.js.map +1 -0
  23. package/dist/{chunk-YEOY2PBJ.js → chunk-NVPG6JCL.js} +3 -3
  24. package/dist/{chunk-JUYDFUSN.js → chunk-OWP7RZ62.js} +38 -14
  25. package/dist/chunk-OWP7RZ62.js.map +1 -0
  26. package/dist/{chunk-5OVPEDUB.js → chunk-VOIJ6OY4.js} +2 -2
  27. package/dist/chunk-VUNV25KB.js +16 -0
  28. package/dist/{chunk-2J2RBYWN.js → chunk-WTZDAYZX.js} +2 -2
  29. package/dist/cli.js +53 -47
  30. package/dist/cli.js.map +1 -1
  31. package/dist/{config-CQAS6YHR.js → config-6S355X75.js} +3 -2
  32. package/dist/config-editor-QQTZMWGD.js +13 -0
  33. package/dist/{config-registry-HDXFES2D.js → config-registry-AHYI4MYL.js} +2 -1
  34. package/dist/{daemon-K33ZPSEZ.js → daemon-4CS6HMB5.js} +4 -3
  35. package/dist/{discord-VOHXRTCH.js → discord-OMC52Y54.js} +251 -94
  36. package/dist/discord-OMC52Y54.js.map +1 -0
  37. package/dist/dist-UHQK5CXN.js +21151 -0
  38. package/dist/dist-UHQK5CXN.js.map +1 -0
  39. package/dist/doctor-HZZ5BSHB.js +10 -0
  40. package/dist/{doctor-HASEBMUD.js → doctor-OLYBO3V3.js} +5 -4
  41. package/dist/index.js +11 -10
  42. package/dist/{install-cloudflared-FSILDS5J.js → install-cloudflared-Z7VCGOVG.js} +2 -1
  43. package/dist/{install-cloudflared-FSILDS5J.js.map → install-cloudflared-Z7VCGOVG.js.map} +1 -1
  44. package/dist/{install-jq-P6RUBKPV.js → install-jq-HUYSQWKR.js} +2 -1
  45. package/dist/{install-jq-P6RUBKPV.js.map → install-jq-HUYSQWKR.js.map} +1 -1
  46. package/dist/{integrate-O4OCR4SN.js → integrate-PNEHRY2I.js} +2 -1
  47. package/dist/{integrate-O4OCR4SN.js.map → integrate-PNEHRY2I.js.map} +1 -1
  48. package/dist/{log-RCVBXLTN.js → log-NXABYJTT.js} +2 -1
  49. package/dist/{main-DUXVFTDD.js → main-XOZCLFUK.js} +21 -20
  50. package/dist/main-XOZCLFUK.js.map +1 -0
  51. package/dist/{menu-XR2GET2B.js → menu-YY5MKHEK.js} +2 -1
  52. package/dist/{new-session-NHK7TOEW.js → new-session-FEO4J4VU.js} +2 -1
  53. package/dist/{post-upgrade-62LUHDJO.js → post-upgrade-CJG5I7M2.js} +6 -5
  54. package/dist/{post-upgrade-62LUHDJO.js.map → post-upgrade-CJG5I7M2.js.map} +1 -1
  55. package/dist/{session-O6ZPLJIZ.js → session-IUSI7P5S.js} +2 -1
  56. package/dist/{settings-6TF4WIGJ.js → settings-RQPAM4KC.js} +2 -1
  57. package/dist/{setup-RJCEB6FS.js → setup-XHS4OMPM.js} +6 -3
  58. package/dist/{suggest-RST5VOHB.js → suggest-7D6B542M.js} +3 -1
  59. package/dist/{suggest-RST5VOHB.js.map → suggest-7D6B542M.js.map} +1 -1
  60. package/dist/{tunnel-service-NJJH4I26.js → tunnel-service-CJLUH6SZ.js} +3 -2
  61. package/dist/{tunnel-service-NJJH4I26.js.map → tunnel-service-CJLUH6SZ.js.map} +1 -1
  62. package/dist/{version-AXXV6IV2.js → version-NQZBM5M7.js} +2 -1
  63. package/dist/version-NQZBM5M7.js.map +1 -0
  64. package/package.json +15 -1
  65. package/dist/chunk-47B7GNOE.js.map +0 -1
  66. package/dist/chunk-5SXG7X5D.js.map +0 -1
  67. package/dist/chunk-JUYDFUSN.js.map +0 -1
  68. package/dist/chunk-MZXWCDBU.js.map +0 -1
  69. package/dist/config-editor-37BM56WF.js +0 -12
  70. package/dist/discord-VOHXRTCH.js.map +0 -1
  71. package/dist/doctor-W4VGLDVM.js +0 -9
  72. package/dist/main-DUXVFTDD.js.map +0 -1
  73. /package/dist/{action-detect-6M5GCGAU.js.map → action-detect-P7ZE4NEM.js.map} +0 -0
  74. /package/dist/{admin-2HAFXQBG.js.map → admin-6SYB6XCZ.js.map} +0 -0
  75. /package/dist/{agent-catalog-SBZQRYOD.js.map → agent-catalog-FC3HGDEQ.js.map} +0 -0
  76. /package/dist/{agent-dependencies-QY5QSULV.js.map → agent-dependencies-4OWBMZWZ.js.map} +0 -0
  77. /package/dist/{agent-registry-KZFSIRSJ.js.map → agent-registry-WT4NXPYG.js.map} +0 -0
  78. /package/dist/{agent-store-CGE4G6PA.js.map → agent-store-VZLFPTZU.js.map} +0 -0
  79. /package/dist/{agents-QJPHNWK2.js.map → agents-QO7DKARJ.js.map} +0 -0
  80. /package/dist/{api-client-BH2JFHQW.js.map → api-client-CFQT5U7D.js.map} +0 -0
  81. /package/dist/{autostart-6M3FZAKW.js.map → autostart-X33OGMX6.js.map} +0 -0
  82. /package/dist/{chunk-RHE2JSYE.js.map → chunk-2HMQOC7N.js.map} +0 -0
  83. /package/dist/{chunk-SHHMBGB3.js.map → chunk-33RP6K2O.js.map} +0 -0
  84. /package/dist/{chunk-YEOY2PBJ.js.map → chunk-NVPG6JCL.js.map} +0 -0
  85. /package/dist/{chunk-5OVPEDUB.js.map → chunk-VOIJ6OY4.js.map} +0 -0
  86. /package/dist/{config-CQAS6YHR.js.map → chunk-VUNV25KB.js.map} +0 -0
  87. /package/dist/{chunk-2J2RBYWN.js.map → chunk-WTZDAYZX.js.map} +0 -0
  88. /package/dist/{config-editor-37BM56WF.js.map → config-6S355X75.js.map} +0 -0
  89. /package/dist/{config-registry-HDXFES2D.js.map → config-editor-QQTZMWGD.js.map} +0 -0
  90. /package/dist/{daemon-K33ZPSEZ.js.map → config-registry-AHYI4MYL.js.map} +0 -0
  91. /package/dist/{doctor-HASEBMUD.js.map → daemon-4CS6HMB5.js.map} +0 -0
  92. /package/dist/{doctor-W4VGLDVM.js.map → doctor-HZZ5BSHB.js.map} +0 -0
  93. /package/dist/{log-RCVBXLTN.js.map → doctor-OLYBO3V3.js.map} +0 -0
  94. /package/dist/{menu-XR2GET2B.js.map → log-NXABYJTT.js.map} +0 -0
  95. /package/dist/{new-session-NHK7TOEW.js.map → menu-YY5MKHEK.js.map} +0 -0
  96. /package/dist/{session-O6ZPLJIZ.js.map → new-session-FEO4J4VU.js.map} +0 -0
  97. /package/dist/{settings-6TF4WIGJ.js.map → session-IUSI7P5S.js.map} +0 -0
  98. /package/dist/{setup-RJCEB6FS.js.map → settings-RQPAM4KC.js.map} +0 -0
  99. /package/dist/{version-AXXV6IV2.js.map → setup-XHS4OMPM.js.map} +0 -0
@@ -44,10 +44,9 @@ import {
44
44
  import {
45
45
  handleDoctor,
46
46
  handleDoctorButton
47
- } from "./chunk-RHE2JSYE.js";
47
+ } from "./chunk-2HMQOC7N.js";
48
48
  import {
49
49
  PRODUCT_GUIDE,
50
- STATUS_ICONS,
51
50
  dispatchMessage,
52
51
  evaluateNoise,
53
52
  extractContentText,
@@ -55,22 +54,28 @@ import {
55
54
  formatToolSummary,
56
55
  formatToolTitle,
57
56
  progressBar,
57
+ resolveToolIcon,
58
58
  splitMessage,
59
59
  stripCodeFences,
60
60
  truncateContent
61
- } from "./chunk-JUYDFUSN.js";
62
- import "./chunk-YEOY2PBJ.js";
61
+ } from "./chunk-OWP7RZ62.js";
63
62
  import {
64
63
  ChannelAdapter
65
64
  } from "./chunk-LBIKITQT.js";
65
+ import "./chunk-NVPG6JCL.js";
66
66
  import "./chunk-JHYXKVV2.js";
67
- import "./chunk-SHHMBGB3.js";
67
+ import "./chunk-33RP6K2O.js";
68
68
  import {
69
69
  log
70
70
  } from "./chunk-GAK6PIBW.js";
71
+ import "./chunk-VUNV25KB.js";
71
72
 
72
73
  // src/adapters/discord/adapter.ts
73
- import { Client, GatewayIntentBits, MessageFlags } from "discord.js";
74
+ import {
75
+ Client,
76
+ GatewayIntentBits,
77
+ MessageFlags
78
+ } from "discord.js";
74
79
 
75
80
  // src/adapters/discord/send-queue.ts
76
81
  var DiscordSendQueue = class {
@@ -151,27 +156,47 @@ function formatViewerLinks(links, filePath) {
151
156
  [View diff${fileName ? ` \u2014 ${fileName}` : ""}](${links.diff})`;
152
157
  return text;
153
158
  }
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}**`;
159
- text += formatViewerLinks(tool.viewerLinks, tool.viewerFilePath);
160
- if (verbosity === "high" || verbosity === "medium" && !tool.viewerLinks) {
161
- const details = stripCodeFences(extractContentText(tool.content));
162
- if (details) {
159
+ function formatHighDetails(rawInput, content, maxLen) {
160
+ let text = "";
161
+ if (rawInput) {
162
+ const inputStr = typeof rawInput === "string" ? rawInput : JSON.stringify(rawInput, null, 2);
163
+ if (inputStr && inputStr !== "{}") {
163
164
  text += `
165
+ **Input:**
164
166
  \`\`\`
165
- ${truncateContent(details, 500)}
167
+ ${truncateContent(inputStr, maxLen)}
166
168
  \`\`\``;
167
169
  }
168
170
  }
171
+ const details = stripCodeFences(extractContentText(content));
172
+ if (details) {
173
+ text += `
174
+ **Output:**
175
+ \`\`\`
176
+ ${truncateContent(details, maxLen)}
177
+ \`\`\``;
178
+ }
179
+ return text;
180
+ }
181
+ function formatToolCall(tool, verbosity = "medium") {
182
+ const si = resolveToolIcon(tool);
183
+ const name = tool.name || "Tool";
184
+ const label = verbosity === "low" ? formatToolTitle(name, tool.rawInput, tool.displayTitle) : formatToolSummary(name, tool.rawInput, tool.displaySummary);
185
+ let text = `${si} **${label}**`;
186
+ text += formatViewerLinks(tool.viewerLinks, tool.viewerFilePath);
187
+ if (verbosity === "high") {
188
+ text += formatHighDetails(tool.rawInput, tool.content, 500);
189
+ }
169
190
  return text;
170
191
  }
171
192
  function formatToolUpdate(update, verbosity = "medium") {
172
193
  return formatToolCall(update, verbosity);
173
194
  }
174
- function formatPlan(entries) {
195
+ function formatPlan(entries, verbosity = "medium") {
196
+ if (verbosity === "medium") {
197
+ const done = entries.filter((e) => e.status === "completed").length;
198
+ return `\u{1F4CB} **Plan:** ${done}/${entries.length} steps completed`;
199
+ }
175
200
  const statusIcon = {
176
201
  pending: "\u23F3",
177
202
  in_progress: "\u{1F504}",
@@ -183,16 +208,23 @@ function formatPlan(entries) {
183
208
  return `**Plan:**
184
209
  ${lines.join("\n")}`;
185
210
  }
186
- function formatUsage(usage) {
187
- const { tokensUsed, contextSize } = usage;
211
+ function formatUsage(usage, verbosity = "medium") {
212
+ const { tokensUsed, contextSize, cost } = usage;
188
213
  if (tokensUsed == null) return "\u{1F4CA} Usage data unavailable";
214
+ if (verbosity === "medium") {
215
+ const costStr = cost != null ? ` \xB7 $${cost.toFixed(2)}` : "";
216
+ return `\u{1F4CA} ${formatTokens(tokensUsed)} tokens${costStr}`;
217
+ }
189
218
  if (contextSize == null) return `\u{1F4CA} ${formatTokens(tokensUsed)} tokens`;
190
219
  const ratio = tokensUsed / contextSize;
191
220
  const pct = Math.round(ratio * 100);
192
221
  const bar = progressBar(ratio);
193
222
  const emoji = pct >= 85 ? "\u26A0\uFE0F" : "\u{1F4CA}";
194
- return `${emoji} ${formatTokens(tokensUsed)} / ${formatTokens(contextSize)} tokens
223
+ let text = `${emoji} ${formatTokens(tokensUsed)} / ${formatTokens(contextSize)} tokens
195
224
  ${bar} ${pct}%`;
225
+ if (cost != null) text += `
226
+ \u{1F4B0} $${cost.toFixed(2)}`;
227
+ return text;
196
228
  }
197
229
  function splitMessage2(text, maxLength = 1800) {
198
230
  return splitMessage(text, maxLength);
@@ -547,8 +579,8 @@ var UsageMessage = class {
547
579
  this.sendQueue = sendQueue;
548
580
  }
549
581
  message;
550
- async send(usage) {
551
- const text = formatUsage(usage);
582
+ async send(usage, verbosity = "medium") {
583
+ const text = formatUsage(usage, verbosity);
552
584
  const embed = new EmbedBuilder().setDescription(text);
553
585
  try {
554
586
  if (this.message) {
@@ -572,10 +604,7 @@ var UsageMessage = class {
572
604
  const msg = this.message;
573
605
  this.message = void 0;
574
606
  try {
575
- await this.sendQueue.enqueue(
576
- () => msg.delete(),
577
- { type: "other" }
578
- );
607
+ await this.sendQueue.enqueue(() => msg.delete(), { type: "other" });
579
608
  } catch (err) {
580
609
  log.warn({ err }, "[UsageMessage] delete() failed");
581
610
  }
@@ -592,6 +621,10 @@ var PlanCard = class {
592
621
  latestEntries;
593
622
  lastSentText;
594
623
  flushTimer;
624
+ verbosity = "medium";
625
+ setVerbosity(v) {
626
+ this.verbosity = v;
627
+ }
595
628
  update(entries) {
596
629
  this.latestEntries = entries;
597
630
  if (this.flushTimer) clearTimeout(this.flushTimer);
@@ -620,7 +653,7 @@ var PlanCard = class {
620
653
  }
621
654
  async _flush() {
622
655
  if (!this.latestEntries) return;
623
- const text = formatPlan(this.latestEntries);
656
+ const text = formatPlan(this.latestEntries, this.verbosity);
624
657
  if (this.message && text === this.lastSentText) return;
625
658
  this.lastSentText = text;
626
659
  const embed = new EmbedBuilder().setDescription(text);
@@ -674,14 +707,15 @@ var ActivityTracker = class {
674
707
  this.thinking.dismiss();
675
708
  this.thinking.reset();
676
709
  }
677
- async onPlan(entries) {
710
+ async onPlan(entries, verbosity) {
678
711
  await this._firstEventGuard();
679
712
  this.thinking.dismiss();
680
713
  this.hasPlanCard = true;
714
+ if (verbosity) this.planCard.setVerbosity(verbosity);
681
715
  this.planCard.update(entries);
682
716
  }
683
- async sendUsage(usage) {
684
- await this.usage.send(usage);
717
+ async sendUsage(usage, verbosity = "medium") {
718
+ await this.usage.send(usage, verbosity);
685
719
  }
686
720
  async cleanup() {
687
721
  this.thinking.dismiss();
@@ -972,12 +1006,12 @@ async function handleMenuButton(interaction, adapter) {
972
1006
  try {
973
1007
  switch (customId) {
974
1008
  case "m:new": {
975
- const { handleNew: handleNew2 } = await import("./new-session-NHK7TOEW.js");
1009
+ const { handleNew: handleNew2 } = await import("./new-session-FEO4J4VU.js");
976
1010
  await interaction.followUp({ content: "Use `/new` to create a new session.", ephemeral: true });
977
1011
  break;
978
1012
  }
979
1013
  case "m:sessions": {
980
- const { handleSessions: handleSessions2 } = await import("./session-O6ZPLJIZ.js");
1014
+ const { handleSessions: handleSessions2 } = await import("./session-IUSI7P5S.js");
981
1015
  await showSessionsList(interaction, adapter);
982
1016
  break;
983
1017
  }
@@ -986,12 +1020,12 @@ async function handleMenuButton(interaction, adapter) {
986
1020
  break;
987
1021
  }
988
1022
  case "m:agents": {
989
- const { showAgentsList } = await import("./agents-QJPHNWK2.js");
1023
+ const { showAgentsList } = await import("./agents-QO7DKARJ.js");
990
1024
  await showAgentsList(interaction, adapter);
991
1025
  break;
992
1026
  }
993
1027
  case "m:settings": {
994
- const { showSettingsInfo } = await import("./settings-6TF4WIGJ.js");
1028
+ const { showSettingsInfo } = await import("./settings-RQPAM4KC.js");
995
1029
  await showSettingsInfo(interaction, adapter);
996
1030
  break;
997
1031
  }
@@ -1000,7 +1034,7 @@ async function handleMenuButton(interaction, adapter) {
1000
1034
  break;
1001
1035
  }
1002
1036
  case "m:restart": {
1003
- const { handleRestart: handleRestart2 } = await import("./admin-2HAFXQBG.js");
1037
+ const { handleRestart: handleRestart2 } = await import("./admin-6SYB6XCZ.js");
1004
1038
  if (!adapter.core.requestRestart) {
1005
1039
  await interaction.followUp({ content: "\u26A0\uFE0F Restart not available.", ephemeral: true });
1006
1040
  } else {
@@ -1019,7 +1053,7 @@ async function handleMenuButton(interaction, adapter) {
1019
1053
  break;
1020
1054
  }
1021
1055
  case "m:doctor": {
1022
- const { runDoctorInline } = await import("./doctor-HASEBMUD.js");
1056
+ const { runDoctorInline } = await import("./doctor-OLYBO3V3.js");
1023
1057
  await runDoctorInline(interaction, adapter);
1024
1058
  break;
1025
1059
  }
@@ -1212,7 +1246,7 @@ async function setupButtonCallbacks(interaction, adapter) {
1212
1246
  return;
1213
1247
  }
1214
1248
  if (customId.startsWith("a:")) {
1215
- const { getAction, removeAction } = await import("./action-detect-6M5GCGAU.js");
1249
+ const { getAction, removeAction } = await import("./action-detect-P7ZE4NEM.js");
1216
1250
  const actionId = customId.slice(2);
1217
1251
  const action = getAction(actionId);
1218
1252
  if (!action) {
@@ -1295,11 +1329,11 @@ async function setupButtonCallbacks(interaction, adapter) {
1295
1329
  }
1296
1330
  }
1297
1331
  async function executeNewSession(interaction, adapter, agentName, workspace) {
1298
- const { executeNewSession: doExecute } = await import("./new-session-NHK7TOEW.js");
1332
+ const { executeNewSession: doExecute } = await import("./new-session-FEO4J4VU.js");
1299
1333
  await doExecute(interaction, adapter, agentName, workspace);
1300
1334
  }
1301
1335
  async function executeCancelSession(interaction, adapter) {
1302
- const { executeCancelSession: doCancel } = await import("./session-O6ZPLJIZ.js");
1336
+ const { executeCancelSession: doCancel } = await import("./session-IUSI7P5S.js");
1303
1337
  await doCancel(interaction, adapter);
1304
1338
  }
1305
1339
 
@@ -1582,7 +1616,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1582
1616
  this.draftManager = new DraftManager(this.sendQueue);
1583
1617
  this.fileService = core.fileService;
1584
1618
  this.client.rest.on("rateLimited", (info) => {
1585
- log.warn({ route: info.route, timeToReset: info.timeToReset }, "[DiscordAdapter] Rate limited");
1619
+ log.warn(
1620
+ { route: info.route, timeToReset: info.timeToReset },
1621
+ "[DiscordAdapter] Rate limited"
1622
+ );
1586
1623
  this.sendQueue.onRateLimited();
1587
1624
  });
1588
1625
  }
@@ -1591,13 +1628,18 @@ var DiscordAdapter = class extends ChannelAdapter {
1591
1628
  return new Promise((resolve, reject) => {
1592
1629
  this.client.once("ready", async () => {
1593
1630
  try {
1594
- log.info({ guildId: this.discordConfig.guildId }, "[DiscordAdapter] Client ready, initializing...");
1631
+ log.info(
1632
+ { guildId: this.discordConfig.guildId },
1633
+ "[DiscordAdapter] Client ready, initializing..."
1634
+ );
1595
1635
  const guild = this.client.guilds.cache.get(this.discordConfig.guildId) ?? await this.client.guilds.fetch(this.discordConfig.guildId).catch(() => null);
1596
1636
  if (!guild) {
1597
1637
  throw new Error(`Guild not found: ${this.discordConfig.guildId}`);
1598
1638
  }
1599
1639
  this.guild = guild;
1600
- const saveConfig = (updates) => this.core.configManager.save(updates);
1640
+ const saveConfig = (updates) => this.core.configManager.save(
1641
+ updates
1642
+ );
1601
1643
  const { forumChannel, notificationChannel } = await ensureForums(
1602
1644
  guild,
1603
1645
  {
@@ -1608,7 +1650,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1608
1650
  );
1609
1651
  this.forumChannel = forumChannel;
1610
1652
  this.notificationChannel = notificationChannel;
1611
- this.skillManager = new SkillCommandManager(this.sendQueue, this.core.sessionManager);
1653
+ this.skillManager = new SkillCommandManager(
1654
+ this.sendQueue,
1655
+ this.core.sessionManager
1656
+ );
1612
1657
  this.permissionHandler = new PermissionHandler(
1613
1658
  guild.id,
1614
1659
  (sessionId) => this.core.sessionManager.getSession(sessionId),
@@ -1621,7 +1666,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1621
1666
  try {
1622
1667
  await this.notificationChannel.send(welcomeMsg);
1623
1668
  } catch (err) {
1624
- log.warn({ err }, "[DiscordAdapter] Failed to send welcome message");
1669
+ log.warn(
1670
+ { err },
1671
+ "[DiscordAdapter] Failed to send welcome message"
1672
+ );
1625
1673
  }
1626
1674
  await this.setupAssistant();
1627
1675
  log.info("[DiscordAdapter] Initialization complete");
@@ -1640,7 +1688,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1640
1688
  try {
1641
1689
  await this.assistantSession.destroy();
1642
1690
  } catch (err) {
1643
- log.warn({ err }, "[DiscordAdapter] Failed to destroy assistant session");
1691
+ log.warn(
1692
+ { err },
1693
+ "[DiscordAdapter] Failed to destroy assistant session"
1694
+ );
1644
1695
  }
1645
1696
  this.assistantSession = null;
1646
1697
  }
@@ -1678,7 +1729,12 @@ var DiscordAdapter = class extends ChannelAdapter {
1678
1729
  const userId = message.author.id;
1679
1730
  let text = message.content;
1680
1731
  log.debug(
1681
- { threadId, userId, text: text.slice(0, 50), attachmentCount: message.attachments.size },
1732
+ {
1733
+ threadId,
1734
+ userId,
1735
+ text: text.slice(0, 50),
1736
+ attachmentCount: message.attachments.size
1737
+ },
1682
1738
  "[DiscordAdapter] messageCreate received"
1683
1739
  );
1684
1740
  if (!text && message.attachments.size === 0) return;
@@ -1697,7 +1753,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1697
1753
  "[discord-media] Processing incoming attachments"
1698
1754
  );
1699
1755
  }
1700
- const attachments = await this.processIncomingAttachments(message, sessionId);
1756
+ const attachments = await this.processIncomingAttachments(
1757
+ message,
1758
+ sessionId
1759
+ );
1701
1760
  if (!text && attachments.length > 0) {
1702
1761
  text = buildFallbackText(attachments);
1703
1762
  }
@@ -1710,7 +1769,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1710
1769
  }
1711
1770
  if (this.discordConfig.assistantThreadId && threadId === this.discordConfig.assistantThreadId) {
1712
1771
  if (this.assistantSession && text) {
1713
- await this.assistantSession.enqueuePrompt(text, attachments.length > 0 ? attachments : void 0);
1772
+ await this.assistantSession.enqueuePrompt(
1773
+ text,
1774
+ attachments.length > 0 ? attachments : void 0
1775
+ );
1714
1776
  }
1715
1777
  return;
1716
1778
  }
@@ -1733,14 +1795,25 @@ var DiscordAdapter = class extends ChannelAdapter {
1733
1795
  try {
1734
1796
  const existing = this.guild.channels.cache.get(threadId) ?? await this.guild.channels.fetch(threadId);
1735
1797
  if (existing && existing.isThread()) {
1736
- await ensureUnarchived(existing);
1737
- log.info({ threadId }, "[DiscordAdapter] Reusing existing assistant thread");
1798
+ await ensureUnarchived(
1799
+ existing
1800
+ );
1801
+ log.info(
1802
+ { threadId },
1803
+ "[DiscordAdapter] Reusing existing assistant thread"
1804
+ );
1738
1805
  } else {
1739
- log.warn({ threadId }, "[DiscordAdapter] Assistant thread not found, recreating...");
1806
+ log.warn(
1807
+ { threadId },
1808
+ "[DiscordAdapter] Assistant thread not found, recreating..."
1809
+ );
1740
1810
  threadId = null;
1741
1811
  }
1742
1812
  } catch {
1743
- log.warn({ threadId }, "[DiscordAdapter] Assistant thread inaccessible, recreating...");
1813
+ log.warn(
1814
+ { threadId },
1815
+ "[DiscordAdapter] Assistant thread inaccessible, recreating..."
1816
+ );
1744
1817
  threadId = null;
1745
1818
  }
1746
1819
  }
@@ -1794,7 +1867,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1794
1867
  fileName = "voice.wav";
1795
1868
  mimeType = "audio/wav";
1796
1869
  } catch (err) {
1797
- log.warn({ err }, "[discord-media] OGG\u2192WAV conversion failed, saving original");
1870
+ log.warn(
1871
+ { err },
1872
+ "[discord-media] OGG\u2192WAV conversion failed, saving original"
1873
+ );
1798
1874
  }
1799
1875
  }
1800
1876
  return this.fileService.saveFile(sessionId, fileName, data, mimeType);
@@ -1802,10 +1878,18 @@ var DiscordAdapter = class extends ChannelAdapter {
1802
1878
  );
1803
1879
  const rejected = results.filter((r) => r.status === "rejected");
1804
1880
  if (rejected.length > 0) {
1805
- log.warn({ rejected: rejected.map((r) => r.reason) }, "[discord-media] Some attachments failed");
1881
+ log.warn(
1882
+ { rejected: rejected.map((r) => r.reason) },
1883
+ "[discord-media] Some attachments failed"
1884
+ );
1806
1885
  }
1807
- const saved = results.filter((r) => r.status === "fulfilled").map((r) => r.value).filter((att) => att !== null);
1808
- log.info({ count: saved.length, files: saved.map((a) => a.fileName) }, "[discord-media] Attachments processed");
1886
+ const saved = results.filter(
1887
+ (r) => r.status === "fulfilled"
1888
+ ).map((r) => r.value).filter((att) => att !== null);
1889
+ log.info(
1890
+ { count: saved.length, files: saved.map((a) => a.fileName) },
1891
+ "[discord-media] Attachments processed"
1892
+ );
1809
1893
  return saved;
1810
1894
  }
1811
1895
  // ─── Helper: resolve thread ───────────────────────────────────────────────
@@ -1819,17 +1903,26 @@ var DiscordAdapter = class extends ChannelAdapter {
1819
1903
  try {
1820
1904
  const channel = this.guild.channels.cache.get(threadId) ?? await this.guild.channels.fetch(threadId);
1821
1905
  if (channel && channel.isThread()) return channel;
1822
- log.warn({ sessionId, threadId }, "[DiscordAdapter] Channel is not a thread");
1906
+ log.warn(
1907
+ { sessionId, threadId },
1908
+ "[DiscordAdapter] Channel is not a thread"
1909
+ );
1823
1910
  return null;
1824
1911
  } catch (err) {
1825
- log.warn({ err, sessionId, threadId }, "[DiscordAdapter] Failed to fetch thread");
1912
+ log.warn(
1913
+ { err, sessionId, threadId },
1914
+ "[DiscordAdapter] Failed to fetch thread"
1915
+ );
1826
1916
  return null;
1827
1917
  }
1828
1918
  }
1829
1919
  // ─── Helper: get or create activity tracker ──────────────────────────────
1830
1920
  getOrCreateTracker(sessionId, thread) {
1831
1921
  if (!this.sessionTrackers.has(sessionId)) {
1832
- this.sessionTrackers.set(sessionId, new ActivityTracker(thread, this.sendQueue));
1922
+ this.sessionTrackers.set(
1923
+ sessionId,
1924
+ new ActivityTracker(thread, this.sendQueue)
1925
+ );
1833
1926
  }
1834
1927
  return this.sessionTrackers.get(sessionId);
1835
1928
  }
@@ -1855,42 +1948,71 @@ var DiscordAdapter = class extends ChannelAdapter {
1855
1948
  if (noiseAction === "collapse" && this.verbosity === "low") return;
1856
1949
  const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1857
1950
  await tracker.onToolCall();
1858
- await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
1859
- await this.toolTracker.trackNewCall(ctx.sessionId, ctx.thread, {
1860
- id: String(meta.id ?? ""),
1861
- name: toolName,
1862
- kind: meta.kind,
1863
- status: String(meta.status ?? "running"),
1864
- content: meta.content,
1865
- viewerLinks: meta.viewerLinks,
1866
- viewerFilePath: meta.viewerFilePath
1867
- }, this.verbosity);
1951
+ await this.draftManager.finalize(
1952
+ ctx.sessionId,
1953
+ ctx.thread,
1954
+ ctx.isAssistant
1955
+ );
1956
+ await this.toolTracker.trackNewCall(
1957
+ ctx.sessionId,
1958
+ ctx.thread,
1959
+ {
1960
+ id: String(meta.id ?? ""),
1961
+ name: toolName,
1962
+ kind: meta.kind,
1963
+ status: String(meta.status ?? "running"),
1964
+ content: meta.content,
1965
+ rawInput: meta.rawInput,
1966
+ viewerLinks: meta.viewerLinks,
1967
+ viewerFilePath: meta.viewerFilePath,
1968
+ displaySummary: meta.displaySummary,
1969
+ displayTitle: meta.displayTitle,
1970
+ displayKind: meta.displayKind
1971
+ },
1972
+ this.verbosity
1973
+ );
1868
1974
  },
1869
1975
  onToolUpdate: async (ctx, content) => {
1870
1976
  const meta = content.metadata ?? {};
1871
- await this.toolTracker.updateCall(ctx.sessionId, {
1872
- id: String(meta.id ?? ""),
1873
- name: content.text || String(meta.name ?? ""),
1874
- kind: meta.kind,
1875
- status: String(meta.status ?? "completed"),
1876
- content: meta.content,
1877
- viewerLinks: meta.viewerLinks,
1878
- viewerFilePath: meta.viewerFilePath
1879
- }, this.verbosity);
1977
+ await this.toolTracker.updateCall(
1978
+ ctx.sessionId,
1979
+ {
1980
+ id: String(meta.id ?? ""),
1981
+ name: content.text || String(meta.name ?? ""),
1982
+ kind: meta.kind,
1983
+ status: String(meta.status ?? "completed"),
1984
+ content: meta.content,
1985
+ rawInput: meta.rawInput,
1986
+ viewerLinks: meta.viewerLinks,
1987
+ viewerFilePath: meta.viewerFilePath,
1988
+ displaySummary: meta.displaySummary,
1989
+ displayTitle: meta.displayTitle,
1990
+ displayKind: meta.displayKind
1991
+ },
1992
+ this.verbosity
1993
+ );
1880
1994
  },
1881
1995
  onPlan: async (ctx, content) => {
1882
1996
  const entries = content.metadata?.entries ?? [];
1883
1997
  const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1884
- await tracker.onPlan(entries);
1998
+ await tracker.onPlan(entries, this.verbosity);
1885
1999
  },
1886
2000
  onUsage: async (ctx, content) => {
1887
- await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
2001
+ await this.draftManager.finalize(
2002
+ ctx.sessionId,
2003
+ ctx.thread,
2004
+ ctx.isAssistant
2005
+ );
1888
2006
  const meta = content.metadata ?? {};
1889
2007
  const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1890
- await tracker.sendUsage({
1891
- tokensUsed: meta.tokensUsed,
1892
- contextSize: meta.contextSize
1893
- });
2008
+ await tracker.sendUsage(
2009
+ {
2010
+ tokensUsed: meta.tokensUsed,
2011
+ contextSize: meta.contextSize,
2012
+ cost: meta.cost
2013
+ },
2014
+ this.verbosity
2015
+ );
1894
2016
  try {
1895
2017
  const deepLink = buildDeepLink(this.guild.id, ctx.thread.id);
1896
2018
  await this.sendNotification({
@@ -1903,7 +2025,11 @@ var DiscordAdapter = class extends ChannelAdapter {
1903
2025
  }
1904
2026
  },
1905
2027
  onSessionEnd: async (ctx, _content) => {
1906
- await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
2028
+ await this.draftManager.finalize(
2029
+ ctx.sessionId,
2030
+ ctx.thread,
2031
+ ctx.isAssistant
2032
+ );
1907
2033
  const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1908
2034
  await tracker.cleanup();
1909
2035
  this.toolTracker.cleanup(ctx.sessionId);
@@ -1918,7 +2044,11 @@ var DiscordAdapter = class extends ChannelAdapter {
1918
2044
  }
1919
2045
  },
1920
2046
  onError: async (ctx, content) => {
1921
- await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
2047
+ await this.draftManager.finalize(
2048
+ ctx.sessionId,
2049
+ ctx.thread,
2050
+ ctx.isAssistant
2051
+ );
1922
2052
  const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1923
2053
  await tracker.cleanup();
1924
2054
  this.toolTracker.cleanup(ctx.sessionId);
@@ -1934,12 +2064,25 @@ var DiscordAdapter = class extends ChannelAdapter {
1934
2064
  onAttachment: async (ctx, content) => {
1935
2065
  if (!content.attachment) return;
1936
2066
  const { attachment } = content;
1937
- await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
2067
+ await this.draftManager.finalize(
2068
+ ctx.sessionId,
2069
+ ctx.thread,
2070
+ ctx.isAssistant
2071
+ );
1938
2072
  if (isAttachmentTooLarge(attachment.size)) {
1939
- log.warn({ sessionId: ctx.sessionId, fileName: attachment.fileName, size: attachment.size }, "[discord-media] File too large (>25MB)");
2073
+ log.warn(
2074
+ {
2075
+ sessionId: ctx.sessionId,
2076
+ fileName: attachment.fileName,
2077
+ size: attachment.size
2078
+ },
2079
+ "[discord-media] File too large (>25MB)"
2080
+ );
1940
2081
  try {
1941
2082
  await this.sendQueue.enqueue(
1942
- () => ctx.thread.send({ content: `\u26A0\uFE0F File too large to send (${Math.round(attachment.size / 1024 / 1024)}MB): ${attachment.fileName}` }),
2083
+ () => ctx.thread.send({
2084
+ content: `\u26A0\uFE0F File too large to send (${Math.round(attachment.size / 1024 / 1024)}MB): ${attachment.fileName}`
2085
+ }),
1943
2086
  { type: "other" }
1944
2087
  );
1945
2088
  } catch {
@@ -1948,7 +2091,11 @@ var DiscordAdapter = class extends ChannelAdapter {
1948
2091
  }
1949
2092
  try {
1950
2093
  await this.sendQueue.enqueue(
1951
- () => ctx.thread.send({ files: [{ attachment: attachment.filePath, name: attachment.fileName }] }),
2094
+ () => ctx.thread.send({
2095
+ files: [
2096
+ { attachment: attachment.filePath, name: attachment.fileName }
2097
+ ]
2098
+ }),
1952
2099
  { type: "other" }
1953
2100
  );
1954
2101
  if (attachment.type === "audio") {
@@ -1959,7 +2106,10 @@ var DiscordAdapter = class extends ChannelAdapter {
1959
2106
  }
1960
2107
  }
1961
2108
  } catch (err) {
1962
- log.error({ err, sessionId: ctx.sessionId, fileName: attachment.fileName }, "[discord-media] Failed to send attachment");
2109
+ log.error(
2110
+ { err, sessionId: ctx.sessionId, fileName: attachment.fileName },
2111
+ "[discord-media] Failed to send attachment"
2112
+ );
1963
2113
  }
1964
2114
  },
1965
2115
  onSystemMessage: async (ctx, content) => {
@@ -1988,12 +2138,19 @@ var DiscordAdapter = class extends ChannelAdapter {
1988
2138
  async sendPermissionRequest(sessionId, request) {
1989
2139
  const session = this.core.sessionManager.getSession(sessionId);
1990
2140
  if (!session) {
1991
- log.warn({ sessionId }, "[DiscordAdapter] sendPermissionRequest: session not found");
2141
+ log.warn(
2142
+ { sessionId },
2143
+ "[DiscordAdapter] sendPermissionRequest: session not found"
2144
+ );
1992
2145
  return;
1993
2146
  }
1994
2147
  const thread = await this.getThread(sessionId);
1995
2148
  if (!thread) return;
1996
- await this.permissionHandler.sendPermissionRequest(session, request, thread);
2149
+ await this.permissionHandler.sendPermissionRequest(
2150
+ session,
2151
+ request,
2152
+ thread
2153
+ );
1997
2154
  }
1998
2155
  // ─── sendNotification ─────────────────────────────────────────────────────
1999
2156
  async sendNotification(notification) {
@@ -2079,4 +2236,4 @@ ${notification.deepLink}`;
2079
2236
  export {
2080
2237
  DiscordAdapter
2081
2238
  };
2082
- //# sourceMappingURL=discord-VOHXRTCH.js.map
2239
+ //# sourceMappingURL=discord-OMC52Y54.js.map