opencode-bridge 2.9.0-beta

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 (237) hide show
  1. package/.env.example +131 -0
  2. package/LICENSE +674 -0
  3. package/README.md +1195 -0
  4. package/bin/opencode-bridge.js +31 -0
  5. package/dist/commands/effort.d.ts +9 -0
  6. package/dist/commands/effort.d.ts.map +1 -0
  7. package/dist/commands/effort.js +56 -0
  8. package/dist/commands/effort.js.map +1 -0
  9. package/dist/commands/parser.d.ts +37 -0
  10. package/dist/commands/parser.d.ts.map +1 -0
  11. package/dist/commands/parser.js +355 -0
  12. package/dist/commands/parser.js.map +1 -0
  13. package/dist/config.d.ts +91 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +340 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/feishu/cards-stream.d.ts +65 -0
  18. package/dist/feishu/cards-stream.d.ts.map +1 -0
  19. package/dist/feishu/cards-stream.js +448 -0
  20. package/dist/feishu/cards-stream.js.map +1 -0
  21. package/dist/feishu/cards.d.ts +81 -0
  22. package/dist/feishu/cards.d.ts.map +1 -0
  23. package/dist/feishu/cards.js +560 -0
  24. package/dist/feishu/cards.js.map +1 -0
  25. package/dist/feishu/client.d.ts +132 -0
  26. package/dist/feishu/client.d.ts.map +1 -0
  27. package/dist/feishu/client.js +952 -0
  28. package/dist/feishu/client.js.map +1 -0
  29. package/dist/feishu/streamer.d.ts +30 -0
  30. package/dist/feishu/streamer.d.ts.map +1 -0
  31. package/dist/feishu/streamer.js +95 -0
  32. package/dist/feishu/streamer.js.map +1 -0
  33. package/dist/handlers/card-action.d.ts +12 -0
  34. package/dist/handlers/card-action.d.ts.map +1 -0
  35. package/dist/handlers/card-action.js +154 -0
  36. package/dist/handlers/card-action.js.map +1 -0
  37. package/dist/handlers/command.d.ts +76 -0
  38. package/dist/handlers/command.d.ts.map +1 -0
  39. package/dist/handlers/command.js +1773 -0
  40. package/dist/handlers/command.js.map +1 -0
  41. package/dist/handlers/discord.d.ts +78 -0
  42. package/dist/handlers/discord.d.ts.map +1 -0
  43. package/dist/handlers/discord.js +1832 -0
  44. package/dist/handlers/discord.js.map +1 -0
  45. package/dist/handlers/file-sender.d.ts +22 -0
  46. package/dist/handlers/file-sender.d.ts.map +1 -0
  47. package/dist/handlers/file-sender.js +183 -0
  48. package/dist/handlers/file-sender.js.map +1 -0
  49. package/dist/handlers/group.d.ts +21 -0
  50. package/dist/handlers/group.d.ts.map +1 -0
  51. package/dist/handlers/group.js +414 -0
  52. package/dist/handlers/group.js.map +1 -0
  53. package/dist/handlers/lifecycle.d.ts +17 -0
  54. package/dist/handlers/lifecycle.d.ts.map +1 -0
  55. package/dist/handlers/lifecycle.js +129 -0
  56. package/dist/handlers/lifecycle.js.map +1 -0
  57. package/dist/handlers/p2p.d.ts +44 -0
  58. package/dist/handlers/p2p.d.ts.map +1 -0
  59. package/dist/handlers/p2p.js +625 -0
  60. package/dist/handlers/p2p.js.map +1 -0
  61. package/dist/index.d.ts +33 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +1562 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/opencode/client.d.ts +176 -0
  66. package/dist/opencode/client.d.ts.map +1 -0
  67. package/dist/opencode/client.js +1126 -0
  68. package/dist/opencode/client.js.map +1 -0
  69. package/dist/opencode/delayed-handler.d.ts +33 -0
  70. package/dist/opencode/delayed-handler.d.ts.map +1 -0
  71. package/dist/opencode/delayed-handler.js +74 -0
  72. package/dist/opencode/delayed-handler.js.map +1 -0
  73. package/dist/opencode/output-buffer.d.ts +56 -0
  74. package/dist/opencode/output-buffer.d.ts.map +1 -0
  75. package/dist/opencode/output-buffer.js +202 -0
  76. package/dist/opencode/output-buffer.js.map +1 -0
  77. package/dist/opencode/question-handler.d.ts +61 -0
  78. package/dist/opencode/question-handler.d.ts.map +1 -0
  79. package/dist/opencode/question-handler.js +183 -0
  80. package/dist/opencode/question-handler.js.map +1 -0
  81. package/dist/opencode/question-parser.d.ts +9 -0
  82. package/dist/opencode/question-parser.d.ts.map +1 -0
  83. package/dist/opencode/question-parser.js +69 -0
  84. package/dist/opencode/question-parser.js.map +1 -0
  85. package/dist/opencode/session-queue.d.ts +16 -0
  86. package/dist/opencode/session-queue.d.ts.map +1 -0
  87. package/dist/opencode/session-queue.js +41 -0
  88. package/dist/opencode/session-queue.js.map +1 -0
  89. package/dist/permissions/handler.d.ts +36 -0
  90. package/dist/permissions/handler.d.ts.map +1 -0
  91. package/dist/permissions/handler.js +141 -0
  92. package/dist/permissions/handler.js.map +1 -0
  93. package/dist/platform/adapters/discord-adapter.d.ts +45 -0
  94. package/dist/platform/adapters/discord-adapter.d.ts.map +1 -0
  95. package/dist/platform/adapters/discord-adapter.js +497 -0
  96. package/dist/platform/adapters/discord-adapter.js.map +1 -0
  97. package/dist/platform/adapters/feishu-adapter.d.ts +29 -0
  98. package/dist/platform/adapters/feishu-adapter.d.ts.map +1 -0
  99. package/dist/platform/adapters/feishu-adapter.js +150 -0
  100. package/dist/platform/adapters/feishu-adapter.js.map +1 -0
  101. package/dist/platform/registry.d.ts +41 -0
  102. package/dist/platform/registry.d.ts.map +1 -0
  103. package/dist/platform/registry.js +87 -0
  104. package/dist/platform/registry.js.map +1 -0
  105. package/dist/platform/types.d.ts +92 -0
  106. package/dist/platform/types.d.ts.map +1 -0
  107. package/dist/platform/types.js +4 -0
  108. package/dist/platform/types.js.map +1 -0
  109. package/dist/reliability/audit-log.d.ts +93 -0
  110. package/dist/reliability/audit-log.d.ts.map +1 -0
  111. package/dist/reliability/audit-log.js +248 -0
  112. package/dist/reliability/audit-log.js.map +1 -0
  113. package/dist/reliability/config-guard.d.ts +42 -0
  114. package/dist/reliability/config-guard.d.ts.map +1 -0
  115. package/dist/reliability/config-guard.js +264 -0
  116. package/dist/reliability/config-guard.js.map +1 -0
  117. package/dist/reliability/conversation-heartbeat.d.ts +37 -0
  118. package/dist/reliability/conversation-heartbeat.d.ts.map +1 -0
  119. package/dist/reliability/conversation-heartbeat.js +179 -0
  120. package/dist/reliability/conversation-heartbeat.js.map +1 -0
  121. package/dist/reliability/cron-api-server.d.ts +13 -0
  122. package/dist/reliability/cron-api-server.d.ts.map +1 -0
  123. package/dist/reliability/cron-api-server.js +247 -0
  124. package/dist/reliability/cron-api-server.js.map +1 -0
  125. package/dist/reliability/cron-control.d.ts +34 -0
  126. package/dist/reliability/cron-control.d.ts.map +1 -0
  127. package/dist/reliability/cron-control.js +864 -0
  128. package/dist/reliability/cron-control.js.map +1 -0
  129. package/dist/reliability/cron-semantic.d.ts +9 -0
  130. package/dist/reliability/cron-semantic.d.ts.map +1 -0
  131. package/dist/reliability/cron-semantic.js +208 -0
  132. package/dist/reliability/cron-semantic.js.map +1 -0
  133. package/dist/reliability/environment-doctor.d.ts +56 -0
  134. package/dist/reliability/environment-doctor.d.ts.map +1 -0
  135. package/dist/reliability/environment-doctor.js +213 -0
  136. package/dist/reliability/environment-doctor.js.map +1 -0
  137. package/dist/reliability/job-registry.d.ts +26 -0
  138. package/dist/reliability/job-registry.d.ts.map +1 -0
  139. package/dist/reliability/job-registry.js +77 -0
  140. package/dist/reliability/job-registry.js.map +1 -0
  141. package/dist/reliability/opencode-probe.d.ts +37 -0
  142. package/dist/reliability/opencode-probe.d.ts.map +1 -0
  143. package/dist/reliability/opencode-probe.js +195 -0
  144. package/dist/reliability/opencode-probe.js.map +1 -0
  145. package/dist/reliability/opencode-restart.d.ts +42 -0
  146. package/dist/reliability/opencode-restart.d.ts.map +1 -0
  147. package/dist/reliability/opencode-restart.js +155 -0
  148. package/dist/reliability/opencode-restart.js.map +1 -0
  149. package/dist/reliability/proactive-heartbeat.d.ts +39 -0
  150. package/dist/reliability/proactive-heartbeat.d.ts.map +1 -0
  151. package/dist/reliability/proactive-heartbeat.js +147 -0
  152. package/dist/reliability/proactive-heartbeat.js.map +1 -0
  153. package/dist/reliability/process-check-job.d.ts +73 -0
  154. package/dist/reliability/process-check-job.d.ts.map +1 -0
  155. package/dist/reliability/process-check-job.js +254 -0
  156. package/dist/reliability/process-check-job.js.map +1 -0
  157. package/dist/reliability/process-guard.d.ts +53 -0
  158. package/dist/reliability/process-guard.d.ts.map +1 -0
  159. package/dist/reliability/process-guard.js +344 -0
  160. package/dist/reliability/process-guard.js.map +1 -0
  161. package/dist/reliability/recovery-reporter.d.ts +37 -0
  162. package/dist/reliability/recovery-reporter.d.ts.map +1 -0
  163. package/dist/reliability/recovery-reporter.js +161 -0
  164. package/dist/reliability/recovery-reporter.js.map +1 -0
  165. package/dist/reliability/rescue-executor.d.ts +52 -0
  166. package/dist/reliability/rescue-executor.d.ts.map +1 -0
  167. package/dist/reliability/rescue-executor.js +244 -0
  168. package/dist/reliability/rescue-executor.js.map +1 -0
  169. package/dist/reliability/rescue-policy.d.ts +39 -0
  170. package/dist/reliability/rescue-policy.d.ts.map +1 -0
  171. package/dist/reliability/rescue-policy.js +85 -0
  172. package/dist/reliability/rescue-policy.js.map +1 -0
  173. package/dist/reliability/runtime-cron-dispatcher.d.ts +30 -0
  174. package/dist/reliability/runtime-cron-dispatcher.d.ts.map +1 -0
  175. package/dist/reliability/runtime-cron-dispatcher.js +100 -0
  176. package/dist/reliability/runtime-cron-dispatcher.js.map +1 -0
  177. package/dist/reliability/runtime-cron-orphan.d.ts +18 -0
  178. package/dist/reliability/runtime-cron-orphan.d.ts.map +1 -0
  179. package/dist/reliability/runtime-cron-orphan.js +87 -0
  180. package/dist/reliability/runtime-cron-orphan.js.map +1 -0
  181. package/dist/reliability/runtime-cron-registry.d.ts +4 -0
  182. package/dist/reliability/runtime-cron-registry.d.ts.map +1 -0
  183. package/dist/reliability/runtime-cron-registry.js +8 -0
  184. package/dist/reliability/runtime-cron-registry.js.map +1 -0
  185. package/dist/reliability/runtime-cron.d.ts +75 -0
  186. package/dist/reliability/runtime-cron.d.ts.map +1 -0
  187. package/dist/reliability/runtime-cron.js +309 -0
  188. package/dist/reliability/runtime-cron.js.map +1 -0
  189. package/dist/reliability/scheduler.d.ts +38 -0
  190. package/dist/reliability/scheduler.d.ts.map +1 -0
  191. package/dist/reliability/scheduler.js +174 -0
  192. package/dist/reliability/scheduler.js.map +1 -0
  193. package/dist/reliability/types.d.ts +151 -0
  194. package/dist/reliability/types.d.ts.map +1 -0
  195. package/dist/reliability/types.js +178 -0
  196. package/dist/reliability/types.js.map +1 -0
  197. package/dist/router/action-handlers.d.ts +27 -0
  198. package/dist/router/action-handlers.d.ts.map +1 -0
  199. package/dist/router/action-handlers.js +226 -0
  200. package/dist/router/action-handlers.js.map +1 -0
  201. package/dist/router/opencode-event-hub.d.ts +159 -0
  202. package/dist/router/opencode-event-hub.d.ts.map +1 -0
  203. package/dist/router/opencode-event-hub.js +589 -0
  204. package/dist/router/opencode-event-hub.js.map +1 -0
  205. package/dist/router/root-router.d.ts +94 -0
  206. package/dist/router/root-router.d.ts.map +1 -0
  207. package/dist/router/root-router.js +214 -0
  208. package/dist/router/root-router.js.map +1 -0
  209. package/dist/store/chat-session.d.ts +150 -0
  210. package/dist/store/chat-session.d.ts.map +1 -0
  211. package/dist/store/chat-session.js +640 -0
  212. package/dist/store/chat-session.js.map +1 -0
  213. package/dist/store/session-directory.d.ts +12 -0
  214. package/dist/store/session-directory.d.ts.map +1 -0
  215. package/dist/store/session-directory.js +47 -0
  216. package/dist/store/session-directory.js.map +1 -0
  217. package/dist/store/session-group.d.ts +19 -0
  218. package/dist/store/session-group.d.ts.map +1 -0
  219. package/dist/store/session-group.js +92 -0
  220. package/dist/store/session-group.js.map +1 -0
  221. package/dist/store/user-session.d.ts +19 -0
  222. package/dist/store/user-session.d.ts.map +1 -0
  223. package/dist/store/user-session.js +112 -0
  224. package/dist/store/user-session.js.map +1 -0
  225. package/dist/utils/async-queue.d.ts +12 -0
  226. package/dist/utils/async-queue.d.ts.map +1 -0
  227. package/dist/utils/async-queue.js +51 -0
  228. package/dist/utils/async-queue.js.map +1 -0
  229. package/dist/utils/directory-policy.d.ts +50 -0
  230. package/dist/utils/directory-policy.d.ts.map +1 -0
  231. package/dist/utils/directory-policy.js +379 -0
  232. package/dist/utils/directory-policy.js.map +1 -0
  233. package/dist/utils/session-title.d.ts +2 -0
  234. package/dist/utils/session-title.d.ts.map +1 -0
  235. package/dist/utils/session-title.js +10 -0
  236. package/dist/utils/session-title.js.map +1 -0
  237. package/package.json +73 -0
