@zhin.js/adapter-lark 4.0.0 → 4.0.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +7 -3
  3. package/{skills/lark → agent}/PERMITS.md +1 -1
  4. package/agent/tools/add_members.ts +22 -0
  5. package/agent/tools/create_chat.ts +20 -0
  6. package/agent/tools/dissolve_chat.ts +18 -0
  7. package/agent/tools/get_user.ts +18 -0
  8. package/agent/tools/remove_managers.ts +22 -0
  9. package/agent/tools/set_managers.ts +22 -0
  10. package/agent/tools/update_chat.ts +23 -0
  11. package/agent/tools/upload_file.ts +27 -0
  12. package/lib/agent/tools/add_members.js +21 -0
  13. package/lib/agent/tools/add_members.js.map +1 -0
  14. package/lib/agent/tools/create_chat.js +20 -0
  15. package/lib/agent/tools/create_chat.js.map +1 -0
  16. package/lib/agent/tools/dissolve_chat.js +18 -0
  17. package/lib/agent/tools/dissolve_chat.js.map +1 -0
  18. package/lib/agent/tools/get_user.js +17 -0
  19. package/lib/agent/tools/get_user.js.map +1 -0
  20. package/lib/agent/tools/remove_managers.js +21 -0
  21. package/lib/agent/tools/remove_managers.js.map +1 -0
  22. package/lib/agent/tools/set_managers.js +21 -0
  23. package/lib/agent/tools/set_managers.js.map +1 -0
  24. package/lib/agent/tools/update_chat.js +22 -0
  25. package/lib/agent/tools/update_chat.js.map +1 -0
  26. package/lib/agent/tools/upload_file.js +19 -0
  27. package/lib/agent/tools/upload_file.js.map +1 -0
  28. package/lib/{adapter.js → src/adapter.js} +5 -4
  29. package/lib/src/adapter.js.map +1 -0
  30. package/lib/{endpoint.js → src/endpoint.js} +10 -6
  31. package/lib/src/endpoint.js.map +1 -0
  32. package/lib/src/index.js +43 -0
  33. package/lib/src/index.js.map +1 -0
  34. package/lib/src/lark-agent-deps.js +10 -0
  35. package/lib/src/lark-agent-deps.js.map +1 -0
  36. package/lib/{platform-permit.js → src/platform-permit.js} +5 -2
  37. package/lib/src/platform-permit.js.map +1 -0
  38. package/lib/src/segment-mapper.js +2 -0
  39. package/lib/src/segment-mapper.js.map +1 -0
  40. package/lib/src/types.js.map +1 -0
  41. package/package.json +17 -7
  42. package/src/adapter.ts +5 -4
  43. package/src/endpoint.ts +10 -6
  44. package/src/index.ts +13 -189
  45. package/src/lark-agent-deps.ts +18 -0
  46. package/src/platform-permit.ts +3 -4
  47. package/src/segment-mapper.ts +1 -0
  48. package/lib/adapter.d.ts +0 -19
  49. package/lib/adapter.d.ts.map +0 -1
  50. package/lib/adapter.js.map +0 -1
  51. package/lib/endpoint.d.ts +0 -84
  52. package/lib/endpoint.d.ts.map +0 -1
  53. package/lib/endpoint.js.map +0 -1
  54. package/lib/index.d.ts +0 -15
  55. package/lib/index.d.ts.map +0 -1
  56. package/lib/index.js +0 -216
  57. package/lib/index.js.map +0 -1
  58. package/lib/platform-permit.d.ts +0 -16
  59. package/lib/platform-permit.d.ts.map +0 -1
  60. package/lib/platform-permit.js.map +0 -1
  61. package/lib/types.d.ts +0 -63
  62. package/lib/types.d.ts.map +0 -1
  63. package/lib/types.js.map +0 -1
  64. /package/{skills/lark/SKILL.md → agent/skills/lark.md} +0 -0
  65. /package/lib/{types.js → src/types.js} +0 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 飞书/Lark 适配器入口:类型扩展、导出、注册
