dsh-pre-duediligence 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # 更新日志
2
2
 
3
+ ## [0.1.6] - 2026-09-07
4
+
5
+ - 修复左侧“访前尽调”入口自动展开右侧工作台:入口现在只创建并进入专属 Session,初始页保持完整对话空间。
6
+ - 右侧工作台仅由输入框下方五项业务快捷按钮显式打开;关闭后也从同一组按钮重新进入。
7
+ - 采纳 DSH-UX-001 v1.1.1 的初始开合规则,并补充入口不调用 `openTab` 的回归测试。
8
+
3
9
  ## [0.1.5] - 2026-09-07
4
10
 
5
11
  - 对齐 DSH-UX-001 v1.1.0 与企查查蓝 Mockup:浅深色 Token、组件状态、键盘焦点和窄屏布局统一更新。
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # dsh-pre-duediligence
2
2
 
3
- 当前版本:**0.1.5**。界面已对齐 DSH-UX-001 v1.1.0 与企查查蓝 Mockup:菜单、首页和工作台使用同一建筑 LOGO,首页名称为“访前尽调一页纸智能体”,并新增五项快捷菜单与四步提示词生成器。详见 [更新日志](CHANGELOG.md)和[规范采纳记录](docs/DSH-UX-001-ADOPTION.md)。
3
+ 当前版本:**0.1.6**。界面已对齐 DSH-UX-001 v1.1.1 与企查查蓝 Mockup:菜单、首页和工作台使用同一建筑 LOGO,首页名称为“访前尽调一页纸智能体”;点击左侧“访前尽调”只进入初始会话,右侧工作台默认关闭,点击输入框下方业务按钮后才打开。详见 [更新日志](CHANGELOG.md)和[规范采纳记录](docs/DSH-UX-001-ADOPTION.md)。
4
4
 
5
5
  面向 DeepSeek Harness 的 Session 级访前尽调智能体。业务人员从左侧菜单进入,在会话级工作台定义一次拜访;Agent 调用企查查五类 MCP,使用机会与风险双引擎完成经营状态识别、假设与反证、风险核验,最终交付可追溯的访前尽调报告。
6
6
 
@@ -13,6 +13,7 @@
13
13
  - 使用 dsh-better-sidebar 0.17.1,不再使用遮挡对话的自定义浮层
14
14
  - 只在 DSH 左侧菜单增加“访前尽调”入口;对应工作台标签在 Better Sidebar 的右侧“+”菜单中隐藏
15
15
  - 菜单、首页与工作台统一使用企查查蓝 Mockup 的线性建筑 LOGO;初始页面为“访前尽调一页纸智能体”
16
+ - 点击左侧入口只创建并进入访前 Session,初始页不打开右侧工作台;点击输入框下方五项业务按钮后才打开对应视图
16
17
  - 首页只保留简洁说明、DSH 原生输入框和输入框下方五项快捷菜单:企业核验、经营画像、风险核查、访前材料、任务历史
17
18
  - “当前任务 / 任务历史”主导航与五阶段业务导航分离:
18
19
  1. 对象与目标
@@ -21,7 +22,7 @@
21
22
  4. 证据核验
22
23
  5. 材料输出
23
24
  - 快捷菜单与阶段导航只切换视图,不伪造执行状态;只有捕获到完整报告后才显示“报告已生成”
24
- - 关闭工作台只隐藏界面,不取消任务;可从输入区快捷菜单或会话头按钮恢复
25
+ - 关闭工作台只隐藏界面,不取消任务;从输入框下方同一组快捷按钮恢复
25
26
  - 进度与工具记录只读取当前 Session 的真实事件,不维护跨 Session 的浏览器任务列表
26
27
  - 完整报告保留在 DSH 原生会话中
27
28
 
