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.
Files changed (271) hide show
  1. package/.eslintrc.js +34 -0
  2. package/ANALYSIS_SUMMARY.md +363 -0
  3. package/README.md +230 -245
  4. package/dist/analysis/analysis-engine.d.ts +63 -0
  5. package/dist/analysis/analysis-engine.d.ts.map +1 -0
  6. package/dist/analysis/analysis-engine.js +322 -0
  7. package/dist/analysis/analysis-engine.js.map +1 -0
  8. package/dist/core/config.d.ts +1419 -0
  9. package/dist/core/config.d.ts.map +1 -0
  10. package/dist/core/config.js +361 -0
  11. package/dist/core/config.js.map +1 -0
  12. package/dist/core/engine.d.ts +176 -0
  13. package/dist/core/engine.d.ts.map +1 -0
  14. package/dist/core/engine.js +604 -0
  15. package/dist/core/engine.js.map +1 -0
  16. package/dist/core/errors.d.ts +153 -0
  17. package/dist/core/errors.d.ts.map +1 -0
  18. package/dist/core/errors.js +287 -0
  19. package/dist/core/errors.js.map +1 -0
  20. package/dist/core/index.d.ts +7 -0
  21. package/dist/core/index.d.ts.map +1 -0
  22. package/dist/{types.js → core/index.js} +8 -4
  23. package/dist/core/index.js.map +1 -0
  24. package/dist/core/pipeline.d.ts +121 -0
  25. package/dist/core/pipeline.d.ts.map +1 -0
  26. package/dist/core/pipeline.js +289 -0
  27. package/dist/core/pipeline.js.map +1 -0
  28. package/dist/core/rate-limiter.d.ts +58 -0
  29. package/dist/core/rate-limiter.d.ts.map +1 -0
  30. package/dist/core/rate-limiter.js +133 -0
  31. package/dist/core/rate-limiter.js.map +1 -0
  32. package/dist/core/session-manager.d.ts +96 -0
  33. package/dist/core/session-manager.d.ts.map +1 -0
  34. package/dist/core/session-manager.js +223 -0
  35. package/dist/core/session-manager.js.map +1 -0
  36. package/dist/creativity/creativity-engine.d.ts +6 -0
  37. package/dist/creativity/creativity-engine.d.ts.map +1 -0
  38. package/dist/creativity/creativity-engine.js +17 -0
  39. package/dist/creativity/creativity-engine.js.map +1 -0
  40. package/dist/index.d.ts +24 -32
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +130 -104
  43. package/dist/index.js.map +1 -1
  44. package/dist/learning/learning-engine.d.ts +6 -0
  45. package/dist/learning/learning-engine.d.ts.map +1 -0
  46. package/dist/learning/learning-engine.js +17 -0
  47. package/dist/learning/learning-engine.js.map +1 -0
  48. package/dist/llm/index.d.ts +10 -0
  49. package/dist/llm/index.d.ts.map +1 -0
  50. package/dist/llm/index.js +26 -0
  51. package/dist/llm/index.js.map +1 -0
  52. package/dist/llm/llm-service.d.ts +109 -0
  53. package/dist/llm/llm-service.d.ts.map +1 -0
  54. package/dist/llm/llm-service.js +224 -0
  55. package/dist/llm/llm-service.js.map +1 -0
  56. package/dist/llm/providers/base.d.ts +85 -0
  57. package/dist/llm/providers/base.d.ts.map +1 -0
  58. package/dist/llm/providers/base.js +57 -0
  59. package/dist/llm/providers/base.js.map +1 -0
  60. package/dist/llm/providers/cli.d.ts +23 -0
  61. package/dist/llm/providers/cli.d.ts.map +1 -0
  62. package/dist/llm/providers/cli.js +158 -0
  63. package/dist/llm/providers/cli.js.map +1 -0
  64. package/dist/llm/providers/gemini.d.ts +30 -0
  65. package/dist/llm/providers/gemini.d.ts.map +1 -0
  66. package/dist/llm/providers/gemini.js +168 -0
  67. package/dist/llm/providers/gemini.js.map +1 -0
  68. package/dist/llm/sanitization.d.ts +50 -0
  69. package/dist/llm/sanitization.d.ts.map +1 -0
  70. package/dist/llm/sanitization.js +149 -0
  71. package/dist/llm/sanitization.js.map +1 -0
  72. package/dist/{server.d.ts.map → mcp/server.d.ts.map} +1 -1
  73. package/dist/mcp/server.js +108 -0
  74. package/dist/mcp/server.js.map +1 -0
  75. package/dist/planning/planning-engine.d.ts +6 -0
  76. package/dist/planning/planning-engine.d.ts.map +1 -0
  77. package/dist/planning/planning-engine.js +17 -0
  78. package/dist/planning/planning-engine.js.map +1 -0
  79. package/dist/reasoning/reasoning-engine.d.ts +6 -0
  80. package/dist/reasoning/reasoning-engine.d.ts.map +1 -0
  81. package/dist/reasoning/reasoning-engine.js +17 -0
  82. package/dist/reasoning/reasoning-engine.js.map +1 -0
  83. package/dist/search/search-engine.d.ts +99 -0
  84. package/dist/search/search-engine.d.ts.map +1 -0
  85. package/dist/search/search-engine.js +271 -0
  86. package/dist/search/search-engine.js.map +1 -0
  87. package/dist/synthesis/synthesis-engine.d.ts +6 -0
  88. package/dist/synthesis/synthesis-engine.d.ts.map +1 -0
  89. package/dist/synthesis/synthesis-engine.js +17 -0
  90. package/dist/synthesis/synthesis-engine.js.map +1 -0
  91. package/dist/types/analysis.d.ts +1534 -49
  92. package/dist/types/analysis.d.ts.map +1 -1
  93. package/dist/types/analysis.js +250 -0
  94. package/dist/types/analysis.js.map +1 -1
  95. package/dist/types/core.d.ts +257 -30
  96. package/dist/types/core.d.ts.map +1 -1
  97. package/dist/types/core.js +148 -18
  98. package/dist/types/core.js.map +1 -1
  99. package/dist/types/creativity.d.ts +2871 -56
  100. package/dist/types/creativity.d.ts.map +1 -1
  101. package/dist/types/creativity.js +195 -0
  102. package/dist/types/creativity.js.map +1 -1
  103. package/dist/types/index.d.ts +6 -2
  104. package/dist/types/index.d.ts.map +1 -1
  105. package/dist/types/index.js +17 -2
  106. package/dist/types/index.js.map +1 -1
  107. package/dist/types/learning.d.ts +851 -61
  108. package/dist/types/learning.d.ts.map +1 -1
  109. package/dist/types/learning.js +155 -0
  110. package/dist/types/learning.js.map +1 -1
  111. package/dist/types/planning.d.ts +2223 -71
  112. package/dist/types/planning.d.ts.map +1 -1
  113. package/dist/types/planning.js +190 -0
  114. package/dist/types/planning.js.map +1 -1
  115. package/dist/types/reasoning.d.ts +2209 -72
  116. package/dist/types/reasoning.d.ts.map +1 -1
  117. package/dist/types/reasoning.js +200 -1
  118. package/dist/types/reasoning.js.map +1 -1
  119. package/dist/types/search.d.ts +981 -53
  120. package/dist/types/search.d.ts.map +1 -1
  121. package/dist/types/search.js +137 -0
  122. package/dist/types/search.js.map +1 -1
  123. package/dist/types/synthesis.d.ts +583 -37
  124. package/dist/types/synthesis.d.ts.map +1 -1
  125. package/dist/types/synthesis.js +138 -0
  126. package/dist/types/synthesis.js.map +1 -1
  127. package/dist/utils/cache.d.ts +144 -0
  128. package/dist/utils/cache.d.ts.map +1 -0
  129. package/dist/utils/cache.js +288 -0
  130. package/dist/utils/cache.js.map +1 -0
  131. package/dist/utils/id-generator.d.ts +89 -0
  132. package/dist/utils/id-generator.d.ts.map +1 -0
  133. package/dist/utils/id-generator.js +132 -0
  134. package/dist/utils/id-generator.js.map +1 -0
  135. package/dist/utils/index.d.ts +11 -0
  136. package/dist/utils/index.d.ts.map +1 -0
  137. package/dist/utils/index.js +33 -0
  138. package/dist/utils/index.js.map +1 -0
  139. package/dist/utils/logger.d.ts +142 -0
  140. package/dist/utils/logger.d.ts.map +1 -0
  141. package/dist/utils/logger.js +248 -0
  142. package/dist/utils/logger.js.map +1 -0
  143. package/dist/utils/metrics.d.ts +149 -0
  144. package/dist/utils/metrics.d.ts.map +1 -0
  145. package/dist/utils/metrics.js +296 -0
  146. package/dist/utils/metrics.js.map +1 -0
  147. package/dist/utils/timer.d.ts +7 -0
  148. package/dist/utils/timer.d.ts.map +1 -0
  149. package/dist/utils/timer.js +17 -0
  150. package/dist/utils/timer.js.map +1 -0
  151. package/dist/utils/validation.d.ts +147 -0
  152. package/dist/utils/validation.d.ts.map +1 -0
  153. package/dist/utils/validation.js +275 -0
  154. package/dist/utils/validation.js.map +1 -0
  155. package/docs/API.md +411 -0
  156. package/docs/ARCHITECTURE.md +271 -0
  157. package/docs/CHANGELOG.md +283 -0
  158. package/jest.config.js +28 -0
  159. package/package.json +43 -30
  160. package/src/analysis/analysis-engine.ts +383 -0
  161. package/src/core/config.ts +406 -0
  162. package/src/core/engine.ts +785 -0
  163. package/src/core/errors.ts +349 -0
  164. package/src/core/index.ts +12 -0
  165. package/src/core/pipeline.ts +424 -0
  166. package/src/core/rate-limiter.ts +155 -0
  167. package/src/core/session-manager.ts +269 -0
  168. package/src/creativity/creativity-engine.ts +14 -0
  169. package/src/index.ts +178 -0
  170. package/src/learning/learning-engine.ts +14 -0
  171. package/src/llm/index.ts +10 -0
  172. package/src/llm/llm-service.ts +285 -0
  173. package/src/llm/providers/base.ts +146 -0
  174. package/src/llm/providers/cli.ts +186 -0
  175. package/src/llm/providers/gemini.ts +201 -0
  176. package/src/llm/sanitization.ts +178 -0
  177. package/src/mcp/server.ts +117 -0
  178. package/src/planning/planning-engine.ts +14 -0
  179. package/src/reasoning/reasoning-engine.ts +14 -0
  180. package/src/search/search-engine.ts +333 -0
  181. package/src/synthesis/synthesis-engine.ts +14 -0
  182. package/src/types/analysis.ts +337 -0
  183. package/src/types/core.ts +342 -0
  184. package/src/types/creativity.ts +268 -0
  185. package/src/types/index.ts +31 -0
  186. package/src/types/learning.ts +215 -0
  187. package/src/types/planning.ts +251 -0
  188. package/src/types/reasoning.ts +288 -0
  189. package/src/types/search.ts +192 -0
  190. package/src/types/synthesis.ts +187 -0
  191. package/src/utils/cache.ts +363 -0
  192. package/src/utils/id-generator.ts +135 -0
  193. package/src/utils/index.ts +22 -0
  194. package/src/utils/logger.ts +290 -0
  195. package/src/utils/metrics.ts +380 -0
  196. package/src/utils/timer.ts +15 -0
  197. package/src/utils/validation.ts +297 -0
  198. package/tests/setup.ts +22 -0
  199. package/tests/unit/cache.test.ts +189 -0
  200. package/tests/unit/engine.test.ts +179 -0
  201. package/tests/unit/validation.test.ts +218 -0
  202. package/tsconfig.json +17 -12
  203. package/GEMINI.md +0 -68
  204. package/analysis.ts +0 -1063
  205. package/creativity.ts +0 -1055
  206. package/dist/analysis.d.ts +0 -54
  207. package/dist/analysis.d.ts.map +0 -1
  208. package/dist/analysis.js +0 -866
  209. package/dist/analysis.js.map +0 -1
  210. package/dist/creativity.d.ts +0 -81
  211. package/dist/creativity.d.ts.map +0 -1
  212. package/dist/creativity.js +0 -828
  213. package/dist/creativity.js.map +0 -1
  214. package/dist/engine.d.ts +0 -90
  215. package/dist/engine.d.ts.map +0 -1
  216. package/dist/engine.js +0 -677
  217. package/dist/engine.js.map +0 -1
  218. package/dist/examples.d.ts +0 -7
  219. package/dist/examples.d.ts.map +0 -1
  220. package/dist/examples.js +0 -506
  221. package/dist/examples.js.map +0 -1
  222. package/dist/learning.d.ts +0 -72
  223. package/dist/learning.d.ts.map +0 -1
  224. package/dist/learning.js +0 -615
  225. package/dist/learning.js.map +0 -1
  226. package/dist/llm-service.d.ts +0 -21
  227. package/dist/llm-service.d.ts.map +0 -1
  228. package/dist/llm-service.js +0 -100
  229. package/dist/llm-service.js.map +0 -1
  230. package/dist/planning.d.ts +0 -58
  231. package/dist/planning.d.ts.map +0 -1
  232. package/dist/planning.js +0 -824
  233. package/dist/planning.js.map +0 -1
  234. package/dist/reasoning.d.ts +0 -73
  235. package/dist/reasoning.d.ts.map +0 -1
  236. package/dist/reasoning.js +0 -845
  237. package/dist/reasoning.js.map +0 -1
  238. package/dist/search-discovery.d.ts +0 -73
  239. package/dist/search-discovery.d.ts.map +0 -1
  240. package/dist/search-discovery.js +0 -548
  241. package/dist/search-discovery.js.map +0 -1
  242. package/dist/server.js +0 -113
  243. package/dist/server.js.map +0 -1
  244. package/dist/types/engine.d.ts +0 -55
  245. package/dist/types/engine.d.ts.map +0 -1
  246. package/dist/types/engine.js +0 -3
  247. package/dist/types/engine.js.map +0 -1
  248. package/dist/types.d.ts +0 -6
  249. package/dist/types.d.ts.map +0 -1
  250. package/dist/types.js.map +0 -1
  251. package/engine.ts +0 -947
  252. package/examples.ts +0 -717
  253. package/index.ts +0 -106
  254. package/learning.ts +0 -779
  255. package/llm-service.ts +0 -120
  256. package/planning.ts +0 -1028
  257. package/reasoning.ts +0 -1079
  258. package/search-discovery.ts +0 -700
  259. package/server.ts +0 -115
  260. package/types/analysis.ts +0 -69
  261. package/types/core.ts +0 -90
  262. package/types/creativity.ts +0 -72
  263. package/types/engine.ts +0 -60
  264. package/types/index.ts +0 -9
  265. package/types/learning.ts +0 -69
  266. package/types/planning.ts +0 -85
  267. package/types/reasoning.ts +0 -92
  268. package/types/search.ts +0 -58
  269. package/types/synthesis.ts +0 -42
  270. package/types.ts +0 -6
  271. /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":";AAAA;;;GAGG;;;AAiUH,sBA6BC;AASD,wCAiBC;AAtXD,mCAAsC;AACtC,qCAAkC;AAElC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,SAAS,CAAC,CAAC;AAwCrC;;GAEG;AACH,MAAa,gBAAiB,SAAQ,qBAAY;IACxC,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IACzC,MAAM,GAA6B,IAAI,GAAG,EAAE,CAAC;IAC7C,UAAU,GAA0B,IAAI,GAAG,EAAE,CAAC;IAC9C,OAAO,GAAG,IAAI,CAAC;IAEvB;;;OAGG;IACI,UAAU,CAAC,OAAgB;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACI,OAAO,CAAC,IAAY,EAAE,KAAK,GAAG,CAAC,EAAE,SAAiC,EAAE;QACzE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5C,QAAQ,CAAC,KAAK,GAAI,QAAQ,CAAC,KAAgB,GAAG,KAAK,CAAC;YACpD,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpB,IAAI;gBACJ,IAAI,EAAE,SAAS;gBACf,KAAK;gBACL,MAAM;gBACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,IAAY,EAAE,KAAa,EAAE,SAAiC,EAAE;QAC3E,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACpB,IAAI;YACJ,IAAI,EAAE,OAAO;YACb,KAAK;YACL,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,IAAY,EAAE,SAAiC,EAAE;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAC,GAAW;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QAED,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAExB,sBAAsB;QACtB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEpC,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACI,SAAS,CAAC,IAAY,EAAE,KAAa,EAAE,SAAiC,EAAE;QAC/E,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE1C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,UAAU;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACI,gBAAgB,CAAC,IAAY;QAClC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACI,iBAAiB,CAAC,IAAY,EAAE,SAAiC,EAAE;QAUxE,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;QAEzB,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC;QAEF,OAAO;YACL,KAAK;YACL,GAAG;YACH,GAAG;YACH,GAAG;YACH,IAAI;YACJ,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC;YACnB,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC;YACnB,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC;SACpB,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,KAAK;QACV,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,gBAAgB;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;iBACzC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;iBAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;YAEb,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAE7E,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,SAAS,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,UAAU;QACf,MAAM,MAAM,GAA4B;YACtC,QAAQ,EAAE,EAAE;YACZ,MAAM,EAAE,EAAE;YACV,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,EAAE;SACf,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAE1D,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,QAAmC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAe,CAAC;YAC5E,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,MAAM,CAAC,MAAiC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAe,CAAC;YAC1E,CAAC;YAEA,MAAM,CAAC,UAAqC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;QACxE,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,MAAM,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAE7E,IAAI,KAAK,EAAE,CAAC;gBACT,MAAM,CAAC,UAAsC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAAC,IAAY,EAAE,MAA8B;QAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IAC7C,CAAC;CACF;AAvQD,4CAuQC;AAED,8BAA8B;AACjB,QAAA,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEvD;;;;GAIG;AACH,SAAgB,KAAK,CAAC,UAAmB;IACvC,OAAO,UACL,MAAe,EACf,WAAmB,EACnB,UAA8B;QAE9B,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC;QACxC,MAAM,IAAI,GAAG,UAAU,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;QAEvE,UAAU,CAAC,KAAK,GAAG,UAAU,GAAG,IAAe;YAC7C,MAAM,QAAQ,GAAG,wBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEnD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAEhD,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;oBAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;wBACzB,wBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACtC,CAAC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,wBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACpC,OAAO,MAAM,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACpC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,KAAa,EACb,EAAoB;IAEpB,MAAM,QAAQ,GAAG,wBAAgB,CAAC,UAAU,CAAC,aAAa,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAElF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;QAC1B,wBAAgB,CAAC,OAAO,CAAC,aAAa,SAAS,UAAU,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wBAAgB,CAAC,OAAO,CAAC,aAAa,SAAS,QAAQ,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,wBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class Timer {
2
+ private start;
3
+ constructor();
4
+ elapsed(): number;
5
+ reset(): void;
6
+ }
7
+ //# sourceMappingURL=timer.d.ts.map
@@ -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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"}