@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.
- package/dist/{accounts-RwSyseKr.js → accounts-cCMNFBKg.js} +1 -1
- package/dist/api.js +14 -12
- package/dist/{channel-DSYCNah8.js → channel-VytDDz_B.js} +9 -6
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{channel.runtime-EfDl2Q8q.js → channel.runtime-CAD74kBO.js} +4 -4
- package/dist/{chat-CxXaPTuO.js → chat-DDhIcPQy.js} +1 -1
- package/dist/doctor-contract-api.js +1 -1
- package/dist/{doctor-contract-CQAuBotF.js → doctor-contract-w6FpMypv.js} +1 -1
- package/dist/{monitor-DoMmOfaD.js → monitor-rPJ_Mz4M.js} +2 -2
- package/dist/{monitor.account-WFdlCDhR.js → monitor.account-v0XIDyfs.js} +13 -10
- package/dist/{reply-delivery-result-CEFTDA3f.js → reply-delivery-result-CYaKkbUN.js} +2 -2
- package/dist/setup-api.js +1 -1
- package/node_modules/typebox/build/format/json_pointer.d.mts +2 -2
- package/node_modules/typebox/build/format/json_pointer.mjs +2 -2
- package/node_modules/typebox/build/format/json_pointer_uri_fragment.d.mts +2 -2
- package/node_modules/typebox/build/format/json_pointer_uri_fragment.mjs +2 -2
- package/node_modules/typebox/build/format/relative_json_pointer.d.mts +2 -2
- package/node_modules/typebox/build/format/relative_json_pointer.mjs +2 -2
- package/node_modules/typebox/build/system/memory/assign.mjs +2 -1
- package/node_modules/typebox/build/system/memory/create.mjs +3 -4
- package/node_modules/typebox/build/system/memory/discard.mjs +2 -2
- package/node_modules/typebox/build/system/memory/freeze.d.mts +4 -0
- package/node_modules/typebox/build/system/memory/freeze.mjs +6 -0
- package/node_modules/typebox/build/system/memory/update.mjs +3 -2
- package/node_modules/typebox/package.json +1 -1
- package/openclaw.plugin.json +2 -2
- 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-
|
|
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-
|
|
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-
|
|
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.` : "
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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-
|
|
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-
|
|
4
|
-
import { n as normalizeCompatibilityConfig, o as normalizeFeishuExternalKey, r as FeishuChannelConfigSchema, t as legacyConfigRules } from "./doctor-contract-
|
|
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-
|
|
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: {
|
|
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-
|
|
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-
|
|
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-
|
|
2
|
-
import { c as listFeishuDirectoryPeers, o as feishuOutbound, s as listFeishuDirectoryGroups } from "./channel-
|
|
3
|
-
import { C as editMessageFeishu, D as sendMessageFeishu, E as sendCardFeishu, I as assertFeishuApiSuccess, b as sendStickerFeishu, w as getMessageFeishu } from "./reply-delivery-result-
|
|
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-
|
|
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-
|
|
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-
|
|
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().
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4
|
-
import { a as normalizeFeishuWebhookPath, o as normalizeFeishuExternalKey } from "./doctor-contract-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
6133
|
-
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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 =
|
|
29
|
-
return
|
|
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,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-
|
|
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
|
}
|
package/openclaw.plugin.json
CHANGED
|
@@ -661,7 +661,7 @@
|
|
|
661
661
|
{
|
|
662
662
|
"type": "string",
|
|
663
663
|
"format": "uri",
|
|
664
|
-
"pattern": "^
|
|
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": "^
|
|
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.
|
|
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.
|
|
15
|
+
"typebox": "1.3.18",
|
|
16
16
|
"zod": "4.4.3"
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
|
-
"openclaw": ">=2026.9.
|
|
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.
|
|
65
|
+
"pluginApi": ">=2026.9.2"
|
|
66
66
|
},
|
|
67
67
|
"build": {
|
|
68
68
|
"bundledDist": false,
|
|
69
|
-
"openclawVersion": "2026.9.
|
|
69
|
+
"openclawVersion": "2026.9.2"
|
|
70
70
|
},
|
|
71
71
|
"release": {
|
|
72
72
|
"publishToClawHub": true,
|