dsh-tender-workbench 0.5.1 → 0.5.3

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
@@ -4,6 +4,16 @@ All notable changes to `dsh-tender-workbench` are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.5.3] - 2026-09-08
8
+
9
+ - 改善搜索元数据、安装说明、能力边界与四产品互链;无运行时或依赖变更。
10
+
11
+ ## [0.5.2] - 2026-09-07
12
+
13
+ ### Changed
14
+
15
+ - 首页输入框下方四个快捷入口对齐共享规范 v1.1.3:上图标、下文字的描边卡片,单行排列、窄屏内部横向滚动,浅深色与悬停/键盘焦点沿用企查查蓝;保留点击才打开工作台的交互。
16
+
7
17
  ## [0.5.1] - 2026-09-06
8
18
 
9
19
  ### Fixed
package/README.en.md CHANGED
@@ -1,10 +1,16 @@
1
1
  # dsh-tender-workbench
2
2
 
3
+ Tender search and bid intelligence in DeepSeek Harness with proposed project search, rule screening, human review and Excel/PDF exports using user-authorized Qichacha MCP.
4
+
5
+ Install a pinned release using the command in the [Chinese quick start](README.md), review the preview or evidence before confirming, and keep the previous version and task-directory backup for rollback. Qichacha calls use the customer's authorized account.
6
+
7
+ Related agents: [数据清洗补全](https://github.com/duhu2000/dsh-data-cleaning-agent) · [AI填表](https://github.com/duhu2000/dsh-form-fill-agent) · [访前尽调](https://github.com/duhu2000/dsh-pre-duediligence) · [招投标](https://github.com/duhu2000/dsh-tender-workbench)
8
+
3
9
  [中文](README.md) | **English**
4
10
 
5
11
  `dsh-tender-workbench` is an open-source DeepSeek Harness plugin for finding, screening, reviewing, and delivering tender opportunities. It combines authorized `qcc-tender` data, deterministic screening rules, bounded Agent analysis, explicit human decisions, and immutable Excel/PDF reports in one Session-scoped Better Sidebar workbench.
6
12
 
7
- Current stable version: **0.5.1** (stable release).
13
+ Current stable version: **0.5.3** (stable release).
8
14
 
9
15
  ## What it does
10
16
 
@@ -67,12 +73,12 @@ dsh plugin --profile web add dsh-tender-workbench
67
73
  dsh web --no-open
68
74
  ```
69
75
 
70
- To install the exact 0.5.1 release:
76
+ To install the exact 0.5.2 release:
71
77
 
72
78
  ```sh
73
79
  dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
74
80
  dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
75
- dsh plugin --profile web add dsh-tender-workbench@0.5.1
81
+ dsh plugin --profile web add dsh-tender-workbench@0.5.3
76
82
  ```
77
83
 
78
84
  To install from an independent checkout, install the required Provider plugins first, then run from this repository:
@@ -91,7 +97,7 @@ To install a packed build:
91
97
  ```sh
92
98
  dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
93
99
  dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
94
- dsh plugin --profile web add ./dsh-tender-workbench-0.5.1.tgz
100
+ dsh plugin --profile web add ./dsh-tender-workbench-0.5.2.tgz
95
101
  dsh web --no-open
96
102
  ```
97
103
 
@@ -108,15 +114,24 @@ dsh plugin --profile web remove dsh-tender-workbench
108
114
  Upgrade an existing installation by installing the stable version and fully restarting the Web profile:
109
115
 
110
116
  ```sh
111
- dsh plugin --profile web add dsh-tender-workbench@0.5.1
117
+ dsh plugin --profile web add dsh-tender-workbench@0.5.3
112
118
  dsh web --no-open
113
119
  ```
114
120
 
115
- Version 0.5.1 keeps the workbench closed when entering through the Tender menu. Below-composer shortcuts explicitly open the corresponding workbench view; the header recovery action remains available. QCC-blue branding, the prompt wizard, session isolation, global sidebar preferences, history and Artifact schemas remain unchanged. To roll back, reinstall `dsh-tender-workbench@0.5.0` and restart the profile; entry will auto-open the workbench again. Published versions and tags remain immutable.
121
+ Version 0.5.2 aligns below-composer shortcuts with shared UI specification v1.1.3: outlined cards with an icon above each label, light/dark styling, a single horizontally scrollable row on narrow screens, and fully visible keyboard-focused cards. The workbench stays closed on entry and opens only on an explicit shortcut click, as in 0.5.1. Session isolation, global sidebar preferences, history and Artifact schemas remain unchanged. To roll back, reinstall `dsh-tender-workbench@0.5.1` and restart the profile. Published versions and tags remain immutable.
116
122
 
117
123
  ## Using the workbench
118
124
 
119
- The plugin exposes a top-left “招投标” launcher and a Session Header recovery action. Every top-left activation creates a distinct native Session in the current Session's workspace, the recent workspace, or the first available workspace, gives that blank Session the “招投标” hero label and goal icon, and opens its Better Sidebar workbench. Other Sessions keep their existing host/provider hero label and the fish mark. The composer-bottom shortcuts are intentionally absent; the Header action only reopens the workbench for its existing Session.
125
+ The top-left “招投标” launcher creates a distinct native Session using the current, recent, or first available workspace path. It shows the “招投标智能体” title and goal icon without opening the workbench. Below-composer shortcuts explicitly open the query, screening, review, or delivery view; the Session Header recovery action remains available. Other Sessions retain their original branding.
126
+
127
+ ## Interface examples and marketplace submission
128
+
129
+ These screenshots show the actual 0.5.2 React components in an isolated host fixture, visibly labeled as isolated UI validation without DSH/MCP connections. They contain no customer information or real business responses. They do not demonstrate live DSH/QCC operation or marketplace one-click installation.
130
+
131
+ ![Light homepage — isolated component demo](assets/market/home-light.png)
132
+ ![Dark homepage — isolated component demo](assets/market/home-dark.png)
133
+
134
+ See [submission status and isolated install/uninstall evidence](docs/MARKET-SUBMISSION.md). An open PR is not a completed marketplace listing.
120
135
 
121
136
  Navigation only changes the visible workbench phase. It does not mutate business state or run a later action. Criteria are proposed, edited, previewed, and confirmed as distinct steps. Agent recommendations never become user decisions automatically. Report generation always shows the reviewed and pending scope before creating a delivery snapshot.
122
137
 
@@ -137,7 +152,7 @@ The build emits the Host loader at `lib/index.js`, the Client bundle at `lib/cli
137
152
 
138
153
  The province, city, and district source snapshot is maintained in [resources/area.ts](resources/area.ts).
139
154
 
140
- See [CHANGELOG.md](CHANGELOG.md) and [the 0.5.1 release checklist](docs/RELEASE-0.5.1.md) for the stable-release scope and operational checks.
155
+ See [CHANGELOG.md](CHANGELOG.md) and [the 0.5.2 release checklist](docs/RELEASE-0.5.2.md) for the stable-release scope and operational checks.
141
156
 
142
157
  ## Current scope
143
158
 
package/README.md CHANGED
@@ -1,10 +1,31 @@
1
1
  # dsh-tender-workbench
2
2
 
3
+ ## 安装与三分钟上手
4
+
5
+ 招投标智能体:支持招投标搜索、招标查询、投标查询、标讯查询、拟建项目与项目筛选,辅助商机发现、人工复核及 Excel/PDF 导出,使用客户自备授权的企查查 MCP。
6
+
7
+ ```sh
8
+ dsh plugin --profile web add dsh-tender-workbench@0.5.3
9
+ ```
10
+
11
+ 请先满足下文的 DSH、连接器及侧边栏依赖要求;安装后完整停止并重启对应 Profile。
12
+
13
+ 进入“招投标”,设置地区、关键词和时间范围,使用已授权的 qcc-tender 查询。检查规则影响预览并确认筛选条件,人工复核记录后选择导出 Excel 或 PDF。三分钟用于熟悉操作,不承诺查询或报告一定在三分钟完成。
14
+
15
+ **流程样例(示意,非真实调用结果):** 地区/日期/关键词 → 标讯与拟建项目 → 规则影响预览 → 人工复核 → Excel/PDF(未完成复核会标注部分交付)。
16
+
17
+ **能力边界:** 投标查询指已授权数据源内的公开标讯查询,不代办投标。无 Web 搜索兜底、订阅或自动 Bid/No-Bid 决策;不提供在线 PDF 预览。
18
+
19
+ **升级与回滚:** 升级前停止 Profile 并备份任务目录,记录当前精确版本;使用上面的固定版本命令升级,再完整重启。回滚时将版本号替换为升级前记录的版本,并使用升级前任务目录副本;不以旧版直接读取已迁移任务目录。
20
+
21
+ 相关智能体:[数据清洗补全](https://github.com/duhu2000/dsh-data-cleaning-agent) · [AI填表](https://github.com/duhu2000/dsh-form-fill-agent) · [访前尽调](https://github.com/duhu2000/dsh-pre-duediligence) · [招投标](https://github.com/duhu2000/dsh-tender-workbench)
22
+
23
+
3
24
  **中文** | [English](README.en.md)
4
25
 
5
26
  > 面向国内招投标团队的 DeepSeek Harness 开源智能体插件:在一个会话级工作台内完成标讯与拟建项目查询、确定性规则初筛、限定范围智能分析、人工复核,以及 Excel/PDF 报告交付。
6
27
  >
7
- > 当前稳定版本:**0.5.1**(正式版本)
28
+ > 当前稳定版本:**0.5.3**(正式版本)
8
29
 
9
30
  [![CI](https://github.com/duhu2000/dsh-tender-workbench/actions/workflows/ci.yml/badge.svg)](https://github.com/duhu2000/dsh-tender-workbench/actions/workflows/ci.yml)
10
31
  [![npm](https://img.shields.io/npm/v/dsh-tender-workbench)](https://www.npmjs.com/package/dsh-tender-workbench)
@@ -49,10 +70,10 @@ dsh web --no-open
49
70
 
50
71
  安装或移除插件后,请完整重启 Web Profile。插件通过 `dsh.bundle.patch` 启用 `cordis.patch.yml`,并注册 `dsh-tender-workbench` Loader。
51
72
 
52
- 安装指定的 `0.5.1` 版本:
73
+ 安装指定的 `0.5.3` 版本:
53
74
 
54
75
  ```sh
55
- dsh plugin --profile web add dsh-tender-workbench@0.5.1
76
+ dsh plugin --profile web add dsh-tender-workbench@0.5.3
56
77
  ```
57
78
 
58
79
  移除插件:
@@ -63,7 +84,7 @@ dsh plugin --profile web remove dsh-tender-workbench
63
84
 
64
85
  ## 使用工作台
65
86
 
66
- 插件提供左上角“招投标”入口和会话 Header 恢复入口。点击左上角入口会在当前工作区、最近工作区或第一个可用工作区中创建一个独立的原生会话,为空白会话显示“招投标”标题与目标图标,并打开对应的 Better Sidebar 工作台;其他会话继续保留各自原有标题与标识。
87
+ 插件提供左上角“招投标”入口和会话 Header 恢复入口。点击左上角入口会根据当前工作区、最近工作区或第一个可用工作区的路径创建独立原生会话,显示“招投标智能体”标题与目标图标,默认不打开右侧工作台。点击输入框下方的项目查询、规则筛选、人工复核或结果交付按钮时,才打开对应 Better Sidebar 视图;其他会话保留各自原有标题与标识。
67
88
 
68
89
  页面导航只切换可见阶段,不会修改业务状态或自动执行后续动作。规则建议、编辑、影响预览与确认彼此独立;报告生成前始终展示已复核和待复核范围。宽屏使用主从布局,中窄屏保持相同信息顺序,并保留局部表格滚动与可访问的固定操作区。
69
90
 
@@ -98,11 +119,11 @@ dsh plugin --profile web remove dsh-tender-workbench
98
119
  从已有版本升级:
99
120
 
100
121
  ```sh
101
- dsh plugin --profile web add dsh-tender-workbench@0.5.1
122
+ dsh plugin --profile web add dsh-tender-workbench@0.5.3
102
123
  dsh web --no-open
103
124
  ```
104
125
 
105
- 本次 0.5.1 修正初始页交互:「招投标」菜单仅进入独立会话,不自动创建或展开右侧工作台;点击输入框下方功能按钮才打开对应页面,会话头恢复入口保留。延续 0.5.0 的企查查蓝 UI 与提示词向导,以及普通新会话隔离保护。不修改宿主全局侧栏偏好、历史布局或业务数据。如需回退,可安装 `dsh-tender-workbench@0.5.0` 并重启 Profile;菜单自动展开问题也会恢复。npm 版本与公开 Git 标签保持不可变。
126
+ 0.5.3 更新搜索与安装文档,保留 0.5.2 的运行时行为。0.5.2 对齐共享规范 v1.1.3:首页输入框下方四个快捷入口采用上图标、下文字的描边卡片,支持浅深色、窄屏单行横向滚动与键盘聚焦完整可见。延续 0.5.1 的默认收起行为:「招投标」菜单仅进入独立会话,点击下方按钮才打开工作台。不修改宿主全局侧栏偏好、历史布局或业务数据。如需回退,可安装 `dsh-tender-workbench@0.5.1` 并重启 Profilenpm 版本与公开 Git 标签保持不可变。
106
127
 
107
128
  ## 本地开发
108
129
 
@@ -117,9 +138,18 @@ corepack pnpm@11.7.0 run check
117
138
 
118
139
  `check` 会执行类型检查、完整 Vitest 测试、生产构建、README/发布状态校验以及 npm tarball 白名单预检。配置 npm Trusted Publishing 后,[发布工作流](.github/workflows/release.yml)可使用 OIDC 和 provenance;手工发布不得声称 provenance。
119
140
 
120
- 省、市、区数据源快照维护在 [resources/area.ts](resources/area.ts)。版本变更见 [CHANGELOG.md](CHANGELOG.md),发布检查见 [0.5.1 发布清单](docs/RELEASE-0.5.1.md)。
141
+ 省、市、区数据源快照维护在 [resources/area.ts](resources/area.ts)。版本变更见 [CHANGELOG.md](CHANGELOG.md),发布检查见 [0.5.3 发布清单](docs/RELEASE-0.5.3.md)。
142
+
143
+ ## 界面演示与市场投稿
144
+
145
+ 以下为 0.5.2 实际 React 组件在隔离宿主夹具中的截图,画面标注“隔离 UI 验证 · 不连接 DSH / MCP”。无客户信息、生产会话或真实业务响应;仅展示界面,不代表真实 DSH 启动、QCC 查询或市场一键安装验收。
146
+
147
+ ![浅色首页(隔离组件演示)](assets/market/home-light.png)
148
+ ![深色首页(隔离组件演示)](assets/market/home-dark.png)
149
+
150
+ 市场投稿状态及隔离安装/卸载证据见 [市场登记](docs/MARKET-SUBMISSION.md)。提交 PR 不等于已经上架。
121
151
 
122
- ## 当前范围
152
+ ## 业务范围限制
123
153
 
124
154
  当前版本不提供在线 PDF 预览、交付版本对比、已成功文件的重复生成、订阅、CRM 跟进、企业画像、来源准确性核验或 Bid/No-Bid 决策。查询、分类、分析和复核都可以作为合法结束点;只有用户明确操作后,后续阶段才会继续。
125
155
 
@@ -0,0 +1,8 @@
1
+ # dsh-tender-workbench 0.5.3
2
+
3
+ Version: **0.5.3**
4
+ Status: **release candidate**
5
+
6
+ 本次仅优化搜索发现与安装转化:更新 npm description/keywords、README 安装首屏、真实能力边界、示意流程、升级回滚与四产品互链。运行时功能与依赖版本不变。
7
+
8
+ 发布前执行项目完整 check;发布后核验 npm 精确版本、latest、README 与 provenance。回滚可安装 dsh-tender-workbench@0.5.2,使用升级前任务目录副本。
package/lib/client.js CHANGED
@@ -4762,7 +4762,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4762
4762
  }
4763
4763
  //#endregion
4764
4764
  //#region \0dsh-tender-workbench-css:/home/runner/work/dsh-tender-workbench/dsh-tender-workbench/src/client/workbench-entry.module.css.mjs
4765
- const css$2 = ".X4SUna_topMount{flex:none;width:100%;min-width:0}.X4SUna_topEntry{box-sizing:border-box;width:100%;padding-right:var(--dsh-sidebar-inline-padding,12px)}.X4SUna_headerButton{color:var(--text-secondary,#475467);cursor:pointer;font:inherit;background:0 0;border:0;justify-content:center;align-items:center;gap:6px;display:inline-flex}.X4SUna_sidebarButton:disabled{cursor:wait;opacity:.62}.X4SUna_sidebarButton{box-sizing:border-box;white-space:nowrap;border-radius:6px;flex:none;justify-content:flex-start;gap:8px;width:100%;min-width:0;height:42px;margin:0 0 8px;padding:0 10px;overflow:hidden}.X4SUna_sidebarRail{border-radius:50%;justify-content:center;width:36px;height:36px;padding:0}.X4SUna_sidebarError{color:#b42318;overflow-wrap:anywhere;padding:2px 12px 7px;font-size:11px;line-height:16px;display:block}.X4SUna_headerButton{border:1px solid var(--border-color,#e5e7eb);border-radius:999px;min-height:26px;padding:4px 8px;font-size:11px}.X4SUna_headerButton[data-workbench-status=running]{border-color:var(--qcc-border);color:var(--qcc-action)}.X4SUna_headerButton[data-workbench-status=failed],.X4SUna_headerButton[data-workbench-status=unavailable]{color:#b42318;border-color:#d92d2066}.X4SUna_topEntry[data-wide=false] .X4SUna_sidebarError{clip:rect(0, 0, 0, 0);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.X4SUna_sidebarButton>svg{color:var(--qcc-action)}.X4SUna_sidebarButton:hover,.X4SUna_sidebarButton[aria-current=page]{color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_headerButton{color:var(--qcc-action);border-color:var(--qcc-border);border-radius:6px}.X4SUna_headerButton:hover,.X4SUna_headerButton:focus-visible{color:var(--qcc-hover);background:var(--qcc-selected)}.X4SUna_heroMount{width:100%;min-width:0}.X4SUna_hero{text-align:center;margin:0 auto 16px}.X4SUna_heroRow{justify-content:center;align-items:center;gap:12px;display:flex}.X4SUna_heroRow h1{color:var(--qcc-text);margin:0;font-family:inherit;font-size:28px;font-weight:650;line-height:1.3}.X4SUna_heroLogo{width:48px;height:48px;color:var(--qcc-action);background:var(--qcc-selected);border-radius:12px;flex:none;place-items:center;display:grid}.X4SUna_hero p{color:var(--qcc-muted);margin:12px 16px 0;font-size:14px;line-height:1.6}.X4SUna_shortcutMount{flex:none;width:100%;min-width:0}.X4SUna_shortcuts{flex-wrap:wrap;justify-content:center;gap:8px;padding:16px 0 0;display:flex}.X4SUna_shortcuts button{border:1px solid var(--qcc-border);color:var(--qcc-muted);background:var(--qcc-surface);font:inherit;cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:10px 14px;font-size:14px;display:inline-flex}.X4SUna_shortcuts button span{color:var(--qcc-action);font-size:12px;font-weight:600}.X4SUna_shortcuts button:hover{border-color:var(--qcc-action);color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_promptEntry{z-index:40;pointer-events:none;position:absolute;inset:0}[data-composer-card]:has(.X4SUna_promptEntry){padding-top:48px}.X4SUna_promptEntry .X4SUna_promptTrigger{pointer-events:auto;position:absolute;top:10px;left:16px}.X4SUna_promptEntry .X4SUna_promptNotice{position:absolute;top:16px;left:140px;right:16px}.X4SUna_promptTrigger{border:1px solid var(--qcc-border);background:var(--qcc-selected);color:var(--qcc-action);font:inherit;cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:6px 10px;font-size:12px;display:inline-flex}.X4SUna_promptNotice{color:var(--qcc-muted);font-size:12px}.X4SUna_backdrop{z-index:2000;pointer-events:auto;box-sizing:border-box;background:#0a18286b;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.X4SUna_dialog{background:var(--qcc-surface);width:min(720px,100%);min-height:0;max-height:calc(100dvh - 48px);color:var(--qcc-text);border:1px solid var(--qcc-border);border-radius:12px;grid-template-rows:auto minmax(0,1fr) auto;font:14px/1.6 PingFang SC,Microsoft YaHei,sans-serif;display:grid;overflow:hidden;box-shadow:0 20px 60px #00000038}.X4SUna_dialog *{box-sizing:border-box}.X4SUna_dialogHeader{border-bottom:1px solid var(--qcc-border);justify-content:space-between;align-items:flex-start;gap:12px;padding:20px 24px;display:flex}.X4SUna_dialogHeader h2{margin:0;font-size:20px}.X4SUna_dialogHeader p{color:var(--qcc-muted);margin:8px 0 0;font-size:12px}.X4SUna_dialog button{border:1px solid var(--qcc-border);min-height:36px;color:var(--qcc-text);background:var(--qcc-surface);font:inherit;cursor:pointer;border-radius:6px;padding:8px 12px}.X4SUna_dialog button:hover{color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_dialog .X4SUna_closeButton{flex:none;width:36px;padding:0;font-size:22px}.X4SUna_dialogBody{overscroll-behavior:contain;gap:20px;min-height:0;padding:24px;display:grid;overflow:auto}.X4SUna_dialogBody fieldset{border:0;min-width:0;margin:0;padding:0}.X4SUna_dialogBody legend{padding:0 0 8px;font-weight:600}.X4SUna_scopeGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;display:grid}.X4SUna_scopeGrid label{border:1px solid var(--qcc-border);cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:12px;display:flex}.X4SUna_scopeGrid label[data-selected=true]{border-color:var(--qcc-action);color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_scopeGrid input{accent-color:var(--qcc-action);margin:0}.X4SUna_formField{flex-wrap:wrap;gap:8px;font-weight:600;display:flex}.X4SUna_formField span{color:var(--qcc-muted);font-size:12px;font-weight:400}.X4SUna_formField :where(input,textarea,select){border:1px solid var(--qcc-border);width:100%;min-width:0;color:var(--qcc-text);background:var(--qcc-surface);font:inherit;border-radius:6px;padding:10px 12px;font-weight:400}.X4SUna_formField textarea{resize:vertical}.X4SUna_fieldGrid{grid-template-columns:1fr 1fr;gap:16px;display:grid}.X4SUna_formHint{color:var(--qcc-muted);margin:0;font-size:12px}.X4SUna_promptPreview{border:1px solid var(--qcc-border);background:var(--qcc-page);border-radius:8px;padding:12px}.X4SUna_promptPreview summary{color:var(--qcc-action);cursor:pointer}.X4SUna_promptPreview pre{white-space:pre-wrap;overflow-wrap:anywhere;font:inherit}.X4SUna_dialogFooter{border-top:1px solid var(--qcc-border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:16px 24px;display:flex}.X4SUna_dialogFooter>:where(span,p){color:var(--qcc-muted);margin:0;font-size:12px}.X4SUna_dialogActions{flex-wrap:wrap;gap:8px;display:flex}.X4SUna_dialog .X4SUna_action{border-color:var(--qcc-action);color:var(--qcc-on-action);background:var(--qcc-action)}.X4SUna_dialog .X4SUna_action:hover{border-color:var(--qcc-hover);color:var(--qcc-on-action);background:var(--qcc-hover)}@media (width<=600px){.X4SUna_heroRow h1{font-size:22px}.X4SUna_heroLogo{border-radius:8px;width:40px;height:40px}.X4SUna_heroLogo svg{width:24px;height:24px}.X4SUna_shortcuts{grid-template-columns:1fr 1fr;display:grid}.X4SUna_shortcuts button{justify-content:center;padding:8px}.X4SUna_backdrop{padding:12px}.X4SUna_dialog{max-height:calc(100dvh - 24px)}.X4SUna_dialogHeader,.X4SUna_dialogBody,.X4SUna_dialogFooter{padding:16px}.X4SUna_fieldGrid{grid-template-columns:1fr}.X4SUna_scopeGrid{gap:4px}.X4SUna_scopeGrid label{gap:4px;padding:8px 4px;font-size:12px}.X4SUna_formField :where(input,textarea,select){font-size:16px}}";
4765
+ const css$2 = ".X4SUna_topMount{flex:none;width:100%;min-width:0}.X4SUna_topEntry{box-sizing:border-box;width:100%;padding-right:var(--dsh-sidebar-inline-padding,12px)}.X4SUna_headerButton{color:var(--text-secondary,#475467);cursor:pointer;font:inherit;background:0 0;border:0;justify-content:center;align-items:center;gap:6px;display:inline-flex}.X4SUna_sidebarButton:disabled{cursor:wait;opacity:.62}.X4SUna_sidebarButton{box-sizing:border-box;white-space:nowrap;border-radius:6px;flex:none;justify-content:flex-start;gap:8px;width:100%;min-width:0;height:42px;margin:0 0 8px;padding:0 10px;overflow:hidden}.X4SUna_sidebarRail{border-radius:50%;justify-content:center;width:36px;height:36px;padding:0}.X4SUna_sidebarError{color:#b42318;overflow-wrap:anywhere;padding:2px 12px 7px;font-size:11px;line-height:16px;display:block}.X4SUna_headerButton{border:1px solid var(--border-color,#e5e7eb);border-radius:999px;min-height:26px;padding:4px 8px;font-size:11px}.X4SUna_headerButton[data-workbench-status=running]{border-color:var(--qcc-border);color:var(--qcc-action)}.X4SUna_headerButton[data-workbench-status=failed],.X4SUna_headerButton[data-workbench-status=unavailable]{color:#b42318;border-color:#d92d2066}.X4SUna_topEntry[data-wide=false] .X4SUna_sidebarError{clip:rect(0, 0, 0, 0);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.X4SUna_sidebarButton>svg{color:var(--qcc-action)}.X4SUna_sidebarButton:hover,.X4SUna_sidebarButton[aria-current=page]{color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_headerButton{color:var(--qcc-action);border-color:var(--qcc-border);border-radius:6px}.X4SUna_headerButton:hover,.X4SUna_headerButton:focus-visible{color:var(--qcc-hover);background:var(--qcc-selected)}.X4SUna_heroMount{width:100%;min-width:0}.X4SUna_hero{text-align:center;margin:0 auto 16px}.X4SUna_heroRow{justify-content:center;align-items:center;gap:12px;display:flex}.X4SUna_heroRow h1{color:var(--qcc-text);margin:0;font-family:inherit;font-size:28px;font-weight:650;line-height:1.3}.X4SUna_heroLogo{width:48px;height:48px;color:var(--qcc-action);background:var(--qcc-selected);border-radius:12px;flex:none;place-items:center;display:grid}.X4SUna_hero p{color:var(--qcc-muted);margin:12px 16px 0;font-size:14px;line-height:1.6}.X4SUna_shortcutMount{flex:none;width:100%;min-width:0}.X4SUna_shortcuts{box-sizing:border-box;scrollbar-width:none;flex-wrap:nowrap;justify-content:safe center;align-items:center;gap:8px;width:100%;min-width:0;max-width:780px;margin:18px auto 0;padding:5px 16px;display:flex;overflow-x:auto}.X4SUna_shortcuts::-webkit-scrollbar{display:none}.X4SUna_shortcuts button{box-sizing:border-box;border:1px solid var(--qcc-border);min-width:108px;min-height:54px;color:var(--qcc-muted);background:var(--qcc-surface);font:inherit;white-space:nowrap;cursor:pointer;border-radius:8px;flex-direction:column;flex:none;justify-content:center;align-items:center;gap:5px;padding:7px 12px;font-size:12px;line-height:1.4;display:inline-flex}.X4SUna_shortcutIcon{width:17px;height:17px;display:inline-flex}.X4SUna_shortcutIcon svg{width:17px;height:17px}.X4SUna_shortcuts button:hover:not(:disabled),.X4SUna_shortcuts button:focus-visible{color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_promptEntry{z-index:40;pointer-events:none;position:absolute;inset:0}[data-composer-card]:has(.X4SUna_promptEntry){padding-top:48px}.X4SUna_promptEntry .X4SUna_promptTrigger{pointer-events:auto;position:absolute;top:10px;left:16px}.X4SUna_promptEntry .X4SUna_promptNotice{position:absolute;top:16px;left:140px;right:16px}.X4SUna_promptTrigger{border:1px solid var(--qcc-border);background:var(--qcc-selected);color:var(--qcc-action);font:inherit;cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:6px 10px;font-size:12px;display:inline-flex}.X4SUna_promptNotice{color:var(--qcc-muted);font-size:12px}.X4SUna_backdrop{z-index:2000;pointer-events:auto;box-sizing:border-box;background:#0a18286b;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.X4SUna_dialog{background:var(--qcc-surface);width:min(720px,100%);min-height:0;max-height:calc(100dvh - 48px);color:var(--qcc-text);border:1px solid var(--qcc-border);border-radius:12px;grid-template-rows:auto minmax(0,1fr) auto;font:14px/1.6 PingFang SC,Microsoft YaHei,sans-serif;display:grid;overflow:hidden;box-shadow:0 20px 60px #00000038}.X4SUna_dialog *{box-sizing:border-box}.X4SUna_dialogHeader{border-bottom:1px solid var(--qcc-border);justify-content:space-between;align-items:flex-start;gap:12px;padding:20px 24px;display:flex}.X4SUna_dialogHeader h2{margin:0;font-size:20px}.X4SUna_dialogHeader p{color:var(--qcc-muted);margin:8px 0 0;font-size:12px}.X4SUna_dialog button{border:1px solid var(--qcc-border);min-height:36px;color:var(--qcc-text);background:var(--qcc-surface);font:inherit;cursor:pointer;border-radius:6px;padding:8px 12px}.X4SUna_dialog button:hover{color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_dialog .X4SUna_closeButton{flex:none;width:36px;padding:0;font-size:22px}.X4SUna_dialogBody{overscroll-behavior:contain;gap:20px;min-height:0;padding:24px;display:grid;overflow:auto}.X4SUna_dialogBody fieldset{border:0;min-width:0;margin:0;padding:0}.X4SUna_dialogBody legend{padding:0 0 8px;font-weight:600}.X4SUna_scopeGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;display:grid}.X4SUna_scopeGrid label{border:1px solid var(--qcc-border);cursor:pointer;border-radius:8px;align-items:center;gap:8px;padding:12px;display:flex}.X4SUna_scopeGrid label[data-selected=true]{border-color:var(--qcc-action);color:var(--qcc-action);background:var(--qcc-selected)}.X4SUna_scopeGrid input{accent-color:var(--qcc-action);margin:0}.X4SUna_formField{flex-wrap:wrap;gap:8px;font-weight:600;display:flex}.X4SUna_formField span{color:var(--qcc-muted);font-size:12px;font-weight:400}.X4SUna_formField :where(input,textarea,select){border:1px solid var(--qcc-border);width:100%;min-width:0;color:var(--qcc-text);background:var(--qcc-surface);font:inherit;border-radius:6px;padding:10px 12px;font-weight:400}.X4SUna_formField textarea{resize:vertical}.X4SUna_fieldGrid{grid-template-columns:1fr 1fr;gap:16px;display:grid}.X4SUna_formHint{color:var(--qcc-muted);margin:0;font-size:12px}.X4SUna_promptPreview{border:1px solid var(--qcc-border);background:var(--qcc-page);border-radius:8px;padding:12px}.X4SUna_promptPreview summary{color:var(--qcc-action);cursor:pointer}.X4SUna_promptPreview pre{white-space:pre-wrap;overflow-wrap:anywhere;font:inherit}.X4SUna_dialogFooter{border-top:1px solid var(--qcc-border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:16px 24px;display:flex}.X4SUna_dialogFooter>:where(span,p){color:var(--qcc-muted);margin:0;font-size:12px}.X4SUna_dialogActions{flex-wrap:wrap;gap:8px;display:flex}.X4SUna_dialog .X4SUna_action{border-color:var(--qcc-action);color:var(--qcc-on-action);background:var(--qcc-action)}.X4SUna_dialog .X4SUna_action:hover{border-color:var(--qcc-hover);color:var(--qcc-on-action);background:var(--qcc-hover)}@media (width<=600px){.X4SUna_heroRow h1{font-size:22px}.X4SUna_heroLogo{border-radius:8px;width:40px;height:40px}.X4SUna_heroLogo svg{width:24px;height:24px}.X4SUna_shortcuts{justify-content:flex-start;padding-inline:12px}.X4SUna_shortcuts button{min-width:92px;padding:7px 10px}.X4SUna_backdrop{padding:12px}.X4SUna_dialog{max-height:calc(100dvh - 24px)}.X4SUna_dialogHeader,.X4SUna_dialogBody,.X4SUna_dialogFooter{padding:16px}.X4SUna_fieldGrid{grid-template-columns:1fr}.X4SUna_scopeGrid{gap:4px}.X4SUna_scopeGrid label{gap:4px;padding:8px 4px;font-size:12px}.X4SUna_formField :where(input,textarea,select){font-size:16px}}";
4766
4766
  const tagId$2 = "dsh-tender-workbench/workbench-entry.module.css";
4767
4767
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
4768
4768
  const tag = document.createElement("style");
@@ -4793,6 +4793,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4793
4793
  "promptPreview": "X4SUna_promptPreview",
4794
4794
  "promptTrigger": "X4SUna_promptTrigger",
4795
4795
  "scopeGrid": "X4SUna_scopeGrid",
4796
+ "shortcutIcon": "X4SUna_shortcutIcon",
4796
4797
  "shortcutMount": "X4SUna_shortcutMount",
4797
4798
  "shortcuts": "X4SUna_shortcuts",
4798
4799
  "sidebarButton": "X4SUna_sidebarButton",
@@ -28060,6 +28061,16 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28060
28061
  //#region src/client/TenderEntry.tsx
28061
28062
  const SIDEBAR_WORKSPACES_SELECTOR = "[data-slot=\"sidebar.workspaces\"]";
28062
28063
  const TENDER_TOP_MOUNT_SELECTOR = "[data-dsh-tender-top-mount=\"true\"]";
28064
+ /** Keep the whole focused card visible without scrolling the host conversation. */
28065
+ function revealShortcut(button) {
28066
+ const menu = button.parentElement;
28067
+ if (!menu || menu.scrollWidth <= menu.clientWidth) return;
28068
+ const card = button.getBoundingClientRect();
28069
+ const row = menu.getBoundingClientRect();
28070
+ const inset = 5;
28071
+ if (card.left < row.left + inset) menu.scrollLeft += card.left - row.left - inset;
28072
+ else if (card.right > row.right - inset) menu.scrollLeft += card.right - row.right + inset;
28073
+ }
28063
28074
  /** Only this session's own DOM is branded; no root/single brand slot. */
28064
28075
  function TenderHeroTitleBridge({ sessionId, useSession, openPhase }) {
28065
28076
  const anchorRef = (0, react.useRef)(null);
@@ -28107,11 +28118,13 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28107
28118
  ]
28108
28119
  ].map(([phase, label, icon]) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
28109
28120
  type: "button",
28121
+ onFocus: (event) => revealShortcut(event.currentTarget),
28110
28122
  onClick: () => openPhase(phase),
28111
28123
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
28124
+ className: workbench_entry_module_css_default.shortcutIcon,
28112
28125
  "aria-hidden": "true",
28113
28126
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WorkbenchIcon, { name: icon })
28114
- }), label]
28127
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label })]
28115
28128
  }, phase))
28116
28129
  });
28117
28130
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [