HuanLinOTO
6001f0167c
fix: 合并 main 后的测试回归修复
...
- index.ts: 移除 #130 遗留的 ctx.on('session/disposed')(fake ctx 无 on,
且 #130 已按取 HEAD 决策,closeSession 调用方一并移除)
- browser.probe: 405→GET 重试后跳过 embed-signals GET,避免多余第 3 次请求(#69)
- EditorHost: 移植 #228 的 dirty 确认守卫到 HEAD 的 reloadSeq 结构(refreshFile)
- tests: fake ctx 补 get()(#357 ctx.get 回归,free-window/editor-refresh/markdown)
- tests: prefs 期望对象补 browserAllowedLoopback(smoke/plugin-shape/state)
- tests: builtins 浏览器设置行补 browserAllowedLoopback(#69)
- tests: install-powershell BOM 门限仅对实际文档化远程调用的文件生效
- locales: 19 语言补齐 showInFolder / refreshUnsavedConfirm(#94 #215 #228)
2026-08-24 17:54:33 +08:00
HuanLinOTO
15e90d936e
merge: 合入最新 main(#353 agent-open-tools / #360 markdown-html-toc 等),解决 PR 合并性
...
# Conflicts:
# src/client/EditorHost.tsx
# tests/prefs.spec.ts
2026-08-24 16:41:02 +08:00
Menghuan1918
8e0ef7a175
merge: 合入 main(PR #353 agent-open-tools),AGENTS.md 参考实现清单两条例目并存
2026-08-24 13:58:58 +08:00
Menghuan1918
7f634866bf
feat(editor): Markdown 预览内嵌 HTML 安全渲染 + 目录大纲(TOC)
...
宿主 MarkdownText 出于聊天安全把 raw HTML 按字面文本渲染,预览 GitHub
风格 README(徽章墙 div、details 折叠块内嵌 markdown、表格单元格内联
标签、video/picture)时全是源码文本。本次在不动渲染器的前提下:
- markdown-html.ts(纯函数):fence 感知切分器把文档切成 markdown/html
段(CommonMark type-6 块级标签名单 + 注释段 + 空行终止);段内标签
tokenizer 归约 open/close/html parts;全文档引用定义收集(每段追加
保持 [text][id] 跨段语义)
- MarkdownHtml.tsx:DOMPurify 白名单消毒(显式禁 script/iframe/form
等;a 强制 _blank+noopener;本地媒体 src 经 /sidebar/file 重写);
MarkdownDocument 帧栈状态机让 <details> 跨段嵌套内部 markdown;
MarkdownSegment 内联替换(MutationObserver 幂等 pass,把表格单元格
等处标签文本消毒还原为元素,纯散文不误伤)
- md-toc.tsx:零高度 sticky 浮动目录按钮(≥3 标题)+ 弹出大纲,跳转
平滑滚动 + 自动展开折叠 details + 高亮闪现。关键修复:子组件读父
ref 在 React layout 阶段恒为 null(子先于父),改为经自身 bar ref
的 parentElement 定位容器(jsdom 单测传预填 ref 掩盖了该 bug,仅
真实挂载 e2e 抓到)
- 纯 markdown 文档走原单次解析路径零变化(现有 mermaid e2e 守卫一字
不动);新增 readme-style.md 种子 + 探针(消毒渲染/嵌套/内联/TOC
全链路);19 语言词典新增 toc 键;dompurify 提升为直接依赖(与
mermaid 传递依赖去重单版本)
设计文档 docs/plans/2026-08-24-markdown-html-toc-design.md
2026-08-24 12:05:14 +08:00
HuanLinOTO
8e04ee6f74
merge #69 : probe embed signals via GET fallback when HEAD omits them (trinhthiminh650-tech)
...
# Conflicts:
# src/client/builtins/tabs.tsx
# src/client/locales.ts
# src/client/prefs.ts
# src/config.ts
# src/index.ts
# src/prefs-shared.ts
2026-08-24 01:31:54 +08:00
Menghuan1918
68640101e1
feat: sidebar_open tool gates model-driven sidebar opens behind a global setting
...
New global Side card setting `agentOpenTools` (default off, 常规 group):
when enabled, one `sidebar_open` tool is injected into the model so it can
actively open a local file, a local folder (tree rooted there), or an
HTTP(S) page in the calling session's sidebar.
- host: AgentOpenRegistry + registerOpenTool (src/agent-opens.ts); the tool
classifies http(s) URLs / stat-driven file/folder paths, refuses other
schemes, resolves relative paths against the session cwd, and reports
target-tab-disabled instead of silently no-oping. Gated like
agentTerminalTools (register/drain on settings watch).
- delivery: /sidebar/ws/agent-opens push (consume-on-send queue, replay on
attach); the tool result reports `delivered` so queued opens for
non-active sessions are honest.
- client: Sidebar subscribes and routes pushes to editor (file), folder
window (meta.dir, tree rooted at the folder — EditorHost), or browser
(URL) tabs; settings row in 常规 + 20 locale dictionaries.
- tests: agent-opens registry/tool spec, smoke gating + WS route list,
prefs/plugin-shape defaults, editor-host folder window, side-card rows.
- docs: design doc, AGENTS.md key lists + reference, README feature bullets.
2026-08-24 01:19:43 +08:00
Atlas Zeng
36a4119253
Merge pull request #354 from omdsh-dev/feat/free-window
...
feat(ui): 自由窗口——tab 拖出侧边栏成为可移动/缩放/置顶的浮动窗口 (v0.16.0)
2026-08-24 01:12:37 +08:00
Menghuan1918
f17a1b30ac
feat(ui): 自由窗口——tab 拖出侧边栏成为可移动/缩放/置顶的浮动窗口 (v0.16.0)
...
- 拖出:标签栏 tab 拖到主会话列(HTML5 DnD 检测 + 虚线提示浮层)或右键菜单
「移动到自由窗口」(右/底面板共用 TabBar),tab 从 pane 移动进 SidebarState.floats
- 窗口(FreeWindow,渲染于 [data-dsh-panel-host] z-42):头部 pointer 拖动
(rAF 直写 + 松手提交)、拖到 pane 高亮停靠(center 合并)、SE 角缩放、
点击置顶、头部右键(回到侧边栏/关闭)、X = closeTab 走正常生命周期
- 服务语义:openTab dedupe/id 聚焦浮动 tab = 置顶窗口(不展开面板);
closeTab/activateTab 兼顾 floats;agent 终端 reconcile 覆盖浮窗;
features 单调新增 'floatWindows',版本 0.16.0
- 持久化:floats 随会话 localStorage,sanitizeState 宽容校验 + 几何钳制,
uid 播种覆盖 float 前缀;i18n 三键 19 语言同步
- 关键修复(e2e 发现):portal 覆盖层(头部 Menu)的合成事件沿 React 树
冒泡回拖拽表面,劫持菜单行点击——拖拽起点加 DOM 同源守卫(jsdom 不复现)
- e2e-mount.sh:缺省 tarball 改取 mtime 最新(旧字典序选择会把冒烟挂到
过期产物);新增 tests/e2e/float-window.e2e.ts 双用例
2026-08-23 23:44:18 +08:00
HuanLinOTO
e07d4ba5dd
fix(i18n): add ja translation for worktree key ( #285 )
2026-08-23 20:39:46 +08:00
HuanLinOTO
7ceee777b4
feat(i18n): 接入 @huanlin/dsh-plugin-better-locale 支持 ja 覆盖
...
新增 ja 词典(src/client/locales-ja.ts,326 keys,与 zh key-set-equal),
通过可选 peer @huanlin/dsh-plugin-better-locale 接入第三语言覆盖:
- locales.ts: 新增 attachBetterLocale(store) + ja dict export;t() 先查
store.getOverride(active, 'betterSidebar', key),命中则返回覆盖文本,
否则走原 zh/en 链;isZh() 在 override 激活时返回 false
- client/index.tsx: apply 中 ctx.get('betterLocale') 取得 override store
(optional,未安装时为 undefined),attachBetterLocale 注入 t();同时
register('betterSidebar', { ja }) 把 ja 词典注册进 better-locale 的
store,让外部 ctx.locale.lookup 调用者也能拿到 ja 文本
- Sidebar.tsx: 新增 betterLocaleActive uSES 订阅 store.subscribe,覆盖
切换时全树重渲染(DSH locale 的 active 字段不变,既有 localeRevision
uSES 不会触发)
- package.json: @huanlin/dsh-plugin-better-locale 加为 optional peer
+ devDep link
- tests/locales.spec.ts: 新增 7 个 better-locale override 测试(命中/
fallback/detach/interpolate/ja dict 完整性 smoke check)
未安装 better-locale 时 ctx.get 返回 undefined,整段为 no-op,zh/en
行为完全不变。
2026-08-23 00:52:20 +08:00