{"_id":"@buddhilive/dsh-web-app","name":"@buddhilive/dsh-web-app","dist-tags":{"alpha":"0.1.2-alpha.3","latest":"0.1.2-alpha.3"},"versions":{"0.1.2-alpha.3":{"name":"@buddhilive/dsh-web-app","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)","version":"0.1.2-alpha.3","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/Buddhilive/buddhi-ai-harness.git","directory":"packages/bundle/web-app"},"type":"module","main":"lib/index.js","types":"lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./startup":{"types":"./lib/types/startup.d.ts","default":"./lib/startup.js"},"./invariant":{"types":"./lib/types/invariant.d.ts","default":"./lib/invariant.js"},"./cordis.patch.yml":"./cordis.patch.yml","./src/*":"./src/*","./package.json":"./package.json"},"license":"MIT","dsh":{"bundle":{"patch":"./cordis.patch.yml"}},"dependencies":{"commander":"^15.0.0","open":"^11.0.0","@buddhilive/dsh-agent-presets":"^0.1.2-alpha.3","@buddhilive/dsh-tool-subagent":"^0.1.2-alpha.3","@buddhilive/dsh-api-remotes":"^0.1.2-alpha.3","@buddhilive/dsh-app-boot":"^0.1.2-alpha.3","@buddhilive/dsh-client-connection":"^0.1.2-alpha.3","@buddhilive/dsh-client-locale":"^0.1.2-alpha.3","@buddhilive/dsh-client-modules":"^0.1.2-alpha.3","@buddhilive/dsh-client-hmr":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-attachment":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-agent-preset":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-renderer":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-approval":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-brand-official":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-commands":"^0.1.2-alpha.3","@buddhilive/bah-client-ui-brand":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-chat":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-conversation":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-cordis":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-deliverables":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-directory-picker-browse":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-directory-picker-native":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-message-feedback":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-goal":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-layout":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-settings-models":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-settings-plugin-inventory":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-permission-presets":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-plan":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-schedule":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-session":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-settings-plugins":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-user-questions":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-settings":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-settings-general":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-sidebar":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-model-selection":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-skill":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-jobs":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-theme":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-input-trigger":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-tool":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-workflow-run":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-trajectory":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-workspace":"^0.1.2-alpha.3","@buddhilive/dsh-cmdline":"^0.1.2-alpha.3","@buddhilive/dsh-code-runtime-worker-thread":"^0.1.2-alpha.3","@buddhilive/dsh-cordis-client-runner":"^0.1.2-alpha.3","@buddhilive/dsh-cordis-host-runner":"^0.1.2-alpha.3","@buddhilive/dsh-web-frontend":"^0.1.2-alpha.3","@buddhilive/dsh-host-frontend-static":"^0.1.2-alpha.3","@buddhilive/dsh-host-directory-picker-auto":"^0.1.2-alpha.3","@buddhilive/dsh-host-directory-picker-browse":"^0.1.2-alpha.3","@buddhilive/dsh-host-directory-picker-native":"^0.1.2-alpha.3","@buddhilive/dsh-host-plugin-inventory":"^0.1.2-alpha.3","@buddhilive/dsh-host-webserver":"^0.1.2-alpha.3","@buddhilive/dsh-file-reference":"^0.1.2-alpha.3","@buddhilive/dsh-file-reference-local":"^0.1.2-alpha.3","@buddhilive/dsh-launch-environment":"^0.1.2-alpha.3","@buddhilive/dsh-message-feedback":"^0.1.2-alpha.3","@buddhilive/dsh-session-reference":"^0.1.2-alpha.3","@buddhilive/dsh-session-stats":"^0.1.2-alpha.3","@buddhilive/dsh-api-session-controller":"^0.1.2-alpha.3","@buddhilive/dsh-api-settings-controller":"^0.1.2-alpha.3","@buddhilive/dsh-api-workspace-controller":"^0.1.2-alpha.3","@buddhilive/dsh-subprocess":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-reference":"^0.1.2-alpha.3","@buddhilive/dsh-client-ui-subagent":"^0.1.2-alpha.3","@deepseek-ai/schemastery":"^3.18.2","@buddhilive/dsh-session-log-export":"^0.1.2-alpha.3","@buddhilive/dsh-workspace":"^0.1.2-alpha.3"},"peerDependencies":{"@deepseek-ai/cordis-plugin-loader":"^1.0.3","@buddhilive/dsh-system-prompt":"^0.1.2-alpha.3","@buddhilive/dsh-shell-env":"^0.1.2-alpha.3","@buddhilive/dsh-invariants":"^0.1.2-alpha.3","@deepseek-ai/cordis":"^4.0.2"},"devDependencies":{"@buddhilive/dsh-system-prompt":"^0.1.2-alpha.3","@deepseek-ai/cordis-plugin-loader":"^1.0.3","@buddhilive/dsh-shell-env":"^0.1.2-alpha.3","@deepseek-ai/cordis":"^4.0.2","@buddhilive/dsh-invariants":"^0.1.2-alpha.3"},"_id":"@buddhilive/dsh-web-app@0.1.2-alpha.3","bugs":{"url":"https://github.com/Buddhilive/buddhi-ai-harness/issues"},"homepage":"https://github.com/Buddhilive/buddhi-ai-harness#readme","_integrity":"sha512-tLbaqYfSL97Jqb8Hh0t83wSOqWPQ5+BiIiP6CO65QMpiPnoCWsbtB7nE+xfUFy20PjP7YI0VYyJJA8Ir+TfNrw==","_resolved":"C:\\DevDojo\\Buddhi\\buddhi-ai-harness\\dist\\npm\\buddhilive-dsh-web-app-0.1.2-alpha.3.tgz","_from":"file:C:/DevDojo/Buddhi/buddhi-ai-harness/dist/npm/buddhilive-dsh-web-app-0.1.2-alpha.3.tgz","_nodeVersion":"24.13.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-tLbaqYfSL97Jqb8Hh0t83wSOqWPQ5+BiIiP6CO65QMpiPnoCWsbtB7nE+xfUFy20PjP7YI0VYyJJA8Ir+TfNrw==","shasum":"447eeb6449149447e16d974469d4713fa2b24ef4","tarball":"https://registry.npmjs.org/@buddhilive/dsh-web-app/-/dsh-web-app-0.1.2-alpha.3.tgz","fileCount":12,"unpackedSize":64822,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIClk8qoirq11hu2PcBQ1zXDOVV2/7kl2VTcVBQ8f2hVFAiAdwcVT03qBcg4cokzz/1VToEOuDsqduLMrR2C6mBpy9g=="}]},"_npmUser":{"name":"buddhilive","email":"visitbudkavin@gmail.com"},"directories":{},"maintainers":[{"name":"buddhilive","email":"visitbudkavin@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-web-app_0.1.2-alpha.3_1788166665497_0.9908571700471702"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-31T08:57:43.502Z","0.1.2-alpha.3":"2026-08-31T08:57:45.623Z","modified":"2026-08-31T08:57:46.199Z"},"maintainers":[{"name":"buddhilive","email":"visitbudkavin@gmail.com"}],"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)","homepage":"https://github.com/Buddhilive/buddhi-ai-harness#readme","repository":{"type":"git","url":"git+https://github.com/Buddhilive/buddhi-ai-harness.git","directory":"packages/bundle/web-app"},"bugs":{"url":"https://github.com/Buddhilive/buddhi-ai-harness/issues"},"license":"MIT","readme":"---\ndescription: \"dsh 的浏览器 GUI：交互式聊天、模型与设置管理、会话历史，供用户运行 dsh web 表层。\"\nkind: \"package-bundle\"\n---\n\n# @buddhilive/dsh-web-app\n\n[English](README.md) | 中文\n\n## 概述\n\n运行 `dsh --profile web`，界面会在你的默认浏览器中打开，即可与 agent（智能体）交互式聊天。你会获得会话视图、模型与设置管理以及会话历史，背后与其他表层相同的模型访问、工具与安全默认值。该命令会打印带 token 的启动 URL；浏览器用该 token 换取签名会话 cookie，再重定向到干净的根 URL。你可以从命令行更改端口、关闭浏览器交接并允许额外主机；有意不支持绑定所有网络接口。需要浏览器中的交互式工作时选择它；`dsh-headless` 是一次性的命令行兄弟表层。\n\n## 目录\n\n- [使用本包](#use-this-package)\n- [理解实现](#understand-the-implementation)\n- [进一步探索](#further-exploration)\n- [模型体验](#model-experience)\n- [已知限制与延期工作](#known-limitations-and-deferred-work)\n- [开发备注](#dev-note)\n\n-----\n\n<a id=\"use-this-package\"></a>\n## 使用本包\n\n启动 GUI、打开浏览器，然后开始与 agent（智能体）对话。flag 用于微调本次调用。\n\n### 启动 Web GUI\n\n```sh\ndsh --profile web\ndsh --profile web --no-open --port 8080\n```\n\n启动后你会看到 `dsh web:` 行，其根 URL 携带新的进程 token。除非 `--no-open` 或 SSH 会话抑制，否则默认浏览器会打开该 URL、取得签名 cookie，再重定向到干净的根页面。页面加载且你可以与 agent（智能体）对话，就说明成功了。两种可预期的失败：前端未构建时，启动会以构建提示停止（checkout 中运行 `pnpm run build`）；浏览器无法打开时，stderr 会打印不含凭据的诊断，但服务器会继续运行——请自行打开已打印的启动 URL。\n\n### 配置\n\n大多数用户不需要设置这些；命令行 flag 会提供给下面四个设置——`--host`、`--port` 与 `--trusted-host` 来自本次调用，`--no-open` 仅对本次调用关闭浏览器交接：\n\n| 字段 | 默认值 | 含义 |\n|---|---|---|\n| `openBrowser` | `true` | 启动后用默认浏览器打开；SSH 启动会抑制它 |\n| `printUrl` | `true` | 启动时打印 `dsh web:` URL 行 |\n| `surfaceContext` | `true` | 给 agent（智能体）提供 GUI 定位上下文，并把 `DSH_WEB_URL` 暴露给其 shell 命令 |\n| `trustedHosts` | `[]` | 允许从网络访问 GUI 的额外主机 |\n\n生成的[配置目录](../../../docs/config-catalog.zh.md#buddhilivedsh-web-app)是每个受支持字段及其 JSDoc 的穷尽式真源。\n\n### LAN 访问与可信主机\n\n默认情况下 GUI 只接受本机的连接。绑定所有网络接口的部署也会允许 LAN 内的浏览器访问，此时打印的 URL 会附带一个 LAN 地址；`--trusted-host` 在两种情况下都能添加额外主机。Host 与 Origin 检查控制可达性，token 交换则认证每个 Host API 方法与 WebSocket stream。LAN 地址只在启动时采样一次，因此之后的网络变化不会被感知——重启 GUI 以重新公告。\n\n### 通过 SSH 运行\n\n通过 SSH 启动 `dsh --profile web` 时，URL 行仍会打印，但不会为你打开浏览器：本地转发地址由 SSH 客户端或编辑器持有。请在自己的机器上打开转发后的 URL；打印出的 URL 指向远端宿主机 loopback 端点。\n\n### 按会话的 agent 设置\n\n每个浏览器会话都从随发行版交付的 preset（默认 `standard`）组合自己的 agent（智能体），而不是共享一套进程级工具集。你可以更改默认 preset，或在 `$DSH_HOME/.agent-presets` 下添加自己的 preset。\n\n-----\n\n<a id=\"understand-the-implementation\"></a>\n## 理解实现\n\n<details>\n<summary>实现细节——点击展开</summary>\n\n本组合包是一份 patch 加一个运行时粘合插件。patch 重述 base 刻意省略的表层专属值，插入仅 Web 使用的宿主行与浏览器名录，然后把 agent 层移到 preset 之后；粘合插件负责 dist 服务、信任采样、提示词段落、bash 变量与就绪宣告。\n\n### patch 语义\n\npatch 会替换目标行的整个 `config`，因此每个 Web 行都重述自己拥有的每个键：基础行上的 persona、`DSH_TOOLS_MODE` PTC mode 开关与 `session-query-sqlite` 值，随后 `insert` 添加 Web 宿主行、传输层与浏览器名录。base 以进程级挂载的按 agent 工具行在这里被禁用，由 preset 名录接管；每项宿主层与 preset 层归属决策的理由以行内注释写在 patch 里。\n\n### 就绪宣告\n\nURL 行与浏览器交接都是就绪信号：监督方一观察到该行就发起 RPC，浏览器一打开就请求页面，因此两者只在 Loader 配置树结算且 Connection 认证可用后运行——在没有 Loader 的手工构建树中则立即运行。启动中途被释放的树不会宣告任何内容。\n\n### LAN 信任采样\n\n`resolveLanTrust` 在启动时只采样一次网络：loopback 绑定（`127.0.0.1`）不派生任何 LAN 地址，绑定所有网卡则会加入每个非 internal IPv4 字面量。派生字面量加上显式的 `--trusted-host` 权威标识组成 `/api` 浏览器信任栅栏，打印的 LAN URL 始终与该栅栏一致。\n\n### 源码地图\n\n| 文件 | 职责 |\n|---|---|\n| [`src/index.ts`](src/index.ts) | `web-app` 粘合插件：dist 解析、LAN 信任采样、提示词段落、bash 变量、URL 行、浏览器交接 |\n| [`src/startup.ts`](src/startup.ts) | `web-startup` 提供方：`--host`、`--port`、`--trusted-host`、`--no-open`、`--help` |\n| [`cordis.patch.yml`](cordis.patch.yml) | Web patch：重述的基础值、Web 宿主行、浏览器名录、preset 之后的 agent 层 |\n| [`src/invariant.ts`](src/invariant.ts) | 不变式伴生插件：无运行时不变式；每项贡献都由 registry 释放 |\n| [`tests/web-app.spec.ts`](tests/web-app.spec.ts) | dist 解析、fallback 席位、提示词段落、就绪宣告 |\n| [`tests/startup.spec.ts`](tests/startup.spec.ts) | 在真实 Loader 树上的命令行解析 |\n| [`tests/trusted-hosts.spec.ts`](tests/trusted-hosts.spec.ts) | LAN 信任采样 |\n| [`tests/browser-open.spec.ts`](tests/browser-open.spec.ts) | 页面可达后的默认浏览器交接 |\n\n### 不变式归属\n\n不变式伴生插件注册一个空安装器，因为每项贡献——frontend-static 子插件、提示词段落与 bash 变量注册——都会随 fiber 由 registry 释放，且每个所属 registry 的包负责该关系的不变式。\n\n</details>\n\n-----\n\n<a id=\"further-exploration\"></a>\n## 进一步探索\n\n当你想深入了解共享核心、浏览器重载流水线或已构建的前端时，阅读以下页面。\n\n- [组合包包映射](../README.zh.md)——基于同一核心构建的表层。\n- [dsh-base](../base/README.zh.md)——GUI 运行其上的共享核心。\n- [dsh-client-hmr](../../client/hmr/README.zh.md)——开发期间客户端插件变更如何重载。\n- [frontend-static](../../host/frontend-static/README.zh.md)——已构建的前端如何被服务。\n- [生成配置目录](../../../docs/config-catalog.zh.md#buddhilivedsh-web-app)——每个受支持配置字段及其源声明。\n\n-----\n\n<a id=\"model-experience\"></a>\n## 模型体验\n\n### Harness 源码与 Web 表层上下文\n\n#### 模型看到什么\n\n当 `surfaceContext` 为 true 时，`harness:source` 段落标明磁盘上的 Harness 实现，但不会声称它就是工作目录；全局段落 `app:web-surface`（first-party 顺序 −800）则向模型说明 GUI：规范的本地 URL、「this page」指代什么、更新约定（重载接收端始终开启；无刷新重载还需要 `pnpm run dev:web` watcher），以及不要启动替代服务器的指令。`DSH_WEB_URL` 还会连同描述出现在受管 bash 环境中，每次调用时从运行中的服务器解析。当它为 false 时，这两个段落和该变量都不会注册。\n\n#### Token 影响\n\n每个会话一行源码说明和一段提示词，外加两行受管环境变量；每个进程内保持恒定。\n\n#### KV Cache 影响\n\n该提示词段落位于系统提示词靠前位置，且在进程整个生命周期内稳定（端口是启动期事实），因此不会使跨轮次缓存失效。\n\n## 已知限制与延期工作\n\n<a id=\"known-limitations-and-deferred-work\"></a>\n\n\n这些限制告诉你在不常见的环境下会遇到什么——源码 checkout、SSH 会话或严格网络。它们是当前包约束，不是通用的浏览器对比或任务积压。\n\n- **前端必须已构建**——源码 checkout 需要先运行 `pnpm run build`；dist 缺失时启动会以构建提示停止，且没有从源码直接服务的回退路径。\n- **LAN 地址只在启动时采样一次**——启动后的网卡变化不会重新公告；打印的 LAN URL 始终与采样结果一致。\n- **只能观察到交接的启动**——GUI 只报告浏览器被请求打开，而不是它确实打开了；之后的浏览器退出永远不会上报，打印的 URL 是你的手动回退路径。\n- **SSH 会话保留 URL 但跳过浏览器交接**——打印的 URL 指向远端宿主机 loopback 端点；SSH 客户端或编辑器必须暴露并打开本地转发地址。\n- **`BROWSER` 覆盖只能来自环境**——被发现的 `.env` 不能设置 `BROWSER`；只有继承值能为自动交接选择可执行文件。\n- **不支持绑定所有网络接口**——出于安全考虑，`--host 0.0.0.0` 会在启动时被拒绝；请使用默认 loopback 主机。\n\n<a id=\"dev-note\"></a>\n### 开发备注\n\n<details>\n<summary>维护者的工作上下文——点击展开</summary>\n\n无。\n\n</details>\n","readmeFilename":"README.zh.md","_rev":"1-fa0c97ca2ae29458af1ebf6471f6ba4d"}