@neomei/opencode-feishu 0.2.6 → 0.2.7
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/message-handler.d.ts +18 -11
- package/dist/core/message-handler.d.ts.map +1 -1
- package/dist/core/message-handler.js +266 -97
- package/dist/core/message-handler.js.map +1 -1
- package/dist/core/types.d.ts +21 -0
- 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 +3 -4
- package/dist/feishu/card.d.ts.map +1 -1
- package/dist/feishu/card.js +61 -94
- 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 +1 -0
- package/dist/opencode/client.d.ts.map +1 -1
- package/dist/opencode/client.js +28 -9
- package/dist/opencode/client.js.map +1 -1
- package/dist/opencode/event-handler.d.ts +1 -0
- package/dist/opencode/event-handler.d.ts.map +1 -1
- package/dist/opencode/event-handler.js +82 -16
- 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/core/types.d.ts
CHANGED
|
@@ -99,6 +99,8 @@ export interface SessionInfo {
|
|
|
99
99
|
retryMessage?: string;
|
|
100
100
|
pendingInteraction?: PendingInteraction;
|
|
101
101
|
interactionMessageId?: string;
|
|
102
|
+
/** When true, flushCard should not update the card (user already saw confirmation via card reply). */
|
|
103
|
+
interactionReplied?: boolean;
|
|
102
104
|
}
|
|
103
105
|
/**
|
|
104
106
|
* 一张飞书交互卡片的"内容体"。用于 im +messages-send 的 --content 字段,
|
|
@@ -125,4 +127,23 @@ export interface FeishuCredentials {
|
|
|
125
127
|
appSecret: string;
|
|
126
128
|
tenantKey?: string;
|
|
127
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Normalized shape of a Feishu card action trigger event.
|
|
132
|
+
* Emitted by FeishuEventSource when a user clicks an interactive card button.
|
|
133
|
+
*/
|
|
134
|
+
export interface FeishuCardAction {
|
|
135
|
+
messageId: string;
|
|
136
|
+
chatId: string;
|
|
137
|
+
operator: {
|
|
138
|
+
openId: string;
|
|
139
|
+
userId?: string;
|
|
140
|
+
name?: string;
|
|
141
|
+
};
|
|
142
|
+
action: {
|
|
143
|
+
value?: Record<string, unknown>;
|
|
144
|
+
tag: string;
|
|
145
|
+
name?: string;
|
|
146
|
+
option?: string;
|
|
147
|
+
};
|
|
148
|
+
}
|
|
128
149
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8HAA8H;IAC9H,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,kGAAkG;IAClG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE;QACN,SAAS,EAAE;YACT,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,EAAE,EAAE;YACF,QAAQ,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,GAAG,OAAO,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,oBAAoB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
package/dist/feishu/api.d.ts
CHANGED
|
@@ -36,5 +36,11 @@ export declare class FeishuAPI {
|
|
|
36
36
|
* The image_key can be used in card `img` elements.
|
|
37
37
|
*/
|
|
38
38
|
uploadImage(imageBuffer: Buffer): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Upload a file to Feishu and return its file_key.
|
|
41
|
+
* Uses native fetch because the SDK's client.request() does not support
|
|
42
|
+
* multipart/form-data (it serialises FormData as an empty JSON object {}).
|
|
43
|
+
*/
|
|
44
|
+
uploadFile(buffer: Buffer, fileName: string, mimeType: string): Promise<string>;
|
|
39
45
|
}
|
|
40
46
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/feishu/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/feishu/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAcjF,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAyC;gBAElD,MAAM,EAAE,YAAY;IAa1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,4FAA4F;IAC5F,SAAS,IAAI,IAAI,CAAC,MAAM;IAIxB,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;IAI3E,YAAY,IAAI,MAAM,GAAG,SAAS;IAI5B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/feishu/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAcjF,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAyC;gBAElD,MAAM,EAAE,YAAY;IAa1B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,4FAA4F;IAC5F,SAAS,IAAI,IAAI,CAAC,MAAM;IAIxB,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;KAAE;IAI3E,YAAY,IAAI,MAAM,GAAG,SAAS;IAI5B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAmB9D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAmBnE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrE;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBlD;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+DhG;;;OAGG;IACG,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvD;;;;OAIG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA6CtF"}
|
package/dist/feishu/api.js
CHANGED
|
@@ -61,6 +61,7 @@ export class FeishuAPI {
|
|
|
61
61
|
content: JSON.stringify({ text }),
|
|
62
62
|
},
|
|
63
63
|
});
|
|
64
|
+
log.info({ resCode: res.code, resMsg: res.msg, hasData: !!res.data, messageId: res.data?.message_id }, 'sendText response');
|
|
64
65
|
if (res.code !== 0) {
|
|
65
66
|
throw new Error(`Failed to send text: ${res.msg || 'Unknown error'}`);
|
|
66
67
|
}
|
|
@@ -78,6 +79,7 @@ export class FeishuAPI {
|
|
|
78
79
|
content: JSON.stringify(card),
|
|
79
80
|
},
|
|
80
81
|
});
|
|
82
|
+
log.info({ resCode: res.code, resMsg: res.msg, hasData: !!res.data, messageId: res.data?.message_id }, 'sendCard response');
|
|
81
83
|
if (res.code !== 0) {
|
|
82
84
|
throw new Error(`Failed to send card: ${res.msg || 'Unknown error'}`);
|
|
83
85
|
}
|
|
@@ -87,12 +89,32 @@ export class FeishuAPI {
|
|
|
87
89
|
return res.data;
|
|
88
90
|
}
|
|
89
91
|
async updateCard(messageId, card) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
try {
|
|
93
|
+
const res = await this.client.im.v1.message.patch({
|
|
94
|
+
path: { message_id: messageId },
|
|
95
|
+
data: { content: JSON.stringify(card) },
|
|
96
|
+
});
|
|
97
|
+
log.info({ resCode: res.code, resMsg: res.msg, messageId }, 'updateCard response');
|
|
98
|
+
if (res.code !== 0) {
|
|
99
|
+
// 230020 = "Update the single messages too frequently". Treat as a warning,
|
|
100
|
+
// not a throw — concurrent flushCard calls can naturally trip this, and
|
|
101
|
+
// the next legitimate update will succeed. Throwing would propagate to
|
|
102
|
+
// event-handler error logs that look more alarming than the situation.
|
|
103
|
+
if (res.code === 230020) {
|
|
104
|
+
log.warn({ resCode: res.code, resMsg: res.msg, messageId }, 'updateCard hit frequency limit, skipping');
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
throw new Error(`Failed to update message: ${res.msg || 'Unknown error'}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
// The SDK throws AxiosError on HTTP 4xx; Feishu encodes 230020 in the body.
|
|
112
|
+
const code = err?.response?.data?.code;
|
|
113
|
+
if (code === 230020) {
|
|
114
|
+
log.warn({ code, messageId }, 'updateCard hit frequency limit, skipping');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
throw err;
|
|
96
118
|
}
|
|
97
119
|
}
|
|
98
120
|
/**
|
|
@@ -199,5 +221,48 @@ export class FeishuAPI {
|
|
|
199
221
|
log.info({ imageKey: res.image_key }, 'Image uploaded');
|
|
200
222
|
return res.image_key;
|
|
201
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Upload a file to Feishu and return its file_key.
|
|
226
|
+
* Uses native fetch because the SDK's client.request() does not support
|
|
227
|
+
* multipart/form-data (it serialises FormData as an empty JSON object {}).
|
|
228
|
+
*/
|
|
229
|
+
async uploadFile(buffer, fileName, mimeType) {
|
|
230
|
+
// Force token refresh before upload to avoid expired token issues
|
|
231
|
+
const tokenManager = this.client.tokenManager;
|
|
232
|
+
if (tokenManager?.getTenantAccessToken) {
|
|
233
|
+
await tokenManager.getTenantAccessToken();
|
|
234
|
+
}
|
|
235
|
+
const token = await tokenManager?.getTenantAccessToken();
|
|
236
|
+
if (!token) {
|
|
237
|
+
throw new Error('Failed to obtain tenant access token for file upload');
|
|
238
|
+
}
|
|
239
|
+
const domainUrl = this.domain === Lark.Domain.Lark
|
|
240
|
+
? 'https://open.larksuite.com'
|
|
241
|
+
: 'https://open.feishu.cn';
|
|
242
|
+
const form = new FormData();
|
|
243
|
+
form.append('file', new Blob([buffer], { type: mimeType }), fileName);
|
|
244
|
+
form.append('file_name', fileName);
|
|
245
|
+
const res = await fetch(`${domainUrl}/open-apis/im/v1/files`, {
|
|
246
|
+
method: 'POST',
|
|
247
|
+
headers: {
|
|
248
|
+
Authorization: `Bearer ${token}`,
|
|
249
|
+
},
|
|
250
|
+
body: form,
|
|
251
|
+
});
|
|
252
|
+
if (!res.ok) {
|
|
253
|
+
const text = await res.text();
|
|
254
|
+
throw new Error(`File upload failed: ${res.status} ${text}`);
|
|
255
|
+
}
|
|
256
|
+
const data = await res.json();
|
|
257
|
+
if (data.code !== 0) {
|
|
258
|
+
throw new Error(`File upload failed: ${data.msg || 'Unknown error'}`);
|
|
259
|
+
}
|
|
260
|
+
const fileKey = data.data?.file_key;
|
|
261
|
+
if (!fileKey) {
|
|
262
|
+
throw new Error('File upload failed: no file_key returned');
|
|
263
|
+
}
|
|
264
|
+
log.info({ fileKey, fileName }, 'File uploaded');
|
|
265
|
+
return fileKey;
|
|
266
|
+
}
|
|
202
267
|
}
|
|
203
268
|
//# sourceMappingURL=api.js.map
|
package/dist/feishu/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/feishu/api.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/feishu/api.ts"],"names":[],"mappings":"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"}
|
package/dist/feishu/card.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { CardContent, ToolState,
|
|
1
|
+
import type { CardContent, ToolState, PendingInteraction } from '../core/types.js';
|
|
2
2
|
export declare class FeishuCard {
|
|
3
|
-
static createThinkingCard(botName: string
|
|
3
|
+
static createThinkingCard(botName: string): CardContent;
|
|
4
4
|
static createErrorCard(error: unknown): CardContent;
|
|
5
5
|
static createStreamingCard(opts: {
|
|
6
6
|
content: string;
|
|
@@ -11,8 +11,7 @@ export declare class FeishuCard {
|
|
|
11
11
|
botName: string;
|
|
12
12
|
interaction?: PendingInteraction;
|
|
13
13
|
}): CardContent;
|
|
14
|
-
static createPermissionCard(perm: PendingPermission): CardContent;
|
|
15
|
-
static createQuestionCard(q: PendingQuestion): CardContent;
|
|
16
14
|
static createInteractionRepliedCard(kind: 'permission' | 'question', label: string): CardContent;
|
|
15
|
+
static createExpiredCard(): CardContent;
|
|
17
16
|
}
|
|
18
17
|
//# sourceMappingURL=card.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/feishu/card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/feishu/card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAQnF,qBAAa,UAAU;IACrB,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAUvD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW;IAoBnD,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,kBAAkB,CAAC;KAClC,GAAG,WAAW;IA6Jf,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW;IAmBhG,MAAM,CAAC,iBAAiB,IAAI,WAAW;CAexC"}
|
package/dist/feishu/card.js
CHANGED
|
@@ -4,12 +4,13 @@ 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) {
|
|
@@ -39,20 +40,14 @@ export class FeishuCard {
|
|
|
39
40
|
? '✅ 完成'
|
|
40
41
|
: retry
|
|
41
42
|
? '🔄 重试中...'
|
|
42
|
-
:
|
|
43
|
+
: `💭 ${botName}思考中...`;
|
|
43
44
|
const elements = [];
|
|
44
45
|
if (content) {
|
|
45
46
|
elements.push({ tag: 'div', text: { tag: 'lark_md', content } });
|
|
46
47
|
}
|
|
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
48
|
if (retry) {
|
|
55
|
-
elements.
|
|
49
|
+
if (elements.length > 0)
|
|
50
|
+
elements.push({ tag: 'hr' });
|
|
56
51
|
elements.push({
|
|
57
52
|
tag: 'div',
|
|
58
53
|
text: { tag: 'lark_md', content: `🔄 **重试中**:${retry}` },
|
|
@@ -94,14 +89,15 @@ export class FeishuCard {
|
|
|
94
89
|
if (content)
|
|
95
90
|
elements.push({ tag: 'hr' });
|
|
96
91
|
}
|
|
97
|
-
if (content || (tools.length === 0 && !retry)) {
|
|
92
|
+
if (content || (tools.length === 0 && !retry && !interaction)) {
|
|
98
93
|
elements.push({
|
|
99
94
|
tag: 'div',
|
|
100
95
|
text: { tag: 'lark_md', content: content || '...' },
|
|
101
96
|
});
|
|
102
97
|
}
|
|
103
98
|
if (interaction) {
|
|
104
|
-
elements.
|
|
99
|
+
if (elements.length > 0)
|
|
100
|
+
elements.push({ tag: 'hr' });
|
|
105
101
|
if (interaction.kind === 'permission') {
|
|
106
102
|
const perm = interaction.data;
|
|
107
103
|
const patterns = perm.patterns.map((p) => `- \`${p}\``).join('\n');
|
|
@@ -111,10 +107,33 @@ export class FeishuCard {
|
|
|
111
107
|
tag: 'lark_md',
|
|
112
108
|
content: `**🔒 权限请求:${perm.permission}**\n` +
|
|
113
109
|
`${perm.title}\n\n` +
|
|
114
|
-
`**匹配范围:**\n${patterns || '(未指定)'}
|
|
115
|
-
`💬 请回复 \`确认\` / \`始终\` / \`拒绝\``,
|
|
110
|
+
`**匹配范围:**\n${patterns || '(未指定)'}`,
|
|
116
111
|
},
|
|
117
112
|
});
|
|
113
|
+
elements.push({
|
|
114
|
+
tag: 'action',
|
|
115
|
+
layout: 'default',
|
|
116
|
+
actions: [
|
|
117
|
+
{
|
|
118
|
+
tag: 'button',
|
|
119
|
+
text: { tag: 'plain_text', content: '✅ 确认' },
|
|
120
|
+
type: 'primary',
|
|
121
|
+
value: { action: 'perm', id: perm.id, reply: 'once' },
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
tag: 'button',
|
|
125
|
+
text: { tag: 'plain_text', content: '🔓 始终允许' },
|
|
126
|
+
type: 'default',
|
|
127
|
+
value: { action: 'perm', id: perm.id, reply: 'always' },
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
tag: 'button',
|
|
131
|
+
text: { tag: 'plain_text', content: '❌ 拒绝' },
|
|
132
|
+
type: 'default',
|
|
133
|
+
value: { action: 'perm', id: perm.id, reply: 'reject' },
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
});
|
|
118
137
|
}
|
|
119
138
|
else {
|
|
120
139
|
const q = interaction.data;
|
|
@@ -130,13 +149,20 @@ export class FeishuCard {
|
|
|
130
149
|
text: { tag: 'lark_md', content: question.question },
|
|
131
150
|
});
|
|
132
151
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
152
|
+
// Render each option as a clickable button
|
|
153
|
+
for (const [optIdx, opt] of question.options.entries()) {
|
|
154
|
+
elements.push({
|
|
155
|
+
tag: 'action',
|
|
156
|
+
actions: [
|
|
157
|
+
{
|
|
158
|
+
tag: 'button',
|
|
159
|
+
text: { tag: 'plain_text', content: `${optIdx + 1}. ${opt.label}` },
|
|
160
|
+
type: 'default',
|
|
161
|
+
value: { action: 'q', id: q.id, ans: [[opt.label]] },
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
});
|
|
165
|
+
}
|
|
140
166
|
if (question.multiple) {
|
|
141
167
|
elements.push({
|
|
142
168
|
tag: 'div',
|
|
@@ -149,13 +175,6 @@ export class FeishuCard {
|
|
|
149
175
|
if (idx < q.questions.length - 1)
|
|
150
176
|
elements.push({ tag: 'hr' });
|
|
151
177
|
}
|
|
152
|
-
elements.push({
|
|
153
|
-
tag: 'div',
|
|
154
|
-
text: {
|
|
155
|
-
tag: 'lark_md',
|
|
156
|
-
content: '💬 请回复选项编号或标签',
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
178
|
}
|
|
160
179
|
}
|
|
161
180
|
return {
|
|
@@ -164,85 +183,33 @@ export class FeishuCard {
|
|
|
164
183
|
elements,
|
|
165
184
|
};
|
|
166
185
|
}
|
|
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
|
-
`• \`拒绝\` — 拒绝授权`;
|
|
186
|
+
static createInteractionRepliedCard(kind, label) {
|
|
177
187
|
return {
|
|
178
188
|
config: { wide_screen_mode: true },
|
|
179
|
-
header: { title: { tag: 'plain_text', content: '
|
|
189
|
+
header: { title: { tag: 'plain_text', content: '✅ 已处理' } },
|
|
180
190
|
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({
|
|
191
|
+
{
|
|
208
192
|
tag: 'div',
|
|
209
193
|
text: {
|
|
210
194
|
tag: 'lark_md',
|
|
211
|
-
content:
|
|
195
|
+
content: kind === 'permission'
|
|
196
|
+
? `已${label === 'reject' ? '拒绝' : label === 'always' ? '永久授权' : '授权一次'}该权限请求。`
|
|
197
|
+
: `已提交选择:${label}`,
|
|
212
198
|
},
|
|
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,
|
|
199
|
+
},
|
|
200
|
+
],
|
|
232
201
|
};
|
|
233
202
|
}
|
|
234
|
-
static
|
|
203
|
+
static createExpiredCard() {
|
|
235
204
|
return {
|
|
236
205
|
config: { wide_screen_mode: true },
|
|
237
|
-
header: { title: { tag: 'plain_text', content: '
|
|
206
|
+
header: { title: { tag: 'plain_text', content: '⏱️ 操作已过期' } },
|
|
238
207
|
elements: [
|
|
239
208
|
{
|
|
240
209
|
tag: 'div',
|
|
241
210
|
text: {
|
|
242
211
|
tag: 'lark_md',
|
|
243
|
-
content:
|
|
244
|
-
? `已${label === 'reject' ? '拒绝' : label === 'always' ? '永久授权' : '授权一次'}该权限请求。`
|
|
245
|
-
: `已提交选择:${label}`,
|
|
212
|
+
content: '该操作已过期,请重新发起请求。',
|
|
246
213
|
},
|
|
247
214
|
},
|
|
248
215
|
],
|
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;
|