外观
14 · 代码地图与构建发布
Where is everything
14.1 源码树
text
src/
├─ index.ts 宿主编排:apply()、四挂点接线、16 路由装配、命令注册、approval/request 裁决管线、学习接线 3220 行
├─ auto/ 静态评估纯函数层(42 文件,按字母序)
│ ├─ approval-history.ts 159 审批历史记录:内存窗口 + history.jsonl 追加与轮转、启动恢复
│ ├─ approval-state.ts 223 跨簇可变状态唯一绑定(历史/学习/latency/反馈表/评审状态),另有三个 setter 承载 `let` 绑定
│ ├─ artifacts.ts 140 本会话成功创建路径登记(删除豁免依据)
│ ├─ audit.ts 149 append-only 审批审计(清空留墓碑、5MiB 保尾)
│ ├─ carrier-route.ts 75 载波中立路由注册:原生 Fetch handler 与 delete-op 归一
│ ├─ category.ts 897 12 类三态开关层:归类/优先级合并/指令钳制/信任目录模式
│ ├─ classifier.ts 100 预分类提示词、参数脱敏、严格响应解析
│ ├─ config-normalize.ts 274 配置归一化唯一入口:钳制、退役键归一与 legacy 迁移
│ ├─ constants.ts 141 数值默认唯一事实源(倒计时/熔断/截断/学习族阈值)
│ ├─ debug-and-decisions.ts 190 调试轨迹落盘、规则解析报错汇总、四个纯裁决谓词
│ ├─ decision.ts 1052 纯决策函数:评审解析、人机竞速、来源标注、熔断、静态名单、host-only 键
│ ├─ dsh-classifier.ts 141 复用 ctx.llm 的低 token 分类请求(temperature 0)
│ ├─ endpoint-call.ts 256 共享端点连通性探测与模型校验
│ ├─ feedback-maps.ts 54 超时/决策反馈的有界表记录、清扫与结果脱敏审计
│ ├─ gate-decision.ts 57 Auto 档归属判定:调用者或其子代理的 Auto 祖先,含可学习挂点契约表
│ ├─ http-pipeline.ts 100 每条 web 路由共用的统一 JSON 响应、有界 body 读取与受信 Host 名单
│ ├─ latency.ts 169 LLM 评审耗时环形缓冲(settled/aborted 二分、1MB 轮转)
│ ├─ learning.ts 592 确认制学习:签名、计数、回收、查找、消费闸
│ ├─ loop-guard.ts 95 循环防护纯核:循环键(工具+脱敏参数哈希)、严格连续计数、fire-and-reset、阈值钳制(接线在 index.ts 的四个自动放行站点)
│ ├─ message-source.ts 19 本插件消息的生产者 source 声明(宿主词汇无 catch-all `plugin` kind;durable 日志拒收该 kind)
│ ├─ model-channel.ts 119 模型通道路由与 provider 选择
│ ├─ notices.ts 355 agent 面通知投递(inbox 注入)与拒绝指引:step/end 分流、best-effort 落点
│ ├─ paths.ts 462 路径规范化、受保护/关键路径判定、受保护读取例外(Git ref 元数据)、运行态文件名单
│ ├─ permission-change.ts 131 权限平面变更观测:逐平面基线门控 + 被拒 decision 指针
│ ├─ policy.ts 655 assessTool 确定性第一遍分类(17 步)
│ ├─ preset-migration.ts 419 auto-approval 重命名与存量迁移:多信号宿主能力探测、raw identity gate、同签名懒迁移、自有档 effective-never 归一回 ask
│ ├─ redact.ts 223 秘密脱敏器(token/AWS/PEM/Bearer…,供参数/评审理由/骨架/结果共用)
│ ├─ retry.ts 184 LLM 复审自动重试(瞬时故障判定、预算滚动、Retry-After)
│ ├─ review-mode.ts 51 每会话评审模式持久化快照
│ ├─ review-pipeline.ts 331 深度评审通道:快照解析、单次尝试、有界重试与失败码映射(无模块态)
│ ├─ risk-tokens.ts 24 HIGH 风险正则(NAME/REASON 单一事实源)
│ ├─ route-installers.ts 1154 web 路由装订器:按路由表 + HTTP 管线 + 审批状态注册全部路由,另含退役设置读取与导入提议判据
│ ├─ route-table.ts 178 HTTP 面唯一拼写处:每路由一常量、设置命名空间、首读重试预算与评审器凭据 ref
│ ├─ rules.ts 459 声明式规则解析/求值(host 与浏览器共用)
│ ├─ runtime-paths.ts 293 运行态文件唯一路径 owner(`<DSH_HOME>/auto-approval-llm/` 规范位置;目录无法创建/拒绝写入时 fail-closed——append 失败返回 undefined,由调用方拒绝裁决,不回退包根、不搬家;open 阶段错误允许同路径重试一次,写后错误不重试)
│ ├─ runtime-stores.ts 80 启动期持久化存储装载(history / learning / latency),在 apply() 内 setRuntimeStateDir() 之后
│ ├─ session-introspect.ts 78 只读会话内省与倒计时动作:会话事件/权限服务派生值,无模块态、无文件、无审计副作用
│ ├─ shell.ts 3712 bash/pwsh 词法分解 + 整行熔断 + 逐段静态分类(最大单文件)
│ ├─ symlink.ts 182 符号链接创建与目标校验
│ ├─ tool-stats.ts 96 工具调用统计收集
│ ├─ trust.ts 307 web 路由信任平面(loopback/LAN 边界、Host 伪造防护、在线端点 URL 校验)
│ └─ trusted-intent.ts 260 受信用户意图窗口:哪些用户消息与 ask_user_question 作答构成当前调用的授权证据
└─ client/
├─ index.ts React 客户端主体 3093 行(设置卡 8 子卡/面板增强/应答 watcher 装配/浮动按钮/CSS)
├─ approvals/ 应答模块(0.0.12 起;0.0.16 起单协议——remote 源适配 + shared 协议无关核心;rc.2 legacy/feature 已删)
│ ├─ remote.ts 231
│ └─ shared.ts 607
├─ auto-icon.ts 权限菜单图标 + Auto 风险确认弹窗 672 行
├─ locale.ts zh/en 双语 576 行
├─ human-gate.ts 浮层「人工出手率」派生(HUMAN_SOURCES 与 scripts/friction-report 同源)
├─ host-keys.ts 49 仅配置文件可配键的只读渲染行(`HOST_ONLY_KEYS` 单一 owner → 键名 + 生效值;纯函数,无 React 依赖)
└─ tool-chips.ts 150 工具芯片
tests/
├─ contract.test.mjs 347 例 / category.test.mjs / classifier.test.mjs / redact.test.mjs
├─ history-robust.test.mjs / audit.test.mjs
├─ approvals-protocol.test.mjs 32 例 / contract-devloop.test.mjs / trusted-dsh-subpaths.test.mjs / posix-platform.test.mjs
├─ friction-report.test.mjs / audit-query-format.test.mjs / permission-change.test.mjs
├─ agent-team-tools-allow.test.mjs / retired-agent-teams-spelling.test.mjs / default-allow-catalog.test.mjs / default-allow-ui.test.mjs
├─ opaque-line-target-fuse.test.mjs / changer-base-reset.test.mjs / view-reader-parity.test.mjs / cd-relative-anchor.test.mjs
├─ protected-read-credential-floor.test.mjs / protected-auto-review.test.mjs / audit-rejection-category.test.mjs
├─ docs-anchors.test.mjs / artifact-deletion-exemption.test.mjs / runtime-paths.test.mjs
├─ guard-deny-decision.test.mjs / feedback-route-write.test.mjs / history-route-clear.test.mjs
├─ runtime-write-fallback.test.mjs(规范目录拒写:open 阶段失败继续 fail-closed 不搬家、非位置类错误不重试、重试集仅含 open 阶段错误、写失败阶梯重试同一路径且无 relocation 步骤)
├─ audit-shell-symlink-guard.test.mjs(shell 操作数提取 + 收窄型逃逸裁定 + 等价拼写族 + 负向控制)
├─ perf-settings-rules-parse.test.mjs / perf-poll-backoff.test.mjs / perf-scan-throttle.test.mjs (客户端开销:单次解析、轮询退避、扫描节流)
├─ trusted-intent-window.test.mjs(授权证据窗口溢出计数:slot cap/去重/预算交互、拒因 note 两分支、trusted-intents 事件量化 overflowed 标志)/ client-human-gate.test.mjs(浮层人工出手率:与 friction-report 同源名单、空窗口不作零声称、round 边界、中英三键、bundle 装配锚)
├─ loop-guard.test.mjs(循环键稳定性/回退、严格连续+fire-and-reset 状态机、FIFO 64、阈值钳制与 resolveConfig 映射)/ loop-guard-wiring.test.mjs(四站点成对锚、allowlist 与 rule-allow 豁免负向切片、跨面标记读位置与 one-shot、pinned 形状先于 learnAttempt、门不写 history 不碰熔断、disposal/sweep 有界、audit-query 渲染)
├─ host-lines.test.mjs(宿主承诺线:承诺表逐 tuple 一行 + 键名即线族、精确钉版、装错线/读错档位/门禁放宽的反向对照、补丁组合表解析;本机安装线驱动真实 permission-presets 服务,装的不是承诺线即判红)
├─ host-surface-coverage.mjs(契约面读数规则:具名不可评估行 + 评估行数下限 + 两个控制项未跑即失败)+ host-surface-coverage-collapse.test.mjs(塌缩读数、反向控制、下限独立生效、装配锚)
└─ 合计 232 个 tests/*.test.mjs(node --test 全绿基线)
scripts/
├─ build.sh (DSH 源码仓库布局)tsc 编译 src→lib
├─ clean-lib.mjs 构建前清空 lib/(tsc 不删除已删源的旧产物)
├─ gate.mjs 本地发布前门禁(类型/构建/全量测试/数字/锚点/打包冒烟/dsh 装配断言)
├─ check-anchors.mjs docs 源码锚点校验器(符号/字面量锚;无法解析的 span 亦判失败,默认只读)
├─ check-doc-numbers.mjs 文档里的测试文件数与用例数核对器(默认只读;--observed 接实跑值)
├─ sync-doc-numbers.mjs 把各声明点按实测值就地改写(配套核对器,避免手改漏项)
├─ audit-query.mjs 审计查询 CLI(decision 行 + 按 type 渲染的观测事件行)
├─ friction-report.mjs 摩擦报告 CLI(面板介入率 / 倒计时结算率 / 翻案交叉表 / 评审通道落定率 / 无人值守窗口判据 + 退出码)
├─ mock-reviewer.mjs 本地 mock 评审器(127.0.0.1:18777,确定性 ALLOW/MEDIUM)
├─ link-dsh-deps.cjs 把 node_modules/@deepseek-ai/* 重链到已安装 dsh 的同名包(构建期类型与运行期解析同源)
├─ test-host-lines.mjs 宿主承诺线可复跑入口(os.tmpdir 前缀按线装出真实 dsh-* 全家:承诺线每个 tuple 一条 = 0.2.0-rc.2 / 0.2.1-alpha.1(均实测 modern 形态,驱动能力探测与同签名迁移,键名写 tuple、序数留在 version);`HOST_LINES` 每次只列用户实际在跑的宿主)
└─ link-client-packs.cjs 把 client 构建期包(primitives/slots)链到 npm pack 解包目录
verify-*.mjs 3 个运行时验证脚本(载波组合栅栏;settings/端到端需 --url/--cookie-file 会话)14.2 构建 → 产物
host(tsc):src/index.ts + src/auto/* → lib/index.js + lib/auto/*。本机为 npm 全局安装、无 packages/vendor 布局,build.sh 探针会失败 → 直接 node_modules/.bin/tsc -p tsconfig.json。
client(tsdown):src/client/index.ts → lib/client.js(CJS / browser platform),banner 包 window.__ModuleLoader__.load({id, factory});声明依赖(react/slots/primitives/runtime)外部化,其余打包。文件头保留 dsh-auto-mode 的 MIT 致谢。
bundle 层(patch.yml):权限预设 auto-approval = danger-full-access + approval: ask(host 名 Auto approval;禁飙到 never,自有档 effective-never 由插件运行时归一回 ask)。宿主 >= 0.1.6 的 shipped patch 不得静态定义 auto preset(该名归上游 auto-review 运行期 registerAuto 注册,静态配置即 boot 失败);本插件只定义/接管 auto-approval,与上游的 auto 档可同时启用。bundle 不再覆盖安全行为开关(autoSwitchPolicyToAsk 已退役并保留为 host-owned no-op);humanOnlyList 保持代码默认空。
exports:.(lib/index.js + types)、./client(lib/client.js + types contact)、./package.json、./locale/*.json(子路径通配,契约测试对通配断言"至少匹配到一个真实文件");peerDeps 覆盖 cordis ≥4.0.1<5、dsh-llm / dsh-tools / dsh-session / dsh-permission-presets / dsh-user-approval >=0.2.0-rc.2 <2 || >=0.2.1-alpha.1 <2、schemastery ^3.18.0 —— 承诺每个 tuple 一条线:0.2.0-rc.2 与 0.2.1-alpha.1 均完整支持;宿主线跟着用户实际在跑的宿主走,上游进入新 tuple 的 alpha 时再逐条追加。peer 区间是安装准入面:区间内未测的线不受支持,上界 <2 只是范围上界;区间按承诺 tuple 分臂,每条承诺线由承载它自己 tuple 的那一臂放行,不依赖门禁的 includePrerelease 标志;auto 旧机器值别名与 legacy/unknown 能力分支已随下限抬升移除。src/auto/preset-migration.ts 承载多信号宿主能力探测(modern / unknown,未识别即 fail-closed)、raw identity gate、同签名懒迁移与自有档 spec enforcement。
行为化支架新增登记(191 files / 1747 cases 时点):
tests/helpers/host-ctx.mjs(基础设施,非用例)+tests/h2-artifact-provenance-behavior.test.mjs+tests/h9-loop-guard-behavior.test.mjs+tests/m1-feedback-timeout-routing.test.mjs。 载波原生化新增登记:tests/helpers/carrier-route.mjs(Fetch 注册表驱动夹具,基础设施非用例)+tests/trusted-fetch-request.test.mjs(Fetch 信任判定契约;原isTrustedRequest的权威侧用例迁入此文件)。 运行时验证脚本修正登记:tests/verify-auth-cases.test.mjs(以本地假 carrier 模型钉scripts/verify-auth.mjs的组合栅栏期望:无会话回环 401 / 伪造 403 / 会话回环 200)。