3
+ */
4
+ import { usePlugin, createSceneManagementTools } from "zhin.js";
5
+ import { LarkAdapter } from "./adapter.js";
6
+ import { larkGroupPermitResolver, registerLarkPlatformPermitChecker, } from "./platform-permit.js";
7
+ import { setLarkAgentDeps } from "./lark-agent-deps.js";
8
+ export * from "./types.js";
9
+ export { LarkEndpoint } from "./endpoint.js";
10
+ export { LarkAdapter } from "./adapter.js";
11
+ const plugin = usePlugin();
12
+ const { provide, useContext } = plugin;
13
+ useContext("router", (router) => {
14
+ provide({
15
+ name: "lark",
16
+ description: "Lark/Feishu Endpoint Adapter",
17
+ mounted: async (p) => {
18
+ const adapter = new LarkAdapter(p, router);
19
+ await adapter.start();
20
+ return adapter;
21
+ },
22
+ dispose: async (adapter) => {
23
+ await adapter.stop();
24
+ },
25
+ });
26
+ });
27
+ useContext('tool', 'lark', (toolService, lark) => {
28
+ const disposers = [];
29
+ disposers.push(registerLarkPlatformPermitChecker());
30
+ setLarkAgentDeps({
31
+ getEndpoint: (endpointId) => {
32
+ const endpoint = lark.endpoints.get(endpointId);
33
+ if (!endpoint)
34
+ throw new Error(`Endpoint ${endpointId} 不存在`);
35
+ return endpoint;
36
+ },
37
+ getAdapter: () => lark,
38
+ });
39
+ const sceneTools = createSceneManagementTools(lark, 'lark', { permitResolver: larkGroupPermitResolver, registerChecker: false });
40
+ disposers.push(...sceneTools.map(t => toolService.addTool(t, plugin.name)));
41
+ return () => disposers.forEach(d => d());
42
+ });
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAoD,0BAA0B,EAAoB,MAAM,SAAS,CAAC;AACpI,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EACL,uBAAuB,EACvB,iCAAiC,GAClC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAaxD,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;AAEtC,UAA+D,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;IACpF,OAAO,CAAC;QACN,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,8BAA8B;QAC3C,OAAO,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAoB,EAAE,EAAE;YACtC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;KACiB,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,WAAwB,EAAE,IAAiB,EAAE,EAAE;IACzE,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,SAAS,CAAC,IAAI,CAAC,iCAAiC,EAAE,CAAC,CAAC;IACpD,gBAAgB,CAAC;QACf,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;YAC7D,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;KACvB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,0BAA0B,CAC3C,IAAmC,EACnC,MAAM,EACN,EAAE,cAAc,EAAE,uBAAuB,EAAE,eAAe,EAAE,KAAK,EAAE,CACpE,CAAC;IACF,SAAS,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ let _deps = null;
2
+ export function setLarkAgentDeps(deps) {
3
+ _deps = deps;
4
+ }
5
+ export function getLarkAgentDeps() {
6
+ if (!_deps)
7
+ throw new Error('lark agent deps not initialized');
8
+ return _deps;
9
+ }
10
+ //# sourceMappingURL=lark-agent-deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lark-agent-deps.js","sourceRoot":"","sources":["../../src/lark-agent-deps.ts"],"names":[],"mappings":"AAQA,IAAI,KAAK,GAAyB,IAAI,CAAC;AAEvC,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,KAAK,GAAG,IAAI,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,11 +1,14 @@
1
+ /**
2
+ * 飞书 Lark platform permit
3
+ */
1
4
  import { registerPlatformPermitChecker } from 'zhin.js';
2
5
  const ADAPTER = 'lark';
3
6
  export function platformPermit(perm) {
4
7
  return `platform(${ADAPTER},${perm})`;
5
8
  }
6
9
  const FACTORY_PERM_MAP = {
7
- group_admin: 'chat_admin',
8
- group_owner: 'chat_owner',
10
+ scene_admin: 'chat_admin',
11
+ scene_owner: 'chat_owner',
9
12
  };
