@dsh-edge/dsh-edge-agent 0.1.1 → 0.1.3

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/CHANGELOG.md CHANGED
@@ -9,9 +9,84 @@
9
9
 
10
10
  ---
11
11
 
12
- ## [0.1.1] — 2026-11-10
12
+ ## [0.1.3] — 2026-11-12
13
13
 
14
- **首次发布到 npm registry。** 506 次提交、2026-08-18 → 2026-11-10。
14
+ **修掉「边缘模式发请求卡住」,并把发版前置条件变成第 29 道门禁。** 2026-11-11 → 2026-11-12。
15
+
16
+ ### 行为修复:边缘模式「发请求卡住」
17
+
18
+ > ⚠️ **0.1.2 不含这个修复**(实测拆包确认:0.1.2 的 `input-guard.js` 不含
19
+ > `isLocalPoolForward` 判据,也没有 `llm-drain-deadline`)⇒ 停在 0.1.2 的用户仍会遇到;
20
+ > **本版(0.1.3)包含**。
21
+
22
+ **症状**:桌面版加载插件 → 边缘模式发请求 → 一直「等待」,LLM 调用 0 次,**不报错**。
23
+ **触发条件**:没有 `edge.json`(两池都落到 DELEGATE 转发模式)+ 宿主有可选模型 +
24
+ 边缘模式 + 同会话第二轮。
25
+
26
+ **根因**:本地池的 DELEGATE 转发回来那一趟,provider 变成了宿主的目标路由;
27
+ `input-guard` 的改道判据只认 provider 名、**不认「这是本地池自己发起的转发」**
28
+ ⇒ 那趟又被改道 ⇒ 乒乓 ⇒ 递归吃内存 ⇒ **请求根本没走到网络层** ⇒ promise 永不 settle
29
+ ⇒ 所以表现是「卡住」而不是「报错」。
30
+
31
+ **修复**(§7.190 / §7.191 / §7.192):改道判据加**转发标记**
32
+ (`__edgeLocalPoolForward`)—— 本地池自己的转发不再被改道;另加时限收口
33
+ (`llm-drain-deadline`)与「本地没配模型就取 DSH 配置的模型」。
34
+
35
+ **验证(本机 Windows 实盘,四轮独立冷启动、可复现)**:
36
+
37
+ | | 改道跳数 | 审计 `reroute` 次数 | 真实网络请求 | 收口 |
38
+ |---|---|---|---|---|
39
+ | 修复前(npm 0.1.1) | **41**(打满探针上限) | **20** | **0**(没出网) | 探针中止(≈500ms) |
40
+ | 修复后(本版构建) | **3** | **1** | REQ + RESP | ✅ 27–55ms |
41
+
42
+ 四轮的原始输出与复现步骤见 [`docs/PROGRESS.md`](docs/PROGRESS.md) §7.194。
43
+
44
+ ### 把「发版前置条件」从口头记忆变成门禁
45
+
46
+ 这一段**不改变运行时行为** —— 它改的是**发布链本身**与**文档口径**;
47
+ 本版的**行为变化**在上面的「行为修复」一节。(§7.193,2026-11-11)
48
+
49
+ #### 修掉的两处「与实际行为相反」
50
+
51
+ - **staged publishing 的上线判据**:旧文档写「`npm view <pkg> version` 返回 `0.0.0-stage`
52
+ ⇒ 还卡着」—— 实测**不是这样**:发 0.1.2 时它返回的是**上一个真实版本 `0.1.1`**。
53
+ ⇒ 正确判据是**看 `versions` 数组里有没有出现新版本**(`npm view <pkg> versions --json`)。
54
+ 拿旧判据会**误判成「已上线」**,进而提前推 tag、让 CI 撞 409。
55
+ - **trusted publisher 的前置**:旧文档只说「去包页登记 trusted publisher」,
56
+ 没写**账号必须已经开着 2FA**。npm 官方 `npm trust` 文档写明 trusted publisher 要求
57
+ **账号级 2FA**,且**不接受**勾了 bypass 的 granular token ⇒ **顺序是「先开 2FA →
58
+ 再挂 trusted publisher」**。
59
+
60
+ #### 新的第 29 道门禁:`verify:npm-readiness`
61
+
62
+ - **9 项静态断言**(全离线、只读):`publish.yml` 有 `id-token: write`、被 `v*` tag 触发、
63
+ publish 步骤 cwd 是 `dist/.npm-stage`、命令带 `--access public` / `--ignore-scripts` /
64
+ `--no-git-checks`、`--provenance` 与 `--no-provenance` 两条分支都在、有 tag↔version 断言、
65
+ 真的有 `pnpm publish`;
66
+ - **token 字面量扫描**:git 追踪的文件里不得出现 npm token 的字面量;
67
+ - **`--online`** 才查 registry 实况(匿名只读),**网络失败不算失败**;
68
+ - **机器查不了的事,如实报「查不了」**:账号 2FA 状态(CLI 实测 403)与 trusted publisher
69
+ 是否已挂(registry 无可查端点)—— 每次 CI 都打印「去哪确认、为什么机器查不了」。
70
+
71
+ ## [0.1.2] — 2026-11-11
72
+
73
+ **修三处「写的东西与实际行为不一致」,并把 README 收瘦。** 2026-08-18 → 2026-11-11。
74
+
75
+ - **包内版本头的日期与提交数**:0.1.1 那行写的是「2026-11-10 / 506 次提交」——
76
+ 两个都不是发布时的真实值(真实发布时刻是 2026-11-11 19:33)。现在只写日期区间,
77
+ 把「次提交」整个去掉:它是**移动靶**(写完没几轮就又不对了)。
78
+ - **发布出去的 `package.json` 不再声明不在包里的东西**:0.1.1 的清单带着 50 余条
79
+ `scripts.*` 和一整套 `devDependencies`,而它们指向的 `scripts/`、`src/`、`tests/`
80
+ 根本不在 tarball 里。现在发布走一个**消毒过的暂存目录**(`dist/.npm-stage/`):
81
+ 内容 = safe 变体 + README + LICENSE,清单 = 去掉 `scripts` / `devDependencies` /
82
+ `packageManager` 的那份。**出货文件逐个不变**(仍是 238 个),只有清单瘦了。
83
+ - **README 重写**:只讲 `desktop-safe` 一种变体,重点放在**「不配 edge.json 时会怎样」**
84
+ 与**「edge.json 怎么配」**上 —— npm 包页就是这份 README,访客第一眼要看到的正是
85
+ 「缺省下『本地』并不在本地」这件事。
86
+
87
+ ## [0.1.1] — 2026-11-11
88
+
89
+ **首次发布到 npm registry。** 2026-08-18 → 2026-11-11。
15
90
 
