双栏工作台
Agent 双栏工作台画布:左对话流 / 右文档(各自滚动容器,宿主内容经 setChat / setDoc 挂入)+ 6px 比例分隔条(pointer 拖拽 rAF 批处理、←/→ 微调、双击复位 0.42,自实现不依赖 split-pane)+ 右栏内联 diff(复用 ai-diff,addDiff 接 parseUnifiedDiff 产物)+ 底部版本时间轴(addVersion,current 抢占高亮)+ 划词 AI 工具条(setSelectionTools 注入,选中文本浮「改写 / 补引用 / 总结」→ icen:kb-canvas-ai {instruction, selection})。
拖中间分隔条调比例(双击复位)· 右栏划选文本浮 AI 工具条 · 底部版本轴点击切换 · 右侧 diff 卡可展开并接受 / 拒绝
<div id="kb-canvas-demo"></div><p class="demo-label" id="kb-canvas-log" style="margin-top:8px">拖中间分隔条调比例(双击复位)· 右栏划选文本浮 AI 工具条 · 底部版本轴点击切换 · 右侧 diff 卡可展开并接受 / 拒绝</p> 安装
bun add @icen.ai/ui pnpm add @icen.ai/ui npm install @icen.ai/ui yarn add @icen.ai/ui 一行引入该组件(CSS 与 behavior 自动带上,无需关心内部 CSS 文件名):
import '@icen.ai/ui/kit/kb-canvas';import { initAiDiff } from '@icen.ai/ui';initAiDiff(); 也可以用脚手架直接打印引入行:
bunx --bun @icen.ai/ui add kb-canvas
Astro 项目注意:kit 入口里的 CSS import 在页面 <script> 里会被 Astro 的 client bundle 摇掉——请改在布局 frontmatter 里引 CSS(import '@icen.ai/ui/components/kb-agent.css';),JS 行为仍可走 kit。Vite SPA / webpack 项目无此问题。
用法
import { createKbCanvas } from '@icen.ai/ui/kit/kb-canvas';import { parseUnifiedDiff } from '@icen.ai/ui/kit/ai-diff'; const canvas = createKbCanvas(el, { minRatio: 0.2, // 左栏最小占比(同时约束右栏) onAI: (d) => runInstruction(d.instruction, d.selection), // 与 icen:kb-canvas-ai 事件双通道 onVersion: (d) => checkout(d.versionId), // 与 icen:kb-canvas-version 双通道});canvas.setChat(chatNode); // 左栏对话流(Node 或纯文本)canvas.setDoc(docNode); // 右栏文档canvas.addDiff(parseUnifiedDiff(diffText)); // 右栏追加 ai-diff 渲染的内联 diffcanvas.addVersion({ id: 'v3', label: '批量改写', at: Date.now(), current: true });canvas.setSelectionTools([ // 划词工具条(空数组 = 关闭) { label: '改写', instruction: '改写选中文本,保持口径一致' }, { label: '补引用', instruction: '为选中文本补充引用来源' }, { label: '总结', instruction: '将选中文本总结为三点' },]);canvas.destroy();// 分隔条:拖拽 rAF 批处理 · ←/→ ±0.02 · Home/End 极值 · 双击复位 0.42(split-pane 心智)