dsh-tender-workbench 0.2.1-beta.0 → 0.2.1-beta.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.
Files changed (129) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +109 -71
  3. package/cordis.patch.yml +3 -3
  4. package/lib/client.js +23899 -13042
  5. package/lib/client.js.map +1 -1
  6. package/lib/index.js +7143 -3
  7. package/lib/types/client/TenderEntry.d.ts +14 -5
  8. package/lib/types/client/TenderEntry.d.ts.map +1 -1
  9. package/lib/types/client/area-data.d.ts +1 -1
  10. package/lib/types/client/area-data.d.ts.map +1 -1
  11. package/lib/types/client/artifact-api.d.ts +17 -0
  12. package/lib/types/client/artifact-api.d.ts.map +1 -0
  13. package/lib/types/client/better-sidebar-adapter.d.ts +35 -0
  14. package/lib/types/client/better-sidebar-adapter.d.ts.map +1 -0
  15. package/lib/types/client/client-context.d.ts +10 -0
  16. package/lib/types/client/client-context.d.ts.map +1 -0
  17. package/lib/types/client/index.d.ts +5 -5
  18. package/lib/types/client/index.d.ts.map +1 -1
  19. package/lib/types/client/intents/query-intent.d.ts +12 -0
  20. package/lib/types/client/intents/query-intent.d.ts.map +1 -0
  21. package/lib/types/client/intents/screening-intent.d.ts +178 -0
  22. package/lib/types/client/intents/screening-intent.d.ts.map +1 -0
  23. package/lib/types/client/intents/send-session-intent.d.ts +10 -0
  24. package/lib/types/client/intents/send-session-intent.d.ts.map +1 -0
  25. package/lib/types/client/locales.d.ts +1181 -1
  26. package/lib/types/client/locales.d.ts.map +1 -1
  27. package/lib/types/client/qcc-request.d.ts +10 -36
  28. package/lib/types/client/qcc-request.d.ts.map +1 -1
  29. package/lib/types/client/tender-projection-port.d.ts +23 -0
  30. package/lib/types/client/tender-projection-port.d.ts.map +1 -0
  31. package/lib/types/client/workbench/SessionWriteProgress.d.ts +16 -0
  32. package/lib/types/client/workbench/SessionWriteProgress.d.ts.map +1 -0
  33. package/lib/types/client/workbench/TenderAnalysisReviewViews.d.ts +26 -0
  34. package/lib/types/client/workbench/TenderAnalysisReviewViews.d.ts.map +1 -0
  35. package/lib/types/client/workbench/TenderDataViews.d.ts +25 -0
  36. package/lib/types/client/workbench/TenderDataViews.d.ts.map +1 -0
  37. package/lib/types/client/workbench/TenderQueryWorkspace.d.ts +27 -0
  38. package/lib/types/client/workbench/TenderQueryWorkspace.d.ts.map +1 -0
  39. package/lib/types/client/workbench/TenderReportView.d.ts +15 -0
  40. package/lib/types/client/workbench/TenderReportView.d.ts.map +1 -0
  41. package/lib/types/client/workbench/TenderScreeningViews.d.ts +31 -0
  42. package/lib/types/client/workbench/TenderScreeningViews.d.ts.map +1 -0
  43. package/lib/types/client/workbench/TenderWorkbench.d.ts +38 -0
  44. package/lib/types/client/workbench/TenderWorkbench.d.ts.map +1 -0
  45. package/lib/types/client/workbench/WorkbenchPrimitives.d.ts +38 -0
  46. package/lib/types/client/workbench/WorkbenchPrimitives.d.ts.map +1 -0
  47. package/lib/types/client/workbench/navigation-controller.d.ts +46 -0
  48. package/lib/types/client/workbench/navigation-controller.d.ts.map +1 -0
  49. package/lib/types/client/workbench/session-write-flight.d.ts +30 -0
  50. package/lib/types/client/workbench/session-write-flight.d.ts.map +1 -0
  51. package/lib/types/client/workbench/workbench-status.d.ts +15 -0
  52. package/lib/types/client/workbench/workbench-status.d.ts.map +1 -0
  53. package/lib/types/client/write-session-draft.d.ts +3 -2
  54. package/lib/types/client/write-session-draft.d.ts.map +1 -1
  55. package/lib/types/contracts/analysis-review.d.ts +2355 -0
  56. package/lib/types/contracts/analysis-review.d.ts.map +1 -0
  57. package/lib/types/contracts/dataset.d.ts +1499 -0
  58. package/lib/types/contracts/dataset.d.ts.map +1 -0
  59. package/lib/types/contracts/query-schema.d.ts +80 -0
  60. package/lib/types/contracts/query-schema.d.ts.map +1 -0
  61. package/lib/types/contracts/query.d.ts +37 -0
  62. package/lib/types/contracts/query.d.ts.map +1 -0
  63. package/lib/types/contracts/reporting.d.ts +1451 -0
  64. package/lib/types/contracts/reporting.d.ts.map +1 -0
  65. package/lib/types/contracts/screening-intents.d.ts +265 -0
  66. package/lib/types/contracts/screening-intents.d.ts.map +1 -0
  67. package/lib/types/contracts/screening.d.ts +1702 -0
  68. package/lib/types/contracts/screening.d.ts.map +1 -0
  69. package/lib/types/contracts/workflow.d.ts +1267 -0
  70. package/lib/types/contracts/workflow.d.ts.map +1 -0
  71. package/lib/types/host/artifacts/artifact-route.d.ts +10 -0
  72. package/lib/types/host/artifacts/artifact-route.d.ts.map +1 -0
  73. package/lib/types/host/artifacts/command-receipts.d.ts +47 -0
  74. package/lib/types/host/artifacts/command-receipts.d.ts.map +1 -0
  75. package/lib/types/host/artifacts/register-route.d.ts +5 -0
  76. package/lib/types/host/artifacts/register-route.d.ts.map +1 -0
  77. package/lib/types/host/artifacts/store.d.ts +45 -0
  78. package/lib/types/host/artifacts/store.d.ts.map +1 -0
  79. package/lib/types/host/http-trust.d.ts +8 -0
  80. package/lib/types/host/http-trust.d.ts.map +1 -0
  81. package/lib/types/host/nested-tool.d.ts +6 -0
  82. package/lib/types/host/nested-tool.d.ts.map +1 -0
  83. package/lib/types/host/pipeline/analysis-review.d.ts +49 -0
  84. package/lib/types/host/pipeline/analysis-review.d.ts.map +1 -0
  85. package/lib/types/host/pipeline/classify.d.ts +29 -0
  86. package/lib/types/host/pipeline/classify.d.ts.map +1 -0
  87. package/lib/types/host/pipeline/normalize.d.ts +19 -0
  88. package/lib/types/host/pipeline/normalize.d.ts.map +1 -0
  89. package/lib/types/host/pipeline/qcc-adapters.d.ts +79 -0
  90. package/lib/types/host/pipeline/qcc-adapters.d.ts.map +1 -0
  91. package/lib/types/host/pipeline/screening-context.d.ts +11 -0
  92. package/lib/types/host/pipeline/screening-context.d.ts.map +1 -0
  93. package/lib/types/host/projection.d.ts +16 -0
  94. package/lib/types/host/projection.d.ts.map +1 -0
  95. package/lib/types/host/reporting/excel.d.ts +9 -0
  96. package/lib/types/host/reporting/excel.d.ts.map +1 -0
  97. package/lib/types/host/reporting/pdf.d.ts +5 -0
  98. package/lib/types/host/reporting/pdf.d.ts.map +1 -0
  99. package/lib/types/host/reporting/report-dataset.d.ts +47 -0
  100. package/lib/types/host/reporting/report-dataset.d.ts.map +1 -0
  101. package/lib/types/host/skill.d.ts +6 -0
  102. package/lib/types/host/skill.d.ts.map +1 -0
  103. package/lib/types/host/tools/analysis-review-tools.d.ts +1202 -0
  104. package/lib/types/host/tools/analysis-review-tools.d.ts.map +1 -0
  105. package/lib/types/host/tools/query-tool.d.ts +671 -0
  106. package/lib/types/host/tools/query-tool.d.ts.map +1 -0
  107. package/lib/types/host/tools/report-tools.d.ts +656 -0
  108. package/lib/types/host/tools/report-tools.d.ts.map +1 -0
  109. package/lib/types/host/tools/rule-tools.d.ts +581 -0
  110. package/lib/types/host/tools/rule-tools.d.ts.map +1 -0
  111. package/lib/types/host/tools/screening-context-tool.d.ts +95 -0
  112. package/lib/types/host/tools/screening-context-tool.d.ts.map +1 -0
  113. package/lib/types/index.d.ts +5 -2
  114. package/lib/types/index.d.ts.map +1 -1
  115. package/package.json +36 -9
  116. package/lib/types/client/TenderFilterPanel.d.ts +0 -14
  117. package/lib/types/client/TenderFilterPanel.d.ts.map +0 -1
  118. package/lib/types/client/fields/AdvancedFields.d.ts +0 -4
  119. package/lib/types/client/fields/AdvancedFields.d.ts.map +0 -1
  120. package/lib/types/client/fields/KeywordField.d.ts +0 -4
  121. package/lib/types/client/fields/KeywordField.d.ts.map +0 -1
  122. package/lib/types/client/fields/PublishTimeField.d.ts +0 -4
  123. package/lib/types/client/fields/PublishTimeField.d.ts.map +0 -1
  124. package/lib/types/client/fields/RegionField.d.ts +0 -4
  125. package/lib/types/client/fields/RegionField.d.ts.map +0 -1
  126. package/lib/types/client/fields/SearchTypeField.d.ts +0 -9
  127. package/lib/types/client/fields/SearchTypeField.d.ts.map +0 -1
  128. package/lib/types/client/fields/StageField.d.ts +0 -4
  129. package/lib/types/client/fields/StageField.d.ts.map +0 -1
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Sunhh3221
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sunhh3221
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,108 +1,146 @@
1
- # dsh-tender-workbench
1
+ # dsh-tender-workbench
2
+
3
+ `dsh-tender-workbench` is an open-source DeepSeek Harness tender Agent workbench. The current S1-S5.3 MVP provides one Session-scoped Better Sidebar workbench, three official entry points, a four-phase progressive shell over seven internal Projection nodes, and a real query → optional analysis → human review → immutable Excel/PDF delivery chain.
2
4
 
3
- `dsh-tender-workbench` is an independent, Client-only DeepSeek Harness Web workbench for tender and proposed-project discovery. It adds a “招投标 / Tenders” action to the official `conversation.input.left` Slot, opens a Portal-based search drawer, and appends a deterministic qcc-tender request to the current Session draft through `SessionInput.setDraft()`. It also projects persisted qcc tool events into a Session Header result action and a replayable summary/list drawer with search history.
5
+ The three entries are `sidebar.footer.action` (“招投标”), `conversation.input.left` (“搜索招投标”), and `conversation.session.header.actions` (reopen). They all focus the same Better Sidebar single-instance Tab for the addressed Session. The workbench reads only that Session's Host Projection through a narrow `TenderProjectionPort`; it does not infer business state from chat text or maintain cross-Session state.
6
+
7
+ The single query workspace now captures the complete approved condition set: source scope, up to ten keywords, publication presets/prior year/custom dates, up to twenty province/city/district regions, the analysis goal, tender information type and conditional stages/amounts, procurement method/industry/type, and proposed-project stage/approval/investment. The visible execution plan, user message, Host validation, and exact qcc calls all come from the same `TenderQueryIntentV1`; hidden or inactive branches cannot leak stale values, and `smartSort` is not exposed as a user filter.
4
8
 
5
- The first step selects **招投标搜索 / Tender search** or **拟建项目搜索 / Proposed-project search**. Tender search defaults to **不限 / All**, combining tender and award conditions, and can be narrowed to **招标 / Tender** or **中标 / Award**. These states mirror the visible fields and options of the corresponding 标找找 `ttender`, `ifb`, `wtb`, and `proposed` reference pages while remaining completely local to the plugin.
9
+ S5.1 and S5.2 implement the mandatory UI convergence before S6. “Find opportunities” uses the approved condition-editor/execution-plan layout plus aligned overview and list/detail data surfaces. “Screen candidates” uses criteria-list/editor, impact-first preview, five-category classification/trace, and evidence-bound Agent-analysis work surfaces. Wide layouts preserve the master/detail grids; medium and narrow containers fold in the same information order. No simplified/advanced query split, legacy compatibility page, or parallel UI state machine remains.
6
10
 
7
- Frequently used conditions stay visible in one aligned filter workspace. Advanced fields use a compact reference-style toolbar and one shared in-place option panel instead of flattening every option. The combined All state uses a responsive 4/3/2-column grid, so labels stay on one line at desktop, compact, and mobile widths. Active triggers keep stable dimensions and expose their full values in a separate summary strip. Clicking outside closes either the advanced option panel or region cascader without clearing selections; Escape closes the active popup before the drawer.
11
+ The S5.2 MVP intentionally omits “让 Agent 调整草案”, rule import, rule copy, nested condition groups, rule-version browsing/comparison, and follow-up questions for the focused project. These omissions are not rendered as disabled or simulated controls. Apart from that closed list, the two phases must match the approved design in structure, styling, layout, states, responsive behavior, and interaction.
12
+
13
+ The plugin does not modify DeepSeek Harness source, inspect or write the native composer DOM, fetch MCP from the Client, access connector storage, or hold credentials. Explicit workbench submission validates one `TenderQueryIntentV1`, serializes the same object into a user-visible message, and sends it through the public scoped `conversation.send()` service without touching the composer draft.
8
14
 