16
91
  ### 加载通道
17
92
 
@@ -124,7 +199,7 @@ npm 包**不带** `config/edge.json` ⇒ 没配本地端点时 `local-llm` 走 D
124
199
 
125
200
  ### 工程门禁
126
201
 
127
- 27 道门禁,验的是**产物**不是源码(`npm run build` 一条链跑完):
202
+ 28 道门禁,验的是**产物**不是源码(`npm run build` 一条链跑完):
128
203
  构建链完整性、adapter 边界、上游契约、patch 面、preset 隔离、发布面、文档可达性、
129
204
  安装包内容、tarball、CI 链不漂移、边缘模式选型回钉(§7.183)……
130
205
 
package/README.md CHANGED
@@ -5,326 +5,148 @@
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
6
6
  [![Node](https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-blue)](package.json)
7
7
 
8
- `dsh-edge-agent` 是面向用户的端侧私密智能体,以 **bundle 补丁**的形式注册在宿主的
9
- DSH 桌面版 / CLI 上,新增一个 **Agent Preset —— 边缘模式**:宿主自带的标准 / 创造 /
10
- PTC / 极简四种工作方式之外,边缘模式 = 标准模式 + 本项目的全部功能(隐私护栏、意图
11
- 判定、路由决策、PII 脱敏、Realm 闸门、审计链、Edge 面板)。默认仍是标准模式;在设置页
12
- 选中「边缘模式」即启用。
8
+ 给 DSH 桌面版 / CLI 装上一个新的 **Agent Preset —— 边缘模式**:宿主自带的
9
+ 标准 / 创造 / PTC / 极简之外,**边缘模式 = 标准模式 + 本项目的全部能力**
10
+ (隐私护栏 · 意图判定 · 路由决策 · PII 脱敏 · Realm 闸门 · 审计链 · Edge 面板)。
11
+ 默认仍是标准模式,在设置页选中「边缘模式」才生效。
13
12
 
14
- > 这是**一种工作方式**,不是替代品。护栏 hook 由宿主的 scope 链判定 —— **标准模式下
15
- > 本项目的插件完全不生效**;Edge tab 常驻可见,但只有边缘模式才真正生效。判一个会话
16
- > 有没有走本项目链路,**唯一判据是审计链**。
13
+ > 这是**一种工作方式**,不是替代品:标准模式下本插件**完全不生效**(Edge tab 常驻可见)。
14
+ > 判一个会话有没有走本链路,**唯一判据是审计链**。
15
+
16
+ 本包启用的是 `desktop-safe` 变体 —— 只 insert 插件行,不改写宿主的 persona /
17
+ approval / sandbox 等全局设置。
17
18
 
18
19
  ---
19
20
 
20
- ## 📥 在 DSH 上加载本插件
21
+ ## 📥 装
21
22
 
22
- ### 一、加载模型:DSH 怎么认一个 bundle
23
+ 桌面版 DSH App:**Plugins → Add plugin** → 填包名 `@dsh-edge/dsh-edge-agent`
24
+ (装预构建包,不需要构建授权、不需要 PATH 上有 pnpm)。
23
25
 
24
- 装之前先理解这 5 步 —— 后面所有排障都落在这条链上。
26
+ > ⚠️ **装完必做两步**:① 点「**立即启用**」(GUI 不会自动启用)② **重启桌面 App**。
27
+ > 否则包在 `dependencies` 里却不在 `dsh.profile.bundles` 里 ⇒ 启动不加载 ⇒ 右栏没有 Edge tab。
25
28
 
26
- ```
27
- ① profile 的 package.json → dsh.profile.bundles[] 里追加包名
28
- └─ 唯一开关:不在这数组里 = 整包不加载(是「没装」,不是「装了没生效」)
29
- ↓
30
- ② 宿主对每个 bundle 读它自己的 package.json → dsh.bundle.patch
31
- └─ 本包是【数组】,两份一起加载:
32
- ├─ [0] ./cordis.desktop-safe.patch.yml 顶层 patch:宿主行覆盖 + 4 行宿主强制 insert
33
- └─ [1] ./presets/edge.desktop-safe.patch.yml preset:「边缘模式」工作方式的插件行(独立 scope)
34
- ↓
35
- ③ 插件行的 name 是个子路径 → 查本包 package.json#exports(37 条)→ 定位实现文件
36
- └─ 例:name: '…/dsh-edge-agent/file-logger' → exports['./file-logger'] → lib/…/file-logger.js
37
- ↓
38
- ④ cordis 按每个插件的 inject 依赖图实例化
39
- └─ inject 只能加不能减 ⇒ 少点一行 → 插件 ACTIVE 但一条都不拦(见「三层语义」)
40
- ↓
41
- ⑤ 插件通过三种挂法接进 DSH 流程
42
- ├─ 事件钩子 ctx.on('agent/pre-step' | 'llm/stream' | 'tools/pre-execute' | …)
43
- ├─ Service ctx.reflect.provide('promptGuard' | 'auditLog' | …)
44
- └─ Provider ctx.llm.registerAdapter(['cloud-llm'], …) / ctx.web.registerSearchProvider(…)
45
- ```
29
+ 另有三条通道(本地目录 / GitHub 地址 / tarball 路径)与独立 headless profile,
30
+ 见 [`docs/load-into-local-dsh.md`](docs/load-into-local-dsh.md)。
46
31
 
