|
|
920a4150a7
|
feat(agent_input): secret_defaults宿主级默认合并(显式opts优先)——全站AgentIO自动获得钥匙,不再逐产线配置
|
2026-09-18 15:37:28 +08:00 |
|
|
|
37c5e4ac29
|
feat(theme): --ink-0..3主题感知文字色变量(亮slate深阶/暗slate浅阶)——暗色对比度治理,禁.ui/.dspy硬编码字体色
|
2026-09-18 14:04:09 +08:00 |
|
|
|
f819b3242b
|
feat(agent): UiText.insertAtCursor + AgentIO 敏感信息选择窗(2026-09-17)
通用框架层,不硬编码任何宿主路径或占位符格式(对齐 model_dataurl 既有设计):
- input.js UiText.insertAtCursor(text): 光标位置插入(有选区则替换选区)。
两个时序坑照抄 handle_enter/handle_tab_indent 既有处理:程序改
dom_element.value 不触发 input 事件(须手动同步 this.value);focus() 后浏览器
可能重置 selectionStart(schedule_once 0.5ms 重设)。不 dispatch('changed')——
UiText 也用于 Form,多发一次会触发脏值/校验联动。
- agent_input.js: 钥匙图标(仅宿主传 opts.secret_dataurl 时渲染 → 未配置的宿主
完全看不到,零影响) + open_secret_picker 弹窗(HttpJson.httpcall 拉元数据列表,
只显示 name/label/type/prefix4/len/用过几次——够人类辨认但拼不出可用值) +
insert_secret_placeholder(按 opts.secret_format 生成占位符插入光标处)。
弹窗 API 用 dismiss()+'dismissed'(PopupWindow 无 close()/closed)。
- agent.js AgentIO: 透传 secret_dataurl/params/format/title/url/tip 六个配置。
- css: .secret-picker-tip/row/meta + .secret-type-tag(走全局 class,
bricks 内联嵌套 style 对象无效)。
- imgs/secret_key.svg: 24x24 stroke 风格,与 add.svg/submit.svg 一致。
宿主接入示例见 pipeline-core wwwroot/agent/index.ui。
|
2026-09-17 15:45:48 +08:00 |
|
|
|
7c1661312e
|
fix(mobile): 手机PopupWindow点输入域弹窗即关——.popupwindow移动端position:fixed钉死视口(主修:软键盘收缩视口后focus自动滚动把absolute弹窗滚出可视区)+focusin滚动归零安全网+_mobile_clamp重钳归零
|
2026-09-16 12:18:55 +08:00 |
|
|
|
449631732a
|
fix(i18n): obj_fmtstr 裸调用 ReferenceError——必须走 bricks 命名空间
utils.js 定义的是 bricks.obj_fmtstr(挂命名空间), 而 i18n.js 的 _() 里写的是
裸 obj_fmtstr(obj, mt) → ReferenceError, 导致带参翻译整体失效。
此前该行从未被执行(没有调用方给 i18n._ 传 obj), 直到 i18n_params 动态文本特性
(widget.js 透传 params)才暴露。实测: 商机产线数据参考弹窗渲染出字面 ${p0},
console 报 ReferenceError: obj_fmtstr is not defined。
对照: 同文件 objget 是 var 全局函数(utils.js:415), 裸调用合法, 无需改。
已全仓核查 obj_fmtstr 裸调用清零。
|
2026-09-14 20:08:44 +08:00 |
|
|
|
458b599061
|
feat(Text): 动态文本国际化 i18n_params 透传
TextBase.set_attrs/set_otext 把 opts.i18n_params 传给 i18n._(otext, params),
支持 otext 用占位符由后端传值(切语言重渲染同样带参)。
此前 i18n._ 已支持 obj 参数, 但 widget 层未透传 -> 后端声明 i18n_params 的
控件渲染出字面占位串。商机产线"数据参考"弹窗实测: 全部主题显示为原始占位符
而非条数/预算数字。
bundle(dist/bricks.js) 被 gitignore, 由部署侧 build.sh 构建。
|
2026-09-14 19:18:15 +08:00 |
|
|
|
1989a0f04f
|
fix(mobile): 普通Popup钳高到铺满可视屏时顶端切出屏外(负top未写回)
实测发现:普通 Popup 高度被 CSS max-height 钳到 ≈window.innerHeight 时,
positify_tl 居中标定的负 top(如 -116px)仍留在内联样式里,弹窗顶端被切
到屏外上方。旧 _mobile_clamp 的 `if(t<0) t=0` 只改局部变量没写回元素,
且 `t+h>vh` 判断用置0后的 t 漏掉负 top 场景。
修法:钳制时读内联 top 原值 raw_t——h>=vh 时强制 top=0;否则把 top 钳进
[0, vh-h] 区间;只有 t!=raw_t 才 setProperty important(避免多余写样式)。
|
2026-09-09 10:47:25 +08:00 |
|
|
|
479cc3ba05
|
fix(mobile): 手机弹窗高度超出屏幕——高度钳制到可视屏高(2026-09-08用户报障)
根因(两层):
1. popup.js positify_tl 用 body rect 高算内联 px 高:手机上文档滚动后
body 高于可视屏,百分比换算随之超屏;
2. CSS 100vh 在手机浏览器是 large viewport(含地址栏遮挡区)>innerHeight,
且只有 .popupwindow 被钳制,普通 .popup(消息/下拉等弹出控件)无钳制。
修法(框架层,应用零改动):
- popup.js 新增 _mobile_clamp():手机视口下以 window.innerHeight 实测
钳制——PopupWindow 恒等于可视高-TabBar实测高(setProperty important
覆盖CSS !important,不依赖dvh支持,老微信X5兜底);普通 Popup 仅超屏时
钳高并回拉 top。positify_tl/popup_from_widget/stop_moving 各出口接入;
- visualViewport+window resize 监听:转屏/软键盘弹出收起时重钳(100ms
防抖),destroy 时清理防泄漏;
- bricks.css 手机媒体查询:.popup:not(.popupwindow) 补 max-height
100vh/dvh 钳制+overflow-y:auto;@supports dvh 优先(随地址栏收缩),
JS 实测内联 important 是权威,CSS 只是首帧静态兜底。
|
2026-09-09 10:39:54 +08:00 |
|
|
|
5648da13c7
|
feat(mobile): 底部TabBar溢出「更多」机制+MobileSheet底部上滑竖向菜单(2026-09-08用户要求:tab多于4个时第5格收更多,点击弹竖菜单,选中项照常open_tab进内容区)——TabBar opts.more追加更多格(派发more事件,永不高亮);TabPanel createMobileBar按max_visible(默认4)切visible/overflow,more.dataurl动态项打开时实时拉(已购产线购买即出现,无需改index.ui);新增MobileSheet控件(蒙层9500>TabBar9000<PopupWindow10000起,功能弹窗不被蒙层挡;面板justify-content:flex-end贴底,column下align-items会挤右侧;同屏单例;_teardown自实现摘除防蒙层残留;popup:true项点击直接widgetBuild urlwidget走PopupWindow自开链路);css含dark变体
|
2026-09-08 19:30:55 +08:00 |
|
|
|
44411712d0
|
fix(agent): 用户输入「停」要真停在输入停之前——旧实现前端无AbortController,停指令被当普通消息再POST一次(后端关键词短路回'已停止'),但上一条流式请求是独立HTTP连接仍持续reader.read()渲染+后端生成器继续跑→'已停止'与旧输出同时刷屏(2026-09-08用户报障);修法:AgentIO每条流注册AbortController到_running_streams,「停」整句精确匹配(绝不子串,防'为什么已取消'误杀)且有在飞流时→abort fetch(服务端连接断→ahserver检测断连break→生成器链下个yield点GeneratorExit终止,实测断连后0个新LLM调用)+冻结旧气泡(update_data见_stopped即return,不再渲染后续chunk,停在输入停之前)+追加'已停止'标记;停指令不上屏不发请求(零LLM费用);jsoncall全链透传signal(bricks_fetch/httpcall/post)+handle_chunk对AbortError静默收尾(reader.cancel的Promise.catch兜底防unhandledrejection);playwright端到端实测:输出冻结chunks_grew=0/服务端确认BrokenPipe断连/停后零多余POST/新消息正常/语义精确匹配全过
|
2026-09-08 17:25:19 +08:00 |
|
|
|
1d4c6be71f
|
fix(mobile): 手机全屏弹窗底部让出TabBar(不盖底部标签栏,用户随时可点Tab离开)+pl-gate定位工具类(未购门禁遮罩用)(2026-09-08用户三条要求)
|
2026-09-08 16:01:13 +08:00 |
|
|
|
69a41fac54
|
fix(tab): 首屏tab无active高亮——Toolbar.createTools完成后从不dispatch('ready')(TabPanel的ready绑定是死绑定),show_first_tab走dispatch('command')绕过do_handle高亮逻辑;修法:createTools末尾广播ready+show_first_tab在按钮已建好时改走toolbar.click(2026-09-08,playwright实测首屏home tab高亮+全量回归过)
|
2026-09-08 15:56:23 +08:00 |
|
|
|
93c8cac5bc
|
fix(tab): TabPanel删tab/开tab两bug——①删当前tab内容不清+不回切:Toolbar.remove_item调用不存在的unselect_item抛TypeError致dispatch('remove')永远到不了tab_removed(Layout补unselect_item;tab_removed补items移除/content destroy/无tab清空);②菜单新增tab高亮不切:createTool是async,同步toolbar.click时新按钮未进toolList空转(open_tab改await add_tab后再click);删tab回切目标=访问历史最近tab(_push_tab_history),非固定first(2026-09-08用户报bug,playwright本地实测修复+边缘用例过)
|
2026-09-08 15:48:40 +08:00 |
|
|
|
d19592c79b
|
fix(mobile): 登录页文档内登录成功后导航回根域名——shell in-place渲染进login.ui文档致baseURI=/rbac/user/,后续根绝对urlwidget全401→登录窗反复打开(用户报障实测根因);桌面弹窗登录document是shell页不受影响(2026-09-08)
|
2026-09-08 15:31:08 +08:00 |
|
|
|
9f3155a9f2
|
fix(mobile): 底部Tab点击无响应+登录窗叠开——①_mobile_bar_clicked不解包dispatch事件({params:数据})致item.name恒undefined静默return(实测根因,Toolbar/Menu同约定);②withLoginInfo加登录窗单例_bricks._login_window_pending,并发401共享一窗后来者等销毁后重试,重试逻辑抽_retry_after_login共享尾部(2026-09-08用户报障)
|
2026-09-08 15:27:13 +08:00 |
|
|
|
dc534768ea
|
fix(mobile): ChipBar css拼接前导空格致classList.add('')抛SyntaxError——widgetBuild中断内容区空白(浏览器实测根因)(2026-09-08)
|
2026-09-08 14:52:04 +08:00 |
|
|
|
af9d81929d
|
fix(mobile): mobile_hidden首次应用推迟到构造链结束(schedule_once)——Button子类构造在super()后写行内display:flex覆盖同步设置的none,致手机端汉堡按钮重现(浏览器实测发现)(2026-09-08)
|
2026-09-08 14:49:50 +08:00 |
|
|
|
902d6f824f
|
feat(mobile): 手机端H5适配收编入框架——TabBar/ChipBar控件+声明式mobile_hidden/mobile_opts+TabPanel mobile_bar模式+AgentIO.set_pipeline切产线+index_tab.js动态tab收编(修show_tabcontent未定义name/refresh语义/add_tab不存在的add_removeable三处旧bug)+PopupWindow全屏化+iOS 16px输入防缩放(2026-09-07用户需求:适配逻辑不出bricks框架)
|
2026-09-08 14:26:24 +08:00 |
|
|
|
f2884eefc2
|
feat(mdwidget): 已渲染媒体(img/video/audio)追加下载按钮——会话agent生成的媒体可下载;同源走?download=1强制附件(Content-Disposition),内联data用download属性,外链新窗口;注入放在链接处理循环之后防被onclick拦截成markdown加载(2026-09-08用户定夺)
|
2026-09-08 11:58:38 +08:00 |
|
|
|
f31ef89eca
|
fix(tabular): 删除Tabular.get_hidefields死代码覆写(this.data_params从未赋值恒为空)——子表新增/编辑表单丢失data_params隐藏字段(vendor_id等)不注入,继承DataViewer正确版(this.opts.data_params)
|
2026-09-06 21:51:06 +08:00 |
|
|
|
8446104ac9
|
fix(form): FormBody文本字段透传placeholder——textarea编辑框格式提示不丢失
|
2026-09-03 17:18:49 +08:00 |
|
|
|
4c8abd57e5
|
feat(input): UiText支持placeholder——textarea编辑框显示格式提示(供应商端点目录等JSON字段需要)
|
2026-09-03 17:10:05 +08:00 |
|
|
|
658e0bd748
|
Merge git.opencomputing.cn:yumoqing/bricks
|
2026-09-02 13:54:31 +08:00 |
|
|
|
f2bf42e7c7
|
feat(input): UiCheckBox 支持 multicheck 多选(opts.multicheck)——原属性存在但从未赋值
|
2026-09-02 13:54:23 +08:00 |
|
|
|
d3cff3e923
|
fix(AgentIO): 跟滚误关根治——_track_follow按scrollTop减小判用户上翻
旧实现按gap判follow:异步widget挂载使scroll事件滞后,程序滚底后gap瞬时>80
被误判为用户上翻→follow关→第二条消息后输出不再跟滚
|
2026-09-02 11:02:51 +08:00 |
|
|
|
4815e1e54d
|
fix(AgentIO): 滚底根治——MutationObserver监听内容增长
widget描述符走widgetBuild().then()异步挂载,同步滚总在挂载前执行滚不到新内容;
MutationObserver在挂载落DOM后触发,同步/异步渲染全覆盖,后台tab也生效
|
2026-09-02 10:57:17 +08:00 |
|
|
|
26aad5712a
|
fix(AgentIO): 滚底改同步——后台tab不触发rAF导致流式更新时不滚
|
2026-09-01 18:11:22 +08:00 |
|
|
|
89917d4328
|
feat(AgentIO): 会话区保持最后输出可见——超出显示范围自动滚到底
- chunk_response流式更新后scroll_to_bottom(rAF延迟到布局完成)
- show_input用户发消息强制滚底
- 用户上翻看历史暂停跟滚(_track_follow),滚回底部恢复——不强行打断阅读
|
2026-09-01 18:02:29 +08:00 |
|
|
|
6a94f10370
|
feat(AgentIO): 正文输入回车直接发送、Ctrl+回车换行——UiText新增opt-in的enter_sends选项(默认关,不影响其他表单),submit图标功能不变
|
2026-09-01 17:31:46 +08:00 |
|
|
|
a77200c5ae
|
fix: Tree展开/收起同步三角图标状态; 模块JS注入统一加版本参数防缓存(20260831a)
|
2026-08-30 21:53:26 +08:00 |
|
pipeline-agent
|
2d145ddf8e
|
chore: bricks版本号升20260830e,强制客户端刷新(get_by_id已是原版,零字节差异)
|
2026-08-30 20:41:11 +08:00 |
|
pipeline-agent
|
706c461e6b
|
feat: Tree点击非叶子节点自动展开(懒加载友好); CodeEditor控件+CodeMirror5
|
2026-08-30 20:07:23 +08:00 |
|
pipeline-agent
|
735387555c
|
feat: CodeEditor控件——CodeMirror5包装(行号/高亮/懒加载),3parties加codemirror5+python模式
|
2026-08-30 19:48:56 +08:00 |
|
pipeline-agent
|
1a4d664b5a
|
revert: get_by_id改回原版分段查找——.是框架设计的控件路由分隔符,后缀兜底是错误修法;UI侧改用裸id
|
2026-08-30 13:55:35 +08:00 |
|
pipeline-agent
|
b7b85e063f
|
fix: get_by_id层级id查找——精确匹配+后缀兜底+CSS.escape,修复urlwidget replace target静默miss(世界/场景/实体等创建导入点击无反应根因)
|
2026-08-30 13:04:07 +08:00 |
|
|
|
47b08371aa
|
feat: MdWidget/MarkdownViewer外链新窗口打开(非同源链接不再被拦截成站内跳转)
|
2026-08-29 15:00:35 +08:00 |
|
|
|
9f05e56d93
|
chore: bricks.js 缓存版本号 20260825a→20260829a(label 兼容修复强制刷新)
|
2026-08-29 09:02:38 +08:00 |
|
|
|
093b849bf1
|
fix(Text): 兼容 label 写法——LLM 生成 .ui 常用 label,此前静默渲染空文本致界面空白
|
2026-08-29 09:01:52 +08:00 |
|
|
|
4cf2c1a57e
|
feat(AgentInput): 模型下拉自动注入 session_id——多tab按会话解析项目模型,各产线UI无需逐个配置
|
2026-08-28 12:39:26 +08:00 |
|
|
|
5227a4d491
|
fix(AgentIO): 模型下拉尊重服务端 selected 标记,不再每次重建回退首项
- UiCode.build_options: 未显式指定 value 时,扫描数据项 selected:true 标记作为初始选中
(此前每次重建控件都把用户已持久化的选择重置成列表第一项)
- AgentIO 透传 model_params 给 AgentInput(多 tab 会话按 session_id 解析项目模型)
|
2026-08-28 12:26:02 +08:00 |
|
|
|
406ed6f17a
|
feat(scene3d): Scene3D 接入脚本引擎 + 按需注入 three.js + 自写环绕相机
- engine.js/inherit.js 以 UMD 双分支引入(node 测试照跑 + 浏览器拼进 bricks.js)
- Scene3D 新增本地逻辑引擎(独立世界):描述符 properties/events 喂 SceneRuntime,
点击→tap 注入、每帧 step 推进、transform/visible 回填 three.js
- three.min.js 按需注入(非 3D 页面不背 608KB)
- 自写环绕相机:单指旋转/双指缩放/双指平移(three.js r148+ 移除 UMD OrbitControls)
- 新增 API:set_entity_transform / set_paused / reset_runtime
- 已验证:门铃示例(定时+条件+点击+moveTo+属性变化)、相机旋转全链路
|
2026-08-27 15:41:51 +08:00 |
|
|
|
d945e414d7
|
feat(scene3d): Scene3D widget — bricks3d 最小闭环(后端声明式场景描述符→three.js 本地渲染→entity_tapped 事件回传)
- scene3d.js: Scene3D widget(VBox 子类),支持 box/sphere/cylinder/model 实体
内联 scene 或 scene_url 两种描述符来源;Raycaster 拾取→dispatch entity_tapped
活动对象(scene/camera/renderer/mesh)只存实例私有字段,防 JSON.stringify 循环引用
s3_dispose() 释放 WebGL 资源;set_entity_color/set_entity_visible 公共 API
- build.sh: scene3d.js 加入 SOURCES
- 3parties/three.min.js: r149 UMD 全局版(608KB,npmmirror 下载)
- examples/scene3d_demo.html: 演示页(4 实体场景 + scene_ready/entity_tapped binds)
验证(CDP 实测):场景就绪事件✅ 点击拾取✅ entity_tapped→binds→状态栏更新✅
球点击变色 #f59e0b→#ef4444 全链路通过;干净重载 0 JS 异常
|
2026-08-27 11:31:10 +08:00 |
|
|
|
8a92b95990
|
fix(css): .scrollpanel 选择器缺逗号导致 VScrollPanel 无 width/height/overflow 样式(高度塌陷)
|
2026-08-25 15:05:21 +08:00 |
|
|
|
635bd76386
|
feat(header.tmpl): 应用级 js/css 与 bricks 主文件加 ?v=assets_ver() 缓存版本号(服务端未注册则退化为原行为)
|
2026-08-25 14:36:16 +08:00 |
|
|
|
7e0d5a1701
|
fix(bricks): on_parent 等事件 params 为 widget 对象时不再撞循环 JSON
- buildEventHandler: event.params 经 bricks.event_params_data 过滤,widget/DOM/Event 不当数据用
- apply_data: 改用 bricks.safe_json_stringify,循环引用时降级序列化而不抛异常
- bump bricks.js 缓存版本 20260825a
|
2026-08-25 13:56:20 +08:00 |
|
|
|
91b3212f31
|
chore: bump bricks.js 缓存版本号 20260820b(登录不刷新页面 login_source/refresh)
|
2026-08-20 14:44:09 +08:00 |
|
|
|
f2f9893bac
|
fix(bricks): 非用户主动登录(401自动弹窗)成功后不刷新页面
- withLoginInfo 弹登录窗带 login_source=auto 标记被动登录
- Message 类读 refresh=false 设 _login_no_reload,跳过 dispatch user_logined
- 用户主动点击登录仍正常刷新
|
2026-08-20 14:41:18 +08:00 |
|
|
|
3c8eb4bb3d
|
fix(tree): 展开箭头和节点图标加 flexShrink:0,防止长label挤压到0宽
|
2026-08-19 20:31:20 +08:00 |
|
|
|
2c0f01451b
|
chore: bump bricks.js 缓存版本号 20260818a(AgentInput padding)
|
2026-08-18 18:46:16 +08:00 |
|
|
|
625b6441bf
|
chore: bump bricks.js 缓存版本号 20260815g
|
2026-08-18 18:43:44 +08:00 |
|