@openclaw/feishu 2026.9.1 → 2026.9.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 (27) hide show
  1. package/dist/{accounts-RwSyseKr.js → accounts-cCMNFBKg.js} +1 -1
  2. package/dist/api.js +14 -12
  3. package/dist/{channel-DSYCNah8.js → channel-VytDDz_B.js} +9 -6
  4. package/dist/channel-plugin-api.js +1 -1
  5. package/dist/{channel.runtime-EfDl2Q8q.js → channel.runtime-CAD74kBO.js} +4 -4
  6. package/dist/{chat-CxXaPTuO.js → chat-DDhIcPQy.js} +1 -1
  7. package/dist/doctor-contract-api.js +1 -1
  8. package/dist/{doctor-contract-CQAuBotF.js → doctor-contract-w6FpMypv.js} +1 -1
  9. package/dist/{monitor-DoMmOfaD.js → monitor-rPJ_Mz4M.js} +2 -2
  10. package/dist/{monitor.account-WFdlCDhR.js → monitor.account-v0XIDyfs.js} +13 -10
  11. package/dist/{reply-delivery-result-CEFTDA3f.js → reply-delivery-result-CYaKkbUN.js} +2 -2
  12. package/dist/setup-api.js +1 -1
  13. package/node_modules/typebox/build/format/json_pointer.d.mts +2 -2
  14. package/node_modules/typebox/build/format/json_pointer.mjs +2 -2
  15. package/node_modules/typebox/build/format/json_pointer_uri_fragment.d.mts +2 -2
  16. package/node_modules/typebox/build/format/json_pointer_uri_fragment.mjs +2 -2
  17. package/node_modules/typebox/build/format/relative_json_pointer.d.mts +2 -2
  18. package/node_modules/typebox/build/format/relative_json_pointer.mjs +2 -2
  19. package/node_modules/typebox/build/system/memory/assign.mjs +2 -1
  20. package/node_modules/typebox/build/system/memory/create.mjs +3 -4
  21. package/node_modules/typebox/build/system/memory/discard.mjs +2 -2
  22. package/node_modules/typebox/build/system/memory/freeze.d.mts +4 -0
  23. package/node_modules/typebox/build/system/memory/freeze.mjs +6 -0
  24. package/node_modules/typebox/build/system/memory/update.mjs +3 -2
  25. package/node_modules/typebox/package.json +1 -1
  26. package/openclaw.plugin.json +2 -2
  27. package/package.json +5 -5
@@ -66,7 +66,7 @@ function resolveFeishuBaseCredentials(cfg, mode, rootConfig) {
66
66
  return {
67
67
  appId,
68
68
  appSecret,
69
- domain: cfg?.domain ?? "feishu"
69
+ domain: cfg?.domain?.replace(/^https:/i, "https:") ?? "feishu"
70
70
  };
71
71
  }
72
72
  function resolveFeishuEventSecrets(cfg, mode, rootConfig) {
package/dist/api.js CHANGED
@@ -1,9 +1,9 @@
1
- import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-DSYCNah8.js";
2
- import { G as createFeishuToolClient, H as feishuExternalToolResult, K as resolveAnyEnabledFeishuToolsConfig, U as toolExecutionErrorResult, V as registerFeishuDriveTools, W as unknownToolActionResult, lt as parseFeishuMarkdown, ot as chunkFeishuMarkdown, q as resolveFeishuToolAccount } from "./reply-delivery-result-CEFTDA3f.js";
1
+ import { a as setFeishuNamedAccountEnabled, i as feishuSetupAdapter, n as feishuSetupWizard, r as runFeishuLogin, t as feishuPlugin } from "./channel-VytDDz_B.js";
2
+ import { G as createFeishuToolClient, H as feishuExternalToolResult, K as resolveAnyEnabledFeishuToolsConfig, U as toolExecutionErrorResult, V as registerFeishuDriveTools, W as unknownToolActionResult, lt as parseFeishuMarkdown, ot as chunkFeishuMarkdown, q as resolveFeishuToolAccount } from "./reply-delivery-result-CYaKkbUN.js";
3
3
  import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-VYgGQ-GX.js";
4
4
  import { s as resolveConfiguredHttpTimeoutMs } from "./client-DMbIL3UH.js";
5
5
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
6
- import { o as registerFeishuChatTools } from "./chat-CxXaPTuO.js";
6
+ import { o as registerFeishuChatTools } from "./chat-DDhIcPQy.js";
7
7
  import { n as getFeishuThreadBindingManager, t as createFeishuThreadBindingManager } from "./thread-bindings-BiL1wGqK.js";
8
8
  import { n as handleFeishuSubagentEnded, t as handleFeishuSubagentDeliveryTarget } from "./subagent-hooks-Buadpie_.js";
9
9
  import { optionalPositiveIntegerSchema } from "openclaw/plugin-sdk/channel-actions";
@@ -2277,7 +2277,7 @@ async function createApp(client, name, folderToken, logger) {
2277
2277
  url: res.data?.app?.url,
2278
2278
  cleaned_placeholder_rows: cleanedRows,
2279
2279
  cleaned_default_fields: cleanedFields,
2280
- hint: tableId ? `Table created. Use app_token="${appToken}" and table_id="${tableId}" for other bitable tools.` : "Table created. Use feishu_bitable_get_meta to get table_id and field details."
2280
+ hint: tableId ? `Table created. Use app_token="${appToken}" and table_id="${tableId}" for other bitable tools.` : "Application created, but table metadata was not retrieved. Inspect the existing application using the returned app_token or URL; do not create it again."
2281
2281
  };
2282
2282
  }
