@monotykamary/dsh-web-app 0.1.0-rc.8 → 0.1.0

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: 1668165410046616ced0502549d71e883a5caecd
6
- README.zh.md: 6fdb89947cd95f1523931661ffd5572ebb62abe8
5
+ README.md: 5d483f25639fcfb8a46906f5657dd98637a13701
6
+ README.zh.md: d2e38df708c17842276435c790006f66c9e72e5c
package/README.md CHANGED
@@ -2,7 +2,10 @@
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, tailnet, portless}`). That plugin resolves the built frontend dist through `@monotykamary/dsh-web-frontend`'s exports, samples bind-dependent LAN trust once, resolves the enabled remote surfaces after the Loader tree settles (`--tailnet`: the tailscale serve DNS name; `--portless`: the `dsh.localhost` HTTPS alias) and adds their derived host authorities to the `/api` browser-trust fence through `ctx.connection.addTrustedAuthority`, provides the snapshot as `webRuntime` to the 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. The line always leads with the canonical `http://127.0.0.1:<port>` (supervisors parse that prefix) and appends `LAN`, `tailnet`, and `portless` entries as they resolve. 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`, `--tailnet`, `--portless`, and the app's `--help`, then provides `webStartup`. It rejects `--host 0.0.0.0` before publishing that service because the CLI intentionally does not support all-interfaces binding yet. `--tailnet` probes `tailscale serve status` for an HTTPS front of the bound port and `tailscale status` for the node DNS name, then trusts and announces `https://<node>.ts.net`; `--portless` registers the `dsh` alias (`portless alias dsh <port> --force`) and, while the proxy serves loopback `:443`, trusts and announces `https://dsh.localhost`. Missing tooling or an unmatched route logs a warning and leaves that surface off. 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.
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, tailnet, portless}`). That plugin resolves the built frontend dist through `@monotykamary/dsh-web-frontend`'s exports, samples bind-dependent LAN trust once, resolves the enabled remote surfaces after the Loader tree settles (`--tailnet`: the tailscale serve DNS name; `--portless`: the `dsh.localhost` HTTPS alias) and adds their derived host authorities to the `/api` browser-trust fence through `ctx.connection.addTrustedAuthority`, provides the snapshot as `webRuntime` to the 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. The line always leads with the canonical `http://127.0.0.1:<port>` (supervisors parse that prefix) and appends `LAN`, `tailnet`, and `portless` entries as they resolve. 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`, `--tailnet`, `--portless`, and the app's `--help`, then provides `webStartup`. It rejects `--host 0.0.0.0` before publishing that service because the CLI intentionally does not support all-interfaces binding yet. `--tailnet` probes `tailscale serve status` for an HTTPS front of the bound port and `tailscale status` for the node DNS name, then trusts and announces `https://<node>.ts.net`; `--portless` runs the bundled, installation-owned portless CLI to register the `dsh` alias and, while the proxy serves loopback `:443`, trusts and announces `https://dsh.localhost`; `dsh portless setup` explicitly installs and starts its privileged HTTPS service. Tailscale remains an external, operator-managed CLI and daemon. Missing service state, tooling, or an unmatched route logs a warning and leaves that surface off. 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. 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 `@monotykamary/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 hands a URL to the default browser when `openBrowser` is true and the inherited `SSH_CONNECTION` and `SSH_TTY` are blank or absent. A successfully resolved `--portless` launch opens `https://dsh.localhost`; other launches open the canonical host URL. 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.
6
+
7
+ ## Model retry defaults
8
+ 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.
6
9
 
7
10
  ## Model Experience
8
11
 
@@ -24,3 +27,6 @@ The prompt section sits near the system prompt's head and is stable for the life
24
27
 
25
28
  - **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.
26
29
  - **`lanAddresses` is a boot-time snapshot** — interface changes after boot are not re-advertised; the printed LAN URL always matches the configured trust fence.
30
+ - **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.
31
+ - **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.
32
+ - **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.
package/README.zh.md CHANGED
@@ -2,7 +2,10 @@
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, tailnet, portless}`)。该插件通过 `@monotykamary/dsh-web-frontend` 的 exports 解析已构建的前端 dist,只采样一次依赖 bind 的 LAN 信任信息,在 Loader 配置树结算后解析已启用的远程表层(`--tailnet`:tailscale serve 的 DNS 名;`--portless`:`dsh.localhost` HTTPS 别名),通过 `ctx.connection.addTrustedAuthority` 把派生出的主机权威加入 `/api` 浏览器信任栅栏,将快照作为 `webRuntime` 提供给栅栏和客户端名录,挂载 [`frontend-static`](../../host/frontend-static/README.md) 回退席位所有者,在 `surfaceContext` 为 true 时注册 Harness 源码与 Web 表层提示词段落,以及 bash 可见的 `DSH_WEB_URL` 运行时变量,并在 `printUrl` 为 true 时等自身的 Loader 配置树结算后再打印 `dsh web:` URL 行,避免兄弟行失败时公告一个已失效的应用。该行始终以规范的 `http://127.0.0.1:<port>` 开头(监控程序解析此前缀),并随解析结果追加 `LAN`、`tailnet`、`portless` 条目。本组合包还持有应用命令行:普通 `web-startup` 提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.md)),解析 `--host`、`--port`、可重复的 `--trusted-host`、`--tailnet`、`--portless` 以及应用自己的 `--help`,再提供 `webStartup`。它会在发布该服务前拒绝 `--host 0.0.0.0`,因为 CLI 目前有意不支持绑定所有网络接口。`--tailnet` 探测 `tailscale serve status` 中绑定端口的 HTTPS 前端,并用 `tailscale status` 取节点 DNS 名,然后信任并公告 `https://<node>.ts.net`;`--portless` 注册 `dsh` 别名(`portless alias dsh <port> --force`),并在代理于回环 `:443` 上服务时信任并公告 `https://dsh.localhost`。工具缺失或路由不匹配会在启动日志打印警告并保持该表层关闭。由 flag 配置的行会注入该服务,并在惰性配置中直接读取它,因此参数解析完成前不会有任何东西绑定端口,`dsh --profile web --help` 也不会启动服务器。[`dsh-headless`](../headless/README.md) 是同一 base 之上的同级表层,不挂载本组合包。
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` 粘合插件(配置为 `{printUrl, surfaceContext, trustedHosts, tailnet, portless}`)。该插件通过 `@monotykamary/dsh-web-frontend` 的 exports 解析已构建的前端 dist,只采样一次依赖 bind 的 LAN 信任信息,在 Loader 配置树结算后解析已启用的远程表层(`--tailnet`:tailscale serve 的 DNS 名;`--portless`:`dsh.localhost` HTTPS 别名),通过 `ctx.connection.addTrustedAuthority` 把派生出的主机权威加入 `/api` 浏览器信任栅栏,将快照作为 `webRuntime` 提供给栅栏和客户端名录,挂载 [`frontend-static`](../../host/frontend-static/README.zh.md) 回退席位所有者,在 `surfaceContext` 为 true 时注册 Harness 源码与 Web 表层提示词段落,以及 bash 可见的 `DSH_WEB_URL` 运行时变量,并在 `printUrl` 为 true 时等自身的 Loader 配置树结算后再打印 `dsh web:` URL 行,避免兄弟行失败时公告一个已失效的应用。该行始终以规范的 `http://127.0.0.1:<port>` 开头(监控程序解析此前缀),并随解析结果追加 `LAN`、`tailnet`、`portless` 条目。本组合包还持有应用命令行:普通 `web-startup` 提供方([`src/startup.ts`](src/startup.ts))注入 `ctx.cmdlineArgs`([`dsh-cmdline`](../../boot/cmdline/README.zh.md)),解析 `--host`、`--port`、可重复的 `--trusted-host`、`--tailnet`、`--portless` 以及应用自己的 `--help`,再提供 `webStartup`。它会在发布该服务前拒绝 `--host 0.0.0.0`,因为 CLI 目前有意不支持绑定所有网络接口。`--tailnet` 探测 `tailscale serve status` 中绑定端口的 HTTPS 前端,并用 `tailscale status` 取节点 DNS 名,然后信任并公告 `https://<node>.ts.net`;`--portless` 运行随安装提供的 portless CLI 来注册 `dsh` 别名,并在代理于回环 `:443` 上服务时信任并公告 `https://dsh.localhost`;`dsh portless setup` 会明确安装并启动需要权限的 HTTPS 服务。Tailscale 仍是由操作员管理的外部 CLI 与守护进程。服务状态或工具缺失、路由不匹配时会在启动日志打印警告并保持该表层关闭。由 flag 配置的行会注入该服务,并在惰性配置中直接读取它,因此参数解析完成前不会有任何东西绑定端口,`dsh --profile web --help` 也不会启动服务器。[`dsh-headless`](../headless/README.zh.md) 是同一 base 之上的同级表层,不挂载本组合包。 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}`)。该插件通过 `@monotykamary/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 交给默认浏览器。成功解析 `--portless` 时会打开 `https://dsh.localhost`,其他启动则打开规范宿主机 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 之上的同级表层,不挂载本组合包。
6
+
7
+ ## 模型重试默认值
8
+ Web 使用共享的有界 normal 默认值,在首次请求后最多再重试五次符合条件的失败。`deepseek-official` 与由 settings 新增的 pi-ai 路由在省略 `retryPolicy` 时使用该默认值;显式提供方策略仍然优先。Web 不再增加重试专用的组合覆盖,因此非 Web profile 的省略行为与之相同。
6
9
 
