dsh-engineering-ui 0.0.0-stage → 1.5.0
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/LICENSE +21 -0
- package/README.md +772 -3
- package/engineering/plugins/dsh-engineering-ui/cordis.patch.yml +5 -0
- package/engineering/plugins/dsh-engineering-ui/icon.svg +14 -0
- package/engineering/plugins/dsh-engineering-ui/lib/client.js +8259 -0
- package/engineering/plugins/dsh-engineering-ui/lib/defense-sign.js +1552 -0
- package/engineering/plugins/dsh-engineering-ui/lib/index.js +5633 -0
- package/engineering/plugins/dsh-engineering-ui/lib/job-wait-guard.js +236 -0
- package/engineering/plugins/dsh-engineering-ui/lib/mem-guard.js +331 -0
- package/engineering/plugins/dsh-engineering-ui/lib/webots.js +114 -0
- package/engineering/plugins/dsh-engineering-ui/locale/en.json +6 -0
- package/engineering/plugins/dsh-engineering-ui/locale/zh.json +6 -0
- package/engineering/plugins/dsh-engineering-ui/preset-engineering.patch.yml +601 -0
- package/engineering/skills/assembly-orchestration/SKILL.md +651 -0
- package/engineering/skills/cad-workflow/SKILL.md +132 -0
- package/engineering/skills/mode-selection/SKILL.md +660 -0
- package/engineering/skills/physics-in-loop/SKILL.md +238 -0
- package/engineering/skills/physics-in-loop/references/feadocs.md +142 -0
- package/engineering/skills/solidworks-bridge/SKILL.md +445 -0
- package/engineering/skills/sw-design/SKILL.md +112 -0
- package/engineering/skills/sw-design/references/autocad-workflow.md +81 -0
- package/engineering/skills/sw-design/references/gbt-drafting.md +71 -0
- package/engineering/skills/sw-to-cad/SKILL.md +121 -0
- package/engineering/skills/webots-simulation/SKILL.md +58 -0
- package/engineering/tools/LICENSE.Auto-SolidWorks +21 -0
- package/engineering/tools/_plugin_paths.py +93 -0
- package/engineering/tools/_root.py +330 -0
- package/engineering/tools/_store.py +446 -0
- package/engineering/tools/ac_bridge.py +459 -0
- package/engineering/tools/ac_rules.json +21 -0
- package/engineering/tools/ac_validate.py +699 -0
- package/engineering/tools/ask_user.py +887 -0
- package/engineering/tools/build_arm1.py +46 -0
- package/engineering/tools/build_assembly.py +94 -0
- package/engineering/tools/build_base.py +57 -0
- package/engineering/tools/build_housing.py +70 -0
- package/engineering/tools/build_structural.py +43 -0
- package/engineering/tools/build_transmission.py +69 -0
- package/engineering/tools/cadx.lsp +128 -0
- package/engineering/tools/choice_contract.py +61 -0
- package/engineering/tools/conn_state.py +1671 -0
- package/engineering/tools/defense_gate.py +3374 -0
- package/engineering/tools/drawing_input.py +314 -0
- package/engineering/tools/env_check.py +467 -0
- package/engineering/tools/examples/build_axis.py +142 -0
- package/engineering/tools/examples/build_cup.py +56 -0
- package/engineering/tools/examples/build_plate.py +58 -0
- package/engineering/tools/examples/build_sphere.py +30 -0
- package/engineering/tools/examples/build_transition_duct.py +381 -0
- package/engineering/tools/gate_integrity.py +401 -0
- package/engineering/tools/mode2_flow.py +3589 -0
- package/engineering/tools/mode_checker.py +77 -0
- package/engineering/tools/mode_gate.py +8013 -0
- package/engineering/tools/part_registry.py +4266 -0
- package/engineering/tools/physics/__init__.py +50 -0
- package/engineering/tools/physics/_compat.py +12 -0
- package/engineering/tools/physics/design_state.py +142 -0
- package/engineering/tools/physics/domain_validator.py +751 -0
- package/engineering/tools/physics/fatigue.py +489 -0
- package/engineering/tools/physics/fea_solver.py +1163 -0
- package/engineering/tools/physics/feapy_solver.py +314 -0
- package/engineering/tools/physics/gb_materials.json +1228 -0
- package/engineering/tools/physics/geometry_gate.py +337 -0
- package/engineering/tools/physics/load_case.py +951 -0
- package/engineering/tools/physics/material_db.py +874 -0
- package/engineering/tools/physics/mesh_adapter.py +321 -0
- package/engineering/tools/physics/refine_rules.py +272 -0
- package/engineering/tools/physics/rules/gb_base_rules.json +377 -0
- package/engineering/tools/physics/rules/gb_drafting_rules.json +57 -0
- package/engineering/tools/physics/rules/gb_electrical_rules.json +25 -0
- package/engineering/tools/physics/rules/gb_fasteners_rules.json +73 -0
- package/engineering/tools/physics/rules/gb_housing_rules.json +41 -0
- package/engineering/tools/physics/rules/gb_manufacturing_rules.json +25 -0
- package/engineering/tools/physics/rules/gb_material_verify_rules.json +72 -0
- package/engineering/tools/physics/rules/gb_materials_rules.json +377 -0
- package/engineering/tools/physics/rules/gb_safety_rules.json +89 -0
- package/engineering/tools/physics/rules/gb_springs_rules.json +41 -0
- package/engineering/tools/physics/rules/gb_standards_registry.json +1646 -0
- package/engineering/tools/physics/rules/gb_structural_rules.json +201 -0
- package/engineering/tools/physics/rules/gb_surface_rules.json +25 -0
- package/engineering/tools/physics/rules/gb_transmission_rules.json +233 -0
- package/engineering/tools/physics/rules/housing_rules.json +48 -0
- package/engineering/tools/physics/rules/manifest.json +54 -0
- package/engineering/tools/physics/rules/mold_rules.json +48 -0
- package/engineering/tools/physics/rules/structural_rules.json +56 -0
- package/engineering/tools/physics/rules/transmission_rules.json +48 -0
- package/engineering/tools/physics/simulation_report.py +829 -0
- package/engineering/tools/physics_bridge.py +2685 -0
- package/engineering/tools/profile-manifest.ps1 +72 -0
- package/engineering/tools/run_regression.py +109 -0
- package/engineering/tools/settings.py +419 -0
- package/engineering/tools/solidworks-modeling.md +519 -0
- package/engineering/tools/sw_bridge.py +8215 -0
- package/engineering/tools/sw_guard.py +1066 -0
- package/engineering/tools/sw_surface.py +87 -0
- package/engineering/tools/swapi.py +14766 -0
- package/engineering/tools/verify_sync.py +218 -0
- package/engineering/tools/visual_check.py +2589 -0
- package/engineering/tools/webots_env.py +121 -0
- package/engineering/tools/webots_mcp/__init__.py +3 -0
- package/engineering/tools/webots_mcp/__main__.py +3 -0
- package/engineering/tools/webots_mcp/assembly.py +391 -0
- package/engineering/tools/webots_mcp/bootstrap.py +55 -0
- package/engineering/tools/webots_mcp/controller_worker.py +124 -0
- package/engineering/tools/webots_mcp/evidence.py +288 -0
- package/engineering/tools/webots_mcp/fake_worker.py +69 -0
- package/engineering/tools/webots_mcp/fault_resources.py +121 -0
- package/engineering/tools/webots_mcp/host.py +45 -0
- package/engineering/tools/webots_mcp/ledger.py +73 -0
- package/engineering/tools/webots_mcp/owned_job.py +70 -0
- package/engineering/tools/webots_mcp/physical_gate.py +187 -0
- package/engineering/tools/webots_mcp/physics.py +152 -0
- package/engineering/tools/webots_mcp/pipeline.py +108 -0
- package/engineering/tools/webots_mcp/recipes.py +129 -0
- package/engineering/tools/webots_mcp/repair.py +132 -0
- package/engineering/tools/webots_mcp/repair_trial.py +375 -0
- package/engineering/tools/webots_mcp/runtime.py +311 -0
- package/engineering/tools/webots_mcp/server.py +217 -0
- package/engineering/tools/webots_mcp/sw_export.py +509 -0
- package/engineering/tools/webots_mcp/transport.py +156 -0
- package/engineering/tools/workflow_gate.py +6134 -0
- package/package.json +64 -4
package/README.md
CHANGED
|
@@ -1,3 +1,772 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# 🔧 DSH 工程模式 · Engineering Mode
|
|
2
|
+
|
|
3
|
+
在 DSH 的插件安装栏输入 `dsh-engineering-ui` 即可安装一体插件。它包含工程 UI、工程预设、SolidWorks 桥接工具和工程技能。DSH 提示重启或重新加载时按提示操作,首次加载会弹出已有的“如何使用”手册,之后可从工程模式卡片重新打开。
|
|
4
|
+
|
|
5
|
+
本机仍需安装 SolidWorks 和带 pywin32 的 Python。首次使用在“设置 → 工程模式”确认程序路径。读图时,插件会引导 Flash 核对视图、尺寸落点和内部结构;信息不足时,可以集中请求指定方向、剖面或文字尺寸。
|
|
6
|
+
|
|
7
|
+
只建几何时可以不指定材料。指定材料时,插件会核对零件读回的牌号。赋材失败会说明原因并等待处理。质量或强度交付仍需要材料证据。
|
|
8
|
+
|
|
9
|
+
本分支让 DeepSeek V4.1 Flash 在工程模式下读取图纸,调用 SOLIDWORKS 建模。PDF 和图片按页查看。DXF 可读原图元和尺寸标注。DWG 先转为 DXF,转换结果无法解析时请从原 CAD 导出标准 DXF 或 PDF。模型会集中询问影响建模的缺失尺寸。[插件调用方法和参数](engineering/skills/mode-selection/SKILL.md#图纸--整件零件deepseek-v41-flash)
|
|
10
|
+
|
|
11
|
+
风管命令创建两端开口、同轴平行的圆转椭圆放样曲面。续改时,在原草图上调整椭圆出口宽度,并复核入口直径、出口高度和风管长度。如果一个零件包含多个配置,命令会在修改草图前停止。这个命令用于零厚度几何,不提供材料或强度结论。其他零件继续使用原有草图、拉伸和切除工具。[放样参考实现(MIT)](https://github.com/qdaia/Auto-SolidWorks/blob/1bf68f425a1b541f597beaa1842cf2bc1bb9feb8/src/CadModeling.Executor.SolidWorks/NativeFeatures.cs#L133)
|
|
12
|
+
|
|
13
|
+
图纸工具需要 `Pillow ezdxf matplotlib`。PDF 需要 Poppler,DWG 需要 LibreDWG 的 `dwg2dxf`。建模还需 Windows 桌面版 SOLIDWORKS、零件模板及同一 Python 环境里的 `pywin32`。模型选 `deepseek-flash`。[DeepSeek 视觉输入说明](https://api-docs.deepseek.com/guides/vision/)
|
|
14
|
+
|
|
15
|
+
**DSH 0.2.2-rc.1 已验证**:[官方 RC1](https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.2-rc.1) 的桌面版可以新装工程插件,也能从已有配置升级。Web 端可以选择工程模式并新建会话。模型接替后仍可手动选回 Flash。桌面安装方法见[下方](#windows-桌面安装)。
|
|
16
|
+
|
|
17
|
+
**读图实测边界**:RC1 能接收 50 MiB 的单图,但 Flash 请求可能再次缩图。实测一张宽 9000 像素的图最终只发出 4096 像素宽;小图的发送字节与原图一致。上述请求发到本地模拟服务,没有调用线上 Flash。本机也没有可连接的 SOLIDWORKS,未实测建成、保存和重开风管。
|
|
18
|
+
|
|
19
|
+
此前在 0.2.1-rc.5 上也验证了插件加载和图像传输。LibreDWG 官方样图及九张随包机械图都生成了预览。后九张的转换结果没有原生尺寸标注;带标注的独立 DXF 样本另行核对了显示值和覆盖文字。
|
|
20
|
+
|
|
21
|
+
Windows 上若 `pwsh` 在执行第一条命令前报告 `grantWrite ... Win32 5`,请把 Harness 当前任务目录设在本人有完全控制权的位置。本机保留 D 盘的 Python 和插件,在普通用户临时目录下新建任务文件夹,用标准工作区权限跑通了读图和桥接调用。命令能写入该任务目录,向目录外写入会被拒绝。
|
|
22
|
+
|
|
23
|
+
<img width="1710" height="1189" alt="四工位自动化精密加工转台 — 交付完成" src="assets/screenshots/delivery-4station-turntable.png" />
|
|
24
|
+
|
|
25
|
+
> **面向 CAD / SolidWorks 机械设计的 DeepSeek Harness Agent 预设。**
|
|
26
|
+
> 以「完成工图」为唯一目标:需求访谈 → 三维建模 → 有限元校核 → 出图交付,
|
|
27
|
+
> 每一道关键闸门都写在 Python 代码里 —— 不通过,流程走不下去。
|
|
28
|
+
|
|
29
|
+
📦 **长流程产物和日志**:[https://share.feijipan.com/s/tryFb4AU](https://share.feijipan.com/s/tryFb4AU)
|
|
30
|
+
|
|
31
|
+
**一句话**:它不是一个"帮你写建模脚本的助手"。
|
|
32
|
+
它是一个**会自己判断能不能交付**的机械设计工程师。
|
|
33
|
+
|
|
34
|
+
| 项目 | 值 |
|
|
35
|
+
|------|-----|
|
|
36
|
+
| 目标平台 | DeepSeek Harness **0.2.x**(Electron 桌面版 / `dsh web`) |
|
|
37
|
+
| 预设 ID | `engineering` · 显示名「工程模式」· `order: 4` |
|
|
38
|
+
| 一体插件 | `dsh-engineering-ui` **v1.5.0** |
|
|
39
|
+
| 技能 | **7** 个 |
|
|
40
|
+
| 门禁 / 桥接脚本 | **12** 个核心脚本 + **14** 个物理模块 |
|
|
41
|
+
| 回归测试 | **30** 个 Python + **12** 个插件测试 |
|
|
42
|
+
| 许可 | MIT |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 🎬 30 秒看完它怎么干活
|
|
47
|
+
|
|
48
|
+
<p align="center">
|
|
49
|
+
<img src="assets/gifs/01-overview.gif" alt="工程模式实录:从一句需求到 SolidWorks 建模" width="900">
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
> 真实会话录像,**2 倍速**播放(原片约 60 秒)。一句「帮我制造一个机械工厂用的机械臂」进去,
|
|
53
|
+
> 出来的是:需求访谈 → 门禁判定 → 拆成多个建模小屋 → 并行驱动 SolidWorks → 汇合总装。
|
|
54
|
+
> 后面每一节,就是这段录像里的一环。
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 这是什么
|
|
59
|
+
|
|
60
|
+
DSH 的插件分三个平面,**放错位置会互相连坐**:
|
|
61
|
+
|
|
62
|
+
| 平面 | 位置 | 内容 | 生效方式 |
|
|
63
|
+
|------|------|------|----------|
|
|
64
|
+
| **宿主层**(进程级) | `profiles/<profile>/cordis.patch.yml` | 权限预设表、全局服务 | 必须重启 DSH |
|
|
65
|
+
| **preset 层**(会话子作用域) | 插件 bundle 里的 `preset-engineering.patch.yml` | 人设、工具、技能 | 热生效 |
|
|
66
|
+
| **profile bundle** | `profiles/<profile>/package.json` 的 `dependencies` + `dsh.profile.bundles` | UI 插件(客户端半) | 必须重启 DSH |
|
|
67
|
+
|
|
68
|
+
> ⛔ **绝对不要把 `- id: permission` 写进 preset。**
|
|
69
|
+
> `@deepseek-ai/dsh-permission-presets` 是宿主层进程级服务,preset 里再声明一次 = 重复注册同名服务,
|
|
70
|
+
> loader 直接拒绝,后果是**新建会话 / 切预设 / 选模型三件事一起坏**。
|
|
71
|
+
|
|
72
|
+
> 💡 DSH 0.2.x **不再读取** `.agent-presets` 目录。
|
|
73
|
+
> 仓库里的 `engineering/agent.cordis.yml` 只是历史对照,运行时真正加载的是
|
|
74
|
+
> 插件 bundle 声明的那份 `preset-engineering.patch.yml`。
|
|
75
|
+
|
|
76
|
+
### 它能做什么
|
|
77
|
+
|
|
78
|
+
| 能力 | 实现 |
|
|
79
|
+
|------|------|
|
|
80
|
+
| 真的驱动 SolidWorks 建模 | Python `win32com`,SW 2018 ~ 2025,单位 mm |
|
|
81
|
+
| 自己算有限元 | 纯 Python + numpy(2D CST / 3D CTE),可选 Gmsh / CalculiX / Code_Aster / SW Simulation |
|
|
82
|
+
| 疲劳与寿命校核 | Basquin S-N + Marin 修正 + Miner 累积损伤,默认 30 年设计寿命 |
|
|
83
|
+
| 出工程图 | 三视图 + 等轴测 → `.SLDDRW` / `.DWG` / `.DXF` / `.PDF`,GB/T 排版规范 |
|
|
84
|
+
| 图纸几何校验 | CADX 七项检查(图层 / 图幅 / 线型 / 重叠 / 尺寸链 …) |
|
|
85
|
+
| 多零件协作 | 拆分「房间」,子代理串行或并行建模,SW 进程级 FIFO 锁 |
|
|
86
|
+
| 判断能不能交付 | 材料 / 物理 / 领域 **三大防线** + 看图证据 + 台账一致性 |
|
|
87
|
+
|
|
88
|
+
### 三种任务类型(AI 自判,不打扰你)
|
|
89
|
+
|
|
90
|
+
| 模式 | 场景 | 执行方式 |
|
|
91
|
+
|------|------|----------|
|
|
92
|
+
| **模式 1** | 单个零件、几何简单 | 单线程直接建模出图 |
|
|
93
|
+
| **模式 2** | 多零件 / 机构 / 传动系统 | 门禁流水线 + 多子代理「多屋」协作 |
|
|
94
|
+
| **模式 3** | 用户发来图片 / 截图 | 单线程识图、提尺寸、重建、出图 |
|
|
95
|
+
|
|
96
|
+
三种模式共用同一套 SW / CAD / 物理工具链,区别只在**要不要走门禁、要不要开子代理**。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 🧭 并行策略与搭建方式
|
|
101
|
+
|
|
102
|
+
<p align="center">
|
|
103
|
+
<img src="assets/gifs/02-strategy.gif" alt="门禁第 1 步:并行策略 D/E 与搭建方式 A/B/C" width="860">
|
|
104
|
+
</p>
|
|
105
|
+
|
|
106
|
+
> 门禁启动后的**第一件事**不是让 AI 直接开画,而是先问你两个**互相独立**的问题。
|
|
107
|
+
> 这两问写死在 `tools/choice_contract.py` 里,题面和选项由代码给出,AI 不能改写。
|
|
108
|
+
|
|
109
|
+
### ① 并行策略:多屋是排队还是并行
|
|
110
|
+
|
|
111
|
+
| 选项 | 含义 | 适合 |
|
|
112
|
+
|------|------|------|
|
|
113
|
+
| **D** | 部分小屋并行,按波次分批启动 | 零件多、彼此独立、想快 |
|
|
114
|
+
| **E** | 单小屋串联,一次一个房间 | 零件之间有强耦合、想稳 |
|
|
115
|
+
|
|
116
|
+
### ② 搭建方式:这件事你自己能做主吗
|
|
117
|
+
|
|
118
|
+
| 选项 | 含义 | 交互强度 |
|
|
119
|
+
|------|------|----------|
|
|
120
|
+
| **A** | 完全自主搭建,AI 自主决策关键尺寸与材料 | 几乎不打扰你 |
|
|
121
|
+
| **B** | 部分自主,关键节点询问 | 中等 |
|
|
122
|
+
| **C** | 步步确认,**每个零件**建模前都出参数表给你确认 | 最严,全程把关 |
|
|
123
|
+
|
|
124
|
+
C 模式是**代码级强制**的:每件零件必须单独提问、单独得到答复,
|
|
125
|
+
由主对话执行 `mode_gate.py confirm-part <房间> <零件>` 才能写入授权令牌。
|
|
126
|
+
沿用上一件零件的确认会被拒绝,并记进 `violations.json`。
|
|
127
|
+
|
|
128
|
+
### 选定之后
|
|
129
|
+
|
|
130
|
+
```powershell
|
|
131
|
+
python "<根>\tools\workflow_gate.py" select C,E
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
写法很宽松,以下**全部等价**:`select C,E` / `select C E` / `select "C, E"` /
|
|
135
|
+
`select c e` / `select --choice C --parallel E`。
|
|
136
|
+
|
|
137
|
+
`select` 会把结论**当场写进** `workflow_state.json`,并与 `mode_state.json` 自动对齐 ——
|
|
138
|
+
不会出现两个命令读到相反结论的情况。
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## ☑️ 需求是怎么问出来的
|
|
143
|
+
|
|
144
|
+
> 工程模式的第一条纪律:**不猜参数**。
|
|
145
|
+
> 材料、公差、配合类型、载荷来源,不确定就必须问你 —— 但也不是一股脑把几十道题全砸过来。
|
|
146
|
+
|
|
147
|
+
### 先定「问多细」
|
|
148
|
+
|
|
149
|
+
门禁第 2 步只问一个问题:**本次任务要不要严格把关参数?**
|
|
150
|
+
|
|
151
|
+
| 你的回答 | 题数区间 | 说明 |
|
|
152
|
+
|----------|----------|------|
|
|
153
|
+
| **强需求**(严格校核) | **10 ~ 50** 题 | 载荷、尺寸、公差、材料都要有设计依据 |
|
|
154
|
+
| **不强 / 精简** | **5 ~ 10** 题 | 先出大致结构,细节按工程经验定 |
|
|
155
|
+
|
|
156
|
+
区间由 `mode2_flow.validate_question_budget()` 强制:超上限直接拒绝,
|
|
157
|
+
收尾时未达下限同样拒绝交付 —— 既不许敷衍,也不许审问到死。
|
|
158
|
+
|
|
159
|
+
### 再决定「什么时候问哪一题」
|
|
160
|
+
|
|
161
|
+
<p align="center">
|
|
162
|
+
<img src="assets/gifs/03-requirements.gif" alt="按需提问:分析到缺口时才提问,而不是开局把题全抛出来" width="860">
|
|
163
|
+
</p>
|
|
164
|
+
|
|
165
|
+
> 旧做法是开局把候选题目全部抛出,用户答到手软。
|
|
166
|
+
> 现在改成**按需提问**:AI 先沿十阶段往下推,推到某个阶段发现缺信息,才问那一题,并写明理由。
|
|
167
|
+
|
|
168
|
+
> 🆕 十阶段**不再由主对话自己跑**:它由一个真实子代理「总计子代理」推进
|
|
169
|
+
> (开工先 `analyst-bind` 绑定自己的 sessionId),主对话只负责编排与建小屋。
|
|
170
|
+
> 主对话若自己调 `begin-stage` 会被 `ANALYST_ACTOR_REQUIRED` 拒绝。
|
|
171
|
+
|
|
172
|
+
十阶段设计流水线(顺序即契约,跳阶段会被拒):
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
TaskUnderstanding 任务理解 结构化 TaskSpec:目标 / 环境 / 载荷 / 约束 / 未知量
|
|
176
|
+
FunctionalDecomposition 功能分解 FunctionTree:子功能 + 输入输出 + 依赖
|
|
177
|
+
PhysicsReasoning 物理推导 运动 / 力 / 转矩 / 能量 / 自由度 + 假定
|
|
178
|
+
PrincipleSynthesis 工作原理探索 多个候选原理 + 淘汰理由
|
|
179
|
+
MechanismSynthesis 机构综合 MechanismGraph:构件 + 连接 + 自由度
|
|
180
|
+
RecursivePartReasoning 递归零件推导 PartRequirementGraph:每个零件为何存在
|
|
181
|
+
PartSynthesis 零件设计与选型 标准件 / 自定义件 + 几何与接口定义
|
|
182
|
+
EngineeringValidation 工程验证 PASS / FAIL / UNKNOWN + 证据
|
|
183
|
+
DesignIteration 自主迭代 回退位置 + 版本 + 未解决问题
|
|
184
|
+
ExplainableDesignOutput 可解释输出 完整设计报告 + 可追溯性
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
提问必须挂在已经推进到的阶段上:
|
|
188
|
+
|
|
189
|
+
```powershell
|
|
190
|
+
# 1) 先推进阶段(必须按序)
|
|
191
|
+
python "<根>\tools\workflow_gate.py" mode2 begin-stage TaskUnderstanding
|
|
192
|
+
# 2) 真的缺信息了,才问 —— 且必须写明理由
|
|
193
|
+
python "<根>\tools\workflow_gate.py" mode2 ask "使用场合是什么" --stage TaskUnderstanding --reason "决定材料与防护等级"
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
阶段没 `begin-stage` 就提问 → 拒绝;无理由提问 → 拒绝。
|
|
197
|
+
这就是「不许开局把题全抛出去」的机器判据。
|
|
198
|
+
|
|
199
|
+
回答完还要**落盘**(`answer-question`)—— 题目一旦有答复,挂在它上面的阶段产物会立刻标 `stale`,
|
|
200
|
+
必须用**新的产物**重做那一段才能继续,防止下游拿着过期参数去建模。
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 📏 载荷只有一个来源
|
|
205
|
+
|
|
206
|
+
曾经踩过一个很典型的坑:门禁按 **1000 N** 估算、physics 按 **100 N** 校核 ——
|
|
207
|
+
两套数值,报告当然对不上。
|
|
208
|
+
|
|
209
|
+
现在载荷只有**一条通路**:
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
门禁问答 ──落盘──> tools/load_cases/gate_load_case.json ──读取──> 有限元 / 疲劳
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
| 规则 | 说明 |
|
|
216
|
+
|------|------|
|
|
217
|
+
| 优先读用户写的数值 | 「100N」「10kg」「0.1kN」会被直接识别为额定载荷 |
|
|
218
|
+
| 冲击只是系数 | 出现冲击 / 动态关键词,只放大**动载系数**,不改额定值 |
|
|
219
|
+
| 落盘即真相 | 额定载荷 = `magnitude_n`,physics 严禁另写数值 |
|
|
220
|
+
| 估算必须复核 | 返回 `load_is_estimate=true` 时,AI 必须先向你确认才能继续 |
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## 👥 子代理:主对话只编排,分析交给「总计子代理」
|
|
225
|
+
|
|
226
|
+
<p align="center">
|
|
227
|
+
<img src="assets/gifs/04-subagents.gif" alt="子代理三栏工作区:建模小屋并行跑 SolidWorks,实时可见" width="720">
|
|
228
|
+
</p>
|
|
229
|
+
|
|
230
|
+
> 装配体不是一个大脚本能画完的。工程模式把它拆成若干**房间**,
|
|
231
|
+
> 每个房间一个子代理,房间之间靠 SW 进程锁排队 —— 而不是靠人盯着。
|
|
232
|
+
|
|
233
|
+
### 三层角色
|
|
234
|
+
|
|
235
|
+
| 角色 | 干什么 | 边界 |
|
|
236
|
+
|------|--------|------|
|
|
237
|
+
| **主对话(大屋)** | 问答、编排、建小屋、收尾 | 不自己跑十阶段;只能调根会话命令 |
|
|
238
|
+
| **总计子代理** | `analyst-bind` 后跑十阶段分析、按需提问、决定房间编制 | 只有它能写阶段与编制 |
|
|
239
|
+
| **建模小屋 + 总理子代理** | 各自建模;总理同波监工、收上报、校验相邻尺寸 | 只做本房间 |
|
|
240
|
+
|
|
241
|
+
房间数量**不再固定 3 个**:由总计子代理按分析结论登记(1 ~ 24 个),
|
|
242
|
+
每个房间必须写清 `parts`(负责哪些零件)与 `why`(为什么需要它)。
|
|
243
|
+
`set-subagent-plan --decided-by 总计子代理` 是硬要求,别人署名直接判越权。
|
|
244
|
+
|
|
245
|
+
### 波次
|
|
246
|
+
|
|
247
|
+
| 波次 | 房间 | 干什么 |
|
|
248
|
+
|------|------|--------|
|
|
249
|
+
| **第 1 波** | 建模小屋 1..N + 总理子代理 | 并行建模;总理与建模**同波启动**,长生命周期监工 |
|
|
250
|
+
| **第 2 波** | 总装与验证 | 只有第 1 波**全部** `room-end` 后才允许开始 |
|
|
251
|
+
| **第 3 波** | 工程图输出 | 总装完成后出三视图 / 剖视 / 标注 |
|
|
252
|
+
|
|
253
|
+
### SW 是单实例,所以有一个进程级 FIFO 锁
|
|
254
|
+
|
|
255
|
+
| 机制 | 行为 |
|
|
256
|
+
|------|------|
|
|
257
|
+
| 排队 | 谁先请求谁先用,队列保留;返回 `sw_busy` 就等 90 秒重试**同一条命令** |
|
|
258
|
+
| 公平轮转 | 有人排队时,单房间最多连续 3 条命令或独占 180 秒,超出强制让位(防饿死) |
|
|
259
|
+
| 心跳 | 子代理每 60 秒续一次,但**已降级为辅助证据** |
|
|
260
|
+
| 清场 | 每波开始前 `close-all`,确认没有残留的 `SLDWORKS.EXE` |
|
|
261
|
+
|
|
262
|
+
### 判活只认看板,不认心跳
|
|
263
|
+
|
|
264
|
+
```powershell
|
|
265
|
+
python "<根>\tools\mode_gate.py" room-board --json
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
`room-board` 给每个房间一个**一等状态**,外加 `safe_to_restart` 与 `next_action`:
|
|
269
|
+
|
|
270
|
+
| 状态 | 含义 | 能不能重启 |
|
|
271
|
+
|------|------|-----------|
|
|
272
|
+
| `starting` | 刚建,宽限期内 | 否 |
|
|
273
|
+
| `running` | 正常干活中 —— **不许说"没反应"** | 否 |
|
|
274
|
+
| `waiting_sw` | 在 SW 队列里正常等锁,**不是死了** | **否(严禁判死)** |
|
|
275
|
+
| `idle` | 平台侧活着,当前没有可观察动作 | 否 |
|
|
276
|
+
| `unbound` | 平台侧活着但忘了 `subagent-assign` | 否,**补绑定即可,禁止 reset** |
|
|
277
|
+
| `done` / `failed` | 已收工 / 已失败 | 按需 `recover` |
|
|
278
|
+
| `dead` | 真的没了 | **是** —— 唯一允许 `recover/restart` 的状态 |
|
|
279
|
+
|
|
280
|
+
旧实现的六态分类会把排队等锁的屋子误判成死,于是主对话重启一个其实活着的屋,
|
|
281
|
+
两个子代理抢同一份 SW 文件。现在 `waiting_sw` 是一等状态,看板直接给 `safe_to_restart=false`。
|
|
282
|
+
|
|
283
|
+
### 两条禁令 + 一个例外
|
|
284
|
+
|
|
285
|
+
1. **小屋不许越权**:建模小屋不能调 `mode_gate` / `workflow_gate` / `list_agents` /
|
|
286
|
+
`subagent_fork`,只做本房间的建模与验证。
|
|
287
|
+
**唯一例外是总计子代理** —— 它只能用 `mode2_flow.py` 的阶段 / 提问 / 编制命令,
|
|
288
|
+
以及 `ask_user.py` 提问桥。
|
|
289
|
+
2. **根会话命令不外借**:`init` / `provide_context` / `select` / `confirm-assembly` /
|
|
290
|
+
`recover` / `restart` / `reset` 只许主对话调用,子代理调一律返回 `ROOT_SESSION_REQUIRED`。
|
|
291
|
+
|
|
292
|
+
这两条都在代码里按 `sessionId` 校验,不是提示词约定 —— 越权不是"不应该",是**调不通**。
|
|
293
|
+
|
|
294
|
+
### 小屋自己不会提问,所以有桥
|
|
295
|
+
|
|
296
|
+
DSH 不允许子代理直接向用户提问(`userQuestions.ask()` 会校验 `agents.roots()`,
|
|
297
|
+
子代理必抛 `DELEGATED_CALLER`)。`ask_user.py` 把问题登记到本小屋 → 卡片出现在右侧面板 →
|
|
298
|
+
原地阻塞轮询直到你作答 → 答案以 **tool_result** 回到提问方。全程不结束回合。
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 🛡️ 三大防线:本项目的核心
|
|
303
|
+
|
|
304
|
+
这是它和「普通 CAD 助手」最大的区别:**质量校验不是建议,是硬门禁**。
|
|
305
|
+
|
|
306
|
+
| # | 防线 | 凭据 | 判不通过的依据 |
|
|
307
|
+
|---|------|------|----------------|
|
|
308
|
+
| ① | **材料** | 每个 `.sldprt` 旁的 `<零件>.SLDPRT.material.json` | 缺凭据 / 密度 = 1000(水)/ 跨标准静默替代 |
|
|
309
|
+
| ② | **物理** | `reports/<房间>.physics.json` | `overall == FAIL`,或静力过了但**寿命不够** |
|
|
310
|
+
| ③ | **领域** | `reports/<房间>.domain.json` | 存在 CRITICAL 违规(按 GB/T 规则库判) |
|
|
311
|
+
|
|
312
|
+
### 四个强制点(走到就得过)
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
sw_bridge.py run → ① 材料
|
|
316
|
+
mode_gate.py room-end <房间> → ①②③(该房间)+ 看图证据
|
|
317
|
+
workflow_gate.py confirm-assembly → ①②③(全部建模房间)
|
|
318
|
+
workflow_gate.py select (收尾) → ①②③(全任务)
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### 凭据为什么伪造不了
|
|
322
|
+
|
|
323
|
+
凭据由**宿主进程签名**:HMAC-SHA256,密钥**只存在宿主内存里,绝不落盘**。
|
|
324
|
+
Python 侧不持有密钥,签名与验签都得请求宿主;
|
|
325
|
+
宿主不可用时不是"放行",而是 **fail-closed** —— 无法验签即视为未通过。
|
|
326
|
+
|
|
327
|
+
所以哪怕 AI 能读写工程模式目录里的所有文件,也写不出一份能验签的凭据。
|
|
328
|
+
宿主自己会**读磁盘上的真实报告**再签,调用方没法让它为"不存在的运行"背书。
|
|
329
|
+
|
|
330
|
+
> 签名有效期默认 **24 小时**(`DSH_DEFENSE_SIG_TTL_MS` 可覆盖)。
|
|
331
|
+
> 早先设成 10 分钟时,只要一个房间里零件保存跨度超过 10 分钟,
|
|
332
|
+
> `room-end` 就必然失败 —— 多零件装配等于永远过不了门。
|
|
333
|
+
|
|
334
|
+
### 还有一道「你得亲眼看过」
|
|
335
|
+
|
|
336
|
+
建模房间下线前,本房间产出过的每个零件都必须留下**经核实的看图证据**:
|
|
337
|
+
截图真实存在、非 0 字节、闭环判定 PASS。缺任何一件 → `VISUAL_EVIDENCE_REQUIRED`,拒绝下线。
|
|
338
|
+
|
|
339
|
+
### 唯一合法绕行(且必定留痕)
|
|
340
|
+
|
|
341
|
+
```powershell
|
|
342
|
+
python mode_gate.py room-end "<房间>" --force # 显式强制
|
|
343
|
+
$env:DSH_DEFENSE_BYPASS = 1 # 环境变量
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
两条路都会写进 `reports/defense_bypass.json` —— 绝不静默放行。
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## 🔬 物理在环(FEA + 疲劳)
|
|
351
|
+
|
|
352
|
+
建模不是终点。每个房间都要出一份物理校核报告,`FAIL` 或寿命不足就拒绝下线。
|
|
353
|
+
|
|
354
|
+
### 求解器的降级链
|
|
355
|
+
|
|
356
|
+
按本机装了什么自动降级,没有外部 FEA 软件也照样算:
|
|
357
|
+
|
|
358
|
+
| 级别 | 后端 | 依赖 |
|
|
359
|
+
|------|------|------|
|
|
360
|
+
| L0 | 解析解(梁理论) | 无 |
|
|
361
|
+
| L1 | 纯 Python FEA(numpy CST 三角形 / CTE 四面体) | numpy |
|
|
362
|
+
| L2 | Gmsh + CalculiX | 可选安装 |
|
|
363
|
+
| L3 | Gmsh + Code_Aster | 可选安装 |
|
|
364
|
+
| L4 | Gmsh + Elmer | 可选安装 |
|
|
365
|
+
| L5 | SolidWorks Simulation API | SW Premium 许可 |
|
|
366
|
+
|
|
367
|
+
### 疲劳是必过项,不是加分项
|
|
368
|
+
|
|
369
|
+
- 方法:**Basquin S-N** + **Marin 修正**(ka/kb/kc/kd/ke)+ Goodman / Soderberg / Gerber 平均应力修正 + **Miner 线性累积损伤**
|
|
370
|
+
- 每次 `solve_fea` 之后自动追加,结论并入 `gates` 与 `overall`
|
|
371
|
+
- 静力过了但寿命不够 → 直接 `FAIL`,不再误判为 PASS
|
|
372
|
+
- 默认按 **30 年**设计寿命;铝合金按无真实疲劳极限处理(5 × 10⁸ 次条件极限)
|
|
373
|
+
|
|
374
|
+
### 一个闸口只归一层管
|
|
375
|
+
|
|
376
|
+
同一个闸口 ID 曾出现几何层与 FEA 层给出相反结论的情况。现在 `physics/simulation_report.py` 用
|
|
377
|
+
`GATE_OWNER` 给每个闸口声明**唯一归属层**,聚合时只采信归属层:
|
|
378
|
+
|
|
379
|
+
| 闸口 | 归属 |
|
|
380
|
+
|------|------|
|
|
381
|
+
| `DESIGN_SPACE` / `CONNECTIVITY` / `WALL_THICKNESS` | 几何层 |
|
|
382
|
+
| `SAFETY_FACTOR` / `MAX_DISPLACEMENT` / `FATIGUE` / `MESH_QUALITY` | FEA 层 |
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## 📐 从模型到图纸
|
|
387
|
+
|
|
388
|
+
建模阶段只做三件事:草图完全定义 → 特征建模 → 圆角倒角孔。
|
|
389
|
+
然后是一条固定链路:`run` → `drawing` → `dwg` → `show`,出图后**截图验收**。
|
|
390
|
+
|
|
391
|
+
```powershell
|
|
392
|
+
python "<根>\tools\sw_bridge.py" run <建模脚本.py> # 画零件
|
|
393
|
+
python "<根>\tools\sw_bridge.py" drawing <零件> # 出 .slddrw
|
|
394
|
+
python "<根>\tools\sw_bridge.py" dwg <零件> # 导 DWG(AutoCAD 可编辑)
|
|
395
|
+
python "<根>\tools\sw_bridge.py" show # 截图看一眼
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
工程图含**三视图(前 / 俯 / 右)+ 等轴测**,导出 `.SLDDRW` / `.DWG` / `.DXF` / `.PDF`。
|
|
399
|
+
|
|
400
|
+
### 排版是硬规则,出界即不合格
|
|
401
|
+
|
|
402
|
+
画布归一 1.0 × 1.0,原点左下,各纸型同比例。
|
|
403
|
+
|
|
404
|
+
| 规则 | 值 |
|
|
405
|
+
|------|-----|
|
|
406
|
+
| 安全区 | `(0.05, 0.05)` ~ `(0.95, 0.95)`,唯一合法区域 |
|
|
407
|
+
| 标题栏禁区 | `(0.80, 0.90)` ~ `(1.00, 1.00)` |
|
|
408
|
+
| 主视 / 俯视 | `(0.30, 0.72)` / `(0.30, 0.28)` |
|
|
409
|
+
| 右视 / 等轴测 | `(0.75, 0.72)` / `(0.75, 0.28)` |
|
|
410
|
+
| 投影关系 | 主俯同 x(长对正),主右同 y(高平齐) |
|
|
411
|
+
| 视图间距 | 任意两视图 ≥ 35 mm(约 0.04) |
|
|
412
|
+
|
|
413
|
+
宁可升纸型,也不许越界。轴类零件画中心线(点划线),特征交界画分界线,禁边线重合。
|
|
414
|
+
|
|
415
|
+
### 两个不商量的小事
|
|
416
|
+
|
|
417
|
+
1. **命名必须中文**:`DSH_` + 中文名,例如 `DSH_关节轴.sldprt`。
|
|
418
|
+
2. **默认材料 Q235**:`new_part()` 就赋材,杜绝「密度恒为 1000(水)」导致的整条校核失真。
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## 🖥️ 界面:三栏工作区
|
|
423
|
+
|
|
424
|
+
UI 插件 `dsh-engineering-ui` 只在工程模式下生效,可在设置里关掉。
|
|
425
|
+
|
|
426
|
+
| 区域 | 内容 |
|
|
427
|
+
|------|------|
|
|
428
|
+
| **主对话(约 3/4)** | DSH 原生会话区,检测到子代理时自动收窄 |
|
|
429
|
+
| **中间竖排频道** | 每个子代理一个按钮,绿点 = 运行中,点击切换右侧屏幕 |
|
|
430
|
+
| **右侧工作区(约 1/4)** | 所选子代理的实时输出、工具调用与参数、运行状态、可直接作答的提问卡片 |
|
|
431
|
+
|
|
432
|
+
没有子代理时三栏全部隐藏,回到全宽聊天。
|
|
433
|
+
|
|
434
|
+
### 设置页「工程模式」分区
|
|
435
|
+
|
|
436
|
+
- **工程环境检查**:换电脑后一键扫 Python / pywin32 / numpy / ezdxf / shapely /
|
|
437
|
+
SolidWorks / AutoCAD / 交付目录 / 跨机残留设置,逐项给绿黄红和一行修复建议;
|
|
438
|
+
- **生成修复提示词**:用本机实测结果现场生成一段提示词,直接发给新对话让它自己查、自己装;
|
|
439
|
+
- **连接区**:SW / CAD 连接探测与启动,状态落 `connection_state.json`,AI 与设置页共读同一份;
|
|
440
|
+
- **显示页开关**:可把右侧子代理面板交回 DSH 官方。
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## 📦 安装
|
|
445
|
+
|
|
446
|
+
### 环境要求
|
|
447
|
+
|
|
448
|
+
| 项 | 要求 |
|
|
449
|
+
|----|------|
|
|
450
|
+
| 系统 | Windows(SolidWorks / AutoCAD 自动化依赖 `win32com`) |
|
|
451
|
+
| DSH | **0.2.x**(Electron 桌面版或 `dsh web`) |
|
|
452
|
+
| Python | **3.8+ 64 位**,需 `pywin32`;物理校核另需 `numpy` |
|
|
453
|
+
| 可选 | `ezdxf` + `shapely`(DXF 几何校验)、`Pillow`(看图)、Gmsh / CalculiX(高阶 FEA) |
|
|
454
|
+
| 软件 | SolidWorks 2018 ~ 2025;AutoCAD(仅出 DWG 时需要) |
|
|
455
|
+
|
|
456
|
+
### Windows 桌面安装
|
|
457
|
+
|
|
458
|
+
先启动过一次 DSH 桌面版,再解压发布包。在有 `install.ps1` 的目录中运行:
|
|
459
|
+
|
|
460
|
+
```powershell
|
|
461
|
+
powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1 -Profile desktop
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
装完完全退出并重开 DSH,在新会话里选「工程模式」,模型选 `deepseek-flash`。只使用 `dsh web` 时把 `desktop` 换成 `web`。可加 `-DryRun` 先查看改动。
|
|
465
|
+
|
|
466
|
+
安装器在指定配置中登记插件,并同步共用的技能和工程脚本。已有设置、材料和建模进度会保留。旧安装若需清理已废弃的 `sw-single-line` 权限,使用同包的 `install-0.2.0.ps1`。卸载时保留后来改过的权限和已有备份;如需恢复安装前的整份配置,请手动选择对应备份。
|
|
467
|
+
|
|
468
|
+
### 改了代码之后
|
|
469
|
+
|
|
470
|
+
仓库里的 `engineering/` 是**源码**,DSH 真正加载的是安装副本。改完要同步:
|
|
471
|
+
|
|
472
|
+
```powershell
|
|
473
|
+
.\sync-to-dsh.ps1 -DryRun # 先看要动哪些文件
|
|
474
|
+
.\sync-to-dsh.ps1 # 实际同步(逐个备份 .bak-sync-<时间戳>)
|
|
475
|
+
python engineering\tools\verify_sync.py # 逐文件 SHA-256 比对,确认真的同步了
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
> 运行时状态文件(`mode_state.json` / `workflow_state.json` / `sw_state.json` /
|
|
479
|
+
> `connection_state.json` / `settings.json`)是**会话现场数据**,同步时会被跳过 ——
|
|
480
|
+
> 不要手动覆盖,否则流程会误判。
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
## ⌨️ 命令速查
|
|
485
|
+
|
|
486
|
+
> 门禁的入口全是**命令行脚本**,不是 DSH 工具。
|
|
487
|
+
> 历史文档里出现过的 `workflow-gate-init` 这类"工具名"在本环境并不存在,照抄会失败。
|
|
488
|
+
|
|
489
|
+
```powershell
|
|
490
|
+
$T = "<工程模式根目录>\tools" # 含 mode_gate.py 与 workflow_gate.py 的那个目录
|
|
491
|
+
python "$T\_root.py" # 不确定根目录?先跑这个自检
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
### `workflow_gate.py` — 门禁大脑
|
|
495
|
+
|
|
496
|
+
| 子命令 | 用途 |
|
|
497
|
+
|--------|------|
|
|
498
|
+
| `init "<任务>"` | 初始化任务,返回第 1 步(模式确认 + 并行策略 D/E + 搭建方式 A/B/C) |
|
|
499
|
+
| `provide_context "<回答>"` | 推进状态机,**需调用 3 次**(模式确认 → 需求强度 → 汇总估算) |
|
|
500
|
+
| `select C,E` | 锁定搭建方式与并行策略 |
|
|
501
|
+
| `confirm-assembly "<清单>"` | 第 1 波完成后确认总装 |
|
|
502
|
+
| `check-part` / `verify-ownership` | 零件归属校验 / 总装前去重核对 |
|
|
503
|
+
| `status` / `gate-summary` / `check` | 状态 / 总览 / 是否允许建模 |
|
|
504
|
+
| `recover` / `restart <房间>` / `reset` | 恢复卡住 / 重做房间 / 清空重来 |
|
|
505
|
+
| `mode2 <子命令>` | 十阶段契约:`begin-stage` / `ask` / `prime-report` / `prime-verify` … |
|
|
506
|
+
| `stage-status` / `pre-delivery` | 阶段进度 / 交付前总闸 |
|
|
507
|
+
|
|
508
|
+
> 除 `status` / `gate-summary` 这类只读命令外,**只许根会话调用**;
|
|
509
|
+
> 子代理调 `init` / `select` / `reset` 会拿到 `ROOT_SESSION_REQUIRED`。
|
|
510
|
+
|
|
511
|
+
### `mode_gate.py` — 房间状态机 + SW 锁
|
|
512
|
+
|
|
513
|
+
| 类别 | 子命令 |
|
|
514
|
+
|------|--------|
|
|
515
|
+
| **看板(权威)** | `room-board [--room X] [--json]` — 八态 + `safe_to_restart` + `next_action` |
|
|
516
|
+
| 房间 | `room-start` / `room-end` / `room-fail` / `room-status` / `room-report` / `room-report-read` |
|
|
517
|
+
| SW 锁 | `sw-request` / `sw-wait` / `sw-release` / `sw-status` / `sw-proc` / `lock-doctor` / `close-all` |
|
|
518
|
+
| 子代理 | `subagent-assign`(**每次 fork 后必做**) / `subagent-free` / `subagent-status` / `whoami` |
|
|
519
|
+
| 心跳 | `room-heartbeat`(辅助证据) / `room-heartbeat-check` |
|
|
520
|
+
| 授权 | `confirm-part <房间> <零件>`(C 模式) / `room-artifact` |
|
|
521
|
+
| 看护 | `sw-guard-start` / `sw-guard-stop` / `sw-guard-status`(CPU / 内存 > 85% 立刻关 SW) |
|
|
522
|
+
| 维护 | `doctor` / `rooms-reset` / `stale-artifacts` / `residue-check` / `platform-refresh` |
|
|
523
|
+
|
|
524
|
+
### `mode2_flow.py` — 十阶段 / 编制 / 总理
|
|
525
|
+
|
|
526
|
+
| 子命令 | 用途 |
|
|
527
|
+
|--------|------|
|
|
528
|
+
| `analyst-bind` / `analyst-status` | 总计子代理绑定自己的 sessionId / 查看是否已绑定 |
|
|
529
|
+
| `begin-stage` / `mark-stage-done` | 按序推进阶段 / 登记产物(只认总计子代理身份) |
|
|
530
|
+
| `ask` / `answer-question` / `refresh-stage` | 按需提问 / 落盘答复 / 重做过期阶段 |
|
|
531
|
+
| `set-subagent-plan --rooms-json ... --decided-by 总计子代理` | 登记本轮房间编制 |
|
|
532
|
+
| `prime-board` / `prime-report` / `check-consistency` | 监工看板 / 收上报 / 相邻尺寸一致性 |
|
|
533
|
+
| `prime-verify` / `export-docx` / `pre-delivery` | 统一核实 / 汇总 docx / 交付前总闸 |
|
|
534
|
+
|
|
535
|
+
### 其他脚本
|
|
536
|
+
|
|
537
|
+
| 脚本 | 用途 |
|
|
538
|
+
|------|------|
|
|
539
|
+
| `defense_gate.py check-room <房间>` / `check-task` | 三大防线自查 |
|
|
540
|
+
| `sw_bridge.py <命令>` | SW 桥接(`run` / `drawing` / `dwg` / `physics-*` / `conn-*` / `cad-*`) |
|
|
541
|
+
| `physics_bridge.py <子命令>` | 物理验证 CLI(`validate-case` / `optimize` / `fatigue` / `validate-domain`) |
|
|
542
|
+
| `visual_check.py gate --part <零件> --expect <json>` | 看图闭环校核 |
|
|
543
|
+
| `ask_user.py --room <房间> --child <id> ...` | 子代理阻塞式提问 |
|
|
544
|
+
| `part_registry.py` | 零件台账:相邻尺寸一致性 / SHA-256 防篡改 / 导出 docx |
|
|
545
|
+
| `settings.py report` / `env_check.py probe` | 本机设置 / 环境自检 |
|
|
546
|
+
|
|
547
|
+
---
|
|
548
|
+
|
|
549
|
+
## 🗂️ 目录结构
|
|
550
|
+
|
|
551
|
+
```
|
|
552
|
+
DSH-SW-and-CAD-main/
|
|
553
|
+
├── README.md # 本文件
|
|
554
|
+
├── assets/gifs/ # 四段实录动图
|
|
555
|
+
├── install-0.2.0.ps1 # DSH 0.2.x 安装(装进所有 profile)
|
|
556
|
+
├── install.ps1 # Windows 桌面和 Web 配置安装入口
|
|
557
|
+
├── sync-to-dsh.ps1 # 源码 -> 安装副本同步
|
|
558
|
+
├── patch-incompatible.ps1 # 第三方插件 peer range 修补
|
|
559
|
+
├── RUNNING_WORKFLOW.md # 源码级全链路追踪(从一条消息到一次 COM 调用)
|
|
560
|
+
├── engineering/ # ★ 预设本体
|
|
561
|
+
│ ├── preset.yml # 显示元数据
|
|
562
|
+
│ ├── agent.cordis.yml # 历史清单(运行时不加载,仅对照)
|
|
563
|
+
│ ├── README.md # 架构与门禁细节(更技术向)
|
|
564
|
+
│ ├── skills/ # 8 个技能
|
|
565
|
+
│ │ ├── mode-selection/ # 强制入口:模式选择 + 门禁流程
|
|
566
|
+
│ │ ├── assembly-orchestration/ # 多屋编排
|
|
567
|
+
│ │ ├── cad-workflow/ # AutoCAD 工作流
|
|
568
|
+
│ │ ├── sw-design/ # SW 设计 + GB/T 制图
|
|
569
|
+
│ │ ├── solidworks-bridge/ # SW 桥接
|
|
570
|
+
│ │ ├── sw-to-cad/ # SW -> CAD
|
|
571
|
+
│ │ ├── physics-in-loop/ # 物理在环
|
|
572
|
+
│ │ └── webots-simulation/ # Webots 仿真(可选,见 docs/webots-mcp)
|
|
573
|
+
│ ├── tools/ # ★ Python 工具链
|
|
574
|
+
│ │ ├── workflow_gate.py # 门禁大脑
|
|
575
|
+
│ │ ├── mode_gate.py # 房间状态机 + SW 锁 + room-board
|
|
576
|
+
│ │ ├── mode2_flow.py # 十阶段契约 / 编制 / 总理
|
|
577
|
+
│ │ ├── defense_gate.py # 三大防线
|
|
578
|
+
│ │ ├── sw_bridge.py # SW 桥接执行器
|
|
579
|
+
│ │ ├── swapi.py # 高层建模 API
|
|
580
|
+
│ │ ├── part_registry.py # 零件台账 + 一致性校验
|
|
581
|
+
│ │ ├── visual_check.py # 看图闭环
|
|
582
|
+
│ │ ├── webots_env.py # ★ Webots 仿真可用性自检(只读)
|
|
583
|
+
│ │ ├── webots_mcp/ # ★ Webots MCP server / 转换 / 证据(可选)
|
|
584
|
+
│ │ ├── physics/ # 物理子系统(FEA / 疲劳 / 规则库)
|
|
585
|
+
│ │ ├── physics/rules/ # GB/T 规则包
|
|
586
|
+
│ │ ├── load_cases/ # 载荷工况(gate_load_case.json)
|
|
587
|
+
│ │ ├── reports/ # 防线凭据 + 房间报告
|
|
588
|
+
│ │ └── test_regression_*.py # 31 个回归测试
|
|
589
|
+
│ └── plugins/dsh-engineering-ui/ # UI 插件
|
|
590
|
+
│ ├── lib/index.js # Host 半(HTTP 路由 / 提问桥接 / 防线签名)
|
|
591
|
+
│ ├── lib/client.js # 浏览器半(三栏工作区)
|
|
592
|
+
│ ├── lib/defense-sign.js # HMAC 凭据签名
|
|
593
|
+
│ ├── lib/job-wait-guard.js # ★ job_output 长等待守卫(防"卡死",见下)
|
|
594
|
+
│ ├── preset-engineering.patch.yml # ★ 运行时真正加载的人设
|
|
595
|
+
│ ├── lib/webots.js # ★ Webots 只读宿主门(归属校验 + 4 条路由)
|
|
596
|
+
│ └── test/ # 15 个插件测试
|
|
597
|
+
├── profiles/ # 宿主层 patch 模板
|
|
598
|
+
└── third-party-patched/ # 打过补丁的第三方插件
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
> 动手改之前先读 `engineering/README.md`:那里记着每个历史 bug 的**现场现象 / 根因 / 修复判据**,
|
|
602
|
+
> 很多看起来"多余"的代码,是为了防止某个已经踩过两次的坑复发。
|
|
603
|
+
|
|
604
|
+
---
|
|
605
|
+
|
|
606
|
+
## 🤖 Webots 仿真(可选,默认关闭)
|
|
607
|
+
|
|
608
|
+
> 接入的是官方交付补丁 `f04ac75a`(86 文件:`engineering/tools/webots_mcp/` 的 MCP server、
|
|
609
|
+
> 转换器、证据读取器 + 12 份契约文档 + 测试)。**它是外围承载,不是物理核心** ——
|
|
610
|
+
> 原生 SW 导出、关节推断、自动回写与真实物理判定仍未实现,状态里会明写
|
|
611
|
+
> `core_ready=false` / `CALIBRATION_REQUIRED`。
|
|
612
|
+
|
|
613
|
+
### 它挂在主流程的哪个位置
|
|
614
|
+
|
|
615
|
+
**不是第四种模式**。仿真发生在模型已经存在之后:
|
|
616
|
+
|
|
617
|
+
```
|
|
618
|
+
Mode 1/2/3 判定 → 门禁 → 建模 → 三大防线 → 出图
|
|
619
|
+
↘ (可选)Webots 仿真 → 报告/证据 → 只读回看
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
它**消费** `select` 建立的 task/room 身份,所以必须在 `select` 之后、`room-end` 之前跑;
|
|
623
|
+
房间收尾后没有合法身份,只读接口会返回 `CONTEXT_UNAVAILABLE`。
|
|
624
|
+
|
|
625
|
+
### 三个入口
|
|
626
|
+
|
|
627
|
+
| 入口 | 用法 |
|
|
628
|
+
|---|---|
|
|
629
|
+
| **自检(先跑这个)** | `python "<根>\tools\webots_env.py" --json` → 看 `sim_available` / `blocking` |
|
|
630
|
+
| **桥接命令** | `sw_bridge.py sim-status` / `sim-env` / `sim-list` / `sim-report`(**不连 SW、不取 SW 锁**) |
|
|
631
|
+
| **MCP 工具** | `mcp__webots__sim_status` / `sim_launch` / `sim_job` / `sim_report` / `sim_evidence` …(需 `DSH_WEBOTS_ENABLE=1`) |
|
|
632
|
+
|
|
633
|
+
宿主侧新开了 4 条**只读** GET 路由(`webots-context` / `-report` / `-evidence` / `-attribute`),
|
|
634
|
+
走的是和 conn-state 同一套 `guardRoute`(loopback + Origin 校验 + 限流)。
|
|
635
|
+
|
|
636
|
+
> ⚠️ 设置页「连接区」里那块「▶ Webots 仿真报告与证据(只读)」**已按用户要求移除**(2026-11-05)。
|
|
637
|
+
> 组件(`EngWebotsPanel` / `EngWebotsSnapshot` / `EngWebotsReport`)仍保留并导出,
|
|
638
|
+
> 供子代理工作区或后续版本复用;要接回设置页只需恢复一行 `h(EngWebotsPanel, {})`。
|
|
639
|
+
|
|
640
|
+
### 启用(缺一即视为未启用,不是"坏了")
|
|
641
|
+
|
|
642
|
+
```powershell
|
|
643
|
+
$env:DSH_WEBOTS_ENABLE = '1'
|
|
644
|
+
$env:DSH_WEBOTS_PYTHON = '<绝对路径>\python.exe' # 已装 webots_mcp/requirements.txt
|
|
645
|
+
$env:DSH_WEBOTS_INPUT_ROOT = '<已存在的只读输入根>'
|
|
646
|
+
$env:DSH_STATE_DIR = '<已存在的绝对 state 目录>'
|
|
647
|
+
$env:DSH_ENGINEERING_ROOT = '<工程模式根>\engineering'
|
|
648
|
+
$env:WEBOTS_HOME = 'D:\Webots'
|
|
649
|
+
# 可选:$env:DSH_WEBOTS_RUNTIME_CONFIG = '<绝对路径>\runtime.json'
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
依赖安装(一次性):
|
|
653
|
+
|
|
654
|
+
```powershell
|
|
655
|
+
python -m venv $env:USERPROFILE\.dsh\engineering-webots\venv
|
|
656
|
+
& $env:USERPROFILE\.dsh\engineering-webots\venv\Scripts\python.exe -m pip install -r engineering\tools\webots_mcp\requirements.txt
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
### 边界(**必须保留在报告里**)
|
|
660
|
+
|
|
661
|
+
| 能做 | 不能做 |
|
|
662
|
+
|---|---|
|
|
663
|
+
| 离线把零件捕获转成 URDF + PROTO(urdf2webots 2025.0.0) | 原生 SW→URDF 的坐标/惯量标定(A01) |
|
|
664
|
+
| 读已存报告与日志证据(字节分页 + SHA-256) | 自动关节推断(A02) |
|
|
665
|
+
| 归属校验 / 代际 / 操作幂等 | 自动根因回写 SW(A03/A04) |
|
|
666
|
+
| `sim_status` 等只读查询 | 真实物理 PASS 判定(恒 `physical_validation=not_run`) |
|
|
667
|
+
|
|
668
|
+
`fake` / `fixture` / `synthetic` / 静态校验 / 空接触 **都不等于物理 PASS**;
|
|
669
|
+
`OUTCOME_UNKNOWN` **禁止重发动作**。详见 [engineering/docs/webots-mcp/](engineering/docs/webots-mcp/)。
|
|
670
|
+
|
|
671
|
+
## 🩹 防"卡死":`job_output` 长等待守卫
|
|
672
|
+
|
|
673
|
+
> 2026-10-31 事故:`job_output { wait: true, timeout_ms: 270000 }` 静默阻塞数分钟,
|
|
674
|
+
> GUI 毫无反馈 → 用户以为 DSH 死机 → 强制退出 → 退出瞬间所有插件 fiber 失活 →
|
|
675
|
+
> `cannot get required service "jobs" in inactive context` → `turn/end{interrupted}`,整轮对话作废。
|
|
676
|
+
> 完整复盘见 [docs/DSH卡死事故分析_job_output阻塞.md](docs/DSH卡死事故分析_job_output阻塞.md)。
|
|
677
|
+
|
|
678
|
+
修复分两层,**两层都装才完整**:
|
|
679
|
+
|
|
680
|
+
| 层 | 位置 | 生效方式 |
|
|
681
|
+
|---|---|---|
|
|
682
|
+
| **宿主层** | `plugins/dsh-engineering-ui/lib/job-wait-guard.js`(经官方 `ctx.on('tools/execute')` 接线) | 装进 profile 后**重启 DSH** |
|
|
683
|
+
| **仓库层** | `preset-engineering.patch.yml` 人设 + 各 SKILL + `ask_user.py` | 热生效(同步到安装副本即可) |
|
|
684
|
+
|
|
685
|
+
宿主层做两件事:
|
|
686
|
+
|
|
687
|
+
1. **把长等待切成 ≤45s 的窗口**:到点就返回"仍在运行"(正常成功结果,不是失败)——
|
|
688
|
+
GUI 保持响应,用户随时能打断,模型也不会把整轮挂在等待上;
|
|
689
|
+
2. **把上下文失活异常降级**成 `JOB_CONTEXT_LOST` 工具错误(`isError=true` + 操作指引),
|
|
690
|
+
不再让框架异常冒到 turn 级把整轮打断。
|
|
691
|
+
|
|
692
|
+
安装 / 重装(**DSH 每次升级都会覆盖安装目录,升级后重跑一次即可**):
|
|
693
|
+
|
|
694
|
+
```powershell
|
|
695
|
+
.\install-job-wait-guard.ps1 -DryRun # 先看会动哪些文件
|
|
696
|
+
.\install-job-wait-guard.ps1 # 装进每个 profile(逐文件 .bak-guard-时间戳)
|
|
697
|
+
.\install-job-wait-guard.ps1 -Verify # 只核对
|
|
698
|
+
```
|
|
699
|
+
|
|
700
|
+
| 环境变量 | 默认 | 作用 |
|
|
701
|
+
|---|---|---|
|
|
702
|
+
| `DSH_ENG_JOB_WAIT_GUARD` | 开 | 设 `0` 关闭守卫 |
|
|
703
|
+
| `DSH_ENG_JOB_WAIT_MAX_MS` | `45000` | 单次等待窗口上限(最小 5000) |
|
|
704
|
+
|
|
705
|
+
回归:`node --test engineering\plugins\dsh-engineering-ui\test\job-wait-guard.test.mjs`(6/6)。
|
|
706
|
+
|
|
707
|
+
---
|
|
708
|
+
|
|
709
|
+
## ⚠️ 已知限制
|
|
710
|
+
|
|
711
|
+
1. **强依赖 Windows + 已装好的 SolidWorks**。SW / CAD 自动化走 COM,macOS 与 Linux 上只能跑非建模部分。
|
|
712
|
+
2. **没装 SolidWorks 的机器上,SW 相关行为无法验证**(`massprops`、`GetBodyBox` 等)。
|
|
713
|
+
3. **CADX 的重叠检查依赖 `ezdxf` + `shapely`**,两者缺失时该项自动跳过 —— 别把它当成"已通过"。
|
|
714
|
+
4. **铝合金按无真实疲劳极限处理**(用 5 × 10⁸ 次条件极限),校核偏保守。
|
|
715
|
+
5. **规则库是元数据注册表 + 适用性提示**:具体机读数值仍需从标准原文提取;
|
|
716
|
+
BLOCKER / CRITICAL 类规则必须人工复核,不可由 AI 自动放行。
|
|
717
|
+
6. **部分文件是 UTF-8 with BOM**。Windows PowerShell 5.1 的 `Get-Content` 会按 ANSI 解码,
|
|
718
|
+
读中文 JSON 容易报「传入的对象无效」。用 `python -c "..."` 或 DSH 的 read 工具读。
|
|
719
|
+
7. **四段动图合计约 13 MB**,GitHub 首屏加载会慢一些;介意的话可以换成压缩版或外链。
|
|
720
|
+
|
|
721
|
+
---
|
|
722
|
+
|
|
723
|
+
## 📜 版本历史
|
|
724
|
+
|
|
725
|
+
| 提交 / 日期 | 说明 |
|
|
726
|
+
|-------------|------|
|
|
727
|
+
| 2026-10-28 | **总计子代理真实化**(`analyst-bind` + 身份校验)+ 总理子代理同波启动与监工 + `room-board` 状态可信化(`waiting_sw` / `unbound`)+ 子代理禁令(`ROOT_SESSION_REQUIRED`)+ 插件自动平台登记 |
|
|
728
|
+
| `e12d665` | 为移动端 DSH Go 做适配性调整 |
|
|
729
|
+
| `fe671a3` | mode2_flow 与防御门控完善,新增回归测试与物理运行记录 |
|
|
730
|
+
| `b2a11b1` | **已适配 DSH 0.2.1-rc.2** |
|
|
731
|
+
| `578818e` | 模式二流程改造:十阶段契约 + 总理核实 + 看图闭环 + SW 双路看护 |
|
|
732
|
+
| `eb55f4a` | 适配 DSH 0.2.0 桌面版(bundle 路径、desktop profile、三栏 UI) |
|
|
733
|
+
| `d2e6828` | 工程工作流更新:技能、mode gate、插件、SW 桥接改进 |
|
|
734
|
+
|
|
735
|
+
---
|
|
736
|
+
|
|
737
|
+
## English
|
|
738
|
+
|
|
739
|
+
**DSH Engineering Mode** is an Agent Preset for [DeepSeek Harness](https://github.com/deepseek-ai/dsh/),
|
|
740
|
+
built for CAD / SolidWorks mechanical design. Its single goal is a **finished engineering drawing**.
|
|
741
|
+
|
|
742
|
+
What makes it different from a chat assistant that writes CAD scripts:
|
|
743
|
+
|
|
744
|
+
| | |
|
|
745
|
+
|---|---|
|
|
746
|
+
| **Real SolidWorks automation** | Python `win32com`, SW 2018 ~ 2025, millimetres |
|
|
747
|
+
| **Built-in FEA** | pure-Python CST / CTE solver, optional Gmsh / CalculiX / Code_Aster / SW Simulation |
|
|
748
|
+
| **Fatigue by default** | Basquin S-N + Marin + Miner, 30-year design life |
|
|
749
|
+
| **Three defense lines** | material / physics / domain, enforced by **host-signed HMAC credentials** |
|
|
750
|
+
| **Multi-room subagents** | assembly split into rooms, process-level FIFO lock around SolidWorks |
|
|
751
|
+
| **Gated workflow** | analyst subagent runs a ten-stage pipeline, then a pre-delivery check |
|
|
752
|
+
Quick start (Windows, DSH 0.2.x):
|
|
753
|
+
|
|
754
|
+
```powershell
|
|
755
|
+
powershell -NoProfile -ExecutionPolicy Bypass -File .\install.ps1 -Profile desktop
|
|
756
|
+
# then restart DSH
|
|
757
|
+
```
|
|
758
|
+
|
|
759
|
+
Requirements: Windows, DSH 0.2.x, Python 3.8+ (64-bit) with `pywin32`, SolidWorks 2018 ~ 2025.
|
|
760
|
+
Optional: `numpy` (physics), `ezdxf` + `shapely` (DXF validation), `Pillow` (visual check).
|
|
761
|
+
|
|
762
|
+
The preset ships a Chinese persona out of the box. The tooling, gate scripts and HTTP routes
|
|
763
|
+
are language-neutral; see `engineering/README.md` for the architecture notes.
|
|
764
|
+
|
|
765
|
+
---
|
|
766
|
+
|
|
767
|
+
## License
|
|
768
|
+
|
|
769
|
+
MIT — 见 [LICENSE](LICENSE)。
|
|
770
|
+
|
|
771
|
+
本项目是 DeepSeek Harness 的**第三方 Agent 预设**,与 DeepSeek 官方无隶属关系。
|
|
772
|
+
SolidWorks 与 AutoCAD 分别是 Dassault Systèmes 与 Autodesk 的商标,本项目仅通过其公开 COM 接口进行自动化调用。
|