@kodelyth/feishu 2026.5.39 → 2026.5.42

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 (238) hide show
  1. package/api.ts +32 -0
  2. package/channel-entry.ts +20 -0
  3. package/channel-plugin-api.ts +1 -0
  4. package/contract-api.ts +16 -0
  5. package/dist/accounts-D0ow-lRb.js +429 -0
  6. package/dist/api.js +2308 -0
  7. package/dist/app-registration-DBSnysKJ.js +184 -0
  8. package/dist/audio-preflight.runtime-Dpjbn-7r.js +7 -0
  9. package/dist/channel-13WQvQ0u.js +2115 -0
  10. package/dist/channel-entry.js +22 -0
  11. package/dist/channel-plugin-api.js +2 -0
  12. package/dist/channel.runtime-JMJonrJ4.js +729 -0
  13. package/dist/client-D1pzbBGo.js +157 -0
  14. package/dist/contract-api.js +9 -0
  15. package/dist/conversation-id-_58ecqlx.js +139 -0
  16. package/dist/drive-CgHOluXx.js +883 -0
  17. package/dist/index.js +68 -0
  18. package/dist/monitor-oWptK0zL.js +60 -0
  19. package/dist/monitor.account-DHaWlslg.js +5207 -0
  20. package/dist/monitor.state-C211a4tX.js +100 -0
  21. package/dist/probe-CF4duEpK.js +149 -0
  22. package/dist/rolldown-runtime-DUslC3ob.js +14 -0
  23. package/dist/runtime-DSh5rL_d.js +8 -0
  24. package/dist/runtime-api.js +14 -0
  25. package/dist/secret-contract-NSee-WzN.js +119 -0
  26. package/dist/secret-contract-api.js +2 -0
  27. package/dist/security-audit-DWVC0vSK.js +11 -0
  28. package/dist/security-audit-shared-Dpcwxeft.js +38 -0
  29. package/dist/security-contract-api.js +2 -0
  30. package/dist/send-DfZuV4Fi.js +1212 -0
  31. package/dist/session-conversation-Duaukbnl.js +27 -0
  32. package/dist/session-key-api.js +2 -0
  33. package/dist/setup-api.js +2 -0
  34. package/dist/setup-entry.js +15 -0
  35. package/dist/subagent-hooks-Dtegs0kh.js +235 -0
  36. package/dist/subagent-hooks-api.js +23 -0
  37. package/dist/targets-DFskxX4p.js +48 -0
  38. package/dist/thread-bindings-DI7lVSOE.js +222 -0
  39. package/index.ts +82 -0
  40. package/klaw.plugin.json +47 -1712
  41. package/package.json +4 -4
  42. package/runtime-api.ts +52 -0
  43. package/secret-contract-api.ts +5 -0
  44. package/security-contract-api.ts +1 -0
  45. package/session-key-api.ts +1 -0
  46. package/setup-api.ts +3 -0
  47. package/setup-entry.test.ts +19 -0
  48. package/setup-entry.ts +13 -0
  49. package/src/accounts.test.ts +480 -0
  50. package/src/accounts.ts +333 -0
  51. package/src/agent-config.ts +21 -0
  52. package/src/app-registration.ts +331 -0
  53. package/src/approval-auth.test.ts +24 -0
  54. package/src/approval-auth.ts +25 -0
  55. package/src/async.test.ts +35 -0
  56. package/src/async.ts +104 -0
  57. package/src/audio-preflight.runtime.ts +9 -0
  58. package/src/bitable.test.ts +136 -0
  59. package/src/bitable.ts +762 -0
  60. package/src/bot-content.ts +485 -0
  61. package/src/bot-group-name.test.ts +116 -0
  62. package/src/bot-runtime-api.ts +12 -0
  63. package/src/bot-sender-name.ts +125 -0
  64. package/src/bot.broadcast.test.ts +523 -0
  65. package/src/bot.card-action.test.ts +552 -0
  66. package/src/bot.checkBotMentioned.test.ts +265 -0
  67. package/src/bot.helpers.test.ts +135 -0
  68. package/src/bot.stripBotMention.test.ts +126 -0
  69. package/src/bot.test.ts +3671 -0
  70. package/src/bot.ts +1703 -0
  71. package/src/card-action.ts +447 -0
  72. package/src/card-interaction.test.ts +131 -0
  73. package/src/card-interaction.ts +159 -0
  74. package/src/card-test-helpers.ts +54 -0
  75. package/src/card-ux-approval.ts +65 -0
  76. package/src/card-ux-launcher.test.ts +106 -0
  77. package/src/card-ux-launcher.ts +121 -0
  78. package/src/card-ux-shared.ts +33 -0
  79. package/src/channel-runtime-api.ts +16 -0
  80. package/src/channel.runtime.ts +47 -0
  81. package/src/channel.test.ts +1151 -0
  82. package/src/channel.ts +1423 -0
  83. package/src/chat-schema.ts +25 -0
  84. package/src/chat.test.ts +240 -0
  85. package/src/chat.ts +188 -0
  86. package/src/client-timeout.ts +42 -0
  87. package/src/client.test.ts +447 -0
  88. package/src/client.ts +262 -0
  89. package/src/comment-dispatcher-runtime-api.ts +6 -0
  90. package/src/comment-dispatcher.test.ts +185 -0
  91. package/src/comment-dispatcher.ts +107 -0
  92. package/src/comment-handler-runtime-api.ts +3 -0
  93. package/src/comment-handler.test.ts +592 -0
  94. package/src/comment-handler.ts +303 -0
  95. package/src/comment-reaction.test.ts +138 -0
  96. package/src/comment-reaction.ts +259 -0
  97. package/src/comment-shared.test.ts +183 -0
  98. package/src/comment-shared.ts +406 -0
  99. package/src/comment-target.ts +44 -0
  100. package/src/config-schema.test.ts +326 -0
  101. package/src/config-schema.ts +335 -0
  102. package/src/conversation-id.test.ts +18 -0
  103. package/src/conversation-id.ts +199 -0
  104. package/src/dedup-runtime-api.ts +1 -0
  105. package/src/dedup.ts +141 -0
  106. package/src/dedupe-key.ts +72 -0
  107. package/src/directory.static.ts +61 -0
  108. package/src/directory.test.ts +141 -0
  109. package/src/directory.ts +124 -0
  110. package/src/doc-schema.ts +182 -0
  111. package/src/docx-batch-insert.test.ts +116 -0
  112. package/src/docx-batch-insert.ts +223 -0
  113. package/src/docx-color-text.ts +154 -0
  114. package/src/docx-table-ops.test.ts +53 -0
  115. package/src/docx-table-ops.ts +316 -0
  116. package/src/docx-types.ts +38 -0
  117. package/src/docx.account-selection.test.ts +95 -0
  118. package/src/docx.test.ts +701 -0
  119. package/src/docx.ts +1596 -0
  120. package/src/drive-schema.ts +92 -0
  121. package/src/drive.test.ts +1237 -0
  122. package/src/drive.ts +829 -0
  123. package/src/dynamic-agent.test.ts +155 -0
  124. package/src/dynamic-agent.ts +143 -0
  125. package/src/event-types.ts +45 -0
  126. package/src/external-keys.test.ts +20 -0
  127. package/src/external-keys.ts +19 -0
  128. package/src/lifecycle.test-support.ts +220 -0
  129. package/src/media.test.ts +955 -0
  130. package/src/media.ts +1105 -0
  131. package/src/mention-target.types.ts +5 -0
  132. package/src/mention.ts +114 -0
  133. package/src/message-action-contract.ts +13 -0
  134. package/src/monitor-state-runtime-api.ts +7 -0
  135. package/src/monitor-transport-runtime-api.ts +10 -0
  136. package/src/monitor.account.ts +492 -0
  137. package/src/monitor.acp-init-failure.lifecycle.test-support.ts +219 -0
  138. package/src/monitor.bot-identity.ts +86 -0
  139. package/src/monitor.bot-menu-handler.ts +165 -0
  140. package/src/monitor.bot-menu.lifecycle.test-support.ts +224 -0
  141. package/src/monitor.bot-menu.test.ts +188 -0
  142. package/src/monitor.broadcast.reply-once.lifecycle.test-support.ts +264 -0
  143. package/src/monitor.card-action.lifecycle.test-support.ts +421 -0
  144. package/src/monitor.cleanup.test.ts +383 -0
  145. package/src/monitor.comment-notice-handler.ts +105 -0
  146. package/src/monitor.comment.test.ts +967 -0
  147. package/src/monitor.comment.ts +1386 -0
  148. package/src/monitor.lifecycle.test.ts +4 -0
  149. package/src/monitor.message-handler.ts +350 -0
  150. package/src/monitor.reaction.lifecycle.test-support.ts +68 -0
  151. package/src/monitor.reaction.test.ts +739 -0
  152. package/src/monitor.startup.test.ts +213 -0
  153. package/src/monitor.startup.ts +74 -0
  154. package/src/monitor.state.defaults.test.ts +46 -0
  155. package/src/monitor.state.ts +170 -0
  156. package/src/monitor.synthetic-error.ts +18 -0
  157. package/src/monitor.test-mocks.ts +46 -0
  158. package/src/monitor.transport.ts +451 -0
  159. package/src/monitor.ts +100 -0
  160. package/src/monitor.webhook-e2e.test.ts +279 -0
  161. package/src/monitor.webhook-security.test.ts +389 -0
  162. package/src/monitor.webhook.test-helpers.ts +116 -0
  163. package/src/outbound-runtime-api.ts +1 -0
  164. package/src/outbound.test.ts +1118 -0
  165. package/src/outbound.ts +785 -0
  166. package/src/perm-schema.ts +52 -0
  167. package/src/perm.ts +170 -0
  168. package/src/pins.ts +108 -0
  169. package/src/policy.test.ts +223 -0
  170. package/src/policy.ts +318 -0
  171. package/src/post.test.ts +105 -0
  172. package/src/post.ts +275 -0
  173. package/src/probe.test.ts +283 -0
  174. package/src/probe.ts +166 -0
  175. package/src/processing-claims.ts +59 -0
  176. package/src/qr-terminal.ts +1 -0
  177. package/src/reactions.ts +123 -0
  178. package/src/reasoning-preview.test.ts +113 -0
  179. package/src/reasoning-preview.ts +28 -0
  180. package/src/reply-dispatcher-runtime-api.ts +7 -0
  181. package/src/reply-dispatcher.test.ts +1513 -0
  182. package/src/reply-dispatcher.ts +748 -0
  183. package/src/runtime.ts +9 -0
  184. package/src/secret-contract.ts +145 -0
  185. package/src/secret-input.ts +1 -0
  186. package/src/security-audit-shared.ts +69 -0
  187. package/src/security-audit.test.ts +59 -0
  188. package/src/security-audit.ts +1 -0
  189. package/src/send-result.ts +80 -0
  190. package/src/send-target.test.ts +86 -0
  191. package/src/send-target.ts +35 -0
  192. package/src/send.reply-fallback.test.ts +417 -0
  193. package/src/send.test.ts +621 -0
  194. package/src/send.ts +861 -0
  195. package/src/sequential-key.test.ts +72 -0
  196. package/src/sequential-key.ts +25 -0
  197. package/src/sequential-queue.test.ts +165 -0
  198. package/src/sequential-queue.ts +86 -0
  199. package/src/session-conversation.ts +42 -0
  200. package/src/session-route.ts +48 -0
  201. package/src/setup-core.ts +51 -0
  202. package/src/setup-surface.test.ts +484 -0
  203. package/src/setup-surface.ts +618 -0
  204. package/src/streaming-card.test.ts +397 -0
  205. package/src/streaming-card.ts +571 -0
  206. package/src/subagent-hooks.test.ts +627 -0
  207. package/src/subagent-hooks.ts +413 -0
  208. package/src/targets.ts +97 -0
  209. package/src/test-support/lifecycle-test-support.ts +454 -0
  210. package/src/thread-bindings.test.ts +180 -0
  211. package/src/thread-bindings.ts +331 -0
  212. package/src/tool-account-routing.test.ts +250 -0
  213. package/src/tool-account.test.ts +44 -0
  214. package/src/tool-account.ts +93 -0
  215. package/src/tool-factory-test-harness.ts +79 -0
  216. package/src/tool-result.test.ts +32 -0
  217. package/src/tool-result.ts +16 -0
  218. package/src/tools-config.test.ts +21 -0
  219. package/src/tools-config.ts +22 -0
  220. package/src/types.ts +106 -0
  221. package/src/typing.test.ts +144 -0
  222. package/src/typing.ts +214 -0
  223. package/src/wiki-schema.ts +69 -0
  224. package/src/wiki.ts +270 -0
  225. package/subagent-hooks-api.ts +31 -0
  226. package/tsconfig.json +16 -0
  227. package/api.js +0 -7
  228. package/channel-entry.js +0 -7
  229. package/channel-plugin-api.js +0 -7
  230. package/contract-api.js +0 -7
  231. package/index.js +0 -7
  232. package/runtime-api.js +0 -7
  233. package/secret-contract-api.js +0 -7
  234. package/security-contract-api.js +0 -7
  235. package/session-key-api.js +0 -7
  236. package/setup-api.js +0 -7
  237. package/setup-entry.js +0 -7
  238. package/subagent-hooks-api.js +0 -7
