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,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":";AAAA;;;;;;;GAOG;;;AAEH,iEAA0E;AAE1E,4CAAyC;AAYzC;;GAEG;AACH,MAAa,WAAW;IACL,OAAO,CAAoB;IAC3B,OAAO,CAAU;IAElC,YAAY,MAAoG;QAC9G,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAEvC,mDAAmD;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,0BAA0B,CAAC;QACjD,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,UAAU;QAE/B,IAAI,CAAC,OAAO,GAAG,IAAI,yCAAiB,CAAC;YACnC,SAAS,EAAE,WAAW;YACtB,MAAM;YACN,QAAQ;SACT,CAAC,CAAC;QAEH,eAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACtC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,eAAe,EAAE,MAAM;SACxB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,MAAM,GAAG,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAEvD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,YAAY,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC;QACJ,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,IAAI,MAAM,YAAY,sCAAc,EAAE,CAAC;gBACrC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,YAAY,EAAE,MAAM,CAAC,YAAY;iBAClC,CAAC;YACJ,CAAC;YAED,0CAA0C;YAC1C,eAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC;aACtD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,eAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,GAAW,EAAE,UAAkB;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,MAAM,eAAe,GAAG,MAAM,EAAE,eAAe,IAAI,GAAG,CAAC;YAEvD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAEjD,+CAA+C;YAC/C,eAAM,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF;AAhID,kCAgIC"}
|
|
@@ -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"}
|