millhouse 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.
Files changed (88) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +248 -0
  3. package/commands/millhouse.md +223 -0
  4. package/dist/analysis/graph-builder.d.ts +42 -0
  5. package/dist/analysis/graph-builder.d.ts.map +1 -0
  6. package/dist/analysis/graph-builder.js +98 -0
  7. package/dist/analysis/graph-builder.js.map +1 -0
  8. package/dist/analysis/issue-analyzer.d.ts +20 -0
  9. package/dist/analysis/issue-analyzer.d.ts.map +1 -0
  10. package/dist/analysis/issue-analyzer.js +167 -0
  11. package/dist/analysis/issue-analyzer.js.map +1 -0
  12. package/dist/analysis/plan-parser.d.ts +8 -0
  13. package/dist/analysis/plan-parser.d.ts.map +1 -0
  14. package/dist/analysis/plan-parser.js +112 -0
  15. package/dist/analysis/plan-parser.js.map +1 -0
  16. package/dist/cli/cleanup.d.ts +20 -0
  17. package/dist/cli/cleanup.d.ts.map +1 -0
  18. package/dist/cli/cleanup.js +186 -0
  19. package/dist/cli/cleanup.js.map +1 -0
  20. package/dist/cli/commands/clean.d.ts +2 -0
  21. package/dist/cli/commands/clean.d.ts.map +1 -0
  22. package/dist/cli/commands/clean.js +16 -0
  23. package/dist/cli/commands/clean.js.map +1 -0
  24. package/dist/cli/commands/resume.d.ts +2 -0
  25. package/dist/cli/commands/resume.d.ts.map +1 -0
  26. package/dist/cli/commands/resume.js +82 -0
  27. package/dist/cli/commands/resume.js.map +1 -0
  28. package/dist/cli/commands/run.d.ts +10 -0
  29. package/dist/cli/commands/run.d.ts.map +1 -0
  30. package/dist/cli/commands/run.js +352 -0
  31. package/dist/cli/commands/run.js.map +1 -0
  32. package/dist/cli/commands/setup.d.ts +6 -0
  33. package/dist/cli/commands/setup.d.ts.map +1 -0
  34. package/dist/cli/commands/setup.js +74 -0
  35. package/dist/cli/commands/setup.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts +7 -0
  37. package/dist/cli/commands/status.d.ts.map +1 -0
  38. package/dist/cli/commands/status.js +83 -0
  39. package/dist/cli/commands/status.js.map +1 -0
  40. package/dist/cli/progress-display.d.ts +93 -0
  41. package/dist/cli/progress-display.d.ts.map +1 -0
  42. package/dist/cli/progress-display.js +318 -0
  43. package/dist/cli/progress-display.js.map +1 -0
  44. package/dist/core/orchestrator.d.ts +79 -0
  45. package/dist/core/orchestrator.d.ts.map +1 -0
  46. package/dist/core/orchestrator.js +389 -0
  47. package/dist/core/orchestrator.js.map +1 -0
  48. package/dist/core/scheduler.d.ts +72 -0
  49. package/dist/core/scheduler.d.ts.map +1 -0
  50. package/dist/core/scheduler.js +234 -0
  51. package/dist/core/scheduler.js.map +1 -0
  52. package/dist/execution/claude-runner.d.ts +41 -0
  53. package/dist/execution/claude-runner.d.ts.map +1 -0
  54. package/dist/execution/claude-runner.js +241 -0
  55. package/dist/execution/claude-runner.js.map +1 -0
  56. package/dist/execution/worktree-manager.d.ts +52 -0
  57. package/dist/execution/worktree-manager.d.ts.map +1 -0
  58. package/dist/execution/worktree-manager.js +208 -0
  59. package/dist/execution/worktree-manager.js.map +1 -0
  60. package/dist/github/client.d.ts +27 -0
  61. package/dist/github/client.d.ts.map +1 -0
  62. package/dist/github/client.js +178 -0
  63. package/dist/github/client.js.map +1 -0
  64. package/dist/github/issue-discoverer.d.ts +20 -0
  65. package/dist/github/issue-discoverer.d.ts.map +1 -0
  66. package/dist/github/issue-discoverer.js +83 -0
  67. package/dist/github/issue-discoverer.js.map +1 -0
  68. package/dist/github/label-manager.d.ts +44 -0
  69. package/dist/github/label-manager.d.ts.map +1 -0
  70. package/dist/github/label-manager.js +93 -0
  71. package/dist/github/label-manager.js.map +1 -0
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +54 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/storage/config.d.ts +4 -0
  77. package/dist/storage/config.d.ts.map +1 -0
  78. package/dist/storage/config.js +25 -0
  79. package/dist/storage/config.js.map +1 -0
  80. package/dist/storage/json-store.d.ts +20 -0
  81. package/dist/storage/json-store.d.ts.map +1 -0
  82. package/dist/storage/json-store.js +92 -0
  83. package/dist/storage/json-store.js.map +1 -0
  84. package/dist/types.d.ts +142 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +36 -0
  87. package/dist/types.js.map +1 -0
  88. package/package.json +60 -0
