adp-openclaw 0.0.2
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/DESIGN.md +733 -0
- package/README.md +70 -0
- package/USAGE.md +910 -0
- package/WEBSOCKET_PROTOCOL.md +506 -0
- package/index.ts +17 -0
- package/openclaw.plugin.json +22 -0
- package/package.json +26 -0
- package/server/.claude/settings.local.json +16 -0
- package/server/go.mod +5 -0
- package/server/main.go +786 -0
- package/src/channel.ts +245 -0
- package/src/config-schema.ts +8 -0
- package/src/monitor.ts +325 -0
- package/src/runtime.ts +15 -0
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
# ADP-OpenCraw WebSocket ๅ่ฎฎๆๆกฃ
|
|
2
|
+
|
|
3
|
+
## ๐ ๆฆ่ฟฐ
|
|
4
|
+
|
|
5
|
+
ๆฌๆๆกฃๆ่ฟฐไบ adp-opencraw ้กน็ฎไธญๆไปถ็ซฏ๏ผTypeScript๏ผไธ Go Server ไน้ด็ WebSocket ้ไฟกๅ่ฎฎๅ Key ้ช่ฏๆบๅถใ
|
|
6
|
+
|
|
7
|
+
## ๐๏ธ ๆถๆๆฆ่ง
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
|
|
11
|
+
โ โ WebSocket (ๅๅ้ไฟก) โ โ
|
|
12
|
+
โ ๆไปถ็ซฏ โ โโโโโโโโโโโโโโโโโโโโโโถ โ Go Server โ
|
|
13
|
+
โ (TypeScript) โ โ โ
|
|
14
|
+
โ โ โ โ
|
|
15
|
+
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
|
|
16
|
+
โ โ
|
|
17
|
+
โ โ
|
|
18
|
+
โผ โผ
|
|
19
|
+
โโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
|
|
20
|
+
โ OpenClaw โ โ ็จๆทๆถๆฏ โ
|
|
21
|
+
โ Runtime โ โ HTTPๆฅๅฃ โ
|
|
22
|
+
โโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## ๐ Key ้ช่ฏๆต็จ
|
|
28
|
+
|
|
29
|
+
### 1. Token ็ฑปๅ
|
|
30
|
+
|
|
31
|
+
| Token ็ฑปๅ | ็จ้ | ็ๆๆนๅผ | ้ฟๅบฆ |
|
|
32
|
+
|-----------|------|---------|------|
|
|
33
|
+
| **Admin Token** | ็ฎก็ๅๆไฝ๏ผๆณจๅๅฎขๆท็ซฏ๏ผ | ๅฏๅจๆถ็ๆๆ `--admin-token` ๆๅฎ | 64 ๅญ็ฌฆ hex |
|
|
34
|
+
| **Client Token** | ๅฎขๆท็ซฏ WebSocket ่ฎค่ฏ | ๆณจๅๅฎขๆท็ซฏๆถ่ชๅจ็ๆ | 64 ๅญ็ฌฆ hex |
|
|
35
|
+
|
|
36
|
+
### 2. Token ็ๆ็ฎๆณ
|
|
37
|
+
|
|
38
|
+
```go
|
|
39
|
+
// ็ๆ 32 ๅญ่้ๆบๆฐ๏ผ่ฝฌๆขไธบ 64 ๅญ็ฌฆ็ๅๅ
ญ่ฟๅถๅญ็ฌฆไธฒ
|
|
40
|
+
func generateToken() string {
|
|
41
|
+
bytes := make([]byte, 32)
|
|
42
|
+
rand.Read(bytes)
|
|
43
|
+
return hex.EncodeToString(bytes)
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 3. WebSocket ่ฎค่ฏๆต็จ
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
โโโโโโโโโโโโ โโโโโโโโโโโโ
|
|
51
|
+
โ Client โ โ Server โ
|
|
52
|
+
โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ
|
|
53
|
+
โ โ
|
|
54
|
+
โ 1. ๅปบ็ซ WebSocket ่ฟๆฅ โ
|
|
55
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโถ โ
|
|
56
|
+
โ โ
|
|
57
|
+
โ 2. ๅ้ Auth ๆถๆฏ (30็ง่ถ
ๆถ) โ
|
|
58
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโถ โ
|
|
59
|
+
โ { โ
|
|
60
|
+
โ type: "auth", โ
|
|
61
|
+
โ payload: { โ
|
|
62
|
+
โ token: "client_api_token", โ
|
|
63
|
+
โ nonce: "random_nonce", โ 3. ้ช่ฏ Token
|
|
64
|
+
โ signature: "hmac_sha256" โ ้ช่ฏ็ญพๅ
|
|
65
|
+
โ } โ
|
|
66
|
+
โ } โ
|
|
67
|
+
โ โ
|
|
68
|
+
โ 4. ่ฟๅ่ฎค่ฏ็ปๆ โ
|
|
69
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
|
70
|
+
โ { โ
|
|
71
|
+
โ type: "auth_result", โ
|
|
72
|
+
โ payload: { โ
|
|
73
|
+
โ success: true, โ
|
|
74
|
+
โ clientId: "client-xxx", โ
|
|
75
|
+
โ message: "Authentication ok" โ
|
|
76
|
+
โ } โ
|
|
77
|
+
โ } โ
|
|
78
|
+
โ โ
|
|
79
|
+
โ 5. ๅผๅงๅๅๆถๆฏ้ไฟก โ
|
|
80
|
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโถ โ
|
|
81
|
+
โ โ
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 4. ็ญพๅ้ช่ฏ๏ผๅฏ้ๅขๅผบๅฎๅ
จ๏ผ
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// ๅฎขๆท็ซฏ็ๆ็ญพๅ
|
|
88
|
+
function generateSignature(token: string, nonce: string): string {
|
|
89
|
+
return crypto.createHash("sha256")
|
|
90
|
+
.update(`${token}:${nonce}`)
|
|
91
|
+
.digest("hex");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ็คบไพ
|
|
95
|
+
const token = "92527c1a...";
|
|
96
|
+
const nonce = "abc123def456";
|
|
97
|
+
const signature = sha256(token + ":" + nonce);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```go
|
|
101
|
+
// ๆๅก็ซฏ้ช่ฏ็ญพๅ
|
|
102
|
+
func verifySignature(token, nonce, signature string) bool {
|
|
103
|
+
h := sha256.New()
|
|
104
|
+
h.Write([]byte(token + ":" + nonce))
|
|
105
|
+
expected := hex.EncodeToString(h.Sum(nil))
|
|
106
|
+
return expected == signature
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## ๐ก WebSocket ๆถๆฏๅ่ฎฎ
|
|
113
|
+
|
|
114
|
+
### ๅบ็กๆถๆฏๆ ผๅผ
|
|
115
|
+
|
|
116
|
+
ๆๆ WebSocket ๆถๆฏ้ฝ้ตๅพช็ปไธ็ JSON ๆ ผๅผ๏ผ
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
interface WSMessage {
|
|
120
|
+
type: string; // ๆถๆฏ็ฑปๅ
|
|
121
|
+
requestId?: string; // ่ฏทๆฑID๏ผ็จไบๅ
ณ่่ฏทๆฑ/ๅๅบ๏ผ
|
|
122
|
+
payload?: any; // ๆถๆฏ่ฝฝ่ท
|
|
123
|
+
timestamp: number; // Unixๆฏซ็งๆถ้ดๆณ
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### ๆถๆฏ็ฑปๅไธ่ง
|
|
128
|
+
|
|
129
|
+
| ็ฑปๅ | ๆนๅ | ่ฏดๆ |
|
|
130
|
+
|------|------|------|
|
|
131
|
+
| `auth` | Client โ Server | ่ฎค่ฏ่ฏทๆฑ |
|
|
132
|
+
| `auth_result` | Server โ Client | ่ฎค่ฏ็ปๆ |
|
|
133
|
+
| `ping` | Client โ Server | ๅฟ่ทณ่ฏทๆฑ |
|
|
134
|
+
| `pong` | Server โ Client | ๅฟ่ทณๅๅบ |
|
|
135
|
+
| `inbound` | Server โ Client | ็จๆทๆถๆฏๆจ้ |
|
|
136
|
+
| `outbound` | Client โ Server | Bot ๅๅคๆถๆฏ |
|
|
137
|
+
| `ack` | Server โ Client | ๆถๆฏ็กฎ่ฎค |
|
|
138
|
+
| `error` | Server โ Client | ้่ฏฏๆถๆฏ |
|
|
139
|
+
| `conv_history` | Client โ Server | ่ฏทๆฑไผ่ฏๅๅฒ |
|
|
140
|
+
| `conv_response` | Server โ Client | ไผ่ฏๅๅฒๅๅบ |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### ่ฏฆ็ปๆถๆฏๆ ผๅผ
|
|
145
|
+
|
|
146
|
+
#### 1. ่ฎค่ฏ่ฏทๆฑ (auth)
|
|
147
|
+
|
|
148
|
+
**ๆนๅ**: Client โ Server
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"type": "auth",
|
|
153
|
+
"requestId": "req-1706951234567-abc123",
|
|
154
|
+
"payload": {
|
|
155
|
+
"token": "92527c1a861bb50bd1acc47180ef317369e97529c7a5491b2bc67839992cfbb8",
|
|
156
|
+
"nonce": "a1b2c3d4e5f6",
|
|
157
|
+
"signature": "sha256_hash_of_token_colon_nonce"
|
|
158
|
+
},
|
|
159
|
+
"timestamp": 1706951234567
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
| ๅญๆฎต | ็ฑปๅ | ๅฟ
ๅกซ | ่ฏดๆ |
|
|
164
|
+
|------|------|------|------|
|
|
165
|
+
| `token` | string | โ
| ๅฎขๆท็ซฏ API Token |
|
|
166
|
+
| `nonce` | string | โ | ้ๆบๆฐ๏ผ็จไบ็ญพๅ๏ผ |
|
|
167
|
+
| `signature` | string | โ | HMAC-SHA256 ็ญพๅ |
|
|
168
|
+
|
|
169
|
+
#### 2. ่ฎค่ฏ็ปๆ (auth_result)
|
|
170
|
+
|
|
171
|
+
**ๆนๅ**: Server โ Client
|
|
172
|
+
|
|
173
|
+
```json
|
|
174
|
+
{
|
|
175
|
+
"type": "auth_result",
|
|
176
|
+
"requestId": "req-1706951234567-abc123",
|
|
177
|
+
"payload": {
|
|
178
|
+
"success": true,
|
|
179
|
+
"clientId": "client-abc123def456",
|
|
180
|
+
"message": "Authentication successful"
|
|
181
|
+
},
|
|
182
|
+
"timestamp": 1706951234890
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
| ๅญๆฎต | ็ฑปๅ | ่ฏดๆ |
|
|
187
|
+
|------|------|------|
|
|
188
|
+
| `success` | boolean | ่ฎค่ฏๆฏๅฆๆๅ |
|
|
189
|
+
| `clientId` | string | ๅ้
็ๅฎขๆท็ซฏID |
|
|
190
|
+
| `message` | string | ็ถๆๆถๆฏ |
|
|
191
|
+
|
|
192
|
+
#### 3. ๅฟ่ทณ (ping/pong)
|
|
193
|
+
|
|
194
|
+
**ping** (Client โ Server):
|
|
195
|
+
```json
|
|
196
|
+
{
|
|
197
|
+
"type": "ping",
|
|
198
|
+
"requestId": "req-1706951234567-xyz",
|
|
199
|
+
"timestamp": 1706951234567
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
**pong** (Server โ Client):
|
|
204
|
+
```json
|
|
205
|
+
{
|
|
206
|
+
"type": "pong",
|
|
207
|
+
"requestId": "req-1706951234567-xyz",
|
|
208
|
+
"timestamp": 1706951234890
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
> ๐ก ๅปบ่ฎฎๅฟ่ทณ้ด้๏ผ25-30 ็ง
|
|
213
|
+
|
|
214
|
+
#### 4. ็จๆทๆถๆฏๆจ้ (inbound)
|
|
215
|
+
|
|
216
|
+
**ๆนๅ**: Server โ Client
|
|
217
|
+
|
|
218
|
+
ๅฝๆ็จๆทๅ้ๆถๆฏๆถ๏ผๆๅกๅจๅฎๆถๆจ้็ปๅฏนๅบๅฎขๆท็ซฏ๏ผ
|
|
219
|
+
|
|
220
|
+
```json
|
|
221
|
+
{
|
|
222
|
+
"type": "inbound",
|
|
223
|
+
"payload": {
|
|
224
|
+
"id": "msg-1",
|
|
225
|
+
"conversationId": "conv-abc123def456",
|
|
226
|
+
"clientId": "client-xyz789",
|
|
227
|
+
"from": "user123",
|
|
228
|
+
"to": "bot",
|
|
229
|
+
"text": "Hello, how are you?",
|
|
230
|
+
"timestamp": 1706951234567
|
|
231
|
+
},
|
|
232
|
+
"timestamp": 1706951234567
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
#### 5. Bot ๅๅคๆถๆฏ (outbound)
|
|
237
|
+
|
|
238
|
+
**ๆนๅ**: Client โ Server
|
|
239
|
+
|
|
240
|
+
```json
|
|
241
|
+
{
|
|
242
|
+
"type": "outbound",
|
|
243
|
+
"requestId": "req-1706951235000-reply",
|
|
244
|
+
"payload": {
|
|
245
|
+
"to": "user123",
|
|
246
|
+
"text": "I'm doing great! How can I help you today?",
|
|
247
|
+
"conversationId": "conv-abc123def456"
|
|
248
|
+
},
|
|
249
|
+
"timestamp": 1706951235000
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
#### 6. ๆถๆฏ็กฎ่ฎค (ack)
|
|
254
|
+
|
|
255
|
+
**ๆนๅ**: Server โ Client
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{
|
|
259
|
+
"type": "ack",
|
|
260
|
+
"requestId": "req-1706951235000-reply",
|
|
261
|
+
"payload": {
|
|
262
|
+
"ok": true,
|
|
263
|
+
"message": {
|
|
264
|
+
"id": "msg-2",
|
|
265
|
+
"conversationId": "conv-abc123def456",
|
|
266
|
+
"clientId": "client-xyz789",
|
|
267
|
+
"from": "bot",
|
|
268
|
+
"to": "user123",
|
|
269
|
+
"text": "I'm doing great! How can I help you today?",
|
|
270
|
+
"timestamp": 1706951235123
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
"timestamp": 1706951235123
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
#### 7. ้่ฏฏๆถๆฏ (error)
|
|
278
|
+
|
|
279
|
+
**ๆนๅ**: Server โ Client
|
|
280
|
+
|
|
281
|
+
```json
|
|
282
|
+
{
|
|
283
|
+
"type": "error",
|
|
284
|
+
"requestId": "req-xxx",
|
|
285
|
+
"payload": {
|
|
286
|
+
"error": "invalid_payload",
|
|
287
|
+
"message": "Missing required field: conversationId"
|
|
288
|
+
},
|
|
289
|
+
"timestamp": 1706951235000
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
ๅธธ่ง้่ฏฏ็ ๏ผ
|
|
294
|
+
|
|
295
|
+
| ้่ฏฏ็ | ่ฏดๆ |
|
|
296
|
+
|--------|------|
|
|
297
|
+
| `auth_timeout` | ่ฎค่ฏ่ถ
ๆถ๏ผ30็งๅ
ๆชๅ้auth๏ผ |
|
|
298
|
+
| `invalid_auth` | ้ฆๆกๆถๆฏไธๆฏauth็ฑปๅ |
|
|
299
|
+
| `invalid_token` | Token ๆ ๆ |
|
|
300
|
+
| `invalid_signature` | ็ญพๅ้ช่ฏๅคฑ่ดฅ |
|
|
301
|
+
| `invalid_payload` | ๆถๆฏ่ฝฝ่ทๆ ผๅผ้่ฏฏ |
|
|
302
|
+
| `not_found` | ่ตๆบไธๅญๅจ |
|
|
303
|
+
|
|
304
|
+
#### 8. ไผ่ฏๅๅฒ่ฏทๆฑ/ๅๅบ
|
|
305
|
+
|
|
306
|
+
**่ฏทๆฑ** (Client โ Server):
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"type": "conv_history",
|
|
310
|
+
"requestId": "req-1706951236000-hist",
|
|
311
|
+
"payload": {
|
|
312
|
+
"conversationId": "conv-abc123def456"
|
|
313
|
+
},
|
|
314
|
+
"timestamp": 1706951236000
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**ๅๅบ** (Server โ Client):
|
|
319
|
+
```json
|
|
320
|
+
{
|
|
321
|
+
"type": "conv_response",
|
|
322
|
+
"requestId": "req-1706951236000-hist",
|
|
323
|
+
"payload": {
|
|
324
|
+
"id": "conv-abc123def456",
|
|
325
|
+
"userId": "user123",
|
|
326
|
+
"clientId": "client-xyz789",
|
|
327
|
+
"messages": [
|
|
328
|
+
{"id": "msg-1", "from": "user123", "text": "Hello", ...},
|
|
329
|
+
{"id": "msg-2", "from": "bot", "text": "Hi there!", ...}
|
|
330
|
+
],
|
|
331
|
+
"createdAt": 1706951234000,
|
|
332
|
+
"updatedAt": 1706951235123
|
|
333
|
+
},
|
|
334
|
+
"timestamp": 1706951236123
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## ๐ ๆฐๆฎ็ปๆ
|
|
341
|
+
|
|
342
|
+
### Message๏ผๆถๆฏ๏ผ
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
interface Message {
|
|
346
|
+
id: string; // ๆถๆฏID๏ผๆ ผๅผ: "msg-{ๅบๅท}"
|
|
347
|
+
conversationId: string; // ไผ่ฏID๏ผๆ ผๅผ: "conv-{้ๆบhex}"
|
|
348
|
+
clientId: string; // ๅฎขๆท็ซฏID๏ผๆ ผๅผ: "client-{้ๆบhex}"
|
|
349
|
+
from: string; // ๅ้่
|
|
350
|
+
to: string; // ๆฅๆถ่
|
|
351
|
+
text: string; // ๆถๆฏๅ
ๅฎน
|
|
352
|
+
timestamp: number; // Unixๆฏซ็งๆถ้ดๆณ
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Conversation๏ผไผ่ฏ๏ผ
|
|
357
|
+
|
|
358
|
+
```typescript
|
|
359
|
+
interface Conversation {
|
|
360
|
+
id: string; // ไผ่ฏID
|
|
361
|
+
userId: string; // ็จๆทID
|
|
362
|
+
clientId: string; // ๅ้
็ๅฎขๆท็ซฏID
|
|
363
|
+
messages: Message[];
|
|
364
|
+
createdAt: number;
|
|
365
|
+
updatedAt: number;
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## ๐ HTTP API๏ผไฟ็๏ผ
|
|
372
|
+
|
|
373
|
+
ไปฅไธ HTTP ๆฅๅฃไป็ถๅฏ็จ๏ผ
|
|
374
|
+
|
|
375
|
+
### ๅ
ฌๅ
ฑ็ซฏ็น
|
|
376
|
+
|
|
377
|
+
| ๆนๆณ | ่ทฏๅพ | ่ฏดๆ |
|
|
378
|
+
|------|------|------|
|
|
379
|
+
| GET | `/health` | ๅฅๅบทๆฃๆฅ |
|
|
380
|
+
| POST | `/inbound` | ๆจกๆ็จๆทๅ้ๆถๆฏ๏ผไผ้่ฟ WS ๆจ้๏ผ |
|
|
381
|
+
| GET | `/outbox` | ๆฅ็ๅทฒๅ้็ๆถๆฏ |
|
|
382
|
+
|
|
383
|
+
### ็ฎก็็ซฏ็น๏ผ้ Admin Token๏ผ
|
|
384
|
+
|
|
385
|
+
| ๆนๆณ | ่ทฏๅพ | ่ฏดๆ |
|
|
386
|
+
|------|------|------|
|
|
387
|
+
| POST | `/clients` | ๆณจๅๆฐๅฎขๆท็ซฏ |
|
|
388
|
+
| GET | `/clients` | ๅๅบๆๆๅฎขๆท็ซฏ |
|
|
389
|
+
| GET | `/conversations` | ๅๅบๆๆไผ่ฏ |
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## ๐ ๅฎๆด้ไฟกๆต็จ
|
|
394
|
+
|
|
395
|
+
```
|
|
396
|
+
โโโโโโโโโโโโโโโ POST /inbound โโโโโโโโโโโโโโโโ WebSocket โโโโโโโโโโโโโโโ
|
|
397
|
+
โ ็จๆท็ซฏ โ โโโโโโโโโโโโโโโโโโโโโโโถ โ Go Server โ โโโโโโโโโโโโโโโโโโโโถ โ ๆไปถ็ซฏ โ
|
|
398
|
+
โ (ๆต่งๅจ) โ โ โ โ (OpenClaw) โ
|
|
399
|
+
โโโโโโโโโโโโโโโ โ โ โ โ
|
|
400
|
+
โ ๅฎๆถๆจ้ โ โ โ
|
|
401
|
+
โ inbound โ โ ๅค็ๆถๆฏ โ
|
|
402
|
+
โ โ โโโโโโโโโโโโโโโโโโโโ โ โ
|
|
403
|
+
โ โ outbound โ โ
|
|
404
|
+
โ โ โ โ
|
|
405
|
+
โ ่ฟๅ ack โ โโโโโโโโโโโโโโโโโโโโถ โ โ
|
|
406
|
+
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
## ๐ ๏ธ ้
็ฝฎ็คบไพ
|
|
412
|
+
|
|
413
|
+
### ๆไปถ็ซฏ้
็ฝฎ
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
{
|
|
417
|
+
serverUrl: "http://localhost:9876", // ไผ่ชๅจ่ฝฌๆขไธบ ws://localhost:9876/ws
|
|
418
|
+
apiToken: "your_client_token_here",
|
|
419
|
+
pollIntervalMs: 3000 // ไฝไธบ้่ฟๅปถ่ฟไฝฟ็จ
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### ็ฏๅขๅ้
|
|
424
|
+
|
|
425
|
+
```bash
|
|
426
|
+
SIMPLEGO_SERVER_URL=http://localhost:9876
|
|
427
|
+
SIMPLEGO_API_TOKEN=your_client_token
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
## ๐ ๅฏๅจๆๅก
|
|
433
|
+
|
|
434
|
+
### Go Server
|
|
435
|
+
|
|
436
|
+
```bash
|
|
437
|
+
cd server
|
|
438
|
+
|
|
439
|
+
# ๅฎ่ฃ
ไพ่ต
|
|
440
|
+
go mod tidy
|
|
441
|
+
|
|
442
|
+
# ๅฏๅจๆๅก
|
|
443
|
+
go run main.go -port 9876 -admin-token "your_admin_token"
|
|
444
|
+
|
|
445
|
+
# ๅฆๆไธๆๅฎ admin-token๏ผไผ่ชๅจ็ๆๅนถๆๅฐๅฐๆงๅถๅฐ
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### ๆณจๅๅฎขๆท็ซฏ
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
# ไฝฟ็จ admin token ๆณจๅๆฐๅฎขๆท็ซฏ
|
|
452
|
+
curl -X POST http://localhost:9876/clients \
|
|
453
|
+
-H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
|
|
454
|
+
-H "Content-Type: application/json" \
|
|
455
|
+
-d '{"name": "OpenClaw-Client-1"}'
|
|
456
|
+
|
|
457
|
+
# ่ฟๅ็คบไพ๏ผ
|
|
458
|
+
# {
|
|
459
|
+
# "clientId": "client-abc123",
|
|
460
|
+
# "token": "92527c1a861bb50bd1acc47180ef317369e97529c7a5491b2bc67839992cfbb8",
|
|
461
|
+
# "name": "OpenClaw-Client-1"
|
|
462
|
+
# }
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
467
|
+
## ๐ ๆไฝณๅฎ่ทต
|
|
468
|
+
|
|
469
|
+
### 1. ่ฟๆฅ็ฎก็
|
|
470
|
+
|
|
471
|
+
- ่ฟๆฅๆญๅผๅ่ชๅจ้่ฟ๏ผๅปบ่ฎฎๅปถ่ฟ 3-5 ็ง๏ผ
|
|
472
|
+
- ไฝฟ็จๅฟ่ทณไฟๆ่ฟๆฅๆดป่ท๏ผ25-30 ็ง้ด้๏ผ
|
|
473
|
+
- ๅค็่ฎค่ฏ่ถ
ๆถ๏ผ30 ็งๅ
ๅฟ
้กปๅฎๆ่ฎค่ฏ๏ผ
|
|
474
|
+
|
|
475
|
+
### 2. ๅฎๅ
จๅปบ่ฎฎ
|
|
476
|
+
|
|
477
|
+
- ็ไบง็ฏๅขไฝฟ็จ WSS๏ผWebSocket Secure๏ผ
|
|
478
|
+
- ๅฏ็จ็ญพๅ้ช่ฏๅขๅผบๅฎๅ
จๆง
|
|
479
|
+
- ๅฎๆ่ฝฎๆข Token
|
|
480
|
+
|
|
481
|
+
### 3. ้่ฏฏๅค็
|
|
482
|
+
|
|
483
|
+
- ็ๅฌ `error` ็ฑปๅๆถๆฏ
|
|
484
|
+
- ไฝฟ็จ `requestId` ๅ
ณ่่ฏทๆฑๅๅๅบ
|
|
485
|
+
- ่ฎฐๅฝๆๆ้่ฏฏๆฅๅฟ็จไบๆๆฅ
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## ๐ ๆฃๆฅๆธ
ๅ
|
|
490
|
+
|
|
491
|
+
- [ ] Go Server ๅฏๅจๅนถๆๅฐ admin token
|
|
492
|
+
- [ ] ไฝฟ็จ admin token ๆณจๅๅฎขๆท็ซฏ่ทๅ client token
|
|
493
|
+
- [ ] ๆไปถ้
็ฝฎๆญฃ็กฎ็ serverUrl ๅ apiToken
|
|
494
|
+
- [ ] WebSocket ่ฟๆฅๆๅๅปบ็ซ
|
|
495
|
+
- [ ] ่ฎค่ฏๆต็จ้่ฟ
|
|
496
|
+
- [ ] ๅฟ่ทณไฟๆ่ฟๆฅๆดป่ท
|
|
497
|
+
- [ ] ๆถๆฏๆถๅๆญฃๅธธ
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## ๐ ็ๆฌๅๅฒ
|
|
502
|
+
|
|
503
|
+
| ็ๆฌ | ๆฅๆ | ๅๆด |
|
|
504
|
+
|------|------|------|
|
|
505
|
+
| 0.0.2 | 2026-02-05 | ๅ็บงไธบ WebSocket ๅ่ฎฎ |
|
|
506
|
+
| 0.0.1 | - | ๅๅง HTTP ่ฝฎ่ฏข็ๆฌ |
|
package/index.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { OpenClawPluginApi } from "openclaw/plugin-sdk";
|
|
2
|
+
import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
|
|
3
|
+
import { simpleGoPlugin } from "./src/channel.js";
|
|
4
|
+
import { setSimpleGoRuntime } from "./src/runtime.js";
|
|
5
|
+
|
|
6
|
+
const plugin = {
|
|
7
|
+
id: "simplego",
|
|
8
|
+
name: "Simple Go",
|
|
9
|
+
description: "Demo channel plugin backed by a Go HTTP server",
|
|
10
|
+
configSchema: emptyPluginConfigSchema(),
|
|
11
|
+
register(api: OpenClawPluginApi) {
|
|
12
|
+
setSimpleGoRuntime(api.runtime);
|
|
13
|
+
api.registerChannel({ plugin: simpleGoPlugin });
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default plugin;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "simplego",
|
|
3
|
+
"name": "@openclaw/simplego",
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"description": "OpenClaw demo channel plugin (Go HTTP backend)",
|
|
6
|
+
"configSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {},
|
|
9
|
+
"additionalProperties": false
|
|
10
|
+
},
|
|
11
|
+
"extensions": [
|
|
12
|
+
"./index.ts"
|
|
13
|
+
],
|
|
14
|
+
"channel": {
|
|
15
|
+
"id": "simplego",
|
|
16
|
+
"label": "Simple Go",
|
|
17
|
+
"selectionLabel": "Simple Go (demo)",
|
|
18
|
+
"docsPath": "/channels/simplego",
|
|
19
|
+
"blurb": "demo channel backed by a Go HTTP server.",
|
|
20
|
+
"order": 999
|
|
21
|
+
}
|
|
22
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "adp-openclaw",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"description": "OpenClaw demo channel plugin (Go WebSocket backend)",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"ws": "^8.16.0",
|
|
8
|
+
"zod": "^3.22.4"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"@types/ws": "^8.5.10"
|
|
12
|
+
},
|
|
13
|
+
"openclaw": {
|
|
14
|
+
"extensions": [
|
|
15
|
+
"./index.ts"
|
|
16
|
+
],
|
|
17
|
+
"channel": {
|
|
18
|
+
"id": "adp",
|
|
19
|
+
"label": "Simple Go",
|
|
20
|
+
"selectionLabel": "Simple Go (demo)",
|
|
21
|
+
"docsPath": "/channels/adp",
|
|
22
|
+
"blurb": "demo channel backed by a Go HTTP server.",
|
|
23
|
+
"order": 999
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(go run:*)",
|
|
5
|
+
"Bash(apt-get:*)",
|
|
6
|
+
"Bash(apt-get install:*)",
|
|
7
|
+
"Bash(yum install:*)",
|
|
8
|
+
"Bash(go version:*)",
|
|
9
|
+
"Bash(curl -OL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz)",
|
|
10
|
+
"Bash(sudo rm -rf /usr/local/go)",
|
|
11
|
+
"Bash(sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz)",
|
|
12
|
+
"Bash(export PATH=$PATH:/usr/local/go/bin)",
|
|
13
|
+
"Bash(~/.bashrc)"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|