@zhin.js/adapter-dingtalk 5.0.0 → 5.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,58 @@
1
1
  # @zhin.js/adapter-dingtalk
2
2
 
3
+ ## 5.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - d5cd4aa: Publish Plugin Runtime entry points and convention modules as JavaScript so
8
+ installed npm plugins load on Node without TypeScript stripping. Workspace
9
+ development continues to prefer TypeScript sources for local HMR.
10
+
11
+ Remove the unconsumed legacy game hub APIs from game-kit; game navigation and
12
+ records now use ordinary convention commands owned by the game hub plugin.
13
+
14
+ - Updated dependencies [d5cd4aa]
15
+ - @zhin.js/command@1.0.4
16
+ - zhin.js@5.0.2
17
+ - @zhin.js/adapter@1.1.2
18
+ - @zhin.js/core@1.4.2
19
+ - @zhin.js/agent@1.0.7
20
+
21
+ ## 5.0.1
22
+
23
+ ### Patch Changes
24
+
25
+ - cdf64e7: 多方向审计修复批(8 面 30+ bug):
26
+
27
+ - **安全**:钉钉 webhook 验签绕过修复(缺 timestamp/sign 一律 403 + ±1h 防重放);exec-policy fail-closed(换行/`$(`/反引号拒绝、管道逐段过白名单、env dump 复合拆段);wecom 验签改 timingSafeEqual;config:set 拒绝 `__proto__` 等魔术键、host 键优先防覆写。
28
+ - **P0 功能**:`zhin packages` scoped 包名解析为空导致 rm -rf 风险;命令数字参数解析失败炸断消息链路(dispatch 捕获 continue);TaskQueue 监听器首个事件自摘除导致 assistant 队列挂死(+超时后完成不覆盖终态);DatabaseHost 跨世代共享崩溃(define 幂等 + stop 改进程级);rss 按不存在 id 列删除改业务键。
29
+ - **Runtime/HMR**:native watcher 过滤忽略目录(lib/.zhin 不再触发重载风暴);host 段配置 patch(http.port 等)存在 installResources 时全量重建;capability 目录非 entry 支持文件升级进程重启;documentTransaction 失败回滚。
30
+ - **CLI 写侧**:config/setup 对 toml 静默假成功改统一 config-file(不支持格式报错);doctor/onboard 默认配置改新形态 plugins 映射;schedule add 改 --prompt;migrate engines/中文模板误伤/覆盖前备份。
31
+ - **适配器生命周期**:napcat/milky start 失败竞态与僵尸连接、心跳 close 清理、stop-during-connect settle;slack webhook 二次 writeHead + messageChannelMap LRU。
32
+ - **Host/向导**:logs/stats 与 inbox 查询改 DB 侧 count/orderBy/limit 下推;save-yaml 写入前校验;zhipu/moonshot baseUrl 必填预填;.env 写入转义 + 幂等合并;setup 数据库密码不再明文落 config;60s fetch 超时与 JSON 守卫。
33
+
34
+ - 74b035c: endpoint 管理命令扩展至 18/20 适配器:kook / discord / github(private_key 支持内联文件路径)/ icqq(bindFlow 登记式 add + `icqq login` 引导)/ dingtalk / lark / line / satori / wechat-mp / wecom / weixin-ilink 接入 `endpoint list/add/remove`(字段对齐各自 schema,凭据写 `.env`)。email(smtp/imap 嵌套对象)与 sandbox(无凭据)暂不接。
35
+ - Updated dependencies [cdf64e7]
36
+ - Updated dependencies [2d0a159]
37
+ - Updated dependencies [5691aba]
38
+ - Updated dependencies [078e3f7]
39
+ - Updated dependencies [50497a5]
40
+ - Updated dependencies [9c997b2]
41
+ - Updated dependencies [09d4f25]
42
+ - Updated dependencies [43485a9]
43
+ - Updated dependencies [f0ec5ab]
44
+ - Updated dependencies [3e925d0]
45
+ - Updated dependencies [fa66c4c]
46
+ - Updated dependencies [fa66c4c]
47
+ - Updated dependencies [6cb6152]
48
+ - @zhin.js/command@1.0.3
49
+ - @zhin.js/agent@1.0.6
50
+ - @zhin.js/plugin-runtime@1.1.1
51
+ - @zhin.js/host-http@1.0.3
52
+ - zhin.js@5.0.1
53
+ - @zhin.js/adapter@1.1.1
54
+ - @zhin.js/core@1.4.1
55
+
3
56
  ## 5.0.0
