@jeik/dingtalk-connector 0.8.24 → 0.8.26-fix1
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 +22 -0
- package/README.md +14 -6
- package/dist/index.mjs +1 -1
- package/dist/{message-handler-DLWxae1K.mjs → message-handler-DQZiKx3i.mjs} +9 -3
- package/dist/{runtime-BdF5tr4a.mjs → runtime-DzZo6Gvk.mjs} +1 -1
- package/docs/RELEASE_NOTES_V0.8.25.md +25 -0
- package/docs/RELEASE_NOTES_V0.8.26.md +18 -0
- package/package.json +1 -1
- package/src/core/message-handler.ts +27 -15
- package/src/reply-dispatcher.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,28 @@ 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.26] - 2026-07-25
|
|
9
|
+
|
|
10
|
+
### 修复与优化 / Fixed & Improved
|
|
11
|
+
- 🎯 **目标 ID 约束强化** — 强化出站消息回复指引,严格约束 target ID 完整保留 Base64 / 特殊符号后缀(如 `==`、`=`)与字母大小写。
|
|
12
|
+
|
|
13
|
+
### 安装 / Install
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g @jeik/dingtalk-connector@0.8.26
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## [0.8.25] - 2026-07-24
|
|
19
|
+
|
|
20
|
+
### 修复与优化 / Fixed & Improved
|
|
21
|
+
- ✨ **发送人身份与岗位信息** — 消息推送给 Agent 时自动前置发送人真名、岗位 (Title)、入职时间及角色(老板/主管)。
|
|
22
|
+
- 🐛 **无前缀裸钉钉 ID 推导** — 自动将无前缀裸钉钉用户 ID 正确推导为 `direct`(单聊)类型。
|
|
23
|
+
- 🛠️ **消息处理器与发送工具** — 优化消息响应调度与发送工具底层逻辑。
|
|
24
|
+
|
|
25
|
+
### 安装 / Install
|
|
26
|
+
```bash
|
|
27
|
+
npm install -g @jeik/dingtalk-connector@0.8.25
|
|
28
|
+
```
|
|
29
|
+
|
|
8
30
|
## [0.8.21-fix49] - 2026-07-21
|
|
9
31
|
|
|
10
32
|
### 变更 / Changed
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<p>基于官方 <strong>v0.8.20</strong> 的社区维护版本,由社区持续跟进修复官方无暇处理的 Bug。<br/>
|
|
5
5
|
功能与官方完全一致,拥有最快的修复速度,及时合并官方pr和个人发现的bug和社区急需的 Bug。</p>
|
|
6
6
|
|
|
7
|
-
<p><strong>当前发布版:<a href="https://www.npmjs.com/package/@jeik/dingtalk-connector">@jeik/dingtalk-connector</a> v0.8.
|
|
7
|
+
<p><strong>当前发布版:<a href="https://www.npmjs.com/package/@jeik/dingtalk-connector">@jeik/dingtalk-connector</a> v0.8.26</strong>(稳定生产可用;一键安装:`npx -y @jeik/dingtalk-connector install`;本地 tgz:`openclaw plugins install ./jeik-dingtalk-connector-0.8.26.tgz --force`)</p>
|
|
8
8
|
|
|
9
9
|
<p>
|
|
10
10
|
<a href="https://www.npmjs.com/package/@jeik/dingtalk-connector"><img src="https://img.shields.io/npm/v/@jeik/dingtalk-connector.svg?style=flat&colorA=18181B&colorB=28CF8D" alt="npm version" /></a>
|
|
@@ -23,20 +23,28 @@
|
|
|
23
23
|
|
|
24
24
|
## 🔧 最近更新
|
|
25
25
|
|
|
26
|
-
### 🚀 v0.8.
|
|
26
|
+
### 🚀 v0.8.26 · 2026-07-25(当前正式版)
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
**主题:目标 ID 填写约束强化 + 特殊字符后缀与大小写保留**
|
|
29
29
|
|
|
30
30
|
| | 改动 |
|
|
31
31
|
|--|------|
|
|
32
|
-
|
|
|
33
|
-
|
|
34
|
-
|
|
|
32
|
+
| 🎯 **目标 ID 约束强化** | 出站消息回复指引强化,约束 target ID 完整保留 Base64/特殊字符后缀(如 `==`、`=`)与大小写 |
|
|
33
|
+
|
|
34
|
+
| | 改动 |
|
|
35
|
+
|--|------|
|
|
36
|
+
| 👤 **发送人岗位与身份** | 自动前置推送发送人真名、岗位 (Title)、入职时间及老板/主管角色信息 |
|
|
37
|
+
| 🎯 **`targets` 解析修复** | 无前缀裸钉钉用户 ID 自动智能推导为 `direct`(单聊)类型 |
|
|
38
|
+
| 🛠️ **消息处理增强** | 消息处理器底层逻辑优化与工具库稳定性提升 |
|
|
35
39
|
|
|
36
40
|
```bash
|
|
37
41
|
npx -y @jeik/dingtalk-connector install --force && openclaw gateway restart
|
|
38
42
|
```
|
|
39
43
|
|
|
44
|
+
### 📦 v0.8.21-fix49 · 2026-07-21
|
|
45
|
+
|
|
46
|
+
`message` 工具默认答案卡(可关);增强模板字段一致。
|
|
47
|
+
|
|
40
48
|
### 📦 v0.8.21-fix47 · 2026-07-20
|
|
41
49
|
|
|
42
50
|
`file://` 本地图误判远程修复(不再 `fetch failed` 灰图)。
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as initDingtalkPluginConfigSchema, i as dingtalkPlugin, n as setDingtalkRuntime } from "./runtime-
|
|
1
|
+
import { a as initDingtalkPluginConfigSchema, i as dingtalkPlugin, n as setDingtalkRuntime } from "./runtime-DzZo6Gvk.mjs";
|
|
2
2
|
import { t as registerGatewayMethods } from "./gateway-methods--aKsyMs-.mjs";
|
|
3
3
|
//#region index.ts
|
|
4
4
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as resolveDingtalkAccount } from "./accounts-BAzdqkAV.mjs";
|
|
2
|
-
import { r as CHANNEL_ID, t as getDingtalkRuntime } from "./runtime-
|
|
2
|
+
import { r as CHANNEL_ID, t as getDingtalkRuntime } from "./runtime-DzZo6Gvk.mjs";
|
|
3
3
|
import { n as createLoggerFromConfig } from "./logger-mZ9OSbmD.mjs";
|
|
4
4
|
import { t as dingtalkHttp } from "./http-client-DFWZgO1n.mjs";
|
|
5
5
|
import { i as getOapiAccessToken } from "./utils-CIfI_3Jh.mjs";
|
|
@@ -2265,11 +2265,17 @@ async function handleDingTalkMessageInternal(params) {
|
|
|
2265
2265
|
}
|
|
2266
2266
|
} catch (err) {
|
|
2267
2267
|
log?.error?.(`SDK dispatch 失败: ${err.message}`);
|
|
2268
|
-
|
|
2268
|
+
const errorText = matchModelErrorText(err.message, { includeCatchAll: true }) ?? `⚠️ 抱歉,处理请求时出错: ${err.message}`;
|
|
2269
|
+
if (earlyCard) try {
|
|
2270
|
+
await streamAICard(earlyCard, errorText, true, config, log);
|
|
2271
|
+
} catch (cardErr) {
|
|
2272
|
+
log?.error?.(`更新错误卡片失败: ${cardErr.message}`);
|
|
2273
|
+
}
|
|
2274
|
+
else try {
|
|
2269
2275
|
const token = await getAccessToken(config);
|
|
2270
2276
|
const body = {
|
|
2271
2277
|
msgtype: "text",
|
|
2272
|
-
text: { content:
|
|
2278
|
+
text: { content: errorText }
|
|
2273
2279
|
};
|
|
2274
2280
|
if (!isDirect) body.at = {
|
|
2275
2281
|
atUserIds: [senderId],
|
|
@@ -955,7 +955,7 @@ async function monitorDingtalkProvider(opts = {}) {
|
|
|
955
955
|
const log = createLogger(cfg.channels?.["dingtalk-connector"]?.debug ?? false);
|
|
956
956
|
const [accountsModule, monitorAccountModule, monitorSingleModule] = await Promise.all([
|
|
957
957
|
import("./accounts-BQptOmgB.mjs"),
|
|
958
|
-
import("./message-handler-
|
|
958
|
+
import("./message-handler-DQZiKx3i.mjs"),
|
|
959
959
|
import("./connection-fc6B4z4G.mjs")
|
|
960
960
|
]);
|
|
961
961
|
const { resolveDingtalkAccount, listEnabledDingtalkAccounts } = accountsModule;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# RELEASE NOTES - V0.8.25 (正式版)
|
|
2
|
+
|
|
3
|
+
**发布日期**: 2026-07-24
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚀 核心更新
|
|
8
|
+
|
|
9
|
+
### 1. 发送人身份强化与岗位信息 (Sender Identity & Job Title)
|
|
10
|
+
- ✨ **前置发送人身份全量信息**: 消息发送推给 Agent 时,自动通过通讯录 API 拉取并附带发送人的真名、**岗位 (Title)**、入职时间、角色(老板/主管)等信息,便于 Agent 更精准识别与响应。
|
|
11
|
+
|
|
12
|
+
### 2. 目标解析与类型推导优化 (Targets & Routing)
|
|
13
|
+
- 🐛 **无前缀裸钉钉 ID 推导修复**: 当传入没有显式类型前缀的钉钉用户 ID 时,自动正确推导为 `direct`(单聊)类型,避免解析失败或报错。
|
|
14
|
+
|
|
15
|
+
### 3. 消息处理器与发送工具优化 (Message Handler & Utilities)
|
|
16
|
+
- 🛠️ 优化消息处理器底层管道与异步调度。
|
|
17
|
+
- 📦 升级包定义与依赖更新。
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 📦 安装与升级
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g @jeik/dingtalk-connector@0.8.25
|
|
25
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# RELEASE NOTES - V0.8.26 (正式版)
|
|
2
|
+
|
|
3
|
+
**发布日期**: 2026-07-25
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚀 核心更新
|
|
8
|
+
|
|
9
|
+
### 1. 目标 ID 恢复约束强化 (Target ID Prompt Constraints)
|
|
10
|
+
- 🎯 **出站消息 target ID 保留后缀与大小写约束**: 强化消息转发/回复场景下的 ID 指引,强调完整保留 Base64 / 特殊符号后缀(如 `==`、`=`)与字母大小写,避免模型在调用 `message` 工具时因裁剪符号导致投递失败。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 📦 安装与升级
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g @jeik/dingtalk-connector@0.8.26
|
|
18
|
+
```
|
package/package.json
CHANGED
|
@@ -62,7 +62,7 @@ import {
|
|
|
62
62
|
lookupCardContent,
|
|
63
63
|
} from "../services/messaging/card-content-cache.ts";
|
|
64
64
|
import { QUEUE_BUSY_ACK_PHRASES } from "../utils/constants.ts";
|
|
65
|
-
import { createDingtalkReplyDispatcher } from "../reply-dispatcher.ts";
|
|
65
|
+
import { createDingtalkReplyDispatcher, matchModelErrorText } from "../reply-dispatcher.ts";
|
|
66
66
|
import { normalizeSlashCommand } from "../utils/session.ts";
|
|
67
67
|
import { getDingtalkRuntime } from "../runtime.ts";
|
|
68
68
|
import { dingtalkHttp } from '../utils/http-client.ts';
|
|
@@ -1906,20 +1906,32 @@ export async function handleDingTalkMessageInternal(params: HandleMessageParams)
|
|
|
1906
1906
|
} catch (err: any) {
|
|
1907
1907
|
log?.error?.(`SDK dispatch 失败: ${err.message}`);
|
|
1908
1908
|
|
|
1909
|
-
//
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1909
|
+
// 解析上游错误文本(例如 503 No available channel),匹配中文提示文案
|
|
1910
|
+
const errorText = matchModelErrorText(err.message, { includeCatchAll: true }) ?? `⚠️ 抱歉,处理请求时出错: ${err.message}`;
|
|
1911
|
+
|
|
1912
|
+
// 如果已经建了 AI Card,则更新报错状态到 Card,避免停留在"正在召唤大模型"
|
|
1913
|
+
if (earlyCard) {
|
|
1914
|
+
try {
|
|
1915
|
+
await streamAICard(earlyCard, errorText, true, config, log);
|
|
1916
|
+
} catch (cardErr: any) {
|
|
1917
|
+
log?.error?.(`更新错误卡片失败: ${cardErr.message}`);
|
|
1918
|
+
}
|
|
1919
|
+
} else {
|
|
1920
|
+
// 降级:发送错误文本消息
|
|
1921
|
+
try {
|
|
1922
|
+
const token = await getAccessToken(config);
|
|
1923
|
+
const body: any = {
|
|
1924
|
+
msgtype: 'text',
|
|
1925
|
+
text: { content: errorText }
|
|
1926
|
+
};
|
|
1927
|
+
if (!isDirect) body.at = { atUserIds: [senderId], isAtAll: false };
|
|
1928
|
+
|
|
1929
|
+
await dingtalkHttp.post(sessionWebhook, body, {
|
|
1930
|
+
headers: { 'x-acs-dingtalk-access-token': token, 'Content-Type': 'application/json' },
|
|
1931
|
+
});
|
|
1932
|
+
} catch (fallbackErr: any) {
|
|
1933
|
+
log?.error?.(`错误消息发送也失败: ${fallbackErr.message}`);
|
|
1934
|
+
}
|
|
1923
1935
|
}
|
|
1924
1936
|
}
|
|
1925
1937
|
|
package/src/reply-dispatcher.ts
CHANGED
|
@@ -239,7 +239,7 @@ const MODEL_ERROR_CATCH_ALL: [RegExp, string] = [/.{20,}/, MODEL_ERROR_GENERIC];
|
|
|
239
239
|
* @param opts.includeCatchAll 为 true 时启用万能兜底
|
|
240
240
|
* @returns 命中则返回中文提示,未命中返回 null
|
|
241
241
|
*/
|
|
242
|
-
function matchModelErrorText(
|
|
242
|
+
export function matchModelErrorText(
|
|
243
243
|
source: string,
|
|
244
244
|
opts?: { includeCatchAll?: boolean },
|
|
245
245
|
): string | null {
|