@openacp/cli 0.6.0 → 0.6.2

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 (93) hide show
  1. package/README.md +11 -2
  2. package/dist/{admin-IKPS5PFC.js → admin-IVQTC72V.js} +2 -2
  3. package/dist/{agent-catalog-T5ECPEDA.js → agent-catalog-IVU2KANH.js} +2 -2
  4. package/dist/{agents-55NX3DHM.js → agents-SXIY4IEF.js} +2 -2
  5. package/dist/{chunk-6Q7PZWCL.js → chunk-2OFIWTYD.js} +3 -3
  6. package/dist/{chunk-H7ZMPBZC.js → chunk-3KGRVAEV.js} +1 -1
  7. package/dist/chunk-3KGRVAEV.js.map +1 -0
  8. package/dist/{chunk-IURZ4QHG.js → chunk-7QJS2XBD.js} +2 -1
  9. package/dist/chunk-7QJS2XBD.js.map +1 -0
  10. package/dist/{chunk-MHFCZGRW.js → chunk-7WQH4SOY.js} +15 -5
  11. package/dist/{chunk-MHFCZGRW.js.map → chunk-7WQH4SOY.js.map} +1 -1
  12. package/dist/{chunk-J6X5SW6O.js → chunk-CKOK7JW6.js} +3 -2
  13. package/dist/{chunk-J6X5SW6O.js.map → chunk-CKOK7JW6.js.map} +1 -1
  14. package/dist/{chunk-DWQKUECJ.js → chunk-EWYNCHUH.js} +68 -17
  15. package/dist/chunk-EWYNCHUH.js.map +1 -0
  16. package/dist/{chunk-Z46LGZ7R.js → chunk-F3AICYO4.js} +56 -1
  17. package/dist/chunk-F3AICYO4.js.map +1 -0
  18. package/dist/{chunk-3WPG7GXA.js → chunk-FF4C3ZE4.js} +2 -2
  19. package/dist/chunk-FF4C3ZE4.js.map +1 -0
  20. package/dist/{chunk-5NBWM7P6.js → chunk-FMWSVLRM.js} +35 -2
  21. package/dist/chunk-FMWSVLRM.js.map +1 -0
  22. package/dist/{chunk-THBR6OXH.js → chunk-HSGUPJU5.js} +1 -1
  23. package/dist/chunk-HSGUPJU5.js.map +1 -0
  24. package/dist/{chunk-V2V767XI.js → chunk-IFTYEG5J.js} +2439 -957
  25. package/dist/chunk-IFTYEG5J.js.map +1 -0
  26. package/dist/{chunk-7G5QKLLF.js → chunk-IUIMBEBX.js} +1 -1
  27. package/dist/chunk-IUIMBEBX.js.map +1 -0
  28. package/dist/{chunk-YYQXWA62.js → chunk-KO5RL7MZ.js} +2 -2
  29. package/dist/{chunk-AKIU4JBF.js → chunk-ONENT7JQ.js} +2 -2
  30. package/dist/chunk-ONENT7JQ.js.map +1 -0
  31. package/dist/{chunk-437NLISU.js → chunk-TMCQZAXN.js} +2 -2
  32. package/dist/chunk-TMCQZAXN.js.map +1 -0
  33. package/dist/{chunk-T22OLSET.js → chunk-TTDSLV35.js} +1 -1
  34. package/dist/chunk-TTDSLV35.js.map +1 -0
  35. package/dist/{chunk-SPX7CKWV.js → chunk-WQZ4RXH7.js} +2 -2
  36. package/dist/cli.js +41 -36
  37. package/dist/cli.js.map +1 -1
  38. package/dist/{config-KF2MQWAP.js → config-4YSJ4NCI.js} +2 -2
  39. package/dist/{config-editor-OTODXUF7.js → config-editor-TOZUBMO7.js} +4 -4
  40. package/dist/{config-registry-SNKA2EH2.js → config-registry-7I6GGDOY.js} +2 -2
  41. package/dist/{daemon-U6UC7OM4.js → daemon-I6XMRQ6P.js} +3 -3
  42. package/dist/{discord-SLLKRUP7.js → discord-7B5NWW5Z.js} +154 -146
  43. package/dist/discord-7B5NWW5Z.js.map +1 -0
  44. package/dist/{doctor-DB5PRQ6D.js → doctor-FR5GASOQ.js} +4 -4
  45. package/dist/doctor-UOH7YCT2.js +9 -0
  46. package/dist/index.d.ts +475 -72
  47. package/dist/index.js +29 -11
  48. package/dist/{integrate-VOUYBPPZ.js → integrate-QTK4PPYQ.js} +15 -6
  49. package/dist/integrate-QTK4PPYQ.js.map +1 -0
  50. package/dist/{main-M6RH3SS5.js → main-46BVXFWI.js} +20 -19
  51. package/dist/main-46BVXFWI.js.map +1 -0
  52. package/dist/{menu-J5YVH665.js → menu-XR2GET2B.js} +2 -2
  53. package/dist/{new-session-DRRP2J7E.js → new-session-BVNE6S3A.js} +3 -3
  54. package/dist/{session-FVFLBREJ.js → session-ZMAM67AA.js} +2 -2
  55. package/dist/{settings-LPOLJ6SA.js → settings-LQ57CFY4.js} +2 -2
  56. package/dist/{setup-LI5CKYDK.js → setup-DZXZTQRD.js} +3 -3
  57. package/dist/{tunnel-service-U6V4HQOO.js → tunnel-service-O5EKGFLO.js} +19 -1
  58. package/dist/tunnel-service-O5EKGFLO.js.map +1 -0
  59. package/package.json +2 -1
  60. package/dist/chunk-3WPG7GXA.js.map +0 -1
  61. package/dist/chunk-437NLISU.js.map +0 -1
  62. package/dist/chunk-5NBWM7P6.js.map +0 -1
  63. package/dist/chunk-7G5QKLLF.js.map +0 -1
  64. package/dist/chunk-AKIU4JBF.js.map +0 -1
  65. package/dist/chunk-DWQKUECJ.js.map +0 -1
  66. package/dist/chunk-H7ZMPBZC.js.map +0 -1
  67. package/dist/chunk-IURZ4QHG.js.map +0 -1
  68. package/dist/chunk-T22OLSET.js.map +0 -1
  69. package/dist/chunk-THBR6OXH.js.map +0 -1
  70. package/dist/chunk-V2V767XI.js.map +0 -1
  71. package/dist/chunk-Z46LGZ7R.js.map +0 -1
  72. package/dist/discord-SLLKRUP7.js.map +0 -1
  73. package/dist/doctor-SYWNJFYK.js +0 -9
  74. package/dist/integrate-VOUYBPPZ.js.map +0 -1
  75. package/dist/main-M6RH3SS5.js.map +0 -1
  76. package/dist/tunnel-service-U6V4HQOO.js.map +0 -1
  77. /package/dist/{admin-IKPS5PFC.js.map → admin-IVQTC72V.js.map} +0 -0
  78. /package/dist/{agent-catalog-T5ECPEDA.js.map → agent-catalog-IVU2KANH.js.map} +0 -0
  79. /package/dist/{agents-55NX3DHM.js.map → agents-SXIY4IEF.js.map} +0 -0
  80. /package/dist/{chunk-6Q7PZWCL.js.map → chunk-2OFIWTYD.js.map} +0 -0
  81. /package/dist/{chunk-YYQXWA62.js.map → chunk-KO5RL7MZ.js.map} +0 -0
  82. /package/dist/{chunk-SPX7CKWV.js.map → chunk-WQZ4RXH7.js.map} +0 -0
  83. /package/dist/{config-KF2MQWAP.js.map → config-4YSJ4NCI.js.map} +0 -0
  84. /package/dist/{config-editor-OTODXUF7.js.map → config-editor-TOZUBMO7.js.map} +0 -0
  85. /package/dist/{config-registry-SNKA2EH2.js.map → config-registry-7I6GGDOY.js.map} +0 -0
  86. /package/dist/{daemon-U6UC7OM4.js.map → daemon-I6XMRQ6P.js.map} +0 -0
  87. /package/dist/{doctor-DB5PRQ6D.js.map → doctor-FR5GASOQ.js.map} +0 -0
  88. /package/dist/{doctor-SYWNJFYK.js.map → doctor-UOH7YCT2.js.map} +0 -0
  89. /package/dist/{menu-J5YVH665.js.map → menu-XR2GET2B.js.map} +0 -0
  90. /package/dist/{new-session-DRRP2J7E.js.map → new-session-BVNE6S3A.js.map} +0 -0
  91. /package/dist/{session-FVFLBREJ.js.map → session-ZMAM67AA.js.map} +0 -0
  92. /package/dist/{settings-LPOLJ6SA.js.map → settings-LQ57CFY4.js.map} +0 -0
  93. /package/dist/{setup-LI5CKYDK.js.map → setup-DZXZTQRD.js.map} +0 -0