10
13
  export function larkGroupPermitResolver(logicalPerm) {
11
14
  return platformPermit(FACTORY_PERM_MAP[logicalPerm] ?? logicalPerm);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-permit.js","sourceRoot":"","sources":["../../src/platform-permit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,6BAA6B,EAAgB,MAAM,SAAS,CAAC;AAEtE,MAAM,OAAO,GAAG,MAAM,CAAC;AAEvB,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,OAAO,IAAI,IAAI,GAAG,CAAC;AACxC,CAAC;AAED,MAAM,gBAAgB,GAA2B;IAC/C,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,YAAY;CAC1B,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,WAAmB;IACzD,OAAO,cAAc,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAG5C;IACC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY,EAAE,OAAqB;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAoD,CAAC;IAC5E,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEnD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY;YACf,OAAO,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/C,KAAK,YAAY;YACf,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QACxF,KAAK,iBAAiB;YACpB,OAAO,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;QAC/C;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,OAAO,6BAA6B,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { toCanonicalSegments, fromCanonicalSegments } from 'zhin.js';
2
+ //# sourceMappingURL=segment-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-mapper.js","sourceRoot":"","sources":["../../src/segment-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-lark",
3
- "version": "4.0.0",
3
+ "version": "4.0.2",
4
4
  "description": "Zhin.js adapter for Lark/Feishu (飞书)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -38,26 +38,36 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/koa": "^3.0.3",
41
- "@types/node": "^25.9.2",
41
+ "@types/node": "^26.1.0",
42
42
  "typescript": "^6.0.3",
43
- "@zhin.js/host-router": "2.0.1",
44
- "zhin.js": "4.1.0"
43
+ "zod": "^4.4.3",
44
+ "@zhin.js/host-router": "2.0.3",
45
+ "zhin.js": "4.1.2",
46
+ "@zhin.js/agent": "1.0.3"
45
47
  },
46
48
  "peerDependencies": {
47
- "zhin.js": "4.1.0",
48
- "@zhin.js/host-router": "2.0.1"
49
+ "zod": "^4.0.0",
50
+ "@zhin.js/agent": "1.0.3",
51
+ "@zhin.js/host-router": "2.0.3",
52
+ "zhin.js": "4.1.2"
49
53
  },
50
54
  "peerDependenciesMeta": {
55
+ "@zhin.js/agent": {
56
+ "optional": true
57
+ },
51
58
  "@zhin.js/host-router": {
52
59
  "optional": false
60
+ },
61
+ "zod": {
62
+ "optional": true
53
63
  }
54
64
  },
