@zhin.js/adapter-dingtalk 1.0.81 → 1.1.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.
- package/CHANGELOG.md +709 -3
- package/PERMITS.md +19 -0
- package/README.md +67 -333
- package/adapters/dingtalk/index.js +33 -0
- package/adapters/dingtalk/index.ts +38 -0
- package/agents/dingtalk/agent.json +20 -0
- package/agents/dingtalk/boundaries.md +3 -0
- package/agents/dingtalk/conventions.md +3 -0
- package/agents/dingtalk/skills/dingtalk/SKILL.md +26 -0
- package/agents/dingtalk/skills/dingtalk/tools/add_chat_members/index.js +19 -0
- package/agents/dingtalk/skills/dingtalk/tools/add_chat_members/index.ts +20 -0
- package/agents/dingtalk/skills/dingtalk/tools/create_chat/index.js +20 -0
- package/agents/dingtalk/skills/dingtalk/tools/create_chat/index.ts +21 -0
- package/agents/dingtalk/skills/dingtalk/tools/dept_info/index.js +15 -0
- package/agents/dingtalk/skills/dingtalk/tools/dept_info/index.ts +15 -0
- package/agents/dingtalk/skills/dingtalk/tools/get_dept_users/index.js +16 -0
- package/agents/dingtalk/skills/dingtalk/tools/get_dept_users/index.ts +16 -0
- package/agents/dingtalk/skills/dingtalk/tools/get_user/index.js +15 -0
- package/agents/dingtalk/skills/dingtalk/tools/get_user/index.ts +15 -0
- package/agents/dingtalk/skills/dingtalk/tools/list_departments/index.js +16 -0
- package/agents/dingtalk/skills/dingtalk/tools/list_departments/index.ts +16 -0
- package/agents/dingtalk/skills/dingtalk/tools/send_work_notice/index.js +18 -0
- package/agents/dingtalk/skills/dingtalk/tools/send_work_notice/index.ts +18 -0
- package/agents/dingtalk/skills/dingtalk/tools/update_chat/index.js +29 -0
- package/agents/dingtalk/skills/dingtalk/tools/update_chat/index.ts +25 -0
- package/agents/dingtalk/system.md +3 -0
- package/commands/dingtalk/endpoint/add/[id]/index.js +3 -0
- package/commands/dingtalk/endpoint/add/[id]/index.ts +3 -0
- package/commands/dingtalk/endpoint/definition.js +19 -0
- package/commands/dingtalk/endpoint/definition.ts +19 -0
- package/commands/dingtalk/endpoint/list/index.js +3 -0
- package/commands/dingtalk/endpoint/list/index.ts +3 -0
- package/commands/dingtalk/endpoint/remove/[id]/index.js +3 -0
- package/commands/dingtalk/endpoint/remove/[id]/index.ts +3 -0
- package/lib/client.d.ts +12 -0
- package/lib/client.js +2 -0
- package/lib/dingtalk-runtime-state.d.ts +1 -0
- package/lib/dingtalk-runtime-state.js +6 -0
- package/lib/endpoint.d.ts +72 -0
- package/lib/endpoint.js +353 -0
- package/lib/index.d.ts +5 -15
- package/lib/index.js +5 -214
- package/lib/platform-permit.d.ts +14 -0
- package/lib/platform-permit.js +33 -0
- package/lib/protocol.d.ts +130 -0
- package/lib/protocol.js +264 -0
- package/lib/webhook.d.ts +13 -0
- package/lib/webhook.js +47 -0
- package/package.json +76 -19
- package/plugin.js +19 -0
- package/schema.json +97 -0
- package/src/client.ts +16 -0
- package/src/dingtalk-runtime-state.ts +7 -0
- package/src/endpoint.ts +439 -0
- package/src/index.ts +44 -228
- package/src/platform-permit.ts +48 -0
- package/src/protocol.ts +377 -0
- package/src/webhook.ts +75 -0
- package/lib/adapter.d.ts +0 -16
- package/lib/adapter.d.ts.map +0 -1
- package/lib/adapter.js +0 -37
- package/lib/adapter.js.map +0 -1
- package/lib/bot.d.ts +0 -46
- package/lib/bot.d.ts.map +0 -1
- package/lib/bot.js +0 -539
- package/lib/bot.js.map +0 -1
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/types.d.ts +0 -58
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -5
- package/lib/types.js.map +0 -1
- package/plugin.yml +0 -3
- package/skills/dingtalk/SKILL.md +0 -91
- package/src/adapter.ts +0 -44
- package/src/bot.ts +0 -590
- package/src/types.ts +0 -56
package/src/webhook.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DingTalk webhook HTTP: signature → parse → admit.
|
|
3
|
+
*/
|
|
4
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
5
|
+
import type { HttpHost, HttpRouteRegistration } from '@zhin.js/host-http';
|
|
6
|
+
import { formatCompact, getLogger } from '@zhin.js/logger';
|
|
7
|
+
import {
|
|
8
|
+
headerValue,
|
|
9
|
+
readTextBody,
|
|
10
|
+
verifySignature,
|
|
11
|
+
type DingTalkEvent,
|
|
12
|
+
type ResolvedDingTalkConfig,
|
|
13
|
+
} from './protocol.js';
|
|
14
|
+
|
|
15
|
+
const logger = getLogger('dingtalk');
|
|
16
|
+
|
|
17
|
+
export interface DingTalkWebhookHandler {
|
|
18
|
+
readonly config: ResolvedDingTalkConfig;
|
|
19
|
+
readonly isOpen: boolean;
|
|
20
|
+
admit(event: DingTalkEvent): void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function registerDingTalkWebhookRoutes(
|
|
24
|
+
http: HttpHost,
|
|
25
|
+
handler: DingTalkWebhookHandler,
|
|
26
|
+
): HttpRouteRegistration[] {
|
|
27
|
+
const path = handler.config.webhookPath;
|
|
28
|
+
return [
|
|
29
|
+
http.route('POST', path, async (request, response) => {
|
|
30
|
+
await handleDingTalkWebhookRequest(request, response, handler);
|
|
31
|
+
}, { summary: 'DingTalk robot webhook', tags: ['dingtalk'] }),
|
|
32
|
+
];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function handleDingTalkWebhookRequest(
|
|
36
|
+
request: IncomingMessage,
|
|
37
|
+
response: ServerResponse,
|
|
38
|
+
handler: DingTalkWebhookHandler,
|
|
39
|
+
): Promise<void> {
|
|
40
|
+
try {
|
|
41
|
+
// DingTalk outgoing callbacks put timestamp/sign on the URL query;
|
|
42
|
+
// headers are accepted as a fallback for legacy senders.
|
|
43
|
+
const query = new URL(request.url ?? '/', 'http://localhost').searchParams;
|
|
44
|
+
const timestamp = query.get('timestamp') || headerValue(request.headers, 'timestamp');
|
|
45
|
+
const sign = query.get('sign') || headerValue(request.headers, 'sign');
|
|
46
|
+
// Missing credentials must never be admitted: verify unconditionally.
|
|
47
|
+
if (!timestamp || !sign || !verifySignature(handler.config.appSecret, timestamp, sign)) {
|
|
48
|
+
logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'invalid signature' }));
|
|
49
|
+
response.writeHead(403, { 'Content-Type': 'application/json' });
|
|
50
|
+
response.end(JSON.stringify({ code: -1, msg: 'Forbidden' }));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const rawBody = await readTextBody(request);
|
|
55
|
+
let event: DingTalkEvent;
|
|
56
|
+
try {
|
|
57
|
+
event = JSON.parse(rawBody) as DingTalkEvent;
|
|
58
|
+
} catch {
|
|
59
|
+
response.writeHead(200, { 'Content-Type': 'application/json' });
|
|
60
|
+
response.end(JSON.stringify({ code: 0, msg: 'success' }));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (event.msgtype && handler.isOpen) {
|
|
65
|
+
handler.admit(event);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
response.writeHead(200, { 'Content-Type': 'application/json' });
|
|
69
|
+
response.end(JSON.stringify({ code: 0, msg: 'success' }));
|
|
70
|
+
} catch (error) {
|
|
71
|
+
logger.error('Webhook error:', error);
|
|
72
|
+
response.writeHead(500, { 'Content-Type': 'application/json' });
|
|
73
|
+
response.end(JSON.stringify({ code: -1, msg: 'Internal Server Error' }));
|
|
74
|
+
}
|
|
75
|
+
}
|
package/lib/adapter.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 钉钉适配器
|
|
3
|
-
*/
|
|
4
|
-
import { Adapter, Plugin } from "zhin.js";
|
|
5
|
-
import { DingTalkBot } from "./bot.js";
|
|
6
|
-
import type { DingTalkBotConfig } from "./types.js";
|
|
7
|
-
export declare class DingTalkAdapter extends Adapter<DingTalkBot> {
|
|
8
|
-
#private;
|
|
9
|
-
constructor(plugin: Plugin, router: any);
|
|
10
|
-
createBot(config: DingTalkBotConfig): DingTalkBot;
|
|
11
|
-
kickMember(botId: string, sceneId: string, userId: string): Promise<boolean>;
|
|
12
|
-
setGroupName(botId: string, sceneId: string, name: string): Promise<boolean>;
|
|
13
|
-
getGroupInfo(botId: string, sceneId: string): Promise<any>;
|
|
14
|
-
start(): Promise<void>;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=adapter.d.ts.map
|
package/lib/adapter.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,OAAO,EACP,MAAM,EACP,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,qBAAa,eAAgB,SAAQ,OAAO,CAAC,WAAW,CAAC;;gBAG3C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG;IAKvC,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW;IAI3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAMzD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAMzD,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAM3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
package/lib/adapter.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 钉钉适配器
|
|
3
|
-
*/
|
|
4
|
-
import { Adapter, } from "zhin.js";
|
|
5
|
-
import { DingTalkBot } from "./bot.js";
|
|
6
|
-
export class DingTalkAdapter extends Adapter {
|
|
7
|
-
#router;
|
|
8
|
-
constructor(plugin, router) {
|
|
9
|
-
super(plugin, "dingtalk", []);
|
|
10
|
-
this.#router = router;
|
|
11
|
-
}
|
|
12
|
-
createBot(config) {
|
|
13
|
-
return new DingTalkBot(this, this.#router, config);
|
|
14
|
-
}
|
|
15
|
-
async kickMember(botId, sceneId, userId) {
|
|
16
|
-
const bot = this.bots.get(botId);
|
|
17
|
-
if (!bot)
|
|
18
|
-
throw new Error(`Bot ${botId} 不存在`);
|
|
19
|
-
return bot.updateChat(sceneId, { del_useridlist: [userId] });
|
|
20
|
-
}
|
|
21
|
-
async setGroupName(botId, sceneId, name) {
|
|
22
|
-
const bot = this.bots.get(botId);
|
|
23
|
-
if (!bot)
|
|
24
|
-
throw new Error(`Bot ${botId} 不存在`);
|
|
25
|
-
return bot.updateChat(sceneId, { name });
|
|
26
|
-
}
|
|
27
|
-
async getGroupInfo(botId, sceneId) {
|
|
28
|
-
const bot = this.bots.get(botId);
|
|
29
|
-
if (!bot)
|
|
30
|
-
throw new Error(`Bot ${botId} 不存在`);
|
|
31
|
-
return bot.getChatInfo(sceneId);
|
|
32
|
-
}
|
|
33
|
-
async start() {
|
|
34
|
-
await super.start();
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=adapter.js.map
|
package/lib/adapter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,OAAO,GAER,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,OAAO,eAAgB,SAAQ,OAAoB;IACvD,OAAO,CAAM;IAEb,YAAY,MAAc,EAAE,MAAW;QACrC,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED,SAAS,CAAC,MAAyB;QACjC,OAAO,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,OAAe,EAAE,MAAc;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,OAAe,EAAE,IAAY;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,OAAe;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
|
package/lib/bot.d.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 钉钉 Bot 实现
|
|
3
|
-
*/
|
|
4
|
-
import { Bot, Message, SendOptions } from 'zhin.js';
|
|
5
|
-
import type { DingTalkBotConfig, DingTalkMessage } from "./types.js";
|
|
6
|
-
import type { DingTalkAdapter } from "./adapter.js";
|
|
7
|
-
export declare class DingTalkBot implements Bot<DingTalkBotConfig, DingTalkMessage> {
|
|
8
|
-
adapter: DingTalkAdapter;
|
|
9
|
-
$config: DingTalkBotConfig;
|
|
10
|
-
$connected: boolean;
|
|
11
|
-
private router;
|
|
12
|
-
private accessToken;
|
|
13
|
-
private baseURL;
|
|
14
|
-
private sessionWebhooks;
|
|
15
|
-
get $id(): string;
|
|
16
|
-
get logger(): import("zhin.js").Logger;
|
|
17
|
-
constructor(adapter: DingTalkAdapter, router: any, $config: DingTalkBotConfig);
|
|
18
|
-
private request;
|
|
19
|
-
private setupWebhookRoute;
|
|
20
|
-
private handleWebhook;
|
|
21
|
-
private verifySignature;
|
|
22
|
-
private handleEvent;
|
|
23
|
-
private ensureAccessToken;
|
|
24
|
-
private refreshAccessToken;
|
|
25
|
-
$formatMessage(msg: DingTalkMessage): Message<DingTalkMessage>;
|
|
26
|
-
private parseMessageContent;
|
|
27
|
-
$sendMessage(options: SendOptions): Promise<string>;
|
|
28
|
-
$recallMessage(id: string): Promise<void>;
|
|
29
|
-
private formatSendContent;
|
|
30
|
-
$connect(): Promise<void>;
|
|
31
|
-
$disconnect(): Promise<void>;
|
|
32
|
-
getUserInfo(userId: string): Promise<any>;
|
|
33
|
-
getDepartmentUsers(deptId: number): Promise<any[]>;
|
|
34
|
-
sendWorkNotice(userIdList: string[], content: any): Promise<boolean>;
|
|
35
|
-
getDepartmentList(deptId?: number): Promise<any[]>;
|
|
36
|
-
getDepartmentInfo(deptId: number): Promise<any>;
|
|
37
|
-
createChat(name: string, ownerUserId: string, userIdList: string[]): Promise<string | null>;
|
|
38
|
-
getChatInfo(chatId: string): Promise<any>;
|
|
39
|
-
updateChat(chatId: string, options: {
|
|
40
|
-
name?: string;
|
|
41
|
-
owner?: string;
|
|
42
|
-
add_useridlist?: string[];
|
|
43
|
-
del_useridlist?: string[];
|
|
44
|
-
}): Promise<boolean>;
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=bot.d.ts.map
|
package/lib/bot.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAiB,GAAG,EAAE,OAAO,EAAwC,WAAW,EAAE,MAAM,SAAS,CAAC;AAGzG,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,qBAAa,WAAY,YAAW,GAAG,CAAC,iBAAiB,EAAE,eAAe,CAAC;IAgBhE,OAAO,EAAE,eAAe;IAExB,OAAO,EAAE,iBAAiB;IAjBnC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAkC;IAEzD,IAAI,GAAG,WAEN;IAED,IAAI,MAAM,6BAET;gBAGQ,OAAO,EAAE,eAAe,EAC/B,MAAM,EAAE,GAAG,EACJ,OAAO,EAAE,iBAAiB;YASrB,OAAO;IA4BrB,OAAO,CAAC,iBAAiB;YAMX,aAAa;IA0B3B,OAAO,CAAC,eAAe;YAaT,WAAW;YAeX,iBAAiB;YAajB,kBAAkB;IA2BhC,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAiC9D,OAAO,CAAC,mBAAmB;IAoGrB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAwCnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,OAAO,CAAC,iBAAiB;IA8EnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAczC,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAclD,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBpE,iBAAiB,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAcrD,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAc/C,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBnB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAczC,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC,OAAO,CAAC;CAgBpB"}
|