@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.
Files changed (77) hide show
  1. package/CHANGELOG.md +709 -3
  2. package/PERMITS.md +19 -0
  3. package/README.md +67 -333
  4. package/adapters/dingtalk/index.js +33 -0
  5. package/adapters/dingtalk/index.ts +38 -0
  6. package/agents/dingtalk/agent.json +20 -0
  7. package/agents/dingtalk/boundaries.md +3 -0
  8. package/agents/dingtalk/conventions.md +3 -0
  9. package/agents/dingtalk/skills/dingtalk/SKILL.md +26 -0
  10. package/agents/dingtalk/skills/dingtalk/tools/add_chat_members/index.js +19 -0
  11. package/agents/dingtalk/skills/dingtalk/tools/add_chat_members/index.ts +20 -0
  12. package/agents/dingtalk/skills/dingtalk/tools/create_chat/index.js +20 -0
  13. package/agents/dingtalk/skills/dingtalk/tools/create_chat/index.ts +21 -0
  14. package/agents/dingtalk/skills/dingtalk/tools/dept_info/index.js +15 -0
  15. package/agents/dingtalk/skills/dingtalk/tools/dept_info/index.ts +15 -0
  16. package/agents/dingtalk/skills/dingtalk/tools/get_dept_users/index.js +16 -0
  17. package/agents/dingtalk/skills/dingtalk/tools/get_dept_users/index.ts +16 -0
  18. package/agents/dingtalk/skills/dingtalk/tools/get_user/index.js +15 -0
  19. package/agents/dingtalk/skills/dingtalk/tools/get_user/index.ts +15 -0
  20. package/agents/dingtalk/skills/dingtalk/tools/list_departments/index.js +16 -0
  21. package/agents/dingtalk/skills/dingtalk/tools/list_departments/index.ts +16 -0
  22. package/agents/dingtalk/skills/dingtalk/tools/send_work_notice/index.js +18 -0
  23. package/agents/dingtalk/skills/dingtalk/tools/send_work_notice/index.ts +18 -0
  24. package/agents/dingtalk/skills/dingtalk/tools/update_chat/index.js +29 -0
  25. package/agents/dingtalk/skills/dingtalk/tools/update_chat/index.ts +25 -0
  26. package/agents/dingtalk/system.md +3 -0
  27. package/commands/dingtalk/endpoint/add/[id]/index.js +3 -0
  28. package/commands/dingtalk/endpoint/add/[id]/index.ts +3 -0
  29. package/commands/dingtalk/endpoint/definition.js +19 -0
  30. package/commands/dingtalk/endpoint/definition.ts +19 -0
  31. package/commands/dingtalk/endpoint/list/index.js +3 -0
  32. package/commands/dingtalk/endpoint/list/index.ts +3 -0
  33. package/commands/dingtalk/endpoint/remove/[id]/index.js +3 -0
  34. package/commands/dingtalk/endpoint/remove/[id]/index.ts +3 -0
  35. package/lib/client.d.ts +12 -0
  36. package/lib/client.js +2 -0
  37. package/lib/dingtalk-runtime-state.d.ts +1 -0
  38. package/lib/dingtalk-runtime-state.js +6 -0
  39. package/lib/endpoint.d.ts +72 -0
  40. package/lib/endpoint.js +353 -0
  41. package/lib/index.d.ts +5 -15
  42. package/lib/index.js +5 -214
  43. package/lib/platform-permit.d.ts +14 -0
  44. package/lib/platform-permit.js +33 -0
  45. package/lib/protocol.d.ts +130 -0
  46. package/lib/protocol.js +264 -0
  47. package/lib/webhook.d.ts +13 -0
  48. package/lib/webhook.js +47 -0
  49. package/package.json +76 -19
  50. package/plugin.js +19 -0
  51. package/schema.json +97 -0
  52. package/src/client.ts +16 -0
  53. package/src/dingtalk-runtime-state.ts +7 -0
  54. package/src/endpoint.ts +439 -0
  55. package/src/index.ts +44 -228
  56. package/src/platform-permit.ts +48 -0
  57. package/src/protocol.ts +377 -0
  58. package/src/webhook.ts +75 -0
  59. package/lib/adapter.d.ts +0 -16
  60. package/lib/adapter.d.ts.map +0 -1
  61. package/lib/adapter.js +0 -37
  62. package/lib/adapter.js.map +0 -1
  63. package/lib/bot.d.ts +0 -46
  64. package/lib/bot.d.ts.map +0 -1
  65. package/lib/bot.js +0 -539
  66. package/lib/bot.js.map +0 -1
  67. package/lib/index.d.ts.map +0 -1
  68. package/lib/index.js.map +0 -1
  69. package/lib/types.d.ts +0 -58
  70. package/lib/types.d.ts.map +0 -1
  71. package/lib/types.js +0 -5
  72. package/lib/types.js.map +0 -1
  73. package/plugin.yml +0 -3
  74. package/skills/dingtalk/SKILL.md +0 -91
  75. package/src/adapter.ts +0 -44
  76. package/src/bot.ts +0 -590
  77. package/src/types.ts +0 -56
