@rowger_go/chatu 0.1.3

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.
Files changed (77) hide show
  1. package/.github/workflows/ci.yml +30 -0
  2. package/.github/workflows/publish.yml +55 -0
  3. package/INSTALL.md +285 -0
  4. package/INSTALL.zh.md +285 -0
  5. package/LICENSE +21 -0
  6. package/README.md +293 -0
  7. package/README.zh.md +293 -0
  8. package/dist/index.d.ts +96 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +1381 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/index.test.d.ts +5 -0
  13. package/dist/index.test.d.ts.map +1 -0
  14. package/dist/index.test.js +334 -0
  15. package/dist/index.test.js.map +1 -0
  16. package/dist/sdk/adapters/cache.d.ts +94 -0
  17. package/dist/sdk/adapters/cache.d.ts.map +1 -0
  18. package/dist/sdk/adapters/cache.js +158 -0
  19. package/dist/sdk/adapters/cache.js.map +1 -0
  20. package/dist/sdk/adapters/cache.test.d.ts +14 -0
  21. package/dist/sdk/adapters/cache.test.d.ts.map +1 -0
  22. package/dist/sdk/adapters/cache.test.js +178 -0
  23. package/dist/sdk/adapters/cache.test.js.map +1 -0
  24. package/dist/sdk/adapters/default.d.ts +24 -0
  25. package/dist/sdk/adapters/default.d.ts.map +1 -0
  26. package/dist/sdk/adapters/default.js +151 -0
  27. package/dist/sdk/adapters/default.js.map +1 -0
  28. package/dist/sdk/adapters/webhub.d.ts +336 -0
  29. package/dist/sdk/adapters/webhub.d.ts.map +1 -0
  30. package/dist/sdk/adapters/webhub.js +663 -0
  31. package/dist/sdk/adapters/webhub.js.map +1 -0
  32. package/dist/sdk/adapters/websocket.d.ts +133 -0
  33. package/dist/sdk/adapters/websocket.d.ts.map +1 -0
  34. package/dist/sdk/adapters/websocket.js +314 -0
  35. package/dist/sdk/adapters/websocket.js.map +1 -0
  36. package/dist/sdk/core/channel.d.ts +104 -0
  37. package/dist/sdk/core/channel.d.ts.map +1 -0
  38. package/dist/sdk/core/channel.js +158 -0
  39. package/dist/sdk/core/channel.js.map +1 -0
  40. package/dist/sdk/index.d.ts +27 -0
  41. package/dist/sdk/index.d.ts.map +1 -0
  42. package/dist/sdk/index.js +33 -0
  43. package/dist/sdk/index.js.map +1 -0
  44. package/dist/sdk/types/adapters.d.ts +128 -0
  45. package/dist/sdk/types/adapters.d.ts.map +1 -0
  46. package/dist/sdk/types/adapters.js +10 -0
  47. package/dist/sdk/types/adapters.js.map +1 -0
  48. package/dist/sdk/types/channel.d.ts +270 -0
  49. package/dist/sdk/types/channel.d.ts.map +1 -0
  50. package/dist/sdk/types/channel.js +36 -0
  51. package/dist/sdk/types/channel.js.map +1 -0
  52. package/docs/channel/01-overview.md +117 -0
  53. package/docs/channel/02-configuration.md +138 -0
  54. package/docs/channel/03-capabilities.md +86 -0
  55. package/docs/channel/04-api-reference.md +394 -0
  56. package/docs/channel/05-message-protocol.md +194 -0
  57. package/docs/channel/06-security.md +83 -0
  58. package/docs/channel/README.md +30 -0
  59. package/docs/sdk/README.md +13 -0
  60. package/docs/sdk/v2026.1.29-v2026.2.19.md +630 -0
  61. package/jest.config.js +19 -0
  62. package/openclaw.plugin.json +113 -0
  63. package/package.json +74 -0
  64. package/run-poll.mjs +209 -0
  65. package/scripts/reload-plugin.sh +78 -0
  66. package/src/index.test.ts +432 -0
  67. package/src/index.ts +1638 -0
  68. package/src/sdk/adapters/cache.test.ts +205 -0
  69. package/src/sdk/adapters/cache.ts +193 -0
  70. package/src/sdk/adapters/default.ts +196 -0
  71. package/src/sdk/adapters/webhub.ts +857 -0
  72. package/src/sdk/adapters/websocket.ts +378 -0
  73. package/src/sdk/core/channel.ts +230 -0
  74. package/src/sdk/index.ts +36 -0
  75. package/src/sdk/types/adapters.ts +169 -0
  76. package/src/sdk/types/channel.ts +346 -0
  77. package/tsconfig.json +31 -0
