@neomei/opencode-feishu 0.2.6 → 0.2.8
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/dist/core/config.d.ts +3 -3
- package/dist/core/config.js +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/message-handler.d.ts +25 -11
- package/dist/core/message-handler.d.ts.map +1 -1
- package/dist/core/message-handler.js +589 -102
- package/dist/core/message-handler.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +18 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +35 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/feishu/api.d.ts +6 -0
- package/dist/feishu/api.d.ts.map +1 -1
- package/dist/feishu/api.js +71 -6
- package/dist/feishu/api.js.map +1 -1
- package/dist/feishu/card.d.ts +6 -5
- package/dist/feishu/card.d.ts.map +1 -1
- package/dist/feishu/card.js +185 -120
- package/dist/feishu/card.js.map +1 -1
- package/dist/feishu/event-source.d.ts +6 -0
- package/dist/feishu/event-source.d.ts.map +1 -1
- package/dist/feishu/event-source.js +54 -0
- package/dist/feishu/event-source.js.map +1 -1
- package/dist/opencode/client.d.ts +11 -0
- package/dist/opencode/client.d.ts.map +1 -1
- package/dist/opencode/client.js +120 -9
- package/dist/opencode/client.js.map +1 -1
- package/dist/opencode/event-handler.d.ts +14 -1
- package/dist/opencode/event-handler.d.ts.map +1 -1
- package/dist/opencode/event-handler.js +171 -25
- package/dist/opencode/event-handler.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +10 -3
- package/dist/plugin.js.map +1 -1
- package/dist/services/doc-service.d.ts +11 -45
- package/dist/services/doc-service.d.ts.map +1 -1
- package/dist/services/doc-service.js +72 -174
- package/dist/services/doc-service.js.map +1 -1
- package/dist/services/im-service.d.ts.map +1 -1
- package/dist/services/im-service.js +10 -6
- package/dist/services/im-service.js.map +1 -1
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +10 -3
- package/dist/standalone.js.map +1 -1
- package/dist/types/extended.d.ts +2 -1
- package/dist/types/extended.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/feishu/card.js
CHANGED
|
@@ -4,16 +4,48 @@ const TOOL_ICON = {
|
|
|
4
4
|
error: '❌',
|
|
5
5
|
};
|
|
6
6
|
export class FeishuCard {
|
|
7
|
-
static createThinkingCard(botName
|
|
7
|
+
static createThinkingCard(botName) {
|
|
8
8
|
return {
|
|
9
9
|
config: { wide_screen_mode: true },
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
header: {
|
|
11
|
+
title: { tag: 'plain_text', content: `💭 ${botName}思考中...` },
|
|
12
|
+
},
|
|
13
|
+
elements: [],
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
16
|
static createErrorCard(error) {
|
|
16
|
-
|
|
17
|
+
let errorText;
|
|
18
|
+
if (typeof error === 'string') {
|
|
19
|
+
errorText = error;
|
|
20
|
+
}
|
|
21
|
+
else if (error instanceof Error) {
|
|
22
|
+
errorText = error.message;
|
|
23
|
+
}
|
|
24
|
+
else if (typeof error === 'object' && error !== null) {
|
|
25
|
+
// Handle object errors (e.g. API response objects)
|
|
26
|
+
try {
|
|
27
|
+
// Try to extract common error fields
|
|
28
|
+
const err = error;
|
|
29
|
+
if (err.message) {
|
|
30
|
+
errorText = err.message;
|
|
31
|
+
}
|
|
32
|
+
else if (err.data?.message) {
|
|
33
|
+
errorText = err.data.message;
|
|
34
|
+
}
|
|
35
|
+
else if (err.error) {
|
|
36
|
+
errorText = typeof err.error === 'string' ? err.error : JSON.stringify(err.error);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
errorText = JSON.stringify(error);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
errorText = String(error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
errorText = String(error);
|
|
48
|
+
}
|
|
17
49
|
const safeError = errorText
|
|
18
50
|
.replace(/&/g, '&')
|
|
19
51
|
.replace(/</g, '<')
|
|
@@ -32,38 +64,11 @@ export class FeishuCard {
|
|
|
32
64
|
};
|
|
33
65
|
}
|
|
34
66
|
static createStreamingCard(opts) {
|
|
35
|
-
const { content, tools = [], done = false, retry, showProcess =
|
|
67
|
+
const { content, thinkingContent = '', tools = [], done = false, retry, showProcess = 'none', botName, interaction } = opts;
|
|
68
|
+
const showTools = showProcess === 'tools' || showProcess === 'full';
|
|
69
|
+
const showThinking = showProcess === 'thinking' || showProcess === 'full';
|
|
36
70
|
const anyRunning = tools.some(t => t.status === 'running');
|
|
37
|
-
|
|
38
|
-
const headerTitle = done
|
|
39
|
-
? '✅ 完成'
|
|
40
|
-
: retry
|
|
41
|
-
? '🔄 重试中...'
|
|
42
|
-
: '💭 思考中...';
|
|
43
|
-
const elements = [];
|
|
44
|
-
if (content) {
|
|
45
|
-
elements.push({ tag: 'div', text: { tag: 'lark_md', content } });
|
|
46
|
-
}
|
|
47
|
-
else if (!done) {
|
|
48
|
-
// Animation timer handles dot cycling; show static placeholder here
|
|
49
|
-
elements.push({
|
|
50
|
-
tag: 'div',
|
|
51
|
-
text: { tag: 'lark_md', content: `💭 ${botName}思考中...` },
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
if (retry) {
|
|
55
|
-
elements.push({ tag: 'hr' });
|
|
56
|
-
elements.push({
|
|
57
|
-
tag: 'div',
|
|
58
|
-
text: { tag: 'lark_md', content: `🔄 **重试中**:${retry}` },
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
config: { wide_screen_mode: true },
|
|
63
|
-
header: { title: { tag: 'plain_text', content: headerTitle } },
|
|
64
|
-
elements,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
71
|
+
// Determine header title based on state
|
|
67
72
|
const headerTitle = interaction
|
|
68
73
|
? (interaction.kind === 'permission' ? '🔒 等待授权' : '❓ 等待选择')
|
|
69
74
|
: done
|
|
@@ -72,8 +77,11 @@ export class FeishuCard {
|
|
|
72
77
|
? '🔄 重试中...'
|
|
73
78
|
: anyRunning
|
|
74
79
|
? '🔧 执行工具...'
|
|
75
|
-
:
|
|
80
|
+
: showThinking && thinkingContent && !content
|
|
81
|
+
? `💭 ${botName}思考中...`
|
|
82
|
+
: `💭 ${botName}思考中...`;
|
|
76
83
|
const elements = [];
|
|
84
|
+
// Retry notice
|
|
77
85
|
if (retry) {
|
|
78
86
|
elements.push({
|
|
79
87
|
tag: 'div',
|
|
@@ -81,7 +89,8 @@ export class FeishuCard {
|
|
|
81
89
|
});
|
|
82
90
|
elements.push({ tag: 'hr' });
|
|
83
91
|
}
|
|
84
|
-
|
|
92
|
+
// Tools section
|
|
93
|
+
if (showTools && tools.length > 0) {
|
|
85
94
|
const toolLines = tools
|
|
86
95
|
.map(t => {
|
|
87
96
|
const head = `${TOOL_ICON[t.status]} ${t.name}`;
|
|
@@ -91,17 +100,59 @@ export class FeishuCard {
|
|
|
91
100
|
})
|
|
92
101
|
.join('\n');
|
|
93
102
|
elements.push({ tag: 'div', text: { tag: 'lark_md', content: toolLines } });
|
|
103
|
+
if (thinkingContent || content)
|
|
104
|
+
elements.push({ tag: 'hr' });
|
|
105
|
+
}
|
|
106
|
+
// Thinking section (collapsible when done)
|
|
107
|
+
if (showThinking && thinkingContent) {
|
|
108
|
+
if (done) {
|
|
109
|
+
// Collapsible thinking section when done
|
|
110
|
+
elements.push({
|
|
111
|
+
tag: 'div',
|
|
112
|
+
text: {
|
|
113
|
+
tag: 'lark_md',
|
|
114
|
+
content: `<font color='grey'>💡 *思考过程(点击展开)*</font>`,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
elements.push({
|
|
118
|
+
tag: 'div',
|
|
119
|
+
text: {
|
|
120
|
+
tag: 'lark_md',
|
|
121
|
+
content: `<font color='grey'>${thinkingContent}</font>`,
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Show thinking inline while streaming
|
|
127
|
+
elements.push({
|
|
128
|
+
tag: 'div',
|
|
129
|
+
text: {
|
|
130
|
+
tag: 'lark_md',
|
|
131
|
+
content: `<font color='grey'>💭 ${thinkingContent}</font>`,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
94
135
|
if (content)
|
|
95
136
|
elements.push({ tag: 'hr' });
|
|
96
137
|
}
|
|
97
|
-
|
|
138
|
+
// Main content section
|
|
139
|
+
if (content) {
|
|
98
140
|
elements.push({
|
|
99
141
|
tag: 'div',
|
|
100
|
-
text: { tag: 'lark_md', content
|
|
142
|
+
text: { tag: 'lark_md', content },
|
|
101
143
|
});
|
|
102
144
|
}
|
|
145
|
+
else if (!thinkingContent && !retry && !interaction && tools.length === 0) {
|
|
146
|
+
// Show placeholder when nothing else is displayed
|
|
147
|
+
elements.push({
|
|
148
|
+
tag: 'div',
|
|
149
|
+
text: { tag: 'lark_md', content: '...' },
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Interaction section (permissions/questions)
|
|
103
153
|
if (interaction) {
|
|
104
|
-
elements.
|
|
154
|
+
if (elements.length > 0)
|
|
155
|
+
elements.push({ tag: 'hr' });
|
|
105
156
|
if (interaction.kind === 'permission') {
|
|
106
157
|
const perm = interaction.data;
|
|
107
158
|
const patterns = perm.patterns.map((p) => `- \`${p}\``).join('\n');
|
|
@@ -111,10 +162,33 @@ export class FeishuCard {
|
|
|
111
162
|
tag: 'lark_md',
|
|
112
163
|
content: `**🔒 权限请求:${perm.permission}**\n` +
|
|
113
164
|
`${perm.title}\n\n` +
|
|
114
|
-
`**匹配范围:**\n${patterns || '(未指定)'}
|
|
115
|
-
`💬 请回复 \`确认\` / \`始终\` / \`拒绝\``,
|
|
165
|
+
`**匹配范围:**\n${patterns || '(未指定)'}`,
|
|
116
166
|
},
|
|
117
167
|
});
|
|
168
|
+
elements.push({
|
|
169
|
+
tag: 'action',
|
|
170
|
+
layout: 'default',
|
|
171
|
+
actions: [
|
|
172
|
+
{
|
|
173
|
+
tag: 'button',
|
|
174
|
+
text: { tag: 'plain_text', content: '✅ 确认' },
|
|
175
|
+
type: 'primary',
|
|
176
|
+
value: { action: 'perm', id: perm.id, reply: 'once' },
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
tag: 'button',
|
|
180
|
+
text: { tag: 'plain_text', content: '🔓 始终允许' },
|
|
181
|
+
type: 'default',
|
|
182
|
+
value: { action: 'perm', id: perm.id, reply: 'always' },
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
tag: 'button',
|
|
186
|
+
text: { tag: 'plain_text', content: '❌ 拒绝' },
|
|
187
|
+
type: 'default',
|
|
188
|
+
value: { action: 'perm', id: perm.id, reply: 'reject' },
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
});
|
|
118
192
|
}
|
|
119
193
|
else {
|
|
120
194
|
const q = interaction.data;
|
|
@@ -130,13 +204,20 @@ export class FeishuCard {
|
|
|
130
204
|
text: { tag: 'lark_md', content: question.question },
|
|
131
205
|
});
|
|
132
206
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
207
|
+
// Render each option as a clickable button
|
|
208
|
+
for (const [optIdx, opt] of question.options.entries()) {
|
|
209
|
+
elements.push({
|
|
210
|
+
tag: 'action',
|
|
211
|
+
actions: [
|
|
212
|
+
{
|
|
213
|
+
tag: 'button',
|
|
214
|
+
text: { tag: 'plain_text', content: `${optIdx + 1}. ${opt.label}` },
|
|
215
|
+
type: 'default',
|
|
216
|
+
value: { action: 'q', id: q.id, ans: [[opt.label]] },
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
});
|
|
220
|
+
}
|
|
140
221
|
if (question.multiple) {
|
|
141
222
|
elements.push({
|
|
142
223
|
tag: 'div',
|
|
@@ -149,13 +230,6 @@ export class FeishuCard {
|
|
|
149
230
|
if (idx < q.questions.length - 1)
|
|
150
231
|
elements.push({ tag: 'hr' });
|
|
151
232
|
}
|
|
152
|
-
elements.push({
|
|
153
|
-
tag: 'div',
|
|
154
|
-
text: {
|
|
155
|
-
tag: 'lark_md',
|
|
156
|
-
content: '💬 请回复选项编号或标签',
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
233
|
}
|
|
160
234
|
}
|
|
161
235
|
return {
|
|
@@ -164,89 +238,80 @@ export class FeishuCard {
|
|
|
164
238
|
elements,
|
|
165
239
|
};
|
|
166
240
|
}
|
|
167
|
-
static
|
|
168
|
-
const patterns = perm.patterns.map(p => `- \`${p}\``).join('\n');
|
|
169
|
-
const content = `**权限类型:** ${perm.permission}\n\n` +
|
|
170
|
-
`**请求内容:**\n${perm.title}\n\n` +
|
|
171
|
-
`**匹配范围:**\n${patterns || '(未指定)'}\n\n` +
|
|
172
|
-
`---\n\n` +
|
|
173
|
-
`💬 **请回复以下指令来响应:**\n` +
|
|
174
|
-
`• \`确认\` — 授权一次\n` +
|
|
175
|
-
`• \`始终\` — 永久授权\n` +
|
|
176
|
-
`• \`拒绝\` — 拒绝授权`;
|
|
241
|
+
static createInteractionRepliedCard(kind, label) {
|
|
177
242
|
return {
|
|
178
243
|
config: { wide_screen_mode: true },
|
|
179
|
-
header: { title: { tag: 'plain_text', content: '
|
|
244
|
+
header: { title: { tag: 'plain_text', content: '✅ 已处理' } },
|
|
180
245
|
elements: [
|
|
181
|
-
{
|
|
182
|
-
],
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
static createQuestionCard(q) {
|
|
186
|
-
const elements = [];
|
|
187
|
-
for (const [idx, question] of q.questions.entries()) {
|
|
188
|
-
const header = question.header || question.question.substring(0, 30);
|
|
189
|
-
elements.push({
|
|
190
|
-
tag: 'div',
|
|
191
|
-
text: { tag: 'lark_md', content: `**${idx + 1}. ${header}**` },
|
|
192
|
-
});
|
|
193
|
-
if (question.question !== header) {
|
|
194
|
-
elements.push({
|
|
195
|
-
tag: 'div',
|
|
196
|
-
text: { tag: 'lark_md', content: question.question },
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
const optionLines = question.options
|
|
200
|
-
.map((opt, i) => `${i + 1}. ${opt.label}${opt.description ? ` — ${opt.description}` : ''}`)
|
|
201
|
-
.join('\n');
|
|
202
|
-
elements.push({
|
|
203
|
-
tag: 'div',
|
|
204
|
-
text: { tag: 'lark_md', content: optionLines },
|
|
205
|
-
});
|
|
206
|
-
if (question.multiple) {
|
|
207
|
-
elements.push({
|
|
246
|
+
{
|
|
208
247
|
tag: 'div',
|
|
209
248
|
text: {
|
|
210
249
|
tag: 'lark_md',
|
|
211
|
-
content:
|
|
250
|
+
content: kind === 'permission'
|
|
251
|
+
? `已${label === 'reject' ? '拒绝' : label === 'always' ? '永久授权' : '授权一次'}该权限请求。`
|
|
252
|
+
: `已提交选择:${label}`,
|
|
212
253
|
},
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (idx < q.questions.length - 1) {
|
|
216
|
-
elements.push({ tag: 'hr' });
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
elements.push({ tag: 'hr' });
|
|
220
|
-
elements.push({
|
|
221
|
-
tag: 'div',
|
|
222
|
-
text: {
|
|
223
|
-
tag: 'lark_md',
|
|
224
|
-
content: '💬 **请回复选项编号或标签来回答**\n' +
|
|
225
|
-
'(例如回复 `1` 或 `选项A`,多选用 `1,2`)',
|
|
226
|
-
},
|
|
227
|
-
});
|
|
228
|
-
return {
|
|
229
|
-
config: { wide_screen_mode: true },
|
|
230
|
-
header: { title: { tag: 'plain_text', content: '❓ 请选择' } },
|
|
231
|
-
elements,
|
|
254
|
+
},
|
|
255
|
+
],
|
|
232
256
|
};
|
|
233
257
|
}
|
|
234
|
-
static
|
|
258
|
+
static createExpiredCard() {
|
|
235
259
|
return {
|
|
236
260
|
config: { wide_screen_mode: true },
|
|
237
|
-
header: { title: { tag: 'plain_text', content: '
|
|
261
|
+
header: { title: { tag: 'plain_text', content: '⏱️ 操作已过期' } },
|
|
238
262
|
elements: [
|
|
239
263
|
{
|
|
240
264
|
tag: 'div',
|
|
241
265
|
text: {
|
|
242
266
|
tag: 'lark_md',
|
|
243
|
-
content:
|
|
244
|
-
? `已${label === 'reject' ? '拒绝' : label === 'always' ? '永久授权' : '授权一次'}该权限请求。`
|
|
245
|
-
: `已提交选择:${label}`,
|
|
267
|
+
content: '该操作已过期,请重新发起请求。',
|
|
246
268
|
},
|
|
247
269
|
},
|
|
248
270
|
],
|
|
249
271
|
};
|
|
250
272
|
}
|
|
273
|
+
static createNavigationCard(content, sessionId) {
|
|
274
|
+
return {
|
|
275
|
+
config: { wide_screen_mode: true },
|
|
276
|
+
header: { title: { tag: 'plain_text', content: '📄 内容浏览' } },
|
|
277
|
+
elements: [
|
|
278
|
+
{
|
|
279
|
+
tag: 'div',
|
|
280
|
+
text: { tag: 'lark_md', content },
|
|
281
|
+
},
|
|
282
|
+
{ tag: 'hr' },
|
|
283
|
+
{
|
|
284
|
+
tag: 'action',
|
|
285
|
+
layout: 'default',
|
|
286
|
+
actions: [
|
|
287
|
+
{
|
|
288
|
+
tag: 'button',
|
|
289
|
+
text: { tag: 'plain_text', content: '⬆️ 上一页' },
|
|
290
|
+
type: 'default',
|
|
291
|
+
value: { action: 'nav', cmd: 'session.page.up', sessionId },
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
tag: 'button',
|
|
295
|
+
text: { tag: 'plain_text', content: '⬇️ 下一页' },
|
|
296
|
+
type: 'default',
|
|
297
|
+
value: { action: 'nav', cmd: 'session.page.down', sessionId },
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
tag: 'button',
|
|
301
|
+
text: { tag: 'plain_text', content: '⏫ 首页' },
|
|
302
|
+
type: 'default',
|
|
303
|
+
value: { action: 'nav', cmd: 'session.first', sessionId },
|
|
304
|
+
},
|
|
305
|
+
{
|
|
306
|
+
tag: 'button',
|
|
307
|
+
text: { tag: 'plain_text', content: '⏬ 尾页' },
|
|
308
|
+
type: 'default',
|
|
309
|
+
value: { action: 'nav', cmd: 'session.last', sessionId },
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
};
|
|
315
|
+
}
|
|
251
316
|
}
|
|
252
317
|
//# sourceMappingURL=card.js.map
|
package/dist/feishu/card.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/feishu/card.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAwC;IACrD,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,GAAG;IACd,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,kBAAkB,CAAC,OAAe
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/feishu/card.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import type { FeishuAPI } from './api.js';
|
|
|
4
4
|
* Long-connection event source backed by Lark.WSClient.
|
|
5
5
|
*
|
|
6
6
|
* Emits `message` (FeishuMessage) for every `im.message.receive_v1` event.
|
|
7
|
+
* Emits `cardAction` (FeishuCardAction) for every `card.action.trigger` event.
|
|
7
8
|
* Emits `error` on fatal WSClient errors. Reconnection is handled internally
|
|
8
9
|
* by the SDK (autoReconnect=true, ping/pong loop, exponential backoff).
|
|
9
10
|
*/
|
|
@@ -13,6 +14,11 @@ export declare class FeishuEventSource extends EventEmitter {
|
|
|
13
14
|
private started;
|
|
14
15
|
constructor(api: FeishuAPI);
|
|
15
16
|
connect(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Emit cardAction and await the first listener's return value.
|
|
19
|
+
* This lets us propagate the card callback response back to Feishu.
|
|
20
|
+
*/
|
|
21
|
+
private emitCardAction;
|
|
16
22
|
disconnect(): Promise<void>;
|
|
17
23
|
isConnected(): boolean;
|
|
18
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-source.d.ts","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"event-source.d.ts","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmC1C;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,GAAG,EAAE,SAAS;IAKpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyD9B;;;OAGG;YACW,cAAc;IAWtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,WAAW,IAAI,OAAO;CAGvB"}
|
|
@@ -3,10 +3,38 @@ import * as Lark from '@larksuiteoapi/node-sdk';
|
|
|
3
3
|
import { createLogger } from '../core/logger.js';
|
|
4
4
|
import { silentLogger } from './silent-logger.js';
|
|
5
5
|
const log = createLogger('FeishuEventSource');
|
|
6
|
+
/**
|
|
7
|
+
* Parse raw card.action.trigger event data into a normalized FeishuCardAction.
|
|
8
|
+
* Matches the shape produced by Lark SDK's normalizeCardAction().
|
|
9
|
+
*/
|
|
10
|
+
function parseCardAction(event) {
|
|
11
|
+
const messageId = event.context?.open_message_id ?? event.open_message_id;
|
|
12
|
+
const chatId = event.context?.open_chat_id ?? event.open_chat_id;
|
|
13
|
+
const operatorOpenId = event.operator?.open_id;
|
|
14
|
+
if (!messageId || !chatId || !operatorOpenId) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
messageId,
|
|
19
|
+
chatId,
|
|
20
|
+
operator: {
|
|
21
|
+
openId: operatorOpenId,
|
|
22
|
+
userId: event.operator?.user_id,
|
|
23
|
+
name: event.operator?.name,
|
|
24
|
+
},
|
|
25
|
+
action: {
|
|
26
|
+
value: event.action?.value,
|
|
27
|
+
tag: event.action?.tag ?? 'unknown',
|
|
28
|
+
name: event.action?.name,
|
|
29
|
+
option: event.action?.option,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
6
33
|
/**
|
|
7
34
|
* Long-connection event source backed by Lark.WSClient.
|
|
8
35
|
*
|
|
9
36
|
* Emits `message` (FeishuMessage) for every `im.message.receive_v1` event.
|
|
37
|
+
* Emits `cardAction` (FeishuCardAction) for every `card.action.trigger` event.
|
|
10
38
|
* Emits `error` on fatal WSClient errors. Reconnection is handled internally
|
|
11
39
|
* by the SDK (autoReconnect=true, ping/pong loop, exponential backoff).
|
|
12
40
|
*/
|
|
@@ -43,6 +71,18 @@ export class FeishuEventSource extends EventEmitter {
|
|
|
43
71
|
this.emit('message', message);
|
|
44
72
|
return { ok: true };
|
|
45
73
|
},
|
|
74
|
+
'card.action.trigger': async (data) => {
|
|
75
|
+
const action = parseCardAction(data);
|
|
76
|
+
if (!action) {
|
|
77
|
+
log.warn({ data }, 'Failed to parse card action event');
|
|
78
|
+
return { toast: { type: 'error', content: '无效的操作' } };
|
|
79
|
+
}
|
|
80
|
+
log.info({ chatId: action.chatId, messageId: action.messageId, tag: action.action.tag }, 'Card action triggered');
|
|
81
|
+
// Hand off to the listener (MessageHandler). The return value from
|
|
82
|
+
// the listener is propagated back to Feishu as the card callback response.
|
|
83
|
+
const result = await this.emitCardAction(action);
|
|
84
|
+
return result ?? { toast: { type: 'success', content: '已处理' } };
|
|
85
|
+
},
|
|
46
86
|
// Suppress SDK warnings for events we intentionally don't handle
|
|
47
87
|
'im.chat.access_event.bot_p2p_chat_entered_v1': async () => ({ ok: true }),
|
|
48
88
|
'im.message.message_read_v1': async () => ({ ok: true }),
|
|
@@ -60,6 +100,20 @@ export class FeishuEventSource extends EventEmitter {
|
|
|
60
100
|
throw err;
|
|
61
101
|
}
|
|
62
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Emit cardAction and await the first listener's return value.
|
|
105
|
+
* This lets us propagate the card callback response back to Feishu.
|
|
106
|
+
*/
|
|
107
|
+
async emitCardAction(action) {
|
|
108
|
+
const listeners = this.listeners('cardAction');
|
|
109
|
+
if (listeners.length === 0) {
|
|
110
|
+
log.warn('No cardAction listener registered');
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
// Await the first listener; EventEmitter normally ignores async returns,
|
|
114
|
+
// but the EventDispatcher.invoke() caller awaits our handler return.
|
|
115
|
+
return listeners[0](action);
|
|
116
|
+
}
|
|
63
117
|
async disconnect() {
|
|
64
118
|
if (!this.wsClient)
|
|
65
119
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-source.js","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"event-source.js","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export declare class OpenCodeClient {
|
|
|
7
7
|
directory?: string;
|
|
8
8
|
password?: string;
|
|
9
9
|
});
|
|
10
|
+
private formatError;
|
|
10
11
|
createSession(title?: string): Promise<any>;
|
|
11
12
|
sendPrompt(sessionId: string, text: string, files?: Array<{
|
|
12
13
|
filePath: string;
|
|
@@ -28,6 +29,16 @@ export declare class OpenCodeClient {
|
|
|
28
29
|
replyPermission(requestID: string, reply: 'once' | 'always' | 'reject'): Promise<boolean>;
|
|
29
30
|
replyQuestion(requestID: string, answers: string[][]): Promise<boolean>;
|
|
30
31
|
sendCommand(sessionId: string, command: string, args?: string): Promise<any>;
|
|
32
|
+
executeTuiCommand(command: string): Promise<any>;
|
|
33
|
+
getProviders(): Promise<any>;
|
|
34
|
+
getAgents(): Promise<any>;
|
|
35
|
+
getCommands(): Promise<any>;
|
|
36
|
+
getSessions(): Promise<any>;
|
|
37
|
+
getTools(): Promise<any>;
|
|
38
|
+
getWorktrees(): Promise<any>;
|
|
39
|
+
getFiles(path?: string): Promise<any>;
|
|
40
|
+
getStatus(): Promise<any>;
|
|
41
|
+
getConfig(): Promise<any>;
|
|
31
42
|
getBaseUrl(): string;
|
|
32
43
|
getDirectory(): string;
|
|
33
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAmB/E,OAAO,CAAC,WAAW;IAcb,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY3C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IA8BlI,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;IAK/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAU7D,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAU9B,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlD,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAazF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAavE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAe5E,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAahD,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IAY5B,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAYzB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IAY3B,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IAY3B,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC;IAYxB,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC;IAY5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAarC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAYzB,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAY/B,UAAU,IAAI,MAAM;IAIpB,YAAY,IAAI,MAAM;CAGvB"}
|