@@ -0,0 +1,389 @@
1
+ import chalk from 'chalk';
2
+ export class Orchestrator {
3
+ config;
4
+ store;
5
+ graphBuilder;
6
+ worktreeManager;
7
+ claudeRunner;
8
+ scheduler;
9
+ // GitHub-specific (optional for local mode)
10
+ githubClient;
11
+ labelManager;
12
+ issueDiscoverer;
13
+ issueAnalyzer;
14
+ progressDisplay;
15
+ runState = null;
16
+ graph = null;
17
+ isShuttingDown = false;
18
+ originalBranch = null;
19
+ constructor(options) {
20
+ this.config = options.config;
21
+ this.store = options.store;
22
+ this.graphBuilder = options.graphBuilder;
23
+ this.worktreeManager = options.worktreeManager;
24
+ this.claudeRunner = options.claudeRunner;
25
+ this.scheduler = options.scheduler;
26
+ // GitHub-specific
27
+ this.githubClient = options.githubClient;
28
+ this.labelManager = options.labelManager;
29
+ this.issueDiscoverer = options.issueDiscoverer;
30
+ this.issueAnalyzer = options.issueAnalyzer;
31
+ this.progressDisplay = options.progressDisplay;
32
+ // Handle graceful shutdown
33
+ this.setupShutdownHandlers();
34
+ }
35
+ setupShutdownHandlers() {
36
+ const shutdown = async () => {
37
+ if (this.isShuttingDown)
38
+ return;
39
+ this.isShuttingDown = true;
40
+ console.log(chalk.yellow('\n\n⚠️ Graceful shutdown initiated...'));
41
+ if (this.runState) {
42
+ this.runState.status = 'interrupted';
43
+ this.runState.updatedAt = new Date().toISOString();
44
+ await this.store.saveRun(this.runState);
45
+ console.log(chalk.yellow(` Run saved. Resume with: millhouse resume ${this.runState.id}`));
46
+ }
47
+ // Restore original branch
48
+ if (this.originalBranch) {
49
+ console.log(chalk.yellow(` Restoring branch: ${this.originalBranch}`));
50
+ await this.worktreeManager.restoreBranch(this.originalBranch);
51
+ }
52
+ process.exit(0);
53
+ };
54
+ process.on('SIGINT', shutdown);
55
+ process.on('SIGTERM', shutdown);
56
+ }
57
+ /**
58
+ * Discover all issues starting from the given issue numbers.
59
+ * Only available in GitHub mode.
60
+ */
61
+ async discoverIssues(issueNumbers, recursive) {
62
+ if (!this.issueDiscoverer) {
63
+ throw new Error('discoverIssues is only available in GitHub mode');
64
+ }
65
+ return this.issueDiscoverer.discover(issueNumbers, recursive);
66
+ }
67
+ /**
68
+ * Analyze issues for dependencies.
69
+ * Only available in GitHub mode.
70
+ */
71
+ async analyzeIssues(issues) {
72
+ if (!this.issueAnalyzer) {
73
+ throw new Error('analyzeIssues is only available in GitHub mode');
74
+ }
75
+ return this.issueAnalyzer.analyzeIssues(issues);
76
+ }
77
+ /**
78
+ * Run the full orchestration pipeline.
79
+ */
80
+ async run(analyzedIssues) {
81
+ // Save original branch to restore later
82
+ this.originalBranch = await this.worktreeManager.getCurrentBranch();
83
+ // Create run state
84
+ const runId = this.store.generateRunId();
85
+ const baseBranch = this.config.execution.baseBranch;
86
+ // Build dependency graph
87
+ this.graph = this.graphBuilder.build(analyzedIssues);
88
+ // Check for cycles
89
+ if (!this.graph.isAcyclic()) {
90
+ const cycles = this.graph.getCycles();
91
+ throw new Error(`Circular dependencies detected: ${cycles.map(c => c.map(n => `#${n}`).join(' → ')).join('; ')}`);
92
+ }
93
+ // Create run branch
94
+ console.log(chalk.blue(` Creating run branch: millhouse/run-${runId}`));
95
+ const runBranch = await this.worktreeManager.createRunBranch(runId, baseBranch);
96
+ // Initialize run state
97
+ this.runState = {
98
+ id: runId,
99
+ createdAt: new Date().toISOString(),
100
+ updatedAt: new Date().toISOString(),
101
+ status: 'running',
102
+ baseBranch,
103
+ runBranch,
104
+ issues: analyzedIssues,
105
+ tasks: analyzedIssues.map(issue => ({
106
+ issueNumber: issue.number,
107
+ status: 'queued',
108
+ })),
109
+ completedIssues: [],
110
+ failedIssues: [],
111
+ };
112
+ await this.store.saveRun(this.runState);
113
+ // GitHub-specific: manage labels
114
+ if (this.labelManager) {
115
+ await this.labelManager.ensureLabelsExist();
116
+ await this.labelManager.setStatusBatch(analyzedIssues.map(i => i.number), 'queued');
117
+ }
118
+ // Initialize progress display
119
+ if (this.progressDisplay) {
120
+ this.progressDisplay.initialize(analyzedIssues);
121
+ this.progressDisplay.start();
122
+ }
123
+ // Run the scheduler
124
+ try {
125
+ return await this.executeScheduler(runId, runBranch, analyzedIssues);
126
+ }
127
+ finally {
128
+ if (this.progressDisplay) {
129
+ this.progressDisplay.stop();
130
+ }
131
+ // Restore original branch
132
+ if (this.originalBranch) {
133
+ await this.worktreeManager.restoreBranch(this.originalBranch);
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * Resume an interrupted run.
139
+ */
140
+ async resume(runState) {
141
+ // Save original branch to restore later
142
+ this.originalBranch = await this.worktreeManager.getCurrentBranch();
143
+ this.runState = runState;
144
+ // Rebuild graph from issues
145
+ this.graph = this.graphBuilder.build(runState.issues);
146
+ // Update status
147
+ this.runState.status = 'running';
148
+ this.runState.updatedAt = new Date().toISOString();
149
+ await this.store.saveRun(this.runState);
150
+ // Continue from where we left off
151
+ try {
152
+ return await this.executeScheduler(runState.id, runState.runBranch, runState.issues);
153
+ }
154
+ finally {
155
+ // Restore original branch
156
+ if (this.originalBranch) {
157
+ await this.worktreeManager.restoreBranch(this.originalBranch);
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Execute the scheduler loop.
163
+ */
164
+ async executeScheduler(runId, runBranch, issues) {
165
+ if (!this.runState || !this.graph) {
166
+ throw new Error('Run state not initialized');
167
+ }
168
+ const issueMap = new Map(issues.map(i => [i.number, i]));
169
+ // Initialize scheduler
170
+ this.scheduler.initialize(this.graph, this.runState.completedIssues, this.runState.failedIssues);
171
+ // Set up event handlers
172
+ this.scheduler.on('event', async (event) => {
173
+ await this.handleSchedulerEvent(event, runId, runBranch);
174
+ });
175
+ // Create task executor
176
+ const executor = async (issueNumber) => {
177
+ const issue = issueMap.get(issueNumber);
178
+ if (!issue) {
179
+ return { success: false, commits: [], error: 'Issue not found' };
180
+ }
181
+ try {
182
+ // Create worktree
183
+ if (this.progressDisplay) {
184
+ this.progressDisplay.logDetailed(issueNumber, 'Creating worktree...');
185
+ }
186
+ else {
187
+ console.log(chalk.blue(` Creating worktree for #${issueNumber}...`));
188
+ }
189
+ const worktree = await this.worktreeManager.createWorktree(runId, issueNumber, runBranch);
190
+ await this.store.saveWorktree(worktree);
191
+ // Run Claude
192
+ if (this.progressDisplay) {
193
+ this.progressDisplay.logDetailed(issueNumber, 'Running Claude...');
194
+ }
195
+ else {
196
+ console.log(chalk.blue(` Running Claude for #${issueNumber}...`));
197
+ }
198
+ const result = await this.claudeRunner.run(issue, runId, worktree.path);
199
+ if (result.success) {
200
+ // Merge changes back
201
+ if (this.progressDisplay) {
202
+ this.progressDisplay.logDetailed(issueNumber, 'Merging changes...');
203
+ }
204
+ else {
205
+ console.log(chalk.blue(` Merging changes for #${issueNumber}...`));
206
+ }
207
+ const mergeResult = await this.worktreeManager.mergeWorktree(worktree.path, runBranch);
208
+ if (!mergeResult.success) {
209
+ return {
210
+ success: false,
211
+ commits: result.commits,
212
+ error: mergeResult.error || 'Merge failed',
213
+ };
214
+ }
215
+ }
216
+ // Clean up worktree and its branch
217
+ await this.worktreeManager.removeWorktree(worktree.path, worktree.branch);
218
+ await this.store.removeWorktree(worktree.path);
219
+ return result;
220
+ }
221
+ catch (error) {
222
+ return {
223
+ success: false,
224
+ commits: [],
225
+ error: error instanceof Error ? error.message : String(error),
226
+ };
227
+ }
228
+ };
229
+ // Run scheduler
230
+ const { completed, failed } = await this.scheduler.run(executor);
231
+ // Update final state
232
+ this.runState.completedIssues = completed;
233
+ this.runState.failedIssues = failed;
234
+ this.runState.updatedAt = new Date().toISOString();
235
+ // Create PR if all completed (GitHub mode only)
236
+ if (failed.length === 0 && completed.length > 0) {
237
+ if (this.githubClient) {
238
+ try {
239
+ // Push run branch
240
+ console.log(chalk.blue(' Pushing changes...'));
241
+ await this.worktreeManager.pushRunBranch(runBranch);
242
+ // Create PR
243
+ console.log(chalk.blue(' Creating pull request...'));
244
+ const prUrl = await this.createFinalPR(runId, runBranch, issues, completed);
245
+ this.runState.pullRequestUrl = prUrl;
246
+ this.runState.status = 'completed';
247
+ }
248
+ catch (error) {
249
+ this.runState.error = error instanceof Error ? error.message : String(error);
250
+ this.runState.status = 'failed';
251
+ }
252
+ }
253
+ else {
254
+ // Local mode - just mark as completed
255
+ this.runState.status = 'completed';
256
+ }
257
+ }
258
+ else if (failed.length > 0) {
259
+ this.runState.status = 'failed';
260
+ this.runState.error = `${failed.length} issue(s) failed`;
261
+ }
262
+ else {
263
+ this.runState.status = 'completed';
264
+ }
265
+ await this.store.saveRun(this.runState);
266
+ return this.runState;
267
+ }
268
+ /**
269
+ * Handle scheduler events.
270
+ */
271
+ async handleSchedulerEvent(event, _runId, _runBranch) {
272
+ if (!this.runState)
273
+ return;
274
+ switch (event.type) {
275
+ case 'task-started':
276
+ if (this.progressDisplay) {
277
+ this.progressDisplay.handleEvent({ type: 'issue-started', issueNumber: event.issueNumber });
278
+ }
279
+ else {
280
+ console.log(chalk.cyan(` ▶ Started: #${event.issueNumber}`));
281
+ }
282
+ if (this.labelManager) {
283
+ await this.labelManager.markInProgress(event.issueNumber);
284
+ }
285
+ this.updateTaskStatus(event.issueNumber, 'in-progress');
286
+ break;
287
+ case 'task-completed':
288
+ if (this.progressDisplay) {
289
+ this.progressDisplay.handleEvent({ type: 'issue-completed', issueNumber: event.issueNumber });
290
+ }
291
+ else {
292
+ console.log(chalk.green(` ✓ Completed: #${event.issueNumber}`));
293
+ }
294
+ if (this.labelManager) {
295
+ await this.labelManager.markDone(event.issueNumber);
296
+ }
297
+ this.updateTaskStatus(event.issueNumber, 'completed', event.commits);
298
+ break;
299
+ case 'task-failed':
300
+ if (this.progressDisplay) {
301
+ this.progressDisplay.handleEvent({ type: 'issue-failed', issueNumber: event.issueNumber, error: event.error || 'Unknown error' });
302
+ }
303
+ else {
304
+ console.log(chalk.red(` ✗ Failed: #${event.issueNumber} - ${event.error}`));
305
+ }
306
+ if (this.labelManager) {
307
+ await this.labelManager.markFailed(event.issueNumber);
308
+ }
309
+ if (this.githubClient) {
310
+ await this.githubClient.addComment(event.issueNumber, `❌ Millhouse failed to implement this issue:\n\n\`\`\`\n${event.error}\n\`\`\``);
311
+ }
312
+ this.updateTaskStatus(event.issueNumber, 'failed', undefined, event.error);
313
+ break;
314
+ case 'tasks-unblocked':
315
+ if (this.progressDisplay) {
316
+ for (const num of event.issueNumbers) {
317
+ this.progressDisplay.handleEvent({ type: 'issue-unblocked', issueNumber: num });
318
+ }
319
+ }
320
+ else {
321
+ console.log(chalk.cyan(` ⏳ Unblocked: ${event.issueNumbers.map(n => `#${n}`).join(', ')}`));
322
+ }
323
+ for (const num of event.issueNumbers) {
324
+ this.updateTaskStatus(num, 'ready');
325
+ }
326
+ break;
327
+ }
328
+ // Save state after each event
329
+ this.runState.updatedAt = new Date().toISOString();
330
+ await this.store.saveRun(this.runState);
331
+ }
332
+ /**
333
+ * Update a task's status in the run state.
334
+ */
335
+ updateTaskStatus(issueNumber, status, commits, error) {
336
+ if (!this.runState)
337
+ return;
338
+ const task = this.runState.tasks.find(t => t.issueNumber === issueNumber);
339
+ if (task) {
340
+ task.status = status;
341
+ if (status === 'in-progress') {
342
+ task.startedAt = new Date().toISOString();
343
+ }
344
+ if (status === 'completed' || status === 'failed') {
345
+ task.completedAt = new Date().toISOString();
346
+ }
347
+ if (commits) {
348
+ task.commits = commits;
349
+ }
350
+ if (error) {
351
+ task.error = error;
352
+ }
353
+ }
354
+ }
355
+ /**
356
+ * Create the final pull request.
357
+ */
358
+ async createFinalPR(runId, runBranch, issues, completedIssues) {
359
+ const completedSet = new Set(completedIssues);
360
+ const completed = issues.filter(i => completedSet.has(i.number));
361
+ const title = completed.length === 1
362
+ ? `Fix #${completed[0].number}: ${completed[0].title}`
363
+ : `Millhouse: Implement ${completed.length} issues`;
364
+ const issueList = completed
365
+ .map(i => `- Fixes #${i.number}: ${i.title}`)
366
+ .join('\n');
367
+ const body = `## Summary
368
+
369
+ This PR implements the following issues:
370
+
371
+ ${issueList}
372
+
373
+ ## Details
374
+
375
+ Run ID: \`${runId}\`
376
+ Branch: \`${runBranch}\`
377
+
378
+ ---
379
+ 🤖 Generated by [Millhouse](https://github.com/dave/millhouse)`;
380
+ return this.githubClient.createPullRequest({
381
+ title,
382
+ body,
383
+ head: runBranch,
384
+ base: this.config.execution.baseBranch,
385
+ draft: this.config.pullRequests.createAsDraft,
386
+ });
387
+ }
388
+ }
389
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { DependencyGraph } from '../analysis/graph-builder.js';
3
+ import type { TaskStatus } from '../types.js';
4
+ interface SchedulerOptions {
5
+ concurrency: number;
6
+ continueOnError: boolean;
7
+ }
8
+ type TaskExecutor = (issueNumber: number) => Promise<{
9
+ success: boolean;
10
+ commits: string[];
11
+ error?: string;
12
+ }>;
13
+ export declare class Scheduler extends EventEmitter {
14
+ private readonly concurrency;
15
+ private readonly continueOnError;
16
+ private graph;
17
+ private completed;
18
+ private failed;
19
+ private running;
20
+ private blocked;
21
+ constructor(options: SchedulerOptions);
22
+ /**
23
+ * Initialize the scheduler with a dependency graph.
24
+ */
25
+ initialize(graph: DependencyGraph, completed?: number[], failed?: number[]): void;
26
+ /**
27
+ * Get all tasks that are ready to run (dependencies satisfied, not running).
28
+ */
29
+ getReadyTasks(): number[];
30
+ /**
31
+ * Get the number of available slots for new tasks.
32
+ */
33
+ getAvailableSlots(): number;
34
+ /**
35
+ * Check if all tasks are complete (or failed if continueOnError is false).
36
+ */
37
+ isComplete(): boolean;
38
+ /**
39
+ * Run the scheduler with the given task executor.
40
+ * Returns when all possible tasks are complete.
41
+ */
42
+ run(executor: TaskExecutor): Promise<{
43
+ completed: number[];
44
+ failed: number[];
45
+ }>;
46
+ /**
47
+ * Start a single task.
48
+ */
49
+ private startTask;
50
+ /**
51
+ * Handle task completion.
52
+ */
53
+ private handleTaskComplete;
54
+ /**
55
+ * Check which blocked tasks are now unblocked.
56
+ */
57
+ private checkUnblockedTasks;
58
+ /**
59
+ * Wait for any running task to complete.
60
+ */
61
+ private waitForAny;
62
+ /**
63
+ * Get current status of all tasks.
64
+ */
65
+ getTaskStatuses(): Map<number, TaskStatus>;
66
+ /**
67
+ * Get counts of tasks in each status.
68
+ */
69
+ getStatusCounts(): Record<TaskStatus, number>;
70
+ }
71
+ export {};
72
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/core/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAkB,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9D,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAOD,KAAK,YAAY,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9G,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAE1C,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,OAAO,CAA0B;gBAE7B,OAAO,EAAE,gBAAgB;IAMrC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,GAAE,MAAM,EAAO,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,IAAI;IAqBzF;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAqBzB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,UAAU,IAAI,OAAO;IA2BrB;;;OAGG;IACG,GAAG,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgCrF;;OAEG;IACH,OAAO,CAAC,SAAS;IAoBjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;YACW,UAAU;IAaxB;;OAEG;IACH,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;IAsB1C;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;CAe9C"}