2283
2283
  async function createField(client, appToken, tableId, fieldName, fieldType, property) {
@@ -2321,13 +2321,15 @@ async function updateRecord(client, appToken, tableId, recordId, fields) {
2321
2321
  });
2322
2322
  return { record: res.data?.record };
2323
2323
  }
2324
+ const BITABLE_APP_TOKEN_DESCRIPTION = "Bitable application token (the /base/ URL identifier, or app_token from metadata). Not the node token in a /wiki/ URL.";
2325
+ const BITABLE_RECORD_FIELDS_DESCRIPTION = "Field values keyed by field name. Format by type: Text='string', Number=123, SingleSelect='Option', MultiSelect=['A','B'], DateTime=timestamp_ms, User=[{id:'ou_xxx'}], URL={text:'Display',link:'https://...'}";
2324
2326
  const GetMetaSchema = Type.Object({ url: Type.String({ description: "Bitable URL. Supports both formats: /base/XXX?table=YYY or /wiki/XXX?table=YYY" }) });
2325
2327
  const ListFieldsSchema = Type.Object({
2326
- app_token: Type.String({ description: "Bitable app token (use feishu_bitable_get_meta to get from URL)" }),
2328
+ app_token: Type.String({ description: BITABLE_APP_TOKEN_DESCRIPTION }),
2327
2329
  table_id: Type.String({ description: "Table ID (from URL: ?table=YYY)" })
2328
2330
  });
