DSH 平台 · 项目架构全景图(细到功能点)

生成时间 2026-09-21 08:2x · 仓库 D:\github\dsh_shenxian · 基线 HEAD=1242d07  · 采集方式:静态扫描全仓 100 个 .ts(脚本口径与 scripts/check-layering.mjs 对齐)+ npm run check:layering --json
⚠️ 本图为**只读分析产物**:未修改任何生产代码、未部署、未重启。

一、规模与分层总览

100
src/ 下 .ts 文件
35,184
总行数
78
HTTP 功能点(路由条目)
13
数据表
5
分层违规(全部在基线内)
0
本轮新增违规
0
② 领域层文件(空缺)
1
未归类文件

二、分层模块图(依赖方向)

合法方向 ①→②→③→④(青色箭头,278 条实际 import 边) · 违规回指(红色箭头,5 条) · ② 领域层为 0 文件 ① 入口层 Entry src/cli.ts · src/web/**(server/routes/middleware) HTTP 路由 · 鉴权中间件 · 静态资源 · HTML 注入 32 files 8,520 lines ② 领域层 Domain src/domain/** —— 当前为空(P1 未做) 业务规则本应在此层,现实被写在 ① 与 ③ 0 files 0 lines ③ 能力层 Capability src/{supervisor,db,fs,worker,net,nginx}/** 实例编排 · 数据持久化 · 文件系统 · 覆盖网络/中继 · WORKER 代理 63 files 25,721 lines ④ 基础层 Foundation src/{config,crypto,isolation,index}.ts 配置 · 加密 · 沙箱隔离 · 进程入口 4 files 878 lines 文件数 行数 未归类(必须先定层):src/platform-paths.ts

四层由 docs/architecture.md §1 定义;层归属**只按目录判**(不做语义推断)。② 领域层自 2026-09-16 立规则起至今仍为 0 文件 —— 这是本图唯一的结构性空缺。

层间 import 矩阵(实测)

源 \ 目标①入口②领域③能力④基础合计
①入口540528114
②领域00000
③能力5 ⛔01536164
④基础00000

判据:目标层号 < 源层号 ⇒ 违规(红)。矩阵合计 = 278 条层间边(= 全仓相对 import 边总数,含跨层重复计数按"边"计一次)。

现存违规明细(5 条 · 与基线逐条对应)

基线文件 scripts/layering-baseline.json:棘轮(ratchet),**只许减不许增**;新增即令 npm run verify 失败。

规则源(下层,违规方)目标(上层)行号方向arch.md §5.1 记载的修法方向
R1src/fs/local-user-fs.tssrc/web/middleware/fs-guard.ts13③能力 → ①入口路径守卫 = 领域规则 ⇒ 归 src/domain/
R1src/fs/remote-user-fs.tssrc/web/middleware/fs-guard.ts18③能力 → ①入口路径守卫 = 领域规则 ⇒ 归 src/domain/
R1src/fs/workspace.tssrc/web/middleware/fs-guard.ts14③能力 → ①入口路径守卫 = 领域规则 ⇒ 归 src/domain/
R1src/supervisor/proxy.tssrc/web/auth.ts19③能力 → ①入口纯函数 ⇒ 下沉到基础层
R1src/supervisor/proxy.tssrc/web/middleware/authn.ts20③能力 → ①入口会话校验属能力 ⇒ 下沉能力层

三、关键调用链(沿真实 import 边展开)

每条链从入口文件出发,列首层依赖与二跳新增模块 —— 用于回答"改一个功能要读几个模块"。

src/web/routes/auth.ts 直连 11 · 二跳累计 7 个模块
首层依赖
→ src/crypto.ts
→ src/db/types.ts
→ src/fs/workspace.ts
→ src/web/auth.ts
→ src/web/email-code.ts
→ src/web/home-files.ts
→ src/web/locale-pref.ts
→ src/web/middleware/authn.ts
→ src/web/model-catalog.ts
→ src/web/model-landing.ts
→ src/web/turnstile.ts
二跳新增
→ src/config.ts
→ src/db/adapter.ts
→ src/net/reachability.ts
→ src/web/dsh-install.ts
→ src/web/mail.ts
→ src/web/middleware/fs-guard.ts
→ src/web/register-guard.ts
src/web/routes/dsh.ts 直连 8 · 二跳累计 8 个模块
首层依赖
→ src/fs/workspace.ts
→ src/supervisor/orchestrator.ts
→ src/supervisor/patch.ts
→ src/supervisor/proxy.ts
→ src/supervisor/session-preset.ts
→ src/supervisor/spawner.ts
→ src/web/middleware/authn.ts
→ src/web/routes/desktop.ts
二跳新增
→ src/config.ts
→ src/db/types.ts
→ src/fs/user-fs.ts
→ src/supervisor/crash-policy.ts
→ src/supervisor/firewall.ts
→ src/supervisor/spawn.ts
→ src/web/auth.ts
→ src/web/middleware/fs-guard.ts
src/web/routes/business-plugins.ts 直连 4 · 二跳累计 4 个模块
首层依赖
→ src/fs/workspace.ts
→ src/web/middleware/authn.ts
→ src/web/plugin-compat.ts
→ src/web/security-scan.ts
二跳新增
→ src/db/types.ts
→ src/web/auth.ts
→ src/web/dsh-install.ts
→ src/web/middleware/fs-guard.ts
src/supervisor/proxy.ts 直连 3 · 二跳累计 1 个模块
首层依赖
→ src/supervisor/spawner.ts
→ src/web/auth.ts
→ src/web/middleware/authn.ts
二跳新增
→ src/db/types.ts
src/net/relay/server.ts 直连 5 · 二跳累计 1 个模块
首层依赖
→ src/net/relay/identity.ts
→ src/net/relay/jitter.ts
→ src/net/relay/keys.ts
→ src/net/relay/network.ts
→ src/net/relay/wire.ts
二跳新增
→ src/net/relay/directory.ts

四、目录规模与职责

目录文件数行数层归属说明
src/net/relay2111,585③能力自研中继:服务端 / 客户端 / 目录 / 身份 / 切流 / 内容块级寻址 / 直连打洞
src/web/routes134,142①入口HTTP 路由 = 事实上的业务层(②领域层为空导致)
src/db103,987③能力schema · types · repo · pg · adapter(SQLite↔PG 双写)
src/supervisor113,983③能力实例监督:代理 / 编排 / 注入 / 崩溃策略
src/web153,862①入口服务装配 · 鉴权 · 国际化 · 静态资源 · 注入
src/net/relay/content62,388③能力内容分发(块级寻址 · 加解密 · 运行时)
src61,337未归类入口 cli.ts · 基础层 4 件 · platform-paths
src/net/relay/direct31,327③能力P2P 直连(打洞)
src/worker31,317③能力多机 Worker 代理与 provisioner
src/fs6796③能力用户卷:本地 / 远端 UserFs + 路径守卫
src/net2292③能力可达性与会合(覆盖网络 S0)
src/web/middleware3122①入口鉴权 / FS 守卫中间件(被 ③ 反向依赖)
src/nginx146③能力站点配置生成

五、大文件与扇入(迭代阻力信号)

判据:**大文件 + 高扇入 = 迭代阻力信号**。下方"被依赖" = 该文件被仓内其他文件 import 的边数。

行数文件相对规模被依赖风险判读(阈值 600 行)
2472src/net/relay/server.ts
3高 单文件超 1,200 行:改一处需通读全文,context 成本高
1786src/net/relay/client.ts
6高 单文件超 1,200 行:改一处需通读全文,context 成本高
1719src/supervisor/orchestrator.ts
4高 单文件超 1,200 行:改一处需通读全文,context 成本高
1296src/web/server.ts
1高 单文件超 1,200 行:改一处需通读全文,context 成本高
974src/db/repo.ts
1中 超 700 行:建议按职责拆分(未做,P1 范畴)
974src/db/pg.ts
1中 超 700 行:建议按职责拆分(未做,P1 范畴)
846src/net/relay/directory.ts
9中 超 700 行:建议按职责拆分(未做,P1 范畴)
793src/config.ts
8中 超 700 行:建议按职责拆分(未做,P1 范畴)
791src/supervisor/proxy.ts
2中 超 700 行:建议按职责拆分(未做,P1 范畴)
743src/web/routes/business-plugins.ts
2中 超 700 行:建议按职责拆分(未做,P1 范畴)
711src/net/relay/content/runtime.ts
3中 超 700 行:建议按职责拆分(未做,P1 范畴)
687src/web/routes/skills.ts
1可控 在阈值内
685src/net/relay/identity.ts
14可控 在阈值内
677src/net/relay/switcher.ts
8可控 在阈值内
672src/web/routes/auth.ts
1可控 在阈值内
639src/worker/agent.ts
3可控 在阈值内
628src/net/relay/content/crypto.ts
6可控 在阈值内
625src/db/schema.ts
2可控 在阈值内

被依赖最多的模块(高扇入)

被依赖文件层含义
17src/net/relay/network.ts③能力改动影响面最广,需交叉验证
14src/fs/workspace.ts③能力改动影响面最广,需交叉验证
14src/net/relay/identity.ts③能力改动影响面最广,需交叉验证
13src/web/middleware/authn.ts①入口改动影响面最广,需交叉验证
11src/db/types.ts③能力改动影响面最广,需交叉验证
9src/db/adapter.ts③能力影响面中等
9src/net/relay/directory.ts③能力影响面中等
8src/config.ts④基础影响面中等
8src/net/relay/switcher.ts③能力影响面中等
7src/fs/user-fs.ts③能力影响面中等
7src/supervisor/spawner.ts③能力影响面中等
6src/net/reachability.ts③能力影响面中等
6src/net/relay/content/crypto.ts③能力影响面中等
6src/net/relay/direct/candidate.ts③能力影响面中等

六、功能点索引(入口路由 → 处理层 → 依赖模块 → 数据表 → 前端页面)

共 78 个功能点,分布在 12 个路由文件中。前端页面为按 API 前缀反查所得(/api/… 字面量匹配),"—" 表示无前端页面直接调用(如登录态内部调用、Worker 侧调用)。
「数据表」列 = 该路由文件内直接出现的表名('表名' 字面量或 SQL FROM/JOIN/UPDATE/INTO 之后);经 db/repo.ts 间接访问、以及路由委托给 supervisor/* 后由能力层落库的,不在本列体现(宁缺不误报)。

认证与注册 · 10 个功能点

方法入口路由处理层(文件 · 行数)依赖模块数据表前端页面
POST/api/auth/loginauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—admin.html, login.html
POST/api/auth/logoutauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—admin.html, portal.html
GET/api/auth/meauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—admin.html, index.html, portal.html
POST/api/auth/registerauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—register.html
GET/api/auth/register/configauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—register.html
POST/api/auth/register/email-codeauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—register.html
GET/logoutauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
——
POST/api/auth/logout-allsessions.ts
156 行 · 本文件 4 个路由
device-grant.ts
auth.ts
authn.ts
audit_log
overlay_devices
admin.html, portal.html
GET/api/auth/sessionssessions.ts
156 行 · 本文件 4 个路由
device-grant.ts
auth.ts
authn.ts
audit_log
overlay_devices
—
POST/api/auth/sessions/revokesessions.ts
156 行 · 本文件 4 个路由
device-grant.ts
auth.ts
authn.ts
audit_log
overlay_devices
—

实例与工作区 · 6 个功能点

方法入口路由处理层(文件 · 行数)依赖模块数据表前端页面
POST/api/dsh/enterdsh.ts
267 行 · 本文件 7 个路由
workspace.ts
platform-paths.ts
orchestrator.ts
patch.ts
proxy.ts
… 另 4 个
orchestrator.js()
proxy.js()
supervisor.breakerInfo()
—index.html, login.html, portal.html, wake.html
POST/api/dsh/launchdsh.ts
267 行 · 本文件 7 个路由
workspace.ts
platform-paths.ts
orchestrator.ts
patch.ts
proxy.ts
… 另 4 个
orchestrator.js()
proxy.js()
supervisor.breakerInfo()
—portal.html
POST/api/dsh/restartdsh.ts
267 行 · 本文件 7 个路由
workspace.ts
platform-paths.ts
orchestrator.ts
patch.ts
proxy.ts
… 另 4 个
orchestrator.js()
proxy.js()
supervisor.breakerInfo()
——
GET/api/dsh/session-permissiondsh.ts
267 行 · 本文件 7 个路由
workspace.ts
platform-paths.ts
orchestrator.ts
patch.ts
proxy.ts
… 另 4 个
orchestrator.js()
proxy.js()
supervisor.breakerInfo()
——
GET/api/dsh/statusdsh.ts
267 行 · 本文件 7 个路由
workspace.ts
platform-paths.ts
orchestrator.ts
patch.ts
proxy.ts
… 另 4 个
orchestrator.js()
proxy.js()
supervisor.breakerInfo()
—portal.html
POST/api/dsh/stopdsh.ts
267 行 · 本文件 7 个路由
workspace.ts
platform-paths.ts
orchestrator.ts
patch.ts
proxy.ts
… 另 4 个
orchestrator.js()
proxy.js()
supervisor.breakerInfo()
—portal.html

插件与功能管理 · 20 个功能点

方法入口路由处理层(文件 · 行数)依赖模块数据表前端页面
GET/api/plugins/businessbusiness-plugins.ts
743 行 · 本文件 6 个路由
workspace.ts
authn.ts
plugin-compat.ts
security-scan.ts
supervisor.restartAndProbe()
business_plugins
portal.html
POST/api/plugins/businessbusiness-plugins.ts
743 行 · 本文件 6 个路由
workspace.ts
authn.ts
plugin-compat.ts
security-scan.ts
supervisor.restartAndProbe()
business_plugins
portal.html
DELETE/api/plugins/business/:idbusiness-plugins.ts
743 行 · 本文件 6 个路由
workspace.ts
authn.ts
plugin-compat.ts
security-scan.ts
supervisor.restartAndProbe()
business_plugins
portal.html
GET/api/plugins/minebusiness-plugins.ts
743 行 · 本文件 6 个路由
workspace.ts
authn.ts
plugin-compat.ts
security-scan.ts
supervisor.restartAndProbe()
business_plugins
—
POST/api/plugins/mine/applybusiness-plugins.ts
743 行 · 本文件 6 个路由
workspace.ts
authn.ts
plugin-compat.ts
security-scan.ts
supervisor.restartAndProbe()
business_plugins
—
GET/api/plugins/mine/task/:idbusiness-plugins.ts
743 行 · 本文件 6 个路由
workspace.ts
authn.ts
plugin-compat.ts
security-scan.ts
supervisor.restartAndProbe()
business_plugins
—
GET/api/desktop/treedesktop.ts
156 行 · 本文件 5 个路由
user-fs.ts
authn.ts
—portal.html
GET/api/skills/mineskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
——
POST/api/skills/mineskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
——
DELETE/api/skills/mine/:nameskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
——
POST/api/skills/mine/:name/disableskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
——
POST/api/skills/mine/:name/enableskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
——
POST/api/skills/mine/applyskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
——
GET/api/skills/sharedskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
—portal.html
POST/api/skills/sharedskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
—portal.html
DELETE/api/skills/shared/:nameskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
—portal.html
POST/api/skills/shared/applyskills.ts
687 行 · 本文件 10 个路由
workspace.ts
authn.ts
security-scan.ts
—portal.html
GET/api/plugins/whitelistwhitelist.ts
500 行 · 本文件 3 个路由
authn.ts
plugin-dsh-compat.ts
business-plugins.ts
security-scan.ts
registry.npmjs()
—portal.html
POST/api/plugins/whitelist/importwhitelist.ts
500 行 · 本文件 3 个路由
authn.ts
plugin-dsh-compat.ts
business-plugins.ts
security-scan.ts
registry.npmjs()
—portal.html
POST/api/plugins/whitelist/refreshwhitelist.ts
500 行 · 本文件 3 个路由
authn.ts
plugin-dsh-compat.ts
business-plugins.ts
security-scan.ts
registry.npmjs()
—portal.html

管理后台 · 24 个功能点

方法入口路由处理层(文件 · 行数)依赖模块数据表前端页面
POST/api/admin/users/:id/dsh/launchadmin-user-ops.ts
166 行 · 本文件 6 个路由
orchestrator.ts
authn.ts
desktop.ts
dsh.ts
orchestrator.js()
supervisor.stop()
—admin.html, portal.html
GET/api/admin/users/:id/dsh/statusadmin-user-ops.ts
166 行 · 本文件 6 个路由
orchestrator.ts
authn.ts
desktop.ts
dsh.ts
orchestrator.js()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/dsh/stopadmin-user-ops.ts
166 行 · 本文件 6 个路由
orchestrator.ts
authn.ts
desktop.ts
dsh.ts
orchestrator.js()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/fs/createadmin-user-ops.ts
166 行 · 本文件 6 个路由
orchestrator.ts
authn.ts
desktop.ts
dsh.ts
orchestrator.js()
supervisor.stop()
—admin.html, portal.html
GET/api/admin/users/:id/fs/treeadmin-user-ops.ts
166 行 · 本文件 6 个路由
orchestrator.ts
authn.ts
desktop.ts
dsh.ts
orchestrator.js()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/fs/uploadadmin-user-ops.ts
166 行 · 本文件 6 个路由
orchestrator.ts
authn.ts
desktop.ts
dsh.ts
orchestrator.js()
supervisor.stop()
—admin.html, portal.html
GET/api/admin/hostsadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
——
POST/api/admin/hostsadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
——
GET/api/admin/runtimeadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—portal.html
GET/api/admin/storageadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html
GET/api/admin/usersadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html, portal.html
DELETE/api/admin/users/:idadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/approveadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/disableadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/dsh/migrateadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/enableadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html, portal.html
POST/api/admin/users/:id/models/sharedadmin.ts
329 行 · 本文件 11 个路由
workspace.ts
platform-paths.ts
authn.ts
supervisor.launch()
supervisor.restartMain()
supervisor.stop()
—admin.html, portal.html
GET/api/admin/domainsdomain.ts
60 行 · 本文件 5 个路由
generate.ts
authn.ts
——
POST/api/admin/domains/:id/verifydomain.ts
60 行 · 本文件 5 个路由
generate.ts
authn.ts
——
GET/api/admin/overlay-devicesoverlay-nodes.ts
222 行 · 本文件 5 个路由
index.ts
identity.ts
registry.ts
platform-paths.ts
authn.ts
registry.js()
overlay_devices
—
POST/api/admin/overlay-devices/revokeoverlay-nodes.ts
222 行 · 本文件 5 个路由
index.ts
identity.ts
registry.ts
platform-paths.ts
authn.ts
registry.js()
overlay_devices
—
GET/api/admin/overlay-nodesoverlay-nodes.ts
222 行 · 本文件 5 个路由
index.ts
identity.ts
registry.ts
platform-paths.ts
authn.ts
registry.js()
overlay_devices
—
GET/api/admin/overlay-nodes/directoverlay-nodes.ts
222 行 · 本文件 5 个路由
index.ts
identity.ts
registry.ts
platform-paths.ts
authn.ts
registry.js()
overlay_devices
—
POST/api/admin/overlay-nodes/directoverlay-nodes.ts
222 行 · 本文件 5 个路由
index.ts
identity.ts
registry.ts
platform-paths.ts
authn.ts
registry.js()
overlay_devices
—

覆盖网络与中继 · 2 个功能点

方法入口路由处理层(文件 · 行数)依赖模块数据表前端页面
POST/api/overlay/device-grantoverlay-device.ts
100 行 · 本文件 1 个路由
device-grant.ts
identity.ts
authn.ts
——
GET/api/overlay/my-devicessessions.ts
156 行 · 本文件 4 个路由
device-grant.ts
auth.ts
authn.ts
audit_log
overlay_devices
—

域名与部署 · 3 个功能点

方法入口路由处理层(文件 · 行数)依赖模块数据表前端页面
GET/api/domaindomain.ts
60 行 · 本文件 5 个路由
generate.ts
authn.ts
——
PUT/api/domaindomain.ts
60 行 · 本文件 5 个路由
generate.ts
authn.ts
——
POST/api/nginx/regendomain.ts
60 行 · 本文件 5 个路由
generate.ts
authn.ts
——

其他 · 13 个功能点

方法入口路由处理层(文件 · 行数)依赖模块数据表前端页面
GET/api/me/keysauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—portal.html
POST/api/me/keysauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—portal.html
DELETE/api/me/keys/:idauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—portal.html
POST/api/me/keys/:id/selectauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—portal.html
POST/api/me/keys/:id/toggleauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
—portal.html
POST/api/me/localeauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
——
GET/api/me/model-providersauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
——
POST/api/me/models/sharedauth.ts
672 行 · 本文件 15 个路由
crypto.ts
types.ts
workspace.ts
auth.ts
email-code.ts
… 另 6 个
supervisor.restartAllMains()
supervisor.restartMain()
——
POST/api/fs/createdesktop.ts
156 行 · 本文件 5 个路由
user-fs.ts
authn.ts
—portal.html
GET/api/fs/downloaddesktop.ts
156 行 · 本文件 5 个路由
user-fs.ts
authn.ts
——
POST/api/fs/mkdirdesktop.ts
156 行 · 本文件 5 个路由
user-fs.ts
authn.ts
——
POST/api/fs/uploaddesktop.ts
156 行 · 本文件 5 个路由
user-fs.ts
authn.ts
—portal.html
GET/api/capabilitiesdsh.ts
267 行 · 本文件 7 个路由
workspace.ts
platform-paths.ts
orchestrator.ts
patch.ts
proxy.ts
… 另 4 个
orchestrator.js()
proxy.js()
supervisor.breakerInfo()
——

七、结论:本次修改出问题,是否由代码结构混乱导致?

判定 — 分三问回答(每条结论附可复核证据)

否 问题 1:本次修改出问题,是否由代码结构混乱导致?

本次两处线上问题(07:35 的 proxy 回归、以及此前的验收假绿)**真因都不是"结构混乱"**: 判据主体选错(request.raw vs reply.raw)属 方法性;拿 401 当通过属 验收方法性;高水位赶工属 流程性。 结构面在同一时期的实测数据反而是**守住了**的:见下方证据 1–3。

证据 1 · 结构性:扩张期未走形,且被机器约束住

时间.ts 文件行数违规边来源
2026-09-165814,0535 条docs/architecture.md §3 / §5.1(当时实测)
2026-09-2110035,1845 条(同一批边)本轮 check-layering.mjs --json

5 天内文件数 +72%、行数 +150%,而 R1/R3/R4 违规**一条未增**(新增违规 added = [])。⇒ 结论:代码结构没有混乱,且分层方向在高速扩张下被棘轮脚本守住了。

$ node scripts/check-layering.mjs
=== 分层依赖检查(docs/architecture.md R1–R4)===
扫描:100 个 .ts|归属 ①32 ②0 ③63 ④4|未归类 1
⚠️ 未归类(新增目录必须先定层):src/platform-paths.ts
现存违规 5 条(其中基线内 5 条)

✅ 无新增违规

证据 2 · 三类成因逐条归因(每条带证据)

类别成因可复核证据是否本因
方法性 判据主体选错
监听"请求流"而非"响应流"
src/supervisor/proxy.ts:错误写法 request.raw.on('close') —— GET 请求体读完即触发,被误判为"客户端断开",进而掐死正常请求 ⇒ 用户侧 499。
另:即便换主体,若保留条件 || reply.raw.destroyed,因 'close' 触发时响应流通常已 destroyed ⇒ 条件恒真 ⇒ 修复静默失效(本轮 harness 实测记于接续包「本棒状态」第 1 条)。
是
方法性 验收打错路径(假绿) 用 curl 拿到的 401 当通过判据 —— 而 401 由平台在进入 proxyHttp 之前返回,根本走不到被改的代码。
正解口径(已写入档案 146 §九):带有效 sid 走真实子域请求,核对 200 + 响应字节数 > 0;或部署后回读 /www/wwwlogs/ai1net.com.log 确认该子域出现 200(仍 499 = 没修好)。
是
流程性 高水位赶工 产生该回归的会话以「水位 >30 万强制收口」结束(接续包首行:结束原因: 水位 >30 万强制收口)⇒ 在上下文余量告急时改了 4 处 + 10 hunk 的行为敏感代码,没有留出回读 access log 的余量。 是(放大器)
结构性 分层越界 / 职责不清 / 耦合 实测:违规边 5 条,全部与 09-16 首跑逐条相同,且集中在一个既有位置(proxy.ts 反指 web/auth.ts、fs/* 反指 web/middleware/fs-guard.ts)。
被本次改动碰到的文件不在这 5 条边上:proxy.ts 的两条违规 import(第 19/20 行)是读会话与 cookie 的工具函数,与本次改的 proxyHttp 流监听无耦合。
不是本因

⇒ 三类成因中 方法性 2 条 + 流程性 1 条是本因;结构性 0 条。这与档案 146 §九 的记载一致,本轮把它从"单次事故结论"升级为"对全局的验证结论"。

问题 2:是否已影响迭代效率?部分是,但不是"混乱"造成的

判定:有可量化的效率损耗,但归因于结构空缺(缺领域层)+ 大文件,而非"结构混乱"。三项实测信号:

  1. 缺 ② 领域层 ⇒ 业务规则一分为三。例:插件启用规则写在 src/web/routes/business-plugins.ts(743 行),规则另一半在 src/supervisor/orchestrator.ts(1,719 行)与 src/db/repo.ts(974 行)⇒ 改一条规则需连读三处 ≈ 3,400 行。此为 architecture.md §4 P1 明确记录的已知债(未整改,因影响 >10 文件需先出清单)。
  2. 大文件密度:>1,200 行的单文件 4 个(net/relay/server.ts 2,472 / net/relay/client.ts 1,786 / supervisor/orchestrator.ts 1,719 / web/server.ts 1,296);>700 行共 11 个。改一个功能点通常要打开其中一个的全文。
  3. 高扇入点集中:src/web/middleware/authn.ts 等被 13+ 个文件依赖 ⇒ 改它需做跨模块回归。

⚠️ 但三者的代价是"读得多、改得慢",属可预期的工程债;不是"改 A 崩 B"的不确定性。本次事故属后者,故不可归因于结构。

判定汇总(一句话版)

问题结论主因 / 依据
本次修改出问题,是否由代码结构混乱导致?否主因 = 方法性(判据主体错 + 验收假绿,2 条)+ 流程性(高水位赶工,1 条放大器);结构性 0 条,见证据 2 第 4 行
结构上是否有真实的效率损耗?有缺 ② 领域层(0/100 文件)+ 大文件(>700 行 11 个)+ 高扇入点,属已知债且已登记在案(architecture.md §3/§4)
分层纪律是否被破坏?否违规边 09-16 与 09-21 逐条相同(5→5),added=[];扩张 +150% 行数未新增违规
本轮是否需要重构?不需要architecture.md §4 已定序:P1(补 domain 层)不阻塞当前功能迭代;且属行为敏感、>10 文件 ⇒ 须先出清单。本阶段只读,不动

八、复核方式(任何人可复现本图全部结论)

cd /d/github/dsh_shenxian
node scripts/check-layering.mjs            # 分层违规(机器结论,退出码 0 = 无新增)
node scripts/check-layering.mjs --json     # 违规明细 + 未归类清单(本图证据 1 的原始输出)
find src -name '*.ts' -exec wc -l {} + | sort -rn | head   # 大文件排名(本图第五节)
grep -n "from '\./" src/supervisor/proxy.ts                # 验证 proxy.ts 的两条违规 import
wc -l src/web/routes/*.ts src/supervisor/*.ts src/db/repo.ts # 验证"改一条规则读三处"的行数

采集脚本:tmp/arch_panorama_build.py(只读,不写仓库内任何文件) · 原始数据:tmp/arch_panorama.json

DSH 平台 · 项目架构全景排查(阶段 3)|只读分析,未改任何生产代码、未部署、未重启
证据口径:scripts/check-layering.mjs(与 docs/architecture.md R1–R4 同源)· docs/architecture.md §3/§5.1 · dsh-server-docs/04-调整方案/146-*.md §九 · 接续包《实例恢复浮层改造 20260921》「本棒状态」
基线 HEAD=1242d07|扫描 100 个 .ts / 35,184 行 / 78 个功能点 / 13 张表