@openclaw-cn/feishu 0.1.8

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 (167) hide show
  1. package/README.md +86 -0
  2. package/dist/index.d.ts +37 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +49 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/src/accounts.d.ts +33 -0
  7. package/dist/src/accounts.d.ts.map +1 -0
  8. package/dist/src/accounts.js +110 -0
  9. package/dist/src/accounts.js.map +1 -0
  10. package/dist/src/bitable.d.ts +211 -0
  11. package/dist/src/bitable.d.ts.map +1 -0
  12. package/dist/src/bitable.js +721 -0
  13. package/dist/src/bitable.js.map +1 -0
  14. package/dist/src/bot.d.ts +53 -0
  15. package/dist/src/bot.d.ts.map +1 -0
  16. package/dist/src/bot.js +853 -0
  17. package/dist/src/bot.js.map +1 -0
  18. package/dist/src/calendar-schema.d.ts +18 -0
  19. package/dist/src/calendar-schema.d.ts.map +1 -0
  20. package/dist/src/calendar-schema.js +52 -0
  21. package/dist/src/calendar-schema.js.map +1 -0
  22. package/dist/src/calendar.d.ts +441 -0
  23. package/dist/src/calendar.d.ts.map +1 -0
  24. package/dist/src/calendar.js +257 -0
  25. package/dist/src/calendar.js.map +1 -0
  26. package/dist/src/channel.d.ts +4 -0
  27. package/dist/src/channel.d.ts.map +1 -0
  28. package/dist/src/channel.js +331 -0
  29. package/dist/src/channel.js.map +1 -0
  30. package/dist/src/client.d.ts +35 -0
  31. package/dist/src/client.d.ts.map +1 -0
  32. package/dist/src/client.js +86 -0
  33. package/dist/src/client.js.map +1 -0
  34. package/dist/src/config-schema.d.ts +176 -0
  35. package/dist/src/config-schema.d.ts.map +1 -0
  36. package/dist/src/config-schema.js +56 -0
  37. package/dist/src/config-schema.js.map +1 -0
  38. package/dist/src/directory.d.ts +36 -0
  39. package/dist/src/directory.d.ts.map +1 -0
  40. package/dist/src/directory.js +129 -0
  41. package/dist/src/directory.js.map +1 -0
  42. package/dist/src/doc-schema.d.ts +37 -0
  43. package/dist/src/doc-schema.d.ts.map +1 -0
  44. package/dist/src/doc-schema.js +51 -0
  45. package/dist/src/doc-schema.js.map +1 -0
  46. package/dist/src/docx.d.ts +3 -0
  47. package/dist/src/docx.d.ts.map +1 -0
  48. package/dist/src/docx.js +608 -0
  49. package/dist/src/docx.js.map +1 -0
  50. package/dist/src/drive-schema.d.ts +24 -0
  51. package/dist/src/drive-schema.d.ts.map +1 -0
  52. package/dist/src/drive-schema.js +39 -0
  53. package/dist/src/drive-schema.js.map +1 -0
  54. package/dist/src/drive.d.ts +3 -0
  55. package/dist/src/drive.d.ts.map +1 -0
  56. package/dist/src/drive.js +181 -0
  57. package/dist/src/drive.js.map +1 -0
  58. package/dist/src/dynamic-agent.d.ts +19 -0
  59. package/dist/src/dynamic-agent.d.ts.map +1 -0
  60. package/dist/src/dynamic-agent.js +91 -0
  61. package/dist/src/dynamic-agent.js.map +1 -0
  62. package/dist/src/im-schema.d.ts +38 -0
  63. package/dist/src/im-schema.d.ts.map +1 -0
  64. package/dist/src/im-schema.js +73 -0
  65. package/dist/src/im-schema.js.map +1 -0
  66. package/dist/src/im.d.ts +70 -0
  67. package/dist/src/im.d.ts.map +1 -0
  68. package/dist/src/im.js +328 -0
  69. package/dist/src/im.js.map +1 -0
  70. package/dist/src/media.d.ts +99 -0
  71. package/dist/src/media.d.ts.map +1 -0
  72. package/dist/src/media.js +454 -0
  73. package/dist/src/media.js.map +1 -0
  74. package/dist/src/mention.d.ts +49 -0
  75. package/dist/src/mention.d.ts.map +1 -0
  76. package/dist/src/mention.js +99 -0
  77. package/dist/src/mention.js.map +1 -0
  78. package/dist/src/monitor.d.ts +16 -0
  79. package/dist/src/monitor.d.ts.map +1 -0
  80. package/dist/src/monitor.js +288 -0
  81. package/dist/src/monitor.js.map +1 -0
  82. package/dist/src/onboarding.d.ts +3 -0
  83. package/dist/src/onboarding.d.ts.map +1 -0
  84. package/dist/src/onboarding.js +119 -0
  85. package/dist/src/onboarding.js.map +1 -0
  86. package/dist/src/outbound.d.ts +3 -0
  87. package/dist/src/outbound.d.ts.map +1 -0
  88. package/dist/src/outbound.js +53 -0
  89. package/dist/src/outbound.js.map +1 -0
  90. package/dist/src/perm-schema.d.ts +21 -0
  91. package/dist/src/perm-schema.d.ts.map +1 -0
  92. package/dist/src/perm-schema.js +47 -0
  93. package/dist/src/perm-schema.js.map +1 -0
  94. package/dist/src/perm.d.ts +14 -0
  95. package/dist/src/perm.d.ts.map +1 -0
  96. package/dist/src/perm.js +106 -0
  97. package/dist/src/perm.js.map +1 -0
  98. package/dist/src/policy.d.ts +28 -0
  99. package/dist/src/policy.d.ts.map +1 -0
  100. package/dist/src/policy.js +61 -0
  101. package/dist/src/policy.js.map +1 -0
  102. package/dist/src/probe.d.ts +4 -0
  103. package/dist/src/probe.d.ts.map +1 -0
  104. package/dist/src/probe.js +41 -0
  105. package/dist/src/probe.js.map +1 -0
  106. package/dist/src/reactions.d.ts +66 -0
  107. package/dist/src/reactions.d.ts.map +1 -0
  108. package/dist/src/reactions.js +104 -0
  109. package/dist/src/reactions.js.map +1 -0
  110. package/dist/src/reply-dispatcher.d.ts +41 -0
  111. package/dist/src/reply-dispatcher.d.ts.map +1 -0
  112. package/dist/src/reply-dispatcher.js +249 -0
  113. package/dist/src/reply-dispatcher.js.map +1 -0
  114. package/dist/src/runtime.d.ts +4 -0
  115. package/dist/src/runtime.d.ts.map +1 -0
  116. package/dist/src/runtime.js +11 -0
  117. package/dist/src/runtime.js.map +1 -0
  118. package/dist/src/send.d.ts +76 -0
  119. package/dist/src/send.d.ts.map +1 -0
  120. package/dist/src/send.js +250 -0
  121. package/dist/src/send.js.map +1 -0
  122. package/dist/src/sheets-schema.d.ts +12 -0
  123. package/dist/src/sheets-schema.d.ts.map +1 -0
  124. package/dist/src/sheets-schema.js +35 -0
  125. package/dist/src/sheets-schema.js.map +1 -0
  126. package/dist/src/sheets.d.ts +45 -0
  127. package/dist/src/sheets.d.ts.map +1 -0
  128. package/dist/src/sheets.js +197 -0
  129. package/dist/src/sheets.js.map +1 -0
  130. package/dist/src/streaming-card.d.ts +29 -0
  131. package/dist/src/streaming-card.d.ts.map +1 -0
  132. package/dist/src/streaming-card.js +192 -0
  133. package/dist/src/streaming-card.js.map +1 -0
  134. package/dist/src/targets.d.ts +7 -0
  135. package/dist/src/targets.d.ts.map +1 -0
  136. package/dist/src/targets.js +70 -0
  137. package/dist/src/targets.js.map +1 -0
  138. package/dist/src/task-schema.d.ts +19 -0
  139. package/dist/src/task-schema.d.ts.map +1 -0
  140. package/dist/src/task-schema.js +54 -0
  141. package/dist/src/task-schema.js.map +1 -0
  142. package/dist/src/task.d.ts +1193 -0
  143. package/dist/src/task.d.ts.map +1 -0
  144. package/dist/src/task.js +274 -0
  145. package/dist/src/task.js.map +1 -0
  146. package/dist/src/tools-config.d.ts +12 -0
  147. package/dist/src/tools-config.d.ts.map +1 -0
  148. package/dist/src/tools-config.js +24 -0
  149. package/dist/src/tools-config.js.map +1 -0
  150. package/dist/src/types.d.ts +74 -0
  151. package/dist/src/types.d.ts.map +1 -0
  152. package/dist/src/types.js +2 -0
  153. package/dist/src/types.js.map +1 -0
  154. package/dist/src/typing.d.ts +22 -0
  155. package/dist/src/typing.d.ts.map +1 -0
  156. package/dist/src/typing.js +60 -0
  157. package/dist/src/typing.js.map +1 -0
  158. package/dist/src/wiki-schema.d.ts +34 -0
  159. package/dist/src/wiki-schema.d.ts.map +1 -0
  160. package/dist/src/wiki-schema.js +43 -0
  161. package/dist/src/wiki-schema.js.map +1 -0
  162. package/dist/src/wiki.d.ts +3 -0
  163. package/dist/src/wiki.d.ts.map +1 -0
  164. package/dist/src/wiki.js +176 -0
  165. package/dist/src/wiki.js.map +1 -0
  166. package/openclaw.plugin.json +9 -0
  167. package/package.json +79 -0
