{"_id":"@aibotk/socket-chat","name":"@aibotk/socket-chat","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@aibotk/socket-chat","version":"1.0.0","description":"OpenClaw Socket Chat channel plugin — MQTT-based IM bridge","type":"module","publishConfig":{"access":"public"},"scripts":{"test":"vitest run","test:watch":"vitest"},"dependencies":{"mqtt":"^4.3.8","zod":"^4.3.6"},"devDependencies":{"@types/node":"^22.0.0","typescript":"^5.7.3","vitest":"^2.0.0"},"peerDependencies":{"openclaw":"*"},"openclaw":{"extensions":["./index.ts"],"channel":{"id":"socket-chat","label":"Socket Chat","selectionLabel":"Socket Chat (MQTT plugin)","docsPath":"/channels/socket-chat","docsLabel":"socket-chat","blurb":"MQTT-based IM bridge; configure an API key to connect.","order":90},"install":{"npmSpec":"@openclaw/socket-chat","localPath":".","defaultChoice":"local"}},"_id":"@aibotk/socket-chat@1.0.0","gitHead":"1f297cab8662fd5dd1db95760aec79f7caf07926","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-1eu5bCqDmJD8ydGI5sCkp3zi+Dl3UwA/YPRsvFG4w/26THn2PgXQbgh1BDcS2sO+KJjBZXk8Flzccrdnm/VUbw==","shasum":"efe0f31bb6456e2e1cf5d51ce93e6495ed1e5d31","tarball":"https://registry.npmjs.org/@aibotk/socket-chat/-/socket-chat-1.0.0.tgz","fileCount":22,"unpackedSize":113935,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDnCT/Rv5zLKSb7BQHYq9cce74QFfvlIdeYoTv7PjVZ4AIgN4wtU/0w2oQVFeOBKThcW/CWgfvGeP4a7loY+LYUnVc="}]},"_npmUser":{"name":"leo_chen","email":"478914121@qq.com"},"directories":{},"maintainers":[{"name":"leo_chen","email":"478914121@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/socket-chat_1.0.0_1772990335663_0.11620780479183468"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-08T17:18:55.545Z","1.0.0":"2026-03-08T17:18:55.819Z","modified":"2026-03-08T17:18:56.086Z"},"maintainers":[{"name":"leo_chen","email":"478914121@qq.com"}],"description":"OpenClaw Socket Chat channel plugin — MQTT-based IM bridge","readme":"# socket-chat OpenClaw Extension\n\n通过 **MQTT** 协议与自定义 IM 系统对接的 OpenClaw channel plugin。\n\n---\n\n## 工作原理\n\n```\nIM 平台 ──MQTT──► reciveTopic ──► socket-chat plugin ──► OpenClaw AI\nOpenClaw AI ──► socket-chat plugin ──MQTT──► sendTopic ──► IM 平台\n```\n\n1. 插件启动时，调用 `GET /api/openclaw/chat/config?apikey={apiKey}` 获取 MQTT 连接参数\n2. 建立 MQTT 连接，订阅 `reciveTopic`\n3. 收到消息后，通过 `channelRuntime` 派发给 AI agent\n4. AI 回复通过 `outbound.sendText/sendMedia` 向 `sendTopic` 发布\n\n---\n\n## 安装\n\n```bash\n# 从 npm 安装\nopenclaw plugins add @openclaw-channel/socket-chat\n\n# 或者本地开发时从路径安装\nopenclaw plugins add /path/to/socket-chat\n```\n\n---\n\n## 配置\n\n在 `~/.openclaw/config.yaml` 中添加：\n\n```yaml\nchannels:\n  socket-chat:\n    apiKey: \"your-api-key\"\n    enabled: true\n    dmPolicy: \"pairing\"   # pairing | open | allowlist\n    allowFrom: []         # 允许触发 AI 的发送者 ID 白名单\n    requireMention: true  # 群组消息是否需要 @提及机器人\n```\n\n### 多账号配置\n\n```yaml\nchannels:\n  socket-chat:\n    accounts:\n      work:\n        apiKey: \"api-key\"\n        enabled: true\n      personal:\n        apiKey: \"api-key\"\n        enabled: true\n```\n\n### 可选高级配置\n\n| 字段 | 默认值 | 说明 |\n|------|--------|------|\n| `mqttConfigTtlSec` | `300` | MQTT 配置缓存时间（秒） |\n| `maxReconnectAttempts` | `10` | MQTT 断线最大重连次数 |\n| `reconnectBaseDelayMs` | `2000` | 重连基础延迟（毫秒，指数退避） |\n| `useTls` | `false` | 是否使用 `mqtts://`（TLS） |\n\n---\n\n## 通过 CLI 添加账号\n\n```bash\nopenclaw channels add socket-chat --token <apiKey>\n```\n\n---\n\n## 消息格式\n\n### 收到的 MQTT 消息（reciveTopic）\n\n文字消息：\n\n```json\n{\n  \"content\": \"消息内容\",\n  \"robotId\": \"wxid_robot\",\n  \"senderId\": \"wxid_user123\",\n  \"senderName\": \"用户昵称\",\n  \"isGroup\": false,\n  \"groupId\": \"roomid_xxx\",\n  \"groupName\": \"群组名称\",\n  \"timestamp\": 1234567890123,\n  \"messageId\": \"uuid-xxx\",\n  \"type\": \"文字\"\n}\n```\n\n图片 / 视频 / 文件消息（已上传 OSS）：\n\n```json\n{\n  \"content\": \"【图片消息】\\n文件名：img.jpg\\n下载链接：https://oss.example.com/img.jpg\",\n  \"robotId\": \"wxid_robot\",\n  \"senderId\": \"wxid_user123\",\n  \"senderName\": \"用户昵称\",\n  \"isGroup\": false,\n  \"timestamp\": 1234567890123,\n  \"messageId\": \"uuid-xxx\",\n  \"type\": \"图片\",\n  \"url\": \"https://oss.example.com/img.jpg\"\n}\n```\n\n> **说明**：`type` 枚举值包括 `文字`、`图片`、`视频`、`文件`、`语音`、`名片`、`h5链接`、`视频号`、`位置`、`历史记录`。\n>\n> 图片/视频等媒体消息会同时携带 `content`（格式化描述文字）和 `url`（资源链接）。若平台未配置 OSS，`url` 为 base64 字符串，插件会忽略 base64 内容，仅将 `content` 描述文字传给 AI agent。\n\n#### 媒体消息处理逻辑\n\n| 场景 | `content` | `url` | AI 收到的内容 |\n|------|-----------|-------|--------------|\n| 纯文字 | 消息文本 | — | 消息文本 |\n| 图片（有 OSS URL） | 包含下载链接的描述 | HTTP URL | 描述文字 + `MediaUrl` 字段 |\n| 图片（无 OSS，base64） | 包含 base64 的描述 | `data:image/...` | 仅描述文字（base64 被过滤） |\n| 仅有 URL、无 content | — | HTTP URL | `<media:图片>` placeholder |\n\n### 发送的 MQTT 消息（sendTopic）\n\n```json\n{\n  \"isGroup\": false,\n  \"contactId\": \"wxid_user123\",\n  \"messages\": [\n    { \"type\": 1, \"content\": \"文字消息\" }\n  ]\n}\n```\n\n群消息 + @提及：\n```json\n{\n  \"isGroup\": true,\n  \"groupId\": \"roomid_xxx\",\n  \"mentionIds\": [\"wxid_a\", \"wxid_b\"],\n  \"messages\": [\n    { \"type\": 1, \"content\": \"回复内容\" },\n    { \"type\": 2, \"url\": \"https://example.com/image.jpg\" }\n  ]\n}\n```\n\n---\n\n## 发消息目标格式（openclaw message send）\n\n| 格式 | 说明 |\n|------|------|\n| `wxid_xxx` | 私聊某用户 |\n| `group:roomid_xxx` | 发到群组 |\n| `group:roomid_xxx@wxid_a,wxid_b` | 发到群组并 @提及用户 |\n\n```bash\nopenclaw message send \"Hello\" --channel socket-chat --to wxid_user123\nopenclaw message send \"Hello group\" --channel socket-chat --to group:roomid_xxx\n```\n\n---\n\n## 项目结构\n\n```\nsocket-chat/\n├── index.ts              # 插件入口（register）\n├── package.json          # 包配置，含 openclaw.extensions\n├── tsconfig.json\n└── src/\n    ├── types.ts          # MQTT 消息类型定义\n    ├── config-schema.ts  # Zod 配置 Schema\n    ├── config.ts         # 账号配置解析 + 写入工具\n    ├── api.ts            # GET /api/openclaw/chat/config 调用（带缓存）\n    ├── outbound.ts       # 发送消息（buildPayload + sendSocketChatMessage）\n    ├── inbound.ts        # 入站消息处理 → dispatch AI 回复\n    ├── mqtt-client.ts    # MQTT 连接管理 + 自动重连 monitor 循环\n    ├── probe.ts          # 账号连通性探测\n    ├── runtime.ts        # PluginRuntime 单例\n    └── channel.ts        # ChannelPlugin 主体（所有 adapter 实现）\n```\n\n---\n\n## API 接口要求\n\n后端需实现：\n\n### `GET /openapi/v1/openclaw/chat/config?apikey={apiKey}`\n\n**Response 200:**\n```json\n{\n  \"host\": \"mqtt.example.com\",\n  \"port\": \"1883\",\n  \"username\": \"mqttuser\",\n  \"password\": \"mqttpass\",\n  \"clientId\": \"openclaw-bot-001\",\n  \"reciveTopic\": \"/im/botId/msg\",\n  \"sendTopic\": \"/im/botId/send\",\n  \"robotId\": \"wxid_bot\",\n  \"userId\": \"user123\"\n}\n```\n\n所有字段均为必填字符串。\n","readmeFilename":"README.md","_rev":"1-c69d6d0d924b32af884453a99f953048"}