attocode 0.1.2 → 0.1.4
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/CHANGELOG.md +51 -1
- package/README.md +180 -0
- package/dist/src/agent.d.ts +78 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +639 -36
- package/dist/src/agent.js.map +1 -1
- package/dist/src/analysis/feedback-loop.d.ts +115 -0
- package/dist/src/analysis/feedback-loop.d.ts.map +1 -0
- package/dist/src/analysis/feedback-loop.js +226 -0
- package/dist/src/analysis/feedback-loop.js.map +1 -0
- package/dist/src/analysis/index.d.ts +9 -0
- package/dist/src/analysis/index.d.ts.map +1 -0
- package/dist/src/analysis/index.js +9 -0
- package/dist/src/analysis/index.js.map +1 -0
- package/dist/src/analysis/prompt-templates.d.ts +36 -0
- package/dist/src/analysis/prompt-templates.d.ts.map +1 -0
- package/dist/src/analysis/prompt-templates.js +198 -0
- package/dist/src/analysis/prompt-templates.js.map +1 -0
- package/dist/src/analysis/trace-summary.d.ts +56 -0
- package/dist/src/analysis/trace-summary.d.ts.map +1 -0
- package/dist/src/analysis/trace-summary.js +261 -0
- package/dist/src/analysis/trace-summary.js.map +1 -0
- package/dist/src/commands/agents-commands.d.ts +24 -0
- package/dist/src/commands/agents-commands.d.ts.map +1 -0
- package/dist/src/commands/agents-commands.js +284 -0
- package/dist/src/commands/agents-commands.js.map +1 -0
- package/dist/src/commands/handler.d.ts.map +1 -1
- package/dist/src/commands/handler.js +329 -21
- package/dist/src/commands/handler.js.map +1 -1
- package/dist/src/commands/init-commands.d.ts +35 -0
- package/dist/src/commands/init-commands.d.ts.map +1 -0
- package/dist/src/commands/init-commands.js +187 -0
- package/dist/src/commands/init-commands.js.map +1 -0
- package/dist/src/commands/skills-commands.d.ts +26 -0
- package/dist/src/commands/skills-commands.d.ts.map +1 -0
- package/dist/src/commands/skills-commands.js +309 -0
- package/dist/src/commands/skills-commands.js.map +1 -0
- package/dist/src/commands/types.d.ts +13 -2
- package/dist/src/commands/types.d.ts.map +1 -1
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/defaults.d.ts +31 -2
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +69 -2
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/errors/index.d.ts +233 -0
- package/dist/src/errors/index.d.ts.map +1 -0
- package/dist/src/errors/index.js +427 -0
- package/dist/src/errors/index.js.map +1 -0
- package/dist/src/integrations/agent-registry.d.ts +68 -2
- package/dist/src/integrations/agent-registry.d.ts.map +1 -1
- package/dist/src/integrations/agent-registry.js +230 -23
- package/dist/src/integrations/agent-registry.js.map +1 -1
- package/dist/src/integrations/auto-compaction.d.ts +33 -0
- package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
- package/dist/src/integrations/auto-compaction.js +47 -3
- package/dist/src/integrations/auto-compaction.js.map +1 -1
- package/dist/src/integrations/cancellation.d.ts +5 -0
- package/dist/src/integrations/cancellation.d.ts.map +1 -1
- package/dist/src/integrations/cancellation.js +7 -0
- package/dist/src/integrations/cancellation.js.map +1 -1
- package/dist/src/integrations/capabilities.d.ts +160 -0
- package/dist/src/integrations/capabilities.d.ts.map +1 -0
- package/dist/src/integrations/capabilities.js +426 -0
- package/dist/src/integrations/capabilities.js.map +1 -0
- package/dist/src/integrations/context-engineering.d.ts +6 -1
- package/dist/src/integrations/context-engineering.d.ts.map +1 -1
- package/dist/src/integrations/context-engineering.js +7 -0
- package/dist/src/integrations/context-engineering.js.map +1 -1
- package/dist/src/integrations/dead-letter-queue.d.ts +208 -0
- package/dist/src/integrations/dead-letter-queue.d.ts.map +1 -0
- package/dist/src/integrations/dead-letter-queue.js +458 -0
- package/dist/src/integrations/dead-letter-queue.js.map +1 -0
- package/dist/src/integrations/health-check.d.ts +218 -0
- package/dist/src/integrations/health-check.d.ts.map +1 -0
- package/dist/src/integrations/health-check.js +400 -0
- package/dist/src/integrations/health-check.js.map +1 -0
- package/dist/src/integrations/index.d.ts +11 -2
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +19 -2
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/mcp-client.d.ts +9 -0
- package/dist/src/integrations/mcp-client.d.ts.map +1 -1
- package/dist/src/integrations/mcp-client.js +49 -7
- package/dist/src/integrations/mcp-client.js.map +1 -1
- package/dist/src/integrations/openrouter-pricing.d.ts +28 -3
- package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -1
- package/dist/src/integrations/openrouter-pricing.js +57 -16
- package/dist/src/integrations/openrouter-pricing.js.map +1 -1
- package/dist/src/integrations/retry.d.ts +131 -0
- package/dist/src/integrations/retry.d.ts.map +1 -0
- package/dist/src/integrations/retry.js +233 -0
- package/dist/src/integrations/retry.js.map +1 -0
- package/dist/src/integrations/skill-executor.d.ts +113 -0
- package/dist/src/integrations/skill-executor.d.ts.map +1 -0
- package/dist/src/integrations/skill-executor.js +270 -0
- package/dist/src/integrations/skill-executor.js.map +1 -0
- package/dist/src/integrations/skills.d.ts +98 -7
- package/dist/src/integrations/skills.d.ts.map +1 -1
- package/dist/src/integrations/skills.js +210 -11
- package/dist/src/integrations/skills.js.map +1 -1
- package/dist/src/integrations/sqlite-store.d.ts +42 -0
- package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
- package/dist/src/integrations/sqlite-store.js +111 -0
- package/dist/src/integrations/sqlite-store.js.map +1 -1
- package/dist/src/main.js +88 -7
- package/dist/src/main.js.map +1 -1
- package/dist/src/modes/repl.d.ts.map +1 -1
- package/dist/src/modes/repl.js +37 -1
- package/dist/src/modes/repl.js.map +1 -1
- package/dist/src/modes/tui.d.ts.map +1 -1
- package/dist/src/modes/tui.js +46 -5
- package/dist/src/modes/tui.js.map +1 -1
- package/dist/src/modes.d.ts.map +1 -1
- package/dist/src/modes.js +10 -3
- package/dist/src/modes.js.map +1 -1
- package/dist/src/persistence/schema.d.ts +4 -0
- package/dist/src/persistence/schema.d.ts.map +1 -1
- package/dist/src/persistence/schema.js +49 -0
- package/dist/src/persistence/schema.js.map +1 -1
- package/dist/src/providers/adapters/anthropic.d.ts +24 -2
- package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
- package/dist/src/providers/adapters/anthropic.js +184 -0
- package/dist/src/providers/adapters/anthropic.js.map +1 -1
- package/dist/src/tools/bash.d.ts.map +1 -1
- package/dist/src/tools/bash.js +7 -4
- package/dist/src/tools/bash.js.map +1 -1
- package/dist/src/tools/file.d.ts.map +1 -1
- package/dist/src/tools/file.js +31 -10
- package/dist/src/tools/file.js.map +1 -1
- package/dist/src/tools/permission.d.ts +12 -0
- package/dist/src/tools/permission.d.ts.map +1 -1
- package/dist/src/tools/permission.js +136 -0
- package/dist/src/tools/permission.js.map +1 -1
- package/dist/src/tools/registry.d.ts +23 -1
- package/dist/src/tools/registry.d.ts.map +1 -1
- package/dist/src/tools/registry.js +77 -17
- package/dist/src/tools/registry.js.map +1 -1
- package/dist/src/tools/standard.d.ts.map +1 -1
- package/dist/src/tools/standard.js +8 -0
- package/dist/src/tools/standard.js.map +1 -1
- package/dist/src/tools/types.d.ts +20 -1
- package/dist/src/tools/types.d.ts.map +1 -1
- package/dist/src/tools/types.js.map +1 -1
- package/dist/src/tracing/trace-collector.d.ts +198 -2
- package/dist/src/tracing/trace-collector.d.ts.map +1 -1
- package/dist/src/tracing/trace-collector.js +315 -3
- package/dist/src/tracing/trace-collector.js.map +1 -1
- package/dist/src/tracing/types.d.ts +470 -2
- package/dist/src/tracing/types.d.ts.map +1 -1
- package/dist/src/tracing/types.js +25 -0
- package/dist/src/tracing/types.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +292 -18
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/index.d.ts +1 -0
- package/dist/src/tui/index.d.ts.map +1 -1
- package/dist/src/tui/index.js +2 -0
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/tui/transparency-aggregator.d.ts +100 -0
- package/dist/src/tui/transparency-aggregator.d.ts.map +1 -0
- package/dist/src/tui/transparency-aggregator.js +234 -0
- package/dist/src/tui/transparency-aggregator.js.map +1 -0
- package/dist/src/types.d.ts +129 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +6 -3
- package/dist/src/hello.d.ts +0 -2
- package/dist/src/hello.d.ts.map +0 -1
- package/dist/src/hello.js +0 -4
- package/dist/src/hello.js.map +0 -1
- package/dist/src/test-sqlite.d.ts +0 -2
- package/dist/src/test-sqlite.d.ts.map +0 -1
- package/dist/src/test-sqlite.js +0 -114
- package/dist/src/test-sqlite.js.map +0 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Check System
|
|
3
|
+
*
|
|
4
|
+
* Proactively detects failing dependencies and provides health status
|
|
5
|
+
* for LLM providers, MCP servers, databases, and file system access.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const health = createHealthChecker();
|
|
10
|
+
*
|
|
11
|
+
* // Register checks
|
|
12
|
+
* health.register('llm', async () => {
|
|
13
|
+
* await provider.chat([{ role: 'user', content: 'ping' }]);
|
|
14
|
+
* return true;
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Check all
|
|
18
|
+
* const report = await health.checkAll();
|
|
19
|
+
* console.log(report.healthy ? 'All systems go!' : 'Issues detected');
|
|
20
|
+
*
|
|
21
|
+
* // Start periodic checks
|
|
22
|
+
* health.startPeriodicChecks(60000); // Every minute
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Result of a single health check.
|
|
27
|
+
*/
|
|
28
|
+
export interface HealthCheckResult {
|
|
29
|
+
/** Name of the check */
|
|
30
|
+
name: string;
|
|
31
|
+
/** Whether the check passed */
|
|
32
|
+
healthy: boolean;
|
|
33
|
+
/** Time taken for the check in ms */
|
|
34
|
+
latencyMs: number;
|
|
35
|
+
/** Error message if unhealthy */
|
|
36
|
+
error?: string;
|
|
37
|
+
/** Timestamp of the check */
|
|
38
|
+
timestamp: Date;
|
|
39
|
+
/** Additional details */
|
|
40
|
+
details?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Aggregated health report.
|
|
44
|
+
*/
|
|
45
|
+
export interface HealthReport {
|
|
46
|
+
/** Overall system health */
|
|
47
|
+
healthy: boolean;
|
|
48
|
+
/** Number of healthy checks */
|
|
49
|
+
healthyCount: number;
|
|
50
|
+
/** Total number of checks */
|
|
51
|
+
totalCount: number;
|
|
52
|
+
/** Individual check results */
|
|
53
|
+
checks: HealthCheckResult[];
|
|
54
|
+
/** Timestamp of the report */
|
|
55
|
+
timestamp: Date;
|
|
56
|
+
/** Total time to run all checks */
|
|
57
|
+
totalLatencyMs: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Health check function signature.
|
|
61
|
+
* Returns true if healthy, false or throws if unhealthy.
|
|
62
|
+
*/
|
|
63
|
+
export type HealthCheckFn = () => Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* Configuration for a health check.
|
|
66
|
+
*/
|
|
67
|
+
export interface HealthCheckConfig {
|
|
68
|
+
/** Name of the check */
|
|
69
|
+
name: string;
|
|
70
|
+
/** The check function */
|
|
71
|
+
check: HealthCheckFn;
|
|
72
|
+
/** Timeout for the check in ms (default: 5000) */
|
|
73
|
+
timeout?: number;
|
|
74
|
+
/** Whether this check is critical (default: true) */
|
|
75
|
+
critical?: boolean;
|
|
76
|
+
/** Optional description */
|
|
77
|
+
description?: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Configuration for the health checker.
|
|
81
|
+
*/
|
|
82
|
+
export interface HealthCheckerConfig {
|
|
83
|
+
/** Default timeout for checks in ms */
|
|
84
|
+
defaultTimeout?: number;
|
|
85
|
+
/** Whether to run checks in parallel (default: true) */
|
|
86
|
+
parallel?: boolean;
|
|
87
|
+
/** Callback when health status changes */
|
|
88
|
+
onStatusChange?: (name: string, healthy: boolean, previous: boolean | undefined) => void;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Health check event types.
|
|
92
|
+
*/
|
|
93
|
+
export type HealthEvent = {
|
|
94
|
+
type: 'check.started';
|
|
95
|
+
name: string;
|
|
96
|
+
} | {
|
|
97
|
+
type: 'check.completed';
|
|
98
|
+
name: string;
|
|
99
|
+
result: HealthCheckResult;
|
|
100
|
+
} | {
|
|
101
|
+
type: 'status.changed';
|
|
102
|
+
name: string;
|
|
103
|
+
healthy: boolean;
|
|
104
|
+
previous: boolean | undefined;
|
|
105
|
+
} | {
|
|
106
|
+
type: 'report.generated';
|
|
107
|
+
report: HealthReport;
|
|
108
|
+
};
|
|
109
|
+
export type HealthEventListener = (event: HealthEvent) => void;
|
|
110
|
+
/**
|
|
111
|
+
* Manages health checks for system dependencies.
|
|
112
|
+
*/
|
|
113
|
+
export declare class HealthChecker {
|
|
114
|
+
private checks;
|
|
115
|
+
private lastResults;
|
|
116
|
+
private listeners;
|
|
117
|
+
private periodicInterval?;
|
|
118
|
+
private config;
|
|
119
|
+
constructor(config?: HealthCheckerConfig);
|
|
120
|
+
/**
|
|
121
|
+
* Register a health check.
|
|
122
|
+
*/
|
|
123
|
+
register(name: string, check: HealthCheckFn, options?: Partial<Omit<HealthCheckConfig, 'name' | 'check'>>): void;
|
|
124
|
+
/**
|
|
125
|
+
* Unregister a health check.
|
|
126
|
+
*/
|
|
127
|
+
unregister(name: string): boolean;
|
|
128
|
+
/**
|
|
129
|
+
* Run a single health check.
|
|
130
|
+
*/
|
|
131
|
+
check(name: string): Promise<HealthCheckResult>;
|
|
132
|
+
/**
|
|
133
|
+
* Run all health checks.
|
|
134
|
+
*/
|
|
135
|
+
checkAll(): Promise<HealthReport>;
|
|
136
|
+
/**
|
|
137
|
+
* Get the last result for a check.
|
|
138
|
+
*/
|
|
139
|
+
getLastResult(name: string): HealthCheckResult | undefined;
|
|
140
|
+
/**
|
|
141
|
+
* Get all last results.
|
|
142
|
+
*/
|
|
143
|
+
getAllLastResults(): Map<string, HealthCheckResult>;
|
|
144
|
+
/**
|
|
145
|
+
* Check if system is healthy based on last results.
|
|
146
|
+
* Returns true if all critical checks passed.
|
|
147
|
+
*/
|
|
148
|
+
isHealthy(): boolean;
|
|
149
|
+
/**
|
|
150
|
+
* Get list of unhealthy checks.
|
|
151
|
+
*/
|
|
152
|
+
getUnhealthyChecks(): string[];
|
|
153
|
+
/**
|
|
154
|
+
* Start periodic health checks.
|
|
155
|
+
*/
|
|
156
|
+
startPeriodicChecks(intervalMs: number): void;
|
|
157
|
+
/**
|
|
158
|
+
* Stop periodic health checks.
|
|
159
|
+
*/
|
|
160
|
+
stopPeriodicChecks(): void;
|
|
161
|
+
/**
|
|
162
|
+
* Add an event listener.
|
|
163
|
+
*/
|
|
164
|
+
on(listener: HealthEventListener): () => void;
|
|
165
|
+
private emit;
|
|
166
|
+
/**
|
|
167
|
+
* Get registered check names.
|
|
168
|
+
*/
|
|
169
|
+
getCheckNames(): string[];
|
|
170
|
+
/**
|
|
171
|
+
* Cleanup resources.
|
|
172
|
+
*/
|
|
173
|
+
dispose(): void;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Create a health checker instance.
|
|
177
|
+
*/
|
|
178
|
+
export declare function createHealthChecker(config?: HealthCheckerConfig): HealthChecker;
|
|
179
|
+
/**
|
|
180
|
+
* Create a health check for an LLM provider.
|
|
181
|
+
* Uses a minimal ping request to verify connectivity.
|
|
182
|
+
*/
|
|
183
|
+
export declare function createProviderHealthCheck(provider: {
|
|
184
|
+
chat: (messages: Array<{
|
|
185
|
+
role: string;
|
|
186
|
+
content: string;
|
|
187
|
+
}>) => Promise<unknown>;
|
|
188
|
+
}, providerName?: string): HealthCheckConfig;
|
|
189
|
+
/**
|
|
190
|
+
* Create a health check for file system access.
|
|
191
|
+
*/
|
|
192
|
+
export declare function createFileSystemHealthCheck(path?: string): HealthCheckConfig;
|
|
193
|
+
/**
|
|
194
|
+
* Create a health check for SQLite database.
|
|
195
|
+
*/
|
|
196
|
+
export declare function createSQLiteHealthCheck(dbPath: string): HealthCheckConfig;
|
|
197
|
+
/**
|
|
198
|
+
* Create a health check for MCP server connectivity.
|
|
199
|
+
*/
|
|
200
|
+
export declare function createMCPHealthCheck(mcpClient: {
|
|
201
|
+
listServers: () => Array<{
|
|
202
|
+
name: string;
|
|
203
|
+
status: string;
|
|
204
|
+
}>;
|
|
205
|
+
}, serverName?: string): HealthCheckConfig;
|
|
206
|
+
/**
|
|
207
|
+
* Create a health check for network connectivity.
|
|
208
|
+
*/
|
|
209
|
+
export declare function createNetworkHealthCheck(testUrl?: string): HealthCheckConfig;
|
|
210
|
+
/**
|
|
211
|
+
* Format health report for display.
|
|
212
|
+
*/
|
|
213
|
+
export declare function formatHealthReport(report: HealthReport): string;
|
|
214
|
+
/**
|
|
215
|
+
* Format health report as JSON for APIs.
|
|
216
|
+
*/
|
|
217
|
+
export declare function healthReportToJSON(report: HealthReport): Record<string, unknown>;
|
|
218
|
+
//# sourceMappingURL=health-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../../src/integrations/health-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Check System
|
|
3
|
+
*
|
|
4
|
+
* Proactively detects failing dependencies and provides health status
|
|
5
|
+
* for LLM providers, MCP servers, databases, and file system access.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const health = createHealthChecker();
|
|
10
|
+
*
|
|
11
|
+
* // Register checks
|
|
12
|
+
* health.register('llm', async () => {
|
|
13
|
+
* await provider.chat([{ role: 'user', content: 'ping' }]);
|
|
14
|
+
* return true;
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Check all
|
|
18
|
+
* const report = await health.checkAll();
|
|
19
|
+
* console.log(report.healthy ? 'All systems go!' : 'Issues detected');
|
|
20
|
+
*
|
|
21
|
+
* // Start periodic checks
|
|
22
|
+
* health.startPeriodicChecks(60000); // Every minute
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// HEALTH CHECKER IMPLEMENTATION
|
|
27
|
+
// =============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Manages health checks for system dependencies.
|
|
30
|
+
*/
|
|
31
|
+
export class HealthChecker {
|
|
32
|
+
checks = new Map();
|
|
33
|
+
lastResults = new Map();
|
|
34
|
+
listeners = new Set();
|
|
35
|
+
periodicInterval;
|
|
36
|
+
config;
|
|
37
|
+
constructor(config = {}) {
|
|
38
|
+
this.config = {
|
|
39
|
+
defaultTimeout: config.defaultTimeout ?? 5000,
|
|
40
|
+
parallel: config.parallel ?? true,
|
|
41
|
+
onStatusChange: config.onStatusChange ?? (() => { }),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Register a health check.
|
|
46
|
+
*/
|
|
47
|
+
register(name, check, options) {
|
|
48
|
+
this.checks.set(name, {
|
|
49
|
+
name,
|
|
50
|
+
check,
|
|
51
|
+
timeout: options?.timeout ?? this.config.defaultTimeout,
|
|
52
|
+
critical: options?.critical ?? true,
|
|
53
|
+
description: options?.description,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Unregister a health check.
|
|
58
|
+
*/
|
|
59
|
+
unregister(name) {
|
|
60
|
+
this.lastResults.delete(name);
|
|
61
|
+
return this.checks.delete(name);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Run a single health check.
|
|
65
|
+
*/
|
|
66
|
+
async check(name) {
|
|
67
|
+
const config = this.checks.get(name);
|
|
68
|
+
if (!config) {
|
|
69
|
+
return {
|
|
70
|
+
name,
|
|
71
|
+
healthy: false,
|
|
72
|
+
latencyMs: 0,
|
|
73
|
+
error: `Health check not found: ${name}`,
|
|
74
|
+
timestamp: new Date(),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
this.emit({ type: 'check.started', name });
|
|
78
|
+
const start = Date.now();
|
|
79
|
+
let result;
|
|
80
|
+
try {
|
|
81
|
+
const healthy = await Promise.race([
|
|
82
|
+
config.check(),
|
|
83
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timeout')), config.timeout)),
|
|
84
|
+
]);
|
|
85
|
+
result = {
|
|
86
|
+
name,
|
|
87
|
+
healthy: healthy === true,
|
|
88
|
+
latencyMs: Date.now() - start,
|
|
89
|
+
timestamp: new Date(),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
result = {
|
|
94
|
+
name,
|
|
95
|
+
healthy: false,
|
|
96
|
+
latencyMs: Date.now() - start,
|
|
97
|
+
error: error.message,
|
|
98
|
+
timestamp: new Date(),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Check for status change
|
|
102
|
+
const previous = this.lastResults.get(name);
|
|
103
|
+
if (previous?.healthy !== result.healthy) {
|
|
104
|
+
this.emit({ type: 'status.changed', name, healthy: result.healthy, previous: previous?.healthy });
|
|
105
|
+
this.config.onStatusChange(name, result.healthy, previous?.healthy);
|
|
106
|
+
}
|
|
107
|
+
this.lastResults.set(name, result);
|
|
108
|
+
this.emit({ type: 'check.completed', name, result });
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Run all health checks.
|
|
113
|
+
*/
|
|
114
|
+
async checkAll() {
|
|
115
|
+
const start = Date.now();
|
|
116
|
+
const checkNames = Array.from(this.checks.keys());
|
|
117
|
+
let results;
|
|
118
|
+
if (this.config.parallel) {
|
|
119
|
+
results = await Promise.all(checkNames.map(name => this.check(name)));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
results = [];
|
|
123
|
+
for (const name of checkNames) {
|
|
124
|
+
results.push(await this.check(name));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const healthyCount = results.filter(r => r.healthy).length;
|
|
128
|
+
const report = {
|
|
129
|
+
healthy: healthyCount === results.length,
|
|
130
|
+
healthyCount,
|
|
131
|
+
totalCount: results.length,
|
|
132
|
+
checks: results,
|
|
133
|
+
timestamp: new Date(),
|
|
134
|
+
totalLatencyMs: Date.now() - start,
|
|
135
|
+
};
|
|
136
|
+
this.emit({ type: 'report.generated', report });
|
|
137
|
+
return report;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the last result for a check.
|
|
141
|
+
*/
|
|
142
|
+
getLastResult(name) {
|
|
143
|
+
return this.lastResults.get(name);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get all last results.
|
|
147
|
+
*/
|
|
148
|
+
getAllLastResults() {
|
|
149
|
+
return new Map(this.lastResults);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Check if system is healthy based on last results.
|
|
153
|
+
* Returns true if all critical checks passed.
|
|
154
|
+
*/
|
|
155
|
+
isHealthy() {
|
|
156
|
+
for (const [name, config] of this.checks) {
|
|
157
|
+
const result = this.lastResults.get(name);
|
|
158
|
+
if (config.critical && (!result || !result.healthy)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get list of unhealthy checks.
|
|
166
|
+
*/
|
|
167
|
+
getUnhealthyChecks() {
|
|
168
|
+
const unhealthy = [];
|
|
169
|
+
for (const [name, result] of this.lastResults) {
|
|
170
|
+
if (!result.healthy) {
|
|
171
|
+
unhealthy.push(name);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return unhealthy;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Start periodic health checks.
|
|
178
|
+
*/
|
|
179
|
+
startPeriodicChecks(intervalMs) {
|
|
180
|
+
this.stopPeriodicChecks();
|
|
181
|
+
this.periodicInterval = setInterval(() => {
|
|
182
|
+
this.checkAll().catch(err => {
|
|
183
|
+
console.error('[HealthChecker] Periodic check failed:', err);
|
|
184
|
+
});
|
|
185
|
+
}, intervalMs);
|
|
186
|
+
// Run initial check
|
|
187
|
+
this.checkAll().catch(err => {
|
|
188
|
+
console.error('[HealthChecker] Initial check failed:', err);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Stop periodic health checks.
|
|
193
|
+
*/
|
|
194
|
+
stopPeriodicChecks() {
|
|
195
|
+
if (this.periodicInterval) {
|
|
196
|
+
clearInterval(this.periodicInterval);
|
|
197
|
+
this.periodicInterval = undefined;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Add an event listener.
|
|
202
|
+
*/
|
|
203
|
+
on(listener) {
|
|
204
|
+
this.listeners.add(listener);
|
|
205
|
+
return () => this.listeners.delete(listener);
|
|
206
|
+
}
|
|
207
|
+
emit(event) {
|
|
208
|
+
for (const listener of this.listeners) {
|
|
209
|
+
try {
|
|
210
|
+
listener(event);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Ignore listener errors
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get registered check names.
|
|
219
|
+
*/
|
|
220
|
+
getCheckNames() {
|
|
221
|
+
return Array.from(this.checks.keys());
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Cleanup resources.
|
|
225
|
+
*/
|
|
226
|
+
dispose() {
|
|
227
|
+
this.stopPeriodicChecks();
|
|
228
|
+
this.checks.clear();
|
|
229
|
+
this.lastResults.clear();
|
|
230
|
+
this.listeners.clear();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// =============================================================================
|
|
234
|
+
// FACTORY FUNCTIONS
|
|
235
|
+
// =============================================================================
|
|
236
|
+
/**
|
|
237
|
+
* Create a health checker instance.
|
|
238
|
+
*/
|
|
239
|
+
export function createHealthChecker(config) {
|
|
240
|
+
return new HealthChecker(config);
|
|
241
|
+
}
|
|
242
|
+
// =============================================================================
|
|
243
|
+
// BUILT-IN HEALTH CHECKS
|
|
244
|
+
// =============================================================================
|
|
245
|
+
/**
|
|
246
|
+
* Create a health check for an LLM provider.
|
|
247
|
+
* Uses a minimal ping request to verify connectivity.
|
|
248
|
+
*/
|
|
249
|
+
export function createProviderHealthCheck(provider, providerName = 'llm') {
|
|
250
|
+
return {
|
|
251
|
+
name: providerName,
|
|
252
|
+
description: `LLM provider health check for ${providerName}`,
|
|
253
|
+
timeout: 10000,
|
|
254
|
+
critical: true,
|
|
255
|
+
check: async () => {
|
|
256
|
+
// Send minimal request to verify provider is responsive
|
|
257
|
+
const response = await provider.chat([
|
|
258
|
+
{ role: 'user', content: 'ping' },
|
|
259
|
+
]);
|
|
260
|
+
return response !== null && response !== undefined;
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Create a health check for file system access.
|
|
266
|
+
*/
|
|
267
|
+
export function createFileSystemHealthCheck(path = '/tmp') {
|
|
268
|
+
return {
|
|
269
|
+
name: 'filesystem',
|
|
270
|
+
description: 'File system write access check',
|
|
271
|
+
timeout: 2000,
|
|
272
|
+
critical: true,
|
|
273
|
+
check: async () => {
|
|
274
|
+
const { writeFile, unlink, access, constants } = await import('node:fs/promises');
|
|
275
|
+
const testPath = `${path}/.health-check-${Date.now()}`;
|
|
276
|
+
try {
|
|
277
|
+
// Check write access by creating and deleting a temp file
|
|
278
|
+
await writeFile(testPath, 'health-check');
|
|
279
|
+
await access(testPath, constants.R_OK | constants.W_OK);
|
|
280
|
+
await unlink(testPath);
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Create a health check for SQLite database.
|
|
291
|
+
*/
|
|
292
|
+
export function createSQLiteHealthCheck(dbPath) {
|
|
293
|
+
return {
|
|
294
|
+
name: 'sqlite',
|
|
295
|
+
description: `SQLite database health check for ${dbPath}`,
|
|
296
|
+
timeout: 3000,
|
|
297
|
+
critical: false, // Non-critical - agent can work without persistence
|
|
298
|
+
check: async () => {
|
|
299
|
+
const { existsSync } = await import('node:fs');
|
|
300
|
+
const { access, constants } = await import('node:fs/promises');
|
|
301
|
+
if (!existsSync(dbPath)) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
try {
|
|
305
|
+
await access(dbPath, constants.R_OK | constants.W_OK);
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Create a health check for MCP server connectivity.
|
|
316
|
+
*/
|
|
317
|
+
export function createMCPHealthCheck(mcpClient, serverName) {
|
|
318
|
+
return {
|
|
319
|
+
name: serverName ? `mcp:${serverName}` : 'mcp',
|
|
320
|
+
description: serverName
|
|
321
|
+
? `MCP server health check for ${serverName}`
|
|
322
|
+
: 'MCP servers health check',
|
|
323
|
+
timeout: 5000,
|
|
324
|
+
critical: false, // Non-critical - agent can work without MCP
|
|
325
|
+
check: async () => {
|
|
326
|
+
const servers = mcpClient.listServers();
|
|
327
|
+
if (serverName) {
|
|
328
|
+
const server = servers.find(s => s.name === serverName);
|
|
329
|
+
return server?.status === 'connected';
|
|
330
|
+
}
|
|
331
|
+
// At least one server should be connected
|
|
332
|
+
return servers.some(s => s.status === 'connected');
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Create a health check for network connectivity.
|
|
338
|
+
*/
|
|
339
|
+
export function createNetworkHealthCheck(testUrl = 'https://api.anthropic.com') {
|
|
340
|
+
return {
|
|
341
|
+
name: 'network',
|
|
342
|
+
description: 'Network connectivity check',
|
|
343
|
+
timeout: 5000,
|
|
344
|
+
critical: true,
|
|
345
|
+
check: async () => {
|
|
346
|
+
try {
|
|
347
|
+
const response = await fetch(testUrl, {
|
|
348
|
+
method: 'HEAD',
|
|
349
|
+
signal: AbortSignal.timeout(4000),
|
|
350
|
+
});
|
|
351
|
+
return response.status < 500;
|
|
352
|
+
}
|
|
353
|
+
catch {
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
// =============================================================================
|
|
360
|
+
// FORMATTING
|
|
361
|
+
// =============================================================================
|
|
362
|
+
/**
|
|
363
|
+
* Format health report for display.
|
|
364
|
+
*/
|
|
365
|
+
export function formatHealthReport(report) {
|
|
366
|
+
const lines = [];
|
|
367
|
+
const statusIcon = report.healthy ? '✓' : '✗';
|
|
368
|
+
const statusText = report.healthy ? 'HEALTHY' : 'UNHEALTHY';
|
|
369
|
+
lines.push(`${statusIcon} System Status: ${statusText}`);
|
|
370
|
+
lines.push(` Checks: ${report.healthyCount}/${report.totalCount} passing`);
|
|
371
|
+
lines.push(` Total latency: ${report.totalLatencyMs}ms`);
|
|
372
|
+
lines.push('');
|
|
373
|
+
for (const check of report.checks) {
|
|
374
|
+
const icon = check.healthy ? '✓' : '✗';
|
|
375
|
+
const latency = `${check.latencyMs}ms`;
|
|
376
|
+
const error = check.error ? ` - ${check.error}` : '';
|
|
377
|
+
lines.push(` ${icon} ${check.name}: ${latency}${error}`);
|
|
378
|
+
}
|
|
379
|
+
return lines.join('\n');
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Format health report as JSON for APIs.
|
|
383
|
+
*/
|
|
384
|
+
export function healthReportToJSON(report) {
|
|
385
|
+
return {
|
|
386
|
+
status: report.healthy ? 'healthy' : 'unhealthy',
|
|
387
|
+
healthyCount: report.healthyCount,
|
|
388
|
+
totalCount: report.totalCount,
|
|
389
|
+
timestamp: report.timestamp.toISOString(),
|
|
390
|
+
totalLatencyMs: report.totalLatencyMs,
|
|
391
|
+
checks: report.checks.map(check => ({
|
|
392
|
+
name: check.name,
|
|
393
|
+
status: check.healthy ? 'pass' : 'fail',
|
|
394
|
+
latencyMs: check.latencyMs,
|
|
395
|
+
error: check.error,
|
|
396
|
+
timestamp: check.timestamp.toISOString(),
|
|
397
|
+
})),
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=health-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-check.js","sourceRoot":"","sources":["../../../src/integrations/health-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAuGH,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC9C,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;IACnD,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,gBAAgB,CAAkC;IAClD,MAAM,CAAgC;IAE9C,YAAY,SAA8B,EAAE;QAC1C,IAAI,CAAC,MAAM,GAAG;YACZ,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI;YAC7C,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI;YACjC,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SACpD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY,EAAE,KAAoB,EAAE,OAA4D;QACvG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;YACpB,IAAI;YACJ,KAAK;YACL,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc;YACvD,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;YACnC,WAAW,EAAE,OAAO,EAAE,WAAW;SAClC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,IAAI;gBACJ,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,KAAK,EAAE,2BAA2B,IAAI,EAAE;gBACxC,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,MAAyB,CAAC;QAE9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjC,MAAM,CAAC,KAAK,EAAE;gBACd,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAC5E;aACF,CAAC,CAAC;YAEH,MAAM,GAAG;gBACP,IAAI;gBACJ,OAAO,EAAE,OAAO,KAAK,IAAI;gBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC7B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG;gBACP,IAAI;gBACJ,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;gBAC7B,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAClG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAElD,IAAI,OAA4B,CAAC;QAEjC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAE3D,MAAM,MAAM,GAAiB;YAC3B,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM;YACxC,YAAY;YACZ,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SACnC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC;QAEhD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,UAAkB;QACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAC1B,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,UAAU,CAAC,CAAC;QAEf,oBAAoB;QACpB,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,EAAE,CAAC,QAA6B;QAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAEO,IAAI,CAAC,KAAkB;QAC7B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,yBAAyB;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAED,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAA4B;IAC9D,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAA4F,EAC5F,eAAuB,KAAK;IAE5B,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,iCAAiC,YAAY,EAAE;QAC5D,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,wDAAwD;YACxD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;aAClC,CAAC,CAAC;YACH,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CACzC,OAAe,MAAM;IAErB,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,gCAAgC;QAC7C,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAClF,MAAM,QAAQ,GAAG,GAAG,IAAI,kBAAkB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAEvD,IAAI,CAAC;gBACH,0DAA0D;gBAC1D,MAAM,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAC1C,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBACxD,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAc;IAEd,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,oCAAoC,MAAM,EAAE;QACzD,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK,EAAE,oDAAoD;QACrE,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAE/D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC;YACf,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBACtD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAEC,EACD,UAAmB;IAEnB,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK;QAC9C,WAAW,EAAE,UAAU;YACrB,CAAC,CAAC,+BAA+B,UAAU,EAAE;YAC7C,CAAC,CAAC,0BAA0B;QAC9B,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,KAAK,EAAE,4CAA4C;QAC7D,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;YAExC,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;gBACxD,OAAO,MAAM,EAAE,MAAM,KAAK,WAAW,CAAC;YACxC,CAAC;YAED,0CAA0C;YAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAkB,2BAA2B;IAE7C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,4BAA4B;QACzC,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;oBACpC,MAAM,EAAE,MAAM;oBACd,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;iBAClC,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;IAE5D,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,mBAAmB,UAAU,EAAE,CAAC,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,UAAU,CAAC,CAAC;IAC5E,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;QAChD,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;QACzC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACvC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;SACzC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|