@openclaw/feishu 2026.5.27 → 2026.5.28-beta.2
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/api.js +13 -6
- package/dist/{channel-DS2vP1nr.js → channel-BVSJh3s1.js} +18 -13
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{channel.runtime-CxRDzbEQ.js → channel.runtime-D6J6otxd.js} +5 -5
- package/dist/{client-BnH2fRL2.js → client-DcSzLkSX.js} +3 -2
- package/dist/{drive-DwgWWkJi.js → drive-6Ohn34x9.js} +15 -3
- package/dist/{monitor-DNYcF9wy.js → monitor-1WyqLgPM.js} +2 -2
- package/dist/{monitor.account-vUWzYlT_.js → monitor.account-DXQXXSzI.js} +8 -8
- package/dist/{monitor.state-CxrHFQX2.js → monitor.state-B6SoAUys.js} +6 -5
- package/dist/{probe-Da81t6a5.js → probe-RvCg70BY.js} +1 -1
- package/dist/{send-jDh7bucI.js → send-CKZz15KQ.js} +1 -1
- package/dist/setup-api.js +1 -1
- package/node_modules/@larksuiteoapi/node-sdk/README.md +4 -0
- package/node_modules/@larksuiteoapi/node-sdk/README.zh.md +4 -0
- package/node_modules/@larksuiteoapi/node-sdk/es/index.js +33 -1
- package/node_modules/@larksuiteoapi/node-sdk/lib/index.js +33 -1
- package/node_modules/@larksuiteoapi/node-sdk/package.json +1 -1
- package/node_modules/@larksuiteoapi/node-sdk/types/index.d.ts +19 -0
- package/npm-shrinkwrap.json +7 -7
- package/package.json +5 -5
package/dist/api.js
CHANGED
|
@@ -2,16 +2,18 @@ import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as bu
|
|
|
2
2
|
import { n as getFeishuThreadBindingManager, r as testing, t as createFeishuThreadBindingManager } from "./thread-bindings-D24m3Cjy.js";
|
|
3
3
|
import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-fuyBHOVu.js";
|
|
4
4
|
import { r as listEnabledFeishuAccounts } from "./accounts-CXnY5H8g.js";
|
|
5
|
-
import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-
|
|
5
|
+
import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-BVSJh3s1.js";
|
|
6
6
|
import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
|
|
7
|
-
import { a as jsonToolResult, d as registerFeishuChatTools, f as createFeishuToolClient, m as resolveFeishuToolAccount, n as registerFeishuDriveTools, o as toolExecutionErrorResult, p as resolveAnyEnabledFeishuToolsConfig, s as unknownToolActionResult } from "./drive-
|
|
7
|
+
import { a as jsonToolResult, d as registerFeishuChatTools, f as createFeishuToolClient, m as resolveFeishuToolAccount, n as registerFeishuDriveTools, o as toolExecutionErrorResult, p as resolveAnyEnabledFeishuToolsConfig, s as unknownToolActionResult } from "./drive-6Ohn34x9.js";
|
|
8
8
|
import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, readStringValue, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
9
|
+
import { optionalPositiveIntegerSchema } from "openclaw/plugin-sdk/channel-actions";
|
|
9
10
|
import { existsSync } from "node:fs";
|
|
10
11
|
import { homedir } from "node:os";
|
|
11
12
|
import { basename, isAbsolute, resolve } from "node:path";
|
|
12
13
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
13
14
|
import { extensionForMime } from "openclaw/plugin-sdk/media-mime";
|
|
14
15
|
import { Type } from "typebox";
|
|
16
|
+
import { readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
|
|
15
17
|
import { createClackPrompter } from "openclaw/plugin-sdk/setup-runtime";
|
|
16
18
|
//#region extensions/feishu/src/doc-schema.ts
|
|
17
19
|
const tableCreationProperties = {
|
|
@@ -1948,6 +1950,12 @@ async function listRecords(client, appToken, tableId, pageSize, pageToken) {
|
|
|
1948
1950
|
total: res.data?.total
|
|
1949
1951
|
};
|
|
1950
1952
|
}
|
|
1953
|
+
function readBitableListRecordsPageSize(params) {
|
|
1954
|
+
return readPositiveIntegerParam(params, "page_size", {
|
|
1955
|
+
max: 500,
|
|
1956
|
+
message: "page_size must be a positive integer between 1 and 500"
|
|
1957
|
+
});
|
|
1958
|
+
}
|
|
1951
1959
|
async function getRecord(client, appToken, tableId, recordId) {
|
|
1952
1960
|
const res = await client.bitable.appTableRecord.get({ path: {
|
|
1953
1961
|
app_token: appToken,
|
|
@@ -2162,11 +2170,10 @@ const ListFieldsSchema = Type.Object({
|
|
|
2162
2170
|
const ListRecordsSchema = Type.Object({
|
|
2163
2171
|
app_token: Type.String({ description: "Bitable app token (use feishu_bitable_get_meta to get from URL)" }),
|
|
2164
2172
|
table_id: Type.String({ description: "Table ID (from URL: ?table=YYY)" }),
|
|
2165
|
-
page_size:
|
|
2173
|
+
page_size: optionalPositiveIntegerSchema({
|
|
2166
2174
|
description: "Number of records per page (1-500, default 100)",
|
|
2167
|
-
minimum: 1,
|
|
2168
2175
|
maximum: 500
|
|
2169
|
-
})
|
|
2176
|
+
}),
|
|
2170
2177
|
page_token: Type.Optional(Type.String({ description: "Pagination token from previous response" }))
|
|
2171
2178
|
});
|
|
2172
2179
|
const GetRecordSchema = Type.Object({
|
|
@@ -2249,7 +2256,7 @@ function registerFeishuBitableTools(api) {
|
|
|
2249
2256
|
description: "List records (rows) from a Bitable table with pagination support",
|
|
2250
2257
|
parameters: ListRecordsSchema,
|
|
2251
2258
|
async execute({ params, defaultAccountId }) {
|
|
2252
|
-
return listRecords(getClient(params, defaultAccountId), params.app_token, params.table_id, params
|
|
2259
|
+
return listRecords(getClient(params, defaultAccountId), params.app_token, params.table_id, readBitableListRecordsPageSize(params), params.page_token);
|
|
2253
2260
|
}
|
|
2254
2261
|
});
|
|
2255
2262
|
registerBitableTool({
|
|
@@ -1647,7 +1647,7 @@ const feishuSetupWizard = {
|
|
|
1647
1647
|
});
|
|
1648
1648
|
let probeResult = null;
|
|
1649
1649
|
if (configured && account.configured) try {
|
|
1650
|
-
const { probeFeishu } = await import("./probe-
|
|
1650
|
+
const { probeFeishu } = await import("./probe-RvCg70BY.js").then((n) => n.n);
|
|
1651
1651
|
probeResult = await probeFeishu(account);
|
|
1652
1652
|
} catch {}
|
|
1653
1653
|
if (!configured) return [formatFeishuStatusLine("needs-credentials")];
|
|
@@ -1720,9 +1720,10 @@ const meta = {
|
|
|
1720
1720
|
docsLabel: "feishu",
|
|
1721
1721
|
blurb: "飞书/Lark enterprise messaging.",
|
|
1722
1722
|
aliases: ["lark"],
|
|
1723
|
-
order: 70
|
|
1723
|
+
order: 70,
|
|
1724
|
+
preferSessionLookupForAnnounceTarget: true
|
|
1724
1725
|
};
|
|
1725
|
-
const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-
|
|
1726
|
+
const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-D6J6otxd.js"), "feishuChannelRuntime");
|
|
1726
1727
|
function toFeishuMessageSendResult(result, kind) {
|
|
1727
1728
|
const receipt = result.receipt ?? createFeishuSendReceipt({
|
|
1728
1729
|
messageId: result.messageId,
|
|
@@ -1754,7 +1755,7 @@ const feishuMessageAdapter = defineChannelMessageAdapter({
|
|
|
1754
1755
|
}
|
|
1755
1756
|
});
|
|
1756
1757
|
async function createFeishuActionClient(account) {
|
|
1757
|
-
const { createFeishuClient } = await import("./client-
|
|
1758
|
+
const { createFeishuClient } = await import("./client-DcSzLkSX.js").then((n) => n.t);
|
|
1758
1759
|
return createFeishuClient(account);
|
|
1759
1760
|
}
|
|
1760
1761
|
const collectFeishuSecurityWarnings = createAllowlistProviderGroupPolicyWarningCollector({
|
|
@@ -1960,13 +1961,17 @@ function readFirstString(params, keys, fallback) {
|
|
|
1960
1961
|
}
|
|
1961
1962
|
if (typeof fallback === "string" && fallback.trim()) return fallback.trim();
|
|
1962
1963
|
}
|
|
1963
|
-
function
|
|
1964
|
+
function isPositiveSafeInteger(value) {
|
|
1965
|
+
return Number.isSafeInteger(value) && value > 0;
|
|
1966
|
+
}
|
|
1967
|
+
function readOptionalPositiveInteger(params, keys) {
|
|
1964
1968
|
for (const key of keys) {
|
|
1965
1969
|
const value = params[key];
|
|
1966
|
-
if (typeof value === "number" &&
|
|
1970
|
+
if (typeof value === "number" && isPositiveSafeInteger(value)) return value;
|
|
1967
1971
|
if (typeof value === "string" && value.trim()) {
|
|
1968
|
-
const
|
|
1969
|
-
|
|
1972
|
+
const trimmed = value.trim();
|
|
1973
|
+
const parsed = /^\d+$/.test(trimmed) ? Number(trimmed) : NaN;
|
|
1974
|
+
if (isPositiveSafeInteger(parsed)) return parsed;
|
|
1970
1975
|
}
|
|
1971
1976
|
}
|
|
1972
1977
|
}
|
|
@@ -2262,7 +2267,7 @@ const feishuPlugin = createChatChannelPlugin({
|
|
|
2262
2267
|
chatId,
|
|
2263
2268
|
startTime: readFirstString(ctx.params, ["startTime", "start_time"]),
|
|
2264
2269
|
endTime: readFirstString(ctx.params, ["endTime", "end_time"]),
|
|
2265
|
-
pageSize:
|
|
2270
|
+
pageSize: readOptionalPositiveInteger(ctx.params, ["pageSize", "page_size"]),
|
|
2266
2271
|
pageToken: readFirstString(ctx.params, ["pageToken", "page_token"]),
|
|
2267
2272
|
accountId: ctx.accountId ?? void 0
|
|
2268
2273
|
})
|
|
@@ -2285,7 +2290,7 @@ const feishuPlugin = createChatChannelPlugin({
|
|
|
2285
2290
|
provider: "feishu",
|
|
2286
2291
|
action: "channel-info",
|
|
2287
2292
|
channel,
|
|
2288
|
-
members: await runtime.getChatMembers(client, chatId,
|
|
2293
|
+
members: await runtime.getChatMembers(client, chatId, readOptionalPositiveInteger(ctx.params, ["pageSize", "page_size"]), readFirstString(ctx.params, ["pageToken", "page_token"]), resolveFeishuMemberIdType(ctx.params))
|
|
2289
2294
|
});
|
|
2290
2295
|
}
|
|
2291
2296
|
if (ctx.action === "member-info") {
|
|
@@ -2304,13 +2309,13 @@ const feishuPlugin = createChatChannelPlugin({
|
|
|
2304
2309
|
ok: true,
|
|
2305
2310
|
channel: "feishu",
|
|
2306
2311
|
action: "member-info",
|
|
2307
|
-
...await runtime.getChatMembers(client, chatId,
|
|
2312
|
+
...await runtime.getChatMembers(client, chatId, readOptionalPositiveInteger(ctx.params, ["pageSize", "page_size"]), readFirstString(ctx.params, ["pageToken", "page_token"]), resolveFeishuMemberIdType(ctx.params))
|
|
2308
2313
|
});
|
|
2309
2314
|
}
|
|
2310
2315
|
if (ctx.action === "channel-list") {
|
|
2311
2316
|
const runtime = await loadFeishuChannelRuntime();
|
|
2312
2317
|
const query = readFirstString(ctx.params, ["query"]);
|
|
2313
|
-
const limit =
|
|
2318
|
+
const limit = readOptionalPositiveInteger(ctx.params, ["limit"]);
|
|
2314
2319
|
const scope = readFirstString(ctx.params, ["scope", "kind"]) ?? "all";
|
|
2315
2320
|
if (scope === "groups" || scope === "group" || scope === "channels" || scope === "channel") return jsonActionResult({
|
|
2316
2321
|
ok: true,
|
|
@@ -2542,7 +2547,7 @@ const feishuPlugin = createChatChannelPlugin({
|
|
|
2542
2547
|
})
|
|
2543
2548
|
}),
|
|
2544
2549
|
gateway: { startAccount: async (ctx) => {
|
|
2545
|
-
const { monitorFeishuProvider } = await import("./monitor-
|
|
2550
|
+
const { monitorFeishuProvider } = await import("./monitor-1WyqLgPM.js");
|
|
2546
2551
|
const account = resolveFeishuRuntimeAccount({
|
|
2547
2552
|
cfg: ctx.cfg,
|
|
2548
2553
|
accountId: ctx.accountId
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as feishuPlugin } from "./channel-
|
|
1
|
+
import { t as feishuPlugin } from "./channel-BVSJh3s1.js";
|
|
2
2
|
export { feishuPlugin };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount, y as parseFeishuCommentTarget } from "./accounts-CXnY5H8g.js";
|
|
2
|
-
import { h as listFeishuDirectoryPeers, m as listFeishuDirectoryGroups, o as buildFeishuPresentationCardElements } from "./channel-
|
|
3
|
-
import { r as createFeishuClient } from "./client-
|
|
4
|
-
import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-
|
|
2
|
+
import { h as listFeishuDirectoryPeers, m as listFeishuDirectoryGroups, o as buildFeishuPresentationCardElements } from "./channel-BVSJh3s1.js";
|
|
3
|
+
import { r as createFeishuClient } from "./client-DcSzLkSX.js";
|
|
4
|
+
import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-6Ohn34x9.js";
|
|
5
5
|
import { chunkTextForOutbound } from "./runtime-api.js";
|
|
6
|
-
import { a as sendCardFeishu, c as sendStructuredCardFeishu, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, n as getMessageFeishu, o as sendMarkdownCardFeishu, s as sendMessageFeishu, t as editMessageFeishu } from "./send-
|
|
7
|
-
import { t as probeFeishu } from "./probe-
|
|
6
|
+
import { a as sendCardFeishu, c as sendStructuredCardFeishu, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, n as getMessageFeishu, o as sendMarkdownCardFeishu, s as sendMessageFeishu, t as editMessageFeishu } from "./send-CKZz15KQ.js";
|
|
7
|
+
import { t as probeFeishu } from "./probe-RvCg70BY.js";
|
|
8
8
|
import { isRecord, normalizeLowercaseStringOrEmpty, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
9
9
|
import { interactiveReplyToPresentation, normalizeInteractiveReply, normalizeMessagePresentation, renderMessagePresentationFallbackText, resolveInteractiveTextFallback } from "openclaw/plugin-sdk/interactive-runtime";
|
|
10
10
|
import path from "node:path";
|
|
@@ -2,6 +2,7 @@ import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
|
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import * as Lark from "@larksuiteoapi/node-sdk";
|
|
4
4
|
import { readPluginPackageVersion, resolveAmbientNodeProxyAgent } from "openclaw/plugin-sdk/extension-shared";
|
|
5
|
+
import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
|
|
5
6
|
//#region extensions/feishu/src/client-timeout.ts
|
|
6
7
|
/** Default HTTP timeout for Feishu API requests (30 seconds). */
|
|
7
8
|
const FEISHU_HTTP_TIMEOUT_MS = 3e4;
|
|
@@ -15,8 +16,8 @@ function resolveConfiguredHttpTimeoutMs(creds) {
|
|
|
15
16
|
if (typeof fromDirectField === "number" && Number.isFinite(fromDirectField) && fromDirectField > 0) return clampTimeout(fromDirectField);
|
|
16
17
|
const envRaw = process.env[FEISHU_HTTP_TIMEOUT_ENV_VAR];
|
|
17
18
|
if (envRaw) {
|
|
18
|
-
const envValue =
|
|
19
|
-
if (
|
|
19
|
+
const envValue = parseStrictPositiveInteger(envRaw);
|
|
20
|
+
if (envValue !== void 0) return clampTimeout(envValue);
|
|
20
21
|
}
|
|
21
22
|
const timeout = creds.config?.httpTimeoutMs;
|
|
22
23
|
if (typeof timeout !== "number" || !Number.isFinite(timeout) || timeout <= 0) return FEISHU_HTTP_TIMEOUT_MS;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { d as formatFeishuApiError, f as isRecord$1, h as readString, i as listFeishuAccountIds, l as encodeQuery, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount, u as extractReplyText, y as parseFeishuCommentTarget } from "./accounts-CXnY5H8g.js";
|
|
2
|
-
import { r as createFeishuClient } from "./client-
|
|
2
|
+
import { r as createFeishuClient } from "./client-DcSzLkSX.js";
|
|
3
3
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
4
|
+
import { optionalPositiveIntegerSchema } from "openclaw/plugin-sdk/channel-actions";
|
|
4
5
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
5
6
|
import { Type } from "typebox";
|
|
7
|
+
import { readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
|
|
6
8
|
//#region extensions/feishu/src/tools-config.ts
|
|
7
9
|
/**
|
|
8
10
|
* Default tool configuration.
|
|
@@ -91,7 +93,10 @@ const FeishuChatSchema = Type.Object({
|
|
|
91
93
|
}),
|
|
92
94
|
chat_id: Type.Optional(Type.String({ description: "Chat ID (from URL or event payload)" })),
|
|
93
95
|
member_id: Type.Optional(Type.String({ description: "Member ID for member_info lookups" })),
|
|
94
|
-
page_size:
|
|
96
|
+
page_size: optionalPositiveIntegerSchema({
|
|
97
|
+
maximum: 100,
|
|
98
|
+
description: "Page size (1-100, default 50)"
|
|
99
|
+
}),
|
|
95
100
|
page_token: Type.Optional(Type.String({ description: "Pagination token" })),
|
|
96
101
|
member_id_type: Type.Optional(Type.Unsafe({
|
|
97
102
|
type: "string",
|
|
@@ -110,6 +115,12 @@ function json(data) {
|
|
|
110
115
|
details: data
|
|
111
116
|
};
|
|
112
117
|
}
|
|
118
|
+
function readChatPageSize(params) {
|
|
119
|
+
return readPositiveIntegerParam(params, "page_size", {
|
|
120
|
+
max: 100,
|
|
121
|
+
message: "page_size must be a positive integer between 1 and 100"
|
|
122
|
+
});
|
|
123
|
+
}
|
|
113
124
|
async function getChatInfo(client, chatId) {
|
|
114
125
|
const res = await client.im.chat.get({ path: { chat_id: chatId } });
|
|
115
126
|
if (res.code !== 0) throw new Error(res.msg);
|
|
@@ -206,13 +217,14 @@ function registerFeishuChatTools(api) {
|
|
|
206
217
|
description: "Feishu chat operations. Actions: members, info, member_info",
|
|
207
218
|
parameters: FeishuChatSchema,
|
|
208
219
|
async execute(_toolCallId, params) {
|
|
220
|
+
const rawParams = params;
|
|
209
221
|
const p = params;
|
|
210
222
|
try {
|
|
211
223
|
const client = getClient();
|
|
212
224
|
switch (p.action) {
|
|
213
225
|
case "members":
|
|
214
226
|
if (!p.chat_id) return json({ error: "chat_id is required for action members" });
|
|
215
|
-
return json(await getChatMembers(client, p.chat_id,
|
|
227
|
+
return json(await getChatMembers(client, p.chat_id, readChatPageSize(rawParams), p.page_token, p.member_id_type));
|
|
216
228
|
case "info":
|
|
217
229
|
if (!p.chat_id) return json({ error: "chat_id is required for action info" });
|
|
218
230
|
return json(await getChatInfo(client, p.chat_id));
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-CXnY5H8g.js";
|
|
2
|
-
import { l as fetchBotIdentityForMonitor } from "./monitor.state-
|
|
2
|
+
import { l as fetchBotIdentityForMonitor } from "./monitor.state-B6SoAUys.js";
|
|
3
3
|
//#region extensions/feishu/src/monitor.ts
|
|
4
4
|
let monitorAccountRuntimePromise;
|
|
5
5
|
async function loadMonitorAccountRuntime() {
|
|
6
|
-
monitorAccountRuntimePromise ??= import("./monitor.account-
|
|
6
|
+
monitorAccountRuntimePromise ??= import("./monitor.account-DXQXXSzI.js");
|
|
7
7
|
return await monitorAccountRuntimePromise;
|
|
8
8
|
}
|
|
9
9
|
async function monitorFeishuProvider(opts = {}) {
|
|
@@ -2,15 +2,15 @@ import { t as buildFeishuConversationId } from "./conversation-id-DuL575sn.js";
|
|
|
2
2
|
import { i as resolveReceiveIdType } from "./targets-BUjQ1TcA.js";
|
|
3
3
|
import { t as createFeishuThreadBindingManager } from "./thread-bindings-D24m3Cjy.js";
|
|
4
4
|
import { _ as buildFeishuCommentTarget, f as isRecord$1, h as readString, l as encodeQuery, m as parseCommentContentElements, p as normalizeString, s as resolveFeishuRuntimeAccount, u as extractReplyText, v as normalizeCommentFileType } from "./accounts-CXnY5H8g.js";
|
|
5
|
-
import { c as normalizeFeishuAllowEntry, d as resolveFeishuGroupConversationIngressAccess, f as resolveFeishuGroupSenderActivationIngressAccess, l as resolveFeishuDmIngressAccess, p as resolveFeishuReplyPolicy, s as hasExplicitFeishuGroupConfig, u as resolveFeishuGroupConfig } from "./channel-
|
|
5
|
+
import { c as normalizeFeishuAllowEntry, d as resolveFeishuGroupConversationIngressAccess, f as resolveFeishuGroupSenderActivationIngressAccess, l as resolveFeishuDmIngressAccess, p as resolveFeishuReplyPolicy, s as hasExplicitFeishuGroupConfig, u as resolveFeishuGroupConfig } from "./channel-BVSJh3s1.js";
|
|
6
6
|
import { c as decodeFeishuCardAction, o as buildFeishuCardActionTextFallback, s as createFeishuCardInteractionEnvelope } from "./send-result-DSTSkRDM.js";
|
|
7
7
|
import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
|
|
8
|
-
import { a as getFeishuUserAgent, i as createFeishuWSClient, n as createEventDispatcher, r as createFeishuClient } from "./client-
|
|
9
|
-
import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-
|
|
8
|
+
import { a as getFeishuUserAgent, i as createFeishuWSClient, n as createEventDispatcher, r as createFeishuClient } from "./client-DcSzLkSX.js";
|
|
9
|
+
import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-6Ohn34x9.js";
|
|
10
10
|
import { createReplyPrefixContext, evaluateSupplementalContextVisibility, loadSessionStore, normalizeAgentId as normalizeAgentId$2, resolveChannelContextVisibilityMode, resolveSessionStoreEntry } from "./runtime-api.js";
|
|
11
|
-
import { _ as normalizeFeishuExternalKey, a as sendCardFeishu, c as sendStructuredCardFeishu, d as isFeishuBroadcastMention, f as isMentionForwardRequest, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, l as parsePostContent, m as saveMessageResourceFeishu, n as getMessageFeishu, p as isFeishuGroupChatType, r as listFeishuThreadMessages, s as sendMessageFeishu, u as extractMentionTargets } from "./send-
|
|
12
|
-
import { i as waitForAbortableDelay, r as raceWithTimeoutAndAbort } from "./probe-
|
|
13
|
-
import { a as feishuWebhookRateLimiter, c as wsClients, i as botOpenIds, l as fetchBotIdentityForMonitor, n as FEISHU_WEBHOOK_MAX_BODY_BYTES, o as httpServers, r as botNames, s as recordWebhookStatus, t as FEISHU_WEBHOOK_BODY_TIMEOUT_MS } from "./monitor.state-
|
|
11
|
+
import { _ as normalizeFeishuExternalKey, a as sendCardFeishu, c as sendStructuredCardFeishu, d as isFeishuBroadcastMention, f as isMentionForwardRequest, g as shouldSuppressFeishuTextForVoiceMedia, h as sendMediaFeishu, i as resolveFeishuCardTemplate, l as parsePostContent, m as saveMessageResourceFeishu, n as getMessageFeishu, p as isFeishuGroupChatType, r as listFeishuThreadMessages, s as sendMessageFeishu, u as extractMentionTargets } from "./send-CKZz15KQ.js";
|
|
12
|
+
import { i as waitForAbortableDelay, r as raceWithTimeoutAndAbort } from "./probe-RvCg70BY.js";
|
|
13
|
+
import { a as feishuWebhookRateLimiter, c as wsClients, i as botOpenIds, l as fetchBotIdentityForMonitor, n as FEISHU_WEBHOOK_MAX_BODY_BYTES, o as httpServers, r as botNames, s as recordWebhookStatus, t as FEISHU_WEBHOOK_BODY_TIMEOUT_MS } from "./monitor.state-B6SoAUys.js";
|
|
14
14
|
import { asBoolean, asNullableRecord, isRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, readStringValue, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
15
15
|
import { ensureConfiguredBindingRouteReady, resolveConfiguredBindingRoute, resolveRuntimeConversationBindingRoute } from "openclaw/plugin-sdk/conversation-runtime";
|
|
16
16
|
import { resolveInboundLastRouteSessionKey } from "openclaw/plugin-sdk/routing";
|
|
@@ -22,6 +22,7 @@ import os from "node:os";
|
|
|
22
22
|
import path from "node:path";
|
|
23
23
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
24
24
|
import * as Lark from "@larksuiteoapi/node-sdk";
|
|
25
|
+
import { parseStrictNonNegativeInteger } from "openclaw/plugin-sdk/number-runtime";
|
|
25
26
|
import { createPersistentDedupe } from "openclaw/plugin-sdk/persistent-dedupe";
|
|
26
27
|
import { applyBasicWebhookRequestGuards, resolveRequestClientIp } from "openclaw/plugin-sdk/webhook-ingress";
|
|
27
28
|
import { fetchWithSsrFGuard } from "openclaw/plugin-sdk/ssrf-runtime";
|
|
@@ -4074,8 +4075,7 @@ function buildCommentSessionKey(params) {
|
|
|
4074
4075
|
});
|
|
4075
4076
|
}
|
|
4076
4077
|
function parseTimestampMs(value) {
|
|
4077
|
-
|
|
4078
|
-
return Number.isFinite(parsed) ? parsed : Date.now();
|
|
4078
|
+
return parseStrictNonNegativeInteger(value) ?? Date.now();
|
|
4079
4079
|
}
|
|
4080
4080
|
async function handleFeishuCommentEvent(params) {
|
|
4081
4081
|
const account = resolveFeishuRuntimeAccount({
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { t as probeFeishu } from "./probe-
|
|
1
|
+
import { t as probeFeishu } from "./probe-RvCg70BY.js";
|
|
2
2
|
import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
3
|
+
import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
|
|
3
4
|
import { WEBHOOK_ANOMALY_COUNTER_DEFAULTS, WEBHOOK_RATE_LIMIT_DEFAULTS, createFixedWindowRateLimiter, createWebhookAnomalyTracker } from "openclaw/plugin-sdk/webhook-ingress";
|
|
4
5
|
//#region extensions/feishu/src/monitor.startup.ts
|
|
5
6
|
const FEISHU_STARTUP_BOT_INFO_TIMEOUT_DEFAULT_MS = 3e4;
|
|
6
7
|
const FEISHU_STARTUP_BOT_INFO_TIMEOUT_ENV = "OPENCLAW_FEISHU_STARTUP_PROBE_TIMEOUT_MS";
|
|
7
|
-
function resolveStartupProbeTimeoutMs() {
|
|
8
|
-
const raw =
|
|
8
|
+
function resolveStartupProbeTimeoutMs(env = process.env) {
|
|
9
|
+
const raw = env[FEISHU_STARTUP_BOT_INFO_TIMEOUT_ENV];
|
|
9
10
|
if (raw) {
|
|
10
|
-
const parsed =
|
|
11
|
-
if (
|
|
11
|
+
const parsed = parseStrictPositiveInteger(raw);
|
|
12
|
+
if (parsed !== void 0) return parsed;
|
|
12
13
|
console.warn(`[feishu] ${FEISHU_STARTUP_BOT_INFO_TIMEOUT_ENV}="${raw}" is invalid; using default ${FEISHU_STARTUP_BOT_INFO_TIMEOUT_DEFAULT_MS}ms`);
|
|
13
14
|
}
|
|
14
15
|
return FEISHU_STARTUP_BOT_INFO_TIMEOUT_DEFAULT_MS;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
|
|
2
|
-
import { r as createFeishuClient } from "./client-
|
|
2
|
+
import { r as createFeishuClient } from "./client-DcSzLkSX.js";
|
|
3
3
|
import { formatErrorMessage } from "openclaw/plugin-sdk/error-runtime";
|
|
4
4
|
//#region extensions/feishu/src/async.ts
|
|
5
5
|
const RACE_TIMEOUT = Symbol("race-timeout");
|
|
@@ -2,7 +2,7 @@ import { i as resolveReceiveIdType, r as normalizeFeishuTarget } from "./targets
|
|
|
2
2
|
import { c as createFeishuApiError, f as isRecord$1, g as requestFeishuApi, s as resolveFeishuRuntimeAccount } from "./accounts-CXnY5H8g.js";
|
|
3
3
|
import { i as toFeishuSendResult, r as resolveFeishuReceiptKind, t as assertFeishuMessageApiSuccess } from "./send-result-DSTSkRDM.js";
|
|
4
4
|
import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
|
|
5
|
-
import { r as createFeishuClient } from "./client-
|
|
5
|
+
import { r as createFeishuClient } from "./client-DcSzLkSX.js";
|
|
6
6
|
import { isRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
7
7
|
import { convertMarkdownTables } from "openclaw/plugin-sdk/text-chunking";
|
|
8
8
|
import fs from "node:fs";
|
package/dist/setup-api.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-
|
|
1
|
+
import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-BVSJh3s1.js";
|
|
2
2
|
export { feishuPlugin, feishuSetupAdapter, feishuSetupWizard };
|
|
@@ -691,6 +691,10 @@ try {
|
|
|
691
691
|
| signal | `AbortSignal` to cancel the polling | AbortSignal | No | - |
|
|
692
692
|
| onQRCodeReady | Callback when the verification URL is ready. Receives `{ url, expireIn }`. You can render the URL as a QR code for users to scan, or display it as a link | function | Yes | - |
|
|
693
693
|
| onStatusChange | Callback on polling status changes. Receives `{ status, interval? }`. Status values: `polling`, `slow_down`, `domain_switched` | function | No | - |
|
|
694
|
+
| appPreset | Pre-fill values for the app-creation page. All fields are optional; users can still edit them on the page | AppPreset | No | - |
|
|
695
|
+
| appPreset.avatar | App avatar URL(s). 1-6 URLs supported; the first one is selected by default. Allowed formats: png / jpg / jpeg / webp / gif (gif is sampled to a single frame, not animated) | string \| string[] | No | - |
|
|
696
|
+
| appPreset.name | App name. Supports the `{user}` placeholder (replaced with the scanning user's name) | string | No | - |
|
|
697
|
+
| appPreset.desc | App description. Supports the `{user}` placeholder | string | No | - |
|
|
694
698
|
|
|
695
699
|
#### Return value
|
|
696
700
|
|
|
@@ -753,6 +753,10 @@ try {
|
|
|
753
753
|
| signal | 用于取消轮询的 `AbortSignal` | AbortSignal | 否 | - |
|
|
754
754
|
| onQRCodeReady | 验证链接就绪时的回调,参数为 `{ url, expireIn }`。可将 URL 渲染为二维码供用户扫码,或直接作为链接展示 | function | 是 | - |
|
|
755
755
|
| onStatusChange | 轮询状态变化时的回调,参数为 `{ status, interval? }`。status 取值:`polling`、`slow_down`、`domain_switched` | function | 否 | - |
|
|
756
|
+
| appPreset | 预设应用信息(头像、名称、描述)。所有字段都是可选的,用户扫码后仍可在页面手动修改 | AppPreset | 否 | - |
|
|
757
|
+
| appPreset.avatar | 应用头像 URL,支持 1-6 个;传多个时默认选中第一个。支持 png / jpg / jpeg / webp / gif(gif 自动取一帧,不保留动图) | string \| string[] | 否 | - |
|
|
758
|
+
| appPreset.name | 应用名称,支持 `{user}` 占位符(替换为扫码用户名称) | string | 否 | - |
|
|
759
|
+
| appPreset.desc | 应用描述,支持 `{user}` 占位符 | string | 否 | - |
|
|
756
760
|
|
|
757
761
|
#### 返回值
|
|
758
762
|
|
|
@@ -89750,6 +89750,35 @@ const SDK_NAME = 'node-sdk';
|
|
|
89750
89750
|
const DEFAULT_FEISHU_DOMAIN = 'accounts.feishu.cn';
|
|
89751
89751
|
const DEFAULT_LARK_DOMAIN = 'accounts.larksuite.com';
|
|
89752
89752
|
const ENDPOINT = '/oauth/v1/app/registration';
|
|
89753
|
+
const AVATAR_MAX_COUNT = 6;
|
|
89754
|
+
/**
|
|
89755
|
+
* Append `avatar` / `name` / `desc` query params to the QR code URL.
|
|
89756
|
+
* `URLSearchParams` handles URL encoding automatically.
|
|
89757
|
+
*/
|
|
89758
|
+
function applyAppPreset(qrCodeUrl, preset) {
|
|
89759
|
+
const { avatar, name, desc } = preset;
|
|
89760
|
+
if (avatar !== undefined) {
|
|
89761
|
+
const avatars = Array.isArray(avatar) ? avatar : [avatar];
|
|
89762
|
+
if (avatars.length === 0) {
|
|
89763
|
+
throw new Error('appPreset.avatar must contain at least 1 URL');
|
|
89764
|
+
}
|
|
89765
|
+
if (avatars.length > AVATAR_MAX_COUNT) {
|
|
89766
|
+
throw new Error(`appPreset.avatar supports at most ${AVATAR_MAX_COUNT} URLs, got ${avatars.length}`);
|
|
89767
|
+
}
|
|
89768
|
+
avatars.forEach((url, idx) => {
|
|
89769
|
+
if (typeof url !== 'string' || url === '') {
|
|
89770
|
+
throw new Error(`appPreset.avatar[${idx}] must be a non-empty string`);
|
|
89771
|
+
}
|
|
89772
|
+
qrCodeUrl.searchParams.append('avatar', url);
|
|
89773
|
+
});
|
|
89774
|
+
}
|
|
89775
|
+
if (name !== undefined) {
|
|
89776
|
+
qrCodeUrl.searchParams.set('name', name);
|
|
89777
|
+
}
|
|
89778
|
+
if (desc !== undefined) {
|
|
89779
|
+
qrCodeUrl.searchParams.set('desc', desc);
|
|
89780
|
+
}
|
|
89781
|
+
}
|
|
89753
89782
|
function requestRegistration(baseUrl, params) {
|
|
89754
89783
|
var _a;
|
|
89755
89784
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -89867,13 +89896,16 @@ function startPolling(ctx) {
|
|
|
89867
89896
|
function registerApp(options) {
|
|
89868
89897
|
var _a, _b, _c, _d;
|
|
89869
89898
|
return __awaiter(this, void 0, void 0, function* () {
|
|
89870
|
-
const { domain, source, signal, onQRCodeReady, onStatusChange } = options;
|
|
89899
|
+
const { domain, source, signal, onQRCodeReady, onStatusChange, appPreset } = options;
|
|
89871
89900
|
const baseUrl = `https://${domain !== null && domain !== void 0 ? domain : DEFAULT_FEISHU_DOMAIN}`;
|
|
89872
89901
|
const beginRes = yield begin(baseUrl);
|
|
89873
89902
|
const qrCodeUrl = new URL(beginRes.verification_uri_complete);
|
|
89874
89903
|
qrCodeUrl.searchParams.set('from', 'sdk');
|
|
89875
89904
|
qrCodeUrl.searchParams.set('source', source ? `${SDK_NAME}/${source}` : SDK_NAME);
|
|
89876
89905
|
qrCodeUrl.searchParams.set('tp', 'sdk');
|
|
89906
|
+
if (appPreset) {
|
|
89907
|
+
applyAppPreset(qrCodeUrl, appPreset);
|
|
89908
|
+
}
|
|
89877
89909
|
onQRCodeReady({
|
|
89878
89910
|
url: qrCodeUrl.toString(),
|
|
89879
89911
|
expireIn: (_a = beginRes.expires_in) !== null && _a !== void 0 ? _a : 600,
|
|
@@ -89768,6 +89768,35 @@ const SDK_NAME = 'node-sdk';
|
|
|
89768
89768
|
const DEFAULT_FEISHU_DOMAIN = 'accounts.feishu.cn';
|
|
89769
89769
|
const DEFAULT_LARK_DOMAIN = 'accounts.larksuite.com';
|
|
89770
89770
|
const ENDPOINT = '/oauth/v1/app/registration';
|
|
89771
|
+
const AVATAR_MAX_COUNT = 6;
|
|
89772
|
+
/**
|
|
89773
|
+
* Append `avatar` / `name` / `desc` query params to the QR code URL.
|
|
89774
|
+
* `URLSearchParams` handles URL encoding automatically.
|
|
89775
|
+
*/
|
|
89776
|
+
function applyAppPreset(qrCodeUrl, preset) {
|
|
89777
|
+
const { avatar, name, desc } = preset;
|
|
89778
|
+
if (avatar !== undefined) {
|
|
89779
|
+
const avatars = Array.isArray(avatar) ? avatar : [avatar];
|
|
89780
|
+
if (avatars.length === 0) {
|
|
89781
|
+
throw new Error('appPreset.avatar must contain at least 1 URL');
|
|
89782
|
+
}
|
|
89783
|
+
if (avatars.length > AVATAR_MAX_COUNT) {
|
|
89784
|
+
throw new Error(`appPreset.avatar supports at most ${AVATAR_MAX_COUNT} URLs, got ${avatars.length}`);
|
|
89785
|
+
}
|
|
89786
|
+
avatars.forEach((url, idx) => {
|
|
89787
|
+
if (typeof url !== 'string' || url === '') {
|
|
89788
|
+
throw new Error(`appPreset.avatar[${idx}] must be a non-empty string`);
|
|
89789
|
+
}
|
|
89790
|
+
qrCodeUrl.searchParams.append('avatar', url);
|
|
89791
|
+
});
|
|
89792
|
+
}
|
|
89793
|
+
if (name !== undefined) {
|
|
89794
|
+
qrCodeUrl.searchParams.set('name', name);
|
|
89795
|
+
}
|
|
89796
|
+
if (desc !== undefined) {
|
|
89797
|
+
qrCodeUrl.searchParams.set('desc', desc);
|
|
89798
|
+
}
|
|
89799
|
+
}
|
|
89771
89800
|
function requestRegistration(baseUrl, params) {
|
|
89772
89801
|
var _a;
|
|
89773
89802
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -89885,13 +89914,16 @@ function startPolling(ctx) {
|
|
|
89885
89914
|
function registerApp(options) {
|
|
89886
89915
|
var _a, _b, _c, _d;
|
|
89887
89916
|
return __awaiter(this, void 0, void 0, function* () {
|
|
89888
|
-
const { domain, source, signal, onQRCodeReady, onStatusChange } = options;
|
|
89917
|
+
const { domain, source, signal, onQRCodeReady, onStatusChange, appPreset } = options;
|
|
89889
89918
|
const baseUrl = `https://${domain !== null && domain !== void 0 ? domain : DEFAULT_FEISHU_DOMAIN}`;
|
|
89890
89919
|
const beginRes = yield begin(baseUrl);
|
|
89891
89920
|
const qrCodeUrl = new URL(beginRes.verification_uri_complete);
|
|
89892
89921
|
qrCodeUrl.searchParams.set('from', 'sdk');
|
|
89893
89922
|
qrCodeUrl.searchParams.set('source', source ? `${SDK_NAME}/${source}` : SDK_NAME);
|
|
89894
89923
|
qrCodeUrl.searchParams.set('tp', 'sdk');
|
|
89924
|
+
if (appPreset) {
|
|
89925
|
+
applyAppPreset(qrCodeUrl, appPreset);
|
|
89926
|
+
}
|
|
89895
89927
|
onQRCodeReady({
|
|
89896
89928
|
url: qrCodeUrl.toString(),
|
|
89897
89929
|
expireIn: (_a = beginRes.expires_in) !== null && _a !== void 0 ? _a : 600,
|
|
@@ -300741,6 +300741,23 @@ interface StatusChangeInfo {
|
|
|
300741
300741
|
status: 'polling' | 'slow_down' | 'domain_switched';
|
|
300742
300742
|
interval?: number;
|
|
300743
300743
|
}
|
|
300744
|
+
/**
|
|
300745
|
+
* Pre-fill values shown on the app-creation page after the user scans the QR
|
|
300746
|
+
* code. All fields are optional and the user can still edit them on the page;
|
|
300747
|
+
* the final values are whatever the user submits.
|
|
300748
|
+
*/
|
|
300749
|
+
interface AppPreset {
|
|
300750
|
+
/**
|
|
300751
|
+
* App avatar URL(s). Pass a single URL or 1-6 URLs. The first one is the
|
|
300752
|
+
* default selection. Each URL must point to a publicly reachable image
|
|
300753
|
+
* (png / jpg / jpeg / webp / gif).
|
|
300754
|
+
*/
|
|
300755
|
+
avatar?: string | string[];
|
|
300756
|
+
/** App name. Supports `{user}` placeholder, replaced with the scanning user's name. */
|
|
300757
|
+
name?: string;
|
|
300758
|
+
/** App description. Supports `{user}` placeholder. */
|
|
300759
|
+
desc?: string;
|
|
300760
|
+
}
|
|
300744
300761
|
interface RegisterAppOptions {
|
|
300745
300762
|
domain?: string;
|
|
300746
300763
|
larkDomain?: string;
|
|
@@ -300748,6 +300765,8 @@ interface RegisterAppOptions {
|
|
|
300748
300765
|
signal?: AbortSignal;
|
|
300749
300766
|
onQRCodeReady: (info: QRCodeInfo) => void;
|
|
300750
300767
|
onStatusChange?: (info: StatusChangeInfo) => void;
|
|
300768
|
+
/** Pre-fill values for the app-creation page. See {@link AppPreset}. */
|
|
300769
|
+
appPreset?: AppPreset;
|
|
300751
300770
|
}
|
|
300752
300771
|
interface UserInfo {
|
|
300753
300772
|
open_id?: string;
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/feishu",
|
|
3
|
-
"version": "2026.5.
|
|
3
|
+
"version": "2026.5.28-beta.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@openclaw/feishu",
|
|
9
|
-
"version": "2026.5.
|
|
9
|
+
"version": "2026.5.28-beta.2",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@larksuiteoapi/node-sdk": "1.
|
|
11
|
+
"@larksuiteoapi/node-sdk": "1.66.0",
|
|
12
12
|
"typebox": "1.1.38",
|
|
13
13
|
"zod": "4.4.3"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"openclaw": ">=2026.5.
|
|
16
|
+
"openclaw": ">=2026.5.28-beta.2"
|
|
17
17
|
},
|
|
18
18
|
"peerDependenciesMeta": {
|
|
19
19
|
"openclaw": {
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
"node_modules/@larksuiteoapi/node-sdk": {
|
|
25
|
-
"version": "1.
|
|
26
|
-
"resolved": "https://registry.npmjs.org/@larksuiteoapi/node-sdk/-/node-sdk-1.
|
|
27
|
-
"integrity": "sha512-
|
|
25
|
+
"version": "1.66.0",
|
|
26
|
+
"resolved": "https://registry.npmjs.org/@larksuiteoapi/node-sdk/-/node-sdk-1.66.0.tgz",
|
|
27
|
+
"integrity": "sha512-ueKbbdvmVGVie3KvKbvHZqvDC/gg3M0rRDeyQanQWK+i2bQgiiTpIfpqVWvxuTgprV31yqV7HPMjN6KegWSCfA==",
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"axios": "~1.13.3",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/feishu",
|
|
3
|
-
"version": "2026.5.
|
|
3
|
+
"version": "2026.5.28-beta.2",
|
|
4
4
|
"description": "OpenClaw Feishu/Lark channel plugin for chats and workplace tools (community maintained by @m1heng).",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
},
|
|
9
9
|
"type": "module",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"@larksuiteoapi/node-sdk": "1.
|
|
11
|
+
"@larksuiteoapi/node-sdk": "1.66.0",
|
|
12
12
|
"typebox": "1.1.38",
|
|
13
13
|
"zod": "4.4.3"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"openclaw": ">=2026.5.
|
|
16
|
+
"openclaw": ">=2026.5.28-beta.2"
|
|
17
17
|
},
|
|
18
18
|
"peerDependenciesMeta": {
|
|
19
19
|
"openclaw": {
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"minHostVersion": ">=2026.4.25"
|
|
45
45
|
},
|
|
46
46
|
"compat": {
|
|
47
|
-
"pluginApi": ">=2026.5.
|
|
47
|
+
"pluginApi": ">=2026.5.28-beta.2"
|
|
48
48
|
},
|
|
49
49
|
"build": {
|
|
50
|
-
"openclawVersion": "2026.5.
|
|
50
|
+
"openclawVersion": "2026.5.28-beta.2"
|
|
51
51
|
},
|
|
52
52
|
"release": {
|
|
53
53
|
"publishToClawHub": true,
|