@deepseek-ai/dsh-web-app 0.0.1-rc.2 → 0.0.1-rc.5

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: 06856a47cd8ccc2c6ee5a53c40928b1bd2933cc7
6
- README.zh.md: 8befc7c7404ea1b082842f122769967fff32df2f
5
+ README.md: 3f7fbe7bbbeba2ee753ab2dfa8c945e798dd6a02
6
+ README.zh.md: 357ca9946ed7fef1bf4c691c6666156bb293b5e0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  English | [中文](README.zh.md)
4
4
 
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 `{printUrl, surfaceContext, trustedHosts}`). That plugin resolves the built frontend dist through `@deepseek-ai/dsh-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, registers the harness-source and web-surface prompt sections plus the bash-visible `DSH_WEB_URL` runtime variable when `surfaceContext` is true, and prints the `dsh web:` URL line when `printUrl` is true, after its Loader tree settles so a sibling failure cannot announce a dead app. 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`, and the app's `--help`, then provides `webStartup`. Flag-configured rows inject that 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.
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 `{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, registers the harness-source and web-surface prompt sections plus the bash-visible `DSH_WEB_URL` runtime variable when `surfaceContext` is true, and prints the `dsh web:` URL line when `printUrl` is true, after its Loader tree settles so a sibling failure cannot announce a dead app. 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`, and the app's `--help`, then provides `webStartup`. Flag-configured rows inject that 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.
6
6
 
7
7
  ## Model Experience
8
8
 
package/README.zh.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [English](README.md) | 中文
4
4
 
5
- dsh 浏览器表层组合包。[`cordis.patch.yml`](cordis.patch.yml) 叠加在 [`dsh-base`](../base/README.md) 之上:设置 coding persona,插入 Web 宿主行(webserver、API 网关、workspace、投影缓存、存储)、浏览器插件名录与始终挂载的客户端插件重载链([`dsh-client-hmr`](../../client/hmr/README.md),在重建 watcher 改写客户端 bundle 之前保持空闲),并挂载本包的 `web-runtime` 粘合插件(配置为 `{printUrl, surfaceContext, trustedHosts}`)。该插件通过 `@deepseek-ai/dsh-frontend` 的 exports 解析已构建的前端 dist,只采样一次依赖 bind 的 LAN 信任信息并将其作为 `webRuntime` 提供给浏览器信任栅栏和客户端名录,挂载 [`frontend-static`](../../host/frontend-static/README.md) 回退席位所有者,在 `surfaceContext` 为 true 时注册 Harness 源码与 Web 表层提示词段落,以及 bash 可见的 `DSH_WEB_URL` 运行时变量,并在 `printUrl` 为 true 时等自身的 Loader 配置树结算后再打印 `dsh web:` URL 行,避免兄弟行失败时公告一个已失效的应用。本组合包还持有应用命令行:普通 `web-startup` 提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.md)),解析 `--host`、`--port`、可重复的 `--trusted-host` 以及应用自己的 `--help`,再提供 `webStartup`。由 flag 配置的行会注入该服务,并在惰性配置中直接读取它,因此参数解析完成前不会有任何东西绑定端口,`dsh --profile web --help` 也不会启动服务器。[`dsh-headless`](../headless/README.md) 是同一 base 之上的同级表层,不挂载本组合包。
5
+ dsh 浏览器表层组合包。[`cordis.patch.yml`](cordis.patch.yml) 叠加在 [`dsh-base`](../base/README.md) 之上:设置 coding persona,插入 Web 宿主行(webserver、API 网关、workspace、投影缓存、存储)、浏览器插件名录与始终挂载的客户端插件重载链([`dsh-client-hmr`](../../client/hmr/README.md),在重建 watcher 改写客户端 bundle 之前保持空闲),并挂载本包的 `web-runtime` 粘合插件(配置为 `{printUrl, surfaceContext, trustedHosts}`)。该插件通过 `@deepseek-ai/dsh-web-frontend` 的 exports 解析已构建的前端 dist,只采样一次依赖 bind 的 LAN 信任信息并将其作为 `webRuntime` 提供给浏览器信任栅栏和客户端名录,挂载 [`frontend-static`](../../host/frontend-static/README.md) 回退席位所有者,在 `surfaceContext` 为 true 时注册 Harness 源码与 Web 表层提示词段落,以及 bash 可见的 `DSH_WEB_URL` 运行时变量,并在 `printUrl` 为 true 时等自身的 Loader 配置树结算后再打印 `dsh web:` URL 行,避免兄弟行失败时公告一个已失效的应用。本组合包还持有应用命令行:普通 `web-startup` 提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.md)),解析 `--host`、`--port`、可重复的 `--trusted-host` 以及应用自己的 `--help`,再提供 `webStartup`。由 flag 配置的行会注入该服务,并在惰性配置中直接读取它,因此参数解析完成前不会有任何东西绑定端口,`dsh --profile web --help` 也不会启动服务器。[`dsh-headless`](../headless/README.md) 是同一 base 之上的同级表层,不挂载本组合包。
6
6
 
7
7
  ## 模型体验
8
8
 
package/cordis.patch.yml CHANGED
@@ -34,7 +34,7 @@
34
34
  - id: tools
35
35
  config:
