Files
deepseek-harness/packages/host/README.zh.md
creatixchu 7fd2abd828 feat(host): directory-picker capability seam with dialog and browse backends
The web GUI's folder picking was hardwired to one interaction: a native
OS chooser compiled into the gateway, unusable for remote deployments
and swappable only by editing apiproxy source.

Directory picking becomes a three-package capability seam in
packages/host: ctx.directoryPicker returns a discriminated capability —
dialog (the extracted native chooser; host-display only) or browse
(new: one-level listing + child creation over Node stdlib, hidden flags
host-stamped, symlinks followed, ancestry crumbs; remote-capable). The
gateway injects the seam, advertises the kind via
host.describe.directoryPicker, serves host.listDirectory /
host.createDirectory under browse, and answers
directory-picker-unavailable across kinds. cordis.yml is the swap
point; apps/cli keeps dialog mounted, so behavior is unchanged until
the in-app browser PR flips the default. The connection fixture serves
a deterministic browse tree; WorkspacesService gains the browse calls
the browser UI will drive. Decision record:
.agents/notes/implemented/architecture/2026-07-28-directory-picker-capability-seam.md
2026-07-28 15:44:53 +08:00

1.6 KiB
Raw Blame History

host/ — web GUI 宿主半侧

English | 中文

dsh web GUI 的宿主侧:所有客户端形态共用的 API 网关,以及承载它的纯 HTTP 服务器。浏览器侧位于 client/;组合后的应用是 apps/cli,它负责服务 apps/web。全部为产品包。

角色 ctx 键
apiproxy/ 共享 API 网关:零 Node 依赖的 TS 协议契约(src/api/、fetch 载体对(宿主侧 toFetchHandler、客户端侧 AbstractApiClient),以及基于 ctx.agentsctx.workspace 的宿主实现 ctx.apiProxy
webserver/ 纯 HTTP 路由注册载体:激活即监听的 node:http 服务器;路由以命名的 exactprefix 处理器注册 ctx.httpServer
directory-picker/ 工作区目录选择 seam网关的 picker RPC 委托的可辨识 dialogbrowse 能力 ctx.directoryPicker
directory-picker-dialog/ 原生 OS 选择器后端osascriptPowerShellZenity+KDialog仅宿主屏幕可用 (注册 ctx.directoryPicker
directory-picker-browse/ 应用内浏览后端:基于 Node 标准库的列举/创建原语;支持远程 (注册 ctx.directoryPicker

apiproxy 在设计上与传输方式无关——它不注册任何路由;载体自行包装 ctx.apiProxy。HTTP 载体路由(连同其 /api 浏览器信任栅栏)由 client/connection 的 node 半侧挂载,这正是该包住在 client 组的原因:它拥有这条线的两端。