55
65
  "files": [
56
66
  "src",
57
67
  "lib",
68
+ "agent",
58
69
  "client",
59
70
  "dist",
60
- "skills",
61
71
  "plugin.yml",
62
72
  "README.md",
63
73
  "node",
package/src/adapter.ts CHANGED
@@ -9,6 +9,7 @@ import type { LarkEndpointConfig } from "./types.js";
9
9
  export class LarkAdapter extends Adapter<LarkEndpoint> {
10
10
  static override readonly capabilities = ['inbound', 'outbound'] as const;
11
11
  static override outboundRichSegmentPolicy = OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL;
12
+ static override interactivePolicy = 'native' as const;
12
13
 
13
14
  #router: any;
14
15
 
@@ -21,9 +22,9 @@ export class LarkAdapter extends Adapter<LarkEndpoint> {
21
22
  return new LarkEndpoint(this, this.#router, config);
22
23
  }
23
24
 
24
- // ── IGroupManagement 标准群管方法 ──────────────────────────────────
25
+ // ── ISceneManagement 标准群管方法 ──────────────────────────────────
25
26
 
26
- async kickMember(endpointId: string, sceneId: string, userId: string) {
27
+ async removeMember(endpointId: string, sceneId: string, userId: string) {
27
28
  const endpoint = this.endpoints.get(endpointId);
28
29
  if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
29
30
  return endpoint.removeChatMembers(sceneId, [userId]);
@@ -35,13 +36,13 @@ export class LarkAdapter extends Adapter<LarkEndpoint> {
35
36
  return endpoint.getChatMembers(sceneId);
36
37
  }
37
38
 
38
- async getGroupInfo(endpointId: string, sceneId: string) {
39
+ async getSceneInfo(endpointId: string, sceneId: string) {
39
40
  const endpoint = this.endpoints.get(endpointId);
40
41
  if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
41
42
  return endpoint.getChatInfo(sceneId);
42
43
  }
43
44
 
44
- async setGroupName(endpointId: string, sceneId: string, name: string) {
45
+ async renameScene(endpointId: string, sceneId: string, name: string) {
45
46
  const endpoint = this.endpoints.get(endpointId);
46
47
  if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
47
48
  return endpoint.updateChatInfo(sceneId, { name });
package/src/endpoint.ts CHANGED
@@ -4,10 +4,11 @@
4
4
  import { registerFetchRoute, type Router, type RouterContext } from "@zhin.js/host-router/router";
5
5
  import axios, { type AxiosInstance } from "axios";
6
6
  import { createHash } from "crypto";
7
- import { formatCompact, Endpoint, Message, MessageSegment, segment, SendContent, SendOptions,} from 'zhin.js';
7
+ import { formatCompact, Endpoint, Message, MessageSegment, segment, SendContent, SendOptions, expandInteractiveSegmentsInContent,} from 'zhin.js';
8
8
  import type { LarkEndpointConfig, LarkMessage, LarkEvent, AccessToken } from "./types.js";
9
9
  import type { LarkAdapter } from "./adapter.js";
10
10
  import { normalizeLarkSenderForPermit } from "./platform-permit.js";
11
+ import { fromCanonicalSegments, toCanonicalSegments } from './segment-mapper.js';
11
12
 
12
13
  export class LarkEndpoint implements Endpoint<LarkEndpointConfig, LarkMessage> {
13
14
  $connected: boolean
@@ -221,7 +222,8 @@ export class LarkEndpoint implements Endpoint<LarkEndpointConfig, LarkMessage> {
221
222
  // ================================================================================================
222
223
 
223
224
  $formatMessage(msg: LarkMessage, event?: any): Message<LarkMessage> {
224
- const content = this.parseMessageContent(msg);
225
+ const wire = this.parseMessageContent(msg);
226
+ const content = toCanonicalSegments(wire);
225
227
 
226
228
  // 确定聊天类型
227
229
  const chatType = msg.chat_id?.startsWith('oc_') ? 'group' : 'private';
@@ -373,7 +375,9 @@ export class LarkEndpoint implements Endpoint<LarkEndpointConfig, LarkMessage> {
373
375
 
374
376
  async $sendMessage(options: SendOptions): Promise<string> {
375
377
  const chatId = options.id;
376
- const content = this.formatSendContent(options.content);
378
+ const canonical = expandInteractiveSegmentsInContent(options.content);
379
+ const wire = fromCanonicalSegments(canonical);
380
+ const content = this.formatSendContent(wire);
377
381
 
378
382
  try {
379
383
  const response = await this.axiosInstance.post('/im/v1/messages', {
@@ -492,8 +496,8 @@ export class LarkEndpoint implements Endpoint<LarkEndpointConfig, LarkMessage> {
492
496
  await this.refreshAccessToken();
493
497
 
494
498
  this.$connected = true;
495
- this.logger.info(formatCompact({ endpoint: this.$config.name }));
496
- this.logger.info(formatCompact( { op: 'webhook', path: this.$config.webhookPath }));
499
+ this.logger.debug(formatCompact({ endpoint: this.$config.name }));
500
+ this.logger.debug(formatCompact( { op: 'webhook', path: this.$config.webhookPath }));
497
501
 
498
502
  } catch (error) {
499
503
  this.logger.error('Failed to connect Lark bot:', error);
@@ -504,7 +508,7 @@ export class LarkEndpoint implements Endpoint<LarkEndpointConfig, LarkMessage> {
504
508
  async $disconnect(): Promise<void> {
505
509
  try {
506
510
  this.$connected = false;
507
- this.logger.info(formatCompact( { op: 'disconnect', endpoint: this.$config.name }));
511
+ this.logger.debug(formatCompact( { op: 'disconnect', endpoint: this.$config.name }));
508
512
  } catch (error) {
509
513
  this.logger.error('Error disconnecting Lark bot:', error);
510
514
  }
package/src/index.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * 飞书/Lark 适配器入口:类型扩展、导出、注册
3
3
  */
4
- import { usePlugin, type Plugin, type Context, type IGroupManagement, createGroupManagementTools, type ToolFeature } from "zhin.js";
4
+ import { usePlugin, type Plugin, type Context, type ISceneManagement, createSceneManagementTools, type ToolFeature } from "zhin.js";
5
5
  import { LarkAdapter } from "./adapter.js";
6
6
  import {
7
7
  larkGroupPermitResolver,
8
- platformPermit,
9
8
  registerLarkPlatformPermitChecker,
10
9
  } from "./platform-permit.js";
10
+ import { setLarkAgentDeps } from "./lark-agent-deps.js";
11
11
 
12
12
  declare module "zhin.js" {
13
13
  namespace Plugin {
@@ -45,195 +45,19 @@ const { provide, useContext } = plugin;
45
45
  useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
46
46
  const disposers: (() => void)[] = [];
47
47
  disposers.push(registerLarkPlatformPermitChecker());
48
- const groupTools = createGroupManagementTools(
49
- lark as unknown as IGroupManagement,
48
+ setLarkAgentDeps({
49
+ getEndpoint: (endpointId) => {
50
+ const endpoint = lark.endpoints.get(endpointId);
51
+ if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
52
+ return endpoint;
53
+ },
54
+ getAdapter: () => lark,
55
+ });
56
+ const sceneTools = createSceneManagementTools(
57
+ lark as unknown as ISceneManagement,
50
58
  'lark',
51
59
  { permitResolver: larkGroupPermitResolver, registerChecker: false },
52
60
  );
53
- disposers.push(...groupTools.map(t => toolService.addTool(t, plugin.name)));
54
-
55
- disposers.push(toolService.addTool({
56
- name: 'lark_get_user',
57
- description: '获取飞书用户信息',
58
- parameters: {
59
- type: 'object',
60
- properties: {
61
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
62
- user_id: { type: 'string', description: '用户 ID (open_id)' },
63
- },
64
- required: ['endpoint_id', 'user_id'],
65
- },
66
- platforms: ['lark'],
67
- tags: ['lark'],
68
- execute: async (args: Record<string, any>) => {
69
- const endpoint = lark.endpoints.get(args.endpoint_id);
70
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
71
- return await endpoint.getUserInfo(args.user_id);
72
- },
73
- }, plugin.name));
74
-
75
- disposers.push(toolService.addTool({
76
- name: 'lark_create_chat',
77
- description: '创建飞书群聊',
78
- parameters: {
79
- type: 'object',
80
- properties: {
81
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
82
- name: { type: 'string', description: '群名' },
83
- members: { type: 'string', description: '成员 open_id 列表,逗号分隔' },
84
- owner: { type: 'string', description: '群主 open_id(可选)' },
85
- },
86
- required: ['endpoint_id', 'name', 'members'],
87
- },
88
- platforms: ['lark'],
89
- tags: ['lark'],
90
- execute: async (args: Record<string, any>) => {
91
- const endpoint = lark.endpoints.get(args.endpoint_id);
92
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
93
- const chatId = await endpoint.createChat(args.name, args.members.split(','), args.owner);
94
- return { success: !!chatId, chat_id: chatId, message: chatId ? `群聊创建成功: ${chatId}` : '创建失败' };
95
- },
96
- }, plugin.name));
97
-
98
- disposers.push(toolService.addTool({
99
- name: 'lark_update_chat',
100
- description: '更新飞书群聊信息(群名、描述)',
101
- parameters: {
102
- type: 'object',
103
- properties: {
104
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
105
- chat_id: { type: 'string', description: '群聊 ID' },
106
- name: { type: 'string', description: '新群名(可选)' },
107
- description: { type: 'string', description: '新描述(可选)' },
108
- },
109
- required: ['endpoint_id', 'chat_id'],
110
- },
111
- platforms: ['lark'],
112
- tags: ['lark'],
113
- permissions: [platformPermit('chat_admin')],
114
- execute: async (args: Record<string, any>) => {
115
- const endpoint = lark.endpoints.get(args.endpoint_id);
116
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
117
- const success = await endpoint.updateChatInfo(args.chat_id, { name: args.name, description: args.description });
118
- return { success, message: success ? '群信息更新成功' : '更新失败' };
119
- },
120
- }, plugin.name));
121
-
122
- disposers.push(toolService.addTool({
123
- name: 'lark_add_members',
124
- description: '添加飞书群成员',
125
- parameters: {
126
- type: 'object',
127
- properties: {
128
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
129
- chat_id: { type: 'string', description: '群聊 ID' },
130
- user_ids: { type: 'string', description: '用户 open_id 列表,逗号分隔' },
131
- },
132
- required: ['endpoint_id', 'chat_id', 'user_ids'],
133
- },
134
- platforms: ['lark'],
135
- tags: ['lark'],
136
- permissions: [platformPermit('chat_admin')],
137
- execute: async (args: Record<string, any>) => {
138
- const endpoint = lark.endpoints.get(args.endpoint_id);
139
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
140
- const success = await endpoint.addChatMembers(args.chat_id, args.user_ids.split(','));
141
- return { success, message: success ? '成员添加成功' : '添加失败' };
142
- },
143
- }, plugin.name));
144
-
145
- disposers.push(toolService.addTool({
146
- name: 'lark_set_managers',
147
- description: '设置飞书群管理员',
148
- parameters: {
149
- type: 'object',
150
- properties: {
151
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
152
- chat_id: { type: 'string', description: '群聊 ID' },
153
- user_ids: { type: 'string', description: '用户 open_id 列表,逗号分隔' },
154
- },
155
- required: ['endpoint_id', 'chat_id', 'user_ids'],
156
- },
157
- platforms: ['lark'],
158
- tags: ['lark'],
159
- permissions: [platformPermit('manage_managers')],
160
- execute: async (args: Record<string, any>) => {
161
- const endpoint = lark.endpoints.get(args.endpoint_id);
162
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
163
- const success = await endpoint.setChatManagers(args.chat_id, args.user_ids.split(','));
164
- return { success, message: success ? '管理员设置成功' : '设置失败' };
165
- },
166
- }, plugin.name));
167
-
168
- disposers.push(toolService.addTool({
169
- name: 'lark_remove_managers',
170
- description: '移除飞书群管理员',
171
- parameters: {
172
- type: 'object',
173
- properties: {
174
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
175
- chat_id: { type: 'string', description: '群聊 ID' },
176
- user_ids: { type: 'string', description: '用户 open_id 列表,逗号分隔' },
177
- },
178
- required: ['endpoint_id', 'chat_id', 'user_ids'],
179
- },
180
- platforms: ['lark'],
181
- tags: ['lark'],
182
- permissions: [platformPermit('manage_managers')],
183
- execute: async (args: Record<string, any>) => {
184
- const endpoint = lark.endpoints.get(args.endpoint_id);
185
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
186
- const success = await endpoint.removeChatManagers(args.chat_id, args.user_ids.split(','));
187
- return { success, message: success ? '管理员移除成功' : '移除失败' };
188
- },
189
- }, plugin.name));
190
-
191
- disposers.push(toolService.addTool({
192
- name: 'lark_dissolve_chat',
193
- description: '解散飞书群聊(需要群主权限)',
194
- parameters: {
195
- type: 'object',
196
- properties: {
197
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
198
- chat_id: { type: 'string', description: '群聊 ID' },
199
- },
200
- required: ['endpoint_id', 'chat_id'],
201
- },
202
- platforms: ['lark'],
203
- tags: ['lark'],
204
- execute: async (args: Record<string, any>) => {
205
- const endpoint = lark.endpoints.get(args.endpoint_id);
206
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
207
- const success = await endpoint.dissolveChat(args.chat_id);
208
- return { success, message: success ? '群聊已解散' : '解散失败' };
209
- },
210
- }, plugin.name));
211
-
212
- disposers.push(toolService.addTool({
213
- name: 'lark_upload_file',
214
- description: '上传文件到飞书(opus/mp4/pdf/doc/xls/ppt/stream)',
215
- parameters: {
216
- type: 'object',
217
- properties: {
218
- endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
219
- file_path: { type: 'string', description: '本地文件路径' },
220
- file_type: { type: 'string', description: '文件类型', enum: ['opus', 'mp4', 'pdf', 'doc', 'xls', 'ppt', 'stream'] },
221
- },
222
- required: ['endpoint_id', 'file_path', 'file_type'],
223
- },
224
- platforms: ['lark'],
225
- tags: ['lark'],
226
- execute: async (args: Record<string, any>) => {
227
- const validTypes = ['opus', 'mp4', 'pdf', 'doc', 'xls', 'ppt', 'stream'];
228
- if (!validTypes.includes(args.file_type)) {
229
- throw new Error(`不支持的文件类型: ${args.file_type},支持: ${validTypes.join(', ')}`);
230
- }
231
- const endpoint = lark.endpoints.get(args.endpoint_id);
232
- if (!endpoint) throw new Error(`Endpoint ${args.endpoint_id} 不存在`);
233
- const result = await endpoint.uploadFile(args.file_path, args.file_type);
234
- return { success: true, file_key: result, message: `文件已上传,file_key: ${result}` };
235
- },
236
- }, plugin.name));
237
-
61
+ disposers.push(...sceneTools.map(t => toolService.addTool(t, plugin.name)));
238
62
  return () => disposers.forEach(d => d());
239
63
  });
@@ -0,0 +1,18 @@
1
+ import type { LarkAdapter } from './adapter.js';
2
+ import type { LarkEndpoint } from './endpoint.js';
3
+
4
+ export interface LarkAgentDeps {
5
+ getEndpoint: (endpointId: string) => LarkEndpoint;
6
+ getAdapter: () => LarkAdapter;
7
+ }
8
+
9
+ let _deps: LarkAgentDeps | null = null;
10
+
11
+ export function setLarkAgentDeps(deps: LarkAgentDeps): void {
12
+ _deps = deps;
13
+ }
14
+
15
+ export function getLarkAgentDeps(): LarkAgentDeps {
16
+ if (!_deps) throw new Error('lark agent deps not initialized');
17
+ return _deps;
18
+ }
@@ -1,8 +1,7 @@
1
1
  /**
2
2
  * 飞书 Lark platform permit
3
3
  */
4
- import type { Message } from 'zhin.js';
5
- import { registerPlatformPermitChecker } from 'zhin.js';
4
+ import { registerPlatformPermitChecker, type Message } from 'zhin.js';
6
5
 
7
6
  const ADAPTER = 'lark';
8
7
 
@@ -11,8 +10,8 @@ export function platformPermit(perm: string): string {
11
10
  }
12
11
 
13
12
  const FACTORY_PERM_MAP: Record<string, string> = {
14
- group_admin: 'chat_admin',
15
- group_owner: 'chat_owner',
13
+ scene_admin: 'chat_admin',
14
+ scene_owner: 'chat_owner',
16
15
  };
17
16
 
18
17
  export function larkGroupPermitResolver(logicalPerm: string): string {
@@ -0,0 +1 @@
1
+ export { toCanonicalSegments, fromCanonicalSegments } from 'zhin.js';
package/lib/adapter.d.ts DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * 飞书/Lark 适配器
3
- */
4
- import { Adapter, Plugin } from 'zhin.js';
5
- import { LarkEndpoint } from "./endpoint.js";
6
- import type { LarkEndpointConfig } from "./types.js";
7
- export declare class LarkAdapter extends Adapter<LarkEndpoint> {
8
- #private;
9
- static readonly capabilities: readonly ["inbound", "outbound"];
10
- static outboundRichSegmentPolicy: import("zhin.js").OutboundRichSegmentPolicy;
11
- constructor(plugin: Plugin, router: any);
12
- createEndpoint(config: LarkEndpointConfig): LarkEndpoint;
13
- kickMember(endpointId: string, sceneId: string, userId: string): Promise<boolean>;
14
- listMembers(endpointId: string, sceneId: string): Promise<any[]>;
15
- getGroupInfo(endpointId: string, sceneId: string): Promise<any>;
16
- setGroupName(endpointId: string, sceneId: string, name: string): Promise<boolean>;
17
- start(): Promise<void>;
18
- }
19
- //# sourceMappingURL=adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EACd,MAAM,EAAwC,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,WAAY,SAAQ,OAAO,CAAC,YAAY,CAAC;;IACpD,gBAAyB,YAAY,mCAAoC;IACzE,OAAgB,yBAAyB,8CAAwC;gBAInE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;IAKvC,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY;IAMlD,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAM9D,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAM/C,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAMhD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAQ9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,OAAO,EACN,oCAAoC,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,OAAO,WAAY,SAAQ,OAAqB;IACpD,MAAM,CAAmB,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,CAAU,CAAC;IACzE,MAAM,CAAU,yBAAyB,GAAG,oCAAoC,CAAC;IAE/E,OAAO,CAAM;IAEb,YAAY,MAAc,EAAE,MAAW;QACnC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,cAAc,CAAC,MAA0B;QACrC,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,gEAAgE;IAEhE,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,OAAe,EAAE,MAAc;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB,EAAE,OAAe;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,OAAe;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,OAAe,EAAE,IAAY;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,kEAAkE;IAElE,KAAK,CAAC,KAAK;QACP,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC"}
package/lib/endpoint.d.ts DELETED
@@ -1,84 +0,0 @@
1
- import { Endpoint, Message, SendOptions } from 'zhin.js';
2
- import type { LarkEndpointConfig, LarkMessage } from "./types.js";
3
- import type { LarkAdapter } from "./adapter.js";
4
- export declare class LarkEndpoint implements Endpoint<LarkEndpointConfig, LarkMessage> {
5
- adapter: LarkAdapter;
6
- $config: LarkEndpointConfig;
7
- $connected: boolean;
8
- private router;
9
- private accessToken;
10
- private axiosInstance;
11
- get logger(): import("zhin.js").Logger;
12
- get $id(): string;
13
- constructor(adapter: LarkAdapter, router: any, $config: LarkEndpointConfig);
14
- private setupWebhookRoute;
15
- private handleWebhook;
16
- private verifySignature;
17
- private chatPermitCache;
18
- private enrichGroupSender;
19
- private handleEvent;
20
- private ensureAccessToken;
21
- private refreshAccessToken;
22
- $formatMessage(msg: LarkMessage, event?: any): Message<LarkMessage>;
23
- private parseMessageContent;
24
- private parseRichTextContent;
25
- $sendMessage(options: SendOptions): Promise<string>;
26
- $recallMessage(id: string): Promise<void>;
27
- private formatSendContent;
28
- $connect(): Promise<void>;
29
- $disconnect(): Promise<void>;
30
- getUserInfo(userId: string, userIdType?: 'open_id' | 'user_id' | 'union_id'): Promise<any>;
31
- getChatInfo(chatId: string): Promise<any>;
32
- uploadFile(filePath: string, fileType?: 'image' | 'file' | 'video' | 'audio'): Promise<string | null>;
33
- /**
34
- * 创建群聊
35
- * @param name 群名
36
- * @param userIds 成员 open_id 列表
37
- * @param ownerId 群主 open_id
38
- */
39
- createChat(name: string, userIds: string[], ownerId?: string): Promise<string | null>;
40
- /**
41
- * 更新群信息
42
- * @param chatId 群聊 ID
43
- * @param options 更新选项
44
- */
45
- updateChatInfo(chatId: string, options: {
46
- name?: string;
47
- description?: string;
48
- }): Promise<boolean>;
49
- /**
50
- * 添加群成员
51
- * @param chatId 群聊 ID
52
- * @param userIds 用户 ID 列表
53
- */
54
- addChatMembers(chatId: string, userIds: string[]): Promise<boolean>;
55
- /**
56
- * 移除群成员
57
- * @param chatId 群聊 ID
58
- * @param userIds 用户 ID 列表
59
- */
60
- removeChatMembers(chatId: string, userIds: string[]): Promise<boolean>;
61
- /**
62
- * 获取群成员列表
63
- * @param chatId 群聊 ID
64
- */
65
- getChatMembers(chatId: string): Promise<any[]>;
66
- /**
67
- * 解散群聊
68
- * @param chatId 群聊 ID
69
- */
70
- dissolveChat(chatId: string): Promise<boolean>;
71
- /**
72
- * 设置群管理员
73
- * @param chatId 群聊 ID
74
- * @param userIds 用户 ID 列表
75
- */
76
- setChatManagers(chatId: string, userIds: string[]): Promise<boolean>;
77
- /**
78
- * 移除群管理员
79
- * @param chatId 群聊 ID
80
- * @param userIds 用户 ID 列表
81
- */
82
- removeChatManagers(chatId: string, userIds: string[]): Promise<boolean>;
83
- }
84
- //# sourceMappingURL=endpoint.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../src/endpoint.ts"],"names":[],"mappings":"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"}