dsh-tender-workbench 0.5.4 → 0.5.5

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.
Files changed (53) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.en.md +18 -12
  3. package/README.md +24 -12
  4. package/docs/RELEASE-0.5.5.md +40 -0
  5. package/lib/client.js +20 -22
  6. package/lib/client.js.map +1 -1
  7. package/lib/types/client/TenderPrompt.d.ts +0 -9
  8. package/lib/types/client/TenderPrompt.d.ts.map +1 -1
  9. package/lib/types/client/TenderResultsEntry.d.ts +7 -3
  10. package/lib/types/client/TenderResultsEntry.d.ts.map +1 -1
  11. package/lib/types/client/TenderResultsPanel.d.ts +1 -1
  12. package/lib/types/client/TenderResultsPanel.d.ts.map +1 -1
  13. package/lib/types/client/artifact-api.d.ts +1 -1
  14. package/lib/types/client/artifact-api.d.ts.map +1 -1
  15. package/lib/types/client/client-context.d.ts +2 -1
  16. package/lib/types/client/client-context.d.ts.map +1 -1
  17. package/lib/types/client/index.d.ts.map +1 -1
  18. package/lib/types/client/intents/send-session-intent.d.ts +2 -1
  19. package/lib/types/client/intents/send-session-intent.d.ts.map +1 -1
  20. package/lib/types/client/ordinary-session-guard.d.ts +7 -2
  21. package/lib/types/client/ordinary-session-guard.d.ts.map +1 -1
  22. package/lib/types/client/result-types.d.ts +1 -1
  23. package/lib/types/client/result-types.d.ts.map +1 -1
  24. package/lib/types/client/skill-catalog.d.ts +5 -9
  25. package/lib/types/client/skill-catalog.d.ts.map +1 -1
  26. package/lib/types/client/tender-projection-port.d.ts +3 -1
  27. package/lib/types/client/tender-projection-port.d.ts.map +1 -1
  28. package/lib/types/client/tender-search-definition.d.ts +1 -1
  29. package/lib/types/client/tender-search-definition.d.ts.map +1 -1
  30. package/lib/types/client/tender-session-entry.d.ts +3 -1
  31. package/lib/types/client/tender-session-entry.d.ts.map +1 -1
  32. package/lib/types/client/workbench/TenderAnalysisReviewViews.d.ts +1 -1
  33. package/lib/types/client/workbench/TenderAnalysisReviewViews.d.ts.map +1 -1
  34. package/lib/types/client/workbench/TenderDataViews.d.ts +1 -1
  35. package/lib/types/client/workbench/TenderDataViews.d.ts.map +1 -1
  36. package/lib/types/client/workbench/TenderReportView.d.ts +1 -1
  37. package/lib/types/client/workbench/TenderReportView.d.ts.map +1 -1
  38. package/lib/types/client/workbench/TenderScreeningViews.d.ts +1 -1
  39. package/lib/types/client/workbench/TenderScreeningViews.d.ts.map +1 -1
  40. package/lib/types/client/workbench/TenderWorkbench.d.ts +1 -1
  41. package/lib/types/client/workbench/TenderWorkbench.d.ts.map +1 -1
  42. package/lib/types/client/workbench/session-write-flight.d.ts +1 -1
  43. package/lib/types/client/workbench/session-write-flight.d.ts.map +1 -1
  44. package/lib/types/client/write-session-draft.d.ts +1 -1
  45. package/lib/types/client/write-session-draft.d.ts.map +1 -1
  46. package/lib/types/host/artifacts/intent-receipts.d.ts +2 -2
  47. package/lib/types/host/artifacts/intent-receipts.d.ts.map +1 -1
  48. package/lib/types/host/artifacts/store.d.ts +2 -1
  49. package/lib/types/host/artifacts/store.d.ts.map +1 -1
  50. package/lib/types/host/tools/query-tool.d.ts +1 -1
  51. package/lib/types/host/tools/query-tool.d.ts.map +1 -1
  52. package/package.json +43 -29
  53. package/docs/RELEASE-0.5.4.md +0 -26
