@xfcodeai/dsh-client-ui-open-in-app
v0.1.5-rc.5
Published
Web Session-header "Open In..." split button opening the session workspace directory in a locally installed application
Readme
description: "Web 会话头部 "Open In..." 分体按钮:在记住的应用中打开会话 workspace 目录,并列出主机探测到已安装的全部应用。" kind: "package-reference"
@xfcodeai/dsh-client-ui-open-in-app
English | 中文
概述
本包提供 open-in-app 功能的浏览器表面:会话头部的一个分体按钮,主按钮在记住的应用中打开当前会话的 workspace 目录(会话摘要的 cwd),下拉箭头列出主机探测到已安装的全部 catalog 应用。可用性、图标与启动均来自 dsh-host-open-in-app 的主机路由;两个包应一起挂载。没有 workspace 目录的会话、或没装任何可命名应用的主机,完全不渲染按钮。
目录
使用本包
把本插件与 dsh-host-open-in-app 并排挂进 Web 组合;这对包用两行 cordis.yml 组成完整功能,本行不接受任何配置。只要主机探测到至少一个已安装的 catalog 应用且会话有已知的 workspace 目录,会话头部就会出现 "Open In..." 分体按钮。
预期行为
主按钮显示记住的应用图标——凡主机能提取的都是应用真实图标(macOS bundle 图标、Windows 可执行文件图标、Linux 主题图标),提取不到时是通用占位图形——并带设计系统 tooltip(「在本地打开」);点击立即启动。下拉箭头打开已安装应用的紧凑菜单,记住的条目以整行填充标记。可用性每页读取一次;上次选择的应用持久化在浏览器中(dsh.open-in-app.choice),不再安装的选择回退到第一个可用条目。快速完成的启动不改变按钮外观——变暗的等待态只在飞行超过 250 毫秒后出现——失败的启动显示错误 tooltip 与红色描边两秒。所有文案在双语 open-in-app locale 命名空间中;词典无法命名的应用 id 不会被提供。
理解实现
插件通过标准 slot/inject 机制把分体按钮注册到 conversation.session.header.utilities,并以一个 effect 注册 open-in-app 词典。一个页面生命周期的 controller(src/client/controller.ts)拥有每页一次的可用性读取、持久化选择的 snapshot store 与启动 POST;组件经 inject 的 hooks 隔间接收两个 store,因此所有会话头部共享同一份事实。路由路径与 wire 载荷类型从主机包的浏览器安全子路径 @xfcodeai/dsh-host-open-in-app/shared 内联。飞行中的启动由 ref 守卫——启动期间的重复点击与菜单选择被整体忽略(否则会持久化一个该手势从未打开的选择)——busy/error 视觉由围绕 launch promise 的定时器驱动。节点半边是一个空 apply,让插件出现在主机侧的插件名册上。
进一步探索
- dsh-host-open-in-app——提供可用性、图标与启动的主机路由,及其背后的目录。
- dsh-session-log-export——会话头部的姊妹动作。
- Web client 架构——浏览器插件行如何加载并注册 slot。
模型体验
无。分体按钮是浏览器 chrome;这里没有任何东西进入模型请求。
KV Cache 影响
无;本包从不组装或发送提供方请求。
已知限制与延后工作
- 词典把守菜单。 主机目录的新条目若在两份词典中没有对应的
app.<id>条目,将保持不可见而不是显示裸 id;扩展目录意味着同时扩展dsh-host-open-in-app与本包的 locale。 - 可用性每页只读一次。 页面打开期间安装的应用要重新加载页面后才出现(主机侧还需主机重启)。
开发备注
功能层面的各项决定,包括拆分为主机包与本表面包,记录在转正 Agent Note。
运行时不变式: 不发布伴生入口。插件注册一个词典 effect 和一个 header slot 条目,HMR 安全性 spec 证明二者都会在资源释放时撤销;可用性与选择存储在控制器的快照存储中,不存在可能与之分歧的第二份副本。
