@milerliu/feishu 0.1.11 → 0.1.12
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/package.json +1 -1
- package/src/send.ts +26 -63
package/package.json
CHANGED
package/src/send.ts
CHANGED
|
@@ -41,89 +41,52 @@ export async function sendStreamingMessageFeishu(params: {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
const receiveIdType = resolveReceiveIdType(receiveId);
|
|
44
|
-
const tableMode = getFeishuRuntime().channel.text.resolveMarkdownTableMode({
|
|
45
|
-
cfg,
|
|
46
|
-
channel: "feishu",
|
|
47
|
-
});
|
|
48
44
|
|
|
49
|
-
// Build message content
|
|
45
|
+
// Build message content with @mention support
|
|
50
46
|
let rawText = text ?? "";
|
|
51
47
|
if (mentions && mentions.length > 0) {
|
|
52
|
-
rawText =
|
|
48
|
+
rawText = buildMentionedMessage(mentions, rawText);
|
|
53
49
|
}
|
|
54
|
-
const messageText = getFeishuRuntime().channel.text.convertMarkdownTables(rawText, tableMode);
|
|
55
50
|
|
|
56
|
-
//
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
config: {
|
|
65
|
-
wide_screen_mode: true,
|
|
66
|
-
streaming_update: true, // Enable streaming update mode
|
|
67
|
-
},
|
|
68
|
-
elements: [
|
|
69
|
-
{
|
|
70
|
-
tag: "markdown",
|
|
71
|
-
content: "",
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
const content = JSON.stringify(initialCard);
|
|
51
|
+
// Split text into chunks for streaming effect
|
|
52
|
+
const chunkSize = 300;
|
|
53
|
+
const chunks: string[] = [];
|
|
54
|
+
for (let i = 0; i < rawText.length; i += chunkSize) {
|
|
55
|
+
chunks.push(rawText.slice(i, i + chunkSize));
|
|
56
|
+
}
|
|
77
57
|
|
|
78
|
-
//
|
|
79
|
-
const
|
|
58
|
+
// Send first chunk
|
|
59
|
+
const firstContent = JSON.stringify({ text: chunks[0] });
|
|
60
|
+
const firstResponse = await client.im.message.create({
|
|
80
61
|
params: { receive_id_type: receiveIdType },
|
|
81
62
|
data: {
|
|
82
63
|
receive_id: receiveId,
|
|
83
|
-
content,
|
|
84
|
-
msg_type: "
|
|
64
|
+
content: firstContent,
|
|
65
|
+
msg_type: "text",
|
|
85
66
|
},
|
|
86
67
|
});
|
|
87
68
|
|
|
88
|
-
if (
|
|
89
|
-
throw new Error(`Feishu streaming
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const messageId = response.data?.message_id ?? "unknown";
|
|
93
|
-
|
|
94
|
-
// Extract card_id from response
|
|
95
|
-
const cardData = response.data as Record<string, unknown> | undefined;
|
|
96
|
-
const cardId = cardData?.card_id as string | undefined;
|
|
97
|
-
|
|
98
|
-
if (!cardId) {
|
|
99
|
-
console.warn('No card_id returned, falling back to regular card send');
|
|
100
|
-
const fallbackCard = buildMarkdownCard(messageText);
|
|
101
|
-
return sendCardFeishu({ cfg, to, card: fallbackCard });
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Send multiple messages with delay to simulate streaming effect
|
|
105
|
-
const chunkSize = 500;
|
|
106
|
-
const chunks: string[] = [];
|
|
107
|
-
for (let i = 0; i < messageText.length; i += chunkSize) {
|
|
108
|
-
chunks.push(messageText.slice(i, i + chunkSize));
|
|
69
|
+
if (firstResponse.code !== 0) {
|
|
70
|
+
throw new Error(`Feishu streaming send failed: ${firstResponse.msg || `code ${firstResponse.code}`}`);
|
|
109
71
|
}
|
|
110
72
|
|
|
111
|
-
|
|
112
|
-
const firstCard = buildMarkdownCard(chunks[0]);
|
|
113
|
-
const firstResult = await sendCardFeishu({ cfg, to, card: firstCard });
|
|
73
|
+
const messageId = firstResponse.data?.message_id ?? "unknown";
|
|
114
74
|
|
|
115
75
|
// Send remaining chunks as separate messages
|
|
116
76
|
for (let i = 1; i < chunks.length; i++) {
|
|
117
77
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
118
|
-
const
|
|
119
|
-
|
|
78
|
+
const chunkContent = JSON.stringify({ text: chunks[i] });
|
|
79
|
+
|
|
80
|
+
await client.im.message.create({
|
|
81
|
+
params: { receive_id_type: receiveIdType },
|
|
82
|
+
data: {
|
|
83
|
+
receive_id: receiveId,
|
|
84
|
+
content: chunkContent,
|
|
85
|
+
msg_type: "text",
|
|
86
|
+
},
|
|
87
|
+
});
|
|
120
88
|
}
|
|
121
89
|
|
|
122
|
-
return {
|
|
123
|
-
messageId: firstResult.messageId,
|
|
124
|
-
chatId: receiveId,
|
|
125
|
-
};
|
|
126
|
-
|
|
127
90
|
return {
|
|
128
91
|
messageId,
|
|
129
92
|
chatId: receiveId,
|