7
10
  ## 模型体验
8
11
 
@@ -24,3 +27,6 @@ dsh 浏览器表层组合包。[`cordis.patch.yml`](cordis.patch.yml) 叠加在
24
27
 
25
28
  - **前端 dist 必须已构建**:对 dist 的 `require.resolve` 在激活时明确报错并给出构建提示;没有从源码直接服务的回退路径。
26
29
  - **`lanAddresses` 是启动期快照**:启动后的网卡变化不会重新公告;打印的 LAN URL 始终与配置的信任栅栏一致。
30
+ - **只观测交接启动**:平台 opener 接受 spawn 后即结束观察,但 Windows 会等待其短生命周期 PowerShell launcher 退出;之后的浏览器退出不会上报,已打印 URL 仍是手动访问的回退路径。
31
+ - **SSH 转发持有浏览器 URL**:打印出的规范 URL 指向远端宿主机 loopback 端点;自动交接会被跳过,SSH 客户端或编辑器必须暴露并打开其本地转发地址。
32
+ - **浏览器命令覆盖只能来自启动环境**:被发现的 `.env` 不得设置 `BROWSER`;只有继承值可以抵达会读取该变量的 opener 路径,避免 checkout 为自动交接选择可执行文件。
package/cordis.patch.yml CHANGED
@@ -32,13 +32,12 @@
32
32
  path: ':memory:'
33
33
  openAt: never
34
34
 
35
- - id: tools
36
- 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
39
- # designed; unset keeps the schema default (native). Remove the env seam
40
- # once the web UI owns the choice per session.
41
- mode: !!js process.env.DSH_TOOLS_MODE
35
+ # DSH_TOOLS_MODE (native|code|both) opts a whole dsh process into Code Mode
36
+ # while per-session tool-presentation selection is being designed; unset keeps
37
+ # the schema default (native). The dsh launcher applies the selection ABOVE
38
+ # every bundle layer (apps/cli/src/profile-boot.ts), so a custom-flavor bundle
39
+ # restating the tools row cannot silently drop it; remove that launcher seam
40
+ # once the web UI owns the choice per session.
42
41
 
43
42
  # ── web-only host rows, the transport layer, and the browser roster ─────────
44
43
 
@@ -79,6 +78,12 @@
79
78
  writeEveryEvents: 200
80
79
  writeIntervalMs: 5000
81
80
 
81
+ - id: session-reference
82
+ name: '@monotykamary/dsh-session-reference'
83
+
84
+ - id: file-reference-local
85
+ name: '@monotykamary/dsh-file-reference-local'
86
+
82
87
  # Whole-log turn/step counts for the chat stats strip (the sessionStats
83
88
  # projection key); the projection registry itself is a base-layer row.
84
89
  - id: session-stats
@@ -94,6 +99,13 @@
94
99
  - id: plugin-inventory
95
100
  name: '@monotykamary/dsh-host-plugin-inventory'
96
101
 
102
+ # Cached registry checks and channel-aware detached updates. The launcher
103
+ # replaces appManifest with its installation anchor before composition.
104
+ - id: distribution-update
105
+ name: '@monotykamary/dsh-distribution-update'
106
+ config:
107
+ appManifest: package.json
108
+
97
109
  # Session-authorized file tree, bounded reads, and guarded edits over each Agent's selected fs provider.
98
110
  - id: workspace-files
99
111
  name: '@monotykamary/dsh-host-workspace-files'
@@ -126,15 +138,18 @@
126
138
  # Web glue owned by this bundle: resolves the built frontend dist (an
127
139
  # assembly fact of dsh-web-app, never user config), mounts the
128
140
  # frontend-static fallback owner, registers the web-surface prompt