2329
2331
  const ListRecordsSchema = Type.Object({
2330
- app_token: Type.String({ description: "Bitable app token (use feishu_bitable_get_meta to get from URL)" }),
2332
+ app_token: Type.String({ description: BITABLE_APP_TOKEN_DESCRIPTION }),
2331
2333
  table_id: Type.String({ description: "Table ID (from URL: ?table=YYY)" }),
2332
2334
  page_size: optionalPositiveIntegerSchema({
2333
2335
  description: "Number of records per page (1-500, default 100)",
@@ -2336,7 +2338,7 @@ const ListRecordsSchema = Type.Object({
2336
2338
  page_token: Type.Optional(Type.String({ description: "Pagination token from previous response" }))
2337
2339
  });
2338
2340
  const GetRecordSchema = Type.Object({
2339
- app_token: Type.String({ description: "Bitable app token (use feishu_bitable_get_meta to get from URL)" }),
2341
+ app_token: Type.String({ description: BITABLE_APP_TOKEN_DESCRIPTION }),
2340
2342
  table_id: Type.String({ description: "Table ID (from URL: ?table=YYY)" }),
2341
2343
  record_id: Type.String({ description: "Record ID to retrieve" })
2342
2344
  });
@@ -2349,16 +2351,16 @@ const BitableFieldValueSchema = Type.Unsafe({ type: [
2349
2351
  "null"
2350
2352
  ] });
2351
2353
  const CreateRecordSchema = Type.Object({
2352
- app_token: Type.String({ description: "Bitable app token (use feishu_bitable_get_meta to get from URL)" }),
2354
+ app_token: Type.String({ description: BITABLE_APP_TOKEN_DESCRIPTION }),
2353
2355
  table_id: Type.String({ description: "Table ID (from URL: ?table=YYY)" }),
2354
- fields: Type.Record(Type.String(), BitableFieldValueSchema, { description: "Field values keyed by field name. Format by type: Text='string', Number=123, SingleSelect='Option', MultiSelect=['A','B'], DateTime=timestamp_ms, User=[{id:'ou_xxx'}], URL={text:'Display',link:'https://...'}" })
2356
+ fields: Type.Record(Type.String(), BitableFieldValueSchema, { description: BITABLE_RECORD_FIELDS_DESCRIPTION })
2355
2357
  });
2356
2358
  const CreateAppSchema = Type.Object({
2357
2359
  name: Type.String({ description: "Name for the new Bitable application" }),
2358
2360
  folder_token: Type.Optional(Type.String({ description: "Optional folder token to place the Bitable in a specific folder" }))
2359
2361
  });
2360
2362
  const CreateFieldSchema = Type.Object({
2361
- app_token: Type.String({ description: "Bitable app token (use feishu_bitable_get_meta to get from URL, or feishu_bitable_create_app to create new)" }),
2363
+ app_token: Type.String({ description: BITABLE_APP_TOKEN_DESCRIPTION }),
2362
2364
  table_id: Type.String({ description: "Table ID (from URL: ?table=YYY)" }),
2363
2365
  field_name: Type.String({ description: "Name for the new field" }),
2364
2366
  field_type: Type.Number({
@@ -2368,10 +2370,10 @@ const CreateFieldSchema = Type.Object({
2368
2370
  property: Type.Optional(Type.Record(Type.String(), BitableFieldValueSchema, { description: "Field-specific properties (e.g., options for SingleSelect, format for Number)" }))
2369
2371
  });
2370
2372
  const UpdateRecordSchema = Type.Object({
2371
- app_token: Type.String({ description: "Bitable app token (use feishu_bitable_get_meta to get from URL)" }),
2373
+ app_token: Type.String({ description: BITABLE_APP_TOKEN_DESCRIPTION }),
2372
2374
  table_id: Type.String({ description: "Table ID (from URL: ?table=YYY)" }),
2373
2375
  record_id: Type.String({ description: "Record ID to update" }),
2374
- fields: Type.Record(Type.String(), BitableFieldValueSchema, { description: "Field values to update (same format as create_record)" })
2376
+ fields: Type.Record(Type.String(), BitableFieldValueSchema, { description: BITABLE_RECORD_FIELDS_DESCRIPTION })
2375
2377
  });
2376
2378
  function registerFeishuBitableTools(api) {
2377
2379
  if (!api.config) return;
@@ -1,7 +1,7 @@
1
- import { a as resolveDefaultFeishuAccountId, i as listFeishuAccountIds, n as inspectFeishuCredentials, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-RwSyseKr.js";
1
+ import { a as resolveDefaultFeishuAccountId, i as listFeishuAccountIds, n as inspectFeishuCredentials, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-cCMNFBKg.js";
2
2
  import { i as resolveReceiveIdType, n as looksLikeFeishuId, r as normalizeFeishuTarget } from "./targets-BTQCYRZQ.js";
3
- import { B as deliverCommentThreadText, Ct as resolveFeishuGroupToolPolicy, D as sendMessageFeishu, E as sendCardFeishu, Et as resolveFeishuChatType, F as createFeishuSendReceipt, J as cleanupAmbientCommentTypingReaction, L as buildFeishuMediaFallbackText, O as sendStructuredCardFeishu, S as chunkFeishuCardMarkdown, Tt as normalizeFeishuChatType, _ as resolveFeishuRichReply, a as FEISHU_PRESENTATION_CAPABILITIES, bt as resolveFeishuGroupConfig, c as buildFeishuPresentationCard, ct as materializeFeishuPostMarkdownSoftBreaks, d as isFeishuCardWithinEnvelope, dt as authorizeFeishuChatMemberRead, f as markRenderedFeishuCard, ft as canEnumerateAllFeishuGroups, gt as resolveFeishuChatReadPreliminaryAuthorization, h as renderFeishuPresentationPayload, ht as isFeishuGroupReadEnabled, it as readNativeFeishuCardJson, l as buildFeishuPresentationFallback, m as renderFeishuPresentationFallbackText, mt as isFeishuGroupReadAllowed, n as createFeishuReplyDeliveryResult, o as assertFeishuCardWithinEnvelope, ot as chunkFeishuMarkdown, p as readNativeFeishuCard, pt as canEnumerateAllFeishuPeers, rt as parseFeishuCommentTarget, s as buildFeishuPayloadCard, st as chunkFeishuPostMarkdown, t as createFeishuPartialReplyDeliveryError, u as consumeFeishuPresentationFallbackMarker, ut as assertFeishuChatReadAllowed, x as shouldSuppressFeishuTextForVoiceMedia, y as sendMediaFeishu, z as resolveFeishuIdentityHeaderTitle } from "./reply-delivery-result-CEFTDA3f.js";
4
- import { n as normalizeCompatibilityConfig, o as normalizeFeishuExternalKey, r as FeishuChannelConfigSchema, t as legacyConfigRules } from "./doctor-contract-CQAuBotF.js";
3
+ import { B as deliverCommentThreadText, Ct as resolveFeishuGroupToolPolicy, D as sendMessageFeishu, E as sendCardFeishu, Et as resolveFeishuChatType, F as createFeishuSendReceipt, J as cleanupAmbientCommentTypingReaction, L as buildFeishuMediaFallbackText, O as sendStructuredCardFeishu, S as chunkFeishuCardMarkdown, Tt as normalizeFeishuChatType, _ as resolveFeishuRichReply, a as FEISHU_PRESENTATION_CAPABILITIES, bt as resolveFeishuGroupConfig, c as buildFeishuPresentationCard, ct as materializeFeishuPostMarkdownSoftBreaks, d as isFeishuCardWithinEnvelope, dt as authorizeFeishuChatMemberRead, f as markRenderedFeishuCard, ft as canEnumerateAllFeishuGroups, gt as resolveFeishuChatReadPreliminaryAuthorization, h as renderFeishuPresentationPayload, ht as isFeishuGroupReadEnabled, it as readNativeFeishuCardJson, l as buildFeishuPresentationFallback, m as renderFeishuPresentationFallbackText, mt as isFeishuGroupReadAllowed, n as createFeishuReplyDeliveryResult, o as assertFeishuCardWithinEnvelope, ot as chunkFeishuMarkdown, p as readNativeFeishuCard, pt as canEnumerateAllFeishuPeers, rt as parseFeishuCommentTarget, s as buildFeishuPayloadCard, st as chunkFeishuPostMarkdown, t as createFeishuPartialReplyDeliveryError, u as consumeFeishuPresentationFallbackMarker, ut as assertFeishuChatReadAllowed, x as shouldSuppressFeishuTextForVoiceMedia, y as sendMediaFeishu, z as resolveFeishuIdentityHeaderTitle } from "./reply-delivery-result-CYaKkbUN.js";
4
+ import { n as normalizeCompatibilityConfig, o as normalizeFeishuExternalKey, r as FeishuChannelConfigSchema, t as legacyConfigRules } from "./doctor-contract-w6FpMypv.js";
5
5
  import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, n as buildFeishuModelOverrideParentCandidates, o as resolveConfiguredFeishuGroupSessionScope, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-VYgGQ-GX.js";
6
6
  import { t as messageActionTargetAliases } from "./security-audit-DKfR4Cv3.js";
7
7
  import { r as createFeishuClient } from "./client-DMbIL3UH.js";
@@ -1900,7 +1900,7 @@ const meta = {
1900
1900
  order: 70,
1901
1901
  preferSessionLookupForAnnounceTarget: true
1902
1902
  };
1903
- const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-EfDl2Q8q.js"), "feishuChannelRuntime");
1903
+ const loadFeishuChannelRuntime = createLazyRuntimeNamedExport(() => import("./channel.runtime-CAD74kBO.js"), "feishuChannelRuntime");
1904
1904
  async function resolveFeishuMessageSender(params) {
1905
1905
  try {
1906
1906
  const sender = params.resolve(await loadFeishuChannelRuntime());
@@ -2390,7 +2390,10 @@ const feishuPlugin = createChatChannelPlugin({
2390
2390
  buildModelOverrideParentCandidates: ({ parentConversationId }) => buildFeishuModelOverrideParentCandidates(parentConversationId)
2391
2391
  },
2392
2392
  mentions: { stripPatterns: () => ["<at user_id=\"[^\"]*\">[^<]*</at>"] },
2393
- reload: { configPrefixes: ["channels.feishu"] },
2393
+ reload: {
2394
+ configPrefixes: ["channels.feishu"],
2395
+ noopPrefixes: ["messages.inbound"]
2396
+ },
2394
2397
  doctor: feishuDoctor,
2395
2398
  configSchema: FeishuChannelConfigSchema,
2396
2399
  config: {
@@ -3024,7 +3027,7 @@ const feishuPlugin = createChatChannelPlugin({
3024
3027
  })
3025
3028
  }),
3026
3029
  gateway: { startAccount: async (ctx) => {
3027
- const { monitorFeishuProvider } = await import("./monitor-DoMmOfaD.js");
3030
+ const { monitorFeishuProvider } = await import("./monitor-rPJ_Mz4M.js");
3028
3031
  const account = resolveFeishuRuntimeAccount({
3029
3032
  cfg: ctx.cfg,
3030
3033
  accountId: ctx.accountId
@@ -1,2 +1,2 @@
1
- import { t as feishuPlugin } from "./channel-DSYCNah8.js";
1
+ import { t as feishuPlugin } from "./channel-VytDDz_B.js";
2
2
  export { feishuPlugin };
@@ -1,8 +1,8 @@
1
- import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount } from "./accounts-RwSyseKr.js";
2
- import { c as listFeishuDirectoryPeers, o as feishuOutbound, s as listFeishuDirectoryGroups } from "./channel-DSYCNah8.js";
3
- import { C as editMessageFeishu, D as sendMessageFeishu, E as sendCardFeishu, I as assertFeishuApiSuccess, b as sendStickerFeishu, w as getMessageFeishu } from "./reply-delivery-result-CEFTDA3f.js";
1
+ import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount } from "./accounts-cCMNFBKg.js";
2
+ import { c as listFeishuDirectoryPeers, o as feishuOutbound, s as listFeishuDirectoryGroups } from "./channel-VytDDz_B.js";
3
+ import { C as editMessageFeishu, D as sendMessageFeishu, E as sendCardFeishu, I as assertFeishuApiSuccess, b as sendStickerFeishu, w as getMessageFeishu } from "./reply-delivery-result-CYaKkbUN.js";
4
4
  import { r as createFeishuClient } from "./client-DMbIL3UH.js";
5
- import { a as getFeishuMemberInfo, i as getChatMembers, n as buildFeishuDirectChatMembers, r as getChatInfo, t as assertFeishuChatMember } from "./chat-CxXaPTuO.js";
5
+ import { a as getFeishuMemberInfo, i as getChatMembers, n as buildFeishuDirectChatMembers, r as getChatInfo, t as assertFeishuChatMember } from "./chat-DDhIcPQy.js";
6
6
  import { t as probeFeishu } from "./probe-D_SatdZl.js";
7
7
  import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coerce-runtime";
8
8
  //#region extensions/feishu/src/directory.ts
@@ -1,4 +1,4 @@
1
- import { Et as resolveFeishuChatType, H as feishuExternalToolResult, K as resolveAnyEnabledFeishuToolsConfig, Q as formatFeishuApiError, dt as authorizeFeishuChatMemberRead, gt as resolveFeishuChatReadPreliminaryAuthorization, q as resolveFeishuToolAccount, ut as assertFeishuChatReadAllowed } from "./reply-delivery-result-CEFTDA3f.js";
1
+ import { Et as resolveFeishuChatType, H as feishuExternalToolResult, K as resolveAnyEnabledFeishuToolsConfig, Q as formatFeishuApiError, dt as authorizeFeishuChatMemberRead, gt as resolveFeishuChatReadPreliminaryAuthorization, q as resolveFeishuToolAccount, ut as assertFeishuChatReadAllowed } from "./reply-delivery-result-CYaKkbUN.js";
2
2
  import { r as createFeishuClient } from "./client-DMbIL3UH.js";
3
3
  import { optionalPositiveIntegerSchema } from "openclaw/plugin-sdk/channel-actions";
4
4
  import { readPositiveIntegerParam } from "openclaw/plugin-sdk/param-readers";
@@ -1,2 +1,2 @@
1
- import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-CQAuBotF.js";
1
+ import { n as normalizeCompatibilityConfig, t as legacyConfigRules } from "./doctor-contract-w6FpMypv.js";
2
2
  export { legacyConfigRules, normalizeCompatibilityConfig };
@@ -40,7 +40,7 @@ function canonicalTextPattern(maxLength) {
40
40
  const FeishuStickerSetSchema = z.record(z.string().regex(FEISHU_EXTERNAL_KEY_PATTERN), z.array(z.string().regex(canonicalTextPattern(64))).min(1).max(8)).refine((set) => Object.keys(set).length <= MAX_STICKERS_PER_SET, { message: `At most ${MAX_STICKERS_PER_SET} stickers per bot set are allowed` }).meta({ maxProperties: MAX_STICKERS_PER_SET });
41
41
  const FeishuStickerSetsSchema = z.record(z.string().regex(canonicalTextPattern(128)), FeishuStickerSetSchema).refine((sets) => Object.keys(sets).length <= MAX_STICKER_SETS, { message: `At most ${MAX_STICKER_SETS} bot sticker sets are allowed` }).meta({ maxProperties: MAX_STICKER_SETS });
42
42
  const FeishuGroupPolicySchema = z.union([GroupPolicySchema, z.literal("allowall").transform(() => "open")]);
43
- const FeishuDomainSchema = z.union([z.enum(["feishu", "lark"]), z.string().url().startsWith("https://")]);
43
+ const FeishuDomainSchema = z.union([z.enum(["feishu", "lark"]), z.string().regex(/^[Hh][Tt][Tt][Pp][Ss]:\/\//).url()]);
44
44
  const FeishuConnectionModeSchema = z.enum(["websocket", "webhook"]);
45
45
  const FeishuWebhookPathSchema = z.string().refine((value) => normalizeFeishuWebhookPath(value) === value, { message: "webhookPath must be a canonical HTTP request path; run \"openclaw doctor --fix\" to repair it" });
46
46
  const TtsOverrideSchema = z.object({
@@ -1,4 +1,4 @@
1
- import { r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-RwSyseKr.js";
1
+ import { r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-cCMNFBKg.js";
2
2
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
3
3
  import { r as registerFeishuAiAgent, t as probeFeishu } from "./probe-D_SatdZl.js";
4
4
  import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
@@ -143,7 +143,7 @@ async function fetchBotIdentityForMonitor(account, options = {}) {
143
143
  }
144
144
  //#endregion
145
145
  //#region extensions/feishu/src/monitor.ts
146
- const loadMonitorAccountRuntime = createLazyRuntimeModule(() => import("./monitor.account-WFdlCDhR.js"));
146
+ const loadMonitorAccountRuntime = createLazyRuntimeModule(() => import("./monitor.account-v0XIDyfs.js"));
147
147
  async function monitorFeishuProvider(opts = {}) {
148
148
  const cfg = opts.config;
149
149
  if (!cfg) throw new Error("Config is required for Feishu monitor");
@@ -1,16 +1,16 @@
1
- import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount } from "./accounts-RwSyseKr.js";
1
+ import { o as resolveFeishuAccount, s as resolveFeishuRuntimeAccount } from "./accounts-cCMNFBKg.js";
2
2
  import { i as resolveReceiveIdType } from "./targets-BTQCYRZQ.js";
3
- import { $ as parseCommentContentElements, A as isFeishuBroadcastMention, At as decodeFeishuCardAction, B as deliverCommentThreadText, D as sendMessageFeishu, E as sendCardFeishu, Et as resolveFeishuChatType, L as buildFeishuMediaFallbackText, M as isFeishuGroupChatType, N as parseInteractiveCardContent, O as sendStructuredCardFeishu, Ot as buildFeishuCardActionTextFallback, P as parsePostContent, R as resolveFeishuIdentityEmoji, S as chunkFeishuCardMarkdown, St as resolveFeishuGroupSenderActivationIngressAccess, T as listFeishuThreadMessages, Tt as normalizeFeishuChatType$2, X as encodeQuery, Y as createCommentTypingReactionLifecycle, Z as extractReplyText, _ as resolveFeishuRichReply, _t as hasExplicitFeishuGroupConfig, at as resolveFeishuCardTemplate, bt as resolveFeishuGroupConfig, ct as materializeFeishuPostMarkdownSoftBreaks, et as requestFeishuApi, g as renderFeishuReplyPayload, i as noVisibleFeishuReplyDelivery, j as isMentionForwardRequest, k as extractMentionTargets, kt as createFeishuCardInteractionEnvelope, l as buildFeishuPresentationFallback, n as createFeishuReplyDeliveryResult, nt as normalizeCommentFileType, r as mergeFeishuReplyDeliveryResults, st as chunkFeishuPostMarkdown, t as createFeishuPartialReplyDeliveryError, tt as buildFeishuCommentTarget, u as consumeFeishuPresentationFallbackMarker, v as saveMessageResourceFeishu, vt as normalizeFeishuAllowEntry, w as getMessageFeishu, wt as resolveFeishuReplyPolicy, x as shouldSuppressFeishuTextForVoiceMedia, xt as resolveFeishuGroupConversationIngressAccess, y as sendMediaFeishu, yt as resolveFeishuDmIngressAccess } from "./reply-delivery-result-CEFTDA3f.js";
4
- import { a as normalizeFeishuWebhookPath, o as normalizeFeishuExternalKey } from "./doctor-contract-CQAuBotF.js";
3
+ import { $ as parseCommentContentElements, A as isFeishuBroadcastMention, At as decodeFeishuCardAction, B as deliverCommentThreadText, D as sendMessageFeishu, E as sendCardFeishu, Et as resolveFeishuChatType, L as buildFeishuMediaFallbackText, M as isFeishuGroupChatType, N as parseInteractiveCardContent, O as sendStructuredCardFeishu, Ot as buildFeishuCardActionTextFallback, P as parsePostContent, R as resolveFeishuIdentityEmoji, S as chunkFeishuCardMarkdown, St as resolveFeishuGroupSenderActivationIngressAccess, T as listFeishuThreadMessages, Tt as normalizeFeishuChatType$2, X as encodeQuery, Y as createCommentTypingReactionLifecycle, Z as extractReplyText, _ as resolveFeishuRichReply, _t as hasExplicitFeishuGroupConfig, at as resolveFeishuCardTemplate, bt as resolveFeishuGroupConfig, ct as materializeFeishuPostMarkdownSoftBreaks, et as requestFeishuApi, g as renderFeishuReplyPayload, i as noVisibleFeishuReplyDelivery, j as isMentionForwardRequest, k as extractMentionTargets, kt as createFeishuCardInteractionEnvelope, l as buildFeishuPresentationFallback, n as createFeishuReplyDeliveryResult, nt as normalizeCommentFileType, r as mergeFeishuReplyDeliveryResults, st as chunkFeishuPostMarkdown, t as createFeishuPartialReplyDeliveryError, tt as buildFeishuCommentTarget, u as consumeFeishuPresentationFallbackMarker, v as saveMessageResourceFeishu, vt as normalizeFeishuAllowEntry, w as getMessageFeishu, wt as resolveFeishuReplyPolicy, x as shouldSuppressFeishuTextForVoiceMedia, xt as resolveFeishuGroupConversationIngressAccess, y as sendMediaFeishu, yt as resolveFeishuDmIngressAccess } from "./reply-delivery-result-CYaKkbUN.js";
4
+ import { a as normalizeFeishuWebhookPath, o as normalizeFeishuExternalKey } from "./doctor-contract-w6FpMypv.js";
5
5
  import { o as resolveConfiguredFeishuGroupSessionScope, t as buildFeishuConversationId } from "./conversation-id-VYgGQ-GX.js";
6
6
  import { a as getFeishuUserAgent, i as createFeishuWSClient, n as createEventDispatcher, r as createFeishuClient, s as resolveConfiguredHttpTimeoutMs } from "./client-DMbIL3UH.js";
7
7
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
8
- import { r as getChatInfo } from "./chat-CxXaPTuO.js";
8
+ import { r as getChatInfo } from "./chat-DDhIcPQy.js";
9
9
  import { t as createFeishuThreadBindingManager } from "./thread-bindings-BiL1wGqK.js";
10
10
  import { evaluateSupplementalContextVisibility, normalizeAgentId as normalizeAgentId$1, resolveChannelContextVisibilityMode } from "./runtime-api.js";
11
11
  import { t as readFeishuJsonResponse } from "./json-response-DXajw_FU.js";
12
12
  import { a as waitForAbortableDelay, i as raceWithTimeoutAndAbort } from "./probe-D_SatdZl.js";
13
- import { t as fetchBotIdentityForMonitor } from "./monitor-DoMmOfaD.js";
13
+ import { t as fetchBotIdentityForMonitor } from "./monitor-rPJ_Mz4M.js";
14
14
  import { resolveAgentConfig } from "openclaw/plugin-sdk/agent-scope-runtime";
15
15
  import { DEFAULT_INGRESS_ADOPTION_STALL_MS, bindIngressLifecycleToReplyOptions, createChannelIngressError, createChannelIngressMonitor, createChannelMessageReplyPipeline, createReplyPrefixContext, formatChannelProgressDraftLineForEntry, isChannelProgressDraftWorkToolName, resolveAgentOutboundIdentity, resolveChannelPreviewStreamMode, resolveChannelStreamingBlockEnabled } from "openclaw/plugin-sdk/channel-outbound";
16
16
  import { createChannelPairingController } from "openclaw/plugin-sdk/channel-pairing";
@@ -44,6 +44,7 @@ import { formatReasoningMessage, resolveHumanDelayConfig } from "openclaw/plugin
44
44
  import { logTypingFailure } from "openclaw/plugin-sdk/channel-feedback";
45
45
  import { getGlobalHookRunner } from "openclaw/plugin-sdk/plugin-runtime";
46
46
  import * as http from "node:http";
47
+ import { createRuntimeConfigReader } from "openclaw/plugin-sdk/runtime-config-snapshot";
47
48
  import { channelBlockedPatch, channelReadyPatch } from "openclaw/plugin-sdk/gateway-runtime";
48
49
  import { installRequestBodyLimitGuard, readWebhookBodyOrReject } from "openclaw/plugin-sdk/webhook-request-guards";
49
50
  import { isAbortRequestText, isBtwRequestText } from "openclaw/plugin-sdk/command-primitives-runtime";
@@ -5597,7 +5598,7 @@ async function resolveDriveCommentEventCore(params) {
5597
5598
  return null;
5598
5599
  }
5599
5600
  const context = await fetchDriveCommentContext({
5600
- client: createClient ? createClient(account ?? { accountId }) : createFeishuClient((await import("./accounts-RwSyseKr.js").then((n) => n.t)).resolveFeishuAccount({
5601
+ client: createClient ? createClient(account ?? { accountId }) : createFeishuClient((await import("./accounts-cCMNFBKg.js").then((n) => n.t)).resolveFeishuAccount({
5601
5602
  cfg,
5602
5603
  accountId
5603
5604
  })),
@@ -6129,8 +6130,9 @@ function resolveFeishuDebounceMentions(params) {
6129
6130
  return botMentions.length > 0 ? botMentions : void 0;
6130
6131
  }
6131
6132
  function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, runtime, chatHistories, fireAndForget, handleMessage, resolveDebounceText: resolveText, hasProcessedMessage, getBotOpenId = () => void 0, getBotName = () => void 0, resolveSequentialKey = ({ accountId: accountIdLocal, event }) => `feishu:${accountIdLocal}:${event.message.chat_id?.trim() || "unknown"}`, statusSink, resolveIngressLifecycle }) {
6132
- const inboundDebounceMs = channelRuntime.debounce.resolveInboundDebounceMs({
6133
- cfg,
6133
+ const readConfig = createRuntimeConfigReader(cfg);
6134
+ const resolveDebounceMs = () => channelRuntime.debounce.resolveInboundDebounceMs({
6135
+ cfg: readConfig(),
6134
6136
  channel: "feishu"
6135
6137
  });
6136
6138
  const log = runtime?.log ?? console.log;
@@ -6189,7 +6191,8 @@ function createFeishuMessageReceiveHandler({ cfg, channelRuntime, accountId, run
6189
6191
  }
6190
6192
  };
6191
6193
  const inboundDebouncer = channelRuntime.debounce.createInboundDebouncer({
6192
- debounceMs: inboundDebounceMs,
6194
+ debounceMs: resolveDebounceMs(),
6195
+ resolveDebounceMs,
6193
6196
  buildKey: ({ event }) => {
6194
6197
  const chatId = event.message.chat_id?.trim();
6195
6198
  const senderId = resolveSenderDebounceId(event);
@@ -6837,7 +6840,7 @@ async function resolveReactionSyntheticEvent(params) {
6837
6840
  const senderUserId = event.user_id?.user_id?.trim();
6838
6841
  const senderId = senderOpenId || senderUserId;
6839
6842
  if (!emoji || !messageId || !senderId) return null;
6840
- const { resolveFeishuAccount } = await import("./accounts-RwSyseKr.js").then((n) => n.t);
6843
+ const { resolveFeishuAccount } = await import("./accounts-cCMNFBKg.js").then((n) => n.t);
6841
6844
  const reactionNotifications = resolveFeishuAccount({
6842
6845
  cfg,
6843
6846
  accountId
@@ -1,6 +1,6 @@
1
- import { a as resolveDefaultFeishuAccountId, i as listFeishuAccountIds, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-RwSyseKr.js";
1
+ import { a as resolveDefaultFeishuAccountId, i as listFeishuAccountIds, o as resolveFeishuAccount, r as listEnabledFeishuAccounts, s as resolveFeishuRuntimeAccount } from "./accounts-cCMNFBKg.js";
2
2
  import { i as resolveReceiveIdType, r as normalizeFeishuTarget, t as detectIdType } from "./targets-BTQCYRZQ.js";
3
- import { o as normalizeFeishuExternalKey } from "./doctor-contract-CQAuBotF.js";
3
+ import { o as normalizeFeishuExternalKey } from "./doctor-contract-w6FpMypv.js";
4
4
  import { r as createFeishuClient } from "./client-DMbIL3UH.js";
5
5
  import { t as getFeishuRuntime } from "./runtime-C5JxBWZp.js";
6
6
  import { normalizeAccountId, normalizeOptionalAccountId, resolveMergedAccountConfig } from "openclaw/plugin-sdk/account-resolution";
package/dist/setup-api.js CHANGED
@@ -1,2 +1,2 @@
1
- import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-DSYCNah8.js";
1
+ import { i as feishuSetupAdapter, n as feishuSetupWizard, t as feishuPlugin } from "./channel-VytDDz_B.js";
2
2
  export { feishuPlugin, feishuSetupAdapter, feishuSetupWizard };
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a json pointer
3
- * @specification
4
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
4
+ * @source https://github.com/ajv-validator/ajv-formats
5
5
  */
6
6
  export declare function IsJsonPointer(value: string): boolean;
@@ -1,8 +1,8 @@
1
1
  const JsonPointer = /^(?:\/(?:[^~/]|~0|~1)*)*$/;
2
2
  /**
3
3
  * Returns true if the value is a json pointer
4
- * @specification
5
- * @source ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
5
+ * @source https://github.com/ajv-validator/ajv-formats
6
6
  */
7
7
  export function IsJsonPointer(value) {
8
8
  return JsonPointer.test(value);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a json pointer uri fragment
3
- * @specification
4
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
4
+ * @source https://github.com/ajv-validator/ajv-formats
5
5
  */
6
6
  export declare function IsJsonPointerUriFragment(value: string): boolean;
@@ -1,8 +1,8 @@
1
1
  const JsonPointerUriFragment = /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;
2
2
  /**
3
3
  * Returns true if the value is a json pointer uri fragment
4
- * @specification
5
- * @source ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
5
+ * @source https://github.com/ajv-validator/ajv-formats
6
6
  */
7
7
  export function IsJsonPointerUriFragment(value) {
8
8
  return JsonPointerUriFragment.test(value);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Returns true if the value is a relative json pointer
3
- * @specification
4
- * @source ajv-formats
3
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
4
+ * @source https://github.com/ajv-validator/ajv-formats
5
5
  */
6
6
  export declare function IsRelativeJsonPointer(value: string): boolean;
@@ -1,8 +1,8 @@
1
1
  const RelativeJsonPointer = /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/;
2
2
  /**
3
3
  * Returns true if the value is a relative json pointer
4
- * @specification
5
- * @source ajv-formats
4
+ * @specification https://datatracker.ietf.org/doc/html/rfc6901
5
+ * @source https://github.com/ajv-validator/ajv-formats
6
6
  */
7
7
  export function IsRelativeJsonPointer(value) {
8
8
  return RelativeJsonPointer.test(value);
@@ -1,11 +1,12 @@
1
1
  // deno-lint-ignore-file ban-types no-explicit-any
2
2
  // deno-fmt-ignore-file
3
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
4
5
  /**
5
6
  * Performs an Object assign using the Left and Right object types. We track this operation as it
6
7
  * creates a new GC handle per assignment.
7
8
  */
8
9
  export function Assign(left, right) {
9
10
  Metrics.assign += 1;
10
- return { ...left, ...right };
11
+ return Freeze({ ...left, ...right });
11
12
  }
@@ -1,7 +1,7 @@
1
1
  // deno-lint-ignore-file no-explicit-any
2
- // deno-fmt-ignore-file
3
2
  import { Settings } from '../settings/index.mjs';
4
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
5
5
  function MergeHidden(left, right) {
6
6
  for (const key of Object.keys(right)) {
7
7
  Object.defineProperty(left, key, {
@@ -23,8 +23,7 @@ function Merge(left, right) {
23
23
  */
24
24
  export function Create(hidden, enumerable, options = {}) {
25
25
  Metrics.create += 1;
26
- const settings = Settings.Get();
27
26
  const withOptions = Merge(enumerable, options);
28
- const withHidden = settings.enumerableKind ? Merge(withOptions, hidden) : MergeHidden(withOptions, hidden);
29
- return settings.immutableTypes ? Object.freeze(withHidden) : withHidden;
27
+ const withHidden = Settings.Get().enumerableKind ? Merge(withOptions, hidden) : MergeHidden(withOptions, hidden);
28
+ return Freeze(withHidden);
30
29
  }
@@ -1,7 +1,7 @@
1
1
  // deno-lint-ignore-file no-explicit-any
2
- // deno-fmt-ignore-file
3
2
  import { Guard } from '../../guard/index.mjs';
4
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
5
5
  import { Clone } from './clone.mjs';
6
6
  /** Discards multiple property keys from the given object value */
7
7
  export function Discard(value, propertyKeys) {
@@ -14,5 +14,5 @@ export function Discard(value, propertyKeys) {
14
14
  descriptor.value = Clone(descriptor.value);
15
15
  Object.defineProperty(result, key, descriptor);
16
16
  }
17
- return result;
17
+ return Freeze(result);
18
18
  }
@@ -0,0 +1,4 @@
1
+ type ObjectLike = Record<PropertyKey, any>;
2
+ /** Conditionally freezes the value if `immutableTypes` is true, otherwise no action. */
3
+ export declare function Freeze(value: ObjectLike): ObjectLike;
4
+ export {};
@@ -0,0 +1,6 @@
1
+ // deno-lint-ignore-file no-explicit-any
2
+ import { Settings } from '../settings/index.mjs';
3
+ /** Conditionally freezes the value if `immutableTypes` is true, otherwise no action. */
4
+ export function Freeze(value) {
5
+ return Settings.Get().immutableTypes ? Object.freeze(value) : value;
6
+ }
@@ -1,6 +1,7 @@
1
- // deno-fmt-ignore-file
1
+ // deno-lint-ignore-file no-explicit-any
2
2
  import { Settings } from '../settings/index.mjs';
3
3
  import { Metrics } from './metrics.mjs';
4
+ import { Freeze } from './freeze.mjs';
4
5
  import { Clone } from './clone.mjs';
5
6
  /**
6
7
  * Updates a value with new properties while preserving property enumerability. Use this function to modify
@@ -28,5 +29,5 @@ export function Update(current, hidden, enumerable) {
28
29
  value: enumerable[key]
29
30
  });
30
31
  }
31
- return result;
32
+ return Freeze(result);
32
33
  }
@@ -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.3.17",
4
+ "version": "1.3.18",
5
5
  "keywords": [
6
6
  "typescript",
7
7
  "jsonschema"
@@ -661,7 +661,7 @@
661
661
  {
662
662
  "type": "string",
663
663
  "format": "uri",
664
- "pattern": "^https:\\/\\/.*"
664
+ "pattern": "^[Hh][Tt][Tt][Pp][Ss]:\\/\\/"
665
665
  }
666
666
  ]
667
667
  },
@@ -1531,7 +1531,7 @@
1531
1531
  {
1532
1532
  "type": "string",
1533
1533
  "format": "uri",
1534
- "pattern": "^https:\\/\\/.*"
1534
+ "pattern": "^[Hh][Tt][Tt][Pp][Ss]:\\/\\/"
1535
1535
  }
1536
1536
  ]
1537
1537
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/feishu",
3
- "version": "2026.9.1",
3
+ "version": "2026.9.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",
@@ -12,11 +12,11 @@
12
12
  "mdast-util-from-markdown": "2.0.3",
13
13
  "mdast-util-gfm-table": "2.0.0",
14
14
  "micromark-extension-gfm-table": "2.1.1",
15
- "typebox": "1.3.17",
15
+ "typebox": "1.3.18",
16
16
  "zod": "4.4.3"
17
17
  },
18
18
  "peerDependencies": {
19
- "openclaw": ">=2026.9.1"
19
+ "openclaw": ">=2026.9.2"
20
20
  },
21
21
  "peerDependenciesMeta": {
22
22
  "openclaw": {
@@ -62,11 +62,11 @@
62
62
  "minHostVersion": ">=2026.5.29"
63
63
  },
64
64
  "compat": {
65
- "pluginApi": ">=2026.9.1"
65
+ "pluginApi": ">=2026.9.2"
66
66
  },
67
67
  "build": {
68
68
  "bundledDist": false,
69
- "openclawVersion": "2026.9.1"
69
+ "openclawVersion": "2026.9.2"
70
70
  },
71
71
  "release": {
72
72
  "publishToClawHub": true,