@@ -0,0 +1,15 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ dept_id: string }>({
4
+ description: '获取钉钉部门详细信息',
5
+ inputSchema: z.object({
6
+ dept_id: z.string().describe('部门 ID'),
7
+ }),
8
+ adapter: 'dingtalk',
9
+ tags: ['dingtalk'],
10
+ async execute({ dept_id }: { dept_id: string }, context) {
11
+ const endpoint = context.$client;
12
+ return await endpoint.getDepartmentInfo(Number(dept_id));
13
+ },
14
+ });
15
+
@@ -0,0 +1,16 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '获取钉钉部门用户列表',
6
+ inputSchema: z.object({
7
+ dept_id: z.string().describe('部门 ID'),
8
+ }),
9
+ adapter: 'dingtalk',
10
+ tags: ['dingtalk'],
11
+ async execute({ dept_id }, context) {
12
+ const endpoint = context.$client;
13
+ const users = await endpoint.getDepartmentUsers(Number(dept_id));
14
+ return { users, count: users.length };
15
+ },
16
+ });
@@ -0,0 +1,16 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ dept_id: string }>({
4
+ description: '获取钉钉部门用户列表',
5
+ inputSchema: z.object({
6
+ dept_id: z.string().describe('部门 ID'),
7
+ }),
8
+ adapter: 'dingtalk',
9
+ tags: ['dingtalk'],
10
+ async execute({ dept_id }: { dept_id: string }, context) {
11
+ const endpoint = context.$client;
12
+ const users = await endpoint.getDepartmentUsers(Number(dept_id));
13
+ return { users, count: users.length };
14
+ },
15
+ });
16
+
@@ -0,0 +1,15 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '获取钉钉用户信息',
6
+ inputSchema: z.object({
7
+ user_id: z.string().describe('用户 ID'),
8
+ }),
9
+ adapter: 'dingtalk',
10
+ tags: ['dingtalk'],
11
+ async execute({ user_id }, context) {
12
+ const endpoint = context.$client;
13
+ return await endpoint.getUserInfo(user_id);
14
+ },
15
+ });
@@ -0,0 +1,15 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ user_id: string }>({
4
+ description: '获取钉钉用户信息',
5
+ inputSchema: z.object({
6
+ user_id: z.string().describe('用户 ID'),
7
+ }),
8
+ adapter: 'dingtalk',
9
+ tags: ['dingtalk'],
10
+ async execute({ user_id }: { user_id: string }, context) {
11
+ const endpoint = context.$client;
12
+ return await endpoint.getUserInfo(user_id);
13
+ },
14
+ });
15
+
@@ -0,0 +1,16 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '获取钉钉部门列表',
6
+ inputSchema: z.object({
7
+ dept_id: z.string().optional().describe('父部门 ID,默认 1(根部门)'),
8
+ }),
9
+ adapter: 'dingtalk',
10
+ tags: ['dingtalk'],
11
+ async execute({ dept_id }, context) {
12
+ const endpoint = context.$client;
13
+ const departments = await endpoint.getDepartmentList(Number(dept_id || '1'));
14
+ return { departments, count: departments.length };
15
+ },
16
+ });
@@ -0,0 +1,16 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ dept_id?: string }>({
4
+ description: '获取钉钉部门列表',
5
+ inputSchema: z.object({
6
+ dept_id: z.string().optional().describe('父部门 ID,默认 1(根部门)'),
7
+ }),
8
+ adapter: 'dingtalk',
9
+ tags: ['dingtalk'],
10
+ async execute({ dept_id }: { dept_id?: string }, context) {
11
+ const endpoint = context.$client;
12
+ const departments = await endpoint.getDepartmentList(Number(dept_id || '1'));
13
+ return { departments, count: departments.length };
14
+ },
15
+ });
16
+
@@ -0,0 +1,18 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '向指定用户发送钉钉工作通知',
6
+ inputSchema: z.object({
7
+ user_ids: z.string().describe('用户 ID 列表,逗号分隔'),
8
+ content: z.string().describe('通知内容'),
9
+ }),
10
+ adapter: 'dingtalk',
11
+ tags: ['dingtalk'],
12
+ async execute({ user_ids, content }, context) {
13
+ const endpoint = context.$client;
14
+ const msgContent = { msgtype: 'text', text: { content } };
15
+ const success = await endpoint.sendWorkNotice(user_ids.split(','), msgContent);
16
+ return { success, message: success ? '工作通知已发送' : '发送失败' };
17
+ },
18
+ });
@@ -0,0 +1,18 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ user_ids: string; content: string }>({
4
+ description: '向指定用户发送钉钉工作通知',
5
+ inputSchema: z.object({
6
+ user_ids: z.string().describe('用户 ID 列表,逗号分隔'),
7
+ content: z.string().describe('通知内容'),
8
+ }),
9
+ adapter: 'dingtalk',
10
+ tags: ['dingtalk'],
11
+ async execute({ user_ids, content }: { user_ids: string; content: string }, context) {
12
+ const endpoint = context.$client;
13
+ const msgContent = { msgtype: 'text', text: { content } };
14
+ const success = await endpoint.sendWorkNotice(user_ids.split(','), msgContent);
15
+ return { success, message: success ? '工作通知已发送' : '发送失败' };
16
+ },
17
+ });
18
+
@@ -0,0 +1,29 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { defineAgentTool } from '@zhin.js/tool';
3
+ import { z } from 'zod';
4
+ export default defineAgentTool({
5
+ description: '更新钉钉群聊设置(改名、换群主、增减成员)',
6
+ inputSchema: z.object({
7
+ chat_id: z.string().describe('群聊 ID'),
8
+ name: z.string().optional().describe('新群名(可选)'),
9
+ owner: z.string().optional().describe('新群主 userId(可选)'),
10
+ add_members: z.string().optional().describe('要添加的成员 userId,逗号分隔(可选)'),
11
+ remove_members: z.string().optional().describe('要移除的成员 userId,逗号分隔(可选)'),
12
+ }),
13
+ adapter: 'dingtalk',
14
+ tags: ['dingtalk'],
15
+ async execute({ chat_id, name, owner, add_members, remove_members }, context) {
16
+ const endpoint = context.$client;
17
+ const options = {};
18
+ if (name)
19
+ options.name = name;
20
+ if (owner)
21
+ options.owner = owner;
22
+ if (add_members)
23
+ options.add_useridlist = add_members.split(',').map((s) => s.trim());
24
+ if (remove_members)
25
+ options.del_useridlist = remove_members.split(',').map((s) => s.trim());
26
+ await endpoint.updateChat(chat_id, options);
27
+ return { success: true, message: '群聊设置已更新' };
28
+ },
29
+ });
@@ -0,0 +1,25 @@
1
+ import { defineAgentTool } from '@zhin.js/tool';
2
+ import { z } from 'zod';
3
+ export default defineAgentTool<{ chat_id: string; name?: string; owner?: string; add_members?: string; remove_members?: string }>({
4
+ description: '更新钉钉群聊设置(改名、换群主、增减成员)',
5
+ inputSchema: z.object({
6
+ chat_id: z.string().describe('群聊 ID'),
7
+ name: z.string().optional().describe('新群名(可选)'),
8
+ owner: z.string().optional().describe('新群主 userId(可选)'),
9
+ add_members: z.string().optional().describe('要添加的成员 userId,逗号分隔(可选)'),
10
+ remove_members: z.string().optional().describe('要移除的成员 userId,逗号分隔(可选)'),
11
+ }),
12
+ adapter: 'dingtalk',
13
+ tags: ['dingtalk'],
14
+ async execute({ chat_id, name, owner, add_members, remove_members }: { chat_id: string; name?: string; owner?: string; add_members?: string; remove_members?: string }, context) {
15
+ const endpoint = context.$client;
16
+ const options: Record<string, unknown> = {};
17
+ if (name) options.name = name;
18
+ if (owner) options.owner = owner;
19
+ if (add_members) options.add_useridlist = add_members.split(',').map((s: string) => s.trim());
20
+ if (remove_members) options.del_useridlist = remove_members.split(',').map((s: string) => s.trim());
21
+ await endpoint.updateChat(chat_id, options);
22
+ return { success: true, message: '群聊设置已更新' };
23
+ },
24
+ });
25
+
@@ -0,0 +1,3 @@
1
+ # DINGTALK Platform Agent
2
+
3
+ You are the dingtalk platform specialist. Interpret requests in the current dingtalk conversation and load only the narrowest private Skill needed for the task.
@@ -0,0 +1,3 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { dingtalkEndpointCommands } from '../../definition.js';
3
+ export default dingtalkEndpointCommands.add;
@@ -0,0 +1,3 @@
1
+ import { dingtalkEndpointCommands } from '../../definition.js';
2
+
3
+ export default dingtalkEndpointCommands.add;
@@ -0,0 +1,19 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ /**
3
+ * `dingtalk endpoint` 命令族:由 @zhin.js/adapter 的 createEndpointCommands 套件生成。
4
+ * commands/dingtalk/endpoint/ 下的 list / add / remove 直接默认导出这三项。
5
+ */
6
+ import { createEndpointCommands } from 'zhin.js/adapter';
7
+ import { defineCommand } from 'zhin.js/command';
8
+ import { dingtalkRuntimeStateToken } from "../../../lib/dingtalk-runtime-state.js";
9
+ export const dingtalkEndpointCommands = createEndpointCommands({
10
+ adapterKey: 'dingtalk',
11
+ adapterDisplayName: 'DingTalk',
12
+ fields: [
13
+ { key: 'appKey', required: true, env: true, description: '钉钉 AppKey' },
14
+ { key: 'appSecret', required: true, env: true, description: '钉钉 AppSecret' },
15
+ { key: 'robotCode', required: true, env: true, description: '机器人 Code(出站 senderStaffId)' },
16
+ ],
17
+ running: (use) => use(dingtalkRuntimeStateToken).endpoints.values(),
18
+ describeEntry: (entry) => `appKey: ${String(entry.appKey)}`,
19
+ }, defineCommand);
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `dingtalk endpoint` 命令族:由 @zhin.js/adapter 的 createEndpointCommands 套件生成。
3
+ * commands/dingtalk/endpoint/ 下的 list / add / remove 直接默认导出这三项。
4
+ */
5
+ import { createEndpointCommands } from 'zhin.js/adapter';
6
+ import { defineCommand } from 'zhin.js/command';
7
+ import { dingtalkRuntimeStateToken } from '../../../src/dingtalk-runtime-state.js';
8
+
9
+ export const dingtalkEndpointCommands = createEndpointCommands({
10
+ adapterKey: 'dingtalk',
11
+ adapterDisplayName: 'DingTalk',
12
+ fields: [
13
+ { key: 'appKey', required: true, env: true, description: '钉钉 AppKey' },
14
+ { key: 'appSecret', required: true, env: true, description: '钉钉 AppSecret' },
15
+ { key: 'robotCode', required: true, env: true, description: '机器人 Code(出站 senderStaffId)' },
16
+ ],
17
+ running: (use) => use(dingtalkRuntimeStateToken).endpoints.values(),
18
+ describeEntry: (entry) => `appKey: ${String(entry.appKey)}`,
19
+ }, defineCommand);
@@ -0,0 +1,3 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { dingtalkEndpointCommands } from '../definition.js';
3
+ export default dingtalkEndpointCommands.list;
@@ -0,0 +1,3 @@
1
+ import { dingtalkEndpointCommands } from '../definition.js';
2
+
3
+ export default dingtalkEndpointCommands.list;
@@ -0,0 +1,3 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { dingtalkEndpointCommands } from '../../definition.js';
3
+ export default dingtalkEndpointCommands.remove;
@@ -0,0 +1,3 @@
1
+ import { dingtalkEndpointCommands } from '../../definition.js';
2
+
3
+ export default dingtalkEndpointCommands.remove;
@@ -0,0 +1,12 @@
1
+ import type { DingTalkClient } from './endpoint.js';
2
+ import type { DingTalkEvent } from './protocol.js';
3
+ export type DingtalkClientEventMap = Record<string, DingTalkEvent>;
4
+ declare module '@zhin.js/feature-kit' {
5
+ interface AdapterClientRegistry {
6
+ readonly dingtalk: {
7
+ readonly client: DingTalkClient;
8
+ readonly events: DingtalkClientEventMap;
9
+ };
10
+ }
11
+ }
12
+ export declare const dingtalkClient: import("@zhin.js/adapter").EndpointClientToken<DingTalkClient, DingtalkClientEventMap>;
package/lib/client.js ADDED
@@ -0,0 +1,2 @@
1
+ import { defineEndpointClient } from 'zhin.js/adapter';
2
+ export const dingtalkClient = defineEndpointClient('dingtalk');
@@ -0,0 +1 @@
1
+ export declare const dingtalkRuntimeStateToken: import("zhin.js").Token<import("@zhin.js/adapter").EndpointRuntimeState>;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * DingTalk 插件实例的运行时状态:adapter create() 注册的 endpoint 列表。
3
+ * 由 plugin.ts setup() provide,adapter create 与 `dingtalk endpoint` 命令共享(同一 owner generation)。
4
+ */
5
+ import { defineEndpointRuntimeStateToken } from 'zhin.js/adapter';
6
+ export const dingtalkRuntimeStateToken = defineEndpointRuntimeStateToken('dingtalk');
@@ -0,0 +1,72 @@
1
+ import { Endpoint } from 'zhin.js/adapter';
2
+ /**
3
+ * DingTalkEndpoint — lifecycle, outbound, admit, OpenAPI helpers for agent tools.
4
+ */
5
+ import { type EndpointSendRequest } from 'zhin.js/adapter';
6
+ import type { HttpHost } from '@zhin.js/host-http';
7
+ import type { CapabilityId } from 'zhin.js';
8
+ import { type DingTalkEvent, type DingTalkMessage, type ResolvedDingTalkConfig } from './protocol.js';
9
+ export type DingTalkFetch = (url: string, init?: {
10
+ readonly method?: string;
11
+ readonly headers?: Record<string, string>;
12
+ readonly body?: string;
13
+ }) => Promise<{
14
+ readonly ok: boolean;
15
+ readonly status: number;
16
+ text(): Promise<string>;
17
+ json(): Promise<unknown>;
18
+ }>;
19
+ export interface DingTalkEndpointOptions {
20
+ readonly id: CapabilityId;
21
+ readonly http: HttpHost;
22
+ readonly config: ResolvedDingTalkConfig;
23
+ readonly fetch?: DingTalkFetch;
24
+ }
25
+ export interface DingTalkClientApi {
26
+ getUserInfo(userId: string): Promise<unknown>;
27
+ getDepartmentUsers(deptId: number): Promise<unknown[]>;
28
+ sendWorkNotice(userIdList: string[], content: unknown): Promise<boolean>;
29
+ getDepartmentList(deptId?: number): Promise<unknown[]>;
30
+ getDepartmentInfo(deptId: number): Promise<unknown>;
31
+ createChat(name: string, ownerUserId: string, userIdList: string[]): Promise<string | null>;
32
+ getChatInfo(chatId: string): Promise<unknown>;
33
+ updateChat(chatId: string, options: {
34
+ name?: string;
35
+ owner?: string;
36
+ add_useridlist?: string[];
37
+ del_useridlist?: string[];
38
+ }): Promise<boolean>;
39
+ }
40
+ /** SDK-like DingTalk OpenAPI surface available on every Endpoint event. */
41
+ export declare class DingTalkClient implements DingTalkClientApi {
42
+ readonly api: DingTalkClientApi;
43
+ constructor(api: DingTalkClientApi);
44
+ getUserInfo: (userId: string) => Promise<unknown>;
45
+ getDepartmentUsers: (deptId: number) => Promise<unknown[]>;
46
+ sendWorkNotice: (userIds: string[], content: unknown) => Promise<boolean>;
47
+ getDepartmentList: (deptId?: number) => Promise<unknown[]>;
48
+ getDepartmentInfo: (deptId: number) => Promise<unknown>;
49
+ createChat: (name: string, owner: string, users: string[]) => Promise<string | null>;
50
+ getChatInfo: (chatId: string) => Promise<unknown>;
51
+ updateChat: (chatId: string, options: Parameters<DingTalkClientApi["updateChat"]>[1]) => Promise<boolean>;
52
+ }
53
+ /**
54
+ * 钉钉机器人(webhook/stream 模式)无常规群列表 API——机器人不持有
55
+ * 「我所在的群」枚举面,仅能收发消息;
56
+ * 因此本 endpoint 不暴露 EndpointManagement(Console 社交面 RPC 对该平台保持未接线)。
57
+ */
58
+ export declare class DingTalkEndpoint extends Endpoint<DingTalkClient> {
59
+ #private;
60
+ readonly client: DingTalkClient;
61
+ constructor(options: DingTalkEndpointOptions);
62
+ /** Used by webhook handler. */
63
+ get isOpen(): boolean;
64
+ get config(): ResolvedDingTalkConfig;
65
+ start(): Promise<void>;
66
+ open(): void;
67
+ close(): void;
68
+ stop(): Promise<void>;
69
+ send({ conversation, payload }: EndpointSendRequest): Promise<string>;
70
+ /** Test / internal: admit a parsed event when open (non-webhook path). */
71
+ admit(event: DingTalkEvent | DingTalkMessage): void;
72
+ }