36
36
  # TEMPORARY workaround: DSH_TOOLS_MODE (native|code|both) opts a whole dsh
37
- # process into Code Mode while per-session tool-mode selection is being
37
+ # process into Code Mode while per-session tool-presentation selection is being
38
38
  # designed; unset keeps the schema default (native). Remove the env seam
39
39
  # once the web UI owns the choice per session.
40
40
  mode: !!js process.env.DSH_TOOLS_MODE
@@ -45,7 +45,7 @@
45
45
  # window.__DSH_BOOT__; the modules row is simultaneously a host row.
46
46
  - insert:
47
47
  - id: code-runtime
48
- name: '@deepseek-ai/dsh-code-runtime-worker'
48
+ name: '@deepseek-ai/dsh-code-runtime-worker-thread'
49
49
 
50
50
  - id: storage
51
51
  name: '@deepseek-ai/dsh-storage'
@@ -65,6 +65,10 @@
65
65
  config:
66
66
  maxNoteBytes: 8192
67
67
 
68
+ # Browser Session export: `/export` command plus the shared download dialog.
69
+ - id: session-log-download
70
+ name: '@deepseek-ai/dsh-session-log-export'
71
+
68
72
  - id: workspace
69
73
  name: '@deepseek-ai/dsh-workspace'
70
74
 
@@ -74,17 +78,29 @@
74
78
  writeEveryEvents: 200
75
79
  writeIntervalMs: 5000
76
80
 
81
+ # Whole-log turn/step counts for the chat stats strip (the sessionStats
82
+ # projection key); the projection registry itself is a base-layer row.
83
+ - id: session-stats
84
+ name: '@deepseek-ai/dsh-session-stats'
85
+
77
86
  # Resolve bind host, SSH launch, and display once at boot, then mount the
78
87
  # matching dual-face directory picker. Mount -native or -browse directly in
79
88
  # an overlay to pin the interaction.
80
89
  - id: directory-picker
81
90
  name: '@deepseek-ai/dsh-host-directory-picker-auto'
82
91
 
92
+ # Read-only projection of current Loader entries for trusted client RPCs.
93
+ - id: plugin-inventory
94
+ name: '@deepseek-ai/dsh-host-plugin-inventory'
95
+
83
96
  # The API gateway: the transport-agnostic dispatch face every client shape
84
97
  # shares. The base layer's agent-default-model service owns the default model.
85
98
  - id: api-gateway
86
99
  name: '@deepseek-ai/dsh-host-apiproxy'
87
100
 
101
+ - id: cordis-host-runner
102
+ name: '@deepseek-ai/dsh-cordis-host-runner'
103
+
88
104
  # Ordinary provider for the parsed Web flags. Its plugin-level injection
89
105
  # waits for cmdlineArgs; no launcher metadata or special row kind is needed.
90
106
  - id: web-startup
@@ -151,6 +167,9 @@
151
167
  - id: client-runtime
152
168
  name: '@deepseek-ai/dsh-client-runtime'
153
169
 
170
+ - id: cordis-client-runner
171
+ name: '@deepseek-ai/dsh-cordis-client-runner'
172
+
154
173
  - id: ui-theme
155
174
  name: '@deepseek-ai/dsh-client-ui-theme'
156
175
 
@@ -169,8 +188,11 @@
169
188
  - id: ui-settings-general
170
189
  name: '@deepseek-ai/dsh-client-ui-settings-general'
171
190
 
172
- - id: ui-models
173
- name: '@deepseek-ai/dsh-client-ui-models'
191
+ - id: ui-settings-models
192
+ name: '@deepseek-ai/dsh-client-ui-settings-models'
193
+
194
+ - id: ui-settings-plugin-inventory
195
+ name: '@deepseek-ai/dsh-client-ui-settings-plugin-inventory'
174
196
 
175
197
  - id: ui-conversation
176
198
  name: '@deepseek-ai/dsh-client-ui-conversation'
@@ -179,6 +201,9 @@
179
201
  - id: ui-tool
180
202
  name: '@deepseek-ai/dsh-client-ui-tool'
181
203
 
204
+ - id: ui-cordis
205
+ name: '@deepseek-ai/dsh-client-ui-cordis'
206
+
182
207
  # Durable workflow lifecycle as an independent Chat node after the
183
208
  # existing generic workflow tool row.
184
209
  - id: ui-workflow-run
@@ -193,13 +218,13 @@
193
218
  - id: ui-workspace
194
219
  name: '@deepseek-ai/dsh-client-ui-workspace'
195
220
 
196
- # Input triggers: the '/' | '@' pipeline (ui-slash), the command surface over
197
- # it (ui-command), and the two reference sources (ui-skill / ui-subagent).
198
- - id: ui-slash
199
- name: '@deepseek-ai/dsh-client-ui-slash'
221
+ # Input triggers: the '/' | '@' pipeline (ui-input-trigger), the command surface over
222
+ # it (ui-commands), and the two reference sources (ui-skill / ui-subagent).
223
+ - id: ui-input-trigger
224
+ name: '@deepseek-ai/dsh-client-ui-input-trigger'
200
225
 
201
- - id: ui-command
202
- name: '@deepseek-ai/dsh-client-ui-command'
226
+ - id: ui-commands
227
+ name: '@deepseek-ai/dsh-client-ui-commands'
203
228
 
