@zhin.js/adapter-lark 4.0.1 → 4.0.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +59 -84
  3. package/adapters/lark.ts +26 -0
  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/endpoint.d.ts +41 -72
  13. package/lib/endpoint.js +219 -563
  14. package/lib/index.d.ts +5 -15
  15. package/lib/index.js +5 -216
  16. package/lib/lark-agent-deps.d.ts +27 -0
  17. package/lib/lark-agent-deps.js +30 -0
  18. package/lib/platform-permit.d.ts +1 -2
  19. package/lib/platform-permit.js +4 -2
  20. package/lib/protocol.d.ts +111 -0
  21. package/lib/protocol.js +204 -0
  22. package/lib/webhook.d.ts +13 -0
  23. package/lib/webhook.js +67 -0
  24. package/package.json +50 -21
  25. package/plugin.ts +12 -0
  26. package/schema.json +25 -0
  27. package/src/endpoint.ts +354 -705
  28. package/src/index.ts +46 -236
  29. package/src/lark-agent-deps.ts +62 -0
  30. package/src/platform-permit.ts +1 -2
  31. package/src/protocol.ts +332 -0
  32. package/src/webhook.ts +101 -0
  33. package/lib/adapter.d.ts +0 -20
  34. package/lib/adapter.d.ts.map +0 -1
  35. package/lib/adapter.js +0 -48
  36. package/lib/adapter.js.map +0 -1
  37. package/lib/endpoint.d.ts.map +0 -1
  38. package/lib/endpoint.js.map +0 -1
  39. package/lib/index.d.ts.map +0 -1
  40. package/lib/index.js.map +0 -1
  41. package/lib/platform-permit.d.ts.map +0 -1
  42. package/lib/platform-permit.js.map +0 -1
  43. package/lib/segment-mapper.d.ts +0 -2
  44. package/lib/segment-mapper.d.ts.map +0 -1
  45. package/lib/segment-mapper.js +0 -2
  46. package/lib/segment-mapper.js.map +0 -1
  47. package/lib/types.d.ts +0 -63
  48. package/lib/types.d.ts.map +0 -1
  49. package/lib/types.js +0 -2
  50. package/lib/types.js.map +0 -1
  51. package/plugin.yml +0 -3
  52. package/src/adapter.ts +0 -57
  53. package/src/segment-mapper.ts +0 -1
  54. package/src/types.ts +0 -58
  55. /package/{skills/lark → agent}/PERMITS.md +0 -0
  56. /package/{skills/lark/SKILL.md → agent/skills/lark.md} +0 -0
package/lib/webhook.js ADDED
@@ -0,0 +1,67 @@
1
+ import { formatCompact, getLogger } from '@zhin.js/logger';
2
+ import { headerValue, readTextBody, verifySignature, } from './protocol.js';
3
+ const logger = getLogger('lark');
4
+ export function registerLarkWebhookRoutes(http, handler) {
5
+ const path = handler.config.webhookPath;
6
+ return [
7
+ http.route('POST', path, async (request, response) => {
8
+ await handleLarkWebhookRequest(request, response, handler);
9
+ }, { summary: 'Lark/Feishu event webhook', tags: ['lark'] }),
10
+ ];
11
+ }
12
+ export async function handleLarkWebhookRequest(request, response, handler) {
13
+ try {
14
+ const rawBody = await readTextBody(request);
15
+ if (handler.config.verificationToken) {
16
+ const token = headerValue(request.headers, 'x-lark-request-token');
17
+ if (token !== handler.config.verificationToken) {
18
+ logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'invalid verification token' }));
19
+ response.writeHead(403, { 'Content-Type': 'text/plain' });
20
+ response.end('Forbidden');
21
+ return;
22
+ }
23
+ }
24
+ if (handler.config.encryptKey) {
25
+ const timestamp = headerValue(request.headers, 'x-lark-request-timestamp');
26
+ const nonce = headerValue(request.headers, 'x-lark-request-nonce');
27
+ const signature = headerValue(request.headers, 'x-lark-signature');
28
+ if (!timestamp
29
+ || !nonce
30
+ || !signature
31
+ || !verifySignature(handler.config.encryptKey, timestamp, nonce, rawBody, signature)) {
32
+ logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'invalid signature' }));
33
+ response.writeHead(403, { 'Content-Type': 'text/plain' });
34
+ response.end('Forbidden');
35
+ return;
36
+ }
37
+ }
38
+ let event;
39
+ try {
40
+ event = JSON.parse(rawBody);
41
+ }
42
+ catch {
43
+ response.writeHead(200, { 'Content-Type': 'application/json' });
44
+ response.end(JSON.stringify({ code: 0, msg: 'success' }));
45
+ return;
46
+ }
47
+ if (event.type === 'url_verification') {
48
+ response.writeHead(200, { 'Content-Type': 'application/json' });
49
+ response.end(JSON.stringify({ challenge: event.challenge }));
50
+ return;
51
+ }
52
+ if (event.type === 'event_callback' && event.event?.message && handler.isOpen) {
53
+ const message = {
54
+ ...event.event.message,
55
+ sender: event.event.message.sender ?? event.event.sender,
56
+ };
57
+ handler.admit(message);
58
+ }
59
+ response.writeHead(200, { 'Content-Type': 'application/json' });
60
+ response.end(JSON.stringify({ code: 0, msg: 'success' }));
61
+ }
62
+ catch (error) {
63
+ logger.error('Webhook error:', error);
64
+ response.writeHead(500, { 'Content-Type': 'application/json' });
65
+ response.end(JSON.stringify({ code: -1, msg: 'Internal Server Error' }));
66
+ }
67
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-lark",
3
- "version": "4.0.1",
4
- "description": "Zhin.js adapter for Lark/Feishu (飞书)",
3
+ "version": "4.0.3",
4
+ "description": "Zhin.js Lark/Feishu (飞书) adapter for Plugin Runtime (HTTP webhook)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
7
7
  "types": "./lib/index.d.ts",