@@ -63,7 +64,7 @@ bash <(curl -fsSL https://raw.githubusercontent.com/duhu2000/dsh-pre-duediligenc
63
64
 
64
65
  1. `dsh-better-sidebar@0.17.1`:提供 Session 级右侧工作台容器。
65
66
  2. `dsh-mcp-connector@0.2.32`:提供通用 MCP 连接器与市场,通过“企查查·企业工商”完成 OAuth,并动态挂载企业、风险、知产、经营、历史和董监高 MCP。
66
- 3. `dsh-pre-duediligence@0.1.5`:提供左侧智能体入口、访前工作台、提示词生成器和完整 Skill。
67
+ 3. `dsh-pre-duediligence@0.1.6`:提供左侧智能体入口、访前工作台、提示词生成器和完整 Skill。
67
68
 
68
69
  安装完成后停止旧的 DSH Web 进程并重新运行:
69
70
 
@@ -78,7 +79,7 @@ dsh web
78
79
  ~~~bash
79
80
  dsh plugin --profile web add dsh-better-sidebar@0.17.1 --allow-build=node-pty
80
81
  dsh plugin --profile web add dsh-mcp-connector@0.2.32
81
- dsh plugin --profile web add dsh-pre-duediligence@0.1.5 --allow-build=dsh-pre-duediligence
82
+ dsh plugin --profile web add dsh-pre-duediligence@0.1.6 --allow-build=dsh-pre-duediligence
82
83
  dsh web
83
84
  ~~~
84
85
 
@@ -92,7 +93,7 @@ Better Sidebar 必须使用 `0.17.1`;工作台依赖它的 `targetedOpen` 与
92
93
  dsh plugin --profile web list --depth 0
93
94
  ~~~
94
95
 
95
- 应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.5`。重启 DSH 并连接“企查查·企业工商”后,在左侧菜单点击“访前尽调”打开工作台;Better Sidebar 的右侧“+”菜单不会再列出该入口。普通会话的首页、输入框、消息流和 Session 头部保持原样。
96
+ 应能看到 `dsh-better-sidebar@0.17.1`、`dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.6`。重启 DSH 并连接“企查查·企业工商”后,在左侧菜单点击“访前尽调”只进入初始会话;右侧工作台保持关闭,点击输入框下方业务按钮后才打开对应视图。Better Sidebar 的右侧“+”菜单不会列出该入口,普通会话的首页、输入框、消息流和 Session 头部保持原样。
96
97
 
97
98
  ### 从旧访前尽调包迁移
98
99
 
@@ -108,7 +109,7 @@ dsh plugin --profile web remove qcc-previsit-dsh
108
109
 
109
110
  如果 Web profile 已安装 `qcc-dsh-mcp-oauth`,不要让它与 MCP 连接器同时管理同名企查查 Server:
110
111
 
111
- 1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.5`,完全重启 DSH。
112
+ 1. 先安装 `dsh-mcp-connector@0.2.32` 和 `dsh-pre-duediligence@0.1.6`,完全重启 DSH。
112
113
  2. 打开“🧩 MCP连接器”,按界面提示迁移旧企查查授权;也可以重新连接“企查查·企业工商”。
113
114
  3. 迁移完成后停止 DSH,执行 `dsh plugin --profile web remove qcc-dsh-mcp-oauth`。
114
115
  4. 再次启动 DSH,在“已安装”中确认企查查连接健康,然后执行一次真实企业查询。
@@ -130,16 +131,16 @@ pnpm test:ui
130
131
  ## 人工验收
131
132
 
132
133
  1. 在 DSH 选择一个工作空间和 Session。
133
- 2. 确认左侧菜单出现“访前尽调”及建筑 LOGO,同时右侧 Better Sidebar 的“+”菜单不再出现该入口;普通会话保持 DSH 原样。
134
+ 2. 点击左侧“访前尽调”,确认只进入专属初始会话,右侧工作台保持关闭;同时右侧 Better Sidebar 的“+”菜单不出现该入口,普通会话保持 DSH 原样。
134
135
  3. 点击“访前尽调”,确认首页标题为“访前尽调一页纸智能体”,LOGO 与菜单一致,说明行独立居中。
135
- 4. 确认五项快捷菜单位于原生输入框下方,点击后只切换右侧工作台视图。
136
+ 4. 确认五项快捷菜单位于原生输入框下方,点击后才打开右侧工作台并切换到对应视图。
136
137
  5. 打开输入框左上角“提示词生成”,检查四步、滚动、固定头尾、Tab 焦点环和 Escape 恢复焦点。
137
138
  6. 选择“银行/信贷客户经理、首次拜访、风险与涉诉、股权与实控人、15分钟标准、一页纸简报”并填写企业。
138
139
  7. 输入框已有自由文本时,分别验证取消、追加、替换;确认回填后不会自动发送。
139
140
  8. 点击 DSH 原生发送按钮,确认消息作为用户可见文本发送到当前 Session。
140
141
  9. 确认工作台只展示当前 Session 真实发生的企业、经营、知识产权和风险工具调用。
141
142
  10. 检查风险侧先出现企业风险扫描,零计数维度没有继续下钻。
142
- 11. 中途关闭工作台,确认任务继续;点击会话头“访前尽调”可恢复。
143
+ 11. 中途关闭工作台,确认任务继续;点击输入框下方任一业务快捷按钮可恢复并进入对应视图。
143
144
  12. Agent 停止但未生成完整报告时应显示“等待确认 / 继续”;完整报告出现后才显示“报告已生成”。
144
145
  13. 检查报告有八段(含独立产业定位),假设包含支持/反对/未知,必问包含答 A/B 分支,覆盖声明区分零记录和调用失败。
145
146
 
@@ -1,16 +1,16 @@
1
- # DSH-UX-001 v1.1.0 采纳与验收记录
1
+ # DSH-UX-001 v1.1.1 采纳与验收记录
2
2
 
3
- 日期:2026-09-07。业务插件:`dsh-pre-duediligence@0.1.5`。规范源:[共享交互规范 v1.1.0](../../../../AI-设计/DSH智能体开发交互规范方案.md),视觉参考:[企查查蓝交互 Mockup v1.1.0](../../../../AI-设计/DSH智能体_企查查蓝_UI_Mockup_v1.1.0.html)。
3
+ 日期:2026-09-07。业务插件:`dsh-pre-duediligence@0.1.6`。规范源:[共享交互规范 v1.1.1](../../../../AI-设计/DSH智能体开发交互规范方案.md),视觉参考:[企查查蓝交互 Mockup(原文件名 v1.1.0,内容 v1.1.1)](../../../../AI-设计/DSH智能体_企查查蓝_UI_Mockup_v1.1.0.html)。
4
4
 
5
5
  ## 页面与品牌映射
6
6
 
7
7
  | 规范区域 | 本插件实现 | 隔离边界 |
8
8
  | --- | --- | --- |
9
- | 左侧入口 | 菜单名固定为“访前尽调”,使用 Mockup 的线性建筑 SVG | 位于工作区列表前;隐藏 Better Sidebar 标签菜单项 |
9
+ | 左侧入口 | 菜单名固定为“访前尽调”,使用 Mockup 的线性建筑 SVG;只创建并进入专属 Session | 位于工作区列表前;不调用 `openTab`,初始页右栏关闭;隐藏 Better Sidebar 标签菜单项 |
10
10
  | 中央首页 | 标题“访前尽调一页纸智能体”,同排建筑 LOGO,独立说明行 | 只在插件创建的空白 Session 可逆改写;卸载时恢复宿主标题、图标和预览标识 |
11
11
  | 原生输入区 | Composer 下方五项快捷菜单;左上角“提示词生成” | 不替换输入框、模型、权限和原生发送按钮 |
12
12
  | 提示词向导 | 对象 → 角色场景 → 范围深度 → 确认输出 | Portal 到 body;回填不发送;已有草稿显式选择替换、追加或取消 |
13
- | 右侧工作台 | 当前任务 / 任务历史;五步业务导航;关闭与会话头恢复 | Better Sidebar 是唯一权威工作台;关闭不取消会话任务 |
13
+ | 右侧工作台 | 当前任务 / 任务历史;五步业务导航;由输入框下方快捷按钮打开和恢复 | Better Sidebar 是唯一权威工作台;关闭不取消会话任务;不另设会话头打开入口 |
14
14
  | 下载材料 | 自包含 HTML 一页纸报告 | 只使用已捕获的当前 Session 报告,不跨 Session 合并 |
15
15
 
16
16
  ## 菜单与阶段映射
@@ -39,7 +39,7 @@
39
39
 
40
40
  ## Token 与组件
41
41
 
42
- 浅色品牌 / 动作色为 `#128BED / #0875D1`,深色为 `#55ADFF / #82C3FF`;表头、背景、文字、边框、成功和复核色均按 v1.1.0 候选表实现。小号白字主按钮使用动作色,深色模式动作按钮使用深色文字。所有变量限定在 `.qcc*` 自有节点,不覆盖全局 `:root`。
42
+ 浅色品牌 / 动作色为 `#128BED / #0875D1`,深色为 `#55ADFF / #82C3FF`;表头、背景、文字、边框、成功和复核色均按 v1.1.1 候选表实现。小号白字主按钮使用动作色,深色模式动作按钮使用深色文字。所有变量限定在 `.qcc*` 自有节点,不覆盖全局 `:root`。
43
43
 
44
44
  ## DSH 兼容范围与例外
45
45
 
@@ -60,9 +60,9 @@
60
60
  ## 实机验收清单
61
61
 
62
62
  1. 普通会话不出现访前标题、菜单、提示词触发器或工作台恢复入口。
63
- 2. 从“访前尽调”进入后,菜单 / 首页 / 工作台显示同一建筑 LOGO,首页名称和说明行居中。
63
+ 2. 从“访前尽调”进入后,只显示专属初始会话,右侧工作台关闭;菜单与首页显示同一建筑 LOGO,首页名称和说明行居中。
64
64
  3. 浅色、深色及 390px 窄屏下,无横向页面溢出;移动输入字号不低于 16px。
65
65
  4. 向导正文可滚动、头尾固定;Tab 不越出弹窗,Escape 关闭并恢复焦点。
66
66
  5. 输入框已有文字时验证替换、追加、取消三条路径;回填后不自动发送。
67
- 6. 关闭工作台不取消任务;会话头按钮可重新打开当前 Session 工作台。
67
+ 6. 点击输入框下方五项业务按钮后才打开对应工作台视图;关闭不取消任务,再点同组按钮可重新打开。
68
68
  7. Agent 停止但无完整报告时仍显示“等待确认 / 继续”;完整报告出现后才显示“报告已生成”并允许下载。
package/install.sh CHANGED
@@ -5,7 +5,7 @@ set -euo pipefail
5
5
  readonly PROFILE_NAME="${DSH_PROFILE:-web}"
6
6
  readonly BETTER_SIDEBAR_SPEC="dsh-better-sidebar@0.17.1"
7
7
  readonly MCP_CONNECTOR_SPEC="dsh-mcp-connector@0.2.32"
8
- readonly PREVISIT_SPEC="${DSH_PRE_DUEDILIGENCE_SPEC:-dsh-pre-duediligence@0.1.5}"
8
+ readonly PREVISIT_SPEC="${DSH_PRE_DUEDILIGENCE_SPEC:-dsh-pre-duediligence@0.1.6}"
9
9
  readonly LEGACY_PREVISIT_NAME="qcc-previsit-dsh"
10
10
  readonly LEGACY_QCC_OAUTH_NAME="qcc-dsh-mcp-oauth"
11
11
 
@@ -59,4 +59,4 @@ else
59
59
  "重启后打开左侧“🧩 MCP连接器”,选择“企查查·企业工商”并完成 OAuth 授权。" \
60
60
  "该连接会提供企业、风险、知产、经营、历史和董监高 MCP。"
61
61
  fi
62
- printf '%s\n' "在 DSH 左侧菜单点击“访前尽调”即可打开;右侧标签菜单不再显示该入口,普通会话不会挂载业务界面。"
62
+ printf '%s\n' "在 DSH 左侧菜单点击“访前尽调”进入初始会话;右侧工作台默认关闭,点击输入框下方业务按钮后才打开。"
package/lib/client.js CHANGED
@@ -1096,7 +1096,7 @@ function LeftSidebarEntry(props) {
1096
1096
  mount
1097
1097
  );
1098
1098
  }