204
229
  - id: ui-skill
205
230
  name: '@deepseek-ai/dsh-client-ui-skill'
@@ -207,20 +232,25 @@
207
232
  - id: ui-subagent
208
233
  name: '@deepseek-ai/dsh-client-ui-subagent'
209
234
 
210
- # Background tasks: the session-header list over the tasksBySession mirror.
211
- - id: ui-task
212
- name: '@deepseek-ai/dsh-client-ui-task'
235
+ # Background jobs: the session-header list over the jobsBySession mirror.
236
+ - id: ui-jobs
237
+ name: '@deepseek-ai/dsh-client-ui-jobs'
213
238
 
214
239
  # Goal surface: GoalBar in the input dock over the goal session projection.
215
240
  - id: ui-goal
216
241
  name: '@deepseek-ai/dsh-client-ui-goal'
217
242
 
243
+ # Per-message feedback: Like/Dislike plus an optional note in the
244
+ # assistant-message action strip, over the messageFeedback Remote.
245
+ - id: ui-message-feedback
246
+ name: '@deepseek-ai/dsh-client-ui-message-feedback'
247
+
218
248
  # Model selection: the /model popupSelect + composer seat over session.models.
219
- - id: ui-model
220
- name: '@deepseek-ai/dsh-client-ui-model'
249
+ - id: ui-model-selection
250
+ name: '@deepseek-ai/dsh-client-ui-model-selection'
221
251
 
222
252
  - id: ui-permission
223
- name: '@deepseek-ai/dsh-client-ui-permission'
253
+ name: '@deepseek-ai/dsh-client-ui-permission-presets'
224
254
 
225
255
  # The agent-preset row in General settings: the default preset for
226
256
  # sessions created later. Absent a roster it renders nothing.
@@ -229,15 +259,15 @@
229
259
 
230
260
  # Plugin configuration: the host-plane sections a user owns, as expandable
231
261
  # cards. A namespace this deployment does not expose renders nothing.
232
- - id: ui-plugin-config
233
- name: '@deepseek-ai/dsh-client-ui-plugin-config'
262
+ - id: ui-settings-plugins
263
+ name: '@deepseek-ai/dsh-client-ui-settings-plugins'
234
264
 
235
265
  # Plan control: the composer plan seat over the plan projection + /plan channel.
236
266
  - id: ui-plan
237
267
  name: '@deepseek-ai/dsh-client-ui-plan'
238
268
 
239
- - id: ui-question
240
- name: '@deepseek-ai/dsh-client-ui-question'
269
+ - id: ui-user-questions
270
+ name: '@deepseek-ai/dsh-client-ui-user-questions'
241
271
 
242
272
  - id: ui-trajectory
243
273
  name: '@deepseek-ai/dsh-client-ui-trajectory'
@@ -253,7 +283,7 @@
253
283
  # absent from a surface overlay would silently reappear the day someone reorders
254
284
  # the composition.
255
285
 
256
- # `bash-env` STAYS in the host plane: `apps/cli/src/web.ts` injects it to
286
+ # `shell-env` STAYS in the host plane: `apps/cli/src/web.ts` injects it to
257
287
  # publish `DSH_WEB_URL`/`DSH_WEB_MODE`, and a host row that injects a service is
258
288
  # the criterion for host-plane ownership — injection resolves before any session
259
289
  # exists, so there is no agent to key by. Behind a preset realm those variables
@@ -262,17 +292,20 @@
262
292
  - id: tool-bash
263
293
  disabled: true
264
294
 
265
- # The background-task REGISTRY stays on the host plane; only the model-facing
266
- # `task_*` controls move. Its producers — `tool-bash` here, `tool-pty` and a
295
+ - id: tool-pwsh
296
+ disabled: true
297
+
298
+ # The background-job REGISTRY stays on the host plane; only the model-facing
299
+ # `job_*` controls move. Its producers — `tool-bash` here, `tool-terminal` and a
267
300
  # non-continuable `tool-subagent` elsewhere — are preset rows that resolve it
268
301
  # with `ctx.get`, and an entry-local realm around the registry is invisible to
269
302
  # every sibling row outside that realm, so `run_in_background` answered
270
- # "background tasks unavailable" while the controls sat in the catalog. That is
303
+ # "background jobs unavailable" while the controls sat in the catalog. That is
271
304
  # the `goals` criterion read from inside the preset: a Service a row outside its
272
305
  # realm READS belongs to the plane both can see. The registry is keyed by owning
273
306
  # agent, so one host instance serves every session exactly as before presets.
274
307
 
275
- - id: tool-tasks
308
+ - id: tool-jobs
276
309
  disabled: true
277
310
 
278
311
  - id: tool-fs
@@ -286,14 +319,14 @@
286
319
 
287
320
  # The `skill` REGISTRY stays in the host plane. It is host+per-scope layered
288
321
  # (the tools-registry shape): deployment-level providers — repository plugins,
289
- # a host skill-local row — register into its global layer, while a preset's
290
- # `skill-local` registers into that preset's layer, and each agent reads the
322
+ # a host skill-filesystem row — register into its global layer, while a preset's
323
+ # `skill-filesystem` registers into that preset's layer, and each agent reads the
291
324
  # merged catalog its scope chain selects. Only the per-agent rows move behind
