dsh-tender-workbench 0.5.5 → 0.5.7

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/lib/index.js CHANGED
@@ -4541,7 +4541,7 @@ function workbenchIntentFrom(text) {
4541
4541
  }
4542
4542
  }
4543
4543
  function matchingWorkbenchIntent(exec, intentId, intentFingerprint) {
4544
- const events = exec.agent?.session.events;
4544
+ const events = (exec.agent?.session)?.snapshotEvents();
4545
4545
  if (events === void 0) return void 0;
4546
4546
  for (let index = events.length - 1; index >= 0; index -= 1) {
4547
4547
  const event = events[index];
@@ -4734,7 +4734,7 @@ function assertWorkbenchArguments(intent, tool, rawArgs, state) {
4734
4734
  }, "报告重试 Tool 参数与工作台 Intent 不一致。");
4735
4735
  }
4736
4736
  function latestConversationUserEvent(exec) {
4737
- const events = exec.agent?.session.events;
4737
+ const events = (exec.agent?.session)?.snapshotEvents();
4738
4738
  if (events === void 0) return void 0;
4739
4739
  for (let index = events.length - 1; index >= 0; index -= 1) {
4740
4740
  const event = events[index];
@@ -4744,6 +4744,14 @@ function latestConversationUserEvent(exec) {
4744
4744
  return event;
4745
4745
  }
4746
4746
  }
4747
+ function currentTurn(exec) {
4748
+ const events = (exec.agent?.session)?.snapshotEvents() ?? [];
4749
+ for (let index = events.length - 1; index >= 0; index -= 1) {
4750
+ const event = events[index];
4751
+ if (event?.type === "turn/start") return event.data.turn;
4752
+ }
4753
+ throw new Error("普通对话 Tool 需要当前 Session 的 turn/start;用户消息不携带轮次。");
4754
+ }
4747
4755
  function resolveToolInvocation(input) {
4748
4756
  if (input.exec.agent === void 0) throw new Error("tender workbench tools require an Agent-owned Session");
4749
4757
  const origin = TenderToolOriginV2Schema.parse(input.rawOrigin);
@@ -4769,7 +4777,7 @@ function resolveToolInvocation(input) {
4769
4777
  if (event === void 0) throw new Error("修改型 Tool 需要当前 Session 中的直接用户请求。");
4770
4778
  const text = directUserText(event);
4771
4779
  if (text === "" || text.includes("<dsh_tender_workbench_intent>")) throw new Error("普通对话 origin 必须对应非工作台 Intent 的直接用户请求。");
4772
- const intentId = conversationIntentId(pending?.origin === "conversation" ? pending.turn : event.data.turn, input.intentKind);
4780
+ const intentId = conversationIntentId(pending?.origin === "conversation" ? pending.turn : currentTurn(input.exec), input.intentKind);
4773
4781
  if (pending !== void 0 && (pending.origin !== "conversation" || pending.intentId !== intentId || pending.kind !== input.intentKind || pending.expectedTool !== input.tool)) throw new Error("普通对话 Tool 与当前待执行动作或 control.nextTool 不匹配。");
4774
4782
  return {
4775
4783
  origin: origin.kind,
@@ -22,7 +22,7 @@ export declare function revealTenderWorkbenchState(state: SidebarState, tabId: s
22
22
  export declare function createTenderWorkbenchRevealController(service?: Pick<BetterSidebarService, 'getSnapshot' | 'subscribeState'>): TenderWorkbenchRevealController;
23
23
  /** Bind the workbench shell to its Session reveal controller. */
24
24
  export declare function useTenderWorkbenchReveal(controller: TenderWorkbenchRevealController, props: Pick<TabComponentProps, 'scope' | 'store' | 'tab'>): void;
25
- /** Fail loudly only when the mandatory provider lacks an exercised capability. */
25
+ /** Probe the optional provider before registering or opening its workbench. */
26
26
  export declare function assertBetterSidebarContract(service: BetterSidebarService): void;
27
27
  /** Register the single Session-scoped workbench tab through Better Sidebar's public service. */
28
28
  export declare function registerTenderWorkbenchTab(service: BetterSidebarService, component: (props: TabComponentProps) => ReactNode, title?: string | (() => string), icon?: ReactNode | ((size: number) => ReactNode)): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"better-sidebar-adapter.d.ts","sourceRoot":"","sources":["../../../src/client/better-sidebar-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjD,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAClB,MAAM,mCAAmC,CAAA;AAE1C,eAAO,MAAM,uBAAuB,EAAG,4BAAqC,CAAA;AAE5E,UAAU,YAAY;IACpB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,wDAAwD;IACxD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,IAAI,CAAA;IAC3D,gFAAgF;IAChF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,OAAO,IAAI,IAAI,CAAA;CAChB;AAkBD,4FAA4F;AAC5F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAS3F;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,aAAa,GAAG,gBAAgB,CAAC,GACrE,+BAA+B,CAgDjC;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,+BAA+B,EAC3C,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC,GACxD,IAAI,CAKN;AAED,kFAAkF;AAClF,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAc/E;AAED,gGAAgG;AAChG,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,SAAS,EAClD,KAAK,GAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAS,EACtC,IAAI,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,GAC/C,MAAM,IAAI,CAUZ;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,+BAA+B,GACtC,OAAO,CAMT"}
1
+ {"version":3,"file":"better-sidebar-adapter.d.ts","sourceRoot":"","sources":["../../../src/client/better-sidebar-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjD,OAAO,KAAK,EACV,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAClB,MAAM,mCAAmC,CAAA;AAE1C,eAAO,MAAM,uBAAuB,EAAG,4BAAqC,CAAA;AAE5E,UAAU,YAAY;IACpB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,+BAA+B;IAC9C,wDAAwD;IACxD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,IAAI,CAAA;IAC3D,gFAAgF;IAChF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,OAAO,IAAI,IAAI,CAAA;CAChB;AAkBD,4FAA4F;AAC5F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAS3F;AAED;;;;GAIG;AACH,wBAAgB,qCAAqC,CACnD,OAAO,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,aAAa,GAAG,gBAAgB,CAAC,GACrE,+BAA+B,CAgDjC;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,+BAA+B,EAC3C,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC,GACxD,IAAI,CAKN;AAED,+EAA+E;AAC/E,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAc/E;AAED,gGAAgG;AAChG,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,oBAAoB,EAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,SAAS,EAClD,KAAK,GAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAS,EACtC,IAAI,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,GAC/C,MAAM,IAAI,CAUZ;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,+BAA+B,GACtC,OAAO,CAMT"}
@@ -1,7 +1,7 @@
1
1
  import type { ISessions } from '@deepseek-ai/dsh-api-session-controller/client';
2
2
  import type { IWorkspaces, WorkspaceId } from '@deepseek-ai/dsh-api-workspace-controller/client';
3
3
  import type { SessionId } from '@deepseek-ai/dsh-session/types';
4
- /** Compatibility for legacy workbench Sessions still attached to a Workspace.
4
+ /** Business workbench Sessions are explicitly attached to a Workspace.
5
5
  * Keep their history/drafts intact; exclude them only from New Session reuse.
6
6
  * DSH's public connectWorkspace currently has no candidate-filter extension.
7
7
  */
@@ -1,5 +1,5 @@
1
1
  import type { ISessions } from '@deepseek-ai/dsh-api-session-controller/client';
2
- import type { IWorkspaces } from '@deepseek-ai/dsh-api-workspace-controller/client';
2
+ import type { IWorkspaces, WorkspaceId } from '@deepseek-ai/dsh-api-workspace-controller/client';
3
3
  import type { SessionId } from '@deepseek-ai/dsh-session/types';
4
4
  export declare const TENDER_ENTRY_SESSION_ID_PREFIX = "session-dsh-tender-workbench-";
5
5
  export type TenderSessionEntryErrorCode = 'create-unavailable' | 'invalid-session-id' | 'workspace-unavailable';
@@ -10,16 +10,15 @@ export declare class TenderSessionEntryError extends Error {
10
10
  export declare function isTenderEntrySessionId(sessionId: string | undefined): boolean;
11
11
  export declare function createTenderEntrySessionId(uuid: string): SessionId;
12
12
  /**
13
- * Resolve the owning workspace's canonical directory path to seed a
14
- * `cwd`-owned entry Session. A `cwd`-only create deliberately does NOT attach
15
- * the Session to the workspace, so DSH's New-Session blank-session reuse skips it.
13
+ * Resolve Host-owned Workspace identity, not just a directory. Existing
14
+ * membership wins; a legacy ungrouped Session may match a registered path.
15
+ * Never register a new Workspace or create an ungrouped business Session here.
16
16
  */
17
- export declare function resolveTenderEntryWorkspacePath(sessions: Pick<ISessions, 'list'>, workspaces: Pick<IWorkspaces, 'list'>): string | undefined;
17
+ export declare function resolveTenderEntryWorkspaceId(sessions: Pick<ISessions, 'list'>, workspaces: Pick<IWorkspaces, 'list'>): WorkspaceId | undefined;
18
18
  /**
19
- * Create a distinct native Session with `cwd` ownership only (no workspace
20
- * attachment). This keeps the Session out of the workspace's reusable blank-set,
21
- * so DSH's 新会话 action mints a fresh default Session instead of reopening the
22
- * workbench Session.
19
+ * Create a distinct native Session explicitly attached to its Workspace.
20
+ * Namespaced identity + ordinary-session-guard prevent New Session reuse;
21
+ * detaching the business Session from its Workspace is not an isolation method.
23
22
  */
24
23
  export declare function createTenderEntrySession(sessions: ISessions, workspaces: IWorkspaces, uuid?: () => string): Promise<SessionId>;
25
24
  //# sourceMappingURL=tender-session-entry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tender-session-entry.d.ts","sourceRoot":"","sources":["../../../src/client/tender-session-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAA;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAA;AACnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAE/D,eAAO,MAAM,8BAA8B,kCAAkC,CAAA;AAE7E,MAAM,MAAM,2BAA2B,GACnC,oBAAoB,GACpB,oBAAoB,GACpB,uBAAuB,CAAA;AAE3B,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,2BAA2B;gBAAjC,IAAI,EAAE,2BAA2B;CAIvD;AAeD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG7E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAGlE;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EACjC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GACpC,MAAM,GAAG,SAAS,CASpB;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,WAAW,EACvB,IAAI,GAAE,MAAM,MAAoB,GAC/B,OAAO,CAAC,SAAS,CAAC,CAapB"}
1
+ {"version":3,"file":"tender-session-entry.d.ts","sourceRoot":"","sources":["../../../src/client/tender-session-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAA;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAA;AAChG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAE/D,eAAO,MAAM,8BAA8B,kCAAkC,CAAA;AAE7E,MAAM,MAAM,2BAA2B,GACnC,oBAAoB,GACpB,oBAAoB,GACpB,uBAAuB,CAAA;AAE3B,qBAAa,uBAAwB,SAAQ,KAAK;IACpC,QAAQ,CAAC,IAAI,EAAE,2BAA2B;gBAAjC,IAAI,EAAE,2BAA2B;CAIvD;AAeD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAG7E;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAGlE;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EACjC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GACpC,WAAW,GAAG,SAAS,CAezB;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,WAAW,EACvB,IAAI,GAAE,MAAM,MAAoB,GAC/B,OAAO,CAAC,SAAS,CAAC,CAapB"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool-contract.d.ts","sourceRoot":"","sources":["../../../src/host/tool-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EACjC,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAChG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAA;AAG1E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;CAC5C;AA+MD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAA;IAC1C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAA;IAChD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B,GAAG,sBAAsB,CA0CzB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiC5E"}
1
+ {"version":3,"file":"tool-contract.d.ts","sourceRoot":"","sources":["../../../src/host/tool-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EACjC,MAAM,+BAA+B,CAAA;AAEtC,OAAO,EAA4B,KAAK,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAChG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAA;AAG1E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAAA;CAC5C;AA4ND,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAA;IAC1C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,2BAA2B,CAAA;IAChD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B,GAAG,sBAAsB,CA0CzB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiC5E"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-tender-workbench",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "description": "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.",
5
5
  "keywords": [
6
6
  "deepseek-harness",
@@ -47,7 +47,7 @@
47
47
  "README.en.md",
48
48
  "CHANGELOG.md",
49
49
  "cordis.patch.yml",
50
- "docs/RELEASE-0.5.5.md",
50
+ "docs/RELEASE-0.5.7.md",
51
51
  "lib/index.js",
52
52
  "lib/client.js",
53
53
  "lib/client.js.map",
@@ -124,8 +124,14 @@
124
124
  "dsh-better-sidebar": "~0.18.1",
125
125
  "dsh-mcp-connector": ">=0.2.31"
126
126
  },
127
+ "peerDependenciesMeta": {
128
+ "dsh-better-sidebar": {
129
+ "optional": true
130
+ }
131
+ },
127
132
  "devDependencies": {
128
133
  "@deepseek-ai/cordis": "4.0.2",
134
+ "@deepseek-ai/dsh-agent": "0.1.2-rc.1",
129
135
  "@deepseek-ai/dsh-api-session-controller": "0.1.2-rc.1",
130
136
  "@deepseek-ai/dsh-api-workspace-controller": "0.1.2-rc.1",
131
137
  "@deepseek-ai/dsh-client-connection": "0.1.2-rc.1",
@@ -141,6 +147,7 @@
141
147
  "@deepseek-ai/dsh-client-ui-workspace": "0.1.2-rc.1",
142
148
  "@deepseek-ai/dsh-host-webserver": "0.1.2-rc.1",
143
149
  "@deepseek-ai/dsh-invariants": "0.1.2-rc.1",
150
+ "@deepseek-ai/dsh-scope": "0.1.2-rc.1",
144
151
  "@deepseek-ai/dsh-session": "0.1.2-rc.1",
145
152
  "@deepseek-ai/dsh-session-projection": "0.1.2-rc.1",
146
153
  "@deepseek-ai/dsh-skill": "0.1.2-rc.1",
@@ -1,40 +0,0 @@
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,禁止覆盖仍可用的临时补丁安装。