@openclaw/feishu 2026.9.1-beta.1 → 2026.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.js +211 -275
- package/dist/{app-registration-BpfUzS9m.js → app-registration-BI99e_JI.js} +12 -9
- package/dist/{channel-Dpgf8wLD.js → channel-DSYCNah8.js} +239 -580
- package/dist/channel-plugin-api.js +1 -1
- package/dist/{channel.runtime-BIEERwaT.js → channel.runtime-EfDl2Q8q.js} +14 -18
- package/dist/{chat-C1nuW5UY.js → chat-CxXaPTuO.js} +13 -13
- package/dist/{client-DalLmpMf.js → client-DMbIL3UH.js} +3 -6
- package/dist/contract-api.js +2 -2
- package/dist/doctor-contract-CQAuBotF.js +465 -0
- package/dist/doctor-contract-api.js +1 -1
- package/dist/index.js +11 -42
- package/dist/{json-response-CheljwGr.js → json-response-DXajw_FU.js} +1 -1
- package/dist/{monitor.startup-D-gL82OO.js → monitor-DoMmOfaD.js} +62 -2
- package/dist/{monitor.account-DhhotI_Q.js → monitor.account-WFdlCDhR.js} +261 -293
- package/dist/{probe-CfhhR_0a.js → probe-D_SatdZl.js} +3 -3
- package/dist/{presentation-card-C8Z7Tgru.js → reply-delivery-result-CEFTDA3f.js} +333 -239
- package/dist/{security-audit-D6Fz2h6p.js → security-audit-DKfR4Cv3.js} +1 -1
- package/dist/{security-audit-shared-BgpY7AiJ.js → security-audit-shared-CK5rVR-1.js} +2 -1
- package/dist/security-contract-api.js +1 -1
- package/dist/session-binding-contract-api.js +1 -1
- package/dist/setup-api.js +1 -1
- package/dist/{subagent-hooks-KUi-7vUy.js → subagent-hooks-Buadpie_.js} +3 -6
- package/dist/subagent-hooks-api.js +1 -1
- package/dist/{targets-BUjQ1TcA.js → targets-BTQCYRZQ.js} +4 -4
- package/dist/{thread-bindings-CptM_YU6.js → thread-bindings-BiL1wGqK.js} +20 -9
- package/node_modules/@larksuiteoapi/node-sdk/node_modules/ws/lib/permessage-deflate.js +3 -1
- package/node_modules/@larksuiteoapi/node-sdk/node_modules/ws/package.json +1 -1
- package/node_modules/typebox/build/format/email.mjs +1 -1
- package/node_modules/typebox/build/format/idna/idn-hostname.mjs +19 -1
- package/node_modules/typebox/package.json +1 -1
- package/openclaw.plugin.json +43 -236
- package/package.json +6 -5
- package/dist/doctor-contract-bEQXIXyP.js +0 -158
- package/dist/monitor-BRg3sHH7.js +0 -62
|
@@ -2,7 +2,8 @@ import { asOptionalRecord, hasNonEmptyString } from "openclaw/plugin-sdk/string-
|
|
|
2
2
|
import { hasConfiguredSecretInput } from "openclaw/plugin-sdk/secret-input";
|
|
3
3
|
//#region extensions/feishu/src/security-audit-shared.ts
|
|
4
4
|
function isFeishuDocToolEnabled(cfg) {
|
|
5
|
-
const
|
|
5
|
+
const channels = asOptionalRecord(cfg.channels);
|
|
6
|
+
const feishu = asOptionalRecord(channels?.feishu);
|
|
6
7
|
if (!feishu || feishu.enabled === false) return false;
|
|
7
8
|
const baseTools = asOptionalRecord(feishu.tools);
|
|
8
9
|
const baseDocEnabled = baseTools?.doc !== false;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as collectFeishuSecurityAuditFindings } from "./security-audit-shared-
|
|
1
|
+
import { t as collectFeishuSecurityAuditFindings } from "./security-audit-shared-CK5rVR-1.js";
|
|
2
2
|
export { collectFeishuSecurityAuditFindings };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as createFeishuThreadBindingManager } from "./thread-bindings-
|
|
1
|
+
import { t as createFeishuThreadBindingManager } from "./thread-bindings-BiL1wGqK.js";
|
|
2
2
|
export { createFeishuThreadBindingManager };
|
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-DSYCNah8.js";
|
|
2
2
|
export { feishuPlugin, feishuSetupAdapter, feishuSetupWizard };
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-8H4AJuhK.js";
|
|
2
|
-
import { r as normalizeFeishuTarget } from "./targets-
|
|
2
|
+
import { a as stripFeishuProviderPrefix, r as normalizeFeishuTarget } from "./targets-BTQCYRZQ.js";
|
|
3
3
|
import { r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-VYgGQ-GX.js";
|
|
4
|
-
import { n as getFeishuThreadBindingManager } from "./thread-bindings-
|
|
4
|
+
import { n as getFeishuThreadBindingManager } from "./thread-bindings-BiL1wGqK.js";
|
|
5
5
|
import { normalizeOptionalLowercaseString, normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
6
6
|
//#region extensions/feishu/src/subagent-hooks.ts
|
|
7
7
|
var subagent_hooks_exports = /* @__PURE__ */ __exportAll({
|
|
8
8
|
handleFeishuSubagentDeliveryTarget: () => handleFeishuSubagentDeliveryTarget,
|
|
9
9
|
handleFeishuSubagentEnded: () => handleFeishuSubagentEnded
|
|
10
10
|
});
|
|
11
|
-
function stripProviderPrefix(raw) {
|
|
12
|
-
return raw.replace(/^(feishu|lark):/i, "").trim();
|
|
13
|
-
}
|
|
14
11
|
function resolveFeishuRequesterConversation(params) {
|
|
15
12
|
const manager = getFeishuThreadBindingManager(params.accountId);
|
|
16
13
|
if (!manager) return null;
|
|
17
14
|
const rawTo = params.to?.trim();
|
|
18
|
-
const withoutProviderPrefix = rawTo ?
|
|
15
|
+
const withoutProviderPrefix = rawTo ? stripFeishuProviderPrefix(rawTo) : "";
|
|
19
16
|
const normalizedTarget = rawTo ? normalizeFeishuTarget(rawTo) : null;
|
|
20
17
|
const threadId = params.threadId != null && params.threadId !== "" ? String(params.threadId).trim() : "";
|
|
21
18
|
const isChatTarget = /^(chat|group|channel):/i.test(withoutProviderPrefix);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createLazyRuntimeModule } from "openclaw/plugin-sdk/lazy-runtime";
|
|
2
2
|
//#region extensions/feishu/subagent-hooks-api.ts
|
|
3
|
-
const loadFeishuSubagentHooksModule = createLazyRuntimeModule(() => import("./subagent-hooks-
|
|
3
|
+
const loadFeishuSubagentHooksModule = createLazyRuntimeModule(() => import("./subagent-hooks-Buadpie_.js").then((n) => n.r));
|
|
4
4
|
function registerFeishuSubagentHooks(api) {
|
|
5
5
|
api.on("subagent_delivery_target", async (event) => {
|
|
6
6
|
const { handleFeishuSubagentDeliveryTarget } = await loadFeishuSubagentHooksModule();
|
|
@@ -3,7 +3,7 @@ import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/string-coer
|
|
|
3
3
|
const CHAT_ID_PREFIX = "oc_";
|
|
4
4
|
const OPEN_ID_PREFIX = "ou_";
|
|
5
5
|
const USER_ID_REGEX = /^[a-zA-Z0-9_-]+$/;
|
|
6
|
-
function
|
|
6
|
+
function stripFeishuProviderPrefix(raw) {
|
|
7
7
|
return raw.replace(/^(feishu|lark):/i, "").trim();
|
|
8
8
|
}
|
|
9
9
|
function detectIdType(id) {
|
|
@@ -16,7 +16,7 @@ function detectIdType(id) {
|
|
|
16
16
|
function normalizeFeishuTarget(raw) {
|
|
17
17
|
const trimmed = raw.trim();
|
|
18
18
|
if (!trimmed) return null;
|
|
19
|
-
const withoutProvider =
|
|
19
|
+
const withoutProvider = stripFeishuProviderPrefix(trimmed);
|
|
20
20
|
const lowered = normalizeLowercaseStringOrEmpty(withoutProvider);
|
|
21
21
|
if (lowered.startsWith("chat:")) return withoutProvider.slice(5).trim() || null;
|
|
22
22
|
if (lowered.startsWith("group:")) return withoutProvider.slice(6).trim() || null;
|
|
@@ -37,7 +37,7 @@ function resolveReceiveIdType(id) {
|
|
|
37
37
|
return "user_id";
|
|
38
38
|
}
|
|
39
39
|
function looksLikeFeishuId(raw) {
|
|
40
|
-
const trimmed =
|
|
40
|
+
const trimmed = stripFeishuProviderPrefix(raw.trim());
|
|
41
41
|
if (!trimmed) return false;
|
|
42
42
|
if (/^(chat|group|channel|user|dm|open_id):/i.test(trimmed)) return true;
|
|
43
43
|
if (trimmed.startsWith(CHAT_ID_PREFIX)) return true;
|
|
@@ -45,4 +45,4 @@ function looksLikeFeishuId(raw) {
|
|
|
45
45
|
return false;
|
|
46
46
|
}
|
|
47
47
|
//#endregion
|
|
48
|
-
export { resolveReceiveIdType as i, looksLikeFeishuId as n, normalizeFeishuTarget as r, detectIdType as t };
|
|
48
|
+
export { stripFeishuProviderPrefix as a, resolveReceiveIdType as i, looksLikeFeishuId as n, normalizeFeishuTarget as r, detectIdType as t };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveSessionAgentIdStrict } from "openclaw/plugin-sdk/agent-scope-runtime";
|
|
2
2
|
import { registerSessionBindingAdapter, resolveThreadBindingConversationIdFromBindingId, resolveThreadBindingIdleTimeoutMsForChannel, resolveThreadBindingMaxAgeMsForChannel, unregisterSessionBindingAdapter } from "openclaw/plugin-sdk/conversation-runtime";
|
|
3
3
|
import { isFutureDateTimestampMs } from "openclaw/plugin-sdk/number-runtime";
|
|
4
4
|
import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime";
|
|
5
5
|
import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
|
|
6
|
+
import { isPluginOwnedSessionBindingRecord } from "openclaw/plugin-sdk/conversation-binding-runtime";
|
|
6
7
|
//#region extensions/feishu/src/thread-bindings.ts
|
|
7
8
|
const FEISHU_THREAD_BINDINGS_STATE_KEY = Symbol.for("openclaw.feishuThreadBindingsState");
|
|
8
9
|
let state;
|
|
@@ -47,6 +48,7 @@ function toSessionBindingRecord(record, defaults) {
|
|
|
47
48
|
boundAt: record.boundAt,
|
|
48
49
|
expiresAt,
|
|
49
50
|
metadata: {
|
|
51
|
+
...record.metadata,
|
|
50
52
|
agentId: record.agentId,
|
|
51
53
|
label: record.label,
|
|
52
54
|
boundBy: record.boundBy,
|
|
@@ -98,6 +100,12 @@ function createFeishuThreadBindingManager(params) {
|
|
|
98
100
|
const normalizedTargetSessionKey = targetSessionKey.trim();
|
|
99
101
|
if (!normalizedConversationId || !normalizedTargetSessionKey) return null;
|
|
100
102
|
const existingLocal = manager.getByConversationId(normalizedConversationId);
|
|
103
|
+
const storedTargetKind = toFeishuTargetKind(targetKind);
|
|
104
|
+
const previous = existingLocal?.targetSessionKey === normalizedTargetSessionKey && existingLocal.targetKind === storedTargetKind ? existingLocal : void 0;
|
|
105
|
+
const targetMetadata = {
|
|
106
|
+
...previous?.metadata,
|
|
107
|
+
...metadata
|
|
108
|
+
};
|
|
101
109
|
const now = Date.now();
|
|
102
110
|
const record = {
|
|
103
111
|
accountId,
|
|
@@ -105,16 +113,17 @@ function createFeishuThreadBindingManager(params) {
|
|
|
105
113
|
parentConversationId: normalizeOptionalString(parentConversationId) ?? existingLocal?.parentConversationId,
|
|
106
114
|
deliveryTo: typeof metadata?.deliveryTo === "string" && metadata.deliveryTo.trim() ? metadata.deliveryTo.trim() : existingLocal?.deliveryTo,
|
|
107
115
|
deliveryThreadId: typeof metadata?.deliveryThreadId === "string" && metadata.deliveryThreadId.trim() ? metadata.deliveryThreadId.trim() : existingLocal?.deliveryThreadId,
|
|
108
|
-
targetKind:
|
|
116
|
+
targetKind: storedTargetKind,
|
|
109
117
|
targetSessionKey: normalizedTargetSessionKey,
|
|
110
|
-
agentId: normalizeOptionalString(metadata?.agentId) ??
|
|
118
|
+
agentId: normalizeOptionalString(metadata?.agentId) ?? previous?.agentId ?? (isPluginOwnedSessionBindingRecord({ metadata: targetMetadata }) ? void 0 : resolveSessionAgentIdStrict({
|
|
111
119
|
config: params.cfg,
|
|
112
120
|
sessionKey: normalizedTargetSessionKey
|
|
113
|
-
}),
|
|
114
|
-
label:
|
|
115
|
-
boundBy:
|
|
121
|
+
})),
|
|
122
|
+
label: normalizeOptionalString(metadata?.label) ?? previous?.label,
|
|
123
|
+
boundBy: normalizeOptionalString(metadata?.boundBy) ?? previous?.boundBy,
|
|
116
124
|
boundAt: now,
|
|
117
|
-
lastActivityAt: now
|
|
125
|
+
lastActivityAt: now,
|
|
126
|
+
metadata: targetMetadata
|
|
118
127
|
};
|
|
119
128
|
getState().bindingsByAccountConversation.set(resolveBindingKey({
|
|
120
129
|
accountId,
|
|
@@ -159,8 +168,10 @@ function createFeishuThreadBindingManager(params) {
|
|
|
159
168
|
return removed;
|
|
160
169
|
},
|
|
161
170
|
stop: () => {
|
|
162
|
-
|
|
163
|
-
|
|
171
|
+
if (getState().managersByAccountId.get(accountId) === manager) {
|
|
172
|
+
for (const key of getState().bindingsByAccountConversation.keys()) if (key.startsWith(`${accountId}:`)) getState().bindingsByAccountConversation.delete(key);
|
|
173
|
+
getState().managersByAccountId.delete(accountId);
|
|
174
|
+
}
|
|
164
175
|
unregisterSessionBindingAdapter({
|
|
165
176
|
channel: "feishu",
|
|
166
177
|
accountId,
|
|
@@ -167,7 +167,9 @@ class PerMessageDeflate {
|
|
|
167
167
|
(typeof opts.serverMaxWindowBits === 'number' &&
|
|
168
168
|
opts.serverMaxWindowBits > params.server_max_window_bits))) ||
|
|
169
169
|
(typeof opts.clientMaxWindowBits === 'number' &&
|
|
170
|
-
|
|
170
|
+
(typeof params.client_max_window_bits === 'number'
|
|
171
|
+
? opts.clientMaxWindowBits > params.client_max_window_bits
|
|
172
|
+
: !params.client_max_window_bits))
|
|
171
173
|
) {
|
|
172
174
|
return false;
|
|
173
175
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]
|
|
1
|
+
const Email = /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[^"\\]|\\[\x20-\x7e])*")@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*|\[(?:IPv6:[a-f0-9:]+|(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3})\])$/i;
|
|
2
2
|
/**
|
|
3
3
|
* Returns true if the value is an Email
|
|
4
4
|
* @specification https://datatracker.ietf.org/doc/html/rfc5322
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import * as FormatBidi from './format/bidi.mjs';
|
|
2
2
|
import * as LabelUnicode from './label/unicode.mjs';
|
|
3
3
|
import * as LabelPuny from './label/puny.mjs';
|
|
4
|
+
// ------------------------------------------------------------------
|
|
5
|
+
// IsLabel
|
|
6
|
+
// ------------------------------------------------------------------
|
|
4
7
|
function IsValidLabelLength(value) {
|
|
5
8
|
return value.length > 0 && value.length <= 63;
|
|
6
9
|
}
|
|
@@ -8,9 +11,24 @@ function IsLabel(value) {
|
|
|
8
11
|
return IsValidLabelLength(value) && (LabelPuny.IsPunyLabel(value) ||
|
|
9
12
|
LabelUnicode.IsUnicodeLabel(value));
|
|
10
13
|
}
|
|
14
|
+
// ------------------------------------------------------------------
|
|
15
|
+
// NormalizeHostname
|
|
16
|
+
//
|
|
17
|
+
// Normalizes a hostname for label validation. Normalizes for NFC
|
|
18
|
+
// such that equivalent codepoint sequences can be uniformly
|
|
19
|
+
// compared. It also removes codepoints that IDNA mapping ignores,
|
|
20
|
+
// and converts full stop variants to ASCII '.' so the hostname can
|
|
21
|
+
// be split into labels.
|
|
22
|
+
// ------------------------------------------------------------------
|
|
11
23
|
function NormalizeHostname(value) {
|
|
12
|
-
return value
|
|
24
|
+
return value
|
|
25
|
+
.normalize('NFC')
|
|
26
|
+
.replace(/[\u00ad\u034f\u180b-\u180d\u200b\ufe00-\ufe0f\u{e0100}-\u{e01ef}]/gu, '') // RE_IGNORED_MAPPING
|
|
27
|
+
.replace(/[\u002E\u3002\uFF0E\uFF61]/g, '.'); // RE_FULL_STOP_MAPPING
|
|
13
28
|
}
|
|
29
|
+
// ------------------------------------------------------------------
|
|
30
|
+
// IsIdnHostname
|
|
31
|
+
// ------------------------------------------------------------------
|
|
14
32
|
export function IsIdnHostname(value) {
|
|
15
33
|
if (value.length === 0 || value.includes(' '))
|
|
16
34
|
return false;
|
package/openclaw.plugin.json
CHANGED
|
@@ -302,242 +302,8 @@
|
|
|
302
302
|
],
|
|
303
303
|
"configSchema": {
|
|
304
304
|
"type": "object",
|
|
305
|
-
"additionalProperties":
|
|
306
|
-
"
|
|
307
|
-
"secretRef": {
|
|
308
|
-
"type": "object",
|
|
309
|
-
"additionalProperties": false,
|
|
310
|
-
"properties": {
|
|
311
|
-
"source": {
|
|
312
|
-
"type": "string",
|
|
313
|
-
"enum": [
|
|
314
|
-
"env",
|
|
315
|
-
"file",
|
|
316
|
-
"exec",
|
|
317
|
-
"store"
|
|
318
|
-
]
|
|
319
|
-
},
|
|
320
|
-
"provider": {
|
|
321
|
-
"type": "string"
|
|
322
|
-
},
|
|
323
|
-
"id": {
|
|
324
|
-
"type": "string"
|
|
325
|
-
}
|
|
326
|
-
},
|
|
327
|
-
"required": [
|
|
328
|
-
"source",
|
|
329
|
-
"provider",
|
|
330
|
-
"id"
|
|
331
|
-
]
|
|
332
|
-
},
|
|
333
|
-
"secretInput": {
|
|
334
|
-
"anyOf": [
|
|
335
|
-
{
|
|
336
|
-
"type": "string",
|
|
337
|
-
"minLength": 1
|
|
338
|
-
},
|
|
339
|
-
{
|
|
340
|
-
"$ref": "#/$defs/secretRef"
|
|
341
|
-
}
|
|
342
|
-
]
|
|
343
|
-
},
|
|
344
|
-
"streaming": {
|
|
345
|
-
"type": "object",
|
|
346
|
-
"additionalProperties": false,
|
|
347
|
-
"properties": {
|
|
348
|
-
"mode": {
|
|
349
|
-
"type": "string",
|
|
350
|
-
"enum": [
|
|
351
|
-
"off",
|
|
352
|
-
"partial"
|
|
353
|
-
],
|
|
354
|
-
"description": "\"partial\" (default) enables streaming-card replies; \"off\" sends one final message."
|
|
355
|
-
},
|
|
356
|
-
"chunkMode": {
|
|
357
|
-
"type": "string",
|
|
358
|
-
"enum": [
|
|
359
|
-
"length",
|
|
360
|
-
"newline"
|
|
361
|
-
]
|
|
362
|
-
},
|
|
363
|
-
"block": {
|
|
364
|
-
"type": "object",
|
|
365
|
-
"additionalProperties": false,
|
|
366
|
-
"properties": {
|
|
367
|
-
"enabled": {
|
|
368
|
-
"type": "boolean"
|
|
369
|
-
},
|
|
370
|
-
"coalesce": {
|
|
371
|
-
"type": "object",
|
|
372
|
-
"additionalProperties": false,
|
|
373
|
-
"properties": {
|
|
374
|
-
"minChars": {
|
|
375
|
-
"type": "integer",
|
|
376
|
-
"minimum": 1
|
|
377
|
-
},
|
|
378
|
-
"maxChars": {
|
|
379
|
-
"type": "integer",
|
|
380
|
-
"minimum": 1
|
|
381
|
-
},
|
|
382
|
-
"idleMs": {
|
|
383
|
-
"type": "integer",
|
|
384
|
-
"minimum": 0
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
},
|
|
392
|
-
"account": {
|
|
393
|
-
"type": "object",
|
|
394
|
-
"additionalProperties": true,
|
|
395
|
-
"properties": {
|
|
396
|
-
"enabled": {
|
|
397
|
-
"type": "boolean"
|
|
398
|
-
},
|
|
399
|
-
"name": {
|
|
400
|
-
"type": "string"
|
|
401
|
-
},
|
|
402
|
-
"appId": {
|
|
403
|
-
"type": "string"
|
|
404
|
-
},
|
|
405
|
-
"appSecret": {
|
|
406
|
-
"$ref": "#/$defs/secretInput"
|
|
407
|
-
},
|
|
408
|
-
"encryptKey": {
|
|
409
|
-
"$ref": "#/$defs/secretInput"
|
|
410
|
-
},
|
|
411
|
-
"verificationToken": {
|
|
412
|
-
"$ref": "#/$defs/secretInput"
|
|
413
|
-
},
|
|
414
|
-
"domain": {
|
|
415
|
-
"anyOf": [
|
|
416
|
-
{
|
|
417
|
-
"type": "string",
|
|
418
|
-
"enum": [
|
|
419
|
-
"feishu",
|
|
420
|
-
"lark"
|
|
421
|
-
]
|
|
422
|
-
},
|
|
423
|
-
{
|
|
424
|
-
"type": "string",
|
|
425
|
-
"format": "uri"
|
|
426
|
-
}
|
|
427
|
-
]
|
|
428
|
-
},
|
|
429
|
-
"connectionMode": {
|
|
430
|
-
"type": "string",
|
|
431
|
-
"enum": [
|
|
432
|
-
"websocket",
|
|
433
|
-
"webhook"
|
|
434
|
-
]
|
|
435
|
-
},
|
|
436
|
-
"renderMode": {
|
|
437
|
-
"type": "string",
|
|
438
|
-
"enum": [
|
|
439
|
-
"auto",
|
|
440
|
-
"raw",
|
|
441
|
-
"card"
|
|
442
|
-
]
|
|
443
|
-
},
|
|
444
|
-
"streaming": {
|
|
445
|
-
"$ref": "#/$defs/streaming"
|
|
446
|
-
},
|
|
447
|
-
"replyInThread": {
|
|
448
|
-
"type": "string",
|
|
449
|
-
"enum": [
|
|
450
|
-
"disabled",
|
|
451
|
-
"enabled"
|
|
452
|
-
]
|
|
453
|
-
},
|
|
454
|
-
"allowBots": {
|
|
455
|
-
"type": "boolean"
|
|
456
|
-
},
|
|
457
|
-
"vcAutoJoin": {
|
|
458
|
-
"type": "boolean"
|
|
459
|
-
},
|
|
460
|
-
"typingIndicator": {
|
|
461
|
-
"type": "boolean"
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
},
|
|
466
|
-
"properties": {
|
|
467
|
-
"enabled": {
|
|
468
|
-
"type": "boolean"
|
|
469
|
-
},
|
|
470
|
-
"defaultAccount": {
|
|
471
|
-
"type": "string"
|
|
472
|
-
},
|
|
473
|
-
"appId": {
|
|
474
|
-
"type": "string"
|
|
475
|
-
},
|
|
476
|
-
"appSecret": {
|
|
477
|
-
"$ref": "#/$defs/secretInput"
|
|
478
|
-
},
|
|
479
|
-
"encryptKey": {
|
|
480
|
-
"$ref": "#/$defs/secretInput"
|
|
481
|
-
},
|
|
482
|
-
"verificationToken": {
|
|
483
|
-
"$ref": "#/$defs/secretInput"
|
|
484
|
-
},
|
|
485
|
-
"domain": {
|
|
486
|
-
"anyOf": [
|
|
487
|
-
{
|
|
488
|
-
"type": "string",
|
|
489
|
-
"enum": [
|
|
490
|
-
"feishu",
|
|
491
|
-
"lark"
|
|
492
|
-
]
|
|
493
|
-
},
|
|
494
|
-
{
|
|
495
|
-
"type": "string",
|
|
496
|
-
"format": "uri"
|
|
497
|
-
}
|
|
498
|
-
]
|
|
499
|
-
},
|
|
500
|
-
"connectionMode": {
|
|
501
|
-
"type": "string",
|
|
502
|
-
"enum": [
|
|
503
|
-
"websocket",
|
|
504
|
-
"webhook"
|
|
505
|
-
]
|
|
506
|
-
},
|
|
507
|
-
"renderMode": {
|
|
508
|
-
"type": "string",
|
|
509
|
-
"enum": [
|
|
510
|
-
"auto",
|
|
511
|
-
"raw",
|
|
512
|
-
"card"
|
|
513
|
-
]
|
|
514
|
-
},
|
|
515
|
-
"streaming": {
|
|
516
|
-
"$ref": "#/$defs/streaming"
|
|
517
|
-
},
|
|
518
|
-
"replyInThread": {
|
|
519
|
-
"type": "string",
|
|
520
|
-
"enum": [
|
|
521
|
-
"disabled",
|
|
522
|
-
"enabled"
|
|
523
|
-
]
|
|
524
|
-
},
|
|
525
|
-
"allowBots": {
|
|
526
|
-
"type": "boolean"
|
|
527
|
-
},
|
|
528
|
-
"vcAutoJoin": {
|
|
529
|
-
"type": "boolean"
|
|
530
|
-
},
|
|
531
|
-
"typingIndicator": {
|
|
532
|
-
"type": "boolean"
|
|
533
|
-
},
|
|
534
|
-
"accounts": {
|
|
535
|
-
"type": "object",
|
|
536
|
-
"additionalProperties": {
|
|
537
|
-
"$ref": "#/$defs/account"
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
}
|
|
305
|
+
"additionalProperties": false,
|
|
306
|
+
"properties": {}
|
|
541
307
|
},
|
|
542
308
|
"channelConfigs": {
|
|
543
309
|
"feishu": {
|
|
@@ -551,6 +317,31 @@
|
|
|
551
317
|
"defaultAccount": {
|
|
552
318
|
"type": "string"
|
|
553
319
|
},
|
|
320
|
+
"stickerSets": {
|
|
321
|
+
"type": "object",
|
|
322
|
+
"propertyNames": {
|
|
323
|
+
"type": "string",
|
|
324
|
+
"pattern": "^(?!\\s)(?![\\s\\S]*\\s$)[^\\p{Cs}]{1,128}$"
|
|
325
|
+
},
|
|
326
|
+
"additionalProperties": {
|
|
327
|
+
"type": "object",
|
|
328
|
+
"propertyNames": {
|
|
329
|
+
"type": "string",
|
|
330
|
+
"pattern": "^(?!\\s)(?![\\s\\S]*\\s$)(?![\\s\\S]*\\.\\.)[^\\p{Cc}\\p{Cs}/\\\\]{1,512}$"
|
|
331
|
+
},
|
|
332
|
+
"additionalProperties": {
|
|
333
|
+
"minItems": 1,
|
|
334
|
+
"maxItems": 8,
|
|
335
|
+
"type": "array",
|
|
336
|
+
"items": {
|
|
337
|
+
"type": "string",
|
|
338
|
+
"pattern": "^(?!\\s)(?![\\s\\S]*\\s$)[^\\p{Cs}]{1,64}$"
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
"maxProperties": 256
|
|
342
|
+
},
|
|
343
|
+
"maxProperties": 32
|
|
344
|
+
},
|
|
554
345
|
"appId": {
|
|
555
346
|
"type": "string"
|
|
556
347
|
},
|
|
@@ -925,6 +716,14 @@
|
|
|
925
716
|
"configWrites": {
|
|
926
717
|
"type": "boolean"
|
|
927
718
|
},
|
|
719
|
+
"contextVisibility": {
|
|
720
|
+
"type": "string",
|
|
721
|
+
"enum": [
|
|
722
|
+
"all",
|
|
723
|
+
"allowlist",
|
|
724
|
+
"allowlist_quote"
|
|
725
|
+
]
|
|
726
|
+
},
|
|
928
727
|
"replyToMode": {
|
|
929
728
|
"anyOf": [
|
|
930
729
|
{
|
|
@@ -1785,6 +1584,14 @@
|
|
|
1785
1584
|
"configWrites": {
|
|
1786
1585
|
"type": "boolean"
|
|
1787
1586
|
},
|
|
1587
|
+
"contextVisibility": {
|
|
1588
|
+
"type": "string",
|
|
1589
|
+
"enum": [
|
|
1590
|
+
"all",
|
|
1591
|
+
"allowlist",
|
|
1592
|
+
"allowlist_quote"
|
|
1593
|
+
]
|
|
1594
|
+
},
|
|
1788
1595
|
"replyToMode": {
|
|
1789
1596
|
"anyOf": [
|
|
1790
1597
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openclaw/feishu",
|
|
3
|
-
"version": "2026.9.1
|
|
3
|
+
"version": "2026.9.1",
|
|
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.17",
|
|
16
16
|
"zod": "4.4.3"
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
|
-
"openclaw": ">=2026.9.1
|
|
19
|
+
"openclaw": ">=2026.9.1"
|
|
20
20
|
},
|
|
21
21
|
"peerDependenciesMeta": {
|
|
22
22
|
"openclaw": {
|
|
@@ -62,10 +62,11 @@
|
|
|
62
62
|
"minHostVersion": ">=2026.5.29"
|
|
63
63
|
},
|
|
64
64
|
"compat": {
|
|
65
|
-
"pluginApi": ">=2026.9.1
|
|
65
|
+
"pluginApi": ">=2026.9.1"
|
|
66
66
|
},
|
|
67
67
|
"build": {
|
|
68
|
-
"
|
|
68
|
+
"bundledDist": false,
|
|
69
|
+
"openclawVersion": "2026.9.1"
|
|
69
70
|
},
|
|
70
71
|
"release": {
|
|
71
72
|
"publishToClawHub": true,
|