gthinking 1.2.1 → 2.1.1
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/.eslintrc.js +34 -0
- package/ANALYSIS_SUMMARY.md +363 -0
- package/README.md +230 -245
- package/dist/analysis/analysis-engine.d.ts +63 -0
- package/dist/analysis/analysis-engine.d.ts.map +1 -0
- package/dist/analysis/analysis-engine.js +322 -0
- package/dist/analysis/analysis-engine.js.map +1 -0
- package/dist/core/config.d.ts +1419 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +361 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/engine.d.ts +176 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +604 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/errors.d.ts +153 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +287 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/{types.js → core/index.js} +8 -4
- package/dist/core/index.js.map +1 -0
- package/dist/core/pipeline.d.ts +121 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +289 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/rate-limiter.d.ts +58 -0
- package/dist/core/rate-limiter.d.ts.map +1 -0
- package/dist/core/rate-limiter.js +133 -0
- package/dist/core/rate-limiter.js.map +1 -0
- package/dist/core/session-manager.d.ts +96 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +223 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/creativity/creativity-engine.d.ts +6 -0
- package/dist/creativity/creativity-engine.d.ts.map +1 -0
- package/dist/creativity/creativity-engine.js +17 -0
- package/dist/creativity/creativity-engine.js.map +1 -0
- package/dist/index.d.ts +24 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +130 -104
- package/dist/index.js.map +1 -1
- package/dist/learning/learning-engine.d.ts +6 -0
- package/dist/learning/learning-engine.d.ts.map +1 -0
- package/dist/learning/learning-engine.js +17 -0
- package/dist/learning/learning-engine.js.map +1 -0
- package/dist/llm/index.d.ts +10 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +26 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/llm-service.d.ts +109 -0
- package/dist/llm/llm-service.d.ts.map +1 -0
- package/dist/llm/llm-service.js +224 -0
- package/dist/llm/llm-service.js.map +1 -0
- package/dist/llm/providers/base.d.ts +85 -0
- package/dist/llm/providers/base.d.ts.map +1 -0
- package/dist/llm/providers/base.js +57 -0
- package/dist/llm/providers/base.js.map +1 -0
- package/dist/llm/providers/cli.d.ts +23 -0
- package/dist/llm/providers/cli.d.ts.map +1 -0
- package/dist/llm/providers/cli.js +158 -0
- package/dist/llm/providers/cli.js.map +1 -0
- package/dist/llm/providers/gemini.d.ts +30 -0
- package/dist/llm/providers/gemini.d.ts.map +1 -0
- package/dist/llm/providers/gemini.js +168 -0
- package/dist/llm/providers/gemini.js.map +1 -0
- package/dist/llm/sanitization.d.ts +50 -0
- package/dist/llm/sanitization.d.ts.map +1 -0
- package/dist/llm/sanitization.js +149 -0
- package/dist/llm/sanitization.js.map +1 -0
- package/dist/{server.d.ts.map → mcp/server.d.ts.map} +1 -1
- package/dist/mcp/server.js +108 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/planning/planning-engine.d.ts +6 -0
- package/dist/planning/planning-engine.d.ts.map +1 -0
- package/dist/planning/planning-engine.js +17 -0
- package/dist/planning/planning-engine.js.map +1 -0
- package/dist/reasoning/reasoning-engine.d.ts +6 -0
- package/dist/reasoning/reasoning-engine.d.ts.map +1 -0
- package/dist/reasoning/reasoning-engine.js +17 -0
- package/dist/reasoning/reasoning-engine.js.map +1 -0
- package/dist/search/search-engine.d.ts +99 -0
- package/dist/search/search-engine.d.ts.map +1 -0
- package/dist/search/search-engine.js +271 -0
- package/dist/search/search-engine.js.map +1 -0
- package/dist/synthesis/synthesis-engine.d.ts +6 -0
- package/dist/synthesis/synthesis-engine.d.ts.map +1 -0
- package/dist/synthesis/synthesis-engine.js +17 -0
- package/dist/synthesis/synthesis-engine.js.map +1 -0
- package/dist/types/analysis.d.ts +1534 -49
- package/dist/types/analysis.d.ts.map +1 -1
- package/dist/types/analysis.js +250 -0
- package/dist/types/analysis.js.map +1 -1
- package/dist/types/core.d.ts +257 -30
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js +148 -18
- package/dist/types/core.js.map +1 -1
- package/dist/types/creativity.d.ts +2871 -56
- package/dist/types/creativity.d.ts.map +1 -1
- package/dist/types/creativity.js +195 -0
- package/dist/types/creativity.js.map +1 -1
- package/dist/types/index.d.ts +6 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +17 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/learning.d.ts +851 -61
- package/dist/types/learning.d.ts.map +1 -1
- package/dist/types/learning.js +155 -0
- package/dist/types/learning.js.map +1 -1
- package/dist/types/planning.d.ts +2223 -71
- package/dist/types/planning.d.ts.map +1 -1
- package/dist/types/planning.js +190 -0
- package/dist/types/planning.js.map +1 -1
- package/dist/types/reasoning.d.ts +2209 -72
- package/dist/types/reasoning.d.ts.map +1 -1
- package/dist/types/reasoning.js +200 -1
- package/dist/types/reasoning.js.map +1 -1
- package/dist/types/search.d.ts +981 -53
- package/dist/types/search.d.ts.map +1 -1
- package/dist/types/search.js +137 -0
- package/dist/types/search.js.map +1 -1
- package/dist/types/synthesis.d.ts +583 -37
- package/dist/types/synthesis.d.ts.map +1 -1
- package/dist/types/synthesis.js +138 -0
- package/dist/types/synthesis.js.map +1 -1
- package/dist/utils/cache.d.ts +144 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +288 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/id-generator.d.ts +89 -0
- package/dist/utils/id-generator.d.ts.map +1 -0
- package/dist/utils/id-generator.js +132 -0
- package/dist/utils/id-generator.js.map +1 -0
- package/dist/utils/index.d.ts +11 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +33 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +142 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +248 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/metrics.d.ts +149 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +296 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/timer.d.ts +7 -0
- package/dist/utils/timer.d.ts.map +1 -0
- package/dist/utils/timer.js +17 -0
- package/dist/utils/timer.js.map +1 -0
- package/dist/utils/validation.d.ts +147 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +275 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/API.md +411 -0
- package/docs/ARCHITECTURE.md +271 -0
- package/docs/CHANGELOG.md +283 -0
- package/jest.config.js +28 -0
- package/package.json +43 -30
- package/src/analysis/analysis-engine.ts +383 -0
- package/src/core/config.ts +406 -0
- package/src/core/engine.ts +785 -0
- package/src/core/errors.ts +349 -0
- package/src/core/index.ts +12 -0
- package/src/core/pipeline.ts +424 -0
- package/src/core/rate-limiter.ts +155 -0
- package/src/core/session-manager.ts +269 -0
- package/src/creativity/creativity-engine.ts +14 -0
- package/src/index.ts +178 -0
- package/src/learning/learning-engine.ts +14 -0
- package/src/llm/index.ts +10 -0
- package/src/llm/llm-service.ts +285 -0
- package/src/llm/providers/base.ts +146 -0
- package/src/llm/providers/cli.ts +186 -0
- package/src/llm/providers/gemini.ts +201 -0
- package/src/llm/sanitization.ts +178 -0
- package/src/mcp/server.ts +117 -0
- package/src/planning/planning-engine.ts +14 -0
- package/src/reasoning/reasoning-engine.ts +14 -0
- package/src/search/search-engine.ts +333 -0
- package/src/synthesis/synthesis-engine.ts +14 -0
- package/src/types/analysis.ts +337 -0
- package/src/types/core.ts +342 -0
- package/src/types/creativity.ts +268 -0
- package/src/types/index.ts +31 -0
- package/src/types/learning.ts +215 -0
- package/src/types/planning.ts +251 -0
- package/src/types/reasoning.ts +288 -0
- package/src/types/search.ts +192 -0
- package/src/types/synthesis.ts +187 -0
- package/src/utils/cache.ts +363 -0
- package/src/utils/id-generator.ts +135 -0
- package/src/utils/index.ts +22 -0
- package/src/utils/logger.ts +290 -0
- package/src/utils/metrics.ts +380 -0
- package/src/utils/timer.ts +15 -0
- package/src/utils/validation.ts +297 -0
- package/tests/setup.ts +22 -0
- package/tests/unit/cache.test.ts +189 -0
- package/tests/unit/engine.test.ts +179 -0
- package/tests/unit/validation.test.ts +218 -0
- package/tsconfig.json +17 -12
- package/GEMINI.md +0 -68
- package/analysis.ts +0 -1063
- package/creativity.ts +0 -1055
- package/dist/analysis.d.ts +0 -54
- package/dist/analysis.d.ts.map +0 -1
- package/dist/analysis.js +0 -866
- package/dist/analysis.js.map +0 -1
- package/dist/creativity.d.ts +0 -81
- package/dist/creativity.d.ts.map +0 -1
- package/dist/creativity.js +0 -828
- package/dist/creativity.js.map +0 -1
- package/dist/engine.d.ts +0 -90
- package/dist/engine.d.ts.map +0 -1
- package/dist/engine.js +0 -677
- package/dist/engine.js.map +0 -1
- package/dist/examples.d.ts +0 -7
- package/dist/examples.d.ts.map +0 -1
- package/dist/examples.js +0 -506
- package/dist/examples.js.map +0 -1
- package/dist/learning.d.ts +0 -72
- package/dist/learning.d.ts.map +0 -1
- package/dist/learning.js +0 -615
- package/dist/learning.js.map +0 -1
- package/dist/llm-service.d.ts +0 -21
- package/dist/llm-service.d.ts.map +0 -1
- package/dist/llm-service.js +0 -100
- package/dist/llm-service.js.map +0 -1
- package/dist/planning.d.ts +0 -58
- package/dist/planning.d.ts.map +0 -1
- package/dist/planning.js +0 -824
- package/dist/planning.js.map +0 -1
- package/dist/reasoning.d.ts +0 -73
- package/dist/reasoning.d.ts.map +0 -1
- package/dist/reasoning.js +0 -845
- package/dist/reasoning.js.map +0 -1
- package/dist/search-discovery.d.ts +0 -73
- package/dist/search-discovery.d.ts.map +0 -1
- package/dist/search-discovery.js +0 -548
- package/dist/search-discovery.js.map +0 -1
- package/dist/server.js +0 -113
- package/dist/server.js.map +0 -1
- package/dist/types/engine.d.ts +0 -55
- package/dist/types/engine.d.ts.map +0 -1
- package/dist/types/engine.js +0 -3
- package/dist/types/engine.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/engine.ts +0 -947
- package/examples.ts +0 -717
- package/index.ts +0 -106
- package/learning.ts +0 -779
- package/llm-service.ts +0 -120
- package/planning.ts +0 -1028
- package/reasoning.ts +0 -1079
- package/search-discovery.ts +0 -700
- package/server.ts +0 -115
- package/types/analysis.ts +0 -69
- package/types/core.ts +0 -90
- package/types/creativity.ts +0 -72
- package/types/engine.ts +0 -60
- package/types/index.ts +0 -9
- package/types/learning.ts +0 -69
- package/types/planning.ts +0 -85
- package/types/reasoning.ts +0 -92
- package/types/search.ts +0 -58
- package/types/synthesis.ts +0 -42
- package/types.ts +0 -6
- /package/dist/{server.d.ts → mcp/server.d.ts} +0 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Utility for gthinking v2.0.0
|
|
3
|
+
* Performance metrics and monitoring
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
/**
|
|
7
|
+
* Metric types
|
|
8
|
+
*/
|
|
9
|
+
export type MetricType = 'counter' | 'gauge' | 'histogram' | 'timer';
|
|
10
|
+
/**
|
|
11
|
+
* Metric value type
|
|
12
|
+
*/
|
|
13
|
+
export type MetricValue = number | Record<string, number>;
|
|
14
|
+
/**
|
|
15
|
+
* Metric interface
|
|
16
|
+
*/
|
|
17
|
+
export interface Metric {
|
|
18
|
+
name: string;
|
|
19
|
+
type: MetricType;
|
|
20
|
+
value: MetricValue;
|
|
21
|
+
labels: Record<string, string>;
|
|
22
|
+
timestamp: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Timer metric interface
|
|
26
|
+
*/
|
|
27
|
+
export interface TimerMetric {
|
|
28
|
+
startTime: number;
|
|
29
|
+
endTime?: number;
|
|
30
|
+
duration?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Histogram bucket interface
|
|
34
|
+
*/
|
|
35
|
+
export interface HistogramBucket {
|
|
36
|
+
upperBound: number;
|
|
37
|
+
count: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Metrics collector class
|
|
41
|
+
*/
|
|
42
|
+
export declare class MetricsCollector extends EventEmitter {
|
|
43
|
+
private metrics;
|
|
44
|
+
private timers;
|
|
45
|
+
private histograms;
|
|
46
|
+
private enabled;
|
|
47
|
+
/**
|
|
48
|
+
* Enable or disable metrics collection
|
|
49
|
+
* @param enabled - Whether to enable metrics
|
|
50
|
+
*/
|
|
51
|
+
setEnabled(enabled: boolean): void;
|
|
52
|
+
/**
|
|
53
|
+
* Record a counter metric
|
|
54
|
+
* @param name - Metric name
|
|
55
|
+
* @param value - Counter value (default: 1)
|
|
56
|
+
* @param labels - Metric labels
|
|
57
|
+
*/
|
|
58
|
+
counter(name: string, value?: number, labels?: Record<string, string>): void;
|
|
59
|
+
/**
|
|
60
|
+
* Record a gauge metric
|
|
61
|
+
* @param name - Metric name
|
|
62
|
+
* @param value - Gauge value
|
|
63
|
+
* @param labels - Metric labels
|
|
64
|
+
*/
|
|
65
|
+
gauge(name: string, value: number, labels?: Record<string, string>): void;
|
|
66
|
+
/**
|
|
67
|
+
* Start a timer
|
|
68
|
+
* @param name - Timer name
|
|
69
|
+
* @param labels - Timer labels
|
|
70
|
+
*/
|
|
71
|
+
startTimer(name: string, labels?: Record<string, string>): string;
|
|
72
|
+
/**
|
|
73
|
+
* End a timer and record the duration
|
|
74
|
+
* @param key - Timer key returned by startTimer
|
|
75
|
+
* @returns Duration in milliseconds
|
|
76
|
+
*/
|
|
77
|
+
endTimer(key: string): number;
|
|
78
|
+
/**
|
|
79
|
+
* Record a histogram value
|
|
80
|
+
* @param name - Histogram name
|
|
81
|
+
* @param value - Value to record
|
|
82
|
+
* @param labels - Histogram labels
|
|
83
|
+
*/
|
|
84
|
+
histogram(name: string, value: number, labels?: Record<string, string>): void;
|
|
85
|
+
/**
|
|
86
|
+
* Get all metrics
|
|
87
|
+
* @returns Array of all metrics
|
|
88
|
+
*/
|
|
89
|
+
getMetrics(): Metric[];
|
|
90
|
+
/**
|
|
91
|
+
* Get metrics by name
|
|
92
|
+
* @param name - Metric name
|
|
93
|
+
* @returns Array of metrics with the given name
|
|
94
|
+
*/
|
|
95
|
+
getMetricsByName(name: string): Metric[];
|
|
96
|
+
/**
|
|
97
|
+
* Get histogram statistics
|
|
98
|
+
* @param name - Histogram name
|
|
99
|
+
* @param labels - Histogram labels
|
|
100
|
+
* @returns Histogram statistics
|
|
101
|
+
*/
|
|
102
|
+
getHistogramStats(name: string, labels?: Record<string, string>): {
|
|
103
|
+
count: number;
|
|
104
|
+
sum: number;
|
|
105
|
+
min: number;
|
|
106
|
+
max: number;
|
|
107
|
+
mean: number;
|
|
108
|
+
p50: number;
|
|
109
|
+
p95: number;
|
|
110
|
+
p99: number;
|
|
111
|
+
} | null;
|
|
112
|
+
/**
|
|
113
|
+
* Clear all metrics
|
|
114
|
+
*/
|
|
115
|
+
clear(): void;
|
|
116
|
+
/**
|
|
117
|
+
* Export metrics in Prometheus format
|
|
118
|
+
* @returns Metrics in Prometheus format
|
|
119
|
+
*/
|
|
120
|
+
exportPrometheus(): string;
|
|
121
|
+
/**
|
|
122
|
+
* Export metrics as JSON
|
|
123
|
+
* @returns Metrics as JSON object
|
|
124
|
+
*/
|
|
125
|
+
exportJSON(): Record<string, unknown>;
|
|
126
|
+
/**
|
|
127
|
+
* Generate a metric key from name and labels
|
|
128
|
+
* @param name - Metric name
|
|
129
|
+
* @param labels - Metric labels
|
|
130
|
+
* @returns Metric key
|
|
131
|
+
*/
|
|
132
|
+
private getMetricKey;
|
|
133
|
+
}
|
|
134
|
+
export declare const metricsCollector: MetricsCollector;
|
|
135
|
+
/**
|
|
136
|
+
* Decorator for timing function execution
|
|
137
|
+
* @param metricName - The metric name to use
|
|
138
|
+
* @returns Method decorator
|
|
139
|
+
*/
|
|
140
|
+
export declare function timed(metricName?: string): (target: unknown, propertyKey: string, descriptor: PropertyDescriptor) => void;
|
|
141
|
+
/**
|
|
142
|
+
* Track operation metrics
|
|
143
|
+
* @param operation - Operation name
|
|
144
|
+
* @param stage - Operation stage
|
|
145
|
+
* @param fn - Function to track
|
|
146
|
+
* @returns Function result
|
|
147
|
+
*/
|
|
148
|
+
export declare function trackOperation<T>(operation: string, stage: string, fn: () => Promise<T>): Promise<T>;
|
|
149
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Metrics Utility for gthinking v2.0.0
|
|
4
|
+
* Performance metrics and monitoring
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.metricsCollector = exports.MetricsCollector = void 0;
|
|
8
|
+
exports.timed = timed;
|
|
9
|
+
exports.trackOperation = trackOperation;
|
|
10
|
+
const events_1 = require("events");
|
|
11
|
+
const logger_1 = require("./logger");
|
|
12
|
+
const logger = new logger_1.Logger('Metrics');
|
|
13
|
+
/**
|
|
14
|
+
* Metrics collector class
|
|
15
|
+
*/
|
|
16
|
+
class MetricsCollector extends events_1.EventEmitter {
|
|
17
|
+
metrics = new Map();
|
|
18
|
+
timers = new Map();
|
|
19
|
+
histograms = new Map();
|
|
20
|
+
enabled = true;
|
|
21
|
+
/**
|
|
22
|
+
* Enable or disable metrics collection
|
|
23
|
+
* @param enabled - Whether to enable metrics
|
|
24
|
+
*/
|
|
25
|
+
setEnabled(enabled) {
|
|
26
|
+
this.enabled = enabled;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Record a counter metric
|
|
30
|
+
* @param name - Metric name
|
|
31
|
+
* @param value - Counter value (default: 1)
|
|
32
|
+
* @param labels - Metric labels
|
|
33
|
+
*/
|
|
34
|
+
counter(name, value = 1, labels = {}) {
|
|
35
|
+
if (!this.enabled)
|
|
36
|
+
return;
|
|
37
|
+
const key = this.getMetricKey(name, labels);
|
|
38
|
+
const existing = this.metrics.get(key);
|
|
39
|
+
if (existing && existing.type === 'counter') {
|
|
40
|
+
existing.value = existing.value + value;
|
|
41
|
+
existing.timestamp = Date.now();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.metrics.set(key, {
|
|
45
|
+
name,
|
|
46
|
+
type: 'counter',
|
|
47
|
+
value,
|
|
48
|
+
labels,
|
|
49
|
+
timestamp: Date.now(),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Record a gauge metric
|
|
55
|
+
* @param name - Metric name
|
|
56
|
+
* @param value - Gauge value
|
|
57
|
+
* @param labels - Metric labels
|
|
58
|
+
*/
|
|
59
|
+
gauge(name, value, labels = {}) {
|
|
60
|
+
if (!this.enabled)
|
|
61
|
+
return;
|
|
62
|
+
const key = this.getMetricKey(name, labels);
|
|
63
|
+
this.metrics.set(key, {
|
|
64
|
+
name,
|
|
65
|
+
type: 'gauge',
|
|
66
|
+
value,
|
|
67
|
+
labels,
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Start a timer
|
|
73
|
+
* @param name - Timer name
|
|
74
|
+
* @param labels - Timer labels
|
|
75
|
+
*/
|
|
76
|
+
startTimer(name, labels = {}) {
|
|
77
|
+
const key = this.getMetricKey(name, labels);
|
|
78
|
+
this.timers.set(key, { startTime: Date.now() });
|
|
79
|
+
return key;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* End a timer and record the duration
|
|
83
|
+
* @param key - Timer key returned by startTimer
|
|
84
|
+
* @returns Duration in milliseconds
|
|
85
|
+
*/
|
|
86
|
+
endTimer(key) {
|
|
87
|
+
const timer = this.timers.get(key);
|
|
88
|
+
if (!timer) {
|
|
89
|
+
logger.warn(`Timer not found: ${key}`);
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
timer.endTime = Date.now();
|
|
93
|
+
timer.duration = timer.endTime - timer.startTime;
|
|
94
|
+
this.timers.delete(key);
|
|
95
|
+
// Record as histogram
|
|
96
|
+
this.histogram(key, timer.duration);
|
|
97
|
+
return timer.duration;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Record a histogram value
|
|
101
|
+
* @param name - Histogram name
|
|
102
|
+
* @param value - Value to record
|
|
103
|
+
* @param labels - Histogram labels
|
|
104
|
+
*/
|
|
105
|
+
histogram(name, value, labels = {}) {
|
|
106
|
+
if (!this.enabled)
|
|
107
|
+
return;
|
|
108
|
+
const key = this.getMetricKey(name, labels);
|
|
109
|
+
const existing = this.histograms.get(key);
|
|
110
|
+
if (existing) {
|
|
111
|
+
existing.push(value);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
this.histograms.set(key, [value]);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get all metrics
|
|
119
|
+
* @returns Array of all metrics
|
|
120
|
+
*/
|
|
121
|
+
getMetrics() {
|
|
122
|
+
return Array.from(this.metrics.values());
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get metrics by name
|
|
126
|
+
* @param name - Metric name
|
|
127
|
+
* @returns Array of metrics with the given name
|
|
128
|
+
*/
|
|
129
|
+
getMetricsByName(name) {
|
|
130
|
+
return this.getMetrics().filter(m => m.name === name);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get histogram statistics
|
|
134
|
+
* @param name - Histogram name
|
|
135
|
+
* @param labels - Histogram labels
|
|
136
|
+
* @returns Histogram statistics
|
|
137
|
+
*/
|
|
138
|
+
getHistogramStats(name, labels = {}) {
|
|
139
|
+
const key = this.getMetricKey(name, labels);
|
|
140
|
+
const values = this.histograms.get(key);
|
|
141
|
+
if (!values || values.length === 0) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
145
|
+
const count = sorted.length;
|
|
146
|
+
const sum = sorted.reduce((a, b) => a + b, 0);
|
|
147
|
+
const min = sorted[0];
|
|
148
|
+
const max = sorted[count - 1];
|
|
149
|
+
const mean = sum / count;
|
|
150
|
+
const percentile = (p) => {
|
|
151
|
+
const index = Math.ceil((p / 100) * count) - 1;
|
|
152
|
+
return sorted[Math.max(0, index)];
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
count,
|
|
156
|
+
sum,
|
|
157
|
+
min,
|
|
158
|
+
max,
|
|
159
|
+
mean,
|
|
160
|
+
p50: percentile(50),
|
|
161
|
+
p95: percentile(95),
|
|
162
|
+
p99: percentile(99),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Clear all metrics
|
|
167
|
+
*/
|
|
168
|
+
clear() {
|
|
169
|
+
this.metrics.clear();
|
|
170
|
+
this.timers.clear();
|
|
171
|
+
this.histograms.clear();
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Export metrics in Prometheus format
|
|
175
|
+
* @returns Metrics in Prometheus format
|
|
176
|
+
*/
|
|
177
|
+
exportPrometheus() {
|
|
178
|
+
const lines = [];
|
|
179
|
+
for (const metric of this.metrics.values()) {
|
|
180
|
+
const labels = Object.entries(metric.labels)
|
|
181
|
+
.map(([k, v]) => `${k}="${v}"`)
|
|
182
|
+
.join(',');
|
|
183
|
+
const labelStr = labels ? `{${labels}}` : '';
|
|
184
|
+
lines.push(`${metric.name}${labelStr} ${metric.value}`);
|
|
185
|
+
}
|
|
186
|
+
for (const [key, values] of this.histograms.entries()) {
|
|
187
|
+
const [name, ...labelParts] = key.split(':');
|
|
188
|
+
const labels = labelParts.join(':');
|
|
189
|
+
const stats = this.getHistogramStats(name, labels ? JSON.parse(labels) : {});
|
|
190
|
+
if (stats) {
|
|
191
|
+
lines.push(`${name}_count${labels ? `{${labels}}` : ''} ${stats.count}`);
|
|
192
|
+
lines.push(`${name}_sum${labels ? `{${labels}}` : ''} ${stats.sum}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return lines.join('\n');
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Export metrics as JSON
|
|
199
|
+
* @returns Metrics as JSON object
|
|
200
|
+
*/
|
|
201
|
+
exportJSON() {
|
|
202
|
+
const result = {
|
|
203
|
+
counters: {},
|
|
204
|
+
gauges: {},
|
|
205
|
+
histograms: {},
|
|
206
|
+
timestamps: {},
|
|
207
|
+
};
|
|
208
|
+
for (const metric of this.metrics.values()) {
|
|
209
|
+
const key = this.getMetricKey(metric.name, metric.labels);
|
|
210
|
+
if (metric.type === 'counter') {
|
|
211
|
+
result.counters[key] = metric.value;
|
|
212
|
+
}
|
|
213
|
+
else if (metric.type === 'gauge') {
|
|
214
|
+
result.gauges[key] = metric.value;
|
|
215
|
+
}
|
|
216
|
+
result.timestamps[key] = metric.timestamp;
|
|
217
|
+
}
|
|
218
|
+
for (const [key, values] of this.histograms.entries()) {
|
|
219
|
+
const [name, ...labelParts] = key.split(':');
|
|
220
|
+
const labels = labelParts.join(':');
|
|
221
|
+
const stats = this.getHistogramStats(name, labels ? JSON.parse(labels) : {});
|
|
222
|
+
if (stats) {
|
|
223
|
+
result.histograms[key] = stats;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return result;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Generate a metric key from name and labels
|
|
230
|
+
* @param name - Metric name
|
|
231
|
+
* @param labels - Metric labels
|
|
232
|
+
* @returns Metric key
|
|
233
|
+
*/
|
|
234
|
+
getMetricKey(name, labels) {
|
|
235
|
+
if (Object.keys(labels).length === 0) {
|
|
236
|
+
return name;
|
|
237
|
+
}
|
|
238
|
+
return `${name}:${JSON.stringify(labels)}`;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.MetricsCollector = MetricsCollector;
|
|
242
|
+
// Export a singleton instance
|
|
243
|
+
exports.metricsCollector = new MetricsCollector();
|
|
244
|
+
/**
|
|
245
|
+
* Decorator for timing function execution
|
|
246
|
+
* @param metricName - The metric name to use
|
|
247
|
+
* @returns Method decorator
|
|
248
|
+
*/
|
|
249
|
+
function timed(metricName) {
|
|
250
|
+
return function (target, propertyKey, descriptor) {
|
|
251
|
+
const originalMethod = descriptor.value;
|
|
252
|
+
const name = metricName || `${target.constructor.name}_${propertyKey}`;
|
|
253
|
+
descriptor.value = function (...args) {
|
|
254
|
+
const timerKey = exports.metricsCollector.startTimer(name);
|
|
255
|
+
try {
|
|
256
|
+
const result = originalMethod.apply(this, args);
|
|
257
|
+
if (result instanceof Promise) {
|
|
258
|
+
return result.finally(() => {
|
|
259
|
+
exports.metricsCollector.endTimer(timerKey);
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
exports.metricsCollector.endTimer(timerKey);
|
|
264
|
+
return result;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
exports.metricsCollector.endTimer(timerKey);
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Track operation metrics
|
|
276
|
+
* @param operation - Operation name
|
|
277
|
+
* @param stage - Operation stage
|
|
278
|
+
* @param fn - Function to track
|
|
279
|
+
* @returns Function result
|
|
280
|
+
*/
|
|
281
|
+
async function trackOperation(operation, stage, fn) {
|
|
282
|
+
const timerKey = exports.metricsCollector.startTimer(`operation_${operation}`, { stage });
|
|
283
|
+
try {
|
|
284
|
+
const result = await fn();
|
|
285
|
+
exports.metricsCollector.counter(`operation_${operation}_success`, 1, { stage });
|
|
286
|
+
return result;
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
exports.metricsCollector.counter(`operation_${operation}_error`, 1, { stage });
|
|
290
|
+
throw error;
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
exports.metricsCollector.endTimer(timerKey);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../../src/utils/timer.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK;IAChB,OAAO,CAAC,KAAK,CAAS;;IAMf,OAAO,IAAI,MAAM;IAIjB,KAAK,IAAI,IAAI;CAGrB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Timer = void 0;
|
|
4
|
+
class Timer {
|
|
5
|
+
start;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.start = Date.now();
|
|
8
|
+
}
|
|
9
|
+
elapsed() {
|
|
10
|
+
return Date.now() - this.start;
|
|
11
|
+
}
|
|
12
|
+
reset() {
|
|
13
|
+
this.start = Date.now();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.Timer = Timer;
|
|
17
|
+
//# sourceMappingURL=timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.js","sourceRoot":"","sources":["../../src/utils/timer.ts"],"names":[],"mappings":";;;AAAA,MAAa,KAAK;IACR,KAAK,CAAS;IAEtB;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;IAEM,OAAO;QACZ,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IACjC,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;CACF;AAdD,sBAcC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation Utility for gthinking v2.0.0
|
|
3
|
+
* Input sanitization and validation functions
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Sanitize user input to prevent injection attacks
|
|
8
|
+
* @param input - The input string to sanitize
|
|
9
|
+
* @returns Sanitized string
|
|
10
|
+
*/
|
|
11
|
+
export declare function sanitizeInput(input: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Sanitize a string for use in shell commands
|
|
14
|
+
* @param input - The input string to sanitize
|
|
15
|
+
* @returns Shell-safe string
|
|
16
|
+
*/
|
|
17
|
+
export declare function sanitizeForShell(input: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Validate and sanitize an email address
|
|
20
|
+
* @param email - The email to validate
|
|
21
|
+
* @returns Validated email or null if invalid
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateEmail(email: string): string | null;
|
|
24
|
+
/**
|
|
25
|
+
* Validate a URL string
|
|
26
|
+
* @param url - The URL to validate
|
|
27
|
+
* @returns True if the URL is valid
|
|
28
|
+
*/
|
|
29
|
+
export declare function isValidURL(url: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Validate that a string is not empty or whitespace only
|
|
32
|
+
* @param str - The string to validate
|
|
33
|
+
* @returns True if the string has content
|
|
34
|
+
*/
|
|
35
|
+
export declare function isNonEmptyString(str: unknown): str is string;
|
|
36
|
+
/**
|
|
37
|
+
* Validate that a value is a positive integer
|
|
38
|
+
* @param value - The value to validate
|
|
39
|
+
* @returns True if the value is a positive integer
|
|
40
|
+
*/
|
|
41
|
+
export declare function isPositiveInteger(value: unknown): value is number;
|
|
42
|
+
/**
|
|
43
|
+
* Validate that a value is within a range
|
|
44
|
+
* @param value - The value to validate
|
|
45
|
+
* @param min - The minimum allowed value
|
|
46
|
+
* @param max - The maximum allowed value
|
|
47
|
+
* @returns True if the value is within the range
|
|
48
|
+
*/
|
|
49
|
+
export declare function isInRange(value: number, min: number, max: number): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Validate an array has unique elements
|
|
52
|
+
* @param arr - The array to validate
|
|
53
|
+
* @returns True if all elements are unique
|
|
54
|
+
*/
|
|
55
|
+
export declare function hasUniqueElements<T>(arr: T[]): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Safe JSON parse with error handling
|
|
58
|
+
* @param json - The JSON string to parse
|
|
59
|
+
* @returns Parsed object or null if invalid
|
|
60
|
+
*/
|
|
61
|
+
export declare function safeJsonParse<T>(json: string): T | null;
|
|
62
|
+
/**
|
|
63
|
+
* Safe JSON stringify with error handling
|
|
64
|
+
* @param obj - The object to stringify
|
|
65
|
+
* @returns JSON string or null if failed
|
|
66
|
+
*/
|
|
67
|
+
export declare function safeJsonStringify(obj: unknown): string | null;
|
|
68
|
+
/**
|
|
69
|
+
* Validate schema with detailed error messages
|
|
70
|
+
* @param schema - The Zod schema to validate against
|
|
71
|
+
* @param data - The data to validate
|
|
72
|
+
* @returns Validated data
|
|
73
|
+
* @throws ValidationError if validation fails
|
|
74
|
+
*/
|
|
75
|
+
export declare function validateSchema<T>(schema: z.ZodType<T>, data: unknown): T;
|
|
76
|
+
/**
|
|
77
|
+
* Validate schema asynchronously
|
|
78
|
+
* @param schema - The Zod schema to validate against
|
|
79
|
+
* @param data - The data to validate
|
|
80
|
+
* @returns Promise of validated data
|
|
81
|
+
* @throws ValidationError if validation fails
|
|
82
|
+
*/
|
|
83
|
+
export declare function validateSchemaAsync<T>(schema: z.ZodType<T>, data: unknown): Promise<T>;
|
|
84
|
+
/**
|
|
85
|
+
* Check if an object has all required properties
|
|
86
|
+
* @param obj - The object to check
|
|
87
|
+
* @param requiredProps - The required property names
|
|
88
|
+
* @returns True if all properties exist
|
|
89
|
+
*/
|
|
90
|
+
export declare function hasRequiredProperties<T extends object>(obj: T, requiredProps: (keyof T)[]): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Validate that a string length is within bounds
|
|
93
|
+
* @param str - The string to validate
|
|
94
|
+
* @param min - Minimum length (inclusive)
|
|
95
|
+
* @param max - Maximum length (inclusive)
|
|
96
|
+
* @returns True if the string length is valid
|
|
97
|
+
*/
|
|
98
|
+
export declare function isValidLength(str: string, min: number, max: number): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Remove null and undefined values from an object
|
|
101
|
+
* @param obj - The object to clean
|
|
102
|
+
* @returns Object with null/undefined values removed
|
|
103
|
+
*/
|
|
104
|
+
export declare function removeNullValues<T extends object>(obj: T): Partial<T>;
|
|
105
|
+
/**
|
|
106
|
+
* Deep clone an object
|
|
107
|
+
* @param obj - The object to clone
|
|
108
|
+
* @returns Deep cloned object
|
|
109
|
+
*/
|
|
110
|
+
export declare function deepClone<T>(obj: T): T;
|
|
111
|
+
/**
|
|
112
|
+
* Check if a value is a plain object
|
|
113
|
+
* @param value - The value to check
|
|
114
|
+
* @returns True if the value is a plain object
|
|
115
|
+
*/
|
|
116
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
117
|
+
/**
|
|
118
|
+
* Rate limiter for validation attempts
|
|
119
|
+
*/
|
|
120
|
+
export declare class ValidationRateLimiter {
|
|
121
|
+
private attempts;
|
|
122
|
+
private readonly maxAttempts;
|
|
123
|
+
private readonly windowMs;
|
|
124
|
+
constructor(maxAttempts?: number, windowMs?: number);
|
|
125
|
+
/**
|
|
126
|
+
* Check if a key is rate limited
|
|
127
|
+
* @param key - The key to check
|
|
128
|
+
* @returns True if the key is rate limited
|
|
129
|
+
*/
|
|
130
|
+
isRateLimited(key: string): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Record an attempt for a key
|
|
133
|
+
* @param key - The key to record
|
|
134
|
+
*/
|
|
135
|
+
recordAttempt(key: string): void;
|
|
136
|
+
/**
|
|
137
|
+
* Reset attempts for a key
|
|
138
|
+
* @param key - The key to reset
|
|
139
|
+
*/
|
|
140
|
+
reset(key: string): void;
|
|
141
|
+
/**
|
|
142
|
+
* Clear all attempts
|
|
143
|
+
*/
|
|
144
|
+
clear(): void;
|
|
145
|
+
}
|
|
146
|
+
export declare const validationRateLimiter: ValidationRateLimiter;
|
|
147
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|