botmux 1.0.0

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 (202) hide show
  1. package/.env.example +24 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +267 -0
  4. package/README.md +267 -0
  5. package/dist/adapters/backend/pty-backend.d.ts +13 -0
  6. package/dist/adapters/backend/pty-backend.d.ts.map +1 -0
  7. package/dist/adapters/backend/pty-backend.js +39 -0
  8. package/dist/adapters/backend/pty-backend.js.map +1 -0
  9. package/dist/adapters/backend/tmux-backend.d.ts +20 -0
  10. package/dist/adapters/backend/tmux-backend.d.ts.map +1 -0
  11. package/dist/adapters/backend/tmux-backend.js +30 -0
  12. package/dist/adapters/backend/tmux-backend.js.map +1 -0
  13. package/dist/adapters/backend/types.d.ts +19 -0
  14. package/dist/adapters/backend/types.d.ts.map +1 -0
  15. package/dist/adapters/backend/types.js +2 -0
  16. package/dist/adapters/backend/types.js.map +1 -0
  17. package/dist/adapters/cli/aiden.d.ts +4 -0
  18. package/dist/adapters/cli/aiden.d.ts.map +1 -0
  19. package/dist/adapters/cli/aiden.js +63 -0
  20. package/dist/adapters/cli/aiden.js.map +1 -0
  21. package/dist/adapters/cli/claude-code.d.ts +4 -0
  22. package/dist/adapters/cli/claude-code.d.ts.map +1 -0
  23. package/dist/adapters/cli/claude-code.js +59 -0
  24. package/dist/adapters/cli/claude-code.js.map +1 -0
  25. package/dist/adapters/cli/coco.d.ts +4 -0
  26. package/dist/adapters/cli/coco.d.ts.map +1 -0
  27. package/dist/adapters/cli/coco.js +46 -0
  28. package/dist/adapters/cli/coco.js.map +1 -0
  29. package/dist/adapters/cli/codex.d.ts +4 -0
  30. package/dist/adapters/cli/codex.d.ts.map +1 -0
  31. package/dist/adapters/cli/codex.js +47 -0
  32. package/dist/adapters/cli/codex.js.map +1 -0
  33. package/dist/adapters/cli/registry.d.ts +13 -0
  34. package/dist/adapters/cli/registry.d.ts.map +1 -0
  35. package/dist/adapters/cli/registry.js +42 -0
  36. package/dist/adapters/cli/registry.js.map +1 -0
  37. package/dist/adapters/cli/types.d.ts +39 -0
  38. package/dist/adapters/cli/types.d.ts.map +1 -0
  39. package/dist/adapters/cli/types.js +2 -0
  40. package/dist/adapters/cli/types.js.map +1 -0
  41. package/dist/cli.d.ts +3 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +245 -0
  44. package/dist/cli.js.map +1 -0
  45. package/dist/config.d.ts +24 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +39 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/core/command-handler.d.ts +11 -0
  50. package/dist/core/command-handler.d.ts.map +1 -0
  51. package/dist/core/command-handler.js +322 -0
  52. package/dist/core/command-handler.js.map +1 -0
  53. package/dist/core/cost-calculator.d.ts +12 -0
  54. package/dist/core/cost-calculator.d.ts.map +1 -0
  55. package/dist/core/cost-calculator.js +61 -0
  56. package/dist/core/cost-calculator.js.map +1 -0
  57. package/dist/core/scheduler.d.ts +38 -0
  58. package/dist/core/scheduler.d.ts.map +1 -0
  59. package/dist/core/scheduler.js +221 -0
  60. package/dist/core/scheduler.js.map +1 -0
  61. package/dist/core/session-manager.d.ts +13 -0
  62. package/dist/core/session-manager.d.ts.map +1 -0
  63. package/dist/core/session-manager.js +125 -0
  64. package/dist/core/session-manager.js.map +1 -0
  65. package/dist/core/types.d.ts +29 -0
  66. package/dist/core/types.d.ts.map +1 -0
  67. package/dist/core/types.js +2 -0
  68. package/dist/core/types.js.map +1 -0
  69. package/dist/core/worker-pool.d.ts +26 -0
  70. package/dist/core/worker-pool.d.ts.map +1 -0
  71. package/dist/core/worker-pool.js +261 -0
  72. package/dist/core/worker-pool.js.map +1 -0
  73. package/dist/daemon.d.ts +3 -0
  74. package/dist/daemon.d.ts.map +1 -0
  75. package/dist/daemon.js +344 -0
  76. package/dist/daemon.js.map +1 -0
  77. package/dist/im/lark/card-builder.d.ts +18 -0
  78. package/dist/im/lark/card-builder.d.ts.map +1 -0
  79. package/dist/im/lark/card-builder.js +194 -0
  80. package/dist/im/lark/card-builder.js.map +1 -0
  81. package/dist/im/lark/card-handler.d.ts +9 -0
  82. package/dist/im/lark/card-handler.d.ts.map +1 -0
  83. package/dist/im/lark/card-handler.js +131 -0
  84. package/dist/im/lark/card-handler.js.map +1 -0
  85. package/dist/im/lark/client.d.ts +23 -0
  86. package/dist/im/lark/client.d.ts.map +1 -0
  87. package/dist/im/lark/client.js +259 -0
  88. package/dist/im/lark/client.js.map +1 -0
  89. package/dist/im/lark/event-dispatcher.d.ts +34 -0
  90. package/dist/im/lark/event-dispatcher.d.ts.map +1 -0
  91. package/dist/im/lark/event-dispatcher.js +195 -0
  92. package/dist/im/lark/event-dispatcher.js.map +1 -0
  93. package/dist/im/lark/message-parser.d.ts +45 -0
  94. package/dist/im/lark/message-parser.d.ts.map +1 -0
  95. package/dist/im/lark/message-parser.js +132 -0
  96. package/dist/im/lark/message-parser.js.map +1 -0
  97. package/dist/im/types.d.ts +78 -0
  98. package/dist/im/types.d.ts.map +1 -0
  99. package/dist/im/types.js +2 -0
  100. package/dist/im/types.js.map +1 -0
  101. package/dist/index-daemon.d.ts +3 -0
  102. package/dist/index-daemon.d.ts.map +1 -0
  103. package/dist/index-daemon.js +21 -0
  104. package/dist/index-daemon.js.map +1 -0
  105. package/dist/index.d.ts +3 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +16 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/scheduler.d.ts +38 -0
  110. package/dist/scheduler.d.ts.map +1 -0
  111. package/dist/scheduler.js +221 -0
  112. package/dist/scheduler.js.map +1 -0
  113. package/dist/server.d.ts +3 -0
  114. package/dist/server.d.ts.map +1 -0
  115. package/dist/server.js +23 -0
  116. package/dist/server.js.map +1 -0
  117. package/dist/services/lark-client.d.ts +22 -0
  118. package/dist/services/lark-client.d.ts.map +1 -0
  119. package/dist/services/lark-client.js +238 -0
  120. package/dist/services/lark-client.js.map +1 -0
  121. package/dist/services/lark-ws.d.ts +5 -0
  122. package/dist/services/lark-ws.d.ts.map +1 -0
  123. package/dist/services/lark-ws.js +79 -0
  124. package/dist/services/lark-ws.js.map +1 -0
  125. package/dist/services/message-queue.d.ts +9 -0
  126. package/dist/services/message-queue.d.ts.map +1 -0
  127. package/dist/services/message-queue.js +77 -0
  128. package/dist/services/message-queue.js.map +1 -0
  129. package/dist/services/message-router.d.ts +8 -0
  130. package/dist/services/message-router.d.ts.map +1 -0
  131. package/dist/services/message-router.js +73 -0
  132. package/dist/services/message-router.js.map +1 -0
  133. package/dist/services/project-scanner.d.ts +12 -0
  134. package/dist/services/project-scanner.d.ts.map +1 -0
  135. package/dist/services/project-scanner.js +109 -0
  136. package/dist/services/project-scanner.js.map +1 -0
  137. package/dist/services/schedule-store.d.ts +14 -0
  138. package/dist/services/schedule-store.d.ts.map +1 -0
  139. package/dist/services/schedule-store.js +89 -0
  140. package/dist/services/schedule-store.js.map +1 -0
  141. package/dist/services/session-store.d.ts +8 -0
  142. package/dist/services/session-store.d.ts.map +1 -0
  143. package/dist/services/session-store.js +93 -0
  144. package/dist/services/session-store.js.map +1 -0
  145. package/dist/tools/close-session.d.ts +22 -0
  146. package/dist/tools/close-session.d.ts.map +1 -0
  147. package/dist/tools/close-session.js +38 -0
  148. package/dist/tools/close-session.js.map +1 -0
  149. package/dist/tools/create-session.d.ts +28 -0
  150. package/dist/tools/create-session.d.ts.map +1 -0
  151. package/dist/tools/create-session.js +40 -0
  152. package/dist/tools/create-session.js.map +1 -0
  153. package/dist/tools/get-thread-messages.d.ts +26 -0
  154. package/dist/tools/get-thread-messages.d.ts.map +1 -0
  155. package/dist/tools/get-thread-messages.js +33 -0
  156. package/dist/tools/get-thread-messages.js.map +1 -0
  157. package/dist/tools/index.d.ts +9 -0
  158. package/dist/tools/index.d.ts.map +1 -0
  159. package/dist/tools/index.js +10 -0
  160. package/dist/tools/index.js.map +1 -0
  161. package/dist/tools/react-to-message.d.ts +41 -0
  162. package/dist/tools/react-to-message.d.ts.map +1 -0
  163. package/dist/tools/react-to-message.js +30 -0
  164. package/dist/tools/react-to-message.js.map +1 -0
  165. package/dist/tools/send-to-thread.d.ts +24 -0
  166. package/dist/tools/send-to-thread.d.ts.map +1 -0
  167. package/dist/tools/send-to-thread.js +83 -0
  168. package/dist/tools/send-to-thread.js.map +1 -0
  169. package/dist/tools/wait-for-reply.d.ts +17 -0
  170. package/dist/tools/wait-for-reply.d.ts.map +1 -0
  171. package/dist/tools/wait-for-reply.js +65 -0
  172. package/dist/tools/wait-for-reply.js.map +1 -0
  173. package/dist/types.d.ts +85 -0
  174. package/dist/types.d.ts.map +1 -0
  175. package/dist/types.js +6 -0
  176. package/dist/types.js.map +1 -0
  177. package/dist/utils/card-builder.d.ts +16 -0
  178. package/dist/utils/card-builder.d.ts.map +1 -0
  179. package/dist/utils/card-builder.js +183 -0
  180. package/dist/utils/card-builder.js.map +1 -0
  181. package/dist/utils/idle-detector.d.ts +21 -0
  182. package/dist/utils/idle-detector.d.ts.map +1 -0
  183. package/dist/utils/idle-detector.js +95 -0
  184. package/dist/utils/idle-detector.js.map +1 -0
  185. package/dist/utils/logger.d.ts +7 -0
  186. package/dist/utils/logger.d.ts.map +1 -0
  187. package/dist/utils/logger.js +22 -0
  188. package/dist/utils/logger.js.map +1 -0
  189. package/dist/utils/message-parser.d.ts +45 -0
  190. package/dist/utils/message-parser.d.ts.map +1 -0
  191. package/dist/utils/message-parser.js +132 -0
  192. package/dist/utils/message-parser.js.map +1 -0
  193. package/dist/utils/terminal-renderer.d.ts +39 -0
  194. package/dist/utils/terminal-renderer.d.ts.map +1 -0
  195. package/dist/utils/terminal-renderer.js +186 -0
  196. package/dist/utils/terminal-renderer.js.map +1 -0
  197. package/dist/worker.d.ts +3 -0
  198. package/dist/worker.d.ts.map +1 -0
  199. package/dist/worker.js +411 -0
  200. package/dist/worker.js.map +1 -0
  201. package/ecosystem.config.cjs +15 -0
  202. package/package.json +60 -0