@@ -0,0 +1,497 @@
1
+ import { ActionRowBuilder, ChannelType, Client, Events, GatewayIntentBits, Partials, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, } from 'discord.js';
2
+ import { discordConfig } from '../../config.js';
3
+ import { opencodeClient } from '../../opencode/client.js';
4
+ import { chatSessionStore } from '../../store/chat-session.js';
5
+ import { reliabilityConfig } from '../../config.js';
6
+ import { getRuntimeCronManager } from '../../reliability/runtime-cron-registry.js';
7
+ import { cleanupRuntimeCronJobsByConversation } from '../../reliability/runtime-cron-orphan.js';
8
+ const DISCORD_MESSAGE_LIMIT = 1800;
9
+ function escapeRegExp(value) {
10
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
11
+ }
12
+ function isDiscordSendableChannel(channel) {
13
+ if (!channel || typeof channel !== 'object') {
14
+ return false;
15
+ }
16
+ const record = channel;
17
+ return typeof record.send === 'function'
18
+ && !!record.messages
19
+ && typeof record.messages.fetch === 'function';
20
+ }
21
+ class DiscordSender {
22
+ adapter;
23
+ constructor(adapter) {
24
+ this.adapter = adapter;
25
+ }
26
+ splitText(text) {
27
+ if (!text.trim()) {
28
+ return [];
29
+ }
30
+ if (text.length <= DISCORD_MESSAGE_LIMIT) {
31
+ return [text];
32
+ }
33
+ const chunks = [];
34
+ let remaining = text;
35
+ while (remaining.length > DISCORD_MESSAGE_LIMIT) {
36
+ const candidate = remaining.slice(0, DISCORD_MESSAGE_LIMIT);
37
+ const breakAt = Math.max(candidate.lastIndexOf('\n'), candidate.lastIndexOf(' '));
38
+ const cut = breakAt > Math.floor(DISCORD_MESSAGE_LIMIT * 0.5) ? breakAt : DISCORD_MESSAGE_LIMIT;
39
+ chunks.push(remaining.slice(0, cut));
40
+ remaining = remaining.slice(cut).trimStart();
41
+ }
42
+ if (remaining.length > 0) {
43
+ chunks.push(remaining);
44
+ }
45
+ return chunks;
46
+ }
47
+ normalizeCardPayload(card) {
48
+ const payload = card;
49
+ const content = (() => {
50
+ if (typeof payload.discordText === 'string' && payload.discordText.trim()) {
51
+ return payload.discordText;
52
+ }
53
+ const serialized = JSON.stringify(card, null, 2);
54
+ const clipped = serialized.length > 1500
55
+ ? `${serialized.slice(0, 1500)}\n...`
56
+ : serialized;
57
+ return `\`\`\`json\n${clipped}\n\`\`\``;
58
+ })();
59
+ const rows = this.buildSelectComponents(payload.discordComponents);
60
+ if (rows.length === 0) {
61
+ return { content };
62
+ }
63
+ return {
64
+ content,
65
+ components: rows,
66
+ };
67
+ }
68
+ buildSelectComponents(components) {
69
+ if (!Array.isArray(components) || components.length === 0) {
70
+ return [];
71
+ }
72
+ const rows = [];
73
+ for (const component of components.slice(0, 5)) {
74
+ if (!component || component.type === undefined || component.type === 'select') {
75
+ const options = Array.isArray(component.options) ? component.options.slice(0, 25) : [];
76
+ if (options.length === 0 || !component.customId) {
77
+ continue;
78
+ }
79
+ const menu = new StringSelectMenuBuilder()
80
+ .setCustomId(component.customId.slice(0, 100))
81
+ .setPlaceholder((component.placeholder || '请选择操作').slice(0, 150))
82
+ .setMinValues(Math.max(1, Math.min(component.minValues ?? 1, options.length)))
83
+ .setMaxValues(Math.max(1, Math.min(component.maxValues ?? 1, options.length)))
84
+ .setDisabled(component.disabled === true);
85
+ const builtOptions = [];
86
+ for (const option of options) {
87
+ const menuOption = new StringSelectMenuOptionBuilder()
88
+ .setLabel(option.label.slice(0, 100))
89
+ .setValue(option.value.slice(0, 100));
90
+ if (option.description) {
91
+ menuOption.setDescription(option.description.slice(0, 100));
92
+ }
93
+ if (option.emoji) {
94
+ menuOption.setEmoji(option.emoji);
95
+ }
96
+ builtOptions.push(menuOption);
97
+ }
98
+ menu.addOptions(builtOptions);
99
+ rows.push(new ActionRowBuilder().addComponents(menu));
100
+ }
101
+ }
102
+ return rows;
103
+ }
104
+ async sendText(conversationId, text) {
105
+ const channel = await this.adapter.resolveTextChannel(conversationId);
106
+ if (!channel) {
107
+ return null;
108
+ }
109
+ const chunks = this.splitText(text);
110
+ if (chunks.length === 0) {
111
+ return null;
112
+ }
113
+ let firstMessageId = null;
114
+ for (const chunk of chunks) {
115
+ const sent = await channel.send(chunk);
116
+ this.adapter.rememberMessageConversation(sent.id, conversationId);
117
+ if (!firstMessageId) {
118
+ firstMessageId = sent.id;
119
+ }
120
+ }
121
+ return firstMessageId;
122
+ }
123
+ async sendCard(conversationId, card) {
124
+ const channel = await this.adapter.resolveTextChannel(conversationId);
125
+ if (!channel) {
126
+ return null;
127
+ }
128
+ const payload = this.normalizeCardPayload(card);
129
+ const sent = await channel.send(payload);
130
+ this.adapter.rememberMessageConversation(sent.id, conversationId);
131
+ return sent.id;
132
+ }
133
+ async updateCard(messageId, card) {
134
+ const conversationId = this.adapter.getConversationByMessageId(messageId);
135
+ if (!conversationId) {
136
+ return false;
137
+ }
138
+ const message = await this.adapter.fetchMessage(conversationId, messageId);
139
+ if (!message) {
140
+ return false;
141
+ }
142
+ await message.edit(this.normalizeCardPayload(card));
143
+ return true;
144
+ }
145
+ async deleteMessage(messageId) {
146
+ const conversationId = this.adapter.getConversationByMessageId(messageId);
147
+ if (!conversationId) {
148
+ return false;
149
+ }
150
+ const message = await this.adapter.fetchMessage(conversationId, messageId);
151
+ if (!message) {
152
+ return false;
153
+ }
154
+ await message.delete();
155
+ this.adapter.forgetMessageConversation(messageId);
156
+ return true;
157
+ }
158
+ async reply(messageId, text) {
159
+ const conversationId = this.adapter.getConversationByMessageId(messageId);
160
+ if (!conversationId) {
161
+ return null;
162
+ }
163
+ const message = await this.adapter.fetchMessage(conversationId, messageId);
164
+ if (!message) {
165
+ return null;
166
+ }
167
+ const chunks = this.splitText(text);
168
+ if (chunks.length === 0) {
169
+ return null;
170
+ }
171
+ let firstMessageId = null;
172
+ try {
173
+ for (let index = 0; index < chunks.length; index++) {
174
+ const chunk = chunks[index];
175
+ if (!chunk) {
176
+ continue;
177
+ }
178
+ const sent = index === 0
179
+ ? await message.reply(chunk)
180
+ : await this.sendText(conversationId, chunk).then(async (sentId) => {
181
+ if (!sentId) {
182
+ throw new Error('Discord 发送失败');
183
+ }
184
+ const sentMessage = await this.adapter.fetchMessage(conversationId, sentId);
185
+ if (!sentMessage) {
186
+ throw new Error('Discord 发送后读取消息失败');
187
+ }
188
+ return sentMessage;
189
+ });
190
+ this.adapter.rememberMessageConversation(sent.id, conversationId);
191
+ if (!firstMessageId) {
192
+ firstMessageId = sent.id;
193
+ }
194
+ }
195
+ }
196
+ catch (error) {
197
+ console.warn('[Discord] reply 失败,降级为普通发送:', error);
198
+ return this.sendText(conversationId, text);
199
+ }
200
+ return firstMessageId;
201
+ }
202
+ async replyCard(messageId, card) {
203
+ const conversationId = this.adapter.getConversationByMessageId(messageId);
204
+ if (!conversationId) {
205
+ return null;
206
+ }
207
+ const message = await this.adapter.fetchMessage(conversationId, messageId);
208
+ if (!message) {
209
+ return null;
210
+ }
211
+ try {
212
+ const sent = await message.reply(this.normalizeCardPayload(card));
213
+ this.adapter.rememberMessageConversation(sent.id, conversationId);
214
+ return sent.id;
215
+ }
216
+ catch (error) {
217
+ console.warn('[Discord] replyCard 失败,降级为普通发送:', error);
218
+ return this.sendCard(conversationId, card);
219
+ }
220
+ }
221
+ }
222
+ export class DiscordAdapter {
223
+ platform = 'discord';
224
+ sender;
225
+ messageCallbacks = [];
226
+ interactionCallbacks = [];
227
+ actionCallbacks = [];
228
+ messageRecalledCallbacks = [];
229
+ messageConversationMap = new Map();
230
+ client = null;
231
+ isActive = false;
232
+ constructor() {
233
+ this.sender = new DiscordSender(this);
234
+ }
235
+ async start() {
236
+ if (!discordConfig.enabled) {
237
+ console.log('[Discord] 适配器未启用,跳过启动');
238
+ return;
239
+ }
240
+ if (!discordConfig.token) {
241
+ console.warn('[Discord] ⚠️ 已启用但缺少 DISCORD_TOKEN(或 DISCORD_BOT_TOKEN),适配器将保持不活跃状态');
242
+ console.warn('[Discord] 请设置 DISCORD_TOKEN 或 DISCORD_BOT_TOKEN 后重启服务');
243
+ return;
244
+ }
245
+ if (!discordConfig.clientId) {
246
+ console.warn('[Discord] ⚠️ 未设置 DISCORD_CLIENT_ID,后续交互能力可能受限');
247
+ }
248
+ if (this.client) {
249
+ console.warn('[Discord] 适配器已存在客户端实例,跳过重复启动');
250
+ return;
251
+ }
252
+ const client = new Client({
253
+ intents: [
254
+ GatewayIntentBits.Guilds,
255
+ GatewayIntentBits.GuildMessages,
256
+ GatewayIntentBits.DirectMessages,
257
+ GatewayIntentBits.MessageContent,
258
+ ],
259
+ partials: [Partials.Channel, Partials.Message],
260
+ });
261
+ client.once(Events.ClientReady, readyClient => {
262
+ this.isActive = true;
263
+ console.log(`[Discord] 已连接: ${readyClient.user.tag}`);
264
+ });
265
+ client.on(Events.MessageCreate, message => {
266
+ void this.handleMessageCreate(message).catch(error => {
267
+ console.error('[Discord] MessageCreate 处理失败:', error);
268
+ });
269
+ });
270
+ client.on(Events.InteractionCreate, interaction => {
271
+ void this.handleInteractionCreate(interaction).catch(error => {
272
+ console.error('[Discord] InteractionCreate 处理失败:', error);
273
+ });
274
+ });
275
+ client.on(Events.MessageDelete, message => {
276
+ this.forgetMessageConversation(message.id);
277
+ const payload = {
278
+ platform: 'discord',
279
+ messageId: message.id,
280
+ conversationId: message.channelId,
281
+ };
282
+ for (const callback of this.messageRecalledCallbacks) {
283
+ callback(payload);
284
+ }
285
+ });
286
+ client.on(Events.ChannelDelete, channel => {
287
+ void (async () => {
288
+ this.forgetConversationMessages(channel.id);
289
+ const sessionData = chatSessionStore.getSessionByConversation('discord', channel.id);
290
+ const sessionId = sessionData?.sessionId;
291
+ const shouldDeleteSession = Boolean(sessionId) && sessionData?.protectSessionDelete !== true;
292
+ if (reliabilityConfig.cronOrphanAutoCleanup) {
293
+ cleanupRuntimeCronJobsByConversation(getRuntimeCronManager(), 'discord', channel.id);
294
+ }
295
+ chatSessionStore.removeSessionByConversation('discord', channel.id);
296
+ console.log(`[Discord] 频道已删除,自动解绑会话: ${channel.id}`);
297
+ if (!sessionId || !shouldDeleteSession) {
298
+ if (sessionId && !shouldDeleteSession) {
299
+ console.log(`[Discord] 绑定会话受保护,跳过自动删除: ${sessionId}`);
300
+ }
301
+ return;
302
+ }
303
+ const deleted = await opencodeClient.deleteSession(sessionId, sessionData?.resolvedDirectory ? { directory: sessionData.resolvedDirectory } : undefined).catch(() => false);
304
+ if (deleted) {
305
+ console.log(`[Discord] 频道删除后已销毁 OpenCode 会话: ${sessionId}`);
306
+ }
307
+ else {
308
+ console.warn(`[Discord] 频道删除后销毁会话失败: ${sessionId}`);
309
+ }
310
+ })().catch(error => {
311
+ console.error('[Discord] ChannelDelete 处理失败:', error);
312
+ });
313
+ });
314
+ this.client = client;
315
+ await client.login(discordConfig.token);
316
+ console.log('[Discord] 网关登录请求已发送,等待 Ready 事件');
317
+ }
318
+ stop() {
319
+ if (!this.client) {
320
+ return;
321
+ }
322
+ this.client.destroy();
323
+ this.client = null;
324
+ this.isActive = false;
325
+ this.messageConversationMap.clear();
326
+ console.log('[Discord] 适配器已停止');
327
+ }
328
+ getSender() {
329
+ return this.sender;
330
+ }
331
+ onMessage(callback) {
332
+ this.messageCallbacks.push(callback);
333
+ }
334
+ onInteraction(callback) {
335
+ this.interactionCallbacks.push(callback);
336
+ }
337
+ onAction(callback) {
338
+ this.actionCallbacks.push(callback);
339
+ }
340
+ onMessageRecalled(callback) {
341
+ this.messageRecalledCallbacks.push(callback);
342
+ }
343
+ bindSession(conversationId, sessionId, creatorId) {
344
+ chatSessionStore.setSessionByConversation('discord', conversationId, sessionId, creatorId);
345
+ console.log(`[Discord] 会话绑定: discord:${conversationId} -> ${sessionId}`);
346
+ }
347
+ getSessionId(conversationId) {
348
+ return chatSessionStore.getSessionIdByConversation('discord', conversationId);
349
+ }
350
+ isAdapterActive() {
351
+ return this.isActive;
352
+ }
353
+ getConversationByMessageId(messageId) {
354
+ return this.messageConversationMap.get(messageId);
355
+ }
356
+ rememberMessageConversation(messageId, conversationId) {
357
+ this.messageConversationMap.set(messageId, conversationId);
358
+ }
359
+ forgetMessageConversation(messageId) {
360
+ this.messageConversationMap.delete(messageId);
361
+ }
362
+ forgetConversationMessages(conversationId) {
363
+ for (const [messageId, mappedConversationId] of this.messageConversationMap.entries()) {
364
+ if (mappedConversationId === conversationId) {
365
+ this.messageConversationMap.delete(messageId);
366
+ }
367
+ }
368
+ }
369
+ async resolveTextChannel(conversationId) {
370
+ if (!this.client) {
371
+ return null;
372
+ }
373
+ const channel = await this.client.channels.fetch(conversationId);
374
+ if (!channel || !channel.isTextBased() || !isDiscordSendableChannel(channel)) {
375
+ return null;
376
+ }
377
+ return channel;
378
+ }
379
+ async fetchMessage(conversationId, messageId) {
380
+ const channel = await this.resolveTextChannel(conversationId);
381
+ if (!channel) {
382
+ return null;
383
+ }
384
+ try {
385
+ const message = await channel.messages.fetch(messageId);
386
+ return message;
387
+ }
388
+ catch {
389
+ return null;
390
+ }
391
+ }
392
+ async handleMessageCreate(message) {
393
+ if (!this.client) {
394
+ return;
395
+ }
396
+ // 自己发的消息始终跳过
397
+ const selfBotId = this.client.user?.id;
398
+ if (selfBotId && message.author.id === selfBotId) {
399
+ return;
400
+ }
401
+ // 其他 bot 根据白名单判断
402
+ if (message.author.bot) {
403
+ const allowedBotIds = discordConfig.allowedBotIds;
404
+ // 白名单为空则拒绝所有 bot
405
+ if (!allowedBotIds || allowedBotIds.length === 0) {
406
+ return;
407
+ }
408
+ // 不在白名单则拒绝
409
+ if (!allowedBotIds.includes(message.author.id)) {
410
+ return;
411
+ }
412
+ }
413
+ const botId = this.client.user?.id;
414
+ const mentionPattern = botId
415
+ ? new RegExp(`<@!?${escapeRegExp(botId)}>`, 'g')
416
+ : null;
417
+ const mentionUsers = Array.from(message.mentions.users.values());
418
+ const targetMentions = botId
419
+ ? mentionUsers.filter(user => user.id === botId)
420
+ : mentionUsers;
421
+ const mentions = targetMentions.map(user => ({
422
+ key: `<@${user.id}>`,
423
+ id: { discord_id: user.id },
424
+ name: user.username,
425
+ }));
426
+ const cleanedContent = mentionPattern
427
+ ? message.content.replace(mentionPattern, '').trim()
428
+ : message.content.trim();
429
+ const attachments = Array.from(message.attachments.values()).map(attachment => ({
430
+ type: attachment.contentType?.startsWith('image/') ? 'image' : 'file',
431
+ fileKey: attachment.id,
432
+ fileName: attachment.name,
433
+ fileType: attachment.contentType || undefined,
434
+ fileSize: attachment.size,
435
+ }));
436
+ const chatType = message.channel.type === ChannelType.DM ? 'p2p' : 'group';
437
+ const event = {
438
+ platform: 'discord',
439
+ conversationId: message.channelId,
440
+ messageId: message.id,
441
+ senderId: message.author.id,
442
+ senderType: 'user',
443
+ content: cleanedContent,
444
+ msgType: message.attachments.size > 0 && !cleanedContent ? 'attachment' : 'text',
445
+ threadId: message.channel.isThread() ? message.channel.id : undefined,
446
+ chatType,
447
+ attachments: attachments.length > 0 ? attachments : undefined,
448
+ mentions: mentions.length > 0 ? mentions : undefined,
449
+ rawEvent: message,
450
+ };
451
+ this.rememberMessageConversation(message.id, message.channelId);
452
+ for (const callback of this.messageCallbacks) {
453
+ try {
454
+ await Promise.resolve(callback(event));
455
+ }
456
+ catch (error) {
457
+ console.error('[Discord] 消息回调执行失败:', error);
458
+ }
459
+ }
460
+ }
461
+ async handleInteractionCreate(interaction) {
462
+ if (interaction.isStringSelectMenu()) {
463
+ const event = {
464
+ platform: 'discord',
465
+ senderId: interaction.user.id,
466
+ action: {
467
+ tag: interaction.customId,
468
+ value: {
469
+ values: interaction.values,
470
+ },
471
+ },
472
+ token: interaction.id,
473
+ messageId: interaction.message?.id,
474
+ conversationId: interaction.channelId || undefined,
475
+ rawEvent: interaction,
476
+ };
477
+ for (const callback of this.actionCallbacks) {
478
+ try {
479
+ await Promise.resolve(callback(event));
480
+ }
481
+ catch (error) {
482
+ console.error('[Discord] 动作回调执行失败:', error);
483
+ }
484
+ }
485
+ }
486
+ for (const callback of this.interactionCallbacks) {
487
+ try {
488
+ await Promise.resolve(callback(interaction));
489
+ }
490
+ catch (error) {
491
+ console.error('[Discord] 交互回调执行失败:', error);
492
+ }
493
+ }
494
+ }
495
+ }
496
+ export const discordAdapter = new DiscordAdapter();
497
+ //# sourceMappingURL=discord-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-adapter.js","sourceRoot":"","sources":["../../../src/platform/adapters/discord-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Feishu 平台适配器
3
+ *
4
+ * 将现有 feishuClient 包装为 PlatformAdapter 接口,
5
+ * 提供事件映射和行为透传,不修改原有行为。
6
+ */
7
+ import type { PlatformAdapter, PlatformSender, PlatformMessageEvent, PlatformActionEvent } from '../types.js';
8
+ /**
9
+ * Feishu 平台适配器实现
10
+ *
11
+ * 通过包装 feishuClient 实现 PlatformAdapter 接口。
12
+ * 所有行为透传到底层客户端,不做额外处理。
13
+ */
14
+ export declare class FeishuAdapter implements PlatformAdapter {
15
+ readonly platform: "feishu";
16
+ private sender;
17
+ constructor();
18
+ start(): Promise<void>;
19
+ stop(): void;
20
+ getSender(): PlatformSender;
21
+ onMessage(callback: (event: PlatformMessageEvent) => void): void;
22
+ onAction(callback: (event: PlatformActionEvent) => void): void;
23
+ onChatUnavailable(callback: (conversationId: string) => void): void;
24
+ onMessageRecalled(callback: (event: unknown) => void): void;
25
+ onMemberLeft(callback: (conversationId: string, memberId: string) => void): void;
26
+ onChatDisbanded(callback: (conversationId: string) => void): void;
27
+ }
28
+ export declare const feishuAdapter: FeishuAdapter;
29
+ //# sourceMappingURL=feishu-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-adapter.d.ts","sourceRoot":"","sources":["../../../src/platform/adapters/feishu-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EAGpB,MAAM,aAAa,CAAC;AA+FrB;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,eAAe;IACnD,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAEtC,OAAO,CAAC,MAAM,CAAe;;IAMvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,IAAI,IAAI,IAAI;IAIZ,SAAS,IAAI,cAAc;IAI3B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,GAAG,IAAI;IAOhE,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAAG,IAAI;IAS9D,iBAAiB,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAOnE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAI3D,YAAY,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAOhF,eAAe,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;CAMlE;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC"}