@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.
Files changed (51) hide show
  1. package/dist/src/connection/account-connection.d.ts.map +1 -1
  2. package/dist/src/connection/account-connection.js +8 -1
  3. package/dist/src/connection/account-connection.js.map +1 -1
  4. package/dist/src/connection/connection.d.ts.map +1 -1
  5. package/dist/src/connection/connection.js +13 -9
  6. package/dist/src/connection/connection.js.map +1 -1
  7. package/dist/src/connection/ws-inbound-schema.test.js +29 -0
  8. package/dist/src/connection/ws-inbound-schema.test.js.map +1 -1
  9. package/dist/src/connection/ws-message-segment.d.ts +35 -0
  10. package/dist/src/connection/ws-message-segment.d.ts.map +1 -0
  11. package/dist/src/connection/ws-message-segment.js +111 -0
  12. package/dist/src/connection/ws-message-segment.js.map +1 -0
  13. package/dist/src/connection/ws-message-segment.test.d.ts +2 -0
  14. package/dist/src/connection/ws-message-segment.test.d.ts.map +1 -0
  15. package/dist/src/connection/ws-message-segment.test.js +76 -0
  16. package/dist/src/connection/ws-message-segment.test.js.map +1 -0
  17. package/dist/src/plugin/plugin-dispose.d.ts.map +1 -1
  18. package/dist/src/plugin/plugin-dispose.js +2 -0
  19. package/dist/src/plugin/plugin-dispose.js.map +1 -1
  20. package/dist/src/session/robot-env-store.d.ts +61 -0
  21. package/dist/src/session/robot-env-store.d.ts.map +1 -0
  22. package/dist/src/session/robot-env-store.js +356 -0
  23. package/dist/src/session/robot-env-store.js.map +1 -0
  24. package/dist/src/session/robot-env-store.test.d.ts +2 -0
  25. package/dist/src/session/robot-env-store.test.d.ts.map +1 -0
  26. package/dist/src/session/robot-env-store.test.js +151 -0
  27. package/dist/src/session/robot-env-store.test.js.map +1 -0
  28. package/dist/src/session/session-env-store.d.ts +7 -2
  29. package/dist/src/session/session-env-store.d.ts.map +1 -1
  30. package/dist/src/session/session-env-store.js +13 -4
  31. package/dist/src/session/session-env-store.js.map +1 -1
  32. package/dist/src/tools/register-exec-env-hook.d.ts +14 -0
  33. package/dist/src/tools/register-exec-env-hook.d.ts.map +1 -1
  34. package/dist/src/tools/register-exec-env-hook.js +48 -1
  35. package/dist/src/tools/register-exec-env-hook.js.map +1 -1
  36. package/dist/src/tools/register-exec-env-hook.test.js +81 -2
  37. package/dist/src/tools/register-exec-env-hook.test.js.map +1 -1
  38. package/dist/src/turn/active-round-registry.d.ts +5 -0
  39. package/dist/src/turn/active-round-registry.d.ts.map +1 -1
  40. package/dist/src/turn/active-round-registry.js +27 -2
  41. package/dist/src/turn/active-round-registry.js.map +1 -1
  42. package/dist/src/turn/active-round-registry.test.js +32 -1
  43. package/dist/src/turn/active-round-registry.test.js.map +1 -1
  44. package/dist/src/workspace/connection-workspace-event.test.js +58 -0
  45. package/dist/src/workspace/connection-workspace-event.test.js.map +1 -1
  46. package/dist/src/workspace/workspace-event.d.ts.map +1 -1
  47. package/dist/src/workspace/workspace-event.js +62 -6
  48. package/dist/src/workspace/workspace-event.js.map +1 -1
  49. package/dist/src/workspace/workspace-event.test.js +42 -0
  50. package/dist/src/workspace/workspace-event.test.js.map +1 -1
  51. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=robot-env-store.test.d.ts.map
@@ -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
- /** Record the last IM sender for optional Cron binding audit metadata. */
39
- export declare function setSessionUserContext(sessionKey: string, userId?: string, userName?: string): void;
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;AAsDvD,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,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAGlG;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAExH;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"}
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"}