@twinsearth/fang-dsh-plugin 0.0.0-stage → 3.3.4

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.
Files changed (144) hide show
  1. package/CLA.md +79 -0
  2. package/LICENSE-COMMERCIAL +78 -0
  3. package/LICENSE-CORE +661 -0
  4. package/LICENSE-SDK +21 -0
  5. package/LICENSES/cordis-MIT.txt +39 -0
  6. package/NOTICE +95 -0
  7. package/README.md +158 -2
  8. package/client.js +7287 -0
  9. package/cordis.patch.yml +163 -0
  10. package/defaults/umbrella-rules.yaml +113 -0
  11. package/docs/CONTRACT-INTEROP.md +77 -0
  12. package/docs/CRASH-SAFETY.md +69 -0
  13. package/docs/DECISION-RELAY.md +46 -0
  14. package/docs/DSH-ARCHITECTURE-MAP.md +73 -0
  15. package/docs/FORK-SEED.md +64 -0
  16. package/docs/MAIN-CITY-GATE.md +58 -0
  17. package/docs/OVERLAY-MASTER-SWITCH.md +35 -0
  18. package/docs/PACKAGE-RENAME-v3.3.3.md +40 -0
  19. package/docs/PM-DECISION-POLICY.md +61 -0
  20. package/docs/WORKFLOW-UI.md +86 -0
  21. package/icon.svg +8 -0
  22. package/locale/en.json +6 -0
  23. package/locale/zh.json +6 -0
  24. package/package.json +71 -4
  25. package/sdk/README.md +65 -0
  26. package/sdk/examples/status-badge/README.md +16 -0
  27. package/sdk/examples/status-badge/client.js +60 -0
  28. package/sdk/examples/status-badge/cordis.patch.yml +7 -0
  29. package/sdk/examples/status-badge/index.js +12 -0
  30. package/sdk/examples/status-badge/package.json +24 -0
  31. package/sdk/templates/plugin/README.md +36 -0
  32. package/sdk/templates/plugin/client.js +35 -0
  33. package/sdk/templates/plugin/cordis.patch.yml +8 -0
  34. package/sdk/templates/plugin/icon.svg +5 -0
  35. package/sdk/templates/plugin/index.js +23 -0
  36. package/sdk/templates/plugin/locale/en.json +6 -0
  37. package/sdk/templates/plugin/package.json +36 -0
  38. package/src/compose.mjs +67 -0
  39. package/src/contract/VENDOR.json +16 -0
  40. package/src/contract/client.js +93 -0
  41. package/src/contract/constants.js +94 -0
  42. package/src/contract/envelope.js +83 -0
  43. package/src/contract/index.js +20 -0
  44. package/src/contract/negotiate.js +106 -0
  45. package/src/contract/relay.js +223 -0
  46. package/src/contract/server.js +77 -0
  47. package/src/contract/transports.js +319 -0
  48. package/src/index.mjs +11 -0
  49. package/src/kernel/core.mjs +100 -0
  50. package/src/kernel/extensions.mjs +61 -0
  51. package/src/kernel/fsx.mjs +349 -0
  52. package/src/kernel/index.mjs +21 -0
  53. package/src/kernel/ledger.mjs +94 -0
  54. package/src/kernel/paths.mjs +182 -0
  55. package/src/kernel/role.mjs +68 -0
  56. package/src/kernel/rounds.mjs +172 -0
  57. package/src/kernel/schema.mjs +5 -0
  58. package/src/kernel/types.mjs +266 -0
  59. package/src/kernel/vendor/cosmokit.mjs +421 -0
  60. package/src/kernel/vendor/schemastery.mjs +638 -0
  61. package/src/lib/adapter-client.mjs +383 -0
  62. package/src/lib/adapter-protocol.mjs +243 -0
  63. package/src/lib/ai-secret-store.mjs +202 -0
  64. package/src/lib/boot-guard.mjs +186 -0
  65. package/src/lib/branch-store.mjs +84 -0
  66. package/src/lib/branch.mjs +74 -0
  67. package/src/lib/bridge-client.mjs +133 -0
  68. package/src/lib/broker-adapter.mjs +67 -0
  69. package/src/lib/broker.mjs +45 -0
  70. package/src/lib/business-producers.mjs +109 -0
  71. package/src/lib/command-cache.mjs +209 -0
  72. package/src/lib/compat.mjs +170 -0
  73. package/src/lib/composer-journal.mjs +128 -0
  74. package/src/lib/container/index.mjs +806 -0
  75. package/src/lib/decision-events.mjs +129 -0
  76. package/src/lib/decision-ingest-client.mjs +41 -0
  77. package/src/lib/decision-outbox.mjs +129 -0
  78. package/src/lib/decision-policy.mjs +52 -0
  79. package/src/lib/default-essence.mjs +61 -0
  80. package/src/lib/desktop-launch.mjs +138 -0
  81. package/src/lib/essence.mjs +1211 -0
  82. package/src/lib/fork-client.mjs +410 -0
  83. package/src/lib/fork-config-lock.mjs +166 -0
  84. package/src/lib/fork-seed.mjs +304 -0
  85. package/src/lib/fork-sessions.mjs +183 -0
  86. package/src/lib/fork-supervision-settings.mjs +58 -0
  87. package/src/lib/fork-supervisor.mjs +122 -0
  88. package/src/lib/fs-guard.mjs +28 -0
  89. package/src/lib/http-auth.mjs +162 -0
  90. package/src/lib/idle-audit.mjs +178 -0
  91. package/src/lib/interaction-poke.mjs +61 -0
  92. package/src/lib/main-gate.mjs +579 -0
  93. package/src/lib/mirror-etag.mjs +92 -0
  94. package/src/lib/mirror-official-source.mjs +93 -0
  95. package/src/lib/mirror.mjs +478 -0
  96. package/src/lib/mother-link.mjs +156 -0
  97. package/src/lib/mutex.mjs +31 -0
  98. package/src/lib/permissions.mjs +115 -0
  99. package/src/lib/pnpm-store.mjs +189 -0
  100. package/src/lib/preferences.mjs +212 -0
  101. package/src/lib/producer-contract.mjs +162 -0
  102. package/src/lib/reflow.mjs +41 -0
  103. package/src/lib/remote.mjs +408 -0
  104. package/src/lib/restart-contract.mjs +752 -0
  105. package/src/lib/roots.mjs +30 -0
  106. package/src/lib/rule-registry.mjs +1127 -0
  107. package/src/lib/runtime-capture.mjs +307 -0
  108. package/src/lib/semaphore.mjs +34 -0
  109. package/src/lib/session-bundle.mjs +138 -0
  110. package/src/lib/session-format.mjs +672 -0
  111. package/src/lib/sse-parser.mjs +102 -0
  112. package/src/lib/ssrf-guard.mjs +170 -0
  113. package/src/lib/status-store.mjs +257 -0
  114. package/src/lib/task-handle.mjs +622 -0
  115. package/src/lib/ui-actions.mjs +55 -0
  116. package/src/lib/umbrella.mjs +1661 -0
  117. package/src/lib/upgrade-coordinator.mjs +107 -0
  118. package/src/lib/upgrade-status.mjs +43 -0
  119. package/src/plugins/adapter.mjs +1468 -0
  120. package/src/plugins/approver.mjs +1210 -0
  121. package/src/plugins/auditor.mjs +330 -0
  122. package/src/plugins/buffer-keeper.mjs +522 -0
  123. package/src/plugins/decision-center.mjs +2581 -0
  124. package/src/plugins/forker.mjs +1610 -0
  125. package/src/plugins/healer.mjs +702 -0
  126. package/src/plugins/hot-reloader.mjs +274 -0
  127. package/src/plugins/imports.mjs +247 -0
  128. package/src/plugins/orchestrator.mjs +3938 -0
  129. package/src/plugins/restart-guard.mjs +1022 -0
  130. package/src/plugins/router.mjs +714 -0
  131. package/src/plugins/scorer.mjs +661 -0
  132. package/src/plugins/session-bridge.mjs +166 -0
  133. package/src/plugins/session-catalog.mjs +771 -0
  134. package/src/plugins/session-router.mjs +125 -0
  135. package/src/plugins/session-sync.mjs +171 -0
  136. package/src/plugins/umbrella.mjs +419 -0
  137. package/tools/boot-guard.mjs +95 -0
  138. package/tools/decision-ingest.mjs +53 -0
  139. package/tools/desktop-launch.mjs +71 -0
  140. package/tools/fangctl.mjs +408 -0
  141. package/tools/gate/main-city.mjs +204 -0
  142. package/tools/mcp/server.mjs +121 -0
  143. package/tools/mcp/tools.mjs +65 -0
  144. package/tools/recover-queue.mjs +133 -0