47
- > **两个变体**:`desktop-safe`(上面这个,只 insert、不改写宿主默认)与 `full`
48
- > (顶层 patch 改写 persona / approval / sandbox / session root 等宿主全局)。
49
- > **本文所有通道都用 `desktop-safe`** —— 桌面版四通道装的是
50
- > `dist/installable/dsh-edge-agent-desktop-safe`,独立 profile 走
51
- > `deploy-profile.sh`(同样是 desktop-safe + 该 profile 自己的 skin overlay)。
52
- > `full` 变体是给「独立部署一个自有 profile」的场景的。
53
-
54
- **顶层 patch 为什么只有 4 行 insert**(`dsh-edge-agent` / `file-logger` / `audit-log` /
55
- `desktop-cookie-janitor`):一行都不是「方便」留下的,是**宿主机制逼的** —— 宿主的
56
- client-modules 只扫宿主 Loader 的 entries(Edge tab 的浏览器半边只能从这里被发现);
57
- 裸包名行 inject `auditLog` 且 `file-logger` 要先占住 `fileLogger` 服务名 ⇒ 必须在
58
- root realm;welcome 握手发生在任何工作方式选定之前 ⇒ 修 431 的插件必须在 preset 之外。
59
-
60
- **三棵树各装什么**:
61
-
62
- | 树 | 文件 | 装什么 | 跟着谁走 |
63
- |---|---|---|---|
64
- | 宿主树顶层 | `cordis.desktop-safe.patch.yml` / `cordis.patch.yml` | 宿主行覆盖 + 4 行强制 insert | 进程级,整机生效 |
65
- | **preset 子树** | `presets/edge*.patch.yml` | 本项目**行为插件行** | **只跟着「边缘模式」工作方式走** |
66
- | profile skin | `profiles/<name>/cordis.patch.yml` | 压顶层(headless profile 在这里加 HTTP 监听器) | 跟着那个 profile |
67
-
68
- ⚠️ **preset 子树的 service 对宿主树行不可见**(cordis scope 隔离)—— 顶层 patch 里插一行
69
- 依赖 preset 服务的插件,会永远 pending 并让 boot 硬失败(§7.152 原样)。
70
-
71
- ### 二、桌面版(主路径):Plugins → Add plugin
72
-
73
- DSH 桌面 App 侧边栏的 **Plugins → Add plugin** 支持四个通道。**装完必须点「立即启用」**
74
- (GUI 不会自动启用),否则启动时不加载。
75
-
76
- | 通道 | 输入 | 要构建授权 | PATH 要有 pnpm | 产物形态 | 含真密钥 | 改了会生效吗 |
77
- |---|---|---|---|---|---|---|
78
- | **A 本地目录** | 绝对路径 | 否 | 否 | 符号链接 | ⚠️ **有** | ✅ 改文件重启即生效 |
79
- | **B GitHub 地址** | `git+ssh://git@github.com/<owner>/<repo>` | **是** | **是** | 现场编译 | 否 | ❌ 须重装 |
80
- | **C npm 包名** | `@dsh-edge/dsh-edge-agent` | 否 | 否 | 预构建 | 否 | 走 `updateBundle` |
81
- | **D tarball 路径** | `…/x.tar.gz` 绝对路径 | 否 | 否 | pnpm store 冻结副本 | 否 | ❌ 须卸载重装 |
82
-
83
- 四条通道在宿主里是**同一段代码**(`install-spec.ts` 解析四种形态,一律 `pnpm add <spec>`)。
84
- 差别全在本仓的作者侧义务:
85
-
86
- - **A 本地目录**(本机开发调试)
87
- ```bash
88
- pnpm install && npm run build:windows # 或 build:macos / build:linux
89
- ```
90
- 在 App 里选「本地目录」,填**绝对路径**指向产物目录:
91
- ```
92
- Windows C:\Users\<你>\…\dsh-edge-agent\dist\installable\dsh-edge-agent-desktop-safe
93
- macOS /Users/<你>/…/dsh-edge-agent/dist/installable/dsh-edge-agent-desktop-safe
94
- Linux /home/<你>/…/dsh-edge-agent/dist/installable/dsh-edge-agent-desktop-safe
95
- ```
96
- > ⚠️ **相对路径会被拒**(`a local path must be absolute`);Git Bash 的 `/c/Users/…` 是
97
- > MSYS2 虚拟路径,桌面 App 不认,必须用 `C:\…`。
98
- > ⚠️ 这个目录**含明文 API key**(`config/edge.json`)⇒ **别把 `dist/` 发给别人**。
99
-
100
- - **B GitHub 地址**(小范围分发 / 持续迭代)—— 填
101
- `git+ssh://git@github.com/chschytzmcy/dsh-edge-agent.git`。宿主克隆源码、在本地跑
102
- `prepare` 编译出 `lib/`、再装成 bundle。首次会失败并提示「允许这些脚本并重试」——
103
- 点它放行;装完点「立即启用」;重启桌面 App。两个前置条件:仓库要能读(私有库建议
104
- SSH 形式)、**PATH 上要有 `pnpm`**(只有这条通道要,因为 pnpm 给 git 依赖注入的
105
- `pnpm install` 是用 shell 跑的;宿主自己调 pnpm 用的是 App 自带那支)。
106
-
107
- - **C npm 包名**(发布给公众)—— 装的是**预构建**包,不需要构建授权、不需要 PATH 上有
108
- pnpm。⚠️ **包目前仍未发布到 registry**(registry 上查无此包)⇒ 这条通道要等第一次发布之后才成立。
109
- 发布链**本身已经就绪**(`npm run publish:npm` 一条命令走完构建 + 全部门禁 + 发布),
110
- 缺的是**作者侧**:npm 上拥有 `@dsh-edge` scope 的账号/组织 + 发布凭据。
111
- 详见 [`docs/deploy-npm.md`](docs/deploy-npm.md);注册账号与办凭据的逐步操作见
112
- [`docs/npm-account-setup.md`](docs/npm-account-setup.md)。
113
-
114
- - **D tarball 路径**(离线分发)——
115
- ```bash
116
- npm run build:tarball # 编译 + 打包 + 门禁 → dist/dsh-edge-agent-desktop-safe.tar.gz
117
- ```
118
- 在 App 里填 tarball 的**绝对路径**。不需要构建授权、不需要 PATH 上有 pnpm;tarball
119
- **不含 `config/edge.json`**(目标机器要自己写 `~/.dsh-edge-agent/edge.json`)。
120
- > ⚠️ **改了 tarball 不会自动生效** —— 装出来是 pnpm store 里的冻结副本,要卸载重装。
121
-
122
- ### 三、独立 HTTP profile(headless CLI)
123
-
124
- ```bash
125
- npm run build:macos -- --deploy-profile=dsh-edge-agent # 或 build:linux
126
- npm run build:macos -- --deploy-profile=dsh-web # 官方 Web UI (:3080) + IM 机器人
127
- npm run build:macos -- --deploy-profile=dsh-tui # 终端
128
- ```
32
+ ---
129
33
 
130
- 一条命令做完整件事:build + 装 bundle + 同步配置 + 重启 + 验活。HTTP API 监听 `:21017`
131
- (`/v1/chat`,GET `/v1/health`)。
34
+ ## ⚙️ 配置:`edge.json`
132
35
 
133
- > ⚠️ **Windows 只有桌面版**:桌面 App 独占 `desktop` profile(`managed exclusively by the
134
- > Electron application`),CLI 碰不了 ⇒ Windows 上没有独立 headless profile 这条路。
36
+ **只有一个文件**:`edge.json`,所有 profile 读同一份,不依赖环境变量。
135
37
 
136
- ### 四、加载后自检:**mount ≠ active ≠ enforced**
38
+ ### 缺省是什么样(不写配置文件会怎样)
137
39
 
138
- 「装上了」分三层,**boot 不报错只证明前两层**:
40
+ **一句话**:缺省下两个池都**转发宿主 GUI 里选中的模型**(DELEGATE)——
41
+ 所以「本地」这一栏**默认并不在本地**。
139
42
 
140
- | 层 | 含义 | 怎么验 |
43
+ | 缺省项 | 缺省值 | 后果 |
141
44
  |---|---|---|
142
- | **mount** | 插件被挂上 | boot 不报错 |
143
- | **active** | cordis 把插件置为 ACTIVE | `--dump-config` 里能看到插件行 |
144
- | **enforced** | 真拦得住 | **审计链里出现执法行**(`blocked.attack` / `blocked.policy` / `etscli.shell.denied` …) |
145
-
146
- ```bash
147
- # 1. bundle 已注册到 profile?
148
- grep '@dsh-edge/dsh-edge-agent' ~/.dsh/profiles/<profile>/package.json
149
-
150
- # 2. 隐私栈挂上了?(期望 ≥4)
151
- dsh --profile <profile> --dump-config \
152
- | grep -E 'input-guard|file-logger|intent-router|sanitizer' | wc -l
45
+ | `llm.local.baseUrl` | 空 ⇒ **DELEGATE** | `local-llm` 路由**照样注册**,但它转发宿主模型 —— 不是「没模型」|
46
+ | `llm.cloud.baseUrl` | 空 ⇒ **DELEGATE** | 云池同样转发宿主模型 |
47
+ | `stages.intent.provider` | `local-llm` | 意图判定钉在本地池上 ⇒ 端点留空时它**跑宿主模型** ⇒ **待检测的用户原文也会上行**(§7.171 的已知边界)|
48
+ | `stages.intent.timeoutMs` | `60000` | 意图判定那一次调用的超时窗口是 **60 秒** |
49
+ | `stages.guard.timeoutMs` | `60000` | 同上 |
50
+ | `llm.local.delegate` | `true` | 要「不注册本地路由」必须显式写 `false`(kill switch)|
153
51
 
154
- # 3. 桌面版:右栏出现 Edge tab → 发一条本地 query → Intent panel 出现一行
155
- ```
52
+ ⇒ **想让「本地」真的是本地,必须填 `llm.local.baseUrl`**。
156
53
 
157
- **排障对照**:
54
+ ### 落点(两个,没有第三个)
158
55
 
159
- | 现象 | 多半是 |
160
- |---|---|
161
- | `profile is not mounted` / 插件行根本不在 `--dump-config` | ① 没进 `dsh.profile.bundles` |
162
- | `1 entry did not activate` + `pending (waiting for services: …)` | ④ inject 闭包不齐 —— 补齐被点名插件的传递依赖 |
163
- | 插件行在、但会话里什么也不拦 | ③ scope 隔离:preset 子树的 service 对宿主树行不可见 / 当前会话是**标准模式**(不是边缘模式) |
164
- | 桌面版没有 Edge tab | `lib/client.js` 没构建 —— `prepare` 链里漏了 `build:client`(静默失败,无报错) |
56
+ | 顺位 | 路径 | 说明 |
57
+ |---|---|---|
58
+ | 1 | `<插件目录>/config/edge.json` | 装好后在 App 里就能找到的那份 |
59
+ | 2 | `~/.dsh-edge-agent/edge.json` | 跨通道、跨重装、删 profile 都活着 ★ **推荐** |
60
+
61
+ > 三条发布通道的产物里**本来就没有** `config/edge.json`(打包时按设计排除);
62
+ > 插件目录那份 `config/edge.example.json` 只是**给你抄的模板**。
63
+
64
+ ### 怎么配(三步)
65
+
66
+ 1. 把插件目录里的模板抄到 home:
67
+ ```bash
68
+ mkdir -p ~/.dsh-edge-agent
69
+ cp <插件目录>/config/edge.example.json ~/.dsh-edge-agent/edge.json
70
+ ```
71
+ 2. 填三样东西:
72
+ ```jsonc
73
+ {
74
+ "secrets": { "myEdgeKey": "<你的 key>" },
75
+ "llm": {
76
+ "local": {
77
+ "baseUrl": "https://your-endpoint/v1", // 必须含 /v1
78
+ "model": "your-model",
79
+ "keyRef": "myEdgeKey" // 端点不鉴权(本地 llama.cpp / vLLM)时整行可省
80
+ }
81
+ }
82
+ }
83
+ ```
84
+ - `baseUrl` 留空 = DELEGATE(转发宿主模型);填了 = **直连自有池**,凭据只认 `keyRef` 指向的槽位;
85
+ - `llm.cloud` 与 `llm.local` **完全对称**,配法一模一样;
86
+ - `delegate: false` = kill switch(不注册路由 ⇒ LOCAL 轮次 fail-closed,不放行到可能上云的 provider)。
87
+ 3. **重启桌面 App** —— `llm` / `stages` / `jev` 在插件启动时定死,不重启不生效。
165
88
 
