@ywfe/openclaw-plugin-caryscloud-im 0.0.1
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/INTEGRATION.md +544 -0
- package/README.md +249 -0
- package/dist/channel.d.ts +15 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +363 -0
- package/dist/channel.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-sdk.d.ts +133 -0
- package/dist/plugin-sdk.d.ts.map +1 -0
- package/dist/plugin-sdk.js +10 -0
- package/dist/plugin-sdk.js.map +1 -0
- package/dist/shared/constants.d.ts +9 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +9 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/errors.d.ts +18 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +38 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/logger.d.ts +15 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +19 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/utils.d.ts +3 -0
- package/dist/shared/utils.d.ts.map +1 -0
- package/dist/shared/utils.js +28 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/ws-client.d.ts +70 -0
- package/dist/ws-client.d.ts.map +1 -0
- package/dist/ws-client.js +454 -0
- package/dist/ws-client.js.map +1 -0
- package/openclaw.plugin.json +79 -0
- package/package.json +47 -0
package/README.md
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# OpenClaw WebSocket 频道插件
|
|
2
|
+
|
|
3
|
+
OpenClaw 的 WebSocket 频道插件 - 通过 WebSocket (wss://) 连接实现双向消息传递。
|
|
4
|
+
|
|
5
|
+
## 📚 文档导航
|
|
6
|
+
|
|
7
|
+
- **[接入指南 (INTEGRATION.md)](./INTEGRATION.md)** - 详细的接入步骤、配置说明和服务器要求
|
|
8
|
+
- **[README.md](./README.md)** - 本文档,功能介绍和快速开始
|
|
9
|
+
|
|
10
|
+
## 功能特性
|
|
11
|
+
|
|
12
|
+
- ✅ 支持 wss:// 协议的 WebSocket 连接
|
|
13
|
+
- ✅ 向 targetUserId 发送文本消息
|
|
14
|
+
- ✅ 从 WebSocket 服务器接收消息
|
|
15
|
+
- ✅ 指数退避的自动重连机制
|
|
16
|
+
- ✅ 断线期间的消息队列
|
|
17
|
+
- ✅ 心跳/ping-pong 连接健康检测
|
|
18
|
+
- ✅ 可选的 authToken 认证
|
|
19
|
+
- ✅ 多账号支持
|
|
20
|
+
- ✅ UUID 冲突检测
|
|
21
|
+
- ✅ 生产级错误处理
|
|
22
|
+
|
|
23
|
+
## 快速开始
|
|
24
|
+
|
|
25
|
+
### 1. 安装
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd /path/to/caryscloud-plugin
|
|
29
|
+
pnpm install
|
|
30
|
+
pnpm build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 2. 配置
|
|
34
|
+
|
|
35
|
+
> 💡 **完整的接入步骤请查看 [INTEGRATION.md](./INTEGRATION.md)**
|
|
36
|
+
|
|
37
|
+
在 OpenClaw 配置文件中添加:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"channels": {
|
|
42
|
+
"caryscloud-im": {
|
|
43
|
+
"accounts": {
|
|
44
|
+
"default": {
|
|
45
|
+
"targetUserId": "user123",
|
|
46
|
+
"wsUrl": "wss://your-caryscloud-im-server.com",
|
|
47
|
+
"uuid": "openclaw-unique-id",
|
|
48
|
+
"name": "我的 OpenClaw 机器人",
|
|
49
|
+
"avatarUrl": "https://example.com/avatar.png",
|
|
50
|
+
"authToken": "your-auth-token",
|
|
51
|
+
"enabled": true
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 配置参数
|
|
60
|
+
|
|
61
|
+
| 参数 | 必填 | 说明 | 默认值 |
|
|
62
|
+
|------|------|------|--------|
|
|
63
|
+
| `targetUserId` | ✅ 是 | 发送消息的目标用户 ID | - |
|
|
64
|
+
| `wsUrl` | ✅ 是 | WebSocket 服务器地址 (wss://...) | - |
|
|
65
|
+
| `uuid` | ❌ 否 | 当前 OpenClaw 实例的唯一标识 | 从 deviceId 自动生成 |
|
|
66
|
+
| `name` | ❌ 否 | 显示名称 | `openclaw_${uuid}` |
|
|
67
|
+
| `avatarUrl` | ❌ 否 | 头像 URL | 默认头像 |
|
|
68
|
+
| `authToken` | ❌ 否 | WebSocket 连接的认证令牌 | - |
|
|
69
|
+
| `enabled` | ❌ 否 | 启用/禁用此账号 | `true` |
|
|
70
|
+
|
|
71
|
+
## WebSocket 协议
|
|
72
|
+
|
|
73
|
+
### 消息格式
|
|
74
|
+
|
|
75
|
+
插件使用 JSON 格式发送/接收消息:
|
|
76
|
+
|
|
77
|
+
#### 出站消息 (OpenClaw → 服务器)
|
|
78
|
+
|
|
79
|
+
**文本消息:**
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"type": "text",
|
|
83
|
+
"from": "openclaw-uuid",
|
|
84
|
+
"to": "targetUserId",
|
|
85
|
+
"text": "你好,世界!",
|
|
86
|
+
"messageId": "msg_1234567890_abc123",
|
|
87
|
+
"timestamp": 1234567890000
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**图片消息:**
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"type": "image",
|
|
95
|
+
"from": "openclaw-uuid",
|
|
96
|
+
"to": "targetUserId",
|
|
97
|
+
"payload": {
|
|
98
|
+
"base64": "data:image/png;base64,...",
|
|
99
|
+
"filename": "image.png",
|
|
100
|
+
"size": 12345
|
|
101
|
+
},
|
|
102
|
+
"messageId": "msg_1234567890_abc123",
|
|
103
|
+
"timestamp": 1234567890000
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**文件消息:**
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"type": "file",
|
|
111
|
+
"from": "openclaw-uuid",
|
|
112
|
+
"to": "targetUserId",
|
|
113
|
+
"payload": {
|
|
114
|
+
"base64": "data:application/pdf;base64,...",
|
|
115
|
+
"filename": "document.pdf",
|
|
116
|
+
"size": 54321
|
|
117
|
+
},
|
|
118
|
+
"messageId": "msg_1234567890_abc123",
|
|
119
|
+
"timestamp": 1234567890000
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### 入站消息 (服务器 → OpenClaw)
|
|
124
|
+
|
|
125
|
+
**文本消息:**
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"type": "text",
|
|
129
|
+
"from": "userId",
|
|
130
|
+
"to": "openclaw-uuid",
|
|
131
|
+
"text": "来自服务器的问候!",
|
|
132
|
+
"messageId": "msg_server_123",
|
|
133
|
+
"timestamp": 1234567890000
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**图片/文件消息:**
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"type": "image",
|
|
141
|
+
"from": "userId",
|
|
142
|
+
"to": "openclaw-uuid",
|
|
143
|
+
"mediaUrl": "https://example.com/image.png",
|
|
144
|
+
"messageId": "msg_server_124",
|
|
145
|
+
"timestamp": 1234567890000
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 认证
|
|
150
|
+
|
|
151
|
+
如果提供了 `authToken`,插件会在连接后立即发送认证消息:
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"type": "auth",
|
|
156
|
+
"payload": {
|
|
157
|
+
"token": "your-auth-token",
|
|
158
|
+
"uuid": "openclaw-uuid"
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
服务器应该响应:
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"type": "auth_response",
|
|
168
|
+
"success": true
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 冲突检测
|
|
173
|
+
|
|
174
|
+
如果服务器检测到重复的 UUID(多设备冲突),应该发送:
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"type": "conflict",
|
|
179
|
+
"reason": "UUID 已在其他设备上使用"
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
插件将进入冲突状态并停止重连尝试。
|
|
184
|
+
|
|
185
|
+
### 心跳
|
|
186
|
+
|
|
187
|
+
插件每 30 秒发送一次 WebSocket ping 帧(可配置)。服务器应该响应 pong 帧。如果 15 秒内未收到 pong,连接将被视为死连接并重新连接。
|
|
188
|
+
|
|
189
|
+
## 架构
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
src/
|
|
193
|
+
├── index.ts # 插件入口点
|
|
194
|
+
├── channel.ts # ChannelPlugin 实现(5 个适配器)
|
|
195
|
+
├── ws-client.ts # 带重连逻辑的 WebSocket 客户端
|
|
196
|
+
├── plugin-sdk.ts # OpenClaw SDK 类型
|
|
197
|
+
├── types.ts # 插件特定类型
|
|
198
|
+
└── shared/
|
|
199
|
+
├── constants.ts # 配置常量
|
|
200
|
+
├── errors.ts # 自定义错误类
|
|
201
|
+
├── utils.ts # 工具函数
|
|
202
|
+
└── logger.ts # 日志包装器
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 开发
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# 安装依赖
|
|
209
|
+
pnpm install
|
|
210
|
+
|
|
211
|
+
# 构建
|
|
212
|
+
pnpm build
|
|
213
|
+
|
|
214
|
+
# 监听模式
|
|
215
|
+
pnpm dev
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## 故障排除
|
|
219
|
+
|
|
220
|
+
### 连接问题
|
|
221
|
+
|
|
222
|
+
**问题:** WebSocket 连接失败
|
|
223
|
+
- 检查 `wsUrl` 是否正确且可访问
|
|
224
|
+
- 验证防火墙/网络是否允许 WebSocket 连接
|
|
225
|
+
- 检查服务器日志中的连接错误
|
|
226
|
+
|
|
227
|
+
**问题:** 认证失败
|
|
228
|
+
- 验证 `authToken` 是否正确
|
|
229
|
+
- 检查服务器认证逻辑
|
|
230
|
+
- 查看服务器日志中的认证错误
|
|
231
|
+
|
|
232
|
+
### UUID 冲突
|
|
233
|
+
|
|
234
|
+
**问题:** "UUID 冲突" 错误
|
|
235
|
+
- 每个 OpenClaw 实例必须有唯一的 `uuid`
|
|
236
|
+
- 停止使用相同 UUID 的其他实例
|
|
237
|
+
- 或为每个实例配置不同的 UUID
|
|
238
|
+
|
|
239
|
+
### 消息传递
|
|
240
|
+
|
|
241
|
+
**问题:** 消息未被传递
|
|
242
|
+
- 检查 WebSocket 连接状态
|
|
243
|
+
- 验证 `targetUserId` 是否正确
|
|
244
|
+
- 检查消息队列(最多 100 条消息)
|
|
245
|
+
- 查看服务器日志中的消息处理错误
|
|
246
|
+
|
|
247
|
+
## 许可证
|
|
248
|
+
|
|
249
|
+
MIT
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ChannelPlugin } from './plugin-sdk.js';
|
|
2
|
+
import type { CarysCloudIMAccount } from './types.js';
|
|
3
|
+
import { WebSocketClient } from './ws-client.js';
|
|
4
|
+
declare class WSClientManager {
|
|
5
|
+
private clients;
|
|
6
|
+
get(accountId: string): WebSocketClient | undefined;
|
|
7
|
+
set(accountId: string, client: WebSocketClient): Promise<void>;
|
|
8
|
+
destroyClient(accountId: string): Promise<void>;
|
|
9
|
+
destroyAll(): Promise<void>;
|
|
10
|
+
has(accountId: string): boolean;
|
|
11
|
+
}
|
|
12
|
+
declare const wsClientManager: WSClientManager;
|
|
13
|
+
export declare const caryscloudImChannel: ChannelPlugin<CarysCloudIMAccount>;
|
|
14
|
+
export { wsClientManager };
|
|
15
|
+
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EACV,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKjD,cAAM,eAAe;IACnB,OAAO,CAAC,OAAO,CAAsC;IAErD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI7C,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAGhC;AAED,QAAA,MAAM,eAAe,iBAAwB,CAAC;AAE9C,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,mBAAmB,CA2XlE,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/channel.js
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { WebSocketClient } from './ws-client.js';
|
|
2
|
+
import { generateUuidFromDeviceId } from './shared/utils.js';
|
|
3
|
+
import { ConnectionError } from './shared/errors.js';
|
|
4
|
+
import { DEFAULT_AVATAR_URL } from './shared/constants.js';
|
|
5
|
+
class WSClientManager {
|
|
6
|
+
clients = new Map();
|
|
7
|
+
get(accountId) {
|
|
8
|
+
return this.clients.get(accountId);
|
|
9
|
+
}
|
|
10
|
+
async set(accountId, client) {
|
|
11
|
+
const existing = this.clients.get(accountId);
|
|
12
|
+
if (existing) {
|
|
13
|
+
await this.destroyClient(accountId);
|
|
14
|
+
}
|
|
15
|
+
this.clients.set(accountId, client);
|
|
16
|
+
}
|
|
17
|
+
async destroyClient(accountId) {
|
|
18
|
+
const client = this.clients.get(accountId);
|
|
19
|
+
if (client) {
|
|
20
|
+
await client.destroy();
|
|
21
|
+
this.clients.delete(accountId);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async destroyAll() {
|
|
25
|
+
for (const accountId of this.clients.keys()) {
|
|
26
|
+
await this.destroyClient(accountId);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
has(accountId) {
|
|
30
|
+
return this.clients.has(accountId);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const wsClientManager = new WSClientManager();
|
|
34
|
+
export const caryscloudImChannel = {
|
|
35
|
+
id: 'caryscloud-im',
|
|
36
|
+
meta: {
|
|
37
|
+
id: 'caryscloud-im',
|
|
38
|
+
label: 'CarysCloud IM',
|
|
39
|
+
selectionLabel: 'CarysCloud IM',
|
|
40
|
+
docsPath: '/channels/caryscloud-im',
|
|
41
|
+
blurb: 'Connect via WebSocket (wss://)',
|
|
42
|
+
aliases: ['caryscloud', 'caryscloud-im'],
|
|
43
|
+
},
|
|
44
|
+
capabilities: {
|
|
45
|
+
chatTypes: ['direct', 'group'],
|
|
46
|
+
media: true,
|
|
47
|
+
threads: false,
|
|
48
|
+
},
|
|
49
|
+
config: {
|
|
50
|
+
listAccountIds: (cfg) => {
|
|
51
|
+
return Object.keys(cfg.channels?.['caryscloud-im']?.accounts ?? {});
|
|
52
|
+
},
|
|
53
|
+
resolveAccount: (cfg, accountId) => {
|
|
54
|
+
const id = accountId ?? 'default';
|
|
55
|
+
const section = cfg.channels?.['caryscloud-im']?.accounts?.[id];
|
|
56
|
+
return {
|
|
57
|
+
accountId: id,
|
|
58
|
+
uuid: section?.uuid ?? '',
|
|
59
|
+
name: section?.name,
|
|
60
|
+
avatarUrl: section?.avatarUrl ?? DEFAULT_AVATAR_URL,
|
|
61
|
+
targetUserId: section?.targetUserId ?? '',
|
|
62
|
+
wsUrl: section?.wsUrl ?? '',
|
|
63
|
+
authToken: section?.authToken,
|
|
64
|
+
enabled: section?.enabled ?? true,
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
isConfigured: (account) => {
|
|
68
|
+
return Boolean(account.targetUserId?.trim() && account.wsUrl?.trim());
|
|
69
|
+
},
|
|
70
|
+
describeAccount: (account) => ({
|
|
71
|
+
accountId: account.accountId,
|
|
72
|
+
name: account.name ?? account.uuid ?? account.accountId,
|
|
73
|
+
enabled: account.enabled,
|
|
74
|
+
configured: Boolean(account.targetUserId?.trim() && account.wsUrl?.trim()),
|
|
75
|
+
}),
|
|
76
|
+
},
|
|
77
|
+
outbound: {
|
|
78
|
+
deliveryMode: 'direct',
|
|
79
|
+
textChunkLimit: 4096,
|
|
80
|
+
sendText: async (ctx) => {
|
|
81
|
+
const { cfg, to, text, accountId } = ctx;
|
|
82
|
+
const account = caryscloudImChannel.config.resolveAccount(cfg, accountId);
|
|
83
|
+
if (!account.targetUserId || !account.wsUrl) {
|
|
84
|
+
return {
|
|
85
|
+
ok: false,
|
|
86
|
+
error: new ConnectionError('CarysCloud IM account not configured (missing targetUserId or wsUrl)'),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const client = wsClientManager.get(account.accountId);
|
|
90
|
+
if (!client) {
|
|
91
|
+
return {
|
|
92
|
+
ok: false,
|
|
93
|
+
error: new ConnectionError(`CarysCloud IM client not initialized for account ${account.accountId}`),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (!client.getIsReady()) {
|
|
97
|
+
if (client.isInConflict()) {
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
error: new ConnectionError(`CarysCloud IM client in conflict state. UUID ${client.getUuid()} is in use on another device.`),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
error: new ConnectionError('CarysCloud IM client not ready'),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
const targetUserId = to || account.targetUserId;
|
|
110
|
+
const messageId = await client.sendTextMessage(targetUserId, text);
|
|
111
|
+
return {
|
|
112
|
+
ok: true,
|
|
113
|
+
messageId: messageId,
|
|
114
|
+
timestamp: Date.now(),
|
|
115
|
+
type: 'text',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
return {
|
|
120
|
+
ok: false,
|
|
121
|
+
error: error instanceof Error ? error : new ConnectionError(String(error)),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
sendMedia: async (ctx) => {
|
|
126
|
+
const { cfg, to, mediaUrl, accountId } = ctx;
|
|
127
|
+
const account = caryscloudImChannel.config.resolveAccount(cfg, accountId);
|
|
128
|
+
if (!account.targetUserId || !account.wsUrl) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
error: new ConnectionError('CarysCloud IM account not configured'),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const client = wsClientManager.get(account.accountId);
|
|
135
|
+
if (!client) {
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
error: new ConnectionError(`CarysCloud IM client not initialized for account ${account.accountId}`),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (!client.getIsReady()) {
|
|
142
|
+
if (client.isInConflict()) {
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
error: new ConnectionError(`CarysCloud IM client in conflict state. UUID ${client.getUuid()} is in use on another device.`),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
ok: false,
|
|
150
|
+
error: new ConnectionError('CarysCloud IM client not ready'),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch(mediaUrl);
|
|
155
|
+
const blob = await response.blob();
|
|
156
|
+
const file = new File([blob], 'media', { type: blob.type });
|
|
157
|
+
const targetUserId = to || account.targetUserId;
|
|
158
|
+
let messageId;
|
|
159
|
+
if (blob.type.startsWith('image/')) {
|
|
160
|
+
messageId = await client.sendImageMessage(targetUserId, file);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
messageId = await client.sendFileMessage(targetUserId, file);
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
ok: true,
|
|
167
|
+
messageId: messageId,
|
|
168
|
+
timestamp: Date.now(),
|
|
169
|
+
type: 'media',
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return {
|
|
174
|
+
ok: false,
|
|
175
|
+
error: error instanceof Error ? error : new ConnectionError(String(error)),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
gateway: {
|
|
181
|
+
registerHandlers: async ({ account, runtime, logger }) => {
|
|
182
|
+
logger.info(`[CarysCloud IM] gateway.registerHandlers called for account: ${account.accountId}`);
|
|
183
|
+
const client = wsClientManager.get(account.accountId);
|
|
184
|
+
if (!client) {
|
|
185
|
+
logger.error(`[CarysCloud IM] Client not found for account ${account.accountId}`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (client.isInConflict()) {
|
|
189
|
+
logger.error(`[CarysCloud IM] Client in conflict state for account ${account.accountId}`);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (!client.getIsReady()) {
|
|
193
|
+
logger.warn(`[CarysCloud IM] Client not ready yet for account ${account.accountId}`);
|
|
194
|
+
}
|
|
195
|
+
client.onMessage(async (message) => {
|
|
196
|
+
try {
|
|
197
|
+
if (message.type === 'SYSTEM_CONFLICT') {
|
|
198
|
+
logger.error(`[CarysCloud IM] Multi-device conflict detected: ${message.payload.message}`);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
let text = '';
|
|
202
|
+
let mediaUrl;
|
|
203
|
+
switch (message.type) {
|
|
204
|
+
case 'text':
|
|
205
|
+
text = message.text ?? '';
|
|
206
|
+
break;
|
|
207
|
+
case 'image':
|
|
208
|
+
text = '[Image]';
|
|
209
|
+
mediaUrl = message.payload?.url || message.mediaUrl;
|
|
210
|
+
break;
|
|
211
|
+
case 'file':
|
|
212
|
+
text = `[File: ${message.payload?.filename ?? 'unknown'}]`;
|
|
213
|
+
mediaUrl = message.payload?.url || message.mediaUrl;
|
|
214
|
+
break;
|
|
215
|
+
default:
|
|
216
|
+
text = `[Unsupported message type: ${message.type}]`;
|
|
217
|
+
}
|
|
218
|
+
const chatType = message.conversationType === 'group' ? 'group' : 'direct';
|
|
219
|
+
await runtime.dispatchInboundMessage({
|
|
220
|
+
channel: 'caryscloud-im',
|
|
221
|
+
accountId: account.accountId,
|
|
222
|
+
from: message.from,
|
|
223
|
+
to: message.to,
|
|
224
|
+
text: text,
|
|
225
|
+
mediaUrl: mediaUrl,
|
|
226
|
+
messageId: message.messageId || `msg_${Date.now()}`,
|
|
227
|
+
timestamp: message.timestamp || Date.now(),
|
|
228
|
+
conversationType: chatType,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
logger.error(`[CarysCloud IM] Error handling message: ${error}`);
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
logger.info(`[CarysCloud IM] Message handlers registered for account ${account.accountId}`);
|
|
236
|
+
},
|
|
237
|
+
},
|
|
238
|
+
status: {
|
|
239
|
+
probeAccount: async ({ account, timeoutMs }) => {
|
|
240
|
+
const start = Date.now();
|
|
241
|
+
if (!account.targetUserId || !account.wsUrl) {
|
|
242
|
+
return {
|
|
243
|
+
ok: false,
|
|
244
|
+
latencyMs: 0,
|
|
245
|
+
timestamp: Date.now(),
|
|
246
|
+
error: 'Account not configured (missing targetUserId or wsUrl)',
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const client = wsClientManager.get(account.accountId);
|
|
250
|
+
if (!client) {
|
|
251
|
+
return {
|
|
252
|
+
ok: false,
|
|
253
|
+
latencyMs: Date.now() - start,
|
|
254
|
+
timestamp: Date.now(),
|
|
255
|
+
error: 'CarysCloud IM client not initialized',
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
if (client.isInConflict()) {
|
|
259
|
+
return {
|
|
260
|
+
ok: false,
|
|
261
|
+
latencyMs: Date.now() - start,
|
|
262
|
+
timestamp: Date.now(),
|
|
263
|
+
error: `CarysCloud IM client in conflict state. UUID ${client.getUuid()} is in use on another device.`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
ok: client.getIsReady(),
|
|
268
|
+
latencyMs: Date.now() - start,
|
|
269
|
+
timestamp: Date.now(),
|
|
270
|
+
};
|
|
271
|
+
},
|
|
272
|
+
collectStatusIssues: (accounts) => {
|
|
273
|
+
const issues = [];
|
|
274
|
+
for (const account of accounts) {
|
|
275
|
+
if (!account.configured) {
|
|
276
|
+
issues.push({
|
|
277
|
+
level: 'error',
|
|
278
|
+
message: `Account "${account.accountId}" missing targetUserId or wsUrl`,
|
|
279
|
+
accountId: account.accountId,
|
|
280
|
+
});
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const client = wsClientManager.get(account.accountId);
|
|
284
|
+
if (!client) {
|
|
285
|
+
issues.push({
|
|
286
|
+
level: 'warning',
|
|
287
|
+
message: `Account "${account.accountId}" WebSocket client not initialized`,
|
|
288
|
+
accountId: account.accountId,
|
|
289
|
+
});
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (client.isInConflict()) {
|
|
293
|
+
issues.push({
|
|
294
|
+
level: 'error',
|
|
295
|
+
message: `Account "${account.accountId}" in multi-device conflict. UUID ${client.getUuid()} is in use on another device.`,
|
|
296
|
+
accountId: account.accountId,
|
|
297
|
+
});
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
if (!client.getIsReady()) {
|
|
301
|
+
issues.push({
|
|
302
|
+
level: 'warning',
|
|
303
|
+
message: `Account "${account.accountId}" WebSocket client not ready`,
|
|
304
|
+
accountId: account.accountId,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return issues;
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
lifecycle: {
|
|
312
|
+
onAccountStart: async ({ account, logger }) => {
|
|
313
|
+
logger.info(`[CarysCloud IM] onAccountStart called for account: ${account.accountId}`);
|
|
314
|
+
logger.info(`[CarysCloud IM] Config: uuid=${account.uuid || '(auto-generate)'}, wsUrl=${account.wsUrl}`);
|
|
315
|
+
const existingClient = wsClientManager.get(account.accountId);
|
|
316
|
+
if (existingClient) {
|
|
317
|
+
if (existingClient.isInConflict()) {
|
|
318
|
+
logger.error(`[CarysCloud IM] Existing client in conflict state. Destroying...`);
|
|
319
|
+
await wsClientManager.destroyClient(account.accountId);
|
|
320
|
+
}
|
|
321
|
+
else if (existingClient.getIsReady()) {
|
|
322
|
+
logger.info(`[CarysCloud IM] Client already initialized and ready, skipping`);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
logger.warn(`[CarysCloud IM] Client exists but not ready, reinitializing...`);
|
|
327
|
+
await wsClientManager.destroyClient(account.accountId);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
let effectiveUuid = account.uuid;
|
|
331
|
+
if (!effectiveUuid || effectiveUuid.trim() === '') {
|
|
332
|
+
logger.info(`[CarysCloud IM] Generating UUID from OpenClaw device ID...`);
|
|
333
|
+
effectiveUuid = await generateUuidFromDeviceId();
|
|
334
|
+
logger.info(`[CarysCloud IM] Generated UUID: ${effectiveUuid}`);
|
|
335
|
+
account.uuid = effectiveUuid;
|
|
336
|
+
}
|
|
337
|
+
try {
|
|
338
|
+
logger.info(`[CarysCloud IM] Initializing CarysCloud IM client...`);
|
|
339
|
+
const client = new WebSocketClient({
|
|
340
|
+
wsUrl: account.wsUrl,
|
|
341
|
+
uuid: effectiveUuid,
|
|
342
|
+
authToken: account.authToken,
|
|
343
|
+
}, logger);
|
|
344
|
+
await client.initialize();
|
|
345
|
+
await wsClientManager.set(account.accountId, client);
|
|
346
|
+
logger.info(`[CarysCloud IM] Client stored for account ${account.accountId}`);
|
|
347
|
+
logger.info(`[CarysCloud IM] ✅ Account ${account.accountId} started successfully`);
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
logger.error(`[CarysCloud IM] ❌ Failed to start account ${account.accountId}:`);
|
|
351
|
+
logger.error(`[CarysCloud IM] Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
352
|
+
throw error;
|
|
353
|
+
}
|
|
354
|
+
},
|
|
355
|
+
onAccountStop: async ({ account, logger }) => {
|
|
356
|
+
logger.info(`[CarysCloud IM] Stopping account ${account.accountId}...`);
|
|
357
|
+
await wsClientManager.destroyClient(account.accountId);
|
|
358
|
+
logger.info(`[CarysCloud IM] Account ${account.accountId} stopped`);
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
export { wsClientManager };
|
|
363
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { OpenClawPluginApi } from './plugin-sdk.js';
|
|
2
|
+
declare const plugin: {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
configSchema: any;
|
|
7
|
+
register(api: OpenClawPluginApi): Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
export default plugin;
|
|
10
|
+
export { WebSocketClient } from './ws-client.js';
|
|
11
|
+
export { caryscloudImChannel } from './channel.js';
|
|
12
|
+
export type { CarysCloudIMAccount, CarysCloudIMConfig, CarysCloudIMMessage } from './types.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD,QAAA,MAAM,MAAM;;;;;kBAMU,iBAAiB;CAUtC,CAAC;AAEF,eAAe,MAAM,CAAC;AAEtB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|