ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

holaOS Chat 与集成 UX 打磨:从 OAuth 连接到错误可执行的 4.5 周实施计划

holaOS Chat 与集成 UX 打磨:从 OAuth 连接到错误可执行的 4.5 周实施计划 人工智能AI AgentAI 应用前端后端即时通讯交互助手工具调用【免费下载链接】holaOSOpen-source agentic workspace enterprises can make their own. Connect the systems you already run — 100 integrations, MCP, chat tools, apps, browser, local files — with shared memory. Any agent (Claude Code, Codex), any model, or BYOK. Set up in clicks, not months. Local-first: your data never leaves your machines.项目地址https://gitcode.com/GitHub_Trending/ho/holaOS点击查看免费下载本文基于 holaOS 仓库中的规划文档 docs/plans/2026-05-24-chat-integration-ux-polish.md 展开。该文档描述了一次以用户每日高频接触面为目标的体验专项投入约 4.5 周打磨聊天面板Surface A与集成连接流程Surface B让 OAuth 等待不再“被遗弃”、工具失败在聊天中变成一键修复、Agent 输出具备“存在感”、集成列表不再闪烁或出现损坏 Logo。读完本文你将掌握这套计划的完整工作分解Phase 0 预备 4 个迭代周、每一阶段的验收标准以及它在当前仓库源码中的落点与底层依据。背景为什么放弃 MCP → 原生迁移转而做 UX 打磨计划的开端是一次架构决策的“刹车”。早期提案设想把 Composio 集成从 MCP 工具迁移为直接函数调用direct function calls但 PM 侧评审后得出四个结论“连接了 toolkit 却无法立即使用”的痛点已经被composioMcpManager.restart()的管线修复用户不再需要手动拉取经由 Hono 的计费流程结构上正确无需架构变更MCP → 原生迁移中用户唯一能感知的价值是Composio 结构化错误能传导到聊天 UI——这一小块被单独拆出来作为一次性预备任务Phase 0其余工程收益LOC 减少、token 节省、延迟降低用户不可见机会成本大于价值。因此决策是保留基于 MCP 的 Composio 管线把 4.5 周投入到用户每天都在接触的两个面聊天输出打磨Surface A与集成连接流程打磨Surface B。目标Goals连接流程不再让人感觉被遗弃——每个 OAuth 等待、错误与恢复路径都有清晰的视觉与操作提示工具失败在聊天中可执行——Composio 的结构化错误以可读文本 一键修复的形式到达用户Agent 输出有“存在感”——草稿、工件artifact与工具完成态落地为用户想保留的东西而不是日志条目集成列表看起来是“已加载”的——无闪烁、无损坏 Logo、无被遗弃的状态。非目标Non-goalsMCP → 原生 Composio 迁移无限期推迟仅当 token 成本成为 P0 时重新审视轮次内动态工具扩展非用户诉求工作区启动时的预注册继续工作新增 Composio toolkits / 集成独立路线图超出错误传导预备之外的后端 / 运行时架构变更。Phase 0 — 预备½ 天Week 2 之前落地Composio 错误传导Week 2 的依赖涉及文件runtime/api-server/src/composio-mcp-host.ts—— 当ComposioService.executeTool返回{ ok: false, error }时调整错误映射逻辑runtime/api-server/src/composio-service.ts—— 确认已从 Hono 侧透出{ code, message, log_id, slug? }。现状与变更目前当ComposioService.executeToolreject 时MCP host 会把错误包装成 MCP 响应上的通用internal_errorcode。变更为若 Composio 错误 code 属于tool_failed、connection_expired、connection_not_authorized、rate_limited、not_configured、not_found之一则作为 MCPisError: true的工具结果返回并在 JSONcontent块中包含{ code, message, log_id, slug, retriable }使结构化错误能流入 pi 的tool_result进而作为可读数据进入聊天的 TraceStepGroup在composio-mcp-host.test.ts中补充覆盖三个最高频 codetool_failed、connection_expired、rate_limited的单元测试。验收标准Composio 返回 401 时聊天 UI 收到code: connection_expired并渲染正确的横幅原始错误字符串保留在data.message中供“显示技术细节”Show technical details折叠披露。风险提示下游消费者已经按模式匹配的错误语义IntegrationErrorBanner 的正则必须保持可用。变更前需对前 5 个高频模式的当前details字符串做快照验证。源码佐证错误结构已经在服务层成型在 composio-service.ts 中可以看到ComposioExecuteError接口已经携带了code、message、slug、status、log_id、connected_account_id、user_action并额外包含responseBody上游返回非 JSON 错误时的截断响应体、cfRayCloudflare Ray ID用于与边缘日志关联与originServer。ComposioToolExecutionError同时保留httpStatus与完整detail。这意味着计划中“把结构化错误透传到聊天”所需的字段在服务层早已就绪Phase 0 的核心工作是让 MCP host 不再把它们压平为通用的internal_error。Week 1 — 连接流程有“声音”5 个工作日W1.1 — 统一取消Cancel操作1 天涉及文件apps/desktop/src/components/panes/ChatPane/AssistantTurn/IntegrationProposalCard.tsxapps/desktop/src/lib/workspaceDesktop.tsxconnectIntegrationProvider轮询循环变更在轮询循环的返回值中加入cancel()一个AbortController其.abort()以code: user_cancelled拒绝轮询 promise在 IntegrationProposalCard 的connecting阶段暴露 Cancel 链接/按钮视觉风格与 IntegrationConnectCard 的 Cancel 一致取消时清除phase、隐藏 spinner、不显示错误静默回到 idle并重新显示淡化的 “Connect” CTA。验收标准用户在 OAuth 等待期间可从 IntegrationProposalCard 按下 Cancel 并立即回到 idle取消时不弹出 “Connection failed” toast。源码佐证当前的 IntegrationProposalCard.tsx 已经通过useAddApp()拿到{ add, status, cancel }且phase的推导是status.kind cancelled ? idle : status.kind第 69 行说明“取消 → 静默回 idle”的语义已经存在W1.1 的工作是把同一语义推广到轮询路径并补齐 UI。而 workspaceDesktop.tsx 中的connectIntegrationProvider已经接受signal?: AbortSignal并通过throwIfAborted()在检测到signal.aborted时抛出IntegrationConnectCancelled——这正是计划中“以user_cancelled拒绝”的底层机制。此外连接过程在inFlightConnectsRef中登记聊天输入框会在点击 Connect 的瞬间禁用第 712-721 行的注释解释了为什么必须在任何 await 之前注册避免首个往返 ~300ms 的窗口期。W1.2 — OAuth 等待倒计时 辅助文案1.5 天涉及文件apps/desktop/src/components/panes/ChatPane/AssistantTurn/IntegrationProposalCard.tsxapps/desktop/src/components/panes/ChatPane/AssistantTurn/IntegrationConnectCard.tsx新增共享子组件OAuthWaitIndicator.tsx置于AssistantTurn/或components/integration/变更OAuthWaitIndicator 展示spinner、“Waiting for {provider} authorization…”、由 elapsed/total 秒驱动的细进度条5 分钟硬上限 300s、以及弱化的倒计时“4:32 left”经过 30 秒后淡入辅助行“If the window didnt open, try reopening it”并附 “Reopen” CTA 重新唤起同一个 OAuth URL90 秒无进展后调暗 spinner 并升级为更柔和的提示“Still waiting — try Cancel and reconnect”。验收标准视觉上任何时刻都呈现“活着”的状态用户永远不会感到被搁置。W1.3 — 检测 OAuth 窗口被关闭0.5 天涉及文件apps/desktop/src/lib/workspaceDesktop.tsx—— 在轮询循环中扩展window.addEventListener(focus, …)启发式若焦点回到应用且 4 秒后仍未出现连接则提示 “Did the authorization complete? If you closed the window without authorizing, click Reopen”。验收标准关闭 OAuth 窗口未授权时约 5 秒内出现内联提示而不是 5 分钟静默超时。W1.4 — 友好的错误文案 Retry1 天涉及文件新增apps/desktop/src/lib/integrationErrorMessages.ts—— 纯映射函数(code, slug?) { headline, detail, action: retry | reconnect | contact }IntegrationProposalCard.tsxIntegrationConnectCard.tsx—— 消费该映射函数渲染绑定到 action 枚举的 Retry/Reconnect 按钮。初始覆盖的 code 集合code文案actionuser_cancelled静默无错误 UI—connection_expired“Your {provider} session expired”Reconnectconnection_not_authorized“{provider} hasnt been authorized yet”Reconnectrate_limited“{provider} is busy — try again in a minute”Retrynetwork_error“Couldnt reach {provider}”Retrypopup_blocked“Allow popups for the desktop app, then click Reopen”Reopenunknown“Something went wrong”Retry “Show details” 中披露原始data.message验收标准用户永远不会看到原始异常字符串所有路径都有 Retry/Reconnect/Reopen 动作。W1.5 — 打磨 QA1 天三张卡片的深色 浅色模式一致性巡检减少动效reduced-motion倒计时仍工作只是 spinner/进度条不做动画为新的映射函数补充快照测试integrationErrorMessages.test.ts。Week 1 发布目标不放在 feature flag 后面——这些都是纯 UI 改进随版本一起发布。Week 2 — 错误变成一键修复5 天依赖 Phase 0Composio 错误传导。W2.1 — 扩展 IntegrationErrorBanner 的模式匹配1.5 天涉及文件apps/desktop/src/components/panes/ChatPane/skeletons.tsxIntegrationErrorBanner 函数新增apps/desktop/src/lib/integrationErrorBannerMap.ts—— 持有(code | slug | message-regex) → banner-config的映射。变更把内联正则的模式匹配迁移到集中式映射覆盖集成商店目录integration-store-catalog.ts中的每个 toolkit每个条目包含icon、headline、detail、actionreconnect | retry | open_settings以及目标connection_id用于内联重连。验收标准目录内 100% 的 toolkit 失败命中带类型的 banner只有真正未知的错误才落到 “Show technical details”。源码佐证当前 skeletons.tsx 中IntegrationErrorBanner已经优先使用带类型、可操作文案 内联重连的IntegrationErrorBannerBody解析失败时回退到GenericToolFailureBanner。IntegrationErrorBannerBody第 141 行起通过resolveIntegrationError解析{ headline, detail, action }且copy.action silent时直接返回 null第 189 行——这与 W1.4 中user_cancelled静默的语义一致。重连成功后还会调用rebindWorkspaceAppsForProvider把工作区中绑定到旧 connection 的应用重新绑定第 160-175 行的注释解释了原因OAuth 成功只修复 Agent 直连路径工作区应用的HOLABOSS_APP_GRANT仍指向过期连接必须显式 rebind。W2.2 — 内联重连迷你卡片2 天涉及文件新增apps/desktop/src/components/panes/ChatPane/AssistantTurn/InlineReconnectCard.tsxbanner action 为reconnect时在失败的 TraceStepGroup 正下方渲染迷你卡片复用 Week 1 的 OAuth 等待机制倒计时、取消、错误映射通过共享的 OAuthWaitIndicator。验收标准工具以connection_expired失败 → 出现 banner → 点击 “Reconnect” → OAuth 流程内联进行 → 成功后提示 “Retry the original tool call” → Agent 自动重试带限流保护。W2.3 — 通用工具失败外壳1 天涉及文件apps/desktop/src/components/panes/ChatPane/AssistantTurn/TraceStepGroup.tsx新增apps/desktop/src/components/panes/ChatPane/AssistantTurn/ToolFailureShell.tsx。变更当step.status error且没有 IntegrationErrorBanner 模式命中时渲染 ToolFailureShell 而不是倾倒原始 JSON外壳展示一行摘要“Tool {name} failed”、错误消息截断为一行完整文本放在details中、以及 “Show technical details” 开关展开后显示原始 JSON payload。验收标准折叠的步骤详情中不再出现原始 JSON 墙——即使是未知错误看起来也是有意的设计。W2.4 — 打磨 QA0.5 天E2E 走查在 e2e 脚本中模拟 token 过期的工具失败确认 banner → reconnect → retry 全路径可用。Week 3 — 输出有“存在感”5 天W3.1 — 工件类型分类体系 管线1.5 天涉及文件runtime/state-store/src/store.ts—— 确认artifacts表已有type字段若无则加迁移runtime/api-server/src/runtime-agent-tools.ts—— Agent 产生工件时传递typedraft_post | draft_email | draft_image | dashboard | report | otherapps/desktop/src/types/electron.d.ts—— 在 artifact 事件中透出 type。验收标准Agent 创建的每个新工件都携带类型化枚举遗留工件默认归为other。W3.2 — 工件卡片重设计2 天涉及文件apps/desktop/src/components/panes/ChatPane/AssistantTurn/Outputs.tsx新增apps/desktop/src/components/panes/ChatPane/AssistantTurn/ArtifactCard.tsx每卡片一个取代当前的li。变更按类型显示图标Lucide草稿用 FileText、邮件草稿用 Mail、图片草稿用 Image、仪表盘用 LayoutDashboard、报告用 FileBarChart默认标题规则标题缺失时用{type} #{n}—— “Twitter draft #2”、“Email draft #1”1 行预览正文前 60 字符图片用 alt 文本悬停态微弱的背景偏移 1px 边框高亮按设计规范不抬升阴影点击 → 进入现有的 ArtifactBrowserModal。源码佐证当前 Outputs.tsx 已引入ChevronDown图标并在第 100-189 行附近实现了多工件分享一个 turn 产生 ≥2 个可分享工件时让用户选择、单一工件时走快速分享通道且第 243 行注释说明纯构建型 turn 不显示输出区。这为 ArtifactCard 的接入提供了清晰的插入点。W3.3 — “Show more” 操作提升0.5 天涉及文件Outputs.tsx。变更从 xs 弱化的 “Show 2 more” 改为全宽 “2 more artifacts” 按钮带图标ChevronDown与 CmdShiftA 键盘提示阈值仍为 3避免卡片墙。W3.4 — 工具完成微动画0.5 天涉及文件apps/desktop/src/components/panes/ChatPane/AssistantTurn/TraceStepGroup.tsx通过 Tailwind 工具类实现 CSS——在全局样式表中定义keyframes draw-check若已安装 motion 库则使用之否则懒加载。变更步骤从running→success时为对勾图标做动画SVG path 的 stroke-dasharray 在 200ms 内绘制完成。尊重prefers-reduced-motion: reduce。W3.5 — QA0.5 天所有工件类型的浅色 深色模式压力测试单 turn 10 个工件——折叠后的 “7 more” 依然可读。Week 3 设计师介入计划确认设计师参与具体触点ArtifactCard 视觉处理字体排版、间距、悬停、”Show more” 操作的比例、Week 4 的 Provider Logo 处理。脚手架代码与桩视觉选择遵循现有设计系统OKLch token、Inter/Newsreader 字体、0-3 级阴影设计评审可在合并前精修。Week 4 — 列表感觉“已加载”4 天 ½ 缓冲W4.1 — 骨架屏1.5 天涉及文件新增apps/desktop/src/components/panes/IntegrationsPane.skeleton.tsx新增apps/desktop/src/components/panes/AddIntegrationDialog.skeleton.tsxMarketplacePane.tsx—— 为connect_integrations标签页做骨架。变更与真实行高匹配的 pulse-bg 骨架行渲染到listIntegrationConnections与 toolkit 目录都解析完成。W4.2 — 打包英雄 Logo1.5 天涉及文件新目录apps/desktop/src/assets/integration-logos/为 Top 20 toolkits 提供 SVGgmail、twitter、linkedin、reddit、github、slack、notion、hubspot、salesforce、gcal、gdrive、dropbox、figma、asana、jira、intercom、zendesk、stripe、airtable、calendly新增apps/desktop/src/lib/integrationLogo.ts——getIntegrationLogo(slug): { src: string; isLocal: boolean }。已知 slug 返回打包资源否则回退到 Composio CDN URL替换 IntegrationsPane、AddIntegrationDialog、IntegrationProposalCard、IntegrationConnectCard、MarketplacePane 中直接使用img src{composioLogoUrl}的写法。验收标准Top 20 toolkit Logo 始终正确渲染无白底白字 SVG、无破损宽高比长尾 toolkit 仍从 CDN 加载。W4.3 — 跨界面状态词汇审计1 天涉及文件审计 修复IntegrationProposalCard、IntegrationConnectCard、IntegrationsPane 行、AddIntegrationDialog 条目、MarketplacePane provider 行。变更在apps/desktop/src/lib/integrationStateStyles.ts中定义规范的视觉词汇idle弱化的 secondary 色 插头图标loading骨架connectingspinner 倒计时 取消success对勾图标 green-50 背景或 oklch 等价色持续 2s然后回 idleerrorAlertTriangle 图标 red-50 背景 Retry CTA在全部 5 个界面一致应用。W4.4 — 缓冲 QA 演示0.5 天端到端走查视频更新backend/docs/work_log.md与docs/work-log.mdholaOS 本地记录本周变更。验收标准——何时算完成用户可以从任意入口以一致的 UI 取消 OAuthOAuth 等待超过 30s 时必有可见的安抚提示用户看不到任何原始错误消息所有错误都有 Retry/Reconnect/Reopen 动作token 过期的工具失败 → 用户可内联重连 → 原始工具自动重试目录内所有 toolkit 失败都通过 IntegrationErrorBanner 渲染已知 toolkit 无原始 JSON 回退工件有类型图标与有信息量的默认标题正常流程中不再出现 “Untitled artifact”工具完成有一个瞬间200ms 动画再过渡到摘要任何地方都没有无骨架的列表闪烁Top 20 toolkit Logo 始终正确渲染所有变更在浅色/深色模式下一致尊重 reduced-motion。明确超出范围Out of scope新手引导onboarding重设计独立路线图工作区控制中心打磨Module app UI lint 强制执行已在 8453030d 提交中交付聊天输入区重设计记忆面板 / 工件浏览器模态框重设计。未决问题 / 依赖Q1设计师能否在 W3.2 实现前评审 ArtifactCard 原型计划默认可以。Q2进行中的feat/integration-store-unified合并是否会改变 IntegrationProposalCard 的 props 结构若是本分支需在 W1 落地前 rebase。缓解措施保持改动小而命名良好使 rebase 机械化。Q3Composio webhook 处理器composio.ts:1799在connection_expired时已使 session 缓存失效。需确认该路径是否触发运行时的composioMcpManager.restart或聊天只会在下一次工具调用时看到失败。这影响 W2.2 是否需要订阅 webhook 事件以主动提示重连。默认不在本计划范围内被动流程已足够。Rebase 策略feat/integration-store-unified正在合并中。本分支从干净 HEAD 275e8d45 分出。合并完成并进入 main 后git fetch origin main在本分支上git rebase origin/main冲突将集中在 IntegrationProposalCard 及相关 ChatPane 文件——解决时保留本计划的 UX 工作取消按钮、倒计时、错误映射保留合并工作integration-store-unified 团队新增的内容推送前在工作树中重新运行 lint 与测试。阅读建议如何在仓库中继续深入计划源头docs/plans/2026-05-24-chat-integration-ux-polish.md聊天侧三张卡片的现状IntegrationProposalCard.tsx、IntegrationConnectCard.tsx、skeletons.tsx连接轮询与取消机制的底层workspaceDesktop.tsx错误结构化与服务层字段composio-service.ts工件输出区现状Outputs.tsx。需要注意的是计划中提到的个别文件路径如runtime/api-server/src/composio-mcp-host.ts在本文写作时的仓库快照中尚未出现或已更名实施时应以实际分支状态为准计划本身也明确标注了 “In progress” 状态与 rebase 依赖。本文所有源码引用均可在当前仓库对应路径中直接查阅。赞分享人工智能AI AgentAI 应用前端后端即时通讯交互助手工具调用【免费下载链接】holaOSOpen-source agentic workspace enterprises can make their own. Connect the systems you already run — 100 integrations, MCP, chat tools, apps, browser, local files — with shared memory. Any agent (Claude Code, Codex), any model, or BYOK. Set up in clicks, not months. Local-first: your data never leaves your machines.项目地址https://gitcode.com/GitHub_Trending/ho/holaOS点击查看免费下载相关推荐improve 交接计划模板全解为低成本执行模型编写可执行的代码库实施计划improve 交接计划模板全解为低成本执行模型编写可执行的代码库实施计划 导读 本文深入拆解 Agent 技能 improve 的核心交付物——交接计划模SuperClaude Framework 的 /sc:workflow 实现工作流生成器从 PRD 到可执行实施计划的编排实践SuperClaude Framework 的 /sc:workflow 实现工作流生成器从 PRD 到可执行实施计划的编排实践 导读 /sc:workflo开发工具CLIAI 技能/插件测试人工智能AI 评测CrewAI 任务如何启用 reasoning 让 Agent 执行前先生成并打磨计划CrewAI 任务如何启用 reasoning 让 Agent 执行前先生成并打磨计划 在 CrewAI 中运行一个复杂 Task 时Agent 有时会直接开人工智能AI AgentAgent 框架多智能体工作流自动化后端上一篇electerm 扩展功能完整指南从启动 Widget 到远程监控一文走通全流程下一篇JavaScript状态机终极指南Node.js后端开发的完整实践方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表