@galaxy-stack/ai-coder-core 0.3.0-alpha.1 → 0.3.0-alpha.10
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.d/2026-09-19-research-rejection-evidence.md +15 -0
- package/CHANGELOG.d/2026-09-21-evidence-missing-remediation.md +15 -0
- package/CHANGELOG.d/2026-09-21-observation-nudge-context.md +12 -0
- package/CHANGELOG.d/2026-09-22-model-retry-budget.md +18 -0
- package/CHANGELOG.d/2026-09-22-no-progress-recovery-turn.md +19 -0
- package/CHANGELOG.d/2026-09-23-agent-platform.md +5 -0
- package/CHANGELOG.d/2026-09-23-conservative-output-reserve.md +16 -0
- package/CHANGELOG.d/2026-09-24-approval-workspace-review.md +7 -0
- package/CHANGELOG.d/2026-09-24-incremental-ollama.md +5 -0
- package/CHANGELOG.d/2026-09-25-tail-anchored-bounding.md +5 -0
- package/CHANGELOG.d/2026-09-26-default-model-deepseek.md +8 -0
- package/CHANGELOG.md +71 -1
- package/README.md +78 -4
- package/dist/adapters/node/config/manual-provider-config.d.ts +19 -0
- package/dist/adapters/node/config/manual-provider-config.d.ts.map +1 -0
- package/dist/adapters/node/config/manual-provider-config.js +91 -0
- package/dist/adapters/node/config/manual-provider-config.js.map +1 -0
- package/dist/adapters/node/host/command-containment.d.ts +45 -0
- package/dist/adapters/node/host/command-containment.d.ts.map +1 -0
- package/dist/adapters/node/host/command-containment.js +580 -0
- package/dist/adapters/node/host/command-containment.js.map +1 -0
- package/dist/adapters/node/host/content-hash.d.ts +2 -0
- package/dist/adapters/node/host/content-hash.d.ts.map +1 -0
- package/dist/adapters/node/host/content-hash.js +5 -0
- package/dist/adapters/node/host/content-hash.js.map +1 -0
- package/dist/adapters/node/host/file-run-store.d.ts +29 -0
- package/dist/adapters/node/host/file-run-store.d.ts.map +1 -0
- package/dist/adapters/node/host/file-run-store.js +94 -0
- package/dist/adapters/node/host/file-run-store.js.map +1 -0
- package/dist/adapters/node/host/host-environment.d.ts +9 -0
- package/dist/adapters/node/host/host-environment.d.ts.map +1 -0
- package/dist/adapters/node/host/host-environment.js +29 -0
- package/dist/adapters/node/host/host-environment.js.map +1 -0
- package/dist/adapters/node/host/node-command-port.d.ts +21 -0
- package/dist/adapters/node/host/node-command-port.d.ts.map +1 -0
- package/dist/adapters/node/host/node-command-port.js +281 -0
- package/dist/adapters/node/host/node-command-port.js.map +1 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.d.ts +22 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.d.ts.map +1 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.js +384 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.js.map +1 -0
- package/dist/adapters/node/host/node-workspace-port.d.ts +87 -0
- package/dist/adapters/node/host/node-workspace-port.d.ts.map +1 -0
- package/dist/adapters/node/host/node-workspace-port.js +860 -0
- package/dist/adapters/node/host/node-workspace-port.js.map +1 -0
- package/dist/adapters/node/host/node-workspace-snapshot.d.ts +61 -0
- package/dist/adapters/node/host/node-workspace-snapshot.d.ts.map +1 -0
- package/dist/adapters/node/host/node-workspace-snapshot.js +282 -0
- package/dist/adapters/node/host/node-workspace-snapshot.js.map +1 -0
- package/dist/adapters/node/host/path-scope.d.ts +17 -0
- package/dist/adapters/node/host/path-scope.d.ts.map +1 -0
- package/dist/adapters/node/host/path-scope.js +89 -0
- package/dist/adapters/node/host/path-scope.js.map +1 -0
- package/dist/adapters/node/host/project-tools.d.ts +42 -0
- package/dist/adapters/node/host/project-tools.d.ts.map +1 -0
- package/dist/adapters/node/host/project-tools.js +362 -0
- package/dist/adapters/node/host/project-tools.js.map +1 -0
- package/dist/adapters/node/mcp/mcp-client.d.ts +206 -0
- package/dist/adapters/node/mcp/mcp-client.d.ts.map +1 -0
- package/dist/adapters/node/mcp/mcp-client.js +128 -0
- package/dist/adapters/node/mcp/mcp-client.js.map +1 -0
- package/dist/adapters/node/mcp/oauth-provider.d.ts +39 -0
- package/dist/adapters/node/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/adapters/node/mcp/oauth-provider.js +168 -0
- package/dist/adapters/node/mcp/oauth-provider.js.map +1 -0
- package/dist/adapters/node/memory/sqlite-memory.d.ts +22 -0
- package/dist/adapters/node/memory/sqlite-memory.d.ts.map +1 -0
- package/dist/adapters/node/memory/sqlite-memory.js +83 -0
- package/dist/adapters/node/memory/sqlite-memory.js.map +1 -0
- package/dist/adapters/node/provider/ollama-chat-stream.d.ts +17 -0
- package/dist/adapters/node/provider/ollama-chat-stream.d.ts.map +1 -0
- package/dist/adapters/node/provider/ollama-chat-stream.js +176 -0
- package/dist/adapters/node/provider/ollama-chat-stream.js.map +1 -0
- package/dist/adapters/node/provider/ollama-coding-model.d.ts +89 -0
- package/dist/adapters/node/provider/ollama-coding-model.d.ts.map +1 -0
- package/dist/adapters/node/provider/ollama-coding-model.js +464 -0
- package/dist/adapters/node/provider/ollama-coding-model.js.map +1 -0
- package/dist/adapters/node/provider/ollama-research-port.d.ts +32 -0
- package/dist/adapters/node/provider/ollama-research-port.d.ts.map +1 -0
- package/dist/adapters/node/provider/ollama-research-port.js +346 -0
- package/dist/adapters/node/provider/ollama-research-port.js.map +1 -0
- package/dist/adapters/node/skills/directory-skills.d.ts +12 -0
- package/dist/adapters/node/skills/directory-skills.d.ts.map +1 -0
- package/dist/adapters/node/skills/directory-skills.js +90 -0
- package/dist/adapters/node/skills/directory-skills.js.map +1 -0
- package/dist/adapters/node/tools/tool-executor.d.ts +91 -0
- package/dist/adapters/node/tools/tool-executor.d.ts.map +1 -0
- package/dist/adapters/node/tools/tool-executor.js +948 -0
- package/dist/adapters/node/tools/tool-executor.js.map +1 -0
- package/dist/adapters/node/tools/workspace-review.d.ts +13 -0
- package/dist/adapters/node/tools/workspace-review.d.ts.map +1 -0
- package/dist/adapters/node/tools/workspace-review.js +81 -0
- package/dist/adapters/node/tools/workspace-review.js.map +1 -0
- package/dist/agent/index.d.ts +79 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +97 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/approval/approval-policy.d.ts.map +1 -1
- package/dist/approval/approval-policy.js +4 -1
- package/dist/approval/approval-policy.js.map +1 -1
- package/dist/context/checkpoint.d.ts +2 -0
- package/dist/context/checkpoint.d.ts.map +1 -1
- package/dist/context/checkpoint.js +6 -3
- package/dist/context/checkpoint.js.map +1 -1
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +21 -8
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/context-profile.d.ts +1 -1
- package/dist/context/context-profile.js +2 -2
- package/dist/context/tool-output.d.ts.map +1 -1
- package/dist/context/tool-output.js +23 -4
- package/dist/context/tool-output.js.map +1 -1
- package/dist/prompt/prompt-assembler.d.ts +1 -0
- package/dist/prompt/prompt-assembler.d.ts.map +1 -1
- package/dist/prompt/prompt-assembler.js +16 -2
- package/dist/prompt/prompt-assembler.js.map +1 -1
- package/dist/runtime/run-controller.d.ts.map +1 -1
- package/dist/runtime/run-controller.js +135 -26
- package/dist/runtime/run-controller.js.map +1 -1
- package/dist/runtime/runtime-types.d.ts +20 -0
- package/dist/runtime/runtime-types.d.ts.map +1 -1
- package/dist/tools/settings-types.js +1 -1
- package/dist/tools/settings-types.js.map +1 -1
- package/dist/tools/tool-registry.js +1 -1
- package/dist/tools/tool-registry.js.map +1 -1
- package/docs/AGENT_PLATFORM.md +91 -0
- package/docs/GALAXY_AGENT_PLATFORM_PLAN.md +176 -0
- package/docs/GALAXY_AGENT_PLATFORM_TODO.md +181 -0
- package/package.json +19 -5
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { constants, existsSync } from "node:fs";
|
|
4
|
+
import { access, link, lstat, mkdtemp, readFile, readdir, realpath, rm, writeFile } from "node:fs/promises";
|
|
5
|
+
import { createServer } from "node:net";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { delimiter, join, relative, sep } from "node:path";
|
|
8
|
+
const MACOS_SANDBOX_EXECUTABLE = "/usr/bin/sandbox-exec";
|
|
9
|
+
/*
|
|
10
|
+
* Prototype profile used only by the conformance probe. It is intentionally
|
|
11
|
+
* not selected for real NodeCommandPort runs: the probe currently demonstrates
|
|
12
|
+
* that pathname-based Seatbelt write rules do not protect outside inodes
|
|
13
|
+
* reachable through workspace hard links, and do not supervise descendants
|
|
14
|
+
* that create a new process group.
|
|
15
|
+
*
|
|
16
|
+
* The profile is a write/network experiment, not a confidentiality boundary.
|
|
17
|
+
* Broad reads keep the installed Node/toolchain visible. There are no TTY,
|
|
18
|
+
* pseudo-terminal, or network allowances.
|
|
19
|
+
*/
|
|
20
|
+
const MACOS_CONFORMANCE_PROFILE = `(version 1)
|
|
21
|
+
(deny default)
|
|
22
|
+
(allow file-read*)
|
|
23
|
+
(allow process-exec)
|
|
24
|
+
(allow process-fork)
|
|
25
|
+
(allow signal (target self))
|
|
26
|
+
(allow sysctl-read)
|
|
27
|
+
(allow file-write*
|
|
28
|
+
(subpath (param "WORKSPACE"))
|
|
29
|
+
(subpath (param "PRIVATE_TMP"))
|
|
30
|
+
(literal "/dev/stdout")
|
|
31
|
+
(literal "/dev/stderr")
|
|
32
|
+
(literal "/dev/null"))
|
|
33
|
+
(allow mach-lookup
|
|
34
|
+
(global-name "com.apple.system.opendirectoryd.libinfo")
|
|
35
|
+
(global-name "com.apple.system.opendirectoryd.membership")
|
|
36
|
+
(global-name "com.apple.bsd.dirhelper")
|
|
37
|
+
(global-name "com.apple.SecurityServer")
|
|
38
|
+
(global-name "com.apple.trustd")
|
|
39
|
+
(global-name "com.apple.trustd.agent"))`;
|
|
40
|
+
const PROBE_TIMEOUT_MS = 5_000;
|
|
41
|
+
const DESCENDANT_OBSERVATION_MS = 700;
|
|
42
|
+
const MACOS_PROBE_SCRIPT = String.raw `
|
|
43
|
+
const fs = require("node:fs");
|
|
44
|
+
const net = require("node:net");
|
|
45
|
+
const { spawn } = require("node:child_process");
|
|
46
|
+
const result = {
|
|
47
|
+
descendantChildSpawned: false,
|
|
48
|
+
hardLinkWriteDenied: false,
|
|
49
|
+
networkDenied: false,
|
|
50
|
+
outsideWriteDenied: false,
|
|
51
|
+
privateTempWrite: false,
|
|
52
|
+
systemRead: false,
|
|
53
|
+
workspaceWrite: false,
|
|
54
|
+
};
|
|
55
|
+
try {
|
|
56
|
+
fs.readFileSync("/etc/hosts");
|
|
57
|
+
result.systemRead = true;
|
|
58
|
+
fs.writeFileSync(process.env.GALAXY_PROBE_WORKSPACE_FILE, "workspace-ok", "utf8");
|
|
59
|
+
result.workspaceWrite = true;
|
|
60
|
+
fs.writeFileSync(process.env.GALAXY_PROBE_TEMP_FILE, "temp-ok", "utf8");
|
|
61
|
+
result.privateTempWrite = true;
|
|
62
|
+
try {
|
|
63
|
+
fs.writeFileSync(process.env.GALAXY_PROBE_OUTSIDE_FILE, "changed", "utf8");
|
|
64
|
+
} catch (error) {
|
|
65
|
+
result.outsideWriteDenied = Boolean(error);
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
fs.writeFileSync(process.env.GALAXY_PROBE_HARD_LINK_FILE, "changed-through-link", "utf8");
|
|
69
|
+
} catch (error) {
|
|
70
|
+
result.hardLinkWriteDenied = error && (error.code === "EACCES" || error.code === "EPERM");
|
|
71
|
+
}
|
|
72
|
+
const lateScript = 'setTimeout(() => require("node:fs").writeFileSync(process.env.GALAXY_PROBE_LATE_FILE, "late", "utf8"), 250)';
|
|
73
|
+
const child = spawn(process.execPath, ["-e", lateScript], {
|
|
74
|
+
detached: true,
|
|
75
|
+
env: process.env,
|
|
76
|
+
stdio: "ignore",
|
|
77
|
+
});
|
|
78
|
+
result.descendantChildSpawned = child.pid !== undefined;
|
|
79
|
+
child.unref();
|
|
80
|
+
} catch {}
|
|
81
|
+
let finished = false;
|
|
82
|
+
const finish = () => {
|
|
83
|
+
if (finished) return;
|
|
84
|
+
finished = true;
|
|
85
|
+
process.stdout.write(JSON.stringify(result));
|
|
86
|
+
};
|
|
87
|
+
const socket = net.createConnection({
|
|
88
|
+
host: "127.0.0.1",
|
|
89
|
+
port: Number(process.env.GALAXY_PROBE_PORT),
|
|
90
|
+
});
|
|
91
|
+
socket.once("connect", () => {
|
|
92
|
+
socket.destroy();
|
|
93
|
+
finish();
|
|
94
|
+
});
|
|
95
|
+
socket.once("error", (error) => {
|
|
96
|
+
result.networkDenied = Boolean(error);
|
|
97
|
+
finish();
|
|
98
|
+
});
|
|
99
|
+
socket.setTimeout(2_000, () => {
|
|
100
|
+
result.networkDenied = true;
|
|
101
|
+
socket.destroy();
|
|
102
|
+
finish();
|
|
103
|
+
});
|
|
104
|
+
`;
|
|
105
|
+
let cachedProbe;
|
|
106
|
+
function freezeProbe(result) {
|
|
107
|
+
return Object.freeze({ ...result });
|
|
108
|
+
}
|
|
109
|
+
function unavailableProbe(backend, executable, available, reason) {
|
|
110
|
+
return freezeProbe({
|
|
111
|
+
available,
|
|
112
|
+
backend,
|
|
113
|
+
descendantChildSpawned: false,
|
|
114
|
+
descendantQuiescent: false,
|
|
115
|
+
executable,
|
|
116
|
+
hardLinkWriteDenied: false,
|
|
117
|
+
networkDenied: false,
|
|
118
|
+
outsideWriteDenied: false,
|
|
119
|
+
privateTempWrite: false,
|
|
120
|
+
reason,
|
|
121
|
+
systemRead: false,
|
|
122
|
+
toolchainExecution: false,
|
|
123
|
+
verified: false,
|
|
124
|
+
workspaceWrite: false,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function errorMessage(error) {
|
|
128
|
+
return error instanceof Error ? error.message : String(error);
|
|
129
|
+
}
|
|
130
|
+
function delay(milliseconds) {
|
|
131
|
+
return new Promise((resolveDelay) => setTimeout(resolveDelay, milliseconds));
|
|
132
|
+
}
|
|
133
|
+
async function isExecutable(path) {
|
|
134
|
+
try {
|
|
135
|
+
await access(path, constants.X_OK);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
async function executableOnPath(name) {
|
|
143
|
+
for (const entry of (process.env.PATH ?? "").split(delimiter)) {
|
|
144
|
+
if (entry.length === 0)
|
|
145
|
+
continue;
|
|
146
|
+
const candidate = join(entry, name);
|
|
147
|
+
if (await isExecutable(candidate))
|
|
148
|
+
return candidate;
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
function killProbeProcessGroup(pid) {
|
|
153
|
+
if (pid === undefined)
|
|
154
|
+
return;
|
|
155
|
+
try {
|
|
156
|
+
process.kill(-pid, "SIGKILL");
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
try {
|
|
160
|
+
process.kill(pid, "SIGKILL");
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// Nothing remains to terminate.
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async function runProbeProcess(executable, args, env) {
|
|
168
|
+
return await new Promise((resolveResult) => {
|
|
169
|
+
const child = spawn(executable, args, {
|
|
170
|
+
detached: true,
|
|
171
|
+
env,
|
|
172
|
+
shell: false,
|
|
173
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
174
|
+
});
|
|
175
|
+
let didTimeOut = false;
|
|
176
|
+
let forceFinish;
|
|
177
|
+
let settled = false;
|
|
178
|
+
let stderr = "";
|
|
179
|
+
let stdout = "";
|
|
180
|
+
const finish = (exitCode) => {
|
|
181
|
+
if (settled)
|
|
182
|
+
return;
|
|
183
|
+
settled = true;
|
|
184
|
+
clearTimeout(timeout);
|
|
185
|
+
if (forceFinish !== undefined)
|
|
186
|
+
clearTimeout(forceFinish);
|
|
187
|
+
resolveResult(Object.freeze({ exitCode, stderr, stdout, timedOut: didTimeOut }));
|
|
188
|
+
};
|
|
189
|
+
const timeout = setTimeout(() => {
|
|
190
|
+
didTimeOut = true;
|
|
191
|
+
killProbeProcessGroup(child.pid);
|
|
192
|
+
forceFinish = setTimeout(() => finish(null), 1_000);
|
|
193
|
+
forceFinish.unref();
|
|
194
|
+
}, PROBE_TIMEOUT_MS);
|
|
195
|
+
timeout.unref();
|
|
196
|
+
child.stdout?.setEncoding("utf8");
|
|
197
|
+
child.stderr?.setEncoding("utf8");
|
|
198
|
+
child.stdout?.on("data", (chunk) => {
|
|
199
|
+
if (stdout.length < 64_000)
|
|
200
|
+
stdout += chunk;
|
|
201
|
+
});
|
|
202
|
+
child.stderr?.on("data", (chunk) => {
|
|
203
|
+
if (stderr.length < 64_000)
|
|
204
|
+
stderr += chunk;
|
|
205
|
+
});
|
|
206
|
+
child.once("error", (error) => {
|
|
207
|
+
stderr += errorMessage(error);
|
|
208
|
+
finish(null);
|
|
209
|
+
});
|
|
210
|
+
child.once("close", (exitCode) => finish(exitCode));
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
async function listenOnLoopback(server) {
|
|
214
|
+
return await new Promise((resolvePort, reject) => {
|
|
215
|
+
const onError = (error) => reject(error);
|
|
216
|
+
server.once("error", onError);
|
|
217
|
+
server.listen(0, "127.0.0.1", () => {
|
|
218
|
+
server.off("error", onError);
|
|
219
|
+
const address = server.address();
|
|
220
|
+
if (address === null || typeof address === "string") {
|
|
221
|
+
reject(new Error("The containment probe did not receive a TCP port."));
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
resolvePort(address.port);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
async function closeServer(server) {
|
|
229
|
+
if (!server.listening)
|
|
230
|
+
return;
|
|
231
|
+
await new Promise((resolveClose) => server.close(() => resolveClose()));
|
|
232
|
+
}
|
|
233
|
+
async function probeMacOsSeatbelt() {
|
|
234
|
+
if (!(await isExecutable(MACOS_SANDBOX_EXECUTABLE))) {
|
|
235
|
+
return unavailableProbe("macos_sandbox_exec", MACOS_SANDBOX_EXECUTABLE, false, `${MACOS_SANDBOX_EXECUTABLE} is not executable.`);
|
|
236
|
+
}
|
|
237
|
+
const temporaryRoots = [];
|
|
238
|
+
const server = createServer((socket) => socket.destroy());
|
|
239
|
+
let networkConnections = 0;
|
|
240
|
+
server.on("connection", () => {
|
|
241
|
+
networkConnections += 1;
|
|
242
|
+
});
|
|
243
|
+
try {
|
|
244
|
+
const makeTemporaryRoot = async (prefix) => {
|
|
245
|
+
const root = await mkdtemp(join(tmpdir(), prefix));
|
|
246
|
+
temporaryRoots.push(root);
|
|
247
|
+
return await realpath(root);
|
|
248
|
+
};
|
|
249
|
+
// Allocate sequentially so a rejection cannot race successful siblings
|
|
250
|
+
// that have not yet registered themselves for the finally cleanup.
|
|
251
|
+
const workspace = await makeTemporaryRoot("galaxy-containment-workspace-");
|
|
252
|
+
const privateTemp = await makeTemporaryRoot("galaxy-containment-temp-");
|
|
253
|
+
const outside = await makeTemporaryRoot("galaxy-containment-outside-");
|
|
254
|
+
const workspaceFile = join(workspace, `workspace-${randomUUID()}`);
|
|
255
|
+
const privateTempFile = join(privateTemp, `temp-${randomUUID()}`);
|
|
256
|
+
const outsideFile = join(outside, `sentinel-${randomUUID()}`);
|
|
257
|
+
const outsideHardLinkTarget = join(outside, `hard-link-target-${randomUUID()}`);
|
|
258
|
+
const workspaceHardLink = join(workspace, `hard-link-${randomUUID()}`);
|
|
259
|
+
const lateFile = join(workspace, `late-${randomUUID()}`);
|
|
260
|
+
const sentinel = `outside-${randomUUID()}`;
|
|
261
|
+
const hardLinkSentinel = `hard-link-outside-${randomUUID()}`;
|
|
262
|
+
await Promise.all([
|
|
263
|
+
writeFile(outsideFile, sentinel, "utf8"),
|
|
264
|
+
writeFile(outsideHardLinkTarget, hardLinkSentinel, "utf8"),
|
|
265
|
+
]);
|
|
266
|
+
await link(outsideHardLinkTarget, workspaceHardLink);
|
|
267
|
+
const port = await listenOnLoopback(server);
|
|
268
|
+
const environment = {
|
|
269
|
+
CI: "1",
|
|
270
|
+
FORCE_COLOR: "0",
|
|
271
|
+
GALAXY_PROBE_HARD_LINK_FILE: workspaceHardLink,
|
|
272
|
+
GALAXY_PROBE_LATE_FILE: lateFile,
|
|
273
|
+
GALAXY_PROBE_OUTSIDE_FILE: outsideFile,
|
|
274
|
+
GALAXY_PROBE_PORT: String(port),
|
|
275
|
+
GALAXY_PROBE_TEMP_FILE: privateTempFile,
|
|
276
|
+
GALAXY_PROBE_WORKSPACE_FILE: workspaceFile,
|
|
277
|
+
PATH: process.env.PATH,
|
|
278
|
+
TEMP: privateTemp,
|
|
279
|
+
TMP: privateTemp,
|
|
280
|
+
TMPDIR: privateTemp,
|
|
281
|
+
};
|
|
282
|
+
const processResult = await runProbeProcess(MACOS_SANDBOX_EXECUTABLE, [
|
|
283
|
+
"-D",
|
|
284
|
+
`WORKSPACE=${workspace}`,
|
|
285
|
+
"-D",
|
|
286
|
+
`PRIVATE_TMP=${privateTemp}`,
|
|
287
|
+
"-p",
|
|
288
|
+
MACOS_CONFORMANCE_PROFILE,
|
|
289
|
+
process.execPath,
|
|
290
|
+
"-e",
|
|
291
|
+
MACOS_PROBE_SCRIPT,
|
|
292
|
+
], environment);
|
|
293
|
+
await delay(DESCENDANT_OBSERVATION_MS);
|
|
294
|
+
let payload;
|
|
295
|
+
try {
|
|
296
|
+
payload = JSON.parse(processResult.stdout);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
payload = undefined;
|
|
300
|
+
}
|
|
301
|
+
const [workspaceContent, privateTempContent, outsideContent, hardLinkContent, lateContent] = await Promise.all([
|
|
302
|
+
readFile(workspaceFile, "utf8").catch(() => ""),
|
|
303
|
+
readFile(privateTempFile, "utf8").catch(() => ""),
|
|
304
|
+
readFile(outsideFile, "utf8").catch(() => ""),
|
|
305
|
+
readFile(outsideHardLinkTarget, "utf8").catch(() => ""),
|
|
306
|
+
readFile(lateFile, "utf8").catch(() => ""),
|
|
307
|
+
]);
|
|
308
|
+
const systemRead = payload?.systemRead === true;
|
|
309
|
+
const workspaceWrite = payload?.workspaceWrite === true && workspaceContent === "workspace-ok";
|
|
310
|
+
const privateTempWrite = payload?.privateTempWrite === true && privateTempContent === "temp-ok";
|
|
311
|
+
const outsideWriteDenied = payload?.outsideWriteDenied === true && outsideContent === sentinel;
|
|
312
|
+
const hardLinkWriteDenied = payload?.hardLinkWriteDenied === true && hardLinkContent === hardLinkSentinel;
|
|
313
|
+
const networkDenied = payload?.networkDenied === true && networkConnections === 0;
|
|
314
|
+
const descendantChildSpawned = payload?.descendantChildSpawned === true;
|
|
315
|
+
const descendantQuiescent = descendantChildSpawned && lateContent.length === 0;
|
|
316
|
+
const toolchainExecution = processResult.exitCode === 0 && !processResult.timedOut;
|
|
317
|
+
const assertions = {
|
|
318
|
+
descendantChildSpawned,
|
|
319
|
+
descendantQuiescent,
|
|
320
|
+
hardLinkWriteDenied,
|
|
321
|
+
networkDenied,
|
|
322
|
+
outsideWriteDenied,
|
|
323
|
+
privateTempWrite,
|
|
324
|
+
systemRead,
|
|
325
|
+
toolchainExecution,
|
|
326
|
+
workspaceWrite,
|
|
327
|
+
};
|
|
328
|
+
const failedAssertions = Object.entries(assertions)
|
|
329
|
+
.filter(([, passed]) => !passed)
|
|
330
|
+
.map(([name]) => name);
|
|
331
|
+
const verified = failedAssertions.length === 0;
|
|
332
|
+
const detail = processResult.timedOut
|
|
333
|
+
? "The Seatbelt conformance probe timed out."
|
|
334
|
+
: processResult.exitCode !== 0
|
|
335
|
+
? `The Seatbelt conformance probe exited with ${String(processResult.exitCode)}: ${processResult.stderr.trim()}`
|
|
336
|
+
: !verified
|
|
337
|
+
? `The Seatbelt conformance probe failed: ${failedAssertions.join(", ")}.`
|
|
338
|
+
: null;
|
|
339
|
+
return freezeProbe({
|
|
340
|
+
available: true,
|
|
341
|
+
backend: "macos_sandbox_exec",
|
|
342
|
+
descendantChildSpawned,
|
|
343
|
+
descendantQuiescent,
|
|
344
|
+
executable: MACOS_SANDBOX_EXECUTABLE,
|
|
345
|
+
hardLinkWriteDenied,
|
|
346
|
+
networkDenied,
|
|
347
|
+
outsideWriteDenied,
|
|
348
|
+
privateTempWrite,
|
|
349
|
+
reason: detail,
|
|
350
|
+
systemRead,
|
|
351
|
+
toolchainExecution,
|
|
352
|
+
verified,
|
|
353
|
+
workspaceWrite,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
return unavailableProbe("macos_sandbox_exec", MACOS_SANDBOX_EXECUTABLE, true, `The Seatbelt conformance probe failed: ${errorMessage(error)}`);
|
|
358
|
+
}
|
|
359
|
+
finally {
|
|
360
|
+
await closeServer(server).catch(() => undefined);
|
|
361
|
+
await Promise.all(temporaryRoots.map(async (root) => {
|
|
362
|
+
await rm(root, { force: true, recursive: true });
|
|
363
|
+
})).catch(() => undefined);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
async function probeLinuxBubblewrap() {
|
|
367
|
+
const executable = await executableOnPath("bwrap");
|
|
368
|
+
if (executable === null) {
|
|
369
|
+
return unavailableProbe("linux_bubblewrap", null, false, "bubblewrap (bwrap) is not available on PATH.");
|
|
370
|
+
}
|
|
371
|
+
const temporaryRoots = [];
|
|
372
|
+
const server = createServer((socket) => socket.destroy());
|
|
373
|
+
let networkConnections = 0;
|
|
374
|
+
server.on("connection", () => {
|
|
375
|
+
networkConnections += 1;
|
|
376
|
+
});
|
|
377
|
+
try {
|
|
378
|
+
const makeTemporaryRoot = async (prefix) => {
|
|
379
|
+
const root = await mkdtemp(join(tmpdir(), prefix));
|
|
380
|
+
temporaryRoots.push(root);
|
|
381
|
+
return await realpath(root);
|
|
382
|
+
};
|
|
383
|
+
const workspace = await makeTemporaryRoot("galaxy-bwrap-workspace-");
|
|
384
|
+
const outside = await makeTemporaryRoot("galaxy-bwrap-outside-");
|
|
385
|
+
const workspaceFile = join(workspace, `workspace-${randomUUID()}`);
|
|
386
|
+
const outsideFile = join(outside, `sentinel-${randomUUID()}`);
|
|
387
|
+
const lateFile = join(workspace, `late-${randomUUID()}`);
|
|
388
|
+
const hardLinkTarget = join(outside, `hard-link-target-${randomUUID()}`);
|
|
389
|
+
const hardLinkPath = join(workspace, `hard-link-${randomUUID()}`);
|
|
390
|
+
const sentinel = `outside-${randomUUID()}`;
|
|
391
|
+
await Promise.all([
|
|
392
|
+
writeFile(outsideFile, sentinel, "utf8"),
|
|
393
|
+
writeFile(hardLinkTarget, sentinel, "utf8"),
|
|
394
|
+
]);
|
|
395
|
+
await link(hardLinkTarget, hardLinkPath);
|
|
396
|
+
let hardLinkWriteDenied = false;
|
|
397
|
+
try {
|
|
398
|
+
await assertWorkspaceHasNoHardLinks(workspace);
|
|
399
|
+
}
|
|
400
|
+
catch {
|
|
401
|
+
hardLinkWriteDenied = true;
|
|
402
|
+
}
|
|
403
|
+
await rm(hardLinkPath);
|
|
404
|
+
const port = await listenOnLoopback(server);
|
|
405
|
+
const environment = {
|
|
406
|
+
CI: "1",
|
|
407
|
+
FORCE_COLOR: "0",
|
|
408
|
+
GALAXY_PROBE_HARD_LINK_FILE: "/workspace/nonexistent-hard-link",
|
|
409
|
+
GALAXY_PROBE_LATE_FILE: `/workspace/${lateFile.split(sep).at(-1) ?? "late"}`,
|
|
410
|
+
GALAXY_PROBE_OUTSIDE_FILE: outsideFile,
|
|
411
|
+
GALAXY_PROBE_PORT: String(port),
|
|
412
|
+
GALAXY_PROBE_TEMP_FILE: "/tmp/probe-temp",
|
|
413
|
+
GALAXY_PROBE_WORKSPACE_FILE: `/workspace/${workspaceFile.split(sep).at(-1) ?? "workspace"}`,
|
|
414
|
+
PATH: "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
|
|
415
|
+
TEMP: "/tmp",
|
|
416
|
+
TMP: "/tmp",
|
|
417
|
+
TMPDIR: "/tmp",
|
|
418
|
+
};
|
|
419
|
+
const processResult = await runProbeProcess(executable, buildBubblewrapArguments({
|
|
420
|
+
command: process.execPath,
|
|
421
|
+
commandArguments: Object.freeze(["-e", MACOS_PROBE_SCRIPT]),
|
|
422
|
+
cwd: workspace,
|
|
423
|
+
environment,
|
|
424
|
+
workspace,
|
|
425
|
+
}), environment);
|
|
426
|
+
await delay(DESCENDANT_OBSERVATION_MS);
|
|
427
|
+
let payload;
|
|
428
|
+
try {
|
|
429
|
+
payload = JSON.parse(processResult.stdout);
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
payload = undefined;
|
|
433
|
+
}
|
|
434
|
+
const [workspaceContent, outsideContent, lateContent] = await Promise.all([
|
|
435
|
+
readFile(workspaceFile, "utf8").catch(() => ""),
|
|
436
|
+
readFile(outsideFile, "utf8").catch(() => ""),
|
|
437
|
+
readFile(lateFile, "utf8").catch(() => ""),
|
|
438
|
+
]);
|
|
439
|
+
const assertions = {
|
|
440
|
+
descendantChildSpawned: payload?.descendantChildSpawned === true,
|
|
441
|
+
descendantQuiescent: payload?.descendantChildSpawned === true && lateContent.length === 0,
|
|
442
|
+
hardLinkWriteDenied,
|
|
443
|
+
networkDenied: payload?.networkDenied === true && networkConnections === 0,
|
|
444
|
+
outsideWriteDenied: payload?.outsideWriteDenied === true && outsideContent === sentinel,
|
|
445
|
+
privateTempWrite: payload?.privateTempWrite === true,
|
|
446
|
+
systemRead: payload?.systemRead === true,
|
|
447
|
+
toolchainExecution: processResult.exitCode === 0 && !processResult.timedOut,
|
|
448
|
+
workspaceWrite: payload?.workspaceWrite === true && workspaceContent === "workspace-ok",
|
|
449
|
+
};
|
|
450
|
+
const failed = Object.entries(assertions).filter(([, passed]) => !passed).map(([name]) => name);
|
|
451
|
+
return freezeProbe({
|
|
452
|
+
available: true,
|
|
453
|
+
backend: "linux_bubblewrap",
|
|
454
|
+
...assertions,
|
|
455
|
+
executable,
|
|
456
|
+
reason: failed.length === 0 ? null : `The bubblewrap conformance probe failed: ${failed.join(", ")}.`,
|
|
457
|
+
verified: failed.length === 0,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
catch (error) {
|
|
461
|
+
return unavailableProbe("linux_bubblewrap", executable, true, `The bubblewrap conformance probe failed: ${errorMessage(error)}`);
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
await closeServer(server).catch(() => undefined);
|
|
465
|
+
await Promise.all(temporaryRoots.map(async (root) => rm(root, { force: true, recursive: true }))).catch(() => undefined);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
async function detectCommandContainment() {
|
|
469
|
+
try {
|
|
470
|
+
return process.platform === "darwin"
|
|
471
|
+
? await probeMacOsSeatbelt()
|
|
472
|
+
: process.platform === "linux"
|
|
473
|
+
? await probeLinuxBubblewrap()
|
|
474
|
+
: unavailableProbe("none", null, false, `No command-containment backend is implemented for '${process.platform}'.`);
|
|
475
|
+
}
|
|
476
|
+
catch (error) {
|
|
477
|
+
return unavailableProbe("none", null, false, `Command-containment detection failed closed: ${errorMessage(error)}`);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Run the host conformance check once per process. A binary merely existing is
|
|
482
|
+
* not enough. Only a backend that passes every probe assertion can activate.
|
|
483
|
+
*/
|
|
484
|
+
export async function probeCommandContainment() {
|
|
485
|
+
cachedProbe ??= detectCommandContainment();
|
|
486
|
+
return await cachedProbe;
|
|
487
|
+
}
|
|
488
|
+
export function containmentStatus(mode, probe) {
|
|
489
|
+
const assertionsVerified = probe.descendantChildSpawned
|
|
490
|
+
&& probe.descendantQuiescent
|
|
491
|
+
&& probe.hardLinkWriteDenied
|
|
492
|
+
&& probe.networkDenied
|
|
493
|
+
&& probe.outsideWriteDenied
|
|
494
|
+
&& probe.privateTempWrite
|
|
495
|
+
&& probe.systemRead
|
|
496
|
+
&& probe.toolchainExecution
|
|
497
|
+
&& probe.workspaceWrite;
|
|
498
|
+
const active = probe.backend === "linux_bubblewrap" && probe.verified && assertionsVerified;
|
|
499
|
+
const state = !probe.available
|
|
500
|
+
? "unavailable"
|
|
501
|
+
: active
|
|
502
|
+
? "active"
|
|
503
|
+
: probe.verified
|
|
504
|
+
? "unverified"
|
|
505
|
+
: "probe_failed";
|
|
506
|
+
const reason = active ? null : probe.verified && !assertionsVerified
|
|
507
|
+
? "The backend claimed verification without passing every containment assertion."
|
|
508
|
+
: probe.verified
|
|
509
|
+
? "The backend passed its probe but this platform implementation is not activated."
|
|
510
|
+
: probe.reason;
|
|
511
|
+
return Object.freeze({
|
|
512
|
+
active,
|
|
513
|
+
backend: probe.backend,
|
|
514
|
+
executable: probe.executable,
|
|
515
|
+
filesystemReads: active ? "system_and_workspace" : "host_visible",
|
|
516
|
+
filesystemWrites: active ? "workspace_and_private_temp" : "uncontained",
|
|
517
|
+
mode,
|
|
518
|
+
network: active ? "denied" : "uncontained",
|
|
519
|
+
reason,
|
|
520
|
+
state,
|
|
521
|
+
verified: active,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
const BUBBLEWRAP_READ_ONLY_ROOTS = Object.freeze([
|
|
525
|
+
"/bin", "/etc", "/lib", "/lib64", "/nix/store", "/opt", "/sbin", "/usr",
|
|
526
|
+
]);
|
|
527
|
+
export function buildBubblewrapArguments(input) {
|
|
528
|
+
const relativeCwd = relative(input.workspace, input.cwd);
|
|
529
|
+
if (relativeCwd === ".." || relativeCwd.startsWith(`..${sep}`)) {
|
|
530
|
+
throw new Error("Contained command cwd must remain inside the workspace.");
|
|
531
|
+
}
|
|
532
|
+
const args = [
|
|
533
|
+
"--die-with-parent", "--new-session", "--unshare-all", "--disable-userns", "--cap-drop", "ALL",
|
|
534
|
+
"--clearenv", "--proc", "/proc", "--dev", "/dev", "--tmpfs", "/tmp",
|
|
535
|
+
];
|
|
536
|
+
for (const root of BUBBLEWRAP_READ_ONLY_ROOTS) {
|
|
537
|
+
try {
|
|
538
|
+
if (existsSync(root))
|
|
539
|
+
args.push("--ro-bind", root, root);
|
|
540
|
+
}
|
|
541
|
+
catch {
|
|
542
|
+
// Missing optional system roots are intentionally invisible.
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
args.push("--bind", input.workspace, "/workspace");
|
|
546
|
+
for (const [name, value] of Object.entries(input.environment).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)) {
|
|
547
|
+
if (value !== undefined)
|
|
548
|
+
args.push("--setenv", name, value);
|
|
549
|
+
}
|
|
550
|
+
const sandboxCwd = relativeCwd.length === 0 ? "/workspace" : `/workspace/${relativeCwd.split(sep).join("/")}`;
|
|
551
|
+
args.push("--chdir", sandboxCwd, "--", input.command, ...input.commandArguments);
|
|
552
|
+
return Object.freeze(args);
|
|
553
|
+
}
|
|
554
|
+
export async function assertWorkspaceHasNoHardLinks(workspace) {
|
|
555
|
+
let entries = 0;
|
|
556
|
+
const visit = async (directory) => {
|
|
557
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
558
|
+
entries += 1;
|
|
559
|
+
if (entries > 100_000) {
|
|
560
|
+
throw Object.assign(new Error("Contained command hard-link scan exceeded 100000 workspace entries."), {
|
|
561
|
+
code: "LIMIT_EXCEEDED",
|
|
562
|
+
});
|
|
563
|
+
}
|
|
564
|
+
const path = join(directory, entry.name);
|
|
565
|
+
const info = await lstat(path);
|
|
566
|
+
if (info.isSymbolicLink())
|
|
567
|
+
continue;
|
|
568
|
+
if (info.isDirectory()) {
|
|
569
|
+
await visit(path);
|
|
570
|
+
}
|
|
571
|
+
else if (info.isFile() && info.nlink > 1) {
|
|
572
|
+
throw Object.assign(new Error(`Contained command refused hard-linked workspace file '${relative(workspace, path)}'.`), {
|
|
573
|
+
code: "PERMISSION_DENIED",
|
|
574
|
+
});
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
};
|
|
578
|
+
await visit(workspace);
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=command-containment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-containment.js","sourceRoot":"","sources":["../../../../src/adapters/node/host/command-containment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-hash.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/host/content-hash.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-hash.js","sourceRoot":"","sources":["../../../../src/adapters/node/host/content-hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type AiCoderRunCheckpoint } from "../../../index.js";
|
|
2
|
+
import type { AiCoderFinalReport, AiCoderRunStore } from "../../../runtime/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Minimal durable host store for the CLI laboratory. The configured directory
|
|
5
|
+
* must be outside model-writable workspace roots in production hosts.
|
|
6
|
+
*/
|
|
7
|
+
export declare class FileRunStore implements AiCoderRunStore {
|
|
8
|
+
private readonly root;
|
|
9
|
+
readonly checkpointTrust: "trusted_host";
|
|
10
|
+
private constructor();
|
|
11
|
+
static create(root: string): Promise<FileRunStore>;
|
|
12
|
+
private runDirectory;
|
|
13
|
+
loadLatestCheckpoint(runId: string, context: Readonly<{
|
|
14
|
+
deadline: number;
|
|
15
|
+
signal: AbortSignal;
|
|
16
|
+
}>): Promise<AiCoderRunCheckpoint | null>;
|
|
17
|
+
saveCheckpoint(checkpoint: AiCoderRunCheckpoint, context: Readonly<{
|
|
18
|
+
deadline: number;
|
|
19
|
+
signal: AbortSignal;
|
|
20
|
+
}>): Promise<Readonly<{
|
|
21
|
+
artifactRef?: string;
|
|
22
|
+
}>>;
|
|
23
|
+
saveFinalReport(report: AiCoderFinalReport, context: Readonly<{
|
|
24
|
+
deadline: number;
|
|
25
|
+
signal: AbortSignal;
|
|
26
|
+
}>): Promise<void>;
|
|
27
|
+
loadFinalReport(runId: string): Promise<AiCoderFinalReport | null>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=file-run-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-run-store.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/host/file-run-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EAChB,MAAM,2BAA2B,CAAC;AA2BnC;;;GAGG;AACH,qBAAa,YAAa,YAAW,eAAe;IAG9B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFzC,QAAQ,CAAC,eAAe,EAAG,cAAc,CAAU;IAEnD,OAAO;WAEM,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;YAU1C,YAAY;IAUpB,oBAAoB,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,QAAQ,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,GAC3D,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAcjC,cAAc,CAClB,UAAU,EAAE,oBAAoB,EAChC,OAAO,EAAE,QAAQ,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,GAC3D,OAAO,CAAC,QAAQ,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IASxC,eAAe,CACnB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,QAAQ,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAAC,GAC3D,OAAO,CAAC,IAAI,CAAC;IAOV,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;CASzE"}
|