@openclaw/feishu 2026.5.30-beta.1 → 2026.5.31-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.
Files changed (29) hide show
  1. package/README.md +11 -0
  2. package/dist/{accounts-CXnY5H8g.js → accounts-Bpe6CjpS.js} +35 -3
  3. package/dist/api.js +16 -9
  4. package/dist/{channel-DccLoln2.js → channel-TXwK9jIG.js} +14 -12
  5. package/dist/channel-plugin-api.js +1 -1
  6. package/dist/{channel.runtime-CmCCekKl.js → channel.runtime-AAff9iBZ.js} +5 -5
  7. package/dist/{drive-USxqssMG.js → drive-BIrffRwc.js} +18 -6
  8. package/dist/{monitor-DSJJNRiU.js → monitor-Ccev4ogO.js} +3 -3
  9. package/dist/{monitor.account-V8T4ZdUw.js → monitor.account-DYaT0fVd.js} +17 -17
  10. package/dist/{monitor.state-V43tWIJ9.js → monitor.state-r4OLFBfg.js} +1 -1
  11. package/dist/{probe-DKDDBF_j.js → probe-BjKRV7em.js} +2 -4
  12. package/dist/{send-WRPbKn3K.js → send-Cze2qlca.js} +3 -3
  13. package/dist/{send-result-DSTSkRDM.js → send-result-D9rgEUlm.js} +1 -1
  14. package/dist/setup-api.js +1 -1
  15. package/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  16. package/node_modules/es-object-atoms/isObject.d.ts +1 -1
  17. package/node_modules/es-object-atoms/package.json +6 -7
  18. package/node_modules/es-object-atoms/tsconfig.json +1 -0
  19. package/node_modules/hasown/CHANGELOG.md +7 -0
  20. package/node_modules/hasown/index.d.ts +0 -1
  21. package/node_modules/hasown/package.json +4 -5
  22. package/node_modules/typebox/build/type/script/mapping.d.mts +5 -2
  23. package/node_modules/typebox/build/type/script/mapping.mjs +15 -8
  24. package/node_modules/typebox/build/type/script/parser.d.mts +3 -1
  25. package/node_modules/typebox/build/type/script/parser.mjs +2 -1
  26. package/node_modules/typebox/package.json +29 -29
  27. package/npm-shrinkwrap.json +13 -13
  28. package/openclaw.plugin.json +124 -0
  29. package/package.json +6 -5
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # OpenClaw Feishu/Lark
2
+
3
+ Official OpenClaw channel plugin for Feishu and Lark workplace chats. Community maintained by @m1heng.
4
+
5
+ Install from OpenClaw:
6
+
7
+ ```bash
8
+ openclaw plugin add @openclaw/feishu
9
+ ```
10
+
11
+ Configure the Feishu/Lark app credentials in OpenClaw, then connect the plugin to the chats where agents should receive and send messages.
@@ -342,18 +342,50 @@ function resolveDefaultFeishuAccountSelection(cfg) {
342
342
  function resolveDefaultFeishuAccountId(cfg) {
343
343
  return resolveDefaultAccountId(cfg);
344
344
  }
345
+ function resolveRawFeishuAccountConfig(accounts, accountId) {
346
+ if (!accounts || typeof accounts !== "object") return;
347
+ if (Object.hasOwn(accounts, accountId)) return accounts[accountId];
348
+ const normalized = accountId.toLowerCase();
349
+ const matchKey = Object.keys(accounts).find((key) => key.toLowerCase() === normalized);
350
+ return matchKey ? accounts[matchKey] : void 0;
351
+ }
345
352
  /**
346
353
  * Merge top-level config with account-specific config.
347
354
  * Account-specific fields override top-level fields.
348
355
  */
349
356
  function mergeFeishuAccountConfig(cfg, accountId) {
350
357
  const feishuCfg = cfg.channels?.feishu;
351
- return resolveMergedAccountConfig({
358
+ const accounts = feishuCfg?.accounts;
359
+ const accountTools = resolveRawFeishuAccountConfig(accounts, accountId)?.tools;
360
+ const merged = resolveMergedAccountConfig({
352
361
  channelConfig: feishuCfg,
353
- accounts: feishuCfg?.accounts,
362
+ accounts,
354
363
  accountId,
355
- omitKeys: ["defaultAccount"]
364
+ omitKeys: ["defaultAccount"],
365
+ nestedObjectKeys: ["tools"]
356
366
  });
367
+ const topTools = feishuCfg?.tools;
368
+ if (merged.tools === void 0 && topTools !== void 0) return {
369
+ ...merged,
370
+ tools: topTools
371
+ };
372
+ if (topTools?.bitable === false || topTools?.bitable === void 0 && topTools?.base === false) return {
373
+ ...merged,
374
+ tools: {
375
+ ...merged.tools,
376
+ bitable: false,
377
+ base: false
378
+ }
379
+ };
380
+ if (accountTools?.bitable === void 0 && accountTools?.base !== void 0) return {
381
+ ...merged,
382
+ tools: {
383
+ ...merged.tools,
384
+ bitable: accountTools.base,
385
+ base: accountTools.base
386
+ }
387
+ };
388
+ return merged;
357
389
  }
358
390
  function resolveFeishuCredentials(cfg, options) {
359
391
  const mode = options?.mode ?? (options?.allowUnresolvedSecretRef ? "inspect" : "strict");
package/dist/api.js CHANGED
@@ -1,8 +1,9 @@
1
- import { r as listEnabledFeishuAccounts } from "./accounts-CXnY5H8g.js";
2
- import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-DccLoln2.js";
1
+ import { r as listEnabledFeishuAccounts } from "./accounts-Bpe6CjpS.js";
2
+ import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-TXwK9jIG.js";
3
3
  import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DuL575sn.js";
4
4
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
5
- 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-USxqssMG.js";
5
+ import { r as createFeishuClient } from "./client-BhMNZBJD.js";
6
+ import { a as jsonToolResult, d as registerFeishuChatTools, f as createFeishuToolClient, h as resolveToolsConfig, m as resolveFeishuToolAccount, n as registerFeishuDriveTools, o as toolExecutionErrorResult, p as resolveAnyEnabledFeishuToolsConfig, s as unknownToolActionResult } from "./drive-BIrffRwc.js";
6
7
  import { n as getFeishuThreadBindingManager, r as testing, t as createFeishuThreadBindingManager } from "./thread-bindings-C58Uq5Y1.js";
7
8
  import { n as handleFeishuSubagentEnded, r as handleFeishuSubagentSpawning, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-Bw3Dg2mS.js";
8
9
  import { normalizeLowercaseStringOrEmpty, normalizeOptionalString, readStringValue, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
@@ -2208,12 +2209,18 @@ const UpdateRecordSchema = Type.Object({
2208
2209
  });
2209
2210
  function registerFeishuBitableTools(api) {
2210
2211
  if (!api.config) return;
2211
- if (listEnabledFeishuAccounts(api.config).length === 0) return;
2212
- const getClient = (params, defaultAccountId) => createFeishuToolClient({
2213
- api,
2214
- executeParams: params,
2215
- defaultAccountId
2216
- });
2212
+ const accounts = listEnabledFeishuAccounts(api.config);
2213
+ if (accounts.length === 0) return;
2214
+ if (!resolveAnyEnabledFeishuToolsConfig(accounts).bitable) return;
2215
+ const getClient = (params, defaultAccountId) => {
2216
+ const account = resolveFeishuToolAccount({
2217
+ api,
2218
+ executeParams: params,
2219
+ defaultAccountId
2220
+ });
2221
+ if (!resolveToolsConfig(account.config.tools).bitable) throw new Error(`Feishu Bitable tools are disabled for account "${account.accountId}"`);
2222
+ return createFeishuClient(account);
2223
+ };
2217
2224
  const registerBitableTool = (params) => {
2218
2225
  api.registerTool((ctx) => ({
2219
2226
  name: params.name,
@@ -1,6 +1,6 @@
1
- import { a as resolveDefaultFeishuAccountId, f as isRecord$2, i as listFeishuAccountIds, n as inspectFeishuCredentials, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-CXnY5H8g.js";
1
+ import { a as resolveDefaultFeishuAccountId, f as isRecord$2, i as listFeishuAccountIds, n as inspectFeishuCredentials, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-Bpe6CjpS.js";
2
2
  import { n as looksLikeFeishuId, r as normalizeFeishuTarget, t as detectIdType } from "./targets-BUjQ1TcA.js";
3
- import { n as createFeishuSendReceipt, s as createFeishuCardInteractionEnvelope } from "./send-result-DSTSkRDM.js";
3
+ import { n as createFeishuSendReceipt, s as createFeishuCardInteractionEnvelope } from "./send-result-D9rgEUlm.js";
4
4
  import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DuL575sn.js";
5
5
  import { t as messageActionTargetAliases } from "./security-audit-BIeA3W3Q.js";
6
6
  import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-ChjJKAJ9.js";
@@ -150,7 +150,9 @@ const FeishuToolsConfigSchema = z.object({
150
150
  wiki: z.boolean().optional(),
151
151
  drive: z.boolean().optional(),
152
152
  perm: z.boolean().optional(),
153
- scopes: z.boolean().optional()
153
+ scopes: z.boolean().optional(),
154
+ bitable: z.boolean().optional(),
155
+ base: z.boolean().optional()
154
156
  }).strict().optional();
155
157
  /**
156
158
  * Group session scope for routing Feishu group messages.
@@ -279,7 +281,7 @@ const FeishuConfigSchema = z.object({
279
281
  const defaultAccount = value.defaultAccount?.trim();
280
282
  if (defaultAccount && value.accounts && Object.keys(value.accounts).length > 0) {
281
283
  const normalizedDefaultAccount = normalizeAccountId$1(defaultAccount);
282
- if (!Object.prototype.hasOwnProperty.call(value.accounts, normalizedDefaultAccount)) ctx.addIssue({
284
+ if (!Object.hasOwn(value.accounts, normalizedDefaultAccount)) ctx.addIssue({
283
285
  code: z.ZodIssueCode.custom,
284
286
  path: ["defaultAccount"],
285
287
  message: `channels.feishu.defaultAccount="${defaultAccount}" does not match a configured account key`
@@ -419,7 +421,7 @@ function isPathWithinRoot(targetPath, rootPath) {
419
421
  const resolvedTarget = path.resolve(targetPath);
420
422
  const resolvedRoot = path.resolve(rootPath);
421
423
  const relative = path.relative(resolvedRoot, resolvedTarget);
422
- return Boolean(relative) && !relative.startsWith("..") && !path.isAbsolute(relative);
424
+ return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
423
425
  }
424
426
  function formatDisplayPath(filePath) {
425
427
  const home = os.homedir();
@@ -824,7 +826,7 @@ async function repairFeishuDoctorState(params) {
824
826
  const keys = new Set(group.entries.map((entry) => entry.key));
825
827
  const removedEntries = await updateSessionStore(storePath, (store) => {
826
828
  const removed = [];
827
- for (const key of keys) if (Object.prototype.hasOwnProperty.call(store, key)) {
829
+ for (const key of keys) if (Object.hasOwn(store, key)) {
828
830
  delete store[key];
829
831
  const entry = group.entries.find((candidate) => candidate.key === key);
830
832
  if (entry) removed.push(entry);
@@ -1070,7 +1072,7 @@ function hasExplicitFeishuGroupConfig(params) {
1070
1072
  const groups = params.cfg?.groups ?? {};
1071
1073
  const groupId = params.groupId?.trim();
1072
1074
  if (!groupId) return false;
1073
- if (Object.prototype.hasOwnProperty.call(groups, groupId) && groupId !== "*") return true;
1075
+ if (Object.hasOwn(groups, groupId) && groupId !== "*") return true;
1074
1076
  const lowered = normalizeOptionalLowercaseString(groupId) ?? "";
1075
1077
  return Object.keys(groups).some((key) => key !== "*" && normalizeOptionalLowercaseString(key) === lowered);
1076
1078
  }
@@ -1307,8 +1309,8 @@ function isFeishuConfigured(cfg) {
1307
1309
  const topLevelConfigured = isAppIdConfigured(feishuCfg?.appId) && hasConfiguredSecretInput$1(feishuCfg?.appSecret);
1308
1310
  const accountConfigured = Object.values(feishuCfg?.accounts ?? {}).some((account) => {
1309
1311
  if (!account || typeof account !== "object") return false;
1310
- const hasOwnAppId = Object.prototype.hasOwnProperty.call(account, "appId");
1311
- const hasOwnAppSecret = Object.prototype.hasOwnProperty.call(account, "appSecret");
1312
+ const hasOwnAppId = Object.hasOwn(account, "appId");
1313
+ const hasOwnAppSecret = Object.hasOwn(account, "appSecret");
1312
1314
  const accountAppIdConfigured = hasOwnAppId ? isAppIdConfigured(account.appId) : isAppIdConfigured(feishuCfg?.appId);
1313
1315
  const accountSecretConfigured = hasOwnAppSecret ? hasConfiguredSecretInput$1(account.appSecret) : hasConfiguredSecretInput$1(feishuCfg?.appSecret);
1314
1316
  return accountAppIdConfigured && accountSecretConfigured;
@@ -1653,7 +1655,7 @@ const feishuSetupWizard = {
1653
1655
  });
1654
1656
  let probeResult = null;
1655
1657
  if (configured && account.configured) try {
1656
- const { probeFeishu } = await import("./probe-DKDDBF_j.js").then((n) => n.n);
1658
+ const { probeFeishu } = await import("./probe-BjKRV7em.js").then((n) => n.n);
1657
1659
  probeResult = await probeFeishu(account);
1658
1660
  } catch {}
1659
1661
  if (!configured) return [formatFeishuStatusLine("needs-credentials")];
@@ -1729,7 +1731,7 @@ const meta = {
1729
1731
  order: 70,
1730
1732
  preferSessionLookupForAnnounceTarget: true
1731
1733
  };
1732
- const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-CmCCekKl.js"), "feishuChannelRuntime");
1734
+ const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-AAff9iBZ.js"), "feishuChannelRuntime");
1733
1735
  function toFeishuMessageSendResult(result, kind) {
1734
1736
  const receipt = result.receipt ?? createFeishuSendReceipt({
1735
1737
  messageId: result.messageId,
@@ -2545,7 +2547,7 @@ const feishuPlugin = createChatChannelPlugin({
2545
2547
  })
2546
2548
  }),
2547
2549
  gateway: { startAccount: async (ctx) => {
2548
- const { monitorFeishuProvider } = await import("./monitor-DSJJNRiU.js");
2550
+ const { monitorFeishuProvider } = await import("./monitor-Ccev4ogO.js");
2549
2551
  const account = resolveFeishuRuntimeAccount({
2550
2552
  cfg: ctx.cfg,
2551
2553
  accountId: ctx.accountId
@@ -1,2 +1,2 @@
1
- import { t as feishuPlugin } from "./channel-DccLoln2.js";
1
+ import { t as feishuPlugin } from "./channel-TXwK9jIG.js";
2
2
  export { feishuPlugin };
@@ -1,10 +1,10 @@
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-DccLoln2.js";
1
+ import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount, y as parseFeishuCommentTarget } from "./accounts-Bpe6CjpS.js";
2
+ import { h as listFeishuDirectoryPeers, m as listFeishuDirectoryGroups, o as buildFeishuPresentationCardElements } from "./channel-TXwK9jIG.js";
3
3
  import { r as createFeishuClient } from "./client-BhMNZBJD.js";
4
- import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-USxqssMG.js";
4
+ import { c as getChatInfo, l as getChatMembers, r as cleanupAmbientCommentTypingReaction, t as deliverCommentThreadText, u as getFeishuMemberInfo } from "./drive-BIrffRwc.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-WRPbKn3K.js";
7
- import { t as probeFeishu } from "./probe-DKDDBF_j.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-Cze2qlca.js";
7
+ import { t as probeFeishu } from "./probe-BjKRV7em.js";
8
8
  import { interactiveReplyToPresentation, normalizeInteractiveReply, normalizeMessagePresentation, renderMessagePresentationFallbackText, resolveInteractiveTextFallback } from "openclaw/plugin-sdk/interactive-runtime";
9
9
  import { isRecord, normalizeLowercaseStringOrEmpty, normalizeStringEntries } from "openclaw/plugin-sdk/string-coerce-runtime";
10
10
  import path from "node:path";
@@ -1,4 +1,4 @@
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";
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-Bpe6CjpS.js";
2
2
  import { r as createFeishuClient } from "./client-BhMNZBJD.js";
3
3
  import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { optionalPositiveIntegerSchema } from "openclaw/plugin-sdk/channel-actions";
@@ -8,7 +8,7 @@ import { readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
8
8
  //#region extensions/feishu/src/tools-config.ts
9
9
  /**
10
10
  * Default tool configuration.
11
- * - doc, chat, wiki, drive, scopes: enabled by default
11
+ * - doc, chat, wiki, drive, scopes, bitable/base: enabled by default
12
12
  * - perm: disabled by default (sensitive operation)
13
13
  */
14
14
  const DEFAULT_TOOLS_CONFIG = {
@@ -17,15 +17,23 @@ const DEFAULT_TOOLS_CONFIG = {
17
17
  wiki: true,
18
18
  drive: true,
19
19
  perm: false,
20
- scopes: true
20
+ scopes: true,
21
+ bitable: true,
22
+ base: true
21
23
  };
22
24
  /**
23
25
  * Resolve tools config with defaults.
26
+ *
27
+ * `base` is a backward-compatible alias for the Bitable tool family. When both
28
+ * keys are present, the explicit `bitable` value wins and `base` mirrors it.
24
29
  */
25
30
  function resolveToolsConfig(cfg) {
31
+ const bitable = cfg?.bitable ?? cfg?.base ?? DEFAULT_TOOLS_CONFIG.bitable;
26
32
  return {
27
33
  ...DEFAULT_TOOLS_CONFIG,
28
- ...cfg
34
+ ...cfg,
35
+ bitable,
36
+ base: bitable
29
37
  };
30
38
  }
31
39
  //#endregion
@@ -60,7 +68,9 @@ function resolveAnyEnabledFeishuToolsConfig(accounts) {
60
68
  wiki: false,
61
69
  drive: false,
62
70
  perm: false,
63
- scopes: false
71
+ scopes: false,
72
+ bitable: false,
73
+ base: false
64
74
  };
65
75
  for (const account of accounts) {
66
76
  const cfg = resolveToolsConfig(account.config.tools);
@@ -70,6 +80,8 @@ function resolveAnyEnabledFeishuToolsConfig(accounts) {
70
80
  merged.drive = merged.drive || cfg.drive;
71
81
  merged.perm = merged.perm || cfg.perm;
72
82
  merged.scopes = merged.scopes || cfg.scopes;
83
+ merged.bitable = merged.bitable || cfg.bitable;
84
+ merged.base = merged.base || cfg.base;
73
85
  }
74
86
  return merged;
75
87
  }
@@ -892,4 +904,4 @@ function registerFeishuDriveTools(api) {
892
904
  }, { name: "feishu_drive" });
893
905
  }
894
906
  //#endregion
895
- export { jsonToolResult as a, getChatInfo as c, registerFeishuChatTools as d, createFeishuToolClient as f, createCommentTypingReactionLifecycle as i, getChatMembers as l, resolveFeishuToolAccount as m, registerFeishuDriveTools as n, toolExecutionErrorResult as o, resolveAnyEnabledFeishuToolsConfig as p, cleanupAmbientCommentTypingReaction as r, unknownToolActionResult as s, deliverCommentThreadText as t, getFeishuMemberInfo as u };
907
+ export { jsonToolResult as a, getChatInfo as c, registerFeishuChatTools as d, createFeishuToolClient as f, resolveToolsConfig as h, createCommentTypingReactionLifecycle as i, getChatMembers as l, resolveFeishuToolAccount as m, registerFeishuDriveTools as n, toolExecutionErrorResult as o, resolveAnyEnabledFeishuToolsConfig as p, cleanupAmbientCommentTypingReaction as r, unknownToolActionResult as s, deliverCommentThreadText as t, getFeishuMemberInfo as u };
@@ -1,9 +1,9 @@
1
- import { r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-CXnY5H8g.js";
2
- import { l as fetchBotIdentityForMonitor } from "./monitor.state-V43tWIJ9.js";
1
+ import { r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-Bpe6CjpS.js";
2
+ import { l as fetchBotIdentityForMonitor } from "./monitor.state-r4OLFBfg.js";
3
3
  //#region extensions/feishu/src/monitor.ts
4
4
  let monitorAccountRuntimePromise;
5
5
  async function loadMonitorAccountRuntime() {
6
- monitorAccountRuntimePromise ??= import("./monitor.account-V8T4ZdUw.js");
6
+ monitorAccountRuntimePromise ??= import("./monitor.account-DYaT0fVd.js");
7
7
  return await monitorAccountRuntimePromise;
8
8
  }
9
9
  async function monitorFeishuProvider(opts = {}) {
@@ -1,20 +1,20 @@
1
- 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";
1
+ 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-Bpe6CjpS.js";
2
2
  import { i as resolveReceiveIdType } from "./targets-BUjQ1TcA.js";
3
- import { c as normalizeFeishuAllowEntry, d as resolveFeishuGroupConversationIngressAccess, f as resolveFeishuGroupSenderActivationIngressAccess, l as resolveFeishuDmIngressAccess, p as resolveFeishuReplyPolicy, s as hasExplicitFeishuGroupConfig, u as resolveFeishuGroupConfig } from "./channel-DccLoln2.js";
4
- import { c as decodeFeishuCardAction, o as buildFeishuCardActionTextFallback, s as createFeishuCardInteractionEnvelope } from "./send-result-DSTSkRDM.js";
3
+ import { c as normalizeFeishuAllowEntry, d as resolveFeishuGroupConversationIngressAccess, f as resolveFeishuGroupSenderActivationIngressAccess, l as resolveFeishuDmIngressAccess, p as resolveFeishuReplyPolicy, s as hasExplicitFeishuGroupConfig, u as resolveFeishuGroupConfig } from "./channel-TXwK9jIG.js";
4
+ import { c as decodeFeishuCardAction, o as buildFeishuCardActionTextFallback, s as createFeishuCardInteractionEnvelope } from "./send-result-D9rgEUlm.js";
5
5
  import { t as buildFeishuConversationId } from "./conversation-id-DuL575sn.js";
6
6
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
7
7
  import { a as getFeishuUserAgent, i as createFeishuWSClient, n as createEventDispatcher, r as createFeishuClient } from "./client-BhMNZBJD.js";
8
- import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-USxqssMG.js";
8
+ import { c as getChatInfo, i as createCommentTypingReactionLifecycle, t as deliverCommentThreadText } from "./drive-BIrffRwc.js";
9
9
  import { t as createFeishuThreadBindingManager } from "./thread-bindings-C58Uq5Y1.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-WRPbKn3K.js";
12
- import { i as waitForAbortableDelay, r as raceWithTimeoutAndAbort } from "./probe-DKDDBF_j.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-V43tWIJ9.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-Cze2qlca.js";
12
+ import { i as waitForAbortableDelay, r as raceWithTimeoutAndAbort } from "./probe-BjKRV7em.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-r4OLFBfg.js";
14
14
  import { createChannelMessageReplyPipeline, formatChannelProgressDraftLineForEntry, isChannelProgressDraftWorkToolName, resolveAgentOutboundIdentity } from "openclaw/plugin-sdk/channel-outbound";
15
15
  import { createChannelPairingController, createChannelPairingController as createChannelPairingController$1 } from "openclaw/plugin-sdk/channel-pairing";
16
16
  import { ensureConfiguredBindingRouteReady, resolveConfiguredBindingRoute, resolveRuntimeConversationBindingRoute } from "openclaw/plugin-sdk/conversation-runtime";
17
- import { asDateTimestampMs, isFutureDateTimestampMs, parseStrictNonNegativeInteger, resolveDateTimestampMs, resolveExpiresAtMsFromDurationMs, resolveExpiresAtMsFromDurationSeconds } from "openclaw/plugin-sdk/number-runtime";
17
+ import { asDateTimestampMs, isFutureDateTimestampMs, parseStrictNonNegativeInteger, resolveDateTimestampMs, resolveExpiresAtMsFromDurationMs, resolveExpiresAtMsFromDurationSeconds, resolveTimerTimeoutMs } from "openclaw/plugin-sdk/number-runtime";
18
18
  import { asBoolean, asNullableRecord, isRecord, normalizeLowercaseStringOrEmpty, normalizeOptionalLowercaseString, normalizeOptionalString, readStringValue, uniqueStrings } from "openclaw/plugin-sdk/string-coerce-runtime";
19
19
  import { stripReasoningTagsFromText } from "openclaw/plugin-sdk/text-chunking";
20
20
  import fs from "node:fs";
@@ -1032,7 +1032,7 @@ var FeishuStreamingSession = class {
1032
1032
  sequence: 1,
1033
1033
  currentText: "",
1034
1034
  sentText: "",
1035
- hasNote: !!options?.note
1035
+ hasNote: Boolean(options?.note)
1036
1036
  };
1037
1037
  this.log?.(`Started streaming: cardId=${cardId}, messageId=${sendRes.data.message_id}`);
1038
1038
  }
@@ -2562,7 +2562,7 @@ async function handleFeishuMessage(params) {
2562
2562
  return threadContext;
2563
2563
  }
2564
2564
  const rootMsg = await getRootMessageInfo();
2565
- let feishuThreadId = ctx.threadId ?? rootMessageThreadId ?? rootMsg?.threadId;
2565
+ const feishuThreadId = ctx.threadId ?? rootMessageThreadId ?? rootMsg?.threadId;
2566
2566
  if (feishuThreadId) log(`feishu[${account.accountId}]: resolved thread ID: ${feishuThreadId}`);
2567
2567
  if (!feishuThreadId) {
2568
2568
  log(`feishu[${account.accountId}]: no threadId found for root message ${ctx.rootId ?? "none"}, skipping thread history`);
@@ -4204,7 +4204,7 @@ async function resolveDriveCommentEventCore(params) {
4204
4204
  return null;
4205
4205
  }
4206
4206
  const context = await fetchDriveCommentContext({
4207
- client: createClient ? createClient(account ?? { accountId }) : createFeishuClient((await import("./accounts-CXnY5H8g.js").then((n) => n.t)).resolveFeishuAccount({
4207
+ client: createClient ? createClient(account ?? { accountId }) : createFeishuClient((await import("./accounts-Bpe6CjpS.js").then((n) => n.t)).resolveFeishuAccount({
4208
4208
  cfg,
4209
4209
  accountId
4210
4210
  })),
@@ -4582,14 +4582,15 @@ function createSequentialQueue(options = {}) {
4582
4582
  }
4583
4583
  async function boundedRun(key, task, timeoutMs, onTaskTimeout) {
4584
4584
  if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) return task();
4585
+ const resolvedTimeoutMs = resolveTimerTimeoutMs(timeoutMs, DEFAULT_TASK_TIMEOUT_MS);
4585
4586
  let timeoutHandle;
4586
4587
  const timeoutPromise = new Promise((resolve) => {
4587
4588
  timeoutHandle = setTimeout(() => {
4588
4589
  try {
4589
- onTaskTimeout?.(key, timeoutMs);
4590
+ onTaskTimeout?.(key, resolvedTimeoutMs);
4590
4591
  } catch {}
4591
4592
  resolve();
4592
- }, timeoutMs);
4593
+ }, resolvedTimeoutMs);
4593
4594
  });
4594
4595
  try {
4595
4596
  await Promise.race([task(), timeoutPromise]);
@@ -4857,7 +4858,7 @@ const FEISHU_WS_LOG_ERROR_MAX_LENGTH = 500;
4857
4858
  const FEISHU_WS_RECONNECT_EXHAUSTED_RE = /^WebSocket reconnect exhausted after \d+ attempts?/;
4858
4859
  const FEISHU_WS_AUTORECONNECT_DISABLED_ERROR = "WebSocket connect failed and autoReconnect is disabled";
4859
4860
  function isFeishuWebhookPayload(value) {
4860
- return !!value && typeof value === "object" && !Array.isArray(value);
4861
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
4861
4862
  }
4862
4863
  function buildFeishuWebhookEnvelope(req, payload) {
4863
4864
  return Object.assign(Object.create({ headers: req.headers }), payload);
@@ -4929,14 +4930,13 @@ function waitForFeishuWsCycleEnd(params) {
4929
4930
  if (params.abortSignal?.aborted) return Promise.resolve("abort");
4930
4931
  return new Promise((resolve) => {
4931
4932
  let settled = false;
4932
- let handleAbort;
4933
4933
  const finish = (result) => {
4934
4934
  if (settled) return;
4935
4935
  settled = true;
4936
4936
  if (handleAbort) params.abortSignal?.removeEventListener("abort", handleAbort);
4937
4937
  resolve(result);
4938
4938
  };
4939
- handleAbort = () => finish("abort");
4939
+ const handleAbort = () => finish("abort");
4940
4940
  params.abortSignal?.addEventListener("abort", handleAbort, { once: true });
4941
4941
  if (params.abortSignal?.aborted) {
4942
4942
  finish("abort");
@@ -5152,7 +5152,7 @@ async function resolveReactionSyntheticEvent(params) {
5152
5152
  const senderId = event.user_id?.open_id;
5153
5153
  const senderUserId = event.user_id?.user_id;
5154
5154
  if (!emoji || !messageId || !senderId) return null;
5155
- const { resolveFeishuAccount } = await import("./accounts-CXnY5H8g.js").then((n) => n.t);
5155
+ const { resolveFeishuAccount } = await import("./accounts-Bpe6CjpS.js").then((n) => n.t);
5156
5156
  const reactionNotifications = resolveFeishuAccount({
5157
5157
  cfg,
5158
5158
  accountId
@@ -1,4 +1,4 @@
1
- import { t as probeFeishu } from "./probe-DKDDBF_j.js";
1
+ import { t as probeFeishu } from "./probe-BjKRV7em.js";
2
2
  import { parseStrictPositiveInteger } from "openclaw/plugin-sdk/number-runtime";
3
3
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
4
4
  import { WEBHOOK_ANOMALY_COUNTER_DEFAULTS, WEBHOOK_RATE_LIMIT_DEFAULTS, createFixedWindowRateLimiter, createWebhookAnomalyTracker } from "openclaw/plugin-sdk/webhook-ingress";
@@ -41,8 +41,6 @@ function waitForAbortableDelay(delayMs, abortSignal) {
41
41
  if (abortSignal?.aborted) return Promise.resolve(false);
42
42
  return new Promise((resolve) => {
43
43
  let settled = false;
44
- let timer;
45
- let handleAbort;
46
44
  const finish = (value) => {
47
45
  if (settled) return;
48
46
  settled = true;
@@ -50,7 +48,7 @@ function waitForAbortableDelay(delayMs, abortSignal) {
50
48
  if (handleAbort) abortSignal?.removeEventListener("abort", handleAbort);
51
49
  resolve(value);
52
50
  };
53
- handleAbort = () => {
51
+ const handleAbort = () => {
54
52
  finish(false);
55
53
  };
56
54
  abortSignal?.addEventListener("abort", handleAbort, { once: true });
@@ -58,7 +56,7 @@ function waitForAbortableDelay(delayMs, abortSignal) {
58
56
  finish(false);
59
57
  return;
60
58
  }
61
- timer = setTimeout(() => finish(true), delayMs);
59
+ const timer = setTimeout(() => finish(true), resolveTimerTimeoutMs(delayMs, 1));
62
60
  timer.unref?.();
63
61
  });
64
62
  }
@@ -1,6 +1,6 @@
1
- import { c as createFeishuApiError, f as isRecord$1, g as requestFeishuApi, s as resolveFeishuRuntimeAccount } from "./accounts-CXnY5H8g.js";
1
+ import { c as createFeishuApiError, f as isRecord$1, g as requestFeishuApi, s as resolveFeishuRuntimeAccount } from "./accounts-Bpe6CjpS.js";
2
2
  import { i as resolveReceiveIdType, r as normalizeFeishuTarget } from "./targets-BUjQ1TcA.js";
3
- import { i as toFeishuSendResult, r as resolveFeishuReceiptKind, t as assertFeishuMessageApiSuccess } from "./send-result-DSTSkRDM.js";
3
+ import { i as toFeishuSendResult, r as resolveFeishuReceiptKind, t as assertFeishuMessageApiSuccess } from "./send-result-D9rgEUlm.js";
4
4
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
5
5
  import { r as createFeishuClient } from "./client-BhMNZBJD.js";
6
6
  import { parseStrictNonNegativeInteger } from "openclaw/plugin-sdk/number-runtime";
@@ -583,7 +583,7 @@ function extractMentionTargets(event, botOpenId) {
583
583
  return (event.message.mentions ?? []).filter((m) => {
584
584
  if (isFeishuBroadcastMention(m)) return false;
585
585
  if (botOpenId && m.id.open_id === botOpenId) return false;
586
- return !!m.id.open_id;
586
+ return Boolean(m.id.open_id);
587
587
  }).map((m) => ({
588
588
  openId: m.id.open_id,
589
589
  name: m.name,
@@ -1,4 +1,4 @@
1
- import { f as isRecord } from "./accounts-CXnY5H8g.js";
1
+ import { f as isRecord } from "./accounts-Bpe6CjpS.js";
2
2
  import { createMessageReceiptFromOutboundResults } from "openclaw/plugin-sdk/channel-outbound";
3
3
  //#region extensions/feishu/src/card-interaction.ts
4
4
  const FEISHU_CARD_INTERACTION_VERSION = "ocf1";
package/dist/setup-api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-DccLoln2.js";
1
+ import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-TXwK9jIG.js";
2
2
  export { feishuPlugin, feishuSetupAdapter, feishuSetupWizard };
@@ -5,33 +5,40 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [v1.1.1](https://github.com/ljharb/es-object-atoms/compare/v1.1.0...v1.1.1) - 2025-01-14
8
+ ## [v1.1.2](https://github.com/es-shims/es-object-atoms/compare/v1.1.1...v1.1.2) - 2026-05-22
9
9
 
10
10
  ### Commits
11
11
 
12
- - [types] `ToObject`: improve types [`cfe8c8a`](https://github.com/ljharb/es-object-atoms/commit/cfe8c8a105c44820cb22e26f62d12ef0ad9715c8)
12
+ - [Dev Deps] update `@ljharb/eslint-config`, `@ljharb/tsconfig`, `auto-changelog`, `eslint`, `npmignore` [`41e3d94`](https://github.com/es-shims/es-object-atoms/commit/41e3d94f6b49237fa490ec598e068f170c8b161e)
13
+ - [types] improve `isObject` type [`758edc2`](https://github.com/es-shims/es-object-atoms/commit/758edc2280fa6993a294a55957a43cee5951bf51)
13
14
 
14
- ## [v1.1.0](https://github.com/ljharb/es-object-atoms/compare/v1.0.1...v1.1.0) - 2025-01-14
15
+ ## [v1.1.1](https://github.com/es-shims/es-object-atoms/compare/v1.1.0...v1.1.1) - 2025-01-14
15
16
 
16
17
  ### Commits
17
18
 
18
- - [New] add `isObject` [`51e4042`](https://github.com/ljharb/es-object-atoms/commit/51e4042df722eb3165f40dc5f4bf33d0197ecb07)
19
+ - [types] `ToObject`: improve types [`cfe8c8a`](https://github.com/es-shims/es-object-atoms/commit/cfe8c8a105c44820cb22e26f62d12ef0ad9715c8)
19
20
 
20
- ## [v1.0.1](https://github.com/ljharb/es-object-atoms/compare/v1.0.0...v1.0.1) - 2025-01-13
21
+ ## [v1.1.0](https://github.com/es-shims/es-object-atoms/compare/v1.0.1...v1.1.0) - 2025-01-14
21
22
 
22
23
  ### Commits
23
24
 
24
- - [Dev Deps] update `@ljharb/eslint-config`, `@ljharb/tsconfig`, `@types/tape`, `auto-changelog`, `tape` [`38ab9eb`](https://github.com/ljharb/es-object-atoms/commit/38ab9eb00b62c2f4668644f5e513d9b414ebd595)
25
- - [types] improve types [`7d1beb8`](https://github.com/ljharb/es-object-atoms/commit/7d1beb887958b78b6a728a210a1c8370ab7e2aa1)
26
- - [Tests] replace `aud` with `npm audit` [`25863ba`](https://github.com/ljharb/es-object-atoms/commit/25863baf99178f1d1ad33d1120498db28631907e)
27
- - [Dev Deps] add missing peer dep [`c012309`](https://github.com/ljharb/es-object-atoms/commit/c0123091287e6132d6f4240496340c427433df28)
25
+ - [New] add `isObject` [`51e4042`](https://github.com/es-shims/es-object-atoms/commit/51e4042df722eb3165f40dc5f4bf33d0197ecb07)
26
+
27
+ ## [v1.0.1](https://github.com/es-shims/es-object-atoms/compare/v1.0.0...v1.0.1) - 2025-01-13
28
+
29
+ ### Commits
30
+
31
+ - [Dev Deps] update `@ljharb/eslint-config`, `@ljharb/tsconfig`, `@types/tape`, `auto-changelog`, `tape` [`38ab9eb`](https://github.com/es-shims/es-object-atoms/commit/38ab9eb00b62c2f4668644f5e513d9b414ebd595)
32
+ - [types] improve types [`7d1beb8`](https://github.com/es-shims/es-object-atoms/commit/7d1beb887958b78b6a728a210a1c8370ab7e2aa1)
33
+ - [Tests] replace `aud` with `npm audit` [`25863ba`](https://github.com/es-shims/es-object-atoms/commit/25863baf99178f1d1ad33d1120498db28631907e)
34
+ - [Dev Deps] add missing peer dep [`c012309`](https://github.com/es-shims/es-object-atoms/commit/c0123091287e6132d6f4240496340c427433df28)
28
35
 
29
36
  ## v1.0.0 - 2024-03-16
30
37
 
31
38
  ### Commits
32
39
 
33
- - Initial implementation, tests, readme, types [`f1499db`](https://github.com/ljharb/es-object-atoms/commit/f1499db7d3e1741e64979c61d645ab3137705e82)
34
- - Initial commit [`99eedc7`](https://github.com/ljharb/es-object-atoms/commit/99eedc7b5fde38a50a28d3c8b724706e3e4c5f6a)
35
- - [meta] rename repo [`fc851fa`](https://github.com/ljharb/es-object-atoms/commit/fc851fa70616d2d182aaf0bd02c2ed7084dea8fa)
36
- - npm init [`b909377`](https://github.com/ljharb/es-object-atoms/commit/b909377c50049bd0ec575562d20b0f9ebae8947f)
37
- - Only apps should have lockfiles [`7249edd`](https://github.com/ljharb/es-object-atoms/commit/7249edd2178c1b9ddfc66ffcc6d07fdf0d28efc1)
40
+ - Initial implementation, tests, readme, types [`f1499db`](https://github.com/es-shims/es-object-atoms/commit/f1499db7d3e1741e64979c61d645ab3137705e82)
41
+ - Initial commit [`99eedc7`](https://github.com/es-shims/es-object-atoms/commit/99eedc7b5fde38a50a28d3c8b724706e3e4c5f6a)
42
+ - [meta] rename repo [`fc851fa`](https://github.com/es-shims/es-object-atoms/commit/fc851fa70616d2d182aaf0bd02c2ed7084dea8fa)
43
+ - npm init [`b909377`](https://github.com/es-shims/es-object-atoms/commit/b909377c50049bd0ec575562d20b0f9ebae8947f)
44
+ - Only apps should have lockfiles [`7249edd`](https://github.com/es-shims/es-object-atoms/commit/7249edd2178c1b9ddfc66ffcc6d07fdf0d28efc1)
@@ -1,3 +1,3 @@
1
- declare function isObject(x: unknown): x is object;
1
+ declare function isObject<T>(x: T): x is T & object & Record<PropertyKey, unknown>;
2
2
 
3
3
  export = isObject;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "es-object-atoms",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "ES Object-related atoms: Object, ToObject, RequireObjectCoercible",
5
5
  "main": "index.js",
6
6
  "exports": {
@@ -46,16 +46,15 @@
46
46
  "es-errors": "^1.3.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@ljharb/eslint-config": "^21.1.1",
50
- "@ljharb/tsconfig": "^0.2.3",
49
+ "@ljharb/eslint-config": "^22.2.3",
50
+ "@ljharb/tsconfig": "^0.3.2",
51
51
  "@types/tape": "^5.8.1",
52
- "auto-changelog": "^2.5.0",
52
+ "auto-changelog": "^2.5.1",
53
53
  "eclint": "^2.8.1",
54
- "encoding": "^0.1.13",
55
- "eslint": "^8.8.0",
54
+ "eslint": "^8.57.1",
56
55
  "evalmd": "^0.0.19",
57
56
  "in-publish": "^2.0.1",
58
- "npmignore": "^0.3.1",
57
+ "npmignore": "^0.3.5",
59
58
  "nyc": "^10.3.2",
60
59
  "safe-publish-latest": "^2.0.0",
61
60
  "tape": "^5.9.0",
@@ -2,5 +2,6 @@
2
2
  "extends": "@ljharb/tsconfig",
3
3
  "compilerOptions": {
4
4
  "target": "es5",
5
+ "ignoreDeprecations": "6.0",
5
6
  },
6
7
  }
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [v2.0.4](https://github.com/inspect-js/hasOwn/compare/v2.0.3...v2.0.4) - 2026-05-28
9
+
10
+ ### Commits
11
+
12
+ - [types] drop the dead key-narrowing overload [`fdab00e`](https://github.com/inspect-js/hasOwn/commit/fdab00e2703e65411424e19bf86a7e72a8f10da9)
13
+ - [Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `eslint` [`91f6247`](https://github.com/inspect-js/hasOwn/commit/91f624768dd0f7db0d019b89d4d86bd66e20ec30)
14
+
8
15
  ## [v2.0.3](https://github.com/inspect-js/hasOwn/compare/v2.0.2...v2.0.3) - 2026-04-17
9
16
 
10
17
  ### Commits
@@ -1,4 +1,3 @@
1
- declare function hasOwn<O, K extends PropertyKey>(o: O, p: K): p is K & keyof O;
2
1
  declare function hasOwn<O, K extends PropertyKey, V = unknown>(o: O, p: K): o is O & Record<K, V>;
3
2
 
4
3
  export = hasOwn;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hasown",
3
- "version": "2.0.3",
3
+ "version": "2.0.4",
4
4
  "description": "A robust, ES3 compatible, \"has own property\" predicate.",
5
5
  "main": "index.js",
6
6
  "exports": {
@@ -52,13 +52,12 @@
52
52
  },
53
53
  "devDependencies": {
54
54
  "@arethetypeswrong/cli": "^0.18.2",
55
- "@ljharb/eslint-config": "^22.2.2",
55
+ "@ljharb/eslint-config": "^22.2.3",
56
56
  "@ljharb/tsconfig": "^0.3.2",
57
57
  "@types/function-bind": "^1.1.10",
58
58
  "@types/tape": "^5.8.1",
59
- "auto-changelog": "^2.5.0",
60
- "encoding": "^0.1.13",
61
- "eslint": "^10.2.0",
59
+ "auto-changelog": "^2.5.1",
60
+ "eslint": "^10.4.0",
62
61
  "evalmd": "^0.0.19",
63
62
  "in-publish": "^2.0.1",
64
63
  "jiti": "^0.0.0",
@@ -164,10 +164,13 @@ export type TExtendsMapping<Input extends [unknown, unknown, unknown, unknown, u
164
164
  export declare function ExtendsMapping(input: [unknown, unknown, unknown, unknown, unknown, unknown] | []): unknown;
165
165
  export type TBaseMapping<Input extends [unknown, unknown, unknown] | unknown> = (Input extends ['(', infer Type extends T.TSchema, ')'] ? Type : Input extends infer Type extends T.TSchema ? Type : never);
166
166
  export declare function BaseMapping(input: [unknown, unknown, unknown] | unknown): unknown;
167
+ export type TWithMapping<Input extends [unknown, unknown] | []> = (Input extends ['with', infer Options extends Record<PropertyKey, unknown>] ? Options : []);
168
+ export declare function WithMapping(input: [unknown, unknown] | []): unknown;
167
169
  type TFactorIndexArray<Type extends T.TSchema, IndexArray extends unknown[]> = (IndexArray extends [infer Left extends T.TSchema[], ...infer Right extends unknown[]] ? (Left extends [infer Indexer extends T.TSchema] ? TFactorIndexArray<C.TIndexDeferred<Type, Indexer>, Right> : Left extends [] ? TFactorIndexArray<T.TArray<Type>, Right> : T.TNever) : Type);
168
170
  type TFactorExtends<Type extends T.TSchema, Extends extends unknown[]> = (Extends extends [infer Right extends T.TSchema, infer True extends T.TSchema, infer False extends T.TSchema] ? C.TConditionalDeferred<Type, Right, True, False> : Type);
169
- export type TFactorMapping<Input extends [unknown, unknown, unknown, unknown]> = (Input extends [infer KeyOf extends boolean, infer Type extends T.TSchema, infer IndexArray extends unknown[], infer Extend extends unknown[]] ? KeyOf extends true ? TFactorExtends<C.TKeyOfDeferred<TFactorIndexArray<Type, IndexArray>>, Extend> : TFactorExtends<TFactorIndexArray<Type, IndexArray>, Extend> : never);
170
- export declare function FactorMapping(input: [unknown, unknown, unknown, unknown]): unknown;
171
+ type TFactorWith<Type extends T.TSchema, With extends unknown> = (With extends Record<PropertyKey, unknown> ? C.TOptionsDeferred<Type, With> : Type);
172
+ export type TFactorMapping<Input extends [unknown, unknown, unknown, unknown, unknown]> = (Input extends [infer KeyOf extends boolean, infer Type extends T.TSchema, infer IndexArray extends unknown[], infer Extend extends unknown[], infer WithClause extends unknown] ? TFactorWith<KeyOf extends true ? TFactorExtends<C.TKeyOfDeferred<TFactorIndexArray<Type, IndexArray>>, Extend> : TFactorExtends<TFactorIndexArray<Type, IndexArray>, Extend>, WithClause> : never);
173
+ export declare function FactorMapping(input: [unknown, unknown, unknown, unknown, unknown]): unknown;
171
174
  type TExprBinaryMapping<Left extends T.TSchema, Rest extends unknown[]> = (Rest extends [infer Operator extends unknown, infer Right extends T.TSchema, infer Next extends unknown[]] ? (TExprBinaryMapping<Right, Next> extends infer Schema extends T.TSchema ? (Operator extends '&' ? (Schema extends T.TIntersect<infer Types extends T.TSchema[]> ? T.TIntersect<[Left, ...Types]> : T.TIntersect<[Left, Schema]>) : Operator extends '|' ? (Schema extends T.TUnion<infer Types extends T.TSchema[]> ? T.TUnion<[Left, ...Types]> : T.TUnion<[Left, Schema]>) : never) : never) : Left);
172
175
  export type TExprTermTailMapping<Input extends [unknown, unknown, unknown] | []> = (Input);
173
176
  export declare function ExprTermTailMapping(input: [unknown, unknown, unknown] | []): unknown;
@@ -185,27 +185,34 @@ export function BaseMapping(input) {
185
185
  ? input[1]
186
186
  : input;
187
187
  }
188
+ export function WithMapping(input) {
189
+ return Guard.IsEqual(input.length, 2) ? input[1] : [];
190
+ }
188
191
  // deno-coverage-ignore-start
189
- // ...
190
- const FactorIndexArray = (Type, indexArray) => {
192
+ function FactorIndexArray(Type, indexArray) {
191
193
  return indexArray.reduce((result, left) => {
192
194
  const _left = left;
193
195
  return (Guard.IsEqual(_left.length, 1) ? C.IndexDeferred(result, _left[0]) :
194
196
  Guard.IsEqual(_left.length, 0) ? T.Array(result) :
195
197
  Unreachable());
196
198
  }, Type);
197
- };
199
+ }
198
200
  // deno-coverage-ignore-stop
199
- const FactorExtends = (type, extend) => {
201
+ function FactorExtends(type, extend) {
200
202
  return Guard.IsEqual(extend.length, 3)
201
203
  ? C.ConditionalDeferred(type, extend[0], extend[1], extend[2])
202
204
  : type;
203
- };
205
+ }
206
+ function FactorWith(type, withClause) {
207
+ return Guard.IsArray(withClause) && Guard.IsEqual(withClause.length, 0)
208
+ ? type
209
+ : C.OptionsDeferred(type, withClause);
210
+ }
204
211
  export function FactorMapping(input) {
205
- const [keyOf, type, indexArray, extend] = input;
206
- return keyOf
212
+ const [keyOf, type, indexArray, extend, withClause] = input;
213
+ return FactorWith(keyOf
207
214
  ? FactorExtends(C.KeyOfDeferred(FactorIndexArray(type, indexArray)), extend)
208
- : FactorExtends(FactorIndexArray(type, indexArray), extend);
215
+ : FactorExtends(FactorIndexArray(type, indexArray), extend), withClause);
209
216
  }
210
217
  // deno-coverage-ignore-start
211
218
  function ExprBinaryMapping(left, rest) {
@@ -43,7 +43,8 @@ export type TIndexArray_0<Input extends string, Result extends unknown[] = []> =
43
43
  export type TIndexArray<Input extends string> = TIndexArray_0<Input> extends [infer _0 extends ([unknown, unknown, unknown] | [unknown, unknown])[], infer Input extends string] ? [S.TIndexArrayMapping<_0>, Input] : [];
44
44
  export type TExtends<Input extends string> = ((Token.TConst<'extends', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<'?', Input> extends [infer _2, infer Input extends string] ? (TType<Input> extends [infer _3, infer Input extends string] ? (Token.TConst<':', Input> extends [infer _4, infer Input extends string] ? (TType<Input> extends [infer _5, infer Input extends string] ? [[_0, _1, _2, _3, _4, _5], Input] : []) : []) : []) : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown, unknown, unknown, unknown] | [], infer Input extends string] ? [S.TExtendsMapping<_0>, Input] : [];
45
45
  export type TBase<Input extends string> = ((Token.TConst<'(', Input> extends [infer _0, infer Input extends string] ? (TType<Input> extends [infer _1, infer Input extends string] ? (Token.TConst<')', Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : TKeyword<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : T_Object_<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TTuple<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TTemplateLiteral<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TLiteral<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TConstructor<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : T_Function_<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TMapped<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TOptions<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TGenericCall<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : TReference<Input> extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown] | unknown, infer Input extends string] ? [S.TBaseMapping<_0>, Input] : [];
46
- export type TFactor<Input extends string> = (TKeyOf<Input> extends [infer _0, infer Input extends string] ? (TBase<Input> extends [infer _1, infer Input extends string] ? (TIndexArray<Input> extends [infer _2, infer Input extends string] ? (TExtends<Input> extends [infer _3, infer Input extends string] ? [[_0, _1, _2, _3], Input] : []) : []) : []) : []) extends [infer _0 extends [unknown, unknown, unknown, unknown], infer Input extends string] ? [S.TFactorMapping<_0>, Input] : [];
46
+ export type TWith<Input extends string> = ((Token.TConst<'with', Input> extends [infer _0, infer Input extends string] ? (TJsonObject<Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown] | [], infer Input extends string] ? [S.TWithMapping<_0>, Input] : [];
47
+ export type TFactor<Input extends string> = (TKeyOf<Input> extends [infer _0, infer Input extends string] ? (TBase<Input> extends [infer _1, infer Input extends string] ? (TIndexArray<Input> extends [infer _2, infer Input extends string] ? (TExtends<Input> extends [infer _3, infer Input extends string] ? (TWith<Input> extends [infer _4, infer Input extends string] ? [[_0, _1, _2, _3, _4], Input] : []) : []) : []) : []) : []) extends [infer _0 extends [unknown, unknown, unknown, unknown, unknown], infer Input extends string] ? [S.TFactorMapping<_0>, Input] : [];
47
48
  export type TExprTermTail<Input extends string> = ((Token.TConst<'&', Input> extends [infer _0, infer Input extends string] ? (TFactor<Input> extends [infer _1, infer Input extends string] ? (TExprTermTail<Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown] | [], infer Input extends string] ? [S.TExprTermTailMapping<_0>, Input] : [];
48
49
  export type TExprTerm<Input extends string> = (TFactor<Input> extends [infer _0, infer Input extends string] ? (TExprTermTail<Input> extends [infer _1, infer Input extends string] ? [[_0, _1], Input] : []) : []) extends [infer _0 extends [unknown, unknown], infer Input extends string] ? [S.TExprTermMapping<_0>, Input] : [];
49
50
  export type TExprTail<Input extends string> = ((Token.TConst<'|', Input> extends [infer _0, infer Input extends string] ? (TExprTerm<Input> extends [infer _1, infer Input extends string] ? (TExprTail<Input> extends [infer _2, infer Input extends string] ? [[_0, _1, _2], Input] : []) : []) : []) extends [infer _0, infer Input extends string] ? [_0, Input] : [[], Input] extends [infer _0, infer Input extends string] ? [_0, Input] : []) extends [infer _0 extends [unknown, unknown, unknown] | [], infer Input extends string] ? [S.TExprTailMapping<_0>, Input] : [];
@@ -172,6 +173,7 @@ export declare const IndexArray_0: (input: string, result?: unknown[]) => [unkno
172
173
  export declare const IndexArray: (input: string) => [unknown, string] | [];
173
174
  export declare const Extends: (input: string) => [unknown, string] | [];
174
175
  export declare const Base: (input: string) => [unknown, string] | [];
176
+ export declare const With: (input: string) => [unknown, string] | [];
175
177
  export declare const Factor: (input: string) => [unknown, string] | [];
176
178
  export declare const ExprTermTail: (input: string) => [unknown, string] | [];
177
179
  export declare const ExprTerm: (input: string) => [unknown, string] | [];
@@ -47,7 +47,8 @@ export const IndexArray_0 = (input, result = []) => If(If(If(Token.Const('[', in
47
47
  export const IndexArray = (input) => If(IndexArray_0(input), ([_0, input]) => [S.IndexArrayMapping(_0), input]);
48
48
  export const Extends = (input) => If(If(If(Token.Const('extends', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const('?', input), ([_2, input]) => If(Type(input), ([_3, input]) => If(Token.Const(':', input), ([_4, input]) => If(Type(input), ([_5, input]) => [[_0, _1, _2, _3, _4, _5], input])))))), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.ExtendsMapping(_0), input]);
49
49
  export const Base = (input) => If(If(If(Token.Const('(', input), ([_0, input]) => If(Type(input), ([_1, input]) => If(Token.Const(')', input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If(Keyword(input), ([_0, input]) => [_0, input], () => If(_Object_(input), ([_0, input]) => [_0, input], () => If(Tuple(input), ([_0, input]) => [_0, input], () => If(TemplateLiteral(input), ([_0, input]) => [_0, input], () => If(Literal(input), ([_0, input]) => [_0, input], () => If(Constructor(input), ([_0, input]) => [_0, input], () => If(_Function_(input), ([_0, input]) => [_0, input], () => If(Mapped(input), ([_0, input]) => [_0, input], () => If(Options(input), ([_0, input]) => [_0, input], () => If(GenericCall(input), ([_0, input]) => [_0, input], () => If(Reference(input), ([_0, input]) => [_0, input], () => [])))))))))))), ([_0, input]) => [S.BaseMapping(_0), input]);
50
- export const Factor = (input) => If(If(KeyOf(input), ([_0, input]) => If(Base(input), ([_1, input]) => If(IndexArray(input), ([_2, input]) => If(Extends(input), ([_3, input]) => [[_0, _1, _2, _3], input])))), ([_0, input]) => [S.FactorMapping(_0), input]);
50
+ export const With = (input) => If(If(If(Token.Const('with', input), ([_0, input]) => If(JsonObject(input), ([_1, input]) => [[_0, _1], input])), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.WithMapping(_0), input]);
51
+ export const Factor = (input) => If(If(KeyOf(input), ([_0, input]) => If(Base(input), ([_1, input]) => If(IndexArray(input), ([_2, input]) => If(Extends(input), ([_3, input]) => If(With(input), ([_4, input]) => [[_0, _1, _2, _3, _4], input]))))), ([_0, input]) => [S.FactorMapping(_0), input]);
51
52
  export const ExprTermTail = (input) => If(If(If(Token.Const('&', input), ([_0, input]) => If(Factor(input), ([_1, input]) => If(ExprTermTail(input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.ExprTermTailMapping(_0), input]);
52
53
  export const ExprTerm = (input) => If(If(Factor(input), ([_0, input]) => If(ExprTermTail(input), ([_1, input]) => [[_0, _1], input])), ([_0, input]) => [S.ExprTermMapping(_0), input]);
53
54
  export const ExprTail = (input) => If(If(If(Token.Const('|', input), ([_0, input]) => If(ExprTerm(input), ([_1, input]) => If(ExprTail(input), ([_2, input]) => [[_0, _1, _2], input]))), ([_0, input]) => [_0, input], () => If([[], input], ([_0, input]) => [_0, input], () => [])), ([_0, input]) => [S.ExprTailMapping(_0), input]);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "typebox",
3
3
  "description": "Json Schema Type Builder with Static Type Resolution for TypeScript",
4
- "version": "1.1.38",
4
+ "version": "1.1.39",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
@@ -16,22 +16,6 @@
16
16
  "types": "./build/index.d.mts",
17
17
  "module": "./build/index.mjs",
18
18
  "exports": {
19
- "./guard": {
20
- "import": "./build/guard/index.mjs",
21
- "default": "./build/guard/index.mjs"
22
- },
23
- "./error": {
24
- "import": "./build/error/index.mjs",
25
- "default": "./build/error/index.mjs"
26
- },
27
- "./compile": {
28
- "import": "./build/compile/index.mjs",
29
- "default": "./build/compile/index.mjs"
30
- },
31
- "./system": {
32
- "import": "./build/system/index.mjs",
33
- "default": "./build/system/index.mjs"
34
- },
35
19
  "./format": {
36
20
  "import": "./build/format/index.mjs",
37
21
  "default": "./build/format/index.mjs"
@@ -44,10 +28,26 @@
44
28
  "import": "./build/schema/index.mjs",
45
29
  "default": "./build/schema/index.mjs"
46
30
  },
31
+ "./compile": {
32
+ "import": "./build/compile/index.mjs",
33
+ "default": "./build/compile/index.mjs"
34
+ },
47
35
  "./value": {
48
36
  "import": "./build/value/index.mjs",
49
37
  "default": "./build/value/index.mjs"
50
38
  },
39
+ "./guard": {
40
+ "import": "./build/guard/index.mjs",
41
+ "default": "./build/guard/index.mjs"
42
+ },
43
+ "./system": {
44
+ "import": "./build/system/index.mjs",
45
+ "default": "./build/system/index.mjs"
46
+ },
47
+ "./error": {
48
+ "import": "./build/error/index.mjs",
49
+ "default": "./build/error/index.mjs"
50
+ },
51
51
  ".": {
52
52
  "import": "./build/index.mjs",
53
53
  "default": "./build/index.mjs"
@@ -55,18 +55,6 @@
55
55
  },
56
56
  "typesVersions": {
57
57
  "*": {
58
- "guard": [
59
- "./build/guard/index.d.mts"
60
- ],
61
- "error": [
62
- "./build/error/index.d.mts"
63
- ],
64
- "compile": [
65
- "./build/compile/index.d.mts"
66
- ],
67
- "system": [
68
- "./build/system/index.d.mts"
69
- ],
70
58
  "format": [
71
59
  "./build/format/index.d.mts"
72
60
  ],
@@ -76,9 +64,21 @@
76
64
  "schema": [
77
65
  "./build/schema/index.d.mts"
78
66
  ],
67
+ "compile": [
68
+ "./build/compile/index.d.mts"
69
+ ],
79
70
  "value": [
80
71
  "./build/value/index.d.mts"
81
72
  ],
73
+ "guard": [
74
+ "./build/guard/index.d.mts"
75
+ ],
76
+ "system": [
77
+ "./build/system/index.d.mts"
78
+ ],
79
+ "error": [
80
+ "./build/error/index.d.mts"
81
+ ],
82
82
  ".": [
83
83
  "./build/index.d.mts"
84
84
  ]
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@openclaw/feishu",
3
- "version": "2026.5.30-beta.1",
3
+ "version": "2026.5.31-beta.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@openclaw/feishu",
9
- "version": "2026.5.30-beta.1",
9
+ "version": "2026.5.31-beta.2",
10
10
  "dependencies": {
11
11
  "@larksuiteoapi/node-sdk": "1.66.0",
12
- "typebox": "1.1.38",
12
+ "typebox": "1.1.39",
13
13
  "zod": "4.4.3"
14
14
  },
15
15
  "peerDependencies": {
16
- "openclaw": ">=2026.5.30-beta.1"
16
+ "openclaw": ">=2026.5.31-beta.2"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
19
  "openclaw": {
@@ -136,9 +136,9 @@
136
136
  }
137
137
  },
138
138
  "node_modules/es-object-atoms": {
139
- "version": "1.1.1",
140
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
141
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
139
+ "version": "1.1.2",
140
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
141
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
142
142
  "license": "MIT",
143
143
  "dependencies": {
144
144
  "es-errors": "^1.3.0"
@@ -293,9 +293,9 @@
293
293
  }
294
294
  },
295
295
  "node_modules/hasown": {
296
- "version": "2.0.3",
297
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
298
- "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
296
+ "version": "2.0.4",
297
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
298
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
299
299
  "license": "MIT",
300
300
  "dependencies": {
301
301
  "function-bind": "^1.1.2"
@@ -500,9 +500,9 @@
500
500
  }
501
501
  },
502
502
  "node_modules/typebox": {
503
- "version": "1.1.38",
504
- "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.38.tgz",
505
- "integrity": "sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==",
503
+ "version": "1.1.39",
504
+ "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.1.39.tgz",
505
+ "integrity": "sha512-vj0afVtOfLQvv0GR0VxVagYxsXN64btL7Z9XoaG0ZggH3mruMMkOO6hXdgMsjCY3shZgEvooAWVeznQVs5c43w==",
506
506
  "license": "MIT"
507
507
  },
508
508
  "node_modules/ws": {
@@ -35,6 +35,14 @@
35
35
  "appId",
36
36
  "appSecret"
37
37
  ]
38
+ },
39
+ {
40
+ "rootPath": "channels.feishu",
41
+ "overlayMapPath": "accounts",
42
+ "required": [
43
+ "appId",
44
+ "appSecret"
45
+ ]
38
46
  }
39
47
  ]
40
48
  },
@@ -46,6 +54,14 @@
46
54
  "appId",
47
55
  "appSecret"
48
56
  ]
57
+ },
58
+ {
59
+ "rootPath": "channels.feishu",
60
+ "overlayMapPath": "accounts",
61
+ "required": [
62
+ "appId",
63
+ "appSecret"
64
+ ]
49
65
  }
50
66
  ]
51
67
  },
@@ -57,6 +73,14 @@
57
73
  "appId",
58
74
  "appSecret"
59
75
  ]
76
+ },
77
+ {
78
+ "rootPath": "channels.feishu",
79
+ "overlayMapPath": "accounts",
80
+ "required": [
81
+ "appId",
82
+ "appSecret"
83
+ ]
60
84
  }
61
85
  ]
62
86
  },
@@ -68,6 +92,14 @@
68
92
  "appId",
69
93
  "appSecret"
70
94
  ]
95
+ },
96
+ {
97
+ "rootPath": "channels.feishu",
98
+ "overlayMapPath": "accounts",
99
+ "required": [
100
+ "appId",
101
+ "appSecret"
102
+ ]
71
103
  }
72
104
  ]
73
105
  },
@@ -79,6 +111,14 @@
79
111
  "appId",
80
112
  "appSecret"
81
113
  ]
114
+ },
115
+ {
116
+ "rootPath": "channels.feishu",
117
+ "overlayMapPath": "accounts",
118
+ "required": [
119
+ "appId",
120
+ "appSecret"
121
+ ]
82
122
  }
83
123
  ]
84
124
  },
@@ -90,6 +130,14 @@
90
130
  "appId",
91
131
  "appSecret"
92
132
  ]
133
+ },
134
+ {
135
+ "rootPath": "channels.feishu",
136
+ "overlayMapPath": "accounts",
137
+ "required": [
138
+ "appId",
139
+ "appSecret"
140
+ ]
93
141
  }
94
142
  ]
95
143
  },
@@ -101,6 +149,14 @@
101
149
  "appId",
102
150
  "appSecret"
103
151
  ]
152
+ },
153
+ {
154
+ "rootPath": "channels.feishu",
155
+ "overlayMapPath": "accounts",
156
+ "required": [
157
+ "appId",
158
+ "appSecret"
159
+ ]
104
160
  }
105
161
  ]
106
162
  },
@@ -112,6 +168,14 @@
112
168
  "appId",
113
169
  "appSecret"
114
170
  ]
171
+ },
172
+ {
173
+ "rootPath": "channels.feishu",
174
+ "overlayMapPath": "accounts",
175
+ "required": [
176
+ "appId",
177
+ "appSecret"
178
+ ]
115
179
  }
116
180
  ]
117
181
  },
@@ -123,6 +187,14 @@
123
187
  "appId",
124
188
  "appSecret"
125
189
  ]
190
+ },
191
+ {
192
+ "rootPath": "channels.feishu",
193
+ "overlayMapPath": "accounts",
194
+ "required": [
195
+ "appId",
196
+ "appSecret"
197
+ ]
126
198
  }
127
199
  ]
128
200
  },
@@ -134,6 +206,14 @@
134
206
  "appId",
135
207
  "appSecret"
136
208
  ]
209
+ },
210
+ {
211
+ "rootPath": "channels.feishu",
212
+ "overlayMapPath": "accounts",
213
+ "required": [
214
+ "appId",
215
+ "appSecret"
216
+ ]
137
217
  }
138
218
  ]
139
219
  },
@@ -145,6 +225,14 @@
145
225
  "appId",
146
226
  "appSecret"
147
227
  ]
228
+ },
229
+ {
230
+ "rootPath": "channels.feishu",
231
+ "overlayMapPath": "accounts",
232
+ "required": [
233
+ "appId",
234
+ "appSecret"
235
+ ]
148
236
  }
149
237
  ]
150
238
  },
@@ -156,6 +244,14 @@
156
244
  "appId",
157
245
  "appSecret"
158
246
  ]
247
+ },
248
+ {
249
+ "rootPath": "channels.feishu",
250
+ "overlayMapPath": "accounts",
251
+ "required": [
252
+ "appId",
253
+ "appSecret"
254
+ ]
159
255
  }
160
256
  ]
161
257
  },
@@ -167,6 +263,14 @@
167
263
  "appId",
168
264
  "appSecret"
169
265
  ]
266
+ },
267
+ {
268
+ "rootPath": "channels.feishu",
269
+ "overlayMapPath": "accounts",
270
+ "required": [
271
+ "appId",
272
+ "appSecret"
273
+ ]
170
274
  }
171
275
  ]
172
276
  },
@@ -178,6 +282,14 @@
178
282
  "appId",
179
283
  "appSecret"
180
284
  ]
285
+ },
286
+ {
287
+ "rootPath": "channels.feishu",
288
+ "overlayMapPath": "accounts",
289
+ "required": [
290
+ "appId",
291
+ "appSecret"
292
+ ]
181
293
  }
182
294
  ]
183
295
  }
@@ -960,6 +1072,12 @@
960
1072
  },
961
1073
  "scopes": {
962
1074
  "type": "boolean"
1075
+ },
1076
+ "bitable": {
1077
+ "type": "boolean"
1078
+ },
1079
+ "base": {
1080
+ "type": "boolean"
963
1081
  }
964
1082
  },
965
1083
  "additionalProperties": false
@@ -1693,6 +1811,12 @@
1693
1811
  },
1694
1812
  "scopes": {
1695
1813
  "type": "boolean"
1814
+ },
1815
+ "bitable": {
1816
+ "type": "boolean"
1817
+ },
1818
+ "base": {
1819
+ "type": "boolean"
1696
1820
  }
1697
1821
  },
1698
1822
  "additionalProperties": false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/feishu",
3
- "version": "2026.5.30-beta.1",
3
+ "version": "2026.5.31-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",
@@ -9,11 +9,11 @@
9
9
  "type": "module",
10
10
  "dependencies": {
11
11
  "@larksuiteoapi/node-sdk": "1.66.0",
12
- "typebox": "1.1.38",
12
+ "typebox": "1.1.39",
13
13
  "zod": "4.4.3"
14
14
  },
15
15
  "peerDependencies": {
16
- "openclaw": ">=2026.5.30-beta.1"
16
+ "openclaw": ">=2026.5.31-beta.2"
17
17
  },
18
18
  "peerDependenciesMeta": {
19
19
  "openclaw": {
@@ -47,10 +47,10 @@
47
47
  "minHostVersion": ">=2026.5.29"
48
48
  },
49
49
  "compat": {
50
- "pluginApi": ">=2026.5.30-beta.1"
50
+ "pluginApi": ">=2026.5.31-beta.2"
51
51
  },
52
52
  "build": {
53
- "openclawVersion": "2026.5.30-beta.1"
53
+ "openclawVersion": "2026.5.31-beta.2"
54
54
  },
55
55
  "release": {
56
56
  "publishToClawHub": true,
@@ -65,6 +65,7 @@
65
65
  "dist/**",
66
66
  "openclaw.plugin.json",
67
67
  "npm-shrinkwrap.json",
68
+ "README.md",
68
69
  "skills/**"
69
70
  ],
70
71
  "bundledDependencies": [