4
57
 
5
58
  ### Patch Changes
@@ -0,0 +1,33 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ /**
3
+ * Convention entry: discover `adapters/dingtalk.ts` → defineAdapter.
4
+ */
5
+ import { defineAdapter } from '@zhin.js/adapter';
6
+ import { messageGatewayToken } from '@zhin.js/core/runtime';
7
+ import { httpHostToken } from '@zhin.js/host-http';
8
+ import { DingTalkEndpoint } from "../lib/endpoint.js";
9
+ import { resolveDingTalkConfig, } from "../lib/protocol.js";
10
+ import { dingtalkRuntimeStateToken } from "../lib/dingtalk-runtime-state.js";
11
+ export { DingTalkEndpoint } from "../lib/endpoint.js";
12
+ export default defineAdapter({
13
+ capabilities: ['inbound', 'outbound'],
14
+ // 钉钉机器人媒体消息仅消费远程 URL;无按钮交互面,交互段降级纯文本。
15
+ segments: {
16
+ outboundMedia: ['url'],
17
+ interactive: 'text',
18
+ },
19
+ create(context) {
20
+ const config = resolveDingTalkConfig(context.config);
21
+ // 注册到插件运行时状态(dingtalk endpoint list 的"运行中"数据源)
22
+ context.use(dingtalkRuntimeStateToken).endpoints.set(config.name, {
23
+ name: config.name,
24
+ mode: 'webhook',
25
+ });
26
+ return new DingTalkEndpoint({
27
+ id: context.id,
28
+ gateway: context.use(messageGatewayToken),
29
+ http: context.use(httpHostToken),
30
+ config,
31
+ });
32
+ },
33
+ });
@@ -9,18 +9,30 @@ import {
9
9
  resolveDingTalkConfig,
10
10
  type DingTalkAdapterConfig,
11
11
  } from '../src/protocol.js';
12
+ import { dingtalkRuntimeStateToken } from '../src/dingtalk-runtime-state.js';
12
13
 
13
14
  export { DingTalkEndpoint } from '../src/endpoint.js';
14
15
  export type { DingTalkEndpointOptions, DingTalkFetch } from '../src/endpoint.js';
15
16
 
16
17
  export default defineAdapter<DingTalkAdapterConfig>({
17
18
  capabilities: ['inbound', 'outbound'],
19
+ // 钉钉机器人媒体消息仅消费远程 URL;无按钮交互面,交互段降级纯文本。
20
+ segments: {
21
+ outboundMedia: ['url'],
22
+ interactive: 'text',
23
+ },
18
24
  create(context) {
25
+ const config = resolveDingTalkConfig(context.config);
26
+ // 注册到插件运行时状态(dingtalk endpoint list 的"运行中"数据源)
27
+ context.use(dingtalkRuntimeStateToken).endpoints.set(config.name, {
28
+ name: config.name,
29
+ mode: 'webhook',
30
+ });
19
31
  return new DingTalkEndpoint({
20
32
  id: context.id,
21
33
  gateway: context.use(messageGatewayToken),
22
34
  http: context.use(httpHostToken),
23
- config: resolveDingTalkConfig(context.config),
35
+ config,
24
36
  });
25
37
  },
26
38
  });
