这个 issue 解决什么问题?
仓库自带的 mateclaw-webchat/(包名 @mateclaw/webchat)是一个早期 prototype ,跟 webchat 渠道后端的实际能力已经严重脱节,线上根本无法使用 。
P0 — 阻断性(当前完全连不上 webchat)
未构建进服务端静态资源 。pnpm build 脚本会 cp -r dist/ ../mateclaw-server/src/main/resources/static/webchat/,但 mateclaw-server/src/main/resources/static/webchat/ 当前不存在 ,服务器不托管 UMD bundle 。即使照 README 嵌入 <script src="/webchat/mateclaw-webchat.umd.js"> 也是 404。
缺 visitorToken 。src/index.ts 的 sendMessage 只发:
headers: { 'X-MC-Key' : config . apiKey } ,
body : JSON . stringify ( { message : text , visitorId } )
而 webchat 渠道要求 HMAC-SHA256 的 X-MC-Visitor-Token([Bug] Web / API 接入:访客会话在控制台会话列表 / 会话管理页不可见 #340 / [Feature] Web / API 接入支持文件收发(入站上传 + 出站下载) #342 / [Feature] Web / API 接入会话管理增强:消息分页 + 会话列表分页/搜索 + 重命名 #346 都依赖它做会话归属与配额校验)。挂件发出的请求会被后端直接拒 。
P1 — 功能脱节(后端有,挂件没用)
后端能力(已合并/PR 中)
挂件状态
多会话:sessionId、GET /sessions/page、PUT /sessions/title(#346 )
❌ 单线程,无会话切换/重命名
文件收发:POST /upload、GET /files、attachmentIds(#342 )
❌ 无上传/下载 UI
历史消息:GET /sessions/messages(含 beforeId/limit 分页,#346 )
❌ 刷新即丢,不加载历史
长会话 ID 哈希折叠后恢复 sessionId(#348 )
❌ 无概念
P2 — 体验
助手消息用 textContent 渲染,不渲染 markdown (代码块/列表/链接全部平铺)。
WebChatConfig 类型里只有 apiKey/server/position/primaryColor/title/placeholder,但 index.html demo 里传的 subtitle/welcomeMessage/quickPrompts 在 src/index.ts 完全没实现 (类型也不接受)。
期望方案
按 P0 → P1 → P2 顺序补齐:
P0(必须先做,否则挂件无意义)
让 mateclaw-server 真正托管挂件 bundle:要么 CI 里跑 pnpm build,要么把 dist 提交进 static/webchat/,保证 GET /webchat/mateclaw-webchat.umd.js 可访问。
挂件按 webchat 协议生成 visitorToken:
渠道配置暴露 secret(或派发 token 的轻量端点);
挂件本地用 secret + channelId + visitorId 算 HMAC-SHA256,请求头加 X-MC-Visitor-Token,请求体加 visitorId(与后端 WebChatController.computeVisitorToken 对齐)。
注意 :把 HMAC secret 直接下发到浏览器会等于公开 secret ——需要评估是否改为「服务端签发短期 token」模型,否则 webchat 鉴权形同虚设。
P1
接入 GET /sessions/page + PUT /sessions/title:会话列表、切换、重命名。
接入 POST /upload + attachmentIds:访客侧上传入口 + 出站文件气泡。
打开面板时按当前 sessionId 拉取 GET /sessions/messages,刷新可恢复。
P2
引入轻量 markdown 渲染(marked + DOMPurify 或等价)。
WebChatConfig 与挂件实现补齐 subtitle/welcomeMessage/quickPrompts。
关联
环境
v1.6.0-SNAPSHOT;mateclaw-webchat/ @mateclaw/webchat@1.1.0-SNAPSHOT
这个 issue 解决什么问题?
仓库自带的
mateclaw-webchat/(包名@mateclaw/webchat)是一个早期 prototype,跟 webchat 渠道后端的实际能力已经严重脱节,线上根本无法使用。P0 — 阻断性(当前完全连不上 webchat)
未构建进服务端静态资源。
pnpm build脚本会cp -r dist/ ../mateclaw-server/src/main/resources/static/webchat/,但mateclaw-server/src/main/resources/static/webchat/当前不存在,服务器不托管 UMD bundle。即使照 README 嵌入<script src="/webchat/mateclaw-webchat.umd.js">也是 404。缺
visitorToken。src/index.ts的sendMessage只发:而 webchat 渠道要求 HMAC-SHA256 的
X-MC-Visitor-Token([Bug] Web / API 接入:访客会话在控制台会话列表 / 会话管理页不可见 #340 / [Feature] Web / API 接入支持文件收发(入站上传 + 出站下载) #342 / [Feature] Web / API 接入会话管理增强:消息分页 + 会话列表分页/搜索 + 重命名 #346 都依赖它做会话归属与配额校验)。挂件发出的请求会被后端直接拒。P1 — 功能脱节(后端有,挂件没用)
sessionId、GET /sessions/page、PUT /sessions/title(#346)POST /upload、GET /files、attachmentIds(#342)GET /sessions/messages(含beforeId/limit分页,#346)sessionId(#348)P2 — 体验
textContent渲染,不渲染 markdown(代码块/列表/链接全部平铺)。WebChatConfig类型里只有apiKey/server/position/primaryColor/title/placeholder,但index.htmldemo 里传的subtitle/welcomeMessage/quickPrompts在src/index.ts完全没实现(类型也不接受)。期望方案
按 P0 → P1 → P2 顺序补齐:
P0(必须先做,否则挂件无意义)
mateclaw-server真正托管挂件 bundle:要么 CI 里跑pnpm build,要么把 dist 提交进static/webchat/,保证GET /webchat/mateclaw-webchat.umd.js可访问。visitorToken:secret(或派发 token 的轻量端点);secret+channelId+visitorId算 HMAC-SHA256,请求头加X-MC-Visitor-Token,请求体加visitorId(与后端WebChatController.computeVisitorToken对齐)。P1
GET /sessions/page+PUT /sessions/title:会话列表、切换、重命名。POST /upload+attachmentIds:访客侧上传入口 + 出站文件气泡。sessionId拉取GET /sessions/messages,刷新可恢复。P2
marked+DOMPurify或等价)。WebChatConfig与挂件实现补齐subtitle/welcomeMessage/quickPrompts。关联
环境
v1.6.0-SNAPSHOT;
mateclaw-webchat/@mateclaw/webchat@1.1.0-SNAPSHOT