mcp-agent-foundry 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/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/cli/install-skills.d.ts +11 -0
- package/dist/cli/install-skills.d.ts.map +1 -0
- package/dist/cli/install-skills.js +143 -0
- package/dist/cli/install-skills.js.map +1 -0
- package/dist/cli/recovery-commands.d.ts +41 -0
- package/dist/cli/recovery-commands.d.ts.map +1 -0
- package/dist/cli/recovery-commands.js +241 -0
- package/dist/cli/recovery-commands.js.map +1 -0
- package/dist/cli/setup-wizard.d.ts +25 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +1417 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/cli/test-connection.d.ts +45 -0
- package/dist/cli/test-connection.d.ts.map +1 -0
- package/dist/cli/test-connection.js +317 -0
- package/dist/cli/test-connection.js.map +1 -0
- package/dist/cli.d.ts +75 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +704 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +57 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +99 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +14 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +22 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +184 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +347 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/merger.d.ts +76 -0
- package/dist/config/merger.d.ts.map +1 -0
- package/dist/config/merger.js +189 -0
- package/dist/config/merger.js.map +1 -0
- package/dist/config/schema.d.ts +20 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +20 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/validator.d.ts +254 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +363 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/config/worktree-defaults.d.ts +23 -0
- package/dist/config/worktree-defaults.d.ts.map +1 -0
- package/dist/config/worktree-defaults.js +78 -0
- package/dist/config/worktree-defaults.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/tools/compare-agents.d.ts +25 -0
- package/dist/mcp/tools/compare-agents.d.ts.map +1 -0
- package/dist/mcp/tools/compare-agents.js +177 -0
- package/dist/mcp/tools/compare-agents.js.map +1 -0
- package/dist/mcp/tools/critique-plan.d.ts +26 -0
- package/dist/mcp/tools/critique-plan.d.ts.map +1 -0
- package/dist/mcp/tools/critique-plan.js +162 -0
- package/dist/mcp/tools/critique-plan.js.map +1 -0
- package/dist/mcp/tools/design-feedback.d.ts +26 -0
- package/dist/mcp/tools/design-feedback.d.ts.map +1 -0
- package/dist/mcp/tools/design-feedback.js +216 -0
- package/dist/mcp/tools/design-feedback.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +50 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +191 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/invoke-agent.d.ts +25 -0
- package/dist/mcp/tools/invoke-agent.d.ts.map +1 -0
- package/dist/mcp/tools/invoke-agent.js +141 -0
- package/dist/mcp/tools/invoke-agent.js.map +1 -0
- package/dist/mcp/tools/review-code.d.ts +25 -0
- package/dist/mcp/tools/review-code.d.ts.map +1 -0
- package/dist/mcp/tools/review-code.js +170 -0
- package/dist/mcp/tools/review-code.js.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts +22 -0
- package/dist/mcp/tools/tasks/claim-next-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/claim-next-task.js +203 -0
- package/dist/mcp/tools/tasks/claim-next-task.js.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts +17 -0
- package/dist/mcp/tools/tasks/create-routed-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/create-routed-task.js +178 -0
- package/dist/mcp/tools/tasks/create-routed-task.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts +22 -0
- package/dist/mcp/tools/tasks/execute-pipeline.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js +401 -0
- package/dist/mcp/tools/tasks/execute-pipeline.js.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts +32 -0
- package/dist/mcp/tools/tasks/execute-task.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/execute-task.js +284 -0
- package/dist/mcp/tools/tasks/execute-task.js.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts +26 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js +460 -0
- package/dist/mcp/tools/tasks/get-pipeline-status.js.map +1 -0
- package/dist/mcp/tools/tasks/index.d.ts +36 -0
- package/dist/mcp/tools/tasks/index.d.ts.map +1 -0
- package/dist/mcp/tools/tasks/index.js +66 -0
- package/dist/mcp/tools/tasks/index.js.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js +147 -0
- package/dist/mcp/tools/worktree/cleanup-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts +17 -0
- package/dist/mcp/tools/worktree/get-worktree-status.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js +123 -0
- package/dist/mcp/tools/worktree/get-worktree-status.js.map +1 -0
- package/dist/mcp/tools/worktree/index.d.ts +41 -0
- package/dist/mcp/tools/worktree/index.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/index.js +69 -0
- package/dist/mcp/tools/worktree/index.js.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts +17 -0
- package/dist/mcp/tools/worktree/list-worktrees.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/list-worktrees.js +136 -0
- package/dist/mcp/tools/worktree/list-worktrees.js.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts +19 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.d.ts.map +1 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js +228 -0
- package/dist/mcp/tools/worktree/resolve-conflicts.js.map +1 -0
- package/dist/mcp/transport/stdio.d.ts +13 -0
- package/dist/mcp/transport/stdio.d.ts.map +1 -0
- package/dist/mcp/transport/stdio.js +15 -0
- package/dist/mcp/transport/stdio.js.map +1 -0
- package/dist/observability/logger.d.ts +137 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +235 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +250 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +364 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/persistence/index.d.ts +9 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +9 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/state-schema.d.ts +116 -0
- package/dist/persistence/state-schema.d.ts.map +1 -0
- package/dist/persistence/state-schema.js +28 -0
- package/dist/persistence/state-schema.js.map +1 -0
- package/dist/persistence/state-store.d.ts +111 -0
- package/dist/persistence/state-store.d.ts.map +1 -0
- package/dist/persistence/state-store.js +291 -0
- package/dist/persistence/state-store.js.map +1 -0
- package/dist/providers/anthropic.d.ts +164 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +500 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +151 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +227 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +85 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +414 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/kimi.d.ts +19 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +20 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/manager.d.ts +160 -0
- package/dist/providers/manager.d.ts.map +1 -0
- package/dist/providers/manager.js +264 -0
- package/dist/providers/manager.js.map +1 -0
- package/dist/providers/ollama.d.ts +83 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +453 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +96 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +457 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/zai.d.ts +19 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +20 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/router/context-manager.d.ts +2 -0
- package/dist/router/context-manager.d.ts.map +1 -0
- package/dist/router/context-manager.js +3 -0
- package/dist/router/context-manager.js.map +1 -0
- package/dist/router/engine.d.ts +169 -0
- package/dist/router/engine.d.ts.map +1 -0
- package/dist/router/engine.js +435 -0
- package/dist/router/engine.js.map +1 -0
- package/dist/router/pattern-executor.d.ts +317 -0
- package/dist/router/pattern-executor.d.ts.map +1 -0
- package/dist/router/pattern-executor.js +571 -0
- package/dist/router/pattern-executor.js.map +1 -0
- package/dist/router/role-resolver.d.ts +59 -0
- package/dist/router/role-resolver.d.ts.map +1 -0
- package/dist/router/role-resolver.js +95 -0
- package/dist/router/role-resolver.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +223 -0
- package/dist/server.js.map +1 -0
- package/dist/startup.d.ts +78 -0
- package/dist/startup.d.ts.map +1 -0
- package/dist/startup.js +107 -0
- package/dist/startup.js.map +1 -0
- package/dist/tasks/coordinator.d.ts +141 -0
- package/dist/tasks/coordinator.d.ts.map +1 -0
- package/dist/tasks/coordinator.js +331 -0
- package/dist/tasks/coordinator.js.map +1 -0
- package/dist/tasks/index.d.ts +13 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +13 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/persistent-state-coordinator.d.ts +89 -0
- package/dist/tasks/persistent-state-coordinator.d.ts.map +1 -0
- package/dist/tasks/persistent-state-coordinator.js +371 -0
- package/dist/tasks/persistent-state-coordinator.js.map +1 -0
- package/dist/tasks/pipeline-manager.d.ts +103 -0
- package/dist/tasks/pipeline-manager.d.ts.map +1 -0
- package/dist/tasks/pipeline-manager.js +358 -0
- package/dist/tasks/pipeline-manager.js.map +1 -0
- package/dist/tasks/state-coordinator.d.ts +79 -0
- package/dist/tasks/state-coordinator.d.ts.map +1 -0
- package/dist/tasks/state-coordinator.js +200 -0
- package/dist/tasks/state-coordinator.js.map +1 -0
- package/dist/tasks/worker-mode.d.ts +65 -0
- package/dist/tasks/worker-mode.d.ts.map +1 -0
- package/dist/tasks/worker-mode.js +208 -0
- package/dist/tasks/worker-mode.js.map +1 -0
- package/dist/translation/errors.d.ts +203 -0
- package/dist/translation/errors.d.ts.map +1 -0
- package/dist/translation/errors.js +477 -0
- package/dist/translation/errors.js.map +1 -0
- package/dist/translation/index.d.ts +12 -0
- package/dist/translation/index.d.ts.map +1 -0
- package/dist/translation/index.js +32 -0
- package/dist/translation/index.js.map +1 -0
- package/dist/translation/messages.d.ts +295 -0
- package/dist/translation/messages.d.ts.map +1 -0
- package/dist/translation/messages.js +557 -0
- package/dist/translation/messages.js.map +1 -0
- package/dist/translation/streaming.d.ts +226 -0
- package/dist/translation/streaming.d.ts.map +1 -0
- package/dist/translation/streaming.js +520 -0
- package/dist/translation/streaming.js.map +1 -0
- package/dist/translation/tools.d.ts +209 -0
- package/dist/translation/tools.d.ts.map +1 -0
- package/dist/translation/tools.js +331 -0
- package/dist/translation/tools.js.map +1 -0
- package/dist/types.d.ts +747 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +86 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +175 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +315 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/env.d.ts +2 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +3 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/git.d.ts +58 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +197 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/merge-ordering.d.ts +45 -0
- package/dist/utils/merge-ordering.d.ts.map +1 -0
- package/dist/utils/merge-ordering.js +128 -0
- package/dist/utils/merge-ordering.js.map +1 -0
- package/dist/utils/retry.d.ts +106 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +188 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/worktrees/branch-manager.d.ts +55 -0
- package/dist/worktrees/branch-manager.d.ts.map +1 -0
- package/dist/worktrees/branch-manager.js +129 -0
- package/dist/worktrees/branch-manager.js.map +1 -0
- package/dist/worktrees/conflict-handler.d.ts +72 -0
- package/dist/worktrees/conflict-handler.d.ts.map +1 -0
- package/dist/worktrees/conflict-handler.js +287 -0
- package/dist/worktrees/conflict-handler.js.map +1 -0
- package/dist/worktrees/conflict-parser.d.ts +28 -0
- package/dist/worktrees/conflict-parser.d.ts.map +1 -0
- package/dist/worktrees/conflict-parser.js +140 -0
- package/dist/worktrees/conflict-parser.js.map +1 -0
- package/dist/worktrees/index.d.ts +20 -0
- package/dist/worktrees/index.d.ts.map +1 -0
- package/dist/worktrees/index.js +20 -0
- package/dist/worktrees/index.js.map +1 -0
- package/dist/worktrees/instructions.d.ts +20 -0
- package/dist/worktrees/instructions.d.ts.map +1 -0
- package/dist/worktrees/instructions.js +84 -0
- package/dist/worktrees/instructions.js.map +1 -0
- package/dist/worktrees/manager.d.ts +76 -0
- package/dist/worktrees/manager.d.ts.map +1 -0
- package/dist/worktrees/manager.js +277 -0
- package/dist/worktrees/manager.js.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts +55 -0
- package/dist/worktrees/pipeline-merge-orchestrator.d.ts.map +1 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js +221 -0
- package/dist/worktrees/pipeline-merge-orchestrator.js.map +1 -0
- package/dist/worktrees/pool.d.ts +95 -0
- package/dist/worktrees/pool.d.ts.map +1 -0
- package/dist/worktrees/pool.js +271 -0
- package/dist/worktrees/pool.js.map +1 -0
- package/dist/worktrees/recovery.d.ts +94 -0
- package/dist/worktrees/recovery.d.ts.map +1 -0
- package/dist/worktrees/recovery.js +371 -0
- package/dist/worktrees/recovery.js.map +1 -0
- package/dist/worktrees/resource-manager.d.ts +74 -0
- package/dist/worktrees/resource-manager.d.ts.map +1 -0
- package/dist/worktrees/resource-manager.js +228 -0
- package/dist/worktrees/resource-manager.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree Pool
|
|
3
|
+
*
|
|
4
|
+
* Maintains a pool of pre-created worktrees for faster allocation.
|
|
5
|
+
* Reduces latency by having worktrees ready before tasks need them.
|
|
6
|
+
*/
|
|
7
|
+
import type { WorktreeManager } from './manager.js';
|
|
8
|
+
import type { ResourceManager } from './resource-manager.js';
|
|
9
|
+
import type { Worktree } from '../types.js';
|
|
10
|
+
export interface PoolConfig {
|
|
11
|
+
/** Whether the pool is enabled */
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
/** Minimum worktrees to keep ready */
|
|
14
|
+
minSize: number;
|
|
15
|
+
/** Maximum pool size */
|
|
16
|
+
maxSize: number;
|
|
17
|
+
/** Base branch for pre-warmed worktrees */
|
|
18
|
+
preWarmBranch?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PoolStats {
|
|
21
|
+
/** Number of worktrees available in the pool */
|
|
22
|
+
available: number;
|
|
23
|
+
/** Number of worktrees currently in use */
|
|
24
|
+
inUse: number;
|
|
25
|
+
/** Total number of worktrees managed */
|
|
26
|
+
total: number;
|
|
27
|
+
/** Number of pool hits (fast allocation from pool) */
|
|
28
|
+
hits: number;
|
|
29
|
+
/** Number of pool misses (had to create new worktree) */
|
|
30
|
+
misses: number;
|
|
31
|
+
/** Hit rate (hits / total acquisitions) */
|
|
32
|
+
hitRate: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class WorktreePool {
|
|
35
|
+
private readonly worktreeManager;
|
|
36
|
+
private readonly resourceManager;
|
|
37
|
+
private readonly config;
|
|
38
|
+
private readonly logger;
|
|
39
|
+
private availableWorktrees;
|
|
40
|
+
private hits;
|
|
41
|
+
private misses;
|
|
42
|
+
private initialized;
|
|
43
|
+
constructor(worktreeManager: WorktreeManager, resourceManager: ResourceManager, config?: Partial<PoolConfig>);
|
|
44
|
+
/**
|
|
45
|
+
* Initialize the pool with pre-warmed worktrees.
|
|
46
|
+
*/
|
|
47
|
+
initialize(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Acquire a worktree from the pool or create a new one.
|
|
50
|
+
* Returns null if allocation is not allowed (resource limits).
|
|
51
|
+
*/
|
|
52
|
+
acquire(taskId: string): Promise<Worktree | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Release a worktree back to the pool or dispose it.
|
|
55
|
+
* @param worktreeId - The worktree to release
|
|
56
|
+
* @param returnToPool - Whether to return to pool (true) or remove entirely (false)
|
|
57
|
+
*/
|
|
58
|
+
release(worktreeId: string, returnToPool?: boolean): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Replenish the pool to minimum size.
|
|
61
|
+
* Creates new worktrees in the background to maintain pool availability.
|
|
62
|
+
*/
|
|
63
|
+
replenish(): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Drain all worktrees from the pool.
|
|
66
|
+
* Removes all pre-warmed worktrees (useful for shutdown or reconfiguration).
|
|
67
|
+
*/
|
|
68
|
+
drain(): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Resize the pool to new limits.
|
|
71
|
+
* Drains excess worktrees or replenishes to meet new minimum.
|
|
72
|
+
*/
|
|
73
|
+
resize(newMinSize: number, newMaxSize: number): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Get pool statistics.
|
|
76
|
+
*/
|
|
77
|
+
getStats(): PoolStats;
|
|
78
|
+
/**
|
|
79
|
+
* Check if pool is enabled.
|
|
80
|
+
*/
|
|
81
|
+
isEnabled(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Check if pool is initialized.
|
|
84
|
+
*/
|
|
85
|
+
isInitialized(): boolean;
|
|
86
|
+
/**
|
|
87
|
+
* Get pool configuration.
|
|
88
|
+
*/
|
|
89
|
+
getConfig(): PoolConfig;
|
|
90
|
+
/**
|
|
91
|
+
* Reset pool statistics.
|
|
92
|
+
*/
|
|
93
|
+
resetStats(): void;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/worktrees/pool.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C,MAAM,WAAW,UAAU;IACzB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;CACjB;AAaD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAGxB,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAS;gBAG1B,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAQ9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBjC;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA2DvD;;;;OAIG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BrE;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAsChC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B5B;;;OAGG;IACG,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BnE;;OAEG;IACH,QAAQ,IAAI,SAAS;IAYrB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,SAAS,IAAI,UAAU;IAIvB;;OAEG;IACH,UAAU,IAAI,IAAI;CAKnB"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worktree Pool
|
|
3
|
+
*
|
|
4
|
+
* Maintains a pool of pre-created worktrees for faster allocation.
|
|
5
|
+
* Reduces latency by having worktrees ready before tasks need them.
|
|
6
|
+
*/
|
|
7
|
+
import { createLogger } from '../observability/logger.js';
|
|
8
|
+
const DEFAULT_POOL_CONFIG = {
|
|
9
|
+
enabled: true,
|
|
10
|
+
minSize: 2,
|
|
11
|
+
maxSize: 5,
|
|
12
|
+
preWarmBranch: undefined, // Use default base branch
|
|
13
|
+
};
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// WorktreePool Class
|
|
16
|
+
// ============================================================================
|
|
17
|
+
export class WorktreePool {
|
|
18
|
+
worktreeManager;
|
|
19
|
+
resourceManager;
|
|
20
|
+
config;
|
|
21
|
+
logger;
|
|
22
|
+
// Pool state
|
|
23
|
+
availableWorktrees = new Set(); // worktree IDs ready to use
|
|
24
|
+
hits = 0;
|
|
25
|
+
misses = 0;
|
|
26
|
+
initialized = false;
|
|
27
|
+
constructor(worktreeManager, resourceManager, config) {
|
|
28
|
+
this.worktreeManager = worktreeManager;
|
|
29
|
+
this.resourceManager = resourceManager;
|
|
30
|
+
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
31
|
+
this.logger = createLogger({ name: 'worktree-pool' });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize the pool with pre-warmed worktrees.
|
|
35
|
+
*/
|
|
36
|
+
async initialize() {
|
|
37
|
+
if (this.initialized) {
|
|
38
|
+
this.logger.debug('Pool already initialized');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (!this.config.enabled) {
|
|
42
|
+
this.logger.info('Pool disabled, skipping initialization');
|
|
43
|
+
this.initialized = true;
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this.logger.info('Initializing worktree pool', {
|
|
47
|
+
minSize: this.config.minSize,
|
|
48
|
+
maxSize: this.config.maxSize,
|
|
49
|
+
});
|
|
50
|
+
await this.replenish();
|
|
51
|
+
this.initialized = true;
|
|
52
|
+
this.logger.info('Worktree pool initialized', {
|
|
53
|
+
poolSize: this.availableWorktrees.size,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Acquire a worktree from the pool or create a new one.
|
|
58
|
+
* Returns null if allocation is not allowed (resource limits).
|
|
59
|
+
*/
|
|
60
|
+
async acquire(taskId) {
|
|
61
|
+
// Check if we can allocate
|
|
62
|
+
const canAllocate = await this.resourceManager.canAllocate();
|
|
63
|
+
if (!canAllocate.allowed) {
|
|
64
|
+
this.logger.warn('Cannot acquire worktree', { reason: canAllocate.reason });
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
// Try to get from pool first
|
|
68
|
+
if (this.availableWorktrees.size > 0) {
|
|
69
|
+
const worktreeId = this.availableWorktrees.values().next().value;
|
|
70
|
+
if (worktreeId) {
|
|
71
|
+
this.availableWorktrees.delete(worktreeId);
|
|
72
|
+
const worktree = this.worktreeManager.get(worktreeId);
|
|
73
|
+
if (worktree) {
|
|
74
|
+
// Assign to task
|
|
75
|
+
await this.worktreeManager.assign(worktreeId, taskId);
|
|
76
|
+
await this.worktreeManager.activate(worktreeId);
|
|
77
|
+
this.hits++;
|
|
78
|
+
this.logger.debug('Pool hit', {
|
|
79
|
+
worktreeId,
|
|
80
|
+
taskId,
|
|
81
|
+
poolSize: this.availableWorktrees.size,
|
|
82
|
+
});
|
|
83
|
+
// Trigger background replenish
|
|
84
|
+
this.replenish().catch((err) => this.logger.warn('Background replenish failed', { error: err }));
|
|
85
|
+
return this.worktreeManager.get(worktreeId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Pool miss - create new worktree
|
|
90
|
+
this.misses++;
|
|
91
|
+
this.logger.debug('Pool miss, creating new worktree', { taskId });
|
|
92
|
+
try {
|
|
93
|
+
const worktree = await this.worktreeManager.create(taskId, this.config.preWarmBranch);
|
|
94
|
+
await this.worktreeManager.assign(worktree.id, taskId);
|
|
95
|
+
await this.worktreeManager.activate(worktree.id);
|
|
96
|
+
return this.worktreeManager.get(worktree.id);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
this.logger.error('Failed to create worktree', {
|
|
100
|
+
taskId,
|
|
101
|
+
error: error instanceof Error ? error : undefined,
|
|
102
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
103
|
+
});
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Release a worktree back to the pool or dispose it.
|
|
109
|
+
* @param worktreeId - The worktree to release
|
|
110
|
+
* @param returnToPool - Whether to return to pool (true) or remove entirely (false)
|
|
111
|
+
*/
|
|
112
|
+
async release(worktreeId, returnToPool = true) {
|
|
113
|
+
const worktree = this.worktreeManager.get(worktreeId);
|
|
114
|
+
if (!worktree) {
|
|
115
|
+
this.logger.warn('Worktree not found for release', { worktreeId });
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Release from task
|
|
119
|
+
await this.worktreeManager.release(worktreeId);
|
|
120
|
+
if (returnToPool &&
|
|
121
|
+
this.config.enabled &&
|
|
122
|
+
this.availableWorktrees.size < this.config.maxSize) {
|
|
123
|
+
// Return to pool for reuse
|
|
124
|
+
// Note: In a production implementation, we'd reset the branch to clean state
|
|
125
|
+
this.availableWorktrees.add(worktreeId);
|
|
126
|
+
this.logger.debug('Worktree returned to pool', {
|
|
127
|
+
worktreeId,
|
|
128
|
+
poolSize: this.availableWorktrees.size,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// Remove worktree entirely
|
|
133
|
+
await this.worktreeManager.remove(worktreeId, true);
|
|
134
|
+
this.logger.debug('Worktree removed (pool full or disabled)', { worktreeId });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Replenish the pool to minimum size.
|
|
139
|
+
* Creates new worktrees in the background to maintain pool availability.
|
|
140
|
+
*/
|
|
141
|
+
async replenish() {
|
|
142
|
+
if (!this.config.enabled)
|
|
143
|
+
return;
|
|
144
|
+
const needed = this.config.minSize - this.availableWorktrees.size;
|
|
145
|
+
if (needed <= 0)
|
|
146
|
+
return;
|
|
147
|
+
this.logger.debug('Replenishing pool', {
|
|
148
|
+
needed,
|
|
149
|
+
current: this.availableWorktrees.size,
|
|
150
|
+
});
|
|
151
|
+
for (let i = 0; i < needed; i++) {
|
|
152
|
+
const canAllocate = await this.resourceManager.canAllocate();
|
|
153
|
+
if (!canAllocate.allowed) {
|
|
154
|
+
this.logger.debug('Cannot replenish, resource limit reached');
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
// Create worktree with pool identifier
|
|
159
|
+
const worktree = await this.worktreeManager.create(`pool-${Date.now()}-${i}`, this.config.preWarmBranch);
|
|
160
|
+
this.availableWorktrees.add(worktree.id);
|
|
161
|
+
this.logger.debug('Pool worktree created', {
|
|
162
|
+
worktreeId: worktree.id,
|
|
163
|
+
poolSize: this.availableWorktrees.size,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
this.logger.warn('Failed to create pool worktree', {
|
|
168
|
+
error: error instanceof Error ? error.message : String(error),
|
|
169
|
+
});
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Drain all worktrees from the pool.
|
|
176
|
+
* Removes all pre-warmed worktrees (useful for shutdown or reconfiguration).
|
|
177
|
+
*/
|
|
178
|
+
async drain() {
|
|
179
|
+
this.logger.info('Draining worktree pool', { count: this.availableWorktrees.size });
|
|
180
|
+
const errors = [];
|
|
181
|
+
for (const id of this.availableWorktrees) {
|
|
182
|
+
try {
|
|
183
|
+
await this.worktreeManager.remove(id, true);
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
errors.push({
|
|
187
|
+
id,
|
|
188
|
+
error: error instanceof Error ? error.message : String(error),
|
|
189
|
+
});
|
|
190
|
+
this.logger.warn('Failed to remove pooled worktree', { id, error });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.availableWorktrees.clear();
|
|
194
|
+
if (errors.length > 0) {
|
|
195
|
+
this.logger.warn('Pool drain completed with errors', {
|
|
196
|
+
errorCount: errors.length,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
this.logger.info('Pool drain completed successfully');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Resize the pool to new limits.
|
|
205
|
+
* Drains excess worktrees or replenishes to meet new minimum.
|
|
206
|
+
*/
|
|
207
|
+
async resize(newMinSize, newMaxSize) {
|
|
208
|
+
this.logger.info('Resizing pool', {
|
|
209
|
+
oldMin: this.config.minSize,
|
|
210
|
+
oldMax: this.config.maxSize,
|
|
211
|
+
newMin: newMinSize,
|
|
212
|
+
newMax: newMaxSize,
|
|
213
|
+
});
|
|
214
|
+
this.config.minSize = newMinSize;
|
|
215
|
+
this.config.maxSize = newMaxSize;
|
|
216
|
+
// Drain excess if needed
|
|
217
|
+
while (this.availableWorktrees.size > newMaxSize) {
|
|
218
|
+
const id = this.availableWorktrees.values().next().value;
|
|
219
|
+
if (id) {
|
|
220
|
+
this.availableWorktrees.delete(id);
|
|
221
|
+
await this.worktreeManager.remove(id, true).catch(() => { });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Replenish if needed
|
|
225
|
+
await this.replenish();
|
|
226
|
+
this.logger.info('Pool resize completed', {
|
|
227
|
+
poolSize: this.availableWorktrees.size,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get pool statistics.
|
|
232
|
+
*/
|
|
233
|
+
getStats() {
|
|
234
|
+
const total = this.hits + this.misses;
|
|
235
|
+
return {
|
|
236
|
+
available: this.availableWorktrees.size,
|
|
237
|
+
inUse: this.worktreeManager.listByStatus('active').length,
|
|
238
|
+
total: this.worktreeManager.list().length,
|
|
239
|
+
hits: this.hits,
|
|
240
|
+
misses: this.misses,
|
|
241
|
+
hitRate: total > 0 ? this.hits / total : 0,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check if pool is enabled.
|
|
246
|
+
*/
|
|
247
|
+
isEnabled() {
|
|
248
|
+
return this.config.enabled;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Check if pool is initialized.
|
|
252
|
+
*/
|
|
253
|
+
isInitialized() {
|
|
254
|
+
return this.initialized;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get pool configuration.
|
|
258
|
+
*/
|
|
259
|
+
getConfig() {
|
|
260
|
+
return { ...this.config };
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Reset pool statistics.
|
|
264
|
+
*/
|
|
265
|
+
resetStats() {
|
|
266
|
+
this.hits = 0;
|
|
267
|
+
this.misses = 0;
|
|
268
|
+
this.logger.debug('Pool stats reset');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/worktrees/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery Manager
|
|
3
|
+
*
|
|
4
|
+
* Handles startup recovery by reconciling persisted state with physical worktrees.
|
|
5
|
+
* Detects orphans, unlocks stuck worktrees, and cleans up abandoned resources.
|
|
6
|
+
*/
|
|
7
|
+
import type { Worktree } from '../types.js';
|
|
8
|
+
import type { PersistedState, PersistedWorktreeState, PersistedTaskState } from '../persistence/state-schema.js';
|
|
9
|
+
export type { PersistedState, PersistedWorktreeState, PersistedTaskState };
|
|
10
|
+
export interface OrphanedWorktree {
|
|
11
|
+
id: string;
|
|
12
|
+
path: string;
|
|
13
|
+
branch: string;
|
|
14
|
+
reason: 'no_task' | 'task_completed' | 'task_failed' | 'unknown_state';
|
|
15
|
+
physicalExists: boolean;
|
|
16
|
+
branchExists: boolean;
|
|
17
|
+
hasUncommittedChanges: boolean;
|
|
18
|
+
lastActivityAt?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface OrphanedTask {
|
|
21
|
+
taskId: string;
|
|
22
|
+
role: string;
|
|
23
|
+
status: string;
|
|
24
|
+
reason: 'no_worktree' | 'worktree_missing';
|
|
25
|
+
worktreeId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface OrphanedBranch {
|
|
28
|
+
name: string;
|
|
29
|
+
reason: 'no_worktree' | 'no_task';
|
|
30
|
+
lastCommitDate?: Date;
|
|
31
|
+
}
|
|
32
|
+
export interface ReconciliationResult {
|
|
33
|
+
orphanedWorktrees: OrphanedWorktree[];
|
|
34
|
+
orphanedTasks: OrphanedTask[];
|
|
35
|
+
orphanedBranches: OrphanedBranch[];
|
|
36
|
+
recoveredWorktrees: string[];
|
|
37
|
+
recoveredTasks: string[];
|
|
38
|
+
stuckWorktrees: string[];
|
|
39
|
+
cleanedUp: string[];
|
|
40
|
+
errors: Array<{
|
|
41
|
+
resource: string;
|
|
42
|
+
error: string;
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
export interface RecoveryOptions {
|
|
46
|
+
autoCleanOrphans: boolean;
|
|
47
|
+
maxStaleAgeMs: number;
|
|
48
|
+
preserveUncommittedChanges: boolean;
|
|
49
|
+
dryRun: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare class RecoveryManager {
|
|
52
|
+
private repoPath;
|
|
53
|
+
private worktreeBaseDir;
|
|
54
|
+
private branchPattern;
|
|
55
|
+
private git;
|
|
56
|
+
private logger;
|
|
57
|
+
constructor(repoPath: string, worktreeBaseDir?: string, branchPattern?: string);
|
|
58
|
+
/**
|
|
59
|
+
* Main recovery entry point - call on server startup
|
|
60
|
+
*/
|
|
61
|
+
recoverOnStartup(persistedState: PersistedState | null, options?: Partial<RecoveryOptions>): Promise<ReconciliationResult>;
|
|
62
|
+
/**
|
|
63
|
+
* Discover all physical worktrees in the worktree directory
|
|
64
|
+
*/
|
|
65
|
+
private discoverPhysicalWorktrees;
|
|
66
|
+
private getPhysicalWorktreeInfo;
|
|
67
|
+
/**
|
|
68
|
+
* Discover all task branches in the repository
|
|
69
|
+
*/
|
|
70
|
+
private discoverTaskBranches;
|
|
71
|
+
/**
|
|
72
|
+
* Reconcile persisted state with physical reality
|
|
73
|
+
*/
|
|
74
|
+
private reconcileWithPersistedState;
|
|
75
|
+
/**
|
|
76
|
+
* Handle case where we have no persisted state
|
|
77
|
+
*/
|
|
78
|
+
private handleNoPersistedState;
|
|
79
|
+
private isStuckState;
|
|
80
|
+
/**
|
|
81
|
+
* Clean up orphaned resources
|
|
82
|
+
*/
|
|
83
|
+
private cleanupOrphans;
|
|
84
|
+
private removeWorktree;
|
|
85
|
+
/**
|
|
86
|
+
* Unlock worktrees stuck in transitional states
|
|
87
|
+
*/
|
|
88
|
+
unlockStuckWorktrees(stuckIds: string[], worktrees: Map<string, Worktree>): Promise<string[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Prune worktrees that have been stale too long
|
|
91
|
+
*/
|
|
92
|
+
pruneStaleWorktrees(worktrees: Map<string, Worktree>, maxAgeMs?: number): Promise<string[]>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/worktrees/recovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAC;AAC5D,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,CAAC;AAM3E,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,gBAAgB,GAAG,aAAa,GAAG,eAAe,CAAC;IACvE,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,GAAG,kBAAkB,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,cAAc,CAAC,EAAE,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B,EAAE,OAAO,CAAC;IACpC,MAAM,EAAE,OAAO,CAAC;CACjB;AA8BD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,MAAM,CAAS;gBAGrB,QAAQ,EAAE,MAAM,EAChB,eAAe,GAAE,MAAmC,EACpD,aAAa,GAAE,MAAgB;IASjC;;OAEG;IACG,gBAAgB,CACpB,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAuEhC;;OAEG;YACW,yBAAyB;YA4BzB,uBAAuB;IAkCrC;;OAEG;YACW,oBAAoB;IA6BlC;;OAEG;YACW,2BAA2B;IAmFzC;;OAEG;YACW,sBAAsB;IAoCpC,OAAO,CAAC,YAAY;IAKpB;;OAEG;YACW,cAAc;YAmCd,cAAc;IAc5B;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBpB;;OAEG;IACG,mBAAmB,CACvB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAChC,QAAQ,GAAE,MAAsC,GAC/C,OAAO,CAAC,MAAM,EAAE,CAAC;CAsBrB"}
|