129
- # section and the bash runtime variable, and prints the URL line. The
130
- # webStartup provider supplies invocation-only values; after the server
131
- # binds, this row samples LAN trust once, resolves the enabled remote surfaces (tailnet/portless) when the tree settles, and provides `webRuntime`. A
132
- # complete agent-preset persona suppresses the prompt section for that
133
- # agent while retaining the host-owned shell variable.
141
+ # section and the bash runtime variable, prints the URL line, and opens the
142
+ # canonical local URL after the full tree settles. The webStartup provider
143
+ # supplies invocation-only values; after the server binds, this row samples
144
+ # LAN trust once, resolves the enabled remote surfaces (tailnet/portless)
145
+ # when the tree settles, and provides `webRuntime`. A complete agent-preset
146
+ # persona suppresses the prompt section for that agent while retaining the
147
+ # host-owned shell variable.
134
148
  - id: web-runtime
135
149
  name: '@monotykamary/dsh-web-app'
136
150
  inject: [webStartup]
137
151
  config:
152
+ openBrowser: !!js ctx.webStartup.openBrowser
138
153
  printUrl: true
139
154
  surfaceContext: true
140
155
  trustedHosts: !!js ctx.webStartup.trustedHosts
@@ -201,6 +216,9 @@
201
216
  - id: ui-layout
202
217
  name: '@monotykamary/dsh-client-ui-layout'
203
218
 
219
+ - id: ui-renderer
220
+ name: '@monotykamary/dsh-client-ui-renderer'
221
+
204
222
  - id: ui-workbench
205
223
  name: '@monotykamary/dsh-client-ui-workbench'
206
224
 
@@ -228,9 +246,19 @@
228
246
  - id: ui-settings-plugin-inventory
229
247
  name: '@monotykamary/dsh-client-ui-settings-plugin-inventory'
230
248
 
249
+ - id: ui-settings-updates
250
+ name: '@monotykamary/dsh-client-ui-settings-updates'
251
+
231
252
  - id: ui-conversation
232
253
  name: '@monotykamary/dsh-client-ui-conversation'
233
254
 
255
+ # Official occupants for the generic sidebar and conversation brand slots.
256
+ - id: ui-brand-official
257
+ name: '@monotykamary/dsh-client-ui-brand-official'
258
+
259
+ - id: ui-attachment
260
+ name: '@monotykamary/dsh-client-ui-attachment'
261
+
234
262
  # Tool call tree, generic fallback, and keyed business Tool views.
235
263
  - id: ui-tool
236
264
  name: '@monotykamary/dsh-client-ui-tool'
@@ -248,6 +276,13 @@
248
276
  - id: ui-deliverables
249
277
  name: '@monotykamary/dsh-client-ui-deliverables'
250
278
 
279
+ # Bounded current-Session receipt reader paired with the Web Changes UI.
280
+ - id: tool-session-mutations
281
+ name: '@monotykamary/dsh-tool-session-mutations'
282
+ config:
283
+ maxListItems: 50
284
+ maxDiffChars: 12000
285
+
251
286
 
252
287
  - id: ui-workspace
253
288
  name: '@monotykamary/dsh-client-ui-workspace'
@@ -256,7 +291,7 @@
256
291
  autoSettleAfterDays: 3
257
292
 
258
293
  # Input triggers: the '/' | '@' pipeline (ui-input-trigger), the command surface over
259
- # it (ui-commands), and the two reference sources (ui-skill / ui-subagent).
294
+ # it (ui-commands), and the reference sources (ui-skill / ui-reference).
260
295
  - id: ui-input-trigger
261
296
  name: '@monotykamary/dsh-client-ui-input-trigger'
262
297
 
@@ -269,6 +304,9 @@
269
304
  - id: ui-subagent
270
305
  name: '@monotykamary/dsh-client-ui-subagent'
271
306
 
307
+ - id: ui-reference
308
+ name: '@monotykamary/dsh-client-ui-reference'
309
+
272
310
  # Background jobs: the session-header list over the jobsBySession mirror.
273
311
  - id: ui-jobs
274
312
  name: '@monotykamary/dsh-client-ui-jobs'
package/lib/index.js CHANGED
@@ -1,10 +1,13 @@
1
+ import { portlessCliPath } from "./portless.js";
1
2
  import { createRequire } from "node:module";
3
+ import { execFile, spawn } from "node:child_process";
2
4
  import { networkInterfaces } from "node:os";
3
5
  import { fileURLToPath } from "node:url";
4
6
  import z from "@monotykamary/schemastery";
5
7
  import { addHarnessSourceSection } from "@monotykamary/dsh-app-boot";
6
8
  import * as FrontendStatic from "@monotykamary/dsh-host-frontend-static";
7
- import { execFile } from "node:child_process";
9
+ import { launchEnvironmentOf } from "@monotykamary/dsh-launch-environment";
10
+ import { scrubbedParentEnv } from "@monotykamary/dsh-subprocess";
8
11
  import { createConnection } from "node:net";
9
12
  import { promisify } from "node:util";
10
13
  //#region lib/types/surfaces.js
