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.
Files changed (86) hide show
  1. package/.env.example +5 -0
  2. package/dist/bot-registry.d.ts +31 -0
  3. package/dist/bot-registry.d.ts.map +1 -0
  4. package/dist/bot-registry.js +125 -0
  5. package/dist/bot-registry.js.map +1 -0
  6. package/dist/cli.js +0 -0
  7. package/dist/core/command-handler.d.ts.map +1 -1
  8. package/dist/core/command-handler.js +6 -4
  9. package/dist/core/command-handler.js.map +1 -1
  10. package/dist/core/session-manager.d.ts +4 -3
  11. package/dist/core/session-manager.d.ts.map +1 -1
  12. package/dist/core/session-manager.js +42 -10
  13. package/dist/core/session-manager.js.map +1 -1
  14. package/dist/core/types.d.ts +1 -0
  15. package/dist/core/types.d.ts.map +1 -1
  16. package/dist/core/worker-pool.d.ts +3 -2
  17. package/dist/core/worker-pool.d.ts.map +1 -1
  18. package/dist/core/worker-pool.js +39 -26
  19. package/dist/core/worker-pool.js.map +1 -1
  20. package/dist/daemon.d.ts.map +1 -1
  21. package/dist/daemon.js +83 -61
  22. package/dist/daemon.js.map +1 -1
  23. package/dist/im/lark/card-handler.d.ts.map +1 -1
  24. package/dist/im/lark/card-handler.js +30 -13
  25. package/dist/im/lark/card-handler.js.map +1 -1
  26. package/dist/im/lark/client.d.ts +11 -13
  27. package/dist/im/lark/client.d.ts.map +1 -1
  28. package/dist/im/lark/client.js +23 -45
  29. package/dist/im/lark/client.js.map +1 -1
  30. package/dist/im/lark/event-dispatcher.d.ts +10 -10
  31. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  32. package/dist/im/lark/event-dispatcher.js +36 -33
  33. package/dist/im/lark/event-dispatcher.js.map +1 -1
  34. package/dist/server.d.ts.map +1 -1
  35. package/dist/server.js +10 -1
  36. package/dist/server.js.map +1 -1
  37. package/dist/tools/get-thread-messages.d.ts.map +1 -1
  38. package/dist/tools/get-thread-messages.js +2 -1
  39. package/dist/tools/get-thread-messages.js.map +1 -1
  40. package/dist/tools/react-to-message.d.ts.map +1 -1
  41. package/dist/tools/react-to-message.js +3 -2
  42. package/dist/tools/react-to-message.js.map +1 -1
  43. package/dist/tools/send-to-thread.js +1 -1
  44. package/dist/tools/send-to-thread.js.map +1 -1
  45. package/dist/types.d.ts +3 -0
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/types.js.map +1 -1
  48. package/dist/worker.js +7 -1
  49. package/dist/worker.js.map +1 -1
  50. package/package.json +1 -1
  51. package/dist/scheduler.d.ts +0 -38
  52. package/dist/scheduler.d.ts.map +0 -1
  53. package/dist/scheduler.js +0 -221
  54. package/dist/scheduler.js.map +0 -1
  55. package/dist/services/lark-client.d.ts +0 -22
  56. package/dist/services/lark-client.d.ts.map +0 -1
  57. package/dist/services/lark-client.js +0 -238
  58. package/dist/services/lark-client.js.map +0 -1
  59. package/dist/services/lark-ws.d.ts +0 -5
  60. package/dist/services/lark-ws.d.ts.map +0 -1
  61. package/dist/services/lark-ws.js +0 -79
  62. package/dist/services/lark-ws.js.map +0 -1
  63. package/dist/services/message-router.d.ts +0 -8
  64. package/dist/services/message-router.d.ts.map +0 -1
  65. package/dist/services/message-router.js +0 -73
  66. package/dist/services/message-router.js.map +0 -1
  67. package/dist/tools/close-session.d.ts +0 -22
  68. package/dist/tools/close-session.d.ts.map +0 -1
  69. package/dist/tools/close-session.js +0 -38
  70. package/dist/tools/close-session.js.map +0 -1
  71. package/dist/tools/create-session.d.ts +0 -28
  72. package/dist/tools/create-session.d.ts.map +0 -1
  73. package/dist/tools/create-session.js +0 -40
  74. package/dist/tools/create-session.js.map +0 -1
  75. package/dist/tools/wait-for-reply.d.ts +0 -17
  76. package/dist/tools/wait-for-reply.d.ts.map +0 -1
  77. package/dist/tools/wait-for-reply.js +0 -65
  78. package/dist/tools/wait-for-reply.js.map +0 -1
  79. package/dist/utils/card-builder.d.ts +0 -16
  80. package/dist/utils/card-builder.d.ts.map +0 -1
  81. package/dist/utils/card-builder.js +0 -183
  82. package/dist/utils/card-builder.js.map +0 -1
  83. package/dist/utils/message-parser.d.ts +0 -45
  84. package/dist/utils/message-parser.d.ts.map +0 -1
  85. package/dist/utils/message-parser.js +0 -132
  86. 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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"}