@openclaw/feishu 2026.5.2 → 2026.5.3-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accounts-Ba3-WP1z.js +423 -0
- package/dist/api.js +2280 -0
- package/dist/app-registration-B8qc1MCM.js +184 -0
- package/dist/audio-preflight.runtime-BPlzkO3l.js +7 -0
- package/dist/card-interaction-BfRLgvw_.js +96 -0
- package/dist/channel-CSD_Jt8I.js +1668 -0
- package/dist/channel-entry.js +22 -0
- package/dist/channel-plugin-api.js +2 -0
- package/dist/channel.runtime-DYsXcD36.js +700 -0
- package/dist/client-DBVoQL5w.js +157 -0
- package/dist/contract-api.js +9 -0
- package/dist/conversation-id-DWS3Ep2A.js +139 -0
- package/dist/directory.static-f3EeoRJd.js +44 -0
- package/dist/drive-C5eJLJr7.js +883 -0
- package/dist/index.js +68 -0
- package/dist/monitor-CT189QfR.js +60 -0
- package/dist/monitor.account-dJV2jO8C.js +4990 -0
- package/dist/monitor.state-DYM02ipp.js +100 -0
- package/dist/policy-D6c-wMPl.js +118 -0
- package/dist/probe-BNzzU_uR.js +149 -0
- package/dist/rolldown-runtime-DUslC3ob.js +14 -0
- package/dist/runtime-CG0DuRCy.js +8 -0
- package/dist/runtime-api.js +14 -0
- package/dist/secret-contract-Dm4Z_zQN.js +119 -0
- package/dist/secret-contract-api.js +2 -0
- package/dist/security-audit-DqJdocrN.js +11 -0
- package/dist/security-audit-shared-ByuMx9cJ.js +38 -0
- package/dist/security-contract-api.js +2 -0
- package/dist/send-DowxxbpH.js +1218 -0
- package/dist/session-conversation-B4nrW-vo.js +27 -0
- package/dist/session-key-api.js +2 -0
- package/dist/setup-api.js +2 -0
- package/dist/setup-entry.js +15 -0
- package/dist/subagent-hooks-C3UhPVLV.js +227 -0
- package/dist/subagent-hooks-api.js +23 -0
- package/dist/targets-JMFJRKSe.js +48 -0
- package/dist/thread-bindings-BmS6TLes.js +222 -0
- package/package.json +15 -6
- package/api.ts +0 -31
- package/channel-entry.ts +0 -20
- package/channel-plugin-api.ts +0 -1
- package/contract-api.ts +0 -16
- package/index.ts +0 -82
- package/runtime-api.ts +0 -55
- package/secret-contract-api.ts +0 -5
- package/security-contract-api.ts +0 -1
- package/session-key-api.ts +0 -1
- package/setup-api.ts +0 -3
- package/setup-entry.test.ts +0 -14
- package/setup-entry.ts +0 -13
- package/src/accounts.test.ts +0 -459
- package/src/accounts.ts +0 -326
- package/src/app-registration.ts +0 -331
- package/src/approval-auth.test.ts +0 -24
- package/src/approval-auth.ts +0 -25
- package/src/async.test.ts +0 -35
- package/src/async.ts +0 -104
- package/src/audio-preflight.runtime.ts +0 -9
- package/src/bitable.test.ts +0 -131
- package/src/bitable.ts +0 -762
- package/src/bot-content.ts +0 -474
- package/src/bot-group-name.test.ts +0 -108
- package/src/bot-runtime-api.ts +0 -12
- package/src/bot-sender-name.ts +0 -125
- package/src/bot.broadcast.test.ts +0 -463
- package/src/bot.card-action.test.ts +0 -577
- package/src/bot.checkBotMentioned.test.ts +0 -265
- package/src/bot.helpers.test.ts +0 -118
- package/src/bot.stripBotMention.test.ts +0 -126
- package/src/bot.test.ts +0 -3040
- package/src/bot.ts +0 -1559
- package/src/card-action.ts +0 -447
- package/src/card-interaction.test.ts +0 -129
- package/src/card-interaction.ts +0 -159
- package/src/card-test-helpers.ts +0 -47
- package/src/card-ux-approval.ts +0 -65
- package/src/card-ux-launcher.test.ts +0 -99
- package/src/card-ux-launcher.ts +0 -121
- package/src/card-ux-shared.ts +0 -33
- package/src/channel-runtime-api.ts +0 -16
- package/src/channel.runtime.ts +0 -47
- package/src/channel.test.ts +0 -959
- package/src/channel.ts +0 -1313
- package/src/chat-schema.ts +0 -25
- package/src/chat.test.ts +0 -196
- package/src/chat.ts +0 -188
- package/src/client.test.ts +0 -433
- package/src/client.ts +0 -290
- package/src/comment-dispatcher-runtime-api.ts +0 -6
- package/src/comment-dispatcher.test.ts +0 -169
- package/src/comment-dispatcher.ts +0 -107
- package/src/comment-handler-runtime-api.ts +0 -3
- package/src/comment-handler.test.ts +0 -486
- package/src/comment-handler.ts +0 -309
- package/src/comment-reaction.test.ts +0 -166
- package/src/comment-reaction.ts +0 -259
- package/src/comment-shared.test.ts +0 -182
- package/src/comment-shared.ts +0 -406
- package/src/comment-target.ts +0 -44
- package/src/config-schema.test.ts +0 -309
- package/src/config-schema.ts +0 -333
- package/src/conversation-id.test.ts +0 -18
- package/src/conversation-id.ts +0 -199
- package/src/dedup-runtime-api.ts +0 -1
- package/src/dedup.ts +0 -141
- package/src/directory.static.ts +0 -61
- package/src/directory.test.ts +0 -136
- package/src/directory.ts +0 -124
- package/src/doc-schema.ts +0 -182
- package/src/docx-batch-insert.test.ts +0 -91
- package/src/docx-batch-insert.ts +0 -223
- package/src/docx-color-text.ts +0 -154
- package/src/docx-table-ops.test.ts +0 -53
- package/src/docx-table-ops.ts +0 -316
- package/src/docx-types.ts +0 -38
- package/src/docx.account-selection.test.ts +0 -79
- package/src/docx.test.ts +0 -685
- package/src/docx.ts +0 -1616
- package/src/drive-schema.ts +0 -92
- package/src/drive.test.ts +0 -1219
- package/src/drive.ts +0 -829
- package/src/dynamic-agent.ts +0 -137
- package/src/event-types.ts +0 -45
- package/src/external-keys.test.ts +0 -20
- package/src/external-keys.ts +0 -19
- package/src/lifecycle.test-support.ts +0 -220
- package/src/media.test.ts +0 -900
- package/src/media.ts +0 -861
- package/src/mention-target.types.ts +0 -5
- package/src/mention.ts +0 -114
- package/src/message-action-contract.ts +0 -13
- package/src/monitor-state-runtime-api.ts +0 -7
- package/src/monitor-transport-runtime-api.ts +0 -7
- package/src/monitor.account.ts +0 -468
- package/src/monitor.acp-init-failure.lifecycle.test-support.ts +0 -219
- package/src/monitor.bot-identity.ts +0 -86
- package/src/monitor.bot-menu-handler.ts +0 -165
- package/src/monitor.bot-menu.lifecycle.test-support.ts +0 -224
- package/src/monitor.bot-menu.test.ts +0 -178
- package/src/monitor.broadcast.reply-once.lifecycle.test-support.ts +0 -264
- package/src/monitor.card-action.lifecycle.test-support.ts +0 -373
- package/src/monitor.cleanup.test.ts +0 -376
- package/src/monitor.comment-notice-handler.ts +0 -105
- package/src/monitor.comment.test.ts +0 -937
- package/src/monitor.comment.ts +0 -1386
- package/src/monitor.lifecycle.test.ts +0 -4
- package/src/monitor.message-handler.ts +0 -339
- package/src/monitor.reaction.lifecycle.test-support.ts +0 -68
- package/src/monitor.reaction.test.ts +0 -713
- package/src/monitor.startup.test.ts +0 -192
- package/src/monitor.startup.ts +0 -74
- package/src/monitor.state.defaults.test.ts +0 -46
- package/src/monitor.state.ts +0 -170
- package/src/monitor.synthetic-error.ts +0 -18
- package/src/monitor.test-mocks.ts +0 -45
- package/src/monitor.transport.ts +0 -424
- package/src/monitor.ts +0 -100
- package/src/monitor.webhook-e2e.test.ts +0 -272
- package/src/monitor.webhook-security.test.ts +0 -264
- package/src/monitor.webhook.test-helpers.ts +0 -116
- package/src/outbound-runtime-api.ts +0 -1
- package/src/outbound.test.ts +0 -935
- package/src/outbound.ts +0 -718
- package/src/perm-schema.ts +0 -52
- package/src/perm.ts +0 -170
- package/src/pins.ts +0 -108
- package/src/policy.test.ts +0 -334
- package/src/policy.ts +0 -236
- package/src/post.test.ts +0 -105
- package/src/post.ts +0 -275
- package/src/probe.test.ts +0 -275
- package/src/probe.ts +0 -166
- package/src/processing-claims.ts +0 -59
- package/src/qr-terminal.ts +0 -1
- package/src/reactions.ts +0 -123
- package/src/reasoning-preview.test.ts +0 -59
- package/src/reasoning-preview.ts +0 -20
- package/src/reply-dispatcher-runtime-api.ts +0 -7
- package/src/reply-dispatcher.test.ts +0 -1144
- package/src/reply-dispatcher.ts +0 -650
- package/src/runtime.ts +0 -9
- package/src/secret-contract.ts +0 -145
- package/src/secret-input.ts +0 -1
- package/src/security-audit-shared.ts +0 -69
- package/src/security-audit.test.ts +0 -61
- package/src/security-audit.ts +0 -1
- package/src/send-result.ts +0 -29
- package/src/send-target.test.ts +0 -80
- package/src/send-target.ts +0 -35
- package/src/send.reply-fallback.test.ts +0 -292
- package/src/send.test.ts +0 -550
- package/src/send.ts +0 -800
- package/src/sequential-key.test.ts +0 -72
- package/src/sequential-key.ts +0 -28
- package/src/sequential-queue.test.ts +0 -92
- package/src/sequential-queue.ts +0 -16
- package/src/session-conversation.ts +0 -42
- package/src/session-route.ts +0 -48
- package/src/setup-core.ts +0 -51
- package/src/setup-surface.test.ts +0 -174
- package/src/setup-surface.ts +0 -581
- package/src/streaming-card.test.ts +0 -190
- package/src/streaming-card.ts +0 -490
- package/src/subagent-hooks.test.ts +0 -603
- package/src/subagent-hooks.ts +0 -397
- package/src/targets.ts +0 -97
- package/src/test-support/lifecycle-test-support.ts +0 -453
- package/src/thread-bindings.test.ts +0 -143
- package/src/thread-bindings.ts +0 -330
- package/src/tool-account-routing.test.ts +0 -187
- package/src/tool-account.test.ts +0 -44
- package/src/tool-account.ts +0 -93
- package/src/tool-factory-test-harness.ts +0 -79
- package/src/tool-result.test.ts +0 -32
- package/src/tool-result.ts +0 -16
- package/src/tools-config.test.ts +0 -21
- package/src/tools-config.ts +0 -22
- package/src/types.ts +0 -104
- package/src/typing.test.ts +0 -144
- package/src/typing.ts +0 -214
- package/src/wiki-schema.ts +0 -55
- package/src/wiki.ts +0 -227
- package/subagent-hooks-api.ts +0 -31
- package/tsconfig.json +0 -16
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-DUslC3ob.js";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import * as Lark from "@larksuiteoapi/node-sdk";
|
|
4
|
+
import { readPluginPackageVersion, resolveAmbientNodeProxyAgent } from "openclaw/plugin-sdk/extension-shared";
|
|
5
|
+
//#region extensions/feishu/src/client-timeout.ts
|
|
6
|
+
/** Default HTTP timeout for Feishu API requests (30 seconds). */
|
|
7
|
+
const FEISHU_HTTP_TIMEOUT_MS = 3e4;
|
|
8
|
+
const FEISHU_HTTP_TIMEOUT_MAX_MS = 3e5;
|
|
9
|
+
const FEISHU_HTTP_TIMEOUT_ENV_VAR = "OPENCLAW_FEISHU_HTTP_TIMEOUT_MS";
|
|
10
|
+
function resolveConfiguredHttpTimeoutMs(creds) {
|
|
11
|
+
const clampTimeout = (value) => {
|
|
12
|
+
return Math.min(Math.max(Math.floor(value), 1), FEISHU_HTTP_TIMEOUT_MAX_MS);
|
|
13
|
+
};
|
|
14
|
+
const fromDirectField = creds.httpTimeoutMs;
|
|
15
|
+
if (typeof fromDirectField === "number" && Number.isFinite(fromDirectField) && fromDirectField > 0) return clampTimeout(fromDirectField);
|
|
16
|
+
const envRaw = process.env[FEISHU_HTTP_TIMEOUT_ENV_VAR];
|
|
17
|
+
if (envRaw) {
|
|
18
|
+
const envValue = Number(envRaw);
|
|
19
|
+
if (Number.isFinite(envValue) && envValue > 0) return clampTimeout(envValue);
|
|
20
|
+
}
|
|
21
|
+
const timeout = creds.config?.httpTimeoutMs;
|
|
22
|
+
if (typeof timeout !== "number" || !Number.isFinite(timeout) || timeout <= 0) return FEISHU_HTTP_TIMEOUT_MS;
|
|
23
|
+
return clampTimeout(timeout);
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region extensions/feishu/src/client.ts
|
|
27
|
+
var client_exports = /* @__PURE__ */ __exportAll({
|
|
28
|
+
FEISHU_HTTP_TIMEOUT_ENV_VAR: () => FEISHU_HTTP_TIMEOUT_ENV_VAR,
|
|
29
|
+
FEISHU_HTTP_TIMEOUT_MAX_MS: () => FEISHU_HTTP_TIMEOUT_MAX_MS,
|
|
30
|
+
FEISHU_HTTP_TIMEOUT_MS: () => FEISHU_HTTP_TIMEOUT_MS,
|
|
31
|
+
FEISHU_USER_AGENT: () => FEISHU_USER_AGENT,
|
|
32
|
+
createEventDispatcher: () => createEventDispatcher,
|
|
33
|
+
createFeishuClient: () => createFeishuClient,
|
|
34
|
+
createFeishuWSClient: () => createFeishuWSClient,
|
|
35
|
+
getFeishuUserAgent: () => getFeishuUserAgent,
|
|
36
|
+
pluginVersion: () => pluginVersion
|
|
37
|
+
});
|
|
38
|
+
const pluginVersion = readPluginPackageVersion({ require: createRequire(import.meta.url) });
|
|
39
|
+
const FEISHU_USER_AGENT = `openclaw-feishu-builtin/${pluginVersion}/${process.platform}`;
|
|
40
|
+
const FEISHU_WS_CONFIG = {
|
|
41
|
+
PingInterval: 30,
|
|
42
|
+
PingTimeout: 3
|
|
43
|
+
};
|
|
44
|
+
/** User-Agent header value for all Feishu API requests. */
|
|
45
|
+
function getFeishuUserAgent() {
|
|
46
|
+
return FEISHU_USER_AGENT;
|
|
47
|
+
}
|
|
48
|
+
let feishuClientSdk = {
|
|
49
|
+
AppType: Lark.AppType,
|
|
50
|
+
Client: Lark.Client,
|
|
51
|
+
defaultHttpInstance: Lark.defaultHttpInstance,
|
|
52
|
+
Domain: Lark.Domain,
|
|
53
|
+
EventDispatcher: Lark.EventDispatcher,
|
|
54
|
+
LoggerLevel: Lark.LoggerLevel,
|
|
55
|
+
WSClient: Lark.WSClient
|
|
56
|
+
};
|
|
57
|
+
{
|
|
58
|
+
const inst = Lark.defaultHttpInstance;
|
|
59
|
+
if (inst.interceptors?.request) {
|
|
60
|
+
inst.interceptors.request.handlers = [];
|
|
61
|
+
inst.interceptors.request.use((req) => {
|
|
62
|
+
const r = req;
|
|
63
|
+
if (r.headers) r.headers["User-Agent"] = getFeishuUserAgent();
|
|
64
|
+
return req;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function getWsProxyAgent() {
|
|
69
|
+
return resolveAmbientNodeProxyAgent();
|
|
70
|
+
}
|
|
71
|
+
const clientCache = /* @__PURE__ */ new Map();
|
|
72
|
+
function resolveDomain(domain) {
|
|
73
|
+
if (domain === "lark") return feishuClientSdk.Domain.Lark;
|
|
74
|
+
if (domain === "feishu" || !domain) return feishuClientSdk.Domain.Feishu;
|
|
75
|
+
return domain.replace(/\/+$/, "");
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create an HTTP instance that delegates to the Lark SDK's default instance
|
|
79
|
+
* but injects a default request timeout and User-Agent header to prevent
|
|
80
|
+
* indefinite hangs and set a standardized User-Agent per OAPI best practices.
|
|
81
|
+
*/
|
|
82
|
+
function createTimeoutHttpInstance(defaultTimeoutMs) {
|
|
83
|
+
const base = feishuClientSdk.defaultHttpInstance;
|
|
84
|
+
function injectTimeout(opts) {
|
|
85
|
+
return {
|
|
86
|
+
timeout: defaultTimeoutMs,
|
|
87
|
+
...opts
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
request: (opts) => base.request(injectTimeout(opts)),
|
|
92
|
+
get: (url, opts) => base.get(url, injectTimeout(opts)),
|
|
93
|
+
post: (url, data, opts) => base.post(url, data, injectTimeout(opts)),
|
|
94
|
+
put: (url, data, opts) => base.put(url, data, injectTimeout(opts)),
|
|
95
|
+
patch: (url, data, opts) => base.patch(url, data, injectTimeout(opts)),
|
|
96
|
+
delete: (url, opts) => base.delete(url, injectTimeout(opts)),
|
|
97
|
+
head: (url, opts) => base.head(url, injectTimeout(opts)),
|
|
98
|
+
options: (url, opts) => base.options(url, injectTimeout(opts))
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create or get a cached Feishu client for an account.
|
|
103
|
+
* Accepts any object with appId, appSecret, and optional domain/accountId.
|
|
104
|
+
*/
|
|
105
|
+
function createFeishuClient(creds) {
|
|
106
|
+
const { accountId = "default", appId, appSecret, domain } = creds;
|
|
107
|
+
const defaultHttpTimeoutMs = resolveConfiguredHttpTimeoutMs(creds);
|
|
108
|
+
if (!appId || !appSecret) throw new Error(`Feishu credentials not configured for account "${accountId}"`);
|
|
109
|
+
const cached = clientCache.get(accountId);
|
|
110
|
+
if (cached && cached.config.appId === appId && cached.config.appSecret === appSecret && cached.config.domain === domain && cached.config.httpTimeoutMs === defaultHttpTimeoutMs) return cached.client;
|
|
111
|
+
const client = new feishuClientSdk.Client({
|
|
112
|
+
appId,
|
|
113
|
+
appSecret,
|
|
114
|
+
appType: feishuClientSdk.AppType.SelfBuild,
|
|
115
|
+
domain: resolveDomain(domain),
|
|
116
|
+
httpInstance: createTimeoutHttpInstance(defaultHttpTimeoutMs)
|
|
117
|
+
});
|
|
118
|
+
clientCache.set(accountId, {
|
|
119
|
+
client,
|
|
120
|
+
config: {
|
|
121
|
+
appId,
|
|
122
|
+
appSecret,
|
|
123
|
+
domain,
|
|
124
|
+
httpTimeoutMs: defaultHttpTimeoutMs
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return client;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Create a Feishu WebSocket client for an account.
|
|
131
|
+
* Note: WSClient is not cached since each call creates a new connection.
|
|
132
|
+
*/
|
|
133
|
+
async function createFeishuWSClient(account, callbacks = {}) {
|
|
134
|
+
const { accountId, appId, appSecret, domain } = account;
|
|
135
|
+
if (!appId || !appSecret) throw new Error(`Feishu credentials not configured for account "${accountId}"`);
|
|
136
|
+
const agent = await getWsProxyAgent();
|
|
137
|
+
return new feishuClientSdk.WSClient({
|
|
138
|
+
appId,
|
|
139
|
+
appSecret,
|
|
140
|
+
domain: resolveDomain(domain),
|
|
141
|
+
...callbacks,
|
|
142
|
+
loggerLevel: feishuClientSdk.LoggerLevel.info,
|
|
143
|
+
wsConfig: FEISHU_WS_CONFIG,
|
|
144
|
+
...agent ? { agent } : {}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Create an event dispatcher for an account.
|
|
149
|
+
*/
|
|
150
|
+
function createEventDispatcher(account) {
|
|
151
|
+
return new feishuClientSdk.EventDispatcher({
|
|
152
|
+
encryptKey: account.encryptKey,
|
|
153
|
+
verificationToken: account.verificationToken
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
export { getFeishuUserAgent as a, createFeishuWSClient as i, createEventDispatcher as n, createFeishuClient as r, client_exports as t };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { a as parseFeishuTargetId, i as parseFeishuDirectConversationId, r as parseFeishuConversationId, t as buildFeishuConversationId } from "./conversation-id-DWS3Ep2A.js";
|
|
2
|
+
import { n as createFeishuThreadBindingManager, t as __testing } from "./thread-bindings-BmS6TLes.js";
|
|
3
|
+
import { t as messageActionTargetAliases } from "./security-audit-DqJdocrN.js";
|
|
4
|
+
import { n as collectRuntimeConfigAssignments, r as secretTargetRegistryEntries } from "./secret-contract-Dm4Z_zQN.js";
|
|
5
|
+
import { t as collectFeishuSecurityAuditFindings } from "./security-audit-shared-ByuMx9cJ.js";
|
|
6
|
+
//#region extensions/feishu/contract-api.ts
|
|
7
|
+
const feishuSessionBindingAdapterChannels = ["feishu"];
|
|
8
|
+
//#endregion
|
|
9
|
+
export { buildFeishuConversationId, collectFeishuSecurityAuditFindings, collectRuntimeConfigAssignments, createFeishuThreadBindingManager, feishuSessionBindingAdapterChannels, __testing as feishuThreadBindingTesting, messageActionTargetAliases, parseFeishuConversationId, parseFeishuDirectConversationId, parseFeishuTargetId, secretTargetRegistryEntries };
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { normalizeLowercaseStringOrEmpty } from "openclaw/plugin-sdk/text-runtime";
|
|
2
|
+
//#region extensions/feishu/src/conversation-id.ts
|
|
3
|
+
function normalizeText(value) {
|
|
4
|
+
if (typeof value !== "string") return;
|
|
5
|
+
return value.trim() || void 0;
|
|
6
|
+
}
|
|
7
|
+
function buildFeishuConversationId(params) {
|
|
8
|
+
const chatId = normalizeText(params.chatId) ?? "unknown";
|
|
9
|
+
const senderOpenId = normalizeText(params.senderOpenId);
|
|
10
|
+
const topicId = normalizeText(params.topicId);
|
|
11
|
+
switch (params.scope) {
|
|
12
|
+
case "group_sender": return senderOpenId ? `${chatId}:sender:${senderOpenId}` : chatId;
|
|
13
|
+
case "group_topic": return topicId ? `${chatId}:topic:${topicId}` : chatId;
|
|
14
|
+
case "group_topic_sender":
|
|
15
|
+
if (topicId && senderOpenId) return `${chatId}:topic:${topicId}:sender:${senderOpenId}`;
|
|
16
|
+
if (topicId) return `${chatId}:topic:${topicId}`;
|
|
17
|
+
return senderOpenId ? `${chatId}:sender:${senderOpenId}` : chatId;
|
|
18
|
+
default: return chatId;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function parseFeishuTargetId(raw) {
|
|
22
|
+
const target = normalizeText(raw);
|
|
23
|
+
if (!target) return;
|
|
24
|
+
const withoutProvider = target.replace(/^(feishu|lark):/i, "").trim();
|
|
25
|
+
if (!withoutProvider) return;
|
|
26
|
+
const lowered = normalizeLowercaseStringOrEmpty(withoutProvider);
|
|
27
|
+
for (const prefix of [
|
|
28
|
+
"chat:",
|
|
29
|
+
"group:",
|
|
30
|
+
"channel:",
|
|
31
|
+
"user:",
|
|
32
|
+
"dm:",
|
|
33
|
+
"open_id:"
|
|
34
|
+
]) if (lowered.startsWith(prefix)) return normalizeText(withoutProvider.slice(prefix.length));
|
|
35
|
+
return withoutProvider;
|
|
36
|
+
}
|
|
37
|
+
function parseFeishuDirectConversationId(raw) {
|
|
38
|
+
const target = normalizeText(raw);
|
|
39
|
+
if (!target) return;
|
|
40
|
+
const withoutProvider = target.replace(/^(feishu|lark):/i, "").trim();
|
|
41
|
+
if (!withoutProvider) return;
|
|
42
|
+
const lowered = normalizeLowercaseStringOrEmpty(withoutProvider);
|
|
43
|
+
for (const prefix of [
|
|
44
|
+
"user:",
|
|
45
|
+
"dm:",
|
|
46
|
+
"open_id:"
|
|
47
|
+
]) if (lowered.startsWith(prefix)) return normalizeText(withoutProvider.slice(prefix.length));
|
|
48
|
+
const id = parseFeishuTargetId(target);
|
|
49
|
+
if (!id) return;
|
|
50
|
+
if (id.startsWith("ou_") || id.startsWith("on_")) return id;
|
|
51
|
+
}
|
|
52
|
+
function parseFeishuConversationId(params) {
|
|
53
|
+
const conversationId = normalizeText(params.conversationId);
|
|
54
|
+
const parentConversationId = normalizeText(params.parentConversationId);
|
|
55
|
+
if (!conversationId) return null;
|
|
56
|
+
const topicSenderMatch = conversationId.match(/^(.+):topic:([^:]+):sender:([^:]+)$/i);
|
|
57
|
+
if (topicSenderMatch) {
|
|
58
|
+
const [, chatId, topicId, senderOpenId] = topicSenderMatch;
|
|
59
|
+
return {
|
|
60
|
+
canonicalConversationId: buildFeishuConversationId({
|
|
61
|
+
chatId,
|
|
62
|
+
scope: "group_topic_sender",
|
|
63
|
+
topicId,
|
|
64
|
+
senderOpenId
|
|
65
|
+
}),
|
|
66
|
+
chatId,
|
|
67
|
+
topicId,
|
|
68
|
+
senderOpenId,
|
|
69
|
+
scope: "group_topic_sender"
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const topicMatch = conversationId.match(/^(.+):topic:([^:]+)$/i);
|
|
73
|
+
if (topicMatch) {
|
|
74
|
+
const [, chatId, topicId] = topicMatch;
|
|
75
|
+
return {
|
|
76
|
+
canonicalConversationId: buildFeishuConversationId({
|
|
77
|
+
chatId,
|
|
78
|
+
scope: "group_topic",
|
|
79
|
+
topicId
|
|
80
|
+
}),
|
|
81
|
+
chatId,
|
|
82
|
+
topicId,
|
|
83
|
+
scope: "group_topic"
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const senderMatch = conversationId.match(/^(.+):sender:([^:]+)$/i);
|
|
87
|
+
if (senderMatch) {
|
|
88
|
+
const [, chatId, senderOpenId] = senderMatch;
|
|
89
|
+
return {
|
|
90
|
+
canonicalConversationId: buildFeishuConversationId({
|
|
91
|
+
chatId,
|
|
92
|
+
scope: "group_sender",
|
|
93
|
+
senderOpenId
|
|
94
|
+
}),
|
|
95
|
+
chatId,
|
|
96
|
+
senderOpenId,
|
|
97
|
+
scope: "group_sender"
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (parentConversationId) return {
|
|
101
|
+
canonicalConversationId: buildFeishuConversationId({
|
|
102
|
+
chatId: parentConversationId,
|
|
103
|
+
scope: "group_topic",
|
|
104
|
+
topicId: conversationId
|
|
105
|
+
}),
|
|
106
|
+
chatId: parentConversationId,
|
|
107
|
+
topicId: conversationId,
|
|
108
|
+
scope: "group_topic"
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
canonicalConversationId: conversationId,
|
|
112
|
+
chatId: conversationId,
|
|
113
|
+
scope: "group"
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function buildFeishuModelOverrideParentCandidates(parentConversationId) {
|
|
117
|
+
const rawId = normalizeText(parentConversationId);
|
|
118
|
+
if (!rawId) return [];
|
|
119
|
+
const topicSenderMatch = rawId.match(/^(.+):topic:([^:]+):sender:([^:]+)$/i);
|
|
120
|
+
if (topicSenderMatch) {
|
|
121
|
+
const chatId = normalizeLowercaseStringOrEmpty(topicSenderMatch[1]);
|
|
122
|
+
const topicId = normalizeLowercaseStringOrEmpty(topicSenderMatch[2]);
|
|
123
|
+
if (chatId && topicId) return [`${chatId}:topic:${topicId}`, chatId];
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
const topicMatch = rawId.match(/^(.+):topic:([^:]+)$/i);
|
|
127
|
+
if (topicMatch) {
|
|
128
|
+
const chatId = normalizeLowercaseStringOrEmpty(topicMatch[1]);
|
|
129
|
+
return chatId ? [chatId] : [];
|
|
130
|
+
}
|
|
131
|
+
const senderMatch = rawId.match(/^(.+):sender:([^:]+)$/i);
|
|
132
|
+
if (senderMatch) {
|
|
133
|
+
const chatId = normalizeLowercaseStringOrEmpty(senderMatch[1]);
|
|
134
|
+
return chatId ? [chatId] : [];
|
|
135
|
+
}
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
//#endregion
|
|
139
|
+
export { parseFeishuTargetId as a, parseFeishuDirectConversationId as i, buildFeishuModelOverrideParentCandidates as n, parseFeishuConversationId as r, buildFeishuConversationId as t };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { r as normalizeFeishuTarget } from "./targets-JMFJRKSe.js";
|
|
2
|
+
import { o as resolveFeishuAccount } from "./accounts-Ba3-WP1z.js";
|
|
3
|
+
import { listDirectoryGroupEntriesFromMapKeysAndAllowFrom, listDirectoryUserEntriesFromAllowFromAndMapKeys } from "openclaw/plugin-sdk/directory-runtime";
|
|
4
|
+
//#region extensions/feishu/src/directory.static.ts
|
|
5
|
+
function toFeishuDirectoryPeers(ids) {
|
|
6
|
+
return ids.map((id) => ({
|
|
7
|
+
kind: "user",
|
|
8
|
+
id
|
|
9
|
+
}));
|
|
10
|
+
}
|
|
11
|
+
function toFeishuDirectoryGroups(ids) {
|
|
12
|
+
return ids.map((id) => ({
|
|
13
|
+
kind: "group",
|
|
14
|
+
id
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
async function listFeishuDirectoryPeers(params) {
|
|
18
|
+
const account = resolveFeishuAccount({
|
|
19
|
+
cfg: params.cfg,
|
|
20
|
+
accountId: params.accountId
|
|
21
|
+
});
|
|
22
|
+
return toFeishuDirectoryPeers(listDirectoryUserEntriesFromAllowFromAndMapKeys({
|
|
23
|
+
allowFrom: account.config.allowFrom,
|
|
24
|
+
map: account.config.dms,
|
|
25
|
+
query: params.query,
|
|
26
|
+
limit: params.limit,
|
|
27
|
+
normalizeAllowFromId: (entry) => normalizeFeishuTarget(entry) ?? entry,
|
|
28
|
+
normalizeMapKeyId: (entry) => normalizeFeishuTarget(entry) ?? entry
|
|
29
|
+
}).map((entry) => entry.id));
|
|
30
|
+
}
|
|
31
|
+
async function listFeishuDirectoryGroups(params) {
|
|
32
|
+
const account = resolveFeishuAccount({
|
|
33
|
+
cfg: params.cfg,
|
|
34
|
+
accountId: params.accountId
|
|
35
|
+
});
|
|
36
|
+
return toFeishuDirectoryGroups(listDirectoryGroupEntriesFromMapKeysAndAllowFrom({
|
|
37
|
+
groups: account.config.groups,
|
|
38
|
+
allowFrom: account.config.groupAllowFrom,
|
|
39
|
+
query: params.query,
|
|
40
|
+
limit: params.limit
|
|
41
|
+
}).map((entry) => entry.id));
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { listFeishuDirectoryPeers as n, listFeishuDirectoryGroups as t };
|