@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 +2 -2
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/cordis.patch.yml +76 -40
- package/lib/index.js +12 -12
- package/lib/startup.js +15 -18
- package/lib/types/index.d.ts +1 -1
- package/lib/types/startup.d.ts +4 -2
- package/package.json +69 -59
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:
|
|
6
|
-
README.zh.md:
|
|
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-
|
|
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-
|
|
197
|
-
# it (ui-
|
|
198
|
-
- id: ui-
|
|
199
|
-
name: '@deepseek-ai/dsh-client-ui-
|
|
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-
|
|
202
|
-
name: '@deepseek-ai/dsh-client-ui-
|
|
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
|
|
211
|
-
- id: ui-
|
|
212
|
-
name: '@deepseek-ai/dsh-client-ui-
|
|
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-
|
|
233
|
-
name: '@deepseek-ai/dsh-client-ui-
|
|
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-
|
|
240
|
-
name: '@deepseek-ai/dsh-client-ui-
|
|
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
|
-
# `
|
|
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
|
-
|
|
266
|
-
|
|
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
|
|
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-
|
|
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-
|
|
290
|
-
# `skill-
|
|
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-
|
|
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-
|
|
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 `
|
|
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:
|
|
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-
|
|
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-
|
|
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:
|
|
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
|
-
#
|
|
379
|
-
#
|
|
380
|
-
#
|
|
381
|
-
#
|
|
382
|
-
#
|
|
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 = ["
|
|
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
|
|
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("
|
|
61
|
-
if (port === void 0) throw new Error("web-app:
|
|
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
|
|
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.
|
|
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(["
|
|
96
|
-
runtimeCtx.
|
|
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.
|
|
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("
|
|
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
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
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
|
|
50
|
-
|
|
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 };
|
package/lib/types/index.d.ts
CHANGED
|
@@ -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
|
|
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;
|
package/lib/types/startup.d.ts
CHANGED
|
@@ -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.
|
|
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-
|
|
49
|
-
"@deepseek-ai/dsh-
|
|
50
|
-
"@deepseek-ai/dsh-
|
|
51
|
-
"@deepseek-ai/dsh-client-
|
|
52
|
-
"@deepseek-ai/dsh-
|
|
53
|
-
"@deepseek-ai/dsh-
|
|
54
|
-
"@deepseek-ai/dsh-client-
|
|
55
|
-
"@deepseek-ai/dsh-client-
|
|
56
|
-
"@deepseek-ai/dsh-client-ui-
|
|
57
|
-
"@deepseek-ai/dsh-client-ui-
|
|
58
|
-
"@deepseek-ai/dsh-client-ui-deliverables": "^0.0.1-rc.
|
|
59
|
-
"@deepseek-ai/dsh-client-ui-
|
|
60
|
-
"@deepseek-ai/dsh-client-
|
|
61
|
-
"@deepseek-ai/dsh-client-ui-
|
|
62
|
-
"@deepseek-ai/dsh-client-ui-
|
|
63
|
-
"@deepseek-ai/dsh-client-ui-
|
|
64
|
-
"@deepseek-ai/dsh-client-ui-
|
|
65
|
-
"@deepseek-ai/dsh-client-ui-
|
|
66
|
-
"@deepseek-ai/dsh-client-ui-
|
|
67
|
-
"@deepseek-ai/dsh-client-ui-
|
|
68
|
-
"@deepseek-ai/dsh-client-ui-
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-
|
|
70
|
-
"@deepseek-ai/dsh-client-ui-
|
|
71
|
-
"@deepseek-ai/dsh-client-ui-
|
|
72
|
-
"@deepseek-ai/dsh-client-ui-
|
|
73
|
-
"@deepseek-ai/dsh-client-ui-
|
|
74
|
-
"@deepseek-ai/dsh-client-ui-
|
|
75
|
-
"@deepseek-ai/dsh-client-ui-
|
|
76
|
-
"@deepseek-ai/dsh-client-ui-
|
|
77
|
-
"@deepseek-ai/dsh-client-ui-
|
|
78
|
-
"@deepseek-ai/dsh-client-ui-
|
|
79
|
-
"@deepseek-ai/dsh-client-ui-
|
|
80
|
-
"@deepseek-ai/dsh-
|
|
81
|
-
"@deepseek-ai/dsh-
|
|
82
|
-
"@deepseek-ai/dsh-
|
|
83
|
-
"@deepseek-ai/dsh-
|
|
84
|
-
"@deepseek-ai/dsh-
|
|
85
|
-
"@deepseek-ai/dsh-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
"@deepseek-ai/dsh-host-
|
|
88
|
-
"@deepseek-ai/dsh-
|
|
89
|
-
"@deepseek-ai/dsh-
|
|
90
|
-
"@deepseek-ai/dsh-
|
|
91
|
-
"@deepseek-ai/dsh-
|
|
92
|
-
"@deepseek-ai/dsh-
|
|
93
|
-
"@deepseek-ai/dsh-
|
|
94
|
-
"@deepseek-ai/
|
|
95
|
-
"@deepseek-ai/dsh-
|
|
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/
|
|
99
|
-
"@deepseek-ai/dsh-
|
|
100
|
-
"@deepseek-ai/
|
|
101
|
-
"@deepseek-ai/dsh-
|
|
102
|
-
"@deepseek-ai/cordis": "^
|
|
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.
|
|
106
|
-
"@deepseek-ai/dsh-
|
|
107
|
-
"@deepseek-ai/
|
|
108
|
-
"@deepseek-ai/dsh-
|
|
109
|
-
"@deepseek-ai/
|
|
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
|
}
|