@deepseek-ai/dsh-web-app 0.1.1-rc.2 → 0.1.2-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/bundle/web-app/README.md
5
- README.md: c8a6874bc01696fc7c9ca65faf772da81ac1e964
6
- README.zh.md: cb58177daa9eb166e29e4169409bbc6a558437e0
5
+ README.md: 5588c7e72e6d61454620075c239ea571d026c5cf
6
+ README.zh.md: bfd7a58bf5343ddd06b49b97b622493f389da72f
package/README.md CHANGED
@@ -1,20 +1,130 @@
1
- # `@deepseek-ai/dsh-web-app`
1
+ ---
2
+ description: "The browser GUI for dsh: interactive chat, model and settings management, and session history, for users running the dsh web surface."
3
+ kind: "package-bundle"
4
+ ---
5
+
6
+ # @deepseek-ai/dsh-web-app
2
7
 
3
8
  English | [中文](README.zh.md)
4
9
 
5
- The dsh browser-surface bundle. [`cordis.patch.yml`](cordis.patch.yml) rides over [`dsh-base`](../base/README.md): it sets the coding persona, inserts the Web host rows (webserver, API gateway, workspace, projection cache, storage) and the browser plugin roster, the always-on client-plugin reload chain ([`dsh-client-hmr`](../../client/hmr/README.md), idle until a rebuild watcher rewrites client bundles), and mounts this package's `web-runtime` glue plugin (config `{openBrowser, printUrl, surfaceContext, trustedHosts}`). That plugin resolves the built frontend dist through `@deepseek-ai/dsh-web-frontend`'s exports, samples bind-dependent LAN trust once, provides it as `webRuntime` to the browser-trust fence and client roster, mounts the [`frontend-static`](../../host/frontend-static/README.md) fallback owner, and registers the harness-source and web-surface prompt sections plus the bash-visible `DSH_WEB_URL` runtime variable when `surfaceContext` is true. After its Loader tree settles, it prints the `dsh web:` URL line when `printUrl` is true and opens the canonical host URL in the default browser when `openBrowser` is true and the inherited `SSH_CONNECTION` and `SSH_TTY` are blank or absent. An SSH launch keeps the URL line but suppresses browser handoff because the SSH client or editor owns the local forwarded address. Immediately before a handoff, the runtime prints `dsh web: opening the default browser; pass --no-open to disable`. A short-lived Node helper runs the maintained platform opener with the canonical scrubbed child environment. On Windows it stays alive until the short-lived PowerShell launcher exits, because `open` reports spawn before that launcher has handed the URL to the shell; elsewhere the helper stops after the opener accepts spawn. A helper failure writes a diagnostic with its reason and the manual URL to stderr without stopping the server, and no path waits for the browser to exit. This bundle also owns the app command line: the ordinary `web-startup` provider ([`src/startup.ts`](src/startup.ts)) injects `ctx.cmdlineArgs` ([`dsh-cmdline`](../../boot/cmdline/README.md)), parses `--host`, `--port`, repeatable `--trusted-host`, `--no-open`, and the app's `--help`, then provides `webStartup`; browser opening defaults on for local launches, and `--no-open` turns it off for this invocation. It rejects `--host 0.0.0.0` before publishing that service because the CLI intentionally does not support all-interfaces binding yet. Flag-configured rows inject the service and read it directly from lazy config, so nothing binds a port before argument resolution and `dsh --profile web --help` starts no server. [`dsh-headless`](../headless/README.md) is a sibling surface over the same base and does not mount this bundle.
10
+ ## Summary
11
+
12
+ Run `dsh --profile web` and the interface opens in your default browser, ready for interactive chat with the agent. You get the conversation view, model and settings management, and session history, backed by the same model access, tools, and safety defaults as every other surface. The command prints a tokenized startup URL; the browser exchanges that token for a signed session cookie and redirects to the clean root URL. You can change the port, suppress the browser handoff, and allow extra hosts from the command line; binding all network interfaces is intentionally not supported. Choose it for interactive work in the browser; `dsh-headless` is the one-shot command-line sibling.
13
+
14
+ ## Table of Contents
15
+
16
+ - [Use this package](#use-this-package)
17
+ - [Understand the implementation](#understand-the-implementation)
18
+ - [Further Exploration](#further-exploration)
19
+ - [Model Experience](#model-experience)
20
+ - [Known Limitations and Deferred Work](#known-limitations-and-deferred-work)
21
+ - [Dev Note](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## Use this package
27
+
28
+ Start the GUI, open your browser, and start talking to the agent. The flags fine-tune the invocation.
29
+
30
+ ### Starting the Web GUI
31
+
32
+ ```sh
33
+ dsh --profile web
34
+ dsh --profile web --no-open --port 8080
35
+ ```
36
+
37
+ After startup you see a `dsh web:` line whose root URL carries a fresh process token. Unless `--no-open` or an SSH session suppresses it, the default browser opens that URL, receives a signed cookie, and redirects to the clean root page. You know it worked when the page loads and you can chat with the agent. Two failures to expect: if the frontend is not built, startup stops with a build hint (`pnpm run build` in a checkout); if the browser cannot be opened, a credential-free diagnostic prints to stderr while the server keeps running — open the printed startup URL yourself.
38
+
39
+ ### Configuration
40
+
41
+ Most users never set these; the command-line flags feed the four settings below — `--host`, `--port`, and `--trusted-host` come from the invocation, and `--no-open` turns the browser handoff off for that invocation:
42
+
43
+ | Field | Default | Meaning |
44
+ |---|---|---|
45
+ | `openBrowser` | `true` | Open the default browser after startup; SSH launches suppress it |
46
+ | `printUrl` | `true` | Print the `dsh web:` URL line at startup |
47
+ | `surfaceContext` | `true` | Give the agent GUI-orientation context and expose `DSH_WEB_URL` to its shell commands |
48
+ | `trustedHosts` | `[]` | Extra hosts allowed to reach the GUI from the network |
49
+
50
+ The generated [configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-web-app) is the exhaustive source for every accepted field and its JSDoc.
51
+
52
+ ### LAN access and trusted hosts
53
+
54
+ By default the GUI accepts connections from this machine only. A deployment that binds all network interfaces also allows browsers from the LAN, and the printed URL then includes a LAN address; `--trusted-host` adds extra hosts in either case. Host and Origin checks control reachability, while the token exchange authenticates every Host API method and WebSocket stream. The LAN addresses are sampled once at startup, so a network change later is not picked up — restart the GUI to re-advertise.
55
+
56
+ ### Running over SSH
57
+
58
+ When you launch `dsh --profile web` over SSH, the URL line still prints but the browser is not opened for you: the SSH client or editor owns the local forwarding address. Open the forwarded URL on your machine yourself; the printed URL names the remote host's loopback endpoint.
59
+
60
+ ### Per-session agent setup
61
+
62
+ Each browser session composes its own agent from the shipped presets (the `standard` preset by default), instead of sharing one process-wide tool set. You can change the default preset or add your own presets under `$DSH_HOME/.agent-presets`.
63
+
64
+ -----
65
+
66
+ <a id="understand-the-implementation"></a>
67
+ ## Understand the implementation
68
+
69
+ <details>
70
+ <summary>Implementation internals — click to expand</summary>
6
71
 
7
- ## Model retry defaults
72
+ The bundle is one patch plus one runtime glue plugin. The storage stack and projection cache come from `dsh-base`; the web overlay's workspace and message-feedback rows consume that shared `storageDomain` service. The patch restates the surface-specific values the base deliberately omits, inserts the web-only host rows and browser roster, then moves the agent plane behind presets. The glue plugin owns dist serving, trust sampling, prompt sections, the bash variable, and the readiness announcements.
8
73
 
9
- Web uses the shared bounded normal default of five eligible retries after the initial request. The `deepseek-official` route and settings-added pi-ai routes use that default when they omit `retryPolicy`; explicit provider policies still win. Web adds no retry-specific composition override, so the same omission behavior applies to non-Web profiles.
74
+ ### Patch semantics
10
75
 
76
+ A patch replaces the targeted row's whole `config`, so each web row restates every key it owns: the persona, the `DSH_TOOLS_MODE` PTC mode opt-in, and the `session-query-sqlite` values on the base rows, then `insert` adds the web host rows, transport, and browser roster. The per-agent tool rows the base mounts process-wide are disabled here and the preset roster takes over; the reasoning for each host-plane versus preset-plane decision is inline in the patch.
77
+
78
+ ### Readiness
79
+
80
+ The URL line and browser handoff are readiness signals: supervisors RPC as soon as they observe the line, and a browser requests the page as soon as it opens, so both run only after the Loader tree settles and Connection authentication is available — or immediately in a hand-built tree without a Loader. A tree disposed mid-boot announces nothing.
81
+
82
+ ### LAN trust sampling
83
+
84
+ `resolveLanTrust` samples the network once at boot: a loopback bind (`127.0.0.1`) derives no LAN addresses, while an all-interfaces bind adds every non-internal IPv4 literal. The derived literals plus the explicit `--trusted-host` authorities form the `/api` browser-trust fence, and the printed LAN URL always matches that fence.
85
+
86
+ ### Source map
87
+
88
+ | File | Role |
89
+ |---|---|
90
+ | [`src/index.ts`](src/index.ts) | The `web-app` glue plugin: dist resolution, LAN trust sampling, prompt sections, bash variable, URL line, browser handoff |
91
+ | [`src/startup.ts`](src/startup.ts) | The `web-startup` provider: `--host`, `--port`, `--trusted-host`, `--no-open`, `--help` |
92
+ | [`cordis.patch.yml`](cordis.patch.yml) | The web patch: restated base values, web host rows, browser roster, agent plane behind presets |
93
+ | [`src/invariant.ts`](src/invariant.ts) | Invariant companion: no runtime invariant; every contribution is registry-disposed |
94
+ | [`tests/web-app.spec.ts`](tests/web-app.spec.ts) | Dist resolution, fallback seat, prompt sections, readiness |
95
+ | [`tests/startup.spec.ts`](tests/startup.spec.ts) | Command-line parsing over a real Loader tree |
96
+ | [`tests/trusted-hosts.spec.ts`](tests/trusted-hosts.spec.ts) | LAN-trust sampling |
97
+ | [`tests/browser-open.spec.ts`](tests/browser-open.spec.ts) | Default-browser handoff after the page is reachable |
98
+
99
+ ### Invariant ownership
100
+
101
+ The invariant companion registers an empty installer because every contribution — the frontend-static child plugin, the prompt sections, and the bash variable registration — is registry-disposed with the fiber, and each owning registry's package carries that relation's invariant.
102
+
103
+ </details>
104
+
105
+ -----
106
+
107
+ <a id="further-exploration"></a>
108
+ ## Further Exploration
109
+
110
+ Read these pages when you want to go deeper into the shared core, the browser reload pipeline, or the built frontend.
111
+
112
+ - [Bundle package map](../README.md) — the surfaces built on the same core.
113
+ - [dsh-base](../base/README.md) — the shared core the GUI runs on.
114
+ - [dsh-client-hmr](../../client/hmr/README.md) — how client-plugin changes reload during development.
115
+ - [frontend-static](../../host/frontend-static/README.md) — how the built frontend is served.
116
+ - [Generated configuration catalog](../../../docs/config-catalog.md#deepseek-aidsh-web-app) — every accepted config field and its source declaration.
117
+
118
+ -----
119
+
120
+ <a id="model-experience"></a>
11
121
  ## Model Experience
12
122
 
13
123
  ### Harness-source and Web-surface context
14
124
 
15
125
  #### What the model sees
16
126
 
17
- When `surfaceContext` is true, the `harness:source` section identifies the on-disk Harness implementation without claiming it is the working directory, and the `app:web-surface` global section (order −98) orients the model to the GUI: the canonical local URL, the "this page" referent, the update contract (the reload receiver is always on; no-refresh reloads additionally need the `pnpm run dev:web` watcher), and the instruction not to start replacement servers. `DSH_WEB_URL` additionally appears in the managed bash environment with its description, resolved per invocation from the live server. When it is false, neither section nor the variable is registered.
127
+ When `surfaceContext` is true, the `harness:source` section identifies the on-disk Harness implementation without claiming it is the working directory, and the `app:web-surface` global section (first-party order −800) orients the model to the GUI: the canonical local URL, the "this page" referent, the update contract (the reload receiver is always on; no-refresh reloads additionally need the `pnpm run dev:web` watcher), and the instruction not to start replacement servers. `DSH_WEB_URL` additionally appears in the managed bash environment with its description, resolved per invocation from the live server. When it is false, neither section nor the variable is registered.
18
128
 
19
129
  #### Token effect
20
130
 
@@ -26,8 +136,24 @@ The prompt section sits near the system prompt's head and is stable for the life
26
136
 
27
137
  ## Known Limitations and Deferred Work
28
138
 
29
- - **The frontend dist must be built** — `require.resolve` of the dist fails loud at activation with a build hint; there is no source-serving fallback.
30
- - **`lanAddresses` is a boot-time snapshot** — interface changes after boot are not re-advertised; the printed LAN URL always matches the configured trust fence.
31
- - **Only handoff startup is observable** — observation ends when the platform opener accepts spawn, except that Windows waits for its short-lived PowerShell launcher to exit; a later browser exit is not reported, and the printed URL remains the manual fallback.
32
- - **SSH forwarding owns the browser URL** the printed canonical URL names the remote host's loopback endpoint; automatic handoff is suppressed, and the SSH client or editor must expose and open its local forwarded address.
33
- - **Browser command overrides are launch-only** — a discovered `.env` may not set `BROWSER`; only an inherited value may reach an opener path that honors the variable, so a checkout cannot choose an executable for automatic handoff.
139
+ <a id="known-limitations-and-deferred-work"></a>
140
+
141
+
142
+ These limits tell you what to expect in unusual setups a source checkout, SSH sessions, or strict networks. They are current package constraints, not a general browser comparison or a task backlog.
143
+
144
+ - **The frontend must be built** — a source checkout needs `pnpm run build` first; startup stops with a build hint when the dist is missing, and there is no source-serving fallback.
145
+ - **LAN addresses are sampled once at startup** — interface changes after boot are not re-advertised; the printed LAN URL always matches what was sampled.
146
+ - **Only the handoff start is observable** — the GUI reports that the browser was asked to open, not that it actually opened; a later browser exit is never reported, and the printed URL is your manual fallback.
147
+ - **SSH sessions keep the URL but skip the browser handoff** — the printed URL names the remote host's loopback endpoint; the SSH client or editor must expose and open the local forwarded address.
148
+ - **`BROWSER` overrides only come from the environment** — a discovered `.env` cannot set `BROWSER`; only an inherited value can choose the executable for the automatic handoff.
149
+ - **Binding all network interfaces is not supported** — `--host 0.0.0.0` is rejected at startup for safety; use the default loopback host.
150
+
151
+ <a id="dev-note"></a>
152
+ ### Dev Note
153
+
154
+ <details>
155
+ <summary>Working context for maintainers — click to expand</summary>
156
+
157
+ None.
158
+
159
+ </details>
package/README.zh.md CHANGED
@@ -1,20 +1,130 @@
1
- # `@deepseek-ai/dsh-web-app`
1
+ ---
2
+ description: "dsh 的浏览器 GUI:交互式聊天、模型与设置管理、会话历史,供用户运行 dsh web 表层。"
3
+ kind: "package-bundle"
4
+ ---
5
+
6
+ # @deepseek-ai/dsh-web-app
2
7
 
3
8
  [English](README.md) | 中文
4
9
 
5
- dsh 浏览器表层组合包。[`cordis.patch.yml`](cordis.patch.yml) 叠加在 [`dsh-base`](../base/README.zh.md) 之上:设置 coding persona,插入 Web 宿主行(webserver、API 网关、workspace、投影缓存、存储)、浏览器插件名录与始终挂载的客户端插件重载链([`dsh-client-hmr`](../../client/hmr/README.zh.md),在重建 watcher 改写客户端 bundle 之前保持空闲),并挂载本包的 `web-runtime` 粘合插件(配置为 `{openBrowser, printUrl, surfaceContext, trustedHosts}`)。该插件通过 `@deepseek-ai/dsh-web-frontend` 的 exports 解析已构建的前端 dist,只采样一次依赖 bind 的 LAN 信任信息并将其作为 `webRuntime` 提供给浏览器信任栅栏和客户端名录,挂载 [`frontend-static`](../../host/frontend-static/README.zh.md) 回退席位所有者,并在 `surfaceContext` 为 true 时注册 Harness 源码与 Web 表层提示词段落,以及 bash 可见的 `DSH_WEB_URL` 运行时变量。自身 Loader 配置树结算后,它在 `printUrl` 为 true 时打印 `dsh web:` URL 行;`openBrowser` 为 true 且继承的 `SSH_CONNECTION` 与 `SSH_TTY` 均为空或不存在时,才会用默认浏览器打开规范宿主机 URL。SSH 启动仍保留 URL 行,但会跳过浏览器交接,因为本地转发地址由 SSH 客户端或编辑器持有。交接前,运行时会打印英文提示 `dsh web: opening the default browser; pass --no-open to disable`。短生命周期 Node helper 使用规范的脱敏子进程环境运行受维护的平台 opener。在 Windows 上,helper 会保持存活,直至短生命周期的 PowerShell launcher 退出,因为 `open` 会在 launcher 把 URL 交给 shell 之前、仅在 spawn 时返回;其他平台则在 opener 接受 spawn 后结束。helper 失败时会向 stderr 写入包含原因和手动访问 URL 的诊断,不会停止服务器,且任何路径都不会等待浏览器退出。本组合包还持有应用命令行:普通 `web-startup` 提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.zh.md)),解析 `--host`、`--port`、可重复的 `--trusted-host`、`--no-open` 以及应用自己的 `--help`,再提供 `webStartup`;本机启动默认会打开浏览器,`--no-open` 则只对本次调用关闭该行为。它会在发布该服务前拒绝 `--host 0.0.0.0`,因为 CLI 目前有意不支持绑定所有网络接口。由 flag 配置的行会注入该服务,并在惰性配置中直接读取它,因此参数解析完成前不会有任何东西绑定端口,`dsh --profile web --help` 也不会启动服务器。[`dsh-headless`](../headless/README.zh.md) 是同一 base 之上的同级表层,不挂载本组合包。
10
+ ## 概述
11
+
12
+ 运行 `dsh --profile web`,界面会在你的默认浏览器中打开,即可与 agent(智能体)交互式聊天。你会获得会话视图、模型与设置管理以及会话历史,背后与其他表层相同的模型访问、工具与安全默认值。该命令会打印带 token 的启动 URL;浏览器用该 token 换取签名会话 cookie,再重定向到干净的根 URL。你可以从命令行更改端口、关闭浏览器交接并允许额外主机;有意不支持绑定所有网络接口。需要浏览器中的交互式工作时选择它;`dsh-headless` 是一次性的命令行兄弟表层。
13
+
14
+ ## 目录
15
+
16
+ - [使用本包](#use-this-package)
17
+ - [理解实现](#understand-the-implementation)
18
+ - [进一步探索](#further-exploration)
19
+ - [模型体验](#model-experience)
20
+ - [已知限制与延期工作](#known-limitations-and-deferred-work)
21
+ - [开发备注](#dev-note)
22
+
23
+ -----
24
+
25
+ <a id="use-this-package"></a>
26
+ ## 使用本包
27
+
28
+ 启动 GUI、打开浏览器,然后开始与 agent(智能体)对话。flag 用于微调本次调用。
29
+
30
+ ### 启动 Web GUI
31
+
32
+ ```sh
33
+ dsh --profile web
34
+ dsh --profile web --no-open --port 8080
35
+ ```
36
+
37
+ 启动后你会看到 `dsh web:` 行,其根 URL 携带新的进程 token。除非 `--no-open` 或 SSH 会话抑制,否则默认浏览器会打开该 URL、取得签名 cookie,再重定向到干净的根页面。页面加载且你可以与 agent(智能体)对话,就说明成功了。两种可预期的失败:前端未构建时,启动会以构建提示停止(checkout 中运行 `pnpm run build`);浏览器无法打开时,stderr 会打印不含凭据的诊断,但服务器会继续运行——请自行打开已打印的启动 URL。
38
+
39
+ ### 配置
40
+
41
+ 大多数用户不需要设置这些;命令行 flag 会提供给下面四个设置——`--host`、`--port` 与 `--trusted-host` 来自本次调用,`--no-open` 仅对本次调用关闭浏览器交接:
42
+
43
+ | 字段 | 默认值 | 含义 |
44
+ |---|---|---|
45
+ | `openBrowser` | `true` | 启动后用默认浏览器打开;SSH 启动会抑制它 |
46
+ | `printUrl` | `true` | 启动时打印 `dsh web:` URL 行 |
47
+ | `surfaceContext` | `true` | 给 agent(智能体)提供 GUI 定位上下文,并把 `DSH_WEB_URL` 暴露给其 shell 命令 |
48
+ | `trustedHosts` | `[]` | 允许从网络访问 GUI 的额外主机 |
49
+
50
+ 生成的[配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-web-app)是每个受支持字段及其 JSDoc 的穷尽式真源。
51
+
52
+ ### LAN 访问与可信主机
53
+
54
+ 默认情况下 GUI 只接受本机的连接。绑定所有网络接口的部署也会允许 LAN 内的浏览器访问,此时打印的 URL 会附带一个 LAN 地址;`--trusted-host` 在两种情况下都能添加额外主机。Host 与 Origin 检查控制可达性,token 交换则认证每个 Host API 方法与 WebSocket stream。LAN 地址只在启动时采样一次,因此之后的网络变化不会被感知——重启 GUI 以重新公告。
55
+
56
+ ### 通过 SSH 运行
57
+
58
+ 通过 SSH 启动 `dsh --profile web` 时,URL 行仍会打印,但不会为你打开浏览器:本地转发地址由 SSH 客户端或编辑器持有。请在自己的机器上打开转发后的 URL;打印出的 URL 指向远端宿主机 loopback 端点。
59
+
60
+ ### 按会话的 agent 设置
61
+
62
+ 每个浏览器会话都从随发行版交付的 preset(默认 `standard`)组合自己的 agent(智能体),而不是共享一套进程级工具集。你可以更改默认 preset,或在 `$DSH_HOME/.agent-presets` 下添加自己的 preset。
63
+
64
+ -----
65
+
66
+ <a id="understand-the-implementation"></a>
67
+ ## 理解实现
68
+
69
+ <details>
70
+ <summary>实现细节——点击展开</summary>
6
71
 
7
- ## 模型重试默认值
72
+ 本组合包是一份 patch 加一个运行时粘合插件。patch 重述 base 刻意省略的表层专属值,插入仅 Web 使用的宿主行与浏览器名录,然后把 agent 层移到 preset 之后;粘合插件负责 dist 服务、信任采样、提示词段落、bash 变量与就绪宣告。
8
73
 
9
- Web 使用共享的有界 normal 默认值,在首次请求后最多再重试五次符合条件的失败。`deepseek-official` 与由 settings 新增的 pi-ai 路由在省略 `retryPolicy` 时使用该默认值;显式提供方策略仍然优先。Web 不再增加重试专用的组合覆盖,因此非 Web profile 的省略行为与之相同。
74
+ ### patch 语义
10
75
 
76
+ patch 会替换目标行的整个 `config`,因此每个 Web 行都重述自己拥有的每个键:基础行上的 persona、`DSH_TOOLS_MODE` PTC mode 开关与 `session-query-sqlite` 值,随后 `insert` 添加 Web 宿主行、传输层与浏览器名录。base 以进程级挂载的按 agent 工具行在这里被禁用,由 preset 名录接管;每项宿主层与 preset 层归属决策的理由以行内注释写在 patch 里。
77
+
78
+ ### 就绪宣告
79
+
80
+ URL 行与浏览器交接都是就绪信号:监督方一观察到该行就发起 RPC,浏览器一打开就请求页面,因此两者只在 Loader 配置树结算且 Connection 认证可用后运行——在没有 Loader 的手工构建树中则立即运行。启动中途被释放的树不会宣告任何内容。
81
+
82
+ ### LAN 信任采样
83
+
84
+ `resolveLanTrust` 在启动时只采样一次网络:loopback 绑定(`127.0.0.1`)不派生任何 LAN 地址,绑定所有网卡则会加入每个非 internal IPv4 字面量。派生字面量加上显式的 `--trusted-host` 权威标识组成 `/api` 浏览器信任栅栏,打印的 LAN URL 始终与该栅栏一致。
85
+
86
+ ### 源码地图
87
+
88
+ | 文件 | 职责 |
89
+ |---|---|
90
+ | [`src/index.ts`](src/index.ts) | `web-app` 粘合插件:dist 解析、LAN 信任采样、提示词段落、bash 变量、URL 行、浏览器交接 |
91
+ | [`src/startup.ts`](src/startup.ts) | `web-startup` 提供方:`--host`、`--port`、`--trusted-host`、`--no-open`、`--help` |
92
+ | [`cordis.patch.yml`](cordis.patch.yml) | Web patch:重述的基础值、Web 宿主行、浏览器名录、preset 之后的 agent 层 |
93
+ | [`src/invariant.ts`](src/invariant.ts) | 不变式伴生插件:无运行时不变式;每项贡献都由 registry 释放 |
94
+ | [`tests/web-app.spec.ts`](tests/web-app.spec.ts) | dist 解析、fallback 席位、提示词段落、就绪宣告 |
95
+ | [`tests/startup.spec.ts`](tests/startup.spec.ts) | 在真实 Loader 树上的命令行解析 |
96
+ | [`tests/trusted-hosts.spec.ts`](tests/trusted-hosts.spec.ts) | LAN 信任采样 |
97
+ | [`tests/browser-open.spec.ts`](tests/browser-open.spec.ts) | 页面可达后的默认浏览器交接 |
98
+
99
+ ### 不变式归属
100
+
101
+ 不变式伴生插件注册一个空安装器,因为每项贡献——frontend-static 子插件、提示词段落与 bash 变量注册——都会随 fiber 由 registry 释放,且每个所属 registry 的包负责该关系的不变式。
102
+
103
+ </details>
104
+
105
+ -----
106
+
107
+ <a id="further-exploration"></a>
108
+ ## 进一步探索
109
+
110
+ 当你想深入了解共享核心、浏览器重载流水线或已构建的前端时,阅读以下页面。
111
+
112
+ - [组合包包映射](../README.zh.md)——基于同一核心构建的表层。
113
+ - [dsh-base](../base/README.zh.md)——GUI 运行其上的共享核心。
114
+ - [dsh-client-hmr](../../client/hmr/README.zh.md)——开发期间客户端插件变更如何重载。
115
+ - [frontend-static](../../host/frontend-static/README.zh.md)——已构建的前端如何被服务。
116
+ - [生成配置目录](../../../docs/config-catalog.zh.md#deepseek-aidsh-web-app)——每个受支持配置字段及其源声明。
117
+
118
+ -----
119
+
120
+ <a id="model-experience"></a>
11
121
  ## 模型体验
12
122
 
13
123
  ### Harness 源码与 Web 表层上下文
14
124
 
15
- #### 模型看到的内容
125
+ #### 模型看到什么
16
126
 
17
- 当 `surfaceContext` 为 true 时,`harness:source` 段落标明磁盘上的 Harness 实现,但不会声称它就是工作目录;全局段落 `app:web-surface`(顺序98)则向模型说明 GUI:规范的本地 URL、「this page」指代什么、更新约定(重载接收端始终开启;无刷新重载还需要 `pnpm run dev:web` watcher),以及不要启动替代服务器的指令。`DSH_WEB_URL` 还会连同描述出现在受管 bash 环境中,每次调用时从运行中的服务器解析。当它为 false 时,这两个段落和该变量都不会注册。
127
+ 当 `surfaceContext` 为 true 时,`harness:source` 段落标明磁盘上的 Harness 实现,但不会声称它就是工作目录;全局段落 `app:web-surface`(first-party 顺序 800)则向模型说明 GUI:规范的本地 URL、「this page」指代什么、更新约定(重载接收端始终开启;无刷新重载还需要 `pnpm run dev:web` watcher),以及不要启动替代服务器的指令。`DSH_WEB_URL` 还会连同描述出现在受管 bash 环境中,每次调用时从运行中的服务器解析。当它为 false 时,这两个段落和该变量都不会注册。
18
128
 
19
129
  #### Token 影响
20
130
 
@@ -26,8 +136,24 @@ Web 使用共享的有界 normal 默认值,在首次请求后最多再重试
26
136
 
27
137
  ## 已知限制与延期工作
28
138
 
29
- - **前端 dist 必须已构建**:对 dist 的 `require.resolve` 在激活时明确报错并给出构建提示;没有从源码直接服务的回退路径。
30
- - **`lanAddresses` 是启动期快照**:启动后的网卡变化不会重新公告;打印的 LAN URL 始终与配置的信任栅栏一致。
31
- - **只观测交接启动**:平台 opener 接受 spawn 后即结束观察,但 Windows 会等待其短生命周期 PowerShell launcher 退出;之后的浏览器退出不会上报,已打印 URL 仍是手动访问的回退路径。
32
- - **SSH 转发持有浏览器 URL**:打印出的规范 URL 指向远端宿主机 loopback 端点;自动交接会被跳过,SSH 客户端或编辑器必须暴露并打开其本地转发地址。
33
- - **浏览器命令覆盖只能来自启动环境**:被发现的 `.env` 不得设置 `BROWSER`;只有继承值可以抵达会读取该变量的 opener 路径,避免 checkout 为自动交接选择可执行文件。
139
+ <a id="known-limitations-and-deferred-work"></a>
140
+
141
+
142
+ 这些限制告诉你在不常见的环境下会遇到什么——源码 checkout、SSH 会话或严格网络。它们是当前包约束,不是通用的浏览器对比或任务积压。
143
+
144
+ - **前端必须已构建**——源码 checkout 需要先运行 `pnpm run build`;dist 缺失时启动会以构建提示停止,且没有从源码直接服务的回退路径。
145
+ - **LAN 地址只在启动时采样一次**——启动后的网卡变化不会重新公告;打印的 LAN URL 始终与采样结果一致。
146
+ - **只能观察到交接的启动**——GUI 只报告浏览器被请求打开,而不是它确实打开了;之后的浏览器退出永远不会上报,打印的 URL 是你的手动回退路径。
147
+ - **SSH 会话保留 URL 但跳过浏览器交接**——打印的 URL 指向远端宿主机 loopback 端点;SSH 客户端或编辑器必须暴露并打开本地转发地址。
148
+ - **`BROWSER` 覆盖只能来自环境**——被发现的 `.env` 不能设置 `BROWSER`;只有继承值能为自动交接选择可执行文件。
149
+ - **不支持绑定所有网络接口**——出于安全考虑,`--host 0.0.0.0` 会在启动时被拒绝;请使用默认 loopback 主机。
150
+
151
+ <a id="dev-note"></a>
152
+ ### 开发备注
153
+
154
+ <details>
155
+ <summary>维护者的工作上下文——点击展开</summary>
156
+
157
+ 无。
158
+
159
+ </details>
package/cordis.patch.yml CHANGED
@@ -18,10 +18,6 @@
18
18
  persona: >-
19
19
  You are a coding agent powered by the {{model}} model. Your working directory is {{cwd}}.
20
20
 
21
- # TODO: Re-enable shared HMR for Web after its reload lifecycle is tested.
22
- - id: hmr
23
- disabled: true
24
-
25
21
  # Full-text session search is opt-in (the base row's `openAt: never`). This
26
22
  # restatement keeps the Web values on one ephemeral in-memory index; a
27
23
  # deployment enabling content search overrides `openAt` to `first-search` in a
@@ -34,8 +30,8 @@
34
30
 
35
31
  - id: tools
36
32
  config:
37
- # TEMPORARY workaround: DSH_TOOLS_MODE (native|code|both) opts a whole dsh
38
- # process into Code Mode while per-session tool-presentation selection is being
33
+ # TEMPORARY workaround: DSH_TOOLS_MODE (native|ptc|both) opts a whole dsh
34
+ # process into PTC mode while per-session tool-presentation selection is being
39
35
  # designed; unset keeps the schema default (native). Remove the env seam
40
36
  # once the web UI owns the choice per session.
41
37
  mode: !!js process.env.DSH_TOOLS_MODE
@@ -45,22 +41,14 @@
45
41
  # `dsh.client` rows are the browser roster the modules node half scans into
46
42
  # window.__DSH_BOOT__; the modules row is simultaneously a host row.
47
43
  - insert:
44
+ # Host-owned opt-in sampled when a new Web session receives its preset
45
+ # delegation tools. The Plugins page edits this settings namespace.
46
+ - id: subagent-model-selection-settings
47
+ name: '@deepseek-ai/dsh-tool-subagent/model-selection-settings'
48
+
48
49
  - id: code-runtime
49
50
  name: '@deepseek-ai/dsh-code-runtime-worker-thread'
50
51
 
51
- - id: storage
52
- name: '@deepseek-ai/dsh-storage'
53
-
54
- - id: storage-json
55
- name: '@deepseek-ai/dsh-storage-json'
56
- config:
57
- root: !!js dshHomePath('storages')
58
-
59
- - id: storage-domain
60
- name: '@deepseek-ai/dsh-storage-domain'
61
- config:
62
- backend: json
63
-
64
52
  - id: message-feedback
65
53
  name: '@deepseek-ai/dsh-message-feedback'
66
54
  config:
@@ -73,12 +61,6 @@
73
61
  - id: workspace
74
62
  name: '@deepseek-ai/dsh-workspace'
75
63
 
76
- - id: session-projection-cache
77
- name: '@deepseek-ai/dsh-session-projection-cache'
78
- config:
79
- writeEveryEvents: 200
80
- writeIntervalMs: 5000
81
-
82
64
  - id: session-reference
83
65
  name: '@deepseek-ai/dsh-session-reference'
84
66
 
@@ -100,10 +82,18 @@
100
82
  - id: plugin-inventory
101
83
  name: '@deepseek-ai/dsh-host-plugin-inventory'
102
84
 
103
- # The API gateway: the transport-agnostic dispatch face every client shape
104
- # shares. The base layer's agent-default-model service owns the default model.
105
- - id: api-gateway
106
- name: '@deepseek-ai/dsh-host-apiproxy'
85
+ # Session commands, cold reads, and live control over Typert Remote.
86
+ - id: session-controller
87
+ name: '@deepseek-ai/dsh-api-session-controller'
88
+
89
+ # Configuration-surface reads and writes over Typert Remote. Each method
90
+ # reports an actionable error when its settings-domain provider is absent.
91
+ - id: settings-controller
92
+ name: '@deepseek-ai/dsh-api-settings-controller'
93
+
94
+ # Workspace commands and reconnect-safe projection over Typert Remote.
95
+ - id: workspace-controller
96
+ name: '@deepseek-ai/dsh-api-workspace-controller'
107
97
 
108
98
  - id: cordis-host-runner
109
99
  name: '@deepseek-ai/dsh-cordis-host-runner'
@@ -124,6 +114,9 @@
124
114
  config:
125
115
  host: !!js ctx.webStartup.host ?? '127.0.0.1'
126
116
  port: !!js ctx.webStartup.port ?? 3080
117
+ compression: gzip
118
+ compressionLevel: 1
119
+ compressionThresholdBytes: 1024
127
120
 
128
121
  # Web glue owned by this bundle: resolves the built frontend dist (an
129
122
  # assembly fact of dsh-web-app, never user config), mounts the
@@ -173,9 +166,6 @@
173
166
  - id: api-remotes
174
167
  name: '@deepseek-ai/dsh-api-remotes'
175
168
 
176
- - id: client-runtime
177
- name: '@deepseek-ai/dsh-client-runtime'
178
-
179
169
  - id: cordis-client-runner
180
170
  name: '@deepseek-ai/dsh-cordis-client-runner'
181
171
 
@@ -191,6 +181,9 @@
191
181
  - id: ui-renderer
192
182
  name: '@deepseek-ai/dsh-client-ui-renderer'
193
183
 
184
+ - id: ui-session
185
+ name: '@deepseek-ai/dsh-client-ui-session'
186
+
194
187
  - id: ui-sidebar
195
188
  name: '@deepseek-ai/dsh-client-ui-sidebar'
196
189
 
@@ -209,6 +202,12 @@
209
202
  - id: ui-conversation
210
203
  name: '@deepseek-ai/dsh-client-ui-conversation'
211
204
 
205
+ - id: ui-approval
206
+ name: '@deepseek-ai/dsh-client-ui-approval'
207
+
208
+ - id: ui-chat
209
+ name: '@deepseek-ai/dsh-client-ui-chat'
210
+
212
211
  # Official occupants for the generic sidebar and conversation brand slots.
213
212
  - id: ui-brand-official
214
213
  name: '@deepseek-ai/dsh-client-ui-brand-official'
@@ -254,6 +253,13 @@
254
253
  - id: ui-reference
255
254
  name: '@deepseek-ai/dsh-client-ui-reference'
256
255
 
256
+ # Read-only active Schedule catalog. The shipped Web graph resolves the
257
+ # client package but leaves it disabled; the explicit Schedule overlay
258
+ # enables this same row together with the host Schedule services.
259
+ - id: ui-schedule
260
+ name: '@deepseek-ai/dsh-client-ui-schedule'
261
+ disabled: true
262
+
257
263
  # Background jobs: the session-header list over the jobsBySession mirror.
258
264
  - id: ui-jobs
259
265
  name: '@deepseek-ai/dsh-client-ui-jobs'
@@ -354,14 +360,11 @@
354
360
  - id: tool-skill
355
361
  disabled: true
356
362
 
357
- # The goal SERVICE, its session driver, and the `/goal` command STAY on the
358
- # host plane; only the model-facing tool moves. The Gateway serves the goal
359
- # domain as Remote endpoints, and a Remote method picks its receiver Service
360
- # from a generated descriptor — it resolves `goals` on the host, so a
361
- # per-session realm would answer `service-unavailable` for every browser call.
362
- # That is the `shell-env` criterion read from the other side: injection is not
363
- # the only host relationship a Service can have. The registry is keyed by
364
- # session, so one host instance serves every session exactly as before presets.
363
+ # The goal service and session driver stay on the host plane, where Gateway
364
+ # remotes resolve them. Presets own the human command and model-facing tool.
365
+
366
+ - id: command-goal
367
+ disabled: true
365
368
 
366
369
  - id: tool-goal
367
370
  disabled: true
@@ -428,16 +431,13 @@
428
431
  - id: tool-web
429
432
  disabled: true
430
433
 
431
- # The preset roster. `config/agent-presets/` ships with the deployment and is
432
- # read-only (its entries carry `system` trust); `$DSH_HOME/.agent-presets` is
433
- # where a person — or an agent — authors their own, and carries the same trust
434
- # as shell access because a preset IS a composition.
435
- #
436
- # Only the SHIPPED root is an assembly fact: it sits beside the installed app's
437
- # own config, so `apps/cli`'s `composeProfile` resolves and patches it in — the
438
- # same treatment `distIndex` gets on the webserver row. The writable root is
439
- # `dsh-agent-presets`' own default (`includeUserRoot`), so a composition that
440
- # never reaches that patch still finds a person's presets.
434
+ # The preset roster. The shipped presets are bundled inside
435
+ # `dsh-agent-presets` itself and prepended as a read-only `system` root
436
+ # (`includeShippedRoot`); `$DSH_HOME/.agent-presets` is where a person — or an
437
+ # agent authors their own, appended by the same package (`includeUserRoot`),
438
+ # and carries the same trust as shell access because a preset IS a
439
+ # composition. This row only names the default and any deployment-added
440
+ # `roots`; no launcher patching is involved.
441
441
  - insert:
442
442
  - id: agent-presets
443
443
  name: '@deepseek-ai/dsh-agent-presets'
package/lib/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { spawn } from "node:child_process";
3
+ import { dirname, join } from "node:path";
3
4
  import { networkInterfaces } from "node:os";
4
5
  import { fileURLToPath } from "node:url";
5
6
  import z from "@deepseek-ai/schemastery";
@@ -15,15 +16,16 @@ import { scrubbedParentEnv } from "@deepseek-ai/dsh-subprocess";
15
16
  * the built frontend dist (workspace knowledge of this bundle, never user
16
17
  * config), mounts the `frontend-static` fallback owner over it, registers the
17
18
  * harness-source and web-surface prompt sections, the bash-visible web runtime
18
- * variable, the URL line, and the default-browser handoff. App command-line
19
- * values arrive through the `webStartup` service expressions in the bundle
20
- * patch.
19
+ * variable, the process-token URL line, and the default-browser handoff. The
20
+ * model and shell retain the clean URL. App command-line values arrive through
21
+ * the `webStartup` service expressions in the bundle patch.
21
22
  * @module @deepseek-ai/dsh-web-app
22
23
  */
23
24
  /** Stable Cordis plugin name. */
24
25
  const name = "web-app";
25
26
  /** This dsh installation's root, from either this package's source or built entry. */
26
27
  const SOURCE_ROOT = fileURLToPath(new URL("../../../..", import.meta.url));
28
+ const ANNOUNCED_ROOTS = /* @__PURE__ */ new WeakSet();
27
29
  /** Runtime service that releases Web rows after bind-dependent values resolve. */
28
30
  const WEB_RUNTIME_SERVICE = "webRuntime";
29
31
  /** Services required before the web runtime can mount. */
@@ -103,14 +105,20 @@ function localWebUrl(ctx) {
103
105
  if (port === void 0) throw new Error("web-app: webServer service missing while resolving Web runtime");
104
106
  return `http://${LOOPBACK_HOST}:${String(port)}`;
105
107
  }
106
- /** Dist location is workspace knowledge of this bundle: resolved through the frontend package exports, not configured. */
108
+ /**
109
+ * Dist location is workspace knowledge of this bundle: anchored on the
110
+ * frontend package manifest, not configured. Existence is a request-time
111
+ * concern — the fallback owner reads files per request, so a composition
112
+ * whose page never reaches the fallback seat (the static worker preview
113
+ * ships its own page and carries no dist) boots without one.
114
+ */
107
115
  function resolveDistIndex() {
108
116
  const require = createRequire(import.meta.url);
109
117
  try {
110
- return require.resolve("@deepseek-ai/dsh-web-frontend/dist/index.html");
118
+ return join(dirname(require.resolve("@deepseek-ai/dsh-web-frontend/package.json")), "dist", "index.html");
111
119
  } catch {
112
- /* v8 ignore next 2 -- reachable only on a checkout without a built dist; the test tree builds it */
113
- throw new Error("web-app: frontend dist not built; run pnpm run build from the repository root first");
120
+ /* v8 ignore next 2 -- reachable only when the frontend package is absent from the checkout */
121
+ throw new Error("web-app: @deepseek-ai/dsh-web-frontend is not resolvable from this composition");
114
122
  }
115
123
  }
116
124
  /** Start the maintained platform opener without forwarding Harness credentials. */
@@ -179,7 +187,7 @@ function apply(ctx, config) {
179
187
  addHarnessSourceSection(promptCtx, SOURCE_ROOT);
180
188
  promptCtx.systemPrompt.section({
181
189
  name: "app:web-surface",
182
- order: -98,
190
+ order: promptCtx.systemPrompt.getSectionOrder("WEB_SURFACE"),
183
191
  text: () => webSurfacePrompt(localWebUrl(promptCtx))
184
192
  });
185
193
  });
@@ -191,26 +199,30 @@ function apply(ctx, config) {
191
199
  });
192
200
  });
193
201
  }
194
- if (config.printUrl || handoffBrowser) {
202
+ if (config.printUrl || handoffBrowser) ctx.inject(["connection"], (connectionCtx) => {
195
203
  const announceReady = () => {
196
- const webUrl = localWebUrl(ctx);
204
+ if (ANNOUNCED_ROOTS.has(connectionCtx.root)) return;
205
+ const webUrl = localWebUrl(connectionCtx);
206
+ const authenticatedUrl = connectionCtx.connection.authenticatedUrl(webUrl);
197
207
  const lanCandidate = runtime.lanAddresses[0];
198
- const port = ctx.webServer.port;
199
- if (config.printUrl) console.log(`dsh web: ${webUrl}${lanCandidate === void 0 ? "" : ` (LAN: http://${lanCandidate}:${String(port)})`}`);
208
+ const port = connectionCtx.webServer.port;
209
+ const lanUrl = lanCandidate === void 0 ? void 0 : connectionCtx.connection.authenticatedUrl(`http://${lanCandidate}:${String(port)}`);
210
+ ANNOUNCED_ROOTS.add(connectionCtx.root);
211
+ if (config.printUrl) console.log(`dsh web: ${authenticatedUrl}${lanUrl === void 0 ? "" : ` (LAN: ${lanUrl})`}`);
200
212
  if (handoffBrowser) {
201
213
  console.log("dsh web: opening the default browser; pass --no-open to disable");
202
- internals.openBrowser(webUrl).catch((error) => {
214
+ internals.openBrowser(authenticatedUrl).catch((error) => {
203
215
  const reason = error instanceof Error ? error.message : String(error);
204
- console.error(`web-app: could not open the default browser because ${reason}; visit ${webUrl} manually`);
216
+ console.error(`web-app: could not open the default browser because ${reason}; use the dsh web URL printed at startup`);
205
217
  });
206
218
  }
207
219
  };
208
- const settled = ctx.get("loader")?.await();
220
+ const settled = connectionCtx.get("loader")?.await();
209
221
  if (settled === void 0) announceReady();
210
222
  else settled.then(() => {
211
- if (ctx.get("webServer") !== void 0) announceReady();
223
+ if (connectionCtx.get("webServer") !== void 0 && connectionCtx.get("connection") !== void 0) announceReady();
212
224
  }, () => {});
213
- }
225
+ });
214
226
  }
215
227
  //#endregion
216
228
  export { Config, apply, inject, internals, name, resolveLanTrust };
@@ -5,9 +5,9 @@
5
5
  * the built frontend dist (workspace knowledge of this bundle, never user
6
6
  * config), mounts the `frontend-static` fallback owner over it, registers the
7
7
  * harness-source and web-surface prompt sections, the bash-visible web runtime
8
- * variable, the URL line, and the default-browser handoff. App command-line
9
- * values arrive through the `webStartup` service expressions in the bundle
10
- * patch.
8
+ * variable, the process-token URL line, and the default-browser handoff. The
9
+ * model and shell retain the clean URL. App command-line values arrive through
10
+ * the `webStartup` service expressions in the bundle patch.
11
11
  * @module @deepseek-ai/dsh-web-app
12
12
  */
13
13
  import type { Context } from '@deepseek-ai/cordis';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-web-app",
3
3
  "description": "The dsh browser-surface bundle: the web patch layer over dsh-base plus the runtime glue plugin (frontend dist serving, web-surface prompt, bash runtime variables, URL line)",
4
- "version": "0.1.1-rc.2",
4
+ "version": "0.1.2-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -46,86 +46,88 @@
46
46
  "dependencies": {
47
47
  "commander": "^15.0.0",
48
48
  "open": "^11.0.0",
49
- "@deepseek-ai/dsh-agent-presets": "^0.1.1-rc.2",
50
- "@deepseek-ai/dsh-api-remotes": "^0.1.1-rc.2",
51
- "@deepseek-ai/dsh-app-boot": "^0.1.1-rc.2",
52
- "@deepseek-ai/dsh-client-connection": "^0.1.1-rc.2",
53
- "@deepseek-ai/dsh-client-hmr": "^0.1.1-rc.2",
54
- "@deepseek-ai/dsh-client-locale": "^0.1.1-rc.2",
55
- "@deepseek-ai/dsh-client-ui-renderer": "^0.1.1-rc.2",
56
- "@deepseek-ai/dsh-client-runtime": "^0.1.1-rc.2",
57
- "@deepseek-ai/dsh-client-ui-agent-preset": "^0.1.1-rc.2",
58
- "@deepseek-ai/dsh-client-ui-attachment": "^0.1.1-rc.2",
59
- "@deepseek-ai/dsh-client-ui-brand-official": "^0.1.1-rc.2",
60
- "@deepseek-ai/dsh-client-ui-commands": "^0.1.1-rc.2",
61
- "@deepseek-ai/dsh-client-ui-conversation": "^0.1.1-rc.2",
62
- "@deepseek-ai/dsh-client-ui-cordis": "^0.1.1-rc.2",
63
- "@deepseek-ai/dsh-client-ui-deliverables": "^0.1.1-rc.2",
64
- "@deepseek-ai/dsh-client-ui-directory-picker-browse": "^0.1.1-rc.2",
65
- "@deepseek-ai/dsh-client-ui-directory-picker-native": "^0.1.1-rc.2",
66
- "@deepseek-ai/dsh-client-ui-message-feedback": "^0.1.1-rc.2",
67
- "@deepseek-ai/dsh-client-ui-goal": "^0.1.1-rc.2",
68
- "@deepseek-ai/dsh-client-ui-layout": "^0.1.1-rc.2",
69
- "@deepseek-ai/dsh-client-ui-model-selection": "^0.1.1-rc.2",
70
- "@deepseek-ai/dsh-client-modules": "^0.1.1-rc.2",
71
- "@deepseek-ai/dsh-client-ui-settings-plugin-inventory": "^0.1.1-rc.2",
72
- "@deepseek-ai/dsh-client-ui-permission-presets": "^0.1.1-rc.2",
73
- "@deepseek-ai/dsh-client-ui-plan": "^0.1.1-rc.2",
74
- "@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.1-rc.2",
75
- "@deepseek-ai/dsh-client-ui-user-questions": "^0.1.1-rc.2",
76
- "@deepseek-ai/dsh-client-ui-settings": "^0.1.1-rc.2",
77
- "@deepseek-ai/dsh-client-ui-settings-general": "^0.1.1-rc.2",
78
- "@deepseek-ai/dsh-client-ui-sidebar": "^0.1.1-rc.2",
79
- "@deepseek-ai/dsh-client-ui-skill": "^0.1.1-rc.2",
80
- "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.1-rc.2",
81
- "@deepseek-ai/dsh-client-ui-reference": "^0.1.1-rc.2",
82
- "@deepseek-ai/dsh-client-ui-subagent": "^0.1.1-rc.2",
83
- "@deepseek-ai/dsh-client-ui-jobs": "^0.1.1-rc.2",
84
- "@deepseek-ai/dsh-client-ui-theme": "^0.1.1-rc.2",
85
- "@deepseek-ai/dsh-client-ui-tool": "^0.1.1-rc.2",
86
- "@deepseek-ai/dsh-client-ui-workflow-run": "^0.1.1-rc.2",
87
- "@deepseek-ai/dsh-client-ui-trajectory": "^0.1.1-rc.2",
88
- "@deepseek-ai/dsh-client-ui-workspace": "^0.1.1-rc.2",
89
- "@deepseek-ai/dsh-cmdline": "^0.1.1-rc.2",
90
- "@deepseek-ai/dsh-cordis-client-runner": "^0.1.1-rc.2",
91
- "@deepseek-ai/dsh-cordis-host-runner": "^0.1.1-rc.2",
92
- "@deepseek-ai/dsh-web-frontend": "^0.1.1-rc.2",
93
- "@deepseek-ai/dsh-client-ui-settings-models": "^0.1.1-rc.2",
94
- "@deepseek-ai/dsh-host-frontend-static": "^0.1.1-rc.2",
95
- "@deepseek-ai/dsh-host-apiproxy": "^0.1.1-rc.2",
96
- "@deepseek-ai/dsh-host-directory-picker-browse": "^0.1.1-rc.2",
97
- "@deepseek-ai/dsh-code-runtime-worker-thread": "^0.1.1-rc.2",
98
- "@deepseek-ai/dsh-host-directory-picker-native": "^0.1.1-rc.2",
99
- "@deepseek-ai/dsh-host-plugin-inventory": "^0.1.1-rc.2",
100
- "@deepseek-ai/dsh-host-webserver": "^0.1.1-rc.2",
101
- "@deepseek-ai/dsh-file-reference": "^0.1.1-rc.2",
102
- "@deepseek-ai/dsh-file-reference-local": "^0.1.1-rc.2",
103
- "@deepseek-ai/dsh-launch-environment": "^0.1.1-rc.2",
104
- "@deepseek-ai/dsh-message-feedback": "^0.1.1-rc.2",
105
- "@deepseek-ai/dsh-session-reference": "^0.1.1-rc.2",
106
- "@deepseek-ai/dsh-session-log-export": "^0.1.1-rc.2",
107
- "@deepseek-ai/dsh-session-stats": "^0.1.1-rc.2",
108
- "@deepseek-ai/dsh-storage": "^0.1.1-rc.2",
109
- "@deepseek-ai/dsh-storage-domain": "^0.1.1-rc.2",
110
- "@deepseek-ai/dsh-storage-json": "^0.1.1-rc.2",
111
- "@deepseek-ai/dsh-session-projection-cache": "^0.1.1-rc.2",
112
- "@deepseek-ai/dsh-subprocess": "^0.1.1-rc.2",
113
- "@deepseek-ai/dsh-workspace": "^0.1.1-rc.2",
114
- "@deepseek-ai/dsh-host-directory-picker-auto": "^0.1.1-rc.2",
115
- "@deepseek-ai/schemastery": "^3.18.1"
49
+ "@deepseek-ai/dsh-agent-presets": "^0.1.2-alpha.2",
50
+ "@deepseek-ai/dsh-client-hmr": "^0.1.2-alpha.2",
51
+ "@deepseek-ai/dsh-client-locale": "^0.1.2-alpha.2",
52
+ "@deepseek-ai/dsh-client-modules": "^0.1.2-alpha.2",
53
+ "@deepseek-ai/dsh-client-ui-renderer": "^0.1.2-alpha.2",
54
+ "@deepseek-ai/dsh-client-connection": "^0.1.2-alpha.2",
55
+ "@deepseek-ai/dsh-client-ui-attachment": "^0.1.2-alpha.2",
56
+ "@deepseek-ai/dsh-client-ui-agent-preset": "^0.1.2-alpha.2",
57
+ "@deepseek-ai/dsh-client-ui-approval": "^0.1.2-alpha.2",
58
+ "@deepseek-ai/dsh-client-ui-chat": "^0.1.2-alpha.2",
59
+ "@deepseek-ai/dsh-client-ui-brand-official": "^0.1.2-alpha.2",
60
+ "@deepseek-ai/dsh-client-ui-commands": "^0.1.2-alpha.2",
61
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.1.2-alpha.2",
62
+ "@deepseek-ai/dsh-client-ui-cordis": "^0.1.2-alpha.2",
63
+ "@deepseek-ai/dsh-client-ui-deliverables": "^0.1.2-alpha.2",
64
+ "@deepseek-ai/dsh-client-ui-directory-picker-native": "^0.1.2-alpha.2",
65
+ "@deepseek-ai/dsh-client-ui-directory-picker-browse": "^0.1.2-alpha.2",
66
+ "@deepseek-ai/dsh-client-ui-message-feedback": "^0.1.2-alpha.2",
67
+ "@deepseek-ai/dsh-client-ui-goal": "^0.1.2-alpha.2",
68
+ "@deepseek-ai/dsh-client-ui-layout": "^0.1.2-alpha.2",
69
+ "@deepseek-ai/dsh-client-ui-model-selection": "^0.1.2-alpha.2",
70
+ "@deepseek-ai/dsh-client-ui-settings-models": "^0.1.2-alpha.2",
71
+ "@deepseek-ai/dsh-client-ui-settings-plugin-inventory": "^0.1.2-alpha.2",
72
+ "@deepseek-ai/dsh-client-ui-plan": "^0.1.2-alpha.2",
73
+ "@deepseek-ai/dsh-client-ui-schedule": "^0.1.2-alpha.2",
74
+ "@deepseek-ai/dsh-client-ui-session": "^0.1.2-alpha.2",
75
+ "@deepseek-ai/dsh-client-ui-settings-plugins": "^0.1.2-alpha.2",
76
+ "@deepseek-ai/dsh-client-ui-user-questions": "^0.1.2-alpha.2",
77
+ "@deepseek-ai/dsh-client-ui-settings": "^0.1.2-alpha.2",
78
+ "@deepseek-ai/dsh-client-ui-settings-general": "^0.1.2-alpha.2",
79
+ "@deepseek-ai/dsh-client-ui-sidebar": "^0.1.2-alpha.2",
80
+ "@deepseek-ai/dsh-client-ui-permission-presets": "^0.1.2-alpha.2",
81
+ "@deepseek-ai/dsh-client-ui-skill": "^0.1.2-alpha.2",
82
+ "@deepseek-ai/dsh-client-ui-input-trigger": "^0.1.2-alpha.2",
83
+ "@deepseek-ai/dsh-client-ui-reference": "^0.1.2-alpha.2",
84
+ "@deepseek-ai/dsh-client-ui-subagent": "^0.1.2-alpha.2",
85
+ "@deepseek-ai/dsh-client-ui-jobs": "^0.1.2-alpha.2",
86
+ "@deepseek-ai/dsh-client-ui-theme": "^0.1.2-alpha.2",
87
+ "@deepseek-ai/dsh-client-ui-tool": "^0.1.2-alpha.2",
88
+ "@deepseek-ai/dsh-client-ui-workflow-run": "^0.1.2-alpha.2",
89
+ "@deepseek-ai/dsh-client-ui-trajectory": "^0.1.2-alpha.2",
90
+ "@deepseek-ai/dsh-client-ui-workspace": "^0.1.2-alpha.2",
91
+ "@deepseek-ai/dsh-cmdline": "^0.1.2-alpha.2",
92
+ "@deepseek-ai/dsh-code-runtime-worker-thread": "^0.1.2-alpha.2",
93
+ "@deepseek-ai/dsh-cordis-client-runner": "^0.1.2-alpha.2",
94
+ "@deepseek-ai/dsh-cordis-host-runner": "^0.1.2-alpha.2",
95
+ "@deepseek-ai/dsh-web-frontend": "^0.1.2-alpha.2",
96
+ "@deepseek-ai/dsh-host-frontend-static": "^0.1.2-alpha.2",
97
+ "@deepseek-ai/dsh-host-directory-picker-auto": "^0.1.2-alpha.2",
98
+ "@deepseek-ai/dsh-host-directory-picker-browse": "^0.1.2-alpha.2",
99
+ "@deepseek-ai/dsh-host-directory-picker-native": "^0.1.2-alpha.2",
100
+ "@deepseek-ai/dsh-host-plugin-inventory": "^0.1.2-alpha.2",
101
+ "@deepseek-ai/dsh-host-webserver": "^0.1.2-alpha.2",
102
+ "@deepseek-ai/dsh-file-reference": "^0.1.2-alpha.2",
103
+ "@deepseek-ai/dsh-file-reference-local": "^0.1.2-alpha.2",
104
+ "@deepseek-ai/dsh-message-feedback": "^0.1.2-alpha.2",
105
+ "@deepseek-ai/dsh-session-reference": "^0.1.2-alpha.2",
106
+ "@deepseek-ai/dsh-session-log-export": "^0.1.2-alpha.2",
107
+ "@deepseek-ai/dsh-session-stats": "^0.1.2-alpha.2",
108
+ "@deepseek-ai/dsh-api-session-controller": "^0.1.2-alpha.2",
109
+ "@deepseek-ai/dsh-api-settings-controller": "^0.1.2-alpha.2",
110
+ "@deepseek-ai/dsh-api-workspace-controller": "^0.1.2-alpha.2",
111
+ "@deepseek-ai/dsh-subprocess": "^0.1.2-alpha.2",
112
+ "@deepseek-ai/dsh-workspace": "^0.1.2-alpha.2",
113
+ "@deepseek-ai/dsh-launch-environment": "^0.1.2-alpha.2",
114
+ "@deepseek-ai/schemastery": "^3.18.2",
115
+ "@deepseek-ai/dsh-tool-subagent": "^0.1.2-alpha.2",
116
+ "@deepseek-ai/dsh-api-remotes": "^0.1.2-alpha.2",
117
+ "@deepseek-ai/dsh-app-boot": "^0.1.2-alpha.2"
116
118
  },
117
119
  "peerDependencies": {
118
- "@deepseek-ai/cordis-plugin-loader": "^1.0.2",
119
- "@deepseek-ai/dsh-shell-env": "^0.1.1-rc.2",
120
- "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
121
- "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2",
122
- "@deepseek-ai/cordis": "^4.0.1"
120
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.3",
121
+ "@deepseek-ai/dsh-shell-env": "^0.1.2-alpha.2",
122
+ "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.2",
123
+ "@deepseek-ai/dsh-system-prompt": "^0.1.2-alpha.2",
124
+ "@deepseek-ai/cordis": "^4.0.2"
123
125
  },
124
126
  "devDependencies": {
125
- "@deepseek-ai/dsh-shell-env": "^0.1.1-rc.2",
126
- "@deepseek-ai/dsh-invariants": "^0.1.1-rc.2",
127
- "@deepseek-ai/cordis": "^4.0.1",
128
- "@deepseek-ai/cordis-plugin-loader": "^1.0.2",
129
- "@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.2"
127
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.3",
128
+ "@deepseek-ai/dsh-shell-env": "^0.1.2-alpha.2",
129
+ "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.2",
130
+ "@deepseek-ai/cordis": "^4.0.2",
131
+ "@deepseek-ai/dsh-system-prompt": "^0.1.2-alpha.2"
130
132
  }
131
133
  }