@@ -0,0 +1,663 @@
1
+ "use strict";
2
+ /******************************************************************
3
+ * Channel SDK - WebHub Adapter with Performance Degradation
4
+ *
5
+ * 支持从高性能到低性能的优雅退化:
6
+ * 1. WebSocket (最高性能) - 实时双向通信
7
+ * 2. Server-Sent Events (SSE) - 单向推送
8
+ * 3. HTTP Polling (最低性能) - 简单轮询
9
+ *
10
+ * URL 从 config.webhubUrl 配置中获取
11
+ *
12
+ * @see https://github.com/chatu-ai/openclaw-web-hub-channel
13
+ ******************************************************************/
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.WebHubAdapterFactory = exports.WebHubAdapter = void 0;
16
+ exports.mapRawToInboundMessage = mapRawToInboundMessage;
17
+ exports.mapChannelSdkMedia = mapChannelSdkMedia;
18
+ exports.createWebHubFactory = createWebHubFactory;
19
+ const channel_1 = require("../types/channel");
20
+ const uuid_1 = require("uuid");
21
+ /**
22
+ * 将 WebHub API 原始消息 JSON 映射为 Channel SDK InboundMessage 格式。
23
+ *
24
+ * 这是跨层映射的唯一位置 (SC-003):
25
+ * - WebHub sender.name → InboundMessage.sender.displayName
26
+ * - WebHub sender.avatar → InboundMessage.sender.avatarUrl
27
+ * - WebHub authorDisplayName (旧字段兼容) → InboundMessage.sender.displayName
28
+ * - WebHub authorId (旧字段兼容) → InboundMessage.sender.id
29
+ * - WebHub replyTo.id → InboundMessage.replyTo.messageId
30
+ * - WebHub replyTo.quoteText → InboundMessage.replyTo.quotedText
31
+ * - WebHub content (string 或 {text}) → InboundMessage.content.text
32
+ * - WebHub createdAt (string) → InboundMessage.timestamp (ms)
33
+ */
34
+ function mapRawToInboundMessage(raw) {
35
+ const msg = raw;
36
+ const rawSender = (msg.sender && typeof msg.sender === 'object'
37
+ ? msg.sender
38
+ : {});
39
+ const rawContent = msg.content;
40
+ const rawMedia = Array.isArray(msg.media) ? msg.media : [];
41
+ const rawReplyTo = msg.replyTo && typeof msg.replyTo === 'object'
42
+ ? msg.replyTo
43
+ : undefined;
44
+ // sender: prefer new-style {id, name, avatar}; fall back to legacy authorId/authorDisplayName
45
+ const senderId = String(rawSender.id ?? msg.authorId ?? '');
46
+ const senderDisplayName = String(rawSender.name ?? rawSender.displayName ?? msg.authorDisplayName ?? '');
47
+ const senderAvatarUrl = rawSender.avatar ??
48
+ rawSender.avatarUrl ??
49
+ undefined;
50
+ // content: new-style string OR legacy {text: ...}
51
+ const contentText = typeof rawContent === 'string'
52
+ ? rawContent
53
+ : String(rawContent?.text ?? '');
54
+ // timestamp: ISO string (createdAt) or numeric
55
+ let ts;
56
+ if (typeof msg.createdAt === 'string') {
57
+ ts = new Date(msg.createdAt).getTime();
58
+ }
59
+ else if (typeof msg.timestamp === 'number') {
60
+ ts = msg.timestamp;
61
+ }
62
+ else {
63
+ ts = Date.now();
64
+ }
65
+ return {
66
+ id: String(msg.id ?? ''),
67
+ channelId: String(msg.channelId ?? ''),
68
+ sender: {
69
+ id: senderId,
70
+ displayName: senderDisplayName,
71
+ avatarUrl: senderAvatarUrl,
72
+ isBot: senderId === 'webhub',
73
+ },
74
+ target: msg.target ?? { type: channel_1.TargetType.USER, id: '' },
75
+ content: {
76
+ text: contentText,
77
+ format: msg.format ?? 'plain',
78
+ },
79
+ media: rawMedia.map((m) => ({
80
+ type: (m.type ?? channel_1.MessageType.FILE),
81
+ url: String(m.url ?? ''),
82
+ mimeType: m.mimeType,
83
+ size: m.size,
84
+ width: m.width,
85
+ height: m.height,
86
+ duration: m.duration,
87
+ thumbnailUrl: m.thumbnailUrl,
88
+ })),
89
+ replyTo: rawReplyTo
90
+ ? {
91
+ messageId: String(rawReplyTo.id ?? ''),
92
+ quotedText: rawReplyTo.quoteText,
93
+ }
94
+ : undefined,
95
+ timestamp: ts,
96
+ metadata: msg.metadata,
97
+ };
98
+ }
99
+ /**
100
+ * 将 Channel SDK Media 对象映射为 WebHub API 可接受的媒体格式。
101
+ *
102
+ * Channel SDK Media 字段名称(thumbnailUrl / width / height)已与 WebHub 对齐;
103
+ * 此函数负责补充 WebHub 要求但 SDK 未提供的 filename 字段(从 url 推断),
104
+ * 是全局唯一的媒体映射位置(SC-003)。
105
+ *
106
+ * @param media - Channel SDK Media 对象
107
+ * @returns WebHub 媒体对象
108
+ */
109
+ function mapChannelSdkMedia(media) {
110
+ // Infer filename from URL path when not explicitly available
111
+ const filename = media.url
112
+ ? media.url.split('/').pop()?.split('?')[0] || undefined
113
+ : undefined;
114
+ return {
115
+ type: media.type,
116
+ url: media.url,
117
+ mimeType: media.mimeType,
118
+ size: media.size,
119
+ width: media.width,
120
+ height: media.height,
121
+ duration: media.duration,
122
+ thumbnailUrl: media.thumbnailUrl,
123
+ filename,
124
+ };
125
+ }
126
+ /**
127
+ * WebHub 适配器
128
+ *
129
+ * 支持三种模式的优雅退化:
130
+ * - WebSocket: 实时双向通信
131
+ * - SSE: 单向推送 + HTTP 发送
132
+ * - Polling: HTTP 轮询
133
+ *
134
+ * URL 从 config.webhubUrl 配置中获取
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * // 配置时设置 webhubUrl
139
+ * const channel = new Channel({
140
+ * config: {
141
+ * channelId: 'wh_ch_xxx',
142
+ * accessToken: 'token_xxx',
143
+ * webhubUrl: 'http://localhost:3000', // 从配置获取
144
+ * }
145
+ * });
146
+ * ```
147
+ */
148
+ class WebHubAdapter {
149
+ /** WebHub URL (从配置获取) */
150
+ get webhubUrl() {
151
+ return this.config.webhubUrl || 'http://localhost:3000';
152
+ }
153
+ /**
154
+ * 创建 WebHub 适配器
155
+ */
156
+ constructor(config) {
157
+ /** 当前状态 [Channel SDK 标准] */
158
+ this._status = 'disconnected';
159
+ /** 实际使用的性能模式 */
160
+ this.currentMode = 'polling';
161
+ /** 消息回调 [Channel SDK 标准] */
162
+ this.messageCallbacks = new Set();
163
+ /** 状态回调 [Channel SDK 标准] */
164
+ this.statusCallbacks = new Set();
165
+ /** 待确认消息 */
166
+ this.pendingMessages = new Map();
167
+ /** 最后心跳时间 */
168
+ this.lastHeartbeat = 0;
169
+ /** 心跳定时器 */
170
+ this.heartbeatTimer = null;
171
+ /** 轮询定时器 */
172
+ this.pollTimer = null;
173
+ /** SSE EventSource */
174
+ this.eventSource = null;
175
+ /** WebSocket 实例 */
176
+ this.ws = null;
177
+ /** 统计 [Channel SDK 标准] */
178
+ this.stats = {
179
+ messagesSent: 0,
180
+ messagesReceived: 0,
181
+ connectedDuration: 0,
182
+ lastActiveAt: Date.now(),
183
+ };
184
+ this.config = {
185
+ heartbeatInterval: 30000,
186
+ heartbeatTimeout: 10000,
187
+ maxReconnectAttempts: 3,
188
+ preferredMode: 'websocket',
189
+ ssePath: '/api/channel/events',
190
+ pollInterval: 5000,
191
+ ...config,
192
+ };
193
+ }
194
+ /**
195
+ * 获取当前状态 [Channel SDK 标准]
196
+ */
197
+ get status() {
198
+ return this._status;
199
+ }
200
+ /**
201
+ * 获取实际使用的性能模式
202
+ */
203
+ get mode() {
204
+ return this.currentMode;
205
+ }
206
+ /**
207
+ * 连接到 WebHub [Channel SDK 标准]
208
+ */
209
+ async connect() {
210
+ try {
211
+ // 1. 先注册 (如果还没有 accessToken)
212
+ if (!this.config.accessToken) {
213
+ await this.register();
214
+ }
215
+ // 2. 连接
216
+ await this.connectToHub();
217
+ // 3. 尝试高性能连接 (按优先级)
218
+ let connected = false;
219
+ // 3.1 尝试 WebSocket
220
+ if (this.config.preferredMode === 'websocket') {
221
+ connected = await this.tryWebSocket();
222
+ if (connected) {
223
+ this.currentMode = 'websocket';
224
+ this.notifyStatus('connected');
225
+ return;
226
+ }
227
+ }
228
+ // 3.2 尝试 SSE
229
+ if (this.config.preferredMode === 'websocket' || this.config.preferredMode === 'sse') {
230
+ connected = await this.trySSE();
231
+ if (connected) {
232
+ this.currentMode = 'sse';
233
+ this.notifyStatus('connected');
234
+ return;
235
+ }
236
+ }
237
+ // 3.3 降级到 Polling
238
+ this.currentMode = 'polling';
239
+ this.startPolling();
240
+ // 4. 启动心跳
241
+ this.startHeartbeat();
242
+ this._status = 'connected';
243
+ this.stats.connectedDuration = Date.now();
244
+ this.notifyStatus('connected');
245
+ }
246
+ catch (error) {
247
+ this._status = 'disconnected';
248
+ throw error;
249
+ }
250
+ }
251
+ /**
252
+ * 获取完整的 WebHub URL
253
+ */
254
+ getUrl(path) {
255
+ const baseUrl = this.webhubUrl.replace(/\/$/, '');
256
+ const urlPath = path.startsWith('/') ? path : `/${path}`;
257
+ return `${baseUrl}${urlPath}`;
258
+ }
259
+ /**
260
+ * 尝试 WebSocket 连接
261
+ */
262
+ async tryWebSocket() {
263
+ const wsUrl = new URL(this.getUrl(this.config.wsUrl || '/ws'));
264
+ wsUrl.searchParams.set('channelId', this.config.channelId);
265
+ wsUrl.searchParams.set('token', this.config.accessToken);
266
+ return new Promise((resolve) => {
267
+ try {
268
+ this.ws = new WebSocket(wsUrl.toString());
269
+ const timeout = setTimeout(() => {
270
+ this.cleanupWebSocket();
271
+ resolve(false);
272
+ }, 5000);
273
+ this.ws.onopen = () => {
274
+ clearTimeout(timeout);
275
+ this.stats.connectedDuration = Date.now();
276
+ this.startHeartbeat();
277
+ resolve(true);
278
+ };
279
+ this.ws.onmessage = (event) => {
280
+ try {
281
+ const message = JSON.parse(event.data);
282
+ if (message.type === 'message') {
283
+ this.stats.messagesReceived++;
284
+ this.notifyMessage(message.data || message);
285
+ }
286
+ }
287
+ catch (e) {
288
+ // 忽略解析错误
289
+ }
290
+ };
291
+ this.ws.onclose = () => {
292
+ clearTimeout(timeout);
293
+ this.cleanupWebSocket();
294
+ resolve(false);
295
+ };
296
+ this.ws.onerror = () => {
297
+ clearTimeout(timeout);
298
+ this.cleanupWebSocket();
299
+ resolve(false);
300
+ };
301
+ }
302
+ catch {
303
+ resolve(false);
304
+ }
305
+ });
306
+ }
307
+ /**
308
+ * 尝试 SSE 连接
309
+ */
310
+ async trySSE() {
311
+ const sseUrl = new URL(this.getUrl(this.config.ssePath || '/api/channel/events'));
312
+ sseUrl.searchParams.set('channelId', this.config.channelId);
313
+ sseUrl.searchParams.set('token', this.config.accessToken || this.config.accessToken);
314
+ return new Promise((resolve) => {
315
+ try {
316
+ this.eventSource = new EventSource(sseUrl.toString());
317
+ const timeout = setTimeout(() => {
318
+ this.cleanupSSE();
319
+ resolve(false);
320
+ }, 5000);
321
+ this.eventSource.onopen = () => {
322
+ clearTimeout(timeout);
323
+ this.stats.connectedDuration = Date.now();
324
+ this.startHeartbeat();
325
+ resolve(true);
326
+ };
327
+ this.eventSource.onmessage = (event) => {
328
+ try {
329
+ const message = JSON.parse(event.data);
330
+ this.stats.messagesReceived++;
331
+ this.notifyMessage(message);
332
+ }
333
+ catch (e) {
334
+ // 忽略解析错误
335
+ }
336
+ };
337
+ this.eventSource.onerror = () => {
338
+ clearTimeout(timeout);
339
+ this.cleanupSSE();
340
+ resolve(false);
341
+ };
342
+ }
343
+ catch {
344
+ resolve(false);
345
+ }
346
+ });
347
+ }
348
+ /**
349
+ * 清理 WebSocket
350
+ */
351
+ cleanupWebSocket() {
352
+ if (this.ws) {
353
+ this.ws.close();
354
+ this.ws = null;
355
+ }
356
+ }
357
+ /**
358
+ * 清理 SSE
359
+ */
360
+ cleanupSSE() {
361
+ if (this.eventSource) {
362
+ this.eventSource.close();
363
+ this.eventSource = null;
364
+ }
365
+ }
366
+ /**
367
+ * 注册频道
368
+ */
369
+ async register() {
370
+ const response = await this.request('/api/channel/register', {
371
+ channelId: this.config.channelId,
372
+ secret: this.config.accessToken,
373
+ });
374
+ if (response.success && response.data?.accessToken) {
375
+ this.config.accessToken = response.data.accessToken;
376
+ }
377
+ else {
378
+ throw new Error('Failed to register channel');
379
+ }
380
+ }
381
+ /**
382
+ * 连接到 Hub
383
+ */
384
+ async connectToHub() {
385
+ const response = await this.request('/api/channel/connect', {
386
+ channelId: this.config.channelId,
387
+ }, true);
388
+ if (!response.success) {
389
+ throw new Error('Failed to connect to hub');
390
+ }
391
+ }
392
+ /**
393
+ * 断开连接 [Channel SDK 标准]
394
+ */
395
+ async disconnect() {
396
+ try {
397
+ this.stopPolling();
398
+ this.stopHeartbeat();
399
+ this.cleanupWebSocket();
400
+ this.cleanupSSE();
401
+ if (this.config.accessToken) {
402
+ await this.request('/api/channel/disconnect', {
403
+ channelId: this.config.channelId,
404
+ }, true).catch(() => { });
405
+ }
406
+ }
407
+ finally {
408
+ this._status = 'disconnected';
409
+ this.notifyStatus('disconnected');
410
+ }
411
+ }
412
+ /**
413
+ * 发送消息 [Channel SDK 标准]
414
+ */
415
+ async send(message) {
416
+ const messageId = message.messageId || (0, uuid_1.v4)();
417
+ try {
418
+ // FR-007: degrade 'channel' target type → 'group' (Channel SDK only supports user/group)
419
+ const targetType = message.target.type === 'channel'
420
+ ? channel_1.TargetType.GROUP
421
+ : message.target.type;
422
+ const response = await this.request('/api/channel/messages', {
423
+ channelId: this.config.channelId,
424
+ messageId,
425
+ target: { type: targetType, id: message.target.id, name: message.target.name },
426
+ content: {
427
+ text: message.content.text,
428
+ type: message.content.format || 'text',
429
+ },
430
+ media: message.media?.map(mapChannelSdkMedia),
431
+ // Map Channel SDK replyTo (string message ID) → WebHub {id} object
432
+ replyTo: message.replyTo ? { id: message.replyTo } : undefined,
433
+ metadata: message.metadata,
434
+ }, true);
435
+ this.stats.messagesSent++;
436
+ this.stats.lastActiveAt = Date.now();
437
+ return {
438
+ messageId,
439
+ success: true,
440
+ timestamp: Date.now(),
441
+ };
442
+ }
443
+ catch (error) {
444
+ return {
445
+ messageId,
446
+ success: false,
447
+ timestamp: Date.now(),
448
+ error: {
449
+ code: 'SEND_FAILED',
450
+ message: error instanceof Error ? error.message : 'Unknown error',
451
+ },
452
+ };
453
+ }
454
+ }
455
+ /**
456
+ * US3 Cross-Channel Relay: forward a message from another OpenClaw channel
457
+ * to this ChatU WebHub channel so it appears in the frontend with a special
458
+ * source-channel badge.
459
+ *
460
+ * Calls POST /api/channel/cross-channel-messages authenticated via
461
+ * X-Access-Token (same token used for polling / outbound delivery).
462
+ *
463
+ * @param payload - Cross-channel message payload
464
+ * @returns Resolves with the stored message id, channelId and createdAt from the service
465
+ */
466
+ async postCrossChannelMessage(payload) {
467
+ // Note: the cross-channel endpoint returns { id, channelId, createdAt } directly,
468
+ // not wrapped in { success, data }. Cast accordingly.
469
+ const raw = await this.request('/api/channel/cross-channel-messages', payload, true);
470
+ if (!raw.id) {
471
+ throw new Error(`postCrossChannelMessage failed: ${JSON.stringify(raw)}`);
472
+ }
473
+ return raw;
474
+ }
475
+ /**
476
+ * 订阅消息 [Channel SDK 标准]
477
+ */
478
+ onMessage(callback) {
479
+ this.messageCallbacks.add(callback);
480
+ }
481
+ /**
482
+ * 订阅状态变化 [Channel SDK 标准]
483
+ */
484
+ onStatusChange(callback) {
485
+ this.statusCallbacks.add(callback);
486
+ }
487
+ /**
488
+ * 获取统计 [Channel SDK 标准]
489
+ */
490
+ async getStats() {
491
+ return {
492
+ ...this.stats,
493
+ mode: this.currentMode,
494
+ };
495
+ }
496
+ /**
497
+ * 发起 HTTP 请求
498
+ */
499
+ async request(path, body, requireAuth = false) {
500
+ const headers = {
501
+ 'Content-Type': 'application/json',
502
+ };
503
+ if (requireAuth && this.config.accessToken) {
504
+ headers['X-Access-Token'] = this.config.accessToken;
505
+ }
506
+ const response = await fetch(this.getUrl(path), {
507
+ method: 'POST',
508
+ headers,
509
+ body: JSON.stringify(body),
510
+ });
511
+ return response.json();
512
+ }
513
+ /**
514
+ * 启动轮询接收消息
515
+ */
516
+ startPolling() {
517
+ this.pollTimer = setInterval(async () => {
518
+ try {
519
+ const response = await this.request('/api/channel/webhook', {
520
+ channelId: this.config.channelId,
521
+ }, true);
522
+ if (response.success && response.data) {
523
+ const messages = Array.isArray(response.data) ? response.data : [response.data];
524
+ for (const message of messages) {
525
+ this.stats.messagesReceived++;
526
+ this.notifyMessage(message);
527
+ }
528
+ this.stats.lastActiveAt = Date.now();
529
+ }
530
+ }
531
+ catch (error) {
532
+ console.error('Polling error:', error);
533
+ }
534
+ }, this.config.pollInterval || 5000);
535
+ }
536
+ /**
537
+ * 停止轮询
538
+ */
539
+ stopPolling() {
540
+ if (this.pollTimer) {
541
+ clearInterval(this.pollTimer);
542
+ this.pollTimer = null;
543
+ }
544
+ }
545
+ /**
546
+ * 启动心跳
547
+ */
548
+ startHeartbeat() {
549
+ this.heartbeatTimer = setInterval(() => {
550
+ this.lastHeartbeat = Date.now();
551
+ this.request('/api/channel/heartbeat', {
552
+ channelId: this.config.channelId,
553
+ }, true).catch(() => { });
554
+ }, this.config.heartbeatInterval || 30000);
555
+ }
556
+ /**
557
+ * 停止心跳
558
+ */
559
+ stopHeartbeat() {
560
+ if (this.heartbeatTimer) {
561
+ clearInterval(this.heartbeatTimer);
562
+ this.heartbeatTimer = null;
563
+ }
564
+ }
565
+ /**
566
+ * 通知消息
567
+ */
568
+ notifyMessage(message) {
569
+ this.messageCallbacks.forEach((cb) => cb(message));
570
+ }
571
+ /**
572
+ * 通知状态变化
573
+ */
574
+ notifyStatus(status, error) {
575
+ this.statusCallbacks.forEach((cb) => cb(status, error));
576
+ }
577
+ }
578
+ exports.WebHubAdapter = WebHubAdapter;
579
+ /**
580
+ * WebHub 适配器工厂
581
+ */
582
+ class WebHubAdapterFactory {
583
+ constructor(modeConfig) {
584
+ this.modeConfig = modeConfig || {
585
+ preferred: 'websocket',
586
+ websocket: { maxRetries: 3, retryInterval: 1000 },
587
+ sse: { maxRetries: 2 },
588
+ polling: { interval: 5000 },
589
+ };
590
+ }
591
+ /**
592
+ * 创建 WebHub 适配器 (从 config.webhubUrl 获取 URL)
593
+ */
594
+ createConnectionAdapter(config) {
595
+ return new WebHubAdapter(config);
596
+ }
597
+ /**
598
+ * 创建消息适配器
599
+ */
600
+ createMessageAdapter() {
601
+ return {
602
+ parseInbound: mapRawToInboundMessage,
603
+ formatOutbound: (message) => message,
604
+ validate: (message) => !!message,
605
+ sanitize: (text) => text,
606
+ };
607
+ }
608
+ /**
609
+ * 创建心跳适配器
610
+ */
611
+ createHeartbeatAdapter() {
612
+ return {
613
+ send: async () => true,
614
+ handleResponse: () => { },
615
+ isTimeout: () => false,
616
+ getNextHeartbeatTime: () => Date.now() + 30000,
617
+ };
618
+ }
619
+ /**
620
+ * 创建认证适配器
621
+ */
622
+ createAuthAdapter() {
623
+ return {
624
+ getAuthHeaders: () => ({}),
625
+ validateResponse: (response) => true,
626
+ refreshToken: async () => true,
627
+ };
628
+ }
629
+ /**
630
+ * 创建能力适配器
631
+ */
632
+ createCapabilitiesAdapter() {
633
+ return {
634
+ getCapabilities: async () => ({
635
+ messageTypes: [channel_1.MessageType.TEXT, channel_1.MessageType.IMAGE, channel_1.MessageType.VIDEO, channel_1.MessageType.AUDIO, channel_1.MessageType.FILE],
636
+ targetTypes: [channel_1.TargetType.USER],
637
+ richFormats: ['markdown'],
638
+ attachments: true,
639
+ reply: true,
640
+ }),
641
+ hasCapability: () => true,
642
+ };
643
+ }
644
+ /**
645
+ * 创建日志适配器
646
+ */
647
+ createLoggerAdapter() {
648
+ return {
649
+ debug: (message, data) => console.debug(message, data),
650
+ info: (message, data) => console.info(message, data),
651
+ warn: (message, data) => console.warn(message, data),
652
+ error: (message, error) => console.error(message, error),
653
+ };
654
+ }
655
+ }
656
+ exports.WebHubAdapterFactory = WebHubAdapterFactory;
657
+ /**
658
+ * 创建 WebHub 适配器工厂
659
+ */
660
+ function createWebHubFactory(modeConfig) {
661
+ return new WebHubAdapterFactory(modeConfig);
662
+ }
663
+ //# sourceMappingURL=webhub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhub.js","sourceRoot":"","sources":["../../../src/sdk/adapters/webhub.ts"],"names":[],"mappings":"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"}