166
- ### 五、完整文档
89
+ ### 不配会怎样
167
90
 
168
- | 想知道 | 看哪 |
91
+ | 你没配的东西 | 结果 |
169
92
  |---|---|
170
- | 每个插件挂在哪 / 三种挂法 | [`docs/plugin-mount-points.md`](docs/plugin-mount-points.md) |
171
- | 装配面全貌 / 三棵树 / 最小必需集 | [`docs/architecture.md`](docs/architecture.md) |
172
- | 每个文件装了什么 | [`docs/deploy-minimal-files.md`](docs/deploy-minimal-files.md) |
173
- | 隐私链路的判定表 / 配置清单 | [`docs/privacy-policy.md`](docs/privacy-policy.md) |
174
-
175
- ---
176
-
177
- ## ✨ 核心特性
178
-
179
- | 能力 | 状态 | 说明 |
180
- |---|---|---|
181
- | **🔒 端侧优先** | ✅ | 默认本地 LLM 处理;未决轮次一律留在设备上 |
182
- | **🛡️ 隐私保护** | ✅ | PII 可逆脱敏 + 不可逆日志掩码 + 隐私策略热重载 + HMAC 校验 |
183
- | **🚦 Realm 三级闸门** | ✅ | LOCAL → SANITIZED → CLOUD;分类→脱敏→路由→执行的完整拦截链,缺件即降级本地 |
184
- | **🚨 威胁检测** | ✅ | `td-bus` 滑动窗口计数 + 分级 + 隔离;超阈值返回 503 |
185
- | **📜 审计与可追溯** | ✅ | 追加式 JSONL 审计链 + ops log 详细 LLM request/response 追踪(PII + 密钥双重脱敏) |
186
- | **🔌 插件化** | ✅ | 插件全部按 subpath 导出(**37 条**),`verify:*` 门禁锁死装配面 |
187
- | **🌐 零信任通信** | 🚧 | RFC 9458 OHTTP 网关为**桩实现**;当前云端通道走标准 TLS |
188
- | **🔑 TEE / 远程证明** | 🚧 | `tcm` / `attestation` 为**桩实现**;真实 TEE 后端待接入 |
93
+ | 整个 `edge.json` | 两池都 DELEGATE ⇒ 实际是**同一个模型**(宿主选的那个)|
94
+ | `llm.local.baseUrl` | `local-llm` 路由照样注册(转发宿主模型)|
95
+ | `llm.local.keyRef` | 端点不鉴权 ⇒ 完全正常;端点要鉴权 ⇒ 401,报错会指名让你配 `keyRef` |
96
+ | `secrets` 整段(**桌面版**)| **完全正常** —— 桌面版不挂 http-api,一个 secret 都不需要 |
97
+ | `secrets.edgeApiKey`(**独立 HTTP profile**)| **必填** —— 没凭据**拒绝启动**(fail-closed)|
189
98
 