9
- The shared region field provides searchable province → city → district multi-selection using the bundled snapshot derived from `docs/area.ts`. Every region row is a large hit target: clicking a province selects it and opens its cities, and clicking a city selects it and opens its districts. No precise arrow click is required; selected regions are written as complete administrative paths.
15
+ S2 implements `tender_workbench_query`, the exact `mcp__qcc-tender__search_tenders` and `mcp__qcc-tender__search_proposed_projects` nested calls, source-specific runtime validation, deterministic normalization, conservative announcement linking, Session-private Artifact storage, the Host Projection result, data overview, and paged/filterable data details. Empty, waiting-for-Agent, running, partial, failed, completed, and capability-missing states are projected without parsing model text.
10
16
 
11
- The plugin does not modify DeepSeek Harness source, inspect or write the native composer DOM, submit messages, access the network, persist filter values, or depend on third-party DSH plugins.
17
+ S3 implements the read-only `tender_workbench_get_screening_context` tool plus `tender_workbench_preview_rules` and `tender_workbench_confirm_rules`. Screening starts only after an explicit user action. Agent suggestions, local drafts, previews, confirmed immutable rule versions, and classified data remain distinct. The one-layer rule contract supports explicit source scope, `title`/`purchaser`/`all` field scope, OR keywords, exception terms, enabled state, numeric priority, stable array-order tie breaking, and the five classifications `include`, `observe`, `manual-review`, `exclude`, and `unmatched`. No industry rules are built in.
12
18
 
13
- Visible filters are limited to parameters supported by `mcp__qcc-tender__search_tenders` and `mcp__qcc-tender__search_proposed_projects`. Relative dates become fixed dates, closed custom date ranges are converted to the tool's open interval, region paths are normalized, and amounts are converted from 万元 to before the prompt is generated. The prompt contains one exact tool name and valid JSON and explicitly disallows Web-search fallback.
19
+ The drafting-context tool reads the current query specification and normalized dataset through the Session-private manifest and returns only deterministic statistics plus at most eight representative samples; it never re-queries qcc or changes Projection state. Agent proposals omit `draftFingerprint`, which the Host computes from the validated complete draft. Each visible proposal, adjustment, or preview Intent permits exactly one preview call and ends after that result.
14
20
 
