@krischoichoi/channel-lark 0.6.0
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/README.md +114 -0
- package/lib/adapter.d.ts +128 -0
- package/lib/adapter.d.ts.map +1 -0
- package/lib/adapter.js +347 -0
- package/lib/adapter.js.map +1 -0
- package/lib/auth/device-authorization.d.ts +12 -0
- package/lib/auth/device-authorization.d.ts.map +1 -0
- package/lib/auth/device-authorization.js +169 -0
- package/lib/auth/device-authorization.js.map +1 -0
- package/lib/card.d.ts +124 -0
- package/lib/card.d.ts.map +1 -0
- package/lib/card.js +347 -0
- package/lib/card.js.map +1 -0
- package/lib/config.d.ts +103 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +60 -0
- package/lib/config.js.map +1 -0
- package/lib/definition.d.ts +74 -0
- package/lib/definition.d.ts.map +1 -0
- package/lib/definition.js +190 -0
- package/lib/definition.js.map +1 -0
- package/lib/inbound.d.ts +41 -0
- package/lib/inbound.d.ts.map +1 -0
- package/lib/inbound.js +102 -0
- package/lib/inbound.js.map +1 -0
- package/lib/index.d.ts +58 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +104 -0
- package/lib/index.js.map +1 -0
- package/lib/lark-sdk-upstream.d.ts +128 -0
- package/lib/lark-sdk-upstream.d.ts.map +1 -0
- package/lib/lark-sdk-upstream.js +339 -0
- package/lib/lark-sdk-upstream.js.map +1 -0
- package/lib/manifest.d.ts +23 -0
- package/lib/manifest.d.ts.map +1 -0
- package/lib/manifest.js +36 -0
- package/lib/manifest.js.map +1 -0
- package/lib/mapper.d.ts +47 -0
- package/lib/mapper.d.ts.map +1 -0
- package/lib/mapper.js +223 -0
- package/lib/mapper.js.map +1 -0
- package/lib/media-hydrator.d.ts +55 -0
- package/lib/media-hydrator.d.ts.map +1 -0
- package/lib/media-hydrator.js +172 -0
- package/lib/media-hydrator.js.map +1 -0
- package/lib/openapi-outbound.d.ts +216 -0
- package/lib/openapi-outbound.d.ts.map +1 -0
- package/lib/openapi-outbound.js +384 -0
- package/lib/openapi-outbound.js.map +1 -0
- package/lib/outbound.d.ts +21 -0
- package/lib/outbound.d.ts.map +1 -0
- package/lib/outbound.js +93 -0
- package/lib/outbound.js.map +1 -0
- package/lib/upstream/media-port.d.ts +154 -0
- package/lib/upstream/media-port.d.ts.map +1 -0
- package/lib/upstream/media-port.js +168 -0
- package/lib/upstream/media-port.js.map +1 -0
- package/lib/upstream.d.ts +119 -0
- package/lib/upstream.d.ts.map +1 -0
- package/lib/upstream.js +2 -0
- package/lib/upstream.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import type { OutboundActionRow } from '@krischoichoi/channel-core';
|
|
2
|
+
import type { LarkFileRef, LarkMediaRef, LarkOutbound } from './upstream.js';
|
|
3
|
+
/** The SDK `receive_id_type` union (matches the real `Client` type). */
|
|
4
|
+
export type LarkReceiveIdType = 'open_id' | 'user_id' | 'union_id' | 'email' | 'chat_id';
|
|
5
|
+
/** SDK `file_type` union for im.v1.file.create (matches the SDK type). */
|
|
6
|
+
export type LarkFileType = 'opus' | 'mp4' | 'pdf' | 'doc' | 'xls' | 'ppt' | 'stream';
|
|
7
|
+
/** Minimal `im.v1.message.create` payload/result shapes consumed here. */
|
|
8
|
+
export interface LarkCreateMessagePayload {
|
|
9
|
+
params: {
|
|
10
|
+
receive_id_type: LarkReceiveIdType;
|
|
11
|
+
uuid?: string;
|
|
12
|
+
};
|
|
13
|
+
data: {
|
|
14
|
+
receive_id: string;
|
|
15
|
+
msg_type: string;
|
|
16
|
+
content: string;
|
|
17
|
+
uuid?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface LarkCreateMessageResult {
|
|
21
|
+
message_id?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Minimal `im.v1.message.patch` payload shape (update card content). */
|
|
24
|
+
export interface LarkPatchMessagePayload {
|
|
25
|
+
path: {
|
|
26
|
+
message_id: string;
|
|
27
|
+
};
|
|
28
|
+
data: {
|
|
29
|
+
content: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Minimal `im.v1.image.create` payload/result shapes consumed here. */
|
|
33
|
+
export interface LarkCreateImagePayload {
|
|
34
|
+
data: {
|
|
35
|
+
image_type: 'message' | 'avatar';
|
|
36
|
+
image: Buffer;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export interface LarkCreateImageResult {
|
|
40
|
+
image_key?: string;
|
|
41
|
+
}
|
|
42
|
+
/** Minimal im.v1.file.create payload/result shapes consumed here. */
|
|
43
|
+
export interface LarkCreateFilePayload {
|
|
44
|
+
data: {
|
|
45
|
+
file_type: 'opus' | 'mp4' | 'pdf' | 'doc' | 'xls' | 'ppt' | 'stream';
|
|
46
|
+
file_name: string;
|
|
47
|
+
duration?: number;
|
|
48
|
+
file: Buffer;
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export interface LarkCreateFileResult {
|
|
52
|
+
file_key?: string;
|
|
53
|
+
}
|
|
54
|
+
/** Common OpenAPI envelope: `code` 0 means success. */
|
|
55
|
+
export interface LarkApiResponse<T = Record<string, unknown>> {
|
|
56
|
+
code?: number;
|
|
57
|
+
msg?: string;
|
|
58
|
+
data?: T;
|
|
59
|
+
}
|
|
60
|
+
/** Minimal cardkit.v1.card.create payload/result shapes. */
|
|
61
|
+
export interface LarkCardkitCardCreatePayload {
|
|
62
|
+
data: {
|
|
63
|
+
type: 'card_json';
|
|
64
|
+
data: string;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export interface LarkCardkitCardCreateResult {
|
|
68
|
+
card_id?: string;
|
|
69
|
+
}
|
|
70
|
+
/** Minimal cardkit.v1.cardElement.content payload (streaming element replace). */
|
|
71
|
+
export interface LarkCardElementContentPayload {
|
|
72
|
+
path: {
|
|
73
|
+
card_id: string;
|
|
74
|
+
element_id: string;
|
|
75
|
+
};
|
|
76
|
+
data: {
|
|
77
|
+
uuid?: string;
|
|
78
|
+
content: string;
|
|
79
|
+
sequence: number;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Minimal cardkit.v1.card.settings payload (streaming close + summary). */
|
|
83
|
+
export interface LarkCardSettingsPayload {
|
|
84
|
+
path: {
|
|
85
|
+
card_id: string;
|
|
86
|
+
};
|
|
87
|
+
data: {
|
|
88
|
+
settings: string;
|
|
89
|
+
sequence: number;
|
|
90
|
+
uuid?: string;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Structural subset of the real SDK `Client` used for outbound. The real
|
|
95
|
+
* `Client` (from `@larksuiteoapi/node-sdk` at 1.73.1) satisfies this shape;
|
|
96
|
+
* tests inject a fake.
|
|
97
|
+
*/
|
|
98
|
+
export interface LarkOpenApiClient {
|
|
99
|
+
im: {
|
|
100
|
+
v1: {
|
|
101
|
+
message: {
|
|
102
|
+
create(payload: LarkCreateMessagePayload): Promise<LarkApiResponse<LarkCreateMessageResult>>;
|
|
103
|
+
patch(payload: LarkPatchMessagePayload): Promise<LarkApiResponse>;
|
|
104
|
+
};
|
|
105
|
+
image: {
|
|
106
|
+
create(payload: LarkCreateImagePayload): Promise<LarkCreateImageResult | null>;
|
|
107
|
+
};
|
|
108
|
+
file: {
|
|
109
|
+
create(payload: LarkCreateFilePayload): Promise<LarkCreateFileResult | null>;
|
|
110
|
+
};
|
|
111
|
+
chat?: {
|
|
112
|
+
get(payload: {
|
|
113
|
+
path: {
|
|
114
|
+
chat_id: string;
|
|
115
|
+
};
|
|
116
|
+
}): Promise<unknown>;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
messageReaction?: unknown;
|
|
120
|
+
};
|
|
121
|
+
cardkit: {
|
|
122
|
+
v1: {
|
|
123
|
+
card: {
|
|
124
|
+
create(payload: LarkCardkitCardCreatePayload): Promise<LarkApiResponse<LarkCardkitCardCreateResult>>;
|
|
125
|
+
settings(payload: LarkCardSettingsPayload): Promise<LarkApiResponse>;
|
|
126
|
+
};
|
|
127
|
+
cardElement: {
|
|
128
|
+
content(payload: LarkCardElementContentPayload): Promise<LarkApiResponse>;
|
|
129
|
+
};
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
addReaction?(messageId: string, emojiType: string): Promise<string>;
|
|
133
|
+
removeReaction?(messageId: string, reactionId: string): Promise<void>;
|
|
134
|
+
}
|
|
135
|
+
/** The stable id of the single streaming markdown element inside a CardKit card. */
|
|
136
|
+
export declare const STREAM_MARKDOWN_ELEMENT_ID = "stream_md";
|
|
137
|
+
/**
|
|
138
|
+
* The summary shown while a streaming card is still generating (Feishu
|
|
139
|
+
* previews this in chat lists until streaming is closed and a real summary is
|
|
140
|
+
* written).
|
|
141
|
+
*/
|
|
142
|
+
export declare const STREAM_GENERATING_SUMMARY = "[Generating...]";
|
|
143
|
+
/**
|
|
144
|
+
* Build the Card JSON 2.0 payload of a native-streaming card entity. The
|
|
145
|
+
* element carries a stable `element_id` and the card opens `streaming_mode`
|
|
146
|
+
* with Feishu's typewriter `streaming_config`, matching the official "流式更新
|
|
147
|
+
* 卡片" flow (cardkit.v1.card.create → cardElement.content → card.settings).
|
|
148
|
+
*/
|
|
149
|
+
export declare function streamingCardJson(initialText: string, summary?: string): string;
|
|
150
|
+
export interface LarkOpenApiOutboundOptions {
|
|
151
|
+
/** Official OpenAPI client (real `Client` or injected fake). */
|
|
152
|
+
client: LarkOpenApiClient;
|
|
153
|
+
/** Injectable image-byte fetch for `sendMedia` URLs (tests); defaults to `fetch`. */
|
|
154
|
+
fetchImage?: (url: string) => Promise<Buffer>;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Official-OpenAPI implementation of the outbound surface (plain messages,
|
|
158
|
+
* media, Card JSON 2.0 interactive cards and CardKit 2.0 entities + native
|
|
159
|
+
* streaming). No `receive` here: in SDK mode the inbound leg stays on the WS
|
|
160
|
+
* long-connection, and this driver is composed as the `outbound` half of
|
|
161
|
+
* `LarkSdkUpstream`.
|
|
162
|
+
*/
|
|
163
|
+
export declare class LarkOpenApiOutbound implements LarkOutbound {
|
|
164
|
+
private readonly options;
|
|
165
|
+
private readonly fetchImage;
|
|
166
|
+
private readonly typingReactions;
|
|
167
|
+
private readonly typingOperations;
|
|
168
|
+
constructor(options: LarkOpenApiOutboundOptions);
|
|
169
|
+
sendText(to: string, text: string): Promise<unknown>;
|
|
170
|
+
sendInteractive(to: string, text: string, actions: OutboundActionRow[]): Promise<unknown>;
|
|
171
|
+
sendMedia(to: string, media: LarkMediaRef): Promise<unknown>;
|
|
172
|
+
sendFile(to: string, file: LarkFileRef): Promise<unknown>;
|
|
173
|
+
createCardEntity(cardJson: string): Promise<{
|
|
174
|
+
cardId: string;
|
|
175
|
+
}>;
|
|
176
|
+
sendCardEntity(conversationId: string, cardId: string): Promise<{
|
|
177
|
+
messageId: string;
|
|
178
|
+
}>;
|
|
179
|
+
updateCardElementContent(cardId: string, elementId: string, content: string, sequence: number, uuid: string): Promise<unknown>;
|
|
180
|
+
finishStreamingCard(cardId: string, sequence: number, summary: string): Promise<unknown>;
|
|
181
|
+
updateInteractive(cardId: string, text: string, actions: OutboundActionRow[]): Promise<unknown>;
|
|
182
|
+
getChatType(conversationId: string): Promise<'p2p' | 'group' | undefined>;
|
|
183
|
+
startTyping(messageId: string): Promise<void>;
|
|
184
|
+
stopTyping(messageId: string): Promise<void>;
|
|
185
|
+
private serializeTyping;
|
|
186
|
+
private callEnvelope;
|
|
187
|
+
private reactionClient;
|
|
188
|
+
private resolveImageBytes;
|
|
189
|
+
private resolveFileBytes;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Resolve the SDK `receive_id_type` from a Lark conversation id: group chats
|
|
193
|
+
* carry an `oc_` prefix (`chat_id`), p2p chats carry the peer's `ou_` open id
|
|
194
|
+
* (`open_id`).
|
|
195
|
+
*/
|
|
196
|
+
export declare function receiveIdType(to: string): LarkReceiveIdType;
|
|
197
|
+
/**
|
|
198
|
+
* Derive the SDK `file_type` from a filename extension, defaulting to
|
|
199
|
+
* 'stream' for anything unrecognised. Matches the SDK union for im.v1.file.create.
|
|
200
|
+
*/
|
|
201
|
+
export declare function fileTypeFromName(name: string): LarkFileType;
|
|
202
|
+
/**
|
|
203
|
+
* Card JSON 2.0 content for a single markdown element (used by the interactive
|
|
204
|
+
* card rewrite path that patches an already-sent message). The 2.0 `markdown`
|
|
205
|
+
* element renders the full Lark-flavoured Markdown (headings, lists, code
|
|
206
|
+
* blocks, tables, links).
|
|
207
|
+
*/
|
|
208
|
+
export declare function cardContent(text: string): string;
|
|
209
|
+
/**
|
|
210
|
+
* Official Card JSON 2.0 button layout. V2 removed the legacy `action`
|
|
211
|
+
* container: buttons are direct body elements and callback values belong to
|
|
212
|
+
* `behaviors[].value`. No `tag: "action"` container and no `lark_md` are ever
|
|
213
|
+
* emitted.
|
|
214
|
+
*/
|
|
215
|
+
export declare function interactiveCardContent(text: string, rows: OutboundActionRow[]): string;
|
|
216
|
+
//# sourceMappingURL=openapi-outbound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-outbound.d.ts","sourceRoot":"","sources":["../src/openapi-outbound.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lark outbound over the official `@larksuiteoapi/node-sdk` OpenAPI `Client`.
|
|
3
|
+
*
|
|
4
|
+
* This driver is the ONLY outbound implementation: plain text, media and file
|
|
5
|
+
* messages, Card JSON 2.0 interactive cards, and CardKit 2.0 card entities with
|
|
6
|
+
* native streaming (`cardElement.content`) are all routed through the official
|
|
7
|
+
* client. There is no self-hosted gateway and no legacy `/message/*` or
|
|
8
|
+
* `/card/*` endpoint anywhere.
|
|
9
|
+
*
|
|
10
|
+
* - `sendText` → `im.v1.message.create` (`msg_type: 'text'`)
|
|
11
|
+
* - `sendMedia` → `im.v1.image.create` (upload → `image_key`) + `im.v1.message.create` (`msg_type: 'image'`)
|
|
12
|
+
* - `sendFile` → `im.v1.file.create` (upload → `file_key`) + `im.v1.message.create` (`msg_type: 'file'`)
|
|
13
|
+
* - `sendInteractive` → `im.v1.message.create` (`msg_type: 'interactive'`) with Card JSON 2.0 buttons
|
|
14
|
+
* - `updateInteractive` → `im.v1.message.patch` (rewrite an already-sent interactive card)
|
|
15
|
+
* - `createCardEntity` → `cardkit.v1.card.create` (Card JSON 2.0 only)
|
|
16
|
+
* - `sendCardEntity` → `im.v1.message.create` with content `{ type: "card", data: { card_id } }`
|
|
17
|
+
* - `updateCardElementContent` → `cardkit.v1.cardElement.content` (native typewriter)
|
|
18
|
+
* - `finishStreamingCard` → `cardkit.v1.card.settings` (`streaming_mode: false` + summary)
|
|
19
|
+
*
|
|
20
|
+
* Only a minimal structural client surface is consumed so offline tests can
|
|
21
|
+
* inject a fake; the real `Client` satisfies it structurally. Credentials are
|
|
22
|
+
* never referenced here — the `Client` is built elsewhere from config.
|
|
23
|
+
*
|
|
24
|
+
* Official responses are trust-boundary validated with zod `safeParse` before
|
|
25
|
+
* their fields are read; invalid envelopes surface as `ChannelError`s.
|
|
26
|
+
*/
|
|
27
|
+
import { ChannelError } from '@krischoichoi/channel-core';
|
|
28
|
+
import { z } from 'zod';
|
|
29
|
+
const reactionIdSchema = z.string().trim().min(1);
|
|
30
|
+
const chatModeResponseSchema = z.object({
|
|
31
|
+
code: z.number().optional(),
|
|
32
|
+
data: z.object({
|
|
33
|
+
chat_mode: z.enum(['p2p', 'group', 'topic']).optional(),
|
|
34
|
+
}).optional(),
|
|
35
|
+
});
|
|
36
|
+
/** Trust-boundary envelope: any unknown extra keys are allowed, but the read fields are validated. */
|
|
37
|
+
const envelopeSchema = z.object({
|
|
38
|
+
code: z.number().optional(),
|
|
39
|
+
msg: z.string().optional(),
|
|
40
|
+
data: z.unknown().optional(),
|
|
41
|
+
}).passthrough();
|
|
42
|
+
const cardIdResultSchema = z.object({
|
|
43
|
+
card_id: z.string().trim().min(1),
|
|
44
|
+
});
|
|
45
|
+
const messageIdResultSchema = z.object({
|
|
46
|
+
message_id: z.string().trim().min(1),
|
|
47
|
+
});
|
|
48
|
+
/** The stable id of the single streaming markdown element inside a CardKit card. */
|
|
49
|
+
export const STREAM_MARKDOWN_ELEMENT_ID = 'stream_md';
|
|
50
|
+
/**
|
|
51
|
+
* The summary shown while a streaming card is still generating (Feishu
|
|
52
|
+
* previews this in chat lists until streaming is closed and a real summary is
|
|
53
|
+
* written).
|
|
54
|
+
*/
|
|
55
|
+
export const STREAM_GENERATING_SUMMARY = '[Generating...]';
|
|
56
|
+
/**
|
|
57
|
+
* Build the Card JSON 2.0 payload of a native-streaming card entity. The
|
|
58
|
+
* element carries a stable `element_id` and the card opens `streaming_mode`
|
|
59
|
+
* with Feishu's typewriter `streaming_config`, matching the official "流式更新
|
|
60
|
+
* 卡片" flow (cardkit.v1.card.create → cardElement.content → card.settings).
|
|
61
|
+
*/
|
|
62
|
+
export function streamingCardJson(initialText, summary = STREAM_GENERATING_SUMMARY) {
|
|
63
|
+
return JSON.stringify({
|
|
64
|
+
schema: '2.0',
|
|
65
|
+
config: {
|
|
66
|
+
streaming_mode: true,
|
|
67
|
+
summary: { content: summary },
|
|
68
|
+
streaming_config: {
|
|
69
|
+
print_frequency_ms: { default: 70 },
|
|
70
|
+
print_step: { default: 1 },
|
|
71
|
+
print_strategy: 'fast',
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
body: {
|
|
75
|
+
elements: [
|
|
76
|
+
{
|
|
77
|
+
tag: 'markdown',
|
|
78
|
+
element_id: STREAM_MARKDOWN_ELEMENT_ID,
|
|
79
|
+
content: initialText,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Official-OpenAPI implementation of the outbound surface (plain messages,
|
|
87
|
+
* media, Card JSON 2.0 interactive cards and CardKit 2.0 entities + native
|
|
88
|
+
* streaming). No `receive` here: in SDK mode the inbound leg stays on the WS
|
|
89
|
+
* long-connection, and this driver is composed as the `outbound` half of
|
|
90
|
+
* `LarkSdkUpstream`.
|
|
91
|
+
*/
|
|
92
|
+
export class LarkOpenApiOutbound {
|
|
93
|
+
options;
|
|
94
|
+
fetchImage;
|
|
95
|
+
typingReactions = new Map();
|
|
96
|
+
typingOperations = new Map();
|
|
97
|
+
constructor(options) {
|
|
98
|
+
this.options = options;
|
|
99
|
+
this.fetchImage = options.fetchImage ?? defaultFetchImage;
|
|
100
|
+
}
|
|
101
|
+
sendText(to, text) {
|
|
102
|
+
return this.callEnvelope(() => this.options.client.im.v1.message.create({
|
|
103
|
+
params: { receive_id_type: receiveIdType(to) },
|
|
104
|
+
data: { receive_id: to, msg_type: 'text', content: JSON.stringify({ text }) },
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
sendInteractive(to, text, actions) {
|
|
108
|
+
return this.callEnvelope(() => this.options.client.im.v1.message.create({
|
|
109
|
+
params: { receive_id_type: receiveIdType(to) },
|
|
110
|
+
data: {
|
|
111
|
+
receive_id: to,
|
|
112
|
+
msg_type: 'interactive',
|
|
113
|
+
content: interactiveCardContent(text, actions),
|
|
114
|
+
},
|
|
115
|
+
}));
|
|
116
|
+
}
|
|
117
|
+
async sendMedia(to, media) {
|
|
118
|
+
const bytes = await this.resolveImageBytes(media);
|
|
119
|
+
const uploaded = await this.options.client.im.v1.image.create({
|
|
120
|
+
data: { image_type: 'message', image: bytes },
|
|
121
|
+
});
|
|
122
|
+
const imageKey = uploaded?.image_key;
|
|
123
|
+
if (!imageKey) {
|
|
124
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark image upload returned no image_key');
|
|
125
|
+
}
|
|
126
|
+
return this.callEnvelope(() => this.options.client.im.v1.message.create({
|
|
127
|
+
params: { receive_id_type: receiveIdType(to) },
|
|
128
|
+
data: {
|
|
129
|
+
receive_id: to,
|
|
130
|
+
msg_type: 'image',
|
|
131
|
+
content: JSON.stringify({ image_key: imageKey }),
|
|
132
|
+
},
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
135
|
+
async sendFile(to, file) {
|
|
136
|
+
const bytes = await this.resolveFileBytes(file);
|
|
137
|
+
const name = file.name ?? 'file';
|
|
138
|
+
const uploaded = await this.options.client.im.v1.file.create({
|
|
139
|
+
data: {
|
|
140
|
+
file_type: fileTypeFromName(name),
|
|
141
|
+
file_name: name,
|
|
142
|
+
file: bytes,
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
const fileKey = uploaded?.file_key;
|
|
146
|
+
if (!fileKey) {
|
|
147
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark file upload returned no file_key');
|
|
148
|
+
}
|
|
149
|
+
return this.callEnvelope(() => this.options.client.im.v1.message.create({
|
|
150
|
+
params: { receive_id_type: receiveIdType(to) },
|
|
151
|
+
data: {
|
|
152
|
+
receive_id: to,
|
|
153
|
+
msg_type: 'file',
|
|
154
|
+
content: JSON.stringify({ file_key: fileKey }),
|
|
155
|
+
},
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
async createCardEntity(cardJson) {
|
|
159
|
+
const response = await this.options.client.cardkit.v1.card.create({
|
|
160
|
+
data: { type: 'card_json', data: cardJson },
|
|
161
|
+
});
|
|
162
|
+
const envelope = parseEnvelope(response);
|
|
163
|
+
const parsed = cardIdResultSchema.safeParse(envelope.data);
|
|
164
|
+
if (!parsed.success) {
|
|
165
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark cardkit.card.create returned no card_id');
|
|
166
|
+
}
|
|
167
|
+
return { cardId: parsed.data.card_id };
|
|
168
|
+
}
|
|
169
|
+
async sendCardEntity(conversationId, cardId) {
|
|
170
|
+
const response = await this.options.client.im.v1.message.create({
|
|
171
|
+
params: { receive_id_type: receiveIdType(conversationId) },
|
|
172
|
+
data: {
|
|
173
|
+
receive_id: conversationId,
|
|
174
|
+
msg_type: 'interactive',
|
|
175
|
+
content: JSON.stringify({ type: 'card', data: { card_id: cardId } }),
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const envelope = parseEnvelope(response);
|
|
179
|
+
const parsed = messageIdResultSchema.safeParse(envelope.data);
|
|
180
|
+
if (!parsed.success) {
|
|
181
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark card reference send returned no message_id');
|
|
182
|
+
}
|
|
183
|
+
return { messageId: parsed.data.message_id };
|
|
184
|
+
}
|
|
185
|
+
async updateCardElementContent(cardId, elementId, content, sequence, uuid) {
|
|
186
|
+
return this.callEnvelope(() => this.options.client.cardkit.v1.cardElement.content({
|
|
187
|
+
path: { card_id: cardId, element_id: elementId },
|
|
188
|
+
data: { uuid, content, sequence },
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
async finishStreamingCard(cardId, sequence, summary) {
|
|
192
|
+
return this.callEnvelope(() => this.options.client.cardkit.v1.card.settings({
|
|
193
|
+
path: { card_id: cardId },
|
|
194
|
+
data: {
|
|
195
|
+
settings: JSON.stringify({ config: { streaming_mode: false, summary: { content: summary } } }),
|
|
196
|
+
sequence,
|
|
197
|
+
uuid: `s_${cardId}_${sequence}`,
|
|
198
|
+
},
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
updateInteractive(cardId, text, actions) {
|
|
202
|
+
return this.callEnvelope(() => this.options.client.im.v1.message.patch({
|
|
203
|
+
path: { message_id: cardId },
|
|
204
|
+
data: { content: interactiveCardContent(text, actions) },
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
async getChatType(conversationId) {
|
|
208
|
+
const chat = this.options.client.im.v1.chat;
|
|
209
|
+
if (!chat)
|
|
210
|
+
return undefined;
|
|
211
|
+
const parsed = chatModeResponseSchema.safeParse(await chat.get({ path: { chat_id: conversationId } }));
|
|
212
|
+
if (!parsed.success || parsed.data.code !== undefined && parsed.data.code !== 0)
|
|
213
|
+
return undefined;
|
|
214
|
+
const mode = parsed.data.data?.chat_mode;
|
|
215
|
+
return mode === 'p2p' ? 'p2p' : mode === 'group' || mode === 'topic' ? 'group' : undefined;
|
|
216
|
+
}
|
|
217
|
+
async startTyping(messageId) {
|
|
218
|
+
if (!messageId || this.typingReactions.has(messageId))
|
|
219
|
+
return;
|
|
220
|
+
await this.serializeTyping(messageId, async () => {
|
|
221
|
+
if (this.typingReactions.has(messageId))
|
|
222
|
+
return;
|
|
223
|
+
const reaction = this.reactionClient();
|
|
224
|
+
if (!reaction)
|
|
225
|
+
return;
|
|
226
|
+
const result = reactionIdSchema.safeParse(await reaction.addReaction(messageId, 'Typing'));
|
|
227
|
+
if (!result.success) {
|
|
228
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark typing reaction returned an invalid reaction id');
|
|
229
|
+
}
|
|
230
|
+
this.typingReactions.set(messageId, result.data);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
async stopTyping(messageId) {
|
|
234
|
+
await this.serializeTyping(messageId, async () => {
|
|
235
|
+
const reactionId = this.typingReactions.get(messageId);
|
|
236
|
+
if (!reactionId)
|
|
237
|
+
return;
|
|
238
|
+
const reaction = this.reactionClient();
|
|
239
|
+
if (reaction)
|
|
240
|
+
await reaction.removeReaction(messageId, reactionId);
|
|
241
|
+
this.typingReactions.delete(messageId);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async serializeTyping(messageId, operation) {
|
|
245
|
+
const previous = this.typingOperations.get(messageId) ?? Promise.resolve();
|
|
246
|
+
const current = previous.then(operation, operation);
|
|
247
|
+
this.typingOperations.set(messageId, current);
|
|
248
|
+
try {
|
|
249
|
+
await current;
|
|
250
|
+
}
|
|
251
|
+
finally {
|
|
252
|
+
if (this.typingOperations.get(messageId) === current)
|
|
253
|
+
this.typingOperations.delete(messageId);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async callEnvelope(request) {
|
|
257
|
+
return parseEnvelope(await request());
|
|
258
|
+
}
|
|
259
|
+
reactionClient() {
|
|
260
|
+
if (this.options.client.addReaction && this.options.client.removeReaction) {
|
|
261
|
+
return {
|
|
262
|
+
addReaction: this.options.client.addReaction.bind(this.options.client),
|
|
263
|
+
removeReaction: this.options.client.removeReaction.bind(this.options.client),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const nested = this.options.client.im.messageReaction;
|
|
267
|
+
return nested && typeof nested.addReaction === 'function' && typeof nested.removeReaction === 'function'
|
|
268
|
+
? nested
|
|
269
|
+
: undefined;
|
|
270
|
+
}
|
|
271
|
+
async resolveImageBytes(media) {
|
|
272
|
+
if (media.dataUri)
|
|
273
|
+
return dataUriToBuffer(media.dataUri);
|
|
274
|
+
if (media.url)
|
|
275
|
+
return this.fetchImage(media.url);
|
|
276
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark sendMedia requires an image url or dataUri');
|
|
277
|
+
}
|
|
278
|
+
async resolveFileBytes(file) {
|
|
279
|
+
if (file.localData) {
|
|
280
|
+
return Buffer.isBuffer(file.localData) ? file.localData : Buffer.from(file.localData);
|
|
281
|
+
}
|
|
282
|
+
if (file.dataUri)
|
|
283
|
+
return dataUriToBuffer(file.dataUri);
|
|
284
|
+
if (file.url)
|
|
285
|
+
return this.fetchImage(file.url);
|
|
286
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark sendFile requires localData, url, or dataUri');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/** Validate an SDK envelope and return the raw parsed object. */
|
|
290
|
+
function parseEnvelope(response) {
|
|
291
|
+
const parsed = envelopeSchema.safeParse(response);
|
|
292
|
+
if (!parsed.success) {
|
|
293
|
+
throw new ChannelError('CHANNEL_ERROR', 'lark openapi returned an invalid envelope');
|
|
294
|
+
}
|
|
295
|
+
if (parsed.data.code !== undefined && parsed.data.code !== 0) {
|
|
296
|
+
throw new ChannelError('CHANNEL_ERROR', `lark openapi request failed (${parsed.data.code}): ${parsed.data.msg ?? 'unknown error'}`);
|
|
297
|
+
}
|
|
298
|
+
return parsed.data;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Resolve the SDK `receive_id_type` from a Lark conversation id: group chats
|
|
302
|
+
* carry an `oc_` prefix (`chat_id`), p2p chats carry the peer's `ou_` open id
|
|
303
|
+
* (`open_id`).
|
|
304
|
+
*/
|
|
305
|
+
export function receiveIdType(to) {
|
|
306
|
+
return to.startsWith('oc_') ? 'chat_id' : 'open_id';
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Derive the SDK `file_type` from a filename extension, defaulting to
|
|
310
|
+
* 'stream' for anything unrecognised. Matches the SDK union for im.v1.file.create.
|
|
311
|
+
*/
|
|
312
|
+
export function fileTypeFromName(name) {
|
|
313
|
+
const ext = (name.split('.').pop() ?? '').toLowerCase();
|
|
314
|
+
switch (ext) {
|
|
315
|
+
case 'opus': return 'opus';
|
|
316
|
+
case 'mp4': return 'mp4';
|
|
317
|
+
case 'pdf': return 'pdf';
|
|
318
|
+
case 'doc':
|
|
319
|
+
case 'docx': return 'doc';
|
|
320
|
+
case 'xls':
|
|
321
|
+
case 'xlsx': return 'xls';
|
|
322
|
+
case 'ppt':
|
|
323
|
+
case 'pptx': return 'ppt';
|
|
324
|
+
default: return 'stream';
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Card JSON 2.0 content for a single markdown element (used by the interactive
|
|
329
|
+
* card rewrite path that patches an already-sent message). The 2.0 `markdown`
|
|
330
|
+
* element renders the full Lark-flavoured Markdown (headings, lists, code
|
|
331
|
+
* blocks, tables, links).
|
|
332
|
+
*/
|
|
333
|
+
export function cardContent(text) {
|
|
334
|
+
return JSON.stringify({
|
|
335
|
+
schema: '2.0',
|
|
336
|
+
config: { wide_screen_mode: true },
|
|
337
|
+
body: {
|
|
338
|
+
elements: [{ tag: 'markdown', content: text }],
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Official Card JSON 2.0 button layout. V2 removed the legacy `action`
|
|
344
|
+
* container: buttons are direct body elements and callback values belong to
|
|
345
|
+
* `behaviors[].value`. No `tag: "action"` container and no `lark_md` are ever
|
|
346
|
+
* emitted.
|
|
347
|
+
*/
|
|
348
|
+
export function interactiveCardContent(text, rows) {
|
|
349
|
+
const elements = [{ tag: 'markdown', content: text }];
|
|
350
|
+
for (const row of rows) {
|
|
351
|
+
for (const action of row.actions) {
|
|
352
|
+
elements.push({
|
|
353
|
+
tag: 'button',
|
|
354
|
+
text: { tag: 'plain_text', content: action.label },
|
|
355
|
+
...(buttonType(action.style) ? { type: buttonType(action.style) } : {}),
|
|
356
|
+
behaviors: [{ type: 'callback', value: { actionId: action.id } }],
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return JSON.stringify({
|
|
361
|
+
schema: '2.0',
|
|
362
|
+
config: { wide_screen_mode: true },
|
|
363
|
+
body: { elements },
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
function buttonType(style) {
|
|
367
|
+
if (style === 'primary' || style === 'success')
|
|
368
|
+
return 'primary';
|
|
369
|
+
return style === 'danger' ? 'danger' : undefined;
|
|
370
|
+
}
|
|
371
|
+
function dataUriToBuffer(dataUri) {
|
|
372
|
+
const comma = dataUri.indexOf(',');
|
|
373
|
+
const payload = comma >= 0 ? dataUri.slice(comma + 1) : dataUri;
|
|
374
|
+
return Buffer.from(payload, 'base64');
|
|
375
|
+
}
|
|
376
|
+
async function defaultFetchImage(url) {
|
|
377
|
+
const response = await globalThis.fetch(url);
|
|
378
|
+
if (!response.ok) {
|
|
379
|
+
throw new ChannelError('CHANNEL_ERROR', `lark image fetch failed with ${response.status}`);
|
|
380
|
+
}
|
|
381
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
382
|
+
return Buffer.from(arrayBuffer);
|
|
383
|
+
}
|
|
384
|
+
//# sourceMappingURL=openapi-outbound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-outbound.js","sourceRoot":"","sources":["../src/openapi-outbound.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outbound sending: channel message → lark text/media/file payload → upstream.
|
|
3
|
+
*
|
|
4
|
+
* Streaming replies go through `LarkCardReply` (CardKit native streaming);
|
|
5
|
+
* this sender is the plain send path (`adapter.send`) used for one-shot
|
|
6
|
+
* messages. Text messages use `sendText`; a pure image message (no text) uses
|
|
7
|
+
* `sendMedia`; a pure file message carrying `localData` uses `sendFile`
|
|
8
|
+
* (official im.file.create → im.message.create) so media/file capability is
|
|
9
|
+
* real rather than a placeholder.
|
|
10
|
+
*/
|
|
11
|
+
import type { ChannelLogger, ChannelTarget, OutboundMessage, SendResult } from '@krischoichoi/channel-core';
|
|
12
|
+
import type { LarkUpstream } from './upstream.js';
|
|
13
|
+
export declare class OutboundSender {
|
|
14
|
+
private readonly upstream;
|
|
15
|
+
private readonly logger;
|
|
16
|
+
private readonly interactiveCards;
|
|
17
|
+
constructor(upstream: LarkUpstream, logger: ChannelLogger);
|
|
18
|
+
send(target: ChannelTarget, message: OutboundMessage): Promise<SendResult>;
|
|
19
|
+
edit(target: ChannelTarget, messageId: string, message: OutboundMessage): Promise<SendResult>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=outbound.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbound.d.ts","sourceRoot":"","sources":["../src/outbound.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EAIb,eAAe,EACf,UAAU,EACX,MAAM,4BAA4B,CAAC;AAGpC,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/D,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuC;gBAGrD,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,aAAa;IAGlC,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAiC1E,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;CAsBpG"}
|