sisyphi 0.1.22 → 1.0.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/chunk-KQBSC5KY.js +31 -0
- package/dist/chunk-KQBSC5KY.js.map +1 -0
- package/dist/{chunk-LTAW6OWS.js → chunk-YGBGKMTF.js} +31 -6
- package/dist/chunk-YGBGKMTF.js.map +1 -0
- package/dist/chunk-ZE2SKB4B.js +35 -0
- package/dist/chunk-ZE2SKB4B.js.map +1 -0
- package/dist/cli.js +638 -51
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +900 -280
- package/dist/daemon.js.map +1 -1
- package/dist/paths-FYYSBD27.js +58 -0
- package/dist/paths-FYYSBD27.js.map +1 -0
- package/dist/templates/CLAUDE.md +21 -20
- package/dist/templates/agent-plugin/agents/CLAUDE.md +2 -0
- package/dist/templates/agent-plugin/agents/debug.md +1 -0
- package/dist/templates/agent-plugin/agents/operator.md +1 -2
- package/dist/templates/agent-plugin/agents/plan.md +86 -55
- package/dist/templates/agent-plugin/agents/review-plan.md +1 -0
- package/dist/templates/agent-plugin/agents/spec-draft.md +1 -0
- package/dist/templates/agent-plugin/hooks/hooks.json +19 -1
- package/dist/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/dist/templates/agent-plugin/hooks/require-submit.sh +24 -0
- package/dist/templates/agent-suffix.md +18 -0
- package/dist/templates/dashboard-claude.md +38 -0
- package/dist/templates/orchestrator-base.md +270 -0
- package/dist/templates/orchestrator-impl.md +116 -0
- package/dist/templates/orchestrator-planning.md +131 -0
- package/dist/templates/orchestrator-plugin/hooks/hooks.json +1 -15
- package/dist/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
- package/dist/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
- package/dist/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
- package/dist/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
- package/dist/tui.js +3236 -0
- package/dist/tui.js.map +1 -0
- package/package.json +5 -1
- package/templates/CLAUDE.md +21 -20
- package/templates/agent-plugin/agents/CLAUDE.md +2 -0
- package/templates/agent-plugin/agents/debug.md +1 -0
- package/templates/agent-plugin/agents/operator.md +1 -2
- package/templates/agent-plugin/agents/plan.md +86 -55
- package/templates/agent-plugin/agents/review-plan.md +1 -0
- package/templates/agent-plugin/agents/spec-draft.md +1 -0
- package/templates/agent-plugin/hooks/hooks.json +19 -1
- package/templates/agent-plugin/hooks/intercept-send-message.sh +1 -1
- package/templates/agent-plugin/hooks/require-submit.sh +24 -0
- package/templates/agent-suffix.md +18 -0
- package/templates/dashboard-claude.md +38 -0
- package/templates/orchestrator-base.md +270 -0
- package/templates/orchestrator-impl.md +116 -0
- package/templates/orchestrator-planning.md +131 -0
- package/templates/orchestrator-plugin/hooks/hooks.json +1 -15
- package/templates/orchestrator-plugin/skills/git-management/SKILL.md +1 -1
- package/templates/orchestrator-plugin/skills/orchestration/SKILL.md +4 -16
- package/templates/orchestrator-plugin/skills/orchestration/task-patterns.md +22 -23
- package/templates/orchestrator-plugin/skills/orchestration/workflow-examples.md +11 -11
- package/dist/chunk-LTAW6OWS.js.map +0 -1
- package/dist/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
- package/dist/templates/orchestrator.md +0 -173
- package/templates/orchestrator-plugin/scripts/block-task.sh +0 -11
- package/templates/orchestrator.md +0 -173
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
globalConfigPath,
|
|
4
|
+
projectConfigPath
|
|
5
|
+
} from "./chunk-YGBGKMTF.js";
|
|
6
|
+
|
|
7
|
+
// src/shared/config.ts
|
|
8
|
+
import { readFileSync } from "fs";
|
|
9
|
+
var DEFAULT_CONFIG = {
|
|
10
|
+
pollIntervalMs: 5e3,
|
|
11
|
+
orchestratorEffort: "high",
|
|
12
|
+
agentEffort: "medium"
|
|
13
|
+
};
|
|
14
|
+
function readJsonFile(filePath) {
|
|
15
|
+
try {
|
|
16
|
+
const content = readFileSync(filePath, "utf-8");
|
|
17
|
+
return JSON.parse(content);
|
|
18
|
+
} catch {
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function loadConfig(cwd) {
|
|
23
|
+
const global = readJsonFile(globalConfigPath());
|
|
24
|
+
const project = readJsonFile(projectConfigPath(cwd));
|
|
25
|
+
return { ...DEFAULT_CONFIG, ...global, ...project };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export {
|
|
29
|
+
loadConfig
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=chunk-KQBSC5KY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/config.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { globalConfigPath, projectConfigPath } from './paths.js';\n\nexport interface WorktreeConfig {\n copy?: string[];\n clone?: string[];\n symlink?: string[];\n init?: string;\n}\n\nexport type EffortLevel = 'low' | 'medium' | 'high' | 'max';\n\nexport interface Config {\n model?: string;\n tmuxSession?: string;\n orchestratorPrompt?: string;\n pollIntervalMs?: number;\n autoUpdate?: boolean;\n orchestratorEffort?: EffortLevel;\n agentEffort?: EffortLevel;\n editor?: string;\n}\n\nconst DEFAULT_CONFIG: Config = {\n pollIntervalMs: 5000,\n orchestratorEffort: 'high',\n agentEffort: 'medium',\n};\n\nfunction readJsonFile(filePath: string): Partial<Config> {\n try {\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as Partial<Config>;\n } catch {\n return {};\n }\n}\n\nexport function loadConfig(cwd: string): Config {\n const global = readJsonFile(globalConfigPath());\n const project = readJsonFile(projectConfigPath(cwd));\n return { ...DEFAULT_CONFIG, ...global, ...project };\n}\n"],"mappings":";;;;;;;AAAA,SAAS,oBAAoB;AAuB7B,IAAM,iBAAyB;AAAA,EAC7B,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,aAAa;AACf;AAEA,SAAS,aAAa,UAAmC;AACvD,MAAI;AACF,UAAM,UAAU,aAAa,UAAU,OAAO;AAC9C,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,WAAW,KAAqB;AAC9C,QAAM,SAAS,aAAa,iBAAiB,CAAC;AAC9C,QAAM,UAAU,aAAa,kBAAkB,GAAG,CAAC;AACnD,SAAO,EAAE,GAAG,gBAAgB,GAAG,QAAQ,GAAG,QAAQ;AACpD;","names":[]}
|
|
@@ -45,18 +45,36 @@ function reportsDir(cwd, sessionId) {
|
|
|
45
45
|
function reportFilePath(cwd, sessionId, agentId, suffix) {
|
|
46
46
|
return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);
|
|
47
47
|
}
|
|
48
|
+
function messagesDir(cwd, sessionId) {
|
|
49
|
+
return join(sessionDir(cwd, sessionId), "messages");
|
|
50
|
+
}
|
|
48
51
|
function promptsDir(cwd, sessionId) {
|
|
49
52
|
return join(sessionDir(cwd, sessionId), "prompts");
|
|
50
53
|
}
|
|
51
54
|
function contextDir(cwd, sessionId) {
|
|
52
55
|
return join(sessionDir(cwd, sessionId), "context");
|
|
53
56
|
}
|
|
54
|
-
function
|
|
55
|
-
return join(sessionDir(cwd, sessionId), "
|
|
57
|
+
function roadmapPath(cwd, sessionId) {
|
|
58
|
+
return join(sessionDir(cwd, sessionId), "roadmap.md");
|
|
59
|
+
}
|
|
60
|
+
function goalPath(cwd, sessionId) {
|
|
61
|
+
return join(sessionDir(cwd, sessionId), "goal.md");
|
|
62
|
+
}
|
|
63
|
+
function logsDir(cwd, sessionId) {
|
|
64
|
+
return join(sessionDir(cwd, sessionId), "logs");
|
|
56
65
|
}
|
|
57
|
-
function
|
|
66
|
+
function cycleLogPath(cwd, sessionId, cycle) {
|
|
67
|
+
return join(logsDir(cwd, sessionId), `cycle-${String(cycle).padStart(3, "0")}.md`);
|
|
68
|
+
}
|
|
69
|
+
function legacyLogsPath(cwd, sessionId) {
|
|
58
70
|
return join(sessionDir(cwd, sessionId), "logs.md");
|
|
59
71
|
}
|
|
72
|
+
function snapshotsDir(cwd, sessionId) {
|
|
73
|
+
return join(sessionDir(cwd, sessionId), "snapshots");
|
|
74
|
+
}
|
|
75
|
+
function snapshotDir(cwd, sessionId, cycle) {
|
|
76
|
+
return join(snapshotsDir(cwd, sessionId), `cycle-${cycle}`);
|
|
77
|
+
}
|
|
60
78
|
function worktreeConfigPath(cwd) {
|
|
61
79
|
return join(projectDir(cwd), "worktree.json");
|
|
62
80
|
}
|
|
@@ -71,6 +89,7 @@ export {
|
|
|
71
89
|
daemonLogPath,
|
|
72
90
|
daemonPidPath,
|
|
73
91
|
daemonUpdatingPath,
|
|
92
|
+
projectDir,
|
|
74
93
|
projectConfigPath,
|
|
75
94
|
projectOrchestratorPromptPath,
|
|
76
95
|
sessionsDir,
|
|
@@ -78,11 +97,17 @@ export {
|
|
|
78
97
|
statePath,
|
|
79
98
|
reportsDir,
|
|
80
99
|
reportFilePath,
|
|
100
|
+
messagesDir,
|
|
81
101
|
promptsDir,
|
|
82
102
|
contextDir,
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
roadmapPath,
|
|
104
|
+
goalPath,
|
|
105
|
+
logsDir,
|
|
106
|
+
cycleLogPath,
|
|
107
|
+
legacyLogsPath,
|
|
108
|
+
snapshotsDir,
|
|
109
|
+
snapshotDir,
|
|
85
110
|
worktreeConfigPath,
|
|
86
111
|
worktreeBaseDir
|
|
87
112
|
};
|
|
88
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-YGBGKMTF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/paths.ts"],"sourcesContent":["import { homedir } from 'node:os';\nimport { basename, join } from 'node:path';\n\nexport function globalDir(): string {\n return join(homedir(), '.sisyphus');\n}\n\nexport function socketPath(): string {\n return join(globalDir(), 'daemon.sock');\n}\n\nexport function globalConfigPath(): string {\n return join(globalDir(), 'config.json');\n}\n\nexport function daemonLogPath(): string {\n return join(globalDir(), 'daemon.log');\n}\n\nexport function daemonPidPath(): string {\n return join(globalDir(), 'daemon.pid');\n}\n\nexport function daemonUpdatingPath(): string {\n return join(globalDir(), 'updating');\n}\n\nexport function projectDir(cwd: string): string {\n return join(cwd, '.sisyphus');\n}\n\nexport function projectConfigPath(cwd: string): string {\n return join(projectDir(cwd), 'config.json');\n}\n\nexport function projectOrchestratorPromptPath(cwd: string): string {\n return join(projectDir(cwd), 'orchestrator.md');\n}\n\nexport function sessionsDir(cwd: string): string {\n return join(projectDir(cwd), 'sessions');\n}\n\nexport function sessionDir(cwd: string, sessionId: string): string {\n return join(sessionsDir(cwd), sessionId);\n}\n\nexport function statePath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'state.json');\n}\n\nexport function reportsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'reports');\n}\n\nexport function reportFilePath(cwd: string, sessionId: string, agentId: string, suffix: string): string {\n return join(reportsDir(cwd, sessionId), `${agentId}-${suffix}.md`);\n}\n\nexport function messagesDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'messages');\n}\n\nexport function promptsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'prompts');\n}\n\nexport function contextDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'context');\n}\n\nexport function roadmapPath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'roadmap.md');\n}\n\nexport function goalPath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'goal.md');\n}\n\nexport function logsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'logs');\n}\n\nexport function cycleLogPath(cwd: string, sessionId: string, cycle: number): string {\n return join(logsDir(cwd, sessionId), `cycle-${String(cycle).padStart(3, '0')}.md`);\n}\n\n// Backwards compat for old sessions\nexport function legacyLogsPath(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'logs.md');\n}\n\nexport function snapshotsDir(cwd: string, sessionId: string): string {\n return join(sessionDir(cwd, sessionId), 'snapshots');\n}\n\nexport function snapshotDir(cwd: string, sessionId: string, cycle: number): string {\n return join(snapshotsDir(cwd, sessionId), `cycle-${cycle}`);\n}\n\nexport function worktreeConfigPath(cwd: string): string {\n return join(projectDir(cwd), 'worktree.json');\n}\n\nexport function worktreeBaseDir(cwd: string): string {\n return join(cwd, '..', `${basename(cwd)}-sisyphus-wt`);\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;AACxB,SAAS,UAAU,YAAY;AAExB,SAAS,YAAoB;AAClC,SAAO,KAAK,QAAQ,GAAG,WAAW;AACpC;AAEO,SAAS,aAAqB;AACnC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAEO,SAAS,mBAA2B;AACzC,SAAO,KAAK,UAAU,GAAG,aAAa;AACxC;AAEO,SAAS,gBAAwB;AACtC,SAAO,KAAK,UAAU,GAAG,YAAY;AACvC;AAEO,SAAS,gBAAwB;AACtC,SAAO,KAAK,UAAU,GAAG,YAAY;AACvC;AAEO,SAAS,qBAA6B;AAC3C,SAAO,KAAK,UAAU,GAAG,UAAU;AACrC;AAEO,SAAS,WAAW,KAAqB;AAC9C,SAAO,KAAK,KAAK,WAAW;AAC9B;AAEO,SAAS,kBAAkB,KAAqB;AACrD,SAAO,KAAK,WAAW,GAAG,GAAG,aAAa;AAC5C;AAEO,SAAS,8BAA8B,KAAqB;AACjE,SAAO,KAAK,WAAW,GAAG,GAAG,iBAAiB;AAChD;AAEO,SAAS,YAAY,KAAqB;AAC/C,SAAO,KAAK,WAAW,GAAG,GAAG,UAAU;AACzC;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,YAAY,GAAG,GAAG,SAAS;AACzC;AAEO,SAAS,UAAU,KAAa,WAA2B;AAChE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,YAAY;AACtD;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,eAAe,KAAa,WAAmB,SAAiB,QAAwB;AACtG,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,GAAG,OAAO,IAAI,MAAM,KAAK;AACnE;AAEO,SAAS,YAAY,KAAa,WAA2B;AAClE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,UAAU;AACpD;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,WAAW,KAAa,WAA2B;AACjE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,YAAY,KAAa,WAA2B;AAClE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,YAAY;AACtD;AAEO,SAAS,SAAS,KAAa,WAA2B;AAC/D,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,QAAQ,KAAa,WAA2B;AAC9D,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,MAAM;AAChD;AAEO,SAAS,aAAa,KAAa,WAAmB,OAAuB;AAClF,SAAO,KAAK,QAAQ,KAAK,SAAS,GAAG,SAAS,OAAO,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,KAAK;AACnF;AAGO,SAAS,eAAe,KAAa,WAA2B;AACrE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,SAAS;AACnD;AAEO,SAAS,aAAa,KAAa,WAA2B;AACnE,SAAO,KAAK,WAAW,KAAK,SAAS,GAAG,WAAW;AACrD;AAEO,SAAS,YAAY,KAAa,WAAmB,OAAuB;AACjF,SAAO,KAAK,aAAa,KAAK,SAAS,GAAG,SAAS,KAAK,EAAE;AAC5D;AAEO,SAAS,mBAAmB,KAAqB;AACtD,SAAO,KAAK,WAAW,GAAG,GAAG,eAAe;AAC9C;AAEO,SAAS,gBAAgB,KAAqB;AACnD,SAAO,KAAK,KAAK,MAAM,GAAG,SAAS,GAAG,CAAC,cAAc;AACvD;","names":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/shared/utils.ts
|
|
4
|
+
function computeActiveTimeMs(session) {
|
|
5
|
+
const now = Date.now();
|
|
6
|
+
const intervals = [];
|
|
7
|
+
for (const cycle of session.orchestratorCycles) {
|
|
8
|
+
const start = new Date(cycle.timestamp).getTime();
|
|
9
|
+
const end = cycle.completedAt ? new Date(cycle.completedAt).getTime() : now;
|
|
10
|
+
if (end > start) intervals.push([start, end]);
|
|
11
|
+
}
|
|
12
|
+
for (const agent of session.agents) {
|
|
13
|
+
const start = new Date(agent.spawnedAt).getTime();
|
|
14
|
+
const end = agent.completedAt ? new Date(agent.completedAt).getTime() : now;
|
|
15
|
+
if (end > start) intervals.push([start, end]);
|
|
16
|
+
}
|
|
17
|
+
if (intervals.length === 0) return 0;
|
|
18
|
+
intervals.sort((a, b) => a[0] - b[0]);
|
|
19
|
+
const merged = [intervals[0]];
|
|
20
|
+
for (let i = 1; i < intervals.length; i++) {
|
|
21
|
+
const last = merged[merged.length - 1];
|
|
22
|
+
const cur = intervals[i];
|
|
23
|
+
if (cur[0] <= last[1]) {
|
|
24
|
+
last[1] = Math.max(last[1], cur[1]);
|
|
25
|
+
} else {
|
|
26
|
+
merged.push(cur);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return merged.reduce((sum, [start, end]) => sum + (end - start), 0);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export {
|
|
33
|
+
computeActiveTimeMs
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=chunk-ZE2SKB4B.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/utils.ts"],"sourcesContent":["import type { Session } from './types.js';\n\n/**\n * Compute the total wall-clock milliseconds during which at least one\n * orchestrator cycle or agent was running. Merges overlapping intervals\n * so parallel agents aren't double-counted.\n */\nexport function computeActiveTimeMs(session: Session): number {\n const now = Date.now();\n const intervals: Array<[number, number]> = [];\n\n for (const cycle of session.orchestratorCycles) {\n const start = new Date(cycle.timestamp).getTime();\n const end = cycle.completedAt ? new Date(cycle.completedAt).getTime() : now;\n if (end > start) intervals.push([start, end]);\n }\n\n for (const agent of session.agents) {\n const start = new Date(agent.spawnedAt).getTime();\n const end = agent.completedAt ? new Date(agent.completedAt).getTime() : now;\n if (end > start) intervals.push([start, end]);\n }\n\n if (intervals.length === 0) return 0;\n\n intervals.sort((a, b) => a[0] - b[0]);\n\n const merged: Array<[number, number]> = [intervals[0]!];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1]!;\n const cur = intervals[i]!;\n if (cur[0] <= last[1]) {\n last[1] = Math.max(last[1], cur[1]);\n } else {\n merged.push(cur);\n }\n }\n\n return merged.reduce((sum, [start, end]) => sum + (end - start), 0);\n}\n"],"mappings":";;;AAOO,SAAS,oBAAoB,SAA0B;AAC5D,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,YAAqC,CAAC;AAE5C,aAAW,SAAS,QAAQ,oBAAoB;AAC9C,UAAM,QAAQ,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AAChD,UAAM,MAAM,MAAM,cAAc,IAAI,KAAK,MAAM,WAAW,EAAE,QAAQ,IAAI;AACxE,QAAI,MAAM,MAAO,WAAU,KAAK,CAAC,OAAO,GAAG,CAAC;AAAA,EAC9C;AAEA,aAAW,SAAS,QAAQ,QAAQ;AAClC,UAAM,QAAQ,IAAI,KAAK,MAAM,SAAS,EAAE,QAAQ;AAChD,UAAM,MAAM,MAAM,cAAc,IAAI,KAAK,MAAM,WAAW,EAAE,QAAQ,IAAI;AACxE,QAAI,MAAM,MAAO,WAAU,KAAK,CAAC,OAAO,GAAG,CAAC;AAAA,EAC9C;AAEA,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAEpC,QAAM,SAAkC,CAAC,UAAU,CAAC,CAAE;AACtD,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,UAAM,MAAM,UAAU,CAAC;AACvB,QAAI,IAAI,CAAC,KAAK,KAAK,CAAC,GAAG;AACrB,WAAK,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,IACpC,OAAO;AACL,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,OAAO,MAAM,QAAQ,CAAC;AACpE;","names":[]}
|