生成时间 2026-09-21 08:2x · 仓库 D:\github\dsh_shenxian · 基线 HEAD=1242d07
· 采集方式:静态扫描全仓 100 个 .ts(脚本口径与 scripts/check-layering.mjs 对齐)+ npm run check:layering --json
⚠️ 本图为**只读分析产物**:未修改任何生产代码、未部署、未重启。
四层由 docs/architecture.md §1 定义;层归属**只按目录判**(不做语义推断)。② 领域层自 2026-09-16 立规则起至今仍为 0 文件 —— 这是本图唯一的结构性空缺。
| 源 \ 目标 | ①入口 | ②领域 | ③能力 | ④基础 | 合计 |
|---|---|---|---|---|---|
| ①入口 | 54 | 0 | 52 | 8 | 114 |
| ②领域 | 0 | 0 | 0 | 0 | 0 |
| ③能力 | 5 ⛔ | 0 | 153 | 6 | 164 |
| ④基础 | 0 | 0 | 0 | 0 | 0 |
判据:目标层号 < 源层号 ⇒ 违规(红)。矩阵合计 = 278 条层间边(= 全仓相对 import 边总数,含跨层重复计数按"边"计一次)。
基线文件 scripts/layering-baseline.json:棘轮(ratchet),**只许减不许增**;新增即令 npm run verify 失败。
| 规则 | 源(下层,违规方) | 目标(上层) | 行号 | 方向 | arch.md §5.1 记载的修法方向 |
|---|---|---|---|---|---|
| R1 | src/fs/local-user-fs.ts | src/web/middleware/fs-guard.ts | 13 | ③能力 → ①入口 | 路径守卫 = 领域规则 ⇒ 归 src/domain/ |
| R1 | src/fs/remote-user-fs.ts | src/web/middleware/fs-guard.ts | 18 | ③能力 → ①入口 | 路径守卫 = 领域规则 ⇒ 归 src/domain/ |
| R1 | src/fs/workspace.ts | src/web/middleware/fs-guard.ts | 14 | ③能力 → ①入口 | 路径守卫 = 领域规则 ⇒ 归 src/domain/ |
| R1 | src/supervisor/proxy.ts | src/web/auth.ts | 19 | ③能力 → ①入口 | 纯函数 ⇒ 下沉到基础层 |
| R1 | src/supervisor/proxy.ts | src/web/middleware/authn.ts | 20 | ③能力 → ①入口 | 会话校验属能力 ⇒ 下沉能力层 |
每条链从入口文件出发,列首层依赖与二跳新增模块 —— 用于回答"改一个功能要读几个模块"。
| 目录 | 文件数 | 行数 | 层归属 | 说明 |
|---|---|---|---|---|
| src/net/relay | 21 | 11,585 | ③能力 | 自研中继:服务端 / 客户端 / 目录 / 身份 / 切流 / 内容块级寻址 / 直连打洞 |
| src/web/routes | 13 | 4,142 | ①入口 | HTTP 路由 = 事实上的业务层(②领域层为空导致) |
| src/db | 10 | 3,987 | ③能力 | schema · types · repo · pg · adapter(SQLite↔PG 双写) |
| src/supervisor | 11 | 3,983 | ③能力 | 实例监督:代理 / 编排 / 注入 / 崩溃策略 |
| src/web | 15 | 3,862 | ①入口 | 服务装配 · 鉴权 · 国际化 · 静态资源 · 注入 |
| src/net/relay/content | 6 | 2,388 | ③能力 | 内容分发(块级寻址 · 加解密 · 运行时) |
| src | 6 | 1,337 | 未归类 | 入口 cli.ts · 基础层 4 件 · platform-paths |
| src/net/relay/direct | 3 | 1,327 | ③能力 | P2P 直连(打洞) |
| src/worker | 3 | 1,317 | ③能力 | 多机 Worker 代理与 provisioner |
| src/fs | 6 | 796 | ③能力 | 用户卷:本地 / 远端 UserFs + 路径守卫 |
| src/net | 2 | 292 | ③能力 | 可达性与会合(覆盖网络 S0) |
| src/web/middleware | 3 | 122 | ①入口 | 鉴权 / FS 守卫中间件(被 ③ 反向依赖) |
| src/nginx | 1 | 46 | ③能力 | 站点配置生成 |
判据:**大文件 + 高扇入 = 迭代阻力信号**。下方"被依赖" = 该文件被仓内其他文件 import 的边数。
| 行数 | 文件 | 相对规模 | 被依赖 | 风险判读(阈值 600 行) |
|---|---|---|---|---|
| 2472 | src/net/relay/server.ts | 3 | 高 单文件超 1,200 行:改一处需通读全文,context 成本高 | |
| 1786 | src/net/relay/client.ts | 6 | 高 单文件超 1,200 行:改一处需通读全文,context 成本高 | |
| 1719 | src/supervisor/orchestrator.ts | 4 | 高 单文件超 1,200 行:改一处需通读全文,context 成本高 | |
| 1296 | src/web/server.ts | 1 | 高 单文件超 1,200 行:改一处需通读全文,context 成本高 | |
| 974 | src/db/repo.ts | 1 | 中 超 700 行:建议按职责拆分(未做,P1 范畴) | |
| 974 | src/db/pg.ts | 1 | 中 超 700 行:建议按职责拆分(未做,P1 范畴) | |
| 846 | src/net/relay/directory.ts | 9 | 中 超 700 行:建议按职责拆分(未做,P1 范畴) | |
| 793 | src/config.ts | 8 | 中 超 700 行:建议按职责拆分(未做,P1 范畴) | |
| 791 | src/supervisor/proxy.ts | 2 | 中 超 700 行:建议按职责拆分(未做,P1 范畴) | |
| 743 | src/web/routes/business-plugins.ts | 2 | 中 超 700 行:建议按职责拆分(未做,P1 范畴) | |
| 711 | src/net/relay/content/runtime.ts | 3 | 中 超 700 行:建议按职责拆分(未做,P1 范畴) | |
| 687 | src/web/routes/skills.ts | 1 | 可控 在阈值内 | |
| 685 | src/net/relay/identity.ts | 14 | 可控 在阈值内 | |
| 677 | src/net/relay/switcher.ts | 8 | 可控 在阈值内 | |
| 672 | src/web/routes/auth.ts | 1 | 可控 在阈值内 | |
| 639 | src/worker/agent.ts | 3 | 可控 在阈值内 | |
| 628 | src/net/relay/content/crypto.ts | 6 | 可控 在阈值内 | |
| 625 | src/db/schema.ts | 2 | 可控 在阈值内 |
| 被依赖 | 文件 | 层 | 含义 |
|---|---|---|---|
| 17 | src/net/relay/network.ts | ③能力 | 改动影响面最广,需交叉验证 |
| 14 | src/fs/workspace.ts | ③能力 | 改动影响面最广,需交叉验证 |
| 14 | src/net/relay/identity.ts | ③能力 | 改动影响面最广,需交叉验证 |
| 13 | src/web/middleware/authn.ts | ①入口 | 改动影响面最广,需交叉验证 |
| 11 | src/db/types.ts | ③能力 | 改动影响面最广,需交叉验证 |
| 9 | src/db/adapter.ts | ③能力 | 影响面中等 |
| 9 | src/net/relay/directory.ts | ③能力 | 影响面中等 |
| 8 | src/config.ts | ④基础 | 影响面中等 |
| 8 | src/net/relay/switcher.ts | ③能力 | 影响面中等 |
| 7 | src/fs/user-fs.ts | ③能力 | 影响面中等 |
| 7 | src/supervisor/spawner.ts | ③能力 | 影响面中等 |
| 6 | src/net/reachability.ts | ③能力 | 影响面中等 |
| 6 | src/net/relay/content/crypto.ts | ③能力 | 影响面中等 |
| 6 | src/net/relay/direct/candidate.ts | ③能力 | 影响面中等 |
共 78 个功能点,分布在 12 个路由文件中。前端页面为按 API 前缀反查所得(/api/… 字面量匹配),"—" 表示无前端页面直接调用(如登录态内部调用、Worker 侧调用)。
「数据表」列 = 该路由文件内直接出现的表名('表名' 字面量或 SQL FROM/JOIN/UPDATE/INTO 之后);经 db/repo.ts 间接访问、以及路由委托给 supervisor/* 后由能力层落库的,不在本列体现(宁缺不误报)。
| 方法 | 入口路由 | 处理层(文件 · 行数) | 依赖模块 | 数据表 | 前端页面 |
|---|---|---|---|---|---|
| POST | /api/auth/login | auth.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/logout | auth.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/me | auth.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/register | auth.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/config | auth.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-code | auth.ts 672 行 · 本文件 15 个路由 | crypto.ts types.ts workspace.ts auth.ts email-code.ts … 另 6 个 supervisor.restartAllMains() supervisor.restartMain() | — | register.html |
| GET | /logout | auth.ts 672 行 · 本文件 15 个路由 | crypto.ts types.ts workspace.ts auth.ts email-code.ts … 另 6 个 supervisor.restartAllMains() supervisor.restartMain() | — | — |
| POST | /api/auth/logout-all | sessions.ts 156 行 · 本文件 4 个路由 | device-grant.ts auth.ts authn.ts | audit_log overlay_devices | admin.html, portal.html |
| GET | /api/auth/sessions | sessions.ts 156 行 · 本文件 4 个路由 | device-grant.ts auth.ts authn.ts | audit_log overlay_devices | — |
| POST | /api/auth/sessions/revoke | sessions.ts 156 行 · 本文件 4 个路由 | device-grant.ts auth.ts authn.ts | audit_log overlay_devices | — |
| 方法 | 入口路由 | 处理层(文件 · 行数) | 依赖模块 | 数据表 | 前端页面 |
|---|---|---|---|---|---|
| POST | /api/dsh/enter | dsh.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/launch | dsh.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/restart | dsh.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-permission | dsh.ts 267 行 · 本文件 7 个路由 | workspace.ts platform-paths.ts orchestrator.ts patch.ts proxy.ts … 另 4 个 orchestrator.js() proxy.js() supervisor.breakerInfo() | — | — |
| GET | /api/dsh/status | dsh.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/stop | dsh.ts 267 行 · 本文件 7 个路由 | workspace.ts platform-paths.ts orchestrator.ts patch.ts proxy.ts … 另 4 个 orchestrator.js() proxy.js() supervisor.breakerInfo() | — | portal.html |
| 方法 | 入口路由 | 处理层(文件 · 行数) | 依赖模块 | 数据表 | 前端页面 |
|---|---|---|---|---|---|
| GET | /api/plugins/business | business-plugins.ts 743 行 · 本文件 6 个路由 | workspace.ts authn.ts plugin-compat.ts security-scan.ts supervisor.restartAndProbe() | business_plugins | portal.html |
| POST | /api/plugins/business | business-plugins.ts 743 行 · 本文件 6 个路由 | workspace.ts authn.ts plugin-compat.ts security-scan.ts supervisor.restartAndProbe() | business_plugins | portal.html |
| DELETE | /api/plugins/business/:id | business-plugins.ts 743 行 · 本文件 6 个路由 | workspace.ts authn.ts plugin-compat.ts security-scan.ts supervisor.restartAndProbe() | business_plugins | portal.html |
| GET | /api/plugins/mine | business-plugins.ts 743 行 · 本文件 6 个路由 | workspace.ts authn.ts plugin-compat.ts security-scan.ts supervisor.restartAndProbe() | business_plugins | — |
| POST | /api/plugins/mine/apply | business-plugins.ts 743 行 · 本文件 6 个路由 | workspace.ts authn.ts plugin-compat.ts security-scan.ts supervisor.restartAndProbe() | business_plugins | — |
| GET | /api/plugins/mine/task/:id | business-plugins.ts 743 行 · 本文件 6 个路由 | workspace.ts authn.ts plugin-compat.ts security-scan.ts supervisor.restartAndProbe() | business_plugins | — |
| GET | /api/desktop/tree | desktop.ts 156 行 · 本文件 5 个路由 | user-fs.ts authn.ts | — | portal.html |
| GET | /api/skills/mine | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | — |
| POST | /api/skills/mine | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | — |
| DELETE | /api/skills/mine/:name | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | — |
| POST | /api/skills/mine/:name/disable | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | — |
| POST | /api/skills/mine/:name/enable | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | — |
| POST | /api/skills/mine/apply | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | — |
| GET | /api/skills/shared | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | portal.html |
| POST | /api/skills/shared | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | portal.html |
| DELETE | /api/skills/shared/:name | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | portal.html |
| POST | /api/skills/shared/apply | skills.ts 687 行 · 本文件 10 个路由 | workspace.ts authn.ts security-scan.ts | — | portal.html |
| GET | /api/plugins/whitelist | whitelist.ts 500 行 · 本文件 3 个路由 | authn.ts plugin-dsh-compat.ts business-plugins.ts security-scan.ts registry.npmjs() | — | portal.html |
| POST | /api/plugins/whitelist/import | whitelist.ts 500 行 · 本文件 3 个路由 | authn.ts plugin-dsh-compat.ts business-plugins.ts security-scan.ts registry.npmjs() | — | portal.html |
| POST | /api/plugins/whitelist/refresh | whitelist.ts 500 行 · 本文件 3 个路由 | authn.ts plugin-dsh-compat.ts business-plugins.ts security-scan.ts registry.npmjs() | — | portal.html |
| 方法 | 入口路由 | 处理层(文件 · 行数) | 依赖模块 | 数据表 | 前端页面 |
|---|---|---|---|---|---|
| POST | /api/admin/users/:id/dsh/launch | admin-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/status | admin-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/stop | admin-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/create | admin-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/tree | admin-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/upload | admin-user-ops.ts 166 行 · 本文件 6 个路由 | orchestrator.ts authn.ts desktop.ts dsh.ts orchestrator.js() supervisor.stop() | — | admin.html, portal.html |
| GET | /api/admin/hosts | admin.ts 329 行 · 本文件 11 个路由 | workspace.ts platform-paths.ts authn.ts supervisor.launch() supervisor.restartMain() supervisor.stop() | — | — |
| POST | /api/admin/hosts | admin.ts 329 行 · 本文件 11 个路由 | workspace.ts platform-paths.ts authn.ts supervisor.launch() supervisor.restartMain() supervisor.stop() | — | — |
| GET | /api/admin/runtime | admin.ts 329 行 · 本文件 11 个路由 | workspace.ts platform-paths.ts authn.ts supervisor.launch() supervisor.restartMain() supervisor.stop() | — | portal.html |
| GET | /api/admin/storage | admin.ts 329 行 · 本文件 11 个路由 | workspace.ts platform-paths.ts authn.ts supervisor.launch() supervisor.restartMain() supervisor.stop() | — | admin.html |
| GET | /api/admin/users | admin.ts 329 行 · 本文件 11 个路由 | workspace.ts platform-paths.ts authn.ts supervisor.launch() supervisor.restartMain() supervisor.stop() | — | admin.html, portal.html |
| DELETE | /api/admin/users/:id | admin.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/approve | admin.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/disable | admin.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/migrate | admin.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/enable | admin.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/shared | admin.ts 329 行 · 本文件 11 个路由 | workspace.ts platform-paths.ts authn.ts supervisor.launch() supervisor.restartMain() supervisor.stop() | — | admin.html, portal.html |
| GET | /api/admin/domains | domain.ts 60 行 · 本文件 5 个路由 | generate.ts authn.ts | — | — |
| POST | /api/admin/domains/:id/verify | domain.ts 60 行 · 本文件 5 个路由 | generate.ts authn.ts | — | — |
| GET | /api/admin/overlay-devices | overlay-nodes.ts 222 行 · 本文件 5 个路由 | index.ts identity.ts registry.ts platform-paths.ts authn.ts registry.js() | overlay_devices | — |
| POST | /api/admin/overlay-devices/revoke | overlay-nodes.ts 222 行 · 本文件 5 个路由 | index.ts identity.ts registry.ts platform-paths.ts authn.ts registry.js() | overlay_devices | — |
| GET | /api/admin/overlay-nodes | overlay-nodes.ts 222 行 · 本文件 5 个路由 | index.ts identity.ts registry.ts platform-paths.ts authn.ts registry.js() | overlay_devices | — |
| GET | /api/admin/overlay-nodes/direct | overlay-nodes.ts 222 行 · 本文件 5 个路由 | index.ts identity.ts registry.ts platform-paths.ts authn.ts registry.js() | overlay_devices | — |
| POST | /api/admin/overlay-nodes/direct | overlay-nodes.ts 222 行 · 本文件 5 个路由 | index.ts identity.ts registry.ts platform-paths.ts authn.ts registry.js() | overlay_devices | — |
| 方法 | 入口路由 | 处理层(文件 · 行数) | 依赖模块 | 数据表 | 前端页面 |
|---|---|---|---|---|---|
| POST | /api/overlay/device-grant | overlay-device.ts 100 行 · 本文件 1 个路由 | device-grant.ts identity.ts authn.ts | — | — |
| GET | /api/overlay/my-devices | sessions.ts 156 行 · 本文件 4 个路由 | device-grant.ts auth.ts authn.ts | audit_log overlay_devices | — |
| 方法 | 入口路由 | 处理层(文件 · 行数) | 依赖模块 | 数据表 | 前端页面 |
|---|---|---|---|---|---|
| GET | /api/domain | domain.ts 60 行 · 本文件 5 个路由 | generate.ts authn.ts | — | — |
| PUT | /api/domain | domain.ts 60 行 · 本文件 5 个路由 | generate.ts authn.ts | — | — |
| POST | /api/nginx/regen | domain.ts 60 行 · 本文件 5 个路由 | generate.ts authn.ts | — | — |
| 方法 | 入口路由 | 处理层(文件 · 行数) | 依赖模块 | 数据表 | 前端页面 |
|---|---|---|---|---|---|
| GET | /api/me/keys | auth.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 | auth.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/:id | auth.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/select | auth.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/toggle | auth.ts 672 行 · 本文件 15 个路由 | crypto.ts types.ts workspace.ts auth.ts email-code.ts … 另 6 个 supervisor.restartAllMains() supervisor.restartMain() | — | portal.html |
| POST | /api/me/locale | auth.ts 672 行 · 本文件 15 个路由 | crypto.ts types.ts workspace.ts auth.ts email-code.ts … 另 6 个 supervisor.restartAllMains() supervisor.restartMain() | — | — |
| GET | /api/me/model-providers | auth.ts 672 行 · 本文件 15 个路由 | crypto.ts types.ts workspace.ts auth.ts email-code.ts … 另 6 个 supervisor.restartAllMains() supervisor.restartMain() | — | — |
| POST | /api/me/models/shared | auth.ts 672 行 · 本文件 15 个路由 | crypto.ts types.ts workspace.ts auth.ts email-code.ts … 另 6 个 supervisor.restartAllMains() supervisor.restartMain() | — | — |
| POST | /api/fs/create | desktop.ts 156 行 · 本文件 5 个路由 | user-fs.ts authn.ts | — | portal.html |
| GET | /api/fs/download | desktop.ts 156 行 · 本文件 5 个路由 | user-fs.ts authn.ts | — | — |
| POST | /api/fs/mkdir | desktop.ts 156 行 · 本文件 5 个路由 | user-fs.ts authn.ts | — | — |
| POST | /api/fs/upload | desktop.ts 156 行 · 本文件 5 个路由 | user-fs.ts authn.ts | — | portal.html |
| GET | /api/capabilities | dsh.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。
| 时间 | .ts 文件 | 行数 | 违规边 | 来源 |
|---|---|---|---|---|
| 2026-09-16 | 58 | 14,053 | 5 条 | docs/architecture.md §3 / §5.1(当时实测) |
| 2026-09-21 | 100 | 35,184 | 5 条(同一批边) | 本轮 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 条) ✅ 无新增违规
| 类别 | 成因 | 可复核证据 | 是否本因 |
|---|---|---|---|
| 方法性 | 判据主体选错 监听"请求流"而非"响应流" |
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 §九 的记载一致,本轮把它从"单次事故结论"升级为"对全局的验证结论"。
判定:有可量化的效率损耗,但归因于结构空缺(缺领域层)+ 大文件,而非"结构混乱"。三项实测信号:
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 文件需先出清单)。net/relay/server.ts 2,472 / net/relay/client.ts 1,786 / supervisor/orchestrator.ts 1,719 / web/server.ts 1,296);>700 行共 11 个。改一个功能点通常要打开其中一个的全文。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
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 张表