Repository navigation
[Feature/客户端契约] openFile 缺少官方“外部编辑器”出口:宿主内嵌(VS Code 面板 / 桌面壳)时点文件只能落回 DSH 右侧栏预览 #6573
Joshuayang228
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
场景
DSH Web 被宿主内嵌时(VS Code 扩展把网页塞进 webview iframe、Electron 桌面壳、IDE 侧栏等),用户点「本轮文件改动」芯片 /
present交付卡片 / 正文内联文件名,期望的是用宿主自己的编辑器打开,而不是在 DSH 里再叠一层网页右侧栏预览。目前没有官方出口能满足这件事。现状(0.1.5-rc.2)
dsh-client-ui-chat的openFile注入是直接落到右侧栏的:sidebarRight由dsh-client-ui-sidebar-right提供(L3668ctx.reflect.provide("sidebarRight", controller)),实际是一个SidebarRightController实例;openResource(L1222) /openResourceIn(L1243) 都挂在实例上(后者注释写明 Not part ofISidebarRight: the Tab domain's path)。我现在的绕行(能跑,但依赖的全是内部结构)
写一个客户端插件
inject: ["sidebarRight"],在实例上包一层:openResource/openResourceIn拿到的dsh-resource://file/...地址里解析{scope, sessionId, path};scope === "session"时用ctx.sessions.list.getSnapshot().byId[sessionId].cwd把会话相对路径拼成主机绝对路径;postMessage({kind:'openFile'})→showTextDocument);用户侧效果是对的(三类入口一步全覆盖),但它依赖三样没有任何公开承诺的东西:
dsh-resource://file/<scope>/…的地址语法(目前只在dsh-util-workspace-path内部实现);sidebarRight恰好是一个可以被改写方法的实例(而不是 facade / 冻结对象);ctx.sessions里捞)。任何一处内部调整,插件就会悄悄失效。现实里已经发生过一次同类事故:VS Code 扩展
fengze233.dsh-vscode-panel是在 DOM 层拦文件点击的,这次因为 DSH 把类名换成了 CSS Module 哈希名(button.fileMention→_fileMention_kcgor_304),整条转发静默失效(我提在 Fengze233/dsh-vscode#22)。DOM 层脆,实例层也只是"恰好能用"。建议(任一即可)
ctx.registerFileOpener(fn)/ctx.fileOpeners,允许插件按优先级接管openFile(path);宿主内嵌时注册"交给宿主编辑器"。present卡片和「本轮文件改动」芯片上增加一个走 host capability 的"在编辑器中打开"动作(类似已有的"用默认应用打开",但要能由宿主接管)。dsh-resource://地址语法 +sidebarRight契约 + 地址→主机路径换算」作为公开 API 写进文档,并提供一个ctx.resources.resolve(address)之类的正式工具,插件就不必各自重造。附:绕行实现的关键部分(可作参考)
如果上面 1/2 里任一方向可行,我可以整理成 PR。
All reactions