@@ -4,20 +4,20 @@ import {
4
4
  handleHandoff,
5
5
  handleSessions,
6
6
  handleStatus
7
- } from "./chunk-T22OLSET.js";
7
+ } from "./chunk-TTDSLV35.js";
8
8
  import {
9
9
  handleAgentButton,
10
10
  handleAgents,
11
11
  handleInstall
12
- } from "./chunk-H7ZMPBZC.js";
12
+ } from "./chunk-3KGRVAEV.js";
13
13
  import {
14
14
  handleSettings,
15
15
  handleSettingsButton
16
- } from "./chunk-THBR6OXH.js";
16
+ } from "./chunk-HSGUPJU5.js";
17
17
  import {
18
18
  handleDoctor,
19
19
  handleDoctorButton
20
- } from "./chunk-3WPG7GXA.js";
20
+ } from "./chunk-FF4C3ZE4.js";
21
21
  import {
22
22
  buildActionKeyboard,
23
23
  detectAction,
@@ -27,7 +27,7 @@ import {
27
27
  handleNew,
28
28
  handleNewChat,
29
29
  handleNewSessionButton
30
- } from "./chunk-AKIU4JBF.js";
30
+ } from "./chunk-ONENT7JQ.js";
31
31
  import {
32
32
  buildDeepLink,
33
33
  createSessionThread,
@@ -41,13 +41,14 @@ import {
41
41
  handleDangerousButton,
42
42
  handleRestart,
43
43
  handleUpdate
44
- } from "./chunk-7G5QKLLF.js";
44
+ } from "./chunk-IUIMBEBX.js";
45
45
  import {
46
46
  ChannelAdapter,
47
- PRODUCT_GUIDE
48
- } from "./chunk-5NBWM7P6.js";
49
- import "./chunk-SPX7CKWV.js";
50
- import "./chunk-DWQKUECJ.js";
47
+ PRODUCT_GUIDE,
48
+ dispatchMessage
49
+ } from "./chunk-FMWSVLRM.js";
50
+ import "./chunk-WQZ4RXH7.js";
51
+ import "./chunk-EWYNCHUH.js";
51
52
  import {
52
53
  log
53
54
  } from "./chunk-ESOPMQAY.js";
