export function statusMessageId(payload) { return `status-${payload.turnId || payload.sessionId || 'current'}`; } export function larkCliActivityLabel(value) { const text = String(value || '').replace(/\s+/g, ' ').trim(); const lower = text.toLowerCase(); if (!lower.includes('lark-cli')) { return ''; } if (/\bauth\b/.test(lower)) { return '确认飞书授权'; } if (/\bsheets?\b/.test(lower)) { if (/\+create|\bcreate\b/.test(lower)) { return '创建表格'; } if (/\+append|\bappend\b/.test(lower)) { return '追加表格数据'; } if (/\+write|\bwrite\b/.test(lower)) { return '写入表格数据'; } if (/\+find|\bfind\b/.test(lower)) { return '查找表格内容'; } if (/\+replace|\breplace\b/.test(lower)) { return '替换表格内容'; } if (/\+export|\bexport\b/.test(lower)) { return '导出表格'; } if (/title|rename|\bpatch\b|\bupdate\b|spreadsheet\.meta/.test(lower)) { return '修改表名'; } if (/\+read|\bread\b|\bget\b|\bmeta\b/.test(lower)) { return '读取表格信息'; } return '操作表格'; } if (/\bslides?\b/.test(lower)) { if (/\+create|\bcreate\b/.test(lower)) { return '创建 PPT'; } if (/\+update|\bupdate\b|\breplace\b|\bpatch\b/.test(lower)) { return '修改 PPT'; } if (/\+read|\bread\b|\bget\b|\bxml_presentations\b/.test(lower)) { return '读取 PPT'; } return '操作 PPT'; } if (/\bdocs?\b/.test(lower)) { if (/\+create|\bcreate\b/.test(lower)) { return '创建文档'; } if (/\+update|\bupdate\b|\bappend\b|\breplace\b|\bpatch\b/.test(lower)) { return '修改文档'; } if (/\+search|\bsearch\b/.test(lower)) { return '搜索文档'; } if (/\+fetch|\bread\b|\bget\b|\bfetch\b/.test(lower)) { return '读取文档'; } return '操作文档'; } if (/\bdrive\b/.test(lower)) { if (/\+import|\bimport\b/.test(lower)) { return '导入文件'; } if (/\+upload|\bupload\b/.test(lower)) { return '上传文件'; } if (/\+download|\bdownload\b/.test(lower)) { return '下载文件'; } if (/\+delete|\bdelete\b|\btrash\b/.test(lower)) { return '删除文件'; } if (/\+move|\bmove\b/.test(lower)) { return '移动文件'; } if (/title|rename|\bpatch\b|\bupdate\b/.test(lower)) { return '修改文件名'; } if (/\+search|\bsearch\b/.test(lower)) { return '搜索云空间'; } return '操作云空间'; } return ''; } export function shellCommandActivityLabel(value) { const text = String(value || '').replace(/\s+/g, ' ').trim(); const lower = text.toLowerCase(); if (!text) { return ''; } if (/\b(npm|pnpm|yarn|bun)\s+(run\s+)?build\b|\bvite\s+build\b|\bwebpack\b|\brollup\b/.test(lower)) { return '构建前端'; } if (/\b(npm|pnpm|yarn|bun)\s+(run\s+)?smoke\b|\bsmoke\.mjs\b/.test(lower)) { return '运行冒烟检查'; } if (/\b(npm|pnpm|yarn|bun)\s+(run\s+)?test\b|\bpytest\b|\bvitest\b|\bjest\b|\bmvn\b.*\btest\b|\bcargo\s+test\b/.test(lower)) { return '运行测试'; } if (/\bnode\s+--check\b|\btsc\b|\beslint\b|\bbiome\b|\bprettier\b|\bflake8\b|\bmypy\b/.test(lower)) { return '检查代码'; } if (/\bgit\s+(status|diff|show|log|ls-files)\b/.test(lower)) { return '检查改动'; } if (/\b(get-content|select-string|rg|findstr|grep)\b/.test(lower)) { return /\b(select-string|rg|findstr|grep)\b/.test(lower) ? '搜索代码' : '读取文件'; } if (/\b(get-childitem|ls|dir)\b/.test(lower)) { return '查看文件'; } if (/\b(start-process|node\s+server\/index\.js|node\s+server\\index\.js)\b/.test(lower)) { return '启动服务'; } return ''; } export function meaningfulActivityLabel(payload, rawLabel, detail) { const source = [payload.command, detail, rawLabel, payload.output] .filter(Boolean) .join(' '); const larkLabel = larkCliActivityLabel(source); if (larkLabel) { return larkLabel; } const commandLabel = shellCommandActivityLabel(payload.command || detail); if (commandLabel) { return commandLabel; } if (payload.kind === 'agent_message' || payload.kind === 'message' || payload.kind === 'reasoning') { return briefActivityLabel(rawLabel || payload.content || detail); } if (isGenericActivityLabel(rawLabel)) { return ''; } return rawLabel && rawLabel.length <= 18 ? rawLabel : ''; } export function isGenericActivityLabel(value) { const text = String(value || '').replace(/\s+/g, ' ').trim(); if (!text) { return true; } return /^(正在思考中?|思考完成|正在处理|正在回复|正在整理回复|正在准备任务|正在修改并验证|正在执行命令|命令已完成|命令完成|命令执行完成|执行完成|工具调用完成|正在调用工具|工具调用失败|工具已完成|计划已更新|正在规划|任务已完成|已完成|完成|失败)$/i.test(text); } export function activityStepFromPayload(payload, fallbackKind = 'status') { const rawLabel = String(payload.label || payload.content || '').replace(/\s+/g, ' ').trim(); const detail = String(payload.detail || payload.error || '').replace(/\s+/g, ' ').trim(); const label = meaningfulActivityLabel(payload, rawLabel, detail); if (!label) { return null; } return { id: payload.messageId || `${statusMessageId(payload)}-${payload.kind || fallbackKind}-${label || payload.status || 'step'}`, kind: payload.kind || fallbackKind, label, status: payload.status || 'running', detail, command: payload.command || '', output: payload.output || '', error: payload.error || '', fileChanges: payload.fileChanges || [], timestamp: payload.timestamp || new Date().toISOString() }; } export function briefActivityLabel(value, fallback = '正在处理') { const text = String(value || '').replace(/\s+/g, ' ').trim(); if (!text) { return ''; } if (/授权|登录|连接/.test(text)) { return '确认授权'; } if (/记忆|skill|技能|能力|scope|权限/i.test(text)) { return ''; } if (/搜索|查找|定位/.test(text)) { return '查找文件'; } if (/创建|新建|生成/.test(text)) { return '创建文件'; } if (/改名|重命名|修改标题|rename/i.test(text) && /验证|确认|检查|读取/.test(text)) { return '修改并验证'; } if (/改名|重命名|修改标题|rename/i.test(text)) { return '修改标题'; } if (/读取|获取|标题|内容/.test(text)) { return '读取内容'; } if (/修改|更新|写入|追加|替换|编辑/.test(text)) { return '修改内容'; } if (/上传|导入/.test(text)) { return '上传文件'; } if (/下载|导出/.test(text)) { return '导出文件'; } if (/删除|移除/.test(text)) { return '删除文件'; } if (/验证|确认|检查/.test(text)) { return '验证结果'; } if (/命令|lark-cli|PowerShell|shell|执行/i.test(text)) { return ''; } return text.length > 18 ? '' : text; }