mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
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
1.6 KiB
1.6 KiB
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.agents/ctx.workspace 的宿主实现 |
ctx.apiProxy |
webserver/ |
纯 HTTP 路由注册载体:激活即监听的 node:http 服务器;路由以命名的 exact/prefix 处理器注册 |
ctx.httpServer |
directory-picker/ |
工作区目录选择 seam:网关的 picker RPC 委托的可辨识 dialog/browse 能力 |
ctx.directoryPicker |
directory-picker-dialog/ |
原生 OS 选择器后端(osascript/PowerShell/Zenity+KDialog);仅宿主屏幕可用 | (注册 ctx.directoryPicker) |
directory-picker-browse/ |
应用内浏览后端:基于 Node 标准库的列举/创建原语;支持远程 | (注册 ctx.directoryPicker) |
apiproxy 在设计上与传输方式无关——它不注册任何路由;载体自行包装 ctx.apiProxy。HTTP 载体路由(连同其 /api 浏览器信任栅栏)由 client/connection 的 node 半侧挂载,这正是该包住在 client 组的原因:它拥有这条线的两端。