@@ -816,8 +817,10 @@ var SkillCommandManager = class {
816
817
  const record = this.sessionManager.getSessionRecord(sessionId);
817
818
  if (record) {
818
819
  const platform = record.platform;
819
- const { skillMsgId: _removed, ...rest } = platform;
820
- await this.sessionManager.patchRecord(sessionId, { platform: rest });
820
+ if (platform && typeof platform === "object" && "threadId" in platform) {
821
+ const { skillMsgId: _removed, ...rest } = platform;
822
+ await this.sessionManager.patchRecord(sessionId, { platform: rest });
823
+ }
821
824
  }
822
825
  }
823
826
  };
@@ -980,12 +983,12 @@ Each session gets its own forum thread \u2014 chat there to work with the agent.
980
983
  }
981
984
  async function handleClear(interaction, adapter) {
982
985
  await interaction.deferReply({ ephemeral: true });
983
- if (!adapter.assistant) {
986
+ if (!adapter.getAssistantSessionId()) {
984
987
  await interaction.editReply("\u26A0\uFE0F Assistant is not available.");
985
988
  return;
986
989
  }
987
990
  try {
988
- await adapter.assistant.respawn();
991
+ await adapter.respawnAssistant();
989
992
  await interaction.editReply("\u2705 Assistant history cleared.");
990
993
  } catch (err) {
991
994
  const message = err instanceof Error ? err.message : String(err);
@@ -1001,12 +1004,12 @@ async function handleMenuButton(interaction, adapter) {
1001
1004
  try {
1002
1005
  switch (customId) {
1003
1006
  case "m:new": {
1004
- const { handleNew: handleNew2 } = await import("./new-session-DRRP2J7E.js");
1007
+ const { handleNew: handleNew2 } = await import("./new-session-BVNE6S3A.js");
1005
1008
  await interaction.followUp({ content: "Use `/new` to create a new session.", ephemeral: true });
1006
1009
  break;
1007
1010
  }
1008
1011
  case "m:sessions": {
1009
- const { handleSessions: handleSessions2 } = await import("./session-FVFLBREJ.js");
1012
+ const { handleSessions: handleSessions2 } = await import("./session-ZMAM67AA.js");
1010
1013
  await showSessionsList(interaction, adapter);
1011
1014
  break;
1012
1015
  }
@@ -1015,12 +1018,12 @@ async function handleMenuButton(interaction, adapter) {
1015
1018
  break;
1016
1019
  }
1017
1020
  case "m:agents": {
1018
- const { showAgentsList } = await import("./agents-55NX3DHM.js");
1021
+ const { showAgentsList } = await import("./agents-SXIY4IEF.js");
1019
1022
  await showAgentsList(interaction, adapter);
1020
1023
  break;
1021
1024
  }
1022
1025
  case "m:settings": {
1023
- const { showSettingsInfo } = await import("./settings-LPOLJ6SA.js");
1026
+ const { showSettingsInfo } = await import("./settings-LQ57CFY4.js");
1024
1027
  await showSettingsInfo(interaction, adapter);
1025
1028
  break;
1026
1029
  }
@@ -1029,7 +1032,7 @@ async function handleMenuButton(interaction, adapter) {
1029
1032
  break;
1030
1033
  }
1031
1034
  case "m:restart": {
1032
- const { handleRestart: handleRestart2 } = await import("./admin-IKPS5PFC.js");
1035
+ const { handleRestart: handleRestart2 } = await import("./admin-IVQTC72V.js");
1033
1036
  if (!adapter.core.requestRestart) {
1034
1037
  await interaction.followUp({ content: "\u26A0\uFE0F Restart not available.", ephemeral: true });
1035
1038
  } else {
@@ -1048,7 +1051,7 @@ async function handleMenuButton(interaction, adapter) {
1048
1051
  break;
1049
1052
  }
1050
1053
  case "m:doctor": {
1051
- const { runDoctorInline } = await import("./doctor-DB5PRQ6D.js");
1054
+ const { runDoctorInline } = await import("./doctor-FR5GASOQ.js");
1052
1055
  await runDoctorInline(interaction, adapter);
1053
1056
  break;
1054
1057
  }
@@ -1287,11 +1290,11 @@ async function setupButtonCallbacks(interaction, adapter) {
1287
1290
  }
1288
1291
  }
1289
1292
  async function executeNewSession(interaction, adapter, agentName, workspace) {
1290
- const { executeNewSession: doExecute } = await import("./new-session-DRRP2J7E.js");
1293
+ const { executeNewSession: doExecute } = await import("./new-session-BVNE6S3A.js");
1291
1294
  await doExecute(interaction, adapter, agentName, workspace);
1292
1295
  }
1293
1296
  async function executeCancelSession(interaction, adapter) {
1294
- const { executeCancelSession: doCancel } = await import("./session-FVFLBREJ.js");
1297
+ const { executeCancelSession: doCancel } = await import("./session-ZMAM67AA.js");
1295
1298
  await doCancel(interaction, adapter);
1296
1299
  }
1297
1300
 
@@ -1795,138 +1798,151 @@ var DiscordAdapter = class extends ChannelAdapter {
1795
1798
  return null;
1796
1799
  }
1797
1800
  }
1798
- // ─── sendMessage ──────────────────────────────────────────────────────────
1799
- async sendMessage(sessionId, content) {
1800
- if (this.assistantInitializing && this.assistantSession && sessionId === this.assistantSession.id) {
1801
- return;
1802
- }
1803
- const thread = await this.getThread(sessionId);
1804
- if (!thread) return;
1805
- await ensureUnarchived(thread);
1806
- const isAssistant = this.assistantSession != null && sessionId === this.assistantSession.id;
1801
+ // ─── Helper: get or create activity tracker ──────────────────────────────
1802
+ getOrCreateTracker(sessionId, thread) {
1807
1803
  if (!this.sessionTrackers.has(sessionId)) {
1808
1804
  this.sessionTrackers.set(sessionId, new ActivityTracker(thread, this.sendQueue));
1809
1805
  }
1810
- const tracker = this.sessionTrackers.get(sessionId);
1811
- switch (content.type) {
1812
- case "thought": {
1813
- await tracker.onThought();
1814
- break;
1815
- }
1816
- case "text": {
1817
- await tracker.onTextStart();
1818
- const draft = this.draftManager.getOrCreate(sessionId, thread);
1819
- draft.append(content.text);
1820
- this.draftManager.appendText(sessionId, content.text);
1821
- break;
1822
- }
1823
- case "tool_call": {
1824
- await tracker.onToolCall();
1825
- await this.draftManager.finalize(sessionId, thread, isAssistant);
1826
- const meta = content.metadata ?? {};
1827
- await this.toolTracker.trackNewCall(sessionId, thread, {
1828
- id: String(meta.id ?? ""),
1829
- name: content.text || String(meta.name ?? "Tool"),
1830
- kind: meta.kind,
1831
- status: String(meta.status ?? "running"),
1832
- content: meta.content,
1833
- viewerLinks: meta.viewerLinks,
1834
- viewerFilePath: meta.viewerFilePath
1835
- });
1836
- break;
1837
- }
1838
- case "tool_update": {
1839
- const meta = content.metadata ?? {};
1840
- await this.toolTracker.updateCall(sessionId, {
1841
- id: String(meta.id ?? ""),
1842
- name: content.text || String(meta.name ?? ""),
1843
- kind: meta.kind,
1844
- status: String(meta.status ?? "completed"),
1845
- content: meta.content,
1846
- viewerLinks: meta.viewerLinks,
1847
- viewerFilePath: meta.viewerFilePath
1806
+ return this.sessionTrackers.get(sessionId);
1807
+ }
1808
+ // --- MessageHandlers for dispatchMessage ---
1809
+ messageHandlers = {
1810
+ onThought: async (ctx, _content) => {
1811
+ const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1812
+ await tracker.onThought();
1813
+ },
1814
+ onText: async (ctx, content) => {
1815
+ const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1816
+ await tracker.onTextStart();
1817
+ const draft = this.draftManager.getOrCreate(ctx.sessionId, ctx.thread);
1818
+ draft.append(content.text);
1819
+ this.draftManager.appendText(ctx.sessionId, content.text);
1820
+ },
1821
+ onToolCall: async (ctx, content) => {
1822
+ const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1823
+ await tracker.onToolCall();
1824
+ await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
1825
+ const meta = content.metadata ?? {};
1826
+ await this.toolTracker.trackNewCall(ctx.sessionId, ctx.thread, {
1827
+ id: String(meta.id ?? ""),
1828
+ name: content.text || String(meta.name ?? "Tool"),
1829
+ kind: meta.kind,
1830
+ status: String(meta.status ?? "running"),
1831
+ content: meta.content,
1832
+ viewerLinks: meta.viewerLinks,
1833
+ viewerFilePath: meta.viewerFilePath
1834
+ });
1835
+ },
1836
+ onToolUpdate: async (ctx, content) => {
1837
+ const meta = content.metadata ?? {};
1838
+ await this.toolTracker.updateCall(ctx.sessionId, {
1839
+ id: String(meta.id ?? ""),
1840
+ name: content.text || String(meta.name ?? ""),
1841
+ kind: meta.kind,
1842
+ status: String(meta.status ?? "completed"),
1843
+ content: meta.content,
1844
+ viewerLinks: meta.viewerLinks,
1845
+ viewerFilePath: meta.viewerFilePath
1846
+ });
1847
+ },
1848
+ onPlan: async (ctx, content) => {
1849
+ const entries = content.metadata?.entries ?? [];
1850
+ const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1851
+ await tracker.onPlan(entries);
1852
+ },
1853
+ onUsage: async (ctx, content) => {
1854
+ await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
1855
+ const meta = content.metadata ?? {};
1856
+ const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1857
+ await tracker.sendUsage({
1858
+ tokensUsed: meta.tokensUsed,
1859
+ contextSize: meta.contextSize
1860
+ });
1861
+ try {
1862
+ const deepLink = buildDeepLink(this.guild.id, ctx.thread.id);
1863
+ await this.sendNotification({
1864
+ sessionId: ctx.sessionId,
1865
+ type: "completed",
1866
+ summary: content.text || "Session completed",
1867
+ deepLink
1848
1868
  });
1849
- break;
1869
+ } catch {
1850
1870
  }
1851
- case "plan": {
1852
- const entries = content.metadata?.entries ?? [];
1853
- await tracker.onPlan(entries);
1854
- break;
1871
+ },
1872
+ onSessionEnd: async (ctx, _content) => {
1873
+ await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
1874
+ const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1875
+ await tracker.cleanup();
1876
+ this.toolTracker.cleanup(ctx.sessionId);
1877
+ this.sessionTrackers.delete(ctx.sessionId);
1878
+ await this.skillManager.cleanup(ctx.sessionId);
1879
+ try {
1880
+ await this.sendQueue.enqueue(
1881
+ () => ctx.thread.send({ content: "\u2705 Done" }),
1882
+ { type: "other" }
1883
+ );
1884
+ } catch {
1855
1885
  }
1856
- case "usage": {
1857
- await this.draftManager.finalize(sessionId, thread, isAssistant);
1858
- const meta = content.metadata ?? {};
1859
- await tracker.sendUsage({
1860
- tokensUsed: meta.tokensUsed,
1861
- contextSize: meta.contextSize
1862
- });
1863
- try {
1864
- const deepLink = buildDeepLink(this.guild.id, thread.id);
1865
- await this.sendNotification({
1866
- sessionId,
1867
- type: "completed",
1868
- summary: content.text || "Session completed",
1869
- deepLink
1870
- });
1871
- } catch {
1872
- }
1873
- break;
1886
+ },
1887
+ onError: async (ctx, content) => {
1888
+ await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
1889
+ const tracker = this.getOrCreateTracker(ctx.sessionId, ctx.thread);
1890
+ await tracker.cleanup();
1891
+ this.toolTracker.cleanup(ctx.sessionId);
1892
+ this.sessionTrackers.delete(ctx.sessionId);
1893
+ try {
1894
+ await this.sendQueue.enqueue(
1895
+ () => ctx.thread.send({ content: `\u274C Error: ${content.text}` }),
1896
+ { type: "other" }
1897
+ );
1898
+ } catch {
1874
1899
  }
1875
- case "session_end": {
1876
- await this.draftManager.finalize(sessionId, thread, isAssistant);
1877
- await tracker.cleanup();
1878
- this.toolTracker.cleanup(sessionId);
1879
- this.sessionTrackers.delete(sessionId);
1880
- await this.skillManager.cleanup(sessionId);
1900
+ },
1901
+ onAttachment: async (ctx, content) => {
1902
+ if (!content.attachment) return;
1903
+ const { attachment } = content;
1904
+ await this.draftManager.finalize(ctx.sessionId, ctx.thread, ctx.isAssistant);
1905
+ if (isAttachmentTooLarge(attachment.size)) {
1906
+ log.warn({ sessionId: ctx.sessionId, fileName: attachment.fileName, size: attachment.size }, "[discord-media] File too large (>25MB)");
1881
1907
  try {
1882
1908
  await this.sendQueue.enqueue(
1883
- () => thread.send({ content: "\u2705 Done" }),
1909
+ () => ctx.thread.send({ content: `\u26A0\uFE0F File too large to send (${Math.round(attachment.size / 1024 / 1024)}MB): ${attachment.fileName}` }),
1884
1910
  { type: "other" }
1885
1911
  );
1886
1912
  } catch {
1887
1913
  }
1888
- break;
1914
+ return;
1889
1915
  }
1890
- case "error": {
1891
- await this.draftManager.finalize(sessionId, thread, isAssistant);
1892
- await tracker.cleanup();
1893
- this.toolTracker.cleanup(sessionId);
1894
- this.sessionTrackers.delete(sessionId);
1895
- try {
1896
- await this.sendQueue.enqueue(
1897
- () => thread.send({ content: `\u274C Error: ${content.text}` }),
1898
- { type: "other" }
1899
- );
1900
- } catch {
1901
- }
1902
- break;
1916
+ try {
1917
+ await this.sendQueue.enqueue(
1918
+ () => ctx.thread.send({ files: [{ attachment: attachment.filePath, name: attachment.fileName }] }),
1919
+ { type: "other" }
1920
+ );
1921
+ } catch (err) {
1922
+ log.error({ err, sessionId: ctx.sessionId, fileName: attachment.fileName }, "[discord-media] Failed to send attachment");
1903
1923
  }
1904
- case "attachment": {
1905
- if (!content.attachment) break;
1906
- const { attachment } = content;
1907
- await this.draftManager.finalize(sessionId, thread, isAssistant);
1908
- if (isAttachmentTooLarge(attachment.size)) {
1909
- log.warn({ sessionId, fileName: attachment.fileName, size: attachment.size }, "[discord-media] File too large (>25MB)");
1910
- try {
1911
- await this.sendQueue.enqueue(
1912
- () => thread.send({ content: `\u26A0\uFE0F File too large to send (${Math.round(attachment.size / 1024 / 1024)}MB): ${attachment.fileName}` }),
1913
- { type: "other" }
1914
- );
1915
- } catch {
1916
- }
1917
- break;
1918
- }
1919
- try {
1920
- await this.sendQueue.enqueue(
1921
- () => thread.send({ files: [{ attachment: attachment.filePath, name: attachment.fileName }] }),
1922
- { type: "other" }
1923
- );
1924
- } catch (err) {
1925
- log.error({ err, sessionId, fileName: attachment.fileName }, "[discord-media] Failed to send attachment");
1926
- }
1927
- break;
1924
+ },
1925
+ onSystemMessage: async (ctx, content) => {
1926
+ try {
1927
+ await this.sendQueue.enqueue(
1928
+ () => ctx.thread.send({ content: content.text }),
1929
+ { type: "other" }
1930
+ );
1931
+ } catch {
1928
1932
  }
1929
1933
  }
1934
+ };
1935
+ // ─── sendMessage ──────────────────────────────────────────────────────────
1936
+ async sendMessage(sessionId, content) {
1937
+ if (this.assistantInitializing && this.assistantSession && sessionId === this.assistantSession.id) {
1938
+ return;
1939
+ }
1940
+ const thread = await this.getThread(sessionId);
1941
+ if (!thread) return;
1942
+ await ensureUnarchived(thread);
1943
+ const isAssistant = this.assistantSession != null && sessionId === this.assistantSession.id;
1944
+ const ctx = { sessionId, thread, isAssistant };
1945
+ await dispatchMessage(this.messageHandlers, ctx, content);
1930
1946
  }
1931
1947
  // ─── sendPermissionRequest ────────────────────────────────────────────────
1932
1948
  async sendPermissionRequest(sessionId, request) {
@@ -1935,14 +1951,6 @@ var DiscordAdapter = class extends ChannelAdapter {
1935
1951
  log.warn({ sessionId }, "[DiscordAdapter] sendPermissionRequest: session not found");
1936
1952
  return;
1937
1953
  }
1938
- const autoApprove = request.description.toLowerCase().includes("openacp") || session.dangerousMode;
1939
- if (autoApprove) {
1940
- const allowOption = request.options.find((o) => o.isAllow);
1941
- if (allowOption && session.permissionGate.requestId === request.id) {
1942
- session.permissionGate.resolve(allowOption.id);
1943
- }
1944
- return;
1945
- }
1946
1954
  const thread = await this.getThread(sessionId);
1947
1955
  if (!thread) return;
1948
1956
  await this.permissionHandler.sendPermissionRequest(session, request, thread);
@@ -2031,4 +2039,4 @@ ${notification.deepLink}`;
2031
2039
  export {
2032
2040
  DiscordAdapter
2033
2041
  };
2034
- //# sourceMappingURL=discord-SLLKRUP7.js.map
2042
+ //# sourceMappingURL=discord-7B5NWW5Z.js.map