botmux 1.4.3 → 1.4.4
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 +5 -0
- package/dist/bot-registry.d.ts +31 -0
- package/dist/bot-registry.d.ts.map +1 -0
- package/dist/bot-registry.js +125 -0
- package/dist/bot-registry.js.map +1 -0
- package/dist/cli.js +0 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +6 -4
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/session-manager.d.ts +4 -3
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +42 -10
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +1 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/worker-pool.d.ts +3 -2
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +39 -26
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +83 -61
- package/dist/daemon.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +30 -13
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +11 -13
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +23 -45
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +10 -10
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +36 -33
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/get-thread-messages.d.ts.map +1 -1
- package/dist/tools/get-thread-messages.js +2 -1
- package/dist/tools/get-thread-messages.js.map +1 -1
- package/dist/tools/react-to-message.d.ts.map +1 -1
- package/dist/tools/react-to-message.js +3 -2
- package/dist/tools/react-to-message.js.map +1 -1
- package/dist/tools/send-to-thread.js +1 -1
- package/dist/tools/send-to-thread.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/worker.js +7 -1
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/scheduler.d.ts +0 -38
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js +0 -221
- package/dist/scheduler.js.map +0 -1
- package/dist/services/lark-client.d.ts +0 -22
- package/dist/services/lark-client.d.ts.map +0 -1
- package/dist/services/lark-client.js +0 -238
- package/dist/services/lark-client.js.map +0 -1
- package/dist/services/lark-ws.d.ts +0 -5
- package/dist/services/lark-ws.d.ts.map +0 -1
- package/dist/services/lark-ws.js +0 -79
- package/dist/services/lark-ws.js.map +0 -1
- package/dist/services/message-router.d.ts +0 -8
- package/dist/services/message-router.d.ts.map +0 -1
- package/dist/services/message-router.js +0 -73
- package/dist/services/message-router.js.map +0 -1
- package/dist/tools/close-session.d.ts +0 -22
- package/dist/tools/close-session.d.ts.map +0 -1
- package/dist/tools/close-session.js +0 -38
- package/dist/tools/close-session.js.map +0 -1
- package/dist/tools/create-session.d.ts +0 -28
- package/dist/tools/create-session.d.ts.map +0 -1
- package/dist/tools/create-session.js +0 -40
- package/dist/tools/create-session.js.map +0 -1
- package/dist/tools/wait-for-reply.d.ts +0 -17
- package/dist/tools/wait-for-reply.d.ts.map +0 -1
- package/dist/tools/wait-for-reply.js +0 -65
- package/dist/tools/wait-for-reply.js.map +0 -1
- package/dist/utils/card-builder.d.ts +0 -16
- package/dist/utils/card-builder.d.ts.map +0 -1
- package/dist/utils/card-builder.js +0 -183
- package/dist/utils/card-builder.js.map +0 -1
- package/dist/utils/message-parser.d.ts +0 -45
- package/dist/utils/message-parser.d.ts.map +0 -1
- package/dist/utils/message-parser.js +0 -132
- package/dist/utils/message-parser.js.map +0 -1
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { config } from '../config.js';
|
|
3
|
-
import { isDaemonMode } from '../server.js';
|
|
4
|
-
import * as sessionStore from '../services/session-store.js';
|
|
5
|
-
import * as messageRouter from '../services/message-router.js';
|
|
6
|
-
import * as messageQueue from '../services/message-queue.js';
|
|
7
|
-
import { logger } from '../utils/logger.js';
|
|
8
|
-
export const schema = z.object({
|
|
9
|
-
session_id: z.string().describe('Session ID for the active session'),
|
|
10
|
-
timeout_ms: z.number().optional().describe(`Timeout in milliseconds. Default: ${120_000}, max: ${300_000}`),
|
|
11
|
-
});
|
|
12
|
-
export const description = 'Wait for user reply in the Lark thread. Event-driven (no polling). Returns immediately if there are pending messages, otherwise waits until a message arrives or timeout.';
|
|
13
|
-
export async function execute(args) {
|
|
14
|
-
const session = sessionStore.getSession(args.session_id);
|
|
15
|
-
if (!session) {
|
|
16
|
-
return { error: `Session ${args.session_id} not found` };
|
|
17
|
-
}
|
|
18
|
-
if (session.status === 'closed') {
|
|
19
|
-
return { error: `Session ${args.session_id} is closed` };
|
|
20
|
-
}
|
|
21
|
-
const timeoutMs = Math.min(args.timeout_ms ?? config.waitReply.defaultTimeoutMs, config.waitReply.maxTimeoutMs);
|
|
22
|
-
try {
|
|
23
|
-
if (isDaemonMode()) {
|
|
24
|
-
return await waitFromQueue(session.rootMessageId, args.session_id, timeoutMs);
|
|
25
|
-
}
|
|
26
|
-
return await waitFromRouter(session.rootMessageId, args.session_id, timeoutMs);
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
logger.error(`Error waiting for reply: ${err.message}`);
|
|
30
|
-
return { error: `Error waiting for reply: ${err.message}` };
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
async function waitFromQueue(rootMessageId, sessionId, timeoutMs) {
|
|
34
|
-
// Daemon mode: read from file-based message queue
|
|
35
|
-
const pending = messageQueue.readUnread(rootMessageId);
|
|
36
|
-
if (pending.length > 0) {
|
|
37
|
-
logger.info(`[daemon] Returning ${pending.length} pending messages for session ${sessionId}`);
|
|
38
|
-
return { timeout: false, messages: pending };
|
|
39
|
-
}
|
|
40
|
-
logger.info(`[daemon] Waiting for reply in session ${sessionId} (timeout: ${timeoutMs}ms)`);
|
|
41
|
-
const messages = await messageQueue.waitForMessage(rootMessageId, timeoutMs);
|
|
42
|
-
if (messages.length === 0) {
|
|
43
|
-
logger.info(`[daemon] Timeout waiting for reply in session ${sessionId}`);
|
|
44
|
-
return { timeout: true, messages: [] };
|
|
45
|
-
}
|
|
46
|
-
logger.info(`[daemon] Received ${messages.length} messages for session ${sessionId}`);
|
|
47
|
-
return { timeout: false, messages };
|
|
48
|
-
}
|
|
49
|
-
async function waitFromRouter(rootMessageId, sessionId, timeoutMs) {
|
|
50
|
-
// Standalone mode: use in-memory message router
|
|
51
|
-
const pending = messageRouter.getPendingMessages(rootMessageId);
|
|
52
|
-
if (pending.length > 0) {
|
|
53
|
-
logger.info(`Returning ${pending.length} pending messages for session ${sessionId}`);
|
|
54
|
-
return { timeout: false, messages: pending };
|
|
55
|
-
}
|
|
56
|
-
logger.info(`Waiting for reply in session ${sessionId} (timeout: ${timeoutMs}ms)`);
|
|
57
|
-
const messages = await messageRouter.waitForNext(rootMessageId, timeoutMs);
|
|
58
|
-
if (messages.length === 0) {
|
|
59
|
-
logger.info(`Timeout waiting for reply in session ${sessionId}`);
|
|
60
|
-
return { timeout: true, messages: [] };
|
|
61
|
-
}
|
|
62
|
-
logger.info(`Received ${messages.length} messages for session ${sessionId}`);
|
|
63
|
-
return { timeout: false, messages };
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=wait-for-reply.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wait-for-reply.js","sourceRoot":"","sources":["../../src/tools/wait-for-reply.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { ProjectInfo } from '../services/project-scanner.js';
|
|
2
|
-
/**
|
|
3
|
-
* Build a Feishu interactive card with terminal link + restart/close buttons.
|
|
4
|
-
*/
|
|
5
|
-
export declare function buildSessionCard(sessionId: string, rootId: string, terminalUrl: string, title: string): string;
|
|
6
|
-
/**
|
|
7
|
-
* Build a Feishu streaming card that shows live terminal output + controls.
|
|
8
|
-
* This card is PATCHed in-place as Claude works.
|
|
9
|
-
*/
|
|
10
|
-
export declare function buildStreamingCard(sessionId: string, rootId: string, terminalUrl: string, title: string, screenContent: string, status: 'starting' | 'working' | 'idle'): string;
|
|
11
|
-
/**
|
|
12
|
-
* Build a Feishu interactive card with a dropdown selector for projects.
|
|
13
|
-
* Returns a JSON string suitable for msg_type: 'interactive'.
|
|
14
|
-
*/
|
|
15
|
-
export declare function buildRepoSelectCard(projects: ProjectInfo[], currentPath?: string, rootMessageId?: string): string;
|
|
16
|
-
//# sourceMappingURL=card-builder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.d.ts","sourceRoot":"","sources":["../../src/utils/card-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAOlE;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,MAAM,CAoDR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,GACtC,MAAM,CA2DR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAyDjH"}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
/** Escape Lark markdown special characters in user-controlled strings. */
|
|
2
|
-
function escapeMd(s) {
|
|
3
|
-
return s.replace(/[*_~`\[\]\\]/g, c => `\\${c}`);
|
|
4
|
-
}
|
|
5
|
-
/**
|
|
6
|
-
* Build a Feishu interactive card with terminal link + restart/close buttons.
|
|
7
|
-
*/
|
|
8
|
-
export function buildSessionCard(sessionId, rootId, terminalUrl, title) {
|
|
9
|
-
const card = {
|
|
10
|
-
config: { wide_screen_mode: true },
|
|
11
|
-
header: {
|
|
12
|
-
title: { tag: 'plain_text', content: `🖥️ ${escapeMd(title)}` },
|
|
13
|
-
template: 'blue',
|
|
14
|
-
},
|
|
15
|
-
elements: [
|
|
16
|
-
{
|
|
17
|
-
tag: 'div',
|
|
18
|
-
text: {
|
|
19
|
-
tag: 'lark_md',
|
|
20
|
-
content: `**终端地址:** [${terminalUrl}](${terminalUrl})\nSession: \`${sessionId.substring(0, 8)}\``,
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
tag: 'action',
|
|
25
|
-
actions: [
|
|
26
|
-
{
|
|
27
|
-
tag: 'button',
|
|
28
|
-
text: { tag: 'plain_text', content: '🖥️ 打开终端' },
|
|
29
|
-
type: 'primary',
|
|
30
|
-
multi_url: {
|
|
31
|
-
url: terminalUrl,
|
|
32
|
-
pc_url: terminalUrl,
|
|
33
|
-
android_url: terminalUrl,
|
|
34
|
-
ios_url: terminalUrl,
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
tag: 'button',
|
|
39
|
-
text: { tag: 'plain_text', content: '🔑 获取操作链接' },
|
|
40
|
-
type: 'default',
|
|
41
|
-
value: { action: 'get_write_link', root_id: rootId, session_id: sessionId },
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
tag: 'button',
|
|
45
|
-
text: { tag: 'plain_text', content: '🔄 重启 Claude' },
|
|
46
|
-
type: 'default',
|
|
47
|
-
value: { action: 'restart', root_id: rootId, session_id: sessionId },
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
tag: 'button',
|
|
51
|
-
text: { tag: 'plain_text', content: '❌ 关闭会话' },
|
|
52
|
-
type: 'danger',
|
|
53
|
-
value: { action: 'close', root_id: rootId, session_id: sessionId },
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
],
|
|
58
|
-
};
|
|
59
|
-
return JSON.stringify(card);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Build a Feishu streaming card that shows live terminal output + controls.
|
|
63
|
-
* This card is PATCHed in-place as Claude works.
|
|
64
|
-
*/
|
|
65
|
-
export function buildStreamingCard(sessionId, rootId, terminalUrl, title, screenContent, status) {
|
|
66
|
-
const templateMap = { starting: 'yellow', working: 'blue', idle: 'green' };
|
|
67
|
-
const statusMap = { starting: '启动中…', working: '工作中', idle: '就绪' };
|
|
68
|
-
const displayContent = screenContent || '(等待输出…)';
|
|
69
|
-
const card = {
|
|
70
|
-
config: { wide_screen_mode: true },
|
|
71
|
-
header: {
|
|
72
|
-
title: { tag: 'plain_text', content: `🖥️ ${escapeMd(title)} — ${statusMap[status]}` },
|
|
73
|
-
template: templateMap[status],
|
|
74
|
-
},
|
|
75
|
-
elements: [
|
|
76
|
-
{
|
|
77
|
-
tag: 'markdown',
|
|
78
|
-
content: displayContent,
|
|
79
|
-
},
|
|
80
|
-
{ tag: 'hr' },
|
|
81
|
-
{
|
|
82
|
-
tag: 'markdown',
|
|
83
|
-
content: `**终端:** [${terminalUrl}](${terminalUrl}) | Session: \`${sessionId.substring(0, 8)}\``,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
tag: 'action',
|
|
87
|
-
actions: [
|
|
88
|
-
{
|
|
89
|
-
tag: 'button',
|
|
90
|
-
text: { tag: 'plain_text', content: '🖥️ 打开终端' },
|
|
91
|
-
type: 'primary',
|
|
92
|
-
multi_url: {
|
|
93
|
-
url: terminalUrl,
|
|
94
|
-
pc_url: terminalUrl,
|
|
95
|
-
android_url: terminalUrl,
|
|
96
|
-
ios_url: terminalUrl,
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
tag: 'button',
|
|
101
|
-
text: { tag: 'plain_text', content: '🔑 获取操作链接' },
|
|
102
|
-
type: 'default',
|
|
103
|
-
value: { action: 'get_write_link', root_id: rootId, session_id: sessionId },
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
tag: 'button',
|
|
107
|
-
text: { tag: 'plain_text', content: '🔄 重启 Claude' },
|
|
108
|
-
type: 'default',
|
|
109
|
-
value: { action: 'restart', root_id: rootId, session_id: sessionId },
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
tag: 'button',
|
|
113
|
-
text: { tag: 'plain_text', content: '❌ 关闭会话' },
|
|
114
|
-
type: 'danger',
|
|
115
|
-
value: { action: 'close', root_id: rootId, session_id: sessionId },
|
|
116
|
-
},
|
|
117
|
-
],
|
|
118
|
-
},
|
|
119
|
-
],
|
|
120
|
-
};
|
|
121
|
-
return JSON.stringify(card);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Build a Feishu interactive card with a dropdown selector for projects.
|
|
125
|
-
* Returns a JSON string suitable for msg_type: 'interactive'.
|
|
126
|
-
*/
|
|
127
|
-
export function buildRepoSelectCard(projects, currentPath, rootMessageId) {
|
|
128
|
-
const options = projects.map((p, i) => {
|
|
129
|
-
const currentTag = p.path === currentPath ? ' ← 当前' : '';
|
|
130
|
-
const typeTag = p.type === 'worktree' ? ' [worktree]' : '';
|
|
131
|
-
return {
|
|
132
|
-
text: { tag: 'plain_text', content: `${i + 1}. ${p.name} (${p.branch})${typeTag}${currentTag}` },
|
|
133
|
-
value: p.path,
|
|
134
|
-
};
|
|
135
|
-
});
|
|
136
|
-
const card = {
|
|
137
|
-
config: { wide_screen_mode: true },
|
|
138
|
-
header: {
|
|
139
|
-
template: 'blue',
|
|
140
|
-
title: { tag: 'plain_text', content: '📁 项目仓库管理' },
|
|
141
|
-
},
|
|
142
|
-
elements: [
|
|
143
|
-
{
|
|
144
|
-
tag: 'div',
|
|
145
|
-
text: {
|
|
146
|
-
tag: 'lark_md',
|
|
147
|
-
content: `当前活跃项目:**${escapeMd(currentPath ?? 'N/A')}**`,
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
tag: 'hr',
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
tag: 'action',
|
|
155
|
-
actions: [
|
|
156
|
-
{
|
|
157
|
-
tag: 'select_static',
|
|
158
|
-
placeholder: { tag: 'plain_text', content: '选择仓库并切换' },
|
|
159
|
-
options,
|
|
160
|
-
value: { key: 'repo_switch', root_id: rootMessageId ?? '' },
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
tag: 'button',
|
|
164
|
-
text: { tag: 'plain_text', content: '▶️ 直接开启会话' },
|
|
165
|
-
type: 'primary',
|
|
166
|
-
value: { action: 'skip_repo', root_id: rootMessageId ?? '' },
|
|
167
|
-
},
|
|
168
|
-
],
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
tag: 'note',
|
|
172
|
-
elements: [
|
|
173
|
-
{
|
|
174
|
-
tag: 'lark_md',
|
|
175
|
-
content: '也可以回复 `/repo <编号>` 切换,例如:`/repo 1`',
|
|
176
|
-
},
|
|
177
|
-
],
|
|
178
|
-
},
|
|
179
|
-
],
|
|
180
|
-
};
|
|
181
|
-
return JSON.stringify(card);
|
|
182
|
-
}
|
|
183
|
-
//# sourceMappingURL=card-builder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"card-builder.js","sourceRoot":"","sources":["../../src/utils/card-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-parser.d.ts","sourceRoot":"","sources":["../../src/utils/message-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,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"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { logger } from './logger.js';
|
|
2
|
-
export function extractResources(msgType, rawContent) {
|
|
3
|
-
try {
|
|
4
|
-
const parsed = JSON.parse(rawContent);
|
|
5
|
-
if (msgType === 'image') {
|
|
6
|
-
const imageKey = parsed.image_key;
|
|
7
|
-
if (imageKey) {
|
|
8
|
-
return [{ type: 'image', key: imageKey, name: `${imageKey}.jpg` }];
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
if (msgType === 'file') {
|
|
12
|
-
const fileKey = parsed.file_key;
|
|
13
|
-
if (fileKey) {
|
|
14
|
-
return [{ type: 'file', key: fileKey, name: parsed.file_name ?? fileKey }];
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
if (msgType === 'post') {
|
|
18
|
-
const resources = [];
|
|
19
|
-
const { content: contentBlocks } = resolvePostBody(parsed);
|
|
20
|
-
for (const block of contentBlocks) {
|
|
21
|
-
const nodes = Array.isArray(block) ? block : [block];
|
|
22
|
-
for (const node of nodes) {
|
|
23
|
-
if (node.tag === 'img' && node.image_key) {
|
|
24
|
-
resources.push({ type: 'image', key: node.image_key, name: `${node.image_key}.jpg` });
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return resources;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
// ignore parse errors
|
|
33
|
-
}
|
|
34
|
-
return [];
|
|
35
|
-
}
|
|
36
|
-
export function parseEventMessage(data) {
|
|
37
|
-
const { sender, message } = data;
|
|
38
|
-
// Debug: log raw message for non-text types
|
|
39
|
-
if (message.message_type !== 'text') {
|
|
40
|
-
logger.info(`[parser] type=${message.message_type} content=${message.content} keys=${Object.keys(message).join(',')}`);
|
|
41
|
-
}
|
|
42
|
-
const resources = extractResources(message.message_type, message.content);
|
|
43
|
-
const parsed = {
|
|
44
|
-
messageId: message.message_id,
|
|
45
|
-
rootId: message.root_id ?? '',
|
|
46
|
-
senderId: sender.sender_id?.open_id ?? '',
|
|
47
|
-
senderType: sender.sender_type,
|
|
48
|
-
msgType: message.message_type,
|
|
49
|
-
content: extractTextContent(message.message_type, message.content, message.mentions),
|
|
50
|
-
createTime: message.create_time,
|
|
51
|
-
};
|
|
52
|
-
return { parsed, resources };
|
|
53
|
-
}
|
|
54
|
-
export function parseApiMessage(msg) {
|
|
55
|
-
return {
|
|
56
|
-
messageId: msg.message_id ?? '',
|
|
57
|
-
rootId: msg.root_id ?? msg.thread_id ?? '',
|
|
58
|
-
senderId: msg.sender?.id ?? '',
|
|
59
|
-
senderType: msg.sender?.sender_type ?? 'unknown',
|
|
60
|
-
msgType: msg.msg_type ?? 'text',
|
|
61
|
-
content: extractTextContent(msg.msg_type ?? 'text', msg.body?.content ?? ''),
|
|
62
|
-
createTime: msg.create_time ?? '',
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
/** Resolve post body from either wrapped {"zh_cn":{title,content}} or unwrapped {title,content} format */
|
|
66
|
-
function resolvePostBody(parsed) {
|
|
67
|
-
// Unwrapped: has content array directly
|
|
68
|
-
if (Array.isArray(parsed.content)) {
|
|
69
|
-
return { title: parsed.title ?? '', content: parsed.content };
|
|
70
|
-
}
|
|
71
|
-
// Wrapped in language key: {"zh_cn": {title, content}}
|
|
72
|
-
for (const key of Object.keys(parsed)) {
|
|
73
|
-
const val = parsed[key];
|
|
74
|
-
if (val && typeof val === 'object' && Array.isArray(val.content)) {
|
|
75
|
-
return { title: val.title ?? '', content: val.content };
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return { title: '', content: [] };
|
|
79
|
-
}
|
|
80
|
-
function resolveMentions(text, mentions) {
|
|
81
|
-
if (!mentions || mentions.length === 0) {
|
|
82
|
-
// No mention info available — strip placeholders
|
|
83
|
-
return text.replace(/@_user_\d+/g, '').replace(/\s{2,}/g, ' ').trim();
|
|
84
|
-
}
|
|
85
|
-
let result = text;
|
|
86
|
-
for (const m of mentions) {
|
|
87
|
-
result = result.replace(m.key, `@${m.name}`);
|
|
88
|
-
}
|
|
89
|
-
return result.trim();
|
|
90
|
-
}
|
|
91
|
-
function extractTextContent(msgType, rawContent, mentions) {
|
|
92
|
-
try {
|
|
93
|
-
if (msgType === 'text') {
|
|
94
|
-
const parsed = JSON.parse(rawContent);
|
|
95
|
-
return resolveMentions(parsed.text ?? rawContent, mentions);
|
|
96
|
-
}
|
|
97
|
-
if (msgType === 'post') {
|
|
98
|
-
const parsed = JSON.parse(rawContent);
|
|
99
|
-
const { title, content } = resolvePostBody(parsed);
|
|
100
|
-
const body = content
|
|
101
|
-
.flat()
|
|
102
|
-
.filter((node) => node.tag === 'text' || node.tag === 'a' || node.tag === 'at')
|
|
103
|
-
.map((node) => {
|
|
104
|
-
if (node.tag === 'at')
|
|
105
|
-
return `@${node.user_name ?? 'unknown'}`;
|
|
106
|
-
return node.text ?? node.href ?? '';
|
|
107
|
-
})
|
|
108
|
-
.join('');
|
|
109
|
-
return title ? `${title}\n${body}` : body;
|
|
110
|
-
}
|
|
111
|
-
if (msgType === 'image') {
|
|
112
|
-
return '[图片]';
|
|
113
|
-
}
|
|
114
|
-
if (msgType === 'file') {
|
|
115
|
-
try {
|
|
116
|
-
const p = JSON.parse(rawContent);
|
|
117
|
-
return `[文件: ${p.file_name ?? 'unknown'}]`;
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
return '[文件]';
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
if (msgType === 'interactive') {
|
|
124
|
-
return '[interactive card]';
|
|
125
|
-
}
|
|
126
|
-
return rawContent;
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return rawContent;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=message-parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"message-parser.js","sourceRoot":"","sources":["../../src/utils/message-parser.ts"],"names":[],"mappings":"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"}
|