@peanut996/acp-router 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +350 -0
- package/dist/acp-client.d.ts +179 -0
- package/dist/acp-client.d.ts.map +1 -0
- package/dist/acp-client.js +718 -0
- package/dist/acp-client.js.map +1 -0
- package/dist/agents.d.ts +180 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +430 -0
- package/dist/agents.js.map +1 -0
- package/dist/bin/acp-router-cli.d.ts +3 -0
- package/dist/bin/acp-router-cli.d.ts.map +1 -0
- package/dist/bin/acp-router-cli.js +252 -0
- package/dist/bin/acp-router-cli.js.map +1 -0
- package/dist/bin/acp-router.d.ts +3 -0
- package/dist/bin/acp-router.d.ts.map +1 -0
- package/dist/bin/acp-router.js +7 -0
- package/dist/bin/acp-router.js.map +1 -0
- package/dist/constants.d.ts +44 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +131 -0
- package/dist/constants.js.map +1 -0
- package/dist/jobs.d.ts +133 -0
- package/dist/jobs.d.ts.map +1 -0
- package/dist/jobs.js +716 -0
- package/dist/jobs.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +180 -0
- package/dist/server.js.map +1 -0
- package/dist/storage.d.ts +166 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +506 -0
- package/dist/storage.js.map +1 -0
- package/dist/utils.d.ts +31 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +78 -0
- package/dist/utils.js.map +1 -0
- package/package.json +55 -0
package/dist/storage.js
ADDED
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { REGISTRY_PATH, CONFIG_PATH, ACP_REGISTRY_CACHE_PATH, DEFAULT_ACP_REGISTRY_URL, COMMAND_TIMEOUT_MS, ACTIVE_JOB_STATUSES, TERMINAL_JOB_STATUSES } from "./constants.js";
|
|
4
|
+
import { isPlainObject } from "./utils.js";
|
|
5
|
+
import { ACTIVE_RUNS } from "./jobs.js";
|
|
6
|
+
let orphanRecoveryPromise = null;
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Config / Registry persistence
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
async function readConfig() {
|
|
11
|
+
await ensureOrphanRecovery();
|
|
12
|
+
const defaults = {
|
|
13
|
+
defaultAgent: null,
|
|
14
|
+
modeDefaults: {},
|
|
15
|
+
disabledAgents: [],
|
|
16
|
+
allowCurrentDirectory: false,
|
|
17
|
+
registryEnabled: true,
|
|
18
|
+
registryUrl: DEFAULT_ACP_REGISTRY_URL,
|
|
19
|
+
registryCacheTtlSec: 86400,
|
|
20
|
+
safety: {
|
|
21
|
+
requireAbsoluteWorktree: true,
|
|
22
|
+
launchExternalAgents: true,
|
|
23
|
+
defaultPermissionProfile: "bypassPermissions",
|
|
24
|
+
allowBypassPermissions: true,
|
|
25
|
+
inheritEnvironment: true
|
|
26
|
+
},
|
|
27
|
+
updatedAt: null
|
|
28
|
+
};
|
|
29
|
+
const stored = await readJson(CONFIG_PATH, defaults);
|
|
30
|
+
const profileAliases = { workspace_write: "acceptEdits", accept_edits: "acceptEdits", bypass_permissions: "bypassPermissions" };
|
|
31
|
+
const rawProfile = isPlainObject(stored.safety) ? stored.safety.defaultPermissionProfile : undefined;
|
|
32
|
+
const migratedProfile = profileAliases[rawProfile] ?? rawProfile;
|
|
33
|
+
return {
|
|
34
|
+
...defaults,
|
|
35
|
+
...stored,
|
|
36
|
+
modeDefaults: isPlainObject(stored.modeDefaults) ? stored.modeDefaults : defaults.modeDefaults,
|
|
37
|
+
disabledAgents: Array.isArray(stored.disabledAgents) ? stored.disabledAgents : defaults.disabledAgents,
|
|
38
|
+
registryEnabled: typeof stored.registryEnabled === "boolean" ? stored.registryEnabled : defaults.registryEnabled,
|
|
39
|
+
registryUrl: typeof stored.registryUrl === "string" && stored.registryUrl.trim() ? stored.registryUrl : defaults.registryUrl,
|
|
40
|
+
registryCacheTtlSec: Number.isInteger(stored.registryCacheTtlSec) ? stored.registryCacheTtlSec : defaults.registryCacheTtlSec,
|
|
41
|
+
safety: {
|
|
42
|
+
...defaults.safety,
|
|
43
|
+
...(isPlainObject(stored.safety) ? stored.safety : {}),
|
|
44
|
+
...(migratedProfile && migratedProfile !== rawProfile ? { defaultPermissionProfile: migratedProfile } : {})
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async function readRegistry() {
|
|
49
|
+
await ensureOrphanRecovery();
|
|
50
|
+
return readJson(REGISTRY_PATH, { jobs: {}, sessions: {} });
|
|
51
|
+
}
|
|
52
|
+
async function writeRegistry(registry) {
|
|
53
|
+
await writeJson(REGISTRY_PATH, registry);
|
|
54
|
+
}
|
|
55
|
+
async function readJson(filePath, fallback) {
|
|
56
|
+
try {
|
|
57
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
58
|
+
return JSON.parse(raw);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error.code === "ENOENT")
|
|
62
|
+
return structuredClone(fallback);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function writeJson(filePath, payload) {
|
|
67
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
68
|
+
await fs.writeFile(filePath, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
|
|
69
|
+
}
|
|
70
|
+
async function appendJsonl(filePath, entries) {
|
|
71
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
72
|
+
const lines = entries.map((entry) => JSON.stringify(entry)).join("\n");
|
|
73
|
+
await fs.appendFile(filePath, `${lines}\n`, "utf8");
|
|
74
|
+
}
|
|
75
|
+
async function readJobEventLog(logPath) {
|
|
76
|
+
const result = {
|
|
77
|
+
events: [],
|
|
78
|
+
parseErrors: [],
|
|
79
|
+
note: null
|
|
80
|
+
};
|
|
81
|
+
if (typeof logPath !== "string" || !logPath) {
|
|
82
|
+
return {
|
|
83
|
+
...result,
|
|
84
|
+
note: "This job does not have a logPath recorded yet."
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
let raw = "";
|
|
88
|
+
try {
|
|
89
|
+
raw = await fs.readFile(logPath, "utf8");
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error.code === "ENOENT") {
|
|
93
|
+
return {
|
|
94
|
+
...result,
|
|
95
|
+
note: "The job log file does not exist yet."
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
...result,
|
|
100
|
+
note: `The job log could not be read: ${error.message}`
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const lines = raw.split(/\r?\n/);
|
|
104
|
+
for (let lineNumber = 0; lineNumber < lines.length; lineNumber += 1) {
|
|
105
|
+
const line = lines[lineNumber].trim();
|
|
106
|
+
if (!line)
|
|
107
|
+
continue;
|
|
108
|
+
try {
|
|
109
|
+
const parsed = JSON.parse(line);
|
|
110
|
+
result.events.push({
|
|
111
|
+
...(isPlainObject(parsed) ? parsed : { payload: parsed }),
|
|
112
|
+
eventIndex: result.events.length
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
result.parseErrors.push({
|
|
117
|
+
lineNumber: lineNumber + 1,
|
|
118
|
+
message: error.message
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
async function readLogTail(logPath, byteLimit) {
|
|
125
|
+
if (typeof logPath !== "string" || !logPath) {
|
|
126
|
+
return {
|
|
127
|
+
text: "",
|
|
128
|
+
bytes: 0,
|
|
129
|
+
truncated: false,
|
|
130
|
+
note: "This job does not have a logPath recorded yet."
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const stats = await fs.stat(logPath);
|
|
135
|
+
const bytesToRead = Math.min(stats.size, byteLimit);
|
|
136
|
+
const handle = await fs.open(logPath, "r");
|
|
137
|
+
try {
|
|
138
|
+
const buffer = Buffer.alloc(bytesToRead);
|
|
139
|
+
await handle.read(buffer, 0, bytesToRead, Math.max(0, stats.size - bytesToRead));
|
|
140
|
+
return {
|
|
141
|
+
text: buffer.toString("utf8"),
|
|
142
|
+
bytes: bytesToRead,
|
|
143
|
+
truncated: stats.size > bytesToRead
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
await handle.close();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
if (error.code === "ENOENT") {
|
|
152
|
+
return {
|
|
153
|
+
text: "",
|
|
154
|
+
bytes: 0,
|
|
155
|
+
truncated: false,
|
|
156
|
+
note: "The job log file does not exist yet."
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
text: "",
|
|
161
|
+
bytes: 0,
|
|
162
|
+
truncated: false,
|
|
163
|
+
note: `The job log could not be read: ${error.message}`
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// Orphan recovery
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
async function ensureOrphanRecovery() {
|
|
171
|
+
if (!orphanRecoveryPromise) {
|
|
172
|
+
orphanRecoveryPromise = recoverOrphanedJobs().catch((error) => {
|
|
173
|
+
orphanRecoveryPromise = null;
|
|
174
|
+
throw error;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return orphanRecoveryPromise;
|
|
178
|
+
}
|
|
179
|
+
async function recoverOrphanedJobs() {
|
|
180
|
+
const registry = await readJson(REGISTRY_PATH, { jobs: {}, sessions: {} });
|
|
181
|
+
registry.jobs = isPlainObject(registry.jobs) ? registry.jobs : {};
|
|
182
|
+
registry.sessions = isPlainObject(registry.sessions) ? registry.sessions : {};
|
|
183
|
+
const recoveredAt = new Date().toISOString();
|
|
184
|
+
const logEntries = [];
|
|
185
|
+
let recoveredCount = 0;
|
|
186
|
+
for (const job of Object.values(registry.jobs)) {
|
|
187
|
+
if (!isPlainObject(job))
|
|
188
|
+
continue;
|
|
189
|
+
if (!ACTIVE_JOB_STATUSES.has(job.status) || ACTIVE_RUNS.has(job.jobId))
|
|
190
|
+
continue;
|
|
191
|
+
const previousStatus = job.status;
|
|
192
|
+
const processKill = bestEffortKillJobProcess(job, recoveredAt);
|
|
193
|
+
const message = processKill?.status === "signal_sent"
|
|
194
|
+
? "Agent Router marked this job orphaned during MCP server restart recovery and sent SIGTERM to the recorded child process."
|
|
195
|
+
: "Agent Router marked this job orphaned during MCP server restart recovery; the previous runner process is no longer owned by this server.";
|
|
196
|
+
const event = {
|
|
197
|
+
type: "orphaned",
|
|
198
|
+
timestamp: recoveredAt,
|
|
199
|
+
message,
|
|
200
|
+
previousStatus,
|
|
201
|
+
processKill
|
|
202
|
+
};
|
|
203
|
+
job.status = "orphaned";
|
|
204
|
+
job.endedAt = job.endedAt ?? recoveredAt;
|
|
205
|
+
job.orphanedAt = recoveredAt;
|
|
206
|
+
job.failureReason = message;
|
|
207
|
+
job.resultSummary = message;
|
|
208
|
+
if (processKill && isPlainObject(job.process)) {
|
|
209
|
+
job.process = {
|
|
210
|
+
...job.process,
|
|
211
|
+
status: processKill.status === "signal_sent" ? "kill_requested" : "unowned",
|
|
212
|
+
restartKill: processKill,
|
|
213
|
+
endedAt: job.process.endedAt ?? recoveredAt
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
job.risks = [
|
|
217
|
+
processKill?.status === "signal_sent"
|
|
218
|
+
? "Agent Router sent SIGTERM to the recorded child PID during restart recovery; inspect the worktree if results look unexpected."
|
|
219
|
+
: "The original agent process may have continued after the MCP server exited; inspect the worktree if results look unexpected."
|
|
220
|
+
];
|
|
221
|
+
job.recentEvents = [...(Array.isArray(job.recentEvents) ? job.recentEvents : []), event];
|
|
222
|
+
updateSessionAfterOrphanedJob(registry, job, recoveredAt);
|
|
223
|
+
if (typeof job.logPath === "string" && job.logPath) {
|
|
224
|
+
logEntries.push({
|
|
225
|
+
logPath: job.logPath,
|
|
226
|
+
event: {
|
|
227
|
+
...event,
|
|
228
|
+
jobId: job.jobId,
|
|
229
|
+
sessionId: job.sessionId,
|
|
230
|
+
agentId: job.agentId
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
recoveredCount += 1;
|
|
235
|
+
}
|
|
236
|
+
if (recoveredCount === 0) {
|
|
237
|
+
return { recoveredCount: 0 };
|
|
238
|
+
}
|
|
239
|
+
await writeJson(REGISTRY_PATH, registry);
|
|
240
|
+
for (const entry of logEntries) {
|
|
241
|
+
await appendJsonl(entry.logPath, [entry.event]);
|
|
242
|
+
}
|
|
243
|
+
return { recoveredCount };
|
|
244
|
+
}
|
|
245
|
+
function bestEffortKillJobProcess(job, attemptedAt) {
|
|
246
|
+
const pid = normalizePid(job.process?.pid);
|
|
247
|
+
if (!pid)
|
|
248
|
+
return null;
|
|
249
|
+
const result = {
|
|
250
|
+
pid,
|
|
251
|
+
signal: "SIGTERM",
|
|
252
|
+
attemptedAt,
|
|
253
|
+
status: "unknown"
|
|
254
|
+
};
|
|
255
|
+
try {
|
|
256
|
+
process.kill(pid, "SIGTERM");
|
|
257
|
+
return { ...result, status: "signal_sent" };
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
if (error.code === "ESRCH")
|
|
261
|
+
return { ...result, status: "not_found" };
|
|
262
|
+
if (error.code === "EPERM")
|
|
263
|
+
return { ...result, status: "permission_denied" };
|
|
264
|
+
return {
|
|
265
|
+
...result,
|
|
266
|
+
status: "error",
|
|
267
|
+
errorCode: error.code ?? null,
|
|
268
|
+
errorMessage: error.message
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function updateSessionAfterOrphanedJob(registry, job, recoveredAt) {
|
|
273
|
+
const session = registry.sessions[job.sessionId];
|
|
274
|
+
if (!isPlainObject(session))
|
|
275
|
+
return;
|
|
276
|
+
const hasCurrentOwnedRun = Object.values(registry.jobs).some((candidate) => (isPlainObject(candidate)
|
|
277
|
+
&& candidate.sessionId === session.sessionId
|
|
278
|
+
&& ACTIVE_JOB_STATUSES.has(candidate.status)
|
|
279
|
+
&& ACTIVE_RUNS.has(candidate.jobId)));
|
|
280
|
+
if (hasCurrentOwnedRun)
|
|
281
|
+
return;
|
|
282
|
+
if (session.lastJobId !== job.jobId && !ACTIVE_JOB_STATUSES.has(session.status ?? ""))
|
|
283
|
+
return;
|
|
284
|
+
const canContinue = Boolean(session.providerSessionId);
|
|
285
|
+
session.status = canContinue ? "idle" : "orphaned";
|
|
286
|
+
session.canContinue = canContinue;
|
|
287
|
+
session.updatedAt = recoveredAt;
|
|
288
|
+
}
|
|
289
|
+
async function recordJobProcess(jobId, processInfo) {
|
|
290
|
+
const registry = await readRegistry();
|
|
291
|
+
const job = registry.jobs[jobId];
|
|
292
|
+
if (!isPlainObject(job) || TERMINAL_JOB_STATUSES.has(job.status))
|
|
293
|
+
return;
|
|
294
|
+
const event = {
|
|
295
|
+
type: "process_started",
|
|
296
|
+
timestamp: processInfo.recordedAt,
|
|
297
|
+
message: `Recorded external agent process pid=${processInfo.pid}.`,
|
|
298
|
+
process: {
|
|
299
|
+
pid: processInfo.pid,
|
|
300
|
+
kind: processInfo.kind,
|
|
301
|
+
command: processInfo.command
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
job.process = {
|
|
305
|
+
...(isPlainObject(job.process) ? job.process : {}),
|
|
306
|
+
...processInfo
|
|
307
|
+
};
|
|
308
|
+
job.recentEvents = [...(Array.isArray(job.recentEvents) ? job.recentEvents : []), event];
|
|
309
|
+
registry.jobs[job.jobId] = job;
|
|
310
|
+
await writeRegistry(registry);
|
|
311
|
+
await appendJsonl(job.logPath ?? "", [{
|
|
312
|
+
...event,
|
|
313
|
+
jobId: job.jobId,
|
|
314
|
+
sessionId: job.sessionId,
|
|
315
|
+
agentId: job.agentId
|
|
316
|
+
}]);
|
|
317
|
+
}
|
|
318
|
+
function normalizeProcessInfo(processInfo) {
|
|
319
|
+
if (!isPlainObject(processInfo))
|
|
320
|
+
return null;
|
|
321
|
+
const pid = normalizePid(processInfo.pid);
|
|
322
|
+
if (!pid)
|
|
323
|
+
return null;
|
|
324
|
+
const now = new Date().toISOString();
|
|
325
|
+
return {
|
|
326
|
+
pid,
|
|
327
|
+
kind: typeof processInfo.kind === "string" && processInfo.kind ? processInfo.kind : "external",
|
|
328
|
+
command: typeof processInfo.command === "string" && processInfo.command ? processInfo.command : null,
|
|
329
|
+
startedAt: typeof processInfo.startedAt === "string" ? processInfo.startedAt : now,
|
|
330
|
+
recordedAt: now,
|
|
331
|
+
status: "running"
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function normalizePid(value) {
|
|
335
|
+
const pid = Number.parseInt(String(value), 10);
|
|
336
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
337
|
+
return null;
|
|
338
|
+
return pid;
|
|
339
|
+
}
|
|
340
|
+
// ---------------------------------------------------------------------------
|
|
341
|
+
// ACP registry cache / fetch
|
|
342
|
+
// ---------------------------------------------------------------------------
|
|
343
|
+
async function readAcpRegistryCache() {
|
|
344
|
+
try {
|
|
345
|
+
return await readJson(ACP_REGISTRY_CACHE_PATH, null);
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
return null;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async function fetchAcpRegistry(registryUrl) {
|
|
352
|
+
if (registryUrl.startsWith("file://")) {
|
|
353
|
+
return JSON.parse(await fs.readFile(new URL(registryUrl), "utf8"));
|
|
354
|
+
}
|
|
355
|
+
if (path.isAbsolute(registryUrl)) {
|
|
356
|
+
return JSON.parse(await fs.readFile(registryUrl, "utf8"));
|
|
357
|
+
}
|
|
358
|
+
const controller = new AbortController();
|
|
359
|
+
const timeout = setTimeout(() => controller.abort(), COMMAND_TIMEOUT_MS);
|
|
360
|
+
try {
|
|
361
|
+
const response = await fetch(registryUrl, { signal: controller.signal });
|
|
362
|
+
if (!response.ok)
|
|
363
|
+
throw new Error(`Registry fetch failed with HTTP ${response.status}`);
|
|
364
|
+
return await response.json();
|
|
365
|
+
}
|
|
366
|
+
finally {
|
|
367
|
+
clearTimeout(timeout);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
async function readAcpRegistry(config, { refresh = false } = {}) {
|
|
371
|
+
const disabledMeta = {
|
|
372
|
+
enabled: false,
|
|
373
|
+
sourceUrl: config.registryUrl,
|
|
374
|
+
status: "disabled",
|
|
375
|
+
agentCount: 0
|
|
376
|
+
};
|
|
377
|
+
if (config.registryEnabled !== true) {
|
|
378
|
+
return { agentsByRouterId: new Map(), meta: disabledMeta };
|
|
379
|
+
}
|
|
380
|
+
const now = Date.now();
|
|
381
|
+
const cache = await readAcpRegistryCache();
|
|
382
|
+
const ttlMs = Math.max(0, config.registryCacheTtlSec ?? 86400) * 1000;
|
|
383
|
+
const cacheFresh = cache
|
|
384
|
+
&& cache.sourceUrl === config.registryUrl
|
|
385
|
+
&& Array.isArray(cache.agents)
|
|
386
|
+
&& !refresh
|
|
387
|
+
&& ttlMs > 0
|
|
388
|
+
&& now - Date.parse(cache.fetchedAt ?? "0") < ttlMs;
|
|
389
|
+
if (cacheFresh && cache.agents) {
|
|
390
|
+
return buildAcpRegistryResult(cache.agents, {
|
|
391
|
+
enabled: true,
|
|
392
|
+
status: "cached",
|
|
393
|
+
sourceUrl: cache.sourceUrl,
|
|
394
|
+
fetchedAt: cache.fetchedAt,
|
|
395
|
+
registryVersion: cache.registryVersion ?? null,
|
|
396
|
+
agentCount: cache.agents.length,
|
|
397
|
+
lastError: cache.lastError ?? null
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
try {
|
|
401
|
+
const registry = await fetchAcpRegistry(config.registryUrl);
|
|
402
|
+
const agents = normalizeRegistryAgents(registry);
|
|
403
|
+
const fetchedAt = new Date().toISOString();
|
|
404
|
+
const nextCache = {
|
|
405
|
+
schemaVersion: 1,
|
|
406
|
+
sourceUrl: config.registryUrl,
|
|
407
|
+
fetchedAt,
|
|
408
|
+
registryVersion: registry.version ?? null,
|
|
409
|
+
agentCount: agents.length,
|
|
410
|
+
agents,
|
|
411
|
+
lastError: null
|
|
412
|
+
};
|
|
413
|
+
await writeJson(ACP_REGISTRY_CACHE_PATH, nextCache);
|
|
414
|
+
return buildAcpRegistryResult(agents, {
|
|
415
|
+
enabled: true,
|
|
416
|
+
status: "fetched",
|
|
417
|
+
sourceUrl: config.registryUrl,
|
|
418
|
+
fetchedAt,
|
|
419
|
+
registryVersion: registry.version ?? null,
|
|
420
|
+
agentCount: agents.length,
|
|
421
|
+
lastError: null
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
if (cache?.agents?.length) {
|
|
426
|
+
return buildAcpRegistryResult(cache.agents, {
|
|
427
|
+
enabled: true,
|
|
428
|
+
status: "stale",
|
|
429
|
+
sourceUrl: cache.sourceUrl,
|
|
430
|
+
fetchedAt: cache.fetchedAt,
|
|
431
|
+
registryVersion: cache.registryVersion ?? null,
|
|
432
|
+
agentCount: cache.agents.length,
|
|
433
|
+
lastError: error.message
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
agentsByRouterId: new Map(),
|
|
438
|
+
meta: {
|
|
439
|
+
enabled: true,
|
|
440
|
+
status: "unavailable",
|
|
441
|
+
sourceUrl: config.registryUrl,
|
|
442
|
+
agentCount: 0,
|
|
443
|
+
lastError: error.message
|
|
444
|
+
}
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
function normalizeRegistryAgents(registry) {
|
|
449
|
+
if (!isPlainObject(registry) || !Array.isArray(registry.agents)) {
|
|
450
|
+
throw new Error("ACP registry payload must contain an agents array.");
|
|
451
|
+
}
|
|
452
|
+
return registry.agents.filter((agent) => (isPlainObject(agent)
|
|
453
|
+
&& typeof agent.id === "string"
|
|
454
|
+
&& typeof agent.name === "string"
|
|
455
|
+
&& isPlainObject(agent.distribution)));
|
|
456
|
+
}
|
|
457
|
+
function buildAcpRegistryResult(registryAgents, meta) {
|
|
458
|
+
const agentsByRouterId = new Map();
|
|
459
|
+
for (const registryAgent of registryAgents) {
|
|
460
|
+
const routerId = mapRegistryAgentToRouterId(registryAgent.id);
|
|
461
|
+
if (!routerId)
|
|
462
|
+
continue;
|
|
463
|
+
agentsByRouterId.set(routerId, registryAgent);
|
|
464
|
+
}
|
|
465
|
+
return { agentsByRouterId, meta };
|
|
466
|
+
}
|
|
467
|
+
function mapRegistryAgentToRouterId(registryId) {
|
|
468
|
+
const mapping = {
|
|
469
|
+
"claude-acp": "claude",
|
|
470
|
+
"codex-acp": "codex",
|
|
471
|
+
opencode: "opencode"
|
|
472
|
+
};
|
|
473
|
+
return mapping[registryId] ?? null;
|
|
474
|
+
}
|
|
475
|
+
function extractRegistryNpxPackage(registryAgent) {
|
|
476
|
+
const distribution = registryAgent.distribution;
|
|
477
|
+
const npxPackage = distribution?.npx?.package;
|
|
478
|
+
return typeof npxPackage === "string" && npxPackage ? npxPackage : null;
|
|
479
|
+
}
|
|
480
|
+
function buildNpxAcpFallback(npxPackage) {
|
|
481
|
+
return {
|
|
482
|
+
launchCommand: ["npx", "--yes", npxPackage]
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
function buildRegistryInstallHint(registryAgent) {
|
|
486
|
+
const distribution = registryAgent.distribution;
|
|
487
|
+
const npxPackage = distribution?.npx?.package;
|
|
488
|
+
if (typeof npxPackage === "string" && npxPackage) {
|
|
489
|
+
return `npm install -g ${npxPackage}`;
|
|
490
|
+
}
|
|
491
|
+
const binary = distribution?.binary;
|
|
492
|
+
if (isPlainObject(binary)) {
|
|
493
|
+
const platformKey = getRegistryPlatformKey();
|
|
494
|
+
const target = binary[platformKey] ?? Object.values(binary).find(isPlainObject);
|
|
495
|
+
if (isPlainObject(target) && typeof target.archive === "string")
|
|
496
|
+
return `Install ${registryAgent.name} from ${target.archive}`;
|
|
497
|
+
}
|
|
498
|
+
return null;
|
|
499
|
+
}
|
|
500
|
+
function getRegistryPlatformKey() {
|
|
501
|
+
const osName = process.platform === "darwin" ? "darwin" : process.platform === "win32" ? "windows" : "linux";
|
|
502
|
+
const arch = process.arch === "arm64" ? "aarch64" : process.arch === "x64" ? "x86_64" : process.arch;
|
|
503
|
+
return `${osName}-${arch}`;
|
|
504
|
+
}
|
|
505
|
+
export { readConfig, readRegistry, writeRegistry, readJson, writeJson, appendJsonl, readJobEventLog, readLogTail, ensureOrphanRecovery, recoverOrphanedJobs, bestEffortKillJobProcess, updateSessionAfterOrphanedJob, recordJobProcess, normalizeProcessInfo, normalizePid, readAcpRegistryCache, fetchAcpRegistry, readAcpRegistry, normalizeRegistryAgents, buildAcpRegistryResult, mapRegistryAgentToRouterId, extractRegistryNpxPackage, buildNpxAcpFallback, buildRegistryInstallHint, getRegistryPlatformKey };
|
|
506
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
declare const execFileAsync: typeof execFile.__promisify__;
|
|
3
|
+
declare function sleep(ms: number): Promise<void>;
|
|
4
|
+
declare function safeEnv({ inheritEnvironment }?: {
|
|
5
|
+
inheritEnvironment?: boolean;
|
|
6
|
+
}): NodeJS.ProcessEnv;
|
|
7
|
+
declare function allowlistedAgentEnv(): Record<string, string>;
|
|
8
|
+
declare function clampInteger(value: unknown, fallback: number, minimum: number, maximum: number): number;
|
|
9
|
+
declare function preview(value: unknown, maxLength: number): string;
|
|
10
|
+
declare function stripAnsi(value: string): string;
|
|
11
|
+
declare function hashText(text: unknown): Promise<string>;
|
|
12
|
+
declare function isPlainObject(value: unknown): value is Record<string, any>;
|
|
13
|
+
interface McpTextContent {
|
|
14
|
+
type: "text";
|
|
15
|
+
text: string;
|
|
16
|
+
}
|
|
17
|
+
interface McpToolResult {
|
|
18
|
+
content: McpTextContent[];
|
|
19
|
+
}
|
|
20
|
+
declare function toToolResult(obj: unknown): McpToolResult;
|
|
21
|
+
declare function createId(prefix: string): string;
|
|
22
|
+
declare function resolveBooleanOverride(value: unknown, fallback: boolean): boolean;
|
|
23
|
+
declare function uniqueStrings(values: readonly string[]): string[];
|
|
24
|
+
interface AcpProcessClosedEvent {
|
|
25
|
+
type: "acp_process_closed";
|
|
26
|
+
timestamp: string;
|
|
27
|
+
message: string;
|
|
28
|
+
}
|
|
29
|
+
declare function buildAcpProcessClosedEvent(startedAt: number): AcpProcessClosedEvent;
|
|
30
|
+
export { execFileAsync, sleep, safeEnv, allowlistedAgentEnv, clampInteger, preview, stripAnsi, hashText, isPlainObject, toToolResult, createId, resolveBooleanOverride, uniqueStrings, buildAcpProcessClosedEvent };
|
|
31
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAK9C,QAAA,MAAM,aAAa,+BAAsB,CAAC;AAE1C,iBAAS,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExC;AAED,iBAAS,OAAO,CAAC,EAAE,kBAAyB,EAAE,GAAE;IAAE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAAC,UAAU,CAUxG;AAED,iBAAS,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMrD;AAED,iBAAS,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIhG;AAED,iBAAS,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,iBAAS,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,iBAAe,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGtD;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEnE;AAED,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,iBAAS,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAEjD;AAED,iBAAS,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAIxC;AAED,iBAAS,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAE1E;AAED,iBAAS,aAAa,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAS1D;AAED,UAAU,qBAAqB;IAC7B,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iBAAS,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CAM5E;AAED,OAAO,EACL,aAAa,EACb,KAAK,EACL,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,sBAAsB,EACtB,aAAa,EACb,0BAA0B,EAC3B,CAAC"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { AGENT_ENV_ALLOWLIST } from "./constants.js";
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
function sleep(ms) {
|
|
7
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
8
|
+
}
|
|
9
|
+
function safeEnv({ inheritEnvironment = true } = {}) {
|
|
10
|
+
const env = inheritEnvironment ? { ...process.env } : {};
|
|
11
|
+
return {
|
|
12
|
+
...env,
|
|
13
|
+
PATH: process.env.PATH ?? "",
|
|
14
|
+
HOME: process.env.HOME ?? os.homedir(),
|
|
15
|
+
LANG: process.env.LANG ?? "C.UTF-8",
|
|
16
|
+
LC_ALL: process.env.LC_ALL ?? "C.UTF-8",
|
|
17
|
+
...allowlistedAgentEnv()
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function allowlistedAgentEnv() {
|
|
21
|
+
const env = {};
|
|
22
|
+
for (const key of AGENT_ENV_ALLOWLIST) {
|
|
23
|
+
if (process.env[key])
|
|
24
|
+
env[key] = process.env[key];
|
|
25
|
+
}
|
|
26
|
+
return env;
|
|
27
|
+
}
|
|
28
|
+
function clampInteger(value, fallback, minimum, maximum) {
|
|
29
|
+
const parsed = Number.parseInt(String(value), 10);
|
|
30
|
+
if (!Number.isInteger(parsed))
|
|
31
|
+
return fallback;
|
|
32
|
+
return Math.min(Math.max(parsed, minimum), maximum);
|
|
33
|
+
}
|
|
34
|
+
function preview(value, maxLength) {
|
|
35
|
+
const text = stripAnsi(String(value ?? "")).replace(/\s+/g, " ").trim();
|
|
36
|
+
return text.length > maxLength ? `${text.slice(0, maxLength - 1)}...` : text;
|
|
37
|
+
}
|
|
38
|
+
function stripAnsi(value) {
|
|
39
|
+
return value.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g, "");
|
|
40
|
+
}
|
|
41
|
+
async function hashText(text) {
|
|
42
|
+
const { createHash } = await import("node:crypto");
|
|
43
|
+
return createHash("sha256").update(String(text)).digest("hex");
|
|
44
|
+
}
|
|
45
|
+
function isPlainObject(value) {
|
|
46
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
47
|
+
}
|
|
48
|
+
function toToolResult(obj) {
|
|
49
|
+
return { content: [{ type: "text", text: JSON.stringify(obj, null, 2) }] };
|
|
50
|
+
}
|
|
51
|
+
function createId(prefix) {
|
|
52
|
+
const stamp = new Date().toISOString().replace(/[-:TZ.]/g, "").slice(0, 14);
|
|
53
|
+
const random = Math.random().toString(36).slice(2, 8);
|
|
54
|
+
return `${prefix}_${stamp}_${random}`;
|
|
55
|
+
}
|
|
56
|
+
function resolveBooleanOverride(value, fallback) {
|
|
57
|
+
return typeof value === "boolean" ? value : fallback === true;
|
|
58
|
+
}
|
|
59
|
+
function uniqueStrings(values) {
|
|
60
|
+
const seen = new Set();
|
|
61
|
+
const result = [];
|
|
62
|
+
for (const value of values) {
|
|
63
|
+
if (seen.has(value))
|
|
64
|
+
continue;
|
|
65
|
+
seen.add(value);
|
|
66
|
+
result.push(value);
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
function buildAcpProcessClosedEvent(startedAt) {
|
|
71
|
+
return {
|
|
72
|
+
type: "acp_process_closed",
|
|
73
|
+
timestamp: new Date().toISOString(),
|
|
74
|
+
message: `OpenCode ACP adapter finished after ${Date.now() - startedAt}ms.`
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export { execFileAsync, sleep, safeEnv, allowlistedAgentEnv, clampInteger, preview, stripAnsi, hashText, isPlainObject, toToolResult, createId, resolveBooleanOverride, uniqueStrings, buildAcpProcessClosedEvent };
|
|
78
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI,EAAE,GAAqC,EAAE;IACnF,MAAM,GAAG,GAAsB,kBAAkB,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,OAAO;QACL,GAAG,GAAG;QACN,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE;QAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;QACtC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,SAAS;QACnC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS;QACvC,GAAG,mBAAmB,EAAE;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC;IAC9D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,QAAgB,EAAE,OAAe,EAAE,OAAe;IACtF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,SAAiB;IAChD,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAa;IACnC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACnD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAWD,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,MAAM,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAc,EAAE,QAAiB;IAC/D,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC;AAChE,CAAC;AAED,SAAS,aAAa,CAAC,MAAyB;IAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAQD,SAAS,0BAA0B,CAAC,SAAiB;IACnD,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,OAAO,EAAE,uCAAuC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,KAAK;KAC5E,CAAC;AACJ,CAAC;AAED,OAAO,EACL,aAAa,EACb,KAAK,EACL,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,OAAO,EACP,SAAS,EACT,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,sBAAsB,EACtB,aAAa,EACb,0BAA0B,EAC3B,CAAC"}
|