@adamancyzhang/claude-orchestrator 0.2.7 → 0.3.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/dist/cli/commands.d.ts +8 -4
- package/dist/cli/commands.js +111 -162
- package/dist/cli/commands.js.map +1 -1
- package/dist/config.d.ts +6 -0
- package/dist/config.js +11 -2
- package/dist/config.js.map +1 -1
- package/dist/index.js +71 -28
- package/dist/index.js.map +1 -1
- package/dist/leader/event-bus.d.ts +11 -0
- package/dist/leader/event-bus.js +21 -0
- package/dist/leader/event-bus.js.map +1 -0
- package/dist/leader/index.d.ts +7 -0
- package/dist/leader/index.js +86 -0
- package/dist/leader/index.js.map +1 -0
- package/dist/leader/monitor.d.ts +14 -0
- package/dist/leader/monitor.js +55 -0
- package/dist/leader/monitor.js.map +1 -0
- package/dist/leader/orchestrator.d.ts +14 -0
- package/dist/leader/orchestrator.js +83 -0
- package/dist/leader/orchestrator.js.map +1 -0
- package/dist/leader/recovery.d.ts +9 -0
- package/dist/leader/recovery.js +46 -0
- package/dist/leader/recovery.js.map +1 -0
- package/dist/leader/state.d.ts +23 -0
- package/dist/leader/state.js +85 -0
- package/dist/leader/state.js.map +1 -0
- package/dist/leader/tui.d.ts +5 -0
- package/dist/leader/tui.js +133 -0
- package/dist/leader/tui.js.map +1 -0
- package/dist/leader/watcher.d.ts +16 -0
- package/dist/leader/watcher.js +77 -0
- package/dist/leader/watcher.js.map +1 -0
- package/dist/models/schemas.d.ts +65 -15
- package/dist/models/schemas.js +30 -3
- package/dist/models/schemas.js.map +1 -1
- package/dist/modules/message-router.d.ts +2 -0
- package/dist/modules/message-router.js +17 -0
- package/dist/modules/message-router.js.map +1 -1
- package/dist/modules/task-queue.d.ts +4 -1
- package/dist/modules/task-queue.js +87 -9
- package/dist/modules/task-queue.js.map +1 -1
- package/dist/templates/leader.md +10 -0
- package/dist/templates/worker.md +8 -0
- package/dist/utils/exec.d.ts +3 -0
- package/dist/utils/exec.js +20 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/worker/watcher.d.ts +16 -0
- package/dist/worker/watcher.js +82 -0
- package/dist/worker/watcher.js.map +1 -0
- package/dist/zk/client.d.ts +5 -0
- package/dist/zk/client.js +18 -1
- package/dist/zk/client.js.map +1 -1
- package/dist/zk/paths.d.ts +2 -0
- package/dist/zk/paths.js +4 -0
- package/dist/zk/paths.js.map +1 -1
- package/package.json +3 -6
- package/dist/server.d.ts +0 -2
- package/dist/server.js +0 -469
- package/dist/server.js.map +0 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
const ESC = "\x1b";
|
|
2
|
+
const CLEAR = `${ESC}[2J${ESC}[0;0H`;
|
|
3
|
+
const HIDE_CURSOR = `${ESC}[?25l`;
|
|
4
|
+
const SHOW_CURSOR = `${ESC}[?25h`;
|
|
5
|
+
const RESET = `${ESC}[0m`;
|
|
6
|
+
const BOLD = `${ESC}[1m`;
|
|
7
|
+
const DIM = `${ESC}[2m`;
|
|
8
|
+
const RED = `${ESC}[31m`;
|
|
9
|
+
const GREEN = `${ESC}[32m`;
|
|
10
|
+
const YELLOW = `${ESC}[33m`;
|
|
11
|
+
const BLUE = `${ESC}[34m`;
|
|
12
|
+
const MAGENTA = `${ESC}[35m`;
|
|
13
|
+
const CYAN = `${ESC}[36m`;
|
|
14
|
+
function padRight(s, n) {
|
|
15
|
+
const visible = s.replace(/\x1b\[[0-9;]*m/g, "");
|
|
16
|
+
return s + " ".repeat(Math.max(0, n - visible.length));
|
|
17
|
+
}
|
|
18
|
+
function truncate(s, n) {
|
|
19
|
+
if (s.length <= n)
|
|
20
|
+
return s;
|
|
21
|
+
return s.slice(0, n - 1) + "…";
|
|
22
|
+
}
|
|
23
|
+
function box(width, ...lines) {
|
|
24
|
+
const top = `${DIM}┌${"─".repeat(width - 2)}┐${RESET}\n`;
|
|
25
|
+
const bottom = `${DIM}└${"─".repeat(width - 2)}┘${RESET}`;
|
|
26
|
+
let body = "";
|
|
27
|
+
for (const line of lines) {
|
|
28
|
+
body += `${DIM}│${RESET}${padRight(line, width - 2)}${DIM}│${RESET}\n`;
|
|
29
|
+
}
|
|
30
|
+
return top + body + bottom;
|
|
31
|
+
}
|
|
32
|
+
function workerStatusColor(status) {
|
|
33
|
+
if (status === "idle")
|
|
34
|
+
return GREEN;
|
|
35
|
+
if (status === "busy")
|
|
36
|
+
return YELLOW;
|
|
37
|
+
return DIM;
|
|
38
|
+
}
|
|
39
|
+
export class LeaderTui {
|
|
40
|
+
render(state) {
|
|
41
|
+
const cols = process.stdout.columns || 120;
|
|
42
|
+
const rows = process.stdout.rows || 30;
|
|
43
|
+
const halfW = Math.floor((cols - 4) / 2);
|
|
44
|
+
let out = CLEAR + HIDE_CURSOR;
|
|
45
|
+
// ── Team Panel (top) ──
|
|
46
|
+
const teamWidth = cols - 2;
|
|
47
|
+
const teamLines = [];
|
|
48
|
+
teamLines.push(` ${BOLD}TEAM${RESET}`);
|
|
49
|
+
teamLines.push(` ${DIM}${"─".repeat(teamWidth - 4)}${RESET}`);
|
|
50
|
+
if (state.workers.length === 0) {
|
|
51
|
+
teamLines.push(` ${DIM}No workers online${RESET}`);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const header = `${BOLD}${padRight("Name", 16)}${padRight("Role", 14)}${padRight("Status", 10)}Current Task${RESET}`;
|
|
55
|
+
teamLines.push(` ${header}`);
|
|
56
|
+
for (const w of state.workers.slice(0, 8)) {
|
|
57
|
+
const statusColored = `${workerStatusColor(w.status)}${padRight(w.status, 9)}${RESET}`;
|
|
58
|
+
const line = ` ${padRight(truncate(w.name, 15), 16)}${padRight(w.role, 14)}${statusColored}${truncate(w.currentTaskId ?? "-", teamWidth - 44)}`;
|
|
59
|
+
teamLines.push(line);
|
|
60
|
+
}
|
|
61
|
+
if (state.workers.length > 8) {
|
|
62
|
+
teamLines.push(` ${DIM}... and ${state.workers.length - 8} more${RESET}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const teamBoxH = teamLines.length + 2;
|
|
66
|
+
out += box(teamWidth, ...teamLines);
|
|
67
|
+
// ── Task Panels (middle, side by side) ──
|
|
68
|
+
// Left: Pending
|
|
69
|
+
const pendLines = [];
|
|
70
|
+
pendLines.push(` ${BOLD}PENDING${RESET}`);
|
|
71
|
+
pendLines.push(` ${DIM}${"─".repeat(halfW - 4)}${RESET}`);
|
|
72
|
+
const pendTasks = state.pendingTasks.slice(0, 10);
|
|
73
|
+
if (pendTasks.length === 0) {
|
|
74
|
+
pendLines.push(` ${DIM}No pending tasks${RESET}`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
for (const t of pendTasks) {
|
|
78
|
+
const title = truncate(t.title ?? "", halfW - 10);
|
|
79
|
+
const prio = t.priority === 0 ? `${RED}HIGH${RESET}` :
|
|
80
|
+
t.priority === 1 ? `${YELLOW}MED${RESET}` : `${DIM}LOW${RESET}`;
|
|
81
|
+
pendLines.push(` ${prio} ${title}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Right: In Progress
|
|
85
|
+
const progLines = [];
|
|
86
|
+
progLines.push(` ${BOLD}IN PROGRESS${RESET}`);
|
|
87
|
+
progLines.push(` ${DIM}${"─".repeat(halfW - 4)}${RESET}`);
|
|
88
|
+
const progTasks = state.claimedTasks.slice(0, 10);
|
|
89
|
+
if (progTasks.length === 0) {
|
|
90
|
+
progLines.push(` ${DIM}No tasks in progress${RESET}`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
for (const t of progTasks) {
|
|
94
|
+
const title = truncate(t.title ?? "", halfW - 10);
|
|
95
|
+
const who = truncate(t.claimed_by?.slice(0, 8) ?? "?", 8);
|
|
96
|
+
progLines.push(` ${BLUE}${who}${RESET} ${title}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Pad both to same height
|
|
100
|
+
const taskH = Math.max(pendLines.length, progLines.length) + 2;
|
|
101
|
+
while (pendLines.length < taskH - 2)
|
|
102
|
+
pendLines.push("");
|
|
103
|
+
while (progLines.length < taskH - 2)
|
|
104
|
+
progLines.push("");
|
|
105
|
+
const leftBox = box(halfW, ...pendLines).split("\n");
|
|
106
|
+
const rightBox = box(halfW, ...progLines).split("\n");
|
|
107
|
+
for (let i = 0; i < leftBox.length; i++) {
|
|
108
|
+
out += leftBox[i] + " " + rightBox[i] + "\n";
|
|
109
|
+
}
|
|
110
|
+
// ── Event Log (bottom) ──
|
|
111
|
+
const remainingH = rows - teamBoxH - (taskH + 2) - 3;
|
|
112
|
+
const logH = Math.max(remainingH, 5);
|
|
113
|
+
const logLines = [];
|
|
114
|
+
logLines.push(` ${BOLD}EVENT LOG${RESET}`);
|
|
115
|
+
logLines.push(` ${DIM}${"─".repeat(cols - 4)}${RESET}`);
|
|
116
|
+
const events = state.events.slice(-(logH - 3));
|
|
117
|
+
for (const e of events) {
|
|
118
|
+
logLines.push(` ${DIM}${e.timestamp}${RESET} ${e.message}`);
|
|
119
|
+
}
|
|
120
|
+
while (logLines.length < logH - 1)
|
|
121
|
+
logLines.push("");
|
|
122
|
+
out += box(cols - 2, ...logLines);
|
|
123
|
+
// ── Footer ──
|
|
124
|
+
const idShort = state.leaderInstanceId.slice(0, 8);
|
|
125
|
+
const footer = `${DIM}Leader: ${state.leaderName} | Instance: ${idShort} | CACHE_DIR: ${state.cacheDir} | Press Ctrl+C to stop${RESET}`;
|
|
126
|
+
out += `\n${footer}`;
|
|
127
|
+
process.stdout.write(out);
|
|
128
|
+
}
|
|
129
|
+
destroy() {
|
|
130
|
+
process.stdout.write(SHOW_CURSOR + CLEAR);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/leader/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ZkClient } from "../zk/client.js";
|
|
2
|
+
import { LeaderEventBus } from "./event-bus.js";
|
|
3
|
+
export declare class LeaderWatcher {
|
|
4
|
+
private zk;
|
|
5
|
+
private eventBus;
|
|
6
|
+
private leaderInstanceId;
|
|
7
|
+
private command;
|
|
8
|
+
private cacheDir;
|
|
9
|
+
private inFlight;
|
|
10
|
+
private stopped;
|
|
11
|
+
constructor(zk: ZkClient, eventBus: LeaderEventBus, leaderInstanceId: string, command: string, cacheDir: string);
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
private watchLoop;
|
|
14
|
+
private processMessage;
|
|
15
|
+
stop(): void;
|
|
16
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import * as paths from "../zk/paths.js";
|
|
3
|
+
import { MessageSchema } from "../models/schemas.js";
|
|
4
|
+
import { execWithTee } from "../utils/exec.js";
|
|
5
|
+
import { expandHomeDir } from "../config.js";
|
|
6
|
+
export class LeaderWatcher {
|
|
7
|
+
zk;
|
|
8
|
+
eventBus;
|
|
9
|
+
leaderInstanceId;
|
|
10
|
+
command;
|
|
11
|
+
cacheDir;
|
|
12
|
+
inFlight = new Set();
|
|
13
|
+
stopped = false;
|
|
14
|
+
constructor(zk, eventBus, leaderInstanceId, command, cacheDir) {
|
|
15
|
+
this.zk = zk;
|
|
16
|
+
this.eventBus = eventBus;
|
|
17
|
+
this.leaderInstanceId = leaderInstanceId;
|
|
18
|
+
this.command = command;
|
|
19
|
+
this.cacheDir = cacheDir;
|
|
20
|
+
}
|
|
21
|
+
async start() {
|
|
22
|
+
await this.zk.mkdirp(paths.messageDirPath(this.leaderInstanceId));
|
|
23
|
+
this.watchLoop();
|
|
24
|
+
}
|
|
25
|
+
async watchLoop() {
|
|
26
|
+
if (this.stopped)
|
|
27
|
+
return;
|
|
28
|
+
try {
|
|
29
|
+
const children = await this.zk.watchMessageDir(this.leaderInstanceId, (newChildren) => {
|
|
30
|
+
for (const cid of newChildren)
|
|
31
|
+
this.processMessage(cid);
|
|
32
|
+
this.watchLoop();
|
|
33
|
+
});
|
|
34
|
+
for (const cid of children)
|
|
35
|
+
await this.processMessage(cid);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
if (!this.stopped)
|
|
39
|
+
setTimeout(() => this.watchLoop(), 1000);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async processMessage(msgId) {
|
|
43
|
+
if (this.inFlight.has(msgId) || this.stopped)
|
|
44
|
+
return;
|
|
45
|
+
const data = await this.zk.getMessage(this.leaderInstanceId, msgId);
|
|
46
|
+
if (!data)
|
|
47
|
+
return;
|
|
48
|
+
const msg = MessageSchema.parse({ ...data, id: msgId });
|
|
49
|
+
if (msg.read)
|
|
50
|
+
return;
|
|
51
|
+
this.inFlight.add(msgId);
|
|
52
|
+
const fromLabel = msg.from_name || msg.from_instance?.slice(0, 8) || "unknown";
|
|
53
|
+
const uniqueKey = `msg-${msgId}-${Date.now().toString(36)}`;
|
|
54
|
+
this.eventBus.emit({
|
|
55
|
+
type: "message_received",
|
|
56
|
+
from: fromLabel,
|
|
57
|
+
content: msg.content,
|
|
58
|
+
msgId,
|
|
59
|
+
});
|
|
60
|
+
const resolvedCacheDir = expandHomeDir(this.cacheDir);
|
|
61
|
+
const logPath = path.join(resolvedCacheDir, this.leaderInstanceId, `${uniqueKey}.log`);
|
|
62
|
+
await execWithTee(this.command, msg.content, logPath);
|
|
63
|
+
try {
|
|
64
|
+
msg.read = true;
|
|
65
|
+
await this.zk.updateMessage(this.leaderInstanceId, msgId, msg);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// best effort
|
|
69
|
+
}
|
|
70
|
+
this.inFlight.delete(msgId);
|
|
71
|
+
this.eventBus.emit({ type: "message_processed", msgId, logPath });
|
|
72
|
+
}
|
|
73
|
+
stop() {
|
|
74
|
+
this.stopped = true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/leader/watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/models/schemas.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
export declare const InstanceStatus: z.ZodEnum<["idle", "busy"
|
|
2
|
+
export declare const InstanceStatus: z.ZodEnum<["idle", "busy"]>;
|
|
3
3
|
export type InstanceStatus = z.infer<typeof InstanceStatus>;
|
|
4
|
-
export declare const InstanceRole: z.ZodEnum<["architect", "developer", "tester", "general"]>;
|
|
4
|
+
export declare const InstanceRole: z.ZodEnum<["architect", "developer", "tester", "general", "leader"]>;
|
|
5
5
|
export type InstanceRole = z.infer<typeof InstanceRole>;
|
|
6
|
-
export declare const TaskStatus: z.ZodEnum<["pending", "claimed", "completed"]>;
|
|
6
|
+
export declare const TaskStatus: z.ZodEnum<["pending", "claimed", "in_progress", "completed", "blocked", "failed"]>;
|
|
7
7
|
export type TaskStatus = z.infer<typeof TaskStatus>;
|
|
8
8
|
export declare const TaskPriority: z.ZodNumber;
|
|
9
9
|
export type TaskPriority = z.infer<typeof TaskPriority>;
|
|
@@ -13,24 +13,27 @@ export type MessageType = z.infer<typeof MessageType>;
|
|
|
13
13
|
export declare const InstanceSchema: z.ZodObject<{
|
|
14
14
|
id: z.ZodString;
|
|
15
15
|
name: z.ZodString;
|
|
16
|
-
role: z.ZodDefault<z.ZodEnum<["architect", "developer", "tester", "general"]>>;
|
|
17
|
-
status: z.ZodDefault<z.ZodEnum<["idle", "busy"
|
|
16
|
+
role: z.ZodDefault<z.ZodEnum<["architect", "developer", "tester", "general", "leader"]>>;
|
|
17
|
+
status: z.ZodDefault<z.ZodEnum<["idle", "busy"]>>;
|
|
18
18
|
current_task_id: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
19
19
|
connected_since: z.ZodString;
|
|
20
|
+
work_dir: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
20
21
|
}, "strip", z.ZodTypeAny, {
|
|
21
|
-
status: "idle" | "busy"
|
|
22
|
+
status: "idle" | "busy";
|
|
22
23
|
id: string;
|
|
23
24
|
name: string;
|
|
24
|
-
role: "architect" | "developer" | "tester" | "general";
|
|
25
|
+
role: "architect" | "developer" | "tester" | "general" | "leader";
|
|
25
26
|
current_task_id: string | null;
|
|
26
27
|
connected_since: string;
|
|
28
|
+
work_dir: string | null;
|
|
27
29
|
}, {
|
|
28
30
|
id: string;
|
|
29
31
|
name: string;
|
|
30
32
|
connected_since: string;
|
|
31
|
-
status?: "idle" | "busy" |
|
|
32
|
-
role?: "architect" | "developer" | "tester" | "general" | undefined;
|
|
33
|
+
status?: "idle" | "busy" | undefined;
|
|
34
|
+
role?: "architect" | "developer" | "tester" | "general" | "leader" | undefined;
|
|
33
35
|
current_task_id?: string | null | undefined;
|
|
36
|
+
work_dir?: string | null | undefined;
|
|
34
37
|
}>;
|
|
35
38
|
export type Instance = z.infer<typeof InstanceSchema>;
|
|
36
39
|
export declare const TaskSchema: z.ZodObject<{
|
|
@@ -38,7 +41,7 @@ export declare const TaskSchema: z.ZodObject<{
|
|
|
38
41
|
title: z.ZodString;
|
|
39
42
|
description: z.ZodDefault<z.ZodString>;
|
|
40
43
|
priority: z.ZodDefault<z.ZodNumber>;
|
|
41
|
-
status: z.ZodDefault<z.ZodEnum<["pending", "claimed", "completed"]>>;
|
|
44
|
+
status: z.ZodDefault<z.ZodEnum<["pending", "claimed", "in_progress", "completed", "blocked", "failed"]>>;
|
|
42
45
|
created_by: z.ZodDefault<z.ZodString>;
|
|
43
46
|
assigned_to: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
44
47
|
created_at: z.ZodString;
|
|
@@ -46,8 +49,15 @@ export declare const TaskSchema: z.ZodObject<{
|
|
|
46
49
|
completed_at: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
47
50
|
claimed_by: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
48
51
|
result: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
52
|
+
retry_count: z.ZodDefault<z.ZodNumber>;
|
|
53
|
+
blocked_reason: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
54
|
+
fail_reason: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
55
|
+
created_by_name: z.ZodDefault<z.ZodString>;
|
|
56
|
+
assigned_to_name: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
57
|
+
completed_by_name: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
58
|
+
duration_seconds: z.ZodDefault<z.ZodNullable<z.ZodNumber>>;
|
|
49
59
|
}, "strip", z.ZodTypeAny, {
|
|
50
|
-
status: "pending" | "claimed" | "completed";
|
|
60
|
+
status: "pending" | "claimed" | "in_progress" | "completed" | "blocked" | "failed";
|
|
51
61
|
id: string;
|
|
52
62
|
title: string;
|
|
53
63
|
description: string;
|
|
@@ -59,10 +69,17 @@ export declare const TaskSchema: z.ZodObject<{
|
|
|
59
69
|
completed_at: string | null;
|
|
60
70
|
claimed_by: string | null;
|
|
61
71
|
result: string | null;
|
|
72
|
+
retry_count: number;
|
|
73
|
+
blocked_reason: string | null;
|
|
74
|
+
fail_reason: string | null;
|
|
75
|
+
created_by_name: string;
|
|
76
|
+
assigned_to_name: string | null;
|
|
77
|
+
completed_by_name: string | null;
|
|
78
|
+
duration_seconds: number | null;
|
|
62
79
|
}, {
|
|
63
80
|
title: string;
|
|
64
81
|
created_at: string;
|
|
65
|
-
status?: "pending" | "claimed" | "completed" | undefined;
|
|
82
|
+
status?: "pending" | "claimed" | "in_progress" | "completed" | "blocked" | "failed" | undefined;
|
|
66
83
|
id?: string | undefined;
|
|
67
84
|
description?: string | undefined;
|
|
68
85
|
priority?: number | undefined;
|
|
@@ -72,6 +89,13 @@ export declare const TaskSchema: z.ZodObject<{
|
|
|
72
89
|
completed_at?: string | null | undefined;
|
|
73
90
|
claimed_by?: string | null | undefined;
|
|
74
91
|
result?: string | null | undefined;
|
|
92
|
+
retry_count?: number | undefined;
|
|
93
|
+
blocked_reason?: string | null | undefined;
|
|
94
|
+
fail_reason?: string | null | undefined;
|
|
95
|
+
created_by_name?: string | undefined;
|
|
96
|
+
assigned_to_name?: string | null | undefined;
|
|
97
|
+
completed_by_name?: string | null | undefined;
|
|
98
|
+
duration_seconds?: number | null | undefined;
|
|
75
99
|
}>;
|
|
76
100
|
export type Task = z.infer<typeof TaskSchema>;
|
|
77
101
|
export declare const MessageSchema: z.ZodObject<{
|
|
@@ -79,19 +103,29 @@ export declare const MessageSchema: z.ZodObject<{
|
|
|
79
103
|
type: z.ZodDefault<z.ZodEnum<["direct", "broadcast", "help"]>>;
|
|
80
104
|
from_instance: z.ZodDefault<z.ZodString>;
|
|
81
105
|
from_name: z.ZodDefault<z.ZodString>;
|
|
106
|
+
from_role: z.ZodDefault<z.ZodString>;
|
|
82
107
|
to_instance: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
108
|
+
to_name: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
83
109
|
content: z.ZodString;
|
|
84
110
|
created_at: z.ZodString;
|
|
85
111
|
read: z.ZodDefault<z.ZodBoolean>;
|
|
112
|
+
task_doc_path: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
113
|
+
result_path: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
114
|
+
reply_to: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
86
115
|
}, "strip", z.ZodTypeAny, {
|
|
87
116
|
type: "direct" | "broadcast" | "help";
|
|
88
117
|
id: string;
|
|
89
118
|
created_at: string;
|
|
90
119
|
from_instance: string;
|
|
91
120
|
from_name: string;
|
|
121
|
+
from_role: string;
|
|
92
122
|
to_instance: string | null;
|
|
123
|
+
to_name: string | null;
|
|
93
124
|
content: string;
|
|
94
125
|
read: boolean;
|
|
126
|
+
task_doc_path: string | null;
|
|
127
|
+
result_path: string | null;
|
|
128
|
+
reply_to: string | null;
|
|
95
129
|
}, {
|
|
96
130
|
created_at: string;
|
|
97
131
|
content: string;
|
|
@@ -99,8 +133,13 @@ export declare const MessageSchema: z.ZodObject<{
|
|
|
99
133
|
id?: string | undefined;
|
|
100
134
|
from_instance?: string | undefined;
|
|
101
135
|
from_name?: string | undefined;
|
|
136
|
+
from_role?: string | undefined;
|
|
102
137
|
to_instance?: string | null | undefined;
|
|
138
|
+
to_name?: string | null | undefined;
|
|
103
139
|
read?: boolean | undefined;
|
|
140
|
+
task_doc_path?: string | null | undefined;
|
|
141
|
+
result_path?: string | null | undefined;
|
|
142
|
+
reply_to?: string | null | undefined;
|
|
104
143
|
}>;
|
|
105
144
|
export type Message = z.infer<typeof MessageSchema>;
|
|
106
145
|
export declare const ContextEntrySchema: z.ZodObject<{
|
|
@@ -124,6 +163,7 @@ export declare function createInstance(overrides: {
|
|
|
124
163
|
id?: string;
|
|
125
164
|
name: string;
|
|
126
165
|
role?: InstanceRole;
|
|
166
|
+
workDir?: string;
|
|
127
167
|
}): Instance;
|
|
128
168
|
export declare function createTask(overrides: {
|
|
129
169
|
title: string;
|
|
@@ -131,13 +171,20 @@ export declare function createTask(overrides: {
|
|
|
131
171
|
priority?: number;
|
|
132
172
|
created_by?: string;
|
|
133
173
|
assigned_to?: string | null;
|
|
174
|
+
created_by_name?: string;
|
|
175
|
+
assigned_to_name?: string | null;
|
|
134
176
|
}): Task;
|
|
135
177
|
export declare function createMessage(overrides: {
|
|
136
178
|
type?: MessageType;
|
|
137
179
|
from_instance: string;
|
|
138
180
|
from_name: string;
|
|
181
|
+
from_role?: string;
|
|
139
182
|
to_instance: string;
|
|
183
|
+
to_name?: string | null;
|
|
140
184
|
content: string;
|
|
185
|
+
task_doc_path?: string | null;
|
|
186
|
+
result_path?: string | null;
|
|
187
|
+
reply_to?: string | null;
|
|
141
188
|
}): Message;
|
|
142
189
|
export declare function createContextEntry(overrides: {
|
|
143
190
|
key: string;
|
|
@@ -146,15 +193,18 @@ export declare function createContextEntry(overrides: {
|
|
|
146
193
|
}): ContextEntry;
|
|
147
194
|
export declare const RegisterInstanceInput: z.ZodObject<{
|
|
148
195
|
name: z.ZodString;
|
|
149
|
-
role: z.ZodDefault<z.ZodEnum<["architect", "developer", "tester", "general"]>>;
|
|
196
|
+
role: z.ZodDefault<z.ZodEnum<["architect", "developer", "tester", "general", "leader"]>>;
|
|
150
197
|
instance_id: z.ZodOptional<z.ZodString>;
|
|
198
|
+
work_dir: z.ZodOptional<z.ZodString>;
|
|
151
199
|
}, "strip", z.ZodTypeAny, {
|
|
152
200
|
name: string;
|
|
153
|
-
role: "architect" | "developer" | "tester" | "general";
|
|
201
|
+
role: "architect" | "developer" | "tester" | "general" | "leader";
|
|
202
|
+
work_dir?: string | undefined;
|
|
154
203
|
instance_id?: string | undefined;
|
|
155
204
|
}, {
|
|
156
205
|
name: string;
|
|
157
|
-
role?: "architect" | "developer" | "tester" | "general" | undefined;
|
|
206
|
+
role?: "architect" | "developer" | "tester" | "general" | "leader" | undefined;
|
|
207
|
+
work_dir?: string | undefined;
|
|
158
208
|
instance_id?: string | undefined;
|
|
159
209
|
}>;
|
|
160
210
|
export declare const HeartbeatInput: z.ZodObject<{
|
package/dist/models/schemas.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
// ── Enums ──
|
|
3
|
-
export const InstanceStatus = z.enum(["idle", "busy"
|
|
4
|
-
export const InstanceRole = z.enum(["architect", "developer", "tester", "general"]);
|
|
5
|
-
export const TaskStatus = z.enum(["pending", "claimed", "completed"]);
|
|
3
|
+
export const InstanceStatus = z.enum(["idle", "busy"]);
|
|
4
|
+
export const InstanceRole = z.enum(["architect", "developer", "tester", "general", "leader"]);
|
|
5
|
+
export const TaskStatus = z.enum(["pending", "claimed", "in_progress", "completed", "blocked", "failed"]);
|
|
6
6
|
export const TaskPriority = z.number().int().min(0).max(2);
|
|
7
7
|
export const TaskPriorityName = {
|
|
8
8
|
0: "HIGH",
|
|
@@ -21,6 +21,7 @@ export const InstanceSchema = z.object({
|
|
|
21
21
|
status: InstanceStatus.default("idle"),
|
|
22
22
|
current_task_id: z.string().nullable().default(null),
|
|
23
23
|
connected_since: z.string(),
|
|
24
|
+
work_dir: z.string().nullable().default(null),
|
|
24
25
|
});
|
|
25
26
|
export const TaskSchema = z.object({
|
|
26
27
|
id: z.string().default(""),
|
|
@@ -35,16 +36,28 @@ export const TaskSchema = z.object({
|
|
|
35
36
|
completed_at: z.string().nullable().default(null),
|
|
36
37
|
claimed_by: z.string().nullable().default(null),
|
|
37
38
|
result: z.string().nullable().default(null),
|
|
39
|
+
retry_count: z.number().int().default(0),
|
|
40
|
+
blocked_reason: z.string().nullable().default(null),
|
|
41
|
+
fail_reason: z.string().nullable().default(null),
|
|
42
|
+
created_by_name: z.string().default(""),
|
|
43
|
+
assigned_to_name: z.string().nullable().default(null),
|
|
44
|
+
completed_by_name: z.string().nullable().default(null),
|
|
45
|
+
duration_seconds: z.number().nullable().default(null),
|
|
38
46
|
});
|
|
39
47
|
export const MessageSchema = z.object({
|
|
40
48
|
id: z.string().default(""),
|
|
41
49
|
type: MessageType.default("direct"),
|
|
42
50
|
from_instance: z.string().default(""),
|
|
43
51
|
from_name: z.string().default(""),
|
|
52
|
+
from_role: z.string().default(""),
|
|
44
53
|
to_instance: z.string().nullable().default(null),
|
|
54
|
+
to_name: z.string().nullable().default(null),
|
|
45
55
|
content: z.string(),
|
|
46
56
|
created_at: z.string(),
|
|
47
57
|
read: z.boolean().default(false),
|
|
58
|
+
task_doc_path: z.string().nullable().default(null),
|
|
59
|
+
result_path: z.string().nullable().default(null),
|
|
60
|
+
reply_to: z.string().nullable().default(null),
|
|
48
61
|
});
|
|
49
62
|
export const ContextEntrySchema = z.object({
|
|
50
63
|
key: z.string(),
|
|
@@ -61,6 +74,7 @@ export function createInstance(overrides) {
|
|
|
61
74
|
status: "idle",
|
|
62
75
|
current_task_id: null,
|
|
63
76
|
connected_since: utcNow(),
|
|
77
|
+
work_dir: overrides.workDir ?? null,
|
|
64
78
|
});
|
|
65
79
|
}
|
|
66
80
|
export function createTask(overrides) {
|
|
@@ -77,6 +91,13 @@ export function createTask(overrides) {
|
|
|
77
91
|
completed_at: null,
|
|
78
92
|
claimed_by: null,
|
|
79
93
|
result: null,
|
|
94
|
+
retry_count: 0,
|
|
95
|
+
blocked_reason: null,
|
|
96
|
+
fail_reason: null,
|
|
97
|
+
created_by_name: overrides.created_by_name ?? "",
|
|
98
|
+
assigned_to_name: overrides.assigned_to_name ?? null,
|
|
99
|
+
completed_by_name: null,
|
|
100
|
+
duration_seconds: null,
|
|
80
101
|
});
|
|
81
102
|
}
|
|
82
103
|
export function createMessage(overrides) {
|
|
@@ -85,10 +106,15 @@ export function createMessage(overrides) {
|
|
|
85
106
|
type: overrides.type ?? "direct",
|
|
86
107
|
from_instance: overrides.from_instance,
|
|
87
108
|
from_name: overrides.from_name,
|
|
109
|
+
from_role: overrides.from_role ?? "",
|
|
88
110
|
to_instance: overrides.to_instance,
|
|
111
|
+
to_name: overrides.to_name ?? null,
|
|
89
112
|
content: overrides.content,
|
|
90
113
|
created_at: utcNow(),
|
|
91
114
|
read: false,
|
|
115
|
+
task_doc_path: overrides.task_doc_path ?? null,
|
|
116
|
+
result_path: overrides.result_path ?? null,
|
|
117
|
+
reply_to: overrides.reply_to ?? null,
|
|
92
118
|
});
|
|
93
119
|
}
|
|
94
120
|
export function createContextEntry(overrides) {
|
|
@@ -104,6 +130,7 @@ export const RegisterInstanceInput = z.object({
|
|
|
104
130
|
name: z.string().min(1),
|
|
105
131
|
role: InstanceRole.default("general"),
|
|
106
132
|
instance_id: z.string().optional(),
|
|
133
|
+
work_dir: z.string().optional(),
|
|
107
134
|
});
|
|
108
135
|
export const HeartbeatInput = z.object({
|
|
109
136
|
instance_id: z.string(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/models/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,cAAc;AAEd,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/models/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,7 @@ export declare class MessageRouter {
|
|
|
8
8
|
waitForMessage(instanceId: string, timeoutSeconds?: number): Promise<Message[]>;
|
|
9
9
|
markRead(instanceId: string, messageId: string): Promise<void>;
|
|
10
10
|
dismissMessage(instanceId: string, messageId: string): Promise<void>;
|
|
11
|
+
sendWithTemplate(fromInstance: string, fromName: string, fromRole: string, content: string, templateName: "leader.md" | "worker.md", variables: Record<string, string>, templateDir: string, toInstance?: string, broadcast?: boolean, toName?: string): Promise<Message[]>;
|
|
11
12
|
requestHelp(fromInstance: string, fromName: string, question: string, ctx?: string): Promise<Message[]>;
|
|
12
13
|
}
|
|
14
|
+
export declare function renderTemplate(templatePath: string, variables: Record<string, string>): Promise<string>;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
1
3
|
import { MessageSchema, createMessage, } from "../models/schemas.js";
|
|
2
4
|
function utcNow() {
|
|
3
5
|
return new Date().toISOString();
|
|
@@ -91,6 +93,14 @@ export class MessageRouter {
|
|
|
91
93
|
async dismissMessage(instanceId, messageId) {
|
|
92
94
|
await this.zk.deleteMessage(instanceId, messageId);
|
|
93
95
|
}
|
|
96
|
+
async sendWithTemplate(fromInstance, fromName, fromRole, content, templateName, variables, templateDir, toInstance, broadcast = false, toName) {
|
|
97
|
+
const templatePath = path.join(templateDir, "agents", templateName);
|
|
98
|
+
const rendered = await renderTemplate(templatePath, {
|
|
99
|
+
...variables,
|
|
100
|
+
content,
|
|
101
|
+
});
|
|
102
|
+
return this.send(fromInstance, fromName, rendered, toInstance, broadcast, toName);
|
|
103
|
+
}
|
|
94
104
|
async requestHelp(fromInstance, fromName, question, ctx) {
|
|
95
105
|
let content = question;
|
|
96
106
|
if (ctx) {
|
|
@@ -106,4 +116,11 @@ export class MessageRouter {
|
|
|
106
116
|
return messages;
|
|
107
117
|
}
|
|
108
118
|
}
|
|
119
|
+
export async function renderTemplate(templatePath, variables) {
|
|
120
|
+
let content = await fs.promises.readFile(templatePath, "utf-8");
|
|
121
|
+
for (const [key, value] of Object.entries(variables)) {
|
|
122
|
+
content = content.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
|
|
123
|
+
}
|
|
124
|
+
return content;
|
|
125
|
+
}
|
|
109
126
|
//# sourceMappingURL=message-router.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/modules/message-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"message-router.js","sourceRoot":"","sources":["../../src/modules/message-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,aAAa,EACb,aAAa,GAGd,MAAM,sBAAsB,CAAC;AAE9B,SAAS,MAAM;IACb,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAEpC,KAAK,CAAC,IAAI,CACR,YAAoB,EACpB,QAAgB,EAChB,OAAe,EACf,UAAmB,EACnB,YAAqB,KAAK,EAC1B,MAAe;QAEf,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,wDAAwD;QACxD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,aAAa,CAAC,CAAC;gBAClD,CAAC;gBACD,UAAU,GAAG,KAAK,CAAC,EAAY,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAgB,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE9D,IAAI,OAAiB,CAAC;QACtB,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YAChD,OAAO,GAAG,SAAS;iBAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAY,CAAC;iBAC1B,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,aAAa,CAAC;gBACxB,IAAI,EAAE,OAAO;gBACb,aAAa,EAAE,YAAY;gBAC3B,SAAS,EAAE,QAAQ;gBACnB,WAAW,EAAE,QAAQ;gBACrB,OAAO;aACR,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CACvC,QAAQ,EACR,GAAyC,CAC1C,CAAC;YACF,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAkB;QAC3B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAc,EAAE,CAAC;QAE/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YAChC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;YAChB,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACd,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;gBAChB,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CACzB,UAAU,EACV,KAAK,EACL,GAAyC,CAC1C,CAAC;YACJ,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,UAAkB,EAClB,iBAAyB,EAAE;QAE3B,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;YAEnE,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;gBAC7C,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAkB,EAAE,SAAiB;QAClD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,2BAA2B,UAAU,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB,EAAE,SAAiB;QACxD,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,YAAoB,EACpB,QAAgB,EAChB,QAAgB,EAChB,OAAe,EACf,YAAuC,EACvC,SAAiC,EACjC,WAAmB,EACnB,UAAmB,EACnB,YAAqB,KAAK,EAC1B,MAAe;QAEf,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE;YAClD,GAAG,SAAS;YACZ,OAAO;SACR,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,WAAW,CACf,YAAoB,EACpB,QAAgB,EAChB,QAAgB,EAChB,GAAY;QAEZ,IAAI,OAAO,GAAG,QAAQ,CAAC;QACvB,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,GAAG,QAAQ,iBAAiB,GAAG,EAAE,CAAC;QAC9C,CAAC;QACD,yDAAyD;QACzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAC9B,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,SAAS,EACT,IAAI,CACL,CAAC;QACF,yCAAyC;QACzC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC;YAClB,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CACzB,GAAG,CAAC,WAAY,EAChB,GAAG,CAAC,EAAE,EACN,GAAyC,CAC1C,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,SAAiC;IAEjC,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAChE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|