目标:把「智能体在干什么」变成用户看得见、能打断、失败有交代的体验。 参照 fmode-code-lit 的分层:组件只渲染,业务在 service,智能体在 modules。
服务对外接口与实现解耦是本项目一条纪律:
agentService 暴露 messages / status / stage / submit / answer / stop / retryTask / regenerate …。components/ 一行不用动。做法:modules 里的具体框架实现(graph.js)只被 agent-service.js 引用;
组件只认 service。
route → recall → plan → invoke → assert)。plan→thinking、invoke→calling、reflect→generating、respond→done。Re-act 循环下用户只能看到「思考中…」;显式图能把过程展示出来——这是选图的理由之一。
// onNode 回调把节点名推进 trace signal,UI 订阅它
const onNode = (name) => { trace.push({ name, at: Date.now() }); this.#nodeTrace.set([...trace]); };
at,而非 UI 阶段切换时刻)。friendlyError):401→重新登录;402→余额不足;
429→稍后再试;超时→重试。localStorage(可退出清除);手动填 Key 默认只存内存。100dvh + visualViewport 监听:软键盘弹出时整窗上推,输入区不被遮挡。env(safe-area-inset-*);输入框字号 ≥16px(iOS 聚焦不自动放大)。min-width:0 + overflow-wrap:anywhere。