package/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ All notable changes to `dsh-tender-workbench` are documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.5.5] - 2026-09-10
8
+
9
+ - 迁移完整 DSH 0.1.2-rc.1 公共接口,移除旧客户端 runtime 与 conversationEvents 硬依赖;补事件定义卸载清理。
10
+ - 更新类型、Session 空白状态和 Workspace 导航适配;收窄兼容声明,增加最终产物真实宿主加载回归,避免旧模块测试替身掩盖启动故障。
11
+
7
12
  ## [0.5.4] - 2026-09-10
8
13
 
9
14
  - 对齐共享交互规范 v1.5.0:强化 Better Sidebar 能力探针、Session 定向展开与订阅清理;五个流程入口复用同一 Tab,增加当前会话记录历史视图与缺失依赖提示。
package/README.en.md CHANGED
@@ -10,7 +10,9 @@ Related agents: [数据清洗补全](https://github.com/duhu2000/dsh-data-cleani
10
10
 
11
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.
12
12
 
13
- Current stable version: **0.5.4** (stable release).
13
+ Current stable version: **0.5.5** (stable release).
14
+
15
+ This release targets the full DSH 0.1.2-rc.1 distribution with Better Sidebar 0.18.1; legacy hosts are no longer supported. Back up the complete Profile and verify dependencies before upgrading; do not overwrite a working local hotfix or an unverified host combination.
14
16
 
15
17
  ## What it does
16
18
 
@@ -47,14 +49,18 @@ Excel is organized for analysis and verification, with separate overview, distri
47
49
 
48
50
  ## Requirements and compatibility
49
51
 
50
- The published package declares minimum compatible versions without a stable-version upper bound:
52
+ This release constrains core peers to `~0.1.2-rc.1`; future combinations require verification:
51
53
 
52
- - DeepSeek Harness public packages: `0.1.1-rc.2`
54
+ - DeepSeek Harness public packages: `0.1.2-rc.1`
53
55
  - `dsh-mcp-connector`: `0.2.31`
54
- - `dsh-better-sidebar`: `0.17.1`
56
+ - `dsh-better-sidebar`: `0.18.1`
55
57
 
56
58
  The active Profile must provide one coherent runtime with public Session Projection, JSONL Session Persistence, Tools, Skill, Sessions, and WebServer services. Better Sidebar must expose the public `targetedOpen` and `stateSubscription` features.
57
59
 
60
+ Before installing, run `node scripts/check-host-compatibility.mjs --host-root /actual/node_modules/@deepseek-ai/dsh --profile-root /actual/profiles/web`. It only reads package manifests: known incompatible hosts, mixed core packages and old Sidebar fail; unknown combinations are reported as unverified. The Windows mount script requires `-DshHostRoot` and executes this gate before mutation. Upgrade the complete host explicitly after backing up the Profile: `npm install -g @deepseek-ai/dsh@0.1.2-rc.1`.
61
+
62
+ Context is not required. If already installed, 0.36.0 has a known removed settingsNamespace dependency; the coexistence baseline is 0.48.0. Update only with user approval and a backup. Rollback requires a complete verified host/plugin combination: do not install the original 0.5.4 or older package alone on the new host. Startup smoke does not prove live QCC or four-product acceptance.
63
+
58
64
  An installed and authorized `qcc-tender` MCP connection must expose these exact tools:
59
65
 
60
66
  - `mcp__qcc-tender__search_tenders`
@@ -68,17 +74,17 @@ Install the current stable release and its required Provider plugins:
68
74
 
69
75
  ```sh
70
76
  dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
71
- dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
77
+ dsh plugin --profile web add 'dsh-better-sidebar@0.18.1'
72
78
  dsh plugin --profile web add dsh-tender-workbench
73
79
  dsh web --no-open
74
80
  ```
75
81
 
76
- To install the exact 0.5.4 release:
82
+ To install the exact 0.5.5 release:
77
83
 
78
84
  ```sh
79
85
  dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
80
- dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
81
- dsh plugin --profile web add dsh-tender-workbench@0.5.4
86
+ dsh plugin --profile web add 'dsh-better-sidebar@0.18.1'
87
+ dsh plugin --profile web add dsh-tender-workbench@0.5.5
82
88
  ```
83
89
 
84
90
  To install from an independent checkout, install the required Provider plugins first, then run from this repository:
@@ -87,7 +93,7 @@ To install from an independent checkout, install the required Provider plugins f
87
93
  corepack pnpm@11.7.0 install --frozen-lockfile
88
94
  corepack pnpm@11.7.0 run build
89
95
  dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
90
- dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
96
+ dsh plugin --profile web add 'dsh-better-sidebar@0.18.1'
91
97
  dsh plugin --profile web add .
92
98
  dsh web --no-open
93
99
  ```
@@ -96,7 +102,7 @@ To install a packed build:
96
102
 
97
103
  ```sh
98
104
  dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
99
- dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
105
+ dsh plugin --profile web add 'dsh-better-sidebar@0.18.1'
100
106
  dsh plugin --profile web add ./dsh-tender-workbench-0.5.2.tgz
101
107
  dsh web --no-open
102
108
  ```
@@ -114,11 +120,11 @@ dsh plugin --profile web remove dsh-tender-workbench
114
120
  Upgrade an existing installation by installing the stable version and fully restarting the Web profile:
115
121
 
116
122
  ```sh
117
- dsh plugin --profile web add dsh-tender-workbench@0.5.4
123
+ dsh plugin --profile web add dsh-tender-workbench@0.5.5
118
124
  dsh web --no-open
119
125
  ```
120
126
 
121
- Version 0.5.4 aligns the Session singleton Tab adapter with shared UI specification v1.5.0. Five shortcuts open/focus the same Tab and navigate to opportunity, screening, decision, delivery or history, without starting tasks or MCP calls. Capability probes, subscription cleanup and cross-Session reveal guards are strengthened. Tab reopening retains navigation and query drafts within the current Client lifetime. History is limited to the current Session's saved query; cross-Session indexing and live MCP connection checks are not implemented. Actual four-plugin DSH integration remains to be verified. Roll back with `dsh-tender-workbench@0.5.3` and restart the profile; business data schemas are unchanged.
127
+ Version 0.5.5 retains the v1.5.0 singleton Tab, five navigation shortcuts and Client-lifetime draft recovery while migrating the client modules and services to the new host. Business schemas are unchanged; history remains Session-local and live MCP connectivity is not verified. Restore a backed-up, fully verified host/plugin combination for rollback, not the original 0.5.4 or an older package alone on the new host.
122
128
 
123
129
  ## Using the workbench
124
130
 
package/README.md CHANGED
@@ -2,10 +2,12 @@
2
2
 
3
3
  ## 安装与三分钟上手
4
4
 
5
+ > 0.5.5 面向完整 DSH 0.1.2-rc.1 + Better Sidebar 0.18.1。升级前备份完整 Profile 并核对依赖;不要直接覆盖未经验证的宿主组合或仍可用的本地临时补丁。
6
+
5
7
  招投标智能体:支持招投标搜索、招标查询、投标查询、标讯查询、拟建项目与项目筛选,辅助商机发现、人工复核及 Excel/PDF 导出,使用客户自备授权的企查查 MCP。
6
8
 
7
9
  ```sh
8
- dsh plugin --profile web add dsh-tender-workbench@0.5.4
10
+ dsh plugin --profile web add dsh-tender-workbench@0.5.5
9
11
  ```
10
12
 
11
13
  请先满足下文的 DSH、连接器及侧边栏依赖要求;安装后完整停止并重启对应 Profile。
@@ -25,7 +27,7 @@ dsh plugin --profile web add dsh-tender-workbench@0.5.4
25
27
 
26
28
  > 面向国内招投标团队的 DeepSeek Harness 开源智能体插件:在一个会话级工作台内完成标讯与拟建项目查询、确定性规则初筛、限定范围智能分析、人工复核,以及 Excel/PDF 报告交付。
27
29
  >
28
- > 当前稳定版本:**0.5.4**(正式版本)
30
+ > 当前稳定版本:**0.5.5**(正式版本)
29
31
 
30
32
  [![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)
31
33
  [![npm](https://img.shields.io/npm/v/dsh-tender-workbench)](https://www.npmjs.com/package/dsh-tender-workbench)
@@ -63,17 +65,17 @@ dsh plugin --profile web add dsh-tender-workbench@0.5.4
63
65
 
64
66
  ```sh
65
67
  dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
66
- dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
68
+ dsh plugin --profile web add 'dsh-better-sidebar@0.18.1'
67
69
  dsh plugin --profile web add dsh-tender-workbench
68
70
  dsh web --no-open
69
71
  ```
70
72
 
71
73
  安装或移除插件后,请完整重启 Web Profile。插件通过 `dsh.bundle.patch` 启用 `cordis.patch.yml`,并注册 `dsh-tender-workbench` Loader。
72
74
 
73
- 安装指定的 `0.5.4` 版本:
75
+ 安装指定的 `0.5.5` 版本:
74
76
 
75
77
  ```sh
76
- dsh plugin --profile web add dsh-tender-workbench@0.5.4
78
+ dsh plugin --profile web add dsh-tender-workbench@0.5.5
77
79
  ```
78
80
 
79
81
  移除插件:
@@ -84,7 +86,7 @@ dsh plugin --profile web remove dsh-tender-workbench
84
86
 
85
87
  ## 使用工作台
86
88
 
87
- 插件提供左上角“招投标”入口和会话 Header 恢复入口。点击左上角入口会根据当前工作区、最近工作区或第一个可用工作区的路径创建独立原生会话,显示“招投标智能体”标题与目标图标,默认不打开右侧工作台。点击输入框下方的找机会、筛候选、人工定案、形成交付或任务历史按钮时,才打开对应 Better Sidebar 视图;其他会话保留各自原有标题与标识。
89
+ 插件提供左上角“招投标”入口和会话 Header 恢复入口。点击左上角入口会根据当前工作区、当前 Session 目录或第一个可用工作区的路径创建独立原生会话,显示“招投标智能体”标题与目标图标,默认不打开右侧工作台。点击输入框下方的找机会、筛候选、人工定案、形成交付或任务历史按钮时,才打开对应 Better Sidebar 视图;其他会话保留各自原有标题与标识。
88
90
 
89
91
  页面导航只切换可见阶段,不会修改业务状态或自动执行后续动作。规则建议、编辑、影响预览与确认彼此独立;报告生成前始终展示已复核和待复核范围。宽屏使用主从布局,中窄屏保持相同信息顺序,并保留局部表格滚动与可访问的固定操作区。
90
92
 
@@ -98,15 +100,25 @@ dsh plugin --profile web remove dsh-tender-workbench
98
100
 
99
101
  ## 环境要求与兼容性
100
102
 
101
- 发布包声明以下最低兼容版本,不设置稳定版上限:
103
+ 本版本以完整 DSH 0.1.2-rc.1 校准,核心 peer 限定为 `~0.1.2-rc.1`,不再声明旧宿主兼容;后续版本需重新验证:
102
104
 
103
- - DeepSeek Harness 公共包:`0.1.1-rc.2`
105
+ - DeepSeek Harness 公共包:`0.1.2-rc.1`
104
106
  - `dsh-mcp-connector`:`0.2.31`
105
- - `dsh-better-sidebar`:`0.17.1`
107
+ - `dsh-better-sidebar`:`0.18.1`
106
108
  - Node.js:`^22.19.0 || >=24.0.0`
107
109
 
108
110
  当前 Profile 必须提供同一套公共 Session Projection、JSONL Session Persistence、Tools、Skill、Sessions 和 WebServer 服务;Better Sidebar 必须提供公共 `targetedOpen` 与 `stateSubscription` 能力。
109
111
 
112
+ 先备份完整 Profile,再由用户明确升级完整宿主(`npm install -g @deepseek-ai/dsh@0.1.2-rc.1`),不能只升级某个 Session 包。安装前从本仓运行只读检查:
113
+
114
+ ```sh
115
+ node scripts/check-host-compatibility.mjs --host-root /实际路径/node_modules/@deepseek-ai/dsh --profile-root /实际路径/profiles/web
116
+ ```
117
+
118
+ 预检只读包清单,不读凭证、会话或执行安装。已知旧宿主/混装核心包/旧 Sidebar 会阻断;未知版本提示未验证。Windows 挂载脚本需提供 `-DshHostRoot`,预检失败时不得挂载。context 不是必装依赖;仅当已安装时需检查共存条件:0.36.0 的旧 settingsNamespace 已知不兼容,共存基准为 0.48.0,可在备份后由用户执行 `dsh plugin --profile web add dsh-context@0.48.0`。
119
+
120
+ 回滚必须恢复完整已验证的宿主/插件组合,不得在新宿主上单独退回未经修复的 0.5.4 或更早包。真实 QCC、四产品共存与正式环境验收不由启动 smoke 代签。
121
+
110
122
  已安装并授权的 `qcc-tender` MCP 连接必须暴露以下精确工具名:
111
123
 
112
124
  - `mcp__qcc-tender__search_tenders`
@@ -119,11 +131,11 @@ dsh plugin --profile web remove dsh-tender-workbench
119
131
  从已有版本升级:
120
132
 
121
133
  ```sh
122
- dsh plugin --profile web add dsh-tender-workbench@0.5.4
134
+ dsh plugin --profile web add dsh-tender-workbench@0.5.5
123
135
  dsh web --no-open
124
136
  ```
125
137
 
126
- 0.5.4 对齐共享规范 v1.5.0:五个流程按钮打开/聚焦同一 Session 单例 Tab 并定位内部视图;补齐能力探针、状态订阅、卸载清理和跨会话展开保护。宿主管理侧拉、Tab X、宽度及停靠,业务内容不提供重复容器控制。Tab 重开保留当前 Client 内的阶段、查询草稿和主要子视图;历史仅展示当前 Session 已保存的查询记录,不是跨会话完整历史。真实 MCP 连接状态尚未接入,页面明确提示未核验;真实 DSH 四插件组合仍待复验。如需回退,可安装 `dsh-tender-workbench@0.5.3` 并重启 Profile;未改变业务数据格式。npm 版本与公开 Git 标签保持不可变。
138
+ 0.5.5 保留 0.5.4 v1.5.0 Session 单例 Tab、五入口导航和 Client 生命周期内草稿恢复,正式迁移新版宿主的客户端模块与服务。查询、筛选、复核和报告业务格式不变;历史仍仅限当前 Session,真实 MCP 连接未核验。回退应恢复备份的完整已验证宿主/插件组合,不能在新版宿主上单独安装原始 0.5.4 或更早版本。
127
139
 
128
140
  ## 本地开发
129
141
 
@@ -138,7 +150,7 @@ corepack pnpm@11.7.0 run check
138
150
 
139
151
  `check` 会执行类型检查、完整 Vitest 测试、生产构建、README/发布状态校验以及 npm tarball 白名单预检。配置 npm Trusted Publishing 后,[发布工作流](.github/workflows/release.yml)可使用 OIDC 和 provenance;手工发布不得声称 provenance。
140
152
 
141
- 省、市、区数据源快照维护在 [resources/area.ts](resources/area.ts)。版本变更见 [CHANGELOG.md](CHANGELOG.md),发布检查见 [0.5.4 发布清单](docs/RELEASE-0.5.4.md)。
153
+ 省、市、区数据源快照维护在 [resources/area.ts](resources/area.ts)。版本变更见 [CHANGELOG.md](CHANGELOG.md),发布检查见 [0.5.5 发布清单](docs/RELEASE-0.5.5.md)。
142
154
 
143
155
  ## 界面演示与市场投稿
144
156
 
@@ -0,0 +1,40 @@
1
+ # dsh-tender-workbench 0.5.5
2
+
3
+ Version: **0.5.5**
4
+ Status: **ready for release**
5
+
6
+ 招投标 P0 新宿主兼容加固版本。2026-09-10 已获用户本次 commit、push、tag 和 npm 发布授权;此为发布准备记录,实际结果以 GitHub Release 工作流和 npm registry 为准。
7
+
8
+ ## 修复范围
9
+
10
+ 迁移完整 DSH 0.1.2-rc.1 公共客户端类型和服务;移除旧 runtime 值引用、注入和测试替身;使用 uiConversation.events 注册并卸载搜索事件定义;仅接收 append 的 tool/result。修正空白首页状态、uiWorkspace 导航、宿主 JsonValue 与 SessionHeader 契约;保留 Session 单例工作台与会话恢复。补充审计发现开始任务前的 connection.api.skills.list 同样过时,已迁移 remote.skills.list 及新的返回格式,避免页面能开而业务预检失败。
11
+
12
+ ## 验证与兼容性
13
+
14
+ 目标组合:完整 DSH 0.1.2-rc.1 + Better Sidebar 0.18.1。旧 0.1.1-rc.2 / Sidebar 0.17.1 不再声明支持;未来组合未验证。context 不是本产品必装依赖,若已装 0.36.0 应先处理其旧 settingsNamespace 不兼容;共存基准为 0.48.0。
15
+
16
+ 反向不匹配证据:AI 填表会话报告的精确组合 DSH 0.1.2-rc.1 + Sidebar 0.17.1 在 /tmp/ff-compat-oldhost.log 中失败。本仓已只读核对日志里的 better-sidebar 导入失败及 settingsNamespace 缺失;没有重复运行该组合,版本归属引用该会话明确回报(日志文件名 oldhost 不代表实际旧宿主)。预检对该精确组合阻断,其它未实测 Sidebar 版本只警告未验证;不泛化为整个版本区间的实测结论。
17
+
18
+ 本轮只在隔离 HOME / DSH_HOME 测试,使用合成工作区,不读写正式安装、不使用生产凭证或计费 MCP。Node v25.9.0;完整 check 通过;43 文件、240 测试通过、1 项既有 Windows-only 跳过;8 组 Chromium 浅深色/尺寸回归通过;最终产物白名单 180 文件,新增旧模块、旧服务和旧 Skill API 禁入检查。
19
+
20
+ 真实 DSH 用独立诊断插件读取公开模块表和服务,未改写 npm tarball 的 client.js。无 context 与 context 0.48.0 两种配置均已启动并执行导航;补充 Skill RPC 修复后的最终候选在 context 0.48.0 组合通过:
21
+
22
+ - 客户端模块实际加载、uiConversation 仅注册一份招投标定义;未加载旧 runtime。
23
+ - 官方 ConversationNodeAssembler 处理合成 tool/result,重放和增量状态一致。该项没有向真实 Session 写入模拟结果,不冒充真实 QCC 数据。
24
+ - 真实只读 remote.skills.list 返回 query / screening / analysis / review / report 五个行为 Skill。
25
+ - 点击菜单进入原生独立会话;五入口各重复点击,实际宿主中只有一个业务 Tab,Session 数量不增加;各阶段/历史视图定位正确。
26
+ - 原生 Tab X 关闭重开、Files/业务 Tab 切换后查询草稿保持;新会话不带招投标首页,返回业务会话恢复;pageerror 为零。
27
+
28
+ 该轮记录:临时目录 tender-native-uPNfAG,端口 62223;result.json 与测试 tarball 位于执行者系统临时目录。测试 tarball SHA-256:`86bec7ecd6324e4ffa5771cfd67c7a18b927e650edffbfc48811b6e03dc4362e`。后续仅文档证据补记会改变包摘要;应以脚本重新 pack 的实际输出作为交付物,不复用 npm 版本。
29
+
30
+ ### 验证边界
31
+
32
+ 业务查询/规则/复核/Excel/PDF 的既有 fixture 回归通过,但未在真实宿主上提交模型请求或走付费 MCP 全链路。无真实授权/额度验证、无四产品共存签收;宿主收起/后台 Session 几何、浮窗/底部布局、HMR 卸载仍主要为隔离契约覆盖,待总账组合回归。旧基线没有被声明继续支持;其它未经实测版本标记未验证,不依据最低版本推断全区间通过。上游 primitives 缺少 source map 的非阻断告警保留。
33
+
34
+ ### 复现
35
+
36
+ 先运行 npm run check,再设置 TENDER_DSH_BIN(完整 DSH 0.1.2-rc.1 的 lib/bin.js)、TENDER_PLAYWRIGHT(index.mjs)、TENDER_CHROME,执行 node scripts/native-host-smoke.mjs。设置 TENDER_TEST_CONTEXT=1 加入 context 0.48.0。脚本新建临时 HOME/DSH_HOME、独立端口,用 npm pack 原始产物;退出只关闭自己启动的浏览器和进程,不操作正式 3080 或 ~/.dsh。截图/诊断插件/临时会话不会打入 npm。
37
+
38
+ ## 发布与回滚
39
+
40
+ 已获本版本发布授权,仍须通过 PR/main CI/不可变新 tag/OIDC 门禁。不得重新发布 0.5.4 或移动已有 tag。新宿主不能单独回滚为原始 0.5.4(有已知启动故障);若需回滚,应还原备份的完整宿主/插件组合和 Profile,禁止覆盖仍可用的临时补丁安装。
package/lib/client.js CHANGED
@@ -8,7 +8,6 @@ window.__ModuleLoader__.load({
8
8
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
9
9
  let react_dom = require("react-dom");
10
10
  let react_jsx_runtime = require("react/jsx-runtime");
11
- let _deepseek_ai_dsh_client_runtime_client = require("@deepseek-ai/dsh-client-runtime/client");
12
11
  //#region node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/core.js
13
12
  var _a$1;
14
13
  function $constructor(name, initializer, params) {
@@ -4716,7 +4715,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4716
4715
  function resolveTenderEntryWorkspacePath(sessions, workspaces) {
4717
4716
  const current = sessions.list.getSnapshot().current;
4718
4717
  const workspaceSnapshot = workspaces.list.getSnapshot();
4719
- return (current === void 0 ? void 0 : workspaceSnapshot.items.find((workspace) => workspace.sessionIds.includes(current)))?.path ?? workspaceSnapshot.items.find((workspace) => workspace.workspaceId === workspaceSnapshot.recentWorkspaceId)?.path ?? workspaceSnapshot.items[0]?.path;
4718
+ return (current === void 0 ? void 0 : workspaceSnapshot.items.find((workspace) => workspace.sessionIds.includes(current)))?.path ?? (current === void 0 ? void 0 : sessions.list.getSnapshot().byId[current]?.cwd) ?? workspaceSnapshot.items[0]?.path;
4720
4719
  }
4721
4720
  /**
4722
4721
  * Create a distinct native Session with `cwd` ownership only (no workspace
@@ -28225,7 +28224,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28225
28224
  (0, react.useEffect)(() => {
28226
28225
  setOpenError(void 0);
28227
28226
  }, [sessionId]);
28228
- const blank = useSession((snapshot) => snapshot.composerPhase === "blank");
28227
+ const blank = useSession((snapshot) => snapshot.blank && !snapshot.running && !snapshot.promptAttempted);
28229
28228
  const owned = isTenderEntrySessionId(sessionId);
28230
28229
  (0, react.useEffect)(() => {
28231
28230
  setHeroMount(null);
@@ -28727,12 +28726,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
28727
28726
  assertActionSkillName(requestedSkill);
28728
28727
  let response;
28729
28728
  try {
28730
- response = await connection.api.skills.list({ sessionId }, signal);
28729
+ response = await connection.skills.list({ sessionId }, signal);
28731
28730
  } catch (error) {
28732
28731
  throw new TenderSkillPreflightError("catalog-unavailable", `无法读取当前 Session 的 Skill 目录:${error instanceof Error ? error.message : "unknown error"}`);
28733
28732
  }
28734
- if (!response.result.ok) throw new TenderSkillPreflightError("catalog-unavailable", `无法读取当前 Session 的 Skill 目录:${response.result.error.code}`);
28735
- const skill = response.result.value.skills.find((entry) => entry.name === requestedSkill);
28733
+ if (!response.ok) throw new TenderSkillPreflightError("catalog-unavailable", `无法读取当前 Session 的 Skill 目录:${response.error.code}`);
28734
+ const skill = response.value.skills.find((entry) => entry.name === requestedSkill);
28736
28735
  if (skill === void 0) throw new TenderSkillPreflightError("skill-missing", `当前 Session 缺少行为 Skill:${requestedSkill}`);
28737
28736
  if (!skill.description.includes(`[dsh-tender-workbench/workflow-v2]`)) throw new TenderSkillPreflightError("skill-incompatible", `当前 Session 的行为 Skill 契约不兼容:${requestedSkill}`);
28738
28737
  }
@@ -30878,12 +30877,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30878
30877
  };
30879
30878
  //#endregion
30880
30879
  //#region src/client/ordinary-session-guard.ts
30881
- /** Compatibility for legacy workbench Sessions still attached to a Workspace.
30882
- * Keep their history/drafts intact; exclude them only from New Session reuse.
30883
- * DSH's public connectWorkspace currently has no candidate-filter extension.
30884
- */
30885
- function installOrdinarySessionGuard(sessions, workspaces) {
30886
- const original = workspaces.connectWorkspace;
30880
+ function installOrdinarySessionGuard(sessions, workspaces, navigation = workspaces) {
30881
+ const original = navigation.connectWorkspace;
30887
30882
  if (typeof original !== "function") return () => {};
30888
30883
  const businessSession = (id) => /^session-dsh-(?:tender-workbench|pre-duediligence|data-cleaning-agent)-/u.test(id);
30889
30884
  const pending = /* @__PURE__ */ new Map();
@@ -30894,7 +30889,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30894
30889
  const existing = pending.get(workspaceId);
30895
30890
  if (existing !== void 0) return existing;
30896
30891
  const resolve = async () => {
30897
- const workspace = this.list.getSnapshot();
30892
+ const workspace = workspaces.list.getSnapshot();
30898
30893
  const target = workspace.items.find((item) => item.workspaceId === workspaceId);
30899
30894
  if (target === void 0) throw new Error("New Session workspace is unavailable");
30900
30895
  const snapshot = sessions.list.getSnapshot();
@@ -30913,10 +30908,10 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
30913
30908
  pending.set(workspaceId, attempt);
30914
30909
  return attempt;
30915
30910
  };
30916
- workspaces.connectWorkspace = guarded;
30911
+ navigation.connectWorkspace = guarded;
30917
30912
  return () => {
30918
30913
  active = false;
30919
- if (workspaces.connectWorkspace === guarded) workspaces.connectWorkspace = original;
30914
+ if (navigation.connectWorkspace === guarded) navigation.connectWorkspace = original;
30920
30915
  };
30921
30916
  }
30922
30917
  //#endregion
@@ -31085,7 +31080,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31085
31080
  id: String(event.data.turn),
31086
31081
  role: "update"
31087
31082
  };
31088
- if (event.type === "tool/result" && (0, _deepseek_ai_dsh_client_runtime_client.isAppendSurfaceEvent)(event)) return {
31083
+ if (event.type === "tool/result" && event.surfaceOp === "append") return {
31089
31084
  id: String(event.data.turn),
31090
31085
  role: "update"
31091
31086
  };
@@ -31174,9 +31169,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31174
31169
  "sessions",
31175
31170
  "workspaces",
31176
31171
  "conversation",
31177
- "conversationEvents",
31172
+ "uiConversation",
31178
31173
  "locale",
31179
- "connection"
31174
+ "remote.skills"
31180
31175
  ];
31181
31176
  function RegisteredTenderWorkbenchTab({ locale, sendIntent, t, projectionPort, reveal, navigation, ...props }) {
31182
31177
  (0, react.useSyncExternalStore)((listener) => locale.subscribe(listener), () => locale.getSnapshot(), () => locale.getSnapshot());
@@ -31191,17 +31186,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
31191
31186
  }
31192
31187
  /** Register the dedicated Session entry, workbench Tab, Hero brand, and Header recovery action. */
31193
31188
  function apply(ctx) {
31194
- ctx.conversationEvents.register(tenderSearchDefinition);
31189
+ ctx.effect(() => ctx.uiConversation.events.register(tenderSearchDefinition), "dsh-tender-workbench: search events");
31195
31190
  ctx.effect(() => ctx.locale.register(NS, {
31196
31191
  zh,
31197
31192
  en
31198
31193
  }), "dsh-tender-workbench: dictionaries");
31199
31194
  const sessions = ctx.get("sessions");
31200
31195
  const locale = ctx.get("locale");
31201
- const connection = ctx.get("connection");
31202
- if (sessions === void 0 || locale === void 0 || connection === void 0) throw new Error("dsh-tender-workbench requires the public sessions, locale, and connection services");
31196
+ const skills = ctx.get("remote.skills");
31197
+ if (sessions === void 0 || locale === void 0 || skills === void 0) throw new Error("dsh-tender-workbench requires the public sessions, locale, and remote.skills services");
31198
+ const connection = { skills };
31203
31199
  const t = locale.bind(NS);
31204
- ctx.effect(() => installOrdinarySessionGuard(sessions, ctx.workspaces), "dsh-tender-workbench: ordinary Session reuse");
31200
+ ctx.inject(["uiWorkspace"], (scope) => {
31201
+ scope.effect(() => installOrdinarySessionGuard(sessions, ctx.workspaces, scope.uiWorkspace), "dsh-tender-workbench: ordinary Session reuse");
31202
+ });
31205
31203
  let sidebar;
31206
31204
  let reveal;
31207
31205
  const navigation = createTenderWorkbenchNavigationController();