rivetplane 0.3.2 → 0.4.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/README.md CHANGED
@@ -19,6 +19,8 @@ Rivetplane uses an explicit scope limit of 200 and detects successful output tha
19
19
 
20
20
  Export discovery cannot resolve a Deferred in the original OpenCode process. Exported sessions are marked read-only. Answer questions and approvals in that original process. Use `npx rivetplane opencode` for the explicit managed server and attached-TUI mode, or `--opencode-url URL` for an existing OpenCode HTTP server. These direct modes keep full control support.
21
21
 
22
+ Rivetplane also reads up to 48 Codex rollout files updated in the last 24 hours from `~/.codex/sessions`, independent of the current directory. These sessions are read-only, and the file roster refreshes every 30 seconds. A rollout file is not evidence that an independently launched stdio process is attached. Run `npx rivetplane codex` for a managed app-server with messages, streamed transcripts, interrupts, command and file approvals, supported questions, and restart recovery. The managed roster contains the 48 most recently updated threads and protects running, pending, and newly created threads. It uses a protected Unix socket on macOS and Linux and an authenticated loopback WebSocket on Windows. A configured shared listener can use `--codex-endpoint`; its token must be in `HARNESS_CP_CODEX_TOKEN`.
23
+
22
24
  Run `npx rivetplane --help` for all options.
23
25
 
