feishu-openclaw 0.4.1 → 0.4.3

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.
@@ -2,7 +2,7 @@
2
2
  "id": "feishu-openclaw",
3
3
  "name": "Feishu",
4
4
  "description": "Feishu (飞书/Lark) channel plugin — WebSocket long-connection bot",
5
- "version": "0.1.0",
5
+ "version": "0.4.0",
6
6
  "channels": ["feishu"],
7
7
  "configSchema": {
8
8
  "type": "object",
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * Feishu API connectivity probe.
3
+ *
4
+ * Validates credentials by fetching a tenant_access_token.
3
5
  */
4
6
  import type { FeishuProbeResult } from "./types.js";
5
7
  /**
6
- * Probe the Feishu API by fetching bot info.
7
- * Uses the internal tenant access token endpoint.
8
+ * Probe the Feishu API by fetching tenant_access_token.
9
+ * This is the standard way to validate appId + appSecret.
8
10
  */
9
11
  export declare function probeFeishu(appId: string, appSecret: string, timeoutMs?: number): Promise<FeishuProbeResult>;
10
12
  //# sourceMappingURL=probe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/probe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,SAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CA6C5B"}
1
+ {"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../src/probe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,SAAO,GACf,OAAO,CAAC,iBAAiB,CAAC,CAsE5B"}
package/dist/src/probe.js CHANGED
@@ -1,40 +1,57 @@
1
1
  /**
2
2
  * Feishu API connectivity probe.
3
+ *
4
+ * Validates credentials by fetching a tenant_access_token.
3
5
  */
4
- import * as Lark from "@larksuiteoapi/node-sdk";
5
6
  /**
6
- * Probe the Feishu API by fetching bot info.
7
- * Uses the internal tenant access token endpoint.
7
+ * Probe the Feishu API by fetching tenant_access_token.
8
+ * This is the standard way to validate appId + appSecret.
8
9
  */
9
10
  export async function probeFeishu(appId, appSecret, timeoutMs = 5000) {
10
11
  if (!appId?.trim() || !appSecret?.trim()) {
11
12
  return { ok: false, error: "Missing appId or appSecret", elapsedMs: 0 };
12
13
  }
13
14
  const startTime = Date.now();
15
+ const controller = new AbortController();
16
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
14
17
  try {
15
- const client = new Lark.Client({
16
- appId: appId.trim(),
17
- appSecret: appSecret.trim(),
18
- domain: Lark.Domain.Feishu,
19
- appType: Lark.AppType.SelfBuild,
18
+ // Use the internal tenant_access_token endpoint to validate credentials
19
+ const response = await fetch("https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal", {
20
+ method: "POST",
21
+ headers: { "Content-Type": "application/json" },
22
+ body: JSON.stringify({
23
+ app_id: appId.trim(),
24
+ app_secret: appSecret.trim(),
25
+ }),
26
+ signal: controller.signal,
20
27
  });
21
- // Use bot info endpoint to validate credentials
22
- const response = await client.bot.v3.botInfo.get({});
28
+ clearTimeout(timeout);
23
29
  const elapsedMs = Date.now() - startTime;
24
- const bot = response?.data?.bot;
25
- if (bot) {
30
+ if (!response.ok) {
26
31
  return {
27
- ok: true,
28
- bot: {
29
- name: bot.bot_name,
30
- openId: bot.open_id,
31
- },
32
+ ok: false,
33
+ error: `HTTP ${response.status}: ${response.statusText}`,
32
34
  elapsedMs,
33
35
  };
34
36
  }
35
- return { ok: true, elapsedMs };
37
+ const data = (await response.json());
38
+ if (data.code !== 0) {
39
+ return {
40
+ ok: false,
41
+ error: data.msg || `API error code: ${data.code}`,
42
+ elapsedMs,
43
+ };
44
+ }
45
+ // Credentials are valid if we got a token
46
+ return {
47
+ ok: true,
48
+ elapsedMs,
49
+ // Note: We don't have bot info from this endpoint,
50
+ // but credentials are verified
51
+ };
36
52
  }
37
53
  catch (err) {
54
+ clearTimeout(timeout);
38
55
  const elapsedMs = Date.now() - startTime;
39
56
  if (err instanceof Error) {
40
57
  if (err.name === "AbortError") {
@@ -1 +1 @@
1
- {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/probe.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAIhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,SAAiB,EACjB,SAAS,GAAG,IAAI;IAEhB,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;YAC7B,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;YACnB,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;SAChC,CAAC,CAAC;QAEH,gDAAgD;QAChD,MAAM,QAAQ,GAAG,MAAO,MAAqJ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAErM,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEzC,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC;QAChC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,GAAG,EAAE;oBACH,IAAI,EAAG,GAA+B,CAAC,QAA8B;oBACrE,MAAM,EAAG,GAA+B,CAAC,OAA6B;iBACvE;gBACD,SAAS;aACV,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEzC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;YACnF,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/probe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,SAAiB,EACjB,SAAS,GAAG,IAAI;IAEhB,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;QACzC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,wEAAwE;QACxE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,uEAAuE,EACvE;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;gBACpB,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE;aAC7B,CAAC;YACF,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CACF,CAAC;QAEF,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEzC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE;gBACxD,SAAS;aACV,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAKlC,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,mBAAmB,IAAI,CAAC,IAAI,EAAE;gBACjD,SAAS;aACV,CAAC;QACJ,CAAC;QAED,0CAA0C;QAC1C,OAAO;YACL,EAAE,EAAE,IAAI;YACR,SAAS;YACT,mDAAmD;YACnD,+BAA+B;SAChC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAEzC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;YACnF,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feishu-openclaw",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "type": "module",
5
5
  "description": "飞书机器人插件 - 让 AI 助手接入飞书,无需服务器 | Feishu/Lark channel plugin for Clawdbot / OpenClaw",
6
6
  "author": "Alex Yang <anyangsen@hotmail.com>",