@@ -0,0 +1,184 @@
1
+ import { fetchWithSsrFGuard } from "klaw/plugin-sdk/ssrf-runtime";
2
+ import { renderQrTerminal } from "klaw/plugin-sdk/media-runtime";
3
+ //#region extensions/feishu/src/app-registration.ts
4
+ /**
5
+ * Feishu app registration via OAuth device-code flow.
6
+ *
7
+ * Migrated from feishu-plugin-cli's `feishu-auth.ts` and `install-prompts.ts`.
8
+ * Replaces axios with native fetch, removes inquirer/ora/chalk in favor of
9
+ * the klaw WizardPrompter surface.
10
+ */
11
+ const FEISHU_ACCOUNTS_URL = "https://accounts.feishu.cn";
12
+ const LARK_ACCOUNTS_URL = "https://accounts.larksuite.com";
13
+ const REGISTRATION_PATH = "/oauth/v1/app/registration";
14
+ const REQUEST_TIMEOUT_MS = 1e4;
15
+ function accountsBaseUrl(domain) {
16
+ return domain === "lark" ? LARK_ACCOUNTS_URL : FEISHU_ACCOUNTS_URL;
17
+ }
18
+ async function postRegistration(baseUrl, body) {
19
+ return await fetchFeishuJson({
20
+ url: `${baseUrl}${REGISTRATION_PATH}`,
21
+ init: {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
24
+ body: new URLSearchParams(body).toString(),
25
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
26
+ },
27
+ auditContext: "feishu.app-registration.post"
28
+ });
29
+ }
30
+ async function fetchFeishuJson(params) {
31
+ const { response, release } = await fetchWithSsrFGuard({
32
+ url: params.url,
33
+ init: params.init,
34
+ policy: { allowedHostnames: [new URL(params.url).hostname] },
35
+ auditContext: params.auditContext
36
+ });
37
+ try {
38
+ return await response.json();
39
+ } finally {
40
+ await release();
41
+ }
42
+ }
43
+ /**
44
+ * Step 1: Initialize registration and verify the environment supports
45
+ * `client_secret` auth.
46
+ *
47
+ * @throws If the environment does not support `client_secret`.
48
+ */
49
+ async function initAppRegistration(domain = "feishu") {
50
+ if (!(await postRegistration(accountsBaseUrl(domain), { action: "init" })).supported_auth_methods?.includes("client_secret")) throw new Error("Current environment does not support client_secret auth method");
51
+ }
52
+ /**
53
+ * Step 2: Begin the device-code flow. Returns a device code and a QR URL
54
+ * that the user should scan with Feishu/Lark mobile app.
55
+ */
56
+ async function beginAppRegistration(domain = "feishu") {
57
+ const res = await postRegistration(accountsBaseUrl(domain), {
58
+ action: "begin",
59
+ archetype: "PersonalAgent",
60
+ auth_method: "client_secret",
61
+ request_user_info: "open_id"
62
+ });
63
+ const qrUrl = new URL(res.verification_uri_complete);
64
+ qrUrl.searchParams.set("from", "oc_onboard");
65
+ qrUrl.searchParams.set("tp", "ob_cli_app");
66
+ return {
67
+ deviceCode: res.device_code,
68
+ qrUrl: qrUrl.toString(),
69
+ userCode: res.user_code,
70
+ interval: res.interval || 5,
71
+ expireIn: res.expire_in || 600
72
+ };
73
+ }
74
+ /**
75
+ * Step 3: Poll for authorization result until success, denial, expiry, or
76
+ * timeout. Automatically handles domain switching when `tenant_brand` is
77
+ * detected as "lark".
78
+ */
79
+ async function pollAppRegistration(params) {
80
+ const { deviceCode, expireIn, initialDomain = "feishu", abortSignal, tp } = params;
81
+ let currentInterval = params.interval;
82
+ let domain = initialDomain;
83
+ let domainSwitched = false;
84
+ const deadline = Date.now() + expireIn * 1e3;
85
+ while (Date.now() < deadline) {
86
+ if (abortSignal?.aborted) return { status: "timeout" };
87
+ const baseUrl = accountsBaseUrl(domain);
88
+ let pollRes;
89
+ try {
90
+ pollRes = await postRegistration(baseUrl, {
91
+ action: "poll",
92
+ device_code: deviceCode,
93
+ ...tp ? { tp } : {}
94
+ });
95
+ } catch {
96
+ await sleep(currentInterval * 1e3);
97
+ continue;
98
+ }
99
+ if (pollRes.user_info?.tenant_brand) {
100
+ const isLark = pollRes.user_info.tenant_brand === "lark";
101
+ if (!domainSwitched && isLark) {
102
+ domain = "lark";
103
+ domainSwitched = true;
104
+ continue;
105
+ }
106
+ }
107
+ if (pollRes.client_id && pollRes.client_secret) return {
108
+ status: "success",
109
+ result: {
110
+ appId: pollRes.client_id,
111
+ appSecret: pollRes.client_secret,
112
+ domain,
113
+ openId: pollRes.user_info?.open_id
114
+ }
115
+ };
116
+ if (pollRes.error) if (pollRes.error === "authorization_pending") {} else if (pollRes.error === "slow_down") currentInterval += 5;
117
+ else if (pollRes.error === "access_denied") return { status: "access_denied" };
118
+ else if (pollRes.error === "expired_token") return { status: "expired" };
119
+ else return {
120
+ status: "error",
121
+ message: `${pollRes.error}: ${pollRes.error_description ?? "unknown"}`
122
+ };
123
+ await sleep(currentInterval * 1e3);
124
+ }
125
+ return { status: "timeout" };
126
+ }
127
+ /**
128
+ * Print QR code directly to stdout.
129
+ *
130
+ * QR codes must be printed without any surrounding box/border decoration,
131
+ * otherwise the pattern is corrupted and cannot be scanned.
132
+ */
133
+ async function printQrCode(url) {
134
+ const output = await renderQrTerminal(url);
135
+ process.stdout.write(output.endsWith("\n") ? output : `${output}\n`);
136
+ }
137
+ /**
138
+ * Fetch the app owner's open_id using the application.v6.application.get API.
139
+ *
140
+ * Used during setup to auto-populate security policy allowlists.
141
+ * Returns undefined on any failure (fail-open).
142
+ */
143
+ async function getAppOwnerOpenId(params) {
144
+ const baseUrl = params.domain === "lark" ? "https://open.larksuite.com" : "https://open.feishu.cn";
145
+ try {
146
+ const tokenData = await fetchFeishuJson({
147
+ url: `${baseUrl}/open-apis/auth/v3/tenant_access_token/internal`,
148
+ init: {
149
+ method: "POST",
150
+ headers: { "Content-Type": "application/json" },
151
+ body: JSON.stringify({
152
+ app_id: params.appId,
153
+ app_secret: params.appSecret
154
+ }),
155
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
156
+ },
157
+ auditContext: "feishu.app-registration.owner-token"
158
+ });
159
+ if (!tokenData.tenant_access_token) return;
160
+ const appData = await fetchFeishuJson({
161
+ url: `${baseUrl}/open-apis/application/v6/applications/${params.appId}?user_id_type=open_id`,
162
+ init: {
163
+ method: "GET",
164
+ headers: {
165
+ Authorization: `Bearer ${tokenData.tenant_access_token}`,
166
+ "Content-Type": "application/json"
167
+ },
168
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
169
+ },
170
+ auditContext: "feishu.app-registration.owner-app"
171
+ });
172
+ if (appData.code !== 0) return;
173
+ const app = appData.data?.app;
174
+ const owner = app?.owner;
175
+ return (owner?.owner_type ?? owner?.type) === 2 && owner?.owner_id ? owner.owner_id : app?.creator_id ?? owner?.owner_id;
176
+ } catch {
177
+ return;
178
+ }
179
+ }
180
+ function sleep(ms) {
181
+ return new Promise((resolve) => setTimeout(resolve, ms));
182
+ }
183
+ //#endregion
184
+ export { beginAppRegistration, getAppOwnerOpenId, initAppRegistration, pollAppRegistration, printQrCode };
@@ -0,0 +1,7 @@
1
+ import { transcribeFirstAudio as transcribeFirstAudio$1 } from "klaw/plugin-sdk/media-runtime";
2
+ //#region extensions/feishu/src/audio-preflight.runtime.ts
3
+ async function transcribeFirstAudio(...args) {
4
+ return await transcribeFirstAudio$1(...args);
5
+ }
6
+ //#endregion
7
+ export { transcribeFirstAudio };