@@ -34,33 +34,48 @@
34
34
  "directory": "plugins/adapters/lark"
35
35
  },
36
36
  "dependencies": {
37
- "axios": "^1.18.0"
38
- },
39
- "devDependencies": {
40
- "@types/koa": "^3.0.3",
41
- "@types/node": "^26.1.0",
42
- "typescript": "^6.0.3",
43
- "@zhin.js/host-router": "2.0.2",
44
- "zhin.js": "4.1.1"
37
+ "@zhin.js/adapter": "1.0.1",
38
+ "@zhin.js/core": "1.3.5",
39
+ "@zhin.js/host-http": "1.0.1",
40
+ "@zhin.js/logger": "1.0.75",
41
+ "@zhin.js/plugin-runtime": "1.0.1"
45
42
  },
46
43
  "peerDependencies": {
47
- "zhin.js": "4.1.1",
48
- "@zhin.js/host-router": "2.0.2"
44
+ "zod": "^4.0.0",
45
+ "@zhin.js/adapter": "1.0.1",
46
+ "@zhin.js/agent": "1.0.4",
47
+ "@zhin.js/core": "1.3.5",
48
+ "@zhin.js/host-http": "1.0.1",
49
+ "@zhin.js/plugin-runtime": "1.0.1",
50
+ "zhin.js": "4.1.3"
49
51
  },
50
52
  "peerDependenciesMeta": {
51
- "@zhin.js/host-router": {
52
- "optional": false
53
+ "zhin.js": {
54
+ "optional": true
55
+ },
56
+ "@zhin.js/agent": {
57
+ "optional": true
58
+ },
59
+ "zod": {
60
+ "optional": true
53
61
  }
54
62
  },
63
+ "devDependencies": {
64
+ "@types/node": "^26.1.0",
65
+ "typescript": "^6.0.3",
66
+ "vitest": "^4.1.10",
67
+ "zod": "^4.4.3",
68
+ "@zhin.js/agent": "1.0.4",
69
+ "zhin.js": "4.1.3"
70
+ },
55
71
  "files": [
72
+ "adapters",
73
+ "plugin.ts",
74
+ "schema.json",
56
75
  "src",
57
76
  "lib",
58
- "client",
59
- "dist",
60
- "skills",
61
- "plugin.yml",
77
+ "agent",
62
78
  "README.md",
63
- "node",
64
79
  "CHANGELOG.md"
65
80
  ],
66
81
  "publishConfig": {
@@ -70,9 +85,23 @@
70
85
  "engines": {
71
86
  "node": "^20.19.0 || >=22.12.0"
72
87
  },
88
+ "zhin": {
89
+ "protocol": 1,
90
+ "type": "plugin",
91
+ "entry": "./plugin.ts",
92
+ "engine": "^1.0.0",
93
+ "runtime": "trusted",
94
+ "features": [
95
+ {
96
+ "package": "@zhin.js/adapter",
97
+ "api": "^1.0.0"
98
+ }
99
+ ],
100
+ "plugins": []
101
+ },
73
102
  "scripts": {
74
- "build": "pnpm build:node",
103
+ "build": "tsc",
75
104
  "clean": "rimraf lib",
76
- "build:node": "tsc"
105
+ "test": "NODE_OPTIONS=--experimental-strip-types vitest run --root ../../.. plugins/adapters/lark/tests"
77
106
  }
78
107
  }
package/plugin.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { definePlugin } from '@zhin.js/plugin-runtime';
2
+ import { registerLarkPlatformPermitChecker } from './src/platform-permit.js';
3
+
4
+ export default definePlugin({
5
+ name: 'lark',
6
+ metadata: {
7
+ displayName: 'Lark/Feishu (飞书) Adapter',
8
+ },
9
+ setup() {
10
+ return registerLarkPlatformPermitChecker();
11
+ },
12
+ });
package/schema.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "properties": {
6
+ "name": {
7
+ "type": "string",
8
+ "default": "lark-bot"
9
+ },
10
+ "appId": { "type": "string" },
11
+ "appSecret": { "type": "string" },
12
+ "encryptKey": { "type": "string" },
13
+ "verificationToken": { "type": "string" },
14
+ "webhookPath": {
15
+ "type": "string",
16
+ "default": "/lark/webhook"
17
+ },
18
+ "apiBaseUrl": { "type": "string" },
19
+ "isFeishu": {
20
+ "type": "boolean",
21
+ "default": true
22
+ }
23
+ },
24
+ "required": ["appId", "appSecret"]
25
+ }