@xgjktech/xg_cwork_im 1.19.30 → 1.19.33
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/dist/src/connection/account-connection.d.ts.map +1 -1
- package/dist/src/connection/account-connection.js +8 -1
- package/dist/src/connection/account-connection.js.map +1 -1
- package/dist/src/connection/connection.d.ts.map +1 -1
- package/dist/src/connection/connection.js +13 -9
- package/dist/src/connection/connection.js.map +1 -1
- package/dist/src/connection/ws-inbound-schema.test.js +29 -0
- package/dist/src/connection/ws-inbound-schema.test.js.map +1 -1
- package/dist/src/connection/ws-message-segment.d.ts +35 -0
- package/dist/src/connection/ws-message-segment.d.ts.map +1 -0
- package/dist/src/connection/ws-message-segment.js +111 -0
- package/dist/src/connection/ws-message-segment.js.map +1 -0
- package/dist/src/connection/ws-message-segment.test.d.ts +2 -0
- package/dist/src/connection/ws-message-segment.test.d.ts.map +1 -0
- package/dist/src/connection/ws-message-segment.test.js +76 -0
- package/dist/src/connection/ws-message-segment.test.js.map +1 -0
- package/dist/src/plugin/plugin-dispose.d.ts.map +1 -1
- package/dist/src/plugin/plugin-dispose.js +2 -0
- package/dist/src/plugin/plugin-dispose.js.map +1 -1
- package/dist/src/session/robot-env-store.d.ts +61 -0
- package/dist/src/session/robot-env-store.d.ts.map +1 -0
- package/dist/src/session/robot-env-store.js +356 -0
- package/dist/src/session/robot-env-store.js.map +1 -0
- package/dist/src/session/robot-env-store.test.d.ts +2 -0
- package/dist/src/session/robot-env-store.test.d.ts.map +1 -0
- package/dist/src/session/robot-env-store.test.js +151 -0
- package/dist/src/session/robot-env-store.test.js.map +1 -0
- package/dist/src/session/session-env-store.d.ts +7 -2
- package/dist/src/session/session-env-store.d.ts.map +1 -1
- package/dist/src/session/session-env-store.js +13 -4
- package/dist/src/session/session-env-store.js.map +1 -1
- package/dist/src/tools/register-exec-env-hook.d.ts +14 -0
- package/dist/src/tools/register-exec-env-hook.d.ts.map +1 -1
- package/dist/src/tools/register-exec-env-hook.js +48 -1
- package/dist/src/tools/register-exec-env-hook.js.map +1 -1
- package/dist/src/tools/register-exec-env-hook.test.js +81 -2
- package/dist/src/tools/register-exec-env-hook.test.js.map +1 -1
- package/dist/src/turn/active-round-registry.d.ts +5 -0
- package/dist/src/turn/active-round-registry.d.ts.map +1 -1
- package/dist/src/turn/active-round-registry.js +27 -2
- package/dist/src/turn/active-round-registry.js.map +1 -1
- package/dist/src/turn/active-round-registry.test.js +32 -1
- package/dist/src/turn/active-round-registry.test.js.map +1 -1
- package/dist/src/workspace/connection-workspace-event.test.js +58 -0
- package/dist/src/workspace/connection-workspace-event.test.js.map +1 -1
- package/dist/src/workspace/workspace-event.d.ts.map +1 -1
- package/dist/src/workspace/workspace-event.js +62 -6
- package/dist/src/workspace/workspace-event.js.map +1 -1
- package/dist/src/workspace/workspace-event.test.js +42 -0
- package/dist/src/workspace/workspace-event.test.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 机器人(Channel Account)级环境变量缓存。
|
|
3
|
+
*
|
|
4
|
+
* 来源:IM 服务端随 `robotMention` 下发的 `params.msgContent.ext.env`
|
|
5
|
+
* (服务端 `t_im_robot.ext_params.env`,机器人归属人配置、整体覆盖写入)。
|
|
6
|
+
*
|
|
7
|
+
* 语义:
|
|
8
|
+
* - 机器人级整份快照:收到即**整体替换**;`robotMention` 未带 `ext.env` 视为「清空」。
|
|
9
|
+
* - 只放进程内存(进程级共享 Map,跨热重载存活),**不落盘**——每条 robotMention 都会下发,
|
|
10
|
+
* Gateway 重启后等下一条消息即可。
|
|
11
|
+
*
|
|
12
|
+
* 注入:由 `before_tool_call` 在每次 `exec` 时把过滤后的 env 写入 `event.params.env`,
|
|
13
|
+
* 从而进入沙箱 / Gateway / Node 的 exec 环境(沙箱不过滤,非沙箱侧由 OpenClaw 再校验)。
|
|
14
|
+
*
|
|
15
|
+
* 过滤:丢弃 OpenClaw 保留或不安全的「解释器/运行时注入」类键(如 NODE_OPTIONS、LD_*、DYLD_*、
|
|
16
|
+
* PATH 等),避免注入失败或污染子进程;其余键(如 HTTP_PROXY、业务 token)放行。
|
|
17
|
+
*/
|
|
18
|
+
/** 是否属于 OpenClaw 保留 / 不安全的键(解释器、动态链接器、运行时注入类)。 */
|
|
19
|
+
export declare function isBlockedRobotEnvKey(rawKey: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 校验并过滤机器人环境变量。
|
|
22
|
+
* - key 必须为便携名;
|
|
23
|
+
* - value 允许字符串 / 数字 / 布尔(按字符串处理),拒绝 null/对象/数组、NUL、换行、超长;
|
|
24
|
+
* - 丢弃 OpenClaw 保留/危险键。
|
|
25
|
+
*
|
|
26
|
+
* @returns `env` 为通过的键值;`dropped` 为被丢弃的键名(仅用于日志,不记值)。
|
|
27
|
+
*/
|
|
28
|
+
export declare function filterRobotEnv(raw: unknown): {
|
|
29
|
+
env: Record<string, string>;
|
|
30
|
+
dropped: string[];
|
|
31
|
+
};
|
|
32
|
+
/** 从 `msgContent.ext` 中提取原始 `env`(未校验);不存在返回 undefined。 */
|
|
33
|
+
export declare function extractRobotEnvFromExt(ext: unknown): unknown;
|
|
34
|
+
/**
|
|
35
|
+
* 整体替换某机器人的环境变量:先校验过滤,再覆盖写入。
|
|
36
|
+
* 过滤后为空(含传入 null/undefined/{})时删除该账户/Agent 缓存。
|
|
37
|
+
*
|
|
38
|
+
* @param agentId 该机器人对应的 Agent。写入后同时建立 Agent 索引,
|
|
39
|
+
* 供 cron / 心跳等无入站上下文的回合按 `ctx.agentId` 兜底命中。
|
|
40
|
+
*/
|
|
41
|
+
export declare function setRobotEnv(accountId: string, raw: unknown, agentId?: string): void;
|
|
42
|
+
/** 读取某机器人的环境变量快照(过期返回 undefined)。 */
|
|
43
|
+
export declare function getRobotEnv(accountId: string | undefined): Record<string, string> | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* 按 Agent 读取机器人环境变量快照(cron / 心跳 / exec 完成唤醒等无入站上下文的回合兜底)。
|
|
46
|
+
* 同一 Agent 绑定多个机器人时以「最近一次入站」为准。
|
|
47
|
+
*/
|
|
48
|
+
export declare function getRobotEnvByAgentId(agentId: string | undefined): {
|
|
49
|
+
accountId: string;
|
|
50
|
+
env: Record<string, string>;
|
|
51
|
+
} | undefined;
|
|
52
|
+
/** 清除某机器人(或某 Agent)缓存。 */
|
|
53
|
+
export declare function clearRobotEnv(accountId: string | undefined, agentId?: string): void;
|
|
54
|
+
/** 插件卸载 / gateway_stop 时清空全部缓存。 */
|
|
55
|
+
export declare function clearRobotEnvStore(): void;
|
|
56
|
+
export declare function __resetRobotEnvStoreForTests(): void;
|
|
57
|
+
/** 仅供测试:账户索引条目数。 */
|
|
58
|
+
export declare function __robotEnvSizeForTests(): number;
|
|
59
|
+
/** 仅供测试:Agent 索引条目数。 */
|
|
60
|
+
export declare function __robotEnvAgentSizeForTests(): number;
|
|
61
|
+
//# sourceMappingURL=robot-env-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robot-env-store.d.ts","sourceRoot":"","sources":["../../../src/session/robot-env-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiKH,kDAAkD;AAClD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAuC/F;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAG5D;AA8BD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CA+BnF;AAED,qCAAqC;AACrC,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAU7F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAChC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,SAAS,CAUhE;AAED,0BAA0B;AAC1B,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAWnF;AAED,mCAAmC;AACnC,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAGnD;AAED,oBAAoB;AACpB,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAwB;AACxB,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 机器人(Channel Account)级环境变量缓存。
|
|
3
|
+
*
|
|
4
|
+
* 来源:IM 服务端随 `robotMention` 下发的 `params.msgContent.ext.env`
|
|
5
|
+
* (服务端 `t_im_robot.ext_params.env`,机器人归属人配置、整体覆盖写入)。
|
|
6
|
+
*
|
|
7
|
+
* 语义:
|
|
8
|
+
* - 机器人级整份快照:收到即**整体替换**;`robotMention` 未带 `ext.env` 视为「清空」。
|
|
9
|
+
* - 只放进程内存(进程级共享 Map,跨热重载存活),**不落盘**——每条 robotMention 都会下发,
|
|
10
|
+
* Gateway 重启后等下一条消息即可。
|
|
11
|
+
*
|
|
12
|
+
* 注入:由 `before_tool_call` 在每次 `exec` 时把过滤后的 env 写入 `event.params.env`,
|
|
13
|
+
* 从而进入沙箱 / Gateway / Node 的 exec 环境(沙箱不过滤,非沙箱侧由 OpenClaw 再校验)。
|
|
14
|
+
*
|
|
15
|
+
* 过滤:丢弃 OpenClaw 保留或不安全的「解释器/运行时注入」类键(如 NODE_OPTIONS、LD_*、DYLD_*、
|
|
16
|
+
* PATH 等),避免注入失败或污染子进程;其余键(如 HTTP_PROXY、业务 token)放行。
|
|
17
|
+
*/
|
|
18
|
+
import { getSharedMap } from "../plugin/process-shared-store.js";
|
|
19
|
+
/** 单条 value 的 UTF-8 字节上限。 */
|
|
20
|
+
const MAX_VALUE_BYTES = 32768;
|
|
21
|
+
/** 便携环境变量名(工程一致:字母/下划线开头,字母数字下划线)。 */
|
|
22
|
+
const PORTABLE_KEY = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
23
|
+
/** 会话级缓存条目数上限(防御无界增长)。 */
|
|
24
|
+
const MAX_ENTRIES = 500;
|
|
25
|
+
/** 条目 TTL:长时间无消息自动清理(下次 robotMention 会重新写入)。 */
|
|
26
|
+
const TTL_MS = 24 * 60 * 60 * 1000;
|
|
27
|
+
/**
|
|
28
|
+
* OpenClaw 全 host 均禁止的「解释器/运行时注入」键。
|
|
29
|
+
* vendor 自 openclaw `src/infra/host-env-security-policy.json` 的 `blockedEverywhereKeys`
|
|
30
|
+
* (对应 OpenClaw 2026.9.x;升级 OpenClaw 时需对照刷新)。
|
|
31
|
+
*/
|
|
32
|
+
const BLOCKED_KEYS = new Set([
|
|
33
|
+
"NODE_OPTIONS",
|
|
34
|
+
"NODE_PATH",
|
|
35
|
+
"NODE_REDIRECT_WARNINGS",
|
|
36
|
+
"NODE_REPL_EXTERNAL_MODULE",
|
|
37
|
+
"NODE_REPL_HISTORY",
|
|
38
|
+
"NODE_V8_COVERAGE",
|
|
39
|
+
"PYTHONHOME",
|
|
40
|
+
"PYTHONPATH",
|
|
41
|
+
"PERL5LIB",
|
|
42
|
+
"PERL5OPT",
|
|
43
|
+
"RUBYLIB",
|
|
44
|
+
"RUBYOPT",
|
|
45
|
+
"BASHOPTS",
|
|
46
|
+
"BASH_ENV",
|
|
47
|
+
"ENV",
|
|
48
|
+
"KSH_ENV",
|
|
49
|
+
"BROWSER",
|
|
50
|
+
"GIT_ALLOW_PROTOCOL",
|
|
51
|
+
"GIT_EDITOR",
|
|
52
|
+
"GIT_EXTERNAL_DIFF",
|
|
53
|
+
"GIT_DIR",
|
|
54
|
+
"GIT_WORK_TREE",
|
|
55
|
+
"GIT_COMMON_DIR",
|
|
56
|
+
"GIT_EXEC_PATH",
|
|
57
|
+
"GIT_INDEX_FILE",
|
|
58
|
+
"GIT_OBJECT_DIRECTORY",
|
|
59
|
+
"GIT_ALTERNATE_OBJECT_DIRECTORIES",
|
|
60
|
+
"GIT_NAMESPACE",
|
|
61
|
+
"GIT_PROTOCOL_FROM_USER",
|
|
62
|
+
"GIT_SEQUENCE_EDITOR",
|
|
63
|
+
"GIT_TEMPLATE_DIR",
|
|
64
|
+
"GIT_SSL_NO_VERIFY",
|
|
65
|
+
"GIT_SSL_CAINFO",
|
|
66
|
+
"GIT_SSL_CAPATH",
|
|
67
|
+
"CC",
|
|
68
|
+
"CPP",
|
|
69
|
+
"CXX",
|
|
70
|
+
"CXXCPP",
|
|
71
|
+
"CARGO_BUILD_RUSTC",
|
|
72
|
+
"CARGO_BUILD_RUSTC_WRAPPER",
|
|
73
|
+
"CARGO_BUILD_RUSTC_WORKSPACE_WRAPPER",
|
|
74
|
+
"CARGO_BUILD_RUSTDOC",
|
|
75
|
+
"RUSTC",
|
|
76
|
+
"RUSTC_WRAPPER",
|
|
77
|
+
"RUSTC_WORKSPACE_WRAPPER",
|
|
78
|
+
"RUSTDOC",
|
|
79
|
+
"CMAKE_C_COMPILER",
|
|
80
|
+
"CMAKE_CXX_COMPILER",
|
|
81
|
+
"SHELL",
|
|
82
|
+
"SHELLOPTS",
|
|
83
|
+
"PS4",
|
|
84
|
+
"GCONV_PATH",
|
|
85
|
+
"IFS",
|
|
86
|
+
"SSLKEYLOGFILE",
|
|
87
|
+
"JAVA_OPTS",
|
|
88
|
+
"JAVA_TOOL_OPTIONS",
|
|
89
|
+
"_JAVA_OPTIONS",
|
|
90
|
+
"JDK_JAVA_OPTIONS",
|
|
91
|
+
"PYTHONBREAKPOINT",
|
|
92
|
+
"DOTNET_STARTUP_HOOKS",
|
|
93
|
+
"DOTNET_ADDITIONAL_DEPS",
|
|
94
|
+
"FPATH",
|
|
95
|
+
"GLIBC_TUNABLES",
|
|
96
|
+
"MAVEN_OPTS",
|
|
97
|
+
"MAKE",
|
|
98
|
+
"MAKEFLAGS",
|
|
99
|
+
"MFLAGS",
|
|
100
|
+
"SBT_OPTS",
|
|
101
|
+
"GRADLE_OPTS",
|
|
102
|
+
"ANT_OPTS",
|
|
103
|
+
"HGRCPATH",
|
|
104
|
+
"HGEDITOR",
|
|
105
|
+
"HGMERGE",
|
|
106
|
+
"EXINIT",
|
|
107
|
+
"VIMINIT",
|
|
108
|
+
"MYVIMRC",
|
|
109
|
+
"GVIMINIT",
|
|
110
|
+
"LUA_INIT",
|
|
111
|
+
"LUA_INIT_5_1",
|
|
112
|
+
"LUA_INIT_5_2",
|
|
113
|
+
"LUA_INIT_5_3",
|
|
114
|
+
"LUA_INIT_5_4",
|
|
115
|
+
"EMACSLOADPATH",
|
|
116
|
+
"RUBYSHELL",
|
|
117
|
+
"GIT_HOOK_PATH",
|
|
118
|
+
"SVN_EDITOR",
|
|
119
|
+
"SVN_SSH",
|
|
120
|
+
"BZR_EDITOR",
|
|
121
|
+
"BZR_SSH",
|
|
122
|
+
"BZR_PLUGIN_PATH",
|
|
123
|
+
"SUDO_ASKPASS",
|
|
124
|
+
"JULIA_EDITOR",
|
|
125
|
+
"CONFIG_SITE",
|
|
126
|
+
"CONFIG_SHELL",
|
|
127
|
+
"CMAKE_TOOLCHAIN_FILE",
|
|
128
|
+
"CATALINA_OPTS",
|
|
129
|
+
"CORECLR_PROFILER",
|
|
130
|
+
"HELM_PLUGINS",
|
|
131
|
+
"PACKER_PLUGIN_PATH",
|
|
132
|
+
"VAGRANT_VAGRANTFILE",
|
|
133
|
+
"ERL_AFLAGS",
|
|
134
|
+
"ERL_FLAGS",
|
|
135
|
+
"ERL_ZFLAGS",
|
|
136
|
+
"ELIXIR_ERL_OPTIONS",
|
|
137
|
+
"R_ENVIRON",
|
|
138
|
+
"R_PROFILE",
|
|
139
|
+
"R_ENVIRON_USER",
|
|
140
|
+
"R_PROFILE_USER",
|
|
141
|
+
"TCLLIBPATH",
|
|
142
|
+
"HOSTALIASES",
|
|
143
|
+
].map((key) => key.toUpperCase()));
|
|
144
|
+
/** OpenClaw 全 host 禁止的前缀(动态链接器 / shell 函数注入)。 */
|
|
145
|
+
const BLOCKED_PREFIXES = ["DYLD_", "LD_", "BASH_FUNC_"];
|
|
146
|
+
/** 插件自留键:不随机器人 env 注入(避免覆盖 OpenClaw 的 PATH 处理与插件身份标记)。 */
|
|
147
|
+
const RESERVED_KEYS = new Set(["PATH", "OPENCLAW_CLI"]);
|
|
148
|
+
const LOG_PREFIX = "[xg_cwork_im] [robot-env]";
|
|
149
|
+
/** 主索引:按机器人(Channel Account)。 */
|
|
150
|
+
const byAccountId = getSharedMap("robot-env-by-account");
|
|
151
|
+
/**
|
|
152
|
+
* 次索引:按 Agent。
|
|
153
|
+
* 供 **cron / 心跳 / exec 完成唤醒** 等没有入站消息、拿不到 `(sessionKey → accountId)`
|
|
154
|
+
* 的回合按 `ctx.agentId` 兜底命中缓存(同一 Agent 的会话只有一个机器人时等同于账户级)。
|
|
155
|
+
*/
|
|
156
|
+
const byAgentId = getSharedMap("robot-env-by-agent");
|
|
157
|
+
function isRecord(value) {
|
|
158
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
159
|
+
}
|
|
160
|
+
/** 是否属于 OpenClaw 保留 / 不安全的键(解释器、动态链接器、运行时注入类)。 */
|
|
161
|
+
export function isBlockedRobotEnvKey(rawKey) {
|
|
162
|
+
const upper = rawKey.trim().toUpperCase();
|
|
163
|
+
if (!upper)
|
|
164
|
+
return true;
|
|
165
|
+
if (RESERVED_KEYS.has(upper))
|
|
166
|
+
return true;
|
|
167
|
+
if (BLOCKED_KEYS.has(upper))
|
|
168
|
+
return true;
|
|
169
|
+
return BLOCKED_PREFIXES.some((prefix) => upper.startsWith(prefix));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* 校验并过滤机器人环境变量。
|
|
173
|
+
* - key 必须为便携名;
|
|
174
|
+
* - value 允许字符串 / 数字 / 布尔(按字符串处理),拒绝 null/对象/数组、NUL、换行、超长;
|
|
175
|
+
* - 丢弃 OpenClaw 保留/危险键。
|
|
176
|
+
*
|
|
177
|
+
* @returns `env` 为通过的键值;`dropped` 为被丢弃的键名(仅用于日志,不记值)。
|
|
178
|
+
*/
|
|
179
|
+
export function filterRobotEnv(raw) {
|
|
180
|
+
const env = {};
|
|
181
|
+
const dropped = [];
|
|
182
|
+
if (!isRecord(raw))
|
|
183
|
+
return { env, dropped };
|
|
184
|
+
for (const [rawKey, rawValue] of Object.entries(raw)) {
|
|
185
|
+
const key = rawKey.trim();
|
|
186
|
+
if (!PORTABLE_KEY.test(key)) {
|
|
187
|
+
dropped.push(key || "(empty)");
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (isBlockedRobotEnvKey(key)) {
|
|
191
|
+
dropped.push(key);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
let value;
|
|
195
|
+
if (typeof rawValue === "string") {
|
|
196
|
+
value = rawValue;
|
|
197
|
+
}
|
|
198
|
+
else if (typeof rawValue === "number" || typeof rawValue === "boolean") {
|
|
199
|
+
value = String(rawValue);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
dropped.push(key);
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (value.includes("\0") || /[\r\n]/.test(value)) {
|
|
206
|
+
dropped.push(key);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
if (Buffer.byteLength(value, "utf8") > MAX_VALUE_BYTES) {
|
|
210
|
+
dropped.push(key);
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
env[key] = value;
|
|
214
|
+
}
|
|
215
|
+
return { env, dropped };
|
|
216
|
+
}
|
|
217
|
+
/** 从 `msgContent.ext` 中提取原始 `env`(未校验);不存在返回 undefined。 */
|
|
218
|
+
export function extractRobotEnvFromExt(ext) {
|
|
219
|
+
if (!isRecord(ext))
|
|
220
|
+
return undefined;
|
|
221
|
+
return ext.env;
|
|
222
|
+
}
|
|
223
|
+
function deleteEntry(entry) {
|
|
224
|
+
if (byAccountId.get(entry.accountId) === entry) {
|
|
225
|
+
byAccountId.delete(entry.accountId);
|
|
226
|
+
}
|
|
227
|
+
if (entry.agentId && byAgentId.get(entry.agentId) === entry) {
|
|
228
|
+
byAgentId.delete(entry.agentId);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function pruneExpired(now) {
|
|
232
|
+
for (const entry of [...byAccountId.values()]) {
|
|
233
|
+
if (now - entry.updatedAt > TTL_MS)
|
|
234
|
+
deleteEntry(entry);
|
|
235
|
+
}
|
|
236
|
+
// 兜底:仅存在于 agent 索引的条目(正常不会出现,防御性处理)。
|
|
237
|
+
for (const entry of [...byAgentId.values()]) {
|
|
238
|
+
if (now - entry.updatedAt > TTL_MS)
|
|
239
|
+
deleteEntry(entry);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function evictOldestIfOverCapacity() {
|
|
243
|
+
if (byAccountId.size < MAX_ENTRIES)
|
|
244
|
+
return;
|
|
245
|
+
let oldest;
|
|
246
|
+
for (const entry of byAccountId.values()) {
|
|
247
|
+
if (!oldest || entry.updatedAt < oldest.updatedAt)
|
|
248
|
+
oldest = entry;
|
|
249
|
+
}
|
|
250
|
+
if (oldest)
|
|
251
|
+
deleteEntry(oldest);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* 整体替换某机器人的环境变量:先校验过滤,再覆盖写入。
|
|
255
|
+
* 过滤后为空(含传入 null/undefined/{})时删除该账户/Agent 缓存。
|
|
256
|
+
*
|
|
257
|
+
* @param agentId 该机器人对应的 Agent。写入后同时建立 Agent 索引,
|
|
258
|
+
* 供 cron / 心跳等无入站上下文的回合按 `ctx.agentId` 兜底命中。
|
|
259
|
+
*/
|
|
260
|
+
export function setRobotEnv(accountId, raw, agentId) {
|
|
261
|
+
const id = accountId?.trim();
|
|
262
|
+
if (!id)
|
|
263
|
+
return;
|
|
264
|
+
const agent = agentId?.trim() || undefined;
|
|
265
|
+
const { env, dropped } = filterRobotEnv(raw);
|
|
266
|
+
const now = Date.now();
|
|
267
|
+
pruneExpired(now);
|
|
268
|
+
if (Object.keys(env).length === 0) {
|
|
269
|
+
const existing = byAccountId.get(id);
|
|
270
|
+
if (existing)
|
|
271
|
+
deleteEntry(existing);
|
|
272
|
+
if (agent) {
|
|
273
|
+
const existingAgent = byAgentId.get(agent);
|
|
274
|
+
if (existingAgent)
|
|
275
|
+
deleteEntry(existingAgent);
|
|
276
|
+
}
|
|
277
|
+
if (dropped.length > 0) {
|
|
278
|
+
console.warn(`${LOG_PREFIX} accountId=${id} 全部键被过滤: ${dropped.join(", ")}`);
|
|
279
|
+
}
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (!byAccountId.has(id)) {
|
|
283
|
+
evictOldestIfOverCapacity();
|
|
284
|
+
}
|
|
285
|
+
const entry = { accountId: id, agentId: agent, env, updatedAt: now };
|
|
286
|
+
byAccountId.set(id, entry);
|
|
287
|
+
if (agent)
|
|
288
|
+
byAgentId.set(agent, entry);
|
|
289
|
+
if (dropped.length > 0) {
|
|
290
|
+
console.warn(`${LOG_PREFIX} accountId=${id} 已忽略键: ${dropped.join(", ")}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/** 读取某机器人的环境变量快照(过期返回 undefined)。 */
|
|
294
|
+
export function getRobotEnv(accountId) {
|
|
295
|
+
const id = accountId?.trim();
|
|
296
|
+
if (!id)
|
|
297
|
+
return undefined;
|
|
298
|
+
const entry = byAccountId.get(id);
|
|
299
|
+
if (!entry)
|
|
300
|
+
return undefined;
|
|
301
|
+
if (Date.now() - entry.updatedAt > TTL_MS) {
|
|
302
|
+
deleteEntry(entry);
|
|
303
|
+
return undefined;
|
|
304
|
+
}
|
|
305
|
+
return { ...entry.env };
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* 按 Agent 读取机器人环境变量快照(cron / 心跳 / exec 完成唤醒等无入站上下文的回合兜底)。
|
|
309
|
+
* 同一 Agent 绑定多个机器人时以「最近一次入站」为准。
|
|
310
|
+
*/
|
|
311
|
+
export function getRobotEnvByAgentId(agentId) {
|
|
312
|
+
const id = agentId?.trim();
|
|
313
|
+
if (!id)
|
|
314
|
+
return undefined;
|
|
315
|
+
const entry = byAgentId.get(id);
|
|
316
|
+
if (!entry)
|
|
317
|
+
return undefined;
|
|
318
|
+
if (Date.now() - entry.updatedAt > TTL_MS) {
|
|
319
|
+
deleteEntry(entry);
|
|
320
|
+
return undefined;
|
|
321
|
+
}
|
|
322
|
+
return { accountId: entry.accountId, env: { ...entry.env } };
|
|
323
|
+
}
|
|
324
|
+
/** 清除某机器人(或某 Agent)缓存。 */
|
|
325
|
+
export function clearRobotEnv(accountId, agentId) {
|
|
326
|
+
const id = accountId?.trim();
|
|
327
|
+
if (id) {
|
|
328
|
+
const entry = byAccountId.get(id);
|
|
329
|
+
if (entry)
|
|
330
|
+
deleteEntry(entry);
|
|
331
|
+
}
|
|
332
|
+
const agent = agentId?.trim();
|
|
333
|
+
if (agent) {
|
|
334
|
+
const entry = byAgentId.get(agent);
|
|
335
|
+
if (entry)
|
|
336
|
+
deleteEntry(entry);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/** 插件卸载 / gateway_stop 时清空全部缓存。 */
|
|
340
|
+
export function clearRobotEnvStore() {
|
|
341
|
+
byAccountId.clear();
|
|
342
|
+
byAgentId.clear();
|
|
343
|
+
}
|
|
344
|
+
export function __resetRobotEnvStoreForTests() {
|
|
345
|
+
byAccountId.clear();
|
|
346
|
+
byAgentId.clear();
|
|
347
|
+
}
|
|
348
|
+
/** 仅供测试:账户索引条目数。 */
|
|
349
|
+
export function __robotEnvSizeForTests() {
|
|
350
|
+
return byAccountId.size;
|
|
351
|
+
}
|
|
352
|
+
/** 仅供测试:Agent 索引条目数。 */
|
|
353
|
+
export function __robotEnvAgentSizeForTests() {
|
|
354
|
+
return byAgentId.size;
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=robot-env-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robot-env-store.js","sourceRoot":"","sources":["../../../src/session/robot-env-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robot-env-store.test.d.ts","sourceRoot":"","sources":["../../../src/session/robot-env-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { beforeEach, describe, it } from "node:test";
|
|
3
|
+
import { __resetRobotEnvStoreForTests, __robotEnvAgentSizeForTests, __robotEnvSizeForTests, clearRobotEnv, clearRobotEnvStore, extractRobotEnvFromExt, filterRobotEnv, getRobotEnv, getRobotEnvByAgentId, setRobotEnv, } from "./robot-env-store.js";
|
|
4
|
+
beforeEach(() => __resetRobotEnvStoreForTests());
|
|
5
|
+
describe("filterRobotEnv", () => {
|
|
6
|
+
it("保留普通业务键(含代理)并原样返回字符串", () => {
|
|
7
|
+
const { env, dropped } = filterRobotEnv({
|
|
8
|
+
CMS_TOKEN: "abc123",
|
|
9
|
+
HTTP_PROXY: "http://10.0.0.1:8080",
|
|
10
|
+
NO_PROXY: "localhost",
|
|
11
|
+
});
|
|
12
|
+
assert.deepEqual(env, {
|
|
13
|
+
CMS_TOKEN: "abc123",
|
|
14
|
+
HTTP_PROXY: "http://10.0.0.1:8080",
|
|
15
|
+
NO_PROXY: "localhost",
|
|
16
|
+
});
|
|
17
|
+
assert.deepEqual(dropped, []);
|
|
18
|
+
});
|
|
19
|
+
it("数字/布尔按字符串存储", () => {
|
|
20
|
+
const { env } = filterRobotEnv({ RETRY: 3, FLAG: true });
|
|
21
|
+
assert.equal(env.RETRY, "3");
|
|
22
|
+
assert.equal(env.FLAG, "true");
|
|
23
|
+
});
|
|
24
|
+
it("丢弃 OpenClaw 保留 / 危险的解释器与链接器注入键", () => {
|
|
25
|
+
const { env, dropped } = filterRobotEnv({
|
|
26
|
+
NODE_OPTIONS: "--require /tmp/evil",
|
|
27
|
+
PYTHONPATH: "/tmp",
|
|
28
|
+
LD_PRELOAD: "/tmp/evil.so",
|
|
29
|
+
DYLD_INSERT_LIBRARIES: "/tmp/evil.dylib",
|
|
30
|
+
BASH_FUNC_x: "() { :; }",
|
|
31
|
+
PATH: "/tmp/bin",
|
|
32
|
+
OPENCLAW_CLI: "0",
|
|
33
|
+
KEEP: "1",
|
|
34
|
+
});
|
|
35
|
+
assert.deepEqual(env, { KEEP: "1" });
|
|
36
|
+
assert.deepEqual(dropped.sort(), [
|
|
37
|
+
"BASH_FUNC_x",
|
|
38
|
+
"DYLD_INSERT_LIBRARIES",
|
|
39
|
+
"LD_PRELOAD",
|
|
40
|
+
"NODE_OPTIONS",
|
|
41
|
+
"OPENCLAW_CLI",
|
|
42
|
+
"PATH",
|
|
43
|
+
"PYTHONPATH",
|
|
44
|
+
]);
|
|
45
|
+
});
|
|
46
|
+
it("丢弃非法键名、NUL、换行与非标量值", () => {
|
|
47
|
+
const { env, dropped } = filterRobotEnv({
|
|
48
|
+
"1BAD": "x",
|
|
49
|
+
"A B": "x",
|
|
50
|
+
NUL: "a\0b",
|
|
51
|
+
NL: "a\nb",
|
|
52
|
+
CR: "a\rb",
|
|
53
|
+
OBJ: { a: 1 },
|
|
54
|
+
ARR: [1],
|
|
55
|
+
NULLV: null,
|
|
56
|
+
GOOD: "ok",
|
|
57
|
+
});
|
|
58
|
+
assert.deepEqual(env, { GOOD: "ok" });
|
|
59
|
+
assert.equal(dropped.length, 8);
|
|
60
|
+
});
|
|
61
|
+
it("丢弃超长 value(UTF-8 字节)", () => {
|
|
62
|
+
const { env, dropped } = filterRobotEnv({ BIG: "a".repeat(32769), OK: "a".repeat(32768) });
|
|
63
|
+
assert.deepEqual(Object.keys(env), ["OK"]);
|
|
64
|
+
assert.deepEqual(dropped, ["BIG"]);
|
|
65
|
+
});
|
|
66
|
+
it("非对象输入返回空", () => {
|
|
67
|
+
assert.deepEqual(filterRobotEnv(undefined), { env: {}, dropped: [] });
|
|
68
|
+
assert.deepEqual(filterRobotEnv(null), { env: {}, dropped: [] });
|
|
69
|
+
assert.deepEqual(filterRobotEnv("x"), { env: {}, dropped: [] });
|
|
70
|
+
assert.deepEqual(filterRobotEnv([["A", "1"]]), { env: {}, dropped: [] });
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("extractRobotEnvFromExt", () => {
|
|
74
|
+
it("读取 ext.env", () => {
|
|
75
|
+
assert.deepEqual(extractRobotEnvFromExt({ ai_model: "auto", env: { A: "1" } }), { A: "1" });
|
|
76
|
+
});
|
|
77
|
+
it("非对象或无 env 返回 undefined", () => {
|
|
78
|
+
assert.equal(extractRobotEnvFromExt(undefined), undefined);
|
|
79
|
+
assert.equal(extractRobotEnvFromExt(null), undefined);
|
|
80
|
+
assert.equal(extractRobotEnvFromExt({ ai_model: "auto" }), undefined);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("robot env store", () => {
|
|
84
|
+
it("整体替换(服务端快照语义)", () => {
|
|
85
|
+
setRobotEnv("acct-1", { A: "1", B: "2" });
|
|
86
|
+
setRobotEnv("acct-1", { A: "9" });
|
|
87
|
+
assert.deepEqual(getRobotEnv("acct-1"), { A: "9" });
|
|
88
|
+
});
|
|
89
|
+
it("空对象 / undefined 清空该账户", () => {
|
|
90
|
+
setRobotEnv("acct-1", { A: "1" });
|
|
91
|
+
setRobotEnv("acct-1", {});
|
|
92
|
+
assert.equal(getRobotEnv("acct-1"), undefined);
|
|
93
|
+
setRobotEnv("acct-1", { A: "1" });
|
|
94
|
+
setRobotEnv("acct-1", undefined);
|
|
95
|
+
assert.equal(getRobotEnv("acct-1"), undefined);
|
|
96
|
+
});
|
|
97
|
+
it("全部键被过滤时视为清空", () => {
|
|
98
|
+
setRobotEnv("acct-1", { A: "1" });
|
|
99
|
+
setRobotEnv("acct-1", { NODE_OPTIONS: "x" });
|
|
100
|
+
assert.equal(getRobotEnv("acct-1"), undefined);
|
|
101
|
+
assert.equal(__robotEnvSizeForTests(), 0);
|
|
102
|
+
});
|
|
103
|
+
it("按 accountId 隔离,且返回拷贝", () => {
|
|
104
|
+
setRobotEnv("acct-1", { A: "1" });
|
|
105
|
+
setRobotEnv("acct-2", { A: "2" });
|
|
106
|
+
assert.deepEqual(getRobotEnv("acct-1"), { A: "1" });
|
|
107
|
+
assert.deepEqual(getRobotEnv("acct-2"), { A: "2" });
|
|
108
|
+
const snapshot = getRobotEnv("acct-1");
|
|
109
|
+
snapshot.A = "mutated";
|
|
110
|
+
assert.deepEqual(getRobotEnv("acct-1"), { A: "1" });
|
|
111
|
+
});
|
|
112
|
+
it("空 accountId 不写入", () => {
|
|
113
|
+
setRobotEnv("", { A: "1" });
|
|
114
|
+
assert.equal(__robotEnvSizeForTests(), 0);
|
|
115
|
+
});
|
|
116
|
+
it("clearRobotEnv/clearRobotEnvStore 清空", () => {
|
|
117
|
+
setRobotEnv("acct-1", { A: "1" });
|
|
118
|
+
clearRobotEnv("acct-1");
|
|
119
|
+
assert.equal(getRobotEnv("acct-1"), undefined);
|
|
120
|
+
setRobotEnv("acct-1", { A: "1" });
|
|
121
|
+
setRobotEnv("acct-2", { B: "2" });
|
|
122
|
+
clearRobotEnvStore();
|
|
123
|
+
assert.equal(__robotEnvSizeForTests(), 0);
|
|
124
|
+
assert.equal(__robotEnvAgentSizeForTests(), 0);
|
|
125
|
+
});
|
|
126
|
+
it("按 agentId 建索引,供 cron/心跳无入站上下文兜底命中", () => {
|
|
127
|
+
setRobotEnv("acct-1", { A: "1" }, "agent-1");
|
|
128
|
+
assert.deepEqual(getRobotEnvByAgentId("agent-1"), { accountId: "acct-1", env: { A: "1" } });
|
|
129
|
+
// 账户索引同样可读
|
|
130
|
+
assert.deepEqual(getRobotEnv("acct-1"), { A: "1" });
|
|
131
|
+
assert.equal(__robotEnvAgentSizeForTests(), 1);
|
|
132
|
+
});
|
|
133
|
+
it("无 agentId 时只写账户索引", () => {
|
|
134
|
+
setRobotEnv("acct-1", { A: "1" });
|
|
135
|
+
assert.equal(getRobotEnvByAgentId("agent-1"), undefined);
|
|
136
|
+
assert.equal(__robotEnvAgentSizeForTests(), 0);
|
|
137
|
+
});
|
|
138
|
+
it("空 env 同时清除账户与 agent 索引", () => {
|
|
139
|
+
setRobotEnv("acct-1", { A: "1" }, "agent-1");
|
|
140
|
+
setRobotEnv("acct-1", {}, "agent-1");
|
|
141
|
+
assert.equal(getRobotEnv("acct-1"), undefined);
|
|
142
|
+
assert.equal(getRobotEnvByAgentId("agent-1"), undefined);
|
|
143
|
+
assert.equal(__robotEnvAgentSizeForTests(), 0);
|
|
144
|
+
});
|
|
145
|
+
it("整份替换时 agent 索引返回最新快照", () => {
|
|
146
|
+
setRobotEnv("acct-1", { A: "1" }, "agent-1");
|
|
147
|
+
setRobotEnv("acct-1", { A: "9" }, "agent-1");
|
|
148
|
+
assert.deepEqual(getRobotEnvByAgentId("agent-1"), { accountId: "acct-1", env: { A: "9" } });
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=robot-env-store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"robot-env-store.test.js","sourceRoot":"","sources":["../../../src/session/robot-env-store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,11 +35,16 @@ export declare function removeSessionEnvKey(sessionKey: string, key: string): vo
|
|
|
35
35
|
export declare function linkChildSession(childSessionKey: string, parentSessionKey: string): void;
|
|
36
36
|
/** 读取运行时登记的 child -> parent 关系;仅作为宿主父链不可用时的兼容回退。 */
|
|
37
37
|
export declare function getLinkedParentSessionKey(sessionKey: string | undefined): string | undefined;
|
|
38
|
-
/**
|
|
39
|
-
|
|
38
|
+
/**
|
|
39
|
+
* Record the last IM sender (+ channel account) for Cron binding audit metadata
|
|
40
|
+
* and for resolving the account-scoped robot env on non-inbound turns
|
|
41
|
+
* (heartbeat / exec completion wakeup) where `ctx.requester` is absent.
|
|
42
|
+
*/
|
|
43
|
+
export declare function setSessionUserContext(sessionKey: string, userId?: string, userName?: string, accountId?: string): void;
|
|
40
44
|
export declare function getSessionUserContext(sessionKey: string | undefined): {
|
|
41
45
|
userId?: string;
|
|
42
46
|
userName?: string;
|
|
47
|
+
accountId?: string;
|
|
43
48
|
} | undefined;
|
|
44
49
|
/**
|
|
45
50
|
* 解析某个会话应注入 exec 的 env:先查本会话;查不到则沿 subagent 父子链
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-env-store.d.ts","sourceRoot":"","sources":["../../../src/session/session-env-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-env-store.d.ts","sourceRoot":"","sources":["../../../src/session/session-env-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AAuDvD,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQtF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AA+GD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQhE;AAED,2BAA2B;AAC3B,wBAAgB,0BAA0B,IAAI,IAAI,CASjD;AAED,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CASnF;AAED,gDAAgD;AAChD,wBAAgB,kBAAkB,CAC9B,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,SAAS,GAC1B,IAAI,CAqBN;AAED,2BAA2B;AAC3B,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAMpF;AAED,yBAAyB;AACzB,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAOxD;AAED,uBAAuB;AACvB,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzE;AAED,+CAA+C;AAC/C,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAIxF;AAED,oDAAoD;AACpD,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE5F;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACnB,IAAI,CAQN;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC9D;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,SAAS,CAEd;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc3F;AAED,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAkB7C"}
|