@gonzih/cc-agent 0.15.38 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cron.d.ts +0 -9
- package/dist/cron.d.ts.map +1 -1
- package/dist/cron.js +9 -61
- package/dist/cron.js.map +1 -1
- package/dist/index.js +0 -124
- package/dist/index.js.map +1 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/tokens.js +6 -2
- package/dist/tokens.js.map +1 -1
- package/package.json +2 -2
- package/dist/meta-agent.d.ts +0 -62
- package/dist/meta-agent.d.ts.map +0 -1
- package/dist/meta-agent.js +0 -478
- package/dist/meta-agent.js.map +0 -1
package/dist/meta-agent.js
DELETED
|
@@ -1,478 +0,0 @@
|
|
|
1
|
-
import { spawn } from "child_process";
|
|
2
|
-
import { existsSync, mkdirSync, readdirSync } from "fs";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
import { execSync } from "child_process";
|
|
6
|
-
import { v4 as randomUUID } from "uuid";
|
|
7
|
-
import { getRedis } from "./redis.js";
|
|
8
|
-
import { logger } from "./logger.js";
|
|
9
|
-
import { injectMcpConfig } from "./mcp-inject.js";
|
|
10
|
-
import { getMasterToken } from "./tokens.js";
|
|
11
|
-
import { resolveClaude } from "./claude.js";
|
|
12
|
-
import { META_AGENTS_INDEX, metaKey, metaAgentStatusKey, chatOutgoingChannel, metaInputKey, chatLogKey, } from "@gonzih/cc-wire";
|
|
13
|
-
const META_TTL_SECONDS = 30 * 24 * 60 * 60; // 30 days
|
|
14
|
-
const STATUS_REDIS_TTL = 7 * 24 * 60 * 60; // 7 days
|
|
15
|
-
const INPUT_POLL_INTERVAL_MS = 3000;
|
|
16
|
-
const CHAT_LOG_MAX = 499;
|
|
17
|
-
export class MetaAgentManager {
|
|
18
|
-
// Tracks in-flight per-message claude processes (one per namespace at most).
|
|
19
|
-
activeProcesses = new Map();
|
|
20
|
-
liveStatus = new Map();
|
|
21
|
-
pollerHandle = null;
|
|
22
|
-
/** Start the global background poller that drains per-namespace input queues every 3s. */
|
|
23
|
-
startPoller() {
|
|
24
|
-
if (this.pollerHandle)
|
|
25
|
-
return;
|
|
26
|
-
this.pollerHandle = setInterval(() => {
|
|
27
|
-
this.pollInputQueues().catch(() => { });
|
|
28
|
-
}, INPUT_POLL_INTERVAL_MS);
|
|
29
|
-
}
|
|
30
|
-
/** Stop the background poller (useful in tests or graceful shutdown). */
|
|
31
|
-
stopPoller() {
|
|
32
|
-
if (this.pollerHandle) {
|
|
33
|
-
clearInterval(this.pollerHandle);
|
|
34
|
-
this.pollerHandle = null;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
async pollInputQueues() {
|
|
38
|
-
// Only poll if running as the launchd-blessed instance (has OAuth token in env).
|
|
39
|
-
// MCP subprocess instances skip polling — they only serve tool calls.
|
|
40
|
-
if (!process.env.CLAUDE_CODE_OAUTH_TOKEN && !process.env.CLAUDE_TOKENS)
|
|
41
|
-
return;
|
|
42
|
-
const redis = getRedis();
|
|
43
|
-
if (!redis)
|
|
44
|
-
return;
|
|
45
|
-
try {
|
|
46
|
-
const namespaces = await redis.smembers(META_AGENTS_INDEX);
|
|
47
|
-
for (const ns of namespaces) {
|
|
48
|
-
// One message at a time per namespace — skip if already processing.
|
|
49
|
-
if (this.activeProcesses.has(ns))
|
|
50
|
-
continue;
|
|
51
|
-
const raw = await redis.rpop(metaInputKey(ns));
|
|
52
|
-
if (!raw)
|
|
53
|
-
continue;
|
|
54
|
-
let content;
|
|
55
|
-
try {
|
|
56
|
-
const parsed = JSON.parse(raw);
|
|
57
|
-
content = parsed.content ?? raw;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
content = raw;
|
|
61
|
-
}
|
|
62
|
-
// Log the incoming message to the chat log so the UI can render it as a
|
|
63
|
-
// user bubble alongside Claude's assistant responses.
|
|
64
|
-
// Protocol: ChatMessage shape = { id, source, role, content, timestamp, chatId }
|
|
65
|
-
// Source must be one of: 'telegram' | 'ui' | 'claude' | 'cc-tg'
|
|
66
|
-
const coordinatorEntry = JSON.stringify({
|
|
67
|
-
id: randomUUID(),
|
|
68
|
-
source: "cc-tg",
|
|
69
|
-
role: "user",
|
|
70
|
-
content,
|
|
71
|
-
timestamp: new Date().toISOString(),
|
|
72
|
-
chatId: 0,
|
|
73
|
-
});
|
|
74
|
-
// NOTE: cca:chat:log:{ns} is LIFO (newest first via LPUSH) — consumers must reverse for chronological display
|
|
75
|
-
redis.lpush(chatLogKey(ns), coordinatorEntry).catch(() => { });
|
|
76
|
-
redis.ltrim(chatLogKey(ns), 0, CHAT_LOG_MAX).catch(() => { });
|
|
77
|
-
// Protocol: every LPUSH to chat:log must also PUBLISH to chat:outgoing
|
|
78
|
-
redis.publish(chatOutgoingChannel(ns), coordinatorEntry).catch(() => { });
|
|
79
|
-
this.messageMetaAgent(ns, content).catch((err) => {
|
|
80
|
-
logger.warn("meta-agent:poller-message-failed", { namespace: ns, err: String(err) });
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch (err) {
|
|
85
|
-
logger.warn("meta-agent:poller-failed", { err: String(err) });
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
async ensureWorkspace(namespace, repoUrl) {
|
|
89
|
-
const cwd = join(homedir(), "cc-agent-workspace", namespace);
|
|
90
|
-
if (!existsSync(cwd)) {
|
|
91
|
-
mkdirSync(join(homedir(), "cc-agent-workspace"), { recursive: true });
|
|
92
|
-
const url = repoUrl ?? `https://github.com/gonzih/${namespace}`;
|
|
93
|
-
logger.info("meta-agent:clone", { namespace, url, cwd });
|
|
94
|
-
execSync(`git clone --depth 1 ${url} ${cwd}`, { stdio: "pipe" });
|
|
95
|
-
}
|
|
96
|
-
return cwd;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Check if a prior Claude session file exists for the given workspace CWD.
|
|
100
|
-
* Claude stores sessions at ~/.claude/projects/<encoded-path>/ where
|
|
101
|
-
* encoded-path is the CWD with '/' replaced by '-'.
|
|
102
|
-
*/
|
|
103
|
-
hasExistingSession(cwd) {
|
|
104
|
-
const encodedPath = cwd.replace(/\//g, "-");
|
|
105
|
-
const sessionDir = join(homedir(), ".claude", "projects", encodedPath);
|
|
106
|
-
if (!existsSync(sessionDir))
|
|
107
|
-
return false;
|
|
108
|
-
try {
|
|
109
|
-
const files = readdirSync(sessionDir);
|
|
110
|
-
return files.some((f) => f.endsWith(".jsonl"));
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Ensure the workspace and initial state exist for a namespace.
|
|
118
|
-
* Does NOT spawn a process — agents are stateless between messages.
|
|
119
|
-
*/
|
|
120
|
-
async startMetaAgent(namespace, repoUrl) {
|
|
121
|
-
// If state already exists, return it as-is.
|
|
122
|
-
const existingState = await this.getState(namespace);
|
|
123
|
-
if (existingState)
|
|
124
|
-
return existingState;
|
|
125
|
-
const cwd = await this.ensureWorkspace(namespace, repoUrl);
|
|
126
|
-
const effectiveRepoUrl = repoUrl ?? `https://github.com/gonzih/${namespace}`;
|
|
127
|
-
const state = {
|
|
128
|
-
namespace,
|
|
129
|
-
repoUrl: effectiveRepoUrl,
|
|
130
|
-
cwd,
|
|
131
|
-
status: "idle",
|
|
132
|
-
startedAt: new Date().toISOString(),
|
|
133
|
-
};
|
|
134
|
-
await this.saveState(state);
|
|
135
|
-
// Drain stale input queue if any (legacy key, no longer used by tool handler)
|
|
136
|
-
const redis = getRedis();
|
|
137
|
-
if (redis)
|
|
138
|
-
await redis.del(metaInputKey(namespace)).catch(() => { });
|
|
139
|
-
this.liveStatus.set(namespace, {
|
|
140
|
-
isTyping: false,
|
|
141
|
-
turnCount: 0,
|
|
142
|
-
lastActivity: new Date().toISOString(),
|
|
143
|
-
});
|
|
144
|
-
// Write initial status to Redis immediately so consumers see the agent
|
|
145
|
-
// without waiting for the first message to be delivered.
|
|
146
|
-
await this.writeLiveStatus(namespace);
|
|
147
|
-
logger.info("meta-agent:started", { namespace, cwd });
|
|
148
|
-
return state;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Deliver a message to a meta-agent by spawning `claude -p <message>`.
|
|
152
|
-
* Uses `--continue` if a prior session file exists in the workspace.
|
|
153
|
-
* Stdout is published line-by-line to cca:chat:outgoing:{namespace}.
|
|
154
|
-
*/
|
|
155
|
-
async messageMetaAgent(namespace, message, repoUrl) {
|
|
156
|
-
const redis = getRedis();
|
|
157
|
-
if (!redis)
|
|
158
|
-
throw new Error("Redis not available");
|
|
159
|
-
// Guard against concurrent calls for the same namespace.
|
|
160
|
-
if (this.activeProcesses.has(namespace)) {
|
|
161
|
-
const existing = this.activeProcesses.get(namespace);
|
|
162
|
-
if (!existing.killed) {
|
|
163
|
-
throw new Error(`Meta-agent for namespace '${namespace}' is already processing a message. Wait for it to finish.`);
|
|
164
|
-
}
|
|
165
|
-
// Process exited but wasn't cleaned up — remove stale entry.
|
|
166
|
-
this.activeProcesses.delete(namespace);
|
|
167
|
-
}
|
|
168
|
-
// Ensure workspace and state exist.
|
|
169
|
-
let state = await this.getState(namespace);
|
|
170
|
-
if (!state) {
|
|
171
|
-
state = await this.startMetaAgent(namespace, repoUrl);
|
|
172
|
-
}
|
|
173
|
-
const cwd = state.cwd;
|
|
174
|
-
const sessionExists = this.hasExistingSession(cwd);
|
|
175
|
-
const claudeArgs = sessionExists
|
|
176
|
-
? ["--continue", "-p", message, "--dangerously-skip-permissions"]
|
|
177
|
-
: ["-p", message, "--dangerously-skip-permissions"];
|
|
178
|
-
// Inject cc-agent MCP so the meta-agent can call spawn_agent etc.
|
|
179
|
-
injectMcpConfig(cwd, namespace);
|
|
180
|
-
// Update lastMessageAt and mark running.
|
|
181
|
-
state.lastMessageAt = new Date().toISOString();
|
|
182
|
-
state.status = "running";
|
|
183
|
-
await this.saveState(state);
|
|
184
|
-
// Update live status.
|
|
185
|
-
let ls = this.liveStatus.get(namespace);
|
|
186
|
-
if (!ls) {
|
|
187
|
-
ls = { isTyping: true, turnCount: 1, lastActivity: new Date().toISOString() };
|
|
188
|
-
this.liveStatus.set(namespace, ls);
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
ls.lastActivity = new Date().toISOString();
|
|
192
|
-
ls.isTyping = true;
|
|
193
|
-
ls.turnCount += 1;
|
|
194
|
-
}
|
|
195
|
-
this.writeLiveStatus(namespace).catch(() => { });
|
|
196
|
-
// Inject master token so the claude subprocess can authenticate even when
|
|
197
|
-
// this process (MCP instance) has CLAUDE_* env vars stripped by Claude Code.
|
|
198
|
-
// Use a timeout so Redis latency can't stall the spawn path.
|
|
199
|
-
const masterToken = await Promise.race([
|
|
200
|
-
getMasterToken(),
|
|
201
|
-
new Promise((resolve) => setTimeout(() => resolve(""), 3000)),
|
|
202
|
-
]);
|
|
203
|
-
const spawnEnv = { ...process.env };
|
|
204
|
-
if (masterToken && !spawnEnv.CLAUDE_CODE_OAUTH_TOKEN && !spawnEnv.CLAUDE_TOKENS) {
|
|
205
|
-
spawnEnv.CLAUDE_CODE_OAUTH_TOKEN = masterToken;
|
|
206
|
-
}
|
|
207
|
-
const claudeBin = resolveClaude();
|
|
208
|
-
logger.info("meta-agent:spawn-attempt", { namespace, claudeBin, sessionExists, args: claudeArgs });
|
|
209
|
-
let proc;
|
|
210
|
-
try {
|
|
211
|
-
proc = spawn(claudeBin, claudeArgs, {
|
|
212
|
-
cwd,
|
|
213
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
214
|
-
detached: false,
|
|
215
|
-
env: spawnEnv,
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
catch (spawnErr) {
|
|
219
|
-
// Binary not found or other pre-exec error — clean up and rethrow with context.
|
|
220
|
-
logger.error("meta-agent:spawn-failed", { namespace, claudeBin, err: String(spawnErr) });
|
|
221
|
-
this.activeProcesses.delete(namespace);
|
|
222
|
-
const ls2 = this.liveStatus.get(namespace);
|
|
223
|
-
if (ls2) {
|
|
224
|
-
ls2.isTyping = false;
|
|
225
|
-
}
|
|
226
|
-
this.writeLiveStatus(namespace).catch(() => { });
|
|
227
|
-
await this.updateStatus(namespace, "idle");
|
|
228
|
-
throw new Error(`Failed to spawn claude for namespace '${namespace}': ${String(spawnErr)}`);
|
|
229
|
-
}
|
|
230
|
-
this.activeProcesses.set(namespace, proc);
|
|
231
|
-
// Update pid in persisted state.
|
|
232
|
-
state.pid = proc.pid;
|
|
233
|
-
await this.saveState(state);
|
|
234
|
-
// Detect immediate spawn failures (ENOENT fires as an 'error' event, not 'close').
|
|
235
|
-
proc.on("error", (spawnError) => {
|
|
236
|
-
logger.error("meta-agent:process-error", { namespace, claudeBin, err: String(spawnError) });
|
|
237
|
-
this.activeProcesses.delete(namespace);
|
|
238
|
-
const ls = this.liveStatus.get(namespace);
|
|
239
|
-
if (ls) {
|
|
240
|
-
ls.isTyping = false;
|
|
241
|
-
ls.currentTool = undefined;
|
|
242
|
-
}
|
|
243
|
-
this.writeLiveStatus(namespace).catch(() => { });
|
|
244
|
-
this.updateStatus(namespace, "idle").catch(() => { });
|
|
245
|
-
});
|
|
246
|
-
proc.stdout?.setEncoding("utf-8");
|
|
247
|
-
proc.stdout?.on("data", (chunk) => {
|
|
248
|
-
const lines = chunk.split("\n");
|
|
249
|
-
for (const line of lines) {
|
|
250
|
-
if (!line.trim())
|
|
251
|
-
continue;
|
|
252
|
-
this.processOutputLine(namespace, line);
|
|
253
|
-
this.publishOutput(namespace, line).catch(() => { });
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
proc.stderr?.setEncoding("utf-8");
|
|
257
|
-
proc.stderr?.on("data", (chunk) => {
|
|
258
|
-
logger.warn("meta-agent:stderr", { namespace, chunk: chunk.slice(0, 200) });
|
|
259
|
-
});
|
|
260
|
-
proc.on("close", (code) => {
|
|
261
|
-
logger.info("meta-agent:message-done", { namespace, code });
|
|
262
|
-
this.activeProcesses.delete(namespace);
|
|
263
|
-
const ls = this.liveStatus.get(namespace);
|
|
264
|
-
if (ls) {
|
|
265
|
-
ls.isTyping = false;
|
|
266
|
-
ls.currentTool = undefined;
|
|
267
|
-
}
|
|
268
|
-
this.writeLiveStatus(namespace).catch(() => { });
|
|
269
|
-
this.updateStatus(namespace, "idle").catch(() => { });
|
|
270
|
-
});
|
|
271
|
-
logger.info("meta-agent:message-spawned", { namespace, pid: proc.pid, sessionExists, claudeBin });
|
|
272
|
-
}
|
|
273
|
-
async listMetaAgents() {
|
|
274
|
-
const redis = getRedis();
|
|
275
|
-
if (!redis)
|
|
276
|
-
return [];
|
|
277
|
-
try {
|
|
278
|
-
const namespaces = await redis.smembers(META_AGENTS_INDEX);
|
|
279
|
-
const results = [];
|
|
280
|
-
for (const ns of namespaces) {
|
|
281
|
-
const state = await this.getState(ns);
|
|
282
|
-
if (state)
|
|
283
|
-
results.push(state);
|
|
284
|
-
}
|
|
285
|
-
return results;
|
|
286
|
-
}
|
|
287
|
-
catch (err) {
|
|
288
|
-
logger.error("meta-agent:list-failed", { err: String(err) });
|
|
289
|
-
return [];
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
async stopMetaAgent(namespace) {
|
|
293
|
-
const proc = this.activeProcesses.get(namespace);
|
|
294
|
-
if (proc && !proc.killed) {
|
|
295
|
-
proc.kill();
|
|
296
|
-
this.activeProcesses.delete(namespace);
|
|
297
|
-
}
|
|
298
|
-
const ls = this.liveStatus.get(namespace);
|
|
299
|
-
if (ls) {
|
|
300
|
-
ls.isTyping = false;
|
|
301
|
-
ls.currentTool = undefined;
|
|
302
|
-
}
|
|
303
|
-
this.writeLiveStatus(namespace).catch(() => { });
|
|
304
|
-
await this.updateStatus(namespace, "idle");
|
|
305
|
-
logger.info("meta-agent:stopped", { namespace });
|
|
306
|
-
}
|
|
307
|
-
/** Return live status for a namespace, merged into MetaAgentInfo shape. */
|
|
308
|
-
getLiveStatus(namespace) {
|
|
309
|
-
const ls = this.liveStatus.get(namespace);
|
|
310
|
-
if (!ls)
|
|
311
|
-
return {};
|
|
312
|
-
return {
|
|
313
|
-
lastActivity: ls.lastActivity,
|
|
314
|
-
currentTool: ls.currentTool,
|
|
315
|
-
isTyping: ls.isTyping,
|
|
316
|
-
lastMessage: ls.lastMessage,
|
|
317
|
-
turnCount: ls.turnCount,
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Parse a stdout line from the Claude process to extract live status signals.
|
|
322
|
-
* Claude Code's streaming output uses patterns like:
|
|
323
|
-
* - Tool use start: lines containing "Tool:" or JSON with type "tool_use"
|
|
324
|
-
* - Tool use end: lines containing "Tool result" or type "tool_result"
|
|
325
|
-
* - Text output: regular assistant text lines
|
|
326
|
-
*/
|
|
327
|
-
processOutputLine(namespace, line) {
|
|
328
|
-
const ls = this.liveStatus.get(namespace);
|
|
329
|
-
if (!ls)
|
|
330
|
-
return;
|
|
331
|
-
const now = new Date().toISOString();
|
|
332
|
-
ls.lastActivity = now;
|
|
333
|
-
// Detect tool use from Claude Code's output format.
|
|
334
|
-
// Claude Code prefixes tool calls with "⏺" or structured JSON events.
|
|
335
|
-
// Match patterns like: "⏺ Bash(..." or JSON {"type":"tool_use","name":"Bash"}
|
|
336
|
-
const toolStartPattern = /(?:^⏺\s+(\w+)\(|"type"\s*:\s*"tool_use".*?"name"\s*:\s*"(\w+)")/;
|
|
337
|
-
const toolEndPattern = /(?:^⏺ Tool result|"type"\s*:\s*"tool_result")/;
|
|
338
|
-
const assistantTextPattern = /^(?![\[{⏺])/; // lines not starting with JSON/tool markers
|
|
339
|
-
const toolMatch = line.match(toolStartPattern);
|
|
340
|
-
if (toolMatch) {
|
|
341
|
-
ls.currentTool = toolMatch[1] ?? toolMatch[2] ?? "Unknown";
|
|
342
|
-
ls.isTyping = false;
|
|
343
|
-
}
|
|
344
|
-
else if (toolEndPattern.test(line)) {
|
|
345
|
-
ls.currentTool = undefined;
|
|
346
|
-
ls.isTyping = true; // Claude is now processing the result and generating
|
|
347
|
-
}
|
|
348
|
-
else if (assistantTextPattern.test(line) && line.trim().length > 0) {
|
|
349
|
-
// Regular assistant text output — Claude is typing
|
|
350
|
-
ls.isTyping = true;
|
|
351
|
-
ls.currentTool = undefined;
|
|
352
|
-
// Keep last ~80 chars of last non-empty text line
|
|
353
|
-
const trimmed = line.trim();
|
|
354
|
-
ls.lastMessage = trimmed.length > 80 ? trimmed.slice(-80) : trimmed;
|
|
355
|
-
}
|
|
356
|
-
// Write updated status to Redis (fire-and-forget)
|
|
357
|
-
this.writeLiveStatus(namespace).catch(() => { });
|
|
358
|
-
}
|
|
359
|
-
/** Write live status to Redis key cca:meta-agent:status:{namespace} */
|
|
360
|
-
async writeLiveStatus(namespace) {
|
|
361
|
-
const redis = getRedis();
|
|
362
|
-
if (!redis)
|
|
363
|
-
return;
|
|
364
|
-
const ls = this.liveStatus.get(namespace);
|
|
365
|
-
if (!ls)
|
|
366
|
-
return;
|
|
367
|
-
try {
|
|
368
|
-
const state = await this.getState(namespace);
|
|
369
|
-
const payload = {
|
|
370
|
-
namespace,
|
|
371
|
-
status: state?.status ?? "idle",
|
|
372
|
-
pid: state?.pid,
|
|
373
|
-
startedAt: state?.startedAt,
|
|
374
|
-
lastActivity: ls.lastActivity,
|
|
375
|
-
currentTool: ls.currentTool,
|
|
376
|
-
isTyping: ls.isTyping,
|
|
377
|
-
lastMessage: ls.lastMessage,
|
|
378
|
-
turnCount: ls.turnCount,
|
|
379
|
-
updatedAt: new Date().toISOString(),
|
|
380
|
-
};
|
|
381
|
-
await redis.set(metaAgentStatusKey(namespace), JSON.stringify(payload), "EX", STATUS_REDIS_TTL);
|
|
382
|
-
}
|
|
383
|
-
catch (err) {
|
|
384
|
-
logger.warn("meta-agent:write-live-status-failed", { namespace, err: String(err) });
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
async publishOutput(namespace, line) {
|
|
388
|
-
const redis = getRedis();
|
|
389
|
-
if (!redis)
|
|
390
|
-
return;
|
|
391
|
-
// Protocol: ChatMessage shape = { id, source, role, content, timestamp, chatId }
|
|
392
|
-
// Source must be one of: 'telegram' | 'ui' | 'claude' | 'cc-tg'
|
|
393
|
-
const message = JSON.stringify({
|
|
394
|
-
id: randomUUID(),
|
|
395
|
-
source: "claude",
|
|
396
|
-
role: "assistant",
|
|
397
|
-
content: line,
|
|
398
|
-
timestamp: new Date().toISOString(),
|
|
399
|
-
chatId: 0,
|
|
400
|
-
});
|
|
401
|
-
try {
|
|
402
|
-
await redis.publish(chatOutgoingChannel(namespace), message);
|
|
403
|
-
// NOTE: cca:chat:log:{ns} is LIFO (newest first via LPUSH) — consumers must reverse for chronological display
|
|
404
|
-
await redis.lpush(chatLogKey(namespace), message);
|
|
405
|
-
await redis.ltrim(chatLogKey(namespace), 0, CHAT_LOG_MAX);
|
|
406
|
-
}
|
|
407
|
-
catch (err) {
|
|
408
|
-
logger.warn("meta-agent:publish-failed", { namespace, err: String(err) });
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
async saveState(state) {
|
|
412
|
-
const redis = getRedis();
|
|
413
|
-
if (!redis)
|
|
414
|
-
return;
|
|
415
|
-
try {
|
|
416
|
-
await redis.set(metaKey(state.namespace), JSON.stringify(state), "EX", META_TTL_SECONDS);
|
|
417
|
-
await redis.sadd(META_AGENTS_INDEX, state.namespace);
|
|
418
|
-
}
|
|
419
|
-
catch (err) {
|
|
420
|
-
logger.error("meta-agent:save-state-failed", { namespace: state.namespace, err: String(err) });
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
async getState(namespace) {
|
|
424
|
-
const redis = getRedis();
|
|
425
|
-
if (!redis)
|
|
426
|
-
return null;
|
|
427
|
-
try {
|
|
428
|
-
const raw = await redis.get(metaKey(namespace));
|
|
429
|
-
if (!raw)
|
|
430
|
-
return null;
|
|
431
|
-
const state = JSON.parse(raw);
|
|
432
|
-
// Reflect live process state
|
|
433
|
-
const proc = this.activeProcesses.get(namespace);
|
|
434
|
-
if (proc && !proc.killed) {
|
|
435
|
-
state.status = "running";
|
|
436
|
-
state.pid = proc.pid;
|
|
437
|
-
}
|
|
438
|
-
else if (state.status === "running") {
|
|
439
|
-
// No active process tracked (e.g. after a server restart) — correct stale "running" status.
|
|
440
|
-
state.status = "idle";
|
|
441
|
-
state.pid = undefined;
|
|
442
|
-
}
|
|
443
|
-
// Merge in-memory live status fields
|
|
444
|
-
const ls = this.liveStatus.get(namespace);
|
|
445
|
-
if (ls) {
|
|
446
|
-
state.lastActivity = ls.lastActivity;
|
|
447
|
-
state.currentTool = ls.currentTool;
|
|
448
|
-
state.isTyping = ls.isTyping;
|
|
449
|
-
state.lastMessage = ls.lastMessage;
|
|
450
|
-
state.turnCount = ls.turnCount;
|
|
451
|
-
}
|
|
452
|
-
return state;
|
|
453
|
-
}
|
|
454
|
-
catch {
|
|
455
|
-
return null;
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
async updateStatus(namespace, status) {
|
|
459
|
-
const redis = getRedis();
|
|
460
|
-
if (!redis)
|
|
461
|
-
return;
|
|
462
|
-
try {
|
|
463
|
-
const raw = await redis.get(metaKey(namespace));
|
|
464
|
-
if (!raw)
|
|
465
|
-
return;
|
|
466
|
-
const state = JSON.parse(raw);
|
|
467
|
-
state.status = status;
|
|
468
|
-
if (status === "idle")
|
|
469
|
-
state.pid = undefined;
|
|
470
|
-
await redis.set(metaKey(namespace), JSON.stringify(state), "EX", META_TTL_SECONDS);
|
|
471
|
-
}
|
|
472
|
-
catch (err) {
|
|
473
|
-
logger.error("meta-agent:update-status-failed", { namespace, err: String(err) });
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
export const metaAgentManager = new MetaAgentManager();
|
|
478
|
-
//# sourceMappingURL=meta-agent.js.map
|
package/dist/meta-agent.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"meta-agent.js","sourceRoot":"","sources":["../src/meta-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,EAAE,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU;AACtD,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS;AA2BpD,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,MAAM,OAAO,gBAAgB;IAC3B,6EAA6E;IACrE,eAAe,GAAG,IAAI,GAAG,EAAwB,CAAC;IAClD,UAAU,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,YAAY,GAA0C,IAAI,CAAC;IAEnE,0FAA0F;IAC1F,WAAW;QACT,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO;QAC9B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAC7B,CAAC;IAED,yEAAyE;IACzE,UAAU;QACR,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,iFAAiF;QACjF,sEAAsE;QACtE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa;YAAE,OAAO;QAC/E,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAC3D,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,oEAAoE;gBACpE,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,SAAS;gBAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC/C,IAAI,CAAC,GAAG;oBAAE,SAAS;gBACnB,IAAI,OAAe,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;oBACvD,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;gBAClC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,GAAG,GAAG,CAAC;gBAChB,CAAC;gBACD,wEAAwE;gBACxE,sDAAsD;gBACtD,iFAAiF;gBACjF,gEAAgE;gBAChE,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC;oBACtC,EAAE,EAAE,UAAU,EAAE;oBAChB,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,MAAM;oBACZ,OAAO;oBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,MAAM,EAAE,CAAC;iBACV,CAAC,CAAC;gBACH,8GAA8G;gBAC9G,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC9D,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBAC7D,uEAAuE;gBACvE,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACzE,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC/C,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvF,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,OAAgB;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,OAAO,IAAI,6BAA6B,SAAS,EAAE,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACzD,QAAQ,CAAC,uBAAuB,GAAG,IAAI,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAC,GAAW;QACpC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACvE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;YACtC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,OAAgB;QACtD,4CAA4C;QAC5C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,aAAa;YAAE,OAAO,aAAa,CAAC;QAExC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,OAAO,IAAI,6BAA6B,SAAS,EAAE,CAAC;QAE7E,MAAM,KAAK,GAAkB;YAC3B,SAAS;YACT,OAAO,EAAE,gBAAgB;YACzB,GAAG;YACH,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE5B,8EAA8E;QAC9E,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEpE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE;YAC7B,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,CAAC;YACZ,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;QAEH,uEAAuE;QACvE,yDAAyD;QACzD,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAEtC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,SAAiB,EAAE,OAAe,EAAE,OAAgB;QACzE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAEnD,yDAAyD;QACzD,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,6BAA6B,SAAS,2DAA2D,CAAC,CAAC;YACrH,CAAC;YACD,6DAA6D;YAC7D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAED,oCAAoC;QACpC,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,aAAa;YAC9B,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,gCAAgC,CAAC;YACjE,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,gCAAgC,CAAC,CAAC;QAEtD,kEAAkE;QAClE,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAEhC,yCAAyC;QACzC,KAAK,CAAC,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QACzB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE5B,sBAAsB;QACtB,IAAI,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9E,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;YACnB,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEhD,0EAA0E;QAC1E,6EAA6E;QAC7E,6DAA6D;QAC7D,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YACrC,cAAc,EAAE;YAChB,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;SACtE,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,uBAAuB,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YAChF,QAAQ,CAAC,uBAAuB,GAAG,WAAW,CAAC;QACjD,CAAC;QAED,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnG,IAAI,IAAkB,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE;gBAClC,GAAG;gBACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,QAAQ,EAAE,KAAK;gBACf,GAAG,EAAE,QAAQ;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,gFAAgF;YAChF,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC3C,IAAI,GAAG,EAAE,CAAC;gBAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;YAAC,CAAC;YAClC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAE1C,iCAAiC;QACjC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE5B,mFAAmF;QACnF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE;YAC9B,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC5F,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,EAAE,EAAE,CAAC;gBAAC,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC;gBAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC;YAAC,CAAC;YAC5D,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC3B,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBACxC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,EAAE,EAAE,CAAC;gBAAC,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC;gBAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC;YAAC,CAAC;YAC5D,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAoB,EAAE,CAAC;YACpC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACtC,IAAI,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7D,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,EAAE,EAAE,CAAC;YAAC,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC;YAAC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC;QAAC,CAAC;QAC5D,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEhD,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,2EAA2E;IAC3E,aAAa,CAAC,SAAiB;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,OAAO;YACL,YAAY,EAAE,EAAE,CAAC,YAAY;YAC7B,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,QAAQ,EAAE,EAAE,CAAC,QAAQ;YACrB,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,SAAS,EAAE,EAAE,CAAC,SAAS;SACxB,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CAAC,SAAiB,EAAE,IAAY;QACvD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,EAAE,CAAC,YAAY,GAAG,GAAG,CAAC;QAEtB,oDAAoD;QACpD,sEAAsE;QACtE,8EAA8E;QAC9E,MAAM,gBAAgB,GAAG,iEAAiE,CAAC;QAC3F,MAAM,cAAc,GAAG,+CAA+C,CAAC;QACvE,MAAM,oBAAoB,GAAG,aAAa,CAAC,CAAC,4CAA4C;QAExF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YAC3D,EAAE,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC;YAC3B,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,qDAAqD;QAC3E,CAAC;aAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,mDAAmD;YACnD,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;YACnB,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC;YAC3B,kDAAkD;YAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACtE,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,uEAAuE;IAC/D,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC7C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC7C,MAAM,OAAO,GAAG;gBACd,SAAS;gBACT,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,MAAM;gBAC/B,GAAG,EAAE,KAAK,EAAE,GAAG;gBACf,SAAS,EAAE,KAAK,EAAE,SAAS;gBAC3B,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,SAAS,EAAE,EAAE,CAAC,SAAS;gBACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,MAAM,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAClG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,IAAY;QACzD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,iFAAiF;QACjF,gEAAgE;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,EAAE,EAAE,UAAU,EAAE;YAChB,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,CAAC;SACV,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7D,8GAA8G;YAC9G,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAoB;QAC1C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;YACzF,MAAM,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,SAAiB;QACtC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;YAC/C,6BAA6B;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzB,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;gBACzB,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACvB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACtC,4FAA4F;gBAC5F,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;gBACtB,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC;YACxB,CAAC;YACD,qCAAqC;YACrC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,EAAE,EAAE,CAAC;gBACP,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,YAAY,CAAC;gBACrC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;gBACnC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;gBAC7B,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;gBACnC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;YACjC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,MAA0B;QACtE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;YAC/C,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YACtB,IAAI,MAAM,KAAK,MAAM;gBAAE,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC;YAC7C,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC;QACrF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|