292
- # presets: the base host `skill-local` row is disabled here (presets own local
325
+ # presets: the base host `skill-filesystem` row is disabled here (presets own local
293
326
  # discovery), and `tool-skill` is what a preset mounts to give its agent the
294
327
  # catalog and loader at all.
295
328
 
296
- - id: skill-local
329
+ - id: skill-filesystem
297
330
  disabled: true
298
331
 
299
332
  - id: tool-skill
@@ -304,7 +337,7 @@
304
337
  # domain as Remote endpoints, and a Remote method picks its receiver Service
305
338
  # from a generated descriptor — it resolves `goals` on the host, so a
306
339
  # per-session realm would answer `service-unavailable` for every browser call.
307
- # That is the `bash-env` criterion read from the other side: injection is not
340
+ # That is the `shell-env` criterion read from the other side: injection is not
308
341
  # the only host relationship a Service can have. The registry is keyed by
309
342
  # session, so one host instance serves every session exactly as before presets.
310
343
 
@@ -321,13 +354,13 @@
321
354
  # `tasks` and `goals`; the reasoning has one home in
322
355
  # `.agents/notes/implemented/architecture/2026-08-10-host-plane-ownership-after-presets.md`.
323
356
 
324
- - id: compact-basic
357
+ - id: compaction-basic
325
358
  disabled: true
326
359
 
327
360
  - id: command-compact
328
361
  disabled: true
329
362
 
330
- - id: tool-result-prune
363
+ - id: tool-result-pruner
331
364
  disabled: true
332
365
 
333
366
  # The subagent registry and its backends STAY in the host plane. `subagents` is
@@ -355,7 +388,7 @@
355
388
  # scope-aware — one copy per mounted preset means every child gets `report`
356
389
  # registered once per live session, which throws on the second.
357
390
 
358
- - id: workflow-workerthread
391
+ - id: workflow-worker-thread
359
392
  disabled: true
360
393
 
361
394
  - id: tool-workflow
@@ -364,7 +397,7 @@
364
397
  - id: tool-ralph
365
398
  disabled: true
366
399
 
367
- - id: workspace-context
400
+ - id: agent-instructions
368
401
  disabled: true
369
402
 
370
403
  - id: tool-todo
@@ -374,12 +407,15 @@
374
407
  disabled: true
375
408
 
376
409
  # The preset roster. `config/agent-presets/` ships with the deployment and is
377
- # read-only (its entries carry `system` trust);
378
- # `$DSH_HOME/.agent-presets` is where a person — or an agent — authors their own, and
379
- # carries the same trust as shell access because a preset IS a composition.
380
- # `roots` is an assembly fact, not user config: the shipped preset directory
381
- # ships beside this file, so AppCLIEntry resolves it and patches it in — the
382
- # same treatment `distIndex` gets on the webserver row.
410
+ # read-only (its entries carry `system` trust); `$DSH_HOME/.agent-presets` is
411
+ # where a person — or an agent — authors their own, and carries the same trust
412
+ # as shell access because a preset IS a composition.
413
+ #
414
+ # Only the SHIPPED root is an assembly fact: it sits beside the installed app's
415
+ # own config, so `apps/cli`'s `composeProfile` resolves and patches it in — the
416
+ # same treatment `distIndex` gets on the webserver row. The writable root is
417
+ # `dsh-agent-presets`' own default (`includeUserRoot`), so a composition that
418
+ # never reaches that patch still finds a person's presets.
383
419
  - insert:
384
420
  - id: agent-presets
385
421
  name: '@deepseek-ai/dsh-agent-presets'
package/lib/index.js CHANGED
@@ -3,7 +3,7 @@ import { networkInterfaces } from "node:os";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import z from "@deepseek-ai/schemastery";
5
5
  import { addHarnessSourceSection } from "@deepseek-ai/dsh-app-boot";
6
- import * as FrontendStatic from "@deepseek-ai/dsh-frontend-static";
6
+ import * as FrontendStatic from "@deepseek-ai/dsh-host-frontend-static";
7
7
  //#region lib/types/index.js
8
8
  /**
9
9
  * @deepseek-ai/dsh-web-app — the browser-surface bundle's runtime glue plugin
@@ -23,7 +23,7 @@ const SOURCE_ROOT = fileURLToPath(new URL("../../../..", import.meta.url));
23
23
  /** Runtime service that releases Web rows after bind-dependent values resolve. */
24
24
  const WEB_RUNTIME_SERVICE = "webRuntime";
25
25
  /** Services required before the web runtime can mount. */