package/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # @openclaw-cn/feishu
2
+
3
+ 飞书(Larksuite)频道插件,用于 OpenClaw 中文版
4
+
5
+ ## 安装
6
+
7
+ ### 工作空间模式(开发)
8
+ 如果你在 openclaw-cn 工作空间中:
9
+ ```bash
10
+ pnpm install
11
+ ```
12
+
13
+ ### NPM 模式(独立使用)
14
+ ```bash
15
+ # 1. 安装 openclaw(如果还没安装)
16
+ npm install openclaw
17
+
18
+ # 2. 安装 feishu 插件
19
+ npx openclaw-cn plugins install @openclaw-cn/feishu
20
+ ```
21
+
22
+ 或手动安装:
23
+ ```bash
24
+ npm install @openclaw-cn/feishu
25
+ ```
26
+
27
+ ## 配置
28
+
29
+ ### 获取 Feishu 凭证
30
+
31
+ 1. 访问 [Feishu 开放平台](https://open.feishu.cn/)
32
+ 2. 创建企业应用或个人应用
33
+ 3. 获取以下凭证:
34
+ - App ID
35
+ - App Secret
36
+ - 机器人 Token(可选)
37
+
38
+ ### 在 OpenClaw 中配置
39
+
40
+ ```yaml
41
+ channels:
42
+ feishu:
43
+ enabled: true
44
+ accounts:
45
+ - id: "default"
46
+ appId: "your_app_id"
47
+ appSecret: "your_app_secret"
48
+ botToken: "your_bot_token" # 可选
49
+ ```
50
+
51
+ ## 功能
52
+
53
+ - ✅ 接收飞书消息
54
+ - ✅ 发送回复
55
+ - ✅ 支持富文本格式
56
+ - ✅ 支持多账户配置
57
+ - ✅ 自动化回复
58
+
59
+ ## 环境要求
60
+
61
+ - Node.js 22+
62
+ - openclaw-cn 或 openclaw(NPM 模式)
63
+
64
+ ## 故障排除
65
+
66
+ ### "Cannot resolve plugin SDK" 错误
67
+ - **Workspace 模式**:确保在项目根目录运行 `pnpm install`
68
+ - **NPM 模式**:确保 `openclaw` 包已安装在 node_modules 中
69
+
70
+ ### 消息无法接收
71
+ 1. 检查 App ID 和 Secret 是否正确
72
+ 2. 验证机器人权限设置
73
+ 3. 查看日志:`clawdbot-cn logs --follow`
74
+
75
+ ### 连接超时
76
+ - 检查网络连接
77
+ - 验证飞书 API 端点可访问
78
+ - 查看防火墙设置
79
+
80
+ ## 许可
81
+
82
+ MIT
83
+
84
+ ## 贡献
85
+
86
+ 欢迎贡献!请阅读 [CONTRIBUTING.md](../../CONTRIBUTING.md)
@@ -0,0 +1,37 @@
1
+ import type { ClawdbotPluginApi } from "openclaw/plugin-sdk";
2
+ declare const plugin: {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ configSchema: {
7
+ safeParse?: (value: unknown) => {
8
+ success: boolean;
9
+ data?: unknown;
10
+ error?: {
11
+ issues?: Array<{
12
+ path: Array<string | number>;
13
+ message: string;
14
+ }>;
15
+ };
16
+ };
17
+ parse?: (value: unknown) => unknown;
18
+ validate?: (value: unknown) => {
19
+ ok: true;
20
+ value?: unknown;
21
+ } | {
22
+ ok: false;
23
+ errors: string[];
24
+ };
25
+ uiHints?: Record<string, {
26
+ label?: string;
27
+ help?: string;
28
+ advanced?: boolean;
29
+ sensitive?: boolean;
30
+ placeholder?: string;
31
+ }>;
32
+ jsonSchema?: Record<string, unknown>;
33
+ };
34
+ register(api: ClawdbotPluginApi): void;
35
+ };
36
+ export default plugin;
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAiB7D,QAAA,MAAM,MAAM;;;;;;;gBAmC0s0O,CAAC;iBAAoB,CAAC;sBAAgB,CAAC;;;;;;;;;;;;;;;;;;;;;;;kBA9B7u0O,iBAAiB;CA2BhC,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,49 @@
1
+ // @ts-ignore - dynamic import resolution
2
+ import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
3
+ import { feishuPlugin } from "./src/channel.js";
4
+ import { setFeishuRuntime } from "./src/runtime.js";
5
+ // Core document & knowledge modules
6
+ import { registerFeishuDocTools } from "./src/docx.js";
7
+ import { registerFeishuDriveTools } from "./src/drive.js";
8
+ import { registerFeishuWikiTools } from "./src/wiki.js";
9
+ import { registerFeishuPermTools } from "./src/perm.js";
10
+ import { registerFeishuBitableTools } from "./src/bitable.js";
11
+ // Enhanced modules
12
+ import { registerFeishuImTools } from "./src/im.js";
13
+ import { registerFeishuTaskTools } from "./src/task.js";
14
+ import { registerFeishuCalendarTools } from "./src/calendar.js";
15
+ import { registerFeishuSheetsTools } from "./src/sheets.js";
16
+ const plugin = {
17
+ id: "feishu",
18
+ name: "Feishu",
19
+ description: "Feishu (Larksuite) channel plugin",
20
+ configSchema: emptyPluginConfigSchema(),
21
+ register(api) {
22
+ setFeishuRuntime(api.runtime);
23
+ api.registerChannel({ plugin: feishuPlugin });
24
+ // Register all tool modules
25
+ const registrations = [
26
+ registerFeishuDocTools,
27
+ registerFeishuDriveTools,
28
+ registerFeishuWikiTools,
29
+ registerFeishuPermTools,
30
+ registerFeishuBitableTools,
31
+ registerFeishuImTools,
32
+ registerFeishuTaskTools,
33
+ registerFeishuCalendarTools,
34
+ registerFeishuSheetsTools,
35
+ ];
36
+ for (const register of registrations) {
37
+ try {
38
+ register(api);
39
+ }
40
+ catch (e) {
41
+ console.error(`[feishu] tool registration failed: ${register.name}`, e);
42
+ }
43
+ }
44
+ // Log directly to console to ensure visibility during startup
45
+ console.log(`[feishu] plugins registered: ${registrations.length} modules loaded`);
46
+ },
47
+ };
48
+ export default plugin;
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAGA,yCAAyC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,oCAAoC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,mBAAmB;AACnB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,mCAAmC;IAChD,YAAY,EAAE,uBAAuB,EAAE;IACvC,QAAQ,CAAC,GAAsB;QAC7B,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,GAAG,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAE9C,4BAA4B;QAC5B,MAAM,aAAa,GAAG;YACpB,sBAAsB;YACtB,wBAAwB;YACxB,uBAAuB;YACvB,uBAAuB;YACvB,0BAA0B;YAC1B,qBAAqB;YACrB,uBAAuB;YACvB,2BAA2B;YAC3B,yBAAyB;SAC1B,CAAC;QAEF,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAU,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,sCAAsC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,8DAA8D;QAC9D,OAAO,CAAC,GAAG,CAAC,gCAAgC,aAAa,CAAC,MAAM,iBAAiB,CAAC,CAAC;IACrF,CAAC;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { OpenClawConfig as ClawdbotConfig } from "openclaw/plugin-sdk";
2
+ import type { FeishuConfig, FeishuDomain, ResolvedFeishuAccount } from "./types.js";
3
+ /**
4
+ * List all Feishu account IDs.
5
+ * If no accounts are configured, returns [DEFAULT_ACCOUNT_ID] for backward compatibility.
6
+ */
7
+ export declare function listFeishuAccountIds(cfg: ClawdbotConfig): string[];
8
+ /**
9
+ * Resolve the default account ID.
10
+ */
11
+ export declare function resolveDefaultFeishuAccountId(cfg: ClawdbotConfig): string;
12
+ /**
13
+ * Resolve Feishu credentials from a config.
14
+ */
15
+ export declare function resolveFeishuCredentials(cfg?: FeishuConfig): {
16
+ appId: string;
17
+ appSecret: string;
18
+ encryptKey?: string;
19
+ verificationToken?: string;
20
+ domain: FeishuDomain;
21
+ } | null;
22
+ /**
23
+ * Resolve a complete Feishu account with merged config.
24
+ */
25
+ export declare function resolveFeishuAccount(params: {
26
+ cfg: ClawdbotConfig;
27
+ accountId?: string | null;
28
+ }): ResolvedFeishuAccount;
29
+ /**
30
+ * List all enabled and configured accounts.
31
+ */
32
+ export declare function listEnabledFeishuAccounts(cfg: ClawdbotConfig): ResolvedFeishuAccount[];
33
+ //# sourceMappingURL=accounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,KAAK,EACV,YAAY,EAEZ,YAAY,EACZ,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAapB;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAOlE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAMzE;AAiCD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,YAAY,GAAG;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,YAAY,CAAC;CACtB,GAAG,IAAI,CAaP;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,qBAAqB,CA6BxB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,cAAc,GAAG,qBAAqB,EAAE,CAItF"}
@@ -0,0 +1,110 @@
1
+ import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "openclaw/plugin-sdk";
2
+ /**
3
+ * List all configured account IDs from the accounts field.
4
+ */
5
+ function listConfiguredAccountIds(cfg) {
6
+ const accounts = cfg.channels?.feishu?.accounts;
7
+ if (!accounts || typeof accounts !== "object") {
8
+ return [];
9
+ }
10
+ return Object.keys(accounts).filter(Boolean);
11
+ }
12
+ /**
13
+ * List all Feishu account IDs.
14
+ * If no accounts are configured, returns [DEFAULT_ACCOUNT_ID] for backward compatibility.
15
+ */
16
+ export function listFeishuAccountIds(cfg) {
17
+ const ids = listConfiguredAccountIds(cfg);
18
+ if (ids.length === 0) {
19
+ // Backward compatibility: no accounts configured, use default
20
+ return [DEFAULT_ACCOUNT_ID];
21
+ }
22
+ return [...ids].sort((a, b) => a.localeCompare(b));
23
+ }
24
+ /**
25
+ * Resolve the default account ID.
26
+ */
27
+ export function resolveDefaultFeishuAccountId(cfg) {
28
+ const ids = listFeishuAccountIds(cfg);
29
+ if (ids.includes(DEFAULT_ACCOUNT_ID)) {
30
+ return DEFAULT_ACCOUNT_ID;
31
+ }
32
+ return ids[0] ?? DEFAULT_ACCOUNT_ID;
33
+ }
34
+ /**
35
+ * Get the raw account-specific config.
36
+ */
37
+ function resolveAccountConfig(cfg, accountId) {
38
+ const accounts = cfg.channels?.feishu?.accounts;
39
+ if (!accounts || typeof accounts !== "object") {
40
+ return undefined;
41
+ }
42
+ return accounts[accountId];
43
+ }
44
+ /**
45
+ * Merge top-level config with account-specific config.
46
+ * Account-specific fields override top-level fields.
47
+ */
48
+ function mergeFeishuAccountConfig(cfg, accountId) {
49
+ const feishuCfg = cfg.channels?.feishu;
50
+ // Extract base config (exclude accounts field to avoid recursion)
51
+ const { accounts: _ignored, ...base } = feishuCfg ?? {};
52
+ // Get account-specific overrides
53
+ const account = resolveAccountConfig(cfg, accountId) ?? {};
54
+ // Merge: account config overrides base config
55
+ return { ...base, ...account };
56
+ }
57
+ /**
58
+ * Resolve Feishu credentials from a config.
59
+ */
60
+ export function resolveFeishuCredentials(cfg) {
61
+ const appId = cfg?.appId?.trim();
62
+ const appSecret = cfg?.appSecret?.trim();
63
+ if (!appId || !appSecret) {
64
+ return null;
65
+ }
66
+ return {
67
+ appId,
68
+ appSecret,
69
+ encryptKey: cfg?.encryptKey?.trim() || undefined,
70
+ verificationToken: cfg?.verificationToken?.trim() || undefined,
71
+ domain: cfg?.domain ?? "feishu",
72
+ };
73
+ }
74
+ /**
75
+ * Resolve a complete Feishu account with merged config.
76
+ */
77
+ export function resolveFeishuAccount(params) {
78
+ const accountId = normalizeAccountId(params.accountId);
79
+ const feishuCfg = params.cfg.channels?.feishu;
80
+ // Base enabled state (top-level)
81
+ const baseEnabled = feishuCfg?.enabled !== false;
82
+ // Merge configs
83
+ const merged = mergeFeishuAccountConfig(params.cfg, accountId);
84
+ // Account-level enabled state
85
+ const accountEnabled = merged.enabled !== false;
86
+ const enabled = baseEnabled && accountEnabled;
87
+ // Resolve credentials from merged config
88
+ const creds = resolveFeishuCredentials(merged);
89
+ return {
90
+ accountId,
91
+ enabled,
92
+ configured: Boolean(creds),
93
+ name: merged.name?.trim() || undefined,
94
+ appId: creds?.appId,
95
+ appSecret: creds?.appSecret,
96
+ encryptKey: creds?.encryptKey,
97
+ verificationToken: creds?.verificationToken,
98
+ domain: creds?.domain ?? "feishu",
99
+ config: merged,
100
+ };
101
+ }
102
+ /**
103
+ * List all enabled and configured accounts.
104
+ */
105
+ export function listEnabledFeishuAccounts(cfg) {
106
+ return listFeishuAccountIds(cfg)
107
+ .map((accountId) => resolveFeishuAccount({ cfg, accountId }))
108
+ .filter((account) => account.enabled && account.configured);
109
+ }
110
+ //# sourceMappingURL=accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../src/accounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
2
+ import { createFeishuClient } from "./client.js";
3
+ export declare function registerFeishuBitableTools(api: OpenClawPluginApi): void;
4
+ /** Search records with filter conditions */
5
+ export declare function searchRecords(client: ReturnType<typeof createFeishuClient>, appToken: string, tableId: string, filter?: unknown, sort?: unknown, fieldNames?: string[], pageSize?: number, pageToken?: string): Promise<{
6
+ records: {
7
+ fields: Record<string, string | number | number | number | boolean | {
8
+ text?: string;
9
+ link?: string;
10
+ } | {
11
+ location?: string;
12
+ pname?: string;
13
+ cityname?: string;
14
+ adname?: string;
15
+ address?: string;
16
+ name?: string;
17
+ full_address?: string;
18
+ } | Array<{
19
+ id?: string;
20
+ name?: string;
21
+ avatar_url?: string;
22
+ }> | Array<string> | Array<{
23
+ id?: string;
24
+ name?: string;
25
+ en_name?: string;
26
+ email?: string;
27
+ avatar_url?: string;
28
+ }> | Array<{
29
+ file_token?: string;
30
+ name?: string;
31
+ type?: string;
32
+ size?: number;
33
+ url?: string;
34
+ tmp_url?: string;
35
+ }>>;
36
+ record_id?: string | undefined;
37
+ created_by?: {
38
+ id?: string | undefined;
39
+ name?: string | undefined;
40
+ en_name?: string | undefined;
41
+ email?: string | undefined;
42
+ avatar_url?: string | undefined;
43
+ } | undefined;
44
+ created_time?: number | undefined;
45
+ last_modified_by?: {
46
+ id?: string | undefined;
47
+ name?: string | undefined;
48
+ en_name?: string | undefined;
49
+ email?: string | undefined;
50
+ avatar_url?: string | undefined;
51
+ } | undefined;
52
+ last_modified_time?: number | undefined;
53
+ shared_url?: string | undefined;
54
+ record_url?: string | undefined;
55
+ }[];
56
+ has_more: boolean;
57
+ page_token: string;
58
+ total: number;
59
+ }>;
60
+ /** Batch create records */
61
+ export declare function batchCreateRecords(client: ReturnType<typeof createFeishuClient>, appToken: string, tableId: string, records: Array<{
62
+ fields: Record<string, unknown>;
63
+ }>): Promise<{
64
+ records: {
65
+ fields: Record<string, string | number | number | number | boolean | {
66
+ text?: string;
67
+ link?: string;
68
+ } | {
69
+ location?: string;
70
+ pname?: string;
71
+ cityname?: string;
72
+ adname?: string;
73
+ address?: string;
74
+ name?: string;
75
+ full_address?: string;
76
+ } | Array<{
77
+ id?: string;
78
+ name?: string;
79
+ avatar_url?: string;
80
+ }> | Array<string> | Array<{
81
+ id?: string;
82
+ name?: string;
83
+ en_name?: string;
84
+ email?: string;
85
+ avatar_url?: string;
86
+ }> | Array<{
87
+ file_token?: string;
88
+ name?: string;
89
+ type?: string;
90
+ size?: number;
91
+ url?: string;
92
+ tmp_url?: string;
93
+ }>>;
94
+ record_id?: string | undefined;
95
+ created_by?: {
96
+ id?: string | undefined;
97
+ name?: string | undefined;
98
+ en_name?: string | undefined;
99
+ email?: string | undefined;
100
+ avatar_url?: string | undefined;
101
+ } | undefined;
102
+ created_time?: number | undefined;
103
+ last_modified_by?: {
104
+ id?: string | undefined;
105
+ name?: string | undefined;
106
+ en_name?: string | undefined;
107
+ email?: string | undefined;
108
+ avatar_url?: string | undefined;
109
+ } | undefined;
110
+ last_modified_time?: number | undefined;
111
+ shared_url?: string | undefined;
112
+ record_url?: string | undefined;
113
+ }[];
114
+ total: number;
115
+ }>;
116
+ /** Batch update records */
117
+ export declare function batchUpdateRecords(client: ReturnType<typeof createFeishuClient>, appToken: string, tableId: string, records: Array<{
118
+ record_id: string;
119
+ fields: Record<string, unknown>;
120
+ }>): Promise<{
121
+ records: {
122
+ fields: Record<string, string | number | number | number | boolean | {
123
+ text?: string;
124
+ link?: string;
125
+ } | {
126
+ location?: string;
127
+ pname?: string;
128
+ cityname?: string;
129
+ adname?: string;
130
+ address?: string;
131
+ name?: string;
132
+ full_address?: string;
133
+ } | Array<{
134
+ id?: string;
135
+ name?: string;
136
+ avatar_url?: string;
137
+ }> | Array<string> | Array<{
138
+ id?: string;
139
+ name?: string;
140
+ en_name?: string;
141
+ email?: string;
142
+ avatar_url?: string;
143
+ }> | Array<{
144
+ file_token?: string;
145
+ name?: string;
146
+ type?: string;
147
+ size?: number;
148
+ url?: string;
149
+ tmp_url?: string;
150
+ }>>;
151
+ record_id?: string | undefined;
152
+ created_by?: {
153
+ id?: string | undefined;
154
+ name?: string | undefined;
155
+ en_name?: string | undefined;
156
+ email?: string | undefined;
157
+ avatar_url?: string | undefined;
158
+ } | undefined;
159
+ created_time?: number | undefined;
160
+ last_modified_by?: {
161
+ id?: string | undefined;
162
+ name?: string | undefined;
163
+ en_name?: string | undefined;
164
+ email?: string | undefined;
165
+ avatar_url?: string | undefined;
166
+ } | undefined;
167
+ last_modified_time?: number | undefined;
168
+ shared_url?: string | undefined;
169
+ record_url?: string | undefined;
170
+ }[];
171
+ total: number;
172
+ }>;
173
+ /** List all tables in a Bitable app */
174
+ export declare function listBitableTables(client: ReturnType<typeof createFeishuClient>, appToken: string, pageSize?: number, pageToken?: string): Promise<{
175
+ tables: {
176
+ table_id: string;
177
+ name: string;
178
+ revision: number;
179
+ }[];
180
+ has_more: boolean;
181
+ page_token: string;
182
+ total: number;
183
+ }>;
184
+ /** Create a new table in a Bitable app */
185
+ export declare function createBitableTable(client: ReturnType<typeof createFeishuClient>, appToken: string, name: string, fields?: Array<{
186
+ field_name: string;
187
+ type: number;
188
+ }>): Promise<{
189
+ table_id: string;
190
+ name: string;
191
+ }>;
192
+ /** Create a new field in a Bitable table */
193
+ export declare function createBitableField(client: ReturnType<typeof createFeishuClient>, appToken: string, tableId: string, fieldName: string, type: number, property?: unknown): Promise<{
194
+ field_id: string;
195
+ field_name: string;
196
+ type: number;
197
+ type_name: string;
198
+ }>;
199
+ /** Create a new view for a Bitable table */
200
+ export declare function createBitableView(client: ReturnType<typeof createFeishuClient>, appToken: string, tableId: string, viewName: string, viewType?: string): Promise<{
201
+ view_id: string;
202
+ view_name: string;
203
+ view_type: string;
204
+ }>;
205
+ /** List all dashboards in a Bitable app */
206
+ export declare function listBitableDashboards(client: ReturnType<typeof createFeishuClient>, appToken: string, pageSize?: number, pageToken?: string): Promise<{
207
+ dashboards: any;
208
+ has_more: any;
209
+ page_token: any;
210
+ }>;
211
+ //# sourceMappingURL=bitable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitable.d.ts","sourceRoot":"","sources":["../../src/bitable.ts"],"names":[],"mappings":"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"}