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.
- package/.env.example +24 -0
- package/LICENSE +21 -0
- package/README.en.md +267 -0
- package/README.md +267 -0
- package/dist/adapters/backend/pty-backend.d.ts +13 -0
- package/dist/adapters/backend/pty-backend.d.ts.map +1 -0
- package/dist/adapters/backend/pty-backend.js +39 -0
- package/dist/adapters/backend/pty-backend.js.map +1 -0
- package/dist/adapters/backend/tmux-backend.d.ts +20 -0
- package/dist/adapters/backend/tmux-backend.d.ts.map +1 -0
- package/dist/adapters/backend/tmux-backend.js +30 -0
- package/dist/adapters/backend/tmux-backend.js.map +1 -0
- package/dist/adapters/backend/types.d.ts +19 -0
- package/dist/adapters/backend/types.d.ts.map +1 -0
- package/dist/adapters/backend/types.js +2 -0
- package/dist/adapters/backend/types.js.map +1 -0
- package/dist/adapters/cli/aiden.d.ts +4 -0
- package/dist/adapters/cli/aiden.d.ts.map +1 -0
- package/dist/adapters/cli/aiden.js +63 -0
- package/dist/adapters/cli/aiden.js.map +1 -0
- package/dist/adapters/cli/claude-code.d.ts +4 -0
- package/dist/adapters/cli/claude-code.d.ts.map +1 -0
- package/dist/adapters/cli/claude-code.js +59 -0
- package/dist/adapters/cli/claude-code.js.map +1 -0
- package/dist/adapters/cli/coco.d.ts +4 -0
- package/dist/adapters/cli/coco.d.ts.map +1 -0
- package/dist/adapters/cli/coco.js +46 -0
- package/dist/adapters/cli/coco.js.map +1 -0
- package/dist/adapters/cli/codex.d.ts +4 -0
- package/dist/adapters/cli/codex.d.ts.map +1 -0
- package/dist/adapters/cli/codex.js +47 -0
- package/dist/adapters/cli/codex.js.map +1 -0
- package/dist/adapters/cli/registry.d.ts +13 -0
- package/dist/adapters/cli/registry.d.ts.map +1 -0
- package/dist/adapters/cli/registry.js +42 -0
- package/dist/adapters/cli/registry.js.map +1 -0
- package/dist/adapters/cli/types.d.ts +39 -0
- package/dist/adapters/cli/types.d.ts.map +1 -0
- package/dist/adapters/cli/types.js +2 -0
- package/dist/adapters/cli/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +245 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/core/command-handler.d.ts +11 -0
- package/dist/core/command-handler.d.ts.map +1 -0
- package/dist/core/command-handler.js +322 -0
- package/dist/core/command-handler.js.map +1 -0
- package/dist/core/cost-calculator.d.ts +12 -0
- package/dist/core/cost-calculator.d.ts.map +1 -0
- package/dist/core/cost-calculator.js +61 -0
- package/dist/core/cost-calculator.js.map +1 -0
- package/dist/core/scheduler.d.ts +38 -0
- package/dist/core/scheduler.d.ts.map +1 -0
- package/dist/core/scheduler.js +221 -0
- package/dist/core/scheduler.js.map +1 -0
- package/dist/core/session-manager.d.ts +13 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +125 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/types.d.ts +29 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/worker-pool.d.ts +26 -0
- package/dist/core/worker-pool.d.ts.map +1 -0
- package/dist/core/worker-pool.js +261 -0
- package/dist/core/worker-pool.js.map +1 -0
- package/dist/daemon.d.ts +3 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +344 -0
- package/dist/daemon.js.map +1 -0
- package/dist/im/lark/card-builder.d.ts +18 -0
- package/dist/im/lark/card-builder.d.ts.map +1 -0
- package/dist/im/lark/card-builder.js +194 -0
- package/dist/im/lark/card-builder.js.map +1 -0
- package/dist/im/lark/card-handler.d.ts +9 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -0
- package/dist/im/lark/card-handler.js +131 -0
- package/dist/im/lark/card-handler.js.map +1 -0
- package/dist/im/lark/client.d.ts +23 -0
- package/dist/im/lark/client.d.ts.map +1 -0
- package/dist/im/lark/client.js +259 -0
- package/dist/im/lark/client.js.map +1 -0
- package/dist/im/lark/event-dispatcher.d.ts +34 -0
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -0
- package/dist/im/lark/event-dispatcher.js +195 -0
- package/dist/im/lark/event-dispatcher.js.map +1 -0
- package/dist/im/lark/message-parser.d.ts +45 -0
- package/dist/im/lark/message-parser.d.ts.map +1 -0
- package/dist/im/lark/message-parser.js +132 -0
- package/dist/im/lark/message-parser.js.map +1 -0
- package/dist/im/types.d.ts +78 -0
- package/dist/im/types.d.ts.map +1 -0
- package/dist/im/types.js +2 -0
- package/dist/im/types.js.map +1 -0
- package/dist/index-daemon.d.ts +3 -0
- package/dist/index-daemon.d.ts.map +1 -0
- package/dist/index-daemon.js +21 -0
- package/dist/index-daemon.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/scheduler.d.ts +38 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +221 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +23 -0
- package/dist/server.js.map +1 -0
- package/dist/services/lark-client.d.ts +22 -0
- package/dist/services/lark-client.d.ts.map +1 -0
- package/dist/services/lark-client.js +238 -0
- package/dist/services/lark-client.js.map +1 -0
- package/dist/services/lark-ws.d.ts +5 -0
- package/dist/services/lark-ws.d.ts.map +1 -0
- package/dist/services/lark-ws.js +79 -0
- package/dist/services/lark-ws.js.map +1 -0
- package/dist/services/message-queue.d.ts +9 -0
- package/dist/services/message-queue.d.ts.map +1 -0
- package/dist/services/message-queue.js +77 -0
- package/dist/services/message-queue.js.map +1 -0
- package/dist/services/message-router.d.ts +8 -0
- package/dist/services/message-router.d.ts.map +1 -0
- package/dist/services/message-router.js +73 -0
- package/dist/services/message-router.js.map +1 -0
- package/dist/services/project-scanner.d.ts +12 -0
- package/dist/services/project-scanner.d.ts.map +1 -0
- package/dist/services/project-scanner.js +109 -0
- package/dist/services/project-scanner.js.map +1 -0
- package/dist/services/schedule-store.d.ts +14 -0
- package/dist/services/schedule-store.d.ts.map +1 -0
- package/dist/services/schedule-store.js +89 -0
- package/dist/services/schedule-store.js.map +1 -0
- package/dist/services/session-store.d.ts +8 -0
- package/dist/services/session-store.d.ts.map +1 -0
- package/dist/services/session-store.js +93 -0
- package/dist/services/session-store.js.map +1 -0
- package/dist/tools/close-session.d.ts +22 -0
- package/dist/tools/close-session.d.ts.map +1 -0
- package/dist/tools/close-session.js +38 -0
- package/dist/tools/close-session.js.map +1 -0
- package/dist/tools/create-session.d.ts +28 -0
- package/dist/tools/create-session.d.ts.map +1 -0
- package/dist/tools/create-session.js +40 -0
- package/dist/tools/create-session.js.map +1 -0
- package/dist/tools/get-thread-messages.d.ts +26 -0
- package/dist/tools/get-thread-messages.d.ts.map +1 -0
- package/dist/tools/get-thread-messages.js +33 -0
- package/dist/tools/get-thread-messages.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +10 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/react-to-message.d.ts +41 -0
- package/dist/tools/react-to-message.d.ts.map +1 -0
- package/dist/tools/react-to-message.js +30 -0
- package/dist/tools/react-to-message.js.map +1 -0
- package/dist/tools/send-to-thread.d.ts +24 -0
- package/dist/tools/send-to-thread.d.ts.map +1 -0
- package/dist/tools/send-to-thread.js +83 -0
- package/dist/tools/send-to-thread.js.map +1 -0
- package/dist/tools/wait-for-reply.d.ts +17 -0
- package/dist/tools/wait-for-reply.d.ts.map +1 -0
- package/dist/tools/wait-for-reply.js +65 -0
- package/dist/tools/wait-for-reply.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/card-builder.d.ts +16 -0
- package/dist/utils/card-builder.d.ts.map +1 -0
- package/dist/utils/card-builder.js +183 -0
- package/dist/utils/card-builder.js.map +1 -0
- package/dist/utils/idle-detector.d.ts +21 -0
- package/dist/utils/idle-detector.d.ts.map +1 -0
- package/dist/utils/idle-detector.js +95 -0
- package/dist/utils/idle-detector.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/message-parser.d.ts +45 -0
- package/dist/utils/message-parser.d.ts.map +1 -0
- package/dist/utils/message-parser.js +132 -0
- package/dist/utils/message-parser.js.map +1 -0
- package/dist/utils/terminal-renderer.d.ts +39 -0
- package/dist/utils/terminal-renderer.d.ts.map +1 -0
- package/dist/utils/terminal-renderer.js +186 -0
- package/dist/utils/terminal-renderer.js.map +1 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +411 -0
- package/dist/worker.js.map +1 -0
- package/ecosystem.config.cjs +15 -0
- 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"}
|