@@ -0,0 +1,3 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { dingtalkEndpointCommands } from "../../../lib/dingtalk-endpoint-commands.js";
3
+ export default dingtalkEndpointCommands.add;
@@ -0,0 +1,3 @@
1
+ import { dingtalkEndpointCommands } from '../../../src/dingtalk-endpoint-commands.js';
2
+
3
+ export default dingtalkEndpointCommands.add;
@@ -0,0 +1,3 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { dingtalkEndpointCommands } from "../../lib/dingtalk-endpoint-commands.js";
3
+ export default dingtalkEndpointCommands.list;
@@ -0,0 +1,3 @@
1
+ import { dingtalkEndpointCommands } from '../../src/dingtalk-endpoint-commands.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 "../../../lib/dingtalk-endpoint-commands.js";
3
+ export default dingtalkEndpointCommands.remove;
@@ -0,0 +1,3 @@
1
+ import { dingtalkEndpointCommands } from '../../../src/dingtalk-endpoint-commands.js';
2
+
3
+ export default dingtalkEndpointCommands.remove;
@@ -0,0 +1 @@
1
+ export declare const dingtalkEndpointCommands: import("@zhin.js/adapter").EndpointCommands<Readonly<import("@zhin.js/command").CommandDefinition<unknown, unknown, import("@zhin.js/command").CommandMessage>>>;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `dingtalk endpoint` 命令族:由 @zhin.js/adapter 的 createEndpointCommands 套件生成。
3
+ * commands/endpoint/ 下的 list / add / remove 直接默认导出这三项。
4
+ */
5
+ import { createEndpointCommands } from '@zhin.js/adapter';
6
+ import { defineCommand } from '@zhin.js/command';
7
+ import { dingtalkRuntimeStateToken } from './dingtalk-runtime-state.js';
8
+ export const dingtalkEndpointCommands = createEndpointCommands({
9
+ adapterKey: 'dingtalk',
10
+ adapterDisplayName: 'DingTalk',
11
+ fields: [
12
+ { key: 'appKey', required: true, env: true, description: '钉钉 AppKey' },
13
+ { key: 'appSecret', required: true, env: true, description: '钉钉 AppSecret' },
14
+ { key: 'robotCode', required: true, env: true, description: '机器人 Code(出站 senderStaffId)' },
15
+ ],
16
+ running: (use) => use(dingtalkRuntimeStateToken).endpoints.values(),
17
+ describeEntry: (entry) => `appKey: ${String(entry.appKey)}`,
18
+ }, defineCommand);
@@ -0,0 +1 @@
1
+ export declare const dingtalkRuntimeStateToken: import("@zhin.js/plugin-runtime").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');
package/lib/endpoint.d.ts CHANGED
@@ -23,6 +23,11 @@ export interface DingTalkEndpointOptions {
23
23
  readonly config: ResolvedDingTalkConfig;
24
24
  readonly fetch?: DingTalkFetch;
25
25
  }
