dsh-kingdom 0.3.1
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/LICENSE +29 -0
- package/README.md +184 -0
- package/cordis.patch.yml +6 -0
- package/lib/core/binding.js +57 -0
- package/lib/core/binding.js.map +1 -0
- package/lib/core/db.js +521 -0
- package/lib/core/db.js.map +1 -0
- package/lib/core/execution.js +88 -0
- package/lib/core/execution.js.map +1 -0
- package/lib/core/kingdom.js +117 -0
- package/lib/core/kingdom.js.map +1 -0
- package/lib/core/task-service.js +581 -0
- package/lib/core/task-service.js.map +1 -0
- package/lib/core/task.js +93 -0
- package/lib/core/task.js.map +1 -0
- package/lib/core/territory.js +47 -0
- package/lib/core/territory.js.map +1 -0
- package/lib/gui/contract.js +53 -0
- package/lib/gui/contract.js.map +1 -0
- package/lib/gui/server.js +204 -0
- package/lib/gui/server.js.map +1 -0
- package/lib/gui/snapshot.js +379 -0
- package/lib/gui/snapshot.js.map +1 -0
- package/lib/index.js +489 -0
- package/lib/index.js.map +1 -0
- package/lib/paths.js +23 -0
- package/lib/paths.js.map +1 -0
- package/lib/types/core/binding.d.ts +11 -0
- package/lib/types/core/db.d.ts +261 -0
- package/lib/types/core/execution.d.ts +51 -0
- package/lib/types/core/kingdom.d.ts +34 -0
- package/lib/types/core/task-service.d.ts +107 -0
- package/lib/types/core/task.d.ts +60 -0
- package/lib/types/core/territory.d.ts +9 -0
- package/lib/types/gui/contract.d.ts +226 -0
- package/lib/types/gui/server.d.ts +26 -0
- package/lib/types/gui/snapshot.d.ts +44 -0
- package/lib/types/index.d.ts +80 -0
- package/lib/types/paths.d.ts +6 -0
- package/lib/types/worker/dsh-subagent.d.ts +79 -0
- package/lib/types/worker/executor.d.ts +121 -0
- package/lib/worker/dsh-subagent.js +117 -0
- package/lib/worker/dsh-subagent.js.map +1 -0
- package/lib/worker/executor.js +94 -0
- package/lib/worker/executor.js.map +1 -0
- package/package.json +59 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, lusblead
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are met:
|
|
8
|
+
|
|
9
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
list of conditions and the following disclaimer.
|
|
11
|
+
|
|
12
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
and/or other materials provided with the distribution.
|
|
15
|
+
|
|
16
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
17
|
+
contributors may be used to endorse or promote products derived from
|
|
18
|
+
this software without specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
24
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
26
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
27
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
28
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.md
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
# 🏰 dsh-Kingdom
|
|
4
|
+
|
|
5
|
+
**在 DeepSeek Harness 里,装一个插件,拥有一个自己的 Agent 王国。**
|
|
6
|
+
|
|
7
|
+
[](https://github.com/lusblead/dsh-Kingdom/releases)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
[](#compatibility)
|
|
10
|
+
[](#requirements)
|
|
11
|
+
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 这是什么?
|
|
17
|
+
|
|
18
|
+
**dsh-Kingdom 是一个 DeepSeek Harness(DSH)插件**:安装后,你不需要部署任何服务、数据库或 GUI,直接在 DSH 会话里用自然语言就能**创建并运行一个属于自己的最小王国**——
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
你:初始化王国
|
|
22
|
+
DSH:已创建王国「My Kingdom」,你成为 Owner
|
|
23
|
+
|
|
24
|
+
你:给当前项目建一个 RAG 研发领
|
|
25
|
+
DSH:已创建领地「RAG 研发领」
|
|
26
|
+
|
|
27
|
+
你:让 Chancellor 把"检查测试情况"规划成任务,Supervisor 派给 Worker 执行,然后验收
|
|
28
|
+
DSH:任务 CREATED → ASSIGNED → RUNNING → REVIEW → DONE ✅
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**王国是真实的**:角色、领地、任务、验收记录全部持久化在本地,重启 DSH 也不会消失。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## ✨ 核心特性
|
|
36
|
+
|
|
37
|
+
| 特性 | 说明 |
|
|
38
|
+
|---|---|
|
|
39
|
+
| 🚀 **零门槛安装** | 一个 tgz + 一条命令,无需 bash / tsc / 外部服务 / GUI |
|
|
40
|
+
| 🏛 **完整角色体系** | Owner / Chancellor / Supervisor / Worker,角色与 Session / 模型解耦 |
|
|
41
|
+
| 📋 **真实治理闭环** | 规划 → 分配 → 独立执行 → 验收,任务状态全程留痕 |
|
|
42
|
+
| ⚖️ **Claim ≠ Fact** | **Worker 说自己完成了 ≠ 任务完成**——完成权只在 Supervisor,代码强制,不是口头约定 |
|
|
43
|
+
| 👷 **Worker 独立执行** | 每次执行在独立 DSH 会话(one-shot subagent)进行,结果结构化返回 |
|
|
44
|
+
| 🔁 **返工留痕** | REWORK 后同一 Worker 新会话重做,每次尝试(attempt)都有记录 |
|
|
45
|
+
| 💾 **重启恢复** | 全部状态存本地 SQLite,关掉 DSH 再开,王国原样还在 |
|
|
46
|
+
| 🎭 **GUI 就绪**(可选) | 结构化快照 + 本地通道(默认关闭),为可视化界面预留接口 |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 🚀 快速开始
|
|
51
|
+
|
|
52
|
+
### 1. 前置要求
|
|
53
|
+
|
|
54
|
+
- **DeepSeek Harness(dsh)** ≥ `0.1.0-rc.5`
|
|
55
|
+
- **Node.js** ≥ `22.19`(内置 SQLite,插件零原生依赖)
|
|
56
|
+
- 一个可用的模型 API key(Worker 执行需要)
|
|
57
|
+
|
|
58
|
+
### 2. 安装
|
|
59
|
+
|
|
60
|
+
**方式 A:npm(推荐)**
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
dsh plugin --profile web add dsh-kingdom
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**方式 B:从 GitHub Releases 下载 tgz**
|
|
67
|
+
|
|
68
|
+
从 [Releases](https://github.com/lusblead/dsh-Kingdom/releases) 下载 `dsh-kingdom-0.3.1.tgz`,然后:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
dsh plugin --profile web add ./dsh-kingdom-0.3.1.tgz
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
> 安装时会打印 5 条 peer dependency warning——**这是预期的**(这些包由 DSH 运行时提供),不是失败。
|
|
75
|
+
> 判断安装成功:**重启 DSH 后** `/kingdom status` 能返回真实状态。
|
|
76
|
+
|
|
77
|
+
重启 DSH,插件自动加载。开始使用:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
/kingdom init # 初始化或接入本地王国(幂等)
|
|
81
|
+
/kingdom status # 查看王国真实状态
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 3. 30 秒体验一个王国
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
你:初始化王国
|
|
88
|
+
你:给当前项目创建一个 RAG 研发领
|
|
89
|
+
你:任命一个 Chancellor 和 Supervisor,绑定一个 Worker
|
|
90
|
+
你:让 Chancellor 规划"检查测试情况"为任务,Supervisor 派给 Worker
|
|
91
|
+
你:开始执行任务
|
|
92
|
+
你:验收任务(ACCEPT / REWORK / FAIL)
|
|
93
|
+
你:王国现在什么情况?
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
每一步都用自然语言,模型自动调用对应的 `kingdom_*` 工具完成真实写入。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 🛠 工具一览
|
|
101
|
+
|
|
102
|
+
| 阶段 | 工具 |
|
|
103
|
+
|---|---|
|
|
104
|
+
| 王国基础 | `kingdom_init` · `kingdom_status` |
|
|
105
|
+
| 领地 | `kingdom_create_territory` · `kingdom_list_territories` |
|
|
106
|
+
| 角色 | `kingdom_bind_role` · `kingdom_list_bindings` |
|
|
107
|
+
| 任务治理 | `kingdom_plan_task` · `kingdom_assign_task` · `kingdom_start_task` · `kingdom_review_task` · `kingdom_list_tasks` |
|
|
108
|
+
| 执行控制 | `kingdom_execution_control` |
|
|
109
|
+
| GUI(可选) | `kingdom_snapshot` · `kingdom_task_detail` |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 🧠 它如何保证"治理是真的"?
|
|
114
|
+
|
|
115
|
+
这是 dsh-Kingdom 与其他 Agent 编排工具最根本的区别:
|
|
116
|
+
|
|
117
|
+
```text
|
|
118
|
+
Worker 交回结果 ──→ 这是一条 Claim(自述),只进 REVIEW
|
|
119
|
+
↓
|
|
120
|
+
Supervisor ACCEPT ──→ DONE(组织事实)
|
|
121
|
+
Supervisor REWORK ──→ 返工(同 Worker 新会话)
|
|
122
|
+
Supervisor FAIL ──→ FAILED(组织事实)
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
- **Worker 没有"完成"的权力**:它没有上报结果的工具,结果经宿主接收后落库,任务永远停在 `REVIEW`。
|
|
126
|
+
- **没有任何工具能把任务直接置为 DONE**——DONE 唯一入口是 Supervisor 的 ACCEPT。
|
|
127
|
+
- **即使是 Worker 自称失败**,任务也只到 REVIEW;FAILED 只能是 Supervisor 裁定,或宿主观察到执行器客观失败(启动失败/异常退出)。
|
|
128
|
+
- 每次执行(attempt)都记入 `worker_results`,返工历史完整可查。
|
|
129
|
+
|
|
130
|
+
> **一句话:模型可以提出动作,但只有程序决定状态。**
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 📁 数据与存储
|
|
135
|
+
|
|
136
|
+
| 路径 | 说明 |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `~/.dsh/kingdom/kingdom.db` | 王国全部数据(SQLite,自包含) |
|
|
139
|
+
| 7 张表 | kingdoms · territories · role_bindings · tasks · worker_results · executions · events |
|
|
140
|
+
|
|
141
|
+
每一版升级都是**零 migration**——旧库打开即自动收敛,数据不丢。
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 🗺 路线图
|
|
146
|
+
|
|
147
|
+
| 版本 | 内容 | 状态 |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| 0.1.x | 王国基础:初始化/领地/角色绑定/重启恢复 | ✅ 已发布 |
|
|
150
|
+
| 0.2.x | 任务治理闭环:plan/assign/execute/review + **Claim ≠ Fact** | ✅ 已发布 |
|
|
151
|
+
| 0.3.x | 执行生命周期 + GUI 适配层 + 热插拔加固 | ✅ 已发布 |
|
|
152
|
+
| 未来 | 多 Worker、Handoff、GUI 正式版、完整治理后端 | 🚧 规划中 |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 📖 文档
|
|
157
|
+
|
|
158
|
+
- [LICENSE](LICENSE) — BSD-3-Clause
|
|
159
|
+
|
|
160
|
+
## 🤝 参与贡献
|
|
161
|
+
|
|
162
|
+
欢迎提交 Issue / PR。开发环境需要 DSH checkout:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
DSH_CHECKOUT=<checkout> bash scripts/build.sh # 或手动 tsc
|
|
166
|
+
node scripts/p2-smoke.mjs # Phase 2 自测(81 断言)
|
|
167
|
+
node scripts/p3-smoke.mjs # Phase 3 自测(113 断言)
|
|
168
|
+
node scripts/hotplug-audit.mjs # 热插拔审计(27 断言)
|
|
169
|
+
npm pack # 产出可分发 tgz
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 📜 许可证
|
|
173
|
+
|
|
174
|
+
[BSD-3-Clause](LICENSE) © 2026 lusblead
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
<div align="center">
|
|
179
|
+
|
|
180
|
+
**Unofficial project, independently developed and maintained by community members.**
|
|
181
|
+
|
|
182
|
+
*DSH · Agent Kingdom · Multi-agent governance*
|
|
183
|
+
|
|
184
|
+
</div>
|
package/cordis.patch.yml
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* dsh-kingdom — Role Binding 基础 CRUD(Phase 1)。
|
|
3
|
+
*
|
|
4
|
+
* Role、Runtime、Model、Session 解耦:
|
|
5
|
+
* Role → Binding → DSH Session → Model/Tools
|
|
6
|
+
* Binding 可以更换 Session;Role 的组织身份不因模型或 Session 改变而改变。
|
|
7
|
+
*
|
|
8
|
+
* Phase 1 仅支持:绑定角色↔session(role_type 枚举 + role_name + session_id 可选)、
|
|
9
|
+
* 列出绑定。角色类型固定 OWNER/CHANCELLOR/SUPERVISOR/WORKER,不支持动态创建角色类型。
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
export const ROLE_TYPES = ['OWNER', 'CHANCELLOR', 'SUPERVISOR', 'WORKER'];
|
|
13
|
+
export function bindRole(store, input) {
|
|
14
|
+
const roleType = input.roleType.trim().toUpperCase();
|
|
15
|
+
if (!ROLE_TYPES.includes(roleType)) {
|
|
16
|
+
return `错误:role_type 必须是 ${ROLE_TYPES.join(' / ')} 之一。`;
|
|
17
|
+
}
|
|
18
|
+
const roleName = input.roleName?.trim() || `${roleType}-${randomUUID().slice(0, 8)}`;
|
|
19
|
+
// 同角色已存在:Phase 1 同一角色只保留一个绑定(重复绑定返回既有,不改)
|
|
20
|
+
const existing = store.getBindingByRole(input.kingdomId, roleType);
|
|
21
|
+
if (existing) {
|
|
22
|
+
return `角色 ${roleType} 已有绑定(${existing.role_name},session=${existing.session_id ?? '未绑定 session'})。如需更换 session,先解绑或未来版本支持。`;
|
|
23
|
+
}
|
|
24
|
+
const now = new Date().toISOString();
|
|
25
|
+
store.insertBinding({
|
|
26
|
+
binding_id: randomUUID(),
|
|
27
|
+
kingdom_id: input.kingdomId,
|
|
28
|
+
role_type: roleType,
|
|
29
|
+
role_name: roleName,
|
|
30
|
+
runtime_type: 'dsh',
|
|
31
|
+
session_id: input.sessionId?.trim() || null,
|
|
32
|
+
principal_id: null,
|
|
33
|
+
created_at: now,
|
|
34
|
+
updated_at: now,
|
|
35
|
+
});
|
|
36
|
+
store.appendEvent({
|
|
37
|
+
event_id: randomUUID(),
|
|
38
|
+
kingdom_id: input.kingdomId,
|
|
39
|
+
event_type: 'ROLE_BOUND',
|
|
40
|
+
actor_role: roleType,
|
|
41
|
+
actor_id: null,
|
|
42
|
+
target_type: 'binding',
|
|
43
|
+
target_id: null,
|
|
44
|
+
payload_json: JSON.stringify({ role_name: roleName, session_id: input.sessionId ?? null }),
|
|
45
|
+
created_at: now,
|
|
46
|
+
});
|
|
47
|
+
return `已绑定角色 ${roleType}(${roleName}${input.sessionId ? `,session=${input.sessionId}` : ',未指定 session'})。`;
|
|
48
|
+
}
|
|
49
|
+
export function listBindings(store, kingdomId) {
|
|
50
|
+
const rows = store.listBindings(kingdomId);
|
|
51
|
+
if (rows.length === 0)
|
|
52
|
+
return '当前王国还没有角色绑定。';
|
|
53
|
+
return rows
|
|
54
|
+
.map((b) => `- ${b.role_type}(${b.role_name},session=${b.session_id ?? '未绑定'})`)
|
|
55
|
+
.join('\n');
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/core/binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAA;AAUlF,MAAM,UAAU,QAAQ,CAAC,KAAmB,EAAE,KAAoB;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAoB,CAAC,EAAE,CAAC;QAC/C,OAAO,oBAAoB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;IACzD,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;IAEpF,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAClE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,MAAM,QAAQ,SAAS,QAAQ,CAAC,SAAS,YAAY,QAAQ,CAAC,UAAU,IAAI,aAAa,4BAA4B,CAAA;IAC9H,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACpC,KAAK,CAAC,aAAa,CAAC;QAClB,UAAU,EAAE,UAAU,EAAE;QACxB,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;QACnB,YAAY,EAAE,KAAK;QACnB,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,IAAI;QAC3C,YAAY,EAAE,IAAI;QAClB,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,GAAG;KAChB,CAAC,CAAA;IACF,KAAK,CAAC,WAAW,CAAC;QAChB,QAAQ,EAAE,UAAU,EAAE;QACtB,UAAU,EAAE,KAAK,CAAC,SAAS;QAC3B,UAAU,EAAE,YAAY;QACxB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;QAC1F,UAAU,EAAE,GAAG;KAChB,CAAC,CAAA;IACF,OAAO,SAAS,QAAQ,IAAI,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,CAAA;AAC7G,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAE,SAAiB;IACjE,MAAM,IAAI,GAAqB,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;IAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAA;IAC5C,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAiB,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC;SAC/F,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC"}
|