gthinking 1.3.0 → 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 -250
  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 -38
  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 -720
  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 -62
  231. package/dist/planning.d.ts.map +0 -1
  232. package/dist/planning.js +0 -886
  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 -1009
  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 -1101
  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 -43
  270. package/types.ts +0 -6
  271. /package/dist/{server.d.ts → mcp/server.d.ts} +0 -0
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ /**
3
+ * Dynamic Pipeline for GThinking
4
+ *
5
+ * Implements a configurable pipeline system that supports parallel
6
+ * execution, dependency management, and error recovery.
7
+ *
8
+ * @module core/pipeline
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DynamicPipeline = void 0;
12
+ const eventemitter3_1 = require("eventemitter3");
13
+ const errors_1 = require("./errors");
14
+ const utils_1 = require("../utils");
15
+ /**
16
+ * Dynamic pipeline implementation
17
+ */
18
+ class DynamicPipeline extends eventemitter3_1.EventEmitter {
19
+ stages = new Map();
20
+ config;
21
+ logger = (0, utils_1.createComponentLogger)('Pipeline');
22
+ constructor(config) {
23
+ super();
24
+ this.config = config;
25
+ this.validateConfig();
26
+ }
27
+ /**
28
+ * Register a stage executor
29
+ */
30
+ registerStage(stage, executor, options = {}) {
31
+ const stageConfig = this.config.stages[stage];
32
+ this.stages.set(stage, {
33
+ stage,
34
+ executor,
35
+ enabled: options.enabled ?? stageConfig?.enabled ?? true,
36
+ parallel: options.parallel ?? stageConfig?.parallel ?? false,
37
+ dependencies: options.dependencies ?? stageConfig?.dependencies ?? [],
38
+ timeoutMs: options.timeoutMs ?? stageConfig?.timeoutMs ?? 30000,
39
+ retryCount: options.retryCount ?? stageConfig?.retryCount ?? 0,
40
+ skipOnError: options.skipOnError ?? stageConfig?.skipOnError ?? false,
41
+ });
42
+ this.logger.debug('Stage registered', { stage, enabled: this.stages.get(stage)?.enabled });
43
+ }
44
+ /**
45
+ * Execute the pipeline
46
+ */
47
+ async execute(input, requestId, sessionId, streamResults = false) {
48
+ const timer = new utils_1.Timer();
49
+ const results = new Map();
50
+ const abortController = new AbortController();
51
+ // Set global timeout if configured
52
+ let globalTimeoutId = null;
53
+ if (this.config.defaultTimeout !== undefined) {
54
+ globalTimeoutId = setTimeout(() => {
55
+ abortController.abort(new errors_1.TimeoutError('Pipeline global timeout exceeded', this.config.defaultTimeout));
56
+ }, this.config.defaultTimeout);
57
+ }
58
+ try {
59
+ // Get execution order based on dependencies
60
+ const executionOrder = this.getExecutionOrder();
61
+ for (const stageGroup of executionOrder) {
62
+ // Check if aborted
63
+ if (abortController.signal.aborted) {
64
+ throw abortController.signal.reason;
65
+ }
66
+ if (stageGroup.length === 1) {
67
+ // Sequential execution
68
+ const stage = stageGroup[0];
69
+ const result = await this.executeStage(stage, input, requestId, sessionId, results, abortController.signal, streamResults);
70
+ results.set(stage, result);
71
+ // Handle error based on configuration
72
+ if (result.status === 'failed' && !this.stages.get(stage)?.skipOnError) {
73
+ if (this.config.errorHandling === 'stop') {
74
+ throw new errors_1.StageError(`Stage ${stage} failed: ${result.error?.message}`, stage, false);
75
+ }
76
+ }
77
+ }
78
+ else {
79
+ // Parallel execution
80
+ const parallelResults = await Promise.all(stageGroup.map(stage => this.executeStage(stage, input, requestId, sessionId, results, abortController.signal, streamResults)));
81
+ for (const result of parallelResults) {
82
+ results.set(result.stage, result);
83
+ }
84
+ }
85
+ }
86
+ const stageResults = Array.from(results.values());
87
+ const durationMs = timer.elapsed();
88
+ this.emit('pipeline:complete', { results: stageResults, requestId, durationMs });
89
+ return stageResults;
90
+ }
91
+ catch (error) {
92
+ this.emit('pipeline:error', { error: error, requestId });
93
+ throw error;
94
+ }
95
+ finally {
96
+ if (globalTimeoutId !== null) {
97
+ clearTimeout(globalTimeoutId);
98
+ }
99
+ }
100
+ }
101
+ /**
102
+ * Execute a single stage
103
+ */
104
+ async executeStage(stage, input, requestId, sessionId, previousResults, abortSignal, streamResults) {
105
+ const stageDef = this.stages.get(stage);
106
+ if (stageDef === undefined) {
107
+ return {
108
+ stage,
109
+ status: 'skipped',
110
+ timestamp: new Date(),
111
+ data: null,
112
+ };
113
+ }
114
+ if (!stageDef.enabled) {
115
+ return {
116
+ stage,
117
+ status: 'skipped',
118
+ timestamp: new Date(),
119
+ data: null,
120
+ };
121
+ }
122
+ // Check dependencies
123
+ for (const dep of stageDef.dependencies) {
124
+ const depResult = previousResults.get(dep);
125
+ if (depResult?.status === 'failed' && !stageDef.skipOnError) {
126
+ return {
127
+ stage,
128
+ status: 'skipped',
129
+ error: new Error(`Dependency stage ${dep} failed`),
130
+ timestamp: new Date(),
131
+ data: null,
132
+ };
133
+ }
134
+ }
135
+ // Emit stage start
136
+ this.emit('stage:start', { stage, requestId });
137
+ if (streamResults) {
138
+ this.emit('chunk', {
139
+ chunk: { type: 'stage_start', stage, timestamp: Date.now() },
140
+ requestId,
141
+ });
142
+ }
143
+ const timer = new utils_1.Timer();
144
+ let lastError;
145
+ // Retry loop
146
+ for (let attempt = 0; attempt <= stageDef.retryCount; attempt++) {
147
+ try {
148
+ if (attempt > 0) {
149
+ this.emit('stage:retry', { stage, attempt, requestId });
150
+ }
151
+ const context = {
152
+ stage,
153
+ requestId,
154
+ sessionId,
155
+ previousResults,
156
+ abortSignal,
157
+ };
158
+ // Execute with timeout
159
+ const output = await this.executeWithTimeout(() => stageDef.executor(input, context), stageDef.timeoutMs);
160
+ const result = {
161
+ stage,
162
+ status: 'completed',
163
+ data: output,
164
+ duration: timer.elapsed(),
165
+ timestamp: new Date(),
166
+ };
167
+ this.emit('stage:complete', { stage, result, requestId });
168
+ if (streamResults) {
169
+ this.emit('chunk', {
170
+ chunk: { type: 'stage_complete', stage, data: output, timestamp: Date.now() },
171
+ requestId,
172
+ });
173
+ }
174
+ return result;
175
+ }
176
+ catch (error) {
177
+ lastError = error;
178
+ this.logger.warn(`Stage ${stage} attempt ${attempt + 1} failed`, {
179
+ stage,
180
+ attempt,
181
+ error: lastError.message,
182
+ });
183
+ }
184
+ }
185
+ // All retries exhausted
186
+ const failedResult = {
187
+ stage,
188
+ status: 'failed',
189
+ error: lastError,
190
+ duration: timer.elapsed(),
191
+ timestamp: new Date(),
192
+ data: null,
193
+ };
194
+ this.emit('stage:error', { stage, error: lastError, requestId });
195
+ if (streamResults) {
196
+ this.emit('chunk', {
197
+ chunk: { type: 'error', stage, data: lastError?.message, timestamp: Date.now() },
198
+ requestId,
199
+ });
200
+ }
201
+ return failedResult;
202
+ }
203
+ /**
204
+ * Execute a function with timeout
205
+ */
206
+ async executeWithTimeout(fn, timeoutMs) {
207
+ return new Promise((resolve, reject) => {
208
+ const timeoutId = setTimeout(() => {
209
+ reject(new errors_1.TimeoutError(`Operation timed out after ${timeoutMs}ms`, timeoutMs));
210
+ }, timeoutMs);
211
+ fn()
212
+ .then(resolve)
213
+ .catch(reject)
214
+ .finally(() => clearTimeout(timeoutId));
215
+ });
216
+ }
217
+ /**
218
+ * Get execution order based on dependencies
219
+ */
220
+ getExecutionOrder() {
221
+ const visited = new Set();
222
+ const order = [];
223
+ const stages = Array.from(this.stages.entries())
224
+ .filter(([, def]) => def.enabled)
225
+ .map(([stage]) => stage);
226
+ while (visited.size < stages.length) {
227
+ const group = [];
228
+ for (const stage of stages) {
229
+ if (visited.has(stage))
230
+ continue;
231
+ const stageDef = this.stages.get(stage);
232
+ if (stageDef === undefined)
233
+ continue;
234
+ // Check if all dependencies are visited
235
+ const depsSatisfied = stageDef.dependencies.every(dep => visited.has(dep));
236
+ if (depsSatisfied) {
237
+ group.push(stage);
238
+ }
239
+ }
240
+ if (group.length === 0) {
241
+ // Circular dependency detected
242
+ throw new errors_1.StageError('Circular dependency detected in pipeline', stages[0], false);
243
+ }
244
+ for (const stage of group) {
245
+ visited.add(stage);
246
+ }
247
+ order.push(group);
248
+ }
249
+ return order;
250
+ }
251
+ /**
252
+ * Validate pipeline configuration
253
+ */
254
+ validateConfig() {
255
+ const stageNames = Object.keys(this.config.stages);
256
+ const uniqueStages = new Set(stageNames);
257
+ if (stageNames.length !== uniqueStages.size) {
258
+ throw new errors_1.StageError('Duplicate stages in pipeline configuration', 'search', false);
259
+ }
260
+ }
261
+ /**
262
+ * Enable a stage
263
+ */
264
+ enableStage(stage) {
265
+ const stageDef = this.stages.get(stage);
266
+ if (stageDef !== undefined) {
267
+ stageDef.enabled = true;
268
+ }
269
+ }
270
+ /**
271
+ * Disable a stage
272
+ */
273
+ disableStage(stage) {
274
+ const stageDef = this.stages.get(stage);
275
+ if (stageDef !== undefined) {
276
+ stageDef.enabled = false;
277
+ }
278
+ }
279
+ /**
280
+ * Get enabled stages
281
+ */
282
+ getEnabledStages() {
283
+ return Array.from(this.stages.entries())
284
+ .filter(([, def]) => def.enabled)
285
+ .map(([stage]) => stage);
286
+ }
287
+ }
288
+ exports.DynamicPipeline = DynamicPipeline;
289
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Rate Limiter for GThinking
3
+ *
4
+ * Implements token bucket algorithm for rate limiting with
5
+ * support for burst handling and per-session tracking.
6
+ *
7
+ * @module core/rate-limiter
8
+ */
9
+ import type { EngineConfig } from '../types/core';
10
+ /**
11
+ * Rate limit check result
12
+ */
13
+ export interface RateLimitResult {
14
+ allowed: boolean;
15
+ remainingPoints?: number;
16
+ msBeforeNext?: number;
17
+ retryAfterMs?: number;
18
+ }
19
+ /**
20
+ * Rate limiter implementation
21
+ */
22
+ export declare class RateLimiter {
23
+ private readonly limiter;
24
+ private readonly enabled;
25
+ constructor(config: Pick<EngineConfig, 'rateLimitEnabled' | 'rateLimitRequestsPerMinute' | 'rateLimitBurstSize'>);
26
+ /**
27
+ * Check if a request is allowed
28
+ *
29
+ * @param key - Rate limit key (e.g., session ID or IP)
30
+ * @param points - Points to consume (default: 1)
31
+ * @returns Rate limit check result
32
+ */
33
+ checkLimit(key: string, points?: number): Promise<RateLimitResult>;
34
+ /**
35
+ * Get current rate limit status without consuming points
36
+ *
37
+ * @param key - Rate limit key
38
+ * @returns Current status
39
+ */
40
+ getStatus(key: string): Promise<{
41
+ remainingPoints: number;
42
+ resetTime: Date;
43
+ } | null>;
44
+ /**
45
+ * Reset rate limit for a key
46
+ *
47
+ * @param key - Rate limit key
48
+ */
49
+ reset(key: string): Promise<void>;
50
+ /**
51
+ * Block a key for a specific duration
52
+ *
53
+ * @param key - Rate limit key
54
+ * @param durationMs - Block duration in milliseconds
55
+ */
56
+ block(key: string, durationMs: number): Promise<void>;
57
+ }
58
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,4BAA4B,GAAG,oBAAoB,CAAC;IAmBhH;;;;;;OAMG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,OAAO,CAAC,eAAe,CAAC;IA4BnE;;;;;OAKG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAsB1F;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavC;;;;;OAKG;IACG,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB5D"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ /**
3
+ * Rate Limiter for GThinking
4
+ *
5
+ * Implements token bucket algorithm for rate limiting with
6
+ * support for burst handling and per-session tracking.
7
+ *
8
+ * @module core/rate-limiter
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.RateLimiter = void 0;
12
+ const rate_limiter_flexible_1 = require("rate-limiter-flexible");
13
+ const logger_1 = require("../utils/logger");
14
+ /**
15
+ * Rate limiter implementation
16
+ */
17
+ class RateLimiter {
18
+ limiter;
19
+ enabled;
20
+ constructor(config) {
21
+ this.enabled = config.rateLimitEnabled;
22
+ // Convert requests per minute to points per second
23
+ const points = config.rateLimitRequestsPerMinute;
24
+ const duration = 60; // seconds
25
+ this.limiter = new rate_limiter_flexible_1.RateLimiterMemory({
26
+ keyPrefix: 'gthinking',
27
+ points,
28
+ duration,
29
+ });
30
+ logger_1.logger.info('Rate limiter initialized', {
31
+ enabled: this.enabled,
32
+ pointsPerMinute: points,
33
+ });
34
+ }
35
+ /**
36
+ * Check if a request is allowed
37
+ *
38
+ * @param key - Rate limit key (e.g., session ID or IP)
39
+ * @param points - Points to consume (default: 1)
40
+ * @returns Rate limit check result
41
+ */
42
+ async checkLimit(key, points = 1) {
43
+ if (!this.enabled) {
44
+ return { allowed: true };
45
+ }
46
+ try {
47
+ const result = await this.limiter.consume(key, points);
48
+ return {
49
+ allowed: true,
50
+ remainingPoints: result.remainingPoints,
51
+ msBeforeNext: result.msBeforeNext,
52
+ };
53
+ }
54
+ catch (rejRes) {
55
+ if (rejRes instanceof rate_limiter_flexible_1.RateLimiterRes) {
56
+ return {
57
+ allowed: false,
58
+ msBeforeNext: rejRes.msBeforeNext,
59
+ retryAfterMs: rejRes.msBeforeNext,
60
+ };
61
+ }
62
+ // Unexpected error, allow request but log
63
+ logger_1.logger.error('Rate limiter error', { error: String(rejRes) });
64
+ return { allowed: true };
65
+ }
66
+ }
67
+ /**
68
+ * Get current rate limit status without consuming points
69
+ *
70
+ * @param key - Rate limit key
71
+ * @returns Current status
72
+ */
73
+ async getStatus(key) {
74
+ if (!this.enabled) {
75
+ return null;
76
+ }
77
+ try {
78
+ const result = await this.limiter.get(key);
79
+ if (result === null) {
80
+ return null;
81
+ }
82
+ return {
83
+ remainingPoints: result.remainingPoints,
84
+ resetTime: new Date(Date.now() + result.msBeforeNext),
85
+ };
86
+ }
87
+ catch (error) {
88
+ logger_1.logger.error('Rate limiter getStatus error', { error: String(error) });
89
+ return null;
90
+ }
91
+ }
92
+ /**
93
+ * Reset rate limit for a key
94
+ *
95
+ * @param key - Rate limit key
96
+ */
97
+ async reset(key) {
98
+ if (!this.enabled) {
99
+ return;
100
+ }
101
+ try {
102
+ await this.limiter.delete(key);
103
+ logger_1.logger.debug('Rate limit reset', { key });
104
+ }
105
+ catch (error) {
106
+ logger_1.logger.error('Rate limiter reset error', { error: String(error) });
107
+ }
108
+ }
109
+ /**
110
+ * Block a key for a specific duration
111
+ *
112
+ * @param key - Rate limit key
113
+ * @param durationMs - Block duration in milliseconds
114
+ */
115
+ async block(key, durationMs) {
116
+ if (!this.enabled) {
117
+ return;
118
+ }
119
+ try {
120
+ // Consume all points to block
121
+ const points = await this.limiter.get(key);
122
+ const pointsToConsume = points?.remainingPoints ?? 100;
123
+ await this.limiter.consume(key, pointsToConsume);
124
+ // Penalty will last for the specified duration
125
+ logger_1.logger.info('Key blocked', { key, durationMs });
126
+ }
127
+ catch (error) {
128
+ logger_1.logger.error('Rate limiter block error', { error: String(error) });
129
+ }
130
+ }
131
+ }
132
+ exports.RateLimiter = RateLimiter;
133
+ //# sourceMappingURL=rate-limiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../src/core/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Session Manager for GThinking
3
+ *
4
+ * Manages user sessions with automatic cleanup, persistence,
5
+ * and history tracking.
6
+ *
7
+ * @module core/session-manager
8
+ */
9
+ import type { EngineConfig, Session, ThinkingRequest, ThinkingResponse } from '../types/core';
10
+ /**
11
+ * Session manager implementation
12
+ */
13
+ export declare class SessionManager {
14
+ private readonly sessions;
15
+ private readonly config;
16
+ private readonly logger;
17
+ private cleanupIntervalId;
18
+ constructor(config: Pick<EngineConfig, 'sessionMaxAgeMs' | 'sessionCleanupIntervalMs' | 'maxConcurrentSessions'>);
19
+ /**
20
+ * Initialize the session manager
21
+ */
22
+ initialize(): Promise<void>;
23
+ /**
24
+ * Shutdown the session manager
25
+ */
26
+ shutdown(): Promise<void>;
27
+ /**
28
+ * Get or create a session
29
+ *
30
+ * @param sessionId - Session ID
31
+ * @returns Session
32
+ */
33
+ getOrCreateSession(sessionId: string): Promise<Session>;
34
+ /**
35
+ * Get a session by ID
36
+ *
37
+ * @param sessionId - Session ID
38
+ * @returns Session or undefined
39
+ */
40
+ getSession(sessionId: string): Promise<Session | undefined>;
41
+ /**
42
+ * Delete a session
43
+ *
44
+ * @param sessionId - Session ID
45
+ * @returns True if session was deleted
46
+ */
47
+ deleteSession(sessionId: string): Promise<boolean>;
48
+ /**
49
+ * Add request/response to session history
50
+ *
51
+ * @param sessionId - Session ID
52
+ * @param request - Thinking request
53
+ * @param response - Thinking response
54
+ */
55
+ addToHistory(sessionId: string, request: ThinkingRequest, response: ThinkingResponse): Promise<void>;
56
+ /**
57
+ * Update session context
58
+ *
59
+ * @param sessionId - Session ID
60
+ * @param context - Context updates
61
+ */
62
+ updateContext(sessionId: string, context: Record<string, unknown>): Promise<void>;
63
+ /**
64
+ * Get session count
65
+ */
66
+ getSessionCount(): number;
67
+ /**
68
+ * Get all active session IDs
69
+ */
70
+ getActiveSessionIds(): string[];
71
+ /**
72
+ * Clear all sessions
73
+ */
74
+ clearAllSessions(): Promise<void>;
75
+ /**
76
+ * Create a new session object
77
+ */
78
+ private createSession;
79
+ /**
80
+ * Validate session ID format
81
+ */
82
+ private isValidSessionId;
83
+ /**
84
+ * Start cleanup interval
85
+ */
86
+ private startCleanupInterval;
87
+ /**
88
+ * Stop cleanup interval
89
+ */
90
+ private stopCleanupInterval;
91
+ /**
92
+ * Clean up expired sessions
93
+ */
94
+ private cleanupExpiredSessions;
95
+ }
96
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAY9F;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+F;IACtH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,iBAAiB,CAA+B;gBAE5C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,iBAAiB,GAAG,0BAA0B,GAAG,uBAAuB,CAAC;IAIhH;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;;;;OAKG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmC7D;;;;;OAKG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAUjE;;;;;OAKG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUxD;;;;;;OAMG;IACG,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC;IAsBhB;;;;;OAKG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvC;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAoB/B"}