@@ -0,0 +1,259 @@
1
+ import * as Lark from '@larksuiteoapi/node-sdk';
2
+ import { writeFileSync, mkdirSync, existsSync } from 'node:fs';
3
+ import { dirname } from 'node:path';
4
+ import { config } from '../../config.js';
5
+ import { logger } from '../../utils/logger.js';
6
+ let client;
7
+ export function getLarkClient() {
8
+ if (!client) {
9
+ // Provide a custom logger that writes to stderr.
10
+ // The default Lark SDK logger uses console.log (stdout), which corrupts
11
+ // MCP stdio protocol when the server is spawned as an MCP child process.
12
+ const stderrLogger = {
13
+ error: (...msg) => { process.stderr.write(`[lark:error] ${msg.map(m => JSON.stringify(m)).join(' ')}\n`); },
14
+ warn: (...msg) => { process.stderr.write(`[lark:warn] ${msg.map(m => JSON.stringify(m)).join(' ')}\n`); },
15
+ info: (...msg) => { process.stderr.write(`[lark:info] ${msg.map(m => JSON.stringify(m)).join(' ')}\n`); },
16
+ debug: (...msg) => { process.stderr.write(`[lark:debug] ${msg.map(m => JSON.stringify(m)).join(' ')}\n`); },
17
+ trace: (...msg) => { process.stderr.write(`[lark:trace] ${msg.map(m => JSON.stringify(m)).join(' ')}\n`); },
18
+ };
19
+ client = new Lark.Client({
20
+ appId: config.lark.appId,
21
+ appSecret: config.lark.appSecret,
22
+ logger: stderrLogger,
23
+ });
24
+ }
25
+ return client;
26
+ }
27
+ export async function sendMessage(chatId, content, msgType = 'text') {
28
+ const c = getLarkClient();
29
+ const body = msgType === 'text' ? JSON.stringify({ text: content }) : content;
30
+ const res = await c.im.v1.message.create({
31
+ params: { receive_id_type: 'chat_id' },
32
+ data: {
33
+ receive_id: chatId,
34
+ msg_type: msgType,
35
+ content: body,
36
+ },
37
+ });
38
+ if (res.code !== 0) {
39
+ throw new Error(`Failed to send message: ${res.msg} (code: ${res.code})`);
40
+ }
41
+ const messageId = res.data?.message_id;
42
+ if (!messageId)
43
+ throw new Error('No message_id in response');
44
+ logger.info(`Sent message ${messageId} to chat ${chatId}`);
45
+ return messageId;
46
+ }
47
+ export async function replyMessage(messageId, content, msgType = 'text', replyInThread = false) {
48
+ const c = getLarkClient();
49
+ const body = msgType === 'text' ? JSON.stringify({ text: content }) : content;
50
+ const res = await c.im.v1.message.reply({
51
+ path: { message_id: messageId },
52
+ data: {
53
+ msg_type: msgType,
54
+ content: body,
55
+ ...(replyInThread ? { reply_in_thread: true } : {}),
56
+ },
57
+ });
58
+ if (res.code !== 0) {
59
+ throw new Error(`Failed to reply message: ${res.msg} (code: ${res.code})`);
60
+ }
61
+ const replyId = res.data?.message_id;
62
+ if (!replyId)
63
+ throw new Error('No message_id in reply response');
64
+ logger.info(`Replied ${replyId} to message ${messageId}${replyInThread ? ' (in thread)' : ''}`);
65
+ return replyId;
66
+ }
67
+ export async function addReaction(messageId, emojiType) {
68
+ const c = getLarkClient();
69
+ const res = await c.im.v1.messageReaction.create({
70
+ path: { message_id: messageId },
71
+ data: { reaction_type: { emoji_type: emojiType } },
72
+ });
73
+ if (res.code !== 0) {
74
+ throw new Error(`Failed to add reaction: ${res.msg} (code: ${res.code})`);
75
+ }
76
+ const reactionId = res.data?.reaction_id;
77
+ logger.info(`Added reaction ${emojiType} (${reactionId}) to message ${messageId}`);
78
+ return reactionId ?? '';
79
+ }
80
+ export async function removeReaction(messageId, reactionId) {
81
+ const c = getLarkClient();
82
+ const res = await c.im.v1.messageReaction.delete({
83
+ path: { message_id: messageId, reaction_id: reactionId },
84
+ });
85
+ if (res.code !== 0) {
86
+ throw new Error(`Failed to remove reaction: ${res.msg} (code: ${res.code})`);
87
+ }
88
+ logger.info(`Removed reaction ${reactionId} from message ${messageId}`);
89
+ }
90
+ export async function sendUserMessage(openId, content, msgType = 'text') {
91
+ const c = getLarkClient();
92
+ const body = msgType === 'text' ? JSON.stringify({ text: content }) : content;
93
+ const res = await c.im.v1.message.create({
94
+ params: { receive_id_type: 'open_id' },
95
+ data: {
96
+ receive_id: openId,
97
+ msg_type: msgType,
98
+ content: body,
99
+ },
100
+ });
101
+ if (res.code !== 0) {
102
+ throw new Error(`Failed to send user message: ${res.msg} (code: ${res.code})`);
103
+ }
104
+ const messageId = res.data?.message_id;
105
+ if (!messageId)
106
+ throw new Error('No message_id in response');
107
+ logger.info(`Sent DM ${messageId} to user ${openId}`);
108
+ return messageId;
109
+ }
110
+ export async function getChatInfo(chatId) {
111
+ const c = getLarkClient();
112
+ const res = await c.im.v1.chat.get({
113
+ path: { chat_id: chatId },
114
+ });
115
+ if (res.code !== 0) {
116
+ throw new Error(`Failed to get chat info: ${res.msg} (code: ${res.code})`);
117
+ }
118
+ // user_count excludes bots, only real users
119
+ return { userCount: Number(res.data?.user_count ?? 0) };
120
+ }
121
+ export async function updateMessage(messageId, cardJson) {
122
+ const c = getLarkClient();
123
+ const res = await c.im.v1.message.patch({
124
+ path: { message_id: messageId },
125
+ data: { content: cardJson },
126
+ });
127
+ if (res.code !== 0) {
128
+ throw new Error(`Failed to update message: ${res.msg} (code: ${res.code})`);
129
+ }
130
+ }
131
+ export async function getMessageDetail(messageId) {
132
+ const c = getLarkClient();
133
+ const res = await c.im.v1.message.get({
134
+ path: { message_id: messageId },
135
+ });
136
+ if (res.code !== 0) {
137
+ throw new Error(`Failed to get message: ${res.msg} (code: ${res.code})`);
138
+ }
139
+ return res.data;
140
+ }
141
+ export async function downloadMessageResource(messageId, fileKey, type, savePath) {
142
+ const c = getLarkClient();
143
+ const dir = dirname(savePath);
144
+ if (!existsSync(dir)) {
145
+ mkdirSync(dir, { recursive: true });
146
+ }
147
+ const res = await c.im.v1.messageResource.get({
148
+ path: { message_id: messageId, file_key: fileKey },
149
+ params: { type },
150
+ });
151
+ if (res instanceof Buffer) {
152
+ writeFileSync(savePath, res);
153
+ }
154
+ else if (res && typeof res === 'object' && 'writeFile' in res) {
155
+ await res.writeFile(savePath);
156
+ }
157
+ else {
158
+ // Response is likely a readable stream or buffer-like
159
+ const chunks = [];
160
+ for await (const chunk of res) {
161
+ chunks.push(Buffer.from(chunk));
162
+ }
163
+ writeFileSync(savePath, Buffer.concat(chunks));
164
+ }
165
+ logger.info(`Downloaded ${type} ${fileKey} → ${savePath}`);
166
+ }
167
+ /**
168
+ * Resolve email prefixes (e.g. "john.doe") to Lark open_ids via batch user lookup.
169
+ * Accepts mixed input: items starting with "ou_" are kept as-is; everything else
170
+ * is treated as an email and looked up. If no "@" is present, `LARK_EMAIL_DOMAIN`
171
+ * env var is used as the default domain (e.g. `john.doe` → `john.doe@example.com`).
172
+ * Returns an array of open_ids (unresolvable entries are dropped with a warning).
173
+ */
174
+ export async function resolveAllowedUsers(raw) {
175
+ const openIds = [];
176
+ const emailPrefixes = [];
177
+ for (const v of raw) {
178
+ if (v.startsWith('ou_')) {
179
+ openIds.push(v);
180
+ }
181
+ else {
182
+ emailPrefixes.push(v);
183
+ }
184
+ }
185
+ if (emailPrefixes.length === 0)
186
+ return openIds;
187
+ const domain = process.env.LARK_EMAIL_DOMAIN ?? '';
188
+ const emails = emailPrefixes.map(p => {
189
+ if (p.includes('@'))
190
+ return p;
191
+ if (!domain) {
192
+ logger.warn(`Email prefix "${p}" has no domain and LARK_EMAIL_DOMAIN is not set — skipping`);
193
+ return '';
194
+ }
195
+ return `${p}@${domain}`;
196
+ }).filter(Boolean);
197
+ const c = getLarkClient();
198
+ try {
199
+ const res = await c.contact.v3.user.batchGetId({
200
+ params: { user_id_type: 'open_id' },
201
+ data: { emails, include_resigned: false },
202
+ });
203
+ if (res.code !== 0) {
204
+ logger.warn(`Failed to resolve emails to open_ids: ${res.msg} (code: ${res.code})`);
205
+ return openIds;
206
+ }
207
+ const userList = res.data?.user_list ?? [];
208
+ for (const item of userList) {
209
+ if (item.user_id) {
210
+ openIds.push(item.user_id);
211
+ logger.info(`Resolved ${item.email} → ${item.user_id}`);
212
+ }
213
+ else {
214
+ logger.warn(`Could not resolve email: ${item.email}`);
215
+ }
216
+ }
217
+ }
218
+ catch (err) {
219
+ logger.warn(`resolveAllowedUsers failed: ${err.message}`);
220
+ }
221
+ return openIds;
222
+ }
223
+ export async function listThreadMessages(chatId, rootMessageId, pageSize = 50) {
224
+ const c = getLarkClient();
225
+ const allMessages = [];
226
+ let pageToken;
227
+ // Lark API only supports container_id_type="chat", so we list chat messages
228
+ // and filter by root_id to get thread messages
229
+ do {
230
+ const res = await c.im.v1.message.list({
231
+ params: {
232
+ container_id_type: 'chat',
233
+ container_id: chatId,
234
+ page_size: pageSize,
235
+ sort_type: 'ByCreateTimeDesc',
236
+ ...(pageToken ? { page_token: pageToken } : {}),
237
+ },
238
+ });
239
+ if (res.code !== 0) {
240
+ throw new Error(`Failed to list messages: ${res.msg} (code: ${res.code})`);
241
+ }
242
+ if (res.data?.items) {
243
+ for (const item of res.data.items) {
244
+ // Include the root message itself and all its thread replies
245
+ if (item.message_id === rootMessageId || item.root_id === rootMessageId) {
246
+ allMessages.push(item);
247
+ }
248
+ }
249
+ }
250
+ pageToken = res.data?.page_token;
251
+ // Stop early if we've collected enough or gone past the root message timestamp
252
+ if (allMessages.length >= pageSize)
253
+ break;
254
+ } while (pageToken);
255
+ // Sort by create_time ascending
256
+ allMessages.sort((a, b) => (a.create_time ?? '').localeCompare(b.create_time ?? ''));
257
+ return allMessages;
258
+ }
259
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/im/lark/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Lark event dispatcher — handles WSClient setup, bot identity probing,
3
+ * and message routing (group access checks, @mention detection).
4
+ * Extracted from daemon.ts for modularity.
5
+ */
6
+ import * as Lark from '@larksuiteoapi/node-sdk';
7
+ export declare function getBotOpenId(): string | undefined;
8
+ export declare function setBotOpenId(id: string): void;
9
+ /**
10
+ * Probe the bot's own open_id at startup via the Lark bot info API.
11
+ */
12
+ export declare function probeBotOpenId(): Promise<void>;
13
+ export declare const CHAT_CACHE_TTL: number;
14
+ export declare function getGroupUserCount(chatId: string): Promise<number>;
15
+ /** Check if the bot was @mentioned in this message */
16
+ export declare function isBotMentioned(message: any, _senderOpenId: string | undefined): boolean;
17
+ /**
18
+ * Check group message addressing:
19
+ * - 'allowed' -> sender is allowed, bot was @mentioned or solo group
20
+ * - 'not_allowed' -> bot was @mentioned but sender is not in allowlist
21
+ * - 'ignore' -> not addressed to bot at all
22
+ */
23
+ export declare function checkGroupMessageAccess(message: any, chatId: string, senderOpenId: string | undefined): Promise<'allowed' | 'not_allowed' | 'ignore'>;
24
+ export interface EventHandlers {
25
+ handleCardAction: (data: any) => Promise<void>;
26
+ handleNewTopic: (data: any, chatId: string, messageId: string, chatType: 'group' | 'p2p') => Promise<void>;
27
+ handleThreadReply: (data: any, rootId: string) => Promise<void>;
28
+ }
29
+ /**
30
+ * Create and start the Lark WSClient with event dispatching.
31
+ * Returns the WSClient instance for lifecycle management.
32
+ */
33
+ export declare function startLarkEventDispatcher(handlers: EventHandlers): Lark.WSClient;
34
+ //# sourceMappingURL=event-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-dispatcher.d.ts","sourceRoot":"","sources":["../../../src/im/lark/event-dispatcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAShD,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BpD;AAKD,eAAO,MAAM,cAAc,QAAa,CAAC;AAEzC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE;AAID,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAYvF;AAID;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,GAC7D,OAAO,CAAC,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC,CAkB/C;AAID,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,cAAc,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3G,iBAAiB,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC,QAAQ,CAqF/E"}
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Lark event dispatcher — handles WSClient setup, bot identity probing,
3
+ * and message routing (group access checks, @mention detection).
4
+ * Extracted from daemon.ts for modularity.
5
+ */
6
+ import * as Lark from '@larksuiteoapi/node-sdk';
7
+ import { config } from '../../config.js';
8
+ import { getChatInfo, replyMessage } from './client.js';
9
+ import { logger } from '../../utils/logger.js';
10
+ // ─── Bot identity ─────────────────────────────────────────────────────────
11
+ let botOpenId;
12
+ export function getBotOpenId() {
13
+ return botOpenId;
14
+ }
15
+ export function setBotOpenId(id) {
16
+ botOpenId = id;
17
+ }
18
+ /**
19
+ * Probe the bot's own open_id at startup via the Lark bot info API.
20
+ */
21
+ export async function probeBotOpenId() {
22
+ if (botOpenId)
23
+ return; // already known
24
+ // Call /bot/v3/info to get the bot's open_id using tenant_access_token
25
+ const tokenRes = await fetch('https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal', {
26
+ method: 'POST',
27
+ headers: { 'Content-Type': 'application/json' },
28
+ body: JSON.stringify({ app_id: config.lark.appId, app_secret: config.lark.appSecret }),
29
+ });
30
+ const tokenData = await tokenRes.json();
31
+ if (tokenData.code !== 0) {
32
+ throw new Error(`Failed to get tenant_access_token: ${tokenData.msg}`);
33
+ }
34
+ const botRes = await fetch('https://open.feishu.cn/open-apis/bot/v3/info/', {
35
+ headers: { Authorization: `Bearer ${tokenData.tenant_access_token}` },
36
+ });
37
+ const botData = await botRes.json();
38
+ if (botData.code !== 0) {
39
+ throw new Error(`Failed to get bot info: ${botData.msg}`);
40
+ }
41
+ const openId = botData.bot?.open_id;
42
+ if (openId) {
43
+ botOpenId = openId;
44
+ logger.info(`Bot open_id: ${botOpenId}`);
45
+ }
46
+ else {
47
+ throw new Error('No open_id in bot info response');
48
+ }
49
+ }
50
+ // ─── Group user count cache ───────────────────────────────────────────────
51
+ const chatUserCountCache = new Map();
52
+ export const CHAT_CACHE_TTL = 5 * 60_000; // 5 minutes
53
+ export async function getGroupUserCount(chatId) {
54
+ const cached = chatUserCountCache.get(chatId);
55
+ if (cached && Date.now() - cached.fetchedAt < CHAT_CACHE_TTL) {
56
+ return cached.count;
57
+ }
58
+ try {
59
+ const info = await getChatInfo(chatId);
60
+ chatUserCountCache.set(chatId, { count: info.userCount, fetchedAt: Date.now() });
61
+ return info.userCount;
62
+ }
63
+ catch (err) {
64
+ logger.debug(`Failed to get chat user count for ${chatId}: ${err}`);
65
+ return cached?.count ?? 999; // fallback: assume multi-person
66
+ }
67
+ }
68
+ // ─── @mention detection ──────────────────────────────────────────────────
69
+ /** Check if the bot was @mentioned in this message */
70
+ export function isBotMentioned(message, _senderOpenId) {
71
+ const mentions = message.mentions ?? [];
72
+ if (mentions.length === 0)
73
+ return false;
74
+ if (!botOpenId) {
75
+ // Bot open_id unknown — cannot reliably detect @bot mentions.
76
+ // Will be resolved once probeBotOpenId() completes or first bot message event arrives.
77
+ logger.warn('Bot open_id unknown, cannot check @mentions');
78
+ return false;
79
+ }
80
+ return mentions.some((m) => m.id?.open_id === botOpenId);
81
+ }
82
+ // ─── Group message access check ──────────────────────────────────────────
83
+ /**
84
+ * Check group message addressing:
85
+ * - 'allowed' -> sender is allowed, bot was @mentioned or solo group
86
+ * - 'not_allowed' -> bot was @mentioned but sender is not in allowlist
87
+ * - 'ignore' -> not addressed to bot at all
88
+ */
89
+ export async function checkGroupMessageAccess(message, chatId, senderOpenId) {
90
+ const mentioned = isBotMentioned(message, senderOpenId);
91
+ const allowedUsers = config.daemon.allowedUsers;
92
+ const isAllowed = allowedUsers.length === 0 || (!!senderOpenId && allowedUsers.includes(senderOpenId));
93
+ if (mentioned) {
94
+ return isAllowed ? 'allowed' : 'not_allowed';
95
+ }
96
+ // No @mention — only allow if sender is the sole human in the group
97
+ if (isAllowed) {
98
+ const userCount = await getGroupUserCount(chatId);
99
+ if (userCount <= 1) {
100
+ return 'allowed';
101
+ }
102
+ }
103
+ return 'ignore';
104
+ }
105
+ /**
106
+ * Create and start the Lark WSClient with event dispatching.
107
+ * Returns the WSClient instance for lifecycle management.
108
+ */
109
+ export function startLarkEventDispatcher(handlers) {
110
+ const eventDispatcher = new Lark.EventDispatcher({}).register({
111
+ 'card.action.trigger': async (data) => {
112
+ try {
113
+ await handlers.handleCardAction(data);
114
+ }
115
+ catch (err) {
116
+ logger.error(`Error handling card action: ${err}`);
117
+ }
118
+ // Return undefined so WSClient sends no response body (avoids error 200672)
119
+ return undefined;
120
+ },
121
+ 'im.message.receive_v1': async (data) => {
122
+ try {
123
+ const message = data.message;
124
+ const sender = data.sender;
125
+ if (!message)
126
+ return;
127
+ // Learn bot's own open_id from its outgoing messages
128
+ if (sender?.sender_type === 'app') {
129
+ if (!botOpenId && sender.sender_id?.open_id) {
130
+ botOpenId = sender.sender_id.open_id;
131
+ logger.info(`Learned bot open_id from message event: ${botOpenId}`);
132
+ }
133
+ // Allow bot's own messages only if they are /close commands in threads
134
+ const rootId = message.root_id;
135
+ if (!rootId)
136
+ return;
137
+ try {
138
+ const body = JSON.parse(message.content ?? '{}');
139
+ if (body.text?.trim() !== '/close')
140
+ return;
141
+ }
142
+ catch {
143
+ return;
144
+ }
145
+ handlers.handleThreadReply(data, rootId).catch(err => logger.error(`Error handling message event: ${err}`));
146
+ return;
147
+ }
148
+ const rootId = message.root_id;
149
+ const chatId = message.chat_id;
150
+ const chatType = message.chat_type; // 'group' or 'p2p'
151
+ const messageId = message.message_id;
152
+ const senderOpenId = sender?.sender_id?.open_id;
153
+ const allowedUsers = config.daemon.allowedUsers;
154
+ const isAllowed = allowedUsers.length === 0 || (!!senderOpenId && allowedUsers.includes(senderOpenId));
155
+ // Group new topics (no rootId): check @mention + permissions
156
+ if (chatType === 'group' && !rootId) {
157
+ const access = await checkGroupMessageAccess(message, chatId, senderOpenId);
158
+ if (access === 'not_allowed') {
159
+ replyMessage(messageId, JSON.stringify({ text: '⚠️ 无操作权限' }))
160
+ .catch(err => logger.debug(`Failed to send permission denied: ${err}`));
161
+ return;
162
+ }
163
+ if (access === 'ignore') {
164
+ logger.debug(`Ignoring group message not addressed to bot: ${messageId}`);
165
+ return;
166
+ }
167
+ }
168
+ else if (!isAllowed) {
169
+ // Thread replies and DMs: still check allowlist
170
+ logger.debug(`Ignoring message from non-allowed user: ${senderOpenId}`);
171
+ return;
172
+ }
173
+ // p2p messages without rootId -> create session directly in the DM chat
174
+ // group messages -> normal flow
175
+ const promise = !rootId
176
+ ? handlers.handleNewTopic(data, chatId, messageId, chatType)
177
+ : handlers.handleThreadReply(data, rootId);
178
+ promise.catch(err => logger.error(`Error handling message event: ${err}`));
179
+ }
180
+ catch (err) {
181
+ logger.error(`Error handling message event: ${err}`);
182
+ }
183
+ },
184
+ });
185
+ // Start WSClient
186
+ const wsClient = new Lark.WSClient({
187
+ appId: config.lark.appId,
188
+ appSecret: config.lark.appSecret,
189
+ loggerLevel: Lark.LoggerLevel.info,
190
+ });
191
+ wsClient.start({ eventDispatcher });
192
+ logger.info('Daemon WSClient started');
193
+ return wsClient;
194
+ }
195
+ //# sourceMappingURL=event-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-dispatcher.js","sourceRoot":"","sources":["../../../src/im/lark/event-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { LarkMessage } from '../../types.js';
2
+ interface RawEventData {
3
+ sender: {
4
+ sender_id: {
5
+ open_id?: string;
6
+ user_id?: string;
7
+ union_id?: string;
8
+ };
9
+ sender_type: string;
10
+ tenant_key?: string;
11
+ };
12
+ message: {
13
+ message_id: string;
14
+ root_id?: string;
15
+ parent_id?: string;
16
+ message_type: string;
17
+ content: string;
18
+ chat_id: string;
19
+ chat_type: string;
20
+ create_time: string;
21
+ mentions?: Array<{
22
+ key: string;
23
+ name: string;
24
+ id?: {
25
+ open_id?: string;
26
+ user_id?: string;
27
+ union_id?: string;
28
+ };
29
+ tenant_key?: string;
30
+ }>;
31
+ };
32
+ }
33
+ export interface MessageResource {
34
+ type: 'image' | 'file';
35
+ key: string;
36
+ name: string;
37
+ }
38
+ export declare function extractResources(msgType: string, rawContent: string): MessageResource[];
39
+ export declare function parseEventMessage(data: RawEventData): {
40
+ parsed: LarkMessage;
41
+ resources: MessageResource[];
42
+ };
43
+ export declare function parseApiMessage(msg: any): LarkMessage;
44
+ export {};
45
+ //# sourceMappingURL=message-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-parser.d.ts","sourceRoot":"","sources":["../../../src/im/lark/message-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAKlD,UAAU,YAAY;IACpB,MAAM,EAAE;QACN,SAAS,EAAE;YACT,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;YACf,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;YAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,EAAE,CAmCvF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,eAAe,EAAE,CAAA;CAAE,CAmB3G;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAUrD"}