@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,336 @@
1
+ /******************************************************************
2
+ * Channel SDK - WebHub Adapter with Performance Degradation
3
+ *
4
+ * 支持从高性能到低性能的优雅退化:
5
+ * 1. WebSocket (最高性能) - 实时双向通信
6
+ * 2. Server-Sent Events (SSE) - 单向推送
7
+ * 3. HTTP Polling (最低性能) - 简单轮询
8
+ *
9
+ * URL 从 config.webhubUrl 配置中获取
10
+ *
11
+ * @see https://github.com/chatu-ai/openclaw-web-hub-channel
12
+ ******************************************************************/
13
+ import { InboundMessage, OutboundMessage, SendResult, ConnectionConfig, ConnectionStatus, ChannelStats, MessageType, TargetType } from '../types/channel';
14
+ import type { ConnectionAdapter, MessageCallback, StatusCallback, AdapterFactory } from '../types/adapters';
15
+ /**
16
+ * 将 WebHub API 原始消息 JSON 映射为 Channel SDK InboundMessage 格式。
17
+ *
18
+ * 这是跨层映射的唯一位置 (SC-003):
19
+ * - WebHub sender.name → InboundMessage.sender.displayName
20
+ * - WebHub sender.avatar → InboundMessage.sender.avatarUrl
21
+ * - WebHub authorDisplayName (旧字段兼容) → InboundMessage.sender.displayName
22
+ * - WebHub authorId (旧字段兼容) → InboundMessage.sender.id
23
+ * - WebHub replyTo.id → InboundMessage.replyTo.messageId
24
+ * - WebHub replyTo.quoteText → InboundMessage.replyTo.quotedText
25
+ * - WebHub content (string 或 {text}) → InboundMessage.content.text
26
+ * - WebHub createdAt (string) → InboundMessage.timestamp (ms)
27
+ */
28
+ export declare function mapRawToInboundMessage(raw: unknown): InboundMessage;
29
+ /**
30
+ * 将 Channel SDK Media 对象映射为 WebHub API 可接受的媒体格式。
31
+ *
32
+ * Channel SDK Media 字段名称(thumbnailUrl / width / height)已与 WebHub 对齐;
33
+ * 此函数负责补充 WebHub 要求但 SDK 未提供的 filename 字段(从 url 推断),
34
+ * 是全局唯一的媒体映射位置(SC-003)。
35
+ *
36
+ * @param media - Channel SDK Media 对象
37
+ * @returns WebHub 媒体对象
38
+ */
39
+ export declare function mapChannelSdkMedia(media: {
40
+ type: MessageType;
41
+ url: string;
42
+ mimeType?: string;
43
+ size?: number;
44
+ width?: number;
45
+ height?: number;
46
+ duration?: number;
47
+ thumbnailUrl?: string;
48
+ }): {
49
+ type: MessageType;
50
+ url: string;
51
+ mimeType?: string;
52
+ size?: number;
53
+ width?: number;
54
+ height?: number;
55
+ duration?: number;
56
+ thumbnailUrl?: string;
57
+ filename?: string;
58
+ };
59
+ /**
60
+ * 性能模式
61
+ */
62
+ export type PerformanceMode = 'websocket' | 'sse' | 'polling';
63
+ /**
64
+ * WebHub 适配器配置 (继承 ConnectionConfig)
65
+ */
66
+ export interface WebHubAdapterConfig extends ConnectionConfig {
67
+ /** 首选性能模式 (默认: websocket) */
68
+ preferredMode?: PerformanceMode;
69
+ /** SSE URL 路径 */
70
+ ssePath?: string;
71
+ /** 轮询间隔 (毫秒) */
72
+ pollInterval?: number;
73
+ }
74
+ /**
75
+ * WebHub 适配器
76
+ *
77
+ * 支持三种模式的优雅退化:
78
+ * - WebSocket: 实时双向通信
79
+ * - SSE: 单向推送 + HTTP 发送
80
+ * - Polling: HTTP 轮询
81
+ *
82
+ * URL 从 config.webhubUrl 配置中获取
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * // 配置时设置 webhubUrl
87
+ * const channel = new Channel({
88
+ * config: {
89
+ * channelId: 'wh_ch_xxx',
90
+ * accessToken: 'token_xxx',
91
+ * webhubUrl: 'http://localhost:3000', // 从配置获取
92
+ * }
93
+ * });
94
+ * ```
95
+ */
96
+ export declare class WebHubAdapter implements ConnectionAdapter {
97
+ /** 配置 [Channel SDK 标准] */
98
+ config: WebHubAdapterConfig;
99
+ /** 当前状态 [Channel SDK 标准] */
100
+ private _status;
101
+ /** 实际使用的性能模式 */
102
+ private currentMode;
103
+ /** WebHub URL (从配置获取) */
104
+ private get webhubUrl();
105
+ /** 消息回调 [Channel SDK 标准] */
106
+ private messageCallbacks;
107
+ /** 状态回调 [Channel SDK 标准] */
108
+ private statusCallbacks;
109
+ /** 待确认消息 */
110
+ private pendingMessages;
111
+ /** 最后心跳时间 */
112
+ private lastHeartbeat;
113
+ /** 心跳定时器 */
114
+ private heartbeatTimer;
115
+ /** 轮询定时器 */
116
+ private pollTimer;
117
+ /** SSE EventSource */
118
+ private eventSource;
119
+ /** WebSocket 实例 */
120
+ private ws;
121
+ /** 统计 [Channel SDK 标准] */
122
+ private stats;
123
+ /**
124
+ * 创建 WebHub 适配器
125
+ */
126
+ constructor(config: WebHubAdapterConfig);
127
+ /**
128
+ * 获取当前状态 [Channel SDK 标准]
129
+ */
130
+ get status(): ConnectionStatus;
131
+ /**
132
+ * 获取实际使用的性能模式
133
+ */
134
+ get mode(): PerformanceMode;
135
+ /**
136
+ * 连接到 WebHub [Channel SDK 标准]
137
+ */
138
+ connect(): Promise<void>;
139
+ /**
140
+ * 获取完整的 WebHub URL
141
+ */
142
+ private getUrl;
143
+ /**
144
+ * 尝试 WebSocket 连接
145
+ */
146
+ private tryWebSocket;
147
+ /**
148
+ * 尝试 SSE 连接
149
+ */
150
+ private trySSE;
151
+ /**
152
+ * 清理 WebSocket
153
+ */
154
+ private cleanupWebSocket;
155
+ /**
156
+ * 清理 SSE
157
+ */
158
+ private cleanupSSE;
159
+ /**
160
+ * 注册频道
161
+ */
162
+ private register;
163
+ /**
164
+ * 连接到 Hub
165
+ */
166
+ private connectToHub;
167
+ /**
168
+ * 断开连接 [Channel SDK 标准]
169
+ */
170
+ disconnect(): Promise<void>;
171
+ /**
172
+ * 发送消息 [Channel SDK 标准]
173
+ */
174
+ send(message: OutboundMessage): Promise<SendResult>;
175
+ /**
176
+ * US3 Cross-Channel Relay: forward a message from another OpenClaw channel
177
+ * to this ChatU WebHub channel so it appears in the frontend with a special
178
+ * source-channel badge.
179
+ *
180
+ * Calls POST /api/channel/cross-channel-messages authenticated via
181
+ * X-Access-Token (same token used for polling / outbound delivery).
182
+ *
183
+ * @param payload - Cross-channel message payload
184
+ * @returns Resolves with the stored message id, channelId and createdAt from the service
185
+ */
186
+ postCrossChannelMessage(payload: {
187
+ /** Originating channel id (lowercase, max 64 chars, /^[a-z0-9_-]{1,64}$/) */
188
+ sourceChannel: string;
189
+ /** 'inbound' = AI reply, 'outbound' = user message */
190
+ direction: 'inbound' | 'outbound';
191
+ /** Sender object — id is optional, name is required */
192
+ sender: {
193
+ id?: string;
194
+ name: string;
195
+ };
196
+ /** Text content of the message */
197
+ content: string;
198
+ /** Session key from the originating channel */
199
+ sessionKey: string;
200
+ /** Optional extra metadata forwarded as-is */
201
+ metadata?: Record<string, unknown>;
202
+ }): Promise<{
203
+ id: string;
204
+ channelId: string;
205
+ createdAt: string;
206
+ }>;
207
+ /**
208
+ * 订阅消息 [Channel SDK 标准]
209
+ */
210
+ onMessage(callback: MessageCallback): void;
211
+ /**
212
+ * 订阅状态变化 [Channel SDK 标准]
213
+ */
214
+ onStatusChange(callback: StatusCallback): void;
215
+ /**
216
+ * 获取统计 [Channel SDK 标准]
217
+ */
218
+ getStats(): Promise<ChannelStats>;
219
+ /**
220
+ * 发起 HTTP 请求
221
+ */
222
+ private request;
223
+ /**
224
+ * 启动轮询接收消息
225
+ */
226
+ private startPolling;
227
+ /**
228
+ * 停止轮询
229
+ */
230
+ private stopPolling;
231
+ /**
232
+ * 启动心跳
233
+ */
234
+ private startHeartbeat;
235
+ /**
236
+ * 停止心跳
237
+ */
238
+ private stopHeartbeat;
239
+ /**
240
+ * 通知消息
241
+ */
242
+ private notifyMessage;
243
+ /**
244
+ * 通知状态变化
245
+ */
246
+ private notifyStatus;
247
+ }
248
+ /**
249
+ * 性能模式配置
250
+ */
251
+ export interface PerformanceModeConfig {
252
+ /** 首选模式 */
253
+ preferred: PerformanceMode;
254
+ /** WebSocket 配置 */
255
+ websocket?: {
256
+ /** 重试次数 */
257
+ maxRetries?: number;
258
+ /** 重试间隔 (毫秒) */
259
+ retryInterval?: number;
260
+ };
261
+ /** SSE 配置 */
262
+ sse?: {
263
+ /** 重试次数 */
264
+ maxRetries?: number;
265
+ };
266
+ /** Polling 配置 */
267
+ polling?: {
268
+ /** 轮询间隔 (毫秒) */
269
+ interval?: number;
270
+ };
271
+ }
272
+ /**
273
+ * WebHub 适配器工厂
274
+ */
275
+ export declare class WebHubAdapterFactory implements AdapterFactory {
276
+ /** 性能模式配置 */
277
+ private modeConfig;
278
+ constructor(modeConfig?: PerformanceModeConfig);
279
+ /**
280
+ * 创建 WebHub 适配器 (从 config.webhubUrl 获取 URL)
281
+ */
282
+ createConnectionAdapter(config: ConnectionConfig): ConnectionAdapter;
283
+ /**
284
+ * 创建消息适配器
285
+ */
286
+ createMessageAdapter(): {
287
+ parseInbound: typeof mapRawToInboundMessage;
288
+ formatOutbound: (message: OutboundMessage) => unknown;
289
+ validate: (message: unknown) => boolean;
290
+ sanitize: (text: string) => string;
291
+ };
292
+ /**
293
+ * 创建心跳适配器
294
+ */
295
+ createHeartbeatAdapter(): {
296
+ send: () => Promise<boolean>;
297
+ handleResponse: () => void;
298
+ isTimeout: () => boolean;
299
+ getNextHeartbeatTime: () => number;
300
+ };
301
+ /**
302
+ * 创建认证适配器
303
+ */
304
+ createAuthAdapter(): {
305
+ getAuthHeaders: () => Record<string, string>;
306
+ validateResponse: (response: unknown) => boolean;
307
+ refreshToken: () => Promise<boolean>;
308
+ };
309
+ /**
310
+ * 创建能力适配器
311
+ */
312
+ createCapabilitiesAdapter(): {
313
+ getCapabilities: () => Promise<{
314
+ messageTypes: MessageType[];
315
+ targetTypes: TargetType[];
316
+ richFormats: ("markdown" | "html")[];
317
+ attachments: boolean;
318
+ reply: boolean;
319
+ }>;
320
+ hasCapability: () => boolean;
321
+ };
322
+ /**
323
+ * 创建日志适配器
324
+ */
325
+ createLoggerAdapter(): {
326
+ debug: (message: string, data?: unknown) => void;
327
+ info: (message: string, data?: unknown) => void;
328
+ warn: (message: string, data?: unknown) => void;
329
+ error: (message: string, error?: Error) => void;
330
+ };
331
+ }
332
+ /**
333
+ * 创建 WebHub 适配器工厂
334
+ */
335
+ export declare function createWebHubFactory(modeConfig?: PerformanceModeConfig): WebHubAdapterFactory;
336
+ //# sourceMappingURL=webhub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhub.d.ts","sourceRoot":"","sources":["../../../src/sdk/adapters/webhub.ts"],"names":[],"mappings":"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"}