dsh-web-annotator 0.2.0-alpha.11 → 0.2.0-alpha.13

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/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.0-alpha.13 — 发布通道按版本号推导
4
+
5
+ - 发布链不再把 `--prerelease` 与 `--tag alpha` 写死在 workflow 里,改由版本号推导:
6
+ 带预发布段的版本 → GitHub 的 Pre-release + npm 的预览 dist-tag(`alpha`…);
7
+ 稳定版 → Latest + `latest`。判断放在可测的 `releaseChannel()` 里。
8
+ 原先写死时,**给稳定版打标签会发出一个「标着预发布、npm 上仍留在旧 alpha」的版本,
9
+ 而日志里看不出任何异常**。
10
+ - Release 正文不再把稳定版称作“预览版”:措辞跟着通道走。
11
+ - 插件代码与宿主提供方**没有变化**,界面行为与 alpha.12 相同。
12
+
13
+ ## 0.2.0-alpha.12 — 发布链路接上 npm 的 OIDC
14
+
15
+ - 发布链路新增 npm 一路:推 `v*` 标签后,Release 建完再由 **Trusted Publishing(OIDC)**
16
+ 把同一份产物发到 npm 的 `alpha` dist-tag,仓库里不存 token(`id-token: write` + `--provenance`)。
17
+ 它排在建 Release **之后**:npm 那半失败时用户仍拿得到安装包,也排除了「npm 有、GitHub 没有」。
18
+ - 本版是这条路径的第一次真实运行,兼作 npm Trusted Publisher 连接的激活发布 ——
19
+ 新建的连接**有 2 天激活期**,过期后连字段都不可改。
20
+ - 文档补上这轮踩到的三处,都写在 [发布链路](docs/publishing.md) 与 [AGENTS.md](AGENTS.md)
21
+ 的「活跃坑」:本机 npm 指向镜像时登录/发布报 `Public registration is not allowed`;
22
+ Trusted Publisher 的 `Allowed actions` 默认**不含**直接发布(漏勾则 CI 全绿而 npm 上没有新版本);
23
+ 发布成功后头几分钟 `npm install` 会因传播延迟报 `ETARGET`,那不是失败。
24
+ - 插件代码与宿主提供方**没有变化**,界面行为与 alpha.11 相同。
25
+
3
26
  ## 0.2.0-alpha.11 — 输入框入口不再显成“被选中”
4
27
 
5
28
  - 输入框左侧的“批注网页”不再是一块恒有灰底的实心按钮。它原先借用了 `variant="toolbar"`
@@ -4,8 +4,8 @@
4
4
 
