@dingtalk-real-ai/dingtalk-connector 0.8.9 → 0.8.10

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
@@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.8.10] - 2026-03-31
9
+
10
+ ### 修复 / Fixes
11
+ - 🐛 **Gateway Methods 配置访问失败** ([#397](https://github.com/DingTalk-Real-AI/dingtalk-openclaw-connector/issues/397)) - 修复 SDK 升级后 `context.deps.config` 为 `undefined`,所有 Gateway RPC 方法调用失败。改用 SDK 的 `loadConfig()` 函数获取配置
12
+ **Gateway Methods config access failure** - Fixed `context.deps.config` being `undefined` after SDK upgrade, now uses `loadConfig()` from `openclaw/plugin-sdk/config-runtime`
13
+
14
+ - 🐛 **锁定 axios 版本避免兼容性问题** ([#396](https://github.com/DingTalk-Real-AI/dingtalk-openclaw-connector/issues/396)) - 将 `axios` 从 `^1.6.0` 锁定为 `1.6.0`,避免自动升级引入不兼容变更
15
+ **Pin axios version** - Pinned `axios` from `^1.6.0` to `1.6.0` to prevent incompatible upgrades
16
+
17
+ ### 改进 / Improvements
18
+ - ✅ **connection.ts 动态 import 优化** - 将 `createLoggerFromConfig` 改为动态 import,避免潜在循环依赖
19
+ **connection.ts dynamic import** - Changed `createLoggerFromConfig` to dynamic import to avoid potential circular dependencies
20
+
8
21
  ## [0.8.9] - 2026-03-31
9
22
 
10
23
  ### 新增 / Added
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "dingtalk-connector",
3
3
  "name": "DingTalk Channel",
4
- "version": "0.8.9",
4
+ "version": "0.8.10",
5
5
  "description": "DingTalk (钉钉) messaging channel via Stream mode with AI Card streaming",
6
6
  "author": "DingTalk Real Team",
7
7
  "main": "index.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dingtalk-real-ai/dingtalk-connector",
3
- "version": "0.8.9",
3
+ "version": "0.8.10",
4
4
  "description": "DingTalk (钉钉) channel connector — Stream mode with AI Card streaming",
5
5
  "main": "index.ts",
6
6
  "type": "module",
@@ -44,7 +44,7 @@
44
44
  "access": "public"
45
45
  },
46
46
  "dependencies": {
47
- "axios": "^1.6.0",
47
+ "axios": "1.6.0",
48
48
  "dingtalk-stream": "2.1.4",
49
49
  "fluent-ffmpeg": "^2.1.3",
50
50
  "form-data": "^4.0.0",
@@ -18,7 +18,6 @@ import type { ResolvedDingtalkAccount } from "../types/index.ts";
18
18
  import {
19
19
  checkAndMarkDingtalkMessage,
20
20
  } from "../utils/utils-legacy.ts";
21
- import { createLoggerFromConfig } from "../utils/logger.ts";
22
21
 
23
22
  // ============ 类型定义 ============
24
23
 
@@ -78,6 +77,7 @@ export async function monitorSingleAccount(
78
77
  const log = runtime?.log;
79
78
 
80
79
  // 创建 debug logger(仅在 debug 模式下输出 info/debug 日志)
80
+ const { createLoggerFromConfig } = await import('../utils/logger');
81
81
  const logger = createLoggerFromConfig(account.config, `DingTalk:${accountId}`);
82
82
 
83
83
  // 验证凭据是否存在
@@ -31,11 +31,11 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
31
31
  * ```
32
32
  */
33
33
  api.registerGatewayMethod('dingtalk-connector.sendToUser', async ({ context, params, respond }) => {
34
- const cfg = context.deps.getConfig();
34
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
35
+ const cfg = loadConfig();
35
36
  try {
36
37
  const { userId, userIds, content, msgType, title, useAICard, fallbackToNormal, accountId } = params || {};
37
38
  const account = resolveDingtalkAccount({ cfg, accountId });
38
-
39
39
  if (!account.config?.clientId) {
40
40
  return respond(false, { error: 'DingTalk not configured' });
41
41
  }
@@ -82,11 +82,11 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
82
82
  * ```
83
83
  */
84
84
  api.registerGatewayMethod('dingtalk-connector.sendToGroup', async ({ context, params, respond }) => {
85
- const cfg = context.deps.getConfig();
85
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
86
+ const cfg = loadConfig();
86
87
  try {
87
88
  const { openConversationId, content, msgType, title, useAICard, fallbackToNormal, accountId } = params || {};
88
89
  const account = resolveDingtalkAccount({ cfg, accountId });
89
-
90
90
  if (!account.config?.clientId) {
91
91
  return respond(false, { error: 'DingTalk not configured' });
92
92
  }
@@ -110,35 +110,18 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
110
110
  respond(result.ok, result);
111
111
  } catch (err: any) {
112
112
  log?.error?.(`[Gateway][sendToGroup] 错误: ${err.message}`);
113
+ console.error(err);
113
114
  respond(false, { error: err.message });
114
115
  }
115
116
  });
116
117
 
117
- /**
118
- * 智能发送消息(自动识别目标类型)
119
- *
120
- * @example
121
- * ```typescript
122
- * // 发送给用户
123
- * await gateway.call('dingtalk-connector.send', {
124
- * target: 'user:user123',
125
- * content: '你好!'
126
- * });
127
- *
128
- * // 发送到群
129
- * await gateway.call('dingtalk-connector.send', {
130
- * target: 'group:cid123',
131
- * content: '大家好!'
132
- * });
133
- * ```
134
- */
135
118
  api.registerGatewayMethod('dingtalk-connector.send', async ({ context, params, respond }) => {
136
- const cfg = context.deps.getConfig();
119
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
120
+ const cfg = loadConfig();
137
121
  try {
138
122
  const { target, content, message, msgType, title, useAICard, fallbackToNormal, accountId } = params || {};
139
123
  const actualContent = content || message;
140
124
  const account = resolveDingtalkAccount({ cfg, accountId });
141
-
142
125
  log?.info?.(`[Gateway][send] 收到请求: target=${target}, contentLen=${actualContent?.length}`);
143
126
 
144
127
  if (!account.config?.clientId) {
@@ -182,20 +165,9 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
182
165
 
183
166
  // ============ 文档操作类 ============
184
167
 
185
- /**
186
- * 读取钉钉文档
187
- *
188
- * @example
189
- * ```typescript
190
- * const result = await gateway.call('dingtalk-connector.docs.read', {
191
- * docId: 'doc123',
192
- * operatorId: 'user_union_id'
193
- * });
194
- * console.log(result.content);
195
- * ```
196
- */
197
168
  api.registerGatewayMethod('dingtalk-connector.docs.read', async ({ context, params, respond }) => {
198
- const cfg = context.deps.getConfig();
169
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
170
+ const cfg = loadConfig();
199
171
  try {
200
172
  const { docId, operatorId: rawOperatorId, accountId } = params || {};
201
173
  const account = resolveDingtalkAccount({ cfg, accountId });
@@ -247,7 +219,8 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
247
219
  * ```
248
220
  */
249
221
  api.registerGatewayMethod('dingtalk-connector.docs.create', async ({ context, params, respond }) => {
250
- const cfg = context.deps.getConfig();
222
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
223
+ const cfg = loadConfig();
251
224
  try {
252
225
  const { spaceId, title, content, accountId } = params || {};
253
226
  const account = resolveDingtalkAccount({ cfg, accountId });
@@ -286,7 +259,8 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
286
259
  * ```
287
260
  */
288
261
  api.registerGatewayMethod('dingtalk-connector.docs.append', async ({ context, params, respond }) => {
289
- const cfg = context.deps.getConfig();
262
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
263
+ const cfg = loadConfig();
290
264
  try {
291
265
  const { docId, content, accountId } = params || {};
292
266
  const account = resolveDingtalkAccount({ cfg, accountId });
@@ -322,7 +296,8 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
322
296
  * ```
323
297
  */
324
298
  api.registerGatewayMethod('dingtalk-connector.docs.search', async ({ context, params, respond }) => {
325
- const cfg = context.deps.getConfig();
299
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
300
+ const cfg = loadConfig();
326
301
  try {
327
302
  const { keyword, spaceId, accountId } = params || {};
328
303
  const account = resolveDingtalkAccount({ cfg, accountId });
@@ -358,7 +333,8 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
358
333
  * ```
359
334
  */
360
335
  api.registerGatewayMethod('dingtalk-connector.docs.list', async ({ context, params, respond }) => {
361
- const cfg = context.deps.getConfig();
336
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
337
+ const cfg = loadConfig();
362
338
  try {
363
339
  const { spaceId, parentId, accountId } = params || {};
364
340
  const account = resolveDingtalkAccount({ cfg, accountId });
@@ -383,26 +359,20 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
383
359
 
384
360
  // ============ 状态检查类 ============
385
361
 
386
- /**
387
- * 检查插件状态
388
- *
389
- * @example
390
- * ```typescript
391
- * const result = await gateway.call('dingtalk-connector.status');
392
- * console.log('配置状态:', result);
393
- * ```
394
- */
395
- api.registerGatewayMethod('dingtalk-connector.status', async ({ context, respond }) => {
396
- const cfg = context.deps.getConfig();
362
+ api.registerGatewayMethod('dingtalk-connector.status', async ({ context, params, respond }) => {
363
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
364
+ const cfg = loadConfig();
397
365
  try {
398
- const account = resolveDingtalkAccount({ cfg });
399
- const configured = Boolean(account.config?.clientId && account.config?.clientSecret);
366
+ const accountId = (params as any)?.accountId as string | undefined;
367
+ const account = resolveDingtalkAccount({ cfg, accountId });
368
+ const hasClientId = !!account.config?.clientId;
369
+ const hasClientSecret = !!account.config?.clientSecret;
400
370
 
401
371
  respond(true, {
402
- configured,
372
+ configured: hasClientId && hasClientSecret,
403
373
  enabled: account.enabled,
404
374
  accountId: account.accountId,
405
- clientId: account.config?.clientId,
375
+ clientId: hasClientId ? String(account.config!.clientId).substring(0, 8) + '...' : undefined,
406
376
  });
407
377
  } catch (err: any) {
408
378
  log?.error?.(`[Gateway][status] 错误: ${err.message}`);
@@ -410,19 +380,9 @@ export function registerGatewayMethods(api: OpenClawPluginApi) {
410
380
  }
411
381
  });
412
382
 
413
- /**
414
- * 探测钉钉连接
415
- *
416
- * @example
417
- * ```typescript
418
- * const result = await gateway.call('dingtalk-connector.probe');
419
- * if (result.ok) {
420
- * console.log('连接正常');
421
- * }
422
- * ```
423
- */
424
383
  api.registerGatewayMethod('dingtalk-connector.probe', async ({ context, respond }) => {
425
- const cfg = context.deps.getConfig();
384
+ const { loadConfig } = await import('openclaw/plugin-sdk/config-runtime');
385
+ const cfg = loadConfig();
426
386
  try {
427
387
  const account = resolveDingtalkAccount({ cfg });
428
388