190
- > 当前真正生效的隐私保证来自 **Layer 2**(脱敏管线 + 策略引擎 + 审计链 + Realm 闸门)。
191
- > 分层状态表见 [`docs/architecture.md`](docs/architecture.md)。
99
+ > ⚠️ 两池的**出网口径不同**:云池只带「之前上过云的历史」;本地池带**全部**历史。
100
+ > ⚠️ `edge.json` 含**明文 API key**,绝不能提交到 git。
101
+ > 完整配置清单见 [`docs/privacy-policy.md`](docs/privacy-policy.md#配置清单)。
192
102
 
193
103
  ---
194
104
 
195
- ## ⚙️ 配置
196
-
197
- 配置只有**一个文件**:`edge.json`。所有 profile 读同一份,不依赖环境变量。
105
+ ## ✅ 装完自检
198
106
 
199
- **两个合法落点**(§7.182):插件装在哪,配置就在哪 —— 但要活过重装,就写 home。
200
-
201
- ```bash
202
- # 顺位 1:装好后的插件目录里(打开就能看到能改的那个)
203
- C:\Users\<你>\.dsh\profiles\desktop\node_modules\@dsh-edge\dsh-edge-agent\config\edge.json
204
-
205
- # 顺位 2:home(跨通道、跨重装、删 profile 都活着)★ 推荐
206
- C:\Users\<你>\.dsh-edge-agent\edge.json
207
- ```
107
+ 「装上了」分三层,**boot 不报错只证明前两层**:
208
108
 
209
- 要改配置就抄模板过去填:
109
+ | 层 | 含义 | 怎么验 |
110
+ |---|---|---|
111
+ | **mount** | 插件被挂上 | boot 不报错 |
112
+ | **active** | cordis 把插件置为 ACTIVE | `--dump-config` 里能看到插件行 |
113
+ | **enforced** | 真拦得住 | **审计链里出现执法行**(`blocked.attack` / `blocked.policy` …)|
210
114
 
211
115
  ```bash
212
- mkdir -p ~/.dsh-edge-agent
213
- cp config/edge.example.json ~/.dsh-edge-agent/edge.json
116
+ grep '@dsh-edge/dsh-edge-agent' ~/.dsh/profiles/<profile>/package.json
117
+ dsh --profile <profile> --dump-config | grep -cE 'input-guard|file-logger|intent-router|sanitizer'
214
118
  ```
215
119
 
216
- **先说结论:`secrets` 和 `llm` 都不是必填。** 桌面版装法下,`edge.json` 写成
217
- `{}` 也能正常跑 —— 两个池都会**转发宿主 GUI 里选中的模型**,凭据全归宿主,
218
- edge 侧一个 secret 都不碰:
120
+ ---
219
121
 
220
- ```json
221
- {}
222
- ```
122
+ ## 🔀 边缘模式的模型从哪来
223
123
 
224
- 查找顺序(与 profile 无关,代码现状):
124
+ 宿主 0.2.2-rc.1 起**路由只由会话级 `modelSelection` 决定**,本包**不改写会话选型**:
225
125
 
226
- ```
227
- 1. <bundle>/config/edge.json ← 顺位 1:插件目录里那份(用户找得到)
228
- 2. ~/.dsh-edge-agent/edge.json ← 顺位 2:home 那份(重装也活着)★ 推荐
229
- ```
126
+ - 进入边缘模式 ⇒ **选型一个字都不改**;
127
+ - 本轮判定为 LOCAL、但会话选的 provider 不是本地 provider ⇒ 这一轮在**出网那一跳**
128
+ 被**改道**到本地池(provider 与 model 都换)⇒ 这一轮仍然留在设备上,**不再被拒收**;
129
+ - 改道改不动(本地路由不存在 / 解析不到本地模型 / 宿主 LLM runtime 不可用)⇒
130
+ **fail-closed 抛错**,绝不放行到可能上云的 provider。
230
131
 
231
- > **仓库的 `config/` 目录不再放活配置**(§7.182)—— 不再往
232
- > `<repo>/config/edge.json` 写东西:它含明文 key,且 npm / git / tarball 三条通道的
233
- > 产物里**本来就没有**这个文件(打包时按设计排除)。仓库那份
234
- > `config/edge.example.json` 仍然随产物发布,但它只是**给你抄的模板**,不是运行时候选
235
- > —— 模板里的部署值已并入代码默认值,所以「没配置文件」与「照模板抄」行为一致。
132
+ 判一次会话到底用了哪个 provider,**唯一权威是审计链**:`input-guard.reroute.local`
133
+ (改道发生,带 `from` / `to`)/ `input-guard.reroute.blocked`(改不动)。
134
+ 详见 [`docs/privacy-policy.md`](docs/privacy-policy.md)。
236
135
 
237
- ### 两个池怎么配
136
+ ---
238
137
 
239
- `llm.local` 与 `llm.cloud` 现在**完全对称**:
138
+ ## ✨ 能力
240
139
 
241
- | `llm.<池>.baseUrl` | `llm.<池>.delegate` | 行为 |
140
+ | 能力 | 状态 | 说明 |
242
141
  |---|---|---|
243
- | 填了 | 任意 | **直连** —— edge 自有池,密钥走 `keyRef`(端点不鉴权时 `keyRef` 也可以不填)|
244
- | 留空 | `true`(默认)| **DELEGATE** —— 转发宿主选中的提供商(凭据归宿主,edge 侧不碰 secret)|
245
- | 留空 | `false` | **不注册路由** —— LOCAL 意图 fail-closed 报错 |
246
-
247
- 也就是说:**不填 `baseUrl` 不等于「没模型」**,而是「用宿主 GUI 里选的那个模型」。
248
-
249
- ```jsonc
250
- {
251
- "llm": {
252
- "local": { "baseUrl": "", "delegate": true }, // → 转发宿主选中的模型
253
- "cloud": { "baseUrl": "", "delegate": true } // → 同上
254
- }
255
- }
256
- ```
257
-
258
- 要 edge 自有直连池时填 `baseUrl + model + keyRef`(`baseUrl` 必须含 `/v1`):
259
-
260
- ```jsonc
261
- {
262
- "secrets": { "dashscopeApiKey": "sk-..." },
263
- "llm": {
264
- "local": {
265
- "baseUrl": "https://your-endpoint/v1",
266
- "model": "your-model",
267
- "keyRef": "dashscopeApiKey" // 端点不鉴权(本地 llama.cpp / vLLM)时整行可省
268
- }
269
- }
270
- }
271
- ```
272
-
273
- `delegate: false` 是 kill switch —— 回到「没端点就不注册路由」的旧语义。
274
-
275
- ### 不配会怎样
276
-
277
- | 你没配的东西 | 结果 |
278
- |---|---|
279
- | `llm` 整段 | 两池都 DELEGATE ⇒ **实际是同一个模型**(宿主选的那个)。⚠️ 意图分类与 guard 检测这两个**内部阶段**钉在 `local-llm` 上,端点留空时它们会跑在宿主模型上 ⇒「待检测的用户原文」也会上行(§7.171 的已知边界)|
280
- | `llm.local.baseUrl` | `local-llm` 路由**照样注册**(转发宿主模型),不是「没模型」|
281
- | `llm.local.keyRef` | 端点不鉴权 ⇒ 完全正常(不发 Authorization 头);端点要鉴权 ⇒ 401,报错会指名让你配 `keyRef` |
282
- | `secrets` 整段(**桌面版**)| **完全正常** —— 桌面版不挂 http-api,一个 secret 都不需要 |
283
- | `secrets.edgeApiKey`(**独立 HTTP profile**)| **必填**:http-api 暴露 `/v1/audit` 与 session delete/fork,没凭据就**拒绝启动**(fail-closed),而不是开一个无鉴权的 API |
284
- | `secrets.tavilyApiKey` / `bochaApiKey` | 搜索 provider 的 `available()` 变 false ⇒ 被宿主从可用清单里过滤掉(搜索不可用),其余功能照常 |
285
-
286
- > ⚠️ 两池的**出网口径不同**:云池只带「之前上过云的历史」;本地池带**全部**历史
287
- > (§7.131 的不对称规则)。本地池走 delegate 时同样按这个口径 —— 已知边界见
288
- > [`docs/privacy-policy.md`](docs/privacy-policy.md#已知边界)。
289
-
290
- > ⚠️ `config/edge.json` 含**明文 API key**,绝不能提交到 git(已在 `.gitignore` 里,
291
- > `.npmignore` 也排除了它 ⇒ 不会进 npm 包)。
292
- > 完整配置清单(16 类配置项 + 路由行为约定)见
293
- > [`docs/privacy-policy.md`](docs/privacy-policy.md#配置清单)。
294
-
295
- ### 边缘模式的模型从哪来(选型不动 + 出网那一跳改道)
296
-
297
- 宿主 0.2.2-rc.1 起,**路由只由会话级 `modelSelection` 决定** —— 在
298
- `agent/request` 里改写 provider/model 会被宿主的 `prepareRequest()` 判非法并抛错。
299
- §7.184 起,本包**不再改写会话选型**:宿主模型选择器里显示什么,就一直是什么。
300
-
301
- | 情况 | 结果 |
302
- |---|---|
303
- | 进入边缘模式 | **选型一个字都不改**(§7.184)—— 选择器保持主人选的那个,不跳 |
304
- | 本轮判定为 LOCAL、但会话选的 provider 不是本地 provider | 这一轮在**出网那一跳**被**改道**到本地池(provider 与 model 都换)⇒ 这一轮仍然留在设备上,**不再被拒收**(§7.184) |
305
- | 本轮判定为 CLOUD | 不改道 —— 本轮就是要出网的(脱敏 + 只带云段历史,§7.131) |
306
- | 改道改不动(本地路由不存在 / 解析不到本地模型 / 宿主 LLM runtime 不可用) | **fail-closed 抛错**,绝不放行到可能上云的 provider |
307
- | 宿主模型选择器(输入框下方)里看到什么 | 本地池**如实声明**它真正会跑的那**一个**模型(§7.180)—— 直连池 = 池自己的 model id;DELEGATE = 委托目标的 model id。宿主目录会剔掉「空目录的 provider」,不声明就没有这一项、选择器只能显示「请选择模型」。云池仍在目录里隐身(避免误选 `cloud-llm/deepseek-chat`) |
308
-
309
- > 判一个会话到底用了哪个 provider,唯一权威是**审计链**:
310
- > `input-guard.reroute.local`(改道发生,带 `from` = 被改掉的原选型、
311
- > `to` = 实际落点)/ `input-guard.reroute.blocked`(改不动,fail-closed)。
312
- >
313
- > 面板上的「答案出口」一栏会把两边都写出来:**「会话选型 → 实际落点」**
314
- > (§7.184)—— 选型是你选的那个,实际跑的是本地池那个,两件事都摆出来。
315
- >
316
- > 面板上的「模型」一行显示的是**这一轮真正会跑**的模型(DELEGATE 下 = 委托
317
- > 解析出来的宿主模型与它的落点 provider),不是配置里的默认值 —— 详见
318
- > [`docs/PROGRESS.md` §7.179](docs/PROGRESS.md)。
319
- >
320
- > §7.180 起,**wire 上跑的模型、宿主模型目录里声明的那一项、改道过去的
321
- > model id** 三者是同一个 id(共用同一份委托目标缓存)⇒ 界面上写的名字不会
322
- > 跟实际跑的不一致。
323
- >
324
- > 面板上的「答案出口」一栏**认得 DELEGATE 出口行**(`llm.*.delegate.*`)——
325
- > 直连池与 DELEGATE 池都能显示「池 + 模型」,不会在明明作答时写「路由未定」
326
- > (§7.181)。LOCAL / CLOUD 的判据仍是**哪个池**(§7.130);DELEGATE 下额外多
327
- > 一行「真实落点」,如实说明这一轮转发去了哪儿。
142
+ | **🔒 端侧优先** | ✅ | 默认本地 LLM 处理;未决轮次一律留在设备上 |
143
+ | **🛡️ 隐私保护** | ✅ | PII 可逆脱敏 + 日志掩码 + 隐私策略热重载 |
144
+ | **🚦 Realm 三级闸门** | ✅ | LOCAL → SANITIZED → CLOUD;缺件即降级本地 |
145
+ | **🚨 威胁检测** | ✅ | `td-bus` 滑动窗口 + 分级 + 隔离;超阈值返回 503 |
146
+ | **📜 审计与可追溯** | ✅ | 追加式 JSONL 审计链 + ops log(PII + 密钥双重脱敏)|
147
+ | **🔌 插件化** | ✅ | 按 subpath 导出(**37 条**),`verify:*` 门禁锁死装配面 |
148
+ | **🌐 零信任通信** | 🚧 | OHTTP 网关为**桩实现**;当前云端通道走标准 TLS |
149
+ | **🔑 TEE / 远程证明** | 🚧 | `tcm` / `attestation` 为**桩实现** |
328
150
 
329
151
  ---
330
152
 
@@ -332,42 +154,29 @@ edge 侧一个 secret 都不碰:
332
154
 
333
155
  | 文档 | 内容 |
334
156
  |---|---|
335
- | [`docs/README.md`](docs/README.md) | **文档总索引**(每份一句说明 + 状态) |
336
- | [`docs/architecture.md`](docs/architecture.md) | 架构主文档:四层模型 / Realm / 插件开发 / 威胁模型 |
337
- | [`docs/plugin-mount-points.md`](docs/plugin-mount-points.md) | 插件挂点表:每个插件的真实挂点 + 三种挂法 |
338
- | [`docs/privacy-policy.md`](docs/privacy-policy.md) | 隐私链路单一权威文档:策略 + 判定表 + 配置清单 + 审计 + 行为契约 |
339
- | [`docs/deploy-github.md`](docs/deploy-github.md) | 从 GitHub 仓库地址安装 |
340
- | [`docs/deploy-npm.md`](docs/deploy-npm.md) | 从 npm 包名安装 + 发布链排障 |
341
- | [`docs/npm-account-setup.md`](docs/npm-account-setup.md) | 注册 npm 账号/组织(scope `@dsh-edge`)+ 办发布凭据 |
342
- | [`docs/deploy-tarball.md`](docs/deploy-tarball.md) | 从 tarball 路径安装(离线分发) |
343
- | [`docs/load-into-local-dsh.md`](docs/load-into-local-dsh.md) | 装进本地 DSH(三条路 + 宿主契约) |
157
+ | [`docs/README.md`](docs/README.md) | **文档总索引**(每份一句说明 + 状态)|
158
+ | [`docs/architecture.md`](docs/architecture.md) | 架构主文档:四层模型 / Realm / 插件开发 / 威胁模型 / patch 树 |
159
+ | [`docs/privacy-policy.md`](docs/privacy-policy.md) | 隐私链路单一权威:策略 + 判定表 + 配置清单 + 审计 + 行为契约 |
160
+ | [`docs/deploy-npm.md`](docs/deploy-npm.md) | npm 包名安装 + 发布链排障 |
344
161
  | [`docs/desktop-troubleshooting.md`](docs/desktop-troubleshooting.md) | 桌面版排障手册 |
345
- | [`docs/version-policy.md`](docs/version-policy.md) | 上游版本策略 |
346
- | [`docs/PROGRESS.md`](docs/PROGRESS.md) | 实施进度档案(§7.x 全量历史) |
162
+ | [`docs/PROGRESS.md`](docs/PROGRESS.md) | 实施进度档案(§7.x 全量历史)|
347
163
 
348
- ### 开发
164
+ ### 开发与发布
349
165
 
350
166
  ```bash
351
167
  pnpm install
352
168
  pnpm run build # compile → typecheck:client → build:client → build:installable → pack:tarball → verify:build
353
- pnpm test # 单元测试
354
- pnpm run lint # eslint
355
- ```
169
+ pnpm test
356
170
 
357
- ### 发布到 npm
358
-
359
- ```bash
360
- npm run publish:npm # 构建 + 27 道门禁 + dry-run(**默认不发**)
171
+ npm run publish:npm # 构建 + 门禁 + dry-run(**默认不发**)
361
172
  npm run publish:npm -- --yes # 真发
362
- npm run publish:npm -- --yes --tag # 发完打 v<version> tag(再 git push origin v<version> 触发 CI)
173
+ npm run publish:npm -- --yes --tag # 发完打 v<version> tag
363
174
  ```
364
175
 
365
176
  前置:`npm login` 一次(凭据写在 `~/.npmrc`;PATH 上要有 `pnpm`)。
366
- 不带 `--yes` **永远不会碰 registry**。详见 [`docs/deploy-npm.md`](docs/deploy-npm.md)。
177
+ 不带 `--yes` **永远不会碰 registry**。
367
178
 
368
- > ⚠️ **`build` 的步骤顺序不能省**:门禁验的是**产物**不是源码 —— `compile` 只重建 Node
369
- > 半侧,`lib/client.js` 来自 `build:client`(esbuild),`dist/installable/` 来自
370
- > `build:installable`。缺 `build:client` 的包是**静默**坏法:Edge tab 根本不出现,
371
- > 没有任何报错。
179
+ > ⚠️ **「publish 报成功」≠「包已经能装」**:分级发布(staged publishing)下包名先被
180
+ > 占位版 `0.0.0-stage` 占住。**判据**:`npm view <pkg> version` 返回 `0.0.0-stage` = 还卡着。
372
181
 
373
182
  MIT License. 详见 [LICENSE](LICENSE)。
@@ -1 +1 @@
1
- {"version":3,"file":"http-api.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/http-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-api.d.ts","sourceRoot":"","sources":["../../src/dsh-adapter/http-api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,MAAM,MAAM,0BAA0B,CAAA;AA4B7C,eAAO,MAAM,IAAI,aAAa,CAAA;AAE9B,eAAO,MAAM,MAAM,2FAA4F,CAAA;AAE/G,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAA;IAKpB,kGAAkG;IAClG,oBAAoB,EAAE,MAAM,CAAA;IAC5B,0EAA0E;IAC1E,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;2DAIuD;IACvD,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAMD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAOhC,CAAA;AAEF,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,SAAS,IAAI,OAAO,CAAA;IACpB,QAAQ,IAAI,MAAM,CAAA;CACnB;AAgCD,qBAAa,kBAAmB,SAAQ,OAAO;IAkB3C,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IApBlB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D;;qEAEiE;IACjE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,YAAY,CAA4C;IAChE;;kEAE8D;IAC9D,OAAO,CAAC,cAAc,CAAiD;gBAG7D,SAAS,EAAE,GAAG,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,QAAQ,EAAE,GAAG,EACrB,KAAK,CAAC,EAAE,GAAG;IAOb;8EAC0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC,sEAAsE;IACtE,OAAO,CAAC,KAAK;IAOb;;;;;;;yEAOqE;IACrE,OAAO,CAAC,SAAS;IAIjB;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO;IAWf;;;;;;;sCAOkC;IAClC,OAAO,CAAC,iBAAiB;IAczB;;;;wBAIoB;IACpB,OAAO,CAAC,sBAAsB;IAK9B;;;;;;+BAM2B;IAC3B,OAAO,CAAC,iBAAiB;IA8BzB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,YAAY;IAId,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4FtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB3B,SAAS,IAAI,OAAO;IAIpB,QAAQ,IAAI,MAAM;YAIJ,aAAa;IAoD3B;;;qDAGiD;YACnC,WAAW;IAoCzB,OAAO,CAAC,SAAS;YAuBH,UAAU;YAyTV,gBAAgB;IA6P9B,OAAO,CAAC,kBAAkB;IAU1B;;;;;;mEAM+D;IAC/D,OAAO,CAAC,gBAAgB;IAyBxB;;;;;;;;;;;;uCAYmC;YACrB,eAAe;IA4D7B,OAAO,CAAC,gBAAgB;YAYV,mBAAmB;IAsBjC;;;;;sEAKkE;YACpD,mBAAmB;IAoBjC;;8EAE0E;YAC5D,mBAAmB;IA4BjC;;;;;;;2EAOuE;YACzD,iBAAiB;IAqC/B;;;;;;;;;;;OAWG;YACW,kBAAkB;YAkClB,aAAa;IAyD3B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;;OAGG;YACW,uBAAuB;YAwBvB,YAAY;IA8C1B,OAAO,CAAC,cAAc;IAiKtB;;;;;4CAKwC;IACxC,OAAO,CAAC,WAAW;CAwIpB;AAwCD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,OAAO,GACf;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAoCxD;AAED,wBAAsB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CA4ClF"}