5
5
  包名 `dsh-web-annotator`,源码在 [cslkkl/dsh-web-annotator](https://github.com/cslkkl/dsh-web-annotator)。
6
6
  预构建包通过 GitHub Release 分发,面向精确 Harness **0.2.0-rc.2**,用户不需要编译。
7
- 版本号见 [../package.json](../package.json)。npm 尚未发布过:发布链路(OIDC Trusted Publishing)
8
- 已就绪,**只差一次性的建包与配置**,步骤在 [发布链路](publishing.md) 的 npm 发布节。
7
+ 版本号见 [../package.json](../package.json)。npm 已发布预览版(`npm install dsh-web-annotator@alpha`),
8
+ 发布由 CI 走 OIDC Trusted Publishing,见 [发布链路](publishing.md) 的 npm 发布节。
9
9
  社区目录的条目已提交、**等待维护者审阅**([awesome-dsh-plugin#6833](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin/pull/6833)),
10
10
  **提交不等于收录**:合并并被目录同步之后,才能声明该市场可搜索、可安装。
11
11
 
@@ -21,21 +21,23 @@
21
21
  2. bump `package.json` 的版本号、`CHANGELOG.md` 的对应一节与市场条目的 `tarball` 行,推 `main`;
22
22
  再推 `v<版本>` 标签。[release workflow](../.github/workflows/release.yml) 随后跑门禁、
23
23
  打包产物验收与交付一致性,建出挂着预构建 `.tgz`(外加源码 ZIP 与验证记录)的预览 Release,
24
- 最后把同一份产物发到 npm 的 `alpha` dist-tag —— 预览版不碰 `latest`。
25
- 3. 完成稳定版所需的原生截图、真实模型与兼容验收后,去掉 `--tag alpha`,发布稳定版并设置 `latest`。
24
+ 最后把同一份产物发到 npm —— 通道按版本号推导:预览版进 `alpha`,稳定版进 `latest`。
25
+ 3. 完成稳定版所需的原生截图、真实模型与兼容验收后,**只改版本号与 `CHANGELOG`** 就能发稳定版:
26
+ workflow 会按版本号自动去掉 `--prerelease`、把 dist-tag 换成 `latest`(判据在
27
+ [scripts/release-assets.mjs](../scripts/release-assets.mjs) 的 `releaseChannel()`)。
26
28
  4. 向社区目录提交 [marketplace 条目](marketplace/cslkkl__dsh-web-annotator.yml)。
27
29
  合并并被目录同步后,才能声明该市场可搜索、可安装。
28
30
  5. 在新 Profile 中走一遍搜索、安装、重启、批注、卸载,记录精确市场与宿主版本。
29
31
 
30
32
  ## 各渠道的收录规则
31
33
 
32
- | 渠道 | 要求 | 本项目的做法 |
33
- | -------------------------------------- | -------------------------------------------------------------------------------- | ---------------------------------------------------------- |
34
- | DSH 官方插件管理页 / CLI | 预构建包声明合法 `dsh.bundle.patch`,可安装 npm spec 或本地 tgz | 安装一个预构建包 |
35
- | `dshmarket`(awesome-dsh-plugin 目录) | 向目录仓库提交插件 YAML,维护者审阅合并;仓库须创建满一天并带 `dsh-plugin` topic | 条目用 `tarball` 指向已发布的 Release tgz,不必先发 npm |
36
- | 按 GitHub topic 自动发现的市场 | 仓库带 `dsh-plugin` topic;安装方式取决于各市场 | 标签便于发现,不等于安装已验收 |
37
- | Desktop 的 `dsh-community-market` | 目录解析唯一 npm 包名,要求 npm `latest` 是稳定精确版本 | alpha 发的是 `alpha` dist-tag,`latest` 留空;稳定版才满足 |
38
- | npm(可选) | 包的 `repository` 字段必须指回本仓库,否则不会与条目关联 | 已声明;发布走 OIDC,用 `alpha` dist-tag |
34
+ | 渠道 | 要求 | 本项目的做法 |
35
+ | -------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
36
+ | DSH 官方插件管理页 / CLI | 预构建包声明合法 `dsh.bundle.patch`,可安装 npm spec 或本地 tgz | 安装一个预构建包 |
37
+ | `dshmarket`(awesome-dsh-plugin 目录) | 向目录仓库提交插件 YAML,维护者审阅合并;仓库须创建满一天并带 `dsh-plugin` topic | 条目用 `tarball` 指向已发布的 Release tgz,不必先发 npm |
38
+ | 按 GitHub topic 自动发现的市场 | 仓库带 `dsh-plugin` topic;安装方式取决于各市场 | 标签便于发现,不等于安装已验收 |
39
+ | Desktop 的 `dsh-community-market` | 目录解析唯一 npm 包名,要求 npm `latest` 是稳定精确版本 | **仍不满足**:还没有稳定版,而全新包的首个版本会被 npm 强制占住 `latest`,所以它现在指向一个 alpha |
40
+ | npm(可选) | 包的 `repository` 字段必须指回本仓库,否则不会与条目关联 | 已声明;发布走 OIDC,预览版用 `alpha` dist-tag、稳定版用 `latest` |
39
41
 
40
42
  以上是查阅公开实现得到的规则,未在市场 UI 中实际安装本项目。
41
43
  其他版本或来源的行为需要分别确认。收录结果由市场维护者决定。
@@ -1,7 +1,7 @@
1
1
  url: https://github.com/cslkkl/dsh-web-annotator
2
2
  name: cslkkl/dsh-web-annotator
3
3
  category: browser
4
- tarball: https://github.com/cslkkl/dsh-web-annotator/releases/download/v0.2.0-alpha.11/dsh-web-annotator-0.2.0-alpha.11.tgz
4
+ tarball: https://github.com/cslkkl/dsh-web-annotator/releases/download/v0.2.0-alpha.13/dsh-web-annotator-0.2.0-alpha.13.tgz
5
5
  description:
6
6
  en: 'Annotate pages inside the existing Harness Browser: click or drag to select, comment or ask, then send marked screenshots or DOM location details to the current session. While enabled it replaces the official Browser, Chat and Layout providers; targets Harness 0.2.0-rc.2.'
7
7
  zh: '在 Harness 原有 Browser 内批注网页:点选或框选后就地评论、提问,可把标记截图或 DOM 定位资料发给当前会话;启用期间替换官方 Browser、Chat 与 Layout 提供方,精确支持 Harness 0.2.0-rc.2。'
@@ -28,13 +28,26 @@ Harness 安装。**发布链路自己跑这一套** —— 那是发版门禁,
28
28
  **缺这一节时脚本直接失败**,不会退化成一份空正文。
29
29
 
30
30
  ```powershell
31
- # 1. 改 package.json 的 version、CHANGELOG 的对应一节,以及市场条目的 tarball 行
32
- # (见 [分发说明](distribution.md) 的「条目里的 tarball 必须跟着版本走」—— 漏改不报错)
33
- # 2. 打标签再推 —— 这一下触发发布
31
+ # 0. 本机先把能拦的先拦住 —— 门禁挂了就别推标签,白等 runner 六分钟
32
+ npm run check
33
+
34
+ # 1. 同批改三处:package.json 的 version、CHANGELOG 的对应一节、市场条目的 tarball 行
35
+ # 第三处漏改**不报错**(见 [分发说明](distribution.md) 的「条目里的 tarball 必须跟着版本走」)
36
+
37
+ # 2. 推 main,再打标签 —— 这一下触发发布
38
+ git push origin main
34
39
  git tag v<版本>
35
40
  git push origin v<版本>
36
41
  ```
37
42
 
43
+ ⚠️ **本机若要 `npm pack`,bump 之后必须先 `npm run build:host`** —— `prepack` 会断言
44
+ `lib/host/bundle.json` 里的版本与 `package.json` 一致。runner 上这一步由 workflow 自己做
45
+ (`build:host` 排在 `npm pack` 之前),本机不会自动做,所以本机打包会以「版本不一致」失败。
46
+
47
+ **发布全程在 runner 上**:本机不需要任何 npm 凭证(OIDC 从 GitHub 签发),也不要求本机
48
+ 处于什么状态。跑完 GitHub Release 与 npm 一起更新:**预发布版本**进 GitHub 的 Pre-release
49
+ 与 npm 的预览 dist-tag(`alpha`…),**稳定版本**进 GitHub 的 Latest 与 npm 的 `latest`。
50
+
38
51
  `release.yml` 随后在 Windows runner 上依次:核对标签与 `package.json` 一致 → `npm run check`
39
52
  → 真实 Chromium 存储回归 → 打补丁并按精确基线校验 → `build:host` → 窄范围类型检查
40
53
  → `npm pack` → 安装精确版本 Harness 并用**打包产物**跑 `test:acceptance` →
@@ -66,31 +79,85 @@ Release 的附件列表。
66
79
  同一套做法:**仓库里不存任何 npm token**,npm 侧凭「本仓库的 `release.yml`」授权,
67
80
  所以 `release.yml` 里必须有 `id-token: write`。**不要**加 `NPM_TOKEN` secret ——
68
81
  OIDC 已替代它,加了反而会在 token 过期后静默回到「workflow 能跑、包发不出去」的状态。
82
+ 配好之后建议把包的 Publishing access 改成「**Require two-factor authentication and
83
+ disallow bypass 2fa tokens**」,堵掉 token 这条并行通道。
69
84
 
70
85
  环境要求 npm CLI ≥ 11.5.1(Node 24 自带的够新),registry 由 `setup-node` 的
71
86
  `registry-url` 显式钉到 `https://registry.npmjs.org`。
72
87
 
73
- ### 一次性配置(新包必须先建包)
88
+ ### npm 侧怎么配(一次性)
89
+
90
+ Trusted Publishing 配在**已存在的包**上,所以顺序不能颠倒:先让包存在,再配连接。
91
+ 登录 npmjs.com → **Packages → 本包 → Settings → Trusted publishing** →
92
+ **Add trusted publisher** → 选 **GitHub Actions**:
93
+
94
+ | 字段 | 值 |
95
+ | -------------------- | ------------------------------------------------ |
96
+ | Organization or user | `cslkkl` |
97
+ | Repository | `dsh-web-annotator` |
98
+ | Workflow filename | `release.yml`(**只填文件名**,不带 `.github/`) |
99
+ | Environment name | 留空 |
74
100
 
75
- Trusted Publishing 配在**已存在的包**上,所以顺序不能颠倒:
101
+ ⚠️ **`Allowed actions` 里必须勾 `Allow npm publish`。** 2026-09-03 之后新建的连接
102
+ **默认只允许 `npm stage publish`**(暂存发布,要人工批准才上线)。漏勾时包只会进暂存区,
103
+ 而 **workflow 依然全绿** —— 症状是「CI 成功、npm 上看不到新版本」,最难查的一类。
104
+ `Allow npm dist-tag` 不用勾:发稳定版用的是 `npm publish --tag latest`,属于 publish 权限。
76
105
 
77
- 1. **先让包存在**:本机交互式 `npm publish --access public --tag alpha`(会要求 2FA),
78
- 或走 npm 的[暂存发布](https://docs.npmjs.com/staged-publishing)
79
- (`npm stage publish`,之后由维护者用 2FA 放行)。
80
- 2. **再配 Trusted Publisher**:npm 包设置页 → Trusted Publisher → GitHub Actions,
81
- 填 `cslkkl` / `dsh-web-annotator` / 工作流文件名 **`release.yml`**。
82
- ⚠️ 这一步**必须交互式做**:绕过 2FA 的 granular token 已经没有权限改这项配置
83
- ([2026-07-31 公告](https://github.blog/changelog/2026-07-31-restricting-npm-bypass-2fa-granular-access-tokens/))。
84
- 3. 之后每次推 `v*` 标签,`release.yml` 自动发,并带 `--provenance`。
106
+ ⚠️ **字段建好不可改** —— provider 与必填项一旦创建即固定,填错只能删掉重建。
107
+
108
+ ⚠️ **新建的连接有 2 天激活期**:必须在 2 天内成功发布一次,否则连接**过期且不可编辑**,
109
+ 只能删除重建。所以「配好」与「发一版」要挨着做;而为了激活而发的那一版本身也得有内容,
110
+ 不要为了跑通链路发一个空版本。
85
111
 
86
112
  包还不存在时,`release.yml` 里的 npm 这一步会**明确警告后跳过**(Release 已经建好了,
87
113
  缺的只是 npm 这一路),不会让发布无故变红。
88
114
 
89
- ### dist-tag:预览版不许碰 `latest`
115
+ ### 备用路径:本机手发
116
+
117
+ OIDC 不可用时,所有者可在本机发布,但**只用于建包这类一次性动作**。本机打包的字节与
118
+ CI 验收过的那份**不同**:provider 产物里会写进检出目录名(`../harness-browser-integration/…`
119
+ 而不是 `.host-source/…`),sourcemap 也跟着变 —— 长期走这条路等于让「发出去的就是验收过的
120
+ 那一份」失效。首个版本之后一律由 CI 发。
121
+
122
+ ⚠️ 本机 `npm` 若指向镜像(如 `registry.npmmirror.com`),`npm login` / `npm publish` 会报
123
+ `Public registration is not allowed` —— 镜像只读,不提供账号与发布。发布时显式指定官方源:
124
+
125
+ ```powershell
126
+ npm publish <tgz 或 .> --registry=https://registry.npmjs.org --access public --tag alpha
127
+ ```
128
+
129
+ (`--tag` 按上面的表选:预览版用 `alpha`,稳定版用 `latest`。)
130
+
131
+ 装包仍走镜像(快),所以**不要**改全局 registry。
132
+
133
+ ### dist-tag 与 `latest`
134
+
135
+ **通道由版本号推导,不写死在 workflow 里**:`npm run release:assets` 把结论写进
136
+ `integration/release-channel.json`,Release 与 npm 两步都只读它。
137
+
138
+ | 版本号 | GitHub Release | npm dist-tag |
139
+ | ---------------- | -------------- | ------------ |
140
+ | `0.2.0-alpha.12` | 预发布 | `alpha` |
141
+ | `0.2.0` | 正式版 | `latest` |
142
+
143
+ 判断在 `releaseChannel()` 里,有判据钉着(`+build` 元数据不算预发布、纯数字标识落到 `next`)。
144
+ 之所以不写在 YAML 里:早先两处写死(`--prerelease` 与 `--tag alpha`)时,**给稳定版打标签会发出
145
+ 一个「标着预发布、npm 上仍留在旧 alpha」的版本,而日志里看不出任何异常** —— 这类判断必须可测。
146
+
147
+ 用户按 `@alpha` 取预览版,按包名取稳定版。
148
+
149
+ ⚠️ **全新包的第一个版本会被 npm 强制占住 `latest`** —— 包必须有一个 `latest`,
150
+ `--tag alpha` 拦不住这件事。所以在**还没有稳定版**期间,`latest` 会指向某个 alpha。
151
+ 这不等于「预览冒充稳定版」(用户显式要 `@alpha` 拿到的才是我们承诺的那条),
152
+ 但意味着 Desktop 社区市场**仍不会收录**:它要求 `latest` 是稳定精确版本
153
+ (见 [分发说明](distribution.md))。发稳定版时才把 `latest` 指过去。
154
+
155
+ ### 发布后复核
90
156
 
91
- 发布命令固定 `--tag alpha`。版本号带预发布段时如果不动 dist-tag,就会去写 `latest` ——
92
- 那等于把预览冒充稳定版,而 Desktop 的社区市场正是按「`latest` 是稳定精确版本」来判断的
93
- (见 [分发说明](distribution.md))。**发稳定版时**才改用 `latest`。
157
+ 1. `npm view dsh-web-annotator dist-tags` —— `alpha` 应指向刚发的版本。
158
+ 2. `npm install dsh-web-annotator@alpha` 真装一次。
159
+ ⚠️ 头几分钟可能报 `ETARGET … No matching version found`:那是 npm/CDN 的**传播延迟**,
160
+ 而 `npm view` 同时已经能看到新版本。**等几分钟再试,不是失败。**
94
161
 
95
162
  ## 不在这里的事
96
163
 
@@ -89,6 +89,28 @@ npm run verify:delivery
89
89
 
90
90
  明细落在本地未入库的 `integration/*.json`;这里只留可复述的结论。
91
91
 
92
+ ### 0.2.0-alpha.12(2026-10-12)
93
+
94
+ 本轮**不改插件代码**(界面行为与 alpha.11 相同),改的是发布链路:新增 npm 一路,
95
+ 认证走 OIDC Trusted Publishing,仓库里不存 token。本版同时是那条 Trusted Publisher
96
+ 连接的激活发布 —— 新建的连接有 2 天期限,过期即不可编辑。
97
+
98
+ | 项目 | 结果 |
99
+ | -------------------------- | ------------------------------------------------------------------------------------------ |
100
+ | 发布链 | 23 步一次通过;npm 那步的注解是 `published 0.2.0-alpha.12 to npm under the alpha dist-tag` |
101
+ | `npm run test:acceptance` | 打包产物 + 包内提供方,**26 项 Browser 检查通过**,0 个页面错误 |
102
+ | `npm run verify:delivery` | 交付的 tgz 与验收时安装的运行时逐字节一致,无变更文件 |
103
+ | **npm ↔ Release 字节一致** | 新增判据:npm 上 `dist.shasum` 与 Release 附件的 SHA-1 **完全相同** |
104
+
105
+ 最后那条是本轮真正要证的东西。alpha.11 是**在本机打的包**,与 Release 附件有 22 个文件不同 ——
106
+ 差异只在 provider 产物里写进的检出目录名(`../harness-browser-integration/…` 对 `.host-source/…`)
107
+ 以及三份发布后才改的文档,代码等价,但「发出去的就是验收过的那一份」在 npm 这条渠道上不成立。
108
+ 现在由 CI 在同一个 job 里构建、验收、发布,两个渠道拿到同一份字节。
109
+
110
+ ⚠️ **`latest` 会滞后**:npm 只在**全新包的首个版本**强制占用 `latest`,之后 `--tag alpha`
111
+ 不会去动它,所以 `latest` 停在 alpha.11。这不等于「预览冒充稳定版」,但 Desktop 社区市场
112
+ 仍不满足(它要求 `latest` 是稳定精确版本)。
113
+
92
114
  ### 0.2.0-alpha.11(2026-10-11)
93
115
 
94
116
  本轮只有一个改动:输入框左侧的“批注网页”从 `variant="toolbar"` 改成 `ghost`。
@@ -1,4 +1,4 @@
1
- /* ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css */
1
+ /* .host-source/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css */
2
2
  .Browser_root {
3
3
  display: flex;
4
4
  flex: 1 1 auto;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css"],
3
+ "sources": ["../../../.host-source/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css"],
4
4
  "sourcesContent": [".root {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n}\n\n.toolbar {\n display: flex;\n flex: 0 0 auto;\n gap: 4px;\n align-items: center;\n box-sizing: border-box;\n height: 38px;\n padding: 5px 6px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.tool {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n background: transparent;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n cursor: pointer;\n}\n\n.tool:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n\n.tool:disabled {\n color: var(--dsw-alias-label-quaternary);\n cursor: default;\n}\n\n.sandboxOff {\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n\n.addressBox {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.address {\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n padding: 0 34px 0 9px;\n color: var(--dsw-alias-label-primary);\n font: var(--dsw-font-xxs-12);\n background: var(--dsw-alias-bg-layer-1);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n}\n\n.addressGo {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n opacity: 0;\n}\n\n.addressBox:focus-within .addressGo {\n visibility: visible;\n opacity: 1;\n}\n\n.addressUnknown {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.addressUnknown:focus {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n}\n\n.addressChanged {\n position: absolute;\n top: 6px;\n right: 8px;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n line-height: 16px;\n pointer-events: none;\n background: var(--dsw-alias-bg-layer-2);\n}\n\n.addressBox:focus-within .addressChanged {\n visibility: hidden;\n opacity: 0;\n}\n\n.address:focus {\n outline: 1px solid var(--dsw-alias-state-business-primary);\n outline-offset: -1px;\n}\n\n.frame {\n display: flex;\n flex: 1 1 auto;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--dsw-alias-bg-base);\n}\n\n.content {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n\n.viewport {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n\n.placeholder {\n position: absolute;\n inset: 0;\n display: flex;\n pointer-events: none;\n}\n\n.restore {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 24px;\n overflow: auto;\n text-align: center;\n}\n\n.restoreLabel {\n margin: auto 0 0;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxs-12);\n}\n\n.restoreTitle {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n\n.restoreUrl {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n\n.restore > :last-child {\n flex-shrink: 0;\n margin-bottom: auto;\n}\n\n.webview {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n width: 100%;\n height: 100%;\n border: 0;\n -webkit-app-region: no-drag;\n}\n\n/* Native guest input must not consume a docking gesture's window events. */\n:global(html:has([data-dockkit-pointer])) .webview {\n pointer-events: none;\n}\n\n.start {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n min-height: 0;\n padding: 24px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xs-13);\n text-align: center;\n}\n\n.failure {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-state-error-primary);\n font: var(--dsw-font-xxxs-11);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n\n.sandboxWarning {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxxs-11);\n background: var(--dsw-alias-state-warn-tertiary);\n}\n\n.limit {\n flex: 0 0 auto;\n margin: 0;\n padding: 4px 10px;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n text-overflow: ellipsis;\n white-space: nowrap;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n\n.titleIcon {\n flex: 0 0 auto;\n margin-right: 4px;\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["root", "toolbar", "tool", "sandboxOff", "addressBox", "address", "addressGo", "addressUnknown", "addressChanged", "frame", "content", "viewport", "placeholder", "restore", "restoreLabel", "restoreTitle", "restoreUrl", "webview", "start", "failure", "sandboxWarning", "limit", "titleIcon"]
@@ -1,5 +1,5 @@
1
1
  window.__ModuleLoader__.load({ id: '@deepseek-ai/dsh-client-ui-sidebar-browser', factory: function(require) { var module = { exports: {} }; var exports = module.exports;
2
- const cssDispose = () => { const style = document.createElement('style'); style.textContent = "/* ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css */\n.Browser_root {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n}\n.Browser_toolbar {\n display: flex;\n flex: 0 0 auto;\n gap: 4px;\n align-items: center;\n box-sizing: border-box;\n height: 38px;\n padding: 5px 6px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l3);\n}\n.Browser_tool {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n background: transparent;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n cursor: pointer;\n}\n.Browser_tool:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.Browser_tool:disabled {\n color: var(--dsw-alias-label-quaternary);\n cursor: default;\n}\n.Browser_sandboxOff {\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n.Browser_addressBox {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n}\n.Browser_address {\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n padding: 0 34px 0 9px;\n color: var(--dsw-alias-label-primary);\n font: var(--dsw-font-xxs-12);\n background: var(--dsw-alias-bg-layer-1);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n}\n.Browser_addressGo {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n opacity: 0;\n}\n.Browser_addressBox:focus-within .Browser_addressGo {\n visibility: visible;\n opacity: 1;\n}\n.Browser_addressUnknown {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-bg-layer-2);\n}\n.Browser_addressUnknown:focus {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n}\n.Browser_addressChanged {\n position: absolute;\n top: 6px;\n right: 8px;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n line-height: 16px;\n pointer-events: none;\n background: var(--dsw-alias-bg-layer-2);\n}\n.Browser_addressBox:focus-within .Browser_addressChanged {\n visibility: hidden;\n opacity: 0;\n}\n.Browser_address:focus {\n outline: 1px solid var(--dsw-alias-state-business-primary);\n outline-offset: -1px;\n}\n.Browser_frame {\n display: flex;\n flex: 1 1 auto;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--dsw-alias-bg-base);\n}\n.Browser_content {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n.Browser_viewport {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n.Browser_placeholder {\n position: absolute;\n inset: 0;\n display: flex;\n pointer-events: none;\n}\n.Browser_restore {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 24px;\n overflow: auto;\n text-align: center;\n}\n.Browser_restoreLabel {\n margin: auto 0 0;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxs-12);\n}\n.Browser_restoreTitle {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n.Browser_restoreUrl {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n.Browser_restore > :last-child {\n flex-shrink: 0;\n margin-bottom: auto;\n}\n.Browser_webview {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n width: 100%;\n height: 100%;\n border: 0;\n -webkit-app-region: no-drag;\n}\nhtml:has([data-dockkit-pointer]) .Browser_webview {\n pointer-events: none;\n}\n.Browser_start {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n min-height: 0;\n padding: 24px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xs-13);\n text-align: center;\n}\n.Browser_failure {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-state-error-primary);\n font: var(--dsw-font-xxxs-11);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.Browser_sandboxWarning {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxxs-11);\n background: var(--dsw-alias-state-warn-tertiary);\n}\n.Browser_limit {\n flex: 0 0 auto;\n margin: 0;\n padding: 4px 10px;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n text-overflow: ellipsis;\n white-space: nowrap;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n.Browser_titleIcon {\n flex: 0 0 auto;\n margin-right: 4px;\n}\n/*# sourceMappingURL=client.css.map */\n"; document.head.append(style); return () => style.remove(); };
2
+ const cssDispose = () => { const style = document.createElement('style'); style.textContent = "/* .host-source/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css */\n.Browser_root {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-base);\n}\n.Browser_toolbar {\n display: flex;\n flex: 0 0 auto;\n gap: 4px;\n align-items: center;\n box-sizing: border-box;\n height: 38px;\n padding: 5px 6px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l3);\n}\n.Browser_tool {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n padding: 0;\n color: var(--dsw-alias-label-secondary);\n background: transparent;\n border: 0;\n border-radius: var(--dsw-radius-sm);\n cursor: pointer;\n}\n.Browser_tool:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-interactive-bg-hover);\n}\n.Browser_tool:disabled {\n color: var(--dsw-alias-label-quaternary);\n cursor: default;\n}\n.Browser_sandboxOff {\n color: var(--dsw-alias-state-error-primary);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);\n}\n.Browser_addressBox {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n}\n.Browser_address {\n width: 100%;\n height: 28px;\n box-sizing: border-box;\n padding: 0 34px 0 9px;\n color: var(--dsw-alias-label-primary);\n font: var(--dsw-font-xxs-12);\n background: var(--dsw-alias-bg-layer-1);\n border: 0.5px solid var(--dsw-alias-border-l2);\n border-radius: var(--dsw-radius-sm);\n}\n.Browser_addressGo {\n position: absolute;\n top: 0;\n right: 0;\n visibility: hidden;\n opacity: 0;\n}\n.Browser_addressBox:focus-within .Browser_addressGo {\n visibility: visible;\n opacity: 1;\n}\n.Browser_addressUnknown {\n --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2);\n --dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);\n color: var(--dsw-alias-label-tertiary);\n background: var(--dsw-alias-bg-layer-2);\n}\n.Browser_addressUnknown:focus {\n color: var(--dsw-alias-label-primary);\n background: var(--dsw-alias-bg-layer-1);\n}\n.Browser_addressChanged {\n position: absolute;\n top: 6px;\n right: 8px;\n padding-left: 8px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n line-height: 16px;\n pointer-events: none;\n background: var(--dsw-alias-bg-layer-2);\n}\n.Browser_addressBox:focus-within .Browser_addressChanged {\n visibility: hidden;\n opacity: 0;\n}\n.Browser_address:focus {\n outline: 1px solid var(--dsw-alias-state-business-primary);\n outline-offset: -1px;\n}\n.Browser_frame {\n display: flex;\n flex: 1 1 auto;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--dsw-alias-bg-base);\n}\n.Browser_content {\n position: relative;\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n.Browser_viewport {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n}\n.Browser_placeholder {\n position: absolute;\n inset: 0;\n display: flex;\n pointer-events: none;\n}\n.Browser_restore {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n padding: 24px;\n overflow: auto;\n text-align: center;\n}\n.Browser_restoreLabel {\n margin: auto 0 0;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxs-12);\n}\n.Browser_restoreTitle {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n font: var(--dsw-font-xs-13);\n font-weight: 500;\n}\n.Browser_restoreUrl {\n max-width: 100%;\n margin: 0;\n overflow-wrap: anywhere;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxs-12);\n}\n.Browser_restore > :last-child {\n flex-shrink: 0;\n margin-bottom: auto;\n}\n.Browser_webview {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n width: 100%;\n height: 100%;\n border: 0;\n -webkit-app-region: no-drag;\n}\nhtml:has([data-dockkit-pointer]) .Browser_webview {\n pointer-events: none;\n}\n.Browser_start {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n justify-content: center;\n min-height: 0;\n padding: 24px;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xs-13);\n text-align: center;\n}\n.Browser_failure {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-state-error-primary);\n font: var(--dsw-font-xxxs-11);\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);\n}\n.Browser_sandboxWarning {\n flex: 0 0 auto;\n padding: 6px 12px;\n color: var(--dsw-alias-label-secondary);\n font: var(--dsw-font-xxxs-11);\n background: var(--dsw-alias-state-warn-tertiary);\n}\n.Browser_limit {\n flex: 0 0 auto;\n margin: 0;\n padding: 4px 10px;\n overflow: hidden;\n color: var(--dsw-alias-label-tertiary);\n font: var(--dsw-font-xxxs-11);\n text-overflow: ellipsis;\n white-space: nowrap;\n border-top: 0.5px solid var(--dsw-alias-border-l3);\n}\n.Browser_titleIcon {\n flex: 0 0 auto;\n margin-right: 4px;\n}\n/*# sourceMappingURL=client.css.map */\n"; document.head.append(style); return () => style.remove(); };
3
3
 
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -19,7 +19,7 @@ var __copyProps = (to, from, except, desc) => {
19
19
  };
20
20
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
21
 
22
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/index.ts
22
+ // .host-source/packages/client/ui-sidebar-browser/src/client/index.ts
23
23
  var index_exports = {};
24
24
  __export(index_exports, {
25
25
  apply: () => apply,
@@ -27,11 +27,11 @@ __export(index_exports, {
27
27
  });
28
28
  module.exports = __toCommonJS(index_exports);
29
29
 
30
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/BrowserBody.tsx
30
+ // .host-source/packages/client/ui-sidebar-browser/src/client/view/BrowserBody.tsx
31
31
  var import_react = require("react");
32
32
  var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
33
33
 
34
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/BrowserFrame.ts
34
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserFrame.ts
35
35
  function emptyBrowserFrame() {
36
36
  return {
37
37
  target: void 0,
@@ -44,7 +44,7 @@ function emptyBrowserFrame() {
44
44
  };
45
45
  }
46
46
 
47
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/BrowserPersistence.ts
47
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserPersistence.ts
48
48
  function currentBrowserTarget(state) {
49
49
  return state === void 0 || state.index < 0 ? void 0 : state.entries[state.index];
50
50
  }
@@ -58,7 +58,7 @@ function browserAddressCheckpoint(target, revision) {
58
58
  };
59
59
  }
60
60
 
61
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css
61
+ // .host-source/packages/client/ui-sidebar-browser/src/client/view/Browser.module.css
62
62
  var Browser_default = {
63
63
  root: "Browser_root",
64
64
  toolbar: "Browser_toolbar",
@@ -85,7 +85,7 @@ var Browser_default = {
85
85
  titleIcon: "Browser_titleIcon"
86
86
  };
87
87
 
88
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/BrowserBody.tsx
88
+ // .host-source/packages/client/ui-sidebar-browser/src/client/view/BrowserBody.tsx
89
89
  var import_jsx_runtime = require("react/jsx-runtime");
90
90
  var EMPTY_FRAME = emptyBrowserFrame();
91
91
  function SandboxPolicyIcon({ sandboxed }) {
@@ -230,7 +230,7 @@ function BrowserBody(props) {
230
230
  ] });
231
231
  }
232
232
 
233
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/BrowserTitle.tsx
233
+ // .host-source/packages/client/ui-sidebar-browser/src/client/view/BrowserTitle.tsx
234
234
  var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
235
235
  var import_jsx_runtime2 = require("react/jsx-runtime");
236
236
  function BrowserTitle({ useTabInfo, useStore }) {
@@ -242,10 +242,10 @@ function BrowserTitle({ useTabInfo, useStore }) {
242
242
  ] });
243
243
  }
244
244
 
245
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/BrowserController.ts
245
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserController.ts
246
246
  var import_dsh_client_store = require("@deepseek-ai/dsh-client-store");
247
247
 
248
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/url.ts
248
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/url.ts
249
249
  var MAX_BROWSER_URL_LENGTH = 16 * 1024;
250
250
  function parseBrowserAddress(input, applicationOrigin) {
251
251
  const trimmed = input.trim();
@@ -272,7 +272,7 @@ function parseBrowserAddress(input, applicationOrigin) {
272
272
  return { ok: false, reason: "protocol" };
273
273
  }
274
274
 
275
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/BrowserController.ts
275
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserController.ts
276
276
  var BrowserController = class {
277
277
  /** @param options - identity, persistence, page factory and source-tab navigation. */
278
278
  constructor(options) {
@@ -523,10 +523,10 @@ function createBrowserControllers(actions, createPage, isTabOpen) {
523
523
  };
524
524
  }
525
525
 
526
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/IframeImpl.ts
526
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/IframeImpl.ts
527
527
  var import_dsh_client_store2 = require("@deepseek-ai/dsh-client-store");
528
528
 
529
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/BrowserNavigation.ts
529
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/BrowserNavigation.ts
530
530
  var MAX_BROWSER_HISTORY = 100;
531
531
  var BrowserNavigation = class _BrowserNavigation {
532
532
  value;
@@ -642,7 +642,7 @@ var BrowserNavigation = class _BrowserNavigation {
642
642
  }
643
643
  };
644
644
 
645
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/IframeImpl.ts
645
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/IframeImpl.ts
646
646
  var IframeImpl = class {
647
647
  /** @param options - initial checkpoint and persistence writer. @param presentation - iframe DOM adapter. */
648
648
  constructor(options, presentation) {
@@ -744,7 +744,7 @@ var IframeImpl = class {
744
744
  }
745
745
  };
746
746
 
747
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/annotation/protocol.ts
747
+ // .host-source/packages/client/ui-sidebar-browser/src/client/annotation/protocol.ts
748
748
  function object(value) {
749
749
  return !!value && typeof value === "object" && !Array.isArray(value);
750
750
  }
@@ -800,7 +800,7 @@ function isAnnotationResult(value) {
800
800
  }
801
801
  }
802
802
 
803
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/annotation/iframe-annotation.ts
803
+ // .host-source/packages/client/ui-sidebar-browser/src/client/annotation/iframe-annotation.ts
804
804
  function annotateIframe(frame, url, options, signal) {
805
805
  if (signal.aborted) return Promise.resolve({ cancelled: true });
806
806
  return new Promise((resolve, reject) => {
@@ -860,7 +860,7 @@ function annotateIframe(frame, url, options, signal) {
860
860
  });
861
861
  }
862
862
 
863
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/view/IframePresentation.ts
863
+ // .host-source/packages/client/ui-sidebar-browser/src/client/view/IframePresentation.ts
864
864
  var WEB_BROWSER_SANDBOX = "allow-scripts allow-forms allow-same-origin allow-popups allow-popups-to-escape-sandbox";
865
865
  var IframePresentation = class {
866
866
  /** @param events - provider-owned load and remount callbacks. */
@@ -932,7 +932,7 @@ var IframePresentation = class {
932
932
  }
933
933
  };
934
934
 
935
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/pages.ts
935
+ // .host-source/packages/client/ui-sidebar-browser/src/client/pages.ts
936
936
  function createIframePage(options) {
937
937
  const presentation = new IframePresentation({
938
938
  loaded: (revision) => {
@@ -949,7 +949,7 @@ function createIframePage(options) {
949
949
  return { frame, presentation };
950
950
  }
951
951
 
952
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/electron/ElectronWebViewImpl.ts
952
+ // .host-source/packages/client/ui-sidebar-browser/src/client/electron/ElectronWebViewImpl.ts
953
953
  var import_dsh_client_store3 = require("@deepseek-ai/dsh-client-store");
954
954
  var ElectronWebViewImpl = class {
955
955
  /**
@@ -1217,7 +1217,7 @@ var ElectronWebViewImpl = class {
1217
1217
  }
1218
1218
  };
1219
1219
 
1220
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/annotation/page-inspector.ts
1220
+ // .host-source/packages/client/ui-sidebar-browser/src/client/annotation/page-inspector.ts
1221
1221
  function annotatePage(options) {
1222
1222
  window.__DSH_PAGE_ANNOTATION_CANCEL__?.();
1223
1223
  const doc = document;
@@ -1992,7 +1992,7 @@ function annotatePage(options) {
1992
1992
  return result;
1993
1993
  }
1994
1994
 
1995
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/annotation/screenshot.ts
1995
+ // .host-source/packages/client/ui-sidebar-browser/src/client/annotation/screenshot.ts
1996
1996
  async function markScreenshot(dataUrl, annotation) {
1997
1997
  const picture = new Image();
1998
1998
  picture.src = dataUrl;
@@ -2030,7 +2030,7 @@ async function markScreenshot(dataUrl, annotation) {
2030
2030
  return { mediaType: "image/jpeg", data, width: canvas.width, height: canvas.height };
2031
2031
  }
2032
2032
 
2033
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/electron/ElectronWebviewPresentation.ts
2033
+ // .host-source/packages/client/ui-sidebar-browser/src/client/electron/ElectronWebviewPresentation.ts
2034
2034
  var ElectronWebviewPresentation = class {
2035
2035
  constructor(events) {
2036
2036
  this.events = events;
@@ -2137,7 +2137,7 @@ var ElectronWebviewPresentation = class {
2137
2137
  }
2138
2138
  };
2139
2139
 
2140
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/electron/pages.ts
2140
+ // .host-source/packages/client/ui-sidebar-browser/src/client/electron/pages.ts
2141
2141
  function createElectronPage(options, bridge, workspace) {
2142
2142
  const presentation = new ElectronWebviewPresentation({
2143
2143
  mounted: () => {
@@ -2151,7 +2151,7 @@ function createElectronPage(options, bridge, workspace) {
2151
2151
  return { frame, presentation };
2152
2152
  }
2153
2153
 
2154
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/electron/workspace.ts
2154
+ // .host-source/packages/client/ui-sidebar-browser/src/client/electron/workspace.ts
2155
2155
  async function browserWorkspace(source, sessionId, signal) {
2156
2156
  signal.throwIfAborted();
2157
2157
  if (source.getSnapshot().phase !== "ready") {
@@ -2175,7 +2175,7 @@ async function browserWorkspace(source, sessionId, signal) {
2175
2175
  return workspace === void 0 ? `session:${sessionId}` : `cwd:${workspace.path}`;
2176
2176
  }
2177
2177
 
2178
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/definition.tsx
2178
+ // .host-source/packages/client/ui-sidebar-browser/src/client/definition.tsx
2179
2179
  var import_dsh_client_ui_primitives3 = require("@deepseek-ai/dsh-client-ui-primitives");
2180
2180
  var BROWSER_KIND = "browser";
2181
2181
  var BROWSER_ID = "@deepseek-ai/dsh-client-ui-sidebar-browser";
@@ -2197,7 +2197,7 @@ function browserDefinition(t) {
2197
2197
  };
2198
2198
  }
2199
2199
 
2200
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/locales.ts
2200
+ // .host-source/packages/client/ui-sidebar-browser/src/client/locales.ts
2201
2201
  var zh = {
2202
2202
  "type.label": "\u6D4F\u89C8\u5668",
2203
2203
  "guide.title": "\u6D4F\u89C8\u5668",
@@ -2255,7 +2255,7 @@ var en = {
2255
2255
  "address.unknown": "The page navigated; this carrier cannot read its new URL."
2256
2256
  };
2257
2257
 
2258
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/browser/store.ts
2258
+ // .host-source/packages/client/ui-sidebar-browser/src/client/browser/store.ts
2259
2259
  var import_dsh_client_store4 = require("@deepseek-ai/dsh-client-store");
2260
2260
  function createBrowserStore() {
2261
2261
  return (0, import_dsh_client_store4.defineStore)({
@@ -2276,7 +2276,7 @@ function createBrowserStore() {
2276
2276
  });
2277
2277
  }
2278
2278
 
2279
- // ../harness-browser-integration/packages/client/ui-sidebar-browser/src/client/index.ts
2279
+ // .host-source/packages/client/ui-sidebar-browser/src/client/index.ts
2280
2280
  var inject = ["slots", "locale", "sidebarRight", "sidebarRightTabs"];
2281
2281
  function apply(ctx) {
2282
2282
  ctx.effect(cssDispose);