26
- const inject = ["httpServer"];
26
+ const inject = ["webServer"];
27
27
  const Config = z.object({
28
28
  printUrl: z.boolean().default(true),
29
29
  surfaceContext: z.boolean().default(true),
@@ -53,19 +53,19 @@ function resolveLanTrust(bindHost, extra) {
53
53
  }
54
54
  /** Model-visible orientation and acceptance boundary for sessions created through `dsh web`. */
55
55
  function webSurfacePrompt(webUrl) {
56
- return `You are interacting with the user through the DeepSeek Harness Web GUI at ${webUrl}. When the user refers to "this page", "this GUI", or "this app" without naming another target, they mean this GUI. The browser provides no implicit DOM, route, or screenshot context. The client-plugin HMR receiver is active, but client-plugin changes reload without a refresh only while \`pnpm run dev:web\` is also running from this same checkout to rebuild their bundles; verify that watcher before promising automatic updates. Every other change — the apps/web shell and plain packages — requires rebuilding the affected Web artifacts and verifying this existing URL after a page refresh. Starting another server does not update this GUI. The apps/web Vite entry builds the shell but is not a standalone application because only dsh web injects window.__DSH_BOOT__. Do not start a replacement server unless the user asks; if one is needed, use a managed background task and verify its exact URL.`;
56
+ return `You are interacting with the user through the DeepSeek Harness Web GUI at ${webUrl}. When the user refers to "this page", "this GUI", or "this app" without naming another target, they mean this GUI. The browser provides no implicit DOM, route, or screenshot context. The client-plugin HMR receiver is active, but client-plugin changes reload without a refresh only while \`pnpm run dev:web\` is also running from this same checkout to rebuild their bundles; verify that watcher before promising automatic updates. Every other change — the apps/web shell and plain packages — requires rebuilding the affected Web artifacts and verifying this existing URL after a page refresh. Starting another server does not update this GUI. The apps/web Vite entry builds the shell but is not a standalone application because only dsh web injects window.__DSH_BOOT__. Do not start a replacement server unless the user asks; if one is needed, use a managed background job and verify its exact URL.`;
57
57
  }
58
58
  /** Resolve the canonical loopback URL from the active Web server. */
59
59
  function localWebUrl(ctx) {
60
- const port = ctx.get("httpServer")?.port;
61
- if (port === void 0) throw new Error("web-app: httpServer service missing while resolving Web runtime");
60
+ const port = ctx.get("webServer")?.port;
61
+ if (port === void 0) throw new Error("web-app: webServer service missing while resolving Web runtime");
62
62
  return `http://${LOOPBACK_HOST}:${String(port)}`;
63
63
  }
64
64
  /** Dist location is workspace knowledge of this bundle: resolved through the frontend package exports, not configured. */
65
65
  function resolveDistIndex() {
66
66
  const require = createRequire(import.meta.url);
67
67
  try {
68
- return require.resolve("@deepseek-ai/dsh-frontend/dist/index.html");
68
+ return require.resolve("@deepseek-ai/dsh-web-frontend/dist/index.html");
69
69
  } catch {
70
70
  /* v8 ignore next 2 -- reachable only on a checkout without a built dist; the test tree builds it */
71
71
  throw new Error("web-app: frontend dist not built; run pnpm run build from the repository root first");
@@ -76,11 +76,11 @@ const internals = { resolveDistIndex };
76
76
  /**
77
77
  * Mount the Web runtime: dist serving, surface prompt, the bash runtime
78
78
  * variable, and the URL line.
79
- * @param ctx - plugin context carrying the httpServer service.
79
+ * @param ctx - plugin context carrying the webServer service.
80
80
  * @param config - validated {@link Config}.
81
81
  */
82
82
  function apply(ctx, config) {
83
- const runtime = resolveLanTrust(ctx.httpServer.host, config.trustedHosts);
83
+ const runtime = resolveLanTrust(ctx.webServer.host, config.trustedHosts);
84
84
  ctx.provide(WEB_RUNTIME_SERVICE, runtime);
85
85
  ctx.plugin(FrontendStatic, { distIndex: internals.resolveDistIndex() });
86
86
  if (config.surfaceContext) {
@@ -92,8 +92,8 @@ function apply(ctx, config) {
92
92
  text: () => webSurfacePrompt(localWebUrl(promptCtx))
93
93
  });
94
94
  });
95
- ctx.inject(["bashEnv"], (runtimeCtx) => {
96
- runtimeCtx.bashEnv.register({
95
+ ctx.inject(["shellEnv"], (runtimeCtx) => {
96
+ runtimeCtx.shellEnv.register({
97
97
  name: "web-runtime",
98
98
  variables: { [DSH_WEB_URL]: { description: "Canonical local URL of the DeepSeek Harness Web GUI serving this session." } },
99
99
  resolve: () => ({ [DSH_WEB_URL]: localWebUrl(runtimeCtx) })
@@ -103,13 +103,13 @@ function apply(ctx, config) {
103
103
  if (config.printUrl) {
104
104
  const printUrl = () => {
105
105
  const lanCandidate = runtime.lanAddresses[0];
106
- const port = ctx.httpServer.port;
106
+ const port = ctx.webServer.port;
107
107
  console.log(`dsh web: ${localWebUrl(ctx)}${lanCandidate === void 0 ? "" : ` (LAN: http://${lanCandidate}:${String(port)})`}`);
108
108
  };
109
109
  const settled = ctx.get("loader")?.await();
110
110
  if (settled === void 0) printUrl();
111
111
  else settled.then(() => {
112
- if (ctx.get("httpServer") !== void 0) printUrl();
112
+ if (ctx.get("webServer") !== void 0) printUrl();
113
113
  }, () => {});
114
114
  }
115
115
  }
package/lib/startup.js CHANGED
@@ -27,27 +27,24 @@ Examples:
27
27
  `);
28
28
  }
29
29
  /**
30
- * Turn the parsed flags into the value injected rows read.
31
- * @param program - the parsed web command.
32
- * @returns this invocation's immutable Web options.
33
- */
34
- function planWebStartup(program) {
35
- const options = program.opts();
36
- if (options.port !== void 0 && !/^\d+$/.test(options.port)) program.error(`error: --port must be a number, got ${JSON.stringify(options.port)}`);
37
- return {
38
- ...options.host !== void 0 && { host: options.host },
39
- ...options.port !== void 0 && { port: Number(options.port) },
40
- trustedHosts: options.trustedHost ?? []
41
- };
42
- }
43
- /**
44
- * Parse and provide the Web invocation as an ordinary Cordis service.
30
+ * Parse and provide the Web invocation as an ordinary Cordis service. The
31
+ * command's action publishes the flags this invocation named; a non-numeric
32
+ * `--port` is a usage error, so on rejection (and on `--help`) nothing is
33
+ * provided.
45
34
  * @param ctx - plugin context carrying the command line.
46
- * @returns nothing once values are provided, or when the command requested exit.
47
35
  */
48
36
  function apply(ctx) {
49
- const values = parseCmdline(ctx, webCommand(), planWebStartup);
50
- if (values !== void 0) ctx.provide(WEB_STARTUP_SERVICE, values);
37
+ const program = webCommand();
38
+ program.action(() => {
39
+ const options = program.opts();
40
+ if (options.port !== void 0 && !/^\d+$/.test(options.port)) program.error(`error: --port must be a number, got ${JSON.stringify(options.port)}`);
41
+ ctx.provide(WEB_STARTUP_SERVICE, {
42
+ ...options.host !== void 0 && { host: options.host },
43
+ ...options.port !== void 0 && { port: Number(options.port) },
44
+ trustedHosts: options.trustedHost ?? []
45
+ });
46
+ });
47
+ parseCmdline(ctx, program);
51
48
  }
52
49
  //#endregion
53
50
  export { WEB_STARTUP_SERVICE, apply, inject, name };
@@ -55,7 +55,7 @@ export declare const internals: {
55
55
  /**
56
56
  * Mount the Web runtime: dist serving, surface prompt, the bash runtime
57
57
  * variable, and the URL line.
58
- * @param ctx - plugin context carrying the httpServer service.
58
+ * @param ctx - plugin context carrying the webServer service.
59
59
  * @param config - validated {@link Config}.
60
60
  */
61
61
  export declare function apply(ctx: Context, config: Config): void;
@@ -22,9 +22,11 @@ export interface WebStartupValues {
22
22
  trustedHosts: string[];
23
23
  }
24
24
  /**
25
- * Parse and provide the Web invocation as an ordinary Cordis service.
25
+ * Parse and provide the Web invocation as an ordinary Cordis service. The
26
+ * command's action publishes the flags this invocation named; a non-numeric
27
+ * `--port` is a usage error, so on rejection (and on `--help`) nothing is
28
+ * provided.
26
29
  * @param ctx - plugin context carrying the command line.
27
- * @returns nothing once values are provided, or when the command requested exit.
28
30
  */
29
31
  export declare function apply(ctx: Context): void;
30
32
  //# sourceMappingURL=startup.d.ts.map
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.0.1-rc.2",
4
+ "version": "0.0.1-rc.5",
5
5
  "publishConfig": {
6
6
  "access": "restricted"
7
7
  },
@@ -45,67 +45,77 @@
45
45
  },
46
46
  "dependencies": {
47
47
  "commander": "^15.0.0",
48
- "@deepseek-ai/dsh-agent-presets": "^0.0.1-rc.2",
49
- "@deepseek-ai/dsh-api-remotes": "^0.0.1-rc.2",
50
- "@deepseek-ai/dsh-app-boot": "^0.0.1-rc.2",
51
- "@deepseek-ai/dsh-client-hmr": "^0.0.1-rc.2",
52
- "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.2",
53
- "@deepseek-ai/dsh-client-modules": "^0.0.1-rc.2",
54
- "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.2",
55
- "@deepseek-ai/dsh-client-ui-agent-preset": "^0.0.1-rc.2",
56
- "@deepseek-ai/dsh-client-ui-command": "^0.0.1-rc.2",
57
- "@deepseek-ai/dsh-client-ui-conversation": "^0.0.1-rc.2",
58
- "@deepseek-ai/dsh-client-ui-deliverables": "^0.0.1-rc.2",
59
- "@deepseek-ai/dsh-client-ui-goal": "^0.0.1-rc.2",
60
- "@deepseek-ai/dsh-client-connection": "^0.0.1-rc.2",
61
- "@deepseek-ai/dsh-client-ui-layout": "^0.0.1-rc.2",
62
- "@deepseek-ai/dsh-client-ui-model": "^0.0.1-rc.2",
63
- "@deepseek-ai/dsh-client-ui-models": "^0.0.1-rc.2",
64
- "@deepseek-ai/dsh-client-ui-permission": "^0.0.1-rc.2",
65
- "@deepseek-ai/dsh-client-ui-plan": "^0.0.1-rc.2",
66
- "@deepseek-ai/dsh-client-ui-plugin-config": "^0.0.1-rc.2",
67
- "@deepseek-ai/dsh-client-ui-question": "^0.0.1-rc.2",
68
- "@deepseek-ai/dsh-client-ui-settings": "^0.0.1-rc.2",
69
- "@deepseek-ai/dsh-client-ui-settings-general": "^0.0.1-rc.2",
70
- "@deepseek-ai/dsh-client-ui-sidebar": "^0.0.1-rc.2",
71
- "@deepseek-ai/dsh-client-ui-skill": "^0.0.1-rc.2",
72
- "@deepseek-ai/dsh-client-ui-slash": "^0.0.1-rc.2",
73
- "@deepseek-ai/dsh-client-ui-subagent": "^0.0.1-rc.2",
74
- "@deepseek-ai/dsh-client-ui-task": "^0.0.1-rc.2",
75
- "@deepseek-ai/dsh-client-ui-theme": "^0.0.1-rc.2",
76
- "@deepseek-ai/dsh-client-ui-tool": "^0.0.1-rc.2",
77
- "@deepseek-ai/dsh-client-ui-workflow-run": "^0.0.1-rc.2",
78
- "@deepseek-ai/dsh-client-ui-trajectory": "^0.0.1-rc.2",
79
- "@deepseek-ai/dsh-client-ui-workspace": "^0.0.1-rc.2",
80
- "@deepseek-ai/dsh-cmdline": "^0.0.1-rc.2",
81
- "@deepseek-ai/dsh-code-runtime-worker": "^0.0.1-rc.2",
82
- "@deepseek-ai/dsh-frontend": "^0.0.1-rc.2",
83
- "@deepseek-ai/dsh-frontend-static": "^0.0.1-rc.2",
84
- "@deepseek-ai/dsh-host-apiproxy": "^0.0.1-rc.2",
85
- "@deepseek-ai/dsh-host-directory-picker-auto": "^0.0.1-rc.2",
86
- "@deepseek-ai/dsh-host-directory-picker-browse": "^0.0.1-rc.2",
87
- "@deepseek-ai/dsh-host-directory-picker-native": "^0.0.1-rc.2",
88
- "@deepseek-ai/dsh-host-webserver": "^0.0.1-rc.2",
89
- "@deepseek-ai/dsh-message-feedback": "^0.0.1-rc.2",
90
- "@deepseek-ai/dsh-session-projection-cache": "^0.0.1-rc.2",
91
- "@deepseek-ai/dsh-storage": "^0.0.1-rc.2",
92
- "@deepseek-ai/dsh-storage-json": "^0.0.1-rc.2",
93
- "@deepseek-ai/dsh-workspace": "^0.0.1-rc.2",
94
- "@deepseek-ai/schemastery": "^3.18.1-rc.1",
95
- "@deepseek-ai/dsh-storage-domain": "^0.0.1-rc.2"
48
+ "@deepseek-ai/dsh-app-boot": "^0.0.1-rc.5",
49
+ "@deepseek-ai/dsh-client-connection": "^0.0.1-rc.5",
50
+ "@deepseek-ai/dsh-client-hmr": "^0.0.1-rc.5",
51
+ "@deepseek-ai/dsh-client-locale": "^0.0.1-rc.5",
52
+ "@deepseek-ai/dsh-agent-presets": "^0.0.1-rc.5",
53
+ "@deepseek-ai/dsh-api-remotes": "^0.0.1-rc.5",
54
+ "@deepseek-ai/dsh-client-modules": "^0.0.1-rc.5",
55
+ "@deepseek-ai/dsh-client-runtime": "^0.0.1-rc.5",
56
+ "@deepseek-ai/dsh-client-ui-agent-preset": "^0.0.1-rc.5",
57
+ "@deepseek-ai/dsh-client-ui-commands": "^0.0.1-rc.5",
58
+ "@deepseek-ai/dsh-client-ui-deliverables": "^0.0.1-rc.5",
59
+ "@deepseek-ai/dsh-client-ui-directory-picker-browse": "^0.0.1-rc.5",
60
+ "@deepseek-ai/dsh-client-ui-directory-picker-native": "^0.0.1-rc.5",
61
+ "@deepseek-ai/dsh-client-ui-conversation": "^0.0.1-rc.5",
62
+ "@deepseek-ai/dsh-client-ui-cordis": "^0.0.1-rc.5",
63
+ "@deepseek-ai/dsh-client-ui-goal": "^0.0.1-rc.5",
64
+ "@deepseek-ai/dsh-client-ui-layout": "^0.0.1-rc.5",
65
+ "@deepseek-ai/dsh-client-ui-model-selection": "^0.0.1-rc.5",
66
+ "@deepseek-ai/dsh-client-ui-settings-models": "^0.0.1-rc.5",
67
+ "@deepseek-ai/dsh-client-ui-settings-plugin-inventory": "^0.0.1-rc.5",
68
+ "@deepseek-ai/dsh-client-ui-permission-presets": "^0.0.1-rc.5",
69
+ "@deepseek-ai/dsh-client-ui-message-feedback": "^0.0.1-rc.5",
70
+ "@deepseek-ai/dsh-client-ui-plan": "^0.0.1-rc.5",
71
+ "@deepseek-ai/dsh-client-ui-settings-plugins": "^0.0.1-rc.5",
72
+ "@deepseek-ai/dsh-client-ui-user-questions": "^0.0.1-rc.5",
73
+ "@deepseek-ai/dsh-client-ui-settings": "^0.0.1-rc.5",
74
+ "@deepseek-ai/dsh-client-ui-settings-general": "^0.0.1-rc.5",
75
+ "@deepseek-ai/dsh-client-ui-sidebar": "^0.0.1-rc.5",
76
+ "@deepseek-ai/dsh-client-ui-skill": "^0.0.1-rc.5",
77
+ "@deepseek-ai/dsh-client-ui-input-trigger": "^0.0.1-rc.5",
78
+ "@deepseek-ai/dsh-client-ui-subagent": "^0.0.1-rc.5",
79
+ "@deepseek-ai/dsh-client-ui-theme": "^0.0.1-rc.5",
80
+ "@deepseek-ai/dsh-client-ui-tool": "^0.0.1-rc.5",
81
+ "@deepseek-ai/dsh-client-ui-workflow-run": "^0.0.1-rc.5",
82
+ "@deepseek-ai/dsh-client-ui-trajectory": "^0.0.1-rc.5",
83
+ "@deepseek-ai/dsh-client-ui-jobs": "^0.0.1-rc.5",
84
+ "@deepseek-ai/dsh-cmdline": "^0.0.1-rc.5",
85
+ "@deepseek-ai/dsh-code-runtime-worker-thread": "^0.0.1-rc.5",
86
+ "@deepseek-ai/dsh-client-ui-workspace": "^0.0.1-rc.5",
87
+ "@deepseek-ai/dsh-cordis-host-runner": "^0.0.1-rc.5",
88
+ "@deepseek-ai/dsh-web-frontend": "^0.0.1-rc.5",
89
+ "@deepseek-ai/dsh-host-frontend-static": "^0.0.1-rc.5",
90
+ "@deepseek-ai/dsh-host-apiproxy": "^0.0.1-rc.5",
91
+ "@deepseek-ai/dsh-cordis-client-runner": "^0.0.1-rc.5",
92
+ "@deepseek-ai/dsh-host-directory-picker-auto": "^0.0.1-rc.5",
93
+ "@deepseek-ai/dsh-host-directory-picker-browse": "^0.0.1-rc.5",
94
+ "@deepseek-ai/dsh-host-directory-picker-native": "^0.0.1-rc.5",
95
+ "@deepseek-ai/dsh-host-plugin-inventory": "^0.0.1-rc.5",
96
+ "@deepseek-ai/dsh-message-feedback": "^0.0.1-rc.5",
97
+ "@deepseek-ai/dsh-session-projection-cache": "^0.0.1-rc.5",
98
+ "@deepseek-ai/dsh-host-webserver": "^0.0.1-rc.5",
99
+ "@deepseek-ai/dsh-session-stats": "^0.0.1-rc.5",
100
+ "@deepseek-ai/dsh-storage-domain": "^0.0.1-rc.5",
101
+ "@deepseek-ai/dsh-session-log-export": "^0.0.1-rc.5",
102
+ "@deepseek-ai/dsh-storage": "^0.0.1-rc.5",
103
+ "@deepseek-ai/dsh-storage-json": "^0.0.1-rc.5",
104
+ "@deepseek-ai/dsh-workspace": "^0.0.1-rc.5",
105
+ "@deepseek-ai/schemastery": "^3.18.1-rc.4"
96
106
  },
97
107
  "peerDependencies": {
98
- "@deepseek-ai/cordis-plugin-loader": "^1.0.1-rc.1",
99
- "@deepseek-ai/dsh-bash-env": "^0.0.1-rc.2",
100
- "@deepseek-ai/dsh-invariants": "^0.0.1-rc.2",
101
- "@deepseek-ai/dsh-system-prompt": "^0.0.1-rc.2",
102
- "@deepseek-ai/cordis": "^4.0.1-rc.1"
108
+ "@deepseek-ai/dsh-shell-env": "^0.0.1-rc.5",
109
+ "@deepseek-ai/dsh-system-prompt": "^0.0.1-rc.5",
110
+ "@deepseek-ai/cordis": "^4.0.1-rc.4",
111
+ "@deepseek-ai/dsh-invariants": "^0.0.1-rc.5",
112
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.2-rc.4"
103
113
  },
104
114
  "devDependencies": {
105
- "@deepseek-ai/cordis-plugin-loader": "^1.0.1-rc.1",
106
- "@deepseek-ai/dsh-system-prompt": "^0.0.1-rc.2",
107
- "@deepseek-ai/cordis": "^4.0.1-rc.1",
108
- "@deepseek-ai/dsh-invariants": "^0.0.1-rc.2",
109
- "@deepseek-ai/dsh-bash-env": "^0.0.1-rc.2"
115
+ "@deepseek-ai/cordis-plugin-loader": "^1.0.2-rc.4",
116
+ "@deepseek-ai/dsh-shell-env": "^0.0.1-rc.5",
117
+ "@deepseek-ai/dsh-invariants": "^0.0.1-rc.5",
118
+ "@deepseek-ai/dsh-system-prompt": "^0.0.1-rc.5",
119
+ "@deepseek-ai/cordis": "^4.0.1-rc.4"
110
120
  }
111
121
  }