Repository navigation
Releases: willove/evoke-ui
Release list
evoke-business-ui 0.12.0 · Splitter resize 来源标记 + 菜单收起图标漂移修复
@wil-works/evoke-business-ui 0.12.0
Splitter 的 resize 事件附来源标记(minor)
resize 载荷从「占比数组」扩为 [占比数组, { source }]:source: 'user'(拖拽/键盘/折叠,用户意图)与 'system'(挂载初始化、容器 ResizeObserver 重分摊——合成值)。
首参不变,既有消费方无需改动;需要把尺寸写回持久化的消费方必须过滤 system:慢加载下容器尺寸未定,回写合成 resize 会把当时的量测固化成声明尺寸写坏布局。
菜单收起时图标漂移修复(fix)
折叠动画期间菜单图标被残余文字宽度推着漂移、动画末尾才落位:折叠态宽度改 width: 100% 跟随侧栏 transition 一起到位;菜单项改 flex-start + 固定 padding-left,图标全程不动。
其余包版本未变,publish.yml 的 already-published 守卫会自动跳过。
evoke-chat 0.5.1 · 阶段轨迹留作事后证据(keepProgressLog)+ 自研 RAG 后端示例
0.5.0 的 progressLog 在收尾时被清空——"系统轨迹"只在生成存活期可见,而组件恰恰为它做了折叠披露:用户拿到答案后最想看的"它查了什么、为什么这么答",正好在那一刻消失(真跑:11 个阶段的日志没了)。本版把它补成宿主可选的事后证据,并带来第一个自研 RAG 后端的完整接法示例。来自 PR #1(已拆除与 0.5.0 model/provider 透传重复的 setModel 块,模型归属维持既有字段形状)。
新增
- keepProgressLog:
useChatEngine({ keepProgressLog: true })收尾(完成 / 中断 / 出错)后保留progressLog轨迹,时间线折叠钮在答案出来后仍可回看;clearProgress(id, { keepLog })单次显式覆盖。默认行为一字不变——进度只属于进行中的轮,要事后审计的宿主显式开口。 - 自研 RAG 后端示例:
examples/ebui-example-ai新增 RagBackend 页 +cumulus-transport.js——同一套EbAiConsole换自研后端 SSE(POST /v1/qa/stream),完整演示阶段进度走时间线(不拼进 think 文本)、入参分片流式、收尾行内引用锚点联动来源面板、引用与关联文档分栏。
测试 681 项全绿(新增收尾保留 / 组件层回看 / 默认回归);AI 契约同步。
evoke-chat 0.5.0 · 服务端事件流对接补强(parts 交错 / args 流式 / 引用锚点 / 时间线 / resultType)
cumulus-next(Go 侧 RAG/agent 后端)以真实 SSE 事件流接入后的表达力补强:接入本身无阻塞,但四类信息在旧消息模型里落不到位——正文与工具的交错、入参流式、行内引用、内部流水线轨迹。本版把这四件事补成一等能力,全部向后兼容(老消息零改动)。
新增
- parts 消息模型(交错渲染):
appendContent/appendThinkContent/startToolCall自动记录到达顺序(message.parts),组件按序交错渲染——「正文 → 工具卡 → 正文」的 RAG 常见形状不再是模板写死的「工具在前」。content/thinkContent/toolCalls降为平面投影,复制、朗读、会话重放全部照旧;无 parts 的老消息走原固定顺序。 - 工具入参流式(
appendToolCallArgs):长参数(SQL / 查询 DSL / 写操作 payload)JSON 分片逐片可见,卡片自动展开、光标、贴底与输出流式同款待遇;收尾自动 parse 回对象,半截 JSON 保留原文诚实展示。 - 行内引用锚点(
anchorSource):正文里「根据第 3 篇」生成可点上标(source:协议),点击联动来源卡高亮——citations 仍是回合级语义,行内关系交给锚点。主入口导出anchorSource(refId, text?)。 - 流水线时间线(
progressLog):progress是「当前一句话」,progressLog是完整轨迹(理解 → 检索 → 核对 → 路由 → 合成…)。当前阶段常显一行,历史收进「前 N 个阶段」折叠,展开是紧凑日志、当前行亮一档。appendProgress/clearProgress。 - 工具结果非文本默认渲染(
resultType):image 认{ url, alt? }渲限高图,file 认{ name, url?, size? }渲一行文件卡(按后缀图标);URL 走与正文图片同款的 http/https/data 白名单,其余退文本不留破图。 - 模型归属(
model/provider):多模型路由时底部读数行显示provider/model(hover 显隐与耗时/用量同组);引擎只透传不解析。 - ChatThreads
timeFormat:时间列转义口,宿主给格式化函数(如YYYY-MM-DD HH:mm:ss),缺省回落浏览器本地日期。
事件契约新增:tool/args、assistant/progress-log、tool/result.resultType、assistant/message.model/provider。
测试 677 项全绿(新增 21 项);AI 契约 16 条配方;文档站补交错消息 / 时间线 / 非文本结果三组 demo。
evoke-chat 0.4.1 · 来源与宿主长串溢出清扫
宿主给的长串——无 title 的 citation 回退显示整段 URL、长域名、无连字符的长 token——在多处容器里画出边框:CSS 里域名点号与无空格 token 不提供换行点,容器一窄文本就横向溢出。全包 39 个组件按同一透镜过完,实锤六处收口。
修复
- ChatSources:标题/元信息/摘要三行统一放开
overflow-wrap: anywhere。元信息行此前零溢出处理,长域名直接撑破卡片;标题/摘要遇不可断串被水平硬剪且无省略号。实测长 URL 标题越界 73px、长摘要 603px 全部归零,窄容器下收缩链路恢复。 - ChatCommandMenu:候选项 label 去掉
flex-shrink: 0,改min-width: 0+ 省略,长命令名不再把行撑出菜单(420px 菜单实测越界 78px → 0),描述列共存时按比例让位;label 补title提示,悬停可看全名。 - ChatQuestion 选项 / ChatPlan 步骤 / ChatFeedback 原因标签:宿主文案容器各放开
overflow-wrap: anywhere,长串就地折行(300px/240px 窄容器实测越界 255/240px → 0)。
evoke-chat 0.4.0 · 真实接入反馈批(接通防线 / SSE 取消 / 扩展钩子 / 代际守卫)
首批真实项目接入 expose 的问题全数收口:2 P0 + 2 P1 + 4 P2(minor)。
修复(P0)
useChatSession静默断链:transport.open未被调用时,走事件出口的标准事件(delta 增量、turn/end收尾)全部蒸发,而引擎直改路径照常——症状是页面永远"思考中"。现在首次submit自动补开并console.warn;显式open()仍是正式接法(快照装载与重连语义都在那里)。readSseFrames接受{ signal }:abort 经reader.cancel()解除挂起中的 read,安静收尾、残帧按丢弃处理、监听器与锁都释放;createChatTransport中断接入解析层(abort 先解除挂起 read,再统一补turn/end(aborted))。
新增(P1 + P2)
createChatTransport新增onExtension({ event, data, json }):RAG 引用 / 进度 / 运行卡等非标准载荷的拦截口,返回true整帧认领跳过标准映射;provider接受自定义 adapter 对象(createState/buildRequest/headersOf/frameToEvents/finalize),自研后端不必复制 fetch/abort 管线。- 代际守卫与
dispose():每次open()进新代,切会话后在途轮的迟到事件就地丢弃(幽灵消息防线);open()同时清乐观气泡 / 审批 / 提问等瞬态;dispose()幂等停用、再open()复活、scope 卸载自动调用。 - 结构化进度一等通道:瞬时事件
assistant/progress({ messageId, label, detail?, elapsedMs?, percent? })→engine.setProgress→ 消息内一行阶段读数,收尾自动清空。 ChatSources条目status字段:定位状态说明与域名同行展示,不必拼进 title。ChatUsage新增segments: [{ label, tokens }]:按阶段等自定义记账进披露行,汇总按 label 合并,不计入总量。- 打包:exports 去掉
"./*"通配、40 个组件子路径逐条显式登记——未登记路径直接ERR_PACKAGE_PATH_NOT_EXPORTED,不再 advertise 不存在的子路径。
测试 +13;AI 契约页随版本重生成。详见 CHANGELOG「evoke-chat 0.4.0」小节。
v0.31.0 · tools-ui 1.4.1
本 tag 发 @wil-works/evoke-tools-ui 1.4.1(patch:缺陷修复;其余四包版本未变,矩阵自动跳过)。
修的死订阅
--ot-* 的语义权威在办公产品侧(画布色由产品 CSS 定义),这类消费方只想拿主题变化信号、不希望框架覆写自己的令牌——本该用 EtThemeBridge / observeThemeChanges 传 palette = {} 实现,实际收不到任何通知:
- 去重签名只由解析结果的值拼成,而
last初值是空串 → 空登记表签名恒为''→signature === last永远成立 → 连挂载首值都不发。 - 修法:签名改为
class | data-theme | data-density | 解析结果值,last初值null(挂载必发一次)。签名刻意不含style:本件写回的行内--ot-*只改 style 属性,含它就自激循环。 - 行为变化是加法式的(消费者只会多收不会少收):纯切档(色值不变、只有
data-density/class变)现在重发一次并重写同值。1.4.0 的@changeJSDoc 承诺「挂载即发首值」,到本版才在所有登记表形态下为真。
测试
theme-palette.test.js原「订阅」用例自记"简化:不真驱动 mutation" → 改成真驱动MutationObserver回调逐拍断言;新增palette = {}只订阅用例;两条编码旧契约的用例按新契约更新。- 变异对照:退回旧实现 → 4 条红;还原 → 全绿。
- 修一处测试卫生:断言失败未
unmount会把观察器泄漏到下一个用例(表现为"下一条莫名变红"),已try/finally收口。
验证
单测 476 例全绿;build:tools 十道门全绿;docs-tools:build(含 G11)绿;tools + docs-tools 两套 playwright 72 例全过(无基线含首页徽标,改版本号不需重录);pre-release-check 通过。
下游
office-works 已升 ^1.4.0 并把底带表页签换成 EtSheetTabs(其全仓 950 例 + e2e 18/18 双引擎通过);主题联动换 <et-theme-bridge :palette="{}" @change> 待本版本被其消费。
v0.30.0 · tools-ui 1.4.0
本 tag 发 @wil-works/evoke-tools-ui 1.4.0(其余四包版本未变,发布矩阵自动跳过)。
tools-ui 1.4.0 要点
- 两层重构:组件入口 33 → 36,子路径
./common(29)与./office(7);分类单一来源src/taxonomy.js(G9 分类门),槽位契约src/slots.js(G10 槽位门,与 SFC 双向核对) - office 三件:
EtFormulaBar(Enter 发当前编辑值 / Esc 收敛 / 组字放行)、EtSheetTabs(roving 漫游 + 溢出收「更多」、条目常驻 DOM 不丢焦点)、EtSheetCanvasHost(滚动视口 + 不随滚动的浮层位 + resize/scroll 契约) EtWorkbench新增#tabbar槽:与顶部#documents上下分工,办公整页五条带高度全走令牌- 布局契约两处真缺陷修正:显式
docks: []是合法「只有画布」树;loadLayout补empty标记(无档 ≠ 坏档,不再用默认布局顶掉产品传入的 layout) - 「中性工具壳」风格基线:焦点环不跟随品牌色 + 双色环、选中态底色去主色、圆角阶梯 2/4/8/12、阴影只给浮层三档、动效 100/150/200ms;
check-token-rule增 ⑨⑩ 三条规则 - 首次真实消费撞出的两处缺口:
EtThemeBridge新增@change(画布产品据此换引擎主题,不必自写 MutationObserver);EtStatusBar条目值与缩放显示挂aria-live="polite"
文档站(docs-tools)
- 组件页「六面」改由源码现算:
virtual:component-api每次请求从 SFC 的defineProps(含 JSDoc)/defineEmits/defineExpose、slots.js、taxonomy.js、件内 CSS 与模板事实算出,36 页手写 API 表清零;事件载荷从emit()调用点读出 - 三档密度对照带(
DemoBlock densities)+ 活体 demo 12 → 29 页 - G11 文档覆盖门(挂
docs:build):有页 / 有<CompApi>/ 不得残留手写 API 段 / 有 demo 或显式免 demo 理由 / API 成员说明零缺口 visual/docs.spec.mjs(36 例)进 CI:逐页守无 console 报错、演示区非空、无 NaN 读数
验证
单测 475 例全绿;build:tools 十道门全绿;docs-tools:build(含 G11)绿;CI 视觉守卫在 ubuntu 上 72 例全过(Linux 基线已重录,cf9faa2);office-works 侧首次真实消费已落地(状态栏 + 去轮询,其全仓 950 例 + e2e 16/16 通过)。
已知
- 视觉基线平台绑定:darwin 与 linux 各一套,改动像素需两侧分别重录(CI 有
visual-baseline手动作业) @change属加法式 API 面,故本包按 minor 发;未发布的 1.3.0/1.3.1 记录已并入本号
tools-ui 1.2.1 · backstage 滚动锁修复
@wil-works/evoke-tools-ui 1.2.1
M3 出口条件三的反向回归修复:backstage 的滚动锁原用 scrollbar-gutter: stable 预留槽位,但该属性在本来没有滚动条的页面会凭空造出 ~5px 槽位——全屏页一打开,底层画布就窄 5px(视觉用例实测 436 → 431 抓到)。
改为实测补偿:开锁前测 innerWidth - clientWidth,有滚动条才把缺口写成 padding-right,没有就是 0;卸载连同补偿一起还原;无布局环境跳过。
回归 2 例 + 视觉 backstage 用例复绿;437 单测 + 28 视觉全过。
升级:pnpm add @wil-works/evoke-tools-ui@1.2.1
evoke-chat 0.3.1 · 底部读数显隐口径修正
patch 版,修 0.3.0 的一个行为偏差:
- 底部读数(时间 / 耗时 / tokens 用量)此前只有时间随悬浮出现、耗时与用量常显 —— 现改为整组随悬浮显隐,与动作条一致(触屏常显、键盘 focus-within 可见)。
- 隐藏态加 pointer-events: none,堵住「看不见却能点」。
- 仍是 opacity 门控而非 display:隐藏时占位,悬浮出现不引起任何位移(实测行高与各元素位置两态一致)。
evoke-chat 0.3.0 · 会话编排与读数层(状态条 / 排队 / 用量披露 / 工具栏统一)
本版把对话家族这一轮的编排与读数层一次性交付:
新增
- EbChatStatusBar:8 相位状态条(形状 + 运动区分),空态不渲染,live region 只包状态句。
- 消息排队:EbChatQueue 逐条「立即发送 / 取回编辑 / 移出」+ 全部清空;引擎 enqueue/dequeue/clearQueue、本轮结束自动 flush、queueable 门。
- EbAiConsole:input-prepend 插槽 + toolbar-meta 透传;暴露 setDraft / send / focus。
- 用量读数:一行摘要 + 阶梯披露(为 0 不渲染);消息底行与时间 / 耗时 / 动作条同行——读数常显、时间与动作随悬浮淡入(无位移)。
- 视觉口径:输入类 1px 发丝环(focus 主色 1px 环)、卡片同语言;输入台 chip 统一 26px / 12px / 全圆 / 无边框 + hover 浅底;窄容器(≤560px)能力项降级为图标、额度只留数值。
- EbAppLayout 定高改可覆盖令牌 --eb-app-layout-height(默认 100vh),宿主自带顶栏不再多出滚动条。
修复
- 图片附件预览 FileReader 兜底(含 jsdom 下偶发 Unhandled Error,CI 曾因此「全绿却 exit 1」)。
- 模型菜单动画改用左下锚点,去掉 translateX(-50%) 平移。
- 跨包 API 奇偶:EvAiPromptBox 同步 queueable。