dsh-tender-workbench 0.5.1 → 0.5.2
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 +6 -0
- package/README.en.md +7 -7
- package/README.md +6 -6
- package/docs/RELEASE-0.5.2.md +23 -0
- package/lib/client.js +15 -2
- package/lib/client.js.map +1 -1
- package/lib/types/client/TenderEntry.d.ts.map +1 -1
- package/package.json +2 -2
- package/docs/RELEASE-0.5.1.md +0 -23
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,12 @@ All notable changes to `dsh-tender-workbench` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.5.2] - 2026-09-07
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- 首页输入框下方四个快捷入口对齐共享规范 v1.1.3:上图标、下文字的描边卡片,单行排列、窄屏内部横向滚动,浅深色与悬停/键盘焦点沿用企查查蓝;保留点击才打开工作台的交互。
|
|
12
|
+
|
|
7
13
|
## [0.5.1] - 2026-09-06
|
|
8
14
|
|
|
9
15
|
### Fixed
|
package/README.en.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
`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
6
|
|
|
7
|
-
Current stable version: **0.5.
|
|
7
|
+
Current stable version: **0.5.2** (stable release).
|
|
8
8
|
|
|
9
9
|
## What it does
|
|
10
10
|
|
|
@@ -67,12 +67,12 @@ dsh plugin --profile web add dsh-tender-workbench
|
|
|
67
67
|
dsh web --no-open
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
To install the exact 0.5.
|
|
70
|
+
To install the exact 0.5.2 release:
|
|
71
71
|
|
|
72
72
|
```sh
|
|
73
73
|
dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
|
|
74
74
|
dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
|
|
75
|
-
dsh plugin --profile web add dsh-tender-workbench@0.5.
|
|
75
|
+
dsh plugin --profile web add dsh-tender-workbench@0.5.2
|
|
76
76
|
```
|
|
77
77
|
|
|
78
78
|
To install from an independent checkout, install the required Provider plugins first, then run from this repository:
|
|
@@ -91,7 +91,7 @@ To install a packed build:
|
|
|
91
91
|
```sh
|
|
92
92
|
dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
|
|
93
93
|
dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
|
|
94
|
-
dsh plugin --profile web add ./dsh-tender-workbench-0.5.
|
|
94
|
+
dsh plugin --profile web add ./dsh-tender-workbench-0.5.2.tgz
|
|
95
95
|
dsh web --no-open
|
|
96
96
|
```
|
|
97
97
|
|
|
@@ -108,11 +108,11 @@ dsh plugin --profile web remove dsh-tender-workbench
|
|
|
108
108
|
Upgrade an existing installation by installing the stable version and fully restarting the Web profile:
|
|
109
109
|
|
|
110
110
|
```sh
|
|
111
|
-
dsh plugin --profile web add dsh-tender-workbench@0.5.
|
|
111
|
+
dsh plugin --profile web add dsh-tender-workbench@0.5.2
|
|
112
112
|
dsh web --no-open
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
Version 0.5.1
|
|
115
|
+
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
116
|
|
|
117
117
|
## Using the workbench
|
|
118
118
|
|
|
@@ -137,7 +137,7 @@ The build emits the Host loader at `lib/index.js`, the Client bundle at `lib/cli
|
|
|
137
137
|
|
|
138
138
|
The province, city, and district source snapshot is maintained in [resources/area.ts](resources/area.ts).
|
|
139
139
|
|
|
140
|
-
See [CHANGELOG.md](CHANGELOG.md) and [the 0.5.
|
|
140
|
+
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
141
|
|
|
142
142
|
## Current scope
|
|
143
143
|
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
> 面向国内招投标团队的 DeepSeek Harness 开源智能体插件:在一个会话级工作台内完成标讯与拟建项目查询、确定性规则初筛、限定范围智能分析、人工复核,以及 Excel/PDF 报告交付。
|
|
6
6
|
>
|
|
7
|
-
> 当前稳定版本:**0.5.
|
|
7
|
+
> 当前稳定版本:**0.5.2**(正式版本)
|
|
8
8
|
|
|
9
9
|
[](https://github.com/duhu2000/dsh-tender-workbench/actions/workflows/ci.yml)
|
|
10
10
|
[](https://www.npmjs.com/package/dsh-tender-workbench)
|
|
@@ -49,10 +49,10 @@ dsh web --no-open
|
|
|
49
49
|
|
|
50
50
|
安装或移除插件后,请完整重启 Web Profile。插件通过 `dsh.bundle.patch` 启用 `cordis.patch.yml`,并注册 `dsh-tender-workbench` Loader。
|
|
51
51
|
|
|
52
|
-
安装指定的 `0.5.
|
|
52
|
+
安装指定的 `0.5.2` 版本:
|
|
53
53
|
|
|
54
54
|
```sh
|
|
55
|
-
dsh plugin --profile web add dsh-tender-workbench@0.5.
|
|
55
|
+
dsh plugin --profile web add dsh-tender-workbench@0.5.2
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
移除插件:
|
|
@@ -98,11 +98,11 @@ dsh plugin --profile web remove dsh-tender-workbench
|
|
|
98
98
|
从已有版本升级:
|
|
99
99
|
|
|
100
100
|
```sh
|
|
101
|
-
dsh plugin --profile web add dsh-tender-workbench@0.5.
|
|
101
|
+
dsh plugin --profile web add dsh-tender-workbench@0.5.2
|
|
102
102
|
dsh web --no-open
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
本次 0.5.1
|
|
105
|
+
本次 0.5.2 对齐共享规范 v1.1.3:首页输入框下方四个快捷入口采用上图标、下文字的描边卡片,支持浅深色、窄屏单行横向滚动与键盘聚焦完整可见。延续 0.5.1 的默认收起行为:「招投标」菜单仅进入独立会话,点击下方按钮才打开工作台。不修改宿主全局侧栏偏好、历史布局或业务数据。如需回退,可安装 `dsh-tender-workbench@0.5.1` 并重启 Profile。npm 版本与公开 Git 标签保持不可变。
|
|
106
106
|
|
|
107
107
|
## 本地开发
|
|
108
108
|
|
|
@@ -117,7 +117,7 @@ corepack pnpm@11.7.0 run check
|
|
|
117
117
|
|
|
118
118
|
`check` 会执行类型检查、完整 Vitest 测试、生产构建、README/发布状态校验以及 npm tarball 白名单预检。配置 npm Trusted Publishing 后,[发布工作流](.github/workflows/release.yml)可使用 OIDC 和 provenance;手工发布不得声称 provenance。
|
|
119
119
|
|
|
120
|
-
省、市、区数据源快照维护在 [resources/area.ts](resources/area.ts)。版本变更见 [CHANGELOG.md](CHANGELOG.md),发布检查见 [0.5.
|
|
120
|
+
省、市、区数据源快照维护在 [resources/area.ts](resources/area.ts)。版本变更见 [CHANGELOG.md](CHANGELOG.md),发布检查见 [0.5.2 发布清单](docs/RELEASE-0.5.2.md)。
|
|
121
121
|
|
|
122
122
|
## 当前范围
|
|
123
123
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# dsh-tender-workbench 0.5.2 发布清单
|
|
2
|
+
|
|
3
|
+
- Version: **0.5.2**
|
|
4
|
+
- Status: **release candidate**
|
|
5
|
+
- 日期:2026-09-07
|
|
6
|
+
- 标签:`v0.5.2`
|
|
7
|
+
- npm:`dsh-tender-workbench@0.5.2`,目标 dist-tag 为 `latest`
|
|
8
|
+
|
|
9
|
+
## 范围与验证
|
|
10
|
+
|
|
11
|
+
首页输入框下方四个快捷按钮对齐共享规范 v1.1.3:上图标、下文字的描边卡片,企查查蓝浅深色及 hover/focus 状态;桌面单行居中,窄屏菜单内部横滚。键盘聚焦时完整显示卡片和焦点环,仅滚动菜单,不滚动宿主会话。保留默认收起侧栏、点击按钮才打开对应工作台的行为。
|
|
12
|
+
|
|
13
|
+
不改动菜单名称、品牌图标、原生输入框、右侧业务能力、数据契约或其它插件。发布日期检查改为校验当前版本的日期标题格式,不再写死旧日期。
|
|
14
|
+
|
|
15
|
+
变更后的完整本地检查通过:219 项测试通过、1 项既有跳过;类型、构建、文档和打包校验通过。隔离 React/Chromium 浅深色 × 四种尺寸共 8 组通过,覆盖卡片尺寸/排列/颜色、键盘可达、窄屏横滚及侧栏显式打开。版本更新后再次执行完整门禁。
|
|
16
|
+
|
|
17
|
+
## 发布流程
|
|
18
|
+
|
|
19
|
+
提交并推送 main,确认 Linux Node 22/24 与 Windows Node 24 CI 后创建不可变 annotated tag v0.5.2。release.yml 使用 GitHub OIDC Trusted Publishing 发布 npm 并生成 provenance,随后核对 Registry latest/gitHead/publisher、远端 tag 和 GitHub Release。
|
|
20
|
+
|
|
21
|
+
## 验收边界与回退
|
|
22
|
+
|
|
23
|
+
本次不安装或重启用户本机 DSH,不调用真实 QCC。浏览器测试是实际组件与隔离宿主 DOM,升级后仍需真实宿主验收。必要时安装 `dsh-tender-workbench@0.5.1` 并重启 Profile;无需迁移数据,不覆盖 npm 版本或移动公开标签。
|
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:
|
|
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: [
|