@dcrays/dcgchat-test 0.6.12 → 0.7.0
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/index.js +306 -0
- package/openclaw.plugin.json +42 -12
- package/package.json +8 -35
- package/README.md +0 -167
- package/index.ts +0 -35
- package/src/agent.ts +0 -568
- package/src/bot.ts +0 -646
- package/src/channel/index.ts +0 -329
- package/src/channel/outboundMedia.ts +0 -144
- package/src/channel/outboundTarget.ts +0 -62
- package/src/channel/uploadMediaUrl.ts +0 -76
- package/src/cron/message.ts +0 -114
- package/src/cron/params.ts +0 -164
- package/src/cron/toolGuard.ts +0 -466
- package/src/cron/types.ts +0 -15
- package/src/gateway/index.ts +0 -430
- package/src/gateway/security.ts +0 -95
- package/src/gateway/socket.ts +0 -256
- package/src/libs/ali-oss-6.23.0.tgz +0 -0
- package/src/libs/axios-1.13.6.tgz +0 -0
- package/src/libs/md5-2.3.0.tgz +0 -0
- package/src/libs/mime-types-3.0.2.tgz +0 -0
- package/src/libs/unzipper-0.12.3.tgz +0 -0
- package/src/libs/ws-8.19.0.tgz +0 -0
- package/src/monitor.ts +0 -269
- package/src/request/api.ts +0 -80
- package/src/request/oss.ts +0 -200
- package/src/request/request.ts +0 -191
- package/src/request/userInfo.ts +0 -44
- package/src/session.ts +0 -28
- package/src/skill.ts +0 -114
- package/src/tool.ts +0 -603
- package/src/tools/messageTool.ts +0 -334
- package/src/tools/toolCallGuard.ts +0 -327
- package/src/transport.ts +0 -217
- package/src/types.ts +0 -139
- package/src/utils/agentErrors.ts +0 -116
- package/src/utils/constant.ts +0 -60
- package/src/utils/env-config.ts +0 -19
- package/src/utils/formatLlmInputEvent.ts +0 -48
- package/src/utils/gatewayMsgHandler.ts +0 -147
- package/src/utils/global.ts +0 -309
- package/src/utils/inboundTurnState.ts +0 -66
- package/src/utils/log.ts +0 -77
- package/src/utils/mediaAttached.ts +0 -244
- package/src/utils/mediaEmitter.ts +0 -54
- package/src/utils/outboundAssistantText.ts +0 -117
- package/src/utils/params.ts +0 -104
- package/src/utils/passTxt.ts +0 -4
- package/src/utils/resolveRegisterConfig.ts +0 -33
- package/src/utils/searchFile.ts +0 -228
- package/src/utils/sessionState.ts +0 -137
- package/src/utils/sessionTermination.ts +0 -228
- package/src/utils/streamMerge.ts +0 -150
- package/src/utils/subagentRunMap.ts +0 -71
- package/src/utils/undiciFetchInterceptor.ts +0 -346
- package/src/utils/workspaceFilePaths.ts +0 -18
- package/src/utils/wsMessageHandler.ts +0 -124
- package/src/utils/zipExtract.ts +0 -97
- package/src/utils/zipPath.ts +0 -24
package/openclaw.plugin.json
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dcgchat-test",
|
|
3
|
-
"channels": [
|
|
3
|
+
"channels": [
|
|
4
|
+
"dcgchat-test"
|
|
5
|
+
],
|
|
4
6
|
"description": "书灵墨宝Channel插件",
|
|
5
7
|
"activation": {
|
|
6
8
|
"onStartup": true
|
|
@@ -9,25 +11,49 @@
|
|
|
9
11
|
"allowConversationAccess": true
|
|
10
12
|
},
|
|
11
13
|
"contracts": {
|
|
12
|
-
"tools": [
|
|
14
|
+
"tools": [
|
|
15
|
+
"dcgchat_message",
|
|
16
|
+
"agent_send"
|
|
17
|
+
]
|
|
13
18
|
},
|
|
14
19
|
"channelConfigs": {
|
|
15
20
|
"dcgchat-test": {
|
|
16
21
|
"schema": {
|
|
17
22
|
"type": "object",
|
|
18
23
|
"properties": {
|
|
19
|
-
"enabled": {
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
"enabled": {
|
|
25
|
+
"type": "boolean"
|
|
26
|
+
},
|
|
27
|
+
"wsUrl": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
},
|
|
30
|
+
"botToken": {
|
|
31
|
+
"type": "string"
|
|
32
|
+
},
|
|
22
33
|
"userId": {
|
|
23
|
-
"type": [
|
|
34
|
+
"type": [
|
|
35
|
+
"number",
|
|
36
|
+
"string"
|
|
37
|
+
],
|
|
24
38
|
"description": "WebSocket 连接参数 _userId,与 dcgchat_message 工具的 target(dcgSessionKey)无关"
|
|
25
39
|
},
|
|
26
|
-
"appId": {
|
|
27
|
-
|
|
40
|
+
"appId": {
|
|
41
|
+
"type": [
|
|
42
|
+
"number",
|
|
43
|
+
"string"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
"domainId": {
|
|
47
|
+
"type": [
|
|
48
|
+
"number",
|
|
49
|
+
"string"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
28
52
|
"capabilities": {
|
|
29
53
|
"type": "array",
|
|
30
|
-
"items": {
|
|
54
|
+
"items": {
|
|
55
|
+
"type": "string"
|
|
56
|
+
}
|
|
31
57
|
},
|
|
32
58
|
"strictMessageToolTarget": {
|
|
33
59
|
"type": "boolean",
|
|
@@ -35,12 +61,16 @@
|
|
|
35
61
|
},
|
|
36
62
|
"allowedPaths": {
|
|
37
63
|
"type": "array",
|
|
38
|
-
"items": {
|
|
64
|
+
"items": {
|
|
65
|
+
"type": "string"
|
|
66
|
+
},
|
|
39
67
|
"description": "允许发送文件的额外路径列表"
|
|
40
68
|
},
|
|
41
69
|
"allowedAttachmentExtensions": {
|
|
42
70
|
"type": "array",
|
|
43
|
-
"items": {
|
|
71
|
+
"items": {
|
|
72
|
+
"type": "string"
|
|
73
|
+
},
|
|
44
74
|
"description": "额外允许的附件后缀,如 [\".go\", \".rs\"]"
|
|
45
75
|
}
|
|
46
76
|
}
|
|
@@ -67,4 +97,4 @@
|
|
|
67
97
|
}
|
|
68
98
|
}
|
|
69
99
|
}
|
|
70
|
-
}
|
|
100
|
+
}
|
package/package.json
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcrays/dcgchat-test",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "书灵墨宝Channel插件",
|
|
6
|
-
"main": "index.
|
|
6
|
+
"main": "index.js",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"files": [
|
|
9
|
-
"index.
|
|
10
|
-
"
|
|
11
|
-
"schemas"
|
|
12
|
-
"openclaw.plugin.json"
|
|
9
|
+
"index.js",
|
|
10
|
+
"openclaw.plugin.json",
|
|
11
|
+
"schemas"
|
|
13
12
|
],
|
|
14
13
|
"keywords": [
|
|
15
14
|
"openclaw",
|
|
@@ -17,17 +16,6 @@
|
|
|
17
16
|
"websocket",
|
|
18
17
|
"ai"
|
|
19
18
|
],
|
|
20
|
-
"scripts": {
|
|
21
|
-
"typecheck": "tsc --noEmit",
|
|
22
|
-
"build:test": "npx tsx scripts/build.ts test",
|
|
23
|
-
"upload:test": "npm run build:test && npx tsx scripts/upload.ts test",
|
|
24
|
-
"update:test": "npx tsx scripts/publish.ts test",
|
|
25
|
-
"publish:test": "npm run upload:test && npm run update:test",
|
|
26
|
-
"build:prod": "npx tsx scripts/build.ts production",
|
|
27
|
-
"upload:prod": "npm run build:prod && npx tsx scripts/upload.ts production",
|
|
28
|
-
"update:prod": "npx tsx scripts/publish.ts production",
|
|
29
|
-
"publish:prod": "npm run upload:prod && npm run update:prod"
|
|
30
|
-
},
|
|
31
19
|
"peerDependencies": {
|
|
32
20
|
"openclaw": ">=2026.6.10"
|
|
33
21
|
},
|
|
@@ -36,42 +24,27 @@
|
|
|
36
24
|
"optional": true
|
|
37
25
|
}
|
|
38
26
|
},
|
|
39
|
-
"dependencies": {
|
|
40
|
-
"ali-oss": "file:src/libs/ali-oss-6.23.0.tgz",
|
|
41
|
-
"axios": "file:src/libs/axios-1.13.6.tgz",
|
|
42
|
-
"md5": "file:src/libs/md5-2.3.0.tgz",
|
|
43
|
-
"unzipper": "file:src/libs/unzipper-0.12.3.tgz",
|
|
44
|
-
"ws": "file:src/libs/ws-8.19.0.tgz"
|
|
45
|
-
},
|
|
46
27
|
"openclaw": {
|
|
47
28
|
"extensions": [
|
|
48
|
-
"./index.
|
|
29
|
+
"./index.js"
|
|
49
30
|
],
|
|
50
31
|
"channel": {
|
|
51
32
|
"id": "dcgchat-test",
|
|
52
33
|
"label": "书灵墨宝",
|
|
53
34
|
"selectionLabel": "书灵墨宝",
|
|
54
|
-
"docsPath": "/channels/dcgchat",
|
|
35
|
+
"docsPath": "/channels/dcgchat-test",
|
|
55
36
|
"docsLabel": "dcgchat-test",
|
|
56
37
|
"blurb": "连接 OpenClaw 与 书灵墨宝 产品",
|
|
57
38
|
"order": 80
|
|
58
39
|
},
|
|
59
40
|
"install": {
|
|
60
41
|
"npmSpec": "@dcrays/dcgchat-test",
|
|
61
|
-
"localPath": "extensions/dcgchat",
|
|
42
|
+
"localPath": "extensions/dcgchat-test",
|
|
62
43
|
"defaultChoice": "npm",
|
|
63
44
|
"minHosssstVersion": ">=2026.6.10"
|
|
64
45
|
},
|
|
65
46
|
"compat": {
|
|
66
47
|
"pluginApi": ">=2026.6.10"
|
|
67
48
|
}
|
|
68
|
-
},
|
|
69
|
-
"devDependencies": {
|
|
70
|
-
"@types/archiver": "^6.0.4",
|
|
71
|
-
"@types/ws": "^8.18.1",
|
|
72
|
-
"archiver": "^7.0.1",
|
|
73
|
-
"esbuild": "^0.25.0",
|
|
74
|
-
"openclaw": "^2026.6.10",
|
|
75
|
-
"typescript": "~5.8.0"
|
|
76
49
|
}
|
|
77
50
|
}
|
package/README.md
DELETED
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
# 书灵墨宝通道插件
|
|
2
|
-
|
|
3
|
-
连接书灵墨宝后端服务与本地智能体运行环境的通道插件,支持通过 WebSocket 接收入站消息、转发智能体回复,并提供会话内文件发送能力。
|
|
4
|
-
|
|
5
|
-
## 功能特性
|
|
6
|
-
|
|
7
|
-
- 主动连接后端 WebSocket 服务,无需本地暴露公网 IP
|
|
8
|
-
- 支持文本消息收发、流式片段回传与最终状态通知
|
|
9
|
-
- 支持按会话路由消息,使用 `dcgSessionKey` 定位当前对话
|
|
10
|
-
- 支持通过内置 `dcgchat_message` 工具发送文件附件
|
|
11
|
-
- 支持附件路径白名单与扩展名白名单配置
|
|
12
|
-
- 支持断线重连、运行状态记录与错误日志
|
|
13
|
-
- 支持 `botToken`、`userId`、`domainId`、`appId` 等连接参数
|
|
14
|
-
|
|
15
|
-
## 通信架构
|
|
16
|
-
|
|
17
|
-
```text
|
|
18
|
-
┌──────────┐ WebSocket ┌──────────────┐ WebSocket ┌─────────────────────┐
|
|
19
|
-
│ Web 前端 │ ←───────────────→ │ 后端服务 │ ←───────────────→ │ 本地智能体运行环境 │
|
|
20
|
-
└──────────┘ └──────────────┘ 插件主动连接 └─────────────────────┘
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
工作流程:
|
|
24
|
-
|
|
25
|
-
1. 插件启动后读取通道配置,主动连接后端 WebSocket 地址。
|
|
26
|
-
2. 后端收到用户消息后,以约定的聊天消息类型转发给插件。
|
|
27
|
-
3. 插件解析消息内容,构造会话上下文并调用本地智能体。
|
|
28
|
-
4. 智能体回复通过 WebSocket 回传给后端。
|
|
29
|
-
5. 回复完成后发送 `state: "final"` 的最终状态。
|
|
30
|
-
|
|
31
|
-
## 快速配置
|
|
32
|
-
|
|
33
|
-
通道 ID:`dcgchat-test`
|
|
34
|
-
|
|
35
|
-
核心配置示例:
|
|
36
|
-
|
|
37
|
-
```yaml
|
|
38
|
-
channels:
|
|
39
|
-
dcgchat-test:
|
|
40
|
-
enabled: true
|
|
41
|
-
wsUrl: "ws://your-backend:8080/ws"
|
|
42
|
-
botToken: "your-bot-token"
|
|
43
|
-
userId: "28"
|
|
44
|
-
domainId: "1000"
|
|
45
|
-
appId: "40"
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
## 配置项
|
|
49
|
-
|
|
50
|
-
| 配置键 | 类型 | 必填 | 说明 |
|
|
51
|
-
| --- | --- | --- | --- |
|
|
52
|
-
| `channels.dcgchat-test.enabled` | boolean | 否 | 是否启用通道,默认为启用 |
|
|
53
|
-
| `channels.dcgchat-test.wsUrl` | string | 是 | 后端 WebSocket 地址 |
|
|
54
|
-
| `channels.dcgchat-test.botToken` | string | 否 | 机器人鉴权 token,会作为连接和文件上传参数使用 |
|
|
55
|
-
| `channels.dcgchat-test.userId` | string | 否 | WebSocket 连接参数 `_userId` |
|
|
56
|
-
| `channels.dcgchat-test.domainId` | string | 否 | WebSocket 连接参数 `_domainId` |
|
|
57
|
-
| `channels.dcgchat-test.appId` | string | 否 | WebSocket 连接参数 `_appId` |
|
|
58
|
-
| `channels.dcgchat-test.capabilities` | string[] | 否 | 通道能力扩展配置 |
|
|
59
|
-
| `channels.dcgchat-test.strictMessageToolTarget` | boolean | 否 | 是否严格校验 `message.target` 必须为会话路由键,默认建议开启 |
|
|
60
|
-
| `channels.dcgchat-test.allowedPaths` | string[] | 否 | 允许发送附件的额外目录 |
|
|
61
|
-
| `channels.dcgchat-test.allowedAttachmentExtensions` | string[] | 否 | 额外允许发送的附件后缀,如 `[".go", ".rs"]` |
|
|
62
|
-
|
|
63
|
-
## 消息协议
|
|
64
|
-
|
|
65
|
-
### 后端到插件
|
|
66
|
-
|
|
67
|
-
后端下发用户消息时,消息类型采用双方约定的聊天事件标识,主要字段位于 `content` JSON 字符串内。
|
|
68
|
-
|
|
69
|
-
```json
|
|
70
|
-
{
|
|
71
|
-
"messageType": "chat_message",
|
|
72
|
-
"content": "{\"session_id\":\"19017\",\"message_id\":\"549076\",\"agent_id\":\"14\",\"text\":\"你好\",\"bot_token\":\"***\",\"app_id\":\"40\"}"
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
常用内容字段:
|
|
77
|
-
|
|
78
|
-
| 字段 | 说明 |
|
|
79
|
-
| --- | --- |
|
|
80
|
-
| `session_id` | 后端会话 ID |
|
|
81
|
-
| `message_id` | 后端消息 ID |
|
|
82
|
-
| `agent_id` | 智能体 ID |
|
|
83
|
-
| `text` | 用户输入文本 |
|
|
84
|
-
| `file_urls` / `files` | 用户上传文件信息 |
|
|
85
|
-
| `bot_token` | 当前机器人 token |
|
|
86
|
-
| `domain_id` / `app_id` | 业务域和应用标识 |
|
|
87
|
-
|
|
88
|
-
### 插件到后端
|
|
89
|
-
|
|
90
|
-
回复内容通过 WebSocket 回传,包含会话、消息、机器人和应用上下文。
|
|
91
|
-
|
|
92
|
-
流式片段示例:
|
|
93
|
-
|
|
94
|
-
```json
|
|
95
|
-
{
|
|
96
|
-
"response": "你好,有什么可以帮你?",
|
|
97
|
-
"state": "stream"
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
最终状态示例:
|
|
102
|
-
|
|
103
|
-
```json
|
|
104
|
-
{
|
|
105
|
-
"response": "",
|
|
106
|
-
"state": "final"
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## 文件发送
|
|
111
|
-
|
|
112
|
-
插件内置 `dcgchat_message` 工具,用于在当前会话中发送附件。
|
|
113
|
-
|
|
114
|
-
使用约束:
|
|
115
|
-
|
|
116
|
-
- 默认使用当前入站会话的 `dcgSessionKey`,回复当前会话时不需要显式传 `target`
|
|
117
|
-
- 如必须指定 `target`,应传完整会话路由键,例如 `agent:...:mobook:direct:...`
|
|
118
|
-
- 禁止用纯数字会话号、`userId` 或 `From` 代替会话路由键
|
|
119
|
-
- 附件路径需位于当前工作区、兼容挂载目录或 `allowedPaths` 配置目录内
|
|
120
|
-
- 附件后缀需在默认白名单或 `allowedAttachmentExtensions` 配置中
|
|
121
|
-
|
|
122
|
-
## 开发命令
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
# 安装依赖
|
|
126
|
-
pnpm install
|
|
127
|
-
|
|
128
|
-
# 类型检查
|
|
129
|
-
pnpm typecheck
|
|
130
|
-
|
|
131
|
-
# 构建测试包
|
|
132
|
-
pnpm build:test
|
|
133
|
-
|
|
134
|
-
# 发布测试包
|
|
135
|
-
pnpm publish:test
|
|
136
|
-
|
|
137
|
-
# 构建生产包
|
|
138
|
-
pnpm build:prod
|
|
139
|
-
|
|
140
|
-
# 发布生产包
|
|
141
|
-
pnpm publish:prod
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## 目录说明
|
|
145
|
-
|
|
146
|
-
| 路径 | 说明 |
|
|
147
|
-
| --- | --- |
|
|
148
|
-
| `index.ts` | 插件入口,注册通道、运行时和工具 |
|
|
149
|
-
| `src/channel/index.ts` | 通道定义、账号解析、状态快照、出站文本能力 |
|
|
150
|
-
| `src/channel/outboundMedia.ts` | 附件发送与上传处理 |
|
|
151
|
-
| `src/monitor.ts` | 后端 WebSocket 连接、重连和入站消息监听 |
|
|
152
|
-
| `src/bot.ts` | 入站消息处理、会话上下文构造和智能体调用 |
|
|
153
|
-
| `src/transport.ts` | WebSocket 上行发送、流式片段和最终状态封装 |
|
|
154
|
-
| `src/gateway/` | 本地网关连接、RPC 调用和事件处理 |
|
|
155
|
-
| `src/tools/messageTool.ts` | `dcgchat_message` 工具实现 |
|
|
156
|
-
| `src/utils/` | 会话、日志、参数、状态等工具函数 |
|
|
157
|
-
| `src/request/` | 用户 token、STS、签名 URL 等接口请求 |
|
|
158
|
-
| `schemas/` | 配置或协议相关 schema |
|
|
159
|
-
| `scripts/` | 构建、上传和发布脚本 |
|
|
160
|
-
|
|
161
|
-
## 注意事项
|
|
162
|
-
|
|
163
|
-
- 日志中不要直接输出完整 `botToken`,建议统一脱敏处理。
|
|
164
|
-
- `strictMessageToolTarget` 建议保持开启,避免工具消息发错会话。
|
|
165
|
-
- 如果需要发送非默认类型文件,应通过 `allowedAttachmentExtensions` 显式配置。
|
|
166
|
-
- 如果需要发送工作区外文件,应通过 `allowedPaths` 显式配置可信目录。
|
|
167
|
-
- 生产环境建议使用安全的 WebSocket 地址和后端鉴权策略。
|
package/index.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { defineChannelPluginEntry } from 'openclaw/plugin-sdk/core'
|
|
2
|
-
import { dcgchatPlugin } from './src/channel/index.js'
|
|
3
|
-
import { setDcgchatRuntime, setOpenClawConfig, setWorkspaceDir } from './src/utils/global.js'
|
|
4
|
-
import { monitoringToolMessage } from './src/tool.js'
|
|
5
|
-
import { CHANNEL_ID } from './src/utils/constant.js'
|
|
6
|
-
import { openclawConfigLooksUsable, resolveOpenClawConfigAtRegister } from './src/utils/resolveRegisterConfig.js'
|
|
7
|
-
import { createDcgchatMessageTool } from './src/tools/messageTool.js'
|
|
8
|
-
import { installUndiciFetchInterceptor } from './src/utils/undiciFetchInterceptor.js'
|
|
9
|
-
|
|
10
|
-
installUndiciFetchInterceptor()
|
|
11
|
-
|
|
12
|
-
export default defineChannelPluginEntry({
|
|
13
|
-
id: CHANNEL_ID,
|
|
14
|
-
name: '书灵墨宝',
|
|
15
|
-
description: '连接 OpenClaw 与 书灵墨宝 产品(WebSocket)',
|
|
16
|
-
plugin: dcgchatPlugin,
|
|
17
|
-
setRuntime: (runtime) => {
|
|
18
|
-
setDcgchatRuntime(runtime)
|
|
19
|
-
},
|
|
20
|
-
registerFull: (api) => {
|
|
21
|
-
// registerFull 可能对同一 api 引用多次调用;monitoringToolMessage 内用 WeakSet 按对象去重(见 tool.ts)。
|
|
22
|
-
installUndiciFetchInterceptor()
|
|
23
|
-
const cfg = resolveOpenClawConfigAtRegister(api)
|
|
24
|
-
if (!openclawConfigLooksUsable(cfg)) {
|
|
25
|
-
return
|
|
26
|
-
}
|
|
27
|
-
monitoringToolMessage(api)
|
|
28
|
-
setOpenClawConfig(cfg)
|
|
29
|
-
setWorkspaceDir(cfg.agents?.defaults?.workspace)
|
|
30
|
-
api.registerTool(
|
|
31
|
-
(ctx) => createDcgchatMessageTool(ctx),
|
|
32
|
-
{ name: 'dcgchat_message' }
|
|
33
|
-
)
|
|
34
|
-
}
|
|
35
|
-
})
|