@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 +13 -0
- package/openclaw.plugin.json +1 -1
- package/package.json +2 -2
- package/src/core/connection.ts +1 -1
- package/src/gateway-methods.ts +28 -68
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
|
package/openclaw.plugin.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dingtalk-real-ai/dingtalk-connector",
|
|
3
|
-
"version": "0.8.
|
|
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": "
|
|
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",
|
package/src/core/connection.ts
CHANGED
|
@@ -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
|
// 验证凭据是否存在
|
package/src/gateway-methods.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
399
|
-
const
|
|
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
|
|
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
|
|
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
|
|