1099
- function registerLeftSidebarLauncher(ctx, service, reveal) {
1099
+ function registerLeftSidebarLauncher(ctx, service) {
1100
1100
  ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
1101
1101
  name: "sidebar.footer.action",
1102
1102
  id: "dsh-pre-duediligence-launcher",
@@ -1108,9 +1108,6 @@ function registerLeftSidebarLauncher(ctx, service, reveal) {
1108
1108
  throw new Error("\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0\u5F53\u524D\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u63D2\u4EF6\u914D\u7F6E");
1109
1109
  }
1110
1110
  const sessionId = await createPrevisitSession(ctx);
1111
- if (!openWorkbench(service, { sessionId }, reveal)) {
1112
- throw new Error("\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0\u5F53\u524D\u4E0D\u53EF\u7528\uFF0C\u8BF7\u68C0\u67E5\u63D2\u4EF6\u914D\u7F6E");
1113
- }
1114
1111
  ctx.sessions.open?.(sessionId);
1115
1112
  }
1116
1113
  })
@@ -1318,7 +1315,7 @@ function derivePhaseStates(input) {
1318
1315
 
1319
1316
  // src/workbench-style.ts
1320
1317
  var WORKBENCH_CSS = String.raw`
1321
- .qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent,.qccPrevisitHeaderAction{
1318
+ .qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent{
1322
1319
  --qcc-brand:#128BED;
1323
1320
  --qcc-action:#0875D1;
1324
1321
  --qcc-action-hover:#0666B7;
@@ -1338,7 +1335,7 @@ var WORKBENCH_CSS = String.raw`
1338
1335
  --qcc-danger-bg:#FFF1F0;
1339
1336
  color:var(--qcc-text);
1340
1337
  }