26
+ /**
27
+ * 钉钉机器人(webhook/stream 模式)无常规群列表 API——机器人不持有
28
+ * 「我所在的群」枚举面,仅能收发消息;
29
+ * 因此本 endpoint 不暴露 EndpointManagement(Console 社交面 RPC 对该平台保持未接线)。
30
+ */
26
31
  export declare class DingTalkEndpoint implements EndpointInstance {
27
32
  #private;
28
33
  constructor(options: DingTalkEndpointOptions);
package/lib/endpoint.js CHANGED
@@ -4,6 +4,11 @@ import { normalizeDingtalkSenderForPermit } from './platform-permit.js';
4
4
  import { formatInboundContent, formatOutboundBody, generateMessageId, isDingtalkBotMentioned, resolveChatType, resolveSender, resolveTarget, } from './protocol.js';
5
5
  import { registerDingTalkWebhookRoutes } from './webhook.js';
6
6
  const logger = getLogger('dingtalk');
7
+ /**
8
+ * 钉钉机器人(webhook/stream 模式)无常规群列表 API——机器人不持有
9
+ * 「我所在的群」枚举面,仅能收发消息;
10
+ * 因此本 endpoint 不暴露 EndpointManagement(Console 社交面 RPC 对该平台保持未接线)。
11
+ */
7
12
  export class DingTalkEndpoint {
8
13
  #options;
9
14
  #fetch;
package/lib/protocol.d.ts CHANGED
@@ -109,6 +109,8 @@ export declare function resolveSender(msg: DingTalkMessage): string;
109
109
  export declare function generateMessageId(msg: DingTalkMessage): string;
110
110
  /** Build inbound text for MessageGateway.receive. */
111
111
  export declare function formatInboundContent(msg: DingTalkMessage): string;
112
+ /** DingTalk timestamps are epoch milliseconds; reject replays outside ±1 hour. */
113
+ export declare const MAX_TIMESTAMP_DRIFT_MS: number;
112
114
  export declare function verifySignature(appSecret: string, timestamp: string, sign: string): boolean;
113
115
  /**
114
116
  * Wire-encode an already-rendered outbound payload into DingTalk robot body.
package/lib/protocol.js CHANGED
@@ -93,8 +93,14 @@ export function formatInboundContent(msg) {
93
93
  return `[${msg.msgtype}]`;
94
94
  }
95
95
  }
96
+ /** DingTalk timestamps are epoch milliseconds; reject replays outside ±1 hour. */
97
+ export const MAX_TIMESTAMP_DRIFT_MS = 60 * 60 * 1000;
96
98
  export function verifySignature(appSecret, timestamp, sign) {
97
99
  try {
100
+ const ts = Number(timestamp);
101
+ if (!Number.isFinite(ts) || Math.abs(Date.now() - ts) > MAX_TIMESTAMP_DRIFT_MS) {
102
+ return false;
103
+ }
98
104
  const stringToSign = `${timestamp}\n${appSecret}`;
99
105
  const hmac = createHmac('sha256', appSecret);
100
106
  hmac.update(stringToSign);
package/lib/webhook.js CHANGED
@@ -16,13 +16,12 @@ export async function handleDingTalkWebhookRequest(request, response, handler) {
16
16
  const query = new URL(request.url ?? '/', 'http://localhost').searchParams;
17
17
  const timestamp = query.get('timestamp') || headerValue(request.headers, 'timestamp');
18
18
  const sign = query.get('sign') || headerValue(request.headers, 'sign');
19
- if (timestamp && sign) {
20
- if (!verifySignature(handler.config.appSecret, timestamp, sign)) {
21
- logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'invalid signature' }));
22
- response.writeHead(403, { 'Content-Type': 'application/json' });
23
- response.end(JSON.stringify({ code: -1, msg: 'Forbidden' }));
24
- return;
25
- }
19
+ // Missing credentials must never be admitted: verify unconditionally.
20
+ if (!timestamp || !sign || !verifySignature(handler.config.appSecret, timestamp, sign)) {
21
+ logger.warn(formatCompact({ op: 'webhook', ok: false, error: 'invalid signature' }));
22
+ response.writeHead(403, { 'Content-Type': 'application/json' });
23
+ response.end(JSON.stringify({ code: -1, msg: 'Forbidden' }));
24
+ return;
26
25
  }
27
26
  const rawBody = await readTextBody(request);
28
27
  let event;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/adapter-dingtalk",
3
- "version": "5.0.0",
3
+ "version": "5.0.2",
4
4
  "description": "Zhin.js DingTalk (钉钉) adapter for Plugin Runtime (HTTP webhook)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -33,20 +33,21 @@
33
33
  "directory": "plugins/adapters/dingtalk"
34
34
  },
35
35
  "dependencies": {
36
- "@zhin.js/adapter": "1.1.0",
37
- "@zhin.js/core": "1.4.0",
38
- "@zhin.js/host-http": "1.0.2",
36
+ "@zhin.js/adapter": "1.1.2",
37
+ "@zhin.js/command": "1.0.4",
38
+ "@zhin.js/core": "1.4.2",
39
+ "@zhin.js/host-http": "1.0.3",
39
40
  "@zhin.js/logger": "1.0.75",
40
- "@zhin.js/plugin-runtime": "1.1.0"
41
+ "@zhin.js/plugin-runtime": "1.1.1"
41
42
  },
42
43
  "peerDependencies": {
43
44
  "zod": "^4.0.0",
44
- "@zhin.js/adapter": "1.1.0",
45
- "@zhin.js/agent": "1.0.5",
46
- "@zhin.js/core": "1.4.0",
47
- "@zhin.js/host-http": "1.0.2",
48
- "@zhin.js/plugin-runtime": "1.1.0",
49
- "zhin.js": "5.0.0"
45
+ "@zhin.js/adapter": "1.1.2",
46
+ "@zhin.js/agent": "1.0.7",
47
+ "@zhin.js/core": "1.4.2",
48
+ "@zhin.js/host-http": "1.0.3",
49
+ "@zhin.js/plugin-runtime": "1.1.1",
50
+ "zhin.js": "5.0.2"
50
51
  },
51
52
  "peerDependenciesMeta": {
52
53
  "zhin.js": {
@@ -64,12 +65,13 @@
64
65
  "typescript": "^6.0.3",
65
66
  "vitest": "^4.1.10",
66
67
  "zod": "^4.4.3",
67
- "@zhin.js/agent": "1.0.5",
68
- "zhin.js": "5.0.0"
68
+ "@zhin.js/agent": "1.0.7",
69
+ "zhin.js": "5.0.2"
69
70
  },
70
71
  "files": [
71
72
  "adapters",
72
- "plugin.ts",
73
+ "commands",
74
+ "plugin.js",
73
75
  "schema.json",
74
76
  "src",
75
77
  "lib",
@@ -87,13 +89,17 @@
87
89
  "zhin": {
88
90
  "protocol": 1,
89
91
  "type": "plugin",
90
- "entry": "./plugin.ts",
92
+ "entry": "./plugin.js",
91
93
  "engine": "^1.0.0",
92
94
  "runtime": "trusted",
93
95
  "features": [
94
96
  {
95
97
  "package": "@zhin.js/adapter",
96
98
  "api": "^1.0.0"
99
+ },
100
+ {
101
+ "package": "@zhin.js/command",
102
+ "api": "^1.0.0"
97
103
  }
98
104
  ],
99
105
  "plugins": []
package/plugin.js ADDED
@@ -0,0 +1,16 @@
1
+ // Generated by build-plugin-runtime-entries.mjs. Do not edit.
2
+ import { createEndpointRuntimeState } from '@zhin.js/adapter';
3
+ import { definePlugin } from '@zhin.js/plugin-runtime';
4
+ import { registerDingtalkPlatformPermitChecker } from "./lib/platform-permit.js";
5
+ import { dingtalkRuntimeStateToken } from "./lib/dingtalk-runtime-state.js";
6
+ export default definePlugin({
7
+ name: 'dingtalk',
8
+ metadata: {
9
+ displayName: 'DingTalk (钉钉) Adapter',
10
+ },
11
+ setup(context) {
12
+ // 运行中 endpoint 注册表(dingtalk endpoint list 的"运行中"数据源)
13
+ context.resources.provide(dingtalkRuntimeStateToken, createEndpointRuntimeState());
14
+ return registerDingtalkPlatformPermitChecker();
15
+ },
16
+ });
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `dingtalk endpoint` 命令族:由 @zhin.js/adapter 的 createEndpointCommands 套件生成。
3
+ * commands/endpoint/ 下的 list / add / remove 直接默认导出这三项。
4
+ */
5
+ import { createEndpointCommands } from '@zhin.js/adapter';
6
+ import { defineCommand } from '@zhin.js/command';
7
+ import { dingtalkRuntimeStateToken } from './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,7 @@
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
+
7
+ export const dingtalkRuntimeStateToken = defineEndpointRuntimeStateToken('dingtalk');
package/src/endpoint.ts CHANGED
@@ -49,6 +49,11 @@ export interface DingTalkEndpointOptions {
49
49
  readonly fetch?: DingTalkFetch;
50
50
  }
51
51
 
52
+ /**
53
+ * 钉钉机器人(webhook/stream 模式)无常规群列表 API——机器人不持有
54
+ * 「我所在的群」枚举面,仅能收发消息;
55
+ * 因此本 endpoint 不暴露 EndpointManagement(Console 社交面 RPC 对该平台保持未接线)。
56
+ */
52
57
  export class DingTalkEndpoint implements EndpointInstance {
53
58
  readonly #options: DingTalkEndpointOptions;
54
59
  readonly #fetch: DingTalkFetch;
package/src/protocol.ts CHANGED
@@ -195,12 +195,19 @@ export function formatInboundContent(msg: DingTalkMessage): string {
195
195
  }
196
196
  }
197
197
 
198
+ /** DingTalk timestamps are epoch milliseconds; reject replays outside ±1 hour. */
199
+ export const MAX_TIMESTAMP_DRIFT_MS = 60 * 60 * 1000;
200
+
198
201
  export function verifySignature(
199
202
  appSecret: string,
200
203
  timestamp: string,
201
204
  sign: string,
202
205
  ): boolean {
203
206
  try {
207
+ const ts = Number(timestamp);
208
+ if (!Number.isFinite(ts) || Math.abs(Date.now() - ts) > MAX_TIMESTAMP_DRIFT_MS) {
209
+ return false;
210
+ }
204
211
  const stringToSign = `${timestamp}\n${appSecret}`;
205
212
  const hmac = createHmac('sha256', appSecret);
206
213
  hmac.update(stringToSign);
package/src/webhook.ts CHANGED
@@ -43,13 +43,12 @@ export async function handleDingTalkWebhookRequest(
43
43
  const query = new URL(request.url ?? '/', 'http://localhost').searchParams;
44
44
  const timestamp = query.get('timestamp') || headerValue(request.headers, 'timestamp');
45
45
  const sign = query.get('sign') || headerValue(request.headers, 'sign');
46
- if (timestamp && sign) {
47
- if (!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
- }
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;
53
52
  }
54
53
 
55
54
  const rawBody = await readTextBody(request);
package/plugin.ts DELETED
@@ -1,12 +0,0 @@
1
- import { definePlugin } from '@zhin.js/plugin-runtime';
2
- import { registerDingtalkPlatformPermitChecker } from './src/platform-permit.js';
3
-
4
- export default definePlugin({
5
- name: 'dingtalk',
6
- metadata: {
7
- displayName: 'DingTalk (钉钉) Adapter',
8
- },
9
- setup() {
10
- return registerDingtalkPlatformPermitChecker();
11
- },
12
- });