@@ -0,0 +1,39 @@
1
+ # Third-party licenses
2
+
3
+ This directory contains license texts for third-party components included in this repository.
4
+
5
+ ## cordis (schemastery, cosmokit) — MIT
6
+
7
+ Upstream project: https://github.com/shigma/cordis
8
+ Copyright (c) 2022-present Shigma and cordis contributors.
9
+
10
+ Files vendored into `src/kernel/vendor/`:
11
+
12
+ - `schemastery.mjs` — runtime config schema library (import paths rewritten to a sibling file)
13
+ - `cosmokit.mjs` — utility library used by schemastery
14
+
15
+ ```
16
+ MIT License
17
+
18
+ Copyright (c) 2022-present Shigma and cordis contributors
19
+
20
+ Permission is hereby granted, free of charge, to any person obtaining a copy
21
+ of this software and associated documentation files (the "Software"), to deal
22
+ in the Software without restriction, including without limitation the rights
23
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
24
+ copies of the Software, and to permit persons to whom the Software is
25
+ furnished to do so, subject to the following conditions:
26
+
27
+ The above copyright notice and this permission notice shall be included in all
28
+ copies or substantial portions of the Software.
29
+
30
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
34
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
35
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
36
+ SOFTWARE.
37
+ ```
38
+
39
+ > If the upstream license changes, the upstream `LICENSE` at the URL above governs.
package/NOTICE ADDED
@@ -0,0 +1,95 @@
1
+ # dsh-Fang — NOTICE(许可边界地图)
2
+
3
+ > 本文件说明仓库中每个目录/文件适用哪一份许可证。**发生冲突时,以本文件与对应目录内
4
+ > SPDX 头为准;没有列出的目录默认随其最近祖先目录的许可证。**
5
+ >
6
+ > 仓库版本:v2.1.0(2026-11-01)。许可证分层方案见 [docs/LICENSING.md](docs/LICENSING.md)。
7
+
8
+ ---
9
+
10
+ ## 1. 分层总表
11
+
12
+ | 层 | 路径 | 许可证 | SPDX |
13
+ |---|---|---|---|
14
+ | **核心层**(AGPL-3.0) | `src/kernel/` · `src/plugins/` · `src/lib/` · `probes/` · `client.js` · `cordis.patch.yml` · `cordis.patch.single-row.yml` · `test/` · `tools/e2e.mjs` · `src/index.mjs` · `src/compose.mjs` | GNU Affero GPL v3.0 或更高版本 | `AGPL-3.0-or-later` |
15
+ | **生态层**(MIT) | `sdk/` · `tools/fangctl.mjs` · 本仓库中标注 MIT 的示例/模板 | MIT | `MIT` |
16
+ | **商业层**(闭源) | `relay-server/` · `enterprise/` | 商业许可(见 `LICENSE-COMMERCIAL`) | `LicenseRef-dsh-Fang-Commercial` |
17
+ | **第三方**(保留原协议) | `src/kernel/vendor/schemastery.mjs` · `src/kernel/vendor/cosmokit.mjs` | MIT(上游 cordis 项目) | `MIT` |
18
+
19
+ ### 1.1 核心层文件清单(AGPL-3.0-or-later)
20
+
21
+ ```
22
+ src/index.mjs
23
+ src/compose.mjs
24
+ src/kernel/*.mjs (含 ledger/paths/fsx/rounds/role/core/types/schema/index/…)
25
+ src/kernel/vendor/* ← 例外:第三方 MIT,见 §3
26
+ src/plugins/*.mjs (orchestrator/forker/restart-guard/adapter/scorer/router/
27
+ healer/approver/hot-reloader/buffer-keeper/auditor/session-catalog)
28
+ src/lib/remote.mjs
29
+ src/lib/container/index.mjs
30
+ src/lib/session-format.mjs
31
+ probes/*
32
+ client.js
33
+ cordis.patch.yml
34
+ cordis.patch.single-row.yml
35
+ test/** (除非文件头另有声明)
36
+ tools/e2e.mjs
37
+ ```
38
+
39
+ ### 1.2 生态层文件清单(MIT)
40
+
41
+ ```
42
+ sdk/**
43
+ tools/fangctl.mjs
44
+ ```
45
+
46
+ ### 1.3 商业层
47
+
48
+ ```
49
+ relay-server/** 商业闭源(Relay 服务器:联合开发/云备份/Token API/团队协作/SLA)
50
+ enterprise/** 商业闭源(企业功能:SSO、团队权限、审计导出等)
51
+ ```
52
+
53
+ 这些目录**不随开源分发包一起发布**;其中代码(若存在)不是开源软件,不得复制进 MIT/AGPL 目录。
54
+
55
+ ---
56
+
57
+ ## 2. 为什么这样分
58
+
59
+ - **核心层 AGPL-3.0**:防止云厂商把瓮城编排器/派生器/红线守卫/Adapter 直接包装成托管服务而不回馈源码。
60
+ AGPL 的网络传染性覆盖"只提供服务、不分发副本"的规避路径。
61
+ - **生态层 MIT**:插件 SDK、CLI、模板、示例可以零摩擦被任何项目使用、修改、二次分发,
62
+ 鼓励第三方写插件、做发行版、集成进自己的工具链。
63
+ - **商业层闭源**:Relay 服务器与团队/企业功能是**从第一天就设计为商业功能**的服务,不是把免费功能上墙。
64
+
65
+ > 纪律:**永远不要把已经以 AGPL/MIT 发布的功能挪到付费层。** 违反这条,社区信任无法修复。
66
+
67
+ ---
68
+
69
+ ## 3. 第三方组件
70
+
71
+ 本仓库不打包任何 DSH 运行时依赖;以下文件是从上游复制并改写的 vendored 代码,保留上游 MIT 许可:
72
+
73
+ | 文件 | 上游 | 许可 | 说明 |
74
+ |---|---|---|---|
75
+ | `src/kernel/vendor/schemastery.mjs` | cordis(Shigma) | MIT | 运行时配置 schema 校验库;仅把 import 路径改写为同目录文件名 |
76
+ | `src/kernel/vendor/cosmokit.mjs` | cordis(Shigma) | MIT | schemastery 的依赖工具库 |
77
+
78
+ 上游版权声明保留在各文件头部;MIT 全文见 upstream 项目
79
+ <https://github.com/shigma/cordis>(`LICENSE`)。如上游许可发生变化,以 `LICENSES/cordis-MIT.txt` 为准。
80
+
81
+ `probes/AppContainerHost.cs`、`probes/*.ps1` 为本项目自有代码(AGPL 核心层)。
82
+
83
+ ---
84
+
85
+ ## 4. 贡献
86
+
87
+ 所有贡献按 [CLA.md](CLA.md) 授权给项目维护者:维护者获得**永久、全球、非独占、免版税、不可撤销**的
88
+ 再许可权利(含以商业闭源协议再许可的权利),这是双许可证(AGPL + 商业授权)路径成立的前提。
89
+
90
+ ---
91
+
92
+ ## 5. 商业授权
93
+
94
+ 需要在不遵守 AGPL-3.0 的条件下使用核心层(例如闭源托管服务、OEM 集成)时,
95
+ 请联系维护者获取商业许可:`licensing@example.com` **(占位,发布前替换为真实联系方式)**。
package/README.md CHANGED
@@ -1,3 +1,159 @@
1
- # Temporary Holding Version
1
+ [![CI](https://github.com/TwinsEarth/dsh-fang/actions/workflows/ci.yml/badge.svg)](https://github.com/TwinsEarth/dsh-fang/actions/workflows/ci.yml)
2
+ [![DSH](https://img.shields.io/badge/DSH-0.2.2--rc.1-4D6BFE?logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness)
3
+ [![License: AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-blue.svg)](LICENSE-CORE)
4
+ [![SDK: MIT](https://img.shields.io/badge/SDK-MIT-green.svg)](LICENSE-SDK)
5
+ [![npm latest](https://img.shields.io/npm/v/@twinsearth/fang-dsh-plugin.svg?label=npm&color=red)](https://www.npmjs.com/package/@twinsearth/fang-dsh-plugin)
2
6
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
7
+
8
+ # 瓮城:DSH 的第一台虚拟机!
9
+
10
+ > Dsh-瓮城,诞生于一群热爱折腾、也被折腾过无数次的极客之手。
11
+ > 我们深知在「自进化 AI」时代,**「如何安全地尝试新事物」比「新事物本身」更重要**。
12
+
13
+ ## 如果你是以下三类人,瓮城就是为你量身定制的
14
+
15
+ ### 1. 插件开发狂魔
16
+ 每天要写 N 个新插件、改几百次代码。以前改一次重启一次 DSH;现在在瓮城里随便热更新,坏了直接秒回滚。
17
+
18
+ ### 2. 多任务并发狂
19
+ 一个窗口跑数据分析,一个窗口写爬虫,一个窗口做长周期测试。瓮城让你像开浏览器一样「多开不崩」,并且各跑各的绝对隔离。
20
+
21
+ ### 3. 安全焦虑症患者
22
+ 不敢把客户端交给第三方插件,怕乱删文件、怕被盗取 API Key。瓮城的审核系统和独立沙箱,把危险代码安排得明明白白。
23
+
24
+ ---
25
+
26
+ ## 它怎么做到
27
+
28
+ **母体大脑 + 分身器官 + 容器兜底**:
29
+
30
+ - 一个只读母体,每个任务派生一个用完即弃的子 dsh-Web;
31
+ - 开发都在分身里,母体只在「提升」时被显式更新;
32
+ - 崩溃不扩散、污染不残留、插件不串味。
33
+
34
+ > 技术定位:**DeepSeek Harness 的第一台虚拟机**。
35
+ > 用 dsh-Web 当瓮城完成风险阻隔与审批(Beta),把 DeepSeek Harness 当主城保存原样不变(稳定版)。
36
+
37
+ ---
38
+
39
+ > v2.3.1 把「瓮城」做进 Web UI(左侧导航 + 3:7 分屏控制面板 + 双击派生 + 母体/分身会话继续开发);
40
+ > v2.0.0 按三层拓扑重新部署,
41
+ > 新增 **Adapter** 跨进程桥、任务语义、端口池、干净模板、Router 双阶段、评分环境阈值、
42
+ > 审计汇总、容器执行与申报写代理、商用钩子。
43
+
44
+ ## 当前状态(2026-11-01,v2.3.1)
45
+
46
+ - UI:左侧导航「瓮城」(红色城门图标)· 中列控制面板 **3:7 分屏**(左=母体项目&会话,右=分身项目&会话,两栏独立滚动)· dock 徽标双击快速派生;
47
+ - 测试:**292 tests / 291 pass / 0 fail / 1 skip**(skip = `FANG_CONTAINER_LIVE=1` 手动容器探针,已单独跑 **9/9**);
48
+ - 实机端到端:`node tools/e2e.mjs` → **41/41 checks passed**(临时 `$DSH_HOME` + 真实 dsh 母体 + 真分身:
49
+ 派生 → Adapter 握手 → 角色矩阵 → 任务/分身会话标题 → 归档 → 审计链 → 回收);
50
+ - desktop profile 已挂 `@twinsearth/fang-dsh-plugin` bundle 层(通过 `link:` 指到本仓库,包版本 2.3.1);
51
+ - ✅ v2.1.0 的「瓮城」UI 已在运行中的宿主生效(活体实测):`sidebar.panellist` 有 `id=fang`(order 90, active)、
52
+ `main` 的 key `fang` 已注册、dock 的 `fang-badge` active;宿主行 `include:fang-session-catalog` 已加载。
53
+ - 🔧 v2.3.1(3:7 分屏面板 + 分身会话 API + 会话原生标题 + 僵尸防护)代码与测试已就绪;
54
+ 宿主侧需**重启**加载、页面刷新即可看到新布局与新标题。
55
+ 交付与证据见 [docs/v2.3.1-交付报告.md](docs/v2.3.1-交付报告.md) 与 [docs/UI-瓮城入口.md](docs/UI-瓮城入口.md)。
56
+ - ✅ v2.3.1 已发布:GitHub Release 附 `dsh-fang-2.3.1.tgz` + `manifest.json`,CI/compat 全绿;
57
+ - ⏳ npm:`@twinsearth/fang-dsh-plugin@2.3.1` 构建与本地 healthz 已就绪,等待 npm 组织 `@twinsearth` 创建后发布;
58
+ - 🔒 **main 为 PR-only**:直接 push 会被拒绝;变更走分支 + PR + 维护者手动审核合并(见 [CONTRIBUTING](CONTRIBUTING.md))。
59
+
60
+ ---
61
+
62
+ ## v2.1.0 新增入口
63
+
64
+ - 左侧导航「**瓮城**」:红色城门图标(`sidebar.panellist`);单击 → 中列控制面板;双击图标 → 快速派生并打开分身标签页。
65
+ - 控制面板(`main` key=`fang`):任务列表 + 母体已有会话列表,**选中 → 确认条 → 继续开发**(会话走 ≤32KiB lineage 种子)。
66
+ - 输入框 dock 徽标:单击开面板,双击快速派生(可发现性提示在 tooltip 里)。
67
+
68
+ 规格与平台约束见 [docs/UI-瓮城入口.md](docs/UI-瓮城入口.md);交付记录见
69
+ [docs/v2.3.1-交付报告.md](docs/v2.3.1-交付报告.md)。
70
+
71
+ ## 快速开始
72
+
73
+ ```powershell
74
+ git clone https://github.com/TwinsEarth/dsh-fang.git && cd dsh-fang
75
+
76
+ # 1. 离线自检(不修改任何东西)
77
+ node tools/fangctl.mjs doctor
78
+ node tools/fangctl.mjs status
79
+
80
+ # 2. 全量单测(node v24 不接受目录参数)
81
+ node --test --test-concurrency=1 "test/*.test.mjs"
82
+
83
+ # 3. 实机端到端验收(临时 $DSH_HOME + 真实 dsh 母体 + 真分身,不碰你的 profile)
84
+ node tools/e2e.mjs
85
+
86
+ # 4. 安装到当前 profile(DSH 内 plugin_manager install_bundle,target = 本目录)
87
+ ```
88
+
89
+ 安装后刷新页面:输入框下方出现「瓮城 N/M」徽标,点「门户」进入 `/fang/panel`:
90
+
91
+ - **派生新任务**:端口池确定性分配(18000–18100)、独立 `$DSH_HOME`、干净模板、Adapter 握手后 `ready`;
92
+ - **打开**:带 token 的分身标签页;
93
+ - **归档**:先让分身 flush 缓冲并落审计,再 kill 进程树 + 安全删除 home(junction 只解链);
94
+ - **提升插件…**:跨进程取源码 → 母体阈值复核 → Router 初判 → 审批 → A/B 备份 → 母体 staging。
95
+
96
+ ---
97
+
98
+ ## 十二个插件(部署矩阵)
99
+
100
+ | 行 id | 模块 | 母体 | 分身 | 职责 | 服务 key |
101
+ |---|---|---|---|---|---|
102
+ | `fang-orchestrator` | orchestrator.mjs | ✅ | ❌ | 任务语义:create/status/promote/archive、门户 | `fang` |
103
+ | `fang-forker` | forker.mjs | ✅ | ❌ | 端口池、spawn/kill、junction、URL 解析 | `fangForker` |
104
+ | `fang-restart-guard` | restart-guard.mjs | ✅ | ❌ | 母体重启唯一闸门(只决策/审批/审计) | `fangRestart` |
105
+ | `fang-scorer` | scorer.mjs | ✅(复核) | ✅(主) | 静态 A–E + 动作灯色,阈值按环境分叉 | `fangScorer` |
106
+ | `fang-umbrella` | umbrella.mjs | ✅ | ✅ | 保护伞:A–E 下限抬高动作灯色 + allow/mark/ask/delegate/deny | `fangUmbrella` |
107
+ | `fang-router` | router.mjs | ✅(初判) | ✅(复核) | decide / confirm(只升不降)/ 容器分支 | `fangRouter` |
108
+ | `fang-healer` | healer.mjs | ❌ | ✅ | 自检/证据/G1–G12/补丁建议(不放行) | `fangHealer` |
109
+ | `fang-approver` | approver.mjs | ✅(汇总) | ✅(本地) | 待批队列/A-B/监控/回滚 | `fangApprover` |
110
+ | `fang-hot-reloader` | hot-reloader.mjs | ❌ | ✅ | 真 ESM 换版 + 健康窗 | `fangHotReloader` |
111
+ | `fang-buffer-keeper` | buffer-keeper.mjs | ❌ | ✅ | 三态监视 + 容器申报写代理 | `fangBuffer` |
112
+ | `fang-auditor` | auditor.mjs | ✅ | ✅ | 双侧哈希链审计 + aggregate | `fangAudit` |
113
+ | `fang-adapter` | adapter.mjs | ❌ | ✅ | 跨进程桥:HTTP 控制/状态/审批/审计 | `fangAdapter` |
114
+
115
+ 契约:[CONTRACTS-V2.md](docs/CONTRACTS-V2.md) · 协议:[PROTOCOL-V2.md](docs/PROTOCOL-V2.md) ·
116
+ 架构:[ARCHITECTURE-V2.md](docs/ARCHITECTURE-V2.md) · 变更:[CHANGELOG.md](docs/CHANGELOG.md)。
117
+ 发布:[RULES-BASELINE.md](docs/RULES-BASELINE.md)(规则基线) · [RELEASE-MIRROR.md](docs/RELEASE-MIRROR.md)(公共/私有仓发布管理)。
118
+
119
+ ---
120
+
121
+ ## 安全与边界
122
+
123
+ - 角色矩阵由 `src/kernel/role.mjs` 单点决定;`DSH_FANG_ROLE=fork` 由 forker 注入,分身无法自升为母体。
124
+ - 数据目录:`$DSH_HOME/fang/<profileTag>/`;分身各用自己的 `$DSH_HOME`,天然隔离。
125
+ - 分身 `node_modules` 指向母版 junction;删除必须走 kernel `removeTree()`(junction 只解链)。
126
+ - 审计是哈希链 `sha256(canonical(record)+prevHash)`,可发现改字段/删行/换序/伪造追加。
127
+ - 红灯不可被自动批准绕过:`strictRedLine=true` 时 `risk==='red'` 必须显式 `decide()`;无人应答 fail-closed。
128
+ - 容器写代理:容器内插件无直接写权限,写请求必须落在 bufferRoot 内 + 命中申报名单 + ≤1MB。
129
+ - `parseWebUrl` 只认带 `?token=` 的启动行——裸地址 401。
130
+
131
+ ---
132
+
133
+ ## 已知限制(v2.0.0,诚实清单)
134
+
135
+ AppContainer **真实执行**需 `FANG_CONTAINER_LIVE=1` 手动探针(CI 只覆盖降级路径);
136
+ Job Object 层未接入;分身会话迁移/跨宿主接管未做;Relay 付费五项只有钩子与配置开关。
137
+ v1 运行中的宿主缓存旧模块,v2 生效需母体重启(红线:由用户确认执行)。
138
+ 完整清单见 [ARCHITECTURE-V2.md](docs/ARCHITECTURE-V2.md) §8。
139
+
140
+ ---
141
+
142
+ ## 许可证(分层)
143
+
144
+ | 层 | 路径 | 协议 | 你能做什么 |
145
+ |---|---|---|---|
146
+ | **核心层** | `src/` · `probes/` · `client.js` · `cordis.patch*.yml` · `test/` · `tools/e2e.mjs` | **AGPL-3.0-or-later** | 自由使用/修改;**对外提供网络服务时须按 AGPL 提供源码** |
147
+ | **生态层** | `sdk/` · `tools/fangctl.mjs` | **MIT** | 零摩擦复制、修改、二次分发、闭源集成 |
148
+ | **商业层** | `relay-server/` · `enterprise/` | 商业许可(闭源) | 需购买许可;不随开源分发包 |
149
+
150
+ - 逐目录许可地图:[NOTICE](NOTICE);方案与边界分析:[docs/LICENSING.md](docs/LICENSING.md)。
151
+ - 许可全文:[LICENSE-CORE](LICENSE-CORE) · [LICENSE-SDK](LICENSE-SDK) · [LICENSE-COMMERCIAL](LICENSE-COMMERCIAL)。
152
+ - 贡献前请阅读并签署 [CLA.md](CLA.md)(用于双许可证与商业授权)。
153
+ - 商业授权/OEM:`licensing@example.com`(占位,发布前替换)。
154
+ - 本仓库不含第三方运行时依赖;vendored schemastery/cosmokit 保留上游 MIT(见 [LICENSES/cordis-MIT.txt](LICENSES/cordis-MIT.txt))。
155
+ - 所有源码文件头带 `SPDX-License-Identifier`;`test/licensing.test.mjs` 防止分层漂移。
156
+
157
+ ---
158
+
159
+ [![](https://img.shields.io/badge/powered_by-dsh-4D6BFE?style=flat-square&logo=deepseek&logoColor=white)](https://github.com/deepseek-ai/deepseek-harness)