15
- ## Documentation
16
-
17
- - [Plugin design](docs/dsh-tender-workbench-plugin-design.md)
18
- - [Province, city, and district source snapshot](docs/area.ts)
21
+ Preview and confirmation both read the current `activeDatasetRef` from the Session-private manifest and use the same pure classifier. Preview binds the active Artifact, Projection revision, and Host-validated draft fingerprint without creating a formal version or changing active classification. Confirmation rejects stale inputs, creates an immutable rule-set Artifact, classifies the full active dataset, and projects only summary counts and Artifact references. Classified rows remain paged behind the same loopback/same-origin/header/token boundary and retain source → normalization → raw matches/exceptions → stable decision traceability.
19
22
 
20
- ## Compatibility
23
+ S4 implements stable bounded `tender_workbench_analysis_next` batches, evidence-bound `tender_workbench_analysis_commit`, and independent `tender_workbench_apply_review` / `tender_workbench_revert_review` commands. Agent recommendations are optional and never become user decisions. Users can review analyzed or unanalyzed rows individually or in an explicit batch, restore rows to `pending`, keep notes, and replay the latest-operation undo from Session-private review Artifacts.
21
24
 
22
- This checkout targets DeepSeek Harness `0.1.1-rc.2`, the highest version currently published to the public npm registry (published under the `next` dist-tag; npm's `latest` dist-tag still points to `0.0.1-rc.1`). The plugin declares the matching public Client packages as peer and development dependencies, so it can be developed outside the Harness source workspace.
25
+ S5 implements read-only `tender_workbench_get_report_context` plus `tender_workbench_generate_report`. S5.3 makes the delivery result-first: the PDF is a content-driven business report with a conclusion-led first page, two deterministic charts, and bounded verification records; chapters continue in the available space and start a new page only when needed. Normal business volumes are expected to produce roughly 4-6 pages, while small result sets may be shorter. Excel separates management results, source-specific execution lists, traceability, and data-quality definitions across fixed-purpose Sheets. The Host fixes all numeric facts, distributions, record selection, workbook structure, PDF sections, fonts, pagination, and visual layout. Agent narrative is optional, bounded, reference-validated against one `ReportContextV2` fingerprint, and stored once in the immutable `ReportDatasetV2` snapshot for both files. Without narrative, both deterministic files still generate.
23
26
 
24
- ## Build and test
27
+ The project has not shipped a prior report snapshot format, so S5.3 deliberately accepts only the current `ReportDatasetV2` contract. Failed-format retry reads the same immutable V2 snapshot, reruns only the requested failed renderer, and never re-queries, adapts an older Schema, or asks Agent to rewrite content.
25
28
 
26
- From this directory:
29
+ Every successful query replaces the Session's single active dataset snapshot atomically; it never appends or merges earlier batches. Historical Artifacts remain in the Session directory, while old rules, classification, analysis, review, and reports leave the active chain. The same `commandId` and canonical parameters replay the first result; a user-triggered rerun receives a new `commandId` even when its parameters are identical. A failed all-source rerun does not replace a previously active successful dataset.
27
30
 
28
- ```sh
29
- pnpm install --ignore-workspace
30
- pnpm run typecheck
31
- pnpm run test
32
- pnpm run build
33
- ```
31
+ The confirmed S2 data boundary is deliberately narrow: schema-valid `qcc-tender` MCP fields are treated as source facts without Web or multi-source accuracy verification. Missing or unparseable fields retain their source text and are shown as disclosure/parse status, not as source errors. Each Session has one active query dataset; a successful new query replaces that active snapshot instead of appending or merging batches, while historical artifacts remain available for traceability and prior downstream results leave the active workflow.
34
32
 
35
- The build emits the Host loader entry at `lib/index.js`, the DSH Client factory bundle at `lib/client.js`, and declarations under `lib/types/`.
33
+ Internal data is located only through the public `sessionPersistence.locate(session.header)` seam and is stored beside the default JSONL Session transcript under `dsh-tender-workbench/v1/`; the transcript itself is never read or modified. The read-only rows/download API is loopback-only and requires same-origin browser provenance, the Session header, and an Artifact capability token. Tokens stay in request headers rather than URLs.
36
34
 
37
- ## Install into the Web profile
38
-
39
- ### Install the internal preview from npm
40
-
41
- The current release is an internal preview published under the `beta` dist-tag. It does not use or create the `latest` dist-tag:
35
+ The MVP deliberately does not implement report preview/version centers, successful-file regeneration, subscriptions, CRM follow-up, enterprise profiles, Bid/No-Bid decisions, source-accuracy verification, or dark theme. Query, classification, analysis, and review may each be a valid stopping point; no later action runs without explicit user input.
36
+
37
+ ## Documentation
42
38
 
39
+ - [Province, city, and district source snapshot](resources/area.ts)
40
+
41
+ ## Compatibility
42
+
43
+ The published plugin does not pin DeepSeek Harness, MCP Connector, or Better Sidebar to exact deployment versions. Its peer metadata declares minimums with no stable-version upper bound: DSH public packages from `0.1.1-rc.2`, MCP Connector from `0.2.31`, and Better Sidebar from `0.17.1`. The active Profile still supplies one coherent runtime. Runtime compatibility remains capability-based: Better Sidebar must expose the public `targetedOpen` and `stateSubscription` features, while the Host must provide the public Session Projection, JSONL Session Persistence, Tools, Skill, Sessions, and WebServer services used by the workflow. Development and release verification currently use DSH `0.1.1-rc.2` with Better Sidebar `0.17.1` as a reproducible reference combination, not as an exact installation restriction.
44
+
45
+ S2-S5 additionally require the standard JSONL Session Persistence service and an installed, authorized `qcc-tender` MCP connection exposing the exact tools `mcp__qcc-tender__search_tenders` and `mcp__qcc-tender__search_proposed_projects`. Missing capabilities, missing tools, or non-JSONL persistence fail explicitly; there is no Web-search, Workspace-storage, or alternate-persistence fallback.
46
+
47
+ `peerDependencies` let package managers diagnose versions below those minimums, but the current `dsh plugin` command delegates to pnpm, whose Profile defaults report peer conflicts as warnings instead of guaranteed installation failures. DSH currently has no Bundle-manifest prerequisite field. Consequently this package cannot promise a hard pre-install rejection on every DSH version; missing Host services still keep the Host plugin from activating, and missing Better Sidebar features fail Client activation before a business command is sent.
48
+
49
+ ## Build and test
50
+
51
+ From this directory:
52
+
53
+ ```sh
54
+ pnpm install --ignore-workspace
55
+ pnpm run typecheck
56
+ pnpm run test
57
+ pnpm run build
58
+ ```
59
+
60
+ The build emits the Host loader entry at `lib/index.js`, the DSH Client factory bundle at `lib/client.js`, and declarations under `lib/types/`.
61
+
62
+ ## Install into the Web profile
63
+
64
+ ### Install the internal preview from npm
65
+
66
+ The current release is an internal preview published under the `beta` dist-tag. Install it explicitly through `@beta` so the preview channel remains clear even when npm also resolves the first published version through `latest`:
67
+
43
68
  ```sh
69
+ dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
70
+ dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
44
71
  dsh plugin --profile web add dsh-tender-workbench@beta
45
72
  dsh web --no-open
46
- ```
47
-
48
- To install an exact version:
49
-
73
+ ```
74
+
75
+ To install an exact version:
76
+
50
77
  ```sh
51
- dsh plugin --profile web add dsh-tender-workbench@0.2.1-beta.0
78
+ dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
79
+ dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
80
+ dsh plugin --profile web add dsh-tender-workbench@0.2.1-beta.3
52
81
  ```
53
-
54
- After a stable version is published to `latest`, users will be able to install it without an explicit tag:
55
-
82
+
83
+ After a stable version is published to `latest`, users will be able to install it without an explicit tag:
84
+
56
85
  ```sh
86
+ dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
87
+ dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
57
88
  dsh plugin --profile web add dsh-tender-workbench
58
89
  ```
59
-
60
- ### Install from an independent source checkout
61
-
62
- Build first, then run the following command from this plugin's own root directory when the public `dsh` CLI is available:
90
+
91
+ ### Install from an independent source checkout
92
+
93
+ Install and mount MCP Connector and Better Sidebar first. Then build this repository and run the following command from the plugin root when the public `dsh` CLI is available:
63
94
 
64
95
  ```sh
96
+ dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
97
+ dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
65
98
  dsh plugin --profile web add .
66
99
  dsh web --no-open
67
- ```
68
-
69
- If `dsh` is only available through a separate DeepSeek Harness source checkout, pass this plugin's absolute path instead of assuming that it is nested inside the Harness repository:
70
-
100
+ ```
101
+
102
+ If `dsh` is only available through a separate DeepSeek Harness source checkout, pass this plugin's absolute path instead of assuming that it is nested inside the Harness repository:
103
+
71
104
  ```sh
72
105
  cd /path/to/deepseek-harness
106
+ pnpm dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
107
+ pnpm dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
73
108
  pnpm dsh plugin --profile web add /absolute/path/to/dsh-tender-workbench
74
109
  pnpm dsh web --no-open
75
110
  ```
76
-
77
- ### Install from a tarball
78
-
111
+
112
+ ### Install from a tarball
113
+
79
114
  ```sh
80
- dsh plugin --profile web add ./dsh-tender-workbench-0.2.1-beta.0.tgz
115
+ dsh plugin --profile web add 'dsh-mcp-connector@>=0.2.31'
116
+ dsh plugin --profile web add 'dsh-better-sidebar@>=0.17.1'
117
+ dsh plugin --profile web add ./dsh-tender-workbench-0.2.1-beta.3.tgz
81
118
  dsh web --no-open
82
119
  ```
83
-
84
- Restart the Web profile after adding or removing the bundle. The plugin package's `dsh.bundle.patch` declaration activates `cordis.patch.yml`, whose only contribution is the `dsh-tender-workbench` Loader row.
85
-
86
- To remove it:
87
-
88
- ```sh
89
- dsh plugin --profile web remove dsh-tender-workbench
90
- ```
91
-
120
+
121
+ Restart the Web profile after adding or removing the bundle. The plugin package's `dsh.bundle.patch` declaration activates `cordis.patch.yml`, whose only contribution is the `dsh-tender-workbench` Loader row.
122
+
123
+ To remove it:
124
+
125
+ ```sh
126
+ dsh plugin --profile web remove dsh-tender-workbench
127
+ ```
128
+
92
129
  ## Runtime behavior
93
130
 
94
- - Each Session-scoped entry retains its own temporary selections until remount or refresh.
95
- - The default All state includes both tender and award filters without forcing a notice type; narrowed Tender, Award, and Proposed-project states render and output only their supported fields.
96
- - Tender and Award use separate stage selections; Proposed-project has its own stage, approval, and investment filters.
97
- - Preset and custom amount ranges are mutually exclusive and validated locally.
98
- - Province, city, and district selections are canonicalized so an ancestor and its descendant are not output together.
99
- - Empty filter values and unrestricted choices are omitted from the generated prompt.
100
- - Keywords and regions are blocked above the tool limits of 10 and 20; unsupported Hong Kong, Macao, and Taiwan selections are rejected rather than silently dropped.
101
- - Existing draft text is retained and separated from generated text by one blank line.
102
- - Confirmation calls `setDraft()` exactly once and never calls `submit()`.
103
- - A missing Session or input facade keeps the panel open and presents an error.
104
- - Outside press dismisses the active advanced or region popup. Escape dismisses an active popup first; backdrop, Cancel, Close, or a second Escape dismisses the drawer and returns focus to the trigger.
105
- - Persisted `tool/call` and append-surface `tool/result` events are paired by Turn and exact `callId`; historical replay and live append produce the same projection.
106
- - A newly completed search Turn opens its result drawer once. Historical results do not auto-open and remain available from the Session Header.
107
- - Result summaries combine the MCP query summary with statistics explicitly limited to loaded records. Lists contain only returned records, provide no guessed links or pagination, and deduplicate stable business IDs in result order.
108
- - “最近待截止时间” means the earliest parseable deadline after the current time; expired values are excluded.
131
+ - The front-end phases are “Find opportunities / Screen candidates / Human confirmation / Deliver”. The internal `query`, `overview`, `rules`, `classification`, `analysis`, `review`, and `report` nodes remain independent Projection facts rather than a strict seven-step wizard.
132
+ - Navigation changes only the local view. It never advances `currentStage`, assumes a contiguous completion prefix, or disables later phases by ordinal position.
133
+ - A completed query is a normal lightweight outcome. The UI does not display “2/7 incomplete”; it offers progressive next steps without selecting a lightweight/full mode in advance.
134
+ - Query completion never creates a rule draft or starts classification. “Continue screening” sends a visible `rules.propose` Intent only after the user clicks it.
135
+ - Query, rules, analysis, review, report creation, and failed-format retry share one Session-scoped write flight. Rapid clicks, Enter repeats, and click/submit races create one command and remain locked through send, Agent wait, and matching tool execution; a transport retry reuses the same `commandId`.
136
+ - Initial Agent criteria open directly as the current Session's editable working draft; there is no suggestion-application gate, and loading the working copy never confirms rules or classifies data. Local add/edit/enable/delete operations never change persisted business state; changing the draft expires its Dry Run result, which must be refreshed before confirmation.
137
+ - The screening view always exposes the three approved tabs: criteria, classification results, and Agent analysis. It follows the approved primary path “confirm criteria and start classification ask Agent to analyze candidates → enter human review”; locked tabs are visibly present but unavailable until their real dependencies exist.
138
+ - The criteria page uses the approved list/editor workspace. “Save draft and run Dry Run” refreshes the inline four-item impact strip and the representative-sample/global-conflict columns; there is no separate “deterministic impact preview” surface. The workbench footer owns “confirm criteria and start classification”.
139
+ - Confirmed classification exposes mutually exclusive totals, source/rule/conflict/disclosure filters, and per-record traceability. Analysis recommendations and user decisions remain separate row fields.
140
+ - S5.1 and S5.2 are implemented as the mandatory design-convergence gates before S6. Their regression contracts keep the checked-in HTML UX information architecture, responsive grids, focus behavior, exact query mapping, and closed MVP omission list from drifting back to legacy or placeholder UI.
141
+ - Batch review inputs and the focused-record editor keep separate local state. Selecting a record initializes its saved decision and note, so a batch choice or a previously focused record cannot leak into an individual review command.
142
+ - Report creation shows the current reviewed/pending scope and requires explicit confirmation for a partial report. Excel and PDF download independently through same-origin Session/token headers; temporary Blob URLs are revoked after use.
143
+ - The input shortcut always selects the “Find opportunities” phase. Sidebar and Header entries reopen the same Session Tab without duplicating the workbench.
144
+ - When no Session is selected, the sidebar entry invokes the native New Session flow.
145
+ - The Better Sidebar registration, Projection subscription, Reveal attachment, and all three Slot entries dispose with the Client Context.
146
+ - Narrow layouts use a container-responsive four-phase navigation and keep the main action reachable below a scrollable content area.
package/cordis.patch.yml CHANGED
@@ -1,3 +1,3 @@
1
- - insert:
2
- - id: tender-workbench
3
- name: dsh-tender-workbench
1
+ - insert:
2
+ - id: tender-workbench
3
+ name: dsh-tender-workbench