1341
- :is(html[data-theme="dark"],html.dark) :is(.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent,.qccPrevisitHeaderAction){
1338
+ :is(html[data-theme="dark"],html.dark) :is(.qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent){
1342
1339
  --qcc-brand:#55ADFF;
1343
1340
  --qcc-action:#82C3FF;
1344
1341
  --qcc-action-hover:#ACD7FF;
@@ -1358,7 +1355,7 @@ var WORKBENCH_CSS = String.raw`
1358
1355
  --qcc-danger-bg:#442826;
1359
1356
  }
1360
1357
  @media(prefers-color-scheme:dark){
1361
- .qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent,.qccPrevisitHeaderAction{
1358
+ .qccPwShell,.qccPromptPanel,.qccPromptLayer,.qccPrevisitCapabilities,.qccPrevisitExperience,.qccPrevisitLauncherContent{
1362
1359
  --qcc-brand:#55ADFF;
1363
1360
  --qcc-action:#82C3FF;
1364
1361
  --qcc-action-hover:#ACD7FF;
@@ -1388,11 +1385,9 @@ html[data-theme="dark"] .qccPrevisitHeroLogo,html.dark .qccPrevisitHeroLogo{colo
1388
1385
  .qccPrevisitCapability{display:inline-flex;align-items:center;justify-content:center;gap:7px;min-width:0;min-height:38px;padding:8px 12px;border:1px solid var(--qcc-border);border-radius:10px;background:var(--qcc-surface);color:var(--qcc-secondary);font:inherit;font-size:13px;cursor:pointer;transition:border-color .16s ease,color .16s ease,background .16s ease}
1389
1386
  .qccPrevisitCapability svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none}
1390
1387
  .qccPrevisitCapability:hover{border-color:var(--qcc-brand);background:var(--qcc-selected);color:var(--qcc-action)}
1391
- .qccPrevisitCapability:focus-visible,.qccPromptTrigger:focus-visible,.qccPromptPanel button:focus-visible,.qccPromptPanel input:focus-visible,.qccPwShell button:focus-visible,.qccPrevisitHeaderAction:focus-visible{outline:2px solid var(--qcc-brand);outline-offset:2px}
1388
+ .qccPrevisitCapability:focus-visible,.qccPromptTrigger:focus-visible,.qccPromptPanel button:focus-visible,.qccPromptPanel input:focus-visible,.qccPwShell button:focus-visible{outline:2px solid var(--qcc-brand);outline-offset:2px}
1392
1389
  .qccPrevisitLauncherContent{display:inline-flex;align-items:center;gap:9px;color:inherit}
1393
1390
  .qccPrevisitLauncherContent svg{color:var(--qcc-brand);flex:none}
1394
- .qccPrevisitHeaderAction{display:inline-flex;align-items:center;gap:6px;min-height:32px;padding:0 10px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-text);font:inherit;font-size:12px;cursor:pointer}
1395
- .qccPrevisitHeaderAction svg{color:var(--qcc-brand)}
1396
1391
 
1397
1392
  .qccPromptLayer{position:absolute;z-index:4;top:10px;left:12px}
1398
1393
  .qccPromptTrigger{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 9px;border:1px solid var(--qcc-border);border-radius:8px;background:var(--qcc-surface);color:var(--qcc-action);font:inherit;font-size:12px;font-weight:600;cursor:pointer}
@@ -2195,13 +2190,6 @@ function installStyles() {
2195
2190
  document.head.append(style);
2196
2191
  return () => style.remove();
2197
2192
  }
2198
- function PrevisitHeaderEntry(props) {
2199
- if (!isPrevisitSession(props.sessionId)) return null;
2200
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("button", { type: "button", className: "qccPrevisitHeaderAction", "aria-label": "\u6253\u5F00\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0", title: "\u6253\u5F00\u8BBF\u524D\u5C3D\u8C03\u5DE5\u4F5C\u53F0", onClick: props.openWorkbench, children: [
2201
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PrevisitLogo, { size: 16 }),
2202
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: "\u8BBF\u524D\u5C3D\u8C03" })
2203
- ] });
2204
- }
2205
2193
  function apply(ctx) {
2206
2194
  const service = ctx.betterSidebar;
2207
2195
  const shared = createPrevisitStore();
@@ -2222,7 +2210,7 @@ function apply(ctx) {
2222
2210
  () => registerWorkbenchTab(service, (props) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PrevisitWorkbenchTab, { ...props, ctx, shared, reveal, startPrompt })),
2223
2211
  "dsh-pre-duediligence: hidden workbench tab"
2224
2212
  );
2225
- registerLeftSidebarLauncher(ctx, service, reveal);
2213
+ registerLeftSidebarLauncher(ctx, service);
2226
2214
  ctx.slots.inject("conversation.input.dock", () => ctx.slots.register({
2227
2215
  name: "conversation.input.dock",
2228
2216
  id: "dsh-pre-duediligence:home",
@@ -2239,14 +2227,6 @@ function apply(ctx) {
2239
2227
  order: 110,
2240
2228
  inject: () => ({ store: shared })
2241
2229
  }, PrevisitPromptGenerator));
2242
- ctx.slots.inject("conversation.session.header.actions", () => ctx.slots.register({
2243
- name: "conversation.session.header.actions",
2244
- id: "dsh-pre-duediligence:workbench-entry",
2245
- order: 110,
2246
- inject: (sessionId) => ({ openWorkbench: () => {
2247
- openForSession(sessionId);
2248
- } })
2249
- }, PrevisitHeaderEntry));
2250
2230
  }
2251
2231
 
2252
2232
  return module.exports;
package/lib/index.js CHANGED
@@ -38,7 +38,7 @@ function loadBundledSkill() {
38
38
  },
39
39
  metadata: {
40
40
  author: "QCC",
41
- version: "0.1.5",
41
+ version: "0.1.6",
42
42
  industry: "enterprise-services",
43
43
  mcpServers: ["qcc-company", "qcc-risk", "qcc-ipr", "qcc-operation", "qcc-executive"]
44
44
  }
package/lib/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/skill-file.ts"],
4
- "sourcesContent": ["import { readFileSync } from \"node:fs\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { parseSkillFile } from \"./skill-file.js\"\n\nexport const inject = [\"skills\"] as const\n\nexport const SKILL_NAME = \"qcc-previsit-onepager\"\nexport const SKILL_DESCRIPTION =\n \"\u8C03\u7528\u4F01\u67E5\u67E5\u4E94\u7C7B MCP \u6267\u884C\u4F01\u4E1A\u8BBF\u524D\u5C3D\u8C03\uFF0C\u4EE5\u673A\u4F1A\u4E0E\u98CE\u9669\u53CC\u5F15\u64CE\u8BC6\u522B\u7ECF\u8425\u72B6\u6001\u3001\u5EFA\u7ACB\u5E76\u53CD\u8BC1\u4E1A\u52A1\u5047\u8BBE\uFF0C\u4EA4\u4ED8\u53EF\u8FFD\u6EAF\u7684\u8BBF\u524D\u5C3D\u8C03\u62A5\u544A\u3002\"\n\ntype SkillRegistration = {\n name: string\n description: string\n whenToUse: string\n content: string\n source: \"bundled\"\n resourceBase: {\n kind: \"directory\"\n path: string\n }\n metadata: Readonly<Record<string, unknown>>\n}\n\nexport type HostContext = {\n skills: {\n register(skill: SkillRegistration): () => void\n }\n}\n\nexport function loadBundledSkill(): SkillRegistration {\n const skillDirectoryUrl = new URL(\"../skills/qcc-previsit-onepager/\", import.meta.url)\n const skillSource = readFileSync(new URL(\"SKILL.md\", skillDirectoryUrl), \"utf8\")\n const { content } = parseSkillFile(skillSource)\n\n return {\n name: SKILL_NAME,\n description: SKILL_DESCRIPTION,\n whenToUse: \"\u7528\u6237\u8981\u6C42\u51C6\u5907\u5BA2\u6237\u62DC\u8BBF\u3001\u8BBF\u524D\u5C3D\u8C03\u3001\u4E00\u9875\u7EB8\u7B80\u62A5\u3001\u6388\u4FE1\u9762\u8C08\u3001\u5546\u52A1\u8C08\u5224\u3001\u7B7E\u7EA6\u6838\u67E5\u3001\u590D\u8BBF\u66F4\u65B0\u3001\u89E6\u8FBE\u8DEF\u5F84\u6216\u5F53\u9762\u63D0\u95EE\u6E05\u5355\u65F6\u4F7F\u7528\u3002\",\n content,\n source: \"bundled\",\n resourceBase: {\n kind: \"directory\",\n path: fileURLToPath(skillDirectoryUrl),\n },\n metadata: {\n author: \"QCC\",\n version: \"0.1.5\",\n industry: \"enterprise-services\",\n mcpServers: [\"qcc-company\", \"qcc-risk\", \"qcc-ipr\", \"qcc-operation\", \"qcc-executive\"],\n },\n }\n}\n\nexport function apply(ctx: HostContext): void {\n ctx.skills.register(loadBundledSkill())\n}\n", "export type ParsedSkillFile = {\n content: string\n frontmatter: string | null\n}\n\nexport function parseSkillFile(source: string): ParsedSkillFile {\n const normalized = source.replaceAll(\"\\r\\n\", \"\\n\")\n\n if (!normalized.startsWith(\"---\\n\")) {\n return { content: normalized.trim(), frontmatter: null }\n }\n\n const closingMarker = normalized.indexOf(\"\\n---\\n\", 4)\n\n if (closingMarker === -1) {\n throw new Error(\"SKILL.md \u7684 YAML frontmatter \u7F3A\u5C11\u7ED3\u675F\u6807\u8BB0\")\n }\n\n return {\n frontmatter: normalized.slice(4, closingMarker).trim(),\n content: normalized.slice(closingMarker + 5).trim(),\n }\n}\n"],
4
+ "sourcesContent": ["import { readFileSync } from \"node:fs\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { parseSkillFile } from \"./skill-file.js\"\n\nexport const inject = [\"skills\"] as const\n\nexport const SKILL_NAME = \"qcc-previsit-onepager\"\nexport const SKILL_DESCRIPTION =\n \"\u8C03\u7528\u4F01\u67E5\u67E5\u4E94\u7C7B MCP \u6267\u884C\u4F01\u4E1A\u8BBF\u524D\u5C3D\u8C03\uFF0C\u4EE5\u673A\u4F1A\u4E0E\u98CE\u9669\u53CC\u5F15\u64CE\u8BC6\u522B\u7ECF\u8425\u72B6\u6001\u3001\u5EFA\u7ACB\u5E76\u53CD\u8BC1\u4E1A\u52A1\u5047\u8BBE\uFF0C\u4EA4\u4ED8\u53EF\u8FFD\u6EAF\u7684\u8BBF\u524D\u5C3D\u8C03\u62A5\u544A\u3002\"\n\ntype SkillRegistration = {\n name: string\n description: string\n whenToUse: string\n content: string\n source: \"bundled\"\n resourceBase: {\n kind: \"directory\"\n path: string\n }\n metadata: Readonly<Record<string, unknown>>\n}\n\nexport type HostContext = {\n skills: {\n register(skill: SkillRegistration): () => void\n }\n}\n\nexport function loadBundledSkill(): SkillRegistration {\n const skillDirectoryUrl = new URL(\"../skills/qcc-previsit-onepager/\", import.meta.url)\n const skillSource = readFileSync(new URL(\"SKILL.md\", skillDirectoryUrl), \"utf8\")\n const { content } = parseSkillFile(skillSource)\n\n return {\n name: SKILL_NAME,\n description: SKILL_DESCRIPTION,\n whenToUse: \"\u7528\u6237\u8981\u6C42\u51C6\u5907\u5BA2\u6237\u62DC\u8BBF\u3001\u8BBF\u524D\u5C3D\u8C03\u3001\u4E00\u9875\u7EB8\u7B80\u62A5\u3001\u6388\u4FE1\u9762\u8C08\u3001\u5546\u52A1\u8C08\u5224\u3001\u7B7E\u7EA6\u6838\u67E5\u3001\u590D\u8BBF\u66F4\u65B0\u3001\u89E6\u8FBE\u8DEF\u5F84\u6216\u5F53\u9762\u63D0\u95EE\u6E05\u5355\u65F6\u4F7F\u7528\u3002\",\n content,\n source: \"bundled\",\n resourceBase: {\n kind: \"directory\",\n path: fileURLToPath(skillDirectoryUrl),\n },\n metadata: {\n author: \"QCC\",\n version: \"0.1.6\",\n industry: \"enterprise-services\",\n mcpServers: [\"qcc-company\", \"qcc-risk\", \"qcc-ipr\", \"qcc-operation\", \"qcc-executive\"],\n },\n }\n}\n\nexport function apply(ctx: HostContext): void {\n ctx.skills.register(loadBundledSkill())\n}\n", "export type ParsedSkillFile = {\n content: string\n frontmatter: string | null\n}\n\nexport function parseSkillFile(source: string): ParsedSkillFile {\n const normalized = source.replaceAll(\"\\r\\n\", \"\\n\")\n\n if (!normalized.startsWith(\"---\\n\")) {\n return { content: normalized.trim(), frontmatter: null }\n }\n\n const closingMarker = normalized.indexOf(\"\\n---\\n\", 4)\n\n if (closingMarker === -1) {\n throw new Error(\"SKILL.md \u7684 YAML frontmatter \u7F3A\u5C11\u7ED3\u675F\u6807\u8BB0\")\n }\n\n return {\n frontmatter: normalized.slice(4, closingMarker).trim(),\n content: normalized.slice(closingMarker + 5).trim(),\n }\n}\n"],
5
5
  "mappings": ";AAAA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;;;ACIvB,SAAS,eAAe,QAAiC;AAC9D,QAAM,aAAa,OAAO,WAAW,QAAQ,IAAI;AAEjD,MAAI,CAAC,WAAW,WAAW,OAAO,GAAG;AACnC,WAAO,EAAE,SAAS,WAAW,KAAK,GAAG,aAAa,KAAK;AAAA,EACzD;AAEA,QAAM,gBAAgB,WAAW,QAAQ,WAAW,CAAC;AAErD,MAAI,kBAAkB,IAAI;AACxB,UAAM,IAAI,MAAM,uEAAoC;AAAA,EACtD;AAEA,SAAO;AAAA,IACL,aAAa,WAAW,MAAM,GAAG,aAAa,EAAE,KAAK;AAAA,IACrD,SAAS,WAAW,MAAM,gBAAgB,CAAC,EAAE,KAAK;AAAA,EACpD;AACF;;;ADjBO,IAAM,SAAS,CAAC,QAAQ;AAExB,IAAM,aAAa;AACnB,IAAM,oBACX;AAqBK,SAAS,mBAAsC;AACpD,QAAM,oBAAoB,IAAI,IAAI,oCAAoC,YAAY,GAAG;AACrF,QAAM,cAAc,aAAa,IAAI,IAAI,YAAY,iBAAiB,GAAG,MAAM;AAC/E,QAAM,EAAE,QAAQ,IAAI,eAAe,WAAW;AAE9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,IACR,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,MAAM,cAAc,iBAAiB;AAAA,IACvC;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY,CAAC,eAAe,YAAY,WAAW,iBAAiB,eAAe;AAAA,IACrF;AAAA,EACF;AACF;AAEO,SAAS,MAAM,KAAwB;AAC5C,MAAI,OAAO,SAAS,iBAAiB,CAAC;AACxC;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- import { type BetterSidebarService, type RevealController } from "./better-sidebar.js";
1
+ import type { BetterSidebarService } from "./better-sidebar.js";
2
2
  type SnapshotStore<T> = {
3
3
  getSnapshot(): T;
4
4
  };
@@ -37,5 +37,5 @@ export type LeftSidebarHost = {
37
37
  };
38
38
  get?(name: string): unknown;
39
39
  };
40
- export declare function registerLeftSidebarLauncher(ctx: LeftSidebarHost, service: BetterSidebarService, reveal: RevealController): void;
40
+ export declare function registerLeftSidebarLauncher(ctx: LeftSidebarHost, service: BetterSidebarService): void;
41
41
  export {};
@@ -1,2 +1,2 @@
1
- /** DSH-UX-001 v1.1.0:所有变量和组件选择器均限定在本插件拥有的节点内。 */
1
+ /** DSH-UX-001 v1.1.1:所有变量和组件选择器均限定在本插件拥有的节点内。 */
2
2
  export declare const WORKBENCH_CSS: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-pre-duediligence",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Session 级 DeepSeek Harness 访前尽调工作台,使用企查查 MCP 生成可追溯的访前尽调报告。",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -5,7 +5,7 @@ whenToUse: 用户要求准备客户拜访、访前尽调、一页纸简报、授
5
5
  user-invocable: true
6
6
  metadata:
7
7
  author: QCC
8
- version: 0.1.5
8
+ version: 0.1.6
9
9
  ---
10
10
 
11
11
  # 访前尽调