@53ai/53ai-openclaw 1.0.3 → 1.0.4
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/CHANGELOG.md +15 -0
- package/README.md +14 -14
- package/dist/index.cjs.js +2 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +2 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/src/interface.d.ts +6 -6
- package/dist/src/message-parser.d.ts +3 -3
- package/openclaw.plugin.json +10 -6
- package/package.json +1 -21
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../../src/runtime.ts","../../src/const.ts","../../src/interface.ts","../../src/message-parser.ts","../../src/message-sender.ts","../../src/access-policy.ts","../../src/reqid-store.ts","../../src/state-manager.ts","../../src/timeout.ts","../../src/media-handler.ts","../../src/monitor.ts","../../src/utils.ts","../../src/onboarding.ts","../../src/channel.ts","../../index.ts"],"sourcesContent":["import type { PluginRuntime } from \"openclaw/plugin-sdk\";\n\nlet runtime: PluginRuntime | null = null;\n\nexport function setRuntime(r: PluginRuntime): void {\n runtime = r;\n}\n\nexport function getRuntime(): PluginRuntime {\n if (!runtime) {\n throw new Error(\"Plugin runtime not initialized - plugin not registered\");\n }\n return runtime;\n}\n","export const CHANNEL_ID = \"53aihub\";\n\n// ============================================================================\n// WebSocket 配置\n// ============================================================================\n\n/** 默认 WebSocket URL */\nexport const DEFAULT_WS_URL = \"ws://localhost:8080/ws\";\n\n/** 心跳间隔(毫秒) */\nexport const WS_HEARTBEAT_INTERVAL_MS = 15000;\n\n/** \n * 最大重连次数\n * 设为 60 次,配合指数退避(最大 30 秒),总重连时间约 30 分钟\n */\nexport const WS_MAX_RECONNECT_ATTEMPTS = 60;\n\n/** 重连基础延迟(毫秒) - 指数退避的起始值 */\nexport const WS_RECONNECT_BASE_DELAY_MS = 1000;\n\n// ============================================================================\n// 消息处理配置\n// ============================================================================\n\n/** 文本分块限制 */\nexport const TEXT_CHUNK_LIMIT = 4000;\n\n/** 消息处理超时(毫秒) */\nexport const MESSAGE_PROCESS_TIMEOUT_MS = 120000;\n\n// ============================================================================\n// 媒体处理配置\n// ============================================================================\n\n/** 默认媒体大小上限(MB) */\nexport const DEFAULT_MEDIA_MAX_MB = 20;\n\n/** 图片下载超时(毫秒) */\nexport const IMAGE_DOWNLOAD_TIMEOUT_MS = 30000;\n\n/** 文件下载超时(毫秒) */\nexport const FILE_DOWNLOAD_TIMEOUT_MS = 60000;\n\n/** 回复发送超时(毫秒) */\nexport const REPLY_SEND_TIMEOUT_MS = 10000;\n\n/** 仅包含图片时的消息占位符 */\nexport const MEDIA_IMAGE_PLACEHOLDER = \"<media:image>\";\n\n/** 仅包含文件时的消息占位符 */\nexport const MEDIA_DOCUMENT_PLACEHOLDER = \"<media:document>\";\n\n// ============================================================================\n// 状态管理配置\n// ============================================================================\n\n/** 消息状态 TTL(毫秒) */\nexport const MESSAGE_STATE_TTL_MS = 5 * 60 * 1000;\n\n/** 消息状态清理间隔(毫秒) */\nexport const MESSAGE_STATE_CLEANUP_INTERVAL_MS = 60 * 1000;\n\n/** 消息状态最大条目数 */\nexport const MESSAGE_STATE_MAX_SIZE = 1000;\n\n// ============================================================================\n// 持久化配置\n// ============================================================================\n\n/** 持久化目录名称 */\nexport const PERSISTENCE_DIR_NAME = \".53aihub_store\";\n\n/** ReqId 存储文件名 */\nexport const REQID_STORE_FILENAME = \"reqid_map.json\";\n\n/** ReqId 刷写防抖时间(毫秒) */\nexport const REQID_FLUSH_DEBOUNCE_MS = 2000;\n\n/** ReqId 最大条目数 */\nexport const REQID_MAX_ENTRIES = 5000;\n\nexport const THINKING_MESSAGE = \"🤔 正在思考中...\";\n\n// ============================================================================\n// 默认策略\n// ============================================================================\n\nexport const DEFAULT_ACCESS_POLICY = \"open\";","import type { OpenClawConfig, RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { ResolvedAccount } from \"./utils.js\";\n\n// ============================================================================\n// WebSocket 消息类型\n// ============================================================================\n\n/**\n * OpenAI 兼容的消息格式\n */\nexport interface OpenAIChatMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | MessageContentItem[];\n name?: string;\n}\n\n/**\n * OpenAI 兼容的请求格式\n */\nexport interface OpenAIChatRequest {\n model?: string;\n messages: OpenAIChatMessage[];\n user?: string;\n conversation_id?: string;\n stream?: boolean;\n}\n\n/**\n * OpenAI 兼容的响应块格式\n */\nexport interface OpenAIChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n content?: string;\n role?: string;\n };\n finish_reason: string | null;\n }>;\n error?: ResponseError;\n}\n\n/**\n * AgentHub 消息数据类型\n */\nexport interface AgentHubMessageData {\n toChatId?: string;\n text?: string;\n imageUrls?: string[];\n fileUrls?: string[];\n type?: string;\n msgId?: string;\n id?: string;\n chatId?: string;\n userId?: string;\n content?: string;\n quoteContent?: string;\n images?: Array<{ url?: string }>;\n files?: Array<{ url?: string }>;\n media?: {\n type: \"image\" | \"file\";\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n };\n}\n\n/**\n * WebSocket 请求/响应消息基础格式\n */\nexport interface AgentHubWsMessage {\n req_id: string;\n action: \"chat\" | \"message\" | \"ping\" | \"pong\";\n status: \"streaming\" | \"done\" | \"error\" | \"final\" | \"thinking\";\n data: OpenAIChatRequest | OpenAIChatCompletionChunk | AgentHubMessageData | null;\n}\n\n/**\n * 图片消息内容\n */\nexport interface ImageContent {\n /** 图片 URL */\n url?: string;\n /** 图片 base64 数据 */\n base64?: string;\n /** 图片 MIME 类型 */\n mimeType?: string;\n}\n\n/**\n * 文件消息内容\n */\nexport interface FileContent {\n /** 文件 URL */\n url?: string;\n /** 文件 base64 数据 */\n base64?: string;\n /** 文件名 */\n filename?: string;\n /** 文件 MIME 类型 */\n mimeType?: string;\n}\n\n/**\n * 消息内容项(支持多模态)\n */\nexport interface MessageContentItem {\n type: \"text\" | \"image\" | \"file\";\n text?: string;\n image?: ImageContent;\n file?: FileContent;\n}\n\n/**\n * 来自 Go 后端的消息\n */\nexport interface AgentHubIncomingMessage {\n type: string;\n msgId: string;\n chatId: string;\n userId: string;\n text: string;\n /** 图片 URL 列表 */\n imageUrls?: string[];\n /** 文件 URL 列表 */\n fileUrls?: string[];\n /** 多模态消息内容项 */\n contentItems?: MessageContentItem[];\n quoteContent?: string;\n reqId?: string;\n}\n\n/**\n * 发送给 Go 后端的消息\n */\nexport interface AgentHubOutgoingMessage {\n type: \"reply\" | \"message\";\n msgId?: string;\n chatId: string;\n text: string;\n streamId?: string;\n finish: boolean;\n error?: ResponseError;\n /** 媒体附件 */\n media?: {\n type: \"image\" | \"file\";\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n };\n}\n\n// ============================================================================\n// 配置和运行时类型\n// ============================================================================\n\n/**\n * Monitor 配置选项\n */\nexport interface MonitorOptions {\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n abortSignal?: AbortSignal;\n}\n\n/**\n * 消息状态\n */\nexport interface MessageState {\n accumulatedText: string;\n lastSentText: string;\n streamId: string;\n}\n\n// ============================================================================\n// 错误处理\n// ============================================================================\n\n/**\n * 错误码枚举\n */\nexport enum ErrorCode {\n // 访问控制\n ACCESS_DENIED = \"ACCESS_DENIED\",\n PAIRING_REQUIRED = \"PAIRING_REQUIRED\",\n \n // AI 服务错误\n RATE_LIMITED = \"RATE_LIMITED\",\n INSUFFICIENT_QUOTA = \"INSUFFICIENT_QUOTA\",\n MODEL_OVERLOADED = \"MODEL_OVERLOADED\",\n MODEL_NOT_FOUND = \"MODEL_NOT_FOUND\",\n \n // 请求错误\n INVALID_REQUEST = \"INVALID_REQUEST\",\n CONTEXT_LENGTH_EXCEEDED = \"CONTEXT_LENGTH_EXCEEDED\",\n CONTENT_FILTERED = \"CONTENT_FILTERED\",\n \n // 系统错误\n TIMEOUT = \"TIMEOUT\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n SERVICE_UNAVAILABLE = \"SERVICE_UNAVAILABLE\",\n WEBSOCKET_ERROR = \"WEBSOCKET_ERROR\",\n}\n\n/**\n * 响应错误\n */\nexport interface ResponseError {\n code: ErrorCode | string;\n message: string;\n details?: string;\n}\n\n/**\n * 响应数据\n */\nexport interface ResponseData {\n content?: string;\n error?: ResponseError;\n choices?: Array<{\n index: number;\n delta: {\n content?: string;\n role?: string;\n };\n finish_reason?: string | null;\n }>;\n}\n\n// ============================================================================\n// 错误码映射工具\n// ============================================================================\n\n/**\n * 从错误消息中推断错误码\n */\nexport function inferErrorCode(errorText: string): ErrorCode {\n const text = errorText.toLowerCase();\n \n if (text.includes(\"rate limit\") || text.includes(\"429\") || text.includes(\"too many requests\")) {\n return ErrorCode.RATE_LIMITED;\n }\n if (text.includes(\"quota\") || text.includes(\"insufficient\") || text.includes(\"balance\") || text.includes(\"credit\")) {\n return ErrorCode.INSUFFICIENT_QUOTA;\n }\n if (text.includes(\"overload\") || text.includes(\"capacity\") || text.includes(\"temporarily unavailable\")) {\n return ErrorCode.MODEL_OVERLOADED;\n }\n if (text.includes(\"model not found\") || text.includes(\"does not exist\")) {\n return ErrorCode.MODEL_NOT_FOUND;\n }\n if (text.includes(\"context length\") || text.includes(\"token limit\") || text.includes(\"max tokens\")) {\n return ErrorCode.CONTEXT_LENGTH_EXCEEDED;\n }\n if (text.includes(\"content filtered\") || text.includes(\"content policy\") || text.includes(\"safety\")) {\n return ErrorCode.CONTENT_FILTERED;\n }\n if (text.includes(\"timeout\") || text.includes(\"timed out\")) {\n return ErrorCode.TIMEOUT;\n }\n if (text.includes(\"service unavailable\") || text.includes(\"503\")) {\n return ErrorCode.SERVICE_UNAVAILABLE;\n }\n if (text.includes(\"invalid\") || text.includes(\"bad request\")) {\n return ErrorCode.INVALID_REQUEST;\n }\n \n return ErrorCode.INTERNAL_ERROR;\n}","import type { AgentHubIncomingMessage, AgentHubWsMessage, MessageContentItem, OpenAIChatRequest, AgentHubMessageData } from \"./interface.js\";\n\nexport interface ParsedMessageContent {\n textParts: string[];\n imageUrls: string[];\n fileUrls: string[];\n contentItems: MessageContentItem[];\n}\n\nfunction extractTextFromContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (Array.isArray(content)) {\n return content\n .filter((item): item is { type: string; text?: string } => \n typeof item === \"object\" && item !== null && item.type === \"text\"\n )\n .map((item) => item.text || \"\")\n .join(\"\\n\");\n }\n return \"\";\n}\n\nfunction extractImagesFromContent(content: unknown): { urls: string[]; items: MessageContentItem[] } {\n const urls: string[] = [];\n const items: MessageContentItem[] = [];\n\n if (Array.isArray(content)) {\n for (const item of content) {\n if (typeof item !== \"object\" || item === null) continue;\n \n const itemRecord = item as Record<string, unknown>;\n \n if (itemRecord.type === \"image_url\" && \n typeof itemRecord.image_url === \"object\" && \n itemRecord.image_url !== null &&\n \"url\" in itemRecord.image_url) {\n const url = String((itemRecord.image_url as Record<string, unknown>).url);\n urls.push(url);\n items.push({\n type: \"image\",\n image: { url },\n });\n } else if (itemRecord.type === \"image\" && (itemRecord.url || itemRecord.base64)) {\n if (typeof itemRecord.url === \"string\") urls.push(itemRecord.url);\n items.push({\n type: \"image\",\n image: {\n url: typeof itemRecord.url === \"string\" ? itemRecord.url : undefined,\n base64: typeof itemRecord.base64 === \"string\" ? itemRecord.base64 : undefined,\n mimeType: typeof itemRecord.mimeType === \"string\" ? itemRecord.mimeType : undefined,\n },\n });\n }\n }\n }\n\n return { urls, items };\n}\n\nfunction extractFilesFromContent(content: unknown): { urls: string[]; items: MessageContentItem[] } {\n const urls: string[] = [];\n const items: MessageContentItem[] = [];\n\n if (Array.isArray(content)) {\n for (const item of content) {\n if (typeof item !== \"object\" || item === null) continue;\n \n const itemRecord = item as Record<string, unknown>;\n \n if (itemRecord.type === \"file\" && (itemRecord.url || itemRecord.base64)) {\n if (typeof itemRecord.url === \"string\") urls.push(itemRecord.url);\n items.push({\n type: \"file\",\n file: {\n url: typeof itemRecord.url === \"string\" ? itemRecord.url : undefined,\n base64: typeof itemRecord.base64 === \"string\" ? itemRecord.base64 : undefined,\n filename: typeof itemRecord.filename === \"string\" ? itemRecord.filename : undefined,\n mimeType: typeof itemRecord.mimeType === \"string\" ? itemRecord.mimeType : undefined,\n },\n });\n }\n }\n }\n\n return { urls, items };\n}\n\nexport function parseIncomingMessage(rawJson: string): AgentHubIncomingMessage | null {\n try {\n const wsMsg = JSON.parse(rawJson) as AgentHubWsMessage;\n \n if (wsMsg.action === \"ping\" || wsMsg.action === \"pong\") {\n return null;\n }\n\n if (wsMsg.action === \"chat\") {\n const openAIReq = wsMsg.data as OpenAIChatRequest;\n if (!openAIReq || !openAIReq.messages || !Array.isArray(openAIReq.messages)) {\n return null;\n }\n\n const lastUserMsg = [...openAIReq.messages].reverse().find((m) => m.role === \"user\");\n if (!lastUserMsg) return null;\n\n const userId = openAIReq.user || lastUserMsg.name || `user-${wsMsg.req_id}`;\n const chatId = openAIReq.conversation_id || userId;\n\n const text = extractTextFromContent(lastUserMsg.content);\n const { urls: imageUrls, items: imageItems } = extractImagesFromContent(lastUserMsg.content);\n const { urls: fileUrls, items: fileItems } = extractFilesFromContent(lastUserMsg.content);\n const contentItems: MessageContentItem[] = [...imageItems, ...fileItems];\n\n return {\n type: \"message\",\n msgId: wsMsg.req_id,\n reqId: wsMsg.req_id,\n chatId: chatId,\n userId: userId,\n text,\n imageUrls: imageUrls.length > 0 ? imageUrls : undefined,\n fileUrls: fileUrls.length > 0 ? fileUrls : undefined,\n contentItems: contentItems.length > 0 ? contentItems : undefined,\n };\n }\n\n // 处理非标准格式的消息 (action === \"message\")\n const data = wsMsg.data as AgentHubMessageData;\n const dataRecord = data as Record<string, unknown>;\n const rawImages = dataRecord.images;\n const rawFiles = dataRecord.files;\n \n const imageUrls: string[] = data.imageUrls || \n (Array.isArray(rawImages) ? rawImages.map((img: unknown) => {\n if (typeof img === \"string\") return img;\n if (typeof img === \"object\" && img !== null && \"url\" in img) return String((img as Record<string, unknown>).url);\n return \"\";\n }).filter(Boolean) : []);\n \n const fileUrls: string[] = data.fileUrls || \n (Array.isArray(rawFiles) ? rawFiles.map((f: unknown) => {\n if (typeof f === \"string\") return f;\n if (typeof f === \"object\" && f !== null && \"url\" in f) return String((f as Record<string, unknown>).url);\n return \"\";\n }).filter(Boolean) : []);\n \n return {\n type: (dataRecord.type as string) || \"message\",\n msgId: (dataRecord.msgId as string) || (dataRecord.id as string) || `msg-${Date.now()}`,\n chatId: (dataRecord.chatId as string) || (dataRecord.userId as string) || \"default-chat\",\n userId: (dataRecord.userId as string) || (dataRecord.chatId as string) || \"default-user\",\n text: (dataRecord.text as string) || (dataRecord.content as string) || \"\",\n imageUrls: imageUrls.length > 0 ? imageUrls : undefined,\n fileUrls: fileUrls.length > 0 ? fileUrls : undefined,\n quoteContent: dataRecord.quoteContent as string | undefined,\n };\n } catch {\n return null;\n }\n}\n\nexport function parseMessageContent(msg: AgentHubIncomingMessage): ParsedMessageContent {\n const textParts: string[] = [];\n const imageUrls: string[] = [];\n const fileUrls: string[] = [];\n const contentItems: MessageContentItem[] = [];\n\n if (msg.text?.trim()) {\n textParts.push(msg.text.trim());\n }\n\n if (msg.imageUrls?.length) {\n imageUrls.push(...msg.imageUrls);\n for (const url of msg.imageUrls) {\n contentItems.push({ type: \"image\", image: { url } });\n }\n }\n\n if (msg.fileUrls?.length) {\n fileUrls.push(...msg.fileUrls);\n for (const url of msg.fileUrls) {\n contentItems.push({ type: \"file\", file: { url } });\n }\n }\n\n if (msg.contentItems?.length) {\n for (const item of msg.contentItems) {\n if (item.type === \"image\" && item.image?.url && !imageUrls.includes(item.image.url)) {\n imageUrls.push(item.image.url);\n }\n if (item.type === \"file\" && item.file?.url && !fileUrls.includes(item.file.url)) {\n fileUrls.push(item.file.url);\n }\n contentItems.push(item);\n }\n }\n\n return { textParts, imageUrls, fileUrls, contentItems };\n}\n","import type { RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport type { AgentHubWsMessage, ResponseError, AgentHubOutgoingMessage } from \"./interface.js\";\nimport { ErrorCode } from \"./interface.js\";\n\ninterface SendReplyParams {\n wsClient: WebSocket;\n text: string;\n toChatId: string;\n replyToMsgId?: string;\n runtime: RuntimeEnv;\n finish: boolean;\n streamId: string;\n isError?: boolean;\n errorCode?: ErrorCode | string;\n errorDetails?: string;\n}\n\nexport async function sendReply(params: SendReplyParams): Promise<void> {\n const { wsClient, text, toChatId, replyToMsgId, runtime, finish, streamId, isError, errorCode, errorDetails } = params;\n\n const reqId = replyToMsgId || streamId;\n\n runtime.log?.(`[53aihub] sendReply START: reqId=${reqId}, finish=${finish}, isError=${isError}, textLen=${text?.length || 0}, wsReadyState=${wsClient.readyState}`);\n\n if (wsClient.readyState !== 1) {\n runtime.error?.(`[53aihub] WebSocket is not open (readyState=${wsClient.readyState}). Cannot send message to ${toChatId}`);\n return;\n }\n\n if (isError) {\n runtime.error?.(`[53aihub] sendReply ERROR: reqId=${reqId}, code=${errorCode}, text=${text?.substring(0, 100)}`);\n \n const errorInfo: ResponseError = {\n code: errorCode || ErrorCode.INTERNAL_ERROR,\n message: text || \"Unknown error\",\n details: errorDetails,\n };\n\n const errorChunk = {\n id: reqId,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: \"openclaw-agent\",\n choices: [\n {\n index: 0,\n delta: {\n content: text,\n role: \"assistant\",\n },\n finish_reason: \"error\",\n },\n ],\n error: errorInfo,\n };\n\n const errMsg: AgentHubWsMessage = {\n req_id: reqId,\n action: \"chat\",\n status: \"error\",\n data: errorChunk,\n };\n\n const jsonStr = JSON.stringify(errMsg);\n runtime.log?.(`[53aihub] sendReply ERROR SENDING: reqId=${reqId}, payloadLen=${jsonStr.length}`);\n wsClient.send(jsonStr);\n return;\n }\n\n const chunk = {\n id: reqId,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: \"openclaw-agent\",\n choices: [\n {\n index: 0,\n delta: {\n content: text,\n role: \"assistant\",\n },\n finish_reason: finish ? \"stop\" : null,\n },\n ],\n };\n\n const payload: AgentHubWsMessage = {\n req_id: reqId,\n action: \"chat\",\n status: finish ? \"done\" : \"streaming\",\n data: chunk,\n };\n\n const jsonStr = JSON.stringify(payload);\n runtime.log?.(`[53aihub] sendReply SENDING: reqId=${reqId}, status=${payload.status}, textLen=${text?.length || 0}, payloadLen=${jsonStr.length}, textPreview=${text?.substring(0, 50) || \"(empty)\"}`);\n\n try {\n wsClient.send(jsonStr);\n runtime.log?.(`[53aihub] sendReply SENT: reqId=${reqId}, status=${payload.status}`);\n } catch (error) {\n runtime.error?.(`[53aihub] sendReply FAILED: reqId=${reqId}, error=${String(error)}`);\n throw error;\n }\n}\n\nexport async function sendDirectMessage(wsClient: WebSocket, to: string, content: string, runtime?: RuntimeEnv): Promise<void> {\n if (wsClient.readyState !== 1) {\n throw new Error(`[53aihub] WebSocket not connected`);\n }\n\n const payload: AgentHubWsMessage = {\n req_id: `msg-${Date.now()}`,\n action: \"message\",\n status: \"final\",\n data: {\n toChatId: to,\n text: content,\n },\n };\n\n runtime?.log?.(`[53aihub] sendDirectMessage: to=${to}, contentLen=${content.length}`);\n wsClient.send(JSON.stringify(payload));\n}\n\nexport async function sendMediaMessage(\n wsClient: WebSocket,\n to: string,\n media: {\n type: \"image\" | \"file\";\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n },\n text?: string,\n runtime?: RuntimeEnv\n): Promise<void> {\n if (wsClient.readyState !== 1) {\n throw new Error(`[53aihub] WebSocket not connected`);\n }\n\n const payload: AgentHubWsMessage = {\n req_id: `msg-${Date.now()}`,\n action: \"message\",\n status: \"final\",\n data: {\n toChatId: to,\n text: text || \"\",\n media: {\n type: media.type,\n url: media.url,\n base64: media.base64,\n mimeType: media.mimeType,\n filename: media.filename,\n },\n },\n };\n\n runtime?.log?.(`[53aihub] sendMediaMessage: to=${to}, type=${media.type}, url=${media.url ? \"provided\" : \"none\"}`);\n wsClient.send(JSON.stringify(payload));\n}\n\nexport async function sendThinkingMessage(\n wsClient: WebSocket,\n text: string,\n msgId: string,\n streamId: string,\n runtime?: RuntimeEnv\n): Promise<void> {\n const wsState = wsClient.readyState;\n runtime?.log?.(`[53aihub] sendThinkingMessage CALLED: msgId=${msgId}, streamId=${streamId}, text=${text}, wsReadyState=${wsState}`);\n\n if (wsState !== 1) {\n runtime?.error?.(`[53aihub] sendThinkingMessage SKIPPED: WebSocket not ready (state=${wsState})`);\n return;\n }\n\n // 使用 OpenAI 兼容格式,确保 Go 后端能正确解析\n // 关键:req_id 必须使用原始消息的 msgId,这样 Go 后端才能关联请求和响应\n const chunk = {\n id: streamId,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: \"openclaw-agent\",\n choices: [\n {\n index: 0,\n delta: {\n content: text,\n role: \"assistant\",\n },\n finish_reason: null,\n },\n ],\n };\n\n const payload: AgentHubWsMessage = {\n req_id: msgId,\n action: \"chat\",\n status: \"thinking\",\n data: chunk,\n };\n\n const jsonStr = JSON.stringify(payload);\n runtime?.log?.(`[53aihub] sendThinkingMessage SENDING: ${jsonStr}`);\n \n try {\n wsClient.send(jsonStr);\n runtime?.log?.(`[53aihub] sendThinkingMessage SENT SUCCESS: msgId=${msgId}`);\n } catch (err) {\n runtime?.error?.(`[53aihub] sendThinkingMessage SEND FAILED: ${String(err)}`);\n }\n}","import type { RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport { getRuntime } from \"./runtime.js\";\nimport type { ResolvedAccount } from \"./utils.js\";\nimport { CHANNEL_ID } from \"./const.js\";\n\ninterface AccessPolicyOptions {\n userId: string;\n account: ResolvedAccount;\n wsClient: WebSocket;\n runtime: RuntimeEnv;\n}\n\ninterface AccessPolicyResult {\n allowed: boolean;\n reason?: string;\n}\n\n/**\n * 访问策略检查\n * \n * 策略模式:\n * - \"open\": 允许所有用户(默认)\n * - \"allowlist\": 仅允许 allowFrom 中的用户\n * - \"pairing\": 首次使用需要管理员审批\n */\nexport async function checkAccessPolicy(options: AccessPolicyOptions): Promise<AccessPolicyResult> {\n const { userId, account, runtime } = options;\n const core = getRuntime();\n\n const accessPolicy = account.config.accessPolicy ?? \"open\";\n\n // 开放模式 - 所有用户都能用\n if (accessPolicy === \"open\") {\n return { allowed: true };\n }\n\n // 白名单模式\n if (accessPolicy === \"allowlist\") {\n const allowFrom = account.config.allowFrom ?? [];\n if (allowFrom.includes(userId)) {\n return { allowed: true };\n }\n runtime.log?.(`[53aihub] User ${userId} not in allowlist`);\n return { allowed: false, reason: `User ${userId} not in allowlist` };\n }\n\n // 配对模式 - 首次使用需要审批\n if (accessPolicy === \"pairing\") {\n // 检查配置中的白名单\n const allowFrom = account.config.allowFrom ?? [];\n if (allowFrom.includes(userId)) {\n return { allowed: true };\n }\n\n // 检查持久化的配对记录\n const persistentAllowFrom = await core.channel.pairing.readAllowFromStore({\n channel: CHANNEL_ID,\n accountId: account.accountId,\n });\n\n if (persistentAllowFrom.includes(userId)) {\n return { allowed: true };\n }\n\n // 记录配对请求\n runtime.log?.(`[53aihub] User ${userId} requires pairing. Recording request.`);\n await core.channel.pairing.upsertPairingRequest({\n channel: CHANNEL_ID,\n accountId: account.accountId,\n id: userId,\n meta: {\n displayName: `53AIHub 用户 (${userId})`,\n },\n });\n\n return { allowed: false, reason: \"Pairing required\" };\n }\n\n return { allowed: false };\n}","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { getRuntime } from \"./runtime.js\";\nimport {\n PERSISTENCE_DIR_NAME,\n REQID_STORE_FILENAME,\n REQID_FLUSH_DEBOUNCE_MS,\n REQID_MAX_ENTRIES,\n} from \"./const.js\";\n\nexport interface PersistentReqIdStore {\n set(chatId: string, reqId: string): void;\n get(chatId: string): Promise<string | undefined>;\n getSync(chatId: string): string | undefined;\n delete(chatId: string): void;\n warmup(onError?: (error: unknown) => void): Promise<number>;\n flush(): Promise<void>;\n}\n\nexport function createPersistentReqIdStore(accountId: string): PersistentReqIdStore {\n const memoryCache = new Map<string, string>();\n let flushTimer: NodeJS.Timeout | null = null;\n let isDirty = false;\n\n const getStoreDir = () => {\n const storagePath = getRuntime().state.resolveStateDir();\n const dir = path.join(storagePath, PERSISTENCE_DIR_NAME, accountId);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n };\n\n const getStorePath = () => path.join(getStoreDir(), REQID_STORE_FILENAME);\n\n const scheduleFlush = () => {\n isDirty = true;\n if (flushTimer) return;\n flushTimer = setTimeout(async () => {\n await flush();\n }, REQID_FLUSH_DEBOUNCE_MS);\n };\n\n const flush = async () => {\n if (!isDirty) return;\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n try {\n const data = JSON.stringify(Object.fromEntries(memoryCache));\n const filePath = getStorePath();\n const tmpPath = `${filePath}.tmp`;\n fs.writeFileSync(tmpPath, data);\n fs.renameSync(tmpPath, filePath);\n isDirty = false;\n } catch (error) {\n console.error(`[53aihub] Failed to flush reqId store for ${accountId}:`, error);\n }\n };\n\n return {\n set(chatId: string, reqId: string) {\n memoryCache.set(chatId, reqId);\n if (memoryCache.size > REQID_MAX_ENTRIES) {\n const firstKey = memoryCache.keys().next().value;\n if (firstKey !== undefined) memoryCache.delete(firstKey);\n }\n scheduleFlush();\n },\n async get(chatId: string) {\n return memoryCache.get(chatId);\n },\n getSync(chatId: string) {\n return memoryCache.get(chatId);\n },\n delete(chatId: string) {\n if (memoryCache.delete(chatId)) {\n scheduleFlush();\n }\n },\n async warmup(onError) {\n try {\n const filePath = getStorePath();\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const data = JSON.parse(content);\n memoryCache.clear();\n for (const [k, v] of Object.entries(data)) {\n memoryCache.set(k, v as string);\n }\n return memoryCache.size;\n }\n } catch (error) {\n onError?.(error);\n }\n return 0;\n },\n flush,\n };\n}\n","import type { WebSocket } from \"ws\";\nimport type { MessageState } from \"./interface.js\";\nimport { createPersistentReqIdStore, type PersistentReqIdStore } from \"./reqid-store.js\";\nimport {\n MESSAGE_STATE_TTL_MS,\n MESSAGE_STATE_CLEANUP_INTERVAL_MS,\n MESSAGE_STATE_MAX_SIZE,\n} from \"./const.js\";\n\nconst wsClientInstances = new Map<string, WebSocket>();\n\nexport function getWebSocket(accountId: string): WebSocket | null {\n return wsClientInstances.get(accountId) ?? null;\n}\n\nexport function setWebSocket(accountId: string, client: WebSocket): void {\n wsClientInstances.set(accountId, client);\n}\n\nexport function deleteWebSocket(accountId: string): void {\n wsClientInstances.delete(accountId);\n}\n\ninterface MessageStateEntry {\n state: MessageState;\n createdAt: number;\n}\n\nconst messageStates = new Map<string, MessageStateEntry>();\n\nlet cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\nexport function startMessageStateCleanup(): void {\n if (cleanupTimer) return;\n\n cleanupTimer = setInterval(() => {\n pruneMessageStates();\n }, MESSAGE_STATE_CLEANUP_INTERVAL_MS);\n\n if (cleanupTimer && typeof cleanupTimer === \"object\" && \"unref\" in cleanupTimer) {\n cleanupTimer.unref();\n }\n}\n\nexport function stopMessageStateCleanup(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\nfunction pruneMessageStates(): void {\n const now = Date.now();\n\n for (const [key, entry] of messageStates) {\n if (now - entry.createdAt >= MESSAGE_STATE_TTL_MS) {\n messageStates.delete(key);\n }\n }\n\n if (messageStates.size > MESSAGE_STATE_MAX_SIZE) {\n const sorted = [...messageStates.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt);\n const toRemove = sorted.slice(0, messageStates.size - MESSAGE_STATE_MAX_SIZE);\n for (const [key] of toRemove) {\n messageStates.delete(key);\n }\n }\n}\n\nexport function setMessageState(messageId: string, state: MessageState): void {\n messageStates.set(messageId, {\n state,\n createdAt: Date.now(),\n });\n}\n\nexport function getMessageState(messageId: string): MessageState | undefined {\n const entry = messageStates.get(messageId);\n if (!entry) return undefined;\n\n if (Date.now() - entry.createdAt >= MESSAGE_STATE_TTL_MS) {\n messageStates.delete(messageId);\n return undefined;\n }\n return entry.state;\n}\n\nexport function deleteMessageState(messageId: string): void {\n messageStates.delete(messageId);\n}\n\nexport function clearAllMessageStates(): void {\n messageStates.clear();\n}\n\n// ReqId Persistence Management\nconst reqIdStores = new Map<string, PersistentReqIdStore>();\n\nfunction getOrCreateReqIdStore(accountId: string): PersistentReqIdStore {\n let store = reqIdStores.get(accountId);\n if (!store) {\n store = createPersistentReqIdStore(accountId);\n reqIdStores.set(accountId, store);\n }\n return store;\n}\n\nexport function setLastMsgIdForChat(chatId: string, msgId: string, accountId = \"default\"): void {\n getOrCreateReqIdStore(accountId).set(chatId, msgId);\n}\n\nexport function getLastMsgIdForChat(chatId: string, accountId = \"default\"): string | undefined {\n return getOrCreateReqIdStore(accountId).getSync(chatId);\n}\n\nexport async function warmupReqIdStore(accountId = \"default\", log?: (msg: string) => void): Promise<number> {\n const store = getOrCreateReqIdStore(accountId);\n return store.warmup((err) => log?.(`ReqId warmup error: ${String(err)}`));\n}\n\nexport async function flushReqIdStore(accountId = \"default\"): Promise<void> {\n const store = reqIdStores.get(accountId);\n if (store) await store.flush();\n}\n\nexport async function cleanupAccount(accountId: string): Promise<void> {\n const wsClient = wsClientInstances.get(accountId);\n if (wsClient) {\n try {\n wsClient.close();\n } catch (err) {\n console.error(`[53aihub] Error closing WebSocket for account ${accountId}:`, err);\n }\n wsClientInstances.delete(accountId);\n }\n const store = reqIdStores.get(accountId);\n if (store) await store.flush();\n}\n\nexport async function cleanupAll(): Promise<void> {\n stopMessageStateCleanup();\n\n for (const [accountId, wsClient] of wsClientInstances) {\n try {\n wsClient.close();\n } catch (err) {\n console.error(`[53aihub] Error closing WebSocket for account ${accountId}:`, err);\n }\n }\n wsClientInstances.clear();\n \n for (const [, store] of reqIdStores) {\n await store.flush();\n }\n\n clearAllMessageStates();\n}\n","/**\n * 超时处理工具模块\n */\n\n/**\n * 为 Promise 添加超时保护\n * @param promise 需要包装的 Promise\n * @param ms 超时时间(毫秒)\n * @param message 超时错误消息\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n message: string\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Timeout after ${ms}ms: ${message}`));\n }, ms);\n\n promise\n .then((result) => {\n clearTimeout(timer);\n resolve(result);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n}","import type { OpenClawConfig, RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport { getRuntime } from \"./runtime.js\";\nimport { IMAGE_DOWNLOAD_TIMEOUT_MS, FILE_DOWNLOAD_TIMEOUT_MS, DEFAULT_MEDIA_MAX_MB } from \"./const.js\";\nimport { withTimeout } from \"./timeout.js\";\nimport type { ResolvedAccount } from \"./utils.js\";\n\nasync function detectContentType(data: Buffer): Promise<string> {\n const header = data.slice(0, 12);\n \n if (header[0] === 0xff && header[1] === 0xd8 && header[2] === 0xff) {\n return \"image/jpeg\";\n }\n if (header[0] === 0x89 && header[1] === 0x50 && header[2] === 0x4e && header[3] === 0x47) {\n return \"image/png\";\n }\n if (header[0] === 0x47 && header[1] === 0x49 && header[2] === 0x46) {\n return \"image/gif\";\n }\n if (header[0] === 0x52 && header[1] === 0x49 && header[2] === 0x46 && header[3] === 0x46) {\n if (header[8] === 0x57 && header[9] === 0x45 && header[10] === 0x42 && header[11] === 0x50) {\n return \"image/webp\";\n }\n }\n if (header[4] === 0x66 && header[5] === 0x74 && header[6] === 0x79 && header[7] === 0x70) {\n const ftyp = header.slice(8, 12).toString(\"ascii\");\n if (ftyp.startsWith(\"heic\") || ftyp.startsWith(\"heix\")) return \"image/heic\";\n if (ftyp.startsWith(\"avif\")) return \"image/avif\";\n return \"video/mp4\";\n }\n if (header[0] === 0x25 && header[1] === 0x50 && header[2] === 0x44 && header[3] === 0x46) {\n return \"application/pdf\";\n }\n if (header.slice(0, 4).toString(\"ascii\") === \"PK\\x03\\x04\") {\n return \"application/zip\";\n }\n \n return \"application/octet-stream\";\n}\n\nexport async function downloadAndSaveImages(params: {\n imageUrls: string[];\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n wsClient: WebSocket;\n}): Promise<Array<{ path: string; contentType?: string }>> {\n const { imageUrls, config, runtime } = params;\n const core = getRuntime();\n const mediaList: Array<{ path: string; contentType?: string }> = [];\n\n for (const imageUrl of imageUrls) {\n try {\n runtime.log?.(`[53aihub] Downloading image from: ${imageUrl}`);\n const mediaMaxMb = config.agents?.defaults?.mediaMaxMb ?? DEFAULT_MEDIA_MAX_MB;\n const maxBytes = mediaMaxMb * 1024 * 1024;\n\n const fetched = await withTimeout(\n core.channel.media.fetchRemoteMedia({ url: imageUrl }),\n IMAGE_DOWNLOAD_TIMEOUT_MS,\n `Image download timed out: ${imageUrl}`\n ) as { buffer: Buffer; contentType?: string };\n\n let imageBuffer = fetched.buffer;\n let imageContentType = fetched.contentType ?? await detectContentType(imageBuffer);\n\n runtime.log?.(`[53aihub] Image fetched: contentType=${imageContentType}, size=${imageBuffer.length}`);\n\n const saved = await core.channel.media.saveMediaBuffer(\n imageBuffer,\n imageContentType,\n \"inbound\",\n maxBytes\n );\n mediaList.push({ path: saved.path, contentType: saved.contentType });\n runtime.log?.(`[53aihub] Image saved to ${saved.path}`);\n } catch (err) {\n runtime.error?.(`[53aihub] Failed to download image: ${String(err)}`);\n }\n }\n\n return mediaList;\n}\n\nexport async function downloadAndSaveFiles(params: {\n fileUrls: string[];\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n wsClient: WebSocket;\n}): Promise<Array<{ path: string; contentType?: string }>> {\n const { fileUrls, config, runtime } = params;\n const core = getRuntime();\n const mediaList: Array<{ path: string; contentType?: string }> = [];\n\n for (const fileUrl of fileUrls) {\n try {\n runtime.log?.(`[53aihub] Downloading file from: ${fileUrl}`);\n const mediaMaxMb = config.agents?.defaults?.mediaMaxMb ?? DEFAULT_MEDIA_MAX_MB;\n const maxBytes = mediaMaxMb * 1024 * 1024;\n\n const fetched = await withTimeout(\n core.channel.media.fetchRemoteMedia({ url: fileUrl }),\n FILE_DOWNLOAD_TIMEOUT_MS,\n `File download timed out: ${fileUrl}`\n ) as { buffer: Buffer; contentType?: string };\n\n let fileBuffer = fetched.buffer;\n let fileContentType = fetched.contentType ?? await detectContentType(fileBuffer);\n\n runtime.log?.(`[53aihub] File fetched: contentType=${fileContentType}, size=${fileBuffer.length}`);\n\n const saved = await core.channel.media.saveMediaBuffer(\n fileBuffer,\n fileContentType,\n \"inbound\",\n maxBytes\n );\n mediaList.push({ path: saved.path, contentType: saved.contentType });\n runtime.log?.(`[53aihub] File saved to ${saved.path}`);\n } catch (err) {\n runtime.error?.(`[53aihub] Failed to download file: ${String(err)}`);\n }\n }\n\n return mediaList;\n}","import type { OpenClawConfig, RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport WebSocket from \"ws\";\nimport { getRuntime } from \"./runtime.js\";\nimport type { ResolvedAccount } from \"./utils.js\";\nimport {\n CHANNEL_ID,\n MESSAGE_PROCESS_TIMEOUT_MS,\n WS_HEARTBEAT_INTERVAL_MS,\n WS_MAX_RECONNECT_ATTEMPTS,\n WS_RECONNECT_BASE_DELAY_MS,\n MEDIA_IMAGE_PLACEHOLDER,\n MEDIA_DOCUMENT_PLACEHOLDER,\n THINKING_MESSAGE,\n} from \"./const.js\";\nimport type { MonitorOptions, MessageState, AgentHubIncomingMessage, AgentHubWsMessage } from \"./interface.js\";\nimport { ErrorCode, inferErrorCode } from \"./interface.js\";\nimport { parseIncomingMessage, parseMessageContent } from \"./message-parser.js\";\nimport { sendReply, sendThinkingMessage } from \"./message-sender.js\";\nimport { checkAccessPolicy } from \"./access-policy.js\";\nimport {\n setWebSocket,\n setMessageState,\n deleteMessageState,\n startMessageStateCleanup,\n cleanupAccount,\n setLastMsgIdForChat,\n warmupReqIdStore,\n} from \"./state-manager.js\";\nimport { withTimeout } from \"./timeout.js\";\nimport { downloadAndSaveImages, downloadAndSaveFiles } from \"./media-handler.js\";\n\n// 消息队列处理器 - 确保消息按顺序处理,避免竞态条件\nclass MessageQueue {\n private queue: Array<() => Promise<void>> = [];\n private processing = false;\n private runtime: RuntimeEnv;\n\n constructor(runtime: RuntimeEnv) {\n this.runtime = runtime;\n }\n\n enqueue(task: () => Promise<void>): void {\n this.queue.push(task);\n this.process();\n }\n\n private async process(): Promise<void> {\n if (this.processing || this.queue.length === 0) return;\n \n this.processing = true;\n try {\n const task = this.queue.shift();\n if (task) {\n await task();\n }\n } catch (err) {\n this.runtime.error?.(`[53aihub] MessageQueue error: ${String(err)}`);\n } finally {\n this.processing = false;\n // 继续处理队列中的下一条消息\n if (this.queue.length > 0) {\n this.process();\n }\n }\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\nfunction buildMessageContext(\n body: AgentHubIncomingMessage,\n account: ResolvedAccount,\n config: OpenClawConfig,\n mediaList: Array<{ path: string; contentType?: string }>,\n) {\n const core = getRuntime();\n const chatId = body.chatId || body.userId;\n\n const route = core.channel.routing.resolveAgentRoute({\n cfg: config,\n channel: CHANNEL_ID,\n accountId: account.accountId,\n peer: {\n kind: \"direct\",\n id: chatId,\n },\n });\n\n const hasImages = mediaList.some((m) => m.contentType?.startsWith(\"image/\"));\n const messageBody = body.text || (mediaList.length > 0 ? (hasImages ? MEDIA_IMAGE_PLACEHOLDER : MEDIA_DOCUMENT_PLACEHOLDER) : \"\");\n\n const mediaPaths = mediaList.length > 0 ? mediaList.map((m) => m.path) : undefined;\n const mediaTypes = mediaList.length > 0\n ? (mediaList.map((m) => m.contentType).filter(Boolean) as string[])\n : undefined;\n\n return core.channel.reply.finalizeInboundContext({\n Body: messageBody,\n RawBody: messageBody,\n CommandBody: messageBody,\n MessageSid: body.msgId,\n From: `${CHANNEL_ID}:${body.userId}`,\n To: `${CHANNEL_ID}:${chatId}`,\n SenderId: body.userId,\n SessionKey: route.sessionKey,\n AccountId: account.accountId,\n ChatType: \"direct\",\n ConversationLabel: `user:${body.userId}`,\n Timestamp: Date.now(),\n Provider: CHANNEL_ID,\n Surface: CHANNEL_ID,\n OriginatingChannel: CHANNEL_ID,\n OriginatingTo: `${CHANNEL_ID}:${chatId}`,\n CommandAuthorized: true,\n ReplyToBody: body.quoteContent,\n MediaPath: mediaList[0]?.path,\n MediaType: mediaList[0]?.contentType,\n MediaPaths: mediaPaths,\n MediaTypes: mediaTypes,\n MediaUrls: mediaPaths,\n });\n}\n\nasync function processMessage(params: {\n rawPayload: string;\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n wsClient: WebSocket;\n}) {\n const { rawPayload, account, config, runtime, wsClient } = params;\n \n runtime.log?.(`[53aihub] processMessage: rawPayload length=${rawPayload.length}`);\n \n const body = parseIncomingMessage(rawPayload);\n if (!body) {\n runtime.log?.(`[53aihub] processMessage: parseIncomingMessage returned null`);\n return;\n }\n\n const parsed = parseMessageContent(body);\n const hasMedia = parsed.imageUrls.length > 0 || parsed.fileUrls.length > 0;\n \n if (!parsed.textParts.join(\"\\n\").trim() && !hasMedia) {\n runtime.log?.(`[53aihub] processMessage: empty message, body=${JSON.stringify(body)}`);\n return;\n }\n\n const chatId = body.chatId || body.userId;\n runtime.log?.(`[53aihub] processMessage: chatId=${chatId}, msgId=${body.msgId}, text=${parsed.textParts.join(\" \").substring(0, 50)}... images=${parsed.imageUrls.length} files=${parsed.fileUrls.length}`);\n\n const core = getRuntime();\n const streamId = `stream-${Date.now()}`;\n\n const accessResult = await checkAccessPolicy({\n userId: body.userId,\n account,\n wsClient,\n runtime,\n });\n\n if (!accessResult.allowed) {\n await sendReply({\n wsClient,\n text: accessResult.reason === \"Pairing required\" \n ? \"您尚未获得授权使用此机器人,请联系管理员进行审核。\"\n : `⚠️ 访问被拒绝: ${accessResult.reason || \"未知原因\"}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId,\n isError: true,\n errorCode: ErrorCode.ACCESS_DENIED,\n errorDetails: accessResult.reason,\n });\n return;\n }\n\n setLastMsgIdForChat(chatId, body.msgId, account.accountId);\n\n const state: MessageState = { accumulatedText: \"\", lastSentText: \"\", streamId };\n setMessageState(body.msgId, state);\n\n if (account.sendThinkingMessage) {\n runtime.log?.(`[53aihub] processMessage: sendThinkingMessage=${account.sendThinkingMessage}, about to send thinking message`);\n try {\n await sendThinkingMessage(wsClient, THINKING_MESSAGE, body.msgId, state.streamId, runtime);\n runtime.log?.(`[53aihub] processMessage: thinking message sent successfully`);\n } catch (err) {\n runtime.error?.(`[53aihub] Failed to send thinking message: ${String(err)}`);\n }\n } else {\n runtime.log?.(`[53aihub] processMessage: sendThinkingMessage=${account.sendThinkingMessage}, SKIPPING thinking message`);\n }\n\n const cleanupState = () => {\n deleteMessageState(body.msgId);\n };\n\n const [imageMediaList, fileMediaList] = await Promise.all([\n downloadAndSaveImages({\n imageUrls: parsed.imageUrls,\n account,\n config,\n runtime,\n wsClient,\n }),\n downloadAndSaveFiles({\n fileUrls: parsed.fileUrls,\n account,\n config,\n runtime,\n wsClient,\n }),\n ]);\n const mediaList = [...imageMediaList, ...fileMediaList];\n\n const ctxPayload = buildMessageContext(body, account, config, mediaList);\n\n let cleanedUp = false;\n const safeCleanup = () => {\n if (!cleanedUp) {\n cleanedUp = true;\n cleanupState();\n }\n };\n\n runtime.log?.(`[53aihub] processMessage: Starting dispatchReplyWithBufferedBlockDispatcher for msgId=${body.msgId}`);\n\n try {\n await withTimeout(\n core.channel.reply.dispatchReplyWithBufferedBlockDispatcher({\n ctx: ctxPayload,\n cfg: config,\n dispatcherOptions: {\n deliver: async (payload, info) => {\n state.accumulatedText += payload.text;\n runtime.log?.(`[53aihub] deliver: kind=${info.kind}, textLen=${payload.text?.length || 0}, accumulatedLen=${state.accumulatedText.length}, isError=${payload.isError}`);\n\n if (payload.isError) {\n const errorMsg = payload.text || \"Unknown error\";\n const errorCode = inferErrorCode(errorMsg);\n runtime.error?.(`[53aihub] deliver ERROR: ${errorMsg}`);\n await sendReply({\n wsClient,\n text: `⚠️ ${errorMsg}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n isError: true,\n errorCode,\n errorDetails: errorMsg,\n });\n return;\n }\n\n if (info.kind !== \"final\") {\n runtime.log?.(`[53aihub] deliver STREAMING: accumulatedText preview=${state.accumulatedText.substring(0, 50)}...`);\n await sendReply({\n wsClient,\n text: state.accumulatedText,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: false,\n streamId: state.streamId,\n });\n }\n },\n onError: async (err, info) => {\n runtime.error?.(`[53aihub] onError: kind=${info.kind}, error=${String(err)}`);\n const errorText = String(err);\n const errorCode = inferErrorCode(errorText);\n try {\n await sendReply({\n wsClient,\n text: `⚠️ 系统错误: ${errorText}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n isError: true,\n errorCode,\n errorDetails: `kind=${info.kind}, error=${errorText}`,\n });\n } catch (sendErr) {\n runtime.error?.(`[53aihub] Failed to send error notification: ${String(sendErr)}`);\n }\n },\n },\n }),\n MESSAGE_PROCESS_TIMEOUT_MS,\n `Message processing timed out (msgId=${body.msgId})`\n );\n\n runtime.log?.(`[53aihub] processMessage: dispatchReply completed, accumulatedTextLen=${state.accumulatedText.length}`);\n\n if (state.accumulatedText) {\n runtime.log?.(`[53aihub] processMessage: Sending final reply with accumulatedText`);\n await sendReply({\n wsClient,\n text: state.accumulatedText,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n });\n } else {\n runtime.log?.(`[53aihub] processMessage: No accumulatedText, sending empty final reply`);\n await sendReply({\n wsClient,\n text: \"\",\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n });\n }\n\n safeCleanup();\n } catch (err) {\n runtime.error?.(`[53aihub] processMessage FAILED: ${String(err)}`);\n const errorText = String(err);\n const errorCode = inferErrorCode(errorText);\n \n if (!cleanedUp) {\n try {\n await sendReply({\n wsClient,\n text: `⚠️ 处理请求时发生异常: ${errorText}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n isError: true,\n errorCode,\n errorDetails: errorText,\n });\n } catch (sendErr) {\n runtime.error?.(`[53aihub] Failed to send final error notification: ${String(sendErr)}`);\n }\n }\n \n safeCleanup();\n }\n}\n\nexport async function monitorProvider(options: MonitorOptions): Promise<void> {\n const { account, config, runtime, abortSignal } = options;\n \n runtime.log?.(`[${account.accountId}] Initializing WS connection to 53AIHub...`);\n startMessageStateCleanup();\n\n return new Promise((resolve, reject) => {\n let wsClient: WebSocket | null = null;\n let reconnectAttempts = 0;\n let pingInterval: NodeJS.Timeout | null = null;\n let isAborted = false;\n let messageQueue: MessageQueue | null = null;\n\n const cleanup = async () => {\n if (pingInterval) {\n clearInterval(pingInterval);\n pingInterval = null;\n }\n if (messageQueue) {\n messageQueue.clear();\n messageQueue = null;\n }\n await cleanupAccount(account.accountId);\n };\n\n const connect = () => {\n if (isAborted) return;\n \n // 安全: 不在 URL 中传递敏感信息,仅通过 headers 传递认证\n const wsUrl = account.websocketUrl;\n const botId = account.botId || account.config.botId;\n const secret = account.secret || account.token || account.config.secret || account.config.token;\n\n // 日志输出时隐藏敏感信息\n const safeUrl = new URL(wsUrl);\n const logUrl = `${safeUrl.origin}${safeUrl.pathname}`;\n\n const authBase64 = Buffer.from(`${botId}:${secret}`).toString('base64');\n\n const wsOptions = {\n headers: {\n \"Authorization\": `Bearer ${secret}`,\n \"Proxy-Authorization\": `Basic ${authBase64}`,\n \"X-Bot-Id\": botId || \"\",\n \"X-Api-Key\": secret || \"\",\n } as Record<string, string>\n };\n\n runtime.log?.(`[${account.accountId}] Connecting to ${logUrl} ...`);\n wsClient = new WebSocket(wsUrl, wsOptions);\n setWebSocket(account.accountId, wsClient);\n \n // 初始化消息队列\n messageQueue = new MessageQueue(runtime);\n\n wsClient.on(\"open\", () => {\n runtime.log?.(`[${account.accountId}] WebSocket connected successfully`);\n reconnectAttempts = 0;\n pingInterval = setInterval(() => {\n if (wsClient?.readyState === WebSocket.OPEN) {\n wsClient.ping();\n }\n }, WS_HEARTBEAT_INTERVAL_MS);\n });\n\n wsClient.on(\"message\", (data: Buffer | string) => {\n const rawPayload = data.toString();\n runtime.log?.(`[${account.accountId}] Received WS message: ${rawPayload.substring(0, 200)}...`);\n \n // 使用消息队列确保顺序处理,避免竞态条件\n messageQueue?.enqueue(async () => {\n await processMessage({\n rawPayload,\n account,\n config,\n runtime,\n wsClient: wsClient!,\n });\n });\n });\n\n wsClient.on(\"error\", (err) => {\n runtime.error?.(`[${account.accountId}] WebSocket Error: ${String(err)}`);\n });\n\n wsClient.on(\"close\", async (code, reason) => {\n runtime.log?.(`[${account.accountId}] WebSocket closed. Code: ${code}, Reason: ${reason}`);\n \n // 清理资源\n if (pingInterval) {\n clearInterval(pingInterval);\n pingInterval = null;\n }\n if (messageQueue) {\n messageQueue.clear();\n messageQueue = null;\n }\n \n if (!isAborted && reconnectAttempts < WS_MAX_RECONNECT_ATTEMPTS) {\n reconnectAttempts++;\n const backoff = Math.min(WS_RECONNECT_BASE_DELAY_MS * Math.pow(2, reconnectAttempts), 30000);\n runtime.log?.(`[${account.accountId}] Reconnecting in ${backoff}ms... (attempt ${reconnectAttempts}/${WS_MAX_RECONNECT_ATTEMPTS})`);\n setTimeout(connect, backoff);\n } else if (!isAborted) {\n runtime.error?.(`[${account.accountId}] Max reconnect attempts (${WS_MAX_RECONNECT_ATTEMPTS}) reached`);\n await cleanup();\n reject(new Error(`Max reconnect attempts (${WS_MAX_RECONNECT_ATTEMPTS}) reached`));\n }\n });\n };\n\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", async () => {\n isAborted = true;\n await cleanup();\n resolve();\n });\n }\n\n warmupReqIdStore(account.accountId, (msg) => runtime.log?.(msg))\n .then(() => connect())\n .catch(async (err) => {\n runtime.error?.(`[${account.accountId}] Failed to warmup ReqId store: ${String(err)}`);\n await cleanup();\n reject(err);\n });\n });\n}","import type { OpenClawConfig } from \"openclaw/plugin-sdk\";\nimport { DEFAULT_ACCOUNT_ID } from \"openclaw/plugin-sdk\";\nimport { CHANNEL_ID, DEFAULT_WS_URL } from \"./const.js\";\n\n// ============================================================================\n// 配置类型定义\n// ============================================================================\n\n/**\n * 53AIHub 渠道配置\n */\nexport interface AIHubConfig {\n /** 是否启用 */\n enabled?: boolean;\n /** 账户名称 */\n name?: string;\n /** 机器人 ID */\n botId?: string;\n /** 用户 ID */\n userId?: string;\n /** 密钥 */\n secret?: string;\n /** 访问令牌 */\n token?: string;\n /** WebSocket URL */\n websocketUrl?: string;\n \n /** 访问控制白名单 */\n allowFrom?: Array<string | number>;\n /** 访问策略: open=开放, allowlist=白名单, pairing=配对审批 */\n accessPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n \n /** 是否发送\"思考中\"消息 */\n sendThinkingMessage?: boolean;\n}\n\n/**\n * 解析后的账户配置\n */\nexport interface ResolvedAccount {\n accountId: string;\n name: string;\n enabled: boolean;\n websocketUrl: string;\n botId: string;\n secret: string;\n token: string;\n sendThinkingMessage: boolean;\n config: AIHubConfig;\n}\n\n// ============================================================================\n// 配置解析函数\n// ============================================================================\n\n/**\n * 解析账户配置\n */\nexport function resolveAccount(cfg: OpenClawConfig, accountId = DEFAULT_ACCOUNT_ID): ResolvedAccount {\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n \n return {\n accountId,\n name: config.name ?? \"53AIHub\",\n enabled: config.enabled !== false,\n websocketUrl: config.websocketUrl || DEFAULT_WS_URL,\n botId: config.botId ?? config.userId ?? \"\",\n secret: config.secret ?? config.token ?? \"\",\n token: config.token ?? config.secret ?? \"\",\n sendThinkingMessage: config.sendThinkingMessage ?? true,\n config,\n };\n}\n\n/**\n * 设置账户配置\n */\nexport function setAccount(\n cfg: OpenClawConfig,\n account: Partial<AIHubConfig>\n): OpenClawConfig {\n const existing = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n const merged: AIHubConfig = {\n enabled: account.enabled ?? existing.enabled ?? true,\n botId: account.botId ?? existing.botId ?? \"\",\n secret: account.secret ?? existing.secret ?? \"\",\n token: account.token ?? existing.token ?? \"\",\n allowFrom: account.allowFrom ?? existing.allowFrom,\n accessPolicy: account.accessPolicy ?? existing.accessPolicy,\n sendThinkingMessage: account.sendThinkingMessage ?? existing.sendThinkingMessage,\n ...(account.websocketUrl || existing.websocketUrl\n ? { websocketUrl: account.websocketUrl ?? existing.websocketUrl }\n : {}),\n ...(account.name || existing.name\n ? { name: account.name ?? existing.name }\n : {}),\n };\n\n return {\n ...cfg,\n channels: {\n ...cfg.channels,\n [CHANNEL_ID]: merged,\n },\n };\n}","import {\n addWildcardAllowFrom,\n type ChannelOnboardingAdapter,\n type ChannelOnboardingDmPolicy,\n type OpenClawConfig,\n type WizardPrompter,\n} from \"openclaw/plugin-sdk\";\nimport { CHANNEL_ID } from \"./const.js\";\nimport type { AIHubConfig } from \"./utils.js\";\nimport { resolveAccount, setAccount } from \"./utils.js\";\n\nconst channel = CHANNEL_ID;\n\nasync function noteSetupHelp(prompter: WizardPrompter): Promise<void> {\n await prompter.note(\n [\n \"53AIHub 智能机器人需要以下配置信息:\",\n \"1. Bot ID: 机器人标识\",\n \"2. Secret: 机器人密钥\",\n \"3. WebSocket URL: WebSocket 连接地址\",\n ].join(\"\\n\"),\n \"53AIHub 设置\",\n );\n}\n\nasync function promptBotId(\n prompter: WizardPrompter,\n account: ReturnType<typeof resolveAccount> | null,\n): Promise<string> {\n return String(\n await prompter.text({\n message: \"53AIHub 机器人 Bot ID\",\n initialValue: account?.botId ?? \"\",\n validate: (value) => (value?.trim() ? undefined : \"必填\"),\n }),\n ).trim();\n}\n\nasync function promptSecret(\n prompter: WizardPrompter,\n account: ReturnType<typeof resolveAccount> | null,\n): Promise<string> {\n return String(\n await prompter.text({\n message: \"53AIHub 机器人 Secret\",\n initialValue: account?.secret ?? \"\",\n validate: (value) => (value?.trim() ? undefined : \"必填\"),\n }),\n ).trim();\n}\n\nasync function promptWebsocketUrl(\n prompter: WizardPrompter,\n account: ReturnType<typeof resolveAccount> | null,\n): Promise<string> {\n return String(\n await prompter.text({\n message: \"WebSocket URL (例如: ws://localhost:8080/ws)\",\n initialValue: account?.websocketUrl ?? \"\",\n validate: (value) => {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n if (!trimmed.startsWith(\"ws://\") && !trimmed.startsWith(\"wss://\")) {\n return \"URL 必须以 ws:// 或 wss:// 开头\";\n }\n return undefined;\n },\n }),\n ).trim();\n}\n\nfunction setAccessPolicy(\n cfg: OpenClawConfig,\n accessPolicy: \"pairing\" | \"allowlist\" | \"open\" | \"disabled\",\n): OpenClawConfig {\n const account = resolveAccount(cfg);\n const existingAllowFrom = account.config.allowFrom ?? [];\n const allowFrom =\n accessPolicy === \"open\"\n ? addWildcardAllowFrom(existingAllowFrom.map((x) => String(x)))\n : existingAllowFrom.map((x) => String(x));\n\n return setAccount(cfg, {\n accessPolicy,\n allowFrom,\n });\n}\n\nconst dmPolicy: ChannelOnboardingDmPolicy = {\n label: \"53AIHub\",\n channel,\n policyKey: `channels.${CHANNEL_ID}.accessPolicy`,\n allowFromKey: `channels.${CHANNEL_ID}.allowFrom`,\n getCurrent: (cfg) => {\n const account = resolveAccount(cfg);\n return account.config.accessPolicy ?? \"open\";\n },\n setPolicy: (cfg, policy) => {\n return setAccessPolicy(cfg, policy);\n },\n promptAllowFrom: async ({ cfg, prompter }) => {\n const account = resolveAccount(cfg);\n const existingAllowFrom = account.config.allowFrom ?? [];\n\n const entry = await prompter.text({\n message: \"允许使用的用户ID(每行一个)\",\n placeholder: \"user123\",\n initialValue: existingAllowFrom[0] ? String(existingAllowFrom[0]) : undefined,\n });\n\n const allowFrom = String(entry ?? \"\")\n .split(/[\\n,;]+/g)\n .map((s) => s.trim())\n .filter(Boolean);\n\n return setAccount(cfg, { allowFrom });\n },\n};\n\nexport const aiHubOnboardingAdapter: ChannelOnboardingAdapter = {\n channel,\n getStatus: async ({ cfg }) => {\n const account = resolveAccount(cfg);\n const configured = Boolean(\n account.botId?.trim() &&\n account.secret?.trim()\n );\n\n return {\n channel,\n configured,\n statusLines: [`53AIHub: ${configured ? \"已配置\" : \"需要 Bot ID 和 Secret\"}`],\n selectionHint: configured ? \"已配置\" : \"需要设置\",\n };\n },\n configure: async ({ cfg, prompter, forceAllowFrom }) => {\n const account = resolveAccount(cfg);\n\n if (!account.botId?.trim() || !account.secret?.trim()) {\n await noteSetupHelp(prompter);\n }\n\n const botId = await promptBotId(prompter, account);\n const secret = await promptSecret(prompter, account);\n const websocketUrl = await promptWebsocketUrl(prompter, account);\n\n const cfgWithAccount = setAccount(cfg, {\n botId,\n secret,\n websocketUrl: websocketUrl || undefined,\n enabled: true,\n accessPolicy: account.config.accessPolicy ?? \"open\",\n allowFrom: account.config.allowFrom ?? [],\n sendThinkingMessage: account.sendThinkingMessage ?? true,\n });\n\n return { cfg: cfgWithAccount };\n },\n dmPolicy,\n disable: (cfg) => {\n return setAccount(cfg, { enabled: false });\n },\n};","import {\n DEFAULT_ACCOUNT_ID,\n formatPairingApproveHint,\n type ChannelPlugin,\n type ChannelStatusIssue,\n type OpenClawConfig,\n} from \"openclaw/plugin-sdk\";\n\nimport { getRuntime } from \"./runtime.js\";\nimport { monitorProvider } from \"./monitor.js\";\nimport { getWebSocket } from \"./state-manager.js\";\nimport type { AIHubConfig, ResolvedAccount } from \"./utils.js\";\nimport { resolveAccount } from \"./utils.js\";\nimport { CHANNEL_ID, TEXT_CHUNK_LIMIT } from \"./const.js\";\nimport { sendDirectMessage, sendMediaMessage } from \"./message-sender.js\";\nimport { aiHubOnboardingAdapter } from \"./onboarding.js\";\n\nconst meta = {\n id: CHANNEL_ID,\n label: \"53AIHub\",\n selectionLabel: \"53AIHub (AgentHub)\",\n detailLabel: \"53AIHub 智能机器人\",\n docsPath: `/channels/${CHANNEL_ID}`,\n docsLabel: CHANNEL_ID,\n blurb: \"53AIHub 智能机器人接入插件\",\n systemImage: \"message.fill\",\n};\n\nexport const aiHubPlugin: ChannelPlugin<ResolvedAccount> = {\n id: CHANNEL_ID,\n meta: {\n ...meta,\n quickstartAllowFrom: true,\n },\n pairing: {\n idLabel: \"userId\",\n normalizeAllowEntry: (entry) => entry.replace(new RegExp(`^(${CHANNEL_ID}|user):`, \"i\"), \"\").trim(),\n notifyApproval: async ({ cfg, id }) => {\n console.log(`[53aihub] Pairing approved for user: ${id}`);\n },\n },\n onboarding: aiHubOnboardingAdapter,\n capabilities: {\n chatTypes: [\"direct\"],\n reactions: false,\n threads: false,\n media: true,\n nativeCommands: false,\n blockStreaming: true,\n },\n reload: { configPrefixes: [`channels.${CHANNEL_ID}`] },\n config: {\n listAccountIds: () => [DEFAULT_ACCOUNT_ID],\n resolveAccount: (cfg) => resolveAccount(cfg),\n defaultAccountId: () => DEFAULT_ACCOUNT_ID,\n setAccountEnabled: ({ cfg, enabled }) => {\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n return {\n ...cfg,\n channels: {\n ...cfg.channels,\n [CHANNEL_ID]: { ...config, enabled },\n },\n };\n },\n deleteAccount: ({ cfg }) => {\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n const { botId, secret, token, ...rest } = config;\n return {\n ...cfg,\n channels: {\n ...cfg.channels,\n [CHANNEL_ID]: rest,\n },\n };\n },\n isConfigured: (account) =>\n Boolean((account.botId?.trim() || account.token?.trim()) || account.secret?.trim()),\n describeAccount: (account) => ({\n accountId: account.accountId,\n name: account.name,\n enabled: account.enabled,\n configured: Boolean(account.botId?.trim() || account.token?.trim()),\n botId: account.botId,\n websocketUrl: account.websocketUrl,\n accessPolicy: account.config.accessPolicy ?? \"open\",\n }),\n resolveAllowFrom: ({ cfg }) => {\n const account = resolveAccount(cfg);\n return (account.config.allowFrom ?? []).map((entry) => String(entry));\n },\n formatAllowFrom: ({ allowFrom }) =>\n allowFrom.map((entry) => String(entry).trim()).filter(Boolean),\n },\n security: {\n resolveDmPolicy: ({ account }) => {\n const basePath = `channels.${CHANNEL_ID}.`;\n const accessPolicy = account.config.accessPolicy ?? \"open\";\n return {\n policy: accessPolicy === \"pairing\" ? \"pairing\" : accessPolicy === \"allowlist\" ? \"allowlist\" : \"open\",\n allowFrom: account.config.allowFrom ?? [],\n policyPath: `${basePath}accessPolicy`,\n allowFromPath: basePath,\n approveHint: formatPairingApproveHint(CHANNEL_ID),\n normalizeEntry: (raw) => raw.replace(new RegExp(`^${CHANNEL_ID}:`, \"i\"), \"\").trim(),\n };\n },\n collectWarnings: ({ account }) => {\n const warnings: string[] = [];\n const accessPolicy = account.config.accessPolicy ?? \"open\";\n \n if (accessPolicy === \"open\") {\n warnings.push(\n `- 访问策略为 \"open\",所有用户都可以使用机器人`\n );\n }\n \n return warnings;\n },\n },\n messaging: {\n normalizeTarget: (target) => {\n const trimmed = target.trim();\n if (!trimmed) return undefined;\n return trimmed;\n },\n targetResolver: {\n looksLikeId: (id) => Boolean(id?.trim()),\n hint: \"<userId|chatId>\",\n },\n },\n directory: {\n self: async () => null,\n listPeers: async () => [],\n listGroups: async () => [],\n },\n outbound: {\n deliveryMode: \"direct\",\n chunker: (text, limit) => getRuntime().channel.text.chunkMarkdownText(text, limit),\n textChunkLimit: TEXT_CHUNK_LIMIT,\n sendText: async ({ to, text, accountId, ...rest }) => {\n const wsClient = getWebSocket(accountId ?? DEFAULT_ACCOUNT_ID);\n if (!wsClient) {\n throw new Error(`[53aihub] WS Client not connected for account ${accountId}`);\n }\n \n const channelPrefix = new RegExp(`^${CHANNEL_ID}:`, \"i\");\n const targetId = to.replace(channelPrefix, \"\");\n\n await sendDirectMessage(wsClient, targetId, text);\n return {\n channel: CHANNEL_ID,\n messageId: `msg-${Date.now()}`,\n chatId: targetId,\n };\n },\n sendMedia: async ({ to, text, mediaUrl, accountId, ...rest }) => {\n const wsClient = getWebSocket(accountId ?? DEFAULT_ACCOUNT_ID);\n if (!wsClient) {\n throw new Error(`[53aihub] WS Client not connected for account ${accountId}`);\n }\n const channelPrefix = new RegExp(`^${CHANNEL_ID}:`, \"i\");\n const targetId = to.replace(channelPrefix, \"\");\n\n const restAny = rest as Record<string, unknown>;\n const mediaType = restAny.mediaType as string | undefined;\n \n const isImage = mediaType?.startsWith(\"image/\") || \n mediaUrl?.match(/\\.(jpg|jpeg|png|gif|webp|heic|heif|avif)$/i);\n const mediaCategory = isImage ? \"image\" : \"file\";\n\n await sendMediaMessage(wsClient, targetId, {\n type: mediaCategory,\n url: mediaUrl,\n mimeType: mediaType,\n }, text);\n\n return { channel: CHANNEL_ID, messageId: `msg-${Date.now()}`, chatId: targetId };\n },\n },\n status: {\n defaultRuntime: {\n accountId: DEFAULT_ACCOUNT_ID,\n running: false,\n lastStartAt: null,\n lastStopAt: null,\n lastError: null,\n },\n collectStatusIssues: (accounts): ChannelStatusIssue[] =>\n accounts.flatMap((entry) => {\n const accountId = String(entry.accountId ?? DEFAULT_ACCOUNT_ID);\n if (!entry.enabled) return [];\n \n const issues: ChannelStatusIssue[] = [];\n if (!entry.configured) {\n issues.push({\n channel: CHANNEL_ID,\n accountId,\n kind: \"config\",\n message: \"53AIHub 访问令牌未配置\",\n fix: \"Run: openclaw channels add 53aihub --token <your_token>\",\n });\n }\n return issues;\n }),\n buildChannelSummary: ({ snapshot }) => ({\n configured: snapshot.configured ?? false,\n running: snapshot.running ?? false,\n lastStartAt: snapshot.lastStartAt ?? null,\n lastStopAt: snapshot.lastStopAt ?? null,\n lastError: snapshot.lastError ?? null,\n }),\n probeAccount: async () => ({ ok: true, status: 200 }),\n buildAccountSnapshot: ({ account, runtime }) => ({\n accountId: account.accountId,\n name: account.name,\n enabled: account.enabled,\n configured: Boolean(account.botId?.trim() || account.token?.trim() || account.secret?.trim()),\n running: runtime?.running ?? false,\n lastStartAt: runtime?.lastStartAt ?? null,\n lastStopAt: runtime?.lastStopAt ?? null,\n lastError: runtime?.lastError ?? null,\n }),\n },\n gateway: {\n startAccount: async (ctx) => {\n return monitorProvider({\n account: ctx.account,\n config: ctx.cfg,\n runtime: ctx.runtime,\n abortSignal: ctx.abortSignal,\n });\n },\n logoutAccount: async ({ cfg }) => {\n const nextCfg = { ...cfg } as OpenClawConfig;\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n const nextConfig = { ...config };\n let cleared = false;\n let changed = false;\n\n if (nextConfig.botId || nextConfig.secret || nextConfig.token) {\n delete nextConfig.botId;\n delete nextConfig.secret;\n delete nextConfig.token;\n cleared = true;\n changed = true;\n }\n\n if (changed) {\n if (Object.keys(nextConfig).length > 0) {\n nextCfg.channels = { ...nextCfg.channels, [CHANNEL_ID]: nextConfig };\n } else {\n const nextChannels = { ...nextCfg.channels };\n delete (nextChannels as Record<string, unknown>)[CHANNEL_ID];\n nextCfg.channels = Object.keys(nextChannels).length > 0 ? nextChannels : undefined;\n }\n await getRuntime().config.writeConfigFile(nextCfg);\n }\n\n const resolved = resolveAccount(changed ? nextCfg : cfg);\n const loggedOut = !resolved.botId && !resolved.secret && !resolved.config.token;\n\n return { cleared, envToken: false, loggedOut };\n },\n },\n};","import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { emptyPluginConfigSchema } from \"openclaw/plugin-sdk\";\n\nimport { aiHubPlugin } from \"./src/channel.js\";\nimport { setRuntime } from \"./src/runtime.js\";\n\nconst plugin = {\n id: \"53ai-openclaw\",\n name: \"53AI OpenClaw\",\n description: \"53AIHub (AgentHub) OpenClaw 插件\",\n configSchema: emptyPluginConfigSchema(),\n register(api: OpenClawPluginApi) {\n setRuntime(api.runtime);\n api.registerChannel({ plugin: aiHubPlugin });\n },\n};\n\nexport default plugin;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../src/runtime.ts","../../src/const.ts","../../src/interface.ts","../../src/message-parser.ts","../../src/message-sender.ts","../../src/access-policy.ts","../../src/reqid-store.ts","../../src/state-manager.ts","../../src/timeout.ts","../../src/media-handler.ts","../../src/monitor.ts","../../src/utils.ts","../../src/onboarding.ts","../../src/channel.ts","../../index.ts"],"sourcesContent":["import type { PluginRuntime } from \"openclaw/plugin-sdk\";\n\nlet runtime: PluginRuntime | null = null;\n\nexport function setRuntime(r: PluginRuntime): void {\n runtime = r;\n}\n\nexport function getRuntime(): PluginRuntime {\n if (!runtime) {\n throw new Error(\"Plugin runtime not initialized - plugin not registered\");\n }\n return runtime;\n}\n","export const CHANNEL_ID = \"53aihub\";\n\n// ============================================================================\n// WebSocket 配置\n// ============================================================================\n\n/** 默认 WebSocket URL */\nexport const DEFAULT_WS_URL = \"ws://localhost:8080/ws\";\n\n/** 心跳间隔(毫秒) */\nexport const WS_HEARTBEAT_INTERVAL_MS = 15000;\n\n/** \n * 最大重连次数\n * 设为 60 次,配合指数退避(最大 30 秒),总重连时间约 30 分钟\n */\nexport const WS_MAX_RECONNECT_ATTEMPTS = 60;\n\n/** 重连基础延迟(毫秒) - 指数退避的起始值 */\nexport const WS_RECONNECT_BASE_DELAY_MS = 1000;\n\n// ============================================================================\n// 消息处理配置\n// ============================================================================\n\n/** 文本分块限制 */\nexport const TEXT_CHUNK_LIMIT = 4000;\n\n/** 消息处理超时(毫秒) */\nexport const MESSAGE_PROCESS_TIMEOUT_MS = 120000;\n\n// ============================================================================\n// 媒体处理配置\n// ============================================================================\n\n/** 默认媒体大小上限(MB) */\nexport const DEFAULT_MEDIA_MAX_MB = 20;\n\n/** 图片下载超时(毫秒) */\nexport const IMAGE_DOWNLOAD_TIMEOUT_MS = 30000;\n\n/** 文件下载超时(毫秒) */\nexport const FILE_DOWNLOAD_TIMEOUT_MS = 60000;\n\n/** 回复发送超时(毫秒) */\nexport const REPLY_SEND_TIMEOUT_MS = 10000;\n\n/** 仅包含图片时的消息占位符 */\nexport const MEDIA_IMAGE_PLACEHOLDER = \"<media:image>\";\n\n/** 仅包含文件时的消息占位符 */\nexport const MEDIA_DOCUMENT_PLACEHOLDER = \"<media:document>\";\n\n// ============================================================================\n// 状态管理配置\n// ============================================================================\n\n/** 消息状态 TTL(毫秒) */\nexport const MESSAGE_STATE_TTL_MS = 5 * 60 * 1000;\n\n/** 消息状态清理间隔(毫秒) */\nexport const MESSAGE_STATE_CLEANUP_INTERVAL_MS = 60 * 1000;\n\n/** 消息状态最大条目数 */\nexport const MESSAGE_STATE_MAX_SIZE = 1000;\n\n// ============================================================================\n// 持久化配置\n// ============================================================================\n\n/** 持久化目录名称 */\nexport const PERSISTENCE_DIR_NAME = \".53aihub_store\";\n\n/** ReqId 存储文件名 */\nexport const REQID_STORE_FILENAME = \"reqid_map.json\";\n\n/** ReqId 刷写防抖时间(毫秒) */\nexport const REQID_FLUSH_DEBOUNCE_MS = 2000;\n\n/** ReqId 最大条目数 */\nexport const REQID_MAX_ENTRIES = 5000;\n\nexport const THINKING_MESSAGE = \"🤔 正在思考中...\";\n\n// ============================================================================\n// 默认策略\n// ============================================================================\n\nexport const DEFAULT_ACCESS_POLICY = \"open\";","import type { OpenClawConfig, RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { ResolvedAccount } from \"./utils.js\";\n\n// ============================================================================\n// WebSocket 消息类型\n// ============================================================================\n\n/**\n * OpenAI 兼容的消息格式\n */\nexport interface OpenAIChatMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string | MessageContentItem[];\n name?: string;\n}\n\n/**\n * OpenAI 兼容的请求格式\n */\nexport interface OpenAIChatRequest {\n model?: string;\n messages: OpenAIChatMessage[];\n user?: string;\n conversation_id?: string;\n stream?: boolean;\n}\n\n/**\n * OpenAI 兼容的响应块格式\n */\nexport interface OpenAIChatCompletionChunk {\n id: string;\n object: \"chat.completion.chunk\";\n created: number;\n model: string;\n choices: Array<{\n index: number;\n delta: {\n content?: string;\n role?: string;\n };\n finish_reason: string | null;\n }>;\n error?: ResponseError;\n}\n\n/**\n * 53AIHub 消息数据类型\n */\nexport interface Hub53AIMessageData {\n toChatId?: string;\n text?: string;\n imageUrls?: string[];\n fileUrls?: string[];\n type?: string;\n msgId?: string;\n id?: string;\n chatId?: string;\n userId?: string;\n content?: string;\n quoteContent?: string;\n images?: Array<{ url?: string }>;\n files?: Array<{ url?: string }>;\n media?: {\n type: \"image\" | \"file\";\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n };\n}\n\n/**\n * WebSocket 请求/响应消息基础格式\n */\nexport interface Hub53AIWsMessage {\n req_id: string;\n action: \"chat\" | \"message\" | \"ping\" | \"pong\";\n status: \"streaming\" | \"done\" | \"error\" | \"final\" | \"thinking\";\n data: OpenAIChatRequest | OpenAIChatCompletionChunk | Hub53AIMessageData | null;\n}\n\n/**\n * 图片消息内容\n */\nexport interface ImageContent {\n /** 图片 URL */\n url?: string;\n /** 图片 base64 数据 */\n base64?: string;\n /** 图片 MIME 类型 */\n mimeType?: string;\n}\n\n/**\n * 文件消息内容\n */\nexport interface FileContent {\n /** 文件 URL */\n url?: string;\n /** 文件 base64 数据 */\n base64?: string;\n /** 文件名 */\n filename?: string;\n /** 文件 MIME 类型 */\n mimeType?: string;\n}\n\n/**\n * 消息内容项(支持多模态)\n */\nexport interface MessageContentItem {\n type: \"text\" | \"image\" | \"file\";\n text?: string;\n image?: ImageContent;\n file?: FileContent;\n}\n\n/**\n * 来自 Go 后端的消息\n */\nexport interface Hub53AIIncomingMessage {\n type: string;\n msgId: string;\n chatId: string;\n userId: string;\n text: string;\n /** 图片 URL 列表 */\n imageUrls?: string[];\n /** 文件 URL 列表 */\n fileUrls?: string[];\n /** 多模态消息内容项 */\n contentItems?: MessageContentItem[];\n quoteContent?: string;\n reqId?: string;\n}\n\n/**\n * 发送给 Go 后端的消息\n */\nexport interface Hub53AIOutgoingMessage {\n type: \"reply\" | \"message\";\n msgId?: string;\n chatId: string;\n text: string;\n streamId?: string;\n finish: boolean;\n error?: ResponseError;\n /** 媒体附件 */\n media?: {\n type: \"image\" | \"file\";\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n };\n}\n\n// ============================================================================\n// 配置和运行时类型\n// ============================================================================\n\n/**\n * Monitor 配置选项\n */\nexport interface MonitorOptions {\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n abortSignal?: AbortSignal;\n}\n\n/**\n * 消息状态\n */\nexport interface MessageState {\n accumulatedText: string;\n lastSentText: string;\n streamId: string;\n}\n\n// ============================================================================\n// 错误处理\n// ============================================================================\n\n/**\n * 错误码枚举\n */\nexport enum ErrorCode {\n // 访问控制\n ACCESS_DENIED = \"ACCESS_DENIED\",\n PAIRING_REQUIRED = \"PAIRING_REQUIRED\",\n \n // AI 服务错误\n RATE_LIMITED = \"RATE_LIMITED\",\n INSUFFICIENT_QUOTA = \"INSUFFICIENT_QUOTA\",\n MODEL_OVERLOADED = \"MODEL_OVERLOADED\",\n MODEL_NOT_FOUND = \"MODEL_NOT_FOUND\",\n \n // 请求错误\n INVALID_REQUEST = \"INVALID_REQUEST\",\n CONTEXT_LENGTH_EXCEEDED = \"CONTEXT_LENGTH_EXCEEDED\",\n CONTENT_FILTERED = \"CONTENT_FILTERED\",\n \n // 系统错误\n TIMEOUT = \"TIMEOUT\",\n INTERNAL_ERROR = \"INTERNAL_ERROR\",\n SERVICE_UNAVAILABLE = \"SERVICE_UNAVAILABLE\",\n WEBSOCKET_ERROR = \"WEBSOCKET_ERROR\",\n}\n\n/**\n * 响应错误\n */\nexport interface ResponseError {\n code: ErrorCode | string;\n message: string;\n details?: string;\n}\n\n/**\n * 响应数据\n */\nexport interface ResponseData {\n content?: string;\n error?: ResponseError;\n choices?: Array<{\n index: number;\n delta: {\n content?: string;\n role?: string;\n };\n finish_reason?: string | null;\n }>;\n}\n\n// ============================================================================\n// 错误码映射工具\n// ============================================================================\n\n/**\n * 从错误消息中推断错误码\n */\nexport function inferErrorCode(errorText: string): ErrorCode {\n const text = errorText.toLowerCase();\n \n if (text.includes(\"rate limit\") || text.includes(\"429\") || text.includes(\"too many requests\")) {\n return ErrorCode.RATE_LIMITED;\n }\n if (text.includes(\"quota\") || text.includes(\"insufficient\") || text.includes(\"balance\") || text.includes(\"credit\")) {\n return ErrorCode.INSUFFICIENT_QUOTA;\n }\n if (text.includes(\"overload\") || text.includes(\"capacity\") || text.includes(\"temporarily unavailable\")) {\n return ErrorCode.MODEL_OVERLOADED;\n }\n if (text.includes(\"model not found\") || text.includes(\"does not exist\")) {\n return ErrorCode.MODEL_NOT_FOUND;\n }\n if (text.includes(\"context length\") || text.includes(\"token limit\") || text.includes(\"max tokens\")) {\n return ErrorCode.CONTEXT_LENGTH_EXCEEDED;\n }\n if (text.includes(\"content filtered\") || text.includes(\"content policy\") || text.includes(\"safety\")) {\n return ErrorCode.CONTENT_FILTERED;\n }\n if (text.includes(\"timeout\") || text.includes(\"timed out\")) {\n return ErrorCode.TIMEOUT;\n }\n if (text.includes(\"service unavailable\") || text.includes(\"503\")) {\n return ErrorCode.SERVICE_UNAVAILABLE;\n }\n if (text.includes(\"invalid\") || text.includes(\"bad request\")) {\n return ErrorCode.INVALID_REQUEST;\n }\n \n return ErrorCode.INTERNAL_ERROR;\n}","import type { Hub53AIIncomingMessage, Hub53AIWsMessage, MessageContentItem, OpenAIChatRequest, Hub53AIMessageData } from \"./interface.js\";\n\nexport interface ParsedMessageContent {\n textParts: string[];\n imageUrls: string[];\n fileUrls: string[];\n contentItems: MessageContentItem[];\n}\n\nfunction extractTextFromContent(content: unknown): string {\n if (typeof content === \"string\") {\n return content;\n }\n if (Array.isArray(content)) {\n return content\n .filter((item): item is { type: string; text?: string } => \n typeof item === \"object\" && item !== null && item.type === \"text\"\n )\n .map((item) => item.text || \"\")\n .join(\"\\n\");\n }\n return \"\";\n}\n\nfunction extractImagesFromContent(content: unknown): { urls: string[]; items: MessageContentItem[] } {\n const urls: string[] = [];\n const items: MessageContentItem[] = [];\n\n if (Array.isArray(content)) {\n for (const item of content) {\n if (typeof item !== \"object\" || item === null) continue;\n \n const itemRecord = item as Record<string, unknown>;\n \n if (itemRecord.type === \"image_url\" && \n typeof itemRecord.image_url === \"object\" && \n itemRecord.image_url !== null &&\n \"url\" in itemRecord.image_url) {\n const url = String((itemRecord.image_url as Record<string, unknown>).url);\n urls.push(url);\n items.push({\n type: \"image\",\n image: { url },\n });\n } else if (itemRecord.type === \"image\" && (itemRecord.url || itemRecord.base64)) {\n if (typeof itemRecord.url === \"string\") urls.push(itemRecord.url);\n items.push({\n type: \"image\",\n image: {\n url: typeof itemRecord.url === \"string\" ? itemRecord.url : undefined,\n base64: typeof itemRecord.base64 === \"string\" ? itemRecord.base64 : undefined,\n mimeType: typeof itemRecord.mimeType === \"string\" ? itemRecord.mimeType : undefined,\n },\n });\n }\n }\n }\n\n return { urls, items };\n}\n\nfunction extractFilesFromContent(content: unknown): { urls: string[]; items: MessageContentItem[] } {\n const urls: string[] = [];\n const items: MessageContentItem[] = [];\n\n if (Array.isArray(content)) {\n for (const item of content) {\n if (typeof item !== \"object\" || item === null) continue;\n \n const itemRecord = item as Record<string, unknown>;\n \n if (itemRecord.type === \"file\" && (itemRecord.url || itemRecord.base64)) {\n if (typeof itemRecord.url === \"string\") urls.push(itemRecord.url);\n items.push({\n type: \"file\",\n file: {\n url: typeof itemRecord.url === \"string\" ? itemRecord.url : undefined,\n base64: typeof itemRecord.base64 === \"string\" ? itemRecord.base64 : undefined,\n filename: typeof itemRecord.filename === \"string\" ? itemRecord.filename : undefined,\n mimeType: typeof itemRecord.mimeType === \"string\" ? itemRecord.mimeType : undefined,\n },\n });\n }\n }\n }\n\n return { urls, items };\n}\n\nexport function parseIncomingMessage(rawJson: string): Hub53AIIncomingMessage | null {\n try {\n const wsMsg = JSON.parse(rawJson) as Hub53AIWsMessage;\n \n if (wsMsg.action === \"ping\" || wsMsg.action === \"pong\") {\n return null;\n }\n\n if (wsMsg.action === \"chat\") {\n const openAIReq = wsMsg.data as OpenAIChatRequest;\n if (!openAIReq || !openAIReq.messages || !Array.isArray(openAIReq.messages)) {\n return null;\n }\n\n const lastUserMsg = [...openAIReq.messages].reverse().find((m) => m.role === \"user\");\n if (!lastUserMsg) return null;\n\n const userId = openAIReq.user || lastUserMsg.name || `user-${wsMsg.req_id}`;\n const chatId = openAIReq.conversation_id || userId;\n\n const text = extractTextFromContent(lastUserMsg.content);\n const { urls: imageUrls, items: imageItems } = extractImagesFromContent(lastUserMsg.content);\n const { urls: fileUrls, items: fileItems } = extractFilesFromContent(lastUserMsg.content);\n const contentItems: MessageContentItem[] = [...imageItems, ...fileItems];\n\n return {\n type: \"message\",\n msgId: wsMsg.req_id,\n reqId: wsMsg.req_id,\n chatId: chatId,\n userId: userId,\n text,\n imageUrls: imageUrls.length > 0 ? imageUrls : undefined,\n fileUrls: fileUrls.length > 0 ? fileUrls : undefined,\n contentItems: contentItems.length > 0 ? contentItems : undefined,\n };\n }\n\n // 处理非标准格式的消息 (action === \"message\")\n const data = wsMsg.data as Hub53AIMessageData;\n const dataRecord = data as Record<string, unknown>;\n const rawImages = dataRecord.images;\n const rawFiles = dataRecord.files;\n \n const imageUrls: string[] = data.imageUrls || \n (Array.isArray(rawImages) ? rawImages.map((img: unknown) => {\n if (typeof img === \"string\") return img;\n if (typeof img === \"object\" && img !== null && \"url\" in img) return String((img as Record<string, unknown>).url);\n return \"\";\n }).filter(Boolean) : []);\n \n const fileUrls: string[] = data.fileUrls || \n (Array.isArray(rawFiles) ? rawFiles.map((f: unknown) => {\n if (typeof f === \"string\") return f;\n if (typeof f === \"object\" && f !== null && \"url\" in f) return String((f as Record<string, unknown>).url);\n return \"\";\n }).filter(Boolean) : []);\n \n return {\n type: (dataRecord.type as string) || \"message\",\n msgId: (dataRecord.msgId as string) || (dataRecord.id as string) || `msg-${Date.now()}`,\n chatId: (dataRecord.chatId as string) || (dataRecord.userId as string) || \"default-chat\",\n userId: (dataRecord.userId as string) || (dataRecord.chatId as string) || \"default-user\",\n text: (dataRecord.text as string) || (dataRecord.content as string) || \"\",\n imageUrls: imageUrls.length > 0 ? imageUrls : undefined,\n fileUrls: fileUrls.length > 0 ? fileUrls : undefined,\n quoteContent: dataRecord.quoteContent as string | undefined,\n };\n } catch {\n return null;\n }\n}\n\nexport function parseMessageContent(msg: Hub53AIIncomingMessage): ParsedMessageContent {\n const textParts: string[] = [];\n const imageUrls: string[] = [];\n const fileUrls: string[] = [];\n const contentItems: MessageContentItem[] = [];\n\n if (msg.text?.trim()) {\n textParts.push(msg.text.trim());\n }\n\n if (msg.imageUrls?.length) {\n imageUrls.push(...msg.imageUrls);\n for (const url of msg.imageUrls) {\n contentItems.push({ type: \"image\", image: { url } });\n }\n }\n\n if (msg.fileUrls?.length) {\n fileUrls.push(...msg.fileUrls);\n for (const url of msg.fileUrls) {\n contentItems.push({ type: \"file\", file: { url } });\n }\n }\n\n if (msg.contentItems?.length) {\n for (const item of msg.contentItems) {\n if (item.type === \"image\" && item.image?.url && !imageUrls.includes(item.image.url)) {\n imageUrls.push(item.image.url);\n }\n if (item.type === \"file\" && item.file?.url && !fileUrls.includes(item.file.url)) {\n fileUrls.push(item.file.url);\n }\n contentItems.push(item);\n }\n }\n\n return { textParts, imageUrls, fileUrls, contentItems };\n}\n","import type { RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport type { Hub53AIWsMessage, ResponseError, Hub53AIOutgoingMessage } from \"./interface.js\";\nimport { ErrorCode } from \"./interface.js\";\n\ninterface SendReplyParams {\n wsClient: WebSocket;\n text: string;\n toChatId: string;\n replyToMsgId?: string;\n runtime: RuntimeEnv;\n finish: boolean;\n streamId: string;\n isError?: boolean;\n errorCode?: ErrorCode | string;\n errorDetails?: string;\n}\n\nexport async function sendReply(params: SendReplyParams): Promise<void> {\n const { wsClient, text, toChatId, replyToMsgId, runtime, finish, streamId, isError, errorCode, errorDetails } = params;\n\n const reqId = replyToMsgId || streamId;\n\n runtime.log?.(`[53aihub] sendReply START: reqId=${reqId}, finish=${finish}, isError=${isError}, textLen=${text?.length || 0}, wsReadyState=${wsClient.readyState}`);\n\n if (wsClient.readyState !== 1) {\n runtime.error?.(`[53aihub] WebSocket is not open (readyState=${wsClient.readyState}). Cannot send message to ${toChatId}`);\n return;\n }\n\n if (isError) {\n runtime.error?.(`[53aihub] sendReply ERROR: reqId=${reqId}, code=${errorCode}, text=${text?.substring(0, 100)}`);\n \n const errorInfo: ResponseError = {\n code: errorCode || ErrorCode.INTERNAL_ERROR,\n message: text || \"Unknown error\",\n details: errorDetails,\n };\n\n const errorChunk = {\n id: reqId,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: \"openclaw-agent\",\n choices: [\n {\n index: 0,\n delta: {\n content: text,\n role: \"assistant\",\n },\n finish_reason: \"error\",\n },\n ],\n error: errorInfo,\n };\n\n const errMsg: Hub53AIWsMessage = {\n req_id: reqId,\n action: \"chat\",\n status: \"error\",\n data: errorChunk,\n };\n\n const jsonStr = JSON.stringify(errMsg);\n runtime.log?.(`[53aihub] sendReply ERROR SENDING: reqId=${reqId}, payloadLen=${jsonStr.length}`);\n wsClient.send(jsonStr);\n return;\n }\n\n const chunk = {\n id: reqId,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: \"openclaw-agent\",\n choices: [\n {\n index: 0,\n delta: {\n content: text,\n role: \"assistant\",\n },\n finish_reason: finish ? \"stop\" : null,\n },\n ],\n };\n\n const payload: Hub53AIWsMessage = {\n req_id: reqId,\n action: \"chat\",\n status: finish ? \"done\" : \"streaming\",\n data: chunk,\n };\n\n const jsonStr = JSON.stringify(payload);\n runtime.log?.(`[53aihub] sendReply SENDING: reqId=${reqId}, status=${payload.status}, textLen=${text?.length || 0}, payloadLen=${jsonStr.length}, textPreview=${text?.substring(0, 50) || \"(empty)\"}`);\n\n try {\n wsClient.send(jsonStr);\n runtime.log?.(`[53aihub] sendReply SENT: reqId=${reqId}, status=${payload.status}`);\n } catch (error) {\n runtime.error?.(`[53aihub] sendReply FAILED: reqId=${reqId}, error=${String(error)}`);\n throw error;\n }\n}\n\nexport async function sendDirectMessage(wsClient: WebSocket, to: string, content: string, runtime?: RuntimeEnv): Promise<void> {\n if (wsClient.readyState !== 1) {\n throw new Error(`[53aihub] WebSocket not connected`);\n }\n\n const payload: Hub53AIWsMessage = {\n req_id: `msg-${Date.now()}`,\n action: \"message\",\n status: \"final\",\n data: {\n toChatId: to,\n text: content,\n },\n };\n\n runtime?.log?.(`[53aihub] sendDirectMessage: to=${to}, contentLen=${content.length}`);\n wsClient.send(JSON.stringify(payload));\n}\n\nexport async function sendMediaMessage(\n wsClient: WebSocket,\n to: string,\n media: {\n type: \"image\" | \"file\";\n url?: string;\n base64?: string;\n mimeType?: string;\n filename?: string;\n },\n text?: string,\n runtime?: RuntimeEnv\n): Promise<void> {\n if (wsClient.readyState !== 1) {\n throw new Error(`[53aihub] WebSocket not connected`);\n }\n\n const payload: Hub53AIWsMessage = {\n req_id: `msg-${Date.now()}`,\n action: \"message\",\n status: \"final\",\n data: {\n toChatId: to,\n text: text || \"\",\n media: {\n type: media.type,\n url: media.url,\n base64: media.base64,\n mimeType: media.mimeType,\n filename: media.filename,\n },\n },\n };\n\n runtime?.log?.(`[53aihub] sendMediaMessage: to=${to}, type=${media.type}, url=${media.url ? \"provided\" : \"none\"}`);\n wsClient.send(JSON.stringify(payload));\n}\n\nexport async function sendThinkingMessage(\n wsClient: WebSocket,\n text: string,\n msgId: string,\n streamId: string,\n runtime?: RuntimeEnv\n): Promise<void> {\n const wsState = wsClient.readyState;\n runtime?.log?.(`[53aihub] sendThinkingMessage CALLED: msgId=${msgId}, streamId=${streamId}, text=${text}, wsReadyState=${wsState}`);\n\n if (wsState !== 1) {\n runtime?.error?.(`[53aihub] sendThinkingMessage SKIPPED: WebSocket not ready (state=${wsState})`);\n return;\n }\n\n // 使用 OpenAI 兼容格式,确保 Go 后端能正确解析\n // 关键:req_id 必须使用原始消息的 msgId,这样 Go 后端才能关联请求和响应\n const chunk = {\n id: streamId,\n object: \"chat.completion.chunk\",\n created: Math.floor(Date.now() / 1000),\n model: \"openclaw-agent\",\n choices: [\n {\n index: 0,\n delta: {\n content: text,\n role: \"assistant\",\n },\n finish_reason: null,\n },\n ],\n };\n\n const payload: Hub53AIWsMessage = {\n req_id: msgId,\n action: \"chat\",\n status: \"thinking\",\n data: chunk,\n };\n\n const jsonStr = JSON.stringify(payload);\n runtime?.log?.(`[53aihub] sendThinkingMessage SENDING: ${jsonStr}`);\n \n try {\n wsClient.send(jsonStr);\n runtime?.log?.(`[53aihub] sendThinkingMessage SENT SUCCESS: msgId=${msgId}`);\n } catch (err) {\n runtime?.error?.(`[53aihub] sendThinkingMessage SEND FAILED: ${String(err)}`);\n }\n}","import type { RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport { getRuntime } from \"./runtime.js\";\nimport type { ResolvedAccount } from \"./utils.js\";\nimport { CHANNEL_ID } from \"./const.js\";\n\ninterface AccessPolicyOptions {\n userId: string;\n account: ResolvedAccount;\n wsClient: WebSocket;\n runtime: RuntimeEnv;\n}\n\ninterface AccessPolicyResult {\n allowed: boolean;\n reason?: string;\n}\n\n/**\n * 访问策略检查\n * \n * 策略模式:\n * - \"open\": 允许所有用户(默认)\n * - \"allowlist\": 仅允许 allowFrom 中的用户\n * - \"pairing\": 首次使用需要管理员审批\n */\nexport async function checkAccessPolicy(options: AccessPolicyOptions): Promise<AccessPolicyResult> {\n const { userId, account, runtime } = options;\n const core = getRuntime();\n\n const accessPolicy = account.config.accessPolicy ?? \"open\";\n\n // 开放模式 - 所有用户都能用\n if (accessPolicy === \"open\") {\n return { allowed: true };\n }\n\n // 白名单模式\n if (accessPolicy === \"allowlist\") {\n const allowFrom = account.config.allowFrom ?? [];\n if (allowFrom.includes(userId)) {\n return { allowed: true };\n }\n runtime.log?.(`[53aihub] User ${userId} not in allowlist`);\n return { allowed: false, reason: `User ${userId} not in allowlist` };\n }\n\n // 配对模式 - 首次使用需要审批\n if (accessPolicy === \"pairing\") {\n // 检查配置中的白名单\n const allowFrom = account.config.allowFrom ?? [];\n if (allowFrom.includes(userId)) {\n return { allowed: true };\n }\n\n // 检查持久化的配对记录\n const persistentAllowFrom = await core.channel.pairing.readAllowFromStore({\n channel: CHANNEL_ID,\n accountId: account.accountId,\n });\n\n if (persistentAllowFrom.includes(userId)) {\n return { allowed: true };\n }\n\n // 记录配对请求\n runtime.log?.(`[53aihub] User ${userId} requires pairing. Recording request.`);\n await core.channel.pairing.upsertPairingRequest({\n channel: CHANNEL_ID,\n accountId: account.accountId,\n id: userId,\n meta: {\n displayName: `53AIHub 用户 (${userId})`,\n },\n });\n\n return { allowed: false, reason: \"Pairing required\" };\n }\n\n return { allowed: false };\n}","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { getRuntime } from \"./runtime.js\";\nimport {\n PERSISTENCE_DIR_NAME,\n REQID_STORE_FILENAME,\n REQID_FLUSH_DEBOUNCE_MS,\n REQID_MAX_ENTRIES,\n} from \"./const.js\";\n\nexport interface PersistentReqIdStore {\n set(chatId: string, reqId: string): void;\n get(chatId: string): Promise<string | undefined>;\n getSync(chatId: string): string | undefined;\n delete(chatId: string): void;\n warmup(onError?: (error: unknown) => void): Promise<number>;\n flush(): Promise<void>;\n}\n\nexport function createPersistentReqIdStore(accountId: string): PersistentReqIdStore {\n const memoryCache = new Map<string, string>();\n let flushTimer: NodeJS.Timeout | null = null;\n let isDirty = false;\n\n const getStoreDir = () => {\n const storagePath = getRuntime().state.resolveStateDir();\n const dir = path.join(storagePath, PERSISTENCE_DIR_NAME, accountId);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n return dir;\n };\n\n const getStorePath = () => path.join(getStoreDir(), REQID_STORE_FILENAME);\n\n const scheduleFlush = () => {\n isDirty = true;\n if (flushTimer) return;\n flushTimer = setTimeout(async () => {\n await flush();\n }, REQID_FLUSH_DEBOUNCE_MS);\n };\n\n const flush = async () => {\n if (!isDirty) return;\n if (flushTimer) {\n clearTimeout(flushTimer);\n flushTimer = null;\n }\n try {\n const data = JSON.stringify(Object.fromEntries(memoryCache));\n const filePath = getStorePath();\n const tmpPath = `${filePath}.tmp`;\n fs.writeFileSync(tmpPath, data);\n fs.renameSync(tmpPath, filePath);\n isDirty = false;\n } catch (error) {\n console.error(`[53aihub] Failed to flush reqId store for ${accountId}:`, error);\n }\n };\n\n return {\n set(chatId: string, reqId: string) {\n memoryCache.set(chatId, reqId);\n if (memoryCache.size > REQID_MAX_ENTRIES) {\n const firstKey = memoryCache.keys().next().value;\n if (firstKey !== undefined) memoryCache.delete(firstKey);\n }\n scheduleFlush();\n },\n async get(chatId: string) {\n return memoryCache.get(chatId);\n },\n getSync(chatId: string) {\n return memoryCache.get(chatId);\n },\n delete(chatId: string) {\n if (memoryCache.delete(chatId)) {\n scheduleFlush();\n }\n },\n async warmup(onError) {\n try {\n const filePath = getStorePath();\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const data = JSON.parse(content);\n memoryCache.clear();\n for (const [k, v] of Object.entries(data)) {\n memoryCache.set(k, v as string);\n }\n return memoryCache.size;\n }\n } catch (error) {\n onError?.(error);\n }\n return 0;\n },\n flush,\n };\n}\n","import type { WebSocket } from \"ws\";\nimport type { MessageState } from \"./interface.js\";\nimport { createPersistentReqIdStore, type PersistentReqIdStore } from \"./reqid-store.js\";\nimport {\n MESSAGE_STATE_TTL_MS,\n MESSAGE_STATE_CLEANUP_INTERVAL_MS,\n MESSAGE_STATE_MAX_SIZE,\n} from \"./const.js\";\n\nconst wsClientInstances = new Map<string, WebSocket>();\n\nexport function getWebSocket(accountId: string): WebSocket | null {\n return wsClientInstances.get(accountId) ?? null;\n}\n\nexport function setWebSocket(accountId: string, client: WebSocket): void {\n wsClientInstances.set(accountId, client);\n}\n\nexport function deleteWebSocket(accountId: string): void {\n wsClientInstances.delete(accountId);\n}\n\ninterface MessageStateEntry {\n state: MessageState;\n createdAt: number;\n}\n\nconst messageStates = new Map<string, MessageStateEntry>();\n\nlet cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\nexport function startMessageStateCleanup(): void {\n if (cleanupTimer) return;\n\n cleanupTimer = setInterval(() => {\n pruneMessageStates();\n }, MESSAGE_STATE_CLEANUP_INTERVAL_MS);\n\n if (cleanupTimer && typeof cleanupTimer === \"object\" && \"unref\" in cleanupTimer) {\n cleanupTimer.unref();\n }\n}\n\nexport function stopMessageStateCleanup(): void {\n if (cleanupTimer) {\n clearInterval(cleanupTimer);\n cleanupTimer = null;\n }\n}\n\nfunction pruneMessageStates(): void {\n const now = Date.now();\n\n for (const [key, entry] of messageStates) {\n if (now - entry.createdAt >= MESSAGE_STATE_TTL_MS) {\n messageStates.delete(key);\n }\n }\n\n if (messageStates.size > MESSAGE_STATE_MAX_SIZE) {\n const sorted = [...messageStates.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt);\n const toRemove = sorted.slice(0, messageStates.size - MESSAGE_STATE_MAX_SIZE);\n for (const [key] of toRemove) {\n messageStates.delete(key);\n }\n }\n}\n\nexport function setMessageState(messageId: string, state: MessageState): void {\n messageStates.set(messageId, {\n state,\n createdAt: Date.now(),\n });\n}\n\nexport function getMessageState(messageId: string): MessageState | undefined {\n const entry = messageStates.get(messageId);\n if (!entry) return undefined;\n\n if (Date.now() - entry.createdAt >= MESSAGE_STATE_TTL_MS) {\n messageStates.delete(messageId);\n return undefined;\n }\n return entry.state;\n}\n\nexport function deleteMessageState(messageId: string): void {\n messageStates.delete(messageId);\n}\n\nexport function clearAllMessageStates(): void {\n messageStates.clear();\n}\n\n// ReqId Persistence Management\nconst reqIdStores = new Map<string, PersistentReqIdStore>();\n\nfunction getOrCreateReqIdStore(accountId: string): PersistentReqIdStore {\n let store = reqIdStores.get(accountId);\n if (!store) {\n store = createPersistentReqIdStore(accountId);\n reqIdStores.set(accountId, store);\n }\n return store;\n}\n\nexport function setLastMsgIdForChat(chatId: string, msgId: string, accountId = \"default\"): void {\n getOrCreateReqIdStore(accountId).set(chatId, msgId);\n}\n\nexport function getLastMsgIdForChat(chatId: string, accountId = \"default\"): string | undefined {\n return getOrCreateReqIdStore(accountId).getSync(chatId);\n}\n\nexport async function warmupReqIdStore(accountId = \"default\", log?: (msg: string) => void): Promise<number> {\n const store = getOrCreateReqIdStore(accountId);\n return store.warmup((err) => log?.(`ReqId warmup error: ${String(err)}`));\n}\n\nexport async function flushReqIdStore(accountId = \"default\"): Promise<void> {\n const store = reqIdStores.get(accountId);\n if (store) await store.flush();\n}\n\nexport async function cleanupAccount(accountId: string): Promise<void> {\n const wsClient = wsClientInstances.get(accountId);\n if (wsClient) {\n try {\n wsClient.close();\n } catch (err) {\n console.error(`[53aihub] Error closing WebSocket for account ${accountId}:`, err);\n }\n wsClientInstances.delete(accountId);\n }\n const store = reqIdStores.get(accountId);\n if (store) await store.flush();\n}\n\nexport async function cleanupAll(): Promise<void> {\n stopMessageStateCleanup();\n\n for (const [accountId, wsClient] of wsClientInstances) {\n try {\n wsClient.close();\n } catch (err) {\n console.error(`[53aihub] Error closing WebSocket for account ${accountId}:`, err);\n }\n }\n wsClientInstances.clear();\n \n for (const [, store] of reqIdStores) {\n await store.flush();\n }\n\n clearAllMessageStates();\n}\n","/**\n * 超时处理工具模块\n */\n\n/**\n * 为 Promise 添加超时保护\n * @param promise 需要包装的 Promise\n * @param ms 超时时间(毫秒)\n * @param message 超时错误消息\n */\nexport async function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n message: string\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Timeout after ${ms}ms: ${message}`));\n }, ms);\n\n promise\n .then((result) => {\n clearTimeout(timer);\n resolve(result);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n}","import type { OpenClawConfig, RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport type { WebSocket } from \"ws\";\nimport { getRuntime } from \"./runtime.js\";\nimport { IMAGE_DOWNLOAD_TIMEOUT_MS, FILE_DOWNLOAD_TIMEOUT_MS, DEFAULT_MEDIA_MAX_MB } from \"./const.js\";\nimport { withTimeout } from \"./timeout.js\";\nimport type { ResolvedAccount } from \"./utils.js\";\n\nasync function detectContentType(data: Buffer): Promise<string> {\n const header = data.slice(0, 12);\n \n if (header[0] === 0xff && header[1] === 0xd8 && header[2] === 0xff) {\n return \"image/jpeg\";\n }\n if (header[0] === 0x89 && header[1] === 0x50 && header[2] === 0x4e && header[3] === 0x47) {\n return \"image/png\";\n }\n if (header[0] === 0x47 && header[1] === 0x49 && header[2] === 0x46) {\n return \"image/gif\";\n }\n if (header[0] === 0x52 && header[1] === 0x49 && header[2] === 0x46 && header[3] === 0x46) {\n if (header[8] === 0x57 && header[9] === 0x45 && header[10] === 0x42 && header[11] === 0x50) {\n return \"image/webp\";\n }\n }\n if (header[4] === 0x66 && header[5] === 0x74 && header[6] === 0x79 && header[7] === 0x70) {\n const ftyp = header.slice(8, 12).toString(\"ascii\");\n if (ftyp.startsWith(\"heic\") || ftyp.startsWith(\"heix\")) return \"image/heic\";\n if (ftyp.startsWith(\"avif\")) return \"image/avif\";\n return \"video/mp4\";\n }\n if (header[0] === 0x25 && header[1] === 0x50 && header[2] === 0x44 && header[3] === 0x46) {\n return \"application/pdf\";\n }\n if (header.slice(0, 4).toString(\"ascii\") === \"PK\\x03\\x04\") {\n return \"application/zip\";\n }\n \n return \"application/octet-stream\";\n}\n\nexport async function downloadAndSaveImages(params: {\n imageUrls: string[];\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n wsClient: WebSocket;\n}): Promise<Array<{ path: string; contentType?: string }>> {\n const { imageUrls, config, runtime } = params;\n const core = getRuntime();\n const mediaList: Array<{ path: string; contentType?: string }> = [];\n\n for (const imageUrl of imageUrls) {\n try {\n runtime.log?.(`[53aihub] Downloading image from: ${imageUrl}`);\n const mediaMaxMb = config.agents?.defaults?.mediaMaxMb ?? DEFAULT_MEDIA_MAX_MB;\n const maxBytes = mediaMaxMb * 1024 * 1024;\n\n const fetched = await withTimeout(\n core.channel.media.fetchRemoteMedia({ url: imageUrl }),\n IMAGE_DOWNLOAD_TIMEOUT_MS,\n `Image download timed out: ${imageUrl}`\n ) as { buffer: Buffer; contentType?: string };\n\n let imageBuffer = fetched.buffer;\n let imageContentType = fetched.contentType ?? await detectContentType(imageBuffer);\n\n runtime.log?.(`[53aihub] Image fetched: contentType=${imageContentType}, size=${imageBuffer.length}`);\n\n const saved = await core.channel.media.saveMediaBuffer(\n imageBuffer,\n imageContentType,\n \"inbound\",\n maxBytes\n );\n mediaList.push({ path: saved.path, contentType: saved.contentType });\n runtime.log?.(`[53aihub] Image saved to ${saved.path}`);\n } catch (err) {\n runtime.error?.(`[53aihub] Failed to download image: ${String(err)}`);\n }\n }\n\n return mediaList;\n}\n\nexport async function downloadAndSaveFiles(params: {\n fileUrls: string[];\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n wsClient: WebSocket;\n}): Promise<Array<{ path: string; contentType?: string }>> {\n const { fileUrls, config, runtime } = params;\n const core = getRuntime();\n const mediaList: Array<{ path: string; contentType?: string }> = [];\n\n for (const fileUrl of fileUrls) {\n try {\n runtime.log?.(`[53aihub] Downloading file from: ${fileUrl}`);\n const mediaMaxMb = config.agents?.defaults?.mediaMaxMb ?? DEFAULT_MEDIA_MAX_MB;\n const maxBytes = mediaMaxMb * 1024 * 1024;\n\n const fetched = await withTimeout(\n core.channel.media.fetchRemoteMedia({ url: fileUrl }),\n FILE_DOWNLOAD_TIMEOUT_MS,\n `File download timed out: ${fileUrl}`\n ) as { buffer: Buffer; contentType?: string };\n\n let fileBuffer = fetched.buffer;\n let fileContentType = fetched.contentType ?? await detectContentType(fileBuffer);\n\n runtime.log?.(`[53aihub] File fetched: contentType=${fileContentType}, size=${fileBuffer.length}`);\n\n const saved = await core.channel.media.saveMediaBuffer(\n fileBuffer,\n fileContentType,\n \"inbound\",\n maxBytes\n );\n mediaList.push({ path: saved.path, contentType: saved.contentType });\n runtime.log?.(`[53aihub] File saved to ${saved.path}`);\n } catch (err) {\n runtime.error?.(`[53aihub] Failed to download file: ${String(err)}`);\n }\n }\n\n return mediaList;\n}","import type { OpenClawConfig, RuntimeEnv } from \"openclaw/plugin-sdk\";\nimport WebSocket from \"ws\";\nimport { getRuntime } from \"./runtime.js\";\nimport type { ResolvedAccount } from \"./utils.js\";\nimport {\n CHANNEL_ID,\n MESSAGE_PROCESS_TIMEOUT_MS,\n WS_HEARTBEAT_INTERVAL_MS,\n WS_MAX_RECONNECT_ATTEMPTS,\n WS_RECONNECT_BASE_DELAY_MS,\n MEDIA_IMAGE_PLACEHOLDER,\n MEDIA_DOCUMENT_PLACEHOLDER,\n THINKING_MESSAGE,\n} from \"./const.js\";\nimport type { MonitorOptions, MessageState, Hub53AIIncomingMessage, Hub53AIWsMessage } from \"./interface.js\";\nimport { ErrorCode, inferErrorCode } from \"./interface.js\";\nimport { parseIncomingMessage, parseMessageContent } from \"./message-parser.js\";\nimport { sendReply, sendThinkingMessage } from \"./message-sender.js\";\nimport { checkAccessPolicy } from \"./access-policy.js\";\nimport {\n setWebSocket,\n setMessageState,\n deleteMessageState,\n startMessageStateCleanup,\n cleanupAccount,\n setLastMsgIdForChat,\n warmupReqIdStore,\n} from \"./state-manager.js\";\nimport { withTimeout } from \"./timeout.js\";\nimport { downloadAndSaveImages, downloadAndSaveFiles } from \"./media-handler.js\";\n\n// 消息队列处理器 - 确保消息按顺序处理,避免竞态条件\nclass MessageQueue {\n private queue: Array<() => Promise<void>> = [];\n private processing = false;\n private runtime: RuntimeEnv;\n\n constructor(runtime: RuntimeEnv) {\n this.runtime = runtime;\n }\n\n enqueue(task: () => Promise<void>): void {\n this.queue.push(task);\n this.process();\n }\n\n private async process(): Promise<void> {\n if (this.processing || this.queue.length === 0) return;\n \n this.processing = true;\n try {\n const task = this.queue.shift();\n if (task) {\n await task();\n }\n } catch (err) {\n this.runtime.error?.(`[53aihub] MessageQueue error: ${String(err)}`);\n } finally {\n this.processing = false;\n // 继续处理队列中的下一条消息\n if (this.queue.length > 0) {\n this.process();\n }\n }\n }\n\n clear(): void {\n this.queue = [];\n }\n}\n\nfunction buildMessageContext(\n body: Hub53AIIncomingMessage,\n account: ResolvedAccount,\n config: OpenClawConfig,\n mediaList: Array<{ path: string; contentType?: string }>,\n) {\n const core = getRuntime();\n const chatId = body.chatId || body.userId;\n\n const route = core.channel.routing.resolveAgentRoute({\n cfg: config,\n channel: CHANNEL_ID,\n accountId: account.accountId,\n peer: {\n kind: \"direct\",\n id: chatId,\n },\n });\n\n const hasImages = mediaList.some((m) => m.contentType?.startsWith(\"image/\"));\n const messageBody = body.text || (mediaList.length > 0 ? (hasImages ? MEDIA_IMAGE_PLACEHOLDER : MEDIA_DOCUMENT_PLACEHOLDER) : \"\");\n\n const mediaPaths = mediaList.length > 0 ? mediaList.map((m) => m.path) : undefined;\n const mediaTypes = mediaList.length > 0\n ? (mediaList.map((m) => m.contentType).filter(Boolean) as string[])\n : undefined;\n\n return core.channel.reply.finalizeInboundContext({\n Body: messageBody,\n RawBody: messageBody,\n CommandBody: messageBody,\n MessageSid: body.msgId,\n From: `${CHANNEL_ID}:${body.userId}`,\n To: `${CHANNEL_ID}:${chatId}`,\n SenderId: body.userId,\n SessionKey: route.sessionKey,\n AccountId: account.accountId,\n ChatType: \"direct\",\n ConversationLabel: `user:${body.userId}`,\n Timestamp: Date.now(),\n Provider: CHANNEL_ID,\n Surface: CHANNEL_ID,\n OriginatingChannel: CHANNEL_ID,\n OriginatingTo: `${CHANNEL_ID}:${chatId}`,\n CommandAuthorized: true,\n ReplyToBody: body.quoteContent,\n MediaPath: mediaList[0]?.path,\n MediaType: mediaList[0]?.contentType,\n MediaPaths: mediaPaths,\n MediaTypes: mediaTypes,\n MediaUrls: mediaPaths,\n });\n}\n\nasync function processMessage(params: {\n rawPayload: string;\n account: ResolvedAccount;\n config: OpenClawConfig;\n runtime: RuntimeEnv;\n wsClient: WebSocket;\n}) {\n const { rawPayload, account, config, runtime, wsClient } = params;\n \n runtime.log?.(`[53aihub] processMessage: rawPayload length=${rawPayload.length}`);\n \n const body = parseIncomingMessage(rawPayload);\n if (!body) {\n runtime.log?.(`[53aihub] processMessage: parseIncomingMessage returned null`);\n return;\n }\n\n const parsed = parseMessageContent(body);\n const hasMedia = parsed.imageUrls.length > 0 || parsed.fileUrls.length > 0;\n \n if (!parsed.textParts.join(\"\\n\").trim() && !hasMedia) {\n runtime.log?.(`[53aihub] processMessage: empty message, body=${JSON.stringify(body)}`);\n return;\n }\n\n const chatId = body.chatId || body.userId;\n runtime.log?.(`[53aihub] processMessage: chatId=${chatId}, msgId=${body.msgId}, text=${parsed.textParts.join(\" \").substring(0, 50)}... images=${parsed.imageUrls.length} files=${parsed.fileUrls.length}`);\n\n const core = getRuntime();\n const streamId = `stream-${Date.now()}`;\n\n const accessResult = await checkAccessPolicy({\n userId: body.userId,\n account,\n wsClient,\n runtime,\n });\n\n if (!accessResult.allowed) {\n await sendReply({\n wsClient,\n text: accessResult.reason === \"Pairing required\" \n ? \"您尚未获得授权使用此机器人,请联系管理员进行审核。\"\n : `⚠️ 访问被拒绝: ${accessResult.reason || \"未知原因\"}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId,\n isError: true,\n errorCode: ErrorCode.ACCESS_DENIED,\n errorDetails: accessResult.reason,\n });\n return;\n }\n\n setLastMsgIdForChat(chatId, body.msgId, account.accountId);\n\n const state: MessageState = { accumulatedText: \"\", lastSentText: \"\", streamId };\n setMessageState(body.msgId, state);\n\n if (account.sendThinkingMessage) {\n runtime.log?.(`[53aihub] processMessage: sendThinkingMessage=${account.sendThinkingMessage}, about to send thinking message`);\n try {\n await sendThinkingMessage(wsClient, THINKING_MESSAGE, body.msgId, state.streamId, runtime);\n runtime.log?.(`[53aihub] processMessage: thinking message sent successfully`);\n } catch (err) {\n runtime.error?.(`[53aihub] Failed to send thinking message: ${String(err)}`);\n }\n } else {\n runtime.log?.(`[53aihub] processMessage: sendThinkingMessage=${account.sendThinkingMessage}, SKIPPING thinking message`);\n }\n\n const cleanupState = () => {\n deleteMessageState(body.msgId);\n };\n\n const [imageMediaList, fileMediaList] = await Promise.all([\n downloadAndSaveImages({\n imageUrls: parsed.imageUrls,\n account,\n config,\n runtime,\n wsClient,\n }),\n downloadAndSaveFiles({\n fileUrls: parsed.fileUrls,\n account,\n config,\n runtime,\n wsClient,\n }),\n ]);\n const mediaList = [...imageMediaList, ...fileMediaList];\n\n const ctxPayload = buildMessageContext(body, account, config, mediaList);\n\n let cleanedUp = false;\n const safeCleanup = () => {\n if (!cleanedUp) {\n cleanedUp = true;\n cleanupState();\n }\n };\n\n runtime.log?.(`[53aihub] processMessage: Starting dispatchReplyWithBufferedBlockDispatcher for msgId=${body.msgId}`);\n\n try {\n await withTimeout(\n core.channel.reply.dispatchReplyWithBufferedBlockDispatcher({\n ctx: ctxPayload,\n cfg: config,\n dispatcherOptions: {\n deliver: async (payload, info) => {\n state.accumulatedText += payload.text;\n runtime.log?.(`[53aihub] deliver: kind=${info.kind}, textLen=${payload.text?.length || 0}, accumulatedLen=${state.accumulatedText.length}, isError=${payload.isError}`);\n\n if (payload.isError) {\n const errorMsg = payload.text || \"Unknown error\";\n const errorCode = inferErrorCode(errorMsg);\n runtime.error?.(`[53aihub] deliver ERROR: ${errorMsg}`);\n await sendReply({\n wsClient,\n text: `⚠️ ${errorMsg}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n isError: true,\n errorCode,\n errorDetails: errorMsg,\n });\n return;\n }\n\n if (info.kind !== \"final\") {\n runtime.log?.(`[53aihub] deliver STREAMING: accumulatedText preview=${state.accumulatedText.substring(0, 50)}...`);\n await sendReply({\n wsClient,\n text: state.accumulatedText,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: false,\n streamId: state.streamId,\n });\n }\n },\n onError: async (err, info) => {\n runtime.error?.(`[53aihub] onError: kind=${info.kind}, error=${String(err)}`);\n const errorText = String(err);\n const errorCode = inferErrorCode(errorText);\n try {\n await sendReply({\n wsClient,\n text: `⚠️ 系统错误: ${errorText}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n isError: true,\n errorCode,\n errorDetails: `kind=${info.kind}, error=${errorText}`,\n });\n } catch (sendErr) {\n runtime.error?.(`[53aihub] Failed to send error notification: ${String(sendErr)}`);\n }\n },\n },\n }),\n MESSAGE_PROCESS_TIMEOUT_MS,\n `Message processing timed out (msgId=${body.msgId})`\n );\n\n runtime.log?.(`[53aihub] processMessage: dispatchReply completed, accumulatedTextLen=${state.accumulatedText.length}`);\n\n if (state.accumulatedText) {\n runtime.log?.(`[53aihub] processMessage: Sending final reply with accumulatedText`);\n await sendReply({\n wsClient,\n text: state.accumulatedText,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n });\n } else {\n runtime.log?.(`[53aihub] processMessage: No accumulatedText, sending empty final reply`);\n await sendReply({\n wsClient,\n text: \"\",\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n });\n }\n\n safeCleanup();\n } catch (err) {\n runtime.error?.(`[53aihub] processMessage FAILED: ${String(err)}`);\n const errorText = String(err);\n const errorCode = inferErrorCode(errorText);\n \n if (!cleanedUp) {\n try {\n await sendReply({\n wsClient,\n text: `⚠️ 处理请求时发生异常: ${errorText}`,\n toChatId: chatId,\n replyToMsgId: body.msgId,\n runtime,\n finish: true,\n streamId: state.streamId,\n isError: true,\n errorCode,\n errorDetails: errorText,\n });\n } catch (sendErr) {\n runtime.error?.(`[53aihub] Failed to send final error notification: ${String(sendErr)}`);\n }\n }\n \n safeCleanup();\n }\n}\n\nexport async function monitorProvider(options: MonitorOptions): Promise<void> {\n const { account, config, runtime, abortSignal } = options;\n \n runtime.log?.(`[${account.accountId}] Initializing WS connection to 53AIHub...`);\n startMessageStateCleanup();\n\n return new Promise((resolve, reject) => {\n let wsClient: WebSocket | null = null;\n let reconnectAttempts = 0;\n let pingInterval: NodeJS.Timeout | null = null;\n let isAborted = false;\n let messageQueue: MessageQueue | null = null;\n\n const cleanup = async () => {\n if (pingInterval) {\n clearInterval(pingInterval);\n pingInterval = null;\n }\n if (messageQueue) {\n messageQueue.clear();\n messageQueue = null;\n }\n await cleanupAccount(account.accountId);\n };\n\n const connect = () => {\n if (isAborted) return;\n \n // 安全: 不在 URL 中传递敏感信息,仅通过 headers 传递认证\n const wsUrl = account.websocketUrl;\n const botId = account.botId || account.config.botId;\n const secret = account.secret || account.token || account.config.secret || account.config.token;\n\n // 日志输出时隐藏敏感信息\n const safeUrl = new URL(wsUrl);\n const logUrl = `${safeUrl.origin}${safeUrl.pathname}`;\n\n const authBase64 = Buffer.from(`${botId}:${secret}`).toString('base64');\n\n const wsOptions = {\n headers: {\n \"Authorization\": `Bearer ${secret}`,\n \"Proxy-Authorization\": `Basic ${authBase64}`,\n \"X-Bot-Id\": botId || \"\",\n \"X-Api-Key\": secret || \"\",\n } as Record<string, string>\n };\n\n runtime.log?.(`[${account.accountId}] Connecting to ${logUrl} ...`);\n wsClient = new WebSocket(wsUrl, wsOptions);\n setWebSocket(account.accountId, wsClient);\n \n // 初始化消息队列\n messageQueue = new MessageQueue(runtime);\n\n wsClient.on(\"open\", () => {\n runtime.log?.(`[${account.accountId}] WebSocket connected successfully`);\n reconnectAttempts = 0;\n pingInterval = setInterval(() => {\n if (wsClient?.readyState === WebSocket.OPEN) {\n wsClient.ping();\n }\n }, WS_HEARTBEAT_INTERVAL_MS);\n });\n\n wsClient.on(\"message\", (data: Buffer | string) => {\n const rawPayload = data.toString();\n runtime.log?.(`[${account.accountId}] Received WS message: ${rawPayload.substring(0, 200)}...`);\n \n // 使用消息队列确保顺序处理,避免竞态条件\n messageQueue?.enqueue(async () => {\n await processMessage({\n rawPayload,\n account,\n config,\n runtime,\n wsClient: wsClient!,\n });\n });\n });\n\n wsClient.on(\"error\", (err) => {\n runtime.error?.(`[${account.accountId}] WebSocket Error: ${String(err)}`);\n });\n\n wsClient.on(\"close\", async (code, reason) => {\n runtime.log?.(`[${account.accountId}] WebSocket closed. Code: ${code}, Reason: ${reason}`);\n \n // 清理资源\n if (pingInterval) {\n clearInterval(pingInterval);\n pingInterval = null;\n }\n if (messageQueue) {\n messageQueue.clear();\n messageQueue = null;\n }\n \n if (!isAborted && reconnectAttempts < WS_MAX_RECONNECT_ATTEMPTS) {\n reconnectAttempts++;\n const backoff = Math.min(WS_RECONNECT_BASE_DELAY_MS * Math.pow(2, reconnectAttempts), 30000);\n runtime.log?.(`[${account.accountId}] Reconnecting in ${backoff}ms... (attempt ${reconnectAttempts}/${WS_MAX_RECONNECT_ATTEMPTS})`);\n setTimeout(connect, backoff);\n } else if (!isAborted) {\n runtime.error?.(`[${account.accountId}] Max reconnect attempts (${WS_MAX_RECONNECT_ATTEMPTS}) reached`);\n await cleanup();\n reject(new Error(`Max reconnect attempts (${WS_MAX_RECONNECT_ATTEMPTS}) reached`));\n }\n });\n };\n\n if (abortSignal) {\n abortSignal.addEventListener(\"abort\", async () => {\n isAborted = true;\n await cleanup();\n resolve();\n });\n }\n\n warmupReqIdStore(account.accountId, (msg) => runtime.log?.(msg))\n .then(() => connect())\n .catch(async (err) => {\n runtime.error?.(`[${account.accountId}] Failed to warmup ReqId store: ${String(err)}`);\n await cleanup();\n reject(err);\n });\n });\n}","import type { OpenClawConfig } from \"openclaw/plugin-sdk\";\nimport { DEFAULT_ACCOUNT_ID } from \"openclaw/plugin-sdk\";\nimport { CHANNEL_ID, DEFAULT_WS_URL } from \"./const.js\";\n\n// ============================================================================\n// 配置类型定义\n// ============================================================================\n\n/**\n * 53AIHub 渠道配置\n */\nexport interface AIHubConfig {\n /** 是否启用 */\n enabled?: boolean;\n /** 账户名称 */\n name?: string;\n /** 机器人 ID */\n botId?: string;\n /** 用户 ID */\n userId?: string;\n /** 密钥 */\n secret?: string;\n /** 访问令牌 */\n token?: string;\n /** WebSocket URL */\n websocketUrl?: string;\n \n /** 访问控制白名单 */\n allowFrom?: Array<string | number>;\n /** 访问策略: open=开放, allowlist=白名单, pairing=配对审批 */\n accessPolicy?: \"open\" | \"allowlist\" | \"pairing\" | \"disabled\";\n \n /** 是否发送\"思考中\"消息 */\n sendThinkingMessage?: boolean;\n}\n\n/**\n * 解析后的账户配置\n */\nexport interface ResolvedAccount {\n accountId: string;\n name: string;\n enabled: boolean;\n websocketUrl: string;\n botId: string;\n secret: string;\n token: string;\n sendThinkingMessage: boolean;\n config: AIHubConfig;\n}\n\n// ============================================================================\n// 配置解析函数\n// ============================================================================\n\n/**\n * 解析账户配置\n */\nexport function resolveAccount(cfg: OpenClawConfig, accountId = DEFAULT_ACCOUNT_ID): ResolvedAccount {\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n \n return {\n accountId,\n name: config.name ?? \"53AIHub\",\n enabled: config.enabled !== false,\n websocketUrl: config.websocketUrl || DEFAULT_WS_URL,\n botId: config.botId ?? config.userId ?? \"\",\n secret: config.secret ?? config.token ?? \"\",\n token: config.token ?? config.secret ?? \"\",\n sendThinkingMessage: config.sendThinkingMessage ?? true,\n config,\n };\n}\n\n/**\n * 设置账户配置\n */\nexport function setAccount(\n cfg: OpenClawConfig,\n account: Partial<AIHubConfig>\n): OpenClawConfig {\n const existing = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n const merged: AIHubConfig = {\n enabled: account.enabled ?? existing.enabled ?? true,\n botId: account.botId ?? existing.botId ?? \"\",\n secret: account.secret ?? existing.secret ?? \"\",\n token: account.token ?? existing.token ?? \"\",\n allowFrom: account.allowFrom ?? existing.allowFrom,\n accessPolicy: account.accessPolicy ?? existing.accessPolicy,\n sendThinkingMessage: account.sendThinkingMessage ?? existing.sendThinkingMessage,\n ...(account.websocketUrl || existing.websocketUrl\n ? { websocketUrl: account.websocketUrl ?? existing.websocketUrl }\n : {}),\n ...(account.name || existing.name\n ? { name: account.name ?? existing.name }\n : {}),\n };\n\n return {\n ...cfg,\n channels: {\n ...cfg.channels,\n [CHANNEL_ID]: merged,\n },\n };\n}","import {\n addWildcardAllowFrom,\n type ChannelOnboardingAdapter,\n type ChannelOnboardingDmPolicy,\n type OpenClawConfig,\n type WizardPrompter,\n} from \"openclaw/plugin-sdk\";\nimport { CHANNEL_ID } from \"./const.js\";\nimport type { AIHubConfig } from \"./utils.js\";\nimport { resolveAccount, setAccount } from \"./utils.js\";\n\nconst channel = CHANNEL_ID;\n\nasync function noteSetupHelp(prompter: WizardPrompter): Promise<void> {\n await prompter.note(\n [\n \"53AIHub 智能机器人需要以下配置信息:\",\n \"1. Bot ID: 机器人标识\",\n \"2. Secret: 机器人密钥\",\n \"3. WebSocket URL: WebSocket 连接地址\",\n ].join(\"\\n\"),\n \"53AIHub 设置\",\n );\n}\n\nasync function promptBotId(\n prompter: WizardPrompter,\n account: ReturnType<typeof resolveAccount> | null,\n): Promise<string> {\n return String(\n await prompter.text({\n message: \"53AIHub 机器人 Bot ID\",\n initialValue: account?.botId ?? \"\",\n validate: (value) => (value?.trim() ? undefined : \"必填\"),\n }),\n ).trim();\n}\n\nasync function promptSecret(\n prompter: WizardPrompter,\n account: ReturnType<typeof resolveAccount> | null,\n): Promise<string> {\n return String(\n await prompter.text({\n message: \"53AIHub 机器人 Secret\",\n initialValue: account?.secret ?? \"\",\n validate: (value) => (value?.trim() ? undefined : \"必填\"),\n }),\n ).trim();\n}\n\nasync function promptWebsocketUrl(\n prompter: WizardPrompter,\n account: ReturnType<typeof resolveAccount> | null,\n): Promise<string> {\n return String(\n await prompter.text({\n message: \"WebSocket URL (例如: ws://localhost:8080/ws)\",\n initialValue: account?.websocketUrl ?? \"\",\n validate: (value) => {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n if (!trimmed.startsWith(\"ws://\") && !trimmed.startsWith(\"wss://\")) {\n return \"URL 必须以 ws:// 或 wss:// 开头\";\n }\n return undefined;\n },\n }),\n ).trim();\n}\n\nfunction setAccessPolicy(\n cfg: OpenClawConfig,\n accessPolicy: \"pairing\" | \"allowlist\" | \"open\" | \"disabled\",\n): OpenClawConfig {\n const account = resolveAccount(cfg);\n const existingAllowFrom = account.config.allowFrom ?? [];\n const allowFrom =\n accessPolicy === \"open\"\n ? addWildcardAllowFrom(existingAllowFrom.map((x) => String(x)))\n : existingAllowFrom.map((x) => String(x));\n\n return setAccount(cfg, {\n accessPolicy,\n allowFrom,\n });\n}\n\nconst dmPolicy: ChannelOnboardingDmPolicy = {\n label: \"53AIHub\",\n channel,\n policyKey: `channels.${CHANNEL_ID}.accessPolicy`,\n allowFromKey: `channels.${CHANNEL_ID}.allowFrom`,\n getCurrent: (cfg) => {\n const account = resolveAccount(cfg);\n return account.config.accessPolicy ?? \"open\";\n },\n setPolicy: (cfg, policy) => {\n return setAccessPolicy(cfg, policy);\n },\n promptAllowFrom: async ({ cfg, prompter }) => {\n const account = resolveAccount(cfg);\n const existingAllowFrom = account.config.allowFrom ?? [];\n\n const entry = await prompter.text({\n message: \"允许使用的用户ID(每行一个)\",\n placeholder: \"user123\",\n initialValue: existingAllowFrom[0] ? String(existingAllowFrom[0]) : undefined,\n });\n\n const allowFrom = String(entry ?? \"\")\n .split(/[\\n,;]+/g)\n .map((s) => s.trim())\n .filter(Boolean);\n\n return setAccount(cfg, { allowFrom });\n },\n};\n\nexport const aiHubOnboardingAdapter: ChannelOnboardingAdapter = {\n channel,\n getStatus: async ({ cfg }) => {\n const account = resolveAccount(cfg);\n const configured = Boolean(\n account.botId?.trim() &&\n account.secret?.trim()\n );\n\n return {\n channel,\n configured,\n statusLines: [`53AIHub: ${configured ? \"已配置\" : \"需要 Bot ID 和 Secret\"}`],\n selectionHint: configured ? \"已配置\" : \"需要设置\",\n };\n },\n configure: async ({ cfg, prompter, forceAllowFrom }) => {\n const account = resolveAccount(cfg);\n\n if (!account.botId?.trim() || !account.secret?.trim()) {\n await noteSetupHelp(prompter);\n }\n\n const botId = await promptBotId(prompter, account);\n const secret = await promptSecret(prompter, account);\n const websocketUrl = await promptWebsocketUrl(prompter, account);\n\n const cfgWithAccount = setAccount(cfg, {\n botId,\n secret,\n websocketUrl: websocketUrl || undefined,\n enabled: true,\n accessPolicy: account.config.accessPolicy ?? \"open\",\n allowFrom: account.config.allowFrom ?? [],\n sendThinkingMessage: account.sendThinkingMessage ?? true,\n });\n\n return { cfg: cfgWithAccount };\n },\n dmPolicy,\n disable: (cfg) => {\n return setAccount(cfg, { enabled: false });\n },\n};","import {\n DEFAULT_ACCOUNT_ID,\n formatPairingApproveHint,\n type ChannelPlugin,\n type ChannelStatusIssue,\n type OpenClawConfig,\n} from \"openclaw/plugin-sdk\";\n\nimport { getRuntime } from \"./runtime.js\";\nimport { monitorProvider } from \"./monitor.js\";\nimport { getWebSocket } from \"./state-manager.js\";\nimport type { AIHubConfig, ResolvedAccount } from \"./utils.js\";\nimport { resolveAccount } from \"./utils.js\";\nimport { CHANNEL_ID, TEXT_CHUNK_LIMIT } from \"./const.js\";\nimport { sendDirectMessage, sendMediaMessage } from \"./message-sender.js\";\nimport { aiHubOnboardingAdapter } from \"./onboarding.js\";\n\nconst meta = {\n id: CHANNEL_ID,\n label: \"53AIHub\",\n selectionLabel: \"53AIHub (53AIHub)\",\n detailLabel: \"53AIHub 智能机器人\",\n docsPath: `/channels/${CHANNEL_ID}`,\n docsLabel: CHANNEL_ID,\n blurb: \"53AIHub 智能机器人接入插件\",\n systemImage: \"message.fill\",\n};\n\nexport const aiHubPlugin: ChannelPlugin<ResolvedAccount> = {\n id: CHANNEL_ID,\n meta: {\n ...meta,\n quickstartAllowFrom: true,\n },\n pairing: {\n idLabel: \"userId\",\n normalizeAllowEntry: (entry) => entry.replace(new RegExp(`^(${CHANNEL_ID}|user):`, \"i\"), \"\").trim(),\n notifyApproval: async ({ cfg, id }) => {\n console.log(`[53aihub] Pairing approved for user: ${id}`);\n },\n },\n onboarding: aiHubOnboardingAdapter,\n capabilities: {\n chatTypes: [\"direct\"],\n reactions: false,\n threads: false,\n media: true,\n nativeCommands: false,\n blockStreaming: true,\n },\n reload: { configPrefixes: [`channels.${CHANNEL_ID}`] },\n config: {\n listAccountIds: () => [DEFAULT_ACCOUNT_ID],\n resolveAccount: (cfg) => resolveAccount(cfg),\n defaultAccountId: () => DEFAULT_ACCOUNT_ID,\n setAccountEnabled: ({ cfg, enabled }) => {\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n return {\n ...cfg,\n channels: {\n ...cfg.channels,\n [CHANNEL_ID]: { ...config, enabled },\n },\n };\n },\n deleteAccount: ({ cfg }) => {\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n const { botId, secret, token, ...rest } = config;\n return {\n ...cfg,\n channels: {\n ...cfg.channels,\n [CHANNEL_ID]: rest,\n },\n };\n },\n isConfigured: (account) =>\n Boolean((account.botId?.trim() || account.token?.trim()) || account.secret?.trim()),\n describeAccount: (account) => ({\n accountId: account.accountId,\n name: account.name,\n enabled: account.enabled,\n configured: Boolean(account.botId?.trim() || account.token?.trim()),\n botId: account.botId,\n websocketUrl: account.websocketUrl,\n accessPolicy: account.config.accessPolicy ?? \"open\",\n }),\n resolveAllowFrom: ({ cfg }) => {\n const account = resolveAccount(cfg);\n return (account.config.allowFrom ?? []).map((entry) => String(entry));\n },\n formatAllowFrom: ({ allowFrom }) =>\n allowFrom.map((entry) => String(entry).trim()).filter(Boolean),\n },\n security: {\n resolveDmPolicy: ({ account }) => {\n const basePath = `channels.${CHANNEL_ID}.`;\n const accessPolicy = account.config.accessPolicy ?? \"open\";\n return {\n policy: accessPolicy === \"pairing\" ? \"pairing\" : accessPolicy === \"allowlist\" ? \"allowlist\" : \"open\",\n allowFrom: account.config.allowFrom ?? [],\n policyPath: `${basePath}accessPolicy`,\n allowFromPath: basePath,\n approveHint: formatPairingApproveHint(CHANNEL_ID),\n normalizeEntry: (raw) => raw.replace(new RegExp(`^${CHANNEL_ID}:`, \"i\"), \"\").trim(),\n };\n },\n collectWarnings: ({ account }) => {\n const warnings: string[] = [];\n const accessPolicy = account.config.accessPolicy ?? \"open\";\n \n if (accessPolicy === \"open\") {\n warnings.push(\n `- 访问策略为 \"open\",所有用户都可以使用机器人`\n );\n }\n \n return warnings;\n },\n },\n messaging: {\n normalizeTarget: (target) => {\n const trimmed = target.trim();\n if (!trimmed) return undefined;\n return trimmed;\n },\n targetResolver: {\n looksLikeId: (id) => Boolean(id?.trim()),\n hint: \"<userId|chatId>\",\n },\n },\n directory: {\n self: async () => null,\n listPeers: async () => [],\n listGroups: async () => [],\n },\n outbound: {\n deliveryMode: \"direct\",\n chunker: (text, limit) => getRuntime().channel.text.chunkMarkdownText(text, limit),\n textChunkLimit: TEXT_CHUNK_LIMIT,\n sendText: async ({ to, text, accountId, ...rest }) => {\n const wsClient = getWebSocket(accountId ?? DEFAULT_ACCOUNT_ID);\n if (!wsClient) {\n throw new Error(`[53aihub] WS Client not connected for account ${accountId}`);\n }\n \n const channelPrefix = new RegExp(`^${CHANNEL_ID}:`, \"i\");\n const targetId = to.replace(channelPrefix, \"\");\n\n await sendDirectMessage(wsClient, targetId, text);\n return {\n channel: CHANNEL_ID,\n messageId: `msg-${Date.now()}`,\n chatId: targetId,\n };\n },\n sendMedia: async ({ to, text, mediaUrl, accountId, ...rest }) => {\n const wsClient = getWebSocket(accountId ?? DEFAULT_ACCOUNT_ID);\n if (!wsClient) {\n throw new Error(`[53aihub] WS Client not connected for account ${accountId}`);\n }\n const channelPrefix = new RegExp(`^${CHANNEL_ID}:`, \"i\");\n const targetId = to.replace(channelPrefix, \"\");\n\n const restAny = rest as Record<string, unknown>;\n const mediaType = restAny.mediaType as string | undefined;\n \n const isImage = mediaType?.startsWith(\"image/\") || \n mediaUrl?.match(/\\.(jpg|jpeg|png|gif|webp|heic|heif|avif)$/i);\n const mediaCategory = isImage ? \"image\" : \"file\";\n\n await sendMediaMessage(wsClient, targetId, {\n type: mediaCategory,\n url: mediaUrl,\n mimeType: mediaType,\n }, text);\n\n return { channel: CHANNEL_ID, messageId: `msg-${Date.now()}`, chatId: targetId };\n },\n },\n status: {\n defaultRuntime: {\n accountId: DEFAULT_ACCOUNT_ID,\n running: false,\n lastStartAt: null,\n lastStopAt: null,\n lastError: null,\n },\n collectStatusIssues: (accounts): ChannelStatusIssue[] =>\n accounts.flatMap((entry) => {\n const accountId = String(entry.accountId ?? DEFAULT_ACCOUNT_ID);\n if (!entry.enabled) return [];\n \n const issues: ChannelStatusIssue[] = [];\n if (!entry.configured) {\n issues.push({\n channel: CHANNEL_ID,\n accountId,\n kind: \"config\",\n message: \"53AIHub 访问令牌未配置\",\n fix: \"Run: openclaw channels add 53aihub --token <your_token>\",\n });\n }\n return issues;\n }),\n buildChannelSummary: ({ snapshot }) => ({\n configured: snapshot.configured ?? false,\n running: snapshot.running ?? false,\n lastStartAt: snapshot.lastStartAt ?? null,\n lastStopAt: snapshot.lastStopAt ?? null,\n lastError: snapshot.lastError ?? null,\n }),\n probeAccount: async () => ({ ok: true, status: 200 }),\n buildAccountSnapshot: ({ account, runtime }) => ({\n accountId: account.accountId,\n name: account.name,\n enabled: account.enabled,\n configured: Boolean(account.botId?.trim() || account.token?.trim() || account.secret?.trim()),\n running: runtime?.running ?? false,\n lastStartAt: runtime?.lastStartAt ?? null,\n lastStopAt: runtime?.lastStopAt ?? null,\n lastError: runtime?.lastError ?? null,\n }),\n },\n gateway: {\n startAccount: async (ctx) => {\n return monitorProvider({\n account: ctx.account,\n config: ctx.cfg,\n runtime: ctx.runtime,\n abortSignal: ctx.abortSignal,\n });\n },\n logoutAccount: async ({ cfg }) => {\n const nextCfg = { ...cfg } as OpenClawConfig;\n const config = (cfg.channels?.[CHANNEL_ID] ?? {}) as AIHubConfig;\n const nextConfig = { ...config };\n let cleared = false;\n let changed = false;\n\n if (nextConfig.botId || nextConfig.secret || nextConfig.token) {\n delete nextConfig.botId;\n delete nextConfig.secret;\n delete nextConfig.token;\n cleared = true;\n changed = true;\n }\n\n if (changed) {\n if (Object.keys(nextConfig).length > 0) {\n nextCfg.channels = { ...nextCfg.channels, [CHANNEL_ID]: nextConfig };\n } else {\n const nextChannels = { ...nextCfg.channels };\n delete (nextChannels as Record<string, unknown>)[CHANNEL_ID];\n nextCfg.channels = Object.keys(nextChannels).length > 0 ? nextChannels : undefined;\n }\n await getRuntime().config.writeConfigFile(nextCfg);\n }\n\n const resolved = resolveAccount(changed ? nextCfg : cfg);\n const loggedOut = !resolved.botId && !resolved.secret && !resolved.config.token;\n\n return { cleared, envToken: false, loggedOut };\n },\n },\n};","import type { OpenClawPluginApi } from \"openclaw/plugin-sdk\";\nimport { emptyPluginConfigSchema } from \"openclaw/plugin-sdk\";\n\nimport { aiHubPlugin } from \"./src/channel.js\";\nimport { setRuntime } from \"./src/runtime.js\";\n\nconst plugin = {\n id: \"53ai-openclaw\",\n name: \"53AI OpenClaw\",\n description: \"53AIHub (53AIHub) OpenClaw 插件\",\n configSchema: emptyPluginConfigSchema(),\n register(api: OpenClawPluginApi) {\n setRuntime(api.runtime);\n api.registerChannel({ plugin: aiHubPlugin });\n },\n};\n\nexport default plugin;\n"],"names":[],"mappings":"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"}
|