@xwang152/claw-lark 0.1.27 → 0.1.29
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/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/src/docx.d.ts +159 -0
- package/dist/src/docx.js +462 -0
- package/dist/src/docx.js.map +1 -0
- package/dist/src/send.d.ts +8 -0
- package/dist/src/send.js +16 -0
- package/dist/src/send.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export { createLarkClient, createLarkWSClient } from "./src/client.js";
|
|
|
12
12
|
export { monitorLarkProvider, stopMonitor } from "./src/monitor.js";
|
|
13
13
|
export { startWebhookServer } from "./src/webhook.js";
|
|
14
14
|
export { listLarkDirectoryPeers, listLarkDirectoryGroups } from "./src/directory.js";
|
|
15
|
-
export { sendMessageLark, sendCardLark, updateCardLark, buildMarkdownCard, sendMarkdownCardLark, editMessageLark, } from "./src/send.js";
|
|
15
|
+
export { sendMessageLark, sendCardLark, updateCardLark, buildMarkdownCard, sendMarkdownCardLark, editMessageLark, shouldUseCard, } from "./src/send.js";
|
|
16
16
|
export type { LarkSendResult, SendLarkMessageParams, SendLarkCardParams, SendLarkMarkdownCardParams } from "./src/send.js";
|
|
17
17
|
export { downloadImageLark, downloadFileLark, uploadImageLark, uploadFileLark, sendImageLark, sendFileLark, sendMediaLark, detectFileType, } from "./src/media.js";
|
|
18
18
|
export { addReactionLark, removeReactionLark, listReactionsLark } from "./src/reactions.js";
|
|
@@ -21,6 +21,8 @@ export { addTypingIndicator, removeTypingIndicator, createTypingController, } fr
|
|
|
21
21
|
export type { TypingIndicatorState } from "./src/typing.js";
|
|
22
22
|
export { resolveLarkSenderName, clearSenderNameCache, getSenderNameCacheStats, prefetchLarkSenderNames, } from "./src/sender-name.js";
|
|
23
23
|
export { getLarkMessage, formatQuotedContext, isReplyMessage, buildMessageContextWithQuote, } from "./src/message-context.js";
|
|
24
|
+
export { readDocumentLark, createDocumentLark, writeDocumentLark, appendDocumentLark, updateBlockLark, deleteBlockLark, listBlocksLark, getBlockLark, listFolderLark, listAppScopesLark, } from "./src/docx.js";
|
|
25
|
+
export type { LarkDocumentInfo, LarkCreateDocResult, LarkWriteDocResult, LarkAppendDocResult, LarkBlock, LarkListBlocksResult, LarkGetBlockResult, LarkFolderItem, LarkListFolderResult, LarkAppScopeResult, } from "./src/docx.js";
|
|
24
26
|
export type { LarkDomain, LarkConnectionMode, DmPolicy, GroupPolicy, RenderMode, LarkAccountConfig, ResolvedLarkAccount, LarkChannelConfig, LarkGroupConfig, LarkMessageEvent, LarkMention, ParsedMessage, SendResult, } from "./src/types.js";
|
|
25
27
|
export { resolveLarkAllowlistMatch, resolveLarkGroupConfig, resolveLarkGroupToolPolicy, isLarkGroupAllowed, resolveLarkGroupRequireMention, resolveLarkReplyToMode, } from "./src/policy.js";
|
|
26
28
|
export { detectLarkIdType, normalizeLarkTarget, formatLarkTarget, inferReceiveIdType, looksLikeLarkId, } from "./src/utils.js";
|
package/dist/index.js
CHANGED
|
@@ -16,13 +16,14 @@ export { createLarkClient, createLarkWSClient } from "./src/client.js";
|
|
|
16
16
|
export { monitorLarkProvider, stopMonitor } from "./src/monitor.js";
|
|
17
17
|
export { startWebhookServer } from "./src/webhook.js";
|
|
18
18
|
export { listLarkDirectoryPeers, listLarkDirectoryGroups } from "./src/directory.js";
|
|
19
|
-
export { sendMessageLark, sendCardLark, updateCardLark, buildMarkdownCard, sendMarkdownCardLark, editMessageLark, } from "./src/send.js";
|
|
19
|
+
export { sendMessageLark, sendCardLark, updateCardLark, buildMarkdownCard, sendMarkdownCardLark, editMessageLark, shouldUseCard, } from "./src/send.js";
|
|
20
20
|
export { downloadImageLark, downloadFileLark, uploadImageLark, uploadFileLark, sendImageLark, sendFileLark, sendMediaLark, detectFileType, } from "./src/media.js";
|
|
21
21
|
export { addReactionLark, removeReactionLark, listReactionsLark } from "./src/reactions.js";
|
|
22
22
|
export { extractMentionTargets, extractMessageBody, isMentionForwardRequest, formatMentionForText, formatMentionForCard, formatMentionAllForText, formatMentionAllForCard, buildMentionedMessage, buildMentionedCardContent, } from "./src/mention.js";
|
|
23
23
|
export { addTypingIndicator, removeTypingIndicator, createTypingController, } from "./src/typing.js";
|
|
24
24
|
export { resolveLarkSenderName, clearSenderNameCache, getSenderNameCacheStats, prefetchLarkSenderNames, } from "./src/sender-name.js";
|
|
25
25
|
export { getLarkMessage, formatQuotedContext, isReplyMessage, buildMessageContextWithQuote, } from "./src/message-context.js";
|
|
26
|
+
export { readDocumentLark, createDocumentLark, writeDocumentLark, appendDocumentLark, updateBlockLark, deleteBlockLark, listBlocksLark, getBlockLark, listFolderLark, listAppScopesLark, } from "./src/docx.js";
|
|
26
27
|
export { resolveLarkAllowlistMatch, resolveLarkGroupConfig, resolveLarkGroupToolPolicy, isLarkGroupAllowed, resolveLarkGroupRequireMention, resolveLarkReplyToMode, } from "./src/policy.js";
|
|
27
28
|
export { detectLarkIdType, normalizeLarkTarget, formatLarkTarget, inferReceiveIdType, looksLikeLarkId, } from "./src/utils.js";
|
|
28
29
|
export { probeLark } from "./src/probe.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,mCAAmC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,mCAAmC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,4BAA4B,GAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,cAAc,EACd,YAAY,EACZ,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AA4BvB,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,4CAA4C;IACzD,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC7B,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,wCAAwC;QACxC,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5C,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lark/Feishu Document Tools
|
|
3
|
+
*
|
|
4
|
+
* Functions for creating, reading, updating, and managing Lark documents.
|
|
5
|
+
* Supports markdown-to-document conversion with image handling.
|
|
6
|
+
*/
|
|
7
|
+
import type { ResolvedLarkAccount } from "./types.js";
|
|
8
|
+
export type LarkBlockType = number;
|
|
9
|
+
export type LarkDocumentInfo = {
|
|
10
|
+
title?: string;
|
|
11
|
+
content?: string;
|
|
12
|
+
revision_id?: string;
|
|
13
|
+
block_count: number;
|
|
14
|
+
block_types: Record<string, number>;
|
|
15
|
+
hint?: string;
|
|
16
|
+
};
|
|
17
|
+
export type LarkCreateDocResult = {
|
|
18
|
+
document_id?: string;
|
|
19
|
+
title?: string;
|
|
20
|
+
url: string;
|
|
21
|
+
};
|
|
22
|
+
export type LarkWriteDocResult = {
|
|
23
|
+
success: boolean;
|
|
24
|
+
blocks_deleted: number;
|
|
25
|
+
blocks_added: number;
|
|
26
|
+
images_processed: number;
|
|
27
|
+
warning?: string;
|
|
28
|
+
};
|
|
29
|
+
export type LarkAppendDocResult = {
|
|
30
|
+
success: boolean;
|
|
31
|
+
blocks_added: number;
|
|
32
|
+
images_processed: number;
|
|
33
|
+
block_ids: string[];
|
|
34
|
+
warning?: string;
|
|
35
|
+
};
|
|
36
|
+
export type LarkBlock = {
|
|
37
|
+
block_id?: string;
|
|
38
|
+
block_type: number;
|
|
39
|
+
parent_id?: string;
|
|
40
|
+
[key: string]: unknown;
|
|
41
|
+
};
|
|
42
|
+
export type LarkListBlocksResult = {
|
|
43
|
+
blocks: LarkBlock[];
|
|
44
|
+
};
|
|
45
|
+
export type LarkGetBlockResult = {
|
|
46
|
+
block: LarkBlock | undefined;
|
|
47
|
+
};
|
|
48
|
+
export type LarkFolderItem = {
|
|
49
|
+
token: string;
|
|
50
|
+
name: string;
|
|
51
|
+
type: string;
|
|
52
|
+
url: string;
|
|
53
|
+
};
|
|
54
|
+
export type LarkListFolderResult = {
|
|
55
|
+
files: LarkFolderItem[];
|
|
56
|
+
};
|
|
57
|
+
export type LarkAppScopeResult = {
|
|
58
|
+
granted: Array<{
|
|
59
|
+
name: string;
|
|
60
|
+
type: string;
|
|
61
|
+
}>;
|
|
62
|
+
pending: Array<{
|
|
63
|
+
name: string;
|
|
64
|
+
type: string;
|
|
65
|
+
}>;
|
|
66
|
+
summary: string;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Read a Lark document's content and metadata.
|
|
70
|
+
*
|
|
71
|
+
* @param account - The Lark account to use
|
|
72
|
+
* @param docToken - The document token (from URL /docx/XXX)
|
|
73
|
+
* @returns Document info with title, content, block counts
|
|
74
|
+
*/
|
|
75
|
+
export declare function readDocumentLark(account: ResolvedLarkAccount, docToken: string): Promise<LarkDocumentInfo>;
|
|
76
|
+
/**
|
|
77
|
+
* Create a new Lark document.
|
|
78
|
+
*
|
|
79
|
+
* @param account - The Lark account to use
|
|
80
|
+
* @param title - Document title
|
|
81
|
+
* @param folderToken - Optional parent folder token
|
|
82
|
+
* @returns Created document info with ID and URL
|
|
83
|
+
*/
|
|
84
|
+
export declare function createDocumentLark(account: ResolvedLarkAccount, title: string, folderToken?: string): Promise<LarkCreateDocResult>;
|
|
85
|
+
/**
|
|
86
|
+
* Write markdown content to a Lark document (replaces all content).
|
|
87
|
+
*
|
|
88
|
+
* @param account - The Lark account to use
|
|
89
|
+
* @param docToken - Document token
|
|
90
|
+
* @param markdown - Markdown content to write
|
|
91
|
+
* @returns Write result with block counts and warnings
|
|
92
|
+
*/
|
|
93
|
+
export declare function writeDocumentLark(account: ResolvedLarkAccount, docToken: string, markdown: string): Promise<LarkWriteDocResult>;
|
|
94
|
+
/**
|
|
95
|
+
* Append markdown content to a Lark document.
|
|
96
|
+
*
|
|
97
|
+
* @param account - The Lark account to use
|
|
98
|
+
* @param docToken - Document token
|
|
99
|
+
* @param markdown - Markdown content to append
|
|
100
|
+
* @returns Append result with block counts
|
|
101
|
+
*/
|
|
102
|
+
export declare function appendDocumentLark(account: ResolvedLarkAccount, docToken: string, markdown: string): Promise<LarkAppendDocResult>;
|
|
103
|
+
/**
|
|
104
|
+
* Update a single text block in a document.
|
|
105
|
+
*
|
|
106
|
+
* @param account - The Lark account to use
|
|
107
|
+
* @param docToken - Document token
|
|
108
|
+
* @param blockId - Block ID to update
|
|
109
|
+
* @param content - New text content
|
|
110
|
+
* @returns Update result
|
|
111
|
+
*/
|
|
112
|
+
export declare function updateBlockLark(account: ResolvedLarkAccount, docToken: string, blockId: string, content: string): Promise<{
|
|
113
|
+
success: boolean;
|
|
114
|
+
block_id: string;
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* Delete a block from a document.
|
|
118
|
+
*
|
|
119
|
+
* @param account - The Lark account to use
|
|
120
|
+
* @param docToken - Document token
|
|
121
|
+
* @param blockId - Block ID to delete
|
|
122
|
+
* @returns Delete result
|
|
123
|
+
*/
|
|
124
|
+
export declare function deleteBlockLark(account: ResolvedLarkAccount, docToken: string, blockId: string): Promise<{
|
|
125
|
+
success: boolean;
|
|
126
|
+
deleted_block_id: string;
|
|
127
|
+
}>;
|
|
128
|
+
/**
|
|
129
|
+
* List all blocks in a document.
|
|
130
|
+
*
|
|
131
|
+
* @param account - The Lark account to use
|
|
132
|
+
* @param docToken - Document token
|
|
133
|
+
* @returns List of all blocks with full data
|
|
134
|
+
*/
|
|
135
|
+
export declare function listBlocksLark(account: ResolvedLarkAccount, docToken: string): Promise<LarkListBlocksResult>;
|
|
136
|
+
/**
|
|
137
|
+
* Get a single block's details.
|
|
138
|
+
*
|
|
139
|
+
* @param account - The Lark account to use
|
|
140
|
+
* @param docToken - Document token
|
|
141
|
+
* @param blockId - Block ID
|
|
142
|
+
* @returns Block details
|
|
143
|
+
*/
|
|
144
|
+
export declare function getBlockLark(account: ResolvedLarkAccount, docToken: string, blockId: string): Promise<LarkGetBlockResult>;
|
|
145
|
+
/**
|
|
146
|
+
* List files in a folder.
|
|
147
|
+
*
|
|
148
|
+
* @param account - The Lark account to use
|
|
149
|
+
* @param folderToken - Folder token
|
|
150
|
+
* @returns List of files in folder
|
|
151
|
+
*/
|
|
152
|
+
export declare function listFolderLark(account: ResolvedLarkAccount, folderToken: string): Promise<LarkListFolderResult>;
|
|
153
|
+
/**
|
|
154
|
+
* List application scopes (permissions).
|
|
155
|
+
*
|
|
156
|
+
* @param account - The Lark account to use
|
|
157
|
+
* @returns List of granted and pending scopes
|
|
158
|
+
*/
|
|
159
|
+
export declare function listAppScopesLark(account: ResolvedLarkAccount): Promise<LarkAppScopeResult>;
|
package/dist/src/docx.js
ADDED
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lark/Feishu Document Tools
|
|
3
|
+
*
|
|
4
|
+
* Functions for creating, reading, updating, and managing Lark documents.
|
|
5
|
+
* Supports markdown-to-document conversion with image handling.
|
|
6
|
+
*/
|
|
7
|
+
import { createLarkClient } from "./client.js";
|
|
8
|
+
import { Readable } from "stream";
|
|
9
|
+
// ============ Constants ============
|
|
10
|
+
const BLOCK_TYPE_NAMES = {
|
|
11
|
+
1: "Page",
|
|
12
|
+
2: "Text",
|
|
13
|
+
3: "Heading1",
|
|
14
|
+
4: "Heading2",
|
|
15
|
+
5: "Heading3",
|
|
16
|
+
12: "Bullet",
|
|
17
|
+
13: "Ordered",
|
|
18
|
+
14: "Code",
|
|
19
|
+
15: "Quote",
|
|
20
|
+
17: "Todo",
|
|
21
|
+
18: "Bitable",
|
|
22
|
+
21: "Diagram",
|
|
23
|
+
22: "Divider",
|
|
24
|
+
23: "File",
|
|
25
|
+
27: "Image",
|
|
26
|
+
30: "Sheet",
|
|
27
|
+
31: "Table",
|
|
28
|
+
32: "TableCell",
|
|
29
|
+
};
|
|
30
|
+
// Block types that cannot be created via documentBlockChildren.create API
|
|
31
|
+
const UNSUPPORTED_CREATE_TYPES = new Set([
|
|
32
|
+
31, // Table - must use different API or workaround
|
|
33
|
+
32, // TableCell - child of Table
|
|
34
|
+
]);
|
|
35
|
+
// Block types that are NOT included in rawContent (plain text) output
|
|
36
|
+
const STRUCTURED_BLOCK_TYPES = new Set([14, 18, 21, 23, 27, 30, 31, 32]);
|
|
37
|
+
// ============ Helper Functions ============
|
|
38
|
+
function extractBlockPreview(block) {
|
|
39
|
+
const elements = block.text?.elements ??
|
|
40
|
+
block.heading1?.elements ??
|
|
41
|
+
block.heading2?.elements ??
|
|
42
|
+
block.heading3?.elements ??
|
|
43
|
+
[];
|
|
44
|
+
return elements
|
|
45
|
+
.filter((e) => e.text_run)
|
|
46
|
+
.map((e) => e.text_run.content)
|
|
47
|
+
.join("")
|
|
48
|
+
.slice(0, 50);
|
|
49
|
+
}
|
|
50
|
+
/** Extract image URLs from markdown content */
|
|
51
|
+
function extractImageUrls(markdown) {
|
|
52
|
+
const regex = /!\[[^\]]*\]\(([^)]+)\)/g;
|
|
53
|
+
const urls = [];
|
|
54
|
+
let match;
|
|
55
|
+
while ((match = regex.exec(markdown)) !== null) {
|
|
56
|
+
const url = match[1].trim();
|
|
57
|
+
// Only collect http(s) URLs, not file paths
|
|
58
|
+
if (url.startsWith("http://") || url.startsWith("https://")) {
|
|
59
|
+
urls.push(url);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return urls;
|
|
63
|
+
}
|
|
64
|
+
/** Clean blocks for insertion (remove unsupported types and read-only fields) */
|
|
65
|
+
function cleanBlocksForInsert(blocks) {
|
|
66
|
+
const skipped = [];
|
|
67
|
+
const cleaned = blocks
|
|
68
|
+
.filter((block) => {
|
|
69
|
+
if (UNSUPPORTED_CREATE_TYPES.has(block.block_type)) {
|
|
70
|
+
const typeName = BLOCK_TYPE_NAMES[block.block_type] || `type_${block.block_type}`;
|
|
71
|
+
skipped.push(typeName);
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
})
|
|
76
|
+
.map((block) => {
|
|
77
|
+
// Remove any read-only fields that might slip through
|
|
78
|
+
if (block.block_type === 31 && block.table?.merge_info) {
|
|
79
|
+
const { merge_info, ...tableRest } = block.table;
|
|
80
|
+
return { ...block, table: tableRest };
|
|
81
|
+
}
|
|
82
|
+
return block;
|
|
83
|
+
});
|
|
84
|
+
return { cleaned, skipped };
|
|
85
|
+
}
|
|
86
|
+
/** Convert markdown to Lark blocks using the Convert API */
|
|
87
|
+
async function convertMarkdown(client, markdown) {
|
|
88
|
+
const res = await client.docx.document.convert({
|
|
89
|
+
data: { content_type: "markdown", content: markdown },
|
|
90
|
+
});
|
|
91
|
+
if (res.code !== 0)
|
|
92
|
+
throw new Error(res.msg);
|
|
93
|
+
return {
|
|
94
|
+
blocks: res.data?.blocks ?? [],
|
|
95
|
+
firstLevelBlockIds: res.data?.first_level_block_ids ?? [],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Insert blocks as children of a parent block */
|
|
99
|
+
async function insertBlocks(client, docToken, blocks, parentBlockId) {
|
|
100
|
+
const { cleaned, skipped } = cleanBlocksForInsert(blocks);
|
|
101
|
+
const blockId = parentBlockId ?? docToken;
|
|
102
|
+
if (cleaned.length === 0) {
|
|
103
|
+
return { children: [], skipped };
|
|
104
|
+
}
|
|
105
|
+
const res = await client.docx.documentBlockChildren.create({
|
|
106
|
+
path: { document_id: docToken, block_id: blockId },
|
|
107
|
+
data: { children: cleaned },
|
|
108
|
+
});
|
|
109
|
+
if (res.code !== 0)
|
|
110
|
+
throw new Error(res.msg);
|
|
111
|
+
return { children: res.data?.children ?? [], skipped };
|
|
112
|
+
}
|
|
113
|
+
/** Delete all child blocks from a parent */
|
|
114
|
+
async function clearDocumentContent(client, docToken) {
|
|
115
|
+
const existing = await client.docx.documentBlock.list({
|
|
116
|
+
path: { document_id: docToken },
|
|
117
|
+
});
|
|
118
|
+
if (existing.code !== 0)
|
|
119
|
+
throw new Error(existing.msg);
|
|
120
|
+
const childIds = existing.data?.items
|
|
121
|
+
?.filter((b) => b.parent_id === docToken && b.block_type !== 1)
|
|
122
|
+
.map((b) => b.block_id) ?? [];
|
|
123
|
+
if (childIds.length > 0) {
|
|
124
|
+
const res = await client.docx.documentBlockChildren.batchDelete({
|
|
125
|
+
path: { document_id: docToken, block_id: docToken },
|
|
126
|
+
data: { start_index: 0, end_index: childIds.length },
|
|
127
|
+
});
|
|
128
|
+
if (res.code !== 0)
|
|
129
|
+
throw new Error(res.msg);
|
|
130
|
+
}
|
|
131
|
+
return childIds.length;
|
|
132
|
+
}
|
|
133
|
+
/** Upload image to Lark drive for docx */
|
|
134
|
+
async function uploadImageToDocx(client, blockId, imageBuffer, fileName) {
|
|
135
|
+
const res = await client.drive.media.uploadAll({
|
|
136
|
+
data: {
|
|
137
|
+
file_name: fileName,
|
|
138
|
+
parent_type: "docx_image",
|
|
139
|
+
parent_node: blockId,
|
|
140
|
+
size: imageBuffer.length,
|
|
141
|
+
file: Readable.from(imageBuffer),
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
const fileToken = res?.file_token;
|
|
145
|
+
if (!fileToken) {
|
|
146
|
+
throw new Error("Image upload failed: no file_token returned");
|
|
147
|
+
}
|
|
148
|
+
return fileToken;
|
|
149
|
+
}
|
|
150
|
+
/** Download image from URL */
|
|
151
|
+
async function downloadImage(url) {
|
|
152
|
+
const response = await fetch(url);
|
|
153
|
+
if (!response.ok) {
|
|
154
|
+
throw new Error(`Failed to download image: ${response.status} ${response.statusText}`);
|
|
155
|
+
}
|
|
156
|
+
return Buffer.from(await response.arrayBuffer());
|
|
157
|
+
}
|
|
158
|
+
/** Process images in markdown: download from URL, upload to Lark, update blocks */
|
|
159
|
+
async function processImages(client, docToken, markdown, insertedBlocks) {
|
|
160
|
+
const imageUrls = extractImageUrls(markdown);
|
|
161
|
+
if (imageUrls.length === 0)
|
|
162
|
+
return 0;
|
|
163
|
+
// Find Image blocks (block_type 27)
|
|
164
|
+
const imageBlocks = insertedBlocks.filter((b) => b.block_type === 27);
|
|
165
|
+
let processed = 0;
|
|
166
|
+
for (let i = 0; i < Math.min(imageUrls.length, imageBlocks.length); i++) {
|
|
167
|
+
const url = imageUrls[i];
|
|
168
|
+
const blockId = imageBlocks[i].block_id;
|
|
169
|
+
try {
|
|
170
|
+
// Download image from URL
|
|
171
|
+
const buffer = await downloadImage(url);
|
|
172
|
+
// Generate filename from URL
|
|
173
|
+
const urlPath = new URL(url).pathname;
|
|
174
|
+
const fileName = urlPath.split("/").pop() || `image_${i}.png`;
|
|
175
|
+
// Upload to Lark
|
|
176
|
+
const fileToken = await uploadImageToDocx(client, blockId, buffer, fileName);
|
|
177
|
+
// Update the image block
|
|
178
|
+
await client.docx.documentBlock.patch({
|
|
179
|
+
path: { document_id: docToken, block_id: blockId },
|
|
180
|
+
data: {
|
|
181
|
+
replace_image: { token: fileToken },
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
processed++;
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
// Log but continue processing other images
|
|
188
|
+
console.error(`Failed to process image ${url}:`, err);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return processed;
|
|
192
|
+
}
|
|
193
|
+
// ============ Public API Functions ============
|
|
194
|
+
/**
|
|
195
|
+
* Read a Lark document's content and metadata.
|
|
196
|
+
*
|
|
197
|
+
* @param account - The Lark account to use
|
|
198
|
+
* @param docToken - The document token (from URL /docx/XXX)
|
|
199
|
+
* @returns Document info with title, content, block counts
|
|
200
|
+
*/
|
|
201
|
+
export async function readDocumentLark(account, docToken) {
|
|
202
|
+
const client = createLarkClient(account);
|
|
203
|
+
const [contentRes, infoRes, blocksRes] = await Promise.all([
|
|
204
|
+
client.docx.document.rawContent({ path: { document_id: docToken } }),
|
|
205
|
+
client.docx.document.get({ path: { document_id: docToken } }),
|
|
206
|
+
client.docx.documentBlock.list({ path: { document_id: docToken } }),
|
|
207
|
+
]);
|
|
208
|
+
if (contentRes.code !== 0)
|
|
209
|
+
throw new Error(contentRes.msg);
|
|
210
|
+
const blocks = blocksRes.data?.items ?? [];
|
|
211
|
+
const blockCounts = {};
|
|
212
|
+
const structuredTypes = [];
|
|
213
|
+
for (const b of blocks) {
|
|
214
|
+
const type = b.block_type ?? 0;
|
|
215
|
+
const name = BLOCK_TYPE_NAMES[type] || `type_${type}`;
|
|
216
|
+
blockCounts[name] = (blockCounts[name] || 0) + 1;
|
|
217
|
+
// Track structured types that need list_blocks to read
|
|
218
|
+
if (STRUCTURED_BLOCK_TYPES.has(type) && !structuredTypes.includes(name)) {
|
|
219
|
+
structuredTypes.push(name);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Build hint if there are structured blocks
|
|
223
|
+
let hint;
|
|
224
|
+
if (structuredTypes.length > 0) {
|
|
225
|
+
hint = `This document contains ${structuredTypes.join(", ")} which are NOT included in the plain text above. Use listBlocksLark to get full content.`;
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
title: infoRes.data?.document?.title,
|
|
229
|
+
content: contentRes.data?.content,
|
|
230
|
+
revision_id: infoRes.data?.document?.revision_id,
|
|
231
|
+
block_count: blocks.length,
|
|
232
|
+
block_types: blockCounts,
|
|
233
|
+
...(hint && { hint }),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Create a new Lark document.
|
|
238
|
+
*
|
|
239
|
+
* @param account - The Lark account to use
|
|
240
|
+
* @param title - Document title
|
|
241
|
+
* @param folderToken - Optional parent folder token
|
|
242
|
+
* @returns Created document info with ID and URL
|
|
243
|
+
*/
|
|
244
|
+
export async function createDocumentLark(account, title, folderToken) {
|
|
245
|
+
const client = createLarkClient(account);
|
|
246
|
+
const res = await client.docx.document.create({
|
|
247
|
+
data: { title, folder_token: folderToken },
|
|
248
|
+
});
|
|
249
|
+
if (res.code !== 0)
|
|
250
|
+
throw new Error(res.msg);
|
|
251
|
+
const doc = res.data?.document;
|
|
252
|
+
// Build URL based on domain
|
|
253
|
+
const baseUrl = account.domain === "lark" ? "https://larksuite.com" : "https://feishu.cn";
|
|
254
|
+
return {
|
|
255
|
+
document_id: doc?.document_id,
|
|
256
|
+
title: doc?.title,
|
|
257
|
+
url: `${baseUrl}/docx/${doc?.document_id}`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Write markdown content to a Lark document (replaces all content).
|
|
262
|
+
*
|
|
263
|
+
* @param account - The Lark account to use
|
|
264
|
+
* @param docToken - Document token
|
|
265
|
+
* @param markdown - Markdown content to write
|
|
266
|
+
* @returns Write result with block counts and warnings
|
|
267
|
+
*/
|
|
268
|
+
export async function writeDocumentLark(account, docToken, markdown) {
|
|
269
|
+
const client = createLarkClient(account);
|
|
270
|
+
// 1. Clear existing content
|
|
271
|
+
const deleted = await clearDocumentContent(client, docToken);
|
|
272
|
+
// 2. Convert markdown to blocks
|
|
273
|
+
const { blocks } = await convertMarkdown(client, markdown);
|
|
274
|
+
if (blocks.length === 0) {
|
|
275
|
+
return { success: true, blocks_deleted: deleted, blocks_added: 0, images_processed: 0 };
|
|
276
|
+
}
|
|
277
|
+
// 3. Insert new blocks (unsupported types like Table are filtered)
|
|
278
|
+
const { children: inserted, skipped } = await insertBlocks(client, docToken, blocks);
|
|
279
|
+
// 4. Process images
|
|
280
|
+
const imagesProcessed = await processImages(client, docToken, markdown, inserted);
|
|
281
|
+
return {
|
|
282
|
+
success: true,
|
|
283
|
+
blocks_deleted: deleted,
|
|
284
|
+
blocks_added: inserted.length,
|
|
285
|
+
images_processed: imagesProcessed,
|
|
286
|
+
...(skipped.length > 0 && {
|
|
287
|
+
warning: `Skipped unsupported block types: ${skipped.join(", ")}. Tables are not supported via this API.`,
|
|
288
|
+
}),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Append markdown content to a Lark document.
|
|
293
|
+
*
|
|
294
|
+
* @param account - The Lark account to use
|
|
295
|
+
* @param docToken - Document token
|
|
296
|
+
* @param markdown - Markdown content to append
|
|
297
|
+
* @returns Append result with block counts
|
|
298
|
+
*/
|
|
299
|
+
export async function appendDocumentLark(account, docToken, markdown) {
|
|
300
|
+
const client = createLarkClient(account);
|
|
301
|
+
// 1. Convert markdown to blocks
|
|
302
|
+
const { blocks } = await convertMarkdown(client, markdown);
|
|
303
|
+
if (blocks.length === 0) {
|
|
304
|
+
throw new Error("Content is empty");
|
|
305
|
+
}
|
|
306
|
+
// 2. Insert blocks (unsupported types like Table are filtered)
|
|
307
|
+
const { children: inserted, skipped } = await insertBlocks(client, docToken, blocks);
|
|
308
|
+
// 3. Process images
|
|
309
|
+
const imagesProcessed = await processImages(client, docToken, markdown, inserted);
|
|
310
|
+
return {
|
|
311
|
+
success: true,
|
|
312
|
+
blocks_added: inserted.length,
|
|
313
|
+
images_processed: imagesProcessed,
|
|
314
|
+
block_ids: inserted.map((b) => b.block_id),
|
|
315
|
+
...(skipped.length > 0 && {
|
|
316
|
+
warning: `Skipped unsupported block types: ${skipped.join(", ")}. Tables are not supported via this API.`,
|
|
317
|
+
}),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Update a single text block in a document.
|
|
322
|
+
*
|
|
323
|
+
* @param account - The Lark account to use
|
|
324
|
+
* @param docToken - Document token
|
|
325
|
+
* @param blockId - Block ID to update
|
|
326
|
+
* @param content - New text content
|
|
327
|
+
* @returns Update result
|
|
328
|
+
*/
|
|
329
|
+
export async function updateBlockLark(account, docToken, blockId, content) {
|
|
330
|
+
const client = createLarkClient(account);
|
|
331
|
+
const blockInfo = await client.docx.documentBlock.get({
|
|
332
|
+
path: { document_id: docToken, block_id: blockId },
|
|
333
|
+
});
|
|
334
|
+
if (blockInfo.code !== 0)
|
|
335
|
+
throw new Error(blockInfo.msg);
|
|
336
|
+
const res = await client.docx.documentBlock.patch({
|
|
337
|
+
path: { document_id: docToken, block_id: blockId },
|
|
338
|
+
data: {
|
|
339
|
+
update_text_elements: {
|
|
340
|
+
elements: [{ text_run: { content } }],
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
if (res.code !== 0)
|
|
345
|
+
throw new Error(res.msg);
|
|
346
|
+
return { success: true, block_id: blockId };
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Delete a block from a document.
|
|
350
|
+
*
|
|
351
|
+
* @param account - The Lark account to use
|
|
352
|
+
* @param docToken - Document token
|
|
353
|
+
* @param blockId - Block ID to delete
|
|
354
|
+
* @returns Delete result
|
|
355
|
+
*/
|
|
356
|
+
export async function deleteBlockLark(account, docToken, blockId) {
|
|
357
|
+
const client = createLarkClient(account);
|
|
358
|
+
const blockInfo = await client.docx.documentBlock.get({
|
|
359
|
+
path: { document_id: docToken, block_id: blockId },
|
|
360
|
+
});
|
|
361
|
+
if (blockInfo.code !== 0)
|
|
362
|
+
throw new Error(blockInfo.msg);
|
|
363
|
+
const parentId = blockInfo.data?.block?.parent_id ?? docToken;
|
|
364
|
+
const children = await client.docx.documentBlockChildren.get({
|
|
365
|
+
path: { document_id: docToken, block_id: parentId },
|
|
366
|
+
});
|
|
367
|
+
if (children.code !== 0)
|
|
368
|
+
throw new Error(children.msg);
|
|
369
|
+
const items = children.data?.items ?? [];
|
|
370
|
+
const index = items.findIndex((item) => item.block_id === blockId);
|
|
371
|
+
if (index === -1)
|
|
372
|
+
throw new Error("Block not found");
|
|
373
|
+
const res = await client.docx.documentBlockChildren.batchDelete({
|
|
374
|
+
path: { document_id: docToken, block_id: parentId },
|
|
375
|
+
data: { start_index: index, end_index: index + 1 },
|
|
376
|
+
});
|
|
377
|
+
if (res.code !== 0)
|
|
378
|
+
throw new Error(res.msg);
|
|
379
|
+
return { success: true, deleted_block_id: blockId };
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* List all blocks in a document.
|
|
383
|
+
*
|
|
384
|
+
* @param account - The Lark account to use
|
|
385
|
+
* @param docToken - Document token
|
|
386
|
+
* @returns List of all blocks with full data
|
|
387
|
+
*/
|
|
388
|
+
export async function listBlocksLark(account, docToken) {
|
|
389
|
+
const client = createLarkClient(account);
|
|
390
|
+
const res = await client.docx.documentBlock.list({
|
|
391
|
+
path: { document_id: docToken },
|
|
392
|
+
});
|
|
393
|
+
if (res.code !== 0)
|
|
394
|
+
throw new Error(res.msg);
|
|
395
|
+
// Return full block data for agent to parse
|
|
396
|
+
return {
|
|
397
|
+
blocks: res.data?.items ?? [],
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Get a single block's details.
|
|
402
|
+
*
|
|
403
|
+
* @param account - The Lark account to use
|
|
404
|
+
* @param docToken - Document token
|
|
405
|
+
* @param blockId - Block ID
|
|
406
|
+
* @returns Block details
|
|
407
|
+
*/
|
|
408
|
+
export async function getBlockLark(account, docToken, blockId) {
|
|
409
|
+
const client = createLarkClient(account);
|
|
410
|
+
const res = await client.docx.documentBlock.get({
|
|
411
|
+
path: { document_id: docToken, block_id: blockId },
|
|
412
|
+
});
|
|
413
|
+
if (res.code !== 0)
|
|
414
|
+
throw new Error(res.msg);
|
|
415
|
+
return {
|
|
416
|
+
block: res.data?.block,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* List files in a folder.
|
|
421
|
+
*
|
|
422
|
+
* @param account - The Lark account to use
|
|
423
|
+
* @param folderToken - Folder token
|
|
424
|
+
* @returns List of files in folder
|
|
425
|
+
*/
|
|
426
|
+
export async function listFolderLark(account, folderToken) {
|
|
427
|
+
const client = createLarkClient(account);
|
|
428
|
+
const res = await client.drive.file.list({
|
|
429
|
+
params: { folder_token: folderToken },
|
|
430
|
+
});
|
|
431
|
+
if (res.code !== 0)
|
|
432
|
+
throw new Error(res.msg);
|
|
433
|
+
return {
|
|
434
|
+
files: res.data?.files?.map((f) => ({
|
|
435
|
+
token: f.token,
|
|
436
|
+
name: f.name,
|
|
437
|
+
type: f.type,
|
|
438
|
+
url: f.url,
|
|
439
|
+
})) ?? [],
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* List application scopes (permissions).
|
|
444
|
+
*
|
|
445
|
+
* @param account - The Lark account to use
|
|
446
|
+
* @returns List of granted and pending scopes
|
|
447
|
+
*/
|
|
448
|
+
export async function listAppScopesLark(account) {
|
|
449
|
+
const client = createLarkClient(account);
|
|
450
|
+
const res = await client.application.scope.list({});
|
|
451
|
+
if (res.code !== 0)
|
|
452
|
+
throw new Error(res.msg);
|
|
453
|
+
const scopes = res.data?.scopes ?? [];
|
|
454
|
+
const granted = scopes.filter((s) => s.grant_status === 1);
|
|
455
|
+
const pending = scopes.filter((s) => s.grant_status !== 1);
|
|
456
|
+
return {
|
|
457
|
+
granted: granted.map((s) => ({ name: s.scope_name, type: s.scope_type })),
|
|
458
|
+
pending: pending.map((s) => ({ name: s.scope_name, type: s.scope_type })),
|
|
459
|
+
summary: `${granted.length} granted, ${pending.length} pending`,
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=docx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx.js","sourceRoot":"","sources":["../../src/docx.ts"],"names":[],"mappings":"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"}
|
package/dist/src/send.d.ts
CHANGED
|
@@ -6,6 +6,14 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { ResolvedLarkAccount } from "./types.js";
|
|
8
8
|
import type { MentionTarget } from "./mention.js";
|
|
9
|
+
/**
|
|
10
|
+
* Detect if text contains markdown elements that benefit from card rendering.
|
|
11
|
+
* Used by auto render mode to determine when to use interactive cards.
|
|
12
|
+
*
|
|
13
|
+
* @param text - Text content to check
|
|
14
|
+
* @returns true if text should use card rendering
|
|
15
|
+
*/
|
|
16
|
+
export declare function shouldUseCard(text: string): boolean;
|
|
9
17
|
export type LarkSendResult = {
|
|
10
18
|
messageId: string;
|
|
11
19
|
chatId: string;
|
package/dist/src/send.js
CHANGED
|
@@ -7,6 +7,22 @@
|
|
|
7
7
|
import { createLarkClient } from "./client.js";
|
|
8
8
|
import { inferReceiveIdType, normalizeLarkTarget } from "./utils.js";
|
|
9
9
|
import { buildMentionedCardContent } from "./mention.js";
|
|
10
|
+
/**
|
|
11
|
+
* Detect if text contains markdown elements that benefit from card rendering.
|
|
12
|
+
* Used by auto render mode to determine when to use interactive cards.
|
|
13
|
+
*
|
|
14
|
+
* @param text - Text content to check
|
|
15
|
+
* @returns true if text should use card rendering
|
|
16
|
+
*/
|
|
17
|
+
export function shouldUseCard(text) {
|
|
18
|
+
// Code blocks (fenced)
|
|
19
|
+
if (/```[\s\S]*?```/.test(text))
|
|
20
|
+
return true;
|
|
21
|
+
// Tables (at least header + separator row with |)
|
|
22
|
+
if (/\|.+\|[\r\n]+\|[-:| ]+\|/.test(text))
|
|
23
|
+
return true;
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
10
26
|
/**
|
|
11
27
|
* Send a text message to Lark/Feishu.
|
|
12
28
|
*
|
package/dist/src/send.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/send.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/send.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,uBAAuB;IACvB,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,kDAAkD;IAClD,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC;AAgBD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAA6B;IACjE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEjE,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAEpD,gDAAgD;IAChD,IAAI,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,mDAAmD;QACnD,uFAAuF;QACvF,WAAW,GAAG,IAAI,CAAC,CAAC,8DAA8D;IACpF,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAEtD,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7C,IAAI,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE;YACtC,IAAI,EAAE;gBACJ,OAAO;gBACP,QAAQ,EAAE,MAAM;aACjB;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,GAAG,IAAI,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,SAAS;YACjD,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9C,MAAM,EAAE,EAAE,eAAe,EAAE,aAAa,EAAE;QAC1C,IAAI,EAAE;YACJ,UAAU,EAAE,SAAS;YACrB,OAAO;YACP,QAAQ,EAAE,MAAM;SACjB;KACF,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,GAAG,IAAI,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,SAAS;QACjD,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AASD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAA0B;IAC3D,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;IAEvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7C,IAAI,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE;YACtC,IAAI,EAAE;gBACJ,OAAO;gBACP,QAAQ,EAAE,aAAa;aACxB;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAC,GAAG,IAAI,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,SAAS;YACjD,MAAM,EAAE,SAAS;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9C,MAAM,EAAE,EAAE,eAAe,EAAE,aAAa,EAAE;QAC1C,IAAI,EAAE;YACJ,UAAU,EAAE,SAAS;YACrB,OAAO;YACP,QAAQ,EAAE,aAAa;SACxB;KACF,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,GAAG,IAAI,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,SAAS;QACjD,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAIpC;IACC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAE5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAErC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC7C,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;QAC/B,IAAI,EAAE,EAAE,OAAO,EAAE;KAClB,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,GAAG,IAAI,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO;QACL,MAAM,EAAE;YACN,gBAAgB,EAAE,IAAI;SACvB;QACD,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,UAAU;gBACf,OAAO,EAAE,IAAI;aACd;SACF;KACF,CAAC;AACJ,CAAC;AAWD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAkC;IAC3E,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAEjE,gDAAgD;IAChD,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,QAAQ,GAAG,yBAAyB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAIrC;IACC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAE5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9C,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;QAC/B,IAAI,EAAE;YACJ,QAAQ,EAAE,MAAM;YAChB,OAAO;SACR;KACF,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,GAAG,IAAI,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC"}
|