Skip to content

Releases: willove/evoke-ui

evoke-business-ui 0.12.0 · Splitter resize 来源标记 + 菜单收起图标漂移修复

Choose a tag to compare

@willove willove released this 10 Oct 22:53

@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 后端示例

Choose a tag to compare

@willove willove released this 09 Oct 01:28

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)

Choose a tag to compare

@willove willove released this 08 Oct 18:25

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 · 来源与宿主长串溢出清扫

Choose a tag to compare

@willove willove released this 30 Sep 22:22

宿主给的长串——无 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 取消 / 扩展钩子 / 代际守卫)

Choose a tag to compare

@willove willove released this 28 Sep 12:40

首批真实项目接入 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

Choose a tag to compare

@willove willove released this 27 Sep 09:09

本 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 的 @change JSDoc 承诺「挂载即发首值」,到本版才在所有登记表形态下为真。

测试

  • 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

Choose a tag to compare

@willove willove released this 27 Sep 07:05

本 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 滚动锁修复

Choose a tag to compare

@willove willove released this 26 Sep 13:06

@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 · 底部读数显隐口径修正

Choose a tag to compare

@willove willove released this 26 Sep 12:10

patch 版,修 0.3.0 的一个行为偏差:

  • 底部读数(时间 / 耗时 / tokens 用量)此前只有时间随悬浮出现、耗时与用量常显 —— 现改为整组随悬浮显隐,与动作条一致(触屏常显、键盘 focus-within 可见)。
  • 隐藏态加 pointer-events: none,堵住「看不见却能点」。
  • 仍是 opacity 门控而非 display:隐藏时占位,悬浮出现不引起任何位移(实测行高与各元素位置两态一致)。

evoke-chat 0.3.0 · 会话编排与读数层(状态条 / 排队 / 用量披露 / 工具栏统一)

Choose a tag to compare

@willove willove released this 26 Sep 12:02

本版把对话家族这一轮的编排与读数层一次性交付:

新增

  • 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。