brainrot-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +372 -0
- package/dist/AchievementNotification.d.ts +28 -0
- package/dist/AchievementNotification.d.ts.map +1 -0
- package/dist/AchievementNotification.js +74 -0
- package/dist/AchievementNotification.js.map +1 -0
- package/dist/GameSelector.d.ts +25 -0
- package/dist/GameSelector.d.ts.map +1 -0
- package/dist/GameSelector.js +105 -0
- package/dist/GameSelector.js.map +1 -0
- package/dist/HelpOverlay.d.ts +15 -0
- package/dist/HelpOverlay.d.ts.map +1 -0
- package/dist/HelpOverlay.js +134 -0
- package/dist/HelpOverlay.js.map +1 -0
- package/dist/Layout.d.ts +49 -0
- package/dist/Layout.d.ts.map +1 -0
- package/dist/Layout.js +83 -0
- package/dist/Layout.js.map +1 -0
- package/dist/Leaderboard.d.ts +46 -0
- package/dist/Leaderboard.d.ts.map +1 -0
- package/dist/Leaderboard.js +68 -0
- package/dist/Leaderboard.js.map +1 -0
- package/dist/LogViewer.d.ts +33 -0
- package/dist/LogViewer.d.ts.map +1 -0
- package/dist/LogViewer.js +179 -0
- package/dist/LogViewer.js.map +1 -0
- package/dist/LoopAlertOverlay.d.ts +15 -0
- package/dist/LoopAlertOverlay.d.ts.map +1 -0
- package/dist/LoopAlertOverlay.js +17 -0
- package/dist/LoopAlertOverlay.js.map +1 -0
- package/dist/LoopManagementPanel.d.ts +44 -0
- package/dist/LoopManagementPanel.d.ts.map +1 -0
- package/dist/LoopManagementPanel.js +220 -0
- package/dist/LoopManagementPanel.js.map +1 -0
- package/dist/SettingsMenu.d.ts +22 -0
- package/dist/SettingsMenu.d.ts.map +1 -0
- package/dist/SettingsMenu.js +367 -0
- package/dist/SettingsMenu.js.map +1 -0
- package/dist/SplitPane.d.ts +63 -0
- package/dist/SplitPane.d.ts.map +1 -0
- package/dist/SplitPane.js +104 -0
- package/dist/SplitPane.js.map +1 -0
- package/dist/StatsMenu.d.ts +15 -0
- package/dist/StatsMenu.d.ts.map +1 -0
- package/dist/StatsMenu.js +230 -0
- package/dist/StatsMenu.js.map +1 -0
- package/dist/StatusBar.d.ts +58 -0
- package/dist/StatusBar.d.ts.map +1 -0
- package/dist/StatusBar.js +106 -0
- package/dist/StatusBar.js.map +1 -0
- package/dist/__tests__/ralph-loop-parser.test.d.ts +2 -0
- package/dist/__tests__/ralph-loop-parser.test.d.ts.map +1 -0
- package/dist/__tests__/ralph-loop-parser.test.js +143 -0
- package/dist/__tests__/ralph-loop-parser.test.js.map +1 -0
- package/dist/claude-code-process.d.ts +76 -0
- package/dist/claude-code-process.d.ts.map +1 -0
- package/dist/claude-code-process.js +221 -0
- package/dist/claude-code-process.js.map +1 -0
- package/dist/cli.d.ts +42 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +265 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +206 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +270 -0
- package/dist/config.js.map +1 -0
- package/dist/game-types.d.ts +177 -0
- package/dist/game-types.d.ts.map +1 -0
- package/dist/game-types.js +55 -0
- package/dist/game-types.js.map +1 -0
- package/dist/games/MinesweeperGame.d.ts +15 -0
- package/dist/games/MinesweeperGame.d.ts.map +1 -0
- package/dist/games/MinesweeperGame.js +555 -0
- package/dist/games/MinesweeperGame.js.map +1 -0
- package/dist/games/PongGame.d.ts +15 -0
- package/dist/games/PongGame.d.ts.map +1 -0
- package/dist/games/PongGame.js +379 -0
- package/dist/games/PongGame.js.map +1 -0
- package/dist/games/SnakeGame.d.ts +15 -0
- package/dist/games/SnakeGame.d.ts.map +1 -0
- package/dist/games/SnakeGame.js +333 -0
- package/dist/games/SnakeGame.js.map +1 -0
- package/dist/games/TetrisGame.d.ts +15 -0
- package/dist/games/TetrisGame.d.ts.map +1 -0
- package/dist/games/TetrisGame.js +654 -0
- package/dist/games/TetrisGame.js.map +1 -0
- package/dist/games/index.d.ts +23 -0
- package/dist/games/index.d.ts.map +1 -0
- package/dist/games/index.js +47 -0
- package/dist/games/index.js.map +1 -0
- package/dist/high-scores.d.ts +57 -0
- package/dist/high-scores.d.ts.map +1 -0
- package/dist/high-scores.js +230 -0
- package/dist/high-scores.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +264 -0
- package/dist/index.js.map +1 -0
- package/dist/ralph-loop-parser.d.ts +58 -0
- package/dist/ralph-loop-parser.d.ts.map +1 -0
- package/dist/ralph-loop-parser.js +315 -0
- package/dist/ralph-loop-parser.js.map +1 -0
- package/dist/stats.d.ts +142 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +521 -0
- package/dist/stats.js.map +1 -0
- package/dist/styled-components.d.ts +231 -0
- package/dist/styled-components.d.ts.map +1 -0
- package/dist/styled-components.js +192 -0
- package/dist/styled-components.js.map +1 -0
- package/dist/theme.d.ts +301 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +372 -0
- package/dist/theme.js.map +1 -0
- package/dist/themes.d.ts +117 -0
- package/dist/themes.d.ts.map +1 -0
- package/dist/themes.js +296 -0
- package/dist/themes.js.map +1 -0
- package/dist/ui/index.d.ts +13 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +29 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/use-claude-code.d.ts +30 -0
- package/dist/use-claude-code.d.ts.map +1 -0
- package/dist/use-claude-code.js +84 -0
- package/dist/use-claude-code.js.map +1 -0
- package/dist/use-config.d.ts +58 -0
- package/dist/use-config.d.ts.map +1 -0
- package/dist/use-config.js +113 -0
- package/dist/use-config.js.map +1 -0
- package/dist/use-game-loop.d.ts +47 -0
- package/dist/use-game-loop.d.ts.map +1 -0
- package/dist/use-game-loop.js +136 -0
- package/dist/use-game-loop.js.map +1 -0
- package/dist/use-high-scores.d.ts +41 -0
- package/dist/use-high-scores.d.ts.map +1 -0
- package/dist/use-high-scores.js +94 -0
- package/dist/use-high-scores.js.map +1 -0
- package/dist/use-layout-state.d.ts +77 -0
- package/dist/use-layout-state.d.ts.map +1 -0
- package/dist/use-layout-state.js +160 -0
- package/dist/use-layout-state.js.map +1 -0
- package/dist/use-ralph-loop.d.ts +41 -0
- package/dist/use-ralph-loop.d.ts.map +1 -0
- package/dist/use-ralph-loop.js +106 -0
- package/dist/use-ralph-loop.js.map +1 -0
- package/dist/use-spinner.d.ts +46 -0
- package/dist/use-spinner.d.ts.map +1 -0
- package/dist/use-spinner.js +71 -0
- package/dist/use-spinner.js.map +1 -0
- package/dist/use-stats.d.ts +59 -0
- package/dist/use-stats.d.ts.map +1 -0
- package/dist/use-stats.js +150 -0
- package/dist/use-stats.js.map +1 -0
- package/dist/use-terminal-size.d.ts +29 -0
- package/dist/use-terminal-size.d.ts.map +1 -0
- package/dist/use-terminal-size.js +48 -0
- package/dist/use-terminal-size.js.map +1 -0
- package/dist/useTheme.d.ts +76 -0
- package/dist/useTheme.d.ts.map +1 -0
- package/dist/useTheme.js +136 -0
- package/dist/useTheme.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
export interface ClaudeCodeSpawnOptions {
|
|
3
|
+
/** Path to Claude Code executable (defaults to 'claude') */
|
|
4
|
+
executablePath?: string;
|
|
5
|
+
/** Additional arguments to pass to Claude Code */
|
|
6
|
+
args?: string[];
|
|
7
|
+
/** Working directory for Claude Code */
|
|
8
|
+
cwd?: string;
|
|
9
|
+
/** Environment variables to merge with process.env */
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
/** Timeout for graceful shutdown in milliseconds */
|
|
12
|
+
shutdownTimeout?: number;
|
|
13
|
+
}
|
|
14
|
+
export type ProcessStatus = "idle" | "starting" | "running" | "stopping" | "stopped" | "crashed";
|
|
15
|
+
export interface ProcessError {
|
|
16
|
+
code: number | null;
|
|
17
|
+
signal: NodeJS.Signals | null;
|
|
18
|
+
message: string;
|
|
19
|
+
}
|
|
20
|
+
export declare const CLAUDE_EVENTS: {
|
|
21
|
+
readonly STDOUT: "stdout";
|
|
22
|
+
readonly STDERR: "stderr";
|
|
23
|
+
readonly STATUS: "status";
|
|
24
|
+
readonly ERROR: "error";
|
|
25
|
+
readonly EXIT: "exit";
|
|
26
|
+
};
|
|
27
|
+
export declare class ClaudeCodeProcess extends EventEmitter {
|
|
28
|
+
private childProcess;
|
|
29
|
+
private _status;
|
|
30
|
+
private isShuttingDown;
|
|
31
|
+
private _shutdownTimeout;
|
|
32
|
+
get status(): ProcessStatus;
|
|
33
|
+
private setStatus;
|
|
34
|
+
/**
|
|
35
|
+
* Spawn Claude Code as a child process
|
|
36
|
+
* @param options Spawn options including executable path, args, cwd, and env
|
|
37
|
+
*/
|
|
38
|
+
spawn(options?: ClaudeCodeSpawnOptions): void;
|
|
39
|
+
private setupProcessHandlers;
|
|
40
|
+
/**
|
|
41
|
+
* Send input to Claude Code's stdin
|
|
42
|
+
* @param input The input string to send
|
|
43
|
+
*/
|
|
44
|
+
write(input: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* Send input followed by a newline to Claude Code's stdin
|
|
47
|
+
* @param input The input string to send
|
|
48
|
+
*/
|
|
49
|
+
writeLine(input: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* Gracefully stop the Claude Code process
|
|
52
|
+
* Sends SIGTERM first, then SIGKILL if process doesn't exit within timeout
|
|
53
|
+
* @param timeout Milliseconds to wait before force killing (uses configured timeout if not specified)
|
|
54
|
+
*/
|
|
55
|
+
stop(timeout?: number): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Force kill the Claude Code process immediately
|
|
58
|
+
*/
|
|
59
|
+
kill(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Check if the process is currently running
|
|
62
|
+
*/
|
|
63
|
+
isRunning(): boolean;
|
|
64
|
+
onStdout(listener: (data: string) => void): this;
|
|
65
|
+
onStderr(listener: (data: string) => void): this;
|
|
66
|
+
onStatus(listener: (status: ProcessStatus) => void): this;
|
|
67
|
+
onError(listener: (error: ProcessError) => void): this;
|
|
68
|
+
onExit(listener: (code: number | null, signal: NodeJS.Signals | null) => void): this;
|
|
69
|
+
}
|
|
70
|
+
export declare function getClaudeCodeProcess(): ClaudeCodeProcess;
|
|
71
|
+
/**
|
|
72
|
+
* Setup cleanup handlers for graceful shutdown
|
|
73
|
+
* This ensures no orphaned processes when the parent exits
|
|
74
|
+
*/
|
|
75
|
+
export declare function setupProcessCleanup(claudeProcess: ClaudeCodeProcess): void;
|
|
76
|
+
//# sourceMappingURL=claude-code-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-process.d.ts","sourceRoot":"","sources":["../src/claude-code-process.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,oDAAoD;IACpD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,eAAO,MAAM,aAAa;;;;;;CAMhB,CAAC;AAEX,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAQ;IAEhC,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,OAAO,CAAC,SAAS;IAKjB;;;OAGG;IACH,KAAK,CAAC,OAAO,GAAE,sBAA2B,GAAG,IAAI;IAiCjD,OAAO,CAAC,oBAAoB;IAkD5B;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAU1B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B;;;;OAIG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC3C;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,SAAS,IAAI,OAAO;IAKpB,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhD,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIhD,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAIzD,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAItD,MAAM,CACJ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,KAAK,IAAI,GACrE,IAAI;CAGR;AAKD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAuC1E"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
// Event names as constants for type safety
|
|
4
|
+
export const CLAUDE_EVENTS = {
|
|
5
|
+
STDOUT: "stdout",
|
|
6
|
+
STDERR: "stderr",
|
|
7
|
+
STATUS: "status",
|
|
8
|
+
ERROR: "error",
|
|
9
|
+
EXIT: "exit",
|
|
10
|
+
};
|
|
11
|
+
export class ClaudeCodeProcess extends EventEmitter {
|
|
12
|
+
childProcess = null;
|
|
13
|
+
_status = "idle";
|
|
14
|
+
isShuttingDown = false;
|
|
15
|
+
_shutdownTimeout = 5000;
|
|
16
|
+
get status() {
|
|
17
|
+
return this._status;
|
|
18
|
+
}
|
|
19
|
+
setStatus(status) {
|
|
20
|
+
this._status = status;
|
|
21
|
+
this.emit(CLAUDE_EVENTS.STATUS, status);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Spawn Claude Code as a child process
|
|
25
|
+
* @param options Spawn options including executable path, args, cwd, and env
|
|
26
|
+
*/
|
|
27
|
+
spawn(options = {}) {
|
|
28
|
+
if (this.childProcess) {
|
|
29
|
+
throw new Error("Claude Code process is already running");
|
|
30
|
+
}
|
|
31
|
+
const { executablePath = "claude", args = [], cwd, env, shutdownTimeout = 5000, } = options;
|
|
32
|
+
this._shutdownTimeout = shutdownTimeout;
|
|
33
|
+
this.isShuttingDown = false;
|
|
34
|
+
this.setStatus("starting");
|
|
35
|
+
// Merge environment variables
|
|
36
|
+
const processEnv = env ? { ...process.env, ...env } : process.env;
|
|
37
|
+
// Spawn claude with the provided options
|
|
38
|
+
this.childProcess = nodeSpawn(executablePath, args, {
|
|
39
|
+
cwd,
|
|
40
|
+
env: processEnv,
|
|
41
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
42
|
+
// Ensure the process is killed when parent exits
|
|
43
|
+
detached: false,
|
|
44
|
+
});
|
|
45
|
+
this.setupProcessHandlers();
|
|
46
|
+
this.setStatus("running");
|
|
47
|
+
}
|
|
48
|
+
setupProcessHandlers() {
|
|
49
|
+
if (!this.childProcess)
|
|
50
|
+
return;
|
|
51
|
+
// Capture stdout
|
|
52
|
+
this.childProcess.stdout?.on("data", (data) => {
|
|
53
|
+
this.emit(CLAUDE_EVENTS.STDOUT, data.toString());
|
|
54
|
+
});
|
|
55
|
+
// Capture stderr
|
|
56
|
+
this.childProcess.stderr?.on("data", (data) => {
|
|
57
|
+
this.emit(CLAUDE_EVENTS.STDERR, data.toString());
|
|
58
|
+
});
|
|
59
|
+
// Handle process errors (e.g., failed to spawn)
|
|
60
|
+
this.childProcess.on("error", (err) => {
|
|
61
|
+
const processError = {
|
|
62
|
+
code: null,
|
|
63
|
+
signal: null,
|
|
64
|
+
message: err.message,
|
|
65
|
+
};
|
|
66
|
+
this.emit(CLAUDE_EVENTS.ERROR, processError);
|
|
67
|
+
if (!this.isShuttingDown) {
|
|
68
|
+
this.setStatus("crashed");
|
|
69
|
+
}
|
|
70
|
+
this.childProcess = null;
|
|
71
|
+
});
|
|
72
|
+
// Handle process exit
|
|
73
|
+
this.childProcess.on("exit", (code, signal) => {
|
|
74
|
+
this.emit(CLAUDE_EVENTS.EXIT, code, signal);
|
|
75
|
+
if (this.isShuttingDown) {
|
|
76
|
+
this.setStatus("stopped");
|
|
77
|
+
}
|
|
78
|
+
else if (code !== 0) {
|
|
79
|
+
const processError = {
|
|
80
|
+
code,
|
|
81
|
+
signal,
|
|
82
|
+
message: `Claude Code exited with code ${code}${signal ? ` (signal: ${signal})` : ""}`,
|
|
83
|
+
};
|
|
84
|
+
this.emit(CLAUDE_EVENTS.ERROR, processError);
|
|
85
|
+
this.setStatus("crashed");
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.setStatus("stopped");
|
|
89
|
+
}
|
|
90
|
+
this.childProcess = null;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Send input to Claude Code's stdin
|
|
95
|
+
* @param input The input string to send
|
|
96
|
+
*/
|
|
97
|
+
write(input) {
|
|
98
|
+
if (!this.childProcess?.stdin) {
|
|
99
|
+
throw new Error("Claude Code process is not running or stdin is not available");
|
|
100
|
+
}
|
|
101
|
+
this.childProcess.stdin.write(input);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Send input followed by a newline to Claude Code's stdin
|
|
105
|
+
* @param input The input string to send
|
|
106
|
+
*/
|
|
107
|
+
writeLine(input) {
|
|
108
|
+
this.write(input + "\n");
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Gracefully stop the Claude Code process
|
|
112
|
+
* Sends SIGTERM first, then SIGKILL if process doesn't exit within timeout
|
|
113
|
+
* @param timeout Milliseconds to wait before force killing (uses configured timeout if not specified)
|
|
114
|
+
*/
|
|
115
|
+
async stop(timeout) {
|
|
116
|
+
if (!this.childProcess) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
this.isShuttingDown = true;
|
|
120
|
+
this.setStatus("stopping");
|
|
121
|
+
const effectiveTimeout = timeout ?? this._shutdownTimeout;
|
|
122
|
+
return new Promise((resolve) => {
|
|
123
|
+
const forceKillTimer = setTimeout(() => {
|
|
124
|
+
if (this.childProcess) {
|
|
125
|
+
this.childProcess.kill("SIGKILL");
|
|
126
|
+
}
|
|
127
|
+
}, effectiveTimeout);
|
|
128
|
+
const cleanup = () => {
|
|
129
|
+
clearTimeout(forceKillTimer);
|
|
130
|
+
resolve();
|
|
131
|
+
};
|
|
132
|
+
if (this.childProcess) {
|
|
133
|
+
this.childProcess.once("exit", cleanup);
|
|
134
|
+
// Send SIGTERM for graceful shutdown
|
|
135
|
+
this.childProcess.kill("SIGTERM");
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
cleanup();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Force kill the Claude Code process immediately
|
|
144
|
+
*/
|
|
145
|
+
kill() {
|
|
146
|
+
if (this.childProcess) {
|
|
147
|
+
this.isShuttingDown = true;
|
|
148
|
+
this.setStatus("stopping");
|
|
149
|
+
this.childProcess.kill("SIGKILL");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Check if the process is currently running
|
|
154
|
+
*/
|
|
155
|
+
isRunning() {
|
|
156
|
+
return this._status === "running";
|
|
157
|
+
}
|
|
158
|
+
// Type-safe event listener methods
|
|
159
|
+
onStdout(listener) {
|
|
160
|
+
return this.on(CLAUDE_EVENTS.STDOUT, listener);
|
|
161
|
+
}
|
|
162
|
+
onStderr(listener) {
|
|
163
|
+
return this.on(CLAUDE_EVENTS.STDERR, listener);
|
|
164
|
+
}
|
|
165
|
+
onStatus(listener) {
|
|
166
|
+
return this.on(CLAUDE_EVENTS.STATUS, listener);
|
|
167
|
+
}
|
|
168
|
+
onError(listener) {
|
|
169
|
+
return this.on(CLAUDE_EVENTS.ERROR, listener);
|
|
170
|
+
}
|
|
171
|
+
onExit(listener) {
|
|
172
|
+
return this.on(CLAUDE_EVENTS.EXIT, listener);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Singleton instance for easy access
|
|
176
|
+
let instance = null;
|
|
177
|
+
export function getClaudeCodeProcess() {
|
|
178
|
+
if (!instance) {
|
|
179
|
+
instance = new ClaudeCodeProcess();
|
|
180
|
+
}
|
|
181
|
+
return instance;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Setup cleanup handlers for graceful shutdown
|
|
185
|
+
* This ensures no orphaned processes when the parent exits
|
|
186
|
+
*/
|
|
187
|
+
export function setupProcessCleanup(claudeProcess) {
|
|
188
|
+
const cleanup = async () => {
|
|
189
|
+
if (claudeProcess.isRunning()) {
|
|
190
|
+
await claudeProcess.stop();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
// Handle various exit signals
|
|
194
|
+
process.on("SIGINT", () => {
|
|
195
|
+
void cleanup().then(() => process.exit(0));
|
|
196
|
+
});
|
|
197
|
+
process.on("SIGTERM", () => {
|
|
198
|
+
void cleanup().then(() => process.exit(0));
|
|
199
|
+
});
|
|
200
|
+
process.on("SIGHUP", () => {
|
|
201
|
+
void cleanup().then(() => process.exit(0));
|
|
202
|
+
});
|
|
203
|
+
// Handle uncaught exceptions - ensure cleanup before exit
|
|
204
|
+
process.on("uncaughtException", (err) => {
|
|
205
|
+
console.error("Uncaught exception:", err);
|
|
206
|
+
void cleanup().then(() => process.exit(1));
|
|
207
|
+
});
|
|
208
|
+
// Handle unhandled promise rejections
|
|
209
|
+
process.on("unhandledRejection", (reason) => {
|
|
210
|
+
console.error("Unhandled rejection:", reason);
|
|
211
|
+
void cleanup().then(() => process.exit(1));
|
|
212
|
+
});
|
|
213
|
+
// Handle normal exit
|
|
214
|
+
process.on("exit", () => {
|
|
215
|
+
// Synchronous cleanup - just kill if still running
|
|
216
|
+
if (claudeProcess.isRunning()) {
|
|
217
|
+
claudeProcess.kill();
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=claude-code-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-process.js","sourceRoot":"","sources":["../src/claude-code-process.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Flag Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses command-line arguments and provides flag overrides for configuration.
|
|
5
|
+
* Uses Node's built-in util.parseArgs() (Node 18+).
|
|
6
|
+
*/
|
|
7
|
+
import type { BrainrotConfig } from "./config.js";
|
|
8
|
+
export interface CLIArgs {
|
|
9
|
+
/** Show help message and exit */
|
|
10
|
+
help: boolean;
|
|
11
|
+
/** Show version and exit */
|
|
12
|
+
version: boolean;
|
|
13
|
+
/** Custom config file path */
|
|
14
|
+
configFile?: string;
|
|
15
|
+
/** Config overrides from CLI flags */
|
|
16
|
+
overrides: Partial<BrainrotConfig>;
|
|
17
|
+
/** Any positional arguments (unused currently) */
|
|
18
|
+
positionals: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ParseResult {
|
|
21
|
+
/** Parsed CLI arguments */
|
|
22
|
+
args: CLIArgs;
|
|
23
|
+
/** Error message if parsing failed */
|
|
24
|
+
error?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse command-line arguments
|
|
28
|
+
*/
|
|
29
|
+
export declare function parseCLI(argv?: string[]): ParseResult;
|
|
30
|
+
/**
|
|
31
|
+
* Print help message to stdout
|
|
32
|
+
*/
|
|
33
|
+
export declare function printHelp(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Print version to stdout
|
|
36
|
+
*/
|
|
37
|
+
export declare function printVersion(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Print error message to stderr
|
|
40
|
+
*/
|
|
41
|
+
export declare function printError(message: string): void;
|
|
42
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAiC,MAAM,aAAa,CAAC;AA4DjF,MAAM,WAAW,OAAO;IACtB,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACnC,kDAAkD;IAClD,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAqDD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,WAAW,CA+JnE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Flag Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses command-line arguments and provides flag overrides for configuration.
|
|
5
|
+
* Uses Node's built-in util.parseArgs() (Node 18+).
|
|
6
|
+
*/
|
|
7
|
+
import { parseArgs } from "node:util";
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
9
|
+
import { join, dirname } from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// VERSION DETECTION
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Get version from package.json
|
|
16
|
+
*/
|
|
17
|
+
function getVersion() {
|
|
18
|
+
try {
|
|
19
|
+
// Handle ESM module path resolution
|
|
20
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
// Go up from dist/ or src/ to find package.json
|
|
22
|
+
const packagePath = join(currentDir, "..", "package.json");
|
|
23
|
+
const packageJson = JSON.parse(readFileSync(packagePath, "utf-8"));
|
|
24
|
+
return packageJson.version ?? "0.0.0";
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return "0.0.0";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ============================================================================
|
|
31
|
+
// CLI FLAG DEFINITIONS
|
|
32
|
+
// ============================================================================
|
|
33
|
+
/**
|
|
34
|
+
* CLI flag configuration for parseArgs
|
|
35
|
+
*/
|
|
36
|
+
const CLI_OPTIONS = {
|
|
37
|
+
// Meta flags
|
|
38
|
+
help: { type: "boolean", short: "h" },
|
|
39
|
+
version: { type: "boolean", short: "v" },
|
|
40
|
+
// Config file override
|
|
41
|
+
config: { type: "string", short: "c" },
|
|
42
|
+
// Layout options
|
|
43
|
+
"layout-direction": { type: "string" },
|
|
44
|
+
"split-ratio": { type: "string" },
|
|
45
|
+
// Theme options
|
|
46
|
+
"color-scheme": { type: "string" },
|
|
47
|
+
"border-style": { type: "string" },
|
|
48
|
+
// Claude Code options
|
|
49
|
+
"claude-executable": { type: "string" },
|
|
50
|
+
"claude-args": { type: "string" },
|
|
51
|
+
"working-dir": { type: "string", short: "w" },
|
|
52
|
+
// App options
|
|
53
|
+
debug: { type: "boolean", short: "d" },
|
|
54
|
+
"log-level": { type: "string" },
|
|
55
|
+
"default-game": { type: "string", short: "g" },
|
|
56
|
+
};
|
|
57
|
+
// ============================================================================
|
|
58
|
+
// HELP TEXT
|
|
59
|
+
// ============================================================================
|
|
60
|
+
const HELP_TEXT = `
|
|
61
|
+
brainrot - Play games while Claude Code works
|
|
62
|
+
|
|
63
|
+
USAGE:
|
|
64
|
+
brainrot [OPTIONS]
|
|
65
|
+
|
|
66
|
+
OPTIONS:
|
|
67
|
+
-h, --help Show this help message and exit
|
|
68
|
+
-v, --version Show version and exit
|
|
69
|
+
-c, --config <path> Use custom config file path
|
|
70
|
+
|
|
71
|
+
LAYOUT OPTIONS:
|
|
72
|
+
--layout-direction <dir> Split direction: horizontal, vertical
|
|
73
|
+
--split-ratio <ratio> Split ratio (0.0-1.0, e.g., 0.5)
|
|
74
|
+
|
|
75
|
+
THEME OPTIONS:
|
|
76
|
+
--color-scheme <scheme> Color scheme: default, dark, light, high-contrast
|
|
77
|
+
--border-style <style> Border style: single, round, double, heavy
|
|
78
|
+
|
|
79
|
+
CLAUDE CODE OPTIONS:
|
|
80
|
+
--claude-executable <path> Path to Claude Code executable
|
|
81
|
+
--claude-args <args> Arguments to pass to Claude Code (comma-separated)
|
|
82
|
+
-w, --working-dir <path> Working directory for Claude Code
|
|
83
|
+
|
|
84
|
+
APP OPTIONS:
|
|
85
|
+
-d, --debug Enable debug mode
|
|
86
|
+
--log-level <level> Log level: error, warn, info, debug
|
|
87
|
+
-g, --default-game <id> Default game to select: snake, tetris, pong, minesweeper
|
|
88
|
+
|
|
89
|
+
EXAMPLES:
|
|
90
|
+
brainrot Start with default settings
|
|
91
|
+
brainrot --layout-direction vertical Use vertical split layout
|
|
92
|
+
brainrot --split-ratio 0.7 Game pane takes 70% of space
|
|
93
|
+
brainrot --debug --log-level debug Enable debug mode with verbose logging
|
|
94
|
+
brainrot -c ~/.my-brainrot.json Use custom config file
|
|
95
|
+
|
|
96
|
+
CONFIG FILE:
|
|
97
|
+
Default location: ~/.config/brainrot-cli/config.json
|
|
98
|
+
CLI flags override config file values.
|
|
99
|
+
|
|
100
|
+
For more information, visit: https://github.com/brainrot-cli/brainrot
|
|
101
|
+
`;
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// PARSING FUNCTIONS
|
|
104
|
+
// ============================================================================
|
|
105
|
+
/**
|
|
106
|
+
* Parse command-line arguments
|
|
107
|
+
*/
|
|
108
|
+
export function parseCLI(argv = process.argv) {
|
|
109
|
+
try {
|
|
110
|
+
const { values, positionals } = parseArgs({
|
|
111
|
+
args: argv.slice(2), // Skip node and script path
|
|
112
|
+
options: CLI_OPTIONS,
|
|
113
|
+
allowPositionals: true,
|
|
114
|
+
strict: true,
|
|
115
|
+
});
|
|
116
|
+
const args = {
|
|
117
|
+
help: values.help ?? false,
|
|
118
|
+
version: values.version ?? false,
|
|
119
|
+
configFile: values.config,
|
|
120
|
+
positionals,
|
|
121
|
+
overrides: {},
|
|
122
|
+
};
|
|
123
|
+
// Build config overrides from CLI flags
|
|
124
|
+
const overrides = {};
|
|
125
|
+
// Layout overrides
|
|
126
|
+
if (values["layout-direction"] || values["split-ratio"]) {
|
|
127
|
+
overrides.layout = {};
|
|
128
|
+
if (values["layout-direction"]) {
|
|
129
|
+
const dir = values["layout-direction"];
|
|
130
|
+
if (dir !== "horizontal" && dir !== "vertical") {
|
|
131
|
+
return {
|
|
132
|
+
args,
|
|
133
|
+
error: `Invalid layout direction: "${dir}". Must be "horizontal" or "vertical".`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
overrides.layout.direction = dir;
|
|
137
|
+
}
|
|
138
|
+
if (values["split-ratio"]) {
|
|
139
|
+
const ratio = parseFloat(values["split-ratio"]);
|
|
140
|
+
if (isNaN(ratio) || ratio < 0 || ratio > 1) {
|
|
141
|
+
return {
|
|
142
|
+
args,
|
|
143
|
+
error: `Invalid split ratio: "${values["split-ratio"]}". Must be a number between 0.0 and 1.0.`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
overrides.layout.splitRatio = ratio;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Theme overrides
|
|
150
|
+
if (values["color-scheme"] || values["border-style"]) {
|
|
151
|
+
overrides.theme = {};
|
|
152
|
+
if (values["color-scheme"]) {
|
|
153
|
+
const scheme = values["color-scheme"];
|
|
154
|
+
const validSchemes = ["default", "dark", "light", "high-contrast"];
|
|
155
|
+
if (!validSchemes.includes(scheme)) {
|
|
156
|
+
return {
|
|
157
|
+
args,
|
|
158
|
+
error: `Invalid color scheme: "${scheme}". Must be one of: ${validSchemes.join(", ")}.`,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
overrides.theme.colorScheme = scheme;
|
|
162
|
+
}
|
|
163
|
+
if (values["border-style"]) {
|
|
164
|
+
const style = values["border-style"];
|
|
165
|
+
const validStyles = ["single", "round", "double", "heavy"];
|
|
166
|
+
if (!validStyles.includes(style)) {
|
|
167
|
+
return {
|
|
168
|
+
args,
|
|
169
|
+
error: `Invalid border style: "${style}". Must be one of: ${validStyles.join(", ")}.`,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
overrides.theme.borderStyle = style;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Claude Code overrides
|
|
176
|
+
if (values["claude-executable"] ||
|
|
177
|
+
values["claude-args"] ||
|
|
178
|
+
values["working-dir"]) {
|
|
179
|
+
overrides.claudeCode = {};
|
|
180
|
+
if (values["claude-executable"]) {
|
|
181
|
+
overrides.claudeCode.executablePath = values["claude-executable"];
|
|
182
|
+
}
|
|
183
|
+
if (values["claude-args"]) {
|
|
184
|
+
// Split comma-separated args
|
|
185
|
+
overrides.claudeCode.defaultArgs = values["claude-args"]
|
|
186
|
+
.split(",")
|
|
187
|
+
.map((arg) => arg.trim())
|
|
188
|
+
.filter((arg) => arg.length > 0);
|
|
189
|
+
}
|
|
190
|
+
if (values["working-dir"]) {
|
|
191
|
+
overrides.claudeCode.workingDirectory = values["working-dir"];
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// App overrides
|
|
195
|
+
if (values.debug || values["log-level"] || values["default-game"]) {
|
|
196
|
+
overrides.app = {};
|
|
197
|
+
if (values.debug) {
|
|
198
|
+
overrides.app.debugMode = true;
|
|
199
|
+
}
|
|
200
|
+
if (values["log-level"]) {
|
|
201
|
+
const level = values["log-level"];
|
|
202
|
+
const validLevels = ["error", "warn", "info", "debug"];
|
|
203
|
+
if (!validLevels.includes(level)) {
|
|
204
|
+
return {
|
|
205
|
+
args,
|
|
206
|
+
error: `Invalid log level: "${level}". Must be one of: ${validLevels.join(", ")}.`,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
overrides.app.logLevel = level;
|
|
210
|
+
}
|
|
211
|
+
if (values["default-game"]) {
|
|
212
|
+
overrides.app.defaultGame = values["default-game"];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
args.overrides = overrides;
|
|
216
|
+
return { args };
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
// Handle unknown flags or other parsing errors
|
|
220
|
+
const message = error instanceof Error ? error.message : "Unknown error parsing arguments";
|
|
221
|
+
// Provide helpful error message for unknown flags
|
|
222
|
+
if (message.includes("Unknown option")) {
|
|
223
|
+
const match = message.match(/Unknown option '([^']+)'/);
|
|
224
|
+
const flag = match?.[1] ?? "unknown";
|
|
225
|
+
return {
|
|
226
|
+
args: {
|
|
227
|
+
help: false,
|
|
228
|
+
version: false,
|
|
229
|
+
positionals: [],
|
|
230
|
+
overrides: {},
|
|
231
|
+
},
|
|
232
|
+
error: `Unknown option: ${flag}\n\nRun 'brainrot --help' to see available options.`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
args: {
|
|
237
|
+
help: false,
|
|
238
|
+
version: false,
|
|
239
|
+
positionals: [],
|
|
240
|
+
overrides: {},
|
|
241
|
+
},
|
|
242
|
+
error: `Error parsing arguments: ${message}\n\nRun 'brainrot --help' to see available options.`,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Print help message to stdout
|
|
248
|
+
*/
|
|
249
|
+
export function printHelp() {
|
|
250
|
+
console.log(HELP_TEXT);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Print version to stdout
|
|
254
|
+
*/
|
|
255
|
+
export function printVersion() {
|
|
256
|
+
const version = getVersion();
|
|
257
|
+
console.log(`brainrot v${version}`);
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Print error message to stderr
|
|
261
|
+
*/
|
|
262
|
+
export function printError(message) {
|
|
263
|
+
console.error(`Error: ${message}`);
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,oCAAoC;QACpC,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,gDAAgD;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,OAAO,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,aAAa;IACb,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;IACrC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;IAExC,uBAAuB;IACvB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IAEtC,iBAAiB;IACjB,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACtC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAEjC,gBAAgB;IAChB,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAClC,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAElC,sBAAsB;IACtB,mBAAmB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACvC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IACjC,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IAE7C,cAAc;IACd,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;IACtC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC/B,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;CACtC,CAAC;AA0BX,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCjB,CAAC;AAEF,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAiB,OAAO,CAAC,IAAI;IACpD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,4BAA4B;YACjD,OAAO,EAAE,WAAW;YACpB,gBAAgB,EAAE,IAAI;YACtB,MAAM,EAAE,IAAI;SACb,CAAC,CAAC;QAEH,MAAM,IAAI,GAAY;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;YAChC,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,WAAW;YACX,SAAS,EAAE,EAAE;SACd,CAAC;QAEF,wCAAwC;QACxC,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,mBAAmB;QACnB,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YACxD,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC;YAEtB,IAAI,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;gBACvC,IAAI,GAAG,KAAK,YAAY,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;oBAC/C,OAAO;wBACL,IAAI;wBACJ,KAAK,EAAE,8BAA8B,GAAG,wCAAwC;qBACjF,CAAC;gBACJ,CAAC;gBACD,SAAS,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;YACnC,CAAC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;gBAChD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBAC3C,OAAO;wBACL,IAAI;wBACJ,KAAK,EAAE,yBAAyB,MAAM,CAAC,aAAa,CAAC,0CAA0C;qBAChG,CAAC;gBACJ,CAAC;gBACD,SAAS,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;YACtC,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YACrD,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;YAErB,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;gBACtC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;gBACnE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnC,OAAO;wBACL,IAAI;wBACJ,KAAK,EAAE,0BAA0B,MAAM,sBAAsB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;qBACxF,CAAC;gBACJ,CAAC;gBACD,SAAS,CAAC,KAAK,CAAC,WAAW,GAAG,MAAyC,CAAC;YAC1E,CAAC;YAED,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;gBACrC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC3D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,OAAO;wBACL,IAAI;wBACJ,KAAK,EAAE,0BAA0B,KAAK,sBAAsB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;qBACtF,CAAC;gBACJ,CAAC;gBACD,SAAS,CAAC,KAAK,CAAC,WAAW,GAAG,KAAwC,CAAC;YACzE,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,IACE,MAAM,CAAC,mBAAmB,CAAC;YAC3B,MAAM,CAAC,aAAa,CAAC;YACrB,MAAM,CAAC,aAAa,CAAC,EACrB,CAAC;YACD,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;YAE1B,IAAI,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAChC,SAAS,CAAC,UAAU,CAAC,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1B,6BAA6B;gBAC7B,SAAS,CAAC,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC;qBACrD,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;qBACxB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC1B,SAAS,CAAC,UAAU,CAAC,gBAAgB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;YAClE,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC;YAEnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,SAAS,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;YACjC,CAAC;YAED,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxB,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;gBAClC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBACvD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,OAAO;wBACL,IAAI;wBACJ,KAAK,EAAE,uBAAuB,KAAK,sBAAsB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;qBACnF,CAAC;gBACJ,CAAC;gBACD,SAAS,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAgC,CAAC;YAC5D,CAAC;YAED,IAAI,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+CAA+C;QAC/C,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC;QAE7E,kDAAkD;QAClD,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACxD,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YACrC,OAAO;gBACL,IAAI,EAAE;oBACJ,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,KAAK;oBACd,WAAW,EAAE,EAAE;oBACf,SAAS,EAAE,EAAE;iBACd;gBACD,KAAK,EAAE,mBAAmB,IAAI,qDAAqD;aACpF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE;gBACJ,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE,EAAE;aACd;YACD,KAAK,EAAE,4BAA4B,OAAO,qDAAqD;SAChG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC"}
|