@@ -129,17 +132,18 @@ async function resolveTailnetSurface(port, exec) {
129
132
  */
130
133
  async function resolvePortlessSurface(port, exec, probe) {
131
134
  try {
132
- await exec("portless", [
135
+ await exec(process.execPath, [
136
+ portlessCliPath(),
133
137
  "alias",
134
138
  PORTLESS_ALIAS_NAME,
135
139
  String(port),
136
140
  "--force"
137
141
  ]);
138
142
  } catch (error) {
139
- if (isEnoent(error)) return { warning: "portless not installed — install from https://www.npmjs.com/package/portless for named localhost URLs" };
143
+ if (isEnoent(error)) return { warning: "bundled portless CLI is unavailable — reinstall DSH, then run `dsh portless setup`" };
140
144
  return { warning: `portless alias registration failed: ${errorText(error)}` };
141
145
  }
142
- if (!(await Promise.all([probe("127.0.0.1", PORTLESS_PROXY_PORT), probe("::1", PORTLESS_PROXY_PORT)])).some(Boolean)) return { warning: "portless proxy not running on :443 — run `portless service install` for named localhost URLs" };
146
+ if (!(await Promise.all([probe("127.0.0.1", PORTLESS_PROXY_PORT), probe("::1", PORTLESS_PROXY_PORT)])).some(Boolean)) return { warning: "portless proxy not running on :443 — run `dsh portless setup` for named localhost URLs" };
143
147
  return { surface: {
144
148
  url: `https://${PORTLESS_ALIAS_NAME}.localhost`,
145
149
  authority: `${PORTLESS_ALIAS_NAME}.localhost`
@@ -177,8 +181,9 @@ async function resolveRemoteSurfaces(port, tailnet, portless, options = {}) {
177
181
  * the built frontend dist (workspace knowledge of this bundle, never user
178
182
  * config), mounts the `frontend-static` fallback owner over it, registers the
179
183
  * harness-source and web-surface prompt sections, the bash-visible web runtime
180
- * variable, and the URL line. App command-line values arrive through the
181
- * `webStartup` service expressions in the bundle patch.
184
+ * variable, the URL line, and the default-browser handoff. App command-line
185
+ * values arrive through the `webStartup` service expressions in the bundle
186
+ * patch.
182
187
  * @module @monotykamary/dsh-web-app
183
188
  */
184
189
  /** Stable Cordis plugin name. */
@@ -190,6 +195,7 @@ const WEB_RUNTIME_SERVICE = "webRuntime";
190
195
  /** Services required before the web runtime can mount. */
191
196
  const inject = ["webServer"];
192
197
  const Config = z.object({
198
+ openBrowser: z.boolean().default(true),
193
199
  printUrl: z.boolean().default(true),
194
200
  surfaceContext: z.boolean().default(true),
195
201
  trustedHosts: z.array(String).default([]),
@@ -201,6 +207,43 @@ const DSH_WEB_URL = "DSH_WEB_URL";
201
207
  const LOOPBACK_HOST = "127.0.0.1";
202
208
  /** The webserver schema's all-interfaces bind literal. */
203
209
  const ALL_INTERFACES_HOST = "0.0.0.0";
210
+ /** Whether this process was launched through SSH, including a forwarded-port session. */
211
+ function launchedThroughSsh(ctx) {
212
+ const environment = launchEnvironmentOf(ctx);
213
+ return ["SSH_CONNECTION", "SSH_TTY"].some((name) => {
214
+ const value = environment.getFrom(name, ["process"])?.value;
215
+ return value !== void 0 && value !== "";
216
+ });
217
+ }
218
+ const BROWSER_OPENER_MODULE = import.meta.resolve("open");
219
+ const BROWSER_OPENER_PROGRAM = `
220
+ try {
221
+ const { default: open } = await import(${JSON.stringify(BROWSER_OPENER_MODULE)})
222
+ const launcher = await open(process.argv[1])
223
+ if (process.platform === 'win32') {
224
+ // open resolves at PowerShell spawn; keep it referenced until that launcher hands the URL to Windows.
225
+ const code = launcher.exitCode ?? await new Promise((resolve, reject) => {
226
+ function onError(error) {
227
+ launcher.off('close', onClose)
228
+ reject(error)
229
+ }
230
+ function onClose(code) {
231
+ launcher.off('error', onError)
232
+ resolve(code)
233
+ }
234
+ launcher.ref()
235
+ launcher.once('error', onError)
236
+ launcher.once('close', onClose)
237
+ })
238
+ if (code !== 0) throw new Error('browser operating-system launcher exited with code ' + String(code))
239
+ }
240
+ process.exitCode = 0
241
+ } catch (error) {
242
+ // The parent turns this exit into the manual-URL warning.
243
+ console.error(error)
244
+ process.exitCode = 1
245
+ }
246
+ `;
204
247
  /**
205
248
  * Resolve one LAN-trust snapshot from the active server bind.
206
249
  *
@@ -238,13 +281,64 @@ function resolveDistIndex() {
238
281
  throw new Error("web-app: frontend dist not built; run pnpm run build from the repository root first");
239
282
  }
240
283
  }
284
+ /** Start the maintained platform opener without forwarding Harness credentials. */
285
+ function spawnBrowserLauncher(url) {
286
+ return spawn(process.execPath, [
287
+ "--input-type=module",
288
+ "--eval",
289
+ BROWSER_OPENER_PROGRAM,
290
+ "--",
291
+ url
292
+ ], {
293
+ env: scrubbedParentEnv(),
294
+ stdio: [
295
+ "ignore",
296
+ "inherit",
297
+ "pipe"
298
+ ]
299
+ });
300
+ }
301
+ /** Hand one URL to the operating system's default browser. */
302
+ async function openBrowser(url) {
303
+ const launcher = spawnBrowserLauncher(url);
304
+ let launcherStderr = "";
305
+ launcher.stderr?.setEncoding("utf8");
306
+ launcher.stderr?.on("data", (chunk) => {
307
+ launcherStderr += chunk;
308
+ });
309
+ await new Promise((resolve, reject) => {
310
+ function onError(error) {
311
+ launcher.off("close", onClose);
312
+ reject(error);
313
+ }
314
+ function onClose(code) {
315
+ launcher.off("error", onError);
316
+ if (code !== 0) {
317
+ const firstLine = launcherStderr.trim().split(/\r?\n/u)[0];
318
+ const reason = firstLine === void 0 || firstLine === "" ? `browser launcher exited with code ${String(code)}` : firstLine.replace(/^(?:[A-Za-z]*Error):\s*/u, "");
319
+ reject(new Error(reason));
320
+ return;
321
+ }
322
+ if (launcherStderr !== "") process.stderr.write(launcherStderr);
323
+ resolve();
324
+ }
325
+ launcher.once("error", onError);
326
+ launcher.once("close", onClose);
327
+ });
328
+ }
329
+ /** Test hooks for the built dist and native browser handoff; production never mutates them. */
330
+ /**
331
+ * Test hooks: hosts with no built frontend dist substitute the dist resolver;
332
+ * surface tests substitute the prober. Production never touches these.
333
+ */
241
334
  /**
242
335
  * Test hooks: hosts with no built frontend dist substitute the dist resolver;
243
336
  * surface tests substitute the prober. Production never touches these.
244
337
  */
245
338
  const internals = {
246
339
  resolveDistIndex,
247
- resolveSurfaces: resolveRemoteSurfaces
340
+ resolveSurfaces: resolveRemoteSurfaces,
341
+ openBrowser
248
342
  };
249
343
  /**
250
344
  * Resolve the enabled remote surfaces once per boot and publish their
@@ -290,12 +384,13 @@ function printUrl(ctx, runtime, resolution) {
290
384
  }
291
385
  /**
292
386
  * Mount the Web runtime: dist serving, surface prompt, the bash runtime
293
- * variable, and the URL line.
387
+ * variable, the URL line, and the default-browser handoff.
294
388
  * @param ctx - plugin context carrying the webServer service.
295
389
  * @param config - validated {@link Config}.
296
390
  */
297
391
  function apply(ctx, config) {
298
392
  const runtime = resolveLanTrust(ctx.webServer.host, config.trustedHosts);
393
+ const handoffBrowser = config.openBrowser && !launchedThroughSsh(ctx);
299
394
  ctx.provide(WEB_RUNTIME_SERVICE, runtime);
300
395
  ctx.plugin(FrontendStatic, { distIndex: internals.resolveDistIndex() });
301
396
  if (config.surfaceContext) {
@@ -315,15 +410,26 @@ function apply(ctx, config) {
315
410
  });
316
411
  });
317
412
  }
318
- const settled = ctx.get("loader")?.await();
319
- const afterSettlement = async () => {
320
- if (ctx.get("webServer") === void 0) return;
321
- const resolution = await settleSurfaces(ctx, config);
322
- for (const warning of resolution.warnings) ctx.logger.warn(warning);
323
- if (config.printUrl) printUrl(ctx, runtime, resolution);
324
- };
325
- if (settled === void 0) afterSettlement();
326
- else settled.then(afterSettlement, () => {});
413
+ if (config.printUrl || handoffBrowser || config.tailnet || config.portless) {
414
+ const settled = ctx.get("loader")?.await();
415
+ const afterSettlement = async () => {
416
+ if (ctx.get("webServer") === void 0) return;
417
+ const localUrl = localWebUrl(ctx);
418
+ const resolution = await settleSurfaces(ctx, config);
419
+ for (const warning of resolution.warnings) ctx.logger.warn(warning);
420
+ if (config.printUrl) printUrl(ctx, runtime, resolution);
421
+ if (handoffBrowser) {
422
+ const browserUrl = resolution.portless?.url ?? localUrl;
423
+ console.log("dsh web: opening the default browser; pass --no-open to disable");
424
+ internals.openBrowser(browserUrl).catch((error) => {
425
+ const reason = error instanceof Error ? error.message : String(error);
426
+ console.error(`web-app: could not open the default browser because ${reason}; visit ${browserUrl} manually`);
427
+ });
428
+ }
429
+ };
430
+ if (settled === void 0) afterSettlement();
431
+ else settled.then(afterSettlement, () => {});
432
+ }
327
433
  }
328
434
  //#endregion
329
435
  export { Config, apply, inject, internals, name, resolveLanTrust };
@@ -0,0 +1,32 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import { dirname, join } from "node:path";
4
+ //#region lib/types/portless.js
5
+ /** Installation-owned portless CLI resolution and explicit service provisioning. */
6
+ /**
7
+ * Resolve the portless CLI bundled with this Web app package.
8
+ * @returns its absolute JavaScript entry path.
9
+ */
10
+ function portlessCliPath() {
11
+ return join(dirname(fileURLToPath(import.meta.resolve("portless"))), "cli.js");
12
+ }
13
+ /** Test hook for the child-process boundary; production never mutates it. */
14
+ const internals = { spawn: spawnSync };
15
+ /**
16
+ * Run the installation-owned portless CLI with inherited interactive stdio.
17
+ * @param args - portless arguments after the executable name.
18
+ * @returns the child exit code, normalized to one for spawn or signal failure.
19
+ */
20
+ function runPortlessCli(args) {
21
+ const result = internals.spawn(process.execPath, [portlessCliPath(), ...args], {
22
+ stdio: "inherit",
23
+ env: process.env
24
+ });
25
+ if (result.error !== void 0) {
26
+ process.stderr.write(`dsh: could not start the bundled portless CLI: ${result.error.message}\n`);
27
+ return 1;
28
+ }
29
+ return result.status ?? 1;
30
+ }
31
+ //#endregion
32
+ export { internals, portlessCliPath, runPortlessCli };
package/lib/startup.js CHANGED
@@ -4,9 +4,9 @@ import { parseCmdline } from "@monotykamary/dsh-cmdline";
4
4
  /**
5
5
  * The web app's command-line provider: it parses the `dsh --profile web` flag
6
6
  * family (`--host`, `--port`, `--trusted-host`, `--tailnet`,
7
- * `--portless`) and its `--help` text, then provides the immutable values
8
- * as {@link WEB_STARTUP_SERVICE}. Ordinary rows inject that service before
9
- * reading it from lazy config.
7
+ * `--portless`, `--no-open`) and its `--help` text, then provides the
8
+ * immutable values as {@link WEB_STARTUP_SERVICE}. Ordinary rows inject that
9
+ * service before reading it from lazy config.
10
10
  * @module @monotykamary/dsh-web-app/startup
11
11
  */
12
12
  /** Stable Cordis plugin name. */
@@ -20,9 +20,10 @@ const WEB_STARTUP_SERVICE = "webStartup";
20
20
  * @returns a fresh program, so one process can parse more than once (tests).
21
21
  */
22
22
  function webCommand() {
23
- return new Command().name("dsh --profile web").description("Serve the DeepSeek Harness browser UI.").helpOption("-h, --help", "show this help").option("--host <host>", "bind host").option("--port <port>", "listen port; pass 0 to let the OS pick a free one").option("--trusted-host <authority...>", "extra authority the /api browser-trust fence accepts (host or host:port; repeatable)").option("--tailnet", "resolve the tailscale serve surface: trust its DNS name and announce its URL").option("--portless", "resolve the portless HTTPS surface: register the dsh alias, trust dsh.localhost, and announce it").option("--identity <provider>", "identity provider: header (trust a reverse proxy) or passkey (WebAuthn)").option("--identity-header <name>", "identity header the trusted proxy sets (default x-forwarded-user)").option("--identity-trusted-proxy <spec>", "source allowlist for the identity header: loopback (default), private, a CIDR, or an address").option("--identity-registration <policy>", "passkey registration: open (default) or closed").option("--identity-rp-name <name>", "passkey relying-party display name (default dsh)").addHelpText("after", `
23
+ return new Command().name("dsh --profile web").description("Serve the DeepSeek Harness browser UI.").helpOption("-h, --help", "show this help").option("--host <host>", "bind host").option("--no-open", "do not open the Web UI in the default browser").option("--port <port>", "listen port; pass 0 to let the OS pick a free one").option("--trusted-host <authority...>", "extra authority the /api browser-trust fence accepts (host or host:port; repeatable)").option("--tailnet", "resolve the tailscale serve surface: trust its DNS name and announce its URL").option("--portless", "resolve the portless HTTPS surface: register the dsh alias, trust dsh.localhost, and announce it").option("--identity <provider>", "identity provider: header (trust a reverse proxy) or passkey (WebAuthn)").option("--identity-header <name>", "identity header the trusted proxy sets (default x-forwarded-user)").option("--identity-trusted-proxy <spec>", "source allowlist for the identity header: loopback (default), private, a CIDR, or an address").option("--identity-registration <policy>", "passkey registration: open (default) or closed").option("--identity-rp-name <name>", "passkey relying-party display name (default dsh)").addHelpText("after", `
24
24
  Examples:
25
25
  dsh --profile web serve on the composed host and port
26
+ dsh --profile web --no-open serve without opening a browser
26
27
  dsh --profile web --port 8080 serve on another port
27
28
  dsh --profile web --tailnet announce and trust https://<node>.ts.net
28
29
  dsh --profile web --identity header partition sessions by a proxy-set x-forwarded-user
@@ -52,6 +53,7 @@ function apply(ctx) {
52
53
  ...options.identityRpName !== void 0 && { rpName: options.identityRpName }
53
54
  } : void 0;
54
55
  ctx.provide(WEB_STARTUP_SERVICE, {
56
+ openBrowser: options.open,
55
57
  ...options.host !== void 0 && { host: options.host },
56
58
  ...options.port !== void 0 && { port: Number(options.port) },
57
59
  trustedHosts: options.trustedHost ?? [],
@@ -5,8 +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, and the URL line. App command-line values arrive through the
9
- * `webStartup` service expressions in the bundle patch.
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.
10
11
  * @module @monotykamary/dsh-web-app
11
12
  */
12
13
  import type { Context } from '@monotykamary/cordis';
@@ -18,6 +19,8 @@ export declare const name = "web-app";
18
19
  export declare const inject: string[];
19
20
  /** Plugin config: composed deployment settings plus per-invocation command-line values. */
20
21
  export interface Config {
22
+ /** Permit default-browser handoff after the Loader tree settles; an SSH launch suppresses it. */
23
+ openBrowser: boolean;
21
24
  /** Print the URL line on activation; a non-interactive layer can turn it off. */
22
25
  printUrl: boolean;
23
26
  /**
@@ -53,6 +56,11 @@ export interface WebRuntimeValues {
53
56
  * @returns the LAN display addresses and invocation-derived fence authorities.
54
57
  */
55
58
  export declare function resolveLanTrust(bindHost: string, extra: readonly string[]): WebRuntimeValues;
59
+ /** Test hooks for the built dist and native browser handoff; production never mutates them. */
60
+ /**
61
+ * Test hooks: hosts with no built frontend dist substitute the dist resolver;
62
+ * surface tests substitute the prober. Production never touches these.
63
+ */
56
64
  /**
57
65
  * Test hooks: hosts with no built frontend dist substitute the dist resolver;
58
66
  * surface tests substitute the prober. Production never touches these.
@@ -60,10 +68,11 @@ export declare function resolveLanTrust(bindHost: string, extra: readonly string
60
68
  export declare const internals: {
61
69
  resolveDistIndex: () => string;
62
70
  resolveSurfaces: (port: number, tailnet: boolean, portless: boolean) => Promise<SurfaceResolution>;
71
+ openBrowser: (url: string) => Promise<void>;
63
72
  };
64
73
  /**
65
74
  * Mount the Web runtime: dist serving, surface prompt, the bash runtime
66
- * variable, and the URL line.
75
+ * variable, the URL line, and the default-browser handoff.
67
76
  * @param ctx - plugin context carrying the webServer service.
68
77
  * @param config - validated {@link Config}.
69
78
  */
@@ -0,0 +1,21 @@
1
+ /** Installation-owned portless CLI resolution and explicit service provisioning. */
2
+ import { type SpawnSyncReturns } from 'node:child_process';
3
+ /**
4
+ * Resolve the portless CLI bundled with this Web app package.
5
+ * @returns its absolute JavaScript entry path.
6
+ */
7
+ export declare function portlessCliPath(): string;
8
+ /** Test hook for the child-process boundary; production never mutates it. */
9
+ export declare const internals: {
10
+ spawn: (command: string, args: readonly string[], options: {
11
+ stdio: 'inherit';
12
+ env: NodeJS.ProcessEnv;
13
+ }) => SpawnSyncReturns<Buffer>;
14
+ };
15
+ /**
16
+ * Run the installation-owned portless CLI with inherited interactive stdio.
17
+ * @param args - portless arguments after the executable name.
18
+ * @returns the child exit code, normalized to one for spawn or signal failure.
19
+ */
20
+ export declare function runPortlessCli(args: readonly string[]): number;
21
+ //# sourceMappingURL=portless.d.ts.map
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * The web app's command-line provider: it parses the `dsh --profile web` flag
3
3
  * family (`--host`, `--port`, `--trusted-host`, `--tailnet`,
4
- * `--portless`) and its `--help` text, then provides the immutable values
5
- * as {@link WEB_STARTUP_SERVICE}. Ordinary rows inject that service before
6
- * reading it from lazy config.
4
+ * `--portless`, `--no-open`) and its `--help` text, then provides the
5
+ * immutable values as {@link WEB_STARTUP_SERVICE}. Ordinary rows inject that
6
+ * service before reading it from lazy config.
7
7
  * @module @monotykamary/dsh-web-app/startup
8
8
  */
9
9
  import type { Context } from '@monotykamary/cordis';
@@ -15,6 +15,8 @@ export declare const inject: string[];
15
15
  export declare const WEB_STARTUP_SERVICE = "webStartup";
16
16
  /** What the web rows read from {@link WEB_STARTUP_SERVICE}. */
17
17
  export interface WebStartupValues {
18
+ /** Whether this invocation opens the default browser after startup. */
19
+ openBrowser: boolean;
18
20
  /** `--host`, absent when the invocation did not name one. */
19
21
  host?: string;
20
22
  /** `--port`, absent when the invocation did not name one. */
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@monotykamary/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.0-rc.8",
4
+ "version": "0.1.0",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -22,6 +22,10 @@
22
22
  "types": "./lib/types/startup.d.ts",
23
23
  "default": "./lib/startup.js"
24
24
  },
25
+ "./portless": {
26
+ "types": "./lib/types/portless.d.ts",
27
+ "default": "./lib/portless.js"
28
+ },
25
29
  "./invariant": {
26
30
  "types": "./lib/types/invariant.d.ts",
27
31
  "default": "./lib/invariant.js"
@@ -35,6 +39,7 @@
35
39
  "lib/invariant.js",
36
40
  "lib/startup.js",
37
41
  "cordis.patch.yml",
42
+ "lib/portless.js",
38
43
  "lib/types/**/*.d.ts"
39
44
  ],
40
45
  "license": "MIT",
@@ -45,85 +50,99 @@
45
50
  },
46
51
  "dependencies": {
47
52
  "commander": "^15.0.0",
48
- "@monotykamary/dsh-agent-presets": "^0.1.0-rc.8",
49
- "@monotykamary/dsh-client-connection": "^0.1.0-rc.8",
50
- "@monotykamary/dsh-api-remotes": "^0.1.0-rc.8",
51
- "@monotykamary/dsh-client-locale": "^0.1.0-rc.8",
52
- "@monotykamary/dsh-client-modules": "^0.1.0-rc.8",
53
- "@monotykamary/dsh-client-runtime": "^0.1.0-rc.8",
54
- "@monotykamary/dsh-client-ui-agent-preset": "^0.1.0-rc.8",
55
- "@monotykamary/dsh-client-ui-commands": "^0.1.0-rc.8",
56
- "@monotykamary/dsh-client-ui-conversation": "^0.1.0-rc.8",
57
- "@monotykamary/dsh-client-hmr": "^0.1.0-rc.8",
58
- "@monotykamary/dsh-client-ui-cordis": "^0.1.0-rc.8",
59
- "@monotykamary/dsh-client-ui-command-palette": "^0.1.0-rc.8",
60
- "@monotykamary/dsh-client-ui-deliverables": "^0.1.0-rc.8",
61
- "@monotykamary/dsh-client-ui-message-feedback": "^0.1.0-rc.8",
62
- "@monotykamary/dsh-client-ui-directory-picker-browse": "^0.1.0-rc.8",
63
- "@monotykamary/dsh-client-ui-workbench": "^0.1.0-rc.8",
64
- "@monotykamary/dsh-client-ui-model-selection": "^0.1.0-rc.8",
65
- "@monotykamary/dsh-client-ui-goal": "^0.1.0-rc.8",
66
- "@monotykamary/dsh-client-ui-settings-models": "^0.1.0-rc.8",
67
- "@monotykamary/dsh-client-ui-layout": "^0.1.0-rc.8",
68
- "@monotykamary/dsh-client-ui-settings-plugin-inventory": "^0.1.0-rc.8",
69
- "@monotykamary/dsh-client-ui-permission-presets": "^0.1.0-rc.8",
70
- "@monotykamary/dsh-client-ui-plan": "^0.1.0-rc.8",
71
- "@monotykamary/dsh-client-ui-files": "^0.1.0-rc.8",
72
- "@monotykamary/dsh-client-ui-settings-plugins": "^0.1.0-rc.8",
73
- "@monotykamary/dsh-client-ui-user-questions": "^0.1.0-rc.8",
74
- "@monotykamary/dsh-client-ui-terminal": "^0.1.0-rc.8",
75
- "@monotykamary/dsh-client-ui-directory-picker-native": "^0.1.0-rc.8",
76
- "@monotykamary/dsh-client-ui-skill": "^0.1.0-rc.8",
77
- "@monotykamary/dsh-client-ui-settings": "^0.1.0-rc.8",
78
- "@monotykamary/dsh-client-ui-session-title": "^0.1.0-rc.8",
79
- "@monotykamary/dsh-client-ui-input-trigger": "^0.1.0-rc.8",
80
- "@monotykamary/dsh-client-ui-subagent": "^0.1.0-rc.8",
81
- "@monotykamary/dsh-client-ui-theme": "^0.1.0-rc.8",
82
- "@monotykamary/dsh-client-ui-settings-general": "^0.1.0-rc.8",
83
- "@monotykamary/dsh-client-ui-trajectory": "^0.1.0-rc.8",
84
- "@monotykamary/dsh-cmdline": "^0.1.0-rc.8",
85
- "@monotykamary/dsh-client-ui-tool": "^0.1.0-rc.8",
86
- "@monotykamary/dsh-client-ui-sidebar": "^0.1.0-rc.8",
87
- "@monotykamary/dsh-client-ui-workspace": "^0.1.0-rc.8",
88
- "@monotykamary/dsh-cordis-host-runner": "^0.1.0-rc.8",
89
- "@monotykamary/dsh-client-ui-workflow-run": "^0.1.0-rc.8",
90
- "@monotykamary/dsh-client-ui-jobs": "^0.1.0-rc.8",
91
- "@monotykamary/dsh-app-boot": "^0.1.0-rc.8",
92
- "@monotykamary/dsh-host-frontend-static": "^0.1.0-rc.8",
93
- "@monotykamary/dsh-web-frontend": "^0.1.0-rc.8",
94
- "@monotykamary/dsh-cordis-client-runner": "^0.1.0-rc.8",
95
- "@monotykamary/dsh-host-directory-picker-auto": "^0.1.0-rc.8",
96
- "@monotykamary/dsh-host-workspace-files": "^0.1.0-rc.8",
97
- "@monotykamary/dsh-host-directory-picker-browse": "^0.1.0-rc.8",
98
- "@monotykamary/dsh-host-apiproxy": "^0.1.0-rc.8",
99
- "@monotykamary/dsh-host-webserver": "^0.1.0-rc.8",
100
- "@monotykamary/dsh-session-log-export": "^0.1.0-rc.8",
101
- "@monotykamary/dsh-host-directory-picker-native": "^0.1.0-rc.8",
102
- "@monotykamary/dsh-message-feedback": "^0.1.0-rc.8",
103
- "@monotykamary/dsh-session-stats": "^0.1.0-rc.8",
104
- "@monotykamary/dsh-storage": "^0.1.0-rc.8",
105
- "@monotykamary/dsh-host-plugin-inventory": "^0.1.0-rc.8",
106
- "@monotykamary/dsh-terminal-web": "^0.1.0-rc.8",
107
- "@monotykamary/dsh-session-projection-cache": "^0.1.0-rc.8",
108
- "@monotykamary/dsh-storage-domain": "^0.1.0-rc.8",
109
- "@monotykamary/dsh-storage-json": "^0.1.0-rc.8",
110
- "@monotykamary/dsh-workspace": "^0.1.0-rc.8",
53
+ "open": "^11.0.0",
54
+ "portless": "0.13.0",
55
+ "@monotykamary/dsh-agent-presets": "^0.1.0",
56
+ "@monotykamary/dsh-client-connection": "^0.1.0",
57
+ "@monotykamary/dsh-app-boot": "^0.1.0",
58
+ "@monotykamary/dsh-api-remotes": "^0.1.0",
59
+ "@monotykamary/dsh-client-locale": "^0.1.0",
60
+ "@monotykamary/dsh-client-hmr": "^0.1.0",
61
+ "@monotykamary/dsh-client-modules": "^0.1.0",
62
+ "@monotykamary/dsh-client-ui-renderer": "^0.1.0",
63
+ "@monotykamary/dsh-client-ui-attachment": "^0.1.0",
64
+ "@monotykamary/dsh-client-ui-brand-official": "^0.1.0",
65
+ "@monotykamary/dsh-client-runtime": "^0.1.0",
66
+ "@monotykamary/dsh-client-ui-commands": "^0.1.0",
67
+ "@monotykamary/dsh-client-ui-cordis": "^0.1.0",
68
+ "@monotykamary/dsh-client-ui-deliverables": "^0.1.0",
69
+ "@monotykamary/dsh-client-ui-conversation": "^0.1.0",
70
+ "@monotykamary/dsh-client-ui-agent-preset": "^0.1.0",
71
+ "@monotykamary/dsh-client-ui-directory-picker-browse": "^0.1.0",
72
+ "@monotykamary/dsh-client-ui-directory-picker-native": "^0.1.0",
73
+ "@monotykamary/dsh-client-ui-message-feedback": "^0.1.0",
74
+ "@monotykamary/dsh-client-ui-layout": "^0.1.0",
75
+ "@monotykamary/dsh-client-ui-goal": "^0.1.0",
76
+ "@monotykamary/dsh-client-ui-model-selection": "^0.1.0",
77
+ "@monotykamary/dsh-client-ui-settings-models": "^0.1.0",
78
+ "@monotykamary/dsh-client-ui-settings-plugin-inventory": "^0.1.0",
79
+ "@monotykamary/dsh-client-ui-plan": "^0.1.0",
80
+ "@monotykamary/dsh-client-ui-permission-presets": "^0.1.0",
81
+ "@monotykamary/dsh-client-ui-user-questions": "^0.1.0",
82
+ "@monotykamary/dsh-client-ui-settings-plugins": "^0.1.0",
83
+ "@monotykamary/dsh-client-ui-settings": "^0.1.0",
84
+ "@monotykamary/dsh-client-ui-settings-general": "^0.1.0",
85
+ "@monotykamary/dsh-client-ui-sidebar": "^0.1.0",
86
+ "@monotykamary/dsh-client-ui-skill": "^0.1.0",
87
+ "@monotykamary/dsh-client-ui-input-trigger": "^0.1.0",
88
+ "@monotykamary/dsh-client-ui-subagent": "^0.1.0",
89
+ "@monotykamary/dsh-client-ui-jobs": "^0.1.0",
90
+ "@monotykamary/dsh-client-ui-theme": "^0.1.0",
91
+ "@monotykamary/dsh-client-ui-reference": "^0.1.0",
92
+ "@monotykamary/dsh-client-ui-workflow-run": "^0.1.0",
93
+ "@monotykamary/dsh-client-ui-trajectory": "^0.1.0",
94
+ "@monotykamary/dsh-client-ui-workspace": "^0.1.0",
95
+ "@monotykamary/dsh-code-runtime-worker-thread": "^0.1.0",
96
+ "@monotykamary/dsh-cmdline": "^0.1.0",
97
+ "@monotykamary/dsh-cordis-client-runner": "^0.1.0",
98
+ "@monotykamary/dsh-cordis-host-runner": "^0.1.0",
99
+ "@monotykamary/dsh-host-frontend-static": "^0.1.0",
100
+ "@monotykamary/dsh-web-frontend": "^0.1.0",
101
+ "@monotykamary/dsh-host-directory-picker-auto": "^0.1.0",
102
+ "@monotykamary/dsh-host-directory-picker-browse": "^0.1.0",
103
+ "@monotykamary/dsh-host-apiproxy": "^0.1.0",
104
+ "@monotykamary/dsh-host-directory-picker-native": "^0.1.0",
105
+ "@monotykamary/dsh-client-ui-tool": "^0.1.0",
106
+ "@monotykamary/dsh-host-plugin-inventory": "^0.1.0",
107
+ "@monotykamary/dsh-host-webserver": "^0.1.0",
108
+ "@monotykamary/dsh-file-reference-local": "^0.1.0",
109
+ "@monotykamary/dsh-file-reference": "^0.1.0",
110
+ "@monotykamary/dsh-launch-environment": "^0.1.0",
111
+ "@monotykamary/dsh-message-feedback": "^0.1.0",
112
+ "@monotykamary/dsh-session-reference": "^0.1.0",
113
+ "@monotykamary/dsh-session-projection-cache": "^0.1.0",
114
+ "@monotykamary/dsh-session-log-export": "^0.1.0",
115
+ "@monotykamary/dsh-tool-session-mutations": "^0.1.0",
116
+ "@monotykamary/dsh-storage-domain": "^0.1.0",
117
+ "@monotykamary/dsh-session-stats": "^0.1.0",
118
+ "@monotykamary/dsh-storage-json": "^0.1.0",
119
+ "@monotykamary/dsh-storage": "^0.1.0",
120
+ "@monotykamary/dsh-subprocess": "^0.1.0",
121
+ "@monotykamary/dsh-client-ui-command-palette": "^0.1.0",
122
+ "@monotykamary/dsh-client-ui-workbench": "^0.1.0",
123
+ "@monotykamary/dsh-workspace": "^0.1.0",
124
+ "@monotykamary/dsh-client-ui-files": "^0.1.0",
125
+ "@monotykamary/dsh-client-ui-terminal": "^0.1.0",
111
126
  "@monotykamary/schemastery": "^3.18.1",
112
- "@monotykamary/dsh-web-identity": "^0.1.0-rc.8",
113
- "@monotykamary/dsh-code-runtime-worker-thread": "^0.1.0-rc.8"
127
+ "@monotykamary/dsh-client-ui-session-title": "^0.1.0",
128
+ "@monotykamary/dsh-host-workspace-files": "^0.1.0",
129
+ "@monotykamary/dsh-terminal-web": "^0.1.0",
130
+ "@monotykamary/dsh-web-identity": "^0.1.0",
131
+ "@monotykamary/dsh-client-ui-settings-updates": "^0.1.0",
132
+ "@monotykamary/dsh-distribution-update": "^0.1.0"
114
133
  },
115
134
  "peerDependencies": {
116
135
  "@monotykamary/cordis-plugin-loader": "^1.0.2",
117
- "@monotykamary/dsh-shell-env": "^0.1.0-rc.8",
118
- "@monotykamary/dsh-invariants": "^0.1.0-rc.8",
136
+ "@monotykamary/dsh-shell-env": "^0.1.0",
137
+ "@monotykamary/dsh-system-prompt": "^0.1.0",
119
138
  "@monotykamary/cordis": "^4.0.1",
120
- "@monotykamary/dsh-system-prompt": "^0.1.0-rc.8"
139
+ "@monotykamary/dsh-invariants": "^0.1.0"
121
140
  },
122
141
  "devDependencies": {
123
- "@monotykamary/dsh-shell-env": "^0.1.0-rc.8",
124
- "@monotykamary/dsh-system-prompt": "^0.1.0-rc.8",
125
- "@monotykamary/dsh-invariants": "^0.1.0-rc.8",
126
142
  "@monotykamary/cordis-plugin-loader": "^1.0.2",
127
- "@monotykamary/cordis": "^4.0.1"
143
+ "@monotykamary/dsh-invariants": "^0.1.0",
144
+ "@monotykamary/dsh-system-prompt": "^0.1.0",
145
+ "@monotykamary/cordis": "^4.0.1",
146
+ "@monotykamary/dsh-shell-env": "^0.1.0"
128
147
  }
129
148
  }