@jeik/dingtalk-connector 0.8.27 → 0.8.29
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 +48 -0
- package/README.en.md +40 -82
- package/README.md +50 -93
- package/dist/background-work-DkaSDqWk.mjs +53 -0
- package/dist/card-content-cache-C7-XHhHw.mjs +2 -0
- package/dist/{card-content-cache-CYUzCaQJ.mjs → card-content-cache-DT_OYThh.mjs} +15 -1
- package/dist/chunk-upload-BKM1y4Ba.mjs +2 -0
- package/dist/{chunk-upload-BBQgGtcZ.mjs → chunk-upload-CIU5G_ay.mjs} +1 -1
- package/dist/{common-DE0gd0Jg.mjs → common-BfIYs1yC.mjs} +3 -3
- package/dist/{common-B_A78n8u.mjs → common-C0Oaf0z-.mjs} +1 -1
- package/dist/connection-obtrPkj4.mjs +641 -0
- package/dist/entry-bundled.mjs +1 -1
- package/dist/{gateway-methods--aKsyMs-.mjs → gateway-methods-BdcpfxEZ.mjs} +1 -1
- package/dist/gateway-methods-DQ6TwOAr.mjs +2 -0
- package/dist/index.mjs +2 -2
- package/dist/{logger-mZ9OSbmD.mjs → logger-CnBTcwyq.mjs} +16 -2
- package/dist/logger-D8H2IcYz.mjs +2 -0
- package/dist/{media-BqpUGCni.mjs → media-DDtX37T2.mjs} +1 -1
- package/dist/{media-DnQB2BrL.mjs → media-g8tJtpfU.mjs} +29 -20
- package/dist/{message-handler-DQZiKx3i.mjs → message-handler-BrO2i7tg.mjs} +251 -139
- package/dist/{messaging-WleKf54h.mjs → messaging-CK0Wz3Ze.mjs} +23 -21
- package/dist/{runtime-DzZo6Gvk.mjs → runtime-DbqGRyhI.mjs} +6 -5
- package/dist/{utils-Bjh4r_qS.mjs → utils-Bwz2Fls_.mjs} +1 -1
- package/docs/RELEASE_NOTES_V0.8.28.md +56 -0
- package/docs/RELEASE_NOTES_V0.8.29.md +57 -0
- package/openclaw.plugin.json +9 -5
- package/package.json +2 -2
- package/src/config/schema.ts +2 -1
- package/src/core/connection.ts +504 -220
- package/src/core/message-handler.ts +197 -102
- package/src/reply-dispatcher.ts +244 -93
- package/src/services/media.ts +60 -27
- package/src/services/messaging/card-content-cache.ts +11 -6
- package/src/services/messaging/card.ts +2 -0
- package/src/services/messaging.ts +52 -38
- package/src/utils/background-work.ts +65 -0
- package/src/utils/logger.ts +23 -2
- package/dist/card-content-cache-Dwd8HICP.mjs +0 -2
- package/dist/chunk-upload-DaLXXZH3.mjs +0 -2
- package/dist/connection-fc6B4z4G.mjs +0 -423
- package/dist/gateway-methods-BQd4E0Sk.mjs +0 -2
- package/dist/logger-BmJkQkm1.mjs +0 -2
- /package/dist/{game-xiyou-CAT0ilSj.mjs → game-xiyou-uwsv23AC.mjs} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { c as logMediaIdTrace, d as processLocalImages, u as processImagesForOutbound, y as uploadMediaToDingTalk } from "./media-
|
|
2
|
-
import { n as createLoggerFromConfig } from "./logger-
|
|
1
|
+
import { c as logMediaIdTrace, d as processLocalImages, u as processImagesForOutbound, y as uploadMediaToDingTalk } from "./media-g8tJtpfU.mjs";
|
|
2
|
+
import { n as createLoggerFromConfig, r as isDingtalkDebug } from "./logger-CnBTcwyq.mjs";
|
|
3
3
|
import { t as dingtalkHttp } from "./http-client-DFWZgO1n.mjs";
|
|
4
4
|
import { i as getOapiAccessToken, r as getAccessToken, t as DINGTALK_API } from "./utils-CIfI_3Jh.mjs";
|
|
5
5
|
import { r as MEDIA_MSG_TYPES } from "./session-DJ4jYqPv.mjs";
|
|
@@ -371,7 +371,7 @@ async function finishAICard(card, content, config, log, contentVar, skipInputing
|
|
|
371
371
|
const fixedContent = ensureTableBlankLines(cleanContent);
|
|
372
372
|
log?.info?.(`[DingTalk][AICard] 开始 finish(一次性定稿,无流式回放),最终内容长度=${fixedContent.length}`);
|
|
373
373
|
try {
|
|
374
|
-
const { rememberCardContent } = await import("./card-content-cache-
|
|
374
|
+
const { rememberCardContent } = await import("./card-content-cache-C7-XHhHw.mjs");
|
|
375
375
|
rememberCardContent({
|
|
376
376
|
text: fixedContent,
|
|
377
377
|
outTrackId: card.cardInstanceId,
|
|
@@ -429,8 +429,12 @@ async function finishAICard(card, content, config, log, contentVar, skipInputing
|
|
|
429
429
|
return;
|
|
430
430
|
} catch (retryErr) {
|
|
431
431
|
log?.error?.(`[DingTalk][AICard] FINISHED 重试失败:${retryErr.message}`);
|
|
432
|
+
throw retryErr;
|
|
432
433
|
}
|
|
433
|
-
} else
|
|
434
|
+
} else {
|
|
435
|
+
log?.error?.(`[DingTalk][AICard] FINISHED 更新失败:${err.message}`);
|
|
436
|
+
throw err;
|
|
437
|
+
}
|
|
434
438
|
}
|
|
435
439
|
}
|
|
436
440
|
//#endregion
|
|
@@ -817,7 +821,7 @@ function isImageMediaPath(mediaUrl) {
|
|
|
817
821
|
async function downloadRemoteMediaToTemp(url, log) {
|
|
818
822
|
const tag = "[DingTalk][RemoteMedia]";
|
|
819
823
|
try {
|
|
820
|
-
console.log(`${tag} 开始下载 | ${url}`);
|
|
824
|
+
if (isDingtalkDebug()) console.log(`${tag} 开始下载 | ${url}`);
|
|
821
825
|
const res = await fetch(url, {
|
|
822
826
|
redirect: "follow",
|
|
823
827
|
signal: AbortSignal.timeout(6e4),
|
|
@@ -854,7 +858,7 @@ async function downloadRemoteMediaToTemp(url, log) {
|
|
|
854
858
|
const { writeFileSync } = await import("node:fs");
|
|
855
859
|
const tmp = path.join(os.tmpdir(), `dingtalk-remote-${Date.now()}-${Math.random().toString(36).slice(2, 8)}${ext}`);
|
|
856
860
|
writeFileSync(tmp, buf);
|
|
857
|
-
console.log(`${tag} 下载成功 | bytes=${buf.length} ct=${ct || "-"} tmp=${tmp}`);
|
|
861
|
+
if (isDingtalkDebug()) console.log(`${tag} 下载成功 | bytes=${buf.length} ct=${ct || "-"} tmp=${tmp}`);
|
|
858
862
|
return tmp;
|
|
859
863
|
} catch (err) {
|
|
860
864
|
console.warn(`${tag} 下载异常 | ${err?.message || err}`);
|
|
@@ -872,7 +876,7 @@ async function resolveMediaSourceToLocalFile(mediaUrl, mediaLocalRoots, log) {
|
|
|
872
876
|
cleanup: tmp
|
|
873
877
|
};
|
|
874
878
|
}
|
|
875
|
-
const { toLocalPath } = await import("./media-
|
|
879
|
+
const { toLocalPath } = await import("./media-DDtX37T2.mjs");
|
|
876
880
|
const _fs = await import("fs");
|
|
877
881
|
const _path = await import("path");
|
|
878
882
|
let resolved = toLocalPath(mediaUrl);
|
|
@@ -907,24 +911,22 @@ async function sendTextToDingTalk(params) {
|
|
|
907
911
|
};
|
|
908
912
|
}
|
|
909
913
|
const targetParam = resolveOutboundTarget(target);
|
|
910
|
-
console.log(`[DingTalk][LocalImage] sendTextToDingTalk 入口 | target=${target} textLen=${text?.length ?? 0}`);
|
|
911
|
-
logMediaIdTrace("sendTextToDingTalk:in", text, `target=${target}`, true);
|
|
912
914
|
const beforeLen = text?.length ?? 0;
|
|
915
|
+
const hasMdImg = /!\[[^\]]*\]\([^)]+\)/.test(text || "");
|
|
916
|
+
if (hasMdImg || isDingtalkDebug()) logMediaIdTrace("sendTextToDingTalk:in", text, `target=${target}`);
|
|
913
917
|
try {
|
|
914
918
|
const oapiToken = await getOapiAccessToken(config);
|
|
915
|
-
console.log(`[DingTalk][LocalImage] sendTextToDingTalk 入口 | target=${target} textLen=${beforeLen} hasToken=${!!oapiToken}`);
|
|
916
919
|
if (oapiToken && text) {
|
|
917
920
|
text = (await processImagesForOutbound(text, oapiToken, log)).text;
|
|
918
|
-
console.log(`[DingTalk][LocalImage] sendTextToDingTalk 处理后 | ${beforeLen}→${text.length} 字`);
|
|
919
|
-
logMediaIdTrace("sendTextToDingTalk:after-process", text
|
|
920
|
-
} else if (!oapiToken) console.warn(`[DingTalk][LocalImage] sendTextToDingTalk 无 oapiToken,跳过图片上传(本地 MD 图会灰)`);
|
|
921
|
+
if (beforeLen !== text.length && (hasMdImg || isDingtalkDebug())) console.log(`[DingTalk][LocalImage] sendTextToDingTalk 处理后 | ${beforeLen}→${text.length} 字`);
|
|
922
|
+
if (hasMdImg || isDingtalkDebug()) logMediaIdTrace("sendTextToDingTalk:after-process", text);
|
|
923
|
+
} else if (!oapiToken && hasMdImg) console.warn(`[DingTalk][LocalImage] sendTextToDingTalk 无 oapiToken,跳过图片上传(本地 MD 图会灰)`);
|
|
921
924
|
} catch (err) {
|
|
922
925
|
console.warn(`[DingTalk][LocalImage] sendTextToDingTalk 图片处理失败: ${err?.message || err}`);
|
|
923
926
|
}
|
|
924
927
|
const msgType = shouldSendAsMarkdown(text) ? "markdown" : "text";
|
|
925
928
|
const cardOpts = messageToolProactiveCardOptions(config);
|
|
926
|
-
logMediaIdTrace("sendTextToDingTalk:API前", text, `msgType=${msgType} messageAnswerCard=${isMessageAnswerCardEnabled(config)} useAICard=${cardOpts.useAICard}
|
|
927
|
-
console.log(`[DingTalk][MessageCard] sendTextToDingTalk | messageAnswerCard=${isMessageAnswerCardEnabled(config)} useAICard=${cardOpts.useAICard} tpl=${cardOpts.cardTemplateId || "-"}`);
|
|
929
|
+
if (hasMdImg || isDingtalkDebug()) logMediaIdTrace("sendTextToDingTalk:API前", text, `msgType=${msgType} messageAnswerCard=${isMessageAnswerCardEnabled(config)} useAICard=${cardOpts.useAICard}`);
|
|
928
930
|
return sendProactive(config, targetParam, text, {
|
|
929
931
|
msgType,
|
|
930
932
|
replyToId,
|
|
@@ -1086,7 +1088,7 @@ async function sendMediaToDingTalk(params) {
|
|
|
1086
1088
|
const mediaId = uploadResult.mediaId;
|
|
1087
1089
|
const imgsInCaption = (caption.match(/!\[[^\]]*\]\([^)]+\)/g) || []).length;
|
|
1088
1090
|
const mergeMd = config.messageImageMd === true && caption.length > 0 && imgsInCaption >= 1;
|
|
1089
|
-
console.log(`[DingTalk][LocalImage] sendMedia 图片策略 | messageImageMd=${config.messageImageMd === true} imgsInCaption=${imgsInCaption} mergeMd=${mergeMd} remote=${isRemoteHttpUrl(mediaUrl)}`);
|
|
1091
|
+
if (isDingtalkDebug()) console.log(`[DingTalk][LocalImage] sendMedia 图片策略 | messageImageMd=${config.messageImageMd === true} imgsInCaption=${imgsInCaption} mergeMd=${mergeMd} remote=${isRemoteHttpUrl(mediaUrl)}`);
|
|
1090
1092
|
if (mergeMd) {
|
|
1091
1093
|
const result = await sendProactive(config, targetParam, `${caption}\n\n`, {
|
|
1092
1094
|
msgType: "markdown",
|
|
@@ -1141,7 +1143,7 @@ async function sendMediaToDingTalk(params) {
|
|
|
1141
1143
|
const fileName = mediaUrl.split("/").filter(Boolean).pop()?.split("?")[0] || "file";
|
|
1142
1144
|
if (mediaType === "video") {
|
|
1143
1145
|
const videoMarker = `[DINGTALK_VIDEO]{"path":"${resolvedMediaUrl}"}[/DINGTALK_VIDEO]`;
|
|
1144
|
-
const { processVideoMarkers } = await import("./media-
|
|
1146
|
+
const { processVideoMarkers } = await import("./media-DDtX37T2.mjs");
|
|
1145
1147
|
await processVideoMarkers(videoMarker, "", config, oapiToken, console, true, targetParam);
|
|
1146
1148
|
return {
|
|
1147
1149
|
ok: true,
|
|
@@ -1160,7 +1162,7 @@ async function sendMediaToDingTalk(params) {
|
|
|
1160
1162
|
fileName,
|
|
1161
1163
|
fileType: ext && ext.length < 12 ? ext : "file"
|
|
1162
1164
|
};
|
|
1163
|
-
const { sendFileProactive } = await import("./media-
|
|
1165
|
+
const { sendFileProactive } = await import("./media-DDtX37T2.mjs");
|
|
1164
1166
|
await sendFileProactive(config, targetParam, fileInfo, uploadResult.mediaId, log);
|
|
1165
1167
|
return {
|
|
1166
1168
|
ok: true,
|
|
@@ -1170,7 +1172,7 @@ async function sendMediaToDingTalk(params) {
|
|
|
1170
1172
|
} finally {
|
|
1171
1173
|
if (cleanupTemp) try {
|
|
1172
1174
|
_fs.unlinkSync(cleanupTemp);
|
|
1173
|
-
console.log(`[DingTalk][RemoteMedia] 已清理临时文件 | ${cleanupTemp}`);
|
|
1175
|
+
if (isDingtalkDebug()) console.log(`[DingTalk][RemoteMedia] 已清理临时文件 | ${cleanupTemp}`);
|
|
1174
1176
|
} catch {}
|
|
1175
1177
|
}
|
|
1176
1178
|
} catch (err) {
|
|
@@ -1245,7 +1247,7 @@ async function sendProactiveInternal(config, target, content, options) {
|
|
|
1245
1247
|
const card = await createAICardForTarget(config, target, externalLog, cardTemplateId);
|
|
1246
1248
|
if (card) {
|
|
1247
1249
|
await finishAICard(card, content, config, externalLog, void 0, skipInputingWalk);
|
|
1248
|
-
console.log(`[DingTalk][MessageCard] AI Card 发送成功 | outTrack=${card.cardInstanceId} tpl=${cardTemplateId || "default"} skipInputing=${skipInputingWalk}`);
|
|
1250
|
+
if (isDingtalkDebug()) console.log(`[DingTalk][MessageCard] AI Card 发送成功 | outTrack=${card.cardInstanceId} tpl=${cardTemplateId || "default"} skipInputing=${skipInputingWalk}`);
|
|
1249
1251
|
return {
|
|
1250
1252
|
ok: true,
|
|
1251
1253
|
cardInstanceId: card.cardInstanceId,
|
|
@@ -1288,7 +1290,7 @@ async function sendProactiveInternal(config, target, content, options) {
|
|
|
1288
1290
|
usedAICard: false
|
|
1289
1291
|
};
|
|
1290
1292
|
}
|
|
1291
|
-
logMediaIdTrace("API出站", content, `msgKey=${payload.msgKey} type=${msgType}
|
|
1293
|
+
if (/!\[[^\]]*\]\([^)]+\)/.test(content || "") || isDingtalkDebug()) logMediaIdTrace("API出站", content, `msgKey=${payload.msgKey} type=${msgType}`);
|
|
1292
1294
|
const body = {
|
|
1293
1295
|
robotCode: String(config.clientId),
|
|
1294
1296
|
msgKey: payload.msgKey,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { b as __exportAll } from "./media-
|
|
1
|
+
import { b as __exportAll } from "./media-g8tJtpfU.mjs";
|
|
2
2
|
import { a as resolveDingtalkAccount, c as addWildcardAllowFrom, d as hasConfiguredSecretInput, f as normalizeAccountId, l as createDefaultChannelRuntimeState, m as resolveDefaultGroupPolicy, o as resolveDingtalkCredentials, p as resolveAllowlistProviderRuntimeGroupPolicy, r as resolveDefaultDingtalkAccountId, s as DEFAULT_ACCOUNT_ID, t as listDingtalkAccountIds, u as formatDocsLink } from "./accounts-BAzdqkAV.mjs";
|
|
3
|
-
import { t as createLogger } from "./logger-
|
|
3
|
+
import { t as createLogger } from "./logger-CnBTcwyq.mjs";
|
|
4
4
|
import { t as dingtalkHttp } from "./http-client-DFWZgO1n.mjs";
|
|
5
5
|
import "./utils-CIfI_3Jh.mjs";
|
|
6
|
-
import { S as finalClean, f as getActiveCardForConversation, n as sendMediaToDingTalk, o as sendTextToDingTalk } from "./messaging-
|
|
6
|
+
import { S as finalClean, f as getActiveCardForConversation, n as sendMediaToDingTalk, o as sendTextToDingTalk } from "./messaging-CK0Wz3Ze.mjs";
|
|
7
7
|
import { createRequire } from "node:module";
|
|
8
8
|
import { z, z as z$1 } from "zod";
|
|
9
9
|
//#region src/secret-input.ts
|
|
@@ -92,6 +92,7 @@ const DingtalkSharedConfigShape = {
|
|
|
92
92
|
asyncMode: z$1.boolean().optional(),
|
|
93
93
|
ackText: z$1.string().optional(),
|
|
94
94
|
endpoint: z$1.string().optional(),
|
|
95
|
+
/** 调试日志:连接/入站摘要、图片 mediaId 追踪、引用回填、队列计数等(默认关,生产勿开) */
|
|
95
96
|
debug: z$1.boolean().optional(),
|
|
96
97
|
enableMediaUpload: z$1.boolean().optional(),
|
|
97
98
|
systemPrompt: z$1.string().optional(),
|
|
@@ -955,8 +956,8 @@ async function monitorDingtalkProvider(opts = {}) {
|
|
|
955
956
|
const log = createLogger(cfg.channels?.["dingtalk-connector"]?.debug ?? false);
|
|
956
957
|
const [accountsModule, monitorAccountModule, monitorSingleModule] = await Promise.all([
|
|
957
958
|
import("./accounts-BQptOmgB.mjs"),
|
|
958
|
-
import("./message-handler-
|
|
959
|
-
import("./connection-
|
|
959
|
+
import("./message-handler-BrO2i7tg.mjs"),
|
|
960
|
+
import("./connection-obtrPkj4.mjs")
|
|
960
961
|
]);
|
|
961
962
|
const { resolveDingtalkAccount, listEnabledDingtalkAccounts } = accountsModule;
|
|
962
963
|
const { handleDingTalkMessage } = monitorAccountModule;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Release Notes · v0.8.28
|
|
2
|
+
|
|
3
|
+
**发布日期:** 2026-07-25
|
|
4
|
+
**npm:** `@jeik/dingtalk-connector@0.8.28`
|
|
5
|
+
**定位:** 基于官方 **0.8.24**,叠加本仓库独有优化的正式版
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一句话
|
|
10
|
+
|
|
11
|
+
连接更稳、消息更少丢、模型出错时提示更清楚;官方 0.8.24 的长连接改进已吸收,**本仓库独有**的图片/答案卡等优化继续保留。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 基于官方 0.8.24 做了什么
|
|
16
|
+
|
|
17
|
+
- 吸收官方对长连接的稳定性改进(少假死、少误重连)
|
|
18
|
+
- 长任务处理期间连接更不容易被中途打断
|
|
19
|
+
- 日志更干净,方便运维判断「是不是真坏了」
|
|
20
|
+
|
|
21
|
+
未合入:官方给其他插件调用的「卡片开放接口」(对话主流程不需要)。
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 本仓库额外优化(效果)
|
|
26
|
+
|
|
27
|
+
1. **真正能收消息才显示已连接** — 减少「显示在线、发了没反应」
|
|
28
|
+
2. **连发 / 错误后 / 刚回完再发** — 消息进网关的成功率明显提高
|
|
29
|
+
3. **上一条还在跑时再发** — 更容易马上看到排队提示和思考中表情
|
|
30
|
+
4. **模型 503、欠费、无可用线路等** — 更容易定格成中文错误说明,少卡转圈
|
|
31
|
+
5. **本仓库独有能力** — 大段答案独立卡片、图片全路径、中文错误映射等均保留
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 安装
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
npx -y @jeik/dingtalk-connector@0.8.28 install --force
|
|
39
|
+
openclaw gateway restart
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
或:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
openclaw plugins install @jeik/dingtalk-connector@0.8.28 --force
|
|
46
|
+
openclaw gateway restart
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 建议验收
|
|
52
|
+
|
|
53
|
+
1. 启动后日志出现「订阅已生效 / registered」类成功信息后再发消息
|
|
54
|
+
2. 正常对话:先「召唤大模型」再流式/答案卡
|
|
55
|
+
3. 故意用故障模型:应定格中文错误,而不是一直转圈
|
|
56
|
+
4. 任务进行中再发一条:应较快出现排队/处理中反馈
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Release Notes · v0.8.29
|
|
2
|
+
|
|
3
|
+
**发布日期:** 2026-07-25
|
|
4
|
+
**npm:** `@jeik/dingtalk-connector@0.8.29`
|
|
5
|
+
**定位:** 正式加固版(日志 / 排障 / 文档)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一句话
|
|
10
|
+
|
|
11
|
+
默认日志更干净;排障只需配置 `"debug": true`。连接、消息、错误卡能力继承 0.8.28。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 本版变更
|
|
16
|
+
|
|
17
|
+
1. **默认静默** — 无图正常回复不再刷 LocalImage / MediaIdTrace / CardCache
|
|
18
|
+
2. **debug 配置** — 打开后输出连接、图片 mediaId、引用回填、队列等详细日志(无需环境变量)
|
|
19
|
+
3. **文档** — 安装改为三条递进命令(最新 → 指定版本 → 官方源)
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 排障
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
"channels": {
|
|
27
|
+
"dingtalk-connector": {
|
|
28
|
+
"debug": true
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
改完后:`openclaw gateway restart`。用完请改回 `false`。
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 安装
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# 1)装最新
|
|
41
|
+
openclaw plugins install @jeik/dingtalk-connector --force && openclaw gateway restart
|
|
42
|
+
|
|
43
|
+
# 2)若不是最新,指定版本
|
|
44
|
+
openclaw plugins install @jeik/dingtalk-connector@0.8.29 --force && openclaw gateway restart
|
|
45
|
+
|
|
46
|
+
# 3)仍失败时走 npm 官方源
|
|
47
|
+
NPM_CONFIG_REGISTRY=https://registry.npmjs.org openclaw plugins install @jeik/dingtalk-connector@0.8.29 --force && openclaw gateway restart
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 建议验收
|
|
53
|
+
|
|
54
|
+
1. 默认:纯文本对话日志无 LocalImage / MediaIdTrace 刷屏
|
|
55
|
+
2. `"debug": true` 重启后:可见图片/引用类详细日志
|
|
56
|
+
3. 模型 503:错误卡中文定稿,不永久转圈
|
|
57
|
+
4. 任务进行中再发:有排队/处理中反馈
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dingtalk-connector",
|
|
3
3
|
"name": "DingTalk Channel",
|
|
4
|
-
"version": "0.8.
|
|
5
|
-
"description": "
|
|
6
|
-
"author": "
|
|
4
|
+
"version": "0.8.29",
|
|
5
|
+
"description": "OpenClaw DingTalk channel plugin (community) | 钉钉 OpenClaw 社区增强版",
|
|
6
|
+
"author": "jeik",
|
|
7
7
|
"main": "index.ts",
|
|
8
8
|
"channels": [
|
|
9
9
|
"dingtalk-connector"
|
|
@@ -240,7 +240,9 @@
|
|
|
240
240
|
"type": "string"
|
|
241
241
|
},
|
|
242
242
|
"debug": {
|
|
243
|
-
"type": "boolean"
|
|
243
|
+
"type": "boolean",
|
|
244
|
+
"default": false,
|
|
245
|
+
"description": "调试日志:连接/入站、图片 mediaId、引用回填、队列计数等。日常关闭;排障时设 true 后重启 gateway。"
|
|
244
246
|
},
|
|
245
247
|
"messageImageMd": {
|
|
246
248
|
"type": "boolean",
|
|
@@ -491,7 +493,9 @@
|
|
|
491
493
|
"type": "string"
|
|
492
494
|
},
|
|
493
495
|
"debug": {
|
|
494
|
-
"type": "boolean"
|
|
496
|
+
"type": "boolean",
|
|
497
|
+
"default": false,
|
|
498
|
+
"description": "调试日志:连接/入站、图片 mediaId、引用回填、队列计数等。日常关闭;排障时设 true 后重启 gateway。"
|
|
495
499
|
},
|
|
496
500
|
"messageImageMd": {
|
|
497
501
|
"type": "boolean",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jeik/dingtalk-connector",
|
|
3
|
-
"version": "0.8.
|
|
4
|
-
"description": "OpenClaw DingTalk channel plugin (
|
|
3
|
+
"version": "0.8.29",
|
|
4
|
+
"description": "OpenClaw DingTalk channel plugin (community) | 钉钉 OpenClaw 社区增强版(基于官方 0.8.24,长连接与消息体验增强)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
7
7
|
".": {
|
package/src/config/schema.ts
CHANGED
|
@@ -81,7 +81,8 @@ const DingtalkSharedConfigShape = {
|
|
|
81
81
|
asyncMode: z.boolean().optional(),
|
|
82
82
|
ackText: z.string().optional(),
|
|
83
83
|
endpoint: z.string().optional(), // DWClient gateway endpoint
|
|
84
|
-
|
|
84
|
+
/** 调试日志:连接/入站摘要、图片 mediaId 追踪、引用回填、队列计数等(默认关,生产勿开) */
|
|
85
|
+
debug: z.boolean().optional(),
|
|
85
86
|
enableMediaUpload: z.boolean().optional(),
|
|
86
87
|
systemPrompt: z.string().optional(),
|
|
87
88
|
/**
|