@zhin.js/adapter-lark 2.0.0 → 2.0.1
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.
- package/CHANGELOG.md +11 -0
- package/README.md +2 -2
- package/lib/adapter.d.ts +9 -8
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +24 -23
- package/lib/adapter.js.map +1 -1
- package/lib/{bot.d.ts → endpoint.d.ts} +8 -6
- package/lib/endpoint.d.ts.map +1 -0
- package/lib/{bot.js → endpoint.js} +44 -9
- package/lib/endpoint.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +59 -52
- package/lib/index.js.map +1 -1
- package/lib/platform-permit.d.ts +16 -0
- package/lib/platform-permit.d.ts.map +1 -0
- package/lib/platform-permit.js +41 -0
- package/lib/platform-permit.js.map +1 -0
- package/lib/types.d.ts +3 -3
- package/lib/types.d.ts.map +1 -1
- package/package.json +7 -6
- package/skills/lark/PERMITS.md +22 -0
- package/src/adapter.ts +23 -21
- package/src/{bot.ts → endpoint.ts} +44 -11
- package/src/index.ts +55 -43
- package/src/platform-permit.ts +55 -0
- package/src/types.ts +3 -3
- package/lib/bot.d.ts.map +0 -1
- package/lib/bot.js.map +0 -1
package/lib/index.js.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 飞书 Lark platform permit
|
|
3
|
+
*/
|
|
4
|
+
import type { Message } from 'zhin.js';
|
|
5
|
+
export declare function platformPermit(perm: string): string;
|
|
6
|
+
export declare function larkGroupPermitResolver(logicalPerm: string): string;
|
|
7
|
+
export declare function normalizeLarkSenderForPermit(input: {
|
|
8
|
+
isOwner?: boolean;
|
|
9
|
+
isAdmin?: boolean;
|
|
10
|
+
}): {
|
|
11
|
+
role?: string;
|
|
12
|
+
permissions?: string[];
|
|
13
|
+
};
|
|
14
|
+
export declare function checkLarkPlatformPermit(perm: string, message: Message<any>): boolean;
|
|
15
|
+
export declare function registerLarkPlatformPermitChecker(): () => void;
|
|
16
|
+
//# sourceMappingURL=platform-permit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-permit.d.ts","sourceRoot":"","sources":["../src/platform-permit.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAKvC,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAOD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAQ5C;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAgBpF;AAED,wBAAgB,iCAAiC,IAAI,MAAM,IAAI,CAE9D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { registerPlatformPermitChecker } from 'zhin.js';
|
|
2
|
+
const ADAPTER = 'lark';
|
|
3
|
+
export function platformPermit(perm) {
|
|
4
|
+
return `platform(${ADAPTER},${perm})`;
|
|
5
|
+
}
|
|
6
|
+
const FACTORY_PERM_MAP = {
|
|
7
|
+
group_admin: 'chat_admin',
|
|
8
|
+
group_owner: 'chat_owner',
|
|
9
|
+
};
|
|
10
|
+
export function larkGroupPermitResolver(logicalPerm) {
|
|
11
|
+
return platformPermit(FACTORY_PERM_MAP[logicalPerm] ?? logicalPerm);
|
|
12
|
+
}
|
|
13
|
+
export function normalizeLarkSenderForPermit(input) {
|
|
14
|
+
if (input.isOwner) {
|
|
15
|
+
return { role: 'owner', permissions: ['chat_owner', 'chat_admin', 'manage_managers'] };
|
|
16
|
+
}
|
|
17
|
+
if (input.isAdmin) {
|
|
18
|
+
return { role: 'admin', permissions: ['chat_admin'] };
|
|
19
|
+
}
|
|
20
|
+
return { role: 'member', permissions: [] };
|
|
21
|
+
}
|
|
22
|
+
export function checkLarkPlatformPermit(perm, message) {
|
|
23
|
+
const sender = message.$sender;
|
|
24
|
+
const permissions = sender.permissions ?? [];
|
|
25
|
+
const role = sender.role;
|
|
26
|
+
const has = (t) => permissions.includes(t);
|
|
27
|
+
switch (perm) {
|
|
28
|
+
case 'chat_owner':
|
|
29
|
+
return role === 'owner' || has('chat_owner');
|
|
30
|
+
case 'chat_admin':
|
|
31
|
+
return role === 'owner' || role === 'admin' || has('chat_admin') || has('chat_owner');
|
|
32
|
+
case 'manage_managers':
|
|
33
|
+
return role === 'owner' || has('chat_owner');
|
|
34
|
+
default:
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function registerLarkPlatformPermitChecker() {
|
|
39
|
+
return registerPlatformPermitChecker(ADAPTER, checkLarkPlatformPermit);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=platform-permit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-permit.js","sourceRoot":"","sources":["../src/platform-permit.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAExD,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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 飞书/Lark 适配器类型定义
|
|
3
3
|
*/
|
|
4
|
-
export interface
|
|
4
|
+
export interface LarkEndpointConfig {
|
|
5
5
|
context: "lark";
|
|
6
6
|
name: string;
|
|
7
7
|
appId: string;
|
|
@@ -57,7 +57,7 @@ export interface AccessToken {
|
|
|
57
57
|
expires_in: number;
|
|
58
58
|
timestamp: number;
|
|
59
59
|
}
|
|
60
|
-
export interface
|
|
61
|
-
$config:
|
|
60
|
+
export interface LarkEndpoint {
|
|
61
|
+
$config: LarkEndpointConfig;
|
|
62
62
|
}
|
|
63
63
|
//# sourceMappingURL=types.d.ts.map
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,SAAS,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACtE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,EAAE,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,OAAO,CAAC,EAAE,WAAW,CAAC;QACtB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,kBAAkB,CAAC;CAC7B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/adapter-lark",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Zhin.js adapter for Lark/Feishu (飞书)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -34,17 +34,18 @@
|
|
|
34
34
|
"directory": "plugins/adapters/lark"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"axios": "^1.
|
|
37
|
+
"axios": "^1.17.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/koa": "^3.0.3",
|
|
41
|
-
"@types/node": "^25.9.
|
|
41
|
+
"@types/node": "^25.9.2",
|
|
42
42
|
"typescript": "^6.0.3",
|
|
43
|
-
"zhin.js": "
|
|
43
|
+
"@zhin.js/host-router": "1.0.1",
|
|
44
|
+
"zhin.js": "2.0.1"
|
|
44
45
|
},
|
|
45
46
|
"peerDependencies": {
|
|
46
|
-
"@zhin.js/host-router": "1.0.
|
|
47
|
-
"zhin.js": "2.0.
|
|
47
|
+
"@zhin.js/host-router": "1.0.1",
|
|
48
|
+
"zhin.js": "2.0.1"
|
|
48
49
|
},
|
|
49
50
|
"peerDependenciesMeta": {
|
|
50
51
|
"@zhin.js/host-router": {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# 飞书 Lark Platform Permits
|
|
2
|
+
|
|
3
|
+
## 入站字段
|
|
4
|
+
|
|
5
|
+
群聊消息经 `getChatInfo`(TTL 60s)比对 `owner_id` / `user_manager_id_list`:
|
|
6
|
+
|
|
7
|
+
| 字段 | 取值 |
|
|
8
|
+
|------|------|
|
|
9
|
+
| `$sender.role` | `owner` · `admin` · `member` |
|
|
10
|
+
| `$sender.permissions` | `chat_owner` · `chat_admin` · `manage_managers` |
|
|
11
|
+
|
|
12
|
+
## Permit 词汇表
|
|
13
|
+
|
|
14
|
+
| `platform(lark,…)` | 含义 |
|
|
15
|
+
|--------------------|------|
|
|
16
|
+
| `chat_owner` | 群主 |
|
|
17
|
+
| `chat_admin` | 群管理员 |
|
|
18
|
+
| `manage_managers` | 可设/撤管理员 |
|
|
19
|
+
|
|
20
|
+
## 工厂映射
|
|
21
|
+
|
|
22
|
+
`group_admin` → `chat_admin` · `group_owner` → `chat_owner`
|
package/src/adapter.ts
CHANGED
|
@@ -5,10 +5,12 @@ import {
|
|
|
5
5
|
Adapter,
|
|
6
6
|
Plugin,
|
|
7
7
|
} from "zhin.js";
|
|
8
|
-
import {
|
|
9
|
-
import type {
|
|
8
|
+
import { LarkEndpoint } from "./endpoint.js";
|
|
9
|
+
import type { LarkEndpointConfig } from "./types.js";
|
|
10
|
+
|
|
11
|
+
export class LarkAdapter extends Adapter<LarkEndpoint> {
|
|
12
|
+
static override readonly capabilities = ['inbound', 'outbound'] as const;
|
|
10
13
|
|
|
11
|
-
export class LarkAdapter extends Adapter<LarkBot> {
|
|
12
14
|
#router: any;
|
|
13
15
|
|
|
14
16
|
constructor(plugin: Plugin, router: any) {
|
|
@@ -16,34 +18,34 @@ export class LarkAdapter extends Adapter<LarkBot> {
|
|
|
16
18
|
this.#router = router;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
return new
|
|
21
|
+
createEndpoint(config: LarkEndpointConfig): LarkEndpoint {
|
|
22
|
+
return new LarkEndpoint(this, this.#router, config);
|
|
21
23
|
}
|
|
22
24
|
|
|
23
25
|
// ── IGroupManagement 标准群管方法 ──────────────────────────────────
|
|
24
26
|
|
|
25
|
-
async kickMember(
|
|
26
|
-
const
|
|
27
|
-
if (!
|
|
28
|
-
return
|
|
27
|
+
async kickMember(endpointId: string, sceneId: string, userId: string) {
|
|
28
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
29
|
+
if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
30
|
+
return endpoint.removeChatMembers(sceneId, [userId]);
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
async listMembers(
|
|
32
|
-
const
|
|
33
|
-
if (!
|
|
34
|
-
return
|
|
33
|
+
async listMembers(endpointId: string, sceneId: string) {
|
|
34
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
35
|
+
if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
36
|
+
return endpoint.getChatMembers(sceneId);
|
|
35
37
|
}
|
|
36
38
|
|
|
37
|
-
async getGroupInfo(
|
|
38
|
-
const
|
|
39
|
-
if (!
|
|
40
|
-
return
|
|
39
|
+
async getGroupInfo(endpointId: string, sceneId: string) {
|
|
40
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
41
|
+
if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
42
|
+
return endpoint.getChatInfo(sceneId);
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
async setGroupName(
|
|
44
|
-
const
|
|
45
|
-
if (!
|
|
46
|
-
return
|
|
45
|
+
async setGroupName(endpointId: string, sceneId: string, name: string) {
|
|
46
|
+
const endpoint = this.endpoints.get(endpointId);
|
|
47
|
+
if (!endpoint) throw new Error(`Endpoint ${endpointId} 不存在`);
|
|
48
|
+
return endpoint.updateChatInfo(sceneId, { name });
|
|
47
49
|
}
|
|
48
50
|
|
|
49
51
|
// ── 生命周期 ───────────────────────────────────────────────────────
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 飞书/Lark
|
|
2
|
+
* 飞书/Lark Endpoint 实现
|
|
3
3
|
*/
|
|
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,
|
|
8
|
-
import type {
|
|
7
|
+
import { formatCompact, Endpoint, Message, MessageSegment, segment, SendContent, SendOptions } from 'zhin.js';
|
|
8
|
+
import type { LarkEndpointConfig, LarkMessage, LarkEvent, AccessToken } from "./types.js";
|
|
9
9
|
import type { LarkAdapter } from "./adapter.js";
|
|
10
|
+
import { normalizeLarkSenderForPermit } from "./platform-permit.js";
|
|
10
11
|
|
|
11
|
-
export class
|
|
12
|
+
export class LarkEndpoint implements Endpoint<LarkEndpointConfig, LarkMessage> {
|
|
12
13
|
$connected: boolean
|
|
13
14
|
private router: any
|
|
14
15
|
private accessToken: AccessToken
|
|
@@ -22,7 +23,7 @@ export class LarkBot implements Bot<LarkBotConfig, LarkMessage> {
|
|
|
22
23
|
return this.$config.name;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
constructor(public adapter: LarkAdapter, router: any, public $config:
|
|
26
|
+
constructor(public adapter: LarkAdapter, router: any, public $config: LarkEndpointConfig) {
|
|
26
27
|
this.router = router;
|
|
27
28
|
this.$connected = false;
|
|
28
29
|
this.accessToken = { token: '', expires_in: 0, timestamp: 0 };
|
|
@@ -125,14 +126,46 @@ export class LarkBot implements Bot<LarkBotConfig, LarkMessage> {
|
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
128
|
|
|
129
|
+
private chatPermitCache = new Map<string, { at: number; ownerId?: string; managers: string[] }>();
|
|
130
|
+
|
|
131
|
+
private async enrichGroupSender(message: Message<LarkMessage>, msg: LarkMessage): Promise<void> {
|
|
132
|
+
if (message.$channel.type !== 'group' || !msg.chat_id) return;
|
|
133
|
+
const senderId = msg.sender?.sender_id?.open_id;
|
|
134
|
+
if (!senderId) return;
|
|
135
|
+
const now = Date.now();
|
|
136
|
+
let ownerId: string | undefined;
|
|
137
|
+
let managers: string[] = [];
|
|
138
|
+
const cached = this.chatPermitCache.get(msg.chat_id);
|
|
139
|
+
if (cached && now - cached.at < 60_000) {
|
|
140
|
+
ownerId = cached.ownerId;
|
|
141
|
+
managers = cached.managers;
|
|
142
|
+
} else {
|
|
143
|
+
try {
|
|
144
|
+
const chat = await this.getChatInfo(msg.chat_id);
|
|
145
|
+
ownerId = chat?.owner_id;
|
|
146
|
+
managers = Array.isArray(chat?.user_manager_id_list) ? chat.user_manager_id_list : [];
|
|
147
|
+
this.chatPermitCache.set(msg.chat_id, { at: now, ownerId, managers });
|
|
148
|
+
} catch {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const permit = normalizeLarkSenderForPermit({
|
|
153
|
+
isOwner: ownerId === senderId,
|
|
154
|
+
isAdmin: managers.includes(senderId),
|
|
155
|
+
});
|
|
156
|
+
message.$sender.role = permit.role;
|
|
157
|
+
message.$sender.permissions = permit.permissions;
|
|
158
|
+
}
|
|
159
|
+
|
|
128
160
|
private async handleEvent(event: any): Promise<void> {
|
|
129
161
|
// 处理消息事件
|
|
130
162
|
if (event.message) {
|
|
131
163
|
const message = this.$formatMessage(event.message, event);
|
|
164
|
+
await this.enrichGroupSender(message, event.message);
|
|
132
165
|
this.adapter.emit('message.receive', message);
|
|
133
166
|
this.logger.debug(formatCompact( {
|
|
134
167
|
op: 'recv',
|
|
135
|
-
|
|
168
|
+
endpoint: this.$config.name,
|
|
136
169
|
channel: message.$channel.type,
|
|
137
170
|
id: message.$channel.id,
|
|
138
171
|
len: segment.raw(message.$content).length,
|
|
@@ -196,7 +229,7 @@ export class LarkBot implements Bot<LarkBotConfig, LarkMessage> {
|
|
|
196
229
|
return Message.from(msg, {
|
|
197
230
|
$id: msg.message_id || Date.now().toString(),
|
|
198
231
|
$adapter: 'lark',
|
|
199
|
-
$
|
|
232
|
+
$endpoint: this.$config.name,
|
|
200
233
|
$sender: {
|
|
201
234
|
id: msg.sender?.sender_id?.open_id || 'unknown',
|
|
202
235
|
name: msg.sender?.sender_id?.user_id || msg.sender?.sender_id?.open_id || 'Unknown User'
|
|
@@ -214,7 +247,7 @@ export class LarkBot implements Bot<LarkBotConfig, LarkMessage> {
|
|
|
214
247
|
$reply: async (content: SendContent): Promise<string> => {
|
|
215
248
|
return await this.adapter.sendMessage({
|
|
216
249
|
context: 'lark',
|
|
217
|
-
|
|
250
|
+
endpoint: this.$config.name,
|
|
218
251
|
id: msg.chat_id || 'unknown',
|
|
219
252
|
type: chatType,
|
|
220
253
|
content: content
|
|
@@ -450,7 +483,7 @@ export class LarkBot implements Bot<LarkBotConfig, LarkMessage> {
|
|
|
450
483
|
}
|
|
451
484
|
|
|
452
485
|
// ================================================================================================
|
|
453
|
-
//
|
|
486
|
+
// Endpoint 生命周期
|
|
454
487
|
// ================================================================================================
|
|
455
488
|
|
|
456
489
|
async $connect(): Promise<void> {
|
|
@@ -459,7 +492,7 @@ export class LarkBot implements Bot<LarkBotConfig, LarkMessage> {
|
|
|
459
492
|
await this.refreshAccessToken();
|
|
460
493
|
|
|
461
494
|
this.$connected = true;
|
|
462
|
-
this.logger.info(formatCompact({
|
|
495
|
+
this.logger.info(formatCompact({ endpoint: this.$config.name }));
|
|
463
496
|
this.logger.info(formatCompact( { op: 'webhook', path: this.$config.webhookPath }));
|
|
464
497
|
|
|
465
498
|
} catch (error) {
|
|
@@ -471,7 +504,7 @@ export class LarkBot implements Bot<LarkBotConfig, LarkMessage> {
|
|
|
471
504
|
async $disconnect(): Promise<void> {
|
|
472
505
|
try {
|
|
473
506
|
this.$connected = false;
|
|
474
|
-
this.logger.info(formatCompact( { op: 'disconnect',
|
|
507
|
+
this.logger.info(formatCompact( { op: 'disconnect', endpoint: this.$config.name }));
|
|
475
508
|
} catch (error) {
|
|
476
509
|
this.logger.error('Error disconnecting Lark bot:', error);
|
|
477
510
|
}
|
package/src/index.ts
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { usePlugin, type Plugin, type Context, type IGroupManagement, createGroupManagementTools, type ToolFeature } from "zhin.js";
|
|
5
5
|
import { LarkAdapter } from "./adapter.js";
|
|
6
|
+
import {
|
|
7
|
+
larkGroupPermitResolver,
|
|
8
|
+
platformPermit,
|
|
9
|
+
registerLarkPlatformPermitChecker,
|
|
10
|
+
} from "./platform-permit.js";
|
|
6
11
|
|
|
7
12
|
declare module "zhin.js" {
|
|
8
13
|
namespace Plugin {
|
|
@@ -16,7 +21,7 @@ declare module "zhin.js" {
|
|
|
16
21
|
}
|
|
17
22
|
|
|
18
23
|
export * from "./types.js";
|
|
19
|
-
export {
|
|
24
|
+
export { LarkEndpoint } from "./endpoint.js";
|
|
20
25
|
export { LarkAdapter } from "./adapter.js";
|
|
21
26
|
|
|
22
27
|
const plugin = usePlugin();
|
|
@@ -25,7 +30,7 @@ const { provide, useContext } = plugin;
|
|
|
25
30
|
(useContext as (key: string, fn: (router: any) => void) => void)("router", (router) => {
|
|
26
31
|
provide({
|
|
27
32
|
name: "lark",
|
|
28
|
-
description: "Lark/Feishu
|
|
33
|
+
description: "Lark/Feishu Endpoint Adapter",
|
|
29
34
|
mounted: async (p: Plugin) => {
|
|
30
35
|
const adapter = new LarkAdapter(p, router);
|
|
31
36
|
await adapter.start();
|
|
@@ -38,11 +43,14 @@ const { provide, useContext } = plugin;
|
|
|
38
43
|
});
|
|
39
44
|
|
|
40
45
|
useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
46
|
+
const disposers: (() => void)[] = [];
|
|
47
|
+
disposers.push(registerLarkPlatformPermitChecker());
|
|
41
48
|
const groupTools = createGroupManagementTools(
|
|
42
49
|
lark as unknown as IGroupManagement,
|
|
43
50
|
'lark',
|
|
51
|
+
{ permitResolver: larkGroupPermitResolver, registerChecker: false },
|
|
44
52
|
);
|
|
45
|
-
|
|
53
|
+
disposers.push(...groupTools.map(t => toolService.addTool(t, plugin.name)));
|
|
46
54
|
|
|
47
55
|
disposers.push(toolService.addTool({
|
|
48
56
|
name: 'lark_get_user',
|
|
@@ -50,17 +58,17 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
50
58
|
parameters: {
|
|
51
59
|
type: 'object',
|
|
52
60
|
properties: {
|
|
53
|
-
|
|
61
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
54
62
|
user_id: { type: 'string', description: '用户 ID (open_id)' },
|
|
55
63
|
},
|
|
56
|
-
required: ['
|
|
64
|
+
required: ['endpoint_id', 'user_id'],
|
|
57
65
|
},
|
|
58
66
|
platforms: ['lark'],
|
|
59
67
|
tags: ['lark'],
|
|
60
68
|
execute: async (args: Record<string, any>) => {
|
|
61
|
-
const
|
|
62
|
-
if (!
|
|
63
|
-
return await
|
|
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);
|
|
64
72
|
},
|
|
65
73
|
}, plugin.name));
|
|
66
74
|
|
|
@@ -70,19 +78,19 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
70
78
|
parameters: {
|
|
71
79
|
type: 'object',
|
|
72
80
|
properties: {
|
|
73
|
-
|
|
81
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
74
82
|
name: { type: 'string', description: '群名' },
|
|
75
83
|
members: { type: 'string', description: '成员 open_id 列表,逗号分隔' },
|
|
76
84
|
owner: { type: 'string', description: '群主 open_id(可选)' },
|
|
77
85
|
},
|
|
78
|
-
required: ['
|
|
86
|
+
required: ['endpoint_id', 'name', 'members'],
|
|
79
87
|
},
|
|
80
88
|
platforms: ['lark'],
|
|
81
89
|
tags: ['lark'],
|
|
82
90
|
execute: async (args: Record<string, any>) => {
|
|
83
|
-
const
|
|
84
|
-
if (!
|
|
85
|
-
const chatId = await
|
|
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);
|
|
86
94
|
return { success: !!chatId, chat_id: chatId, message: chatId ? `群聊创建成功: ${chatId}` : '创建失败' };
|
|
87
95
|
},
|
|
88
96
|
}, plugin.name));
|
|
@@ -93,19 +101,20 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
93
101
|
parameters: {
|
|
94
102
|
type: 'object',
|
|
95
103
|
properties: {
|
|
96
|
-
|
|
104
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
97
105
|
chat_id: { type: 'string', description: '群聊 ID' },
|
|
98
106
|
name: { type: 'string', description: '新群名(可选)' },
|
|
99
107
|
description: { type: 'string', description: '新描述(可选)' },
|
|
100
108
|
},
|
|
101
|
-
required: ['
|
|
109
|
+
required: ['endpoint_id', 'chat_id'],
|
|
102
110
|
},
|
|
103
111
|
platforms: ['lark'],
|
|
104
112
|
tags: ['lark'],
|
|
113
|
+
permissions: [platformPermit('chat_admin')],
|
|
105
114
|
execute: async (args: Record<string, any>) => {
|
|
106
|
-
const
|
|
107
|
-
if (!
|
|
108
|
-
const success = await
|
|
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 });
|
|
109
118
|
return { success, message: success ? '群信息更新成功' : '更新失败' };
|
|
110
119
|
},
|
|
111
120
|
}, plugin.name));
|
|
@@ -116,18 +125,19 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
116
125
|
parameters: {
|
|
117
126
|
type: 'object',
|
|
118
127
|
properties: {
|
|
119
|
-
|
|
128
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
120
129
|
chat_id: { type: 'string', description: '群聊 ID' },
|
|
121
130
|
user_ids: { type: 'string', description: '用户 open_id 列表,逗号分隔' },
|
|
122
131
|
},
|
|
123
|
-
required: ['
|
|
132
|
+
required: ['endpoint_id', 'chat_id', 'user_ids'],
|
|
124
133
|
},
|
|
125
134
|
platforms: ['lark'],
|
|
126
135
|
tags: ['lark'],
|
|
136
|
+
permissions: [platformPermit('chat_admin')],
|
|
127
137
|
execute: async (args: Record<string, any>) => {
|
|
128
|
-
const
|
|
129
|
-
if (!
|
|
130
|
-
const success = await
|
|
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(','));
|
|
131
141
|
return { success, message: success ? '成员添加成功' : '添加失败' };
|
|
132
142
|
},
|
|
133
143
|
}, plugin.name));
|
|
@@ -138,18 +148,19 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
138
148
|
parameters: {
|
|
139
149
|
type: 'object',
|
|
140
150
|
properties: {
|
|
141
|
-
|
|
151
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
142
152
|
chat_id: { type: 'string', description: '群聊 ID' },
|
|
143
153
|
user_ids: { type: 'string', description: '用户 open_id 列表,逗号分隔' },
|
|
144
154
|
},
|
|
145
|
-
required: ['
|
|
155
|
+
required: ['endpoint_id', 'chat_id', 'user_ids'],
|
|
146
156
|
},
|
|
147
157
|
platforms: ['lark'],
|
|
148
158
|
tags: ['lark'],
|
|
159
|
+
permissions: [platformPermit('manage_managers')],
|
|
149
160
|
execute: async (args: Record<string, any>) => {
|
|
150
|
-
const
|
|
151
|
-
if (!
|
|
152
|
-
const success = await
|
|
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(','));
|
|
153
164
|
return { success, message: success ? '管理员设置成功' : '设置失败' };
|
|
154
165
|
},
|
|
155
166
|
}, plugin.name));
|
|
@@ -160,18 +171,19 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
160
171
|
parameters: {
|
|
161
172
|
type: 'object',
|
|
162
173
|
properties: {
|
|
163
|
-
|
|
174
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
164
175
|
chat_id: { type: 'string', description: '群聊 ID' },
|
|
165
176
|
user_ids: { type: 'string', description: '用户 open_id 列表,逗号分隔' },
|
|
166
177
|
},
|
|
167
|
-
required: ['
|
|
178
|
+
required: ['endpoint_id', 'chat_id', 'user_ids'],
|
|
168
179
|
},
|
|
169
180
|
platforms: ['lark'],
|
|
170
181
|
tags: ['lark'],
|
|
182
|
+
permissions: [platformPermit('manage_managers')],
|
|
171
183
|
execute: async (args: Record<string, any>) => {
|
|
172
|
-
const
|
|
173
|
-
if (!
|
|
174
|
-
const success = await
|
|
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(','));
|
|
175
187
|
return { success, message: success ? '管理员移除成功' : '移除失败' };
|
|
176
188
|
},
|
|
177
189
|
}, plugin.name));
|
|
@@ -182,17 +194,17 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
182
194
|
parameters: {
|
|
183
195
|
type: 'object',
|
|
184
196
|
properties: {
|
|
185
|
-
|
|
197
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
186
198
|
chat_id: { type: 'string', description: '群聊 ID' },
|
|
187
199
|
},
|
|
188
|
-
required: ['
|
|
200
|
+
required: ['endpoint_id', 'chat_id'],
|
|
189
201
|
},
|
|
190
202
|
platforms: ['lark'],
|
|
191
203
|
tags: ['lark'],
|
|
192
204
|
execute: async (args: Record<string, any>) => {
|
|
193
|
-
const
|
|
194
|
-
if (!
|
|
195
|
-
const success = await
|
|
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);
|
|
196
208
|
return { success, message: success ? '群聊已解散' : '解散失败' };
|
|
197
209
|
},
|
|
198
210
|
}, plugin.name));
|
|
@@ -203,11 +215,11 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
203
215
|
parameters: {
|
|
204
216
|
type: 'object',
|
|
205
217
|
properties: {
|
|
206
|
-
|
|
218
|
+
endpoint_id: { type: 'string', description: 'Endpoint 名称', contextKey: 'endpointId' },
|
|
207
219
|
file_path: { type: 'string', description: '本地文件路径' },
|
|
208
220
|
file_type: { type: 'string', description: '文件类型', enum: ['opus', 'mp4', 'pdf', 'doc', 'xls', 'ppt', 'stream'] },
|
|
209
221
|
},
|
|
210
|
-
required: ['
|
|
222
|
+
required: ['endpoint_id', 'file_path', 'file_type'],
|
|
211
223
|
},
|
|
212
224
|
platforms: ['lark'],
|
|
213
225
|
tags: ['lark'],
|
|
@@ -216,9 +228,9 @@ useContext('tool', 'lark', (toolService: ToolFeature, lark: LarkAdapter) => {
|
|
|
216
228
|
if (!validTypes.includes(args.file_type)) {
|
|
217
229
|
throw new Error(`不支持的文件类型: ${args.file_type},支持: ${validTypes.join(', ')}`);
|
|
218
230
|
}
|
|
219
|
-
const
|
|
220
|
-
if (!
|
|
221
|
-
const result = await
|
|
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);
|
|
222
234
|
return { success: true, file_key: result, message: `文件已上传,file_key: ${result}` };
|
|
223
235
|
},
|
|
224
236
|
}, plugin.name));
|