24
26
  Source and release instructions are in the [Rivetplane CLI repository](https://github.com/rivetplane/cli).
@@ -0,0 +1,484 @@
1
+ import { createHash } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { access, mkdir, open, readFile, readdir, realpath, rename, stat, writeFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { delimiter, dirname, isAbsolute, join, resolve } from "node:path";
6
+ import { SessionRegistry } from "./registry.js";
7
+ import { runBoundedCommand } from "./opencode-export-discovery.js";
8
+ function object(value) { return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined; }
9
+ function array(value) { return Array.isArray(value) ? value : []; }
10
+ function string(value) { return typeof value === "string" ? value : undefined; }
11
+ function number(value) { return typeof value === "number" && Number.isFinite(value) ? value : undefined; }
12
+ function timestamp(value, fallback = Date.now()) {
13
+ if (typeof value === "string") {
14
+ const parsed = Date.parse(value);
15
+ if (Number.isFinite(parsed))
16
+ return new Date(parsed).toISOString();
17
+ }
18
+ if (typeof value === "number" && Number.isFinite(value))
19
+ return new Date(value < 10_000_000_000 ? value * 1_000 : value).toISOString();
20
+ return new Date(fallback).toISOString();
21
+ }
22
+ function latestTimestamp(...values) {
23
+ return values.filter((value) => Boolean(value)).sort((left, right) => Date.parse(right) - Date.parse(left))[0] ?? new Date().toISOString();
24
+ }
25
+ function hash(value) { return createHash("sha256").update(value).digest("base64url").slice(0, 22); }
26
+ function stableId(...parts) { return `claude-jsonl:${hash(parts.join("\0"))}`; }
27
+ function jsonValue(value) { try {
28
+ return JSON.parse(JSON.stringify(value));
29
+ }
30
+ catch {
31
+ return undefined;
32
+ } }
33
+ function summary(value, limit = 500) { const text = typeof value === "string" ? value : JSON.stringify(value) ?? ""; return text.length > limit ? `${text.slice(0, limit)}…` : text; }
34
+ function agentTime(agent) {
35
+ if (typeof agent.startedAt === "number")
36
+ return agent.startedAt < 10_000_000_000 ? agent.startedAt * 1_000 : agent.startedAt;
37
+ return typeof agent.startedAt === "string" ? Date.parse(agent.startedAt) || 0 : 0;
38
+ }
39
+ async function mapLimit(values, concurrency, operation) {
40
+ let index = 0;
41
+ await Promise.all(Array.from({ length: Math.min(Math.max(1, concurrency), values.length) }, async () => {
42
+ while (index < values.length) {
43
+ const value = values[index++];
44
+ if (value !== undefined)
45
+ await operation(value);
46
+ }
47
+ }));
48
+ }
49
+ export function parseClaudeAgents(stdout) {
50
+ let parsed;
51
+ try {
52
+ parsed = JSON.parse(stdout.trim());
53
+ }
54
+ catch {
55
+ throw new Error("claude agents --json returned malformed or partial JSON");
56
+ }
57
+ if (!Array.isArray(parsed))
58
+ throw new Error("claude agents --json did not return an array");
59
+ return parsed.flatMap((value) => {
60
+ const item = object(value);
61
+ const sessionId = string(item?.sessionId);
62
+ const cwd = string(item?.cwd);
63
+ const kind = string(item?.kind);
64
+ if (!item || !sessionId || !cwd || !kind)
65
+ return [];
66
+ return [{ sessionId, cwd, kind, pid: number(item.pid), id: string(item.id), name: string(item.name), startedAt: number(item.startedAt) ?? string(item.startedAt), status: string(item.status), waitingFor: string(item.waitingFor), state: string(item.state) }];
67
+ });
68
+ }
69
+ function executableNames(platform) { return platform === "win32" ? ["claude.exe", "claude.cmd", "claude.bat", "claude"] : ["claude"]; }
70
+ export async function resolveClaudeExecutable(options = {}) {
71
+ const platform = options.platform ?? process.platform;
72
+ const env = options.env ?? process.env;
73
+ const candidates = options.executable ? [options.executable] : executableNames(platform).flatMap((name) => (env.PATH ?? "").split(delimiter).filter(Boolean).map((directory) => join(directory.replace(/^"|"$/g, ""), name)));
74
+ for (const candidate of candidates) {
75
+ if (!options.executable || isAbsolute(candidate) || candidate.includes("/") || candidate.includes("\\")) {
76
+ try {
77
+ await access(candidate, platform === "win32" ? constants.F_OK : constants.X_OK);
78
+ return candidate;
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ }
84
+ }
85
+ return options.executable && !isAbsolute(options.executable) ? options.executable : undefined;
86
+ }
87
+ function statusFromAgent(agent) {
88
+ const wait = (agent.waitingFor ?? "").toLowerCase();
89
+ const state = (agent.state ?? agent.status ?? "").toLowerCase();
90
+ if (wait.includes("permission"))
91
+ return "waiting_approval";
92
+ if (wait.includes("input") || state === "blocked" || state === "waiting" || state === "idle")
93
+ return "waiting_input";
94
+ if (["failed", "error", "crashed"].includes(state))
95
+ return "error";
96
+ if (["completed", "done", "stopped"].includes(state))
97
+ return "completed";
98
+ return "running";
99
+ }
100
+ function contentBlocks(record) {
101
+ const message = object(record.message);
102
+ const content = message?.content;
103
+ if (typeof content === "string")
104
+ return [{ type: "text", text: content }];
105
+ return array(content).flatMap((value) => object(value) ? [object(value)] : []);
106
+ }
107
+ function questionFromTool(sessionId, tool, state) {
108
+ if (tool.name !== "AskUserQuestion")
109
+ return undefined;
110
+ const questions = array(object(tool.input)?.questions).flatMap((value) => {
111
+ const item = object(value);
112
+ const prompt = string(item?.question);
113
+ if (!item || !prompt)
114
+ return [];
115
+ const options = array(item.options).flatMap((entry) => { const option = object(entry); const label = string(option?.label); return label ? [{ label, description: string(option?.description) }] : []; });
116
+ return [{ prompt, header: string(item.header) ?? "Question", options, multiple: item.multiSelect === true, custom: true }];
117
+ });
118
+ const stateQuestions = array(object(state?.block)?.questions);
119
+ if (questions.length === 0 || stateQuestions.length === 0)
120
+ return undefined;
121
+ const prompts = new Set(stateQuestions.flatMap((value) => string(object(value)?.question) ? [string(object(value)?.question)] : []));
122
+ if (!questions.every((question) => prompts.has(question.prompt)))
123
+ return undefined;
124
+ return { type: "question", id: tool.id, session_id: sessionId, prompt: questions.map((item) => item.prompt).join("\n"), header: questions.map((item) => item.header).join(" / "), options: questions.flatMap((item) => item.options.map((option) => option.label)), option_details: questions.flatMap((item) => item.options), questions, tool_call_id: tool.id, read_only: true, requested_at: tool.requested_at };
125
+ }
126
+ function explicitApproval(sessionId, state) {
127
+ const block = object(state?.block);
128
+ const permission = object(block?.permission ?? block?.approval ?? state?.permissionRequest);
129
+ if (!permission)
130
+ return undefined;
131
+ const id = string(permission.id ?? permission.requestId ?? permission.requestID ?? permission.toolUseId ?? permission.tool_use_id);
132
+ if (!id)
133
+ return undefined;
134
+ return { type: "approval", id, session_id: sessionId, tool_name: string(permission.toolName ?? permission.tool_name ?? permission.tool) ?? "permission", tool_input_summary: summary(permission.input ?? permission.description ?? permission), requested_at: timestamp(permission.requestedAt ?? permission.timestamp ?? state?.updatedAt), read_only: true };
135
+ }
136
+ const CAPABILITY_REASON = "Claude Code has no documented local exact-ID reply API for an arbitrary active session; private cc-socks transport is disabled";
137
+ function sessionCapabilities() {
138
+ return {
139
+ discovery: { supported: true, mode: "read_only" },
140
+ transcript: { supported: true, mode: "read_only" },
141
+ messaging: { supported: false, mode: "unsupported", reason: CAPABILITY_REASON },
142
+ question_response: { supported: false, mode: "unsupported", reason: CAPABILITY_REASON },
143
+ approval_response: { supported: false, mode: "unsupported", reason: CAPABILITY_REASON },
144
+ };
145
+ }
146
+ class ReadOnlyClaudeTarget {
147
+ async sendMessage() { throw new Error(`Claude Code message sending is read-only: ${CAPABILITY_REASON}`); }
148
+ async respondToPending() { throw new Error(`Claude Code pending responses are read-only: ${CAPABILITY_REASON}`); }
149
+ async interrupt() { throw new Error(`Claude Code interruption is read-only: ${CAPABILITY_REASON}`); }
150
+ }
151
+ export class ClaudeCodeDiscovery {
152
+ machine_id;
153
+ registry;
154
+ options;
155
+ directory;
156
+ config_dir;
157
+ checkpoint_path;
158
+ #executable;
159
+ #version;
160
+ #timer;
161
+ #polling = false;
162
+ #loaded = false;
163
+ #present = new Set();
164
+ #checkpoints = { version: 1, sessions: {} };
165
+ #pathCache = new Map();
166
+ #diagnostics = new Set();
167
+ #pollFailures = 0;
168
+ #nextPollAt = 0;
169
+ #syncFailures = new Map();
170
+ constructor(machine_id, registry, options = {}) {
171
+ this.machine_id = machine_id;
172
+ this.registry = registry;
173
+ this.options = options;
174
+ this.directory = options.directory ?? process.cwd();
175
+ this.config_dir = options.config_dir ?? process.env.CLAUDE_CONFIG_DIR ?? join(homedir(), ".claude");
176
+ this.checkpoint_path = options.checkpoint_path ?? join(homedir(), ".config", "harness-cp", "claude-code-checkpoints.json");
177
+ }
178
+ async start() { await this.poll(); this.#timer = setInterval(() => void this.poll(), this.options.interval_ms ?? 2_000); this.#timer.unref(); }
179
+ stop() { if (this.#timer)
180
+ clearInterval(this.#timer); this.#timer = undefined; }
181
+ target(id) { return this.#present.has(id) ? new ReadOnlyClaudeTarget() : undefined; }
182
+ get executable() { return this.#executable; }
183
+ harnesses() { return this.#executable ? [{ harness_type: "claude-code", discovered_sessions: this.#present.size, attached_sessions: this.registry.list().filter((session) => session.harness_type === "claude-code").length, ...(this.#version ? { version: this.#version } : {}), capabilities: sessionCapabilities() }] : []; }
184
+ capabilities() {
185
+ if (!this.#executable)
186
+ return undefined;
187
+ return { machine_id: this.machine_id, harness_type: "claude-code", can_create_session: false, directories: [], models: [], reported_at: new Date().toISOString(), session_capabilities: sessionCapabilities(), ...(this.#version ? { harness_version: this.#version } : {}) };
188
+ }
189
+ async poll() {
190
+ const now = this.options.now?.() ?? Date.now();
191
+ if (this.#polling || now < this.#nextPollAt)
192
+ return;
193
+ this.#polling = true;
194
+ try {
195
+ await this.#load();
196
+ this.#executable ??= await resolveClaudeExecutable(this.options);
197
+ if (!this.#executable) {
198
+ this.#diagnostic("Claude Code executable was not found; existing-session discovery is inactive");
199
+ return;
200
+ }
201
+ const runner = this.options.runner ?? runBoundedCommand;
202
+ const common = { cwd: this.directory, timeout_ms: this.options.timeout_ms ?? 10_000, max_output_bytes: this.options.max_output_bytes ?? 4 * 1024 * 1024 };
203
+ if (!this.#version) {
204
+ try {
205
+ const result = await this.#command(runner, [...(this.options.executable_args ?? []), "--version"], common);
206
+ this.#version = /\d+\.\d+\.\d+/.exec(result.stdout)?.[0];
207
+ }
208
+ catch { /* discovery remains useful */ }
209
+ }
210
+ const result = await this.#command(runner, [...(this.options.executable_args ?? []), "agents", "--json"], common);
211
+ const agents = parseClaudeAgents(result.stdout).filter((agent) => agent.kind !== "subagent" && agent.kind !== "sidechain");
212
+ this.#pollFailures = 0;
213
+ this.#nextPollAt = 0;
214
+ const found = new Set(agents.map((agent) => agent.sessionId));
215
+ for (const id of this.#present)
216
+ if (!found.has(id)) {
217
+ this.registry.remove(id);
218
+ this.#pathCache.delete(id);
219
+ this.#syncFailures.delete(id);
220
+ }
221
+ this.#present = found;
222
+ const limit = Math.max(1, this.options.max_sessions ?? 128);
223
+ const selected = [...agents].sort((left, right) => agentTime(right) - agentTime(left)).slice(0, limit);
224
+ if (agents.length > limit)
225
+ this.#diagnostic(`Claude Code reports ${agents.length} active sessions; relaying the newest ${limit}`);
226
+ await mapLimit(selected, this.options.concurrency ?? 2, async (agent) => {
227
+ const retry = this.#syncFailures.get(agent.sessionId);
228
+ const current = this.options.now?.() ?? Date.now();
229
+ if (retry && current < retry.next_attempt_at)
230
+ return;
231
+ try {
232
+ await this.#sync(agent);
233
+ this.#syncFailures.delete(agent.sessionId);
234
+ }
235
+ catch (error) {
236
+ const attempts = (retry?.attempts ?? 0) + 1;
237
+ const delay = this.#retryDelay(attempts);
238
+ this.#syncFailures.set(agent.sessionId, { attempts, next_attempt_at: current + delay });
239
+ this.registry.emit("warning", new Error(`Claude Code session ${agent.sessionId} sync failed; retrying in ${Math.ceil(delay / 1_000)}s: ${error instanceof Error ? error.message : String(error)}`));
240
+ }
241
+ });
242
+ await this.#save();
243
+ }
244
+ catch (error) {
245
+ const now = this.options.now?.() ?? Date.now();
246
+ const delay = this.#retryDelay(++this.#pollFailures);
247
+ this.#nextPollAt = now + delay;
248
+ this.registry.emit("warning", new Error(`Claude Code discovery failed; retrying in ${Math.ceil(delay / 1_000)}s: ${error instanceof Error ? error.message : String(error)}`));
249
+ }
250
+ finally {
251
+ this.#polling = false;
252
+ }
253
+ }
254
+ async #sync(agent) {
255
+ const prior = this.registry.get(agent.sessionId);
256
+ const state = await this.#readState(agent);
257
+ const checkpoint = this.#checkpoints.sessions[agent.sessionId] ?? { offset: 0, recent_ids: [], open_tools: {} };
258
+ const transcriptPath = await this.#transcriptPath(agent, state);
259
+ this.registry.upsert({ id: agent.sessionId, machine_id: this.machine_id, harness_type: "claude-code", cwd: agent.cwd, status: statusFromAgent(agent), created_at: timestamp(agent.startedAt ?? state?.createdAt), last_activity_at: timestamp(state?.updatedAt ?? prior?.last_activity_at ?? agent.startedAt), pending: prior?.pending ?? null, title: agent.name ?? string(state?.name), read_only: true,
260
+ metadata: { kind: agent.kind, short_id: agent.id ?? "", claude_version: this.#version ?? string(state?.cliVersion) ?? "", transcript_available: Boolean(transcriptPath), control: "read_only", control_reason: CAPABILITY_REASON } });
261
+ if (transcriptPath)
262
+ await this.#tail(agent.sessionId, transcriptPath, checkpoint);
263
+ const observedActivity = latestTimestamp(timestamp(state?.updatedAt ?? agent.startedAt), this.registry.get(agent.sessionId)?.last_activity_at);
264
+ const wait = (agent.waitingFor ?? "").toLowerCase();
265
+ let pending;
266
+ if (wait.includes("input")) {
267
+ const questions = Object.values(checkpoint.open_tools).filter((tool) => tool.name === "AskUserQuestion").map((tool) => questionFromTool(agent.sessionId, tool, state)).filter((value) => Boolean(value));
268
+ if (questions.length === 1)
269
+ pending = questions[0];
270
+ }
271
+ else if (wait.includes("permission"))
272
+ pending = explicitApproval(agent.sessionId, state);
273
+ const currentPending = this.registry.get(agent.sessionId)?.pending ?? null;
274
+ if (JSON.stringify(currentPending) !== JSON.stringify(pending ?? null))
275
+ this.registry.setPending(agent.sessionId, pending ?? null);
276
+ this.registry.setStatus(agent.sessionId, statusFromAgent(agent));
277
+ const current = this.registry.get(agent.sessionId);
278
+ if (current)
279
+ this.registry.upsert({ ...current, last_activity_at: observedActivity });
280
+ this.#checkpoints.sessions[agent.sessionId] = checkpoint;
281
+ }
282
+ async #readState(agent) {
283
+ if (agent.kind !== "background" || !agent.id || !/^[a-f0-9]{8}$/i.test(agent.id))
284
+ return undefined;
285
+ try {
286
+ const value = object(JSON.parse(await readFile(join(this.config_dir, "jobs", agent.id, "state.json"), "utf8")));
287
+ return string(value?.sessionId) === agent.sessionId ? value : undefined;
288
+ }
289
+ catch {
290
+ return undefined;
291
+ }
292
+ }
293
+ async #transcriptPath(agent, state) {
294
+ const linked = string(state?.linkScanPath);
295
+ if (linked && await this.#safeTranscript(linked, agent.sessionId))
296
+ return linked;
297
+ const cached = this.#pathCache.get(agent.sessionId);
298
+ if (cached && await this.#safeTranscript(cached, agent.sessionId))
299
+ return cached;
300
+ const encoded = agent.cwd.replace(/[^A-Za-z0-9_-]/g, "-");
301
+ const direct = join(this.config_dir, "projects", encoded, `${agent.sessionId}.jsonl`);
302
+ if (await this.#safeTranscript(direct, agent.sessionId)) {
303
+ this.#pathCache.set(agent.sessionId, direct);
304
+ return direct;
305
+ }
306
+ try {
307
+ const projects = await readdir(join(this.config_dir, "projects"), { withFileTypes: true });
308
+ const limit = this.options.max_project_directories ?? 10_000;
309
+ if (projects.length > limit) {
310
+ this.#diagnostic(`Claude transcript search exceeds ${limit} project directories; only cwd-derived paths are used`);
311
+ return undefined;
312
+ }
313
+ for (const project of projects)
314
+ if (project.isDirectory()) {
315
+ const candidate = join(this.config_dir, "projects", project.name, `${agent.sessionId}.jsonl`);
316
+ if (await this.#safeTranscript(candidate, agent.sessionId)) {
317
+ this.#pathCache.set(agent.sessionId, candidate);
318
+ return candidate;
319
+ }
320
+ }
321
+ }
322
+ catch { /* no transcript directory */ }
323
+ return undefined;
324
+ }
325
+ async #safeTranscript(path, sessionId) {
326
+ if (!path.endsWith(`${sessionId}.jsonl`))
327
+ return false;
328
+ try {
329
+ const [root, candidate] = await Promise.all([realpath(join(this.config_dir, "projects")), realpath(path)]);
330
+ return candidate.startsWith(`${root}/`) || candidate.startsWith(`${root}\\`);
331
+ }
332
+ catch {
333
+ return false;
334
+ }
335
+ }
336
+ async #tail(sessionId, path, checkpoint) {
337
+ const info = await stat(path);
338
+ const identity = `${String(info.dev)}:${String(info.ino)}`;
339
+ if (checkpoint.path !== path || checkpoint.identity !== identity || info.size < checkpoint.offset) {
340
+ checkpoint.path = path;
341
+ checkpoint.identity = identity;
342
+ checkpoint.offset = 0;
343
+ checkpoint.remainder = undefined;
344
+ checkpoint.skipping_line = false;
345
+ this.#diagnostic(`Claude transcript ${sessionId.slice(0, 8)} reset after path, rotation, or truncation change`);
346
+ }
347
+ const maxBytes = this.options.max_transcript_bytes_per_poll ?? 4 * 1024 * 1024;
348
+ const remaining = Math.min(maxBytes, Math.max(0, info.size - checkpoint.offset));
349
+ if (remaining === 0) {
350
+ if (checkpoint.remainder)
351
+ await this.#consume(sessionId, Buffer.alloc(0), checkpoint);
352
+ return;
353
+ }
354
+ const handle = await open(path, "r");
355
+ const buffer = Buffer.alloc(remaining);
356
+ try {
357
+ const read = await handle.read(buffer, 0, remaining, checkpoint.offset);
358
+ checkpoint.offset += read.bytesRead;
359
+ await this.#consume(sessionId, buffer.subarray(0, read.bytesRead), checkpoint);
360
+ }
361
+ finally {
362
+ await handle.close();
363
+ }
364
+ }
365
+ async #consume(sessionId, chunk, checkpoint) {
366
+ let data = checkpoint.remainder ? Buffer.concat([Buffer.from(checkpoint.remainder, "base64"), chunk]) : chunk;
367
+ checkpoint.remainder = undefined;
368
+ const maxLine = this.options.max_line_bytes ?? 1024 * 1024;
369
+ const maxLines = this.options.max_lines_per_poll ?? 2_000;
370
+ let start = 0;
371
+ let lines = 0;
372
+ for (let index = 0; index < data.length; index++)
373
+ if (data[index] === 10) {
374
+ const line = data.subarray(start, index);
375
+ start = index + 1;
376
+ if (checkpoint.skipping_line) {
377
+ checkpoint.skipping_line = false;
378
+ continue;
379
+ }
380
+ if (line.length > maxLine) {
381
+ this.#diagnostic(`Claude transcript line exceeded ${maxLine} bytes and was skipped`);
382
+ continue;
383
+ }
384
+ if (++lines > maxLines) {
385
+ checkpoint.remainder = data.subarray(index - line.length).toString("base64");
386
+ return;
387
+ }
388
+ this.#record(sessionId, line.toString("utf8").replace(/\r$/, ""), checkpoint);
389
+ }
390
+ const remainder = data.subarray(start);
391
+ if (remainder.length > maxLine) {
392
+ checkpoint.skipping_line = true;
393
+ this.#diagnostic(`Claude transcript line exceeded ${maxLine} bytes and was skipped`);
394
+ }
395
+ else if (remainder.length > 0)
396
+ checkpoint.remainder = remainder.toString("base64");
397
+ }
398
+ #record(sessionId, line, checkpoint) {
399
+ if (!line)
400
+ return;
401
+ let record;
402
+ try {
403
+ const parsed = object(JSON.parse(line));
404
+ if (!parsed)
405
+ return;
406
+ record = parsed;
407
+ }
408
+ catch {
409
+ this.#diagnostic("Claude transcript contains a malformed JSONL record");
410
+ return;
411
+ }
412
+ if (record.isSidechain === true || string(record.sessionId ?? record.session_id) !== sessionId)
413
+ return;
414
+ const recordId = string(record.uuid) ?? string(record.messageId) ?? stableId(sessionId, line);
415
+ const seen = new Set(checkpoint.recent_ids);
416
+ if (seen.has(recordId))
417
+ return;
418
+ const ts = timestamp(record.timestamp);
419
+ const role = string(object(record.message)?.role) ?? string(record.type);
420
+ const current = this.registry.get(sessionId);
421
+ const model = string(object(record.message)?.model);
422
+ const customTitle = record.type === "custom-title" ? string(record.customTitle) : undefined;
423
+ if (current && (model || customTitle))
424
+ this.registry.upsert({ ...current, ...(model ? { model: { provider_id: "anthropic", model_id: model } } : {}), ...(customTitle ? { title: customTitle } : {}) });
425
+ for (const [index, block] of contentBlocks(record).entries()) {
426
+ const blockType = string(block.type);
427
+ const blockId = string(block.id) ?? `${recordId}:${index}`;
428
+ const eventId = stableId(sessionId, recordId, blockId, blockType ?? "unknown");
429
+ if (blockType === "text" && typeof block.text === "string")
430
+ this.registry.append(sessionId, role === "user" ? "user_message" : "agent_message", { text: block.text }, { id: eventId, ts });
431
+ else if (blockType === "tool_use") {
432
+ const toolId = string(block.id);
433
+ const name = string(block.name);
434
+ if (toolId && name) {
435
+ const input = jsonValue(block.input);
436
+ checkpoint.open_tools[toolId] = { id: toolId, name, ...(input !== undefined ? { input } : {}), requested_at: ts };
437
+ this.registry.append(sessionId, "tool_call", { tool_call_id: toolId, tool_name: name, input_summary: summary(block.input), ...(input !== undefined ? { input } : {}) }, { id: eventId, ts });
438
+ }
439
+ }
440
+ else if (blockType === "tool_result") {
441
+ const toolId = string(block.tool_use_id ?? block.toolUseId);
442
+ if (!toolId)
443
+ continue;
444
+ delete checkpoint.open_tools[toolId];
445
+ const output = jsonValue(block.content);
446
+ const isError = block.is_error === true || block.isError === true;
447
+ this.registry.append(sessionId, "tool_result", { tool_call_id: toolId, output_summary: summary(block.content), ...(output !== undefined ? { output } : {}), is_error: isError }, { id: eventId, ts });
448
+ }
449
+ }
450
+ checkpoint.recent_ids.push(recordId);
451
+ const limit = this.options.max_recent_ids ?? 4_096;
452
+ if (checkpoint.recent_ids.length > limit)
453
+ checkpoint.recent_ids.splice(0, checkpoint.recent_ids.length - limit);
454
+ }
455
+ async #load() {
456
+ if (this.#loaded)
457
+ return;
458
+ this.#loaded = true;
459
+ try {
460
+ const value = JSON.parse(await readFile(this.checkpoint_path, "utf8"));
461
+ if (value.version === 1 && object(value.sessions))
462
+ this.#checkpoints = value;
463
+ }
464
+ catch { /* first run or invalid checkpoint */ }
465
+ }
466
+ async #command(runner, args, options) {
467
+ try {
468
+ return await runner(this.#executable, args, options);
469
+ }
470
+ catch (error) {
471
+ throw new Error((error instanceof Error ? error.message : String(error)).replaceAll("OpenCode", "Claude Code"));
472
+ }
473
+ }
474
+ async #save() {
475
+ await mkdir(dirname(this.checkpoint_path), { recursive: true, mode: 0o700 });
476
+ const temporary = `${this.checkpoint_path}.${process.pid}.tmp`;
477
+ await writeFile(temporary, `${JSON.stringify(this.#checkpoints)}\n`, { mode: 0o600 });
478
+ await rename(temporary, this.checkpoint_path);
479
+ }
480
+ #retryDelay(attempts) { return Math.min(this.options.max_retry_ms ?? 5 * 60_000, (this.options.retry_base_ms ?? 30_000) * 2 ** Math.max(0, attempts - 1)); }
481
+ #diagnostic(message) { if (this.#diagnostics.has(message))
482
+ return; this.#diagnostics.add(message); this.registry.emit("log", message); }
483
+ }
484
+ //# sourceMappingURL=claude-code-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-discovery.js","sourceRoot":"","sources":["../src/claude-code-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7G,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAI1E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAsB,MAAM,gCAAgC,CAAC;AA0DvF,SAAS,MAAM,CAAC,KAAc,IAA6B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5K,SAAS,KAAK,CAAC,KAAc,IAAe,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvF,SAAS,MAAM,CAAC,KAAc,IAAwB,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7G,SAAS,MAAM,CAAC,KAAc,IAAwB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACvI,SAAS,SAAS,CAAC,KAAc,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAAC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAAC,CAAC;IACxI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACvI,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1C,CAAC;AACD,SAAS,eAAe,CAAC,GAAG,MAAiC;IAC3D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAC9J,CAAC;AACD,SAAS,IAAI,CAAC,KAAa,IAAY,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACpH,SAAS,QAAQ,CAAC,GAAG,KAAe,IAAY,OAAO,gBAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClG,SAAS,SAAS,CAAC,KAAc,IAA2B,IAAI,CAAC;IAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAc,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,SAAS,CAAC;AAAC,CAAC,CAAC,CAAC;AACxJ,SAAS,OAAO,CAAC,KAAc,EAAE,KAAK,GAAG,GAAG,IAAY,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACvM,SAAS,SAAS,CAAC,KAAkB;IACnC,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;IAC7H,OAAO,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpF,CAAC;AACD,KAAK,UAAU,QAAQ,CAAI,MAAoB,EAAE,WAAmB,EAAE,SAAsC;IAC1G,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QACrG,OAAO,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAAC,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;IACnH,CAAC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAY,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAAC,CAAC;IAC5I,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAAC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtI,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACpD,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnQ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,QAAyB,IAAc,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAClK,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAAO,GAAwE,EAAE;IAC7H,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAAC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAC9F,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9N,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxG,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,SAAS,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;QAChI,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAChG,CAAC;AAED,SAAS,eAAe,CAAC,KAAkB;IACzC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACrH,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,kBAAkB,CAAC;IAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC;IACrH,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACnE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACzE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,MAAmB;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAAC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;IACzE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB,EAAE,IAAc,EAAE,KAA8B;IACzF,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,SAAS,CAAC;IACtD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACnG,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1M,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7H,CAAC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACnF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AACtZ,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB,EAAE,KAA8B;IACzE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAAC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,EAAE,UAAU,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAChI,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IACnI,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,kBAAkB,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,SAAS,IAAI,KAAK,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACjW,CAAC;AAED,MAAM,iBAAiB,GAAG,gIAAgI,CAAC;AAC3J,SAAS,mBAAmB;IAC1B,OAAO;QACL,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAoB,EAAE;QAC1D,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,WAAoB,EAAE;QAC3D,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,aAAsB,EAAE,MAAM,EAAE,iBAAiB,EAAE;QACxF,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,aAAsB,EAAE,MAAM,EAAE,iBAAiB,EAAE;QAChG,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,aAAsB,EAAE,MAAM,EAAE,iBAAiB,EAAE;KACjG,CAAC;AACJ,CAAC;AAED,MAAM,oBAAoB;IACxB,KAAK,CAAC,WAAW,KAAoB,MAAM,IAAI,KAAK,CAAC,6CAA6C,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;IACzH,KAAK,CAAC,gBAAgB,KAAoB,MAAM,IAAI,KAAK,CAAC,gDAAgD,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;IACjI,KAAK,CAAC,SAAS,KAAoB,MAAM,IAAI,KAAK,CAAC,0CAA0C,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;CACrH;AAED,MAAM,OAAO,mBAAmB;IAiBT,UAAU;IAAmB,QAAQ;IAAoC,OAAO;IAhB5F,SAAS,CAAS;IAClB,UAAU,CAAS;IACnB,eAAe,CAAS;IACjC,WAAW,CAAqB;IAChC,QAAQ,CAAqB;IAC7B,MAAM,CAA6B;IACnC,QAAQ,GAAG,KAAK,CAAC;IACjB,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7B,YAAY,GAAmB,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5D,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,CAAC,CAAC;IAChB,aAAa,GAAG,IAAI,GAAG,EAAyD,CAAC;IAEjF,YAAqB,UAAkB,EAAW,QAAyB,EAAmB,OAAO,GAA+B,EAAE;0BAAjH,UAAU;wBAAmB,QAAQ;uBAAoC,OAAO;QACnG,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACpG,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,8BAA8B,CAAC,CAAC;IAC7H,CAAC;IAED,KAAK,CAAC,KAAK,KAAoB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9J,IAAI,KAAW,IAAI,IAAI,CAAC,MAAM;QAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,EAAU,IAA+B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACxH,IAAI,UAAU,KAAyB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,SAAS,KAA+B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,KAAK,aAAa,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3V,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChR,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW;YAAE,OAAO;QAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,WAAW,KAAK,MAAM,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAAC,IAAI,CAAC,WAAW,CAAC,8EAA8E,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACpI,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,iBAAiB,CAAC;YAAC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YACnN,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,IAAI,CAAC;oBAAC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;oBAAC,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;YACxN,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAClH,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;YAC3H,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC9D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACnD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACtF,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACvG,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK;gBAAE,IAAI,CAAC,WAAW,CAAC,uBAAuB,MAAM,CAAC,MAAM,yCAAyC,KAAK,EAAE,CAAC,CAAC;YAClI,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACtE,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAAC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC1G,IAAI,KAAK,IAAI,OAAO,GAAG,KAAK,CAAC,eAAe;oBAAE,OAAO;gBACrD,IAAI,CAAC;oBAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBAAC,CAAC;gBAC5E,OAAO,KAAK,EAAE,CAAC;oBACb,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBAAC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACtF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;oBACxF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,uBAAuB,KAAK,CAAC,SAAS,6BAA6B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtM,CAAC;YACH,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAAC,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,KAAK,CAAC;YACrI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAChL,CAAC;gBACO,CAAC;YAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAkB;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAAC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7F,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAChH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,EAAE,SAAS,CAAC,EAAE,gBAAgB,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,gBAAgB,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI;YACvY,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,oBAAoB,EAAE,OAAO,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;QACxO,IAAI,cAAc;YAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QAClF,MAAM,gBAAgB,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC/I,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAAC,IAAI,OAAuC,CAAC;QACjG,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAqB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5N,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;YAAE,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3F,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC;QAC3E,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC;QACnI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAAC,IAAI,OAAO;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC1I,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAkB;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,SAAS,CAAC;QACnG,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC,CAAC;YAC3H,OAAO,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,SAAS,CAAC;QAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAkB,EAAE,KAA8B;QACtE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAAC,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;YAAE,OAAO,MAAM,CAAC;QAC7H,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAAC,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;YAAE,OAAO,MAAM,CAAC;QACtI,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAAC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC;QACjJ,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAAC,OAAO,MAAM,CAAC;QAAC,CAAC;QACzH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,MAAM,CAAC;YACzJ,IAAI,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,WAAW,CAAC,oCAAoC,KAAK,uDAAuD,CAAC,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YACtK,KAAK,MAAM,OAAO,IAAI,QAAQ;gBAAE,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;oBAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC;oBAC9F,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;wBAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;wBAAC,OAAO,SAAS,CAAC;oBAAC,CAAC;gBACpI,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,SAAiB;QACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,QAAQ,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3G,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,SAAiB,EAAE,IAAY,EAAE,UAA0B;QACrE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,IAAI,UAAU,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YAClG,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAAC,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;YAAC,UAAU,CAAC,aAAa,GAAG,KAAK,CAAC;YAClJ,IAAI,CAAC,WAAW,CAAC,qBAAqB,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,mDAAmD,CAAC,CAAC;QAClH,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,6BAA6B,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QAAC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACjK,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,UAAU,CAAC,SAAS;gBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACvH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC;YAAC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAAC,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC;YAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;QAAC,CAAC;gBAC7L,CAAC;YAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,KAAa,EAAE,UAA0B;QACzE,IAAI,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAAC,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC;QAChJ,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,GAAG,IAAI,CAAC;QAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,KAAK,CAAC;QAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QACpJ,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;YAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;gBACzE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAAC,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;gBAC5D,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;oBAAC,UAAU,CAAC,aAAa,GAAG,KAAK,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC7E,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;oBAAC,IAAI,CAAC,WAAW,CAAC,mCAAmC,OAAO,wBAAwB,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC9H,IAAI,EAAE,KAAK,GAAG,QAAQ,EAAE,CAAC;oBAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACjH,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;YAChF,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,SAAS,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YAAC,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,WAAW,CAAC,mCAAmC,OAAO,wBAAwB,CAAC,CAAC;QAAC,CAAC;aACrJ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,UAAU,CAAC,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,CAAC,SAAiB,EAAE,IAAY,EAAE,UAA0B;QACjE,IAAI,CAAC,IAAI;YAAE,OAAO;QAAC,IAAI,MAAmB,CAAC;QAC3C,IAAI,CAAC;YAAC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC,CAAC;YAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;YAAC,MAAM,GAAG,MAAM,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,IAAI,CAAC,WAAW,CAAC,qDAAqD,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC5L,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS;YAAE,OAAO;QACvG,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC3I,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC/B,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAAC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAAC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/L,IAAI,OAAO,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxM,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,QAAQ,IAAI,KAAK,EAAE,CAAC;YAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC;YACjL,IAAI,SAAS,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;iBACtL,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAAC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjE,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;oBACxJ,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC/L,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;gBAAC,IAAI,CAAC,MAAM;oBAAE,SAAS;gBAAC,OAAO,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBACzH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAAC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC;gBAC3G,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YACxM,CAAC;QACH,CAAC;QACD,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;QAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK;YAAE,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAC5M,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAC9C,IAAI,CAAC;YAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAmB,CAAC;YAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAAC,CAAC;QAC/K,MAAM,CAAC,CAAC,qCAAqC,CAAC,CAAC;IACjD,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,MAAqB,EAAE,IAAuB,EAAE,OAAsE;QACnI,IAAI,CAAC;YAAC,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,WAAY,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAAC,CAAC;QAC9D,OAAO,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;QAAC,CAAC;IACpI,CAAC;IACD,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QAC7I,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACvI,CAAC;IACD,WAAW,CAAC,QAAgB,IAAY,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5K,WAAW,CAAC,OAAe,IAAU,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACvJ"}
package/dist/cli.js CHANGED
@@ -9,17 +9,24 @@ const { version } = require("../package.json");
9
9
  const HELP = `Rivetplane local client
10
10
 
11
11
  Usage:
12
- rivetplane [--local-port PORT] [--discovery-dir PATH] [--opencode-directory PATH] [--opencode-executable PATH] [--opencode-checkpoint PATH] [--opencode-index-interval SECONDS] [--opencode-export-timeout SECONDS] [--opencode-export-concurrency COUNT] [--opencode-max-sessions-per-project COUNT] [--no-opencode] [--no-opencode-export] [--no-relay]
12
+ rivetplane [--local-port PORT] [--discovery-dir PATH] [--opencode-directory PATH] [--opencode-executable PATH] [--opencode-checkpoint PATH] [--opencode-index-interval SECONDS] [--opencode-export-timeout SECONDS] [--opencode-export-concurrency COUNT] [--opencode-max-sessions-per-project COUNT] [--claude-executable PATH] [--claude-config-dir PATH] [--claude-checkpoint PATH] [--codex-endpoint URL] [--codex-directory PATH] [--codex-executable PATH] [--codex-sessions-dir PATH] [--codex-checkpoint PATH] [--no-claude-code] [--no-codex] [--no-opencode] [--no-opencode-export] [--no-relay]
13
13
  rivetplane --opencode-url URL [client options]
14
14
  rivetplane opencode [client options] [-- OPENCODE_ATTACH_OPTIONS]
15
+ rivetplane codex [client options]
15
16
  rivetplane login [--server URL] [--machine-name NAME] [--machine ID --token TOKEN]
16
17
  rivetplane --help
17
18
 
18
19
  The client scans ~/.acp/sessions/*.json, attaches to ACP sessions, and reads existing
19
20
  OpenCode sessions with 'opencode session list' and 'opencode export'. Export discovery
20
21
  is read-only. It can show pending questions, but it cannot answer them in the original
21
- process. The machine index refreshes every 60 seconds by default. The 2-second
22
- transcript poll uses the cached index. The client does not start OpenCode by default. Use 'rivetplane opencode' for
22
+ process. Codex rollout discovery is also read-only and does not claim attachment to
23
+ independently launched stdio app-server processes. Use 'rivetplane codex' to start a
24
+ Rivetplane-managed Codex app-server. Unix sockets are used on macOS/Linux. An
25
+ authenticated loopback WebSocket is used on Windows. The machine index refreshes every 60 seconds by default. The 2-second
26
+ transcript poll uses the cached index. Claude Code sessions are discovered machine-wide
27
+ with 'claude agents --json'. Their JSONL transcripts and exact-ID pending records are
28
+ read-only because Claude has no documented local exact-ID reply API. Private cc-socks
29
+ are never used. The client does not start OpenCode by default. Use 'rivetplane opencode' for
23
30
  the managed server and attached TUI mode. Login uses https://rivetplane.com unless
24
31
  --server or HARNESS_CP_SERVER selects a self-hosted control plane.`;
25
32
  function flag(name) { const offset = process.argv.indexOf(name); return offset >= 0 ? process.argv[offset + 1] : undefined; }
@@ -48,6 +55,7 @@ async function main() {
48
55
  return;
49
56
  }
50
57
  const explicitOpenCode = process.argv[2] === "opencode";
58
+ const explicitCodex = process.argv[2] === "codex";
51
59
  const attachOpenCode = explicitOpenCode;
52
60
  const credentials = await readCredentials();
53
61
  const discoveryDirectory = flag("--discovery-dir");
@@ -81,6 +89,18 @@ async function main() {
81
89
  opencode_index_interval_ms: openCodeIndexIntervalSeconds * 1_000,
82
90
  opencode_export_timeout_ms: openCodeExportTimeoutSeconds * 1_000,
83
91
  opencode_export_concurrency: openCodeExportConcurrency,
92
+ codex: !process.argv.includes("--no-codex"),
93
+ codex_managed: explicitCodex,
94
+ codex_endpoint: explicitCodex ? undefined : (flag("--codex-endpoint") ?? process.env.HARNESS_CP_CODEX_ENDPOINT),
95
+ codex_token: process.env.HARNESS_CP_CODEX_TOKEN,
96
+ codex_directory: flag("--codex-directory") ?? process.env.HARNESS_CP_CODEX_DIRECTORY ?? process.cwd(),
97
+ codex_executable: flag("--codex-executable") ?? process.env.HARNESS_CP_CODEX_EXECUTABLE,
98
+ codex_sessions_directory: flag("--codex-sessions-dir") ?? process.env.HARNESS_CP_CODEX_SESSIONS_DIRECTORY,
99
+ codex_checkpoint_path: flag("--codex-checkpoint") ?? process.env.HARNESS_CP_CODEX_CHECKPOINT,
100
+ claude_code: !process.argv.includes("--no-claude-code"),
101
+ claude_executable: flag("--claude-executable") ?? process.env.HARNESS_CP_CLAUDE_EXECUTABLE,
102
+ claude_config_dir: flag("--claude-config-dir") ?? process.env.CLAUDE_CONFIG_DIR,
103
+ claude_checkpoint_path: flag("--claude-checkpoint") ?? process.env.HARNESS_CP_CLAUDE_CHECKPOINT,
84
104
  });
85
105
  client.manager.registry.on("log", (message) => process.stderr.write(`${String(message)}\n`));
86
106
  const started = await client.start();
@@ -88,7 +108,7 @@ async function main() {
88
108
  process.stdout.write(credentials && !process.argv.includes("--no-relay") ? `Relay: ${credentials.server_url}\n` : "Relay: disabled (run rivetplane login to pair this machine)\n");
89
109
  const harnesses = client.harnesses();
90
110
  if (harnesses.length === 0)
91
- process.stdout.write(`Harnesses: none found (ACP: ${client.manager.discovery.directory}; OpenCode export: ${client.opencode_exports?.executable ?? "not found"}; managed OpenCode: ${client.opencode ? client.opencode.url : "disabled"})\n`);
111
+ process.stdout.write(`Harnesses: none found (ACP: ${client.manager.discovery.directory}; OpenCode export: ${client.opencode_exports?.executable ?? "not found"}; managed OpenCode: ${client.opencode ? client.opencode.url : "disabled"}; Claude Code: ${client.claude_code?.executable ?? "not found"}; Codex rollouts: ${client.codex_rollouts?.sessions_directory ?? "disabled"}; Codex app-server: ${client.codex_app_server ? "configured" : "disabled"})\n`);
92
112
  else
93
113
  for (const harness of harnesses)
94
114
  process.stdout.write(`Harness: ${harness.harness_type} (${harness.attached